-Wimplicit-fallthrough warning fixes
[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       /* Fall 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       /* Fall through.  */
443
444     case PREFIX_HEX:
445       nc = printf ("0x");
446       /* Fall 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           /* Fall through.  */
1296         case EM_MSP430_OLD:
1297           rtype = elf_msp430_reloc_type (type);
1298           break;
1299
1300         case EM_NDS32:
1301           rtype = elf_nds32_reloc_type (type);
1302           break;
1303
1304         case EM_PPC:
1305           rtype = elf_ppc_reloc_type (type);
1306           break;
1307
1308         case EM_PPC64:
1309           rtype = elf_ppc64_reloc_type (type);
1310           break;
1311
1312         case EM_MIPS:
1313         case EM_MIPS_RS3_LE:
1314           rtype = elf_mips_reloc_type (type);
1315           break;
1316
1317         case EM_ALPHA:
1318           rtype = elf_alpha_reloc_type (type);
1319           break;
1320
1321         case EM_ARM:
1322           rtype = elf_arm_reloc_type (type);
1323           break;
1324
1325         case EM_ARC:
1326         case EM_ARC_COMPACT:
1327         case EM_ARC_COMPACT2:
1328           rtype = elf_arc_reloc_type (type);
1329           break;
1330
1331         case EM_PARISC:
1332           rtype = elf_hppa_reloc_type (type);
1333           break;
1334
1335         case EM_H8_300:
1336         case EM_H8_300H:
1337         case EM_H8S:
1338           rtype = elf_h8_reloc_type (type);
1339           break;
1340
1341         case EM_OR1K:
1342           rtype = elf_or1k_reloc_type (type);
1343           break;
1344
1345         case EM_PJ:
1346         case EM_PJ_OLD:
1347           rtype = elf_pj_reloc_type (type);
1348           break;
1349         case EM_IA_64:
1350           rtype = elf_ia64_reloc_type (type);
1351           break;
1352
1353         case EM_CRIS:
1354           rtype = elf_cris_reloc_type (type);
1355           break;
1356
1357         case EM_860:
1358           rtype = elf_i860_reloc_type (type);
1359           break;
1360
1361         case EM_X86_64:
1362         case EM_L1OM:
1363         case EM_K1OM:
1364           rtype = elf_x86_64_reloc_type (type);
1365           break;
1366
1367         case EM_S370:
1368           rtype = i370_reloc_type (type);
1369           break;
1370
1371         case EM_S390_OLD:
1372         case EM_S390:
1373           rtype = elf_s390_reloc_type (type);
1374           break;
1375
1376         case EM_SCORE:
1377           rtype = elf_score_reloc_type (type);
1378           break;
1379
1380         case EM_XSTORMY16:
1381           rtype = elf_xstormy16_reloc_type (type);
1382           break;
1383
1384         case EM_CRX:
1385           rtype = elf_crx_reloc_type (type);
1386           break;
1387
1388         case EM_VAX:
1389           rtype = elf_vax_reloc_type (type);
1390           break;
1391
1392         case EM_VISIUM:
1393           rtype = elf_visium_reloc_type (type);
1394           break;
1395
1396         case EM_ADAPTEVA_EPIPHANY:
1397           rtype = elf_epiphany_reloc_type (type);
1398           break;
1399
1400         case EM_IP2K:
1401         case EM_IP2K_OLD:
1402           rtype = elf_ip2k_reloc_type (type);
1403           break;
1404
1405         case EM_IQ2000:
1406           rtype = elf_iq2000_reloc_type (type);
1407           break;
1408
1409         case EM_XTENSA_OLD:
1410         case EM_XTENSA:
1411           rtype = elf_xtensa_reloc_type (type);
1412           break;
1413
1414         case EM_LATTICEMICO32:
1415           rtype = elf_lm32_reloc_type (type);
1416           break;
1417
1418         case EM_M32C_OLD:
1419         case EM_M32C:
1420           rtype = elf_m32c_reloc_type (type);
1421           break;
1422
1423         case EM_MT:
1424           rtype = elf_mt_reloc_type (type);
1425           break;
1426
1427         case EM_BLACKFIN:
1428           rtype = elf_bfin_reloc_type (type);
1429           break;
1430
1431         case EM_CYGNUS_MEP:
1432           rtype = elf_mep_reloc_type (type);
1433           break;
1434
1435         case EM_CR16:
1436           rtype = elf_cr16_reloc_type (type);
1437           break;
1438
1439         case EM_MICROBLAZE:
1440         case EM_MICROBLAZE_OLD:
1441           rtype = elf_microblaze_reloc_type (type);
1442           break;
1443
1444         case EM_RL78:
1445           rtype = elf_rl78_reloc_type (type);
1446           break;
1447
1448         case EM_RX:
1449           rtype = elf_rx_reloc_type (type);
1450           break;
1451
1452         case EM_METAG:
1453           rtype = elf_metag_reloc_type (type);
1454           break;
1455
1456         case EM_XC16X:
1457         case EM_C166:
1458           rtype = elf_xc16x_reloc_type (type);
1459           break;
1460
1461         case EM_TI_C6000:
1462           rtype = elf_tic6x_reloc_type (type);
1463           break;
1464
1465         case EM_TILEGX:
1466           rtype = elf_tilegx_reloc_type (type);
1467           break;
1468
1469         case EM_TILEPRO:
1470           rtype = elf_tilepro_reloc_type (type);
1471           break;
1472
1473         case EM_XGATE:
1474           rtype = elf_xgate_reloc_type (type);
1475           break;
1476
1477         case EM_ALTERA_NIOS2:
1478           rtype = elf_nios2_reloc_type (type);
1479           break;
1480         }
1481
1482       if (rtype == NULL)
1483         printf (_("unrecognized: %-7lx"), (unsigned long) type & 0xffffffff);
1484       else
1485         printf (do_wide ? "%-22.22s" : "%-17.17s", rtype);
1486
1487       if (elf_header.e_machine == EM_ALPHA
1488           && rtype != NULL
1489           && streq (rtype, "R_ALPHA_LITUSE")
1490           && is_rela)
1491         {
1492           switch (rels[i].r_addend)
1493             {
1494             case LITUSE_ALPHA_ADDR:   rtype = "ADDR";   break;
1495             case LITUSE_ALPHA_BASE:   rtype = "BASE";   break;
1496             case LITUSE_ALPHA_BYTOFF: rtype = "BYTOFF"; break;
1497             case LITUSE_ALPHA_JSR:    rtype = "JSR";    break;
1498             case LITUSE_ALPHA_TLSGD:  rtype = "TLSGD";  break;
1499             case LITUSE_ALPHA_TLSLDM: rtype = "TLSLDM"; break;
1500             case LITUSE_ALPHA_JSRDIRECT: rtype = "JSRDIRECT"; break;
1501             default: rtype = NULL;
1502             }
1503           if (rtype)
1504             printf (" (%s)", rtype);
1505           else
1506             {
1507               putchar (' ');
1508               printf (_("<unknown addend: %lx>"),
1509                       (unsigned long) rels[i].r_addend);
1510             }
1511         }
1512       else if (symtab_index)
1513         {
1514           if (symtab == NULL || symtab_index >= nsyms)
1515             printf (_(" bad symbol index: %08lx"), (unsigned long) symtab_index);
1516           else
1517             {
1518               Elf_Internal_Sym * psym;
1519               const char * version_string;
1520               enum versioned_symbol_info sym_info;
1521               unsigned short vna_other;
1522
1523               psym = symtab + symtab_index;
1524
1525               version_string
1526                 = get_symbol_version_string (file, is_dynsym,
1527                                              strtab, strtablen,
1528                                              symtab_index,
1529                                              psym,
1530                                              &sym_info,
1531                                              &vna_other);
1532
1533               printf (" ");
1534
1535               if (ELF_ST_TYPE (psym->st_info) == STT_GNU_IFUNC)
1536                 {
1537                   const char * name;
1538                   unsigned int len;
1539                   unsigned int width = is_32bit_elf ? 8 : 14;
1540
1541                   /* Relocations against GNU_IFUNC symbols do not use the value
1542                      of the symbol as the address to relocate against.  Instead
1543                      they invoke the function named by the symbol and use its
1544                      result as the address for relocation.
1545
1546                      To indicate this to the user, do not display the value of
1547                      the symbol in the "Symbols's Value" field.  Instead show
1548                      its name followed by () as a hint that the symbol is
1549                      invoked.  */
1550
1551                   if (strtab == NULL
1552                       || psym->st_name == 0
1553                       || psym->st_name >= strtablen)
1554                     name = "??";
1555                   else
1556                     name = strtab + psym->st_name;
1557
1558                   len = print_symbol (width, name);
1559                   if (version_string)
1560                     printf (sym_info == symbol_public ? "@@%s" : "@%s",
1561                             version_string);
1562                   printf ("()%-*s", len <= width ? (width + 1) - len : 1, " ");
1563                 }
1564               else
1565                 {
1566                   print_vma (psym->st_value, LONG_HEX);
1567
1568                   printf (is_32bit_elf ? "   " : " ");
1569                 }
1570
1571               if (psym->st_name == 0)
1572                 {
1573                   const char * sec_name = "<null>";
1574                   char name_buf[40];
1575
1576                   if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1577                     {
1578                       if (psym->st_shndx < elf_header.e_shnum)
1579                         sec_name = SECTION_NAME (section_headers + psym->st_shndx);
1580                       else if (psym->st_shndx == SHN_ABS)
1581                         sec_name = "ABS";
1582                       else if (psym->st_shndx == SHN_COMMON)
1583                         sec_name = "COMMON";
1584                       else if ((elf_header.e_machine == EM_MIPS
1585                                 && psym->st_shndx == SHN_MIPS_SCOMMON)
1586                                || (elf_header.e_machine == EM_TI_C6000
1587                                    && psym->st_shndx == SHN_TIC6X_SCOMMON))
1588                         sec_name = "SCOMMON";
1589                       else if (elf_header.e_machine == EM_MIPS
1590                                && psym->st_shndx == SHN_MIPS_SUNDEFINED)
1591                         sec_name = "SUNDEF";
1592                       else if ((elf_header.e_machine == EM_X86_64
1593                                 || elf_header.e_machine == EM_L1OM
1594                                 || elf_header.e_machine == EM_K1OM)
1595                                && psym->st_shndx == SHN_X86_64_LCOMMON)
1596                         sec_name = "LARGE_COMMON";
1597                       else if (elf_header.e_machine == EM_IA_64
1598                                && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
1599                                && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1600                         sec_name = "ANSI_COM";
1601                       else if (is_ia64_vms ()
1602                                && psym->st_shndx == SHN_IA_64_VMS_SYMVEC)
1603                         sec_name = "VMS_SYMVEC";
1604                       else
1605                         {
1606                           sprintf (name_buf, "<section 0x%x>",
1607                                    (unsigned int) psym->st_shndx);
1608                           sec_name = name_buf;
1609                         }
1610                     }
1611                   print_symbol (22, sec_name);
1612                 }
1613               else if (strtab == NULL)
1614                 printf (_("<string table index: %3ld>"), psym->st_name);
1615               else if (psym->st_name >= strtablen)
1616                 printf (_("<corrupt string table index: %3ld>"), psym->st_name);
1617               else
1618                 {
1619                   print_symbol (22, strtab + psym->st_name);
1620                   if (version_string)
1621                     printf (sym_info == symbol_public ? "@@%s" : "@%s",
1622                             version_string);
1623                 }
1624
1625               if (is_rela)
1626                 {
1627                   bfd_vma off = rels[i].r_addend;
1628
1629                   if ((bfd_signed_vma) off < 0)
1630                     printf (" - %" BFD_VMA_FMT "x", - off);
1631                   else
1632                     printf (" + %" BFD_VMA_FMT "x", off);
1633                 }
1634             }
1635         }
1636       else if (is_rela)
1637         {
1638           bfd_vma off = rels[i].r_addend;
1639
1640           printf ("%*c", is_32bit_elf ? 12 : 20, ' ');
1641           if ((bfd_signed_vma) off < 0)
1642             printf ("-%" BFD_VMA_FMT "x", - off);
1643           else
1644             printf ("%" BFD_VMA_FMT "x", off);
1645         }
1646
1647       if (elf_header.e_machine == EM_SPARCV9
1648           && rtype != NULL
1649           && streq (rtype, "R_SPARC_OLO10"))
1650         printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf));
1651
1652       putchar ('\n');
1653
1654 #ifdef BFD64
1655       if (! is_32bit_elf && elf_header.e_machine == EM_MIPS)
1656         {
1657           bfd_vma type2 = ELF64_MIPS_R_TYPE2 (inf);
1658           bfd_vma type3 = ELF64_MIPS_R_TYPE3 (inf);
1659           const char * rtype2 = elf_mips_reloc_type (type2);
1660           const char * rtype3 = elf_mips_reloc_type (type3);
1661
1662           printf ("                    Type2: ");
1663
1664           if (rtype2 == NULL)
1665             printf (_("unrecognized: %-7lx"),
1666                     (unsigned long) type2 & 0xffffffff);
1667           else
1668             printf ("%-17.17s", rtype2);
1669
1670           printf ("\n                    Type3: ");
1671
1672           if (rtype3 == NULL)
1673             printf (_("unrecognized: %-7lx"),
1674                     (unsigned long) type3 & 0xffffffff);
1675           else
1676             printf ("%-17.17s", rtype3);
1677
1678           putchar ('\n');
1679         }
1680 #endif /* BFD64 */
1681     }
1682
1683   free (rels);
1684 }
1685
1686 static const char *
1687 get_mips_dynamic_type (unsigned long type)
1688 {
1689   switch (type)
1690     {
1691     case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1692     case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1693     case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1694     case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1695     case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1696     case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1697     case DT_MIPS_MSYM: return "MIPS_MSYM";
1698     case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1699     case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1700     case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1701     case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1702     case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1703     case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1704     case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1705     case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1706     case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1707     case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1708     case DT_MIPS_RLD_MAP_REL: return "MIPS_RLD_MAP_REL";
1709     case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1710     case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1711     case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1712     case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1713     case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1714     case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1715     case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1716     case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1717     case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1718     case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1719     case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1720     case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1721     case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1722     case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1723     case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1724     case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1725     case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1726     case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1727     case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1728     case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1729     case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1730     case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1731     case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1732     case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1733     case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1734     case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1735     case DT_MIPS_PLTGOT: return "MIPS_PLTGOT";
1736     case DT_MIPS_RWPLT: return "MIPS_RWPLT";
1737     default:
1738       return NULL;
1739     }
1740 }
1741
1742 static const char *
1743 get_sparc64_dynamic_type (unsigned long type)
1744 {
1745   switch (type)
1746     {
1747     case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1748     default:
1749       return NULL;
1750     }
1751 }
1752
1753 static const char *
1754 get_ppc_dynamic_type (unsigned long type)
1755 {
1756   switch (type)
1757     {
1758     case DT_PPC_GOT:    return "PPC_GOT";
1759     case DT_PPC_OPT:    return "PPC_OPT";
1760     default:
1761       return NULL;
1762     }
1763 }
1764
1765 static const char *
1766 get_ppc64_dynamic_type (unsigned long type)
1767 {
1768   switch (type)
1769     {
1770     case DT_PPC64_GLINK:  return "PPC64_GLINK";
1771     case DT_PPC64_OPD:    return "PPC64_OPD";
1772     case DT_PPC64_OPDSZ:  return "PPC64_OPDSZ";
1773     case DT_PPC64_OPT:    return "PPC64_OPT";
1774     default:
1775       return NULL;
1776     }
1777 }
1778
1779 static const char *
1780 get_parisc_dynamic_type (unsigned long type)
1781 {
1782   switch (type)
1783     {
1784     case DT_HP_LOAD_MAP:        return "HP_LOAD_MAP";
1785     case DT_HP_DLD_FLAGS:       return "HP_DLD_FLAGS";
1786     case DT_HP_DLD_HOOK:        return "HP_DLD_HOOK";
1787     case DT_HP_UX10_INIT:       return "HP_UX10_INIT";
1788     case DT_HP_UX10_INITSZ:     return "HP_UX10_INITSZ";
1789     case DT_HP_PREINIT:         return "HP_PREINIT";
1790     case DT_HP_PREINITSZ:       return "HP_PREINITSZ";
1791     case DT_HP_NEEDED:          return "HP_NEEDED";
1792     case DT_HP_TIME_STAMP:      return "HP_TIME_STAMP";
1793     case DT_HP_CHECKSUM:        return "HP_CHECKSUM";
1794     case DT_HP_GST_SIZE:        return "HP_GST_SIZE";
1795     case DT_HP_GST_VERSION:     return "HP_GST_VERSION";
1796     case DT_HP_GST_HASHVAL:     return "HP_GST_HASHVAL";
1797     case DT_HP_EPLTREL:         return "HP_GST_EPLTREL";
1798     case DT_HP_EPLTRELSZ:       return "HP_GST_EPLTRELSZ";
1799     case DT_HP_FILTERED:        return "HP_FILTERED";
1800     case DT_HP_FILTER_TLS:      return "HP_FILTER_TLS";
1801     case DT_HP_COMPAT_FILTERED: return "HP_COMPAT_FILTERED";
1802     case DT_HP_LAZYLOAD:        return "HP_LAZYLOAD";
1803     case DT_HP_BIND_NOW_COUNT:  return "HP_BIND_NOW_COUNT";
1804     case DT_PLT:                return "PLT";
1805     case DT_PLT_SIZE:           return "PLT_SIZE";
1806     case DT_DLT:                return "DLT";
1807     case DT_DLT_SIZE:           return "DLT_SIZE";
1808     default:
1809       return NULL;
1810     }
1811 }
1812
1813 static const char *
1814 get_ia64_dynamic_type (unsigned long type)
1815 {
1816   switch (type)
1817     {
1818     case DT_IA_64_PLT_RESERVE:         return "IA_64_PLT_RESERVE";
1819     case DT_IA_64_VMS_SUBTYPE:         return "VMS_SUBTYPE";
1820     case DT_IA_64_VMS_IMGIOCNT:        return "VMS_IMGIOCNT";
1821     case DT_IA_64_VMS_LNKFLAGS:        return "VMS_LNKFLAGS";
1822     case DT_IA_64_VMS_VIR_MEM_BLK_SIZ: return "VMS_VIR_MEM_BLK_SIZ";
1823     case DT_IA_64_VMS_IDENT:           return "VMS_IDENT";
1824     case DT_IA_64_VMS_NEEDED_IDENT:    return "VMS_NEEDED_IDENT";
1825     case DT_IA_64_VMS_IMG_RELA_CNT:    return "VMS_IMG_RELA_CNT";
1826     case DT_IA_64_VMS_SEG_RELA_CNT:    return "VMS_SEG_RELA_CNT";
1827     case DT_IA_64_VMS_FIXUP_RELA_CNT:  return "VMS_FIXUP_RELA_CNT";
1828     case DT_IA_64_VMS_FIXUP_NEEDED:    return "VMS_FIXUP_NEEDED";
1829     case DT_IA_64_VMS_SYMVEC_CNT:      return "VMS_SYMVEC_CNT";
1830     case DT_IA_64_VMS_XLATED:          return "VMS_XLATED";
1831     case DT_IA_64_VMS_STACKSIZE:       return "VMS_STACKSIZE";
1832     case DT_IA_64_VMS_UNWINDSZ:        return "VMS_UNWINDSZ";
1833     case DT_IA_64_VMS_UNWIND_CODSEG:   return "VMS_UNWIND_CODSEG";
1834     case DT_IA_64_VMS_UNWIND_INFOSEG:  return "VMS_UNWIND_INFOSEG";
1835     case DT_IA_64_VMS_LINKTIME:        return "VMS_LINKTIME";
1836     case DT_IA_64_VMS_SEG_NO:          return "VMS_SEG_NO";
1837     case DT_IA_64_VMS_SYMVEC_OFFSET:   return "VMS_SYMVEC_OFFSET";
1838     case DT_IA_64_VMS_SYMVEC_SEG:      return "VMS_SYMVEC_SEG";
1839     case DT_IA_64_VMS_UNWIND_OFFSET:   return "VMS_UNWIND_OFFSET";
1840     case DT_IA_64_VMS_UNWIND_SEG:      return "VMS_UNWIND_SEG";
1841     case DT_IA_64_VMS_STRTAB_OFFSET:   return "VMS_STRTAB_OFFSET";
1842     case DT_IA_64_VMS_SYSVER_OFFSET:   return "VMS_SYSVER_OFFSET";
1843     case DT_IA_64_VMS_IMG_RELA_OFF:    return "VMS_IMG_RELA_OFF";
1844     case DT_IA_64_VMS_SEG_RELA_OFF:    return "VMS_SEG_RELA_OFF";
1845     case DT_IA_64_VMS_FIXUP_RELA_OFF:  return "VMS_FIXUP_RELA_OFF";
1846     case DT_IA_64_VMS_PLTGOT_OFFSET:   return "VMS_PLTGOT_OFFSET";
1847     case DT_IA_64_VMS_PLTGOT_SEG:      return "VMS_PLTGOT_SEG";
1848     case DT_IA_64_VMS_FPMODE:          return "VMS_FPMODE";
1849     default:
1850       return NULL;
1851     }
1852 }
1853
1854 static const char *
1855 get_solaris_section_type (unsigned long type)
1856 {
1857   switch (type)
1858     {
1859     case 0x6fffffee: return "SUNW_ancillary";
1860     case 0x6fffffef: return "SUNW_capchain";
1861     case 0x6ffffff0: return "SUNW_capinfo";
1862     case 0x6ffffff1: return "SUNW_symsort";
1863     case 0x6ffffff2: return "SUNW_tlssort";
1864     case 0x6ffffff3: return "SUNW_LDYNSYM";
1865     case 0x6ffffff4: return "SUNW_dof";
1866     case 0x6ffffff5: return "SUNW_cap";
1867     case 0x6ffffff6: return "SUNW_SIGNATURE";
1868     case 0x6ffffff7: return "SUNW_ANNOTATE";
1869     case 0x6ffffff8: return "SUNW_DEBUGSTR";
1870     case 0x6ffffff9: return "SUNW_DEBUG";
1871     case 0x6ffffffa: return "SUNW_move";
1872     case 0x6ffffffb: return "SUNW_COMDAT";
1873     case 0x6ffffffc: return "SUNW_syminfo";
1874     case 0x6ffffffd: return "SUNW_verdef";
1875     case 0x6ffffffe: return "SUNW_verneed";
1876     case 0x6fffffff: return "SUNW_versym";
1877     case 0x70000000: return "SPARC_GOTDATA";
1878     default: return NULL;
1879     }
1880 }
1881
1882 static const char *
1883 get_alpha_dynamic_type (unsigned long type)
1884 {
1885   switch (type)
1886     {
1887     case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
1888     default:
1889       return NULL;
1890     }
1891 }
1892
1893 static const char *
1894 get_score_dynamic_type (unsigned long type)
1895 {
1896   switch (type)
1897     {
1898     case DT_SCORE_BASE_ADDRESS: return "SCORE_BASE_ADDRESS";
1899     case DT_SCORE_LOCAL_GOTNO:  return "SCORE_LOCAL_GOTNO";
1900     case DT_SCORE_SYMTABNO:     return "SCORE_SYMTABNO";
1901     case DT_SCORE_GOTSYM:       return "SCORE_GOTSYM";
1902     case DT_SCORE_UNREFEXTNO:   return "SCORE_UNREFEXTNO";
1903     case DT_SCORE_HIPAGENO:     return "SCORE_HIPAGENO";
1904     default:
1905       return NULL;
1906     }
1907 }
1908
1909 static const char *
1910 get_tic6x_dynamic_type (unsigned long type)
1911 {
1912   switch (type)
1913     {
1914     case DT_C6000_GSYM_OFFSET: return "C6000_GSYM_OFFSET";
1915     case DT_C6000_GSTR_OFFSET: return "C6000_GSTR_OFFSET";
1916     case DT_C6000_DSBT_BASE:   return "C6000_DSBT_BASE";
1917     case DT_C6000_DSBT_SIZE:   return "C6000_DSBT_SIZE";
1918     case DT_C6000_PREEMPTMAP:  return "C6000_PREEMPTMAP";
1919     case DT_C6000_DSBT_INDEX:  return "C6000_DSBT_INDEX";
1920     default:
1921       return NULL;
1922     }
1923 }
1924
1925 static const char *
1926 get_nios2_dynamic_type (unsigned long type)
1927 {
1928   switch (type)
1929     {
1930     case DT_NIOS2_GP: return "NIOS2_GP";
1931     default:
1932       return NULL;
1933     }
1934 }
1935
1936 static const char *
1937 get_solaris_dynamic_type (unsigned long type)
1938 {
1939   switch (type)
1940     {
1941     case 0x6000000d: return "SUNW_AUXILIARY";
1942     case 0x6000000e: return "SUNW_RTLDINF";
1943     case 0x6000000f: return "SUNW_FILTER";
1944     case 0x60000010: return "SUNW_CAP";
1945     case 0x60000011: return "SUNW_SYMTAB";
1946     case 0x60000012: return "SUNW_SYMSZ";
1947     case 0x60000013: return "SUNW_SORTENT";
1948     case 0x60000014: return "SUNW_SYMSORT";
1949     case 0x60000015: return "SUNW_SYMSORTSZ";
1950     case 0x60000016: return "SUNW_TLSSORT";
1951     case 0x60000017: return "SUNW_TLSSORTSZ";
1952     case 0x60000018: return "SUNW_CAPINFO";
1953     case 0x60000019: return "SUNW_STRPAD";
1954     case 0x6000001a: return "SUNW_CAPCHAIN";
1955     case 0x6000001b: return "SUNW_LDMACH";
1956     case 0x6000001d: return "SUNW_CAPCHAINENT";
1957     case 0x6000001f: return "SUNW_CAPCHAINSZ";
1958     case 0x60000021: return "SUNW_PARENT";
1959     case 0x60000023: return "SUNW_ASLR";
1960     case 0x60000025: return "SUNW_RELAX";
1961     case 0x60000029: return "SUNW_NXHEAP";
1962     case 0x6000002b: return "SUNW_NXSTACK";
1963
1964     case 0x70000001: return "SPARC_REGISTER";
1965     case 0x7ffffffd: return "AUXILIARY";
1966     case 0x7ffffffe: return "USED";
1967     case 0x7fffffff: return "FILTER";
1968
1969     default: return NULL;      
1970     }
1971 }
1972
1973 static const char *
1974 get_dynamic_type (unsigned long type)
1975 {
1976   static char buff[64];
1977
1978   switch (type)
1979     {
1980     case DT_NULL:       return "NULL";
1981     case DT_NEEDED:     return "NEEDED";
1982     case DT_PLTRELSZ:   return "PLTRELSZ";
1983     case DT_PLTGOT:     return "PLTGOT";
1984     case DT_HASH:       return "HASH";
1985     case DT_STRTAB:     return "STRTAB";
1986     case DT_SYMTAB:     return "SYMTAB";
1987     case DT_RELA:       return "RELA";
1988     case DT_RELASZ:     return "RELASZ";
1989     case DT_RELAENT:    return "RELAENT";
1990     case DT_STRSZ:      return "STRSZ";
1991     case DT_SYMENT:     return "SYMENT";
1992     case DT_INIT:       return "INIT";
1993     case DT_FINI:       return "FINI";
1994     case DT_SONAME:     return "SONAME";
1995     case DT_RPATH:      return "RPATH";
1996     case DT_SYMBOLIC:   return "SYMBOLIC";
1997     case DT_REL:        return "REL";
1998     case DT_RELSZ:      return "RELSZ";
1999     case DT_RELENT:     return "RELENT";
2000     case DT_PLTREL:     return "PLTREL";
2001     case DT_DEBUG:      return "DEBUG";
2002     case DT_TEXTREL:    return "TEXTREL";
2003     case DT_JMPREL:     return "JMPREL";
2004     case DT_BIND_NOW:   return "BIND_NOW";
2005     case DT_INIT_ARRAY: return "INIT_ARRAY";
2006     case DT_FINI_ARRAY: return "FINI_ARRAY";
2007     case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
2008     case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
2009     case DT_RUNPATH:    return "RUNPATH";
2010     case DT_FLAGS:      return "FLAGS";
2011
2012     case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
2013     case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
2014
2015     case DT_CHECKSUM:   return "CHECKSUM";
2016     case DT_PLTPADSZ:   return "PLTPADSZ";
2017     case DT_MOVEENT:    return "MOVEENT";
2018     case DT_MOVESZ:     return "MOVESZ";
2019     case DT_FEATURE:    return "FEATURE";
2020     case DT_POSFLAG_1:  return "POSFLAG_1";
2021     case DT_SYMINSZ:    return "SYMINSZ";
2022     case DT_SYMINENT:   return "SYMINENT"; /* aka VALRNGHI */
2023
2024     case DT_ADDRRNGLO:  return "ADDRRNGLO";
2025     case DT_CONFIG:     return "CONFIG";
2026     case DT_DEPAUDIT:   return "DEPAUDIT";
2027     case DT_AUDIT:      return "AUDIT";
2028     case DT_PLTPAD:     return "PLTPAD";
2029     case DT_MOVETAB:    return "MOVETAB";
2030     case DT_SYMINFO:    return "SYMINFO"; /* aka ADDRRNGHI */
2031
2032     case DT_VERSYM:     return "VERSYM";
2033
2034     case DT_TLSDESC_GOT: return "TLSDESC_GOT";
2035     case DT_TLSDESC_PLT: return "TLSDESC_PLT";
2036     case DT_RELACOUNT:  return "RELACOUNT";
2037     case DT_RELCOUNT:   return "RELCOUNT";
2038     case DT_FLAGS_1:    return "FLAGS_1";
2039     case DT_VERDEF:     return "VERDEF";
2040     case DT_VERDEFNUM:  return "VERDEFNUM";
2041     case DT_VERNEED:    return "VERNEED";
2042     case DT_VERNEEDNUM: return "VERNEEDNUM";
2043
2044     case DT_AUXILIARY:  return "AUXILIARY";
2045     case DT_USED:       return "USED";
2046     case DT_FILTER:     return "FILTER";
2047
2048     case DT_GNU_PRELINKED: return "GNU_PRELINKED";
2049     case DT_GNU_CONFLICT: return "GNU_CONFLICT";
2050     case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
2051     case DT_GNU_LIBLIST: return "GNU_LIBLIST";
2052     case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
2053     case DT_GNU_HASH:   return "GNU_HASH";
2054
2055     default:
2056       if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
2057         {
2058           const char * result;
2059
2060           switch (elf_header.e_machine)
2061             {
2062             case EM_MIPS:
2063             case EM_MIPS_RS3_LE:
2064               result = get_mips_dynamic_type (type);
2065               break;
2066             case EM_SPARCV9:
2067               result = get_sparc64_dynamic_type (type);
2068               break;
2069             case EM_PPC:
2070               result = get_ppc_dynamic_type (type);
2071               break;
2072             case EM_PPC64:
2073               result = get_ppc64_dynamic_type (type);
2074               break;
2075             case EM_IA_64:
2076               result = get_ia64_dynamic_type (type);
2077               break;
2078             case EM_ALPHA:
2079               result = get_alpha_dynamic_type (type);
2080               break;
2081             case EM_SCORE:
2082               result = get_score_dynamic_type (type);
2083               break;
2084             case EM_TI_C6000:
2085               result = get_tic6x_dynamic_type (type);
2086               break;
2087             case EM_ALTERA_NIOS2:
2088               result = get_nios2_dynamic_type (type);
2089               break;
2090             default:
2091               if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
2092                 result = get_solaris_dynamic_type (type);
2093               else
2094                 result = NULL;
2095               break;
2096             }
2097
2098           if (result != NULL)
2099             return result;
2100
2101           snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
2102         }
2103       else if (((type >= DT_LOOS) && (type <= DT_HIOS))
2104                || (elf_header.e_machine == EM_PARISC
2105                    && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
2106         {
2107           const char * result;
2108
2109           switch (elf_header.e_machine)
2110             {
2111             case EM_PARISC:
2112               result = get_parisc_dynamic_type (type);
2113               break;
2114             case EM_IA_64:
2115               result = get_ia64_dynamic_type (type);
2116               break;
2117             default:
2118               if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
2119                 result = get_solaris_dynamic_type (type);
2120               else
2121                 result = NULL;
2122               break;
2123             }
2124
2125           if (result != NULL)
2126             return result;
2127
2128           snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
2129                     type);
2130         }
2131       else
2132         snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
2133
2134       return buff;
2135     }
2136 }
2137
2138 static char *
2139 get_file_type (unsigned e_type)
2140 {
2141   static char buff[32];
2142
2143   switch (e_type)
2144     {
2145     case ET_NONE:       return _("NONE (None)");
2146     case ET_REL:        return _("REL (Relocatable file)");
2147     case ET_EXEC:       return _("EXEC (Executable file)");
2148     case ET_DYN:        return _("DYN (Shared object file)");
2149     case ET_CORE:       return _("CORE (Core file)");
2150
2151     default:
2152       if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
2153         snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
2154       else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
2155         snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
2156       else
2157         snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
2158       return buff;
2159     }
2160 }
2161
2162 static char *
2163 get_machine_name (unsigned e_machine)
2164 {
2165   static char buff[64]; /* XXX */
2166
2167   switch (e_machine)
2168     {
2169     case EM_NONE:               return _("None");
2170     case EM_AARCH64:            return "AArch64";
2171     case EM_M32:                return "WE32100";
2172     case EM_SPARC:              return "Sparc";
2173     case EM_SPU:                return "SPU";
2174     case EM_386:                return "Intel 80386";
2175     case EM_68K:                return "MC68000";
2176     case EM_88K:                return "MC88000";
2177     case EM_IAMCU:              return "Intel MCU";
2178     case EM_860:                return "Intel 80860";
2179     case EM_MIPS:               return "MIPS R3000";
2180     case EM_S370:               return "IBM System/370";
2181     case EM_MIPS_RS3_LE:        return "MIPS R4000 big-endian";
2182     case EM_OLD_SPARCV9:        return "Sparc v9 (old)";
2183     case EM_PARISC:             return "HPPA";
2184     case EM_PPC_OLD:            return "Power PC (old)";
2185     case EM_SPARC32PLUS:        return "Sparc v8+" ;
2186     case EM_960:                return "Intel 90860";
2187     case EM_PPC:                return "PowerPC";
2188     case EM_PPC64:              return "PowerPC64";
2189     case EM_FR20:               return "Fujitsu FR20";
2190     case EM_FT32:               return "FTDI FT32";
2191     case EM_RH32:               return "TRW RH32";
2192     case EM_MCORE:              return "MCORE";
2193     case EM_ARM:                return "ARM";
2194     case EM_OLD_ALPHA:          return "Digital Alpha (old)";
2195     case EM_SH:                 return "Renesas / SuperH SH";
2196     case EM_SPARCV9:            return "Sparc v9";
2197     case EM_TRICORE:            return "Siemens Tricore";
2198     case EM_ARC:                return "ARC";
2199     case EM_ARC_COMPACT:        return "ARCompact";
2200     case EM_ARC_COMPACT2:       return "ARCv2";
2201     case EM_H8_300:             return "Renesas H8/300";
2202     case EM_H8_300H:            return "Renesas H8/300H";
2203     case EM_H8S:                return "Renesas H8S";
2204     case EM_H8_500:             return "Renesas H8/500";
2205     case EM_IA_64:              return "Intel IA-64";
2206     case EM_MIPS_X:             return "Stanford MIPS-X";
2207     case EM_COLDFIRE:           return "Motorola Coldfire";
2208     case EM_ALPHA:              return "Alpha";
2209     case EM_CYGNUS_D10V:
2210     case EM_D10V:               return "d10v";
2211     case EM_CYGNUS_D30V:
2212     case EM_D30V:               return "d30v";
2213     case EM_CYGNUS_M32R:
2214     case EM_M32R:               return "Renesas M32R (formerly Mitsubishi M32r)";
2215     case EM_CYGNUS_V850:
2216     case EM_V800:               return "Renesas V850 (using RH850 ABI)";
2217     case EM_V850:               return "Renesas V850";
2218     case EM_CYGNUS_MN10300:
2219     case EM_MN10300:            return "mn10300";
2220     case EM_CYGNUS_MN10200:
2221     case EM_MN10200:            return "mn10200";
2222     case EM_MOXIE:              return "Moxie";
2223     case EM_CYGNUS_FR30:
2224     case EM_FR30:               return "Fujitsu FR30";
2225     case EM_CYGNUS_FRV:         return "Fujitsu FR-V";
2226     case EM_PJ_OLD:
2227     case EM_PJ:                 return "picoJava";
2228     case EM_MMA:                return "Fujitsu Multimedia Accelerator";
2229     case EM_PCP:                return "Siemens PCP";
2230     case EM_NCPU:               return "Sony nCPU embedded RISC processor";
2231     case EM_NDR1:               return "Denso NDR1 microprocesspr";
2232     case EM_STARCORE:           return "Motorola Star*Core processor";
2233     case EM_ME16:               return "Toyota ME16 processor";
2234     case EM_ST100:              return "STMicroelectronics ST100 processor";
2235     case EM_TINYJ:              return "Advanced Logic Corp. TinyJ embedded processor";
2236     case EM_PDSP:               return "Sony DSP processor";
2237     case EM_PDP10:              return "Digital Equipment Corp. PDP-10";
2238     case EM_PDP11:              return "Digital Equipment Corp. PDP-11";
2239     case EM_FX66:               return "Siemens FX66 microcontroller";
2240     case EM_ST9PLUS:            return "STMicroelectronics ST9+ 8/16 bit microcontroller";
2241     case EM_ST7:                return "STMicroelectronics ST7 8-bit microcontroller";
2242     case EM_68HC16:             return "Motorola MC68HC16 Microcontroller";
2243     case EM_68HC12:             return "Motorola MC68HC12 Microcontroller";
2244     case EM_68HC11:             return "Motorola MC68HC11 Microcontroller";
2245     case EM_68HC08:             return "Motorola MC68HC08 Microcontroller";
2246     case EM_68HC05:             return "Motorola MC68HC05 Microcontroller";
2247     case EM_SVX:                return "Silicon Graphics SVx";
2248     case EM_ST19:               return "STMicroelectronics ST19 8-bit microcontroller";
2249     case EM_VAX:                return "Digital VAX";
2250     case EM_VISIUM:             return "CDS VISIUMcore processor";
2251     case EM_AVR_OLD:
2252     case EM_AVR:                return "Atmel AVR 8-bit microcontroller";
2253     case EM_CRIS:               return "Axis Communications 32-bit embedded processor";
2254     case EM_JAVELIN:            return "Infineon Technologies 32-bit embedded cpu";
2255     case EM_FIREPATH:           return "Element 14 64-bit DSP processor";
2256     case EM_ZSP:                return "LSI Logic's 16-bit DSP processor";
2257     case EM_MMIX:               return "Donald Knuth's educational 64-bit processor";
2258     case EM_HUANY:              return "Harvard Universitys's machine-independent object format";
2259     case EM_PRISM:              return "Vitesse Prism";
2260     case EM_X86_64:             return "Advanced Micro Devices X86-64";
2261     case EM_L1OM:               return "Intel L1OM";
2262     case EM_K1OM:               return "Intel K1OM";
2263     case EM_S390_OLD:
2264     case EM_S390:               return "IBM S/390";
2265     case EM_SCORE:              return "SUNPLUS S+Core";
2266     case EM_XSTORMY16:          return "Sanyo XStormy16 CPU core";
2267     case EM_OR1K:               return "OpenRISC 1000";
2268     case EM_CRX:                return "National Semiconductor CRX microprocessor";
2269     case EM_ADAPTEVA_EPIPHANY:  return "Adapteva EPIPHANY";
2270     case EM_DLX:                return "OpenDLX";
2271     case EM_IP2K_OLD:
2272     case EM_IP2K:               return "Ubicom IP2xxx 8-bit microcontrollers";
2273     case EM_IQ2000:             return "Vitesse IQ2000";
2274     case EM_XTENSA_OLD:
2275     case EM_XTENSA:             return "Tensilica Xtensa Processor";
2276     case EM_VIDEOCORE:          return "Alphamosaic VideoCore processor";
2277     case EM_TMM_GPP:            return "Thompson Multimedia General Purpose Processor";
2278     case EM_NS32K:              return "National Semiconductor 32000 series";
2279     case EM_TPC:                return "Tenor Network TPC processor";
2280     case EM_ST200:              return "STMicroelectronics ST200 microcontroller";
2281     case EM_MAX:                return "MAX Processor";
2282     case EM_CR:                 return "National Semiconductor CompactRISC";
2283     case EM_F2MC16:             return "Fujitsu F2MC16";
2284     case EM_MSP430:             return "Texas Instruments msp430 microcontroller";
2285     case EM_LATTICEMICO32:      return "Lattice Mico32";
2286     case EM_M32C_OLD:
2287     case EM_M32C:               return "Renesas M32c";
2288     case EM_MT:                 return "Morpho Techologies MT processor";
2289     case EM_BLACKFIN:           return "Analog Devices Blackfin";
2290     case EM_SE_C33:             return "S1C33 Family of Seiko Epson processors";
2291     case EM_SEP:                return "Sharp embedded microprocessor";
2292     case EM_ARCA:               return "Arca RISC microprocessor";
2293     case EM_UNICORE:            return "Unicore";
2294     case EM_EXCESS:             return "eXcess 16/32/64-bit configurable embedded CPU";
2295     case EM_DXP:                return "Icera Semiconductor Inc. Deep Execution Processor";
2296     case EM_NIOS32:             return "Altera Nios";
2297     case EM_ALTERA_NIOS2:       return "Altera Nios II";
2298     case EM_C166:
2299     case EM_XC16X:              return "Infineon Technologies xc16x";
2300     case EM_M16C:               return "Renesas M16C series microprocessors";
2301     case EM_DSPIC30F:           return "Microchip Technology dsPIC30F Digital Signal Controller";
2302     case EM_CE:                 return "Freescale Communication Engine RISC core";
2303     case EM_TSK3000:            return "Altium TSK3000 core";
2304     case EM_RS08:               return "Freescale RS08 embedded processor";
2305     case EM_ECOG2:              return "Cyan Technology eCOG2 microprocessor";
2306     case EM_DSP24:              return "New Japan Radio (NJR) 24-bit DSP Processor";
2307     case EM_VIDEOCORE3:         return "Broadcom VideoCore III processor";
2308     case EM_SE_C17:             return "Seiko Epson C17 family";
2309     case EM_TI_C6000:           return "Texas Instruments TMS320C6000 DSP family";
2310     case EM_TI_C2000:           return "Texas Instruments TMS320C2000 DSP family";
2311     case EM_TI_C5500:           return "Texas Instruments TMS320C55x DSP family";
2312     case EM_MMDSP_PLUS:         return "STMicroelectronics 64bit VLIW Data Signal Processor";
2313     case EM_CYPRESS_M8C:        return "Cypress M8C microprocessor";
2314     case EM_R32C:               return "Renesas R32C series microprocessors";
2315     case EM_TRIMEDIA:           return "NXP Semiconductors TriMedia architecture family";
2316     case EM_QDSP6:              return "QUALCOMM DSP6 Processor";
2317     case EM_8051:               return "Intel 8051 and variants";
2318     case EM_STXP7X:             return "STMicroelectronics STxP7x family";
2319     case EM_NDS32:              return "Andes Technology compact code size embedded RISC processor family";
2320     case EM_ECOG1X:             return "Cyan Technology eCOG1X family";
2321     case EM_MAXQ30:             return "Dallas Semiconductor MAXQ30 Core microcontrollers";
2322     case EM_XIMO16:             return "New Japan Radio (NJR) 16-bit DSP Processor";
2323     case EM_MANIK:              return "M2000 Reconfigurable RISC Microprocessor";
2324     case EM_CRAYNV2:            return "Cray Inc. NV2 vector architecture";
2325     case EM_CYGNUS_MEP:         return "Toshiba MeP Media Engine";
2326     case EM_CR16:
2327     case EM_MICROBLAZE:
2328     case EM_MICROBLAZE_OLD:     return "Xilinx MicroBlaze";
2329     case EM_RL78:               return "Renesas RL78";
2330     case EM_RX:                 return "Renesas RX";
2331     case EM_METAG:              return "Imagination Technologies Meta processor architecture";
2332     case EM_MCST_ELBRUS:        return "MCST Elbrus general purpose hardware architecture";
2333     case EM_ECOG16:             return "Cyan Technology eCOG16 family";
2334     case EM_ETPU:               return "Freescale Extended Time Processing Unit";
2335     case EM_SLE9X:              return "Infineon Technologies SLE9X core";
2336     case EM_AVR32:              return "Atmel Corporation 32-bit microprocessor family";
2337     case EM_STM8:               return "STMicroeletronics STM8 8-bit microcontroller";
2338     case EM_TILE64:             return "Tilera TILE64 multicore architecture family";
2339     case EM_TILEPRO:            return "Tilera TILEPro multicore architecture family";
2340     case EM_TILEGX:             return "Tilera TILE-Gx multicore architecture family";
2341     case EM_CUDA:               return "NVIDIA CUDA architecture";
2342     case EM_XGATE:              return "Motorola XGATE embedded processor";
2343     default:
2344       snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
2345       return buff;
2346     }
2347 }
2348
2349 static void
2350 decode_ARC_machine_flags (unsigned e_flags, unsigned e_machine, char buf[])
2351 {
2352   /* ARC has two machine types EM_ARC_COMPACT and EM_ARC_COMPACT2.  Some
2353      other compilers don't a specific architecture type in the e_flags, and
2354      instead use EM_ARC_COMPACT for old ARC600, ARC601, and ARC700
2355      architectures, and switch to EM_ARC_COMPACT2 for newer ARCEM and ARCHS
2356      architectures.
2357
2358      Th GNU tools follows this use of EM_ARC_COMPACT and EM_ARC_COMPACT2,
2359      but also sets a specific architecture type in the e_flags field.
2360
2361      However, when decoding the flags we don't worry if we see an
2362      unexpected pairing, for example EM_ARC_COMPACT machine type, with
2363      ARCEM architecture type.  */
2364
2365   switch (e_flags & EF_ARC_MACH_MSK)
2366     {
2367       /* We only expect these to occur for EM_ARC_COMPACT2.  */
2368     case EF_ARC_CPU_ARCV2EM:
2369       strcat (buf, ", ARC EM");
2370       break;
2371     case EF_ARC_CPU_ARCV2HS:
2372       strcat (buf, ", ARC HS");
2373       break;
2374
2375       /* We only expect these to occur for EM_ARC_COMPACT.  */
2376     case E_ARC_MACH_ARC600:
2377       strcat (buf, ", ARC600");
2378       break;
2379     case E_ARC_MACH_ARC601:
2380       strcat (buf, ", ARC601");
2381       break;
2382     case E_ARC_MACH_ARC700:
2383       strcat (buf, ", ARC700");
2384       break;
2385
2386       /* The only times we should end up here are (a) A corrupt ELF, (b) A
2387          new ELF with new architecture being read by an old version of
2388          readelf, or (c) An ELF built with non-GNU compiler that does not
2389          set the architecture in the e_flags.  */
2390     default:
2391       if (e_machine == EM_ARC_COMPACT)
2392         strcat (buf, ", Unknown ARCompact");
2393       else
2394         strcat (buf, ", Unknown ARC");
2395       break;
2396     }
2397
2398   switch (e_flags & EF_ARC_OSABI_MSK)
2399     {
2400     case E_ARC_OSABI_ORIG:
2401       strcat (buf, ", (ABI:legacy)");
2402       break;
2403     case E_ARC_OSABI_V2:
2404       strcat (buf, ", (ABI:v2)");
2405       break;
2406       /* Only upstream 3.9+ kernels will support ARCv2 ISA.  */
2407     case E_ARC_OSABI_V3:
2408       strcat (buf, ", v3 no-legacy-syscalls ABI");
2409       break;
2410     default:
2411       strcat (buf, ", unrecognised ARC OSABI flag");
2412       break;
2413     }
2414 }
2415
2416 static void
2417 decode_ARM_machine_flags (unsigned e_flags, char buf[])
2418 {
2419   unsigned eabi;
2420   int unknown = 0;
2421
2422   eabi = EF_ARM_EABI_VERSION (e_flags);
2423   e_flags &= ~ EF_ARM_EABIMASK;
2424
2425   /* Handle "generic" ARM flags.  */
2426   if (e_flags & EF_ARM_RELEXEC)
2427     {
2428       strcat (buf, ", relocatable executable");
2429       e_flags &= ~ EF_ARM_RELEXEC;
2430     }
2431
2432   /* Now handle EABI specific flags.  */
2433   switch (eabi)
2434     {
2435     default:
2436       strcat (buf, ", <unrecognized EABI>");
2437       if (e_flags)
2438         unknown = 1;
2439       break;
2440
2441     case EF_ARM_EABI_VER1:
2442       strcat (buf, ", Version1 EABI");
2443       while (e_flags)
2444         {
2445           unsigned flag;
2446
2447           /* Process flags one bit at a time.  */
2448           flag = e_flags & - e_flags;
2449           e_flags &= ~ flag;
2450
2451           switch (flag)
2452             {
2453             case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK.  */
2454               strcat (buf, ", sorted symbol tables");
2455               break;
2456
2457             default:
2458               unknown = 1;
2459               break;
2460             }
2461         }
2462       break;
2463
2464     case EF_ARM_EABI_VER2:
2465       strcat (buf, ", Version2 EABI");
2466       while (e_flags)
2467         {
2468           unsigned flag;
2469
2470           /* Process flags one bit at a time.  */
2471           flag = e_flags & - e_flags;
2472           e_flags &= ~ flag;
2473
2474           switch (flag)
2475             {
2476             case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK.  */
2477               strcat (buf, ", sorted symbol tables");
2478               break;
2479
2480             case EF_ARM_DYNSYMSUSESEGIDX:
2481               strcat (buf, ", dynamic symbols use segment index");
2482               break;
2483
2484             case EF_ARM_MAPSYMSFIRST:
2485               strcat (buf, ", mapping symbols precede others");
2486               break;
2487
2488             default:
2489               unknown = 1;
2490               break;
2491             }
2492         }
2493       break;
2494
2495     case EF_ARM_EABI_VER3:
2496       strcat (buf, ", Version3 EABI");
2497       break;
2498
2499     case EF_ARM_EABI_VER4:
2500       strcat (buf, ", Version4 EABI");
2501       while (e_flags)
2502         {
2503           unsigned flag;
2504
2505           /* Process flags one bit at a time.  */
2506           flag = e_flags & - e_flags;
2507           e_flags &= ~ flag;
2508
2509           switch (flag)
2510             {
2511             case EF_ARM_BE8:
2512               strcat (buf, ", BE8");
2513               break;
2514
2515             case EF_ARM_LE8:
2516               strcat (buf, ", LE8");
2517               break;
2518
2519             default:
2520               unknown = 1;
2521               break;
2522             }
2523       break;
2524         }
2525       break;
2526
2527     case EF_ARM_EABI_VER5:
2528       strcat (buf, ", Version5 EABI");
2529       while (e_flags)
2530         {
2531           unsigned flag;
2532
2533           /* Process flags one bit at a time.  */
2534           flag = e_flags & - e_flags;
2535           e_flags &= ~ flag;
2536
2537           switch (flag)
2538             {
2539             case EF_ARM_BE8:
2540               strcat (buf, ", BE8");
2541               break;
2542
2543             case EF_ARM_LE8:
2544               strcat (buf, ", LE8");
2545               break;
2546
2547             case EF_ARM_ABI_FLOAT_SOFT: /* Conflicts with EF_ARM_SOFT_FLOAT.  */
2548               strcat (buf, ", soft-float ABI");
2549               break;
2550
2551             case EF_ARM_ABI_FLOAT_HARD: /* Conflicts with EF_ARM_VFP_FLOAT.  */
2552               strcat (buf, ", hard-float ABI");
2553               break;
2554
2555             default:
2556               unknown = 1;
2557               break;
2558             }
2559         }
2560       break;
2561
2562     case EF_ARM_EABI_UNKNOWN:
2563       strcat (buf, ", GNU EABI");
2564       while (e_flags)
2565         {
2566           unsigned flag;
2567
2568           /* Process flags one bit at a time.  */
2569           flag = e_flags & - e_flags;
2570           e_flags &= ~ flag;
2571
2572           switch (flag)
2573             {
2574             case EF_ARM_INTERWORK:
2575               strcat (buf, ", interworking enabled");
2576               break;
2577
2578             case EF_ARM_APCS_26:
2579               strcat (buf, ", uses APCS/26");
2580               break;
2581
2582             case EF_ARM_APCS_FLOAT:
2583               strcat (buf, ", uses APCS/float");
2584               break;
2585
2586             case EF_ARM_PIC:
2587               strcat (buf, ", position independent");
2588               break;
2589
2590             case EF_ARM_ALIGN8:
2591               strcat (buf, ", 8 bit structure alignment");
2592               break;
2593
2594             case EF_ARM_NEW_ABI:
2595               strcat (buf, ", uses new ABI");
2596               break;
2597
2598             case EF_ARM_OLD_ABI:
2599               strcat (buf, ", uses old ABI");
2600               break;
2601
2602             case EF_ARM_SOFT_FLOAT:
2603               strcat (buf, ", software FP");
2604               break;
2605
2606             case EF_ARM_VFP_FLOAT:
2607               strcat (buf, ", VFP");
2608               break;
2609
2610             case EF_ARM_MAVERICK_FLOAT:
2611               strcat (buf, ", Maverick FP");
2612               break;
2613
2614             default:
2615               unknown = 1;
2616               break;
2617             }
2618         }
2619     }
2620
2621   if (unknown)
2622     strcat (buf,_(", <unknown>"));
2623 }
2624
2625 static void
2626 decode_AVR_machine_flags (unsigned e_flags, char buf[], size_t size)
2627 {
2628   --size; /* Leave space for null terminator.  */
2629
2630   switch (e_flags & EF_AVR_MACH)
2631     {
2632     case E_AVR_MACH_AVR1:
2633       strncat (buf, ", avr:1", size);
2634       break;
2635     case E_AVR_MACH_AVR2:
2636       strncat (buf, ", avr:2", size);
2637       break;
2638     case E_AVR_MACH_AVR25:
2639       strncat (buf, ", avr:25", size);
2640       break;
2641     case E_AVR_MACH_AVR3:
2642       strncat (buf, ", avr:3", size);
2643       break;
2644     case E_AVR_MACH_AVR31:
2645       strncat (buf, ", avr:31", size);
2646       break;
2647     case E_AVR_MACH_AVR35:
2648       strncat (buf, ", avr:35", size);
2649       break;
2650     case E_AVR_MACH_AVR4:
2651       strncat (buf, ", avr:4", size);
2652       break;
2653     case E_AVR_MACH_AVR5:
2654       strncat (buf, ", avr:5", size);
2655       break;
2656     case E_AVR_MACH_AVR51:
2657       strncat (buf, ", avr:51", size);
2658       break;
2659     case E_AVR_MACH_AVR6:
2660       strncat (buf, ", avr:6", size);
2661       break;
2662     case E_AVR_MACH_AVRTINY:
2663       strncat (buf, ", avr:100", size);
2664       break;
2665     case E_AVR_MACH_XMEGA1:
2666       strncat (buf, ", avr:101", size);
2667       break;
2668     case E_AVR_MACH_XMEGA2:
2669       strncat (buf, ", avr:102", size);
2670       break;
2671     case E_AVR_MACH_XMEGA3:
2672       strncat (buf, ", avr:103", size);
2673       break;
2674     case E_AVR_MACH_XMEGA4:
2675       strncat (buf, ", avr:104", size);
2676       break;
2677     case E_AVR_MACH_XMEGA5:
2678       strncat (buf, ", avr:105", size);
2679       break;
2680     case E_AVR_MACH_XMEGA6:
2681       strncat (buf, ", avr:106", size);
2682       break;
2683     case E_AVR_MACH_XMEGA7:
2684       strncat (buf, ", avr:107", size);
2685       break;
2686     default:
2687       strncat (buf, ", avr:<unknown>", size);
2688       break;
2689     }
2690
2691   size -= strlen (buf);
2692   if (e_flags & EF_AVR_LINKRELAX_PREPARED)
2693     strncat (buf, ", link-relax", size);
2694 }
2695
2696 static void
2697 decode_NDS32_machine_flags (unsigned e_flags, char buf[], size_t size)
2698 {
2699   unsigned abi;
2700   unsigned arch;
2701   unsigned config;
2702   unsigned version;
2703   int has_fpu = 0;
2704   int r = 0;
2705
2706   static const char *ABI_STRINGS[] =
2707   {
2708     "ABI v0", /* use r5 as return register; only used in N1213HC */
2709     "ABI v1", /* use r0 as return register */
2710     "ABI v2", /* use r0 as return register and don't reserve 24 bytes for arguments */
2711     "ABI v2fp", /* for FPU */
2712     "AABI",
2713     "ABI2 FP+"
2714   };
2715   static const char *VER_STRINGS[] =
2716   {
2717     "Andes ELF V1.3 or older",
2718     "Andes ELF V1.3.1",
2719     "Andes ELF V1.4"
2720   };
2721   static const char *ARCH_STRINGS[] =
2722   {
2723     "",
2724     "Andes Star v1.0",
2725     "Andes Star v2.0",
2726     "Andes Star v3.0",
2727     "Andes Star v3.0m"
2728   };
2729
2730   abi = EF_NDS_ABI & e_flags;
2731   arch = EF_NDS_ARCH & e_flags;
2732   config = EF_NDS_INST & e_flags;
2733   version = EF_NDS32_ELF_VERSION & e_flags;
2734
2735   memset (buf, 0, size);
2736
2737   switch (abi)
2738     {
2739     case E_NDS_ABI_V0:
2740     case E_NDS_ABI_V1:
2741     case E_NDS_ABI_V2:
2742     case E_NDS_ABI_V2FP:
2743     case E_NDS_ABI_AABI:
2744     case E_NDS_ABI_V2FP_PLUS:
2745       /* In case there are holes in the array.  */
2746       r += snprintf (buf + r, size - r, ", %s", ABI_STRINGS[abi >> EF_NDS_ABI_SHIFT]);
2747       break;
2748
2749     default:
2750       r += snprintf (buf + r, size - r, ", <unrecognized ABI>");
2751       break;
2752     }
2753
2754   switch (version)
2755     {
2756     case E_NDS32_ELF_VER_1_2:
2757     case E_NDS32_ELF_VER_1_3:
2758     case E_NDS32_ELF_VER_1_4:
2759       r += snprintf (buf + r, size - r, ", %s", VER_STRINGS[version >> EF_NDS32_ELF_VERSION_SHIFT]);
2760       break;
2761
2762     default:
2763       r += snprintf (buf + r, size - r, ", <unrecognized ELF version number>");
2764       break;
2765     }
2766
2767   if (E_NDS_ABI_V0 == abi)
2768     {
2769       /* OLD ABI; only used in N1213HC, has performance extension 1.  */
2770       r += snprintf (buf + r, size - r, ", Andes Star v1.0, N1213HC, MAC, PERF1");
2771       if (arch == E_NDS_ARCH_STAR_V1_0)
2772         r += snprintf (buf + r, size -r, ", 16b"); /* has 16-bit instructions */
2773       return;
2774     }
2775
2776   switch (arch)
2777     {
2778     case E_NDS_ARCH_STAR_V1_0:
2779     case E_NDS_ARCH_STAR_V2_0:
2780     case E_NDS_ARCH_STAR_V3_0:
2781     case E_NDS_ARCH_STAR_V3_M:
2782       r += snprintf (buf + r, size - r, ", %s", ARCH_STRINGS[arch >> EF_NDS_ARCH_SHIFT]);
2783       break;
2784
2785     default:
2786       r += snprintf (buf + r, size - r, ", <unrecognized architecture>");
2787       /* ARCH version determines how the e_flags are interpreted.
2788          If it is unknown, we cannot proceed.  */
2789       return;
2790     }
2791
2792   /* Newer ABI; Now handle architecture specific flags.  */
2793   if (arch == E_NDS_ARCH_STAR_V1_0)
2794     {
2795       if (config & E_NDS32_HAS_MFUSR_PC_INST)
2796         r += snprintf (buf + r, size -r, ", MFUSR_PC");
2797
2798       if (!(config & E_NDS32_HAS_NO_MAC_INST))
2799         r += snprintf (buf + r, size -r, ", MAC");
2800
2801       if (config & E_NDS32_HAS_DIV_INST)
2802         r += snprintf (buf + r, size -r, ", DIV");
2803
2804       if (config & E_NDS32_HAS_16BIT_INST)
2805         r += snprintf (buf + r, size -r, ", 16b");
2806     }
2807   else
2808     {
2809       if (config & E_NDS32_HAS_MFUSR_PC_INST)
2810         {
2811           if (version <= E_NDS32_ELF_VER_1_3)
2812             r += snprintf (buf + r, size -r, ", [B8]");
2813           else
2814             r += snprintf (buf + r, size -r, ", EX9");
2815         }
2816
2817       if (config & E_NDS32_HAS_MAC_DX_INST)
2818         r += snprintf (buf + r, size -r, ", MAC_DX");
2819
2820       if (config & E_NDS32_HAS_DIV_DX_INST)
2821         r += snprintf (buf + r, size -r, ", DIV_DX");
2822
2823       if (config & E_NDS32_HAS_16BIT_INST)
2824         {
2825           if (version <= E_NDS32_ELF_VER_1_3)
2826             r += snprintf (buf + r, size -r, ", 16b");
2827           else
2828             r += snprintf (buf + r, size -r, ", IFC");
2829         }
2830     }
2831
2832   if (config & E_NDS32_HAS_EXT_INST)
2833     r += snprintf (buf + r, size -r, ", PERF1");
2834
2835   if (config & E_NDS32_HAS_EXT2_INST)
2836     r += snprintf (buf + r, size -r, ", PERF2");
2837
2838   if (config & E_NDS32_HAS_FPU_INST)
2839     {
2840       has_fpu = 1;
2841       r += snprintf (buf + r, size -r, ", FPU_SP");
2842     }
2843
2844   if (config & E_NDS32_HAS_FPU_DP_INST)
2845     {
2846       has_fpu = 1;
2847       r += snprintf (buf + r, size -r, ", FPU_DP");
2848     }
2849
2850   if (config & E_NDS32_HAS_FPU_MAC_INST)
2851     {
2852       has_fpu = 1;
2853       r += snprintf (buf + r, size -r, ", FPU_MAC");
2854     }
2855
2856   if (has_fpu)
2857     {
2858       switch ((config & E_NDS32_FPU_REG_CONF) >> E_NDS32_FPU_REG_CONF_SHIFT)
2859         {
2860         case E_NDS32_FPU_REG_8SP_4DP:
2861           r += snprintf (buf + r, size -r, ", FPU_REG:8/4");
2862           break;
2863         case E_NDS32_FPU_REG_16SP_8DP:
2864           r += snprintf (buf + r, size -r, ", FPU_REG:16/8");
2865           break;
2866         case E_NDS32_FPU_REG_32SP_16DP:
2867           r += snprintf (buf + r, size -r, ", FPU_REG:32/16");
2868           break;
2869         case E_NDS32_FPU_REG_32SP_32DP:
2870           r += snprintf (buf + r, size -r, ", FPU_REG:32/32");
2871           break;
2872         }
2873     }
2874
2875   if (config & E_NDS32_HAS_AUDIO_INST)
2876     r += snprintf (buf + r, size -r, ", AUDIO");
2877
2878   if (config & E_NDS32_HAS_STRING_INST)
2879     r += snprintf (buf + r, size -r, ", STR");
2880
2881   if (config & E_NDS32_HAS_REDUCED_REGS)
2882     r += snprintf (buf + r, size -r, ", 16REG");
2883
2884   if (config & E_NDS32_HAS_VIDEO_INST)
2885     {
2886       if (version <= E_NDS32_ELF_VER_1_3)
2887         r += snprintf (buf + r, size -r, ", VIDEO");
2888       else
2889         r += snprintf (buf + r, size -r, ", SATURATION");
2890     }
2891
2892   if (config & E_NDS32_HAS_ENCRIPT_INST)
2893     r += snprintf (buf + r, size -r, ", ENCRP");
2894
2895   if (config & E_NDS32_HAS_L2C_INST)
2896     r += snprintf (buf + r, size -r, ", L2C");
2897 }
2898
2899 static char *
2900 get_machine_flags (unsigned e_flags, unsigned e_machine)
2901 {
2902   static char buf[1024];
2903
2904   buf[0] = '\0';
2905
2906   if (e_flags)
2907     {
2908       switch (e_machine)
2909         {
2910         default:
2911           break;
2912
2913         case EM_ARC_COMPACT2:
2914         case EM_ARC_COMPACT:
2915           decode_ARC_machine_flags (e_flags, e_machine, buf);
2916           break;
2917
2918         case EM_ARM:
2919           decode_ARM_machine_flags (e_flags, buf);
2920           break;
2921
2922         case EM_AVR:
2923           decode_AVR_machine_flags (e_flags, buf, sizeof buf);
2924           break;
2925
2926         case EM_BLACKFIN:
2927           if (e_flags & EF_BFIN_PIC)
2928             strcat (buf, ", PIC");
2929
2930           if (e_flags & EF_BFIN_FDPIC)
2931             strcat (buf, ", FDPIC");
2932
2933           if (e_flags & EF_BFIN_CODE_IN_L1)
2934             strcat (buf, ", code in L1");
2935
2936           if (e_flags & EF_BFIN_DATA_IN_L1)
2937             strcat (buf, ", data in L1");
2938
2939           break;
2940
2941         case EM_CYGNUS_FRV:
2942           switch (e_flags & EF_FRV_CPU_MASK)
2943             {
2944             case EF_FRV_CPU_GENERIC:
2945               break;
2946
2947             default:
2948               strcat (buf, ", fr???");
2949               break;
2950
2951             case EF_FRV_CPU_FR300:
2952               strcat (buf, ", fr300");
2953               break;
2954
2955             case EF_FRV_CPU_FR400:
2956               strcat (buf, ", fr400");
2957               break;
2958             case EF_FRV_CPU_FR405:
2959               strcat (buf, ", fr405");
2960               break;
2961
2962             case EF_FRV_CPU_FR450:
2963               strcat (buf, ", fr450");
2964               break;
2965
2966             case EF_FRV_CPU_FR500:
2967               strcat (buf, ", fr500");
2968               break;
2969             case EF_FRV_CPU_FR550:
2970               strcat (buf, ", fr550");
2971               break;
2972
2973             case EF_FRV_CPU_SIMPLE:
2974               strcat (buf, ", simple");
2975               break;
2976             case EF_FRV_CPU_TOMCAT:
2977               strcat (buf, ", tomcat");
2978               break;
2979             }
2980           break;
2981
2982         case EM_68K:
2983           if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
2984             strcat (buf, ", m68000");
2985           else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
2986             strcat (buf, ", cpu32");
2987           else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
2988             strcat (buf, ", fido_a");
2989           else
2990             {
2991               char const * isa = _("unknown");
2992               char const * mac = _("unknown mac");
2993               char const * additional = NULL;
2994
2995               switch (e_flags & EF_M68K_CF_ISA_MASK)
2996                 {
2997                 case EF_M68K_CF_ISA_A_NODIV:
2998                   isa = "A";
2999                   additional = ", nodiv";
3000                   break;
3001                 case EF_M68K_CF_ISA_A:
3002                   isa = "A";
3003                   break;
3004                 case EF_M68K_CF_ISA_A_PLUS:
3005                   isa = "A+";
3006                   break;
3007                 case EF_M68K_CF_ISA_B_NOUSP:
3008                   isa = "B";
3009                   additional = ", nousp";
3010                   break;
3011                 case EF_M68K_CF_ISA_B:
3012                   isa = "B";
3013                   break;
3014                 case EF_M68K_CF_ISA_C:
3015                   isa = "C";
3016                   break;
3017                 case EF_M68K_CF_ISA_C_NODIV:
3018                   isa = "C";
3019                   additional = ", nodiv";
3020                   break;
3021                 }
3022               strcat (buf, ", cf, isa ");
3023               strcat (buf, isa);
3024               if (additional)
3025                 strcat (buf, additional);
3026               if (e_flags & EF_M68K_CF_FLOAT)
3027                 strcat (buf, ", float");
3028               switch (e_flags & EF_M68K_CF_MAC_MASK)
3029                 {
3030                 case 0:
3031                   mac = NULL;
3032                   break;
3033                 case EF_M68K_CF_MAC:
3034                   mac = "mac";
3035                   break;
3036                 case EF_M68K_CF_EMAC:
3037                   mac = "emac";
3038                   break;
3039                 case EF_M68K_CF_EMAC_B:
3040                   mac = "emac_b";
3041                   break;
3042                 }
3043               if (mac)
3044                 {
3045                   strcat (buf, ", ");
3046                   strcat (buf, mac);
3047                 }
3048             }
3049           break;
3050
3051         case EM_CYGNUS_MEP:
3052           switch (e_flags & EF_MEP_CPU_MASK)
3053             {
3054             case EF_MEP_CPU_MEP: strcat (buf, ", generic MeP"); break;
3055             case EF_MEP_CPU_C2: strcat (buf, ", MeP C2"); break;
3056             case EF_MEP_CPU_C3: strcat (buf, ", MeP C3"); break;
3057             case EF_MEP_CPU_C4: strcat (buf, ", MeP C4"); break;
3058             case EF_MEP_CPU_C5: strcat (buf, ", MeP C5"); break;
3059             case EF_MEP_CPU_H1: strcat (buf, ", MeP H1"); break;
3060             default: strcat (buf, _(", <unknown MeP cpu type>")); break;
3061             }
3062
3063           switch (e_flags & EF_MEP_COP_MASK)
3064             {
3065             case EF_MEP_COP_NONE: break;
3066             case EF_MEP_COP_AVC: strcat (buf, ", AVC coprocessor"); break;
3067             case EF_MEP_COP_AVC2: strcat (buf, ", AVC2 coprocessor"); break;
3068             case EF_MEP_COP_FMAX: strcat (buf, ", FMAX coprocessor"); break;
3069             case EF_MEP_COP_IVC2: strcat (buf, ", IVC2 coprocessor"); break;
3070             default: strcat (buf, _("<unknown MeP copro type>")); break;
3071             }
3072
3073           if (e_flags & EF_MEP_LIBRARY)
3074             strcat (buf, ", Built for Library");
3075
3076           if (e_flags & EF_MEP_INDEX_MASK)
3077             sprintf (buf + strlen (buf), ", Configuration Index: %#x",
3078                      e_flags & EF_MEP_INDEX_MASK);
3079
3080           if (e_flags & ~ EF_MEP_ALL_FLAGS)
3081             sprintf (buf + strlen (buf), _(", unknown flags bits: %#x"),
3082                      e_flags & ~ EF_MEP_ALL_FLAGS);
3083           break;
3084
3085         case EM_PPC:
3086           if (e_flags & EF_PPC_EMB)
3087             strcat (buf, ", emb");
3088
3089           if (e_flags & EF_PPC_RELOCATABLE)
3090             strcat (buf, _(", relocatable"));
3091
3092           if (e_flags & EF_PPC_RELOCATABLE_LIB)
3093             strcat (buf, _(", relocatable-lib"));
3094           break;
3095
3096         case EM_PPC64:
3097           if (e_flags & EF_PPC64_ABI)
3098             {
3099               char abi[] = ", abiv0";
3100
3101               abi[6] += e_flags & EF_PPC64_ABI;
3102               strcat (buf, abi);
3103             }
3104           break;
3105
3106         case EM_V800:
3107           if ((e_flags & EF_RH850_ABI) == EF_RH850_ABI)
3108             strcat (buf, ", RH850 ABI");
3109
3110           if (e_flags & EF_V800_850E3)
3111             strcat (buf, ", V3 architecture");
3112
3113           if ((e_flags & (EF_RH850_FPU_DOUBLE | EF_RH850_FPU_SINGLE)) == 0)
3114             strcat (buf, ", FPU not used");
3115
3116           if ((e_flags & (EF_RH850_REGMODE22 | EF_RH850_REGMODE32)) == 0)
3117             strcat (buf, ", regmode: COMMON");
3118
3119           if ((e_flags & (EF_RH850_GP_FIX | EF_RH850_GP_NOFIX)) == 0)
3120             strcat (buf, ", r4 not used");
3121
3122           if ((e_flags & (EF_RH850_EP_FIX | EF_RH850_EP_NOFIX)) == 0)
3123             strcat (buf, ", r30 not used");
3124
3125           if ((e_flags & (EF_RH850_TP_FIX | EF_RH850_TP_NOFIX)) == 0)
3126             strcat (buf, ", r5 not used");
3127
3128           if ((e_flags & (EF_RH850_REG2_RESERVE | EF_RH850_REG2_NORESERVE)) == 0)
3129             strcat (buf, ", r2 not used");
3130
3131           for (e_flags &= 0xFFFF; e_flags; e_flags &= ~ (e_flags & - e_flags))
3132             {
3133               switch (e_flags & - e_flags)
3134                 {
3135                 case EF_RH850_FPU_DOUBLE: strcat (buf, ", double precision FPU"); break;
3136                 case EF_RH850_FPU_SINGLE: strcat (buf, ", single precision FPU"); break;
3137                 case EF_RH850_REGMODE22: strcat (buf, ", regmode:22"); break;
3138                 case EF_RH850_REGMODE32: strcat (buf, ", regmode:23"); break;
3139                 case EF_RH850_GP_FIX: strcat (buf, ", r4 fixed"); break;
3140                 case EF_RH850_GP_NOFIX: strcat (buf, ", r4 free"); break;
3141                 case EF_RH850_EP_FIX: strcat (buf, ", r30 fixed"); break;
3142                 case EF_RH850_EP_NOFIX: strcat (buf, ", r30 free"); break;
3143                 case EF_RH850_TP_FIX: strcat (buf, ", r5 fixed"); break;
3144                 case EF_RH850_TP_NOFIX: strcat (buf, ", r5 free"); break;
3145                 case EF_RH850_REG2_RESERVE: strcat (buf, ", r2 fixed"); break;
3146                 case EF_RH850_REG2_NORESERVE: strcat (buf, ", r2 free"); break;
3147                 default: break;
3148                 }
3149             }
3150           break;
3151
3152         case EM_V850:
3153         case EM_CYGNUS_V850:
3154           switch (e_flags & EF_V850_ARCH)
3155             {
3156             case E_V850E3V5_ARCH:
3157               strcat (buf, ", v850e3v5");
3158               break;
3159             case E_V850E2V3_ARCH:
3160               strcat (buf, ", v850e2v3");
3161               break;
3162             case E_V850E2_ARCH:
3163               strcat (buf, ", v850e2");
3164               break;
3165             case E_V850E1_ARCH:
3166               strcat (buf, ", v850e1");
3167               break;
3168             case E_V850E_ARCH:
3169               strcat (buf, ", v850e");
3170               break;
3171             case E_V850_ARCH:
3172               strcat (buf, ", v850");
3173               break;
3174             default:
3175               strcat (buf, _(", unknown v850 architecture variant"));
3176               break;
3177             }
3178           break;
3179
3180         case EM_M32R:
3181         case EM_CYGNUS_M32R:
3182           if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
3183             strcat (buf, ", m32r");
3184           break;
3185
3186         case EM_MIPS:
3187         case EM_MIPS_RS3_LE:
3188           if (e_flags & EF_MIPS_NOREORDER)
3189             strcat (buf, ", noreorder");
3190
3191           if (e_flags & EF_MIPS_PIC)
3192             strcat (buf, ", pic");
3193
3194           if (e_flags & EF_MIPS_CPIC)
3195             strcat (buf, ", cpic");
3196
3197           if (e_flags & EF_MIPS_UCODE)
3198             strcat (buf, ", ugen_reserved");
3199
3200           if (e_flags & EF_MIPS_ABI2)
3201             strcat (buf, ", abi2");
3202
3203           if (e_flags & EF_MIPS_OPTIONS_FIRST)
3204             strcat (buf, ", odk first");
3205
3206           if (e_flags & EF_MIPS_32BITMODE)
3207             strcat (buf, ", 32bitmode");
3208
3209           if (e_flags & EF_MIPS_NAN2008)
3210             strcat (buf, ", nan2008");
3211
3212           if (e_flags & EF_MIPS_FP64)
3213             strcat (buf, ", fp64");
3214
3215           switch ((e_flags & EF_MIPS_MACH))
3216             {
3217             case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
3218             case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
3219             case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
3220             case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
3221             case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
3222             case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
3223             case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
3224             case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
3225             case E_MIPS_MACH_SB1:  strcat (buf, ", sb1");  break;
3226             case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
3227             case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break;
3228             case E_MIPS_MACH_LS2F: strcat (buf, ", loongson-2f"); break;
3229             case E_MIPS_MACH_LS3A: strcat (buf, ", loongson-3a"); break;
3230             case E_MIPS_MACH_OCTEON: strcat (buf, ", octeon"); break;
3231             case E_MIPS_MACH_OCTEON2: strcat (buf, ", octeon2"); break;
3232             case E_MIPS_MACH_OCTEON3: strcat (buf, ", octeon3"); break;
3233             case E_MIPS_MACH_XLR:  strcat (buf, ", xlr"); break;
3234             case 0:
3235             /* We simply ignore the field in this case to avoid confusion:
3236                MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
3237                extension.  */
3238               break;
3239             default: strcat (buf, _(", unknown CPU")); break;
3240             }
3241
3242           switch ((e_flags & EF_MIPS_ABI))
3243             {
3244             case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
3245             case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
3246             case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
3247             case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
3248             case 0:
3249             /* We simply ignore the field in this case to avoid confusion:
3250                MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
3251                This means it is likely to be an o32 file, but not for
3252                sure.  */
3253               break;
3254             default: strcat (buf, _(", unknown ABI")); break;
3255             }
3256
3257           if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
3258             strcat (buf, ", mdmx");
3259
3260           if (e_flags & EF_MIPS_ARCH_ASE_M16)
3261             strcat (buf, ", mips16");
3262
3263           if (e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
3264             strcat (buf, ", micromips");
3265
3266           switch ((e_flags & EF_MIPS_ARCH))
3267             {
3268             case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
3269             case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
3270             case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
3271             case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
3272             case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
3273             case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
3274             case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
3275             case E_MIPS_ARCH_32R6: strcat (buf, ", mips32r6"); break;
3276             case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
3277             case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
3278             case E_MIPS_ARCH_64R6: strcat (buf, ", mips64r6"); break;
3279             default: strcat (buf, _(", unknown ISA")); break;
3280             }
3281           break;
3282
3283         case EM_NDS32:
3284           decode_NDS32_machine_flags (e_flags, buf, sizeof buf);
3285           break;
3286
3287         case EM_SH:
3288           switch ((e_flags & EF_SH_MACH_MASK))
3289             {
3290             case EF_SH1: strcat (buf, ", sh1"); break;
3291             case EF_SH2: strcat (buf, ", sh2"); break;
3292             case EF_SH3: strcat (buf, ", sh3"); break;
3293             case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
3294             case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
3295             case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
3296             case EF_SH3E: strcat (buf, ", sh3e"); break;
3297             case EF_SH4: strcat (buf, ", sh4"); break;
3298             case EF_SH5: strcat (buf, ", sh5"); break;
3299             case EF_SH2E: strcat (buf, ", sh2e"); break;
3300             case EF_SH4A: strcat (buf, ", sh4a"); break;
3301             case EF_SH2A: strcat (buf, ", sh2a"); break;
3302             case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
3303             case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
3304             case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
3305             case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
3306             case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
3307             case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
3308             case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
3309             case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
3310             case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
3311             default: strcat (buf, _(", unknown ISA")); break;
3312             }
3313
3314           if (e_flags & EF_SH_PIC)
3315             strcat (buf, ", pic");
3316
3317           if (e_flags & EF_SH_FDPIC)
3318             strcat (buf, ", fdpic");
3319           break;
3320
3321         case EM_OR1K:
3322           if (e_flags & EF_OR1K_NODELAY)
3323             strcat (buf, ", no delay");
3324           break;
3325
3326         case EM_SPARCV9:
3327           if (e_flags & EF_SPARC_32PLUS)
3328             strcat (buf, ", v8+");
3329
3330           if (e_flags & EF_SPARC_SUN_US1)
3331             strcat (buf, ", ultrasparcI");
3332
3333           if (e_flags & EF_SPARC_SUN_US3)
3334             strcat (buf, ", ultrasparcIII");
3335
3336           if (e_flags & EF_SPARC_HAL_R1)
3337             strcat (buf, ", halr1");
3338
3339           if (e_flags & EF_SPARC_LEDATA)
3340             strcat (buf, ", ledata");
3341
3342           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
3343             strcat (buf, ", tso");
3344
3345           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
3346             strcat (buf, ", pso");
3347
3348           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
3349             strcat (buf, ", rmo");
3350           break;
3351
3352         case EM_PARISC:
3353           switch (e_flags & EF_PARISC_ARCH)
3354             {
3355             case EFA_PARISC_1_0:
3356               strcpy (buf, ", PA-RISC 1.0");
3357               break;
3358             case EFA_PARISC_1_1:
3359               strcpy (buf, ", PA-RISC 1.1");
3360               break;
3361             case EFA_PARISC_2_0:
3362               strcpy (buf, ", PA-RISC 2.0");
3363               break;
3364             default:
3365               break;
3366             }
3367           if (e_flags & EF_PARISC_TRAPNIL)
3368             strcat (buf, ", trapnil");
3369           if (e_flags & EF_PARISC_EXT)
3370             strcat (buf, ", ext");
3371           if (e_flags & EF_PARISC_LSB)
3372             strcat (buf, ", lsb");
3373           if (e_flags & EF_PARISC_WIDE)
3374             strcat (buf, ", wide");
3375           if (e_flags & EF_PARISC_NO_KABP)
3376             strcat (buf, ", no kabp");
3377           if (e_flags & EF_PARISC_LAZYSWAP)
3378             strcat (buf, ", lazyswap");
3379           break;
3380
3381         case EM_PJ:
3382         case EM_PJ_OLD:
3383           if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
3384             strcat (buf, ", new calling convention");
3385
3386           if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
3387             strcat (buf, ", gnu calling convention");
3388           break;
3389
3390         case EM_IA_64:
3391           if ((e_flags & EF_IA_64_ABI64))
3392             strcat (buf, ", 64-bit");
3393           else
3394             strcat (buf, ", 32-bit");
3395           if ((e_flags & EF_IA_64_REDUCEDFP))
3396             strcat (buf, ", reduced fp model");
3397           if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
3398             strcat (buf, ", no function descriptors, constant gp");
3399           else if ((e_flags & EF_IA_64_CONS_GP))
3400             strcat (buf, ", constant gp");
3401           if ((e_flags & EF_IA_64_ABSOLUTE))
3402             strcat (buf, ", absolute");
3403           if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
3404             {
3405               if ((e_flags & EF_IA_64_VMS_LINKAGES))
3406                 strcat (buf, ", vms_linkages");
3407               switch ((e_flags & EF_IA_64_VMS_COMCOD))
3408                 {
3409                 case EF_IA_64_VMS_COMCOD_SUCCESS:
3410                   break;
3411                 case EF_IA_64_VMS_COMCOD_WARNING:
3412                   strcat (buf, ", warning");
3413                   break;
3414                 case EF_IA_64_VMS_COMCOD_ERROR:
3415                   strcat (buf, ", error");
3416                   break;
3417                 case EF_IA_64_VMS_COMCOD_ABORT:
3418                   strcat (buf, ", abort");
3419                   break;
3420                 default:
3421                   warn (_("Unrecognised IA64 VMS Command Code: %x\n"),
3422                         e_flags & EF_IA_64_VMS_COMCOD);
3423                   strcat (buf, ", <unknown>");
3424                 }
3425             }
3426           break;
3427
3428         case EM_VAX:
3429           if ((e_flags & EF_VAX_NONPIC))
3430             strcat (buf, ", non-PIC");
3431           if ((e_flags & EF_VAX_DFLOAT))
3432             strcat (buf, ", D-Float");
3433           if ((e_flags & EF_VAX_GFLOAT))
3434             strcat (buf, ", G-Float");
3435           break;
3436
3437         case EM_VISIUM:
3438           if (e_flags & EF_VISIUM_ARCH_MCM)
3439             strcat (buf, ", mcm");
3440           else if (e_flags & EF_VISIUM_ARCH_MCM24)
3441             strcat (buf, ", mcm24");
3442           if (e_flags & EF_VISIUM_ARCH_GR6)
3443             strcat (buf, ", gr6");
3444           break;
3445
3446         case EM_RL78:
3447           switch (e_flags & E_FLAG_RL78_CPU_MASK)
3448             {
3449             case E_FLAG_RL78_ANY_CPU: break;
3450             case E_FLAG_RL78_G10: strcat (buf, ", G10"); break;
3451             case E_FLAG_RL78_G13: strcat (buf, ", G13"); break;
3452             case E_FLAG_RL78_G14: strcat (buf, ", G14"); break;
3453             }
3454           if (e_flags & E_FLAG_RL78_64BIT_DOUBLES)
3455             strcat (buf, ", 64-bit doubles");
3456           break;
3457
3458         case EM_RX:
3459           if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
3460             strcat (buf, ", 64-bit doubles");
3461           if (e_flags & E_FLAG_RX_DSP)
3462             strcat (buf, ", dsp");
3463           if (e_flags & E_FLAG_RX_PID)
3464             strcat (buf, ", pid");
3465           if (e_flags & E_FLAG_RX_ABI)
3466             strcat (buf, ", RX ABI");
3467           if (e_flags & E_FLAG_RX_SINSNS_SET)
3468             strcat (buf, e_flags & E_FLAG_RX_SINSNS_YES
3469                     ? ", uses String instructions" : ", bans String instructions");
3470           if (e_flags & E_FLAG_RX_V2)
3471             strcat (buf, ", V2");
3472           break;
3473
3474         case EM_S390:
3475           if (e_flags & EF_S390_HIGH_GPRS)
3476             strcat (buf, ", highgprs");
3477           break;
3478
3479         case EM_TI_C6000:
3480           if ((e_flags & EF_C6000_REL))
3481             strcat (buf, ", relocatable module");
3482           break;
3483
3484         case EM_MSP430:
3485           strcat (buf, _(": architecture variant: "));
3486           switch (e_flags & EF_MSP430_MACH)
3487             {
3488             case E_MSP430_MACH_MSP430x11: strcat (buf, "MSP430x11"); break;
3489             case E_MSP430_MACH_MSP430x11x1 : strcat (buf, "MSP430x11x1 "); break;
3490             case E_MSP430_MACH_MSP430x12: strcat (buf, "MSP430x12"); break;
3491             case E_MSP430_MACH_MSP430x13: strcat (buf, "MSP430x13"); break;
3492             case E_MSP430_MACH_MSP430x14: strcat (buf, "MSP430x14"); break;
3493             case E_MSP430_MACH_MSP430x15: strcat (buf, "MSP430x15"); break;
3494             case E_MSP430_MACH_MSP430x16: strcat (buf, "MSP430x16"); break;
3495             case E_MSP430_MACH_MSP430x31: strcat (buf, "MSP430x31"); break;
3496             case E_MSP430_MACH_MSP430x32: strcat (buf, "MSP430x32"); break;
3497             case E_MSP430_MACH_MSP430x33: strcat (buf, "MSP430x33"); break;
3498             case E_MSP430_MACH_MSP430x41: strcat (buf, "MSP430x41"); break;
3499             case E_MSP430_MACH_MSP430x42: strcat (buf, "MSP430x42"); break;
3500             case E_MSP430_MACH_MSP430x43: strcat (buf, "MSP430x43"); break;
3501             case E_MSP430_MACH_MSP430x44: strcat (buf, "MSP430x44"); break;
3502             case E_MSP430_MACH_MSP430X  : strcat (buf, "MSP430X"); break;
3503             default:
3504               strcat (buf, _(": unknown")); break;
3505             }
3506
3507           if (e_flags & ~ EF_MSP430_MACH)
3508             strcat (buf, _(": unknown extra flag bits also present"));
3509         }
3510     }
3511
3512   return buf;
3513 }
3514
3515 static const char *
3516 get_osabi_name (unsigned int osabi)
3517 {
3518   static char buff[32];
3519
3520   switch (osabi)
3521     {
3522     case ELFOSABI_NONE:         return "UNIX - System V";
3523     case ELFOSABI_HPUX:         return "UNIX - HP-UX";
3524     case ELFOSABI_NETBSD:       return "UNIX - NetBSD";
3525     case ELFOSABI_GNU:          return "UNIX - GNU";
3526     case ELFOSABI_SOLARIS:      return "UNIX - Solaris";
3527     case ELFOSABI_AIX:          return "UNIX - AIX";
3528     case ELFOSABI_IRIX:         return "UNIX - IRIX";
3529     case ELFOSABI_FREEBSD:      return "UNIX - FreeBSD";
3530     case ELFOSABI_TRU64:        return "UNIX - TRU64";
3531     case ELFOSABI_MODESTO:      return "Novell - Modesto";
3532     case ELFOSABI_OPENBSD:      return "UNIX - OpenBSD";
3533     case ELFOSABI_OPENVMS:      return "VMS - OpenVMS";
3534     case ELFOSABI_NSK:          return "HP - Non-Stop Kernel";
3535     case ELFOSABI_AROS:         return "AROS";
3536     case ELFOSABI_FENIXOS:      return "FenixOS";
3537     default:
3538       if (osabi >= 64)
3539         switch (elf_header.e_machine)
3540           {
3541           case EM_ARM:
3542             switch (osabi)
3543               {
3544               case ELFOSABI_ARM:        return "ARM";
3545               default:
3546                 break;
3547               }
3548             break;
3549
3550           case EM_MSP430:
3551           case EM_MSP430_OLD:
3552           case EM_VISIUM:
3553             switch (osabi)
3554               {
3555               case ELFOSABI_STANDALONE: return _("Standalone App");
3556               default:
3557                 break;
3558               }
3559             break;
3560
3561           case EM_TI_C6000:
3562             switch (osabi)
3563               {
3564               case ELFOSABI_C6000_ELFABI:       return _("Bare-metal C6000");
3565               case ELFOSABI_C6000_LINUX:        return "Linux C6000";
3566               default:
3567                 break;
3568               }
3569             break;
3570
3571           default:
3572             break;
3573           }
3574       snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
3575       return buff;
3576     }
3577 }
3578
3579 static const char *
3580 get_aarch64_segment_type (unsigned long type)
3581 {
3582   switch (type)
3583     {
3584     case PT_AARCH64_ARCHEXT:
3585       return "AARCH64_ARCHEXT";
3586     default:
3587       break;
3588     }
3589
3590   return NULL;
3591 }
3592
3593 static const char *
3594 get_arm_segment_type (unsigned long type)
3595 {
3596   switch (type)
3597     {
3598     case PT_ARM_EXIDX:
3599       return "EXIDX";
3600     default:
3601       break;
3602     }
3603
3604   return NULL;
3605 }
3606
3607 static const char *
3608 get_mips_segment_type (unsigned long type)
3609 {
3610   switch (type)
3611     {
3612     case PT_MIPS_REGINFO:
3613       return "REGINFO";
3614     case PT_MIPS_RTPROC:
3615       return "RTPROC";
3616     case PT_MIPS_OPTIONS:
3617       return "OPTIONS";
3618     case PT_MIPS_ABIFLAGS:
3619       return "ABIFLAGS";
3620     default:
3621       break;
3622     }
3623
3624   return NULL;
3625 }
3626
3627 static const char *
3628 get_parisc_segment_type (unsigned long type)
3629 {
3630   switch (type)
3631     {
3632     case PT_HP_TLS:             return "HP_TLS";
3633     case PT_HP_CORE_NONE:       return "HP_CORE_NONE";
3634     case PT_HP_CORE_VERSION:    return "HP_CORE_VERSION";
3635     case PT_HP_CORE_KERNEL:     return "HP_CORE_KERNEL";
3636     case PT_HP_CORE_COMM:       return "HP_CORE_COMM";
3637     case PT_HP_CORE_PROC:       return "HP_CORE_PROC";
3638     case PT_HP_CORE_LOADABLE:   return "HP_CORE_LOADABLE";
3639     case PT_HP_CORE_STACK:      return "HP_CORE_STACK";
3640     case PT_HP_CORE_SHM:        return "HP_CORE_SHM";
3641     case PT_HP_CORE_MMF:        return "HP_CORE_MMF";
3642     case PT_HP_PARALLEL:        return "HP_PARALLEL";
3643     case PT_HP_FASTBIND:        return "HP_FASTBIND";
3644     case PT_HP_OPT_ANNOT:       return "HP_OPT_ANNOT";
3645     case PT_HP_HSL_ANNOT:       return "HP_HSL_ANNOT";
3646     case PT_HP_STACK:           return "HP_STACK";
3647     case PT_HP_CORE_UTSNAME:    return "HP_CORE_UTSNAME";
3648     case PT_PARISC_ARCHEXT:     return "PARISC_ARCHEXT";
3649     case PT_PARISC_UNWIND:      return "PARISC_UNWIND";
3650     case PT_PARISC_WEAKORDER:   return "PARISC_WEAKORDER";
3651     default:
3652       break;
3653     }
3654
3655   return NULL;
3656 }
3657
3658 static const char *
3659 get_ia64_segment_type (unsigned long type)
3660 {
3661   switch (type)
3662     {
3663     case PT_IA_64_ARCHEXT:      return "IA_64_ARCHEXT";
3664     case PT_IA_64_UNWIND:       return "IA_64_UNWIND";
3665     case PT_HP_TLS:             return "HP_TLS";
3666     case PT_IA_64_HP_OPT_ANOT:  return "HP_OPT_ANNOT";
3667     case PT_IA_64_HP_HSL_ANOT:  return "HP_HSL_ANNOT";
3668     case PT_IA_64_HP_STACK:     return "HP_STACK";
3669     default:
3670       break;
3671     }
3672
3673   return NULL;
3674 }
3675
3676 static const char *
3677 get_tic6x_segment_type (unsigned long type)
3678 {
3679   switch (type)
3680     {
3681     case PT_C6000_PHATTR:       return "C6000_PHATTR";
3682     default:
3683       break;
3684     }
3685
3686   return NULL;
3687 }
3688
3689 static const char *
3690 get_solaris_segment_type (unsigned long type)
3691 {
3692   switch (type)
3693     {
3694     case 0x6464e550: return "PT_SUNW_UNWIND";
3695     case 0x6474e550: return "PT_SUNW_EH_FRAME";
3696     case 0x6ffffff7: return "PT_LOSUNW";
3697     case 0x6ffffffa: return "PT_SUNWBSS";
3698     case 0x6ffffffb: return "PT_SUNWSTACK";
3699     case 0x6ffffffc: return "PT_SUNWDTRACE";
3700     case 0x6ffffffd: return "PT_SUNWCAP";
3701     case 0x6fffffff: return "PT_HISUNW";
3702     default: return NULL;
3703     }
3704 }
3705
3706 static const char *
3707 get_segment_type (unsigned long p_type)
3708 {
3709   static char buff[32];
3710
3711   switch (p_type)
3712     {
3713     case PT_NULL:       return "NULL";
3714     case PT_LOAD:       return "LOAD";
3715     case PT_DYNAMIC:    return "DYNAMIC";
3716     case PT_INTERP:     return "INTERP";
3717     case PT_NOTE:       return "NOTE";
3718     case PT_SHLIB:      return "SHLIB";
3719     case PT_PHDR:       return "PHDR";
3720     case PT_TLS:        return "TLS";
3721
3722     case PT_GNU_EH_FRAME:
3723                         return "GNU_EH_FRAME";
3724     case PT_GNU_STACK:  return "GNU_STACK";
3725     case PT_GNU_RELRO:  return "GNU_RELRO";
3726
3727     default:
3728       if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
3729         {
3730           const char * result;
3731
3732           switch (elf_header.e_machine)
3733             {
3734             case EM_AARCH64:
3735               result = get_aarch64_segment_type (p_type);
3736               break;
3737             case EM_ARM:
3738               result = get_arm_segment_type (p_type);
3739               break;
3740             case EM_MIPS:
3741             case EM_MIPS_RS3_LE:
3742               result = get_mips_segment_type (p_type);
3743               break;
3744             case EM_PARISC:
3745               result = get_parisc_segment_type (p_type);
3746               break;
3747             case EM_IA_64:
3748               result = get_ia64_segment_type (p_type);
3749               break;
3750             case EM_TI_C6000:
3751               result = get_tic6x_segment_type (p_type);
3752               break;
3753             default:
3754               result = NULL;
3755               break;
3756             }
3757
3758           if (result != NULL)
3759             return result;
3760
3761           sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
3762         }
3763       else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
3764         {
3765           const char * result;
3766
3767           switch (elf_header.e_machine)
3768             {
3769             case EM_PARISC:
3770               result = get_parisc_segment_type (p_type);
3771               break;
3772             case EM_IA_64:
3773               result = get_ia64_segment_type (p_type);
3774               break;
3775             default:
3776               if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
3777                 result = get_solaris_segment_type (p_type);
3778               else
3779                 result = NULL;
3780               break;
3781             }
3782
3783           if (result != NULL)
3784             return result;
3785
3786           sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
3787         }
3788       else
3789         snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
3790
3791       return buff;
3792     }
3793 }
3794
3795 static const char *
3796 get_mips_section_type_name (unsigned int sh_type)
3797 {
3798   switch (sh_type)
3799     {
3800     case SHT_MIPS_LIBLIST:       return "MIPS_LIBLIST";
3801     case SHT_MIPS_MSYM:          return "MIPS_MSYM";
3802     case SHT_MIPS_CONFLICT:      return "MIPS_CONFLICT";
3803     case SHT_MIPS_GPTAB:         return "MIPS_GPTAB";
3804     case SHT_MIPS_UCODE:         return "MIPS_UCODE";
3805     case SHT_MIPS_DEBUG:         return "MIPS_DEBUG";
3806     case SHT_MIPS_REGINFO:       return "MIPS_REGINFO";
3807     case SHT_MIPS_PACKAGE:       return "MIPS_PACKAGE";
3808     case SHT_MIPS_PACKSYM:       return "MIPS_PACKSYM";
3809     case SHT_MIPS_RELD:          return "MIPS_RELD";
3810     case SHT_MIPS_IFACE:         return "MIPS_IFACE";
3811     case SHT_MIPS_CONTENT:       return "MIPS_CONTENT";
3812     case SHT_MIPS_OPTIONS:       return "MIPS_OPTIONS";
3813     case SHT_MIPS_SHDR:          return "MIPS_SHDR";
3814     case SHT_MIPS_FDESC:         return "MIPS_FDESC";
3815     case SHT_MIPS_EXTSYM:        return "MIPS_EXTSYM";
3816     case SHT_MIPS_DENSE:         return "MIPS_DENSE";
3817     case SHT_MIPS_PDESC:         return "MIPS_PDESC";
3818     case SHT_MIPS_LOCSYM:        return "MIPS_LOCSYM";
3819     case SHT_MIPS_AUXSYM:        return "MIPS_AUXSYM";
3820     case SHT_MIPS_OPTSYM:        return "MIPS_OPTSYM";
3821     case SHT_MIPS_LOCSTR:        return "MIPS_LOCSTR";
3822     case SHT_MIPS_LINE:          return "MIPS_LINE";
3823     case SHT_MIPS_RFDESC:        return "MIPS_RFDESC";
3824     case SHT_MIPS_DELTASYM:      return "MIPS_DELTASYM";
3825     case SHT_MIPS_DELTAINST:     return "MIPS_DELTAINST";
3826     case SHT_MIPS_DELTACLASS:    return "MIPS_DELTACLASS";
3827     case SHT_MIPS_DWARF:         return "MIPS_DWARF";
3828     case SHT_MIPS_DELTADECL:     return "MIPS_DELTADECL";
3829     case SHT_MIPS_SYMBOL_LIB:    return "MIPS_SYMBOL_LIB";
3830     case SHT_MIPS_EVENTS:        return "MIPS_EVENTS";
3831     case SHT_MIPS_TRANSLATE:     return "MIPS_TRANSLATE";
3832     case SHT_MIPS_PIXIE:         return "MIPS_PIXIE";
3833     case SHT_MIPS_XLATE:         return "MIPS_XLATE";
3834     case SHT_MIPS_XLATE_DEBUG:   return "MIPS_XLATE_DEBUG";
3835     case SHT_MIPS_WHIRL:         return "MIPS_WHIRL";
3836     case SHT_MIPS_EH_REGION:     return "MIPS_EH_REGION";
3837     case SHT_MIPS_XLATE_OLD:     return "MIPS_XLATE_OLD";
3838     case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
3839     case SHT_MIPS_ABIFLAGS:      return "MIPS_ABIFLAGS";
3840     default:
3841       break;
3842     }
3843   return NULL;
3844 }
3845
3846 static const char *
3847 get_parisc_section_type_name (unsigned int sh_type)
3848 {
3849   switch (sh_type)
3850     {
3851     case SHT_PARISC_EXT:        return "PARISC_EXT";
3852     case SHT_PARISC_UNWIND:     return "PARISC_UNWIND";
3853     case SHT_PARISC_DOC:        return "PARISC_DOC";
3854     case SHT_PARISC_ANNOT:      return "PARISC_ANNOT";
3855     case SHT_PARISC_SYMEXTN:    return "PARISC_SYMEXTN";
3856     case SHT_PARISC_STUBS:      return "PARISC_STUBS";
3857     case SHT_PARISC_DLKM:       return "PARISC_DLKM";
3858     default:
3859       break;
3860     }
3861   return NULL;
3862 }
3863
3864 static const char *
3865 get_ia64_section_type_name (unsigned int sh_type)
3866 {
3867   /* If the top 8 bits are 0x78 the next 8 are the os/abi ID.  */
3868   if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
3869     return get_osabi_name ((sh_type & 0x00FF0000) >> 16);
3870
3871   switch (sh_type)
3872     {
3873     case SHT_IA_64_EXT:                return "IA_64_EXT";
3874     case SHT_IA_64_UNWIND:             return "IA_64_UNWIND";
3875     case SHT_IA_64_PRIORITY_INIT:      return "IA_64_PRIORITY_INIT";
3876     case SHT_IA_64_VMS_TRACE:          return "VMS_TRACE";
3877     case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
3878     case SHT_IA_64_VMS_DEBUG:          return "VMS_DEBUG";
3879     case SHT_IA_64_VMS_DEBUG_STR:      return "VMS_DEBUG_STR";
3880     case SHT_IA_64_VMS_LINKAGES:       return "VMS_LINKAGES";
3881     case SHT_IA_64_VMS_SYMBOL_VECTOR:  return "VMS_SYMBOL_VECTOR";
3882     case SHT_IA_64_VMS_FIXUP:          return "VMS_FIXUP";
3883     default:
3884       break;
3885     }
3886   return NULL;
3887 }
3888
3889 static const char *
3890 get_x86_64_section_type_name (unsigned int sh_type)
3891 {
3892   switch (sh_type)
3893     {
3894     case SHT_X86_64_UNWIND:     return "X86_64_UNWIND";
3895     default:
3896       break;
3897     }
3898   return NULL;
3899 }
3900
3901 static const char *
3902 get_aarch64_section_type_name (unsigned int sh_type)
3903 {
3904   switch (sh_type)
3905     {
3906     case SHT_AARCH64_ATTRIBUTES:
3907       return "AARCH64_ATTRIBUTES";
3908     default:
3909       break;
3910     }
3911   return NULL;
3912 }
3913
3914 static const char *
3915 get_arm_section_type_name (unsigned int sh_type)
3916 {
3917   switch (sh_type)
3918     {
3919     case SHT_ARM_EXIDX:           return "ARM_EXIDX";
3920     case SHT_ARM_PREEMPTMAP:      return "ARM_PREEMPTMAP";
3921     case SHT_ARM_ATTRIBUTES:      return "ARM_ATTRIBUTES";
3922     case SHT_ARM_DEBUGOVERLAY:    return "ARM_DEBUGOVERLAY";
3923     case SHT_ARM_OVERLAYSECTION:  return "ARM_OVERLAYSECTION";
3924     default:
3925       break;
3926     }
3927   return NULL;
3928 }
3929
3930 static const char *
3931 get_tic6x_section_type_name (unsigned int sh_type)
3932 {
3933   switch (sh_type)
3934     {
3935     case SHT_C6000_UNWIND:
3936       return "C6000_UNWIND";
3937     case SHT_C6000_PREEMPTMAP:
3938       return "C6000_PREEMPTMAP";
3939     case SHT_C6000_ATTRIBUTES:
3940       return "C6000_ATTRIBUTES";
3941     case SHT_TI_ICODE:
3942       return "TI_ICODE";
3943     case SHT_TI_XREF:
3944       return "TI_XREF";
3945     case SHT_TI_HANDLER:
3946       return "TI_HANDLER";
3947     case SHT_TI_INITINFO:
3948       return "TI_INITINFO";
3949     case SHT_TI_PHATTRS:
3950       return "TI_PHATTRS";
3951     default:
3952       break;
3953     }
3954   return NULL;
3955 }
3956
3957 static const char *
3958 get_msp430x_section_type_name (unsigned int sh_type)
3959 {
3960   switch (sh_type)
3961     {
3962     case SHT_MSP430_SEC_FLAGS:   return "MSP430_SEC_FLAGS";
3963     case SHT_MSP430_SYM_ALIASES: return "MSP430_SYM_ALIASES";
3964     case SHT_MSP430_ATTRIBUTES:  return "MSP430_ATTRIBUTES";
3965     default: return NULL;
3966     }
3967 }
3968
3969 static const char *
3970 get_v850_section_type_name (unsigned int sh_type)
3971 {
3972   switch (sh_type)
3973     {
3974     case SHT_V850_SCOMMON: return "V850 Small Common";
3975     case SHT_V850_TCOMMON: return "V850 Tiny Common";
3976     case SHT_V850_ZCOMMON: return "V850 Zero Common";
3977     case SHT_RENESAS_IOP:  return "RENESAS IOP";
3978     case SHT_RENESAS_INFO: return "RENESAS INFO";
3979     default: return NULL;
3980     }
3981 }
3982
3983 static const char *
3984 get_section_type_name (unsigned int sh_type)
3985 {
3986   static char buff[32];
3987   const char * result;
3988
3989   switch (sh_type)
3990     {
3991     case SHT_NULL:              return "NULL";
3992     case SHT_PROGBITS:          return "PROGBITS";
3993     case SHT_SYMTAB:            return "SYMTAB";
3994     case SHT_STRTAB:            return "STRTAB";
3995     case SHT_RELA:              return "RELA";
3996     case SHT_HASH:              return "HASH";
3997     case SHT_DYNAMIC:           return "DYNAMIC";
3998     case SHT_NOTE:              return "NOTE";
3999     case SHT_NOBITS:            return "NOBITS";
4000     case SHT_REL:               return "REL";
4001     case SHT_SHLIB:             return "SHLIB";
4002     case SHT_DYNSYM:            return "DYNSYM";
4003     case SHT_INIT_ARRAY:        return "INIT_ARRAY";
4004     case SHT_FINI_ARRAY:        return "FINI_ARRAY";
4005     case SHT_PREINIT_ARRAY:     return "PREINIT_ARRAY";
4006     case SHT_GNU_HASH:          return "GNU_HASH";
4007     case SHT_GROUP:             return "GROUP";
4008     case SHT_SYMTAB_SHNDX:      return "SYMTAB SECTION INDICIES";
4009     case SHT_GNU_verdef:        return "VERDEF";
4010     case SHT_GNU_verneed:       return "VERNEED";
4011     case SHT_GNU_versym:        return "VERSYM";
4012     case 0x6ffffff0:            return "VERSYM";
4013     case 0x6ffffffc:            return "VERDEF";
4014     case 0x7ffffffd:            return "AUXILIARY";
4015     case 0x7fffffff:            return "FILTER";
4016     case SHT_GNU_LIBLIST:       return "GNU_LIBLIST";
4017
4018     default:
4019       if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
4020         {
4021           switch (elf_header.e_machine)
4022             {
4023             case EM_MIPS:
4024             case EM_MIPS_RS3_LE:
4025               result = get_mips_section_type_name (sh_type);
4026               break;
4027             case EM_PARISC:
4028               result = get_parisc_section_type_name (sh_type);
4029               break;
4030             case EM_IA_64:
4031               result = get_ia64_section_type_name (sh_type);
4032               break;
4033             case EM_X86_64:
4034             case EM_L1OM:
4035             case EM_K1OM:
4036               result = get_x86_64_section_type_name (sh_type);
4037               break;
4038             case EM_AARCH64:
4039               result = get_aarch64_section_type_name (sh_type);
4040               break;
4041             case EM_ARM:
4042               result = get_arm_section_type_name (sh_type);
4043               break;
4044             case EM_TI_C6000:
4045               result = get_tic6x_section_type_name (sh_type);
4046               break;
4047             case EM_MSP430:
4048               result = get_msp430x_section_type_name (sh_type);
4049               break;
4050             case EM_V800:
4051             case EM_V850:
4052             case EM_CYGNUS_V850:
4053               result = get_v850_section_type_name (sh_type);
4054               break;
4055             default:
4056               result = NULL;
4057               break;
4058             }
4059
4060           if (result != NULL)
4061             return result;
4062
4063           sprintf (buff, "LOPROC+%#x", sh_type - SHT_LOPROC);
4064         }
4065       else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
4066         {
4067           switch (elf_header.e_machine)
4068             {
4069             case EM_IA_64:
4070               result = get_ia64_section_type_name (sh_type);
4071               break;
4072             default:
4073               if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
4074                 result = get_solaris_section_type (sh_type);
4075               else
4076                 result = NULL;
4077               break;
4078             }
4079
4080           if (result != NULL)
4081             return result;
4082
4083           sprintf (buff, "LOOS+%#x", sh_type - SHT_LOOS);
4084         }
4085       else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
4086         {
4087           switch (elf_header.e_machine)
4088             {
4089             case EM_V800:
4090             case EM_V850:
4091             case EM_CYGNUS_V850:
4092               result = get_v850_section_type_name (sh_type);
4093               break;
4094             default:
4095               result = NULL;
4096               break;
4097             }
4098
4099           if (result != NULL)
4100             return result;
4101
4102           sprintf (buff, "LOUSER+%#x", sh_type - SHT_LOUSER);
4103         }
4104       else
4105         /* This message is probably going to be displayed in a 15
4106            character wide field, so put the hex value first.  */
4107         snprintf (buff, sizeof (buff), _("%08x: <unknown>"), sh_type);
4108
4109       return buff;
4110     }
4111 }
4112
4113 #define OPTION_DEBUG_DUMP       512
4114 #define OPTION_DYN_SYMS         513
4115 #define OPTION_DWARF_DEPTH      514
4116 #define OPTION_DWARF_START      515
4117 #define OPTION_DWARF_CHECK      516
4118
4119 static struct option options[] =
4120 {
4121   {"all",              no_argument, 0, 'a'},
4122   {"file-header",      no_argument, 0, 'h'},
4123   {"program-headers",  no_argument, 0, 'l'},
4124   {"headers",          no_argument, 0, 'e'},
4125   {"histogram",        no_argument, 0, 'I'},
4126   {"segments",         no_argument, 0, 'l'},
4127   {"sections",         no_argument, 0, 'S'},
4128   {"section-headers",  no_argument, 0, 'S'},
4129   {"section-groups",   no_argument, 0, 'g'},
4130   {"section-details",  no_argument, 0, 't'},
4131   {"full-section-name",no_argument, 0, 'N'},
4132   {"symbols",          no_argument, 0, 's'},
4133   {"syms",             no_argument, 0, 's'},
4134   {"dyn-syms",         no_argument, 0, OPTION_DYN_SYMS},
4135   {"relocs",           no_argument, 0, 'r'},
4136   {"notes",            no_argument, 0, 'n'},
4137   {"dynamic",          no_argument, 0, 'd'},
4138   {"arch-specific",    no_argument, 0, 'A'},
4139   {"version-info",     no_argument, 0, 'V'},
4140   {"use-dynamic",      no_argument, 0, 'D'},
4141   {"unwind",           no_argument, 0, 'u'},
4142   {"archive-index",    no_argument, 0, 'c'},
4143   {"hex-dump",         required_argument, 0, 'x'},
4144   {"relocated-dump",   required_argument, 0, 'R'},
4145   {"string-dump",      required_argument, 0, 'p'},
4146   {"decompress",       no_argument, 0, 'z'},
4147 #ifdef SUPPORT_DISASSEMBLY
4148   {"instruction-dump", required_argument, 0, 'i'},
4149 #endif
4150   {"debug-dump",       optional_argument, 0, OPTION_DEBUG_DUMP},
4151
4152   {"dwarf-depth",      required_argument, 0, OPTION_DWARF_DEPTH},
4153   {"dwarf-start",      required_argument, 0, OPTION_DWARF_START},
4154   {"dwarf-check",      no_argument, 0, OPTION_DWARF_CHECK},
4155
4156   {"version",          no_argument, 0, 'v'},
4157   {"wide",             no_argument, 0, 'W'},
4158   {"help",             no_argument, 0, 'H'},
4159   {0,                  no_argument, 0, 0}
4160 };
4161
4162 static void
4163 usage (FILE * stream)
4164 {
4165   fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
4166   fprintf (stream, _(" Display information about the contents of ELF format files\n"));
4167   fprintf (stream, _(" Options are:\n\
4168   -a --all               Equivalent to: -h -l -S -s -r -d -V -A -I\n\
4169   -h --file-header       Display the ELF file header\n\
4170   -l --program-headers   Display the program headers\n\
4171      --segments          An alias for --program-headers\n\
4172   -S --section-headers   Display the sections' header\n\
4173      --sections          An alias for --section-headers\n\
4174   -g --section-groups    Display the section groups\n\
4175   -t --section-details   Display the section details\n\
4176   -e --headers           Equivalent to: -h -l -S\n\
4177   -s --syms              Display the symbol table\n\
4178      --symbols           An alias for --syms\n\
4179   --dyn-syms             Display the dynamic symbol table\n\
4180   -n --notes             Display the core notes (if present)\n\
4181   -r --relocs            Display the relocations (if present)\n\
4182   -u --unwind            Display the unwind info (if present)\n\
4183   -d --dynamic           Display the dynamic section (if present)\n\
4184   -V --version-info      Display the version sections (if present)\n\
4185   -A --arch-specific     Display architecture specific information (if any)\n\
4186   -c --archive-index     Display the symbol/file index in an archive\n\
4187   -D --use-dynamic       Use the dynamic section info when displaying symbols\n\
4188   -x --hex-dump=<number|name>\n\
4189                          Dump the contents of section <number|name> as bytes\n\
4190   -p --string-dump=<number|name>\n\
4191                          Dump the contents of section <number|name> as strings\n\
4192   -R --relocated-dump=<number|name>\n\
4193                          Dump the contents of section <number|name> as relocated bytes\n\
4194   -z --decompress        Decompress section before dumping it\n\
4195   -w[lLiaprmfFsoRt] or\n\
4196   --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
4197                =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
4198                =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
4199                =addr,=cu_index]\n\
4200                          Display the contents of DWARF2 debug sections\n"));
4201   fprintf (stream, _("\
4202   --dwarf-depth=N        Do not display DIEs at depth N or greater\n\
4203   --dwarf-start=N        Display DIEs starting with N, at the same depth\n\
4204                          or deeper\n"));
4205 #ifdef SUPPORT_DISASSEMBLY
4206   fprintf (stream, _("\
4207   -i --instruction-dump=<number|name>\n\
4208                          Disassemble the contents of section <number|name>\n"));
4209 #endif
4210   fprintf (stream, _("\
4211   -I --histogram         Display histogram of bucket list lengths\n\
4212   -W --wide              Allow output width to exceed 80 characters\n\
4213   @<file>                Read options from <file>\n\
4214   -H --help              Display this information\n\
4215   -v --version           Display the version number of readelf\n"));
4216
4217   if (REPORT_BUGS_TO[0] && stream == stdout)
4218     fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
4219
4220   exit (stream == stdout ? 0 : 1);
4221 }
4222
4223 /* Record the fact that the user wants the contents of section number
4224    SECTION to be displayed using the method(s) encoded as flags bits
4225    in TYPE.  Note, TYPE can be zero if we are creating the array for
4226    the first time.  */
4227
4228 static void
4229 request_dump_bynumber (unsigned int section, dump_type type)
4230 {
4231   if (section >= num_dump_sects)
4232     {
4233       dump_type * new_dump_sects;
4234
4235       new_dump_sects = (dump_type *) calloc (section + 1,
4236                                              sizeof (* dump_sects));
4237
4238       if (new_dump_sects == NULL)
4239         error (_("Out of memory allocating dump request table.\n"));
4240       else
4241         {
4242           if (dump_sects)
4243             {
4244               /* Copy current flag settings.  */
4245               memcpy (new_dump_sects, dump_sects, num_dump_sects * sizeof (* dump_sects));
4246
4247               free (dump_sects);
4248             }
4249
4250           dump_sects = new_dump_sects;
4251           num_dump_sects = section + 1;
4252         }
4253     }
4254
4255   if (dump_sects)
4256     dump_sects[section] |= type;
4257
4258   return;
4259 }
4260
4261 /* Request a dump by section name.  */
4262
4263 static void
4264 request_dump_byname (const char * section, dump_type type)
4265 {
4266   struct dump_list_entry * new_request;
4267
4268   new_request = (struct dump_list_entry *)
4269       malloc (sizeof (struct dump_list_entry));
4270   if (!new_request)
4271     error (_("Out of memory allocating dump request table.\n"));
4272
4273   new_request->name = strdup (section);
4274   if (!new_request->name)
4275     error (_("Out of memory allocating dump request table.\n"));
4276
4277   new_request->type = type;
4278
4279   new_request->next = dump_sects_byname;
4280   dump_sects_byname = new_request;
4281 }
4282
4283 static inline void
4284 request_dump (dump_type type)
4285 {
4286   int section;
4287   char * cp;
4288
4289   do_dump++;
4290   section = strtoul (optarg, & cp, 0);
4291
4292   if (! *cp && section >= 0)
4293     request_dump_bynumber (section, type);
4294   else
4295     request_dump_byname (optarg, type);
4296 }
4297
4298
4299 static void
4300 parse_args (int argc, char ** argv)
4301 {
4302   int c;
4303
4304   if (argc < 2)
4305     usage (stderr);
4306
4307   while ((c = getopt_long
4308           (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:z", options, NULL)) != EOF)
4309     {
4310       switch (c)
4311         {
4312         case 0:
4313           /* Long options.  */
4314           break;
4315         case 'H':
4316           usage (stdout);
4317           break;
4318
4319         case 'a':
4320           do_syms++;
4321           do_reloc++;
4322           do_unwind++;
4323           do_dynamic++;
4324           do_header++;
4325           do_sections++;
4326           do_section_groups++;
4327           do_segments++;
4328           do_version++;
4329           do_histogram++;
4330           do_arch++;
4331           do_notes++;
4332           break;
4333         case 'g':
4334           do_section_groups++;
4335           break;
4336         case 't':
4337         case 'N':
4338           do_sections++;
4339           do_section_details++;
4340           break;
4341         case 'e':
4342           do_header++;
4343           do_sections++;
4344           do_segments++;
4345           break;
4346         case 'A':
4347           do_arch++;
4348           break;
4349         case 'D':
4350           do_using_dynamic++;
4351           break;
4352         case 'r':
4353           do_reloc++;
4354           break;
4355         case 'u':
4356           do_unwind++;
4357           break;
4358         case 'h':
4359           do_header++;
4360           break;
4361         case 'l':
4362           do_segments++;
4363           break;
4364         case 's':
4365           do_syms++;
4366           break;
4367         case 'S':
4368           do_sections++;
4369           break;
4370         case 'd':
4371           do_dynamic++;
4372           break;
4373         case 'I':
4374           do_histogram++;
4375           break;
4376         case 'n':
4377           do_notes++;
4378           break;
4379         case 'c':
4380           do_archive_index++;
4381           break;
4382         case 'x':
4383           request_dump (HEX_DUMP);
4384           break;
4385         case 'p':
4386           request_dump (STRING_DUMP);
4387           break;
4388         case 'R':
4389           request_dump (RELOC_DUMP);
4390           break;
4391         case 'z':
4392           decompress_dumps++;
4393           break;
4394         case 'w':
4395           do_dump++;
4396           if (optarg == 0)
4397             {
4398               do_debugging = 1;
4399               dwarf_select_sections_all ();
4400             }
4401           else
4402             {
4403               do_debugging = 0;
4404               dwarf_select_sections_by_letters (optarg);
4405             }
4406           break;
4407         case OPTION_DEBUG_DUMP:
4408           do_dump++;
4409           if (optarg == 0)
4410             do_debugging = 1;
4411           else
4412             {
4413               do_debugging = 0;
4414               dwarf_select_sections_by_names (optarg);
4415             }
4416           break;
4417         case OPTION_DWARF_DEPTH:
4418           {
4419             char *cp;
4420
4421             dwarf_cutoff_level = strtoul (optarg, & cp, 0);
4422           }
4423           break;
4424         case OPTION_DWARF_START:
4425           {
4426             char *cp;
4427
4428             dwarf_start_die = strtoul (optarg, & cp, 0);
4429           }
4430           break;
4431         case OPTION_DWARF_CHECK:
4432           dwarf_check = 1;
4433           break;
4434         case OPTION_DYN_SYMS:
4435           do_dyn_syms++;
4436           break;
4437 #ifdef SUPPORT_DISASSEMBLY
4438         case 'i':
4439           request_dump (DISASS_DUMP);
4440           break;
4441 #endif
4442         case 'v':
4443           print_version (program_name);
4444           break;
4445         case 'V':
4446           do_version++;
4447           break;
4448         case 'W':
4449           do_wide++;
4450           break;
4451         default:
4452           /* xgettext:c-format */
4453           error (_("Invalid option '-%c'\n"), c);
4454           /* Fall through.  */
4455         case '?':
4456           usage (stderr);
4457         }
4458     }
4459
4460   if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
4461       && !do_segments && !do_header && !do_dump && !do_version
4462       && !do_histogram && !do_debugging && !do_arch && !do_notes
4463       && !do_section_groups && !do_archive_index
4464       && !do_dyn_syms)
4465     usage (stderr);
4466 }
4467
4468 static const char *
4469 get_elf_class (unsigned int elf_class)
4470 {
4471   static char buff[32];
4472
4473   switch (elf_class)
4474     {
4475     case ELFCLASSNONE: return _("none");
4476     case ELFCLASS32:   return "ELF32";
4477     case ELFCLASS64:   return "ELF64";
4478     default:
4479       snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
4480       return buff;
4481     }
4482 }
4483
4484 static const char *
4485 get_data_encoding (unsigned int encoding)
4486 {
4487   static char buff[32];
4488
4489   switch (encoding)
4490     {
4491     case ELFDATANONE: return _("none");
4492     case ELFDATA2LSB: return _("2's complement, little endian");
4493     case ELFDATA2MSB: return _("2's complement, big endian");
4494     default:
4495       snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
4496       return buff;
4497     }
4498 }
4499
4500 /* Decode the data held in 'elf_header'.  */
4501
4502 static int
4503 process_file_header (void)
4504 {
4505   if (   elf_header.e_ident[EI_MAG0] != ELFMAG0
4506       || elf_header.e_ident[EI_MAG1] != ELFMAG1
4507       || elf_header.e_ident[EI_MAG2] != ELFMAG2
4508       || elf_header.e_ident[EI_MAG3] != ELFMAG3)
4509     {
4510       error
4511         (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
4512       return 0;
4513     }
4514
4515   init_dwarf_regnames (elf_header.e_machine);
4516
4517   if (do_header)
4518     {
4519       int i;
4520
4521       printf (_("ELF Header:\n"));
4522       printf (_("  Magic:   "));
4523       for (i = 0; i < EI_NIDENT; i++)
4524         printf ("%2.2x ", elf_header.e_ident[i]);
4525       printf ("\n");
4526       printf (_("  Class:                             %s\n"),
4527               get_elf_class (elf_header.e_ident[EI_CLASS]));
4528       printf (_("  Data:                              %s\n"),
4529               get_data_encoding (elf_header.e_ident[EI_DATA]));
4530       printf (_("  Version:                           %d %s\n"),
4531               elf_header.e_ident[EI_VERSION],
4532               (elf_header.e_ident[EI_VERSION] == EV_CURRENT
4533                ? "(current)"
4534                : (elf_header.e_ident[EI_VERSION] != EV_NONE
4535                   ? _("<unknown: %lx>")
4536                   : "")));
4537       printf (_("  OS/ABI:                            %s\n"),
4538               get_osabi_name (elf_header.e_ident[EI_OSABI]));
4539       printf (_("  ABI Version:                       %d\n"),
4540               elf_header.e_ident[EI_ABIVERSION]);
4541       printf (_("  Type:                              %s\n"),
4542               get_file_type (elf_header.e_type));
4543       printf (_("  Machine:                           %s\n"),
4544               get_machine_name (elf_header.e_machine));
4545       printf (_("  Version:                           0x%lx\n"),
4546               (unsigned long) elf_header.e_version);
4547
4548       printf (_("  Entry point address:               "));
4549       print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4550       printf (_("\n  Start of program headers:          "));
4551       print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4552       printf (_(" (bytes into file)\n  Start of section headers:          "));
4553       print_vma ((bfd_vma) elf_header.e_shoff, DEC);
4554       printf (_(" (bytes into file)\n"));
4555
4556       printf (_("  Flags:                             0x%lx%s\n"),
4557               (unsigned long) elf_header.e_flags,
4558               get_machine_flags (elf_header.e_flags, elf_header.e_machine));
4559       printf (_("  Size of this header:               %ld (bytes)\n"),
4560               (long) elf_header.e_ehsize);
4561       printf (_("  Size of program headers:           %ld (bytes)\n"),
4562               (long) elf_header.e_phentsize);
4563       printf (_("  Number of program headers:         %ld"),
4564               (long) elf_header.e_phnum);
4565       if (section_headers != NULL
4566           && elf_header.e_phnum == PN_XNUM
4567           && section_headers[0].sh_info != 0)
4568         printf (" (%ld)", (long) section_headers[0].sh_info);
4569       putc ('\n', stdout);
4570       printf (_("  Size of section headers:           %ld (bytes)\n"),
4571               (long) elf_header.e_shentsize);
4572       printf (_("  Number of section headers:         %ld"),
4573               (long) elf_header.e_shnum);
4574       if (section_headers != NULL && elf_header.e_shnum == SHN_UNDEF)
4575         printf (" (%ld)", (long) section_headers[0].sh_size);
4576       putc ('\n', stdout);
4577       printf (_("  Section header string table index: %ld"),
4578               (long) elf_header.e_shstrndx);
4579       if (section_headers != NULL
4580           && elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
4581         printf (" (%u)", section_headers[0].sh_link);
4582       else if (elf_header.e_shstrndx != SHN_UNDEF
4583                && elf_header.e_shstrndx >= elf_header.e_shnum)
4584         printf (_(" <corrupt: out of range>"));
4585       putc ('\n', stdout);
4586     }
4587
4588   if (section_headers != NULL)
4589     {
4590       if (elf_header.e_phnum == PN_XNUM
4591           && section_headers[0].sh_info != 0)
4592         elf_header.e_phnum = section_headers[0].sh_info;
4593       if (elf_header.e_shnum == SHN_UNDEF)
4594         elf_header.e_shnum = section_headers[0].sh_size;
4595       if (elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
4596         elf_header.e_shstrndx = section_headers[0].sh_link;
4597       else if (elf_header.e_shstrndx >= elf_header.e_shnum)
4598         elf_header.e_shstrndx = SHN_UNDEF;
4599       free (section_headers);
4600       section_headers = NULL;
4601     }
4602
4603   return 1;
4604 }
4605
4606 static bfd_boolean
4607 get_32bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
4608 {
4609   Elf32_External_Phdr * phdrs;
4610   Elf32_External_Phdr * external;
4611   Elf_Internal_Phdr *   internal;
4612   unsigned int i;
4613   unsigned int size = elf_header.e_phentsize;
4614   unsigned int num  = elf_header.e_phnum;
4615
4616   /* PR binutils/17531: Cope with unexpected section header sizes.  */
4617   if (size == 0 || num == 0)
4618     return FALSE;
4619   if (size < sizeof * phdrs)
4620     {
4621       error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4622       return FALSE;
4623     }
4624   if (size > sizeof * phdrs)
4625     warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4626
4627   phdrs = (Elf32_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
4628                                             size, num, _("program headers"));
4629   if (phdrs == NULL)
4630     return FALSE;
4631
4632   for (i = 0, internal = pheaders, external = phdrs;
4633        i < elf_header.e_phnum;
4634        i++, internal++, external++)
4635     {
4636       internal->p_type   = BYTE_GET (external->p_type);
4637       internal->p_offset = BYTE_GET (external->p_offset);
4638       internal->p_vaddr  = BYTE_GET (external->p_vaddr);
4639       internal->p_paddr  = BYTE_GET (external->p_paddr);
4640       internal->p_filesz = BYTE_GET (external->p_filesz);
4641       internal->p_memsz  = BYTE_GET (external->p_memsz);
4642       internal->p_flags  = BYTE_GET (external->p_flags);
4643       internal->p_align  = BYTE_GET (external->p_align);
4644     }
4645
4646   free (phdrs);
4647   return TRUE;
4648 }
4649
4650 static bfd_boolean
4651 get_64bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
4652 {
4653   Elf64_External_Phdr * phdrs;
4654   Elf64_External_Phdr * external;
4655   Elf_Internal_Phdr *   internal;
4656   unsigned int i;
4657   unsigned int size = elf_header.e_phentsize;
4658   unsigned int num  = elf_header.e_phnum;
4659
4660   /* PR binutils/17531: Cope with unexpected section header sizes.  */
4661   if (size == 0 || num == 0)
4662     return FALSE;
4663   if (size < sizeof * phdrs)
4664     {
4665       error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4666       return FALSE;
4667     }
4668   if (size > sizeof * phdrs)
4669     warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4670
4671   phdrs = (Elf64_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
4672                                             size, num, _("program headers"));
4673   if (!phdrs)
4674     return FALSE;
4675
4676   for (i = 0, internal = pheaders, external = phdrs;
4677        i < elf_header.e_phnum;
4678        i++, internal++, external++)
4679     {
4680       internal->p_type   = BYTE_GET (external->p_type);
4681       internal->p_flags  = BYTE_GET (external->p_flags);
4682       internal->p_offset = BYTE_GET (external->p_offset);
4683       internal->p_vaddr  = BYTE_GET (external->p_vaddr);
4684       internal->p_paddr  = BYTE_GET (external->p_paddr);
4685       internal->p_filesz = BYTE_GET (external->p_filesz);
4686       internal->p_memsz  = BYTE_GET (external->p_memsz);
4687       internal->p_align  = BYTE_GET (external->p_align);
4688     }
4689
4690   free (phdrs);
4691   return TRUE;
4692 }
4693
4694 /* Returns 1 if the program headers were read into `program_headers'.  */
4695
4696 static int
4697 get_program_headers (FILE * file)
4698 {
4699   Elf_Internal_Phdr * phdrs;
4700
4701   /* Check cache of prior read.  */
4702   if (program_headers != NULL)
4703     return 1;
4704
4705   phdrs = (Elf_Internal_Phdr *) cmalloc (elf_header.e_phnum,
4706                                          sizeof (Elf_Internal_Phdr));
4707
4708   if (phdrs == NULL)
4709     {
4710       error (_("Out of memory reading %u program headers\n"),
4711              elf_header.e_phnum);
4712       return 0;
4713     }
4714
4715   if (is_32bit_elf
4716       ? get_32bit_program_headers (file, phdrs)
4717       : get_64bit_program_headers (file, phdrs))
4718     {
4719       program_headers = phdrs;
4720       return 1;
4721     }
4722
4723   free (phdrs);
4724   return 0;
4725 }
4726
4727 /* Returns 1 if the program headers were loaded.  */
4728
4729 static int
4730 process_program_headers (FILE * file)
4731 {
4732   Elf_Internal_Phdr * segment;
4733   unsigned int i;
4734
4735   if (elf_header.e_phnum == 0)
4736     {
4737       /* PR binutils/12467.  */
4738       if (elf_header.e_phoff != 0)
4739         warn (_("possibly corrupt ELF header - it has a non-zero program"
4740                 " header offset, but no program headers\n"));
4741       else if (do_segments)
4742         printf (_("\nThere are no program headers in this file.\n"));
4743       return 0;
4744     }
4745
4746   if (do_segments && !do_header)
4747     {
4748       printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
4749       printf (_("Entry point "));
4750       print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4751       printf (_("\nThere are %d program headers, starting at offset "),
4752               elf_header.e_phnum);
4753       print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4754       printf ("\n");
4755     }
4756
4757   if (! get_program_headers (file))
4758       return 0;
4759
4760   if (do_segments)
4761     {
4762       if (elf_header.e_phnum > 1)
4763         printf (_("\nProgram Headers:\n"));
4764       else
4765         printf (_("\nProgram Headers:\n"));
4766
4767       if (is_32bit_elf)
4768         printf
4769           (_("  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align\n"));
4770       else if (do_wide)
4771         printf
4772           (_("  Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align\n"));
4773       else
4774         {
4775           printf
4776             (_("  Type           Offset             VirtAddr           PhysAddr\n"));
4777           printf
4778             (_("                 FileSiz            MemSiz              Flags  Align\n"));
4779         }
4780     }
4781
4782   dynamic_addr = 0;
4783   dynamic_size = 0;
4784
4785   for (i = 0, segment = program_headers;
4786        i < elf_header.e_phnum;
4787        i++, segment++)
4788     {
4789       if (do_segments)
4790         {
4791           printf ("  %-14.14s ", get_segment_type (segment->p_type));
4792
4793           if (is_32bit_elf)
4794             {
4795               printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4796               printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
4797               printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
4798               printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
4799               printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
4800               printf ("%c%c%c ",
4801                       (segment->p_flags & PF_R ? 'R' : ' '),
4802                       (segment->p_flags & PF_W ? 'W' : ' '),
4803                       (segment->p_flags & PF_X ? 'E' : ' '));
4804               printf ("%#lx", (unsigned long) segment->p_align);
4805             }
4806           else if (do_wide)
4807             {
4808               if ((unsigned long) segment->p_offset == segment->p_offset)
4809                 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4810               else
4811                 {
4812                   print_vma (segment->p_offset, FULL_HEX);
4813                   putchar (' ');
4814                 }
4815
4816               print_vma (segment->p_vaddr, FULL_HEX);
4817               putchar (' ');
4818               print_vma (segment->p_paddr, FULL_HEX);
4819               putchar (' ');
4820
4821               if ((unsigned long) segment->p_filesz == segment->p_filesz)
4822                 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
4823               else
4824                 {
4825                   print_vma (segment->p_filesz, FULL_HEX);
4826                   putchar (' ');
4827                 }
4828
4829               if ((unsigned long) segment->p_memsz == segment->p_memsz)
4830                 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
4831               else
4832                 {
4833                   print_vma (segment->p_memsz, FULL_HEX);
4834                 }
4835
4836               printf (" %c%c%c ",
4837                       (segment->p_flags & PF_R ? 'R' : ' '),
4838                       (segment->p_flags & PF_W ? 'W' : ' '),
4839                       (segment->p_flags & PF_X ? 'E' : ' '));
4840
4841               if ((unsigned long) segment->p_align == segment->p_align)
4842                 printf ("%#lx", (unsigned long) segment->p_align);
4843               else
4844                 {
4845                   print_vma (segment->p_align, PREFIX_HEX);
4846                 }
4847             }
4848           else
4849             {
4850               print_vma (segment->p_offset, FULL_HEX);
4851               putchar (' ');
4852               print_vma (segment->p_vaddr, FULL_HEX);
4853               putchar (' ');
4854               print_vma (segment->p_paddr, FULL_HEX);
4855               printf ("\n                 ");
4856               print_vma (segment->p_filesz, FULL_HEX);
4857               putchar (' ');
4858               print_vma (segment->p_memsz, FULL_HEX);
4859               printf ("  %c%c%c    ",
4860                       (segment->p_flags & PF_R ? 'R' : ' '),
4861                       (segment->p_flags & PF_W ? 'W' : ' '),
4862                       (segment->p_flags & PF_X ? 'E' : ' '));
4863               print_vma (segment->p_align, HEX);
4864             }
4865         }
4866
4867       if (do_segments)
4868         putc ('\n', stdout);
4869
4870       switch (segment->p_type)
4871         {
4872         case PT_DYNAMIC:
4873           if (dynamic_addr)
4874             error (_("more than one dynamic segment\n"));
4875
4876           /* By default, assume that the .dynamic section is the first
4877              section in the DYNAMIC segment.  */
4878           dynamic_addr = segment->p_offset;
4879           dynamic_size = segment->p_filesz;
4880           /* PR binutils/17512: Avoid corrupt dynamic section info in the segment.  */
4881           if (dynamic_addr + dynamic_size >= current_file_size)
4882             {
4883               error (_("the dynamic segment offset + size exceeds the size of the file\n"));
4884               dynamic_addr = dynamic_size = 0;
4885             }
4886
4887           /* Try to locate the .dynamic section. If there is
4888              a section header table, we can easily locate it.  */
4889           if (section_headers != NULL)
4890             {
4891               Elf_Internal_Shdr * sec;
4892
4893               sec = find_section (".dynamic");
4894               if (sec == NULL || sec->sh_size == 0)
4895                 {
4896                   /* A corresponding .dynamic section is expected, but on
4897                      IA-64/OpenVMS it is OK for it to be missing.  */
4898                   if (!is_ia64_vms ())
4899                     error (_("no .dynamic section in the dynamic segment\n"));
4900                   break;
4901                 }
4902
4903               if (sec->sh_type == SHT_NOBITS)
4904                 {
4905                   dynamic_size = 0;
4906                   break;
4907                 }
4908
4909               dynamic_addr = sec->sh_offset;
4910               dynamic_size = sec->sh_size;
4911
4912               if (dynamic_addr < segment->p_offset
4913                   || dynamic_addr > segment->p_offset + segment->p_filesz)
4914                 warn (_("the .dynamic section is not contained"
4915                         " within the dynamic segment\n"));
4916               else if (dynamic_addr > segment->p_offset)
4917                 warn (_("the .dynamic section is not the first section"
4918                         " in the dynamic segment.\n"));
4919             }
4920           break;
4921
4922         case PT_INTERP:
4923           if (fseek (file, archive_file_offset + (long) segment->p_offset,
4924                      SEEK_SET))
4925             error (_("Unable to find program interpreter name\n"));
4926           else
4927             {
4928               char fmt [32];
4929               int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX - 1);
4930
4931               if (ret >= (int) sizeof (fmt) || ret < 0)
4932                 error (_("Internal error: failed to create format string to display program interpreter\n"));
4933
4934               program_interpreter[0] = 0;
4935               if (fscanf (file, fmt, program_interpreter) <= 0)
4936                 error (_("Unable to read program interpreter name\n"));
4937
4938               if (do_segments)
4939                 printf (_("      [Requesting program interpreter: %s]\n"),
4940                     program_interpreter);
4941             }
4942           break;
4943         }
4944     }
4945
4946   if (do_segments && section_headers != NULL && string_table != NULL)
4947     {
4948       printf (_("\n Section to Segment mapping:\n"));
4949       printf (_("  Segment Sections...\n"));
4950
4951       for (i = 0; i < elf_header.e_phnum; i++)
4952         {
4953           unsigned int j;
4954           Elf_Internal_Shdr * section;
4955
4956           segment = program_headers + i;
4957           section = section_headers + 1;
4958
4959           printf ("   %2.2d     ", i);
4960
4961           for (j = 1; j < elf_header.e_shnum; j++, section++)
4962             {
4963               if (!ELF_TBSS_SPECIAL (section, segment)
4964                   && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
4965                 printf ("%s ", printable_section_name (section));
4966             }
4967
4968           putc ('\n',stdout);
4969         }
4970     }
4971
4972   return 1;
4973 }
4974
4975
4976 /* Find the file offset corresponding to VMA by using the program headers.  */
4977
4978 static long
4979 offset_from_vma (FILE * file, bfd_vma vma, bfd_size_type size)
4980 {
4981   Elf_Internal_Phdr * seg;
4982
4983   if (! get_program_headers (file))
4984     {
4985       warn (_("Cannot interpret virtual addresses without program headers.\n"));
4986       return (long) vma;
4987     }
4988
4989   for (seg = program_headers;
4990        seg < program_headers + elf_header.e_phnum;
4991        ++seg)
4992     {
4993       if (seg->p_type != PT_LOAD)
4994         continue;
4995
4996       if (vma >= (seg->p_vaddr & -seg->p_align)
4997           && vma + size <= seg->p_vaddr + seg->p_filesz)
4998         return vma - seg->p_vaddr + seg->p_offset;
4999     }
5000
5001   warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
5002         (unsigned long) vma);
5003   return (long) vma;
5004 }
5005
5006
5007 /* Allocate memory and load the sections headers into the global pointer
5008    SECTION_HEADERS.  If PROBE is true, this is just a probe and we do not
5009    generate any error messages if the load fails.  */
5010
5011 static bfd_boolean
5012 get_32bit_section_headers (FILE * file, bfd_boolean probe)
5013 {
5014   Elf32_External_Shdr * shdrs;
5015   Elf_Internal_Shdr *   internal;
5016   unsigned int i;
5017   unsigned int size = elf_header.e_shentsize;
5018   unsigned int num = probe ? 1 : elf_header.e_shnum;
5019
5020   /* PR binutils/17531: Cope with unexpected section header sizes.  */
5021   if (size == 0 || num == 0)
5022     return FALSE;
5023   if (size < sizeof * shdrs)
5024     {
5025       if (! probe)
5026         error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5027       return FALSE;
5028     }
5029   if (!probe && size > sizeof * shdrs)
5030     warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
5031
5032   shdrs = (Elf32_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
5033                                             size, num,
5034                                             probe ? NULL : _("section headers"));
5035   if (shdrs == NULL)
5036     return FALSE;
5037
5038   if (section_headers != NULL)
5039     free (section_headers);
5040   section_headers = (Elf_Internal_Shdr *) cmalloc (num,
5041                                                    sizeof (Elf_Internal_Shdr));
5042   if (section_headers == NULL)
5043     {
5044       if (!probe)
5045         error (_("Out of memory reading %u section headers\n"), num);
5046       return FALSE;
5047     }
5048
5049   for (i = 0, internal = section_headers;
5050        i < num;
5051        i++, internal++)
5052     {
5053       internal->sh_name      = BYTE_GET (shdrs[i].sh_name);
5054       internal->sh_type      = BYTE_GET (shdrs[i].sh_type);
5055       internal->sh_flags     = BYTE_GET (shdrs[i].sh_flags);
5056       internal->sh_addr      = BYTE_GET (shdrs[i].sh_addr);
5057       internal->sh_offset    = BYTE_GET (shdrs[i].sh_offset);
5058       internal->sh_size      = BYTE_GET (shdrs[i].sh_size);
5059       internal->sh_link      = BYTE_GET (shdrs[i].sh_link);
5060       internal->sh_info      = BYTE_GET (shdrs[i].sh_info);
5061       internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5062       internal->sh_entsize   = BYTE_GET (shdrs[i].sh_entsize);
5063       if (!probe && internal->sh_link > num)
5064         warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5065       if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5066         warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
5067     }
5068
5069   free (shdrs);
5070   return TRUE;
5071 }
5072
5073 static bfd_boolean
5074 get_64bit_section_headers (FILE * file, bfd_boolean probe)
5075 {
5076   Elf64_External_Shdr * shdrs;
5077   Elf_Internal_Shdr *   internal;
5078   unsigned int i;
5079   unsigned int size = elf_header.e_shentsize;
5080   unsigned int num = probe ? 1 : elf_header.e_shnum;
5081
5082   /* PR binutils/17531: Cope with unexpected section header sizes.  */
5083   if (size == 0 || num == 0)
5084     return FALSE;
5085   if (size < sizeof * shdrs)
5086     {
5087       if (! probe)
5088         error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5089       return FALSE;
5090     }
5091   if (! probe && size > sizeof * shdrs)
5092     warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
5093
5094   shdrs = (Elf64_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
5095                                             size, num,
5096                                             probe ? NULL : _("section headers"));
5097   if (shdrs == NULL)
5098     return FALSE;
5099
5100   if (section_headers != NULL)
5101     free (section_headers);
5102   section_headers = (Elf_Internal_Shdr *) cmalloc (num,
5103                                                    sizeof (Elf_Internal_Shdr));
5104   if (section_headers == NULL)
5105     {
5106       if (! probe)
5107         error (_("Out of memory reading %u section headers\n"), num);
5108       return FALSE;
5109     }
5110
5111   for (i = 0, internal = section_headers;
5112        i < num;
5113        i++, internal++)
5114     {
5115       internal->sh_name      = BYTE_GET (shdrs[i].sh_name);
5116       internal->sh_type      = BYTE_GET (shdrs[i].sh_type);
5117       internal->sh_flags     = BYTE_GET (shdrs[i].sh_flags);
5118       internal->sh_addr      = BYTE_GET (shdrs[i].sh_addr);
5119       internal->sh_size      = BYTE_GET (shdrs[i].sh_size);
5120       internal->sh_entsize   = BYTE_GET (shdrs[i].sh_entsize);
5121       internal->sh_link      = BYTE_GET (shdrs[i].sh_link);
5122       internal->sh_info      = BYTE_GET (shdrs[i].sh_info);
5123       internal->sh_offset    = BYTE_GET (shdrs[i].sh_offset);
5124       internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5125       if (!probe && internal->sh_link > num)
5126         warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5127       if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5128         warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
5129     }
5130
5131   free (shdrs);
5132   return TRUE;
5133 }
5134
5135 static Elf_Internal_Sym *
5136 get_32bit_elf_symbols (FILE * file,
5137                        Elf_Internal_Shdr * section,
5138                        unsigned long * num_syms_return)
5139 {
5140   unsigned long number = 0;
5141   Elf32_External_Sym * esyms = NULL;
5142   Elf_External_Sym_Shndx * shndx = NULL;
5143   Elf_Internal_Sym * isyms = NULL;
5144   Elf_Internal_Sym * psym;
5145   unsigned int j;
5146
5147   if (section->sh_size == 0)
5148     {
5149       if (num_syms_return != NULL)
5150         * num_syms_return = 0;
5151       return NULL;
5152     }
5153
5154   /* Run some sanity checks first.  */
5155   if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5156     {
5157       error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5158              printable_section_name (section), (unsigned long) section->sh_entsize);
5159       goto exit_point;
5160     }
5161
5162   if (section->sh_size > current_file_size)
5163     {
5164       error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5165              printable_section_name (section), (unsigned long) section->sh_size);
5166       goto exit_point;
5167     }
5168
5169   number = section->sh_size / section->sh_entsize;
5170
5171   if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
5172     {
5173       error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5174              (unsigned long) section->sh_size,
5175              printable_section_name (section),
5176              (unsigned long) section->sh_entsize);
5177       goto exit_point;
5178     }
5179
5180   esyms = (Elf32_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
5181                                            section->sh_size, _("symbols"));
5182   if (esyms == NULL)
5183     goto exit_point;
5184
5185   {
5186     elf_section_list * entry;
5187
5188     shndx = NULL;
5189     for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5190       if (entry->hdr->sh_link == (unsigned long) (section - section_headers))
5191         {
5192           shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
5193                                                        entry->hdr->sh_offset,
5194                                                        1, entry->hdr->sh_size,
5195                                                        _("symbol table section indicies"));
5196           if (shndx == NULL)
5197             goto exit_point;
5198           /* PR17531: file: heap-buffer-overflow */
5199           else if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5200             {
5201               error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5202                      printable_section_name (entry->hdr),
5203                      (unsigned long) entry->hdr->sh_size,
5204                      (unsigned long) section->sh_size);
5205               goto exit_point;
5206             }
5207         }
5208   }
5209
5210   isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5211
5212   if (isyms == NULL)
5213     {
5214       error (_("Out of memory reading %lu symbols\n"),
5215              (unsigned long) number);
5216       goto exit_point;
5217     }
5218
5219   for (j = 0, psym = isyms; j < number; j++, psym++)
5220     {
5221       psym->st_name  = BYTE_GET (esyms[j].st_name);
5222       psym->st_value = BYTE_GET (esyms[j].st_value);
5223       psym->st_size  = BYTE_GET (esyms[j].st_size);
5224       psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5225       if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5226         psym->st_shndx
5227           = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5228       else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5229         psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5230       psym->st_info  = BYTE_GET (esyms[j].st_info);
5231       psym->st_other = BYTE_GET (esyms[j].st_other);
5232     }
5233
5234  exit_point:
5235   if (shndx != NULL)
5236     free (shndx);
5237   if (esyms != NULL)
5238     free (esyms);
5239
5240   if (num_syms_return != NULL)
5241     * num_syms_return = isyms == NULL ? 0 : number;
5242
5243   return isyms;
5244 }
5245
5246 static Elf_Internal_Sym *
5247 get_64bit_elf_symbols (FILE * file,
5248                        Elf_Internal_Shdr * section,
5249                        unsigned long * num_syms_return)
5250 {
5251   unsigned long number = 0;
5252   Elf64_External_Sym * esyms = NULL;
5253   Elf_External_Sym_Shndx * shndx = NULL;
5254   Elf_Internal_Sym * isyms = NULL;
5255   Elf_Internal_Sym * psym;
5256   unsigned int j;
5257
5258   if (section->sh_size == 0)
5259     {
5260       if (num_syms_return != NULL)
5261         * num_syms_return = 0;
5262       return NULL;
5263     }
5264
5265   /* Run some sanity checks first.  */
5266   if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5267     {
5268       error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5269              printable_section_name (section),
5270              (unsigned long) section->sh_entsize);
5271       goto exit_point;
5272     }
5273
5274   if (section->sh_size > current_file_size)
5275     {
5276       error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5277              printable_section_name (section),
5278              (unsigned long) section->sh_size);
5279       goto exit_point;
5280     }
5281
5282   number = section->sh_size / section->sh_entsize;
5283
5284   if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
5285     {
5286       error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5287              (unsigned long) section->sh_size,
5288              printable_section_name (section),
5289              (unsigned long) section->sh_entsize);
5290       goto exit_point;
5291     }
5292
5293   esyms = (Elf64_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
5294                                            section->sh_size, _("symbols"));
5295   if (!esyms)
5296     goto exit_point;
5297
5298   {
5299     elf_section_list * entry;
5300
5301     shndx = NULL;
5302     for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5303       if (entry->hdr->sh_link == (unsigned long) (section - section_headers))
5304         {
5305           shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
5306                                                        entry->hdr->sh_offset,
5307                                                        1, entry->hdr->sh_size,
5308                                                        _("symbol table section indicies"));
5309           if (shndx == NULL)
5310             goto exit_point;
5311           /* PR17531: file: heap-buffer-overflow */
5312           else if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5313             {
5314               error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5315                      printable_section_name (entry->hdr),
5316                      (unsigned long) entry->hdr->sh_size,
5317                      (unsigned long) section->sh_size);
5318               goto exit_point;
5319             }
5320         }
5321   }
5322
5323   isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5324
5325   if (isyms == NULL)
5326     {
5327       error (_("Out of memory reading %lu symbols\n"),
5328              (unsigned long) number);
5329       goto exit_point;
5330     }
5331
5332   for (j = 0, psym = isyms; j < number; j++, psym++)
5333     {
5334       psym->st_name  = BYTE_GET (esyms[j].st_name);
5335       psym->st_info  = BYTE_GET (esyms[j].st_info);
5336       psym->st_other = BYTE_GET (esyms[j].st_other);
5337       psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5338
5339       if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5340         psym->st_shndx
5341           = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5342       else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5343         psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5344
5345       psym->st_value = BYTE_GET (esyms[j].st_value);
5346       psym->st_size  = BYTE_GET (esyms[j].st_size);
5347     }
5348
5349  exit_point:
5350   if (shndx != NULL)
5351     free (shndx);
5352   if (esyms != NULL)
5353     free (esyms);
5354
5355   if (num_syms_return != NULL)
5356     * num_syms_return = isyms == NULL ? 0 : number;
5357
5358   return isyms;
5359 }
5360
5361 static const char *
5362 get_elf_section_flags (bfd_vma sh_flags)
5363 {
5364   static char buff[1024];
5365   char * p = buff;
5366   int field_size = is_32bit_elf ? 8 : 16;
5367   int sindex;
5368   int size = sizeof (buff) - (field_size + 4 + 1);
5369   bfd_vma os_flags = 0;
5370   bfd_vma proc_flags = 0;
5371   bfd_vma unknown_flags = 0;
5372   static const struct
5373     {
5374       const char * str;
5375       int len;
5376     }
5377   flags [] =
5378     {
5379       /*  0 */ { STRING_COMMA_LEN ("WRITE") },
5380       /*  1 */ { STRING_COMMA_LEN ("ALLOC") },
5381       /*  2 */ { STRING_COMMA_LEN ("EXEC") },
5382       /*  3 */ { STRING_COMMA_LEN ("MERGE") },
5383       /*  4 */ { STRING_COMMA_LEN ("STRINGS") },
5384       /*  5 */ { STRING_COMMA_LEN ("INFO LINK") },
5385       /*  6 */ { STRING_COMMA_LEN ("LINK ORDER") },
5386       /*  7 */ { STRING_COMMA_LEN ("OS NONCONF") },
5387       /*  8 */ { STRING_COMMA_LEN ("GROUP") },
5388       /*  9 */ { STRING_COMMA_LEN ("TLS") },
5389       /* IA-64 specific.  */
5390       /* 10 */ { STRING_COMMA_LEN ("SHORT") },
5391       /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
5392       /* IA-64 OpenVMS specific.  */
5393       /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
5394       /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
5395       /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
5396       /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
5397       /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
5398       /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
5399       /* Generic.  */
5400       /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
5401       /* SPARC specific.  */
5402       /* 19 */ { STRING_COMMA_LEN ("ORDERED") },
5403       /* 20 */ { STRING_COMMA_LEN ("COMPRESSED") },
5404       /* ARM specific.  */
5405       /* 21 */ { STRING_COMMA_LEN ("ENTRYSECT") },
5406       /* 22 */ { STRING_COMMA_LEN ("ARM_PURECODE") },
5407       /* 23 */ { STRING_COMMA_LEN ("COMDEF") }
5408     };
5409
5410   if (do_section_details)
5411     {
5412       sprintf (buff, "[%*.*lx]: ",
5413                field_size, field_size, (unsigned long) sh_flags);
5414       p += field_size + 4;
5415     }
5416
5417   while (sh_flags)
5418     {
5419       bfd_vma flag;
5420
5421       flag = sh_flags & - sh_flags;
5422       sh_flags &= ~ flag;
5423
5424       if (do_section_details)
5425         {
5426           switch (flag)
5427             {
5428             case SHF_WRITE:             sindex = 0; break;
5429             case SHF_ALLOC:             sindex = 1; break;
5430             case SHF_EXECINSTR:         sindex = 2; break;
5431             case SHF_MERGE:             sindex = 3; break;
5432             case SHF_STRINGS:           sindex = 4; break;
5433             case SHF_INFO_LINK:         sindex = 5; break;
5434             case SHF_LINK_ORDER:        sindex = 6; break;
5435             case SHF_OS_NONCONFORMING:  sindex = 7; break;
5436             case SHF_GROUP:             sindex = 8; break;
5437             case SHF_TLS:               sindex = 9; break;
5438             case SHF_EXCLUDE:           sindex = 18; break;
5439             case SHF_COMPRESSED:        sindex = 20; break;
5440
5441             default:
5442               sindex = -1;
5443               switch (elf_header.e_machine)
5444                 {
5445                 case EM_IA_64:
5446                   if (flag == SHF_IA_64_SHORT)
5447                     sindex = 10;
5448                   else if (flag == SHF_IA_64_NORECOV)
5449                     sindex = 11;
5450 #ifdef BFD64
5451                   else if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
5452                     switch (flag)
5453                       {
5454                       case SHF_IA_64_VMS_GLOBAL:      sindex = 12; break;
5455                       case SHF_IA_64_VMS_OVERLAID:    sindex = 13; break;
5456                       case SHF_IA_64_VMS_SHARED:      sindex = 14; break;
5457                       case SHF_IA_64_VMS_VECTOR:      sindex = 15; break;
5458                       case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
5459                       case SHF_IA_64_VMS_PROTECTED:   sindex = 17; break;
5460                       default:                        break;
5461                       }
5462 #endif
5463                   break;
5464
5465                 case EM_386:
5466                 case EM_IAMCU:
5467                 case EM_X86_64:
5468                 case EM_L1OM:
5469                 case EM_K1OM:
5470                 case EM_OLD_SPARCV9:
5471                 case EM_SPARC32PLUS:
5472                 case EM_SPARCV9:
5473                 case EM_SPARC:
5474                   if (flag == SHF_ORDERED)
5475                     sindex = 19;
5476                   break;
5477
5478                 case EM_ARM:
5479                   switch (flag)
5480                     {
5481                     case SHF_ENTRYSECT: sindex = 21; break;
5482                     case SHF_ARM_PURECODE: sindex = 22; break;
5483                     case SHF_COMDEF: sindex = 23; break;
5484                     default: break;
5485                     }
5486                   break;
5487
5488                 default:
5489                   break;
5490                 }
5491             }
5492
5493           if (sindex != -1)
5494             {
5495               if (p != buff + field_size + 4)
5496                 {
5497                   if (size < (10 + 2))
5498                     {
5499                       warn (_("Internal error: not enough buffer room for section flag info"));
5500                       return _("<unknown>");
5501                     }
5502                   size -= 2;
5503                   *p++ = ',';
5504                   *p++ = ' ';
5505                 }
5506
5507               size -= flags [sindex].len;
5508               p = stpcpy (p, flags [sindex].str);
5509             }
5510           else if (flag & SHF_MASKOS)
5511             os_flags |= flag;
5512           else if (flag & SHF_MASKPROC)
5513             proc_flags |= flag;
5514           else
5515             unknown_flags |= flag;
5516         }
5517       else
5518         {
5519           switch (flag)
5520             {
5521             case SHF_WRITE:             *p = 'W'; break;
5522             case SHF_ALLOC:             *p = 'A'; break;
5523             case SHF_EXECINSTR:         *p = 'X'; break;
5524             case SHF_MERGE:             *p = 'M'; break;
5525             case SHF_STRINGS:           *p = 'S'; break;
5526             case SHF_INFO_LINK:         *p = 'I'; break;
5527             case SHF_LINK_ORDER:        *p = 'L'; break;
5528             case SHF_OS_NONCONFORMING:  *p = 'O'; break;
5529             case SHF_GROUP:             *p = 'G'; break;
5530             case SHF_TLS:               *p = 'T'; break;
5531             case SHF_EXCLUDE:           *p = 'E'; break;
5532             case SHF_COMPRESSED:        *p = 'C'; break;
5533
5534             default:
5535               if ((elf_header.e_machine == EM_X86_64
5536                    || elf_header.e_machine == EM_L1OM
5537                    || elf_header.e_machine == EM_K1OM)
5538                   && flag == SHF_X86_64_LARGE)
5539                 *p = 'l';
5540               else if (elf_header.e_machine == EM_ARM
5541                        && flag == SHF_ARM_PURECODE)
5542                   *p = 'y';
5543               else if (flag & SHF_MASKOS)
5544                 {
5545                   *p = 'o';
5546                   sh_flags &= ~ SHF_MASKOS;
5547                 }
5548               else if (flag & SHF_MASKPROC)
5549                 {
5550                   *p = 'p';
5551                   sh_flags &= ~ SHF_MASKPROC;
5552                 }
5553               else
5554                 *p = 'x';
5555               break;
5556             }
5557           p++;
5558         }
5559     }
5560
5561   if (do_section_details)
5562     {
5563       if (os_flags)
5564         {
5565           size -= 5 + field_size;
5566           if (p != buff + field_size + 4)
5567             {
5568               if (size < (2 + 1))
5569                 {
5570                   warn (_("Internal error: not enough buffer room for section flag info"));
5571                   return _("<unknown>");
5572                 }
5573               size -= 2;
5574               *p++ = ',';
5575               *p++ = ' ';
5576             }
5577           sprintf (p, "OS (%*.*lx)", field_size, field_size,
5578                    (unsigned long) os_flags);
5579           p += 5 + field_size;
5580         }
5581       if (proc_flags)
5582         {
5583           size -= 7 + field_size;
5584           if (p != buff + field_size + 4)
5585             {
5586               if (size < (2 + 1))
5587                 {
5588                   warn (_("Internal error: not enough buffer room for section flag info"));
5589                   return _("<unknown>");
5590                 }
5591               size -= 2;
5592               *p++ = ',';
5593               *p++ = ' ';
5594             }
5595           sprintf (p, "PROC (%*.*lx)", field_size, field_size,
5596                    (unsigned long) proc_flags);
5597           p += 7 + field_size;
5598         }
5599       if (unknown_flags)
5600         {
5601           size -= 10 + field_size;
5602           if (p != buff + field_size + 4)
5603             {
5604               if (size < (2 + 1))
5605                 {
5606                   warn (_("Internal error: not enough buffer room for section flag info"));
5607                   return _("<unknown>");
5608                 }
5609               size -= 2;
5610               *p++ = ',';
5611               *p++ = ' ';
5612             }
5613           sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
5614                    (unsigned long) unknown_flags);
5615           p += 10 + field_size;
5616         }
5617     }
5618
5619   *p = '\0';
5620   return buff;
5621 }
5622
5623 static unsigned int
5624 get_compression_header (Elf_Internal_Chdr *chdr, unsigned char *buf)
5625 {
5626   if (is_32bit_elf)
5627     {
5628       Elf32_External_Chdr *echdr = (Elf32_External_Chdr *) buf;
5629
5630       chdr->ch_type = BYTE_GET (echdr->ch_type);
5631       chdr->ch_size = BYTE_GET (echdr->ch_size);
5632       chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5633       return sizeof (*echdr);
5634     }
5635   else
5636     {
5637       Elf64_External_Chdr *echdr = (Elf64_External_Chdr *) buf;
5638
5639       chdr->ch_type = BYTE_GET (echdr->ch_type);
5640       chdr->ch_size = BYTE_GET (echdr->ch_size);
5641       chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5642       return sizeof (*echdr);
5643     }
5644 }
5645
5646 static int
5647 process_section_headers (FILE * file)
5648 {
5649   Elf_Internal_Shdr * section;
5650   unsigned int i;
5651
5652   section_headers = NULL;
5653
5654   if (elf_header.e_shnum == 0)
5655     {
5656       /* PR binutils/12467.  */
5657       if (elf_header.e_shoff != 0)
5658         warn (_("possibly corrupt ELF file header - it has a non-zero"
5659                 " section header offset, but no section headers\n"));
5660       else if (do_sections)
5661         printf (_("\nThere are no sections in this file.\n"));
5662
5663       return 1;
5664     }
5665
5666   if (do_sections && !do_header)
5667     printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
5668             elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
5669
5670   if (is_32bit_elf)
5671     {
5672       if (! get_32bit_section_headers (file, FALSE))
5673         return 0;
5674     }
5675   else if (! get_64bit_section_headers (file, FALSE))
5676     return 0;
5677
5678   /* Read in the string table, so that we have names to display.  */
5679   if (elf_header.e_shstrndx != SHN_UNDEF
5680        && elf_header.e_shstrndx < elf_header.e_shnum)
5681     {
5682       section = section_headers + elf_header.e_shstrndx;
5683
5684       if (section->sh_size != 0)
5685         {
5686           string_table = (char *) get_data (NULL, file, section->sh_offset,
5687                                             1, section->sh_size,
5688                                             _("string table"));
5689
5690           string_table_length = string_table != NULL ? section->sh_size : 0;
5691         }
5692     }
5693
5694   /* Scan the sections for the dynamic symbol table
5695      and dynamic string table and debug sections.  */
5696   dynamic_symbols = NULL;
5697   dynamic_strings = NULL;
5698   dynamic_syminfo = NULL;
5699   symtab_shndx_list = NULL;
5700
5701   eh_addr_size = is_32bit_elf ? 4 : 8;
5702   switch (elf_header.e_machine)
5703     {
5704     case EM_MIPS:
5705     case EM_MIPS_RS3_LE:
5706       /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
5707          FDE addresses.  However, the ABI also has a semi-official ILP32
5708          variant for which the normal FDE address size rules apply.
5709
5710          GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
5711          section, where XX is the size of longs in bits.  Unfortunately,
5712          earlier compilers provided no way of distinguishing ILP32 objects
5713          from LP64 objects, so if there's any doubt, we should assume that
5714          the official LP64 form is being used.  */
5715       if ((elf_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
5716           && find_section (".gcc_compiled_long32") == NULL)
5717         eh_addr_size = 8;
5718       break;
5719
5720     case EM_H8_300:
5721     case EM_H8_300H:
5722       switch (elf_header.e_flags & EF_H8_MACH)
5723         {
5724         case E_H8_MACH_H8300:
5725         case E_H8_MACH_H8300HN:
5726         case E_H8_MACH_H8300SN:
5727         case E_H8_MACH_H8300SXN:
5728           eh_addr_size = 2;
5729           break;
5730         case E_H8_MACH_H8300H:
5731         case E_H8_MACH_H8300S:
5732         case E_H8_MACH_H8300SX:
5733           eh_addr_size = 4;
5734           break;
5735         }
5736       break;
5737
5738     case EM_M32C_OLD:
5739     case EM_M32C:
5740       switch (elf_header.e_flags & EF_M32C_CPU_MASK)
5741         {
5742         case EF_M32C_CPU_M16C:
5743           eh_addr_size = 2;
5744           break;
5745         }
5746       break;
5747     }
5748
5749 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64)                \
5750   do                                                                    \
5751     {                                                                   \
5752       bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64;  \
5753       if (section->sh_entsize != expected_entsize)                      \
5754         {                                                               \
5755           char buf[40];                                                 \
5756           sprintf_vma (buf, section->sh_entsize);                       \
5757           /* Note: coded this way so that there is a single string for  \
5758              translation.  */ \
5759           error (_("Section %d has invalid sh_entsize of %s\n"), i, buf); \
5760           error (_("(Using the expected size of %u for the rest of this dump)\n"), \
5761                    (unsigned) expected_entsize);                        \
5762           section->sh_entsize = expected_entsize;                       \
5763         }                                                               \
5764     }                                                                   \
5765   while (0)
5766
5767 #define CHECK_ENTSIZE(section, i, type)                                 \
5768   CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type),         \
5769                         sizeof (Elf64_External_##type))
5770
5771   for (i = 0, section = section_headers;
5772        i < elf_header.e_shnum;
5773        i++, section++)
5774     {
5775       char * name = SECTION_NAME (section);
5776
5777       if (section->sh_type == SHT_DYNSYM)
5778         {
5779           if (dynamic_symbols != NULL)
5780             {
5781               error (_("File contains multiple dynamic symbol tables\n"));
5782               continue;
5783             }
5784
5785           CHECK_ENTSIZE (section, i, Sym);
5786           dynamic_symbols = GET_ELF_SYMBOLS (file, section, & num_dynamic_syms);
5787         }
5788       else if (section->sh_type == SHT_STRTAB
5789                && streq (name, ".dynstr"))
5790         {
5791           if (dynamic_strings != NULL)
5792             {
5793               error (_("File contains multiple dynamic string tables\n"));
5794               continue;
5795             }
5796
5797           dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
5798                                                1, section->sh_size,
5799                                                _("dynamic strings"));
5800           dynamic_strings_length = dynamic_strings == NULL ? 0 : section->sh_size;
5801         }
5802       else if (section->sh_type == SHT_SYMTAB_SHNDX)
5803         {
5804           elf_section_list * entry = xmalloc (sizeof * entry);
5805           entry->hdr = section;
5806           entry->next = symtab_shndx_list;
5807           symtab_shndx_list = entry;
5808         }
5809       else if (section->sh_type == SHT_SYMTAB)
5810         CHECK_ENTSIZE (section, i, Sym);
5811       else if (section->sh_type == SHT_GROUP)
5812         CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
5813       else if (section->sh_type == SHT_REL)
5814         CHECK_ENTSIZE (section, i, Rel);
5815       else if (section->sh_type == SHT_RELA)
5816         CHECK_ENTSIZE (section, i, Rela);
5817       else if ((do_debugging || do_debug_info || do_debug_abbrevs
5818                 || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
5819                 || do_debug_aranges || do_debug_frames || do_debug_macinfo
5820                 || do_debug_str || do_debug_loc || do_debug_ranges
5821                 || do_debug_addr || do_debug_cu_index)
5822                && (const_strneq (name, ".debug_")
5823                    || const_strneq (name, ".zdebug_")))
5824         {
5825           if (name[1] == 'z')
5826             name += sizeof (".zdebug_") - 1;
5827           else
5828             name += sizeof (".debug_") - 1;
5829
5830           if (do_debugging
5831               || (do_debug_info     && const_strneq (name, "info"))
5832               || (do_debug_info     && const_strneq (name, "types"))
5833               || (do_debug_abbrevs  && const_strneq (name, "abbrev"))
5834               || (do_debug_lines    && strcmp (name, "line") == 0)
5835               || (do_debug_lines    && const_strneq (name, "line."))
5836               || (do_debug_pubnames && const_strneq (name, "pubnames"))
5837               || (do_debug_pubtypes && const_strneq (name, "pubtypes"))
5838               || (do_debug_pubnames && const_strneq (name, "gnu_pubnames"))
5839               || (do_debug_pubtypes && const_strneq (name, "gnu_pubtypes"))
5840               || (do_debug_aranges  && const_strneq (name, "aranges"))
5841               || (do_debug_ranges   && const_strneq (name, "ranges"))
5842               || (do_debug_frames   && const_strneq (name, "frame"))
5843               || (do_debug_macinfo  && const_strneq (name, "macinfo"))
5844               || (do_debug_macinfo  && const_strneq (name, "macro"))
5845               || (do_debug_str      && const_strneq (name, "str"))
5846               || (do_debug_loc      && const_strneq (name, "loc"))
5847               || (do_debug_addr     && const_strneq (name, "addr"))
5848               || (do_debug_cu_index && const_strneq (name, "cu_index"))
5849               || (do_debug_cu_index && const_strneq (name, "tu_index"))
5850               )
5851             request_dump_bynumber (i, DEBUG_DUMP);
5852         }
5853       /* Linkonce section to be combined with .debug_info at link time.  */
5854       else if ((do_debugging || do_debug_info)
5855                && const_strneq (name, ".gnu.linkonce.wi."))
5856         request_dump_bynumber (i, DEBUG_DUMP);
5857       else if (do_debug_frames && streq (name, ".eh_frame"))
5858         request_dump_bynumber (i, DEBUG_DUMP);
5859       else if (do_gdb_index && streq (name, ".gdb_index"))
5860         request_dump_bynumber (i, DEBUG_DUMP);
5861       /* Trace sections for Itanium VMS.  */
5862       else if ((do_debugging || do_trace_info || do_trace_abbrevs
5863                 || do_trace_aranges)
5864                && const_strneq (name, ".trace_"))
5865         {
5866           name += sizeof (".trace_") - 1;
5867
5868           if (do_debugging
5869               || (do_trace_info     && streq (name, "info"))
5870               || (do_trace_abbrevs  && streq (name, "abbrev"))
5871               || (do_trace_aranges  && streq (name, "aranges"))
5872               )
5873             request_dump_bynumber (i, DEBUG_DUMP);
5874         }
5875     }
5876
5877   if (! do_sections)
5878     return 1;
5879
5880   if (elf_header.e_shnum > 1)
5881     printf (_("\nSection Headers:\n"));
5882   else
5883     printf (_("\nSection Header:\n"));
5884
5885   if (is_32bit_elf)
5886     {
5887       if (do_section_details)
5888         {
5889           printf (_("  [Nr] Name\n"));
5890           printf (_("       Type            Addr     Off    Size   ES   Lk Inf Al\n"));
5891         }
5892       else
5893         printf
5894           (_("  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al\n"));
5895     }
5896   else if (do_wide)
5897     {
5898       if (do_section_details)
5899         {
5900           printf (_("  [Nr] Name\n"));
5901           printf (_("       Type            Address          Off    Size   ES   Lk Inf Al\n"));
5902         }
5903       else
5904         printf
5905           (_("  [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al\n"));
5906     }
5907   else
5908     {
5909       if (do_section_details)
5910         {
5911           printf (_("  [Nr] Name\n"));
5912           printf (_("       Type              Address          Offset            Link\n"));
5913           printf (_("       Size              EntSize          Info              Align\n"));
5914         }
5915       else
5916         {
5917           printf (_("  [Nr] Name              Type             Address           Offset\n"));
5918           printf (_("       Size              EntSize          Flags  Link  Info  Align\n"));
5919         }
5920     }
5921
5922   if (do_section_details)
5923     printf (_("       Flags\n"));
5924
5925   for (i = 0, section = section_headers;
5926        i < elf_header.e_shnum;
5927        i++, section++)
5928     {
5929       /* Run some sanity checks on the section header.  */
5930
5931       /* Check the sh_link field.  */
5932       switch (section->sh_type)
5933         {
5934         case SHT_SYMTAB_SHNDX:
5935         case SHT_GROUP:
5936         case SHT_HASH:
5937         case SHT_GNU_HASH:
5938         case SHT_GNU_versym:
5939         case SHT_REL:
5940         case SHT_RELA:
5941           if (section->sh_link < 1
5942               || section->sh_link > elf_header.e_shnum
5943               || (section_headers[section->sh_link].sh_type != SHT_SYMTAB
5944                   && section_headers[section->sh_link].sh_type != SHT_DYNSYM))
5945             warn (_("[%2u]: Link field (%u) should index a symtab section.\n"),
5946                   i, section->sh_link);
5947           break;
5948
5949         case SHT_DYNAMIC:
5950         case SHT_SYMTAB:
5951         case SHT_DYNSYM:
5952         case SHT_GNU_verneed:
5953         case SHT_GNU_verdef:
5954         case SHT_GNU_LIBLIST:
5955           if (section->sh_link < 1
5956               || section->sh_link > elf_header.e_shnum
5957               || section_headers[section->sh_link].sh_type != SHT_STRTAB)
5958             warn (_("[%2u]: Link field (%u) should index a string section.\n"),
5959                   i, section->sh_link);
5960           break;
5961
5962         case SHT_INIT_ARRAY:
5963         case SHT_FINI_ARRAY:
5964         case SHT_PREINIT_ARRAY:
5965           if (section->sh_type < SHT_LOOS && section->sh_link != 0)
5966             warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
5967                   i, section->sh_link);
5968           break;
5969
5970         default:
5971           /* FIXME: Add support for target specific section types.  */
5972 #if 0     /* Currently we do not check other section types as there are too
5973              many special cases.  Stab sections for example have a type
5974              of SHT_PROGBITS but an sh_link field that links to the .stabstr
5975              section.  */
5976           if (section->sh_type < SHT_LOOS && section->sh_link != 0)
5977             warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
5978                   i, section->sh_link);
5979 #endif
5980           break;
5981         }
5982
5983       /* Check the sh_info field.  */
5984       switch (section->sh_type)
5985         {
5986         case SHT_REL:
5987         case SHT_RELA:
5988           if (section->sh_info < 1
5989               || section->sh_info > elf_header.e_shnum
5990               || (section_headers[section->sh_info].sh_type != SHT_PROGBITS
5991                   && section_headers[section->sh_info].sh_type != SHT_NOBITS
5992                   && section_headers[section->sh_info].sh_type != SHT_NOTE
5993                   && section_headers[section->sh_info].sh_type != SHT_INIT_ARRAY
5994                   /* FIXME: Are other section types valid ?  */
5995                   && section_headers[section->sh_info].sh_type < SHT_LOOS))
5996             {
5997               if (section->sh_info == 0
5998                   && (streq (SECTION_NAME (section), ".rel.dyn")
5999                       || streq (SECTION_NAME (section), ".rela.dyn")))
6000                 /* The .rel.dyn and .rela.dyn sections have an sh_info field
6001                    of zero.  No idea why.  I would have expected the index
6002                    of the .plt section.  */
6003                    ;
6004               else
6005                 warn (_("[%2u]: Info field (%u) should index a relocatable section.\n"),
6006                       i, section->sh_info);
6007             }
6008           break;
6009
6010         case SHT_DYNAMIC:
6011         case SHT_HASH:
6012         case SHT_SYMTAB_SHNDX:
6013         case SHT_INIT_ARRAY:
6014         case SHT_FINI_ARRAY:
6015         case SHT_PREINIT_ARRAY:
6016           if (section->sh_info != 0)
6017             warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6018                   i, section->sh_info);
6019           break;
6020
6021         case SHT_GROUP:
6022         case SHT_SYMTAB:
6023         case SHT_DYNSYM:
6024           /* A symbol index - we assume that it is valid.  */
6025           break;
6026
6027         default:
6028           /* FIXME: Add support for target specific section types.  */
6029           if (section->sh_type == SHT_NOBITS)
6030             /* NOBITS section headers with non-zero sh_info fields can be
6031                created when a binary is stripped of everything but its debug
6032                information.  The stripped sections have their headers preserved but their types set to SHT_NOBITS.  so do not check this type of section.  */
6033             ;
6034           else if (section->sh_flags & SHF_INFO_LINK)
6035             {
6036               if (section->sh_info < 1 || section->sh_info > elf_header.e_shnum)
6037                 warn (_("[%2u]: Expected link to another section in info field"), i);
6038             }
6039           else if (section->sh_type < SHT_LOOS && section->sh_info != 0)
6040             warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6041                   i, section->sh_info);
6042           break;
6043         }
6044
6045       printf ("  [%2u] ", i);
6046       if (do_section_details)
6047         printf ("%s\n      ", printable_section_name (section));
6048       else
6049         print_symbol (-17, SECTION_NAME (section));
6050
6051       printf (do_wide ? " %-15s " : " %-15.15s ",
6052               get_section_type_name (section->sh_type));
6053
6054       if (is_32bit_elf)
6055         {
6056           const char * link_too_big = NULL;
6057
6058           print_vma (section->sh_addr, LONG_HEX);
6059
6060           printf ( " %6.6lx %6.6lx %2.2lx",
6061                    (unsigned long) section->sh_offset,
6062                    (unsigned long) section->sh_size,
6063                    (unsigned long) section->sh_entsize);
6064
6065           if (do_section_details)
6066             fputs ("  ", stdout);
6067           else
6068             printf (" %3s ", get_elf_section_flags (section->sh_flags));
6069
6070           if (section->sh_link >= elf_header.e_shnum)
6071             {
6072               link_too_big = "";
6073               /* The sh_link value is out of range.  Normally this indicates
6074                  an error but it can have special values in Solaris binaries.  */
6075               switch (elf_header.e_machine)
6076                 {
6077                 case EM_386:
6078                 case EM_IAMCU:
6079                 case EM_X86_64:
6080                 case EM_L1OM:
6081                 case EM_K1OM:
6082                 case EM_OLD_SPARCV9:
6083                 case EM_SPARC32PLUS:
6084                 case EM_SPARCV9:
6085                 case EM_SPARC:
6086                   if (section->sh_link == (SHN_BEFORE & 0xffff))
6087                     link_too_big = "BEFORE";
6088                   else if (section->sh_link == (SHN_AFTER & 0xffff))
6089                     link_too_big = "AFTER";
6090                   break;
6091                 default:
6092                   break;
6093                 }
6094             }
6095
6096           if (do_section_details)
6097             {
6098               if (link_too_big != NULL && * link_too_big)
6099                 printf ("<%s> ", link_too_big);
6100               else
6101                 printf ("%2u ", section->sh_link);
6102               printf ("%3u %2lu\n", section->sh_info,
6103                       (unsigned long) section->sh_addralign);
6104             }
6105           else
6106             printf ("%2u %3u %2lu\n",
6107                     section->sh_link,
6108                     section->sh_info,
6109                     (unsigned long) section->sh_addralign);
6110
6111           if (link_too_big && ! * link_too_big)
6112             warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
6113                   i, section->sh_link);
6114         }
6115       else if (do_wide)
6116         {
6117           print_vma (section->sh_addr, LONG_HEX);
6118
6119           if ((long) section->sh_offset == section->sh_offset)
6120             printf (" %6.6lx", (unsigned long) section->sh_offset);
6121           else
6122             {
6123               putchar (' ');
6124               print_vma (section->sh_offset, LONG_HEX);
6125             }
6126
6127           if ((unsigned long) section->sh_size == section->sh_size)
6128             printf (" %6.6lx", (unsigned long) section->sh_size);
6129           else
6130             {
6131               putchar (' ');
6132               print_vma (section->sh_size, LONG_HEX);
6133             }
6134
6135           if ((unsigned long) section->sh_entsize == section->sh_entsize)
6136             printf (" %2.2lx", (unsigned long) section->sh_entsize);
6137           else
6138             {
6139               putchar (' ');
6140               print_vma (section->sh_entsize, LONG_HEX);
6141             }
6142
6143           if (do_section_details)
6144             fputs ("  ", stdout);
6145           else
6146             printf (" %3s ", get_elf_section_flags (section->sh_flags));
6147
6148           printf ("%2u %3u ", section->sh_link, section->sh_info);
6149
6150           if ((unsigned long) section->sh_addralign == section->sh_addralign)
6151             printf ("%2lu\n", (unsigned long) section->sh_addralign);
6152           else
6153             {
6154               print_vma (section->sh_addralign, DEC);
6155               putchar ('\n');
6156             }
6157         }
6158       else if (do_section_details)
6159         {
6160           printf ("       %-15.15s  ",
6161                   get_section_type_name (section->sh_type));
6162           print_vma (section->sh_addr, LONG_HEX);
6163           if ((long) section->sh_offset == section->sh_offset)
6164             printf ("  %16.16lx", (unsigned long) section->sh_offset);
6165           else
6166             {
6167               printf ("  ");
6168               print_vma (section->sh_offset, LONG_HEX);
6169             }
6170           printf ("  %u\n       ", section->sh_link);
6171           print_vma (section->sh_size, LONG_HEX);
6172           putchar (' ');
6173           print_vma (section->sh_entsize, LONG_HEX);
6174
6175           printf ("  %-16u  %lu\n",
6176                   section->sh_info,
6177                   (unsigned long) section->sh_addralign);
6178         }
6179       else
6180         {
6181           putchar (' ');
6182           print_vma (section->sh_addr, LONG_HEX);
6183           if ((long) section->sh_offset == section->sh_offset)
6184             printf ("  %8.8lx", (unsigned long) section->sh_offset);
6185           else
6186             {
6187               printf ("  ");
6188               print_vma (section->sh_offset, LONG_HEX);
6189             }
6190           printf ("\n       ");
6191           print_vma (section->sh_size, LONG_HEX);
6192           printf ("  ");
6193           print_vma (section->sh_entsize, LONG_HEX);
6194
6195           printf (" %3s ", get_elf_section_flags (section->sh_flags));
6196
6197           printf ("     %2u   %3u     %lu\n",
6198                   section->sh_link,
6199                   section->sh_info,
6200                   (unsigned long) section->sh_addralign);
6201         }
6202
6203       if (do_section_details)
6204         {
6205           printf ("       %s\n", get_elf_section_flags (section->sh_flags));
6206           if ((section->sh_flags & SHF_COMPRESSED) != 0)
6207             {
6208               /* Minimum section size is 12 bytes for 32-bit compression
6209                  header + 12 bytes for compressed data header.  */
6210               unsigned char buf[24];
6211
6212               assert (sizeof (buf) >= sizeof (Elf64_External_Chdr));
6213               if (get_data (&buf, (FILE *) file, section->sh_offset, 1,
6214                             sizeof (buf), _("compression header")))
6215                 {
6216                   Elf_Internal_Chdr chdr;
6217
6218                   (void) get_compression_header (&chdr, buf);
6219
6220                   if (chdr.ch_type == ELFCOMPRESS_ZLIB)
6221                     printf ("       ZLIB, ");
6222                   else
6223                     printf (_("       [<unknown>: 0x%x], "),
6224                             chdr.ch_type);
6225                   print_vma (chdr.ch_size, LONG_HEX);
6226                   printf (", %lu\n", (unsigned long) chdr.ch_addralign);
6227                 }
6228             }
6229         }
6230     }
6231
6232   if (!do_section_details)
6233     {
6234       /* The ordering of the letters shown here matches the ordering of the
6235          corresponding SHF_xxx values, and hence the order in which these
6236          letters will be displayed to the user.  */
6237       printf (_("Key to Flags:\n\
6238   W (write), A (alloc), X (execute), M (merge), S (strings), I (info),\n\
6239   L (link order), O (extra OS processing required), G (group), T (TLS),\n\
6240   C (compressed), x (unknown), o (OS specific), E (exclude),\n  "));
6241       if (elf_header.e_machine == EM_X86_64
6242           || elf_header.e_machine == EM_L1OM
6243           || elf_header.e_machine == EM_K1OM)
6244         printf (_("l (large), "));
6245       else if (elf_header.e_machine == EM_ARM)
6246         printf (_("y (purecode), "));
6247       printf ("p (processor specific)\n");
6248     }
6249
6250   return 1;
6251 }
6252
6253 static const char *
6254 get_group_flags (unsigned int flags)
6255 {
6256   static char buff[32];
6257   switch (flags)
6258     {
6259     case 0:
6260       return "";
6261
6262     case GRP_COMDAT:
6263       return "COMDAT ";
6264
6265    default:
6266       snprintf (buff, sizeof (buff), _("[<unknown>: 0x%x] "), flags);
6267       break;
6268     }
6269   return buff;
6270 }
6271
6272 static int
6273 process_section_groups (FILE * file)
6274 {
6275   Elf_Internal_Shdr * section;
6276   unsigned int i;
6277   struct group * group;
6278   Elf_Internal_Shdr * symtab_sec;
6279   Elf_Internal_Shdr * strtab_sec;
6280   Elf_Internal_Sym * symtab;
6281   unsigned long num_syms;
6282   char * strtab;
6283   size_t strtab_size;
6284
6285   /* Don't process section groups unless needed.  */
6286   if (!do_unwind && !do_section_groups)
6287     return 1;
6288
6289   if (elf_header.e_shnum == 0)
6290     {
6291       if (do_section_groups)
6292         printf (_("\nThere are no sections to group in this file.\n"));
6293
6294       return 1;
6295     }
6296
6297   if (section_headers == NULL)
6298     {
6299       error (_("Section headers are not available!\n"));
6300       /* PR 13622: This can happen with a corrupt ELF header.  */
6301       return 0;
6302     }
6303
6304   section_headers_groups = (struct group **) calloc (elf_header.e_shnum,
6305                                                      sizeof (struct group *));
6306
6307   if (section_headers_groups == NULL)
6308     {
6309       error (_("Out of memory reading %u section group headers\n"),
6310              elf_header.e_shnum);
6311       return 0;
6312     }
6313
6314   /* Scan the sections for the group section.  */
6315   group_count = 0;
6316   for (i = 0, section = section_headers;
6317        i < elf_header.e_shnum;
6318        i++, section++)
6319     if (section->sh_type == SHT_GROUP)
6320       group_count++;
6321
6322   if (group_count == 0)
6323     {
6324       if (do_section_groups)
6325         printf (_("\nThere are no section groups in this file.\n"));
6326
6327       return 1;
6328     }
6329
6330   section_groups = (struct group *) calloc (group_count, sizeof (struct group));
6331
6332   if (section_groups == NULL)
6333     {
6334       error (_("Out of memory reading %lu groups\n"),
6335              (unsigned long) group_count);
6336       return 0;
6337     }
6338
6339   symtab_sec = NULL;
6340   strtab_sec = NULL;
6341   symtab = NULL;
6342   num_syms = 0;
6343   strtab = NULL;
6344   strtab_size = 0;
6345   for (i = 0, section = section_headers, group = section_groups;
6346        i < elf_header.e_shnum;
6347        i++, section++)
6348     {
6349       if (section->sh_type == SHT_GROUP)
6350         {
6351           const char * name = printable_section_name (section);
6352           const char * group_name;
6353           unsigned char * start;
6354           unsigned char * indices;
6355           unsigned int entry, j, size;
6356           Elf_Internal_Shdr * sec;
6357           Elf_Internal_Sym * sym;
6358
6359           /* Get the symbol table.  */
6360           if (section->sh_link >= elf_header.e_shnum
6361               || ((sec = section_headers + section->sh_link)->sh_type
6362                   != SHT_SYMTAB))
6363             {
6364               error (_("Bad sh_link in group section `%s'\n"), name);
6365               continue;
6366             }
6367
6368           if (symtab_sec != sec)
6369             {
6370               symtab_sec = sec;
6371               if (symtab)
6372                 free (symtab);
6373               symtab = GET_ELF_SYMBOLS (file, symtab_sec, & num_syms);
6374             }
6375
6376           if (symtab == NULL)
6377             {
6378               error (_("Corrupt header in group section `%s'\n"), name);
6379               continue;
6380             }
6381
6382           if (section->sh_info >= num_syms)
6383             {
6384               error (_("Bad sh_info in group section `%s'\n"), name);
6385               continue;
6386             }
6387
6388           sym = symtab + section->sh_info;
6389
6390           if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
6391             {
6392               if (sym->st_shndx == 0
6393                   || sym->st_shndx >= elf_header.e_shnum)
6394                 {
6395                   error (_("Bad sh_info in group section `%s'\n"), name);
6396                   continue;
6397                 }
6398
6399               group_name = SECTION_NAME (section_headers + sym->st_shndx);
6400               strtab_sec = NULL;
6401               if (strtab)
6402                 free (strtab);
6403               strtab = NULL;
6404               strtab_size = 0;
6405             }
6406           else
6407             {
6408               /* Get the string table.  */
6409               if (symtab_sec->sh_link >= elf_header.e_shnum)
6410                 {
6411                   strtab_sec = NULL;
6412                   if (strtab)
6413                     free (strtab);
6414                   strtab = NULL;
6415                   strtab_size = 0;
6416                 }
6417               else if (strtab_sec
6418                        != (sec = section_headers + symtab_sec->sh_link))
6419                 {
6420                   strtab_sec = sec;
6421                   if (strtab)
6422                     free (strtab);
6423
6424                   strtab = (char *) get_data (NULL, file, strtab_sec->sh_offset,
6425                                               1, strtab_sec->sh_size,
6426                                               _("string table"));
6427                   strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
6428                 }
6429               group_name = sym->st_name < strtab_size
6430                 ? strtab + sym->st_name : _("<corrupt>");
6431             }
6432
6433           /* PR 17531: file: loop.  */
6434           if (section->sh_entsize > section->sh_size)
6435             {
6436               error (_("Section %s has sh_entsize (0x%lx) which is larger than its size (0x%lx)\n"),
6437                      printable_section_name (section),
6438                      (unsigned long) section->sh_entsize,
6439                      (unsigned long) section->sh_size);
6440               break;
6441             }
6442
6443           start = (unsigned char *) get_data (NULL, file, section->sh_offset,
6444                                               1, section->sh_size,
6445                                               _("section data"));
6446           if (start == NULL)
6447             continue;
6448
6449           indices = start;
6450           size = (section->sh_size / section->sh_entsize) - 1;
6451           entry = byte_get (indices, 4);
6452           indices += 4;
6453
6454           if (do_section_groups)
6455             {
6456               printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
6457                       get_group_flags (entry), i, name, group_name, size);
6458
6459               printf (_("   [Index]    Name\n"));
6460             }
6461
6462           group->group_index = i;
6463
6464           for (j = 0; j < size; j++)
6465             {
6466               struct group_list * g;
6467
6468               entry = byte_get (indices, 4);
6469               indices += 4;
6470
6471               if (entry >= elf_header.e_shnum)
6472                 {
6473                   static unsigned num_group_errors = 0;
6474
6475                   if (num_group_errors ++ < 10)
6476                     {
6477                       error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
6478                              entry, i, elf_header.e_shnum - 1);
6479                       if (num_group_errors == 10)
6480                         warn (_("Futher error messages about overlarge group section indicies suppressed\n"));
6481                     }
6482                   continue;
6483                 }
6484
6485               if (section_headers_groups [entry] != NULL)
6486                 {
6487                   if (entry)
6488                     {
6489                       static unsigned num_errs = 0;
6490
6491                       if (num_errs ++ < 10)
6492                         {
6493                           error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
6494                                  entry, i,
6495                                  section_headers_groups [entry]->group_index);
6496                           if (num_errs == 10)
6497                             warn (_("Further error messages about already contained group sections suppressed\n"));
6498                         }
6499                       continue;
6500                     }
6501                   else
6502                     {
6503                       /* Intel C/C++ compiler may put section 0 in a
6504                          section group. We just warn it the first time
6505                          and ignore it afterwards.  */
6506                       static int warned = 0;
6507                       if (!warned)
6508                         {
6509                           error (_("section 0 in group section [%5u]\n"),
6510                                  section_headers_groups [entry]->group_index);
6511                           warned++;
6512                         }
6513                     }
6514                 }
6515
6516               section_headers_groups [entry] = group;
6517
6518               if (do_section_groups)
6519                 {
6520                   sec = section_headers + entry;
6521                   printf ("   [%5u]   %s\n", entry, printable_section_name (sec));
6522                 }
6523
6524               g = (struct group_list *) xmalloc (sizeof (struct group_list));
6525               g->section_index = entry;
6526               g->next = group->root;
6527               group->root = g;
6528             }
6529
6530           if (start)
6531             free (start);
6532
6533           group++;
6534         }
6535     }
6536
6537   if (symtab)
6538     free (symtab);
6539   if (strtab)
6540     free (strtab);
6541   return 1;
6542 }
6543
6544 /* Data used to display dynamic fixups.  */
6545
6546 struct ia64_vms_dynfixup
6547 {
6548   bfd_vma needed_ident;         /* Library ident number.  */
6549   bfd_vma needed;               /* Index in the dstrtab of the library name.  */
6550   bfd_vma fixup_needed;         /* Index of the library.  */
6551   bfd_vma fixup_rela_cnt;       /* Number of fixups.  */
6552   bfd_vma fixup_rela_off;       /* Fixups offset in the dynamic segment.  */
6553 };
6554
6555 /* Data used to display dynamic relocations.  */
6556
6557 struct ia64_vms_dynimgrela
6558 {
6559   bfd_vma img_rela_cnt;         /* Number of relocations.  */
6560   bfd_vma img_rela_off;         /* Reloc offset in the dynamic segment.  */
6561 };
6562
6563 /* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
6564    library).  */
6565
6566 static void
6567 dump_ia64_vms_dynamic_fixups (FILE *file, struct ia64_vms_dynfixup *fixup,
6568                               const char *strtab, unsigned int strtab_sz)
6569 {
6570   Elf64_External_VMS_IMAGE_FIXUP *imfs;
6571   long i;
6572   const char *lib_name;
6573
6574   imfs = get_data (NULL, file, dynamic_addr + fixup->fixup_rela_off,
6575                    1, fixup->fixup_rela_cnt * sizeof (*imfs),
6576                    _("dynamic section image fixups"));
6577   if (!imfs)
6578     return;
6579
6580   if (fixup->needed < strtab_sz)
6581     lib_name = strtab + fixup->needed;
6582   else
6583     {
6584       warn ("corrupt library name index of 0x%lx found in dynamic entry",
6585             (unsigned long) fixup->needed);
6586       lib_name = "???";
6587     }
6588   printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
6589           (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
6590   printf
6591     (_("Seg Offset           Type                             SymVec DataType\n"));
6592
6593   for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
6594     {
6595       unsigned int type;
6596       const char *rtype;
6597
6598       printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
6599       printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
6600       type = BYTE_GET (imfs [i].type);
6601       rtype = elf_ia64_reloc_type (type);
6602       if (rtype == NULL)
6603         printf (" 0x%08x                       ", type);
6604       else
6605         printf (" %-32s ", rtype);
6606       printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
6607       printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
6608     }
6609
6610   free (imfs);
6611 }
6612
6613 /* Display IA-64 OpenVMS dynamic relocations (used to relocate an image).  */
6614
6615 static void
6616 dump_ia64_vms_dynamic_relocs (FILE *file, struct ia64_vms_dynimgrela *imgrela)
6617 {
6618   Elf64_External_VMS_IMAGE_RELA *imrs;
6619   long i;
6620
6621   imrs = get_data (NULL, file, dynamic_addr + imgrela->img_rela_off,
6622                    1, imgrela->img_rela_cnt * sizeof (*imrs),
6623                    _("dynamic section image relocations"));
6624   if (!imrs)
6625     return;
6626
6627   printf (_("\nImage relocs\n"));
6628   printf
6629     (_("Seg Offset   Type                            Addend            Seg Sym Off\n"));
6630
6631   for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
6632     {
6633       unsigned int type;
6634       const char *rtype;
6635
6636       printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
6637       printf ("%08" BFD_VMA_FMT "x ",
6638               (bfd_vma) BYTE_GET (imrs [i].rela_offset));
6639       type = BYTE_GET (imrs [i].type);
6640       rtype = elf_ia64_reloc_type (type);
6641       if (rtype == NULL)
6642         printf ("0x%08x                      ", type);
6643       else
6644         printf ("%-31s ", rtype);
6645       print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
6646       printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
6647       printf ("%08" BFD_VMA_FMT "x\n",
6648               (bfd_vma) BYTE_GET (imrs [i].sym_offset));
6649     }
6650
6651   free (imrs);
6652 }
6653
6654 /* Display IA-64 OpenVMS dynamic relocations and fixups.  */
6655
6656 static int
6657 process_ia64_vms_dynamic_relocs (FILE *file)
6658 {
6659   struct ia64_vms_dynfixup fixup;
6660   struct ia64_vms_dynimgrela imgrela;
6661   Elf_Internal_Dyn *entry;
6662   int res = 0;
6663   bfd_vma strtab_off = 0;
6664   bfd_vma strtab_sz = 0;
6665   char *strtab = NULL;
6666
6667   memset (&fixup, 0, sizeof (fixup));
6668   memset (&imgrela, 0, sizeof (imgrela));
6669
6670   /* Note: the order of the entries is specified by the OpenVMS specs.  */
6671   for (entry = dynamic_section;
6672        entry < dynamic_section + dynamic_nent;
6673        entry++)
6674     {
6675       switch (entry->d_tag)
6676         {
6677         case DT_IA_64_VMS_STRTAB_OFFSET:
6678           strtab_off = entry->d_un.d_val;
6679           break;
6680         case DT_STRSZ:
6681           strtab_sz = entry->d_un.d_val;
6682           if (strtab == NULL)
6683             strtab = get_data (NULL, file, dynamic_addr + strtab_off,
6684                                1, strtab_sz, _("dynamic string section"));
6685           break;
6686
6687         case DT_IA_64_VMS_NEEDED_IDENT:
6688           fixup.needed_ident = entry->d_un.d_val;
6689           break;
6690         case DT_NEEDED:
6691           fixup.needed = entry->d_un.d_val;
6692           break;
6693         case DT_IA_64_VMS_FIXUP_NEEDED:
6694           fixup.fixup_needed = entry->d_un.d_val;
6695           break;
6696         case DT_IA_64_VMS_FIXUP_RELA_CNT:
6697           fixup.fixup_rela_cnt = entry->d_un.d_val;
6698           break;
6699         case DT_IA_64_VMS_FIXUP_RELA_OFF:
6700           fixup.fixup_rela_off = entry->d_un.d_val;
6701           res++;
6702           dump_ia64_vms_dynamic_fixups (file, &fixup, strtab, strtab_sz);
6703           break;
6704
6705         case DT_IA_64_VMS_IMG_RELA_CNT:
6706           imgrela.img_rela_cnt = entry->d_un.d_val;
6707           break;
6708         case DT_IA_64_VMS_IMG_RELA_OFF:
6709           imgrela.img_rela_off = entry->d_un.d_val;
6710           res++;
6711           dump_ia64_vms_dynamic_relocs (file, &imgrela);
6712           break;
6713
6714         default:
6715           break;
6716         }
6717     }
6718
6719   if (strtab != NULL)
6720     free (strtab);
6721
6722   return res;
6723 }
6724
6725 static struct
6726 {
6727   const char * name;
6728   int reloc;
6729   int size;
6730   int rela;
6731 } dynamic_relocations [] =
6732 {
6733     { "REL", DT_REL, DT_RELSZ, FALSE },
6734     { "RELA", DT_RELA, DT_RELASZ, TRUE },
6735     { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
6736 };
6737
6738 /* Process the reloc section.  */
6739
6740 static int
6741 process_relocs (FILE * file)
6742 {
6743   unsigned long rel_size;
6744   unsigned long rel_offset;
6745
6746
6747   if (!do_reloc)
6748     return 1;
6749
6750   if (do_using_dynamic)
6751     {
6752       int is_rela;
6753       const char * name;
6754       int has_dynamic_reloc;
6755       unsigned int i;
6756
6757       has_dynamic_reloc = 0;
6758
6759       for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
6760         {
6761           is_rela = dynamic_relocations [i].rela;
6762           name = dynamic_relocations [i].name;
6763           rel_size = dynamic_info [dynamic_relocations [i].size];
6764           rel_offset = dynamic_info [dynamic_relocations [i].reloc];
6765
6766           has_dynamic_reloc |= rel_size;
6767
6768           if (is_rela == UNKNOWN)
6769             {
6770               if (dynamic_relocations [i].reloc == DT_JMPREL)
6771                 switch (dynamic_info[DT_PLTREL])
6772                   {
6773                   case DT_REL:
6774                     is_rela = FALSE;
6775                     break;
6776                   case DT_RELA:
6777                     is_rela = TRUE;
6778                     break;
6779                   }
6780             }
6781
6782           if (rel_size)
6783             {
6784               printf
6785                 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
6786                  name, rel_offset, rel_size);
6787
6788               dump_relocations (file,
6789                                 offset_from_vma (file, rel_offset, rel_size),
6790                                 rel_size,
6791                                 dynamic_symbols, num_dynamic_syms,
6792                                 dynamic_strings, dynamic_strings_length,
6793                                 is_rela, 1);
6794             }
6795         }
6796
6797       if (is_ia64_vms ())
6798         has_dynamic_reloc |= process_ia64_vms_dynamic_relocs (file);
6799
6800       if (! has_dynamic_reloc)
6801         printf (_("\nThere are no dynamic relocations in this file.\n"));
6802     }
6803   else
6804     {
6805       Elf_Internal_Shdr * section;
6806       unsigned long i;
6807       int found = 0;
6808
6809       for (i = 0, section = section_headers;
6810            i < elf_header.e_shnum;
6811            i++, section++)
6812         {
6813           if (   section->sh_type != SHT_RELA
6814               && section->sh_type != SHT_REL)
6815             continue;
6816
6817           rel_offset = section->sh_offset;
6818           rel_size   = section->sh_size;
6819
6820           if (rel_size)
6821             {
6822               Elf_Internal_Shdr * strsec;
6823               int is_rela;
6824
6825               printf (_("\nRelocation section "));
6826
6827               if (string_table == NULL)
6828                 printf ("%d", section->sh_name);
6829               else
6830                 printf ("'%s'", printable_section_name (section));
6831
6832               printf (_(" at offset 0x%lx contains %lu entries:\n"),
6833                  rel_offset, (unsigned long) (rel_size / section->sh_entsize));
6834
6835               is_rela = section->sh_type == SHT_RELA;
6836
6837               if (section->sh_link != 0
6838                   && section->sh_link < elf_header.e_shnum)
6839                 {
6840                   Elf_Internal_Shdr * symsec;
6841                   Elf_Internal_Sym *  symtab;
6842                   unsigned long nsyms;
6843                   unsigned long strtablen = 0;
6844                   char * strtab = NULL;
6845
6846                   symsec = section_headers + section->sh_link;
6847                   if (symsec->sh_type != SHT_SYMTAB
6848                       && symsec->sh_type != SHT_DYNSYM)
6849                     continue;
6850
6851                   symtab = GET_ELF_SYMBOLS (file, symsec, & nsyms);
6852
6853                   if (symtab == NULL)
6854                     continue;
6855
6856                   if (symsec->sh_link != 0
6857                       && symsec->sh_link < elf_header.e_shnum)
6858                     {
6859                       strsec = section_headers + symsec->sh_link;
6860
6861                       strtab = (char *) get_data (NULL, file, strsec->sh_offset,
6862                                                   1, strsec->sh_size,
6863                                                   _("string table"));
6864                       strtablen = strtab == NULL ? 0 : strsec->sh_size;
6865                     }
6866
6867                   dump_relocations (file, rel_offset, rel_size,
6868                                     symtab, nsyms, strtab, strtablen,
6869                                     is_rela,
6870                                     symsec->sh_type == SHT_DYNSYM);
6871                   if (strtab)
6872                     free (strtab);
6873                   free (symtab);
6874                 }
6875               else
6876                 dump_relocations (file, rel_offset, rel_size,
6877                                   NULL, 0, NULL, 0, is_rela, 0);
6878
6879               found = 1;
6880             }
6881         }
6882
6883       if (! found)
6884         printf (_("\nThere are no relocations in this file.\n"));
6885     }
6886
6887   return 1;
6888 }
6889
6890 /* An absolute address consists of a section and an offset.  If the
6891    section is NULL, the offset itself is the address, otherwise, the
6892    address equals to LOAD_ADDRESS(section) + offset.  */
6893
6894 struct absaddr
6895 {
6896   unsigned short section;
6897   bfd_vma offset;
6898 };
6899
6900 #define ABSADDR(a) \
6901   ((a).section \
6902    ? section_headers [(a).section].sh_addr + (a).offset \
6903    : (a).offset)
6904
6905 /* Find the nearest symbol at or below ADDR.  Returns the symbol
6906    name, if found, and the offset from the symbol to ADDR.  */
6907
6908 static void
6909 find_symbol_for_address (Elf_Internal_Sym * symtab,
6910                          unsigned long      nsyms,
6911                          const char *       strtab,
6912                          unsigned long      strtab_size,
6913                          struct absaddr     addr,
6914                          const char **      symname,
6915                          bfd_vma *          offset)
6916 {
6917   bfd_vma dist = 0x100000;
6918   Elf_Internal_Sym * sym;
6919   Elf_Internal_Sym * beg;
6920   Elf_Internal_Sym * end;
6921   Elf_Internal_Sym * best = NULL;
6922
6923   REMOVE_ARCH_BITS (addr.offset);
6924   beg = symtab;
6925   end = symtab + nsyms;
6926
6927   while (beg < end)
6928     {
6929       bfd_vma value;
6930
6931       sym = beg + (end - beg) / 2;
6932
6933       value = sym->st_value;
6934       REMOVE_ARCH_BITS (value);
6935
6936       if (sym->st_name != 0
6937           && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
6938           && addr.offset >= value
6939           && addr.offset - value < dist)
6940         {
6941           best = sym;
6942           dist = addr.offset - value;
6943           if (!dist)
6944             break;
6945         }
6946
6947       if (addr.offset < value)
6948         end = sym;
6949       else
6950         beg = sym + 1;
6951     }
6952
6953   if (best)
6954     {
6955       *symname = (best->st_name >= strtab_size
6956                   ? _("<corrupt>") : strtab + best->st_name);
6957       *offset = dist;
6958       return;
6959     }
6960
6961   *symname = NULL;
6962   *offset = addr.offset;
6963 }
6964
6965 static int
6966 symcmp (const void *p, const void *q)
6967 {
6968   Elf_Internal_Sym *sp = (Elf_Internal_Sym *) p;
6969   Elf_Internal_Sym *sq = (Elf_Internal_Sym *) q;
6970
6971   return sp->st_value > sq->st_value ? 1 : (sp->st_value < sq->st_value ? -1 : 0);
6972 }
6973
6974 /* Process the unwind section.  */
6975
6976 #include "unwind-ia64.h"
6977
6978 struct ia64_unw_table_entry
6979 {
6980   struct absaddr start;
6981   struct absaddr end;
6982   struct absaddr info;
6983 };
6984
6985 struct ia64_unw_aux_info
6986 {
6987   struct ia64_unw_table_entry *table;   /* Unwind table.  */
6988   unsigned long table_len;              /* Length of unwind table.  */
6989   unsigned char * info;                 /* Unwind info.  */
6990   unsigned long info_size;              /* Size of unwind info.  */
6991   bfd_vma info_addr;                    /* Starting address of unwind info.  */
6992   bfd_vma seg_base;                     /* Starting address of segment.  */
6993   Elf_Internal_Sym * symtab;            /* The symbol table.  */
6994   unsigned long nsyms;                  /* Number of symbols.  */
6995   Elf_Internal_Sym * funtab;            /* Sorted table of STT_FUNC symbols.  */
6996   unsigned long nfuns;                  /* Number of entries in funtab.  */
6997   char * strtab;                        /* The string table.  */
6998   unsigned long strtab_size;            /* Size of string table.  */
6999 };
7000
7001 static void
7002 dump_ia64_unwind (struct ia64_unw_aux_info * aux)
7003 {
7004   struct ia64_unw_table_entry * tp;
7005   unsigned long j, nfuns;
7006   int in_body;
7007
7008   aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7009   for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7010     if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7011       aux->funtab[nfuns++] = aux->symtab[j];
7012   aux->nfuns = nfuns;
7013   qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7014
7015   for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7016     {
7017       bfd_vma stamp;
7018       bfd_vma offset;
7019       const unsigned char * dp;
7020       const unsigned char * head;
7021       const unsigned char * end;
7022       const char * procname;
7023
7024       find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
7025                                aux->strtab_size, tp->start, &procname, &offset);
7026
7027       fputs ("\n<", stdout);
7028
7029       if (procname)
7030         {
7031           fputs (procname, stdout);
7032
7033           if (offset)
7034             printf ("+%lx", (unsigned long) offset);
7035         }
7036
7037       fputs (">: [", stdout);
7038       print_vma (tp->start.offset, PREFIX_HEX);
7039       fputc ('-', stdout);
7040       print_vma (tp->end.offset, PREFIX_HEX);
7041       printf ("], info at +0x%lx\n",
7042               (unsigned long) (tp->info.offset - aux->seg_base));
7043
7044       /* PR 17531: file: 86232b32.  */
7045       if (aux->info == NULL)
7046         continue;
7047
7048       /* PR 17531: file: 0997b4d1.  */
7049       if ((ABSADDR (tp->info) - aux->info_addr) >= aux->info_size)
7050         {
7051           warn (_("Invalid offset %lx in table entry %ld\n"),
7052                 (long) tp->info.offset, (long) (tp - aux->table));
7053           continue;
7054         }
7055
7056       head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
7057       stamp = byte_get ((unsigned char *) head, sizeof (stamp));
7058
7059       printf ("  v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
7060               (unsigned) UNW_VER (stamp),
7061               (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
7062               UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
7063               UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
7064               (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
7065
7066       if (UNW_VER (stamp) != 1)
7067         {
7068           printf (_("\tUnknown version.\n"));
7069           continue;
7070         }
7071
7072       in_body = 0;
7073       end = head + 8 + eh_addr_size * UNW_LENGTH (stamp);
7074       /* PR 17531: file: 16ceda89.  */
7075       if (end > aux->info + aux->info_size)
7076         end = aux->info + aux->info_size;
7077       for (dp = head + 8; dp < end;)
7078         dp = unw_decode (dp, in_body, & in_body, end);
7079     }
7080
7081   free (aux->funtab);
7082 }
7083
7084 static bfd_boolean
7085 slurp_ia64_unwind_table (FILE * file,
7086                          struct ia64_unw_aux_info * aux,
7087                          Elf_Internal_Shdr * sec)
7088 {
7089   unsigned long size, nrelas, i;
7090   Elf_Internal_Phdr * seg;
7091   struct ia64_unw_table_entry * tep;
7092   Elf_Internal_Shdr * relsec;
7093   Elf_Internal_Rela * rela;
7094   Elf_Internal_Rela * rp;
7095   unsigned char * table;
7096   unsigned char * tp;
7097   Elf_Internal_Sym * sym;
7098   const char * relname;
7099
7100   aux->table_len = 0;
7101
7102   /* First, find the starting address of the segment that includes
7103      this section: */
7104
7105   if (elf_header.e_phnum)
7106     {
7107       if (! get_program_headers (file))
7108           return FALSE;
7109
7110       for (seg = program_headers;
7111            seg < program_headers + elf_header.e_phnum;
7112            ++seg)
7113         {
7114           if (seg->p_type != PT_LOAD)
7115             continue;
7116
7117           if (sec->sh_addr >= seg->p_vaddr
7118               && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7119             {
7120               aux->seg_base = seg->p_vaddr;
7121               break;
7122             }
7123         }
7124     }
7125
7126   /* Second, build the unwind table from the contents of the unwind section:  */
7127   size = sec->sh_size;
7128   table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
7129                                       _("unwind table"));
7130   if (!table)
7131     return FALSE;
7132
7133   aux->table_len = size / (3 * eh_addr_size);
7134   aux->table = (struct ia64_unw_table_entry *)
7135     xcmalloc (aux->table_len, sizeof (aux->table[0]));
7136   tep = aux->table;
7137
7138   for (tp = table; tp <= table + size - (3 * eh_addr_size); ++tep)
7139     {
7140       tep->start.section = SHN_UNDEF;
7141       tep->end.section   = SHN_UNDEF;
7142       tep->info.section  = SHN_UNDEF;
7143       tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7144       tep->end.offset   = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7145       tep->info.offset  = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7146       tep->start.offset += aux->seg_base;
7147       tep->end.offset   += aux->seg_base;
7148       tep->info.offset  += aux->seg_base;
7149     }
7150   free (table);
7151
7152   /* Third, apply any relocations to the unwind table:  */
7153   for (relsec = section_headers;
7154        relsec < section_headers + elf_header.e_shnum;
7155        ++relsec)
7156     {
7157       if (relsec->sh_type != SHT_RELA
7158           || relsec->sh_info >= elf_header.e_shnum
7159           || section_headers + relsec->sh_info != sec)
7160         continue;
7161
7162       if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7163                               & rela, & nrelas))
7164         {
7165           free (aux->table);
7166           aux->table = NULL;
7167           aux->table_len = 0;
7168           return FALSE;
7169         }
7170
7171       for (rp = rela; rp < rela + nrelas; ++rp)
7172         {
7173           relname = elf_ia64_reloc_type (get_reloc_type (rp->r_info));
7174           sym = aux->symtab + get_reloc_symindex (rp->r_info);
7175
7176           /* PR 17531: file: 9fa67536.  */
7177           if (relname == NULL)
7178             {
7179               warn (_("Skipping unknown relocation type: %u\n"), get_reloc_type (rp->r_info));
7180               continue;
7181             }
7182
7183           if (! const_strneq (relname, "R_IA64_SEGREL"))
7184             {
7185               warn (_("Skipping unexpected relocation type: %s\n"), relname);
7186               continue;
7187             }
7188
7189           i = rp->r_offset / (3 * eh_addr_size);
7190
7191           /* PR 17531: file: 5bc8d9bf.  */
7192           if (i >= aux->table_len)
7193             {
7194               warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
7195               continue;
7196             }
7197
7198           switch (rp->r_offset / eh_addr_size % 3)
7199             {
7200             case 0:
7201               aux->table[i].start.section = sym->st_shndx;
7202               aux->table[i].start.offset  = rp->r_addend + sym->st_value;
7203               break;
7204             case 1:
7205               aux->table[i].end.section   = sym->st_shndx;
7206               aux->table[i].end.offset    = rp->r_addend + sym->st_value;
7207               break;
7208             case 2:
7209               aux->table[i].info.section  = sym->st_shndx;
7210               aux->table[i].info.offset   = rp->r_addend + sym->st_value;
7211               break;
7212             default:
7213               break;
7214             }
7215         }
7216
7217       free (rela);
7218     }
7219
7220   return TRUE;
7221 }
7222
7223 static void
7224 ia64_process_unwind (FILE * file)
7225 {
7226   Elf_Internal_Shdr * sec;
7227   Elf_Internal_Shdr * unwsec = NULL;
7228   Elf_Internal_Shdr * strsec;
7229   unsigned long i, unwcount = 0, unwstart = 0;
7230   struct ia64_unw_aux_info aux;
7231
7232   memset (& aux, 0, sizeof (aux));
7233
7234   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7235     {
7236       if (sec->sh_type == SHT_SYMTAB
7237           && sec->sh_link < elf_header.e_shnum)
7238         {
7239           aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
7240
7241           strsec = section_headers + sec->sh_link;
7242           if (aux.strtab != NULL)
7243             {
7244               error (_("Multiple auxillary string tables encountered\n"));
7245               free (aux.strtab);
7246             }
7247           aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
7248                                           1, strsec->sh_size,
7249                                           _("string table"));
7250           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7251         }
7252       else if (sec->sh_type == SHT_IA_64_UNWIND)
7253         unwcount++;
7254     }
7255
7256   if (!unwcount)
7257     printf (_("\nThere are no unwind sections in this file.\n"));
7258
7259   while (unwcount-- > 0)
7260     {
7261       char * suffix;
7262       size_t len, len2;
7263
7264       for (i = unwstart, sec = section_headers + unwstart, unwsec = NULL;
7265            i < elf_header.e_shnum; ++i, ++sec)
7266         if (sec->sh_type == SHT_IA_64_UNWIND)
7267           {
7268             unwsec = sec;
7269             break;
7270           }
7271       /* We have already counted the number of SHT_IA64_UNWIND
7272          sections so the loop above should never fail.  */
7273       assert (unwsec != NULL);
7274
7275       unwstart = i + 1;
7276       len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
7277
7278       if ((unwsec->sh_flags & SHF_GROUP) != 0)
7279         {
7280           /* We need to find which section group it is in.  */
7281           struct group_list * g;
7282
7283           if (section_headers_groups == NULL
7284               || section_headers_groups [i] == NULL)
7285             i = elf_header.e_shnum;
7286           else
7287             {
7288               g = section_headers_groups [i]->root;
7289
7290               for (; g != NULL; g = g->next)
7291                 {
7292                   sec = section_headers + g->section_index;
7293
7294                   if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
7295                     break;
7296                 }
7297
7298               if (g == NULL)
7299                 i = elf_header.e_shnum;
7300             }
7301         }
7302       else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
7303         {
7304           /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO.  */
7305           len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
7306           suffix = SECTION_NAME (unwsec) + len;
7307           for (i = 0, sec = section_headers; i < elf_header.e_shnum;
7308                ++i, ++sec)
7309             if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
7310                 && streq (SECTION_NAME (sec) + len2, suffix))
7311               break;
7312         }
7313       else
7314         {
7315           /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
7316              .IA_64.unwind or BAR -> .IA_64.unwind_info.  */
7317           len = sizeof (ELF_STRING_ia64_unwind) - 1;
7318           len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
7319           suffix = "";
7320           if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
7321             suffix = SECTION_NAME (unwsec) + len;
7322           for (i = 0, sec = section_headers; i < elf_header.e_shnum;
7323                ++i, ++sec)
7324             if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
7325                 && streq (SECTION_NAME (sec) + len2, suffix))
7326               break;
7327         }
7328
7329       if (i == elf_header.e_shnum)
7330         {
7331           printf (_("\nCould not find unwind info section for "));
7332
7333           if (string_table == NULL)
7334             printf ("%d", unwsec->sh_name);
7335           else
7336             printf ("'%s'", printable_section_name (unwsec));
7337         }
7338       else
7339         {
7340           aux.info_addr = sec->sh_addr;
7341           aux.info = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1,
7342                                                  sec->sh_size,
7343                                                  _("unwind info"));
7344           aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
7345
7346           printf (_("\nUnwind section "));
7347
7348           if (string_table == NULL)
7349             printf ("%d", unwsec->sh_name);
7350           else
7351             printf ("'%s'", printable_section_name (unwsec));
7352
7353           printf (_(" at offset 0x%lx contains %lu entries:\n"),
7354                   (unsigned long) unwsec->sh_offset,
7355                   (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
7356
7357           if (slurp_ia64_unwind_table (file, & aux, unwsec)
7358               && aux.table_len > 0)
7359             dump_ia64_unwind (& aux);
7360
7361           if (aux.table)
7362             free ((char *) aux.table);
7363           if (aux.info)
7364             free ((char *) aux.info);
7365           aux.table = NULL;
7366           aux.info = NULL;
7367         }
7368     }
7369
7370   if (aux.symtab)
7371     free (aux.symtab);
7372   if (aux.strtab)
7373     free ((char *) aux.strtab);
7374 }
7375
7376 struct hppa_unw_table_entry
7377   {
7378     struct absaddr start;
7379     struct absaddr end;
7380     unsigned int Cannot_unwind:1;               /* 0 */
7381     unsigned int Millicode:1;                   /* 1 */
7382     unsigned int Millicode_save_sr0:1;          /* 2 */
7383     unsigned int Region_description:2;          /* 3..4 */
7384     unsigned int reserved1:1;                   /* 5 */
7385     unsigned int Entry_SR:1;                    /* 6 */
7386     unsigned int Entry_FR:4;     /* number saved */     /* 7..10 */
7387     unsigned int Entry_GR:5;     /* number saved */     /* 11..15 */
7388     unsigned int Args_stored:1;                 /* 16 */
7389     unsigned int Variable_Frame:1;              /* 17 */
7390     unsigned int Separate_Package_Body:1;       /* 18 */
7391     unsigned int Frame_Extension_Millicode:1;   /* 19 */
7392     unsigned int Stack_Overflow_Check:1;        /* 20 */
7393     unsigned int Two_Instruction_SP_Increment:1;/* 21 */
7394     unsigned int Ada_Region:1;                  /* 22 */
7395     unsigned int cxx_info:1;                    /* 23 */
7396     unsigned int cxx_try_catch:1;               /* 24 */
7397     unsigned int sched_entry_seq:1;             /* 25 */
7398     unsigned int reserved2:1;                   /* 26 */
7399     unsigned int Save_SP:1;                     /* 27 */
7400     unsigned int Save_RP:1;                     /* 28 */
7401     unsigned int Save_MRP_in_frame:1;           /* 29 */
7402     unsigned int extn_ptr_defined:1;            /* 30 */
7403     unsigned int Cleanup_defined:1;             /* 31 */
7404
7405     unsigned int MPE_XL_interrupt_marker:1;     /* 0 */
7406     unsigned int HP_UX_interrupt_marker:1;      /* 1 */
7407     unsigned int Large_frame:1;                 /* 2 */
7408     unsigned int Pseudo_SP_Set:1;               /* 3 */
7409     unsigned int reserved4:1;                   /* 4 */
7410     unsigned int Total_frame_size:27;           /* 5..31 */
7411   };
7412
7413 struct hppa_unw_aux_info
7414 {
7415   struct hppa_unw_table_entry * table;  /* Unwind table.  */
7416   unsigned long table_len;              /* Length of unwind table.  */
7417   bfd_vma seg_base;                     /* Starting address of segment.  */
7418   Elf_Internal_Sym * symtab;            /* The symbol table.  */
7419   unsigned long nsyms;                  /* Number of symbols.  */
7420   Elf_Internal_Sym * funtab;            /* Sorted table of STT_FUNC symbols.  */
7421   unsigned long nfuns;                  /* Number of entries in funtab.  */
7422   char * strtab;                        /* The string table.  */
7423   unsigned long strtab_size;            /* Size of string table.  */
7424 };
7425
7426 static void
7427 dump_hppa_unwind (struct hppa_unw_aux_info * aux)
7428 {
7429   struct hppa_unw_table_entry * tp;
7430   unsigned long j, nfuns;
7431
7432   aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7433   for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7434     if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7435       aux->funtab[nfuns++] = aux->symtab[j];
7436   aux->nfuns = nfuns;
7437   qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7438
7439   for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7440     {
7441       bfd_vma offset;
7442       const char * procname;
7443
7444       find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
7445                                aux->strtab_size, tp->start, &procname,
7446                                &offset);
7447
7448       fputs ("\n<", stdout);
7449
7450       if (procname)
7451         {
7452           fputs (procname, stdout);
7453
7454           if (offset)
7455             printf ("+%lx", (unsigned long) offset);
7456         }
7457
7458       fputs (">: [", stdout);
7459       print_vma (tp->start.offset, PREFIX_HEX);
7460       fputc ('-', stdout);
7461       print_vma (tp->end.offset, PREFIX_HEX);
7462       printf ("]\n\t");
7463
7464 #define PF(_m) if (tp->_m) printf (#_m " ");
7465 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
7466       PF(Cannot_unwind);
7467       PF(Millicode);
7468       PF(Millicode_save_sr0);
7469       /* PV(Region_description);  */
7470       PF(Entry_SR);
7471       PV(Entry_FR);
7472       PV(Entry_GR);
7473       PF(Args_stored);
7474       PF(Variable_Frame);
7475       PF(Separate_Package_Body);
7476       PF(Frame_Extension_Millicode);
7477       PF(Stack_Overflow_Check);
7478       PF(Two_Instruction_SP_Increment);
7479       PF(Ada_Region);
7480       PF(cxx_info);
7481       PF(cxx_try_catch);
7482       PF(sched_entry_seq);
7483       PF(Save_SP);
7484       PF(Save_RP);
7485       PF(Save_MRP_in_frame);
7486       PF(extn_ptr_defined);
7487       PF(Cleanup_defined);
7488       PF(MPE_XL_interrupt_marker);
7489       PF(HP_UX_interrupt_marker);
7490       PF(Large_frame);
7491       PF(Pseudo_SP_Set);
7492       PV(Total_frame_size);
7493 #undef PF
7494 #undef PV
7495     }
7496
7497   printf ("\n");
7498
7499   free (aux->funtab);
7500 }
7501
7502 static int
7503 slurp_hppa_unwind_table (FILE * file,
7504                          struct hppa_unw_aux_info * aux,
7505                          Elf_Internal_Shdr * sec)
7506 {
7507   unsigned long size, unw_ent_size, nentries, nrelas, i;
7508   Elf_Internal_Phdr * seg;
7509   struct hppa_unw_table_entry * tep;
7510   Elf_Internal_Shdr * relsec;
7511   Elf_Internal_Rela * rela;
7512   Elf_Internal_Rela * rp;
7513   unsigned char * table;
7514   unsigned char * tp;
7515   Elf_Internal_Sym * sym;
7516   const char * relname;
7517
7518   /* First, find the starting address of the segment that includes
7519      this section.  */
7520
7521   if (elf_header.e_phnum)
7522     {
7523       if (! get_program_headers (file))
7524         return 0;
7525
7526       for (seg = program_headers;
7527            seg < program_headers + elf_header.e_phnum;
7528            ++seg)
7529         {
7530           if (seg->p_type != PT_LOAD)
7531             continue;
7532
7533           if (sec->sh_addr >= seg->p_vaddr
7534               && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7535             {
7536               aux->seg_base = seg->p_vaddr;
7537               break;
7538             }
7539         }
7540     }
7541
7542   /* Second, build the unwind table from the contents of the unwind
7543      section.  */
7544   size = sec->sh_size;
7545   table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
7546                                       _("unwind table"));
7547   if (!table)
7548     return 0;
7549
7550   unw_ent_size = 16;
7551   nentries = size / unw_ent_size;
7552   size = unw_ent_size * nentries;
7553
7554   tep = aux->table = (struct hppa_unw_table_entry *)
7555       xcmalloc (nentries, sizeof (aux->table[0]));
7556
7557   for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
7558     {
7559       unsigned int tmp1, tmp2;
7560
7561       tep->start.section = SHN_UNDEF;
7562       tep->end.section   = SHN_UNDEF;
7563
7564       tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
7565       tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
7566       tmp1 = byte_get ((unsigned char *) tp + 8, 4);
7567       tmp2 = byte_get ((unsigned char *) tp + 12, 4);
7568
7569       tep->start.offset += aux->seg_base;
7570       tep->end.offset   += aux->seg_base;
7571
7572       tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
7573       tep->Millicode = (tmp1 >> 30) & 0x1;
7574       tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
7575       tep->Region_description = (tmp1 >> 27) & 0x3;
7576       tep->reserved1 = (tmp1 >> 26) & 0x1;
7577       tep->Entry_SR = (tmp1 >> 25) & 0x1;
7578       tep->Entry_FR = (tmp1 >> 21) & 0xf;
7579       tep->Entry_GR = (tmp1 >> 16) & 0x1f;
7580       tep->Args_stored = (tmp1 >> 15) & 0x1;
7581       tep->Variable_Frame = (tmp1 >> 14) & 0x1;
7582       tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
7583       tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
7584       tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
7585       tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
7586       tep->Ada_Region = (tmp1 >> 9) & 0x1;
7587       tep->cxx_info = (tmp1 >> 8) & 0x1;
7588       tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
7589       tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
7590       tep->reserved2 = (tmp1 >> 5) & 0x1;
7591       tep->Save_SP = (tmp1 >> 4) & 0x1;
7592       tep->Save_RP = (tmp1 >> 3) & 0x1;
7593       tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
7594       tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
7595       tep->Cleanup_defined = tmp1 & 0x1;
7596
7597       tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
7598       tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
7599       tep->Large_frame = (tmp2 >> 29) & 0x1;
7600       tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
7601       tep->reserved4 = (tmp2 >> 27) & 0x1;
7602       tep->Total_frame_size = tmp2 & 0x7ffffff;
7603     }
7604   free (table);
7605
7606   /* Third, apply any relocations to the unwind table.  */
7607   for (relsec = section_headers;
7608        relsec < section_headers + elf_header.e_shnum;
7609        ++relsec)
7610     {
7611       if (relsec->sh_type != SHT_RELA
7612           || relsec->sh_info >= elf_header.e_shnum
7613           || section_headers + relsec->sh_info != sec)
7614         continue;
7615
7616       if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7617                               & rela, & nrelas))
7618         return 0;
7619
7620       for (rp = rela; rp < rela + nrelas; ++rp)
7621         {
7622           relname = elf_hppa_reloc_type (get_reloc_type (rp->r_info));
7623           sym = aux->symtab + get_reloc_symindex (rp->r_info);
7624
7625           /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64.  */
7626           if (! const_strneq (relname, "R_PARISC_SEGREL"))
7627             {
7628               warn (_("Skipping unexpected relocation type %s\n"), relname);
7629               continue;
7630             }
7631
7632           i = rp->r_offset / unw_ent_size;
7633
7634           switch ((rp->r_offset % unw_ent_size) / eh_addr_size)
7635             {
7636             case 0:
7637               aux->table[i].start.section = sym->st_shndx;
7638               aux->table[i].start.offset  = sym->st_value + rp->r_addend;
7639               break;
7640             case 1:
7641               aux->table[i].end.section   = sym->st_shndx;
7642               aux->table[i].end.offset    = sym->st_value + rp->r_addend;
7643               break;
7644             default:
7645               break;
7646             }
7647         }
7648
7649       free (rela);
7650     }
7651
7652   aux->table_len = nentries;
7653
7654   return 1;
7655 }
7656
7657 static void
7658 hppa_process_unwind (FILE * file)
7659 {
7660   struct hppa_unw_aux_info aux;
7661   Elf_Internal_Shdr * unwsec = NULL;
7662   Elf_Internal_Shdr * strsec;
7663   Elf_Internal_Shdr * sec;
7664   unsigned long i;
7665
7666   if (string_table == NULL)
7667     return;
7668
7669   memset (& aux, 0, sizeof (aux));
7670
7671   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7672     {
7673       if (sec->sh_type == SHT_SYMTAB
7674           && sec->sh_link < elf_header.e_shnum)
7675         {
7676           aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
7677
7678           strsec = section_headers + sec->sh_link;
7679           if (aux.strtab != NULL)
7680             {
7681               error (_("Multiple auxillary string tables encountered\n"));
7682               free (aux.strtab);
7683             }
7684           aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
7685                                           1, strsec->sh_size,
7686                                           _("string table"));
7687           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7688         }
7689       else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
7690         unwsec = sec;
7691     }
7692
7693   if (!unwsec)
7694     printf (_("\nThere are no unwind sections in this file.\n"));
7695
7696   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7697     {
7698       if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
7699         {
7700           printf (_("\nUnwind section '%s' at offset 0x%lx contains %lu entries:\n"),
7701                   printable_section_name (sec),
7702                   (unsigned long) sec->sh_offset,
7703                   (unsigned long) (sec->sh_size / (2 * eh_addr_size + 8)));
7704
7705           slurp_hppa_unwind_table (file, &aux, sec);
7706           if (aux.table_len > 0)
7707             dump_hppa_unwind (&aux);
7708
7709           if (aux.table)
7710             free ((char *) aux.table);
7711           aux.table = NULL;
7712         }
7713     }
7714
7715   if (aux.symtab)
7716     free (aux.symtab);
7717   if (aux.strtab)
7718     free ((char *) aux.strtab);
7719 }
7720
7721 struct arm_section
7722 {
7723   unsigned char *      data;            /* The unwind data.  */
7724   Elf_Internal_Shdr *  sec;             /* The cached unwind section header.  */
7725   Elf_Internal_Rela *  rela;            /* The cached relocations for this section.  */
7726   unsigned long        nrelas;          /* The number of relocations.  */
7727   unsigned int         rel_type;        /* REL or RELA ?  */
7728   Elf_Internal_Rela *  next_rela;       /* Cyclic pointer to the next reloc to process.  */
7729 };
7730
7731 struct arm_unw_aux_info
7732 {
7733   FILE *              file;             /* The file containing the unwind sections.  */
7734   Elf_Internal_Sym *  symtab;           /* The file's symbol table.  */
7735   unsigned long       nsyms;            /* Number of symbols.  */
7736   Elf_Internal_Sym *  funtab;           /* Sorted table of STT_FUNC symbols.  */
7737   unsigned long       nfuns;            /* Number of these symbols.  */
7738   char *              strtab;           /* The file's string table.  */
7739   unsigned long       strtab_size;      /* Size of string table.  */
7740 };
7741
7742 static const char *
7743 arm_print_vma_and_name (struct arm_unw_aux_info *aux,
7744                         bfd_vma fn, struct absaddr addr)
7745 {
7746   const char *procname;
7747   bfd_vma sym_offset;
7748
7749   if (addr.section == SHN_UNDEF)
7750     addr.offset = fn;
7751
7752   find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
7753                            aux->strtab_size, addr, &procname,
7754                            &sym_offset);
7755
7756   print_vma (fn, PREFIX_HEX);
7757
7758   if (procname)
7759     {
7760       fputs (" <", stdout);
7761       fputs (procname, stdout);
7762
7763       if (sym_offset)
7764         printf ("+0x%lx", (unsigned long) sym_offset);
7765       fputc ('>', stdout);
7766     }
7767
7768   return procname;
7769 }
7770
7771 static void
7772 arm_free_section (struct arm_section *arm_sec)
7773 {
7774   if (arm_sec->data != NULL)
7775     free (arm_sec->data);
7776
7777   if (arm_sec->rela != NULL)
7778     free (arm_sec->rela);
7779 }
7780
7781 /* 1) If SEC does not match the one cached in ARM_SEC, then free the current
7782       cached section and install SEC instead.
7783    2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
7784       and return its valued in * WORDP, relocating if necessary.
7785    3) Update the NEXT_RELA field in ARM_SEC and store the section index and
7786       relocation's offset in ADDR.
7787    4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
7788       into the string table of the symbol associated with the reloc.  If no
7789       reloc was applied store -1 there.
7790    5) Return TRUE upon success, FALSE otherwise.  */
7791
7792 static bfd_boolean
7793 get_unwind_section_word (struct arm_unw_aux_info *  aux,
7794                          struct arm_section *       arm_sec,
7795                          Elf_Internal_Shdr *        sec,
7796                          bfd_vma                    word_offset,
7797                          unsigned int *             wordp,
7798                          struct absaddr *           addr,
7799                          bfd_vma *                  sym_name)
7800 {
7801   Elf_Internal_Rela *rp;
7802   Elf_Internal_Sym *sym;
7803   const char * relname;
7804   unsigned int word;
7805   bfd_boolean wrapped;
7806
7807   if (sec == NULL || arm_sec == NULL)
7808     return FALSE;
7809
7810   addr->section = SHN_UNDEF;
7811   addr->offset = 0;
7812
7813   if (sym_name != NULL)
7814     *sym_name = (bfd_vma) -1;
7815
7816   /* If necessary, update the section cache.  */
7817   if (sec != arm_sec->sec)
7818     {
7819       Elf_Internal_Shdr *relsec;
7820
7821       arm_free_section (arm_sec);
7822
7823       arm_sec->sec = sec;
7824       arm_sec->data = get_data (NULL, aux->file, sec->sh_offset, 1,
7825                                 sec->sh_size, _("unwind data"));
7826       arm_sec->rela = NULL;
7827       arm_sec->nrelas = 0;
7828
7829       for (relsec = section_headers;
7830            relsec < section_headers + elf_header.e_shnum;
7831            ++relsec)
7832         {
7833           if (relsec->sh_info >= elf_header.e_shnum
7834               || section_headers + relsec->sh_info != sec
7835               /* PR 15745: Check the section type as well.  */
7836               || (relsec->sh_type != SHT_REL
7837                   && relsec->sh_type != SHT_RELA))
7838             continue;
7839
7840           arm_sec->rel_type = relsec->sh_type;
7841           if (relsec->sh_type == SHT_REL)
7842             {
7843               if (!slurp_rel_relocs (aux->file, relsec->sh_offset,
7844                                      relsec->sh_size,
7845                                      & arm_sec->rela, & arm_sec->nrelas))
7846                 return FALSE;
7847             }
7848           else /* relsec->sh_type == SHT_RELA */
7849             {
7850               if (!slurp_rela_relocs (aux->file, relsec->sh_offset,
7851                                       relsec->sh_size,
7852                                       & arm_sec->rela, & arm_sec->nrelas))
7853                 return FALSE;
7854             }
7855           break;
7856         }
7857
7858       arm_sec->next_rela = arm_sec->rela;
7859     }
7860
7861   /* If there is no unwind data we can do nothing.  */
7862   if (arm_sec->data == NULL)
7863     return FALSE;
7864
7865   /* If the offset is invalid then fail.  */
7866   if (word_offset > (sec->sh_size - 4)
7867       /* PR 18879 */
7868       || (sec->sh_size < 5 && word_offset >= sec->sh_size)
7869       || ((bfd_signed_vma) word_offset) < 0)
7870     return FALSE;
7871
7872   /* Get the word at the required offset.  */
7873   word = byte_get (arm_sec->data + word_offset, 4);
7874
7875   /* PR 17531: file: id:000001,src:001266+003044,op:splice,rep:128.  */
7876   if (arm_sec->rela == NULL)
7877     {
7878       * wordp = word;
7879       return TRUE;
7880     }
7881
7882   /* Look through the relocs to find the one that applies to the provided offset.  */
7883   wrapped = FALSE;
7884   for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
7885     {
7886       bfd_vma prelval, offset;
7887
7888       if (rp->r_offset > word_offset && !wrapped)
7889         {
7890           rp = arm_sec->rela;
7891           wrapped = TRUE;
7892         }
7893       if (rp->r_offset > word_offset)
7894         break;
7895
7896       if (rp->r_offset & 3)
7897         {
7898           warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
7899                 (unsigned long) rp->r_offset);
7900           continue;
7901         }
7902
7903       if (rp->r_offset < word_offset)
7904         continue;
7905
7906       /* PR 17531: file: 027-161405-0.004  */
7907       if (aux->symtab == NULL)
7908         continue;
7909
7910       if (arm_sec->rel_type == SHT_REL)
7911         {
7912           offset = word & 0x7fffffff;
7913           if (offset & 0x40000000)
7914             offset |= ~ (bfd_vma) 0x7fffffff;
7915         }
7916       else if (arm_sec->rel_type == SHT_RELA)
7917         offset = rp->r_addend;
7918       else
7919         {
7920           error (_("Unknown section relocation type %d encountered\n"),
7921                  arm_sec->rel_type);
7922           break;
7923         }
7924
7925       /* PR 17531 file: 027-1241568-0.004.  */
7926       if (ELF32_R_SYM (rp->r_info) >= aux->nsyms)
7927         {
7928           error (_("Bad symbol index in unwind relocation (%lu > %lu)\n"),
7929                  (unsigned long) ELF32_R_SYM (rp->r_info), aux->nsyms);
7930           break;
7931         }
7932
7933       sym = aux->symtab + ELF32_R_SYM (rp->r_info);
7934       offset += sym->st_value;
7935       prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
7936
7937       /* Check that we are processing the expected reloc type.  */
7938       if (elf_header.e_machine == EM_ARM)
7939         {
7940           relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
7941           if (relname == NULL)
7942             {
7943               warn (_("Skipping unknown ARM relocation type: %d\n"),
7944                     (int) ELF32_R_TYPE (rp->r_info));
7945               continue;
7946             }
7947
7948           if (streq (relname, "R_ARM_NONE"))
7949               continue;
7950
7951           if (! streq (relname, "R_ARM_PREL31"))
7952             {
7953               warn (_("Skipping unexpected ARM relocation type %s\n"), relname);
7954               continue;
7955             }
7956         }
7957       else if (elf_header.e_machine == EM_TI_C6000)
7958         {
7959           relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
7960           if (relname == NULL)
7961             {
7962               warn (_("Skipping unknown C6000 relocation type: %d\n"),
7963                     (int) ELF32_R_TYPE (rp->r_info));
7964               continue;
7965             }
7966
7967           if (streq (relname, "R_C6000_NONE"))
7968             continue;
7969
7970           if (! streq (relname, "R_C6000_PREL31"))
7971             {
7972               warn (_("Skipping unexpected C6000 relocation type %s\n"), relname);
7973               continue;
7974             }
7975
7976           prelval >>= 1;
7977         }
7978       else
7979         {
7980           /* This function currently only supports ARM and TI unwinders.  */
7981           warn (_("Only TI and ARM unwinders are currently supported\n"));
7982           break;
7983         }
7984
7985       word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
7986       addr->section = sym->st_shndx;
7987       addr->offset = offset;
7988
7989       if (sym_name)
7990         * sym_name = sym->st_name;
7991       break;
7992     }
7993
7994   *wordp = word;
7995   arm_sec->next_rela = rp;
7996
7997   return TRUE;
7998 }
7999
8000 static const char *tic6x_unwind_regnames[16] =
8001 {
8002   "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
8003   "A14", "A13", "A12", "A11", "A10",
8004   "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
8005 };
8006
8007 static void
8008 decode_tic6x_unwind_regmask (unsigned int mask)
8009 {
8010   int i;
8011
8012   for (i = 12; mask; mask >>= 1, i--)
8013     {
8014       if (mask & 1)
8015         {
8016           fputs (tic6x_unwind_regnames[i], stdout);
8017           if (mask > 1)
8018             fputs (", ", stdout);
8019         }
8020     }
8021 }
8022
8023 #define ADVANCE                                                 \
8024   if (remaining == 0 && more_words)                             \
8025     {                                                           \
8026       data_offset += 4;                                         \
8027       if (! get_unwind_section_word (aux, data_arm_sec, data_sec,       \
8028                                      data_offset, & word, & addr, NULL))        \
8029         return;                                                 \
8030       remaining = 4;                                            \
8031       more_words--;                                             \
8032     }                                                           \
8033
8034 #define GET_OP(OP)                      \
8035   ADVANCE;                              \
8036   if (remaining)                        \
8037     {                                   \
8038       remaining--;                      \
8039       (OP) = word >> 24;                \
8040       word <<= 8;                       \
8041     }                                   \
8042   else                                  \
8043     {                                   \
8044       printf (_("[Truncated opcode]\n"));       \
8045       return;                           \
8046     }                                   \
8047   printf ("0x%02x ", OP)
8048
8049 static void
8050 decode_arm_unwind_bytecode (struct arm_unw_aux_info *  aux,
8051                             unsigned int               word,
8052                             unsigned int               remaining,
8053                             unsigned int               more_words,
8054                             bfd_vma                    data_offset,
8055                             Elf_Internal_Shdr *        data_sec,
8056                             struct arm_section *       data_arm_sec)
8057 {
8058   struct absaddr addr;
8059
8060   /* Decode the unwinding instructions.  */
8061   while (1)
8062     {
8063       unsigned int op, op2;
8064
8065       ADVANCE;
8066       if (remaining == 0)
8067         break;
8068       remaining--;
8069       op = word >> 24;
8070       word <<= 8;
8071
8072       printf ("  0x%02x ", op);
8073
8074       if ((op & 0xc0) == 0x00)
8075         {
8076           int offset = ((op & 0x3f) << 2) + 4;
8077
8078           printf ("     vsp = vsp + %d", offset);
8079         }
8080       else if ((op & 0xc0) == 0x40)
8081         {
8082           int offset = ((op & 0x3f) << 2) + 4;
8083
8084           printf ("     vsp = vsp - %d", offset);
8085         }
8086       else if ((op & 0xf0) == 0x80)
8087         {
8088           GET_OP (op2);
8089           if (op == 0x80 && op2 == 0)
8090             printf (_("Refuse to unwind"));
8091           else
8092             {
8093               unsigned int mask = ((op & 0x0f) << 8) | op2;
8094               int first = 1;
8095               int i;
8096
8097               printf ("pop {");
8098               for (i = 0; i < 12; i++)
8099                 if (mask & (1 << i))
8100                   {
8101                     if (first)
8102                       first = 0;
8103                     else
8104                       printf (", ");
8105                     printf ("r%d", 4 + i);
8106                   }
8107               printf ("}");
8108             }
8109         }
8110       else if ((op & 0xf0) == 0x90)
8111         {
8112           if (op == 0x9d || op == 0x9f)
8113             printf (_("     [Reserved]"));
8114           else
8115             printf ("     vsp = r%d", op & 0x0f);
8116         }
8117       else if ((op & 0xf0) == 0xa0)
8118         {
8119           int end = 4 + (op & 0x07);
8120           int first = 1;
8121           int i;
8122
8123           printf ("     pop {");
8124           for (i = 4; i <= end; i++)
8125             {
8126               if (first)
8127                 first = 0;
8128               else
8129                 printf (", ");
8130               printf ("r%d", i);
8131             }
8132           if (op & 0x08)
8133             {
8134               if (!first)
8135                 printf (", ");
8136               printf ("r14");
8137             }
8138           printf ("}");
8139         }
8140       else if (op == 0xb0)
8141         printf (_("     finish"));
8142       else if (op == 0xb1)
8143         {
8144           GET_OP (op2);
8145           if (op2 == 0 || (op2 & 0xf0) != 0)
8146             printf (_("[Spare]"));
8147           else
8148             {
8149               unsigned int mask = op2 & 0x0f;
8150               int first = 1;
8151               int i;
8152
8153               printf ("pop {");
8154               for (i = 0; i < 12; i++)
8155                 if (mask & (1 << i))
8156                   {
8157                     if (first)
8158                       first = 0;
8159                     else
8160                       printf (", ");
8161                     printf ("r%d", i);
8162                   }
8163               printf ("}");
8164             }
8165         }
8166       else if (op == 0xb2)
8167         {
8168           unsigned char buf[9];
8169           unsigned int i, len;
8170           unsigned long offset;
8171
8172           for (i = 0; i < sizeof (buf); i++)
8173             {
8174               GET_OP (buf[i]);
8175               if ((buf[i] & 0x80) == 0)
8176                 break;
8177             }
8178           if (i == sizeof (buf))
8179             printf (_("corrupt change to vsp"));
8180           else
8181             {
8182               offset = read_uleb128 (buf, &len, buf + i + 1);
8183               assert (len == i + 1);
8184               offset = offset * 4 + 0x204;
8185               printf ("vsp = vsp + %ld", offset);
8186             }
8187         }
8188       else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
8189         {
8190           unsigned int first, last;
8191
8192           GET_OP (op2);
8193           first = op2 >> 4;
8194           last = op2 & 0x0f;
8195           if (op == 0xc8)
8196             first = first + 16;
8197           printf ("pop {D%d", first);
8198           if (last)
8199             printf ("-D%d", first + last);
8200           printf ("}");
8201         }
8202       else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
8203         {
8204           unsigned int count = op & 0x07;
8205
8206           printf ("pop {D8");
8207           if (count)
8208             printf ("-D%d", 8 + count);
8209           printf ("}");
8210         }
8211       else if (op >= 0xc0 && op <= 0xc5)
8212         {
8213           unsigned int count = op & 0x07;
8214
8215           printf ("     pop {wR10");
8216           if (count)
8217             printf ("-wR%d", 10 + count);
8218           printf ("}");
8219         }
8220       else if (op == 0xc6)
8221         {
8222           unsigned int first, last;
8223
8224           GET_OP (op2);
8225           first = op2 >> 4;
8226           last = op2 & 0x0f;
8227           printf ("pop {wR%d", first);
8228           if (last)
8229             printf ("-wR%d", first + last);
8230           printf ("}");
8231         }
8232       else if (op == 0xc7)
8233         {
8234           GET_OP (op2);
8235           if (op2 == 0 || (op2 & 0xf0) != 0)
8236             printf (_("[Spare]"));
8237           else
8238             {
8239               unsigned int mask = op2 & 0x0f;
8240               int first = 1;
8241               int i;
8242
8243               printf ("pop {");
8244               for (i = 0; i < 4; i++)
8245                 if (mask & (1 << i))
8246                   {
8247                     if (first)
8248                       first = 0;
8249                     else
8250                       printf (", ");
8251                     printf ("wCGR%d", i);
8252                   }
8253               printf ("}");
8254             }
8255         }
8256       else
8257         printf (_("     [unsupported opcode]"));
8258       printf ("\n");
8259     }
8260 }
8261
8262 static void
8263 decode_tic6x_unwind_bytecode (struct arm_unw_aux_info *  aux,
8264                               unsigned int               word,
8265                               unsigned int               remaining,
8266                               unsigned int               more_words,
8267                               bfd_vma                    data_offset,
8268                               Elf_Internal_Shdr *        data_sec,
8269                               struct arm_section *       data_arm_sec)
8270 {
8271   struct absaddr addr;
8272
8273   /* Decode the unwinding instructions.  */
8274   while (1)
8275     {
8276       unsigned int op, op2;
8277
8278       ADVANCE;
8279       if (remaining == 0)
8280         break;
8281       remaining--;
8282       op = word >> 24;
8283       word <<= 8;
8284
8285       printf ("  0x%02x ", op);
8286
8287       if ((op & 0xc0) == 0x00)
8288         {
8289           int offset = ((op & 0x3f) << 3) + 8;
8290           printf ("     sp = sp + %d", offset);
8291         }
8292       else if ((op & 0xc0) == 0x80)
8293         {
8294           GET_OP (op2);
8295           if (op == 0x80 && op2 == 0)
8296             printf (_("Refuse to unwind"));
8297           else
8298             {
8299               unsigned int mask = ((op & 0x1f) << 8) | op2;
8300               if (op & 0x20)
8301                 printf ("pop compact {");
8302               else
8303                 printf ("pop {");
8304
8305               decode_tic6x_unwind_regmask (mask);
8306               printf("}");
8307             }
8308         }
8309       else if ((op & 0xf0) == 0xc0)
8310         {
8311           unsigned int reg;
8312           unsigned int nregs;
8313           unsigned int i;
8314           const char *name;
8315           struct
8316           {
8317               unsigned int offset;
8318               unsigned int reg;
8319           } regpos[16];
8320
8321           /* Scan entire instruction first so that GET_OP output is not
8322              interleaved with disassembly.  */
8323           nregs = 0;
8324           for (i = 0; nregs < (op & 0xf); i++)
8325             {
8326               GET_OP (op2);
8327               reg = op2 >> 4;
8328               if (reg != 0xf)
8329                 {
8330                   regpos[nregs].offset = i * 2;
8331                   regpos[nregs].reg = reg;
8332                   nregs++;
8333                 }
8334
8335               reg = op2 & 0xf;
8336               if (reg != 0xf)
8337                 {
8338                   regpos[nregs].offset = i * 2 + 1;
8339                   regpos[nregs].reg = reg;
8340                   nregs++;
8341                 }
8342             }
8343
8344           printf (_("pop frame {"));
8345           reg = nregs - 1;
8346           for (i = i * 2; i > 0; i--)
8347             {
8348               if (regpos[reg].offset == i - 1)
8349                 {
8350                   name = tic6x_unwind_regnames[regpos[reg].reg];
8351                   if (reg > 0)
8352                     reg--;
8353                 }
8354               else
8355                 name = _("[pad]");
8356
8357               fputs (name, stdout);
8358               if (i > 1)
8359                 printf (", ");
8360             }
8361
8362           printf ("}");
8363         }
8364       else if (op == 0xd0)
8365         printf ("     MOV FP, SP");
8366       else if (op == 0xd1)
8367         printf ("     __c6xabi_pop_rts");
8368       else if (op == 0xd2)
8369         {
8370           unsigned char buf[9];
8371           unsigned int i, len;
8372           unsigned long offset;
8373
8374           for (i = 0; i < sizeof (buf); i++)
8375             {
8376               GET_OP (buf[i]);
8377               if ((buf[i] & 0x80) == 0)
8378                 break;
8379             }
8380           /* PR 17531: file: id:000001,src:001906+004739,op:splice,rep:2.  */
8381           if (i == sizeof (buf))
8382             {
8383               printf ("<corrupt sp adjust>\n");
8384               warn (_("Corrupt stack pointer adjustment detected\n"));
8385               return;
8386             }
8387
8388           offset = read_uleb128 (buf, &len, buf + i + 1);
8389           assert (len == i + 1);
8390           offset = offset * 8 + 0x408;
8391           printf (_("sp = sp + %ld"), offset);
8392         }
8393       else if ((op & 0xf0) == 0xe0)
8394         {
8395           if ((op & 0x0f) == 7)
8396             printf ("     RETURN");
8397           else
8398             printf ("     MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
8399         }
8400       else
8401         {
8402           printf (_("     [unsupported opcode]"));
8403         }
8404       putchar ('\n');
8405     }
8406 }
8407
8408 static bfd_vma
8409 arm_expand_prel31 (bfd_vma word, bfd_vma where)
8410 {
8411   bfd_vma offset;
8412
8413   offset = word & 0x7fffffff;
8414   if (offset & 0x40000000)
8415     offset |= ~ (bfd_vma) 0x7fffffff;
8416
8417   if (elf_header.e_machine == EM_TI_C6000)
8418     offset <<= 1;
8419
8420   return offset + where;
8421 }
8422
8423 static void
8424 decode_arm_unwind (struct arm_unw_aux_info *  aux,
8425                    unsigned int               word,
8426                    unsigned int               remaining,
8427                    bfd_vma                    data_offset,
8428                    Elf_Internal_Shdr *        data_sec,
8429                    struct arm_section *       data_arm_sec)
8430 {
8431   int per_index;
8432   unsigned int more_words = 0;
8433   struct absaddr addr;
8434   bfd_vma sym_name = (bfd_vma) -1;
8435
8436   if (remaining == 0)
8437     {
8438       /* Fetch the first word.
8439          Note - when decoding an object file the address extracted
8440          here will always be 0.  So we also pass in the sym_name
8441          parameter so that we can find the symbol associated with
8442          the personality routine.  */
8443       if (! get_unwind_section_word (aux, data_arm_sec, data_sec, data_offset,
8444                                      & word, & addr, & sym_name))
8445         return;
8446
8447       remaining = 4;
8448     }
8449
8450   if ((word & 0x80000000) == 0)
8451     {
8452       /* Expand prel31 for personality routine.  */
8453       bfd_vma fn;
8454       const char *procname;
8455
8456       fn = arm_expand_prel31 (word, data_sec->sh_addr + data_offset);
8457       printf (_("  Personality routine: "));
8458       if (fn == 0
8459           && addr.section == SHN_UNDEF && addr.offset == 0
8460           && sym_name != (bfd_vma) -1 && sym_name < aux->strtab_size)
8461         {
8462           procname = aux->strtab + sym_name;
8463           print_vma (fn, PREFIX_HEX);
8464           if (procname)
8465             {
8466               fputs (" <", stdout);
8467               fputs (procname, stdout);
8468               fputc ('>', stdout);
8469             }
8470         }
8471       else
8472         procname = arm_print_vma_and_name (aux, fn, addr);
8473       fputc ('\n', stdout);
8474
8475       /* The GCC personality routines use the standard compact
8476          encoding, starting with one byte giving the number of
8477          words.  */
8478       if (procname != NULL
8479           && (const_strneq (procname, "__gcc_personality_v0")
8480               || const_strneq (procname, "__gxx_personality_v0")
8481               || const_strneq (procname, "__gcj_personality_v0")
8482               || const_strneq (procname, "__gnu_objc_personality_v0")))
8483         {
8484           remaining = 0;
8485           more_words = 1;
8486           ADVANCE;
8487           if (!remaining)
8488             {
8489               printf (_("  [Truncated data]\n"));
8490               return;
8491             }
8492           more_words = word >> 24;
8493           word <<= 8;
8494           remaining--;
8495           per_index = -1;
8496         }
8497       else
8498         return;
8499     }
8500   else
8501     {
8502       /* ARM EHABI Section 6.3:
8503
8504          An exception-handling table entry for the compact model looks like:
8505
8506            31 30-28 27-24 23-0
8507            -- ----- ----- ----
8508             1   0   index Data for personalityRoutine[index]    */
8509
8510       if (elf_header.e_machine == EM_ARM
8511           && (word & 0x70000000))
8512         warn (_("Corrupt ARM compact model table entry: %x \n"), word);
8513
8514       per_index = (word >> 24) & 0x7f;
8515       printf (_("  Compact model index: %d\n"), per_index);
8516       if (per_index == 0)
8517         {
8518           more_words = 0;
8519           word <<= 8;
8520           remaining--;
8521         }
8522       else if (per_index < 3)
8523         {
8524           more_words = (word >> 16) & 0xff;
8525           word <<= 16;
8526           remaining -= 2;
8527         }
8528     }
8529
8530   switch (elf_header.e_machine)
8531     {
8532     case EM_ARM:
8533       if (per_index < 3)
8534         {
8535           decode_arm_unwind_bytecode (aux, word, remaining, more_words,
8536                                       data_offset, data_sec, data_arm_sec);
8537         }
8538       else
8539         {
8540           warn (_("Unknown ARM compact model index encountered\n"));
8541           printf (_("  [reserved]\n"));
8542         }
8543       break;
8544
8545     case EM_TI_C6000:
8546       if (per_index < 3)
8547         {
8548           decode_tic6x_unwind_bytecode (aux, word, remaining, more_words,
8549                                         data_offset, data_sec, data_arm_sec);
8550         }
8551       else if (per_index < 5)
8552         {
8553           if (((word >> 17) & 0x7f) == 0x7f)
8554             printf (_("  Restore stack from frame pointer\n"));
8555           else
8556             printf (_("  Stack increment %d\n"), (word >> 14) & 0x1fc);
8557           printf (_("  Registers restored: "));
8558           if (per_index == 4)
8559             printf (" (compact) ");
8560           decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
8561           putchar ('\n');
8562           printf (_("  Return register: %s\n"),
8563                   tic6x_unwind_regnames[word & 0xf]);
8564         }
8565       else
8566         printf (_("  [reserved (%d)]\n"), per_index);
8567       break;
8568
8569     default:
8570       error (_("Unsupported architecture type %d encountered when decoding unwind table\n"),
8571              elf_header.e_machine);
8572     }
8573
8574   /* Decode the descriptors.  Not implemented.  */
8575 }
8576
8577 static void
8578 dump_arm_unwind (struct arm_unw_aux_info *aux, Elf_Internal_Shdr *exidx_sec)
8579 {
8580   struct arm_section exidx_arm_sec, extab_arm_sec;
8581   unsigned int i, exidx_len;
8582   unsigned long j, nfuns;
8583
8584   memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
8585   memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
8586   exidx_len = exidx_sec->sh_size / 8;
8587
8588   aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
8589   for (nfuns = 0, j = 0; j < aux->nsyms; j++)
8590     if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
8591       aux->funtab[nfuns++] = aux->symtab[j];
8592   aux->nfuns = nfuns;
8593   qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
8594
8595   for (i = 0; i < exidx_len; i++)
8596     {
8597       unsigned int exidx_fn, exidx_entry;
8598       struct absaddr fn_addr, entry_addr;
8599       bfd_vma fn;
8600
8601       fputc ('\n', stdout);
8602
8603       if (! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
8604                                      8 * i, & exidx_fn, & fn_addr, NULL)
8605           || ! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
8606                                         8 * i + 4, & exidx_entry, & entry_addr, NULL))
8607         {
8608           free (aux->funtab);
8609           arm_free_section (& exidx_arm_sec);
8610           arm_free_section (& extab_arm_sec);
8611           return;
8612         }
8613
8614       /* ARM EHABI, Section 5:
8615          An index table entry consists of 2 words.
8616          The first word contains a prel31 offset to the start of a function, with bit 31 clear.  */
8617       if (exidx_fn & 0x80000000)
8618         warn (_("corrupt index table entry: %x\n"), exidx_fn);
8619
8620       fn = arm_expand_prel31 (exidx_fn, exidx_sec->sh_addr + 8 * i);
8621
8622       arm_print_vma_and_name (aux, fn, fn_addr);
8623       fputs (": ", stdout);
8624
8625       if (exidx_entry == 1)
8626         {
8627           print_vma (exidx_entry, PREFIX_HEX);
8628           fputs (" [cantunwind]\n", stdout);
8629         }
8630       else if (exidx_entry & 0x80000000)
8631         {
8632           print_vma (exidx_entry, PREFIX_HEX);
8633           fputc ('\n', stdout);
8634           decode_arm_unwind (aux, exidx_entry, 4, 0, NULL, NULL);
8635         }
8636       else
8637         {
8638           bfd_vma table, table_offset = 0;
8639           Elf_Internal_Shdr *table_sec;
8640
8641           fputs ("@", stdout);
8642           table = arm_expand_prel31 (exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
8643           print_vma (table, PREFIX_HEX);
8644           printf ("\n");
8645
8646           /* Locate the matching .ARM.extab.  */
8647           if (entry_addr.section != SHN_UNDEF
8648               && entry_addr.section < elf_header.e_shnum)
8649             {
8650               table_sec = section_headers + entry_addr.section;
8651               table_offset = entry_addr.offset;
8652               /* PR 18879 */
8653               if (table_offset > table_sec->sh_size
8654                   || ((bfd_signed_vma) table_offset) < 0)
8655                 {
8656                   warn (_("Unwind entry contains corrupt offset (0x%lx) into section %s\n"),
8657                         (unsigned long) table_offset,
8658                         printable_section_name (table_sec));
8659                   continue;
8660                 }
8661             }
8662           else
8663             {
8664               table_sec = find_section_by_address (table);
8665               if (table_sec != NULL)
8666                 table_offset = table - table_sec->sh_addr;
8667             }
8668           if (table_sec == NULL)
8669             {
8670               warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
8671                     (unsigned long) table);
8672               continue;
8673             }
8674           decode_arm_unwind (aux, 0, 0, table_offset, table_sec,
8675                              &extab_arm_sec);
8676         }
8677     }
8678
8679   printf ("\n");
8680
8681   free (aux->funtab);
8682   arm_free_section (&exidx_arm_sec);
8683   arm_free_section (&extab_arm_sec);
8684 }
8685
8686 /* Used for both ARM and C6X unwinding tables.  */
8687
8688 static void
8689 arm_process_unwind (FILE *file)
8690 {
8691   struct arm_unw_aux_info aux;
8692   Elf_Internal_Shdr *unwsec = NULL;
8693   Elf_Internal_Shdr *strsec;
8694   Elf_Internal_Shdr *sec;
8695   unsigned long i;
8696   unsigned int sec_type;
8697
8698   switch (elf_header.e_machine)
8699     {
8700     case EM_ARM:
8701       sec_type = SHT_ARM_EXIDX;
8702       break;
8703
8704     case EM_TI_C6000:
8705       sec_type = SHT_C6000_UNWIND;
8706       break;
8707
8708     default:
8709       error (_("Unsupported architecture type %d encountered when processing unwind table\n"),
8710              elf_header.e_machine);
8711       return;
8712     }
8713
8714   if (string_table == NULL)
8715     return;
8716
8717   memset (& aux, 0, sizeof (aux));
8718   aux.file = file;
8719
8720   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
8721     {
8722       if (sec->sh_type == SHT_SYMTAB && sec->sh_link < elf_header.e_shnum)
8723         {
8724           aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
8725
8726           strsec = section_headers + sec->sh_link;
8727
8728           /* PR binutils/17531 file: 011-12666-0.004.  */
8729           if (aux.strtab != NULL)
8730             {
8731               error (_("Multiple string tables found in file.\n"));
8732               free (aux.strtab);
8733             }
8734           aux.strtab = get_data (NULL, file, strsec->sh_offset,
8735                                  1, strsec->sh_size, _("string table"));
8736           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
8737         }
8738       else if (sec->sh_type == sec_type)
8739         unwsec = sec;
8740     }
8741
8742   if (unwsec == NULL)
8743     printf (_("\nThere are no unwind sections in this file.\n"));
8744   else
8745     for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
8746       {
8747         if (sec->sh_type == sec_type)
8748           {
8749             printf (_("\nUnwind table index '%s' at offset 0x%lx contains %lu entries:\n"),
8750                     printable_section_name (sec),
8751                     (unsigned long) sec->sh_offset,
8752                     (unsigned long) (sec->sh_size / (2 * eh_addr_size)));
8753
8754             dump_arm_unwind (&aux, sec);
8755           }
8756       }
8757
8758   if (aux.symtab)
8759     free (aux.symtab);
8760   if (aux.strtab)
8761     free ((char *) aux.strtab);
8762 }
8763
8764 static void
8765 process_unwind (FILE * file)
8766 {
8767   struct unwind_handler
8768   {
8769     int machtype;
8770     void (* handler)(FILE *);
8771   } handlers[] =
8772   {
8773     { EM_ARM, arm_process_unwind },
8774     { EM_IA_64, ia64_process_unwind },
8775     { EM_PARISC, hppa_process_unwind },
8776     { EM_TI_C6000, arm_process_unwind },
8777     { 0, 0 }
8778   };
8779   int i;
8780
8781   if (!do_unwind)
8782     return;
8783
8784   for (i = 0; handlers[i].handler != NULL; i++)
8785     if (elf_header.e_machine == handlers[i].machtype)
8786       {
8787         handlers[i].handler (file);
8788         return;
8789       }
8790
8791   printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
8792           get_machine_name (elf_header.e_machine));
8793 }
8794
8795 static void
8796 dynamic_section_mips_val (Elf_Internal_Dyn * entry)
8797 {
8798   switch (entry->d_tag)
8799     {
8800     case DT_MIPS_FLAGS:
8801       if (entry->d_un.d_val == 0)
8802         printf (_("NONE"));
8803       else
8804         {
8805           static const char * opts[] =
8806           {
8807             "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
8808             "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
8809             "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
8810             "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
8811             "RLD_ORDER_SAFE"
8812           };
8813           unsigned int cnt;
8814           int first = 1;
8815
8816           for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
8817             if (entry->d_un.d_val & (1 << cnt))
8818               {
8819                 printf ("%s%s", first ? "" : " ", opts[cnt]);
8820                 first = 0;
8821               }
8822         }
8823       break;
8824
8825     case DT_MIPS_IVERSION:
8826       if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
8827         printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry->d_un.d_val));
8828       else
8829         {
8830           char buf[40];
8831           sprintf_vma (buf, entry->d_un.d_ptr);
8832           /* Note: coded this way so that there is a single string for translation.  */
8833           printf (_("<corrupt: %s>"), buf);
8834         }
8835       break;
8836
8837     case DT_MIPS_TIME_STAMP:
8838       {
8839         char timebuf[128];
8840         struct tm * tmp;
8841         time_t atime = entry->d_un.d_val;
8842
8843         tmp = gmtime (&atime);
8844         /* PR 17531: file: 6accc532.  */
8845         if (tmp == NULL)
8846           snprintf (timebuf, sizeof (timebuf), _("<corrupt>"));
8847         else
8848           snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
8849                     tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
8850                     tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
8851         printf (_("Time Stamp: %s"), timebuf);
8852       }
8853       break;
8854
8855     case DT_MIPS_RLD_VERSION:
8856     case DT_MIPS_LOCAL_GOTNO:
8857     case DT_MIPS_CONFLICTNO:
8858     case DT_MIPS_LIBLISTNO:
8859     case DT_MIPS_SYMTABNO:
8860     case DT_MIPS_UNREFEXTNO:
8861     case DT_MIPS_HIPAGENO:
8862     case DT_MIPS_DELTA_CLASS_NO:
8863     case DT_MIPS_DELTA_INSTANCE_NO:
8864     case DT_MIPS_DELTA_RELOC_NO:
8865     case DT_MIPS_DELTA_SYM_NO:
8866     case DT_MIPS_DELTA_CLASSSYM_NO:
8867     case DT_MIPS_COMPACT_SIZE:
8868       print_vma (entry->d_un.d_val, DEC);
8869       break;
8870
8871     default:
8872       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8873     }
8874     putchar ('\n');
8875 }
8876
8877 static void
8878 dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
8879 {
8880   switch (entry->d_tag)
8881     {
8882     case DT_HP_DLD_FLAGS:
8883       {
8884         static struct
8885         {
8886           long int bit;
8887           const char * str;
8888         }
8889         flags[] =
8890         {
8891           { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
8892           { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
8893           { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
8894           { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
8895           { DT_HP_BIND_NOW, "HP_BIND_NOW" },
8896           { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
8897           { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
8898           { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
8899           { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
8900           { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
8901           { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
8902           { DT_HP_GST, "HP_GST" },
8903           { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
8904           { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
8905           { DT_HP_NODELETE, "HP_NODELETE" },
8906           { DT_HP_GROUP, "HP_GROUP" },
8907           { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
8908         };
8909         int first = 1;
8910         size_t cnt;
8911         bfd_vma val = entry->d_un.d_val;
8912
8913         for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
8914           if (val & flags[cnt].bit)
8915             {
8916               if (! first)
8917                 putchar (' ');
8918               fputs (flags[cnt].str, stdout);
8919               first = 0;
8920               val ^= flags[cnt].bit;
8921             }
8922
8923         if (val != 0 || first)
8924           {
8925             if (! first)
8926               putchar (' ');
8927             print_vma (val, HEX);
8928           }
8929       }
8930       break;
8931
8932     default:
8933       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8934       break;
8935     }
8936   putchar ('\n');
8937 }
8938
8939 #ifdef BFD64
8940
8941 /* VMS vs Unix time offset and factor.  */
8942
8943 #define VMS_EPOCH_OFFSET 35067168000000000LL
8944 #define VMS_GRANULARITY_FACTOR 10000000
8945
8946 /* Display a VMS time in a human readable format.  */
8947
8948 static void
8949 print_vms_time (bfd_int64_t vmstime)
8950 {
8951   struct tm *tm;
8952   time_t unxtime;
8953
8954   unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
8955   tm = gmtime (&unxtime);
8956   printf ("%04u-%02u-%02uT%02u:%02u:%02u",
8957           tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
8958           tm->tm_hour, tm->tm_min, tm->tm_sec);
8959 }
8960 #endif /* BFD64 */
8961
8962 static void
8963 dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
8964 {
8965   switch (entry->d_tag)
8966     {
8967     case DT_IA_64_PLT_RESERVE:
8968       /* First 3 slots reserved.  */
8969       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8970       printf (" -- ");
8971       print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
8972       break;
8973
8974     case DT_IA_64_VMS_LINKTIME:
8975 #ifdef BFD64
8976       print_vms_time (entry->d_un.d_val);
8977 #endif
8978       break;
8979
8980     case DT_IA_64_VMS_LNKFLAGS:
8981       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8982       if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
8983         printf (" CALL_DEBUG");
8984       if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
8985         printf (" NOP0BUFS");
8986       if (entry->d_un.d_val & VMS_LF_P0IMAGE)
8987         printf (" P0IMAGE");
8988       if (entry->d_un.d_val & VMS_LF_MKTHREADS)
8989         printf (" MKTHREADS");
8990       if (entry->d_un.d_val & VMS_LF_UPCALLS)
8991         printf (" UPCALLS");
8992       if (entry->d_un.d_val & VMS_LF_IMGSTA)
8993         printf (" IMGSTA");
8994       if (entry->d_un.d_val & VMS_LF_INITIALIZE)
8995         printf (" INITIALIZE");
8996       if (entry->d_un.d_val & VMS_LF_MAIN)
8997         printf (" MAIN");
8998       if (entry->d_un.d_val & VMS_LF_EXE_INIT)
8999         printf (" EXE_INIT");
9000       if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
9001         printf (" TBK_IN_IMG");
9002       if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
9003         printf (" DBG_IN_IMG");
9004       if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
9005         printf (" TBK_IN_DSF");
9006       if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
9007         printf (" DBG_IN_DSF");
9008       if (entry->d_un.d_val & VMS_LF_SIGNATURES)
9009         printf (" SIGNATURES");
9010       if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
9011         printf (" REL_SEG_OFF");
9012       break;
9013
9014     default:
9015       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9016       break;
9017     }
9018   putchar ('\n');
9019 }
9020
9021 static int
9022 get_32bit_dynamic_section (FILE * file)
9023 {
9024   Elf32_External_Dyn * edyn;
9025   Elf32_External_Dyn * ext;
9026   Elf_Internal_Dyn * entry;
9027
9028   edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
9029                                           dynamic_size, _("dynamic section"));
9030   if (!edyn)
9031     return 0;
9032
9033   /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9034      might not have the luxury of section headers.  Look for the DT_NULL
9035      terminator to determine the number of entries.  */
9036   for (ext = edyn, dynamic_nent = 0;
9037        (char *) (ext + 1) <= (char *) edyn + dynamic_size;
9038        ext++)
9039     {
9040       dynamic_nent++;
9041       if (BYTE_GET (ext->d_tag) == DT_NULL)
9042         break;
9043     }
9044
9045   dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9046                                                   sizeof (* entry));
9047   if (dynamic_section == NULL)
9048     {
9049       error (_("Out of memory allocating space for %lu dynamic entries\n"),
9050              (unsigned long) dynamic_nent);
9051       free (edyn);
9052       return 0;
9053     }
9054
9055   for (ext = edyn, entry = dynamic_section;
9056        entry < dynamic_section + dynamic_nent;
9057        ext++, entry++)
9058     {
9059       entry->d_tag      = BYTE_GET (ext->d_tag);
9060       entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
9061     }
9062
9063   free (edyn);
9064
9065   return 1;
9066 }
9067
9068 static int
9069 get_64bit_dynamic_section (FILE * file)
9070 {
9071   Elf64_External_Dyn * edyn;
9072   Elf64_External_Dyn * ext;
9073   Elf_Internal_Dyn * entry;
9074
9075   /* Read in the data.  */
9076   edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
9077                                           dynamic_size, _("dynamic section"));
9078   if (!edyn)
9079     return 0;
9080
9081   /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9082      might not have the luxury of section headers.  Look for the DT_NULL
9083      terminator to determine the number of entries.  */
9084   for (ext = edyn, dynamic_nent = 0;
9085        /* PR 17533 file: 033-67080-0.004 - do not read past end of buffer.  */
9086        (char *) (ext + 1) <= (char *) edyn + dynamic_size;
9087        ext++)
9088     {
9089       dynamic_nent++;
9090       if (BYTE_GET (ext->d_tag) == DT_NULL)
9091         break;
9092     }
9093
9094   dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9095                                                   sizeof (* entry));
9096   if (dynamic_section == NULL)
9097     {
9098       error (_("Out of memory allocating space for %lu dynamic entries\n"),
9099              (unsigned long) dynamic_nent);
9100       free (edyn);
9101       return 0;
9102     }
9103
9104   /* Convert from external to internal formats.  */
9105   for (ext = edyn, entry = dynamic_section;
9106        entry < dynamic_section + dynamic_nent;
9107        ext++, entry++)
9108     {
9109       entry->d_tag      = BYTE_GET (ext->d_tag);
9110       entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
9111     }
9112
9113   free (edyn);
9114
9115   return 1;
9116 }
9117
9118 static void
9119 print_dynamic_flags (bfd_vma flags)
9120 {
9121   int first = 1;
9122
9123   while (flags)
9124     {
9125       bfd_vma flag;
9126
9127       flag = flags & - flags;
9128       flags &= ~ flag;
9129
9130       if (first)
9131         first = 0;
9132       else
9133         putc (' ', stdout);
9134
9135       switch (flag)
9136         {
9137         case DF_ORIGIN:         fputs ("ORIGIN", stdout); break;
9138         case DF_SYMBOLIC:       fputs ("SYMBOLIC", stdout); break;
9139         case DF_TEXTREL:        fputs ("TEXTREL", stdout); break;
9140         case DF_BIND_NOW:       fputs ("BIND_NOW", stdout); break;
9141         case DF_STATIC_TLS:     fputs ("STATIC_TLS", stdout); break;
9142         default:                fputs (_("unknown"), stdout); break;
9143         }
9144     }
9145   puts ("");
9146 }
9147
9148 /* Parse and display the contents of the dynamic section.  */
9149
9150 static int
9151 process_dynamic_section (FILE * file)
9152 {
9153   Elf_Internal_Dyn * entry;
9154
9155   if (dynamic_size == 0)
9156     {
9157       if (do_dynamic)
9158         printf (_("\nThere is no dynamic section in this file.\n"));
9159
9160       return 1;
9161     }
9162
9163   if (is_32bit_elf)
9164     {
9165       if (! get_32bit_dynamic_section (file))
9166         return 0;
9167     }
9168   else if (! get_64bit_dynamic_section (file))
9169     return 0;
9170
9171   /* Find the appropriate symbol table.  */
9172   if (dynamic_symbols == NULL)
9173     {
9174       for (entry = dynamic_section;
9175            entry < dynamic_section + dynamic_nent;
9176            ++entry)
9177         {
9178           Elf_Internal_Shdr section;
9179
9180           if (entry->d_tag != DT_SYMTAB)
9181             continue;
9182
9183           dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
9184
9185           /* Since we do not know how big the symbol table is,
9186              we default to reading in the entire file (!) and
9187              processing that.  This is overkill, I know, but it
9188              should work.  */
9189           section.sh_offset = offset_from_vma (file, entry->d_un.d_val, 0);
9190
9191           if (archive_file_offset != 0)
9192             section.sh_size = archive_file_size - section.sh_offset;
9193           else
9194             {
9195               if (fseek (file, 0, SEEK_END))
9196                 error (_("Unable to seek to end of file!\n"));
9197
9198               section.sh_size = ftell (file) - section.sh_offset;
9199             }
9200
9201           if (is_32bit_elf)
9202             section.sh_entsize = sizeof (Elf32_External_Sym);
9203           else
9204             section.sh_entsize = sizeof (Elf64_External_Sym);
9205           section.sh_name = string_table_length;
9206
9207           dynamic_symbols = GET_ELF_SYMBOLS (file, &section, & num_dynamic_syms);
9208           if (num_dynamic_syms < 1)
9209             {
9210               error (_("Unable to determine the number of symbols to load\n"));
9211               continue;
9212             }
9213         }
9214     }
9215
9216   /* Similarly find a string table.  */
9217   if (dynamic_strings == NULL)
9218     {
9219       for (entry = dynamic_section;
9220            entry < dynamic_section + dynamic_nent;
9221            ++entry)
9222         {
9223           unsigned long offset;
9224           long str_tab_len;
9225
9226           if (entry->d_tag != DT_STRTAB)
9227             continue;
9228
9229           dynamic_info[DT_STRTAB] = entry->d_un.d_val;
9230
9231           /* Since we do not know how big the string table is,
9232              we default to reading in the entire file (!) and
9233              processing that.  This is overkill, I know, but it
9234              should work.  */
9235
9236           offset = offset_from_vma (file, entry->d_un.d_val, 0);
9237
9238           if (archive_file_offset != 0)
9239             str_tab_len = archive_file_size - offset;
9240           else
9241             {
9242               if (fseek (file, 0, SEEK_END))
9243                 error (_("Unable to seek to end of file\n"));
9244               str_tab_len = ftell (file) - offset;
9245             }
9246
9247           if (str_tab_len < 1)
9248             {
9249               error
9250                 (_("Unable to determine the length of the dynamic string table\n"));
9251               continue;
9252             }
9253
9254           dynamic_strings = (char *) get_data (NULL, file, offset, 1,
9255                                                str_tab_len,
9256                                                _("dynamic string table"));
9257           dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
9258           break;
9259         }
9260     }
9261
9262   /* And find the syminfo section if available.  */
9263   if (dynamic_syminfo == NULL)
9264     {
9265       unsigned long syminsz = 0;
9266
9267       for (entry = dynamic_section;
9268            entry < dynamic_section + dynamic_nent;
9269            ++entry)
9270         {
9271           if (entry->d_tag == DT_SYMINENT)
9272             {
9273               /* Note: these braces are necessary to avoid a syntax
9274                  error from the SunOS4 C compiler.  */
9275               /* PR binutils/17531: A corrupt file can trigger this test.
9276                  So do not use an assert, instead generate an error message.  */
9277               if (sizeof (Elf_External_Syminfo) != entry->d_un.d_val)
9278                 error (_("Bad value (%d) for SYMINENT entry\n"),
9279                        (int) entry->d_un.d_val);
9280             }
9281           else if (entry->d_tag == DT_SYMINSZ)
9282             syminsz = entry->d_un.d_val;
9283           else if (entry->d_tag == DT_SYMINFO)
9284             dynamic_syminfo_offset = offset_from_vma (file, entry->d_un.d_val,
9285                                                       syminsz);
9286         }
9287
9288       if (dynamic_syminfo_offset != 0 && syminsz != 0)
9289         {
9290           Elf_External_Syminfo * extsyminfo;
9291           Elf_External_Syminfo * extsym;
9292           Elf_Internal_Syminfo * syminfo;
9293
9294           /* There is a syminfo section.  Read the data.  */
9295           extsyminfo = (Elf_External_Syminfo *)
9296               get_data (NULL, file, dynamic_syminfo_offset, 1, syminsz,
9297                         _("symbol information"));
9298           if (!extsyminfo)
9299             return 0;
9300
9301           dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
9302           if (dynamic_syminfo == NULL)
9303             {
9304               error (_("Out of memory allocating %lu byte for dynamic symbol info\n"),
9305                      (unsigned long) syminsz);
9306               return 0;
9307             }
9308
9309           dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
9310           for (syminfo = dynamic_syminfo, extsym = extsyminfo;
9311                syminfo < dynamic_syminfo + dynamic_syminfo_nent;
9312                ++syminfo, ++extsym)
9313             {
9314               syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
9315               syminfo->si_flags = BYTE_GET (extsym->si_flags);
9316             }
9317
9318           free (extsyminfo);
9319         }
9320     }
9321
9322   if (do_dynamic && dynamic_addr)
9323     printf (_("\nDynamic section at offset 0x%lx contains %lu entries:\n"),
9324             dynamic_addr, (unsigned long) dynamic_nent);
9325   if (do_dynamic)
9326     printf (_("  Tag        Type                         Name/Value\n"));
9327
9328   for (entry = dynamic_section;
9329        entry < dynamic_section + dynamic_nent;
9330        entry++)
9331     {
9332       if (do_dynamic)
9333         {
9334           const char * dtype;
9335
9336           putchar (' ');
9337           print_vma (entry->d_tag, FULL_HEX);
9338           dtype = get_dynamic_type (entry->d_tag);
9339           printf (" (%s)%*s", dtype,
9340                   ((is_32bit_elf ? 27 : 19)
9341                    - (int) strlen (dtype)),
9342                   " ");
9343         }
9344
9345       switch (entry->d_tag)
9346         {
9347         case DT_FLAGS:
9348           if (do_dynamic)
9349             print_dynamic_flags (entry->d_un.d_val);
9350           break;
9351
9352         case DT_AUXILIARY:
9353         case DT_FILTER:
9354         case DT_CONFIG:
9355         case DT_DEPAUDIT:
9356         case DT_AUDIT:
9357           if (do_dynamic)
9358             {
9359               switch (entry->d_tag)
9360                 {
9361                 case DT_AUXILIARY:
9362                   printf (_("Auxiliary library"));
9363                   break;
9364
9365                 case DT_FILTER:
9366                   printf (_("Filter library"));
9367                   break;
9368
9369                 case DT_CONFIG:
9370                   printf (_("Configuration file"));
9371                   break;
9372
9373                 case DT_DEPAUDIT:
9374                   printf (_("Dependency audit library"));
9375                   break;
9376
9377                 case DT_AUDIT:
9378                   printf (_("Audit library"));
9379                   break;
9380                 }
9381
9382               if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9383                 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
9384               else
9385                 {
9386                   printf (": ");
9387                   print_vma (entry->d_un.d_val, PREFIX_HEX);
9388                   putchar ('\n');
9389                 }
9390             }
9391           break;
9392
9393         case DT_FEATURE:
9394           if (do_dynamic)
9395             {
9396               printf (_("Flags:"));
9397
9398               if (entry->d_un.d_val == 0)
9399                 printf (_(" None\n"));
9400               else
9401                 {
9402                   unsigned long int val = entry->d_un.d_val;
9403
9404                   if (val & DTF_1_PARINIT)
9405                     {
9406                       printf (" PARINIT");
9407                       val ^= DTF_1_PARINIT;
9408                     }
9409                   if (val & DTF_1_CONFEXP)
9410                     {
9411                       printf (" CONFEXP");
9412                       val ^= DTF_1_CONFEXP;
9413                     }
9414                   if (val != 0)
9415                     printf (" %lx", val);
9416                   puts ("");
9417                 }
9418             }
9419           break;
9420
9421         case DT_POSFLAG_1:
9422           if (do_dynamic)
9423             {
9424               printf (_("Flags:"));
9425
9426               if (entry->d_un.d_val == 0)
9427                 printf (_(" None\n"));
9428               else
9429                 {
9430                   unsigned long int val = entry->d_un.d_val;
9431
9432                   if (val & DF_P1_LAZYLOAD)
9433                     {
9434                       printf (" LAZYLOAD");
9435                       val ^= DF_P1_LAZYLOAD;
9436                     }
9437                   if (val & DF_P1_GROUPPERM)
9438                     {
9439                       printf (" GROUPPERM");
9440                       val ^= DF_P1_GROUPPERM;
9441                     }
9442                   if (val != 0)
9443                     printf (" %lx", val);
9444                   puts ("");
9445                 }
9446             }
9447           break;
9448
9449         case DT_FLAGS_1:
9450           if (do_dynamic)
9451             {
9452               printf (_("Flags:"));
9453               if (entry->d_un.d_val == 0)
9454                 printf (_(" None\n"));
9455               else
9456                 {
9457                   unsigned long int val = entry->d_un.d_val;
9458
9459                   if (val & DF_1_NOW)
9460                     {
9461                       printf (" NOW");
9462                       val ^= DF_1_NOW;
9463                     }
9464                   if (val & DF_1_GLOBAL)
9465                     {
9466                       printf (" GLOBAL");
9467                       val ^= DF_1_GLOBAL;
9468                     }
9469                   if (val & DF_1_GROUP)
9470                     {
9471                       printf (" GROUP");
9472                       val ^= DF_1_GROUP;
9473                     }
9474                   if (val & DF_1_NODELETE)
9475                     {
9476                       printf (" NODELETE");
9477                       val ^= DF_1_NODELETE;
9478                     }
9479                   if (val & DF_1_LOADFLTR)
9480                     {
9481                       printf (" LOADFLTR");
9482                       val ^= DF_1_LOADFLTR;
9483                     }
9484                   if (val & DF_1_INITFIRST)
9485                     {
9486                       printf (" INITFIRST");
9487                       val ^= DF_1_INITFIRST;
9488                     }
9489                   if (val & DF_1_NOOPEN)
9490                     {
9491                       printf (" NOOPEN");
9492                       val ^= DF_1_NOOPEN;
9493                     }
9494                   if (val & DF_1_ORIGIN)
9495                     {
9496                       printf (" ORIGIN");
9497                       val ^= DF_1_ORIGIN;
9498                     }
9499                   if (val & DF_1_DIRECT)
9500                     {
9501                       printf (" DIRECT");
9502                       val ^= DF_1_DIRECT;
9503                     }
9504                   if (val & DF_1_TRANS)
9505                     {
9506                       printf (" TRANS");
9507                       val ^= DF_1_TRANS;
9508                     }
9509                   if (val & DF_1_INTERPOSE)
9510                     {
9511                       printf (" INTERPOSE");
9512                       val ^= DF_1_INTERPOSE;
9513                     }
9514                   if (val & DF_1_NODEFLIB)
9515                     {
9516                       printf (" NODEFLIB");
9517                       val ^= DF_1_NODEFLIB;
9518                     }
9519                   if (val & DF_1_NODUMP)
9520                     {
9521                       printf (" NODUMP");
9522                       val ^= DF_1_NODUMP;
9523                     }
9524                   if (val & DF_1_CONFALT)
9525                     {
9526                       printf (" CONFALT");
9527                       val ^= DF_1_CONFALT;
9528                     }
9529                   if (val & DF_1_ENDFILTEE)
9530                     {
9531                       printf (" ENDFILTEE");
9532                       val ^= DF_1_ENDFILTEE;
9533                     }
9534                   if (val & DF_1_DISPRELDNE)
9535                     {
9536                       printf (" DISPRELDNE");
9537                       val ^= DF_1_DISPRELDNE;
9538                     }
9539                   if (val & DF_1_DISPRELPND)
9540                     {
9541                       printf (" DISPRELPND");
9542                       val ^= DF_1_DISPRELPND;
9543                     }
9544                   if (val & DF_1_NODIRECT)
9545                     {
9546                       printf (" NODIRECT");
9547                       val ^= DF_1_NODIRECT;
9548                     }
9549                   if (val & DF_1_IGNMULDEF)
9550                     {
9551                       printf (" IGNMULDEF");
9552                       val ^= DF_1_IGNMULDEF;
9553                     }
9554                   if (val & DF_1_NOKSYMS)
9555                     {
9556                       printf (" NOKSYMS");
9557                       val ^= DF_1_NOKSYMS;
9558                     }
9559                   if (val & DF_1_NOHDR)
9560                     {
9561                       printf (" NOHDR");
9562                       val ^= DF_1_NOHDR;
9563                     }
9564                   if (val & DF_1_EDITED)
9565                     {
9566                       printf (" EDITED");
9567                       val ^= DF_1_EDITED;
9568                     }
9569                   if (val & DF_1_NORELOC)
9570                     {
9571                       printf (" NORELOC");
9572                       val ^= DF_1_NORELOC;
9573                     }
9574                   if (val & DF_1_SYMINTPOSE)
9575                     {
9576                       printf (" SYMINTPOSE");
9577                       val ^= DF_1_SYMINTPOSE;
9578                     }
9579                   if (val & DF_1_GLOBAUDIT)
9580                     {
9581                       printf (" GLOBAUDIT");
9582                       val ^= DF_1_GLOBAUDIT;
9583                     }
9584                   if (val & DF_1_SINGLETON)
9585                     {
9586                       printf (" SINGLETON");
9587                       val ^= DF_1_SINGLETON;
9588                     }
9589                   if (val & DF_1_STUB)
9590                     {
9591                       printf (" STUB");
9592                       val ^= DF_1_STUB;
9593                     }
9594                   if (val & DF_1_PIE)
9595                     {
9596                       printf (" PIE");
9597                       val ^= DF_1_PIE;
9598                     }
9599                   if (val != 0)
9600                     printf (" %lx", val);
9601                   puts ("");
9602                 }
9603             }
9604           break;
9605
9606         case DT_PLTREL:
9607           dynamic_info[entry->d_tag] = entry->d_un.d_val;
9608           if (do_dynamic)
9609             puts (get_dynamic_type (entry->d_un.d_val));
9610           break;
9611
9612         case DT_NULL    :
9613         case DT_NEEDED  :
9614         case DT_PLTGOT  :
9615         case DT_HASH    :
9616         case DT_STRTAB  :
9617         case DT_SYMTAB  :
9618         case DT_RELA    :
9619         case DT_INIT    :
9620         case DT_FINI    :
9621         case DT_SONAME  :
9622         case DT_RPATH   :
9623         case DT_SYMBOLIC:
9624         case DT_REL     :
9625         case DT_DEBUG   :
9626         case DT_TEXTREL :
9627         case DT_JMPREL  :
9628         case DT_RUNPATH :
9629           dynamic_info[entry->d_tag] = entry->d_un.d_val;
9630
9631           if (do_dynamic)
9632             {
9633               char * name;
9634
9635               if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9636                 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
9637               else
9638                 name = NULL;
9639
9640               if (name)
9641                 {
9642                   switch (entry->d_tag)
9643                     {
9644                     case DT_NEEDED:
9645                       printf (_("Shared library: [%s]"), name);
9646
9647                       if (streq (name, program_interpreter))
9648                         printf (_(" program interpreter"));
9649                       break;
9650
9651                     case DT_SONAME:
9652                       printf (_("Library soname: [%s]"), name);
9653                       break;
9654
9655                     case DT_RPATH:
9656                       printf (_("Library rpath: [%s]"), name);
9657                       break;
9658
9659                     case DT_RUNPATH:
9660                       printf (_("Library runpath: [%s]"), name);
9661                       break;
9662
9663                     default:
9664                       print_vma (entry->d_un.d_val, PREFIX_HEX);
9665                       break;
9666                     }
9667                 }
9668               else
9669                 print_vma (entry->d_un.d_val, PREFIX_HEX);
9670
9671               putchar ('\n');
9672             }
9673           break;
9674
9675         case DT_PLTRELSZ:
9676         case DT_RELASZ  :
9677         case DT_STRSZ   :
9678         case DT_RELSZ   :
9679         case DT_RELAENT :
9680         case DT_SYMENT  :
9681         case DT_RELENT  :
9682           dynamic_info[entry->d_tag] = entry->d_un.d_val;
9683           /* Fall through.  */
9684         case DT_PLTPADSZ:
9685         case DT_MOVEENT :
9686         case DT_MOVESZ  :
9687         case DT_INIT_ARRAYSZ:
9688         case DT_FINI_ARRAYSZ:
9689         case DT_GNU_CONFLICTSZ:
9690         case DT_GNU_LIBLISTSZ:
9691           if (do_dynamic)
9692             {
9693               print_vma (entry->d_un.d_val, UNSIGNED);
9694               printf (_(" (bytes)\n"));
9695             }
9696           break;
9697
9698         case DT_VERDEFNUM:
9699         case DT_VERNEEDNUM:
9700         case DT_RELACOUNT:
9701         case DT_RELCOUNT:
9702           if (do_dynamic)
9703             {
9704               print_vma (entry->d_un.d_val, UNSIGNED);
9705               putchar ('\n');
9706             }
9707           break;
9708
9709         case DT_SYMINSZ:
9710         case DT_SYMINENT:
9711         case DT_SYMINFO:
9712         case DT_USED:
9713         case DT_INIT_ARRAY:
9714         case DT_FINI_ARRAY:
9715           if (do_dynamic)
9716             {
9717               if (entry->d_tag == DT_USED
9718                   && VALID_DYNAMIC_NAME (entry->d_un.d_val))
9719                 {
9720                   char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
9721
9722                   if (*name)
9723                     {
9724                       printf (_("Not needed object: [%s]\n"), name);
9725                       break;
9726                     }
9727                 }
9728
9729               print_vma (entry->d_un.d_val, PREFIX_HEX);
9730               putchar ('\n');
9731             }
9732           break;
9733
9734         case DT_BIND_NOW:
9735           /* The value of this entry is ignored.  */
9736           if (do_dynamic)
9737             putchar ('\n');
9738           break;
9739
9740         case DT_GNU_PRELINKED:
9741           if (do_dynamic)
9742             {
9743               struct tm * tmp;
9744               time_t atime = entry->d_un.d_val;
9745
9746               tmp = gmtime (&atime);
9747               /* PR 17533 file: 041-1244816-0.004.  */
9748               if (tmp == NULL)
9749                 printf (_("<corrupt time val: %lx"),
9750                         (unsigned long) atime);
9751               else
9752                 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
9753                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9754                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
9755
9756             }
9757           break;
9758
9759         case DT_GNU_HASH:
9760           dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
9761           if (do_dynamic)
9762             {
9763               print_vma (entry->d_un.d_val, PREFIX_HEX);
9764               putchar ('\n');
9765             }
9766           break;
9767
9768         default:
9769           if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
9770             version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
9771               entry->d_un.d_val;
9772
9773           if (do_dynamic)
9774             {
9775               switch (elf_header.e_machine)
9776                 {
9777                 case EM_MIPS:
9778                 case EM_MIPS_RS3_LE:
9779                   dynamic_section_mips_val (entry);
9780                   break;
9781                 case EM_PARISC:
9782                   dynamic_section_parisc_val (entry);
9783                   break;
9784                 case EM_IA_64:
9785                   dynamic_section_ia64_val (entry);
9786                   break;
9787                 default:
9788                   print_vma (entry->d_un.d_val, PREFIX_HEX);
9789                   putchar ('\n');
9790                 }
9791             }
9792           break;
9793         }
9794     }
9795
9796   return 1;
9797 }
9798
9799 static char *
9800 get_ver_flags (unsigned int flags)
9801 {
9802   static char buff[32];
9803
9804   buff[0] = 0;
9805
9806   if (flags == 0)
9807     return _("none");
9808
9809   if (flags & VER_FLG_BASE)
9810     strcat (buff, "BASE ");
9811
9812   if (flags & VER_FLG_WEAK)
9813     {
9814       if (flags & VER_FLG_BASE)
9815         strcat (buff, "| ");
9816
9817       strcat (buff, "WEAK ");
9818     }
9819
9820   if (flags & VER_FLG_INFO)
9821     {
9822       if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
9823         strcat (buff, "| ");
9824
9825       strcat (buff, "INFO ");
9826     }
9827
9828   if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
9829     strcat (buff, _("| <unknown>"));
9830
9831   return buff;
9832 }
9833
9834 /* Display the contents of the version sections.  */
9835
9836 static int
9837 process_version_sections (FILE * file)
9838 {
9839   Elf_Internal_Shdr * section;
9840   unsigned i;
9841   int found = 0;
9842
9843   if (! do_version)
9844     return 1;
9845
9846   for (i = 0, section = section_headers;
9847        i < elf_header.e_shnum;
9848        i++, section++)
9849     {
9850       switch (section->sh_type)
9851         {
9852         case SHT_GNU_verdef:
9853           {
9854             Elf_External_Verdef * edefs;
9855             unsigned int idx;
9856             unsigned int cnt;
9857             char * endbuf;
9858
9859             found = 1;
9860
9861             printf (_("\nVersion definition section '%s' contains %u entries:\n"),
9862                     printable_section_name (section),
9863                     section->sh_info);
9864
9865             printf (_("  Addr: 0x"));
9866             printf_vma (section->sh_addr);
9867             printf (_("  Offset: %#08lx  Link: %u (%s)"),
9868                     (unsigned long) section->sh_offset, section->sh_link,
9869                     printable_section_name_from_index (section->sh_link));
9870
9871             edefs = (Elf_External_Verdef *)
9872                 get_data (NULL, file, section->sh_offset, 1,section->sh_size,
9873                           _("version definition section"));
9874             if (!edefs)
9875               break;
9876             endbuf = (char *) edefs + section->sh_size;
9877
9878             for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
9879               {
9880                 char * vstart;
9881                 Elf_External_Verdef * edef;
9882                 Elf_Internal_Verdef ent;
9883                 Elf_External_Verdaux * eaux;
9884                 Elf_Internal_Verdaux aux;
9885                 int j;
9886                 int isum;
9887
9888                 /* Check for very large indicies.  */
9889                 if (idx > (size_t) (endbuf - (char *) edefs))
9890                   break;
9891
9892                 vstart = ((char *) edefs) + idx;
9893                 if (vstart + sizeof (*edef) > endbuf)
9894                   break;
9895
9896                 edef = (Elf_External_Verdef *) vstart;
9897
9898                 ent.vd_version = BYTE_GET (edef->vd_version);
9899                 ent.vd_flags   = BYTE_GET (edef->vd_flags);
9900                 ent.vd_ndx     = BYTE_GET (edef->vd_ndx);
9901                 ent.vd_cnt     = BYTE_GET (edef->vd_cnt);
9902                 ent.vd_hash    = BYTE_GET (edef->vd_hash);
9903                 ent.vd_aux     = BYTE_GET (edef->vd_aux);
9904                 ent.vd_next    = BYTE_GET (edef->vd_next);
9905
9906                 printf (_("  %#06x: Rev: %d  Flags: %s"),
9907                         idx, ent.vd_version, get_ver_flags (ent.vd_flags));
9908
9909                 printf (_("  Index: %d  Cnt: %d  "),
9910                         ent.vd_ndx, ent.vd_cnt);
9911
9912                 /* Check for overflow.  */
9913                 if (ent.vd_aux > (size_t) (endbuf - vstart))
9914                   break;
9915
9916                 vstart += ent.vd_aux;
9917
9918                 eaux = (Elf_External_Verdaux *) vstart;
9919
9920                 aux.vda_name = BYTE_GET (eaux->vda_name);
9921                 aux.vda_next = BYTE_GET (eaux->vda_next);
9922
9923                 if (VALID_DYNAMIC_NAME (aux.vda_name))
9924                   printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
9925                 else
9926                   printf (_("Name index: %ld\n"), aux.vda_name);
9927
9928                 isum = idx + ent.vd_aux;
9929
9930                 for (j = 1; j < ent.vd_cnt; j++)
9931                   {
9932                     /* Check for overflow.  */
9933                     if (aux.vda_next > (size_t) (endbuf - vstart))
9934                       break;
9935
9936                     isum   += aux.vda_next;
9937                     vstart += aux.vda_next;
9938
9939                     eaux = (Elf_External_Verdaux *) vstart;
9940                     if (vstart + sizeof (*eaux) > endbuf)
9941                       break;
9942
9943                     aux.vda_name = BYTE_GET (eaux->vda_name);
9944                     aux.vda_next = BYTE_GET (eaux->vda_next);
9945
9946                     if (VALID_DYNAMIC_NAME (aux.vda_name))
9947                       printf (_("  %#06x: Parent %d: %s\n"),
9948                               isum, j, GET_DYNAMIC_NAME (aux.vda_name));
9949                     else
9950                       printf (_("  %#06x: Parent %d, name index: %ld\n"),
9951                               isum, j, aux.vda_name);
9952                   }
9953
9954                 if (j < ent.vd_cnt)
9955                   printf (_("  Version def aux past end of section\n"));
9956
9957                 /* PR 17531: file: id:000001,src:000172+005151,op:splice,rep:2.  */
9958                 if (idx + ent.vd_next <= idx)
9959                   break;
9960
9961                 idx += ent.vd_next;
9962               }
9963
9964             if (cnt < section->sh_info)
9965               printf (_("  Version definition past end of section\n"));
9966
9967             free (edefs);
9968           }
9969           break;
9970
9971         case SHT_GNU_verneed:
9972           {
9973             Elf_External_Verneed * eneed;
9974             unsigned int idx;
9975             unsigned int cnt;
9976             char * endbuf;
9977
9978             found = 1;
9979
9980             printf (_("\nVersion needs section '%s' contains %u entries:\n"),
9981                     printable_section_name (section), section->sh_info);
9982
9983             printf (_(" Addr: 0x"));
9984             printf_vma (section->sh_addr);
9985             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
9986                     (unsigned long) section->sh_offset, section->sh_link,
9987                     printable_section_name_from_index (section->sh_link));
9988
9989             eneed = (Elf_External_Verneed *) get_data (NULL, file,
9990                                                        section->sh_offset, 1,
9991                                                        section->sh_size,
9992                                                        _("Version Needs section"));
9993             if (!eneed)
9994               break;
9995             endbuf = (char *) eneed + section->sh_size;
9996
9997             for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
9998               {
9999                 Elf_External_Verneed * entry;
10000                 Elf_Internal_Verneed ent;
10001                 int j;
10002                 int isum;
10003                 char * vstart;
10004
10005                 if (idx > (size_t) (endbuf - (char *) eneed))
10006                   break;
10007
10008                 vstart = ((char *) eneed) + idx;
10009                 if (vstart + sizeof (*entry) > endbuf)
10010                   break;
10011
10012                 entry = (Elf_External_Verneed *) vstart;
10013
10014                 ent.vn_version = BYTE_GET (entry->vn_version);
10015                 ent.vn_cnt     = BYTE_GET (entry->vn_cnt);
10016                 ent.vn_file    = BYTE_GET (entry->vn_file);
10017                 ent.vn_aux     = BYTE_GET (entry->vn_aux);
10018                 ent.vn_next    = BYTE_GET (entry->vn_next);
10019
10020                 printf (_("  %#06x: Version: %d"), idx, ent.vn_version);
10021
10022                 if (VALID_DYNAMIC_NAME (ent.vn_file))
10023                   printf (_("  File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
10024                 else
10025                   printf (_("  File: %lx"), ent.vn_file);
10026
10027                 printf (_("  Cnt: %d\n"), ent.vn_cnt);
10028
10029                 /* Check for overflow.  */
10030                 if (ent.vn_aux > (size_t) (endbuf - vstart))
10031                   break;
10032                 vstart += ent.vn_aux;
10033
10034                 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
10035                   {
10036                     Elf_External_Vernaux * eaux;
10037                     Elf_Internal_Vernaux aux;
10038
10039                     if (vstart + sizeof (*eaux) > endbuf)
10040                       break;
10041                     eaux = (Elf_External_Vernaux *) vstart;
10042
10043                     aux.vna_hash  = BYTE_GET (eaux->vna_hash);
10044                     aux.vna_flags = BYTE_GET (eaux->vna_flags);
10045                     aux.vna_other = BYTE_GET (eaux->vna_other);
10046                     aux.vna_name  = BYTE_GET (eaux->vna_name);
10047                     aux.vna_next  = BYTE_GET (eaux->vna_next);
10048
10049                     if (VALID_DYNAMIC_NAME (aux.vna_name))
10050                       printf (_("  %#06x:   Name: %s"),
10051                               isum, GET_DYNAMIC_NAME (aux.vna_name));
10052                     else
10053                       printf (_("  %#06x:   Name index: %lx"),
10054                               isum, aux.vna_name);
10055
10056                     printf (_("  Flags: %s  Version: %d\n"),
10057                             get_ver_flags (aux.vna_flags), aux.vna_other);
10058
10059                     /* Check for overflow.  */
10060                     if (aux.vna_next > (size_t) (endbuf - vstart)
10061                         || (aux.vna_next == 0 && j < ent.vn_cnt - 1))
10062                       {
10063                         warn (_("Invalid vna_next field of %lx\n"),
10064                               aux.vna_next);
10065                         j = ent.vn_cnt;
10066                         break;
10067                       }
10068                     isum   += aux.vna_next;
10069                     vstart += aux.vna_next;
10070                   }
10071
10072                 if (j < ent.vn_cnt)
10073                   warn (_("Missing Version Needs auxillary information\n"));
10074
10075                 if (ent.vn_next == 0 && cnt < section->sh_info - 1)
10076                   {
10077                     warn (_("Corrupt Version Needs structure - offset to next structure is zero with entries still left to be processed\n"));
10078                     cnt = section->sh_info;
10079                     break;
10080                   }
10081                 idx += ent.vn_next;
10082               }
10083
10084             if (cnt < section->sh_info)
10085               warn (_("Missing Version Needs information\n"));
10086
10087             free (eneed);
10088           }
10089           break;
10090
10091         case SHT_GNU_versym:
10092           {
10093             Elf_Internal_Shdr * link_section;
10094             size_t total;
10095             unsigned int cnt;
10096             unsigned char * edata;
10097             unsigned short * data;
10098             char * strtab;
10099             Elf_Internal_Sym * symbols;
10100             Elf_Internal_Shdr * string_sec;
10101             unsigned long num_syms;
10102             long off;
10103
10104             if (section->sh_link >= elf_header.e_shnum)
10105               break;
10106
10107             link_section = section_headers + section->sh_link;
10108             total = section->sh_size / sizeof (Elf_External_Versym);
10109
10110             if (link_section->sh_link >= elf_header.e_shnum)
10111               break;
10112
10113             found = 1;
10114
10115             symbols = GET_ELF_SYMBOLS (file, link_section, & num_syms);
10116             if (symbols == NULL)
10117               break;
10118
10119             string_sec = section_headers + link_section->sh_link;
10120
10121             strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
10122                                         string_sec->sh_size,
10123                                         _("version string table"));
10124             if (!strtab)
10125               {
10126                 free (symbols);
10127                 break;
10128               }
10129
10130             printf (_("\nVersion symbols section '%s' contains %lu entries:\n"),
10131                     printable_section_name (section), (unsigned long) total);
10132
10133             printf (_(" Addr: "));
10134             printf_vma (section->sh_addr);
10135             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
10136                     (unsigned long) section->sh_offset, section->sh_link,
10137                     printable_section_name (link_section));
10138
10139             off = offset_from_vma (file,
10140                                    version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10141                                    total * sizeof (short));
10142             edata = (unsigned char *) get_data (NULL, file, off, total,
10143                                                 sizeof (short),
10144                                                 _("version symbol data"));
10145             if (!edata)
10146               {
10147                 free (strtab);
10148                 free (symbols);
10149                 break;
10150               }
10151
10152             data = (short unsigned int *) cmalloc (total, sizeof (short));
10153
10154             for (cnt = total; cnt --;)
10155               data[cnt] = byte_get (edata + cnt * sizeof (short),
10156                                     sizeof (short));
10157
10158             free (edata);
10159
10160             for (cnt = 0; cnt < total; cnt += 4)
10161               {
10162                 int j, nn;
10163                 char *name;
10164                 char *invalid = _("*invalid*");
10165
10166                 printf ("  %03x:", cnt);
10167
10168                 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
10169                   switch (data[cnt + j])
10170                     {
10171                     case 0:
10172                       fputs (_("   0 (*local*)    "), stdout);
10173                       break;
10174
10175                     case 1:
10176                       fputs (_("   1 (*global*)   "), stdout);
10177                       break;
10178
10179                     default:
10180                       nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
10181                                    data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
10182
10183                       /* If this index value is greater than the size of the symbols
10184                          array, break to avoid an out-of-bounds read.  */
10185                       if ((unsigned long)(cnt + j) >= num_syms)
10186                         {
10187                           warn (_("invalid index into symbol array\n"));
10188                           break;
10189                         }
10190
10191                       name = NULL;
10192                       if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
10193                         {
10194                           Elf_Internal_Verneed ivn;
10195                           unsigned long offset;
10196
10197                           offset = offset_from_vma
10198                             (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10199                              sizeof (Elf_External_Verneed));
10200
10201                           do
10202                             {
10203                               Elf_Internal_Vernaux ivna;
10204                               Elf_External_Verneed evn;
10205                               Elf_External_Vernaux evna;
10206                               unsigned long a_off;
10207
10208                               if (get_data (&evn, file, offset, sizeof (evn), 1,
10209                                             _("version need")) == NULL)
10210                                 break;
10211
10212                               ivn.vn_aux  = BYTE_GET (evn.vn_aux);
10213                               ivn.vn_next = BYTE_GET (evn.vn_next);
10214
10215                               a_off = offset + ivn.vn_aux;
10216
10217                               do
10218                                 {
10219                                   if (get_data (&evna, file, a_off, sizeof (evna),
10220                                                 1, _("version need aux (2)")) == NULL)
10221                                     {
10222                                       ivna.vna_next  = 0;
10223                                       ivna.vna_other = 0;
10224                                     }
10225                                   else
10226                                     {
10227                                       ivna.vna_next  = BYTE_GET (evna.vna_next);
10228                                       ivna.vna_other = BYTE_GET (evna.vna_other);
10229                                     }
10230
10231                                   a_off += ivna.vna_next;
10232                                 }
10233                               while (ivna.vna_other != data[cnt + j]
10234                                      && ivna.vna_next != 0);
10235
10236                               if (ivna.vna_other == data[cnt + j])
10237                                 {
10238                                   ivna.vna_name = BYTE_GET (evna.vna_name);
10239
10240                                   if (ivna.vna_name >= string_sec->sh_size)
10241                                     name = invalid;
10242                                   else
10243                                     name = strtab + ivna.vna_name;
10244                                   break;
10245                                 }
10246
10247                               offset += ivn.vn_next;
10248                             }
10249                           while (ivn.vn_next);
10250                         }
10251
10252                       if (data[cnt + j] != 0x8001
10253                           && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10254                         {
10255                           Elf_Internal_Verdef ivd;
10256                           Elf_External_Verdef evd;
10257                           unsigned long offset;
10258
10259                           offset = offset_from_vma
10260                             (file, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10261                              sizeof evd);
10262
10263                           do
10264                             {
10265                               if (get_data (&evd, file, offset, sizeof (evd), 1,
10266                                             _("version def")) == NULL)
10267                                 {
10268                                   ivd.vd_next = 0;
10269                                   /* PR 17531: file: 046-1082287-0.004.  */
10270                                   ivd.vd_ndx  = (data[cnt + j] & VERSYM_VERSION) + 1;
10271                                   break;
10272                                 }
10273                               else
10274                                 {
10275                                   ivd.vd_next = BYTE_GET (evd.vd_next);
10276                                   ivd.vd_ndx  = BYTE_GET (evd.vd_ndx);
10277                                 }
10278
10279                               offset += ivd.vd_next;
10280                             }
10281                           while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
10282                                  && ivd.vd_next != 0);
10283
10284                           if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
10285                             {
10286                               Elf_External_Verdaux evda;
10287                               Elf_Internal_Verdaux ivda;
10288
10289                               ivd.vd_aux = BYTE_GET (evd.vd_aux);
10290
10291                               if (get_data (&evda, file,
10292                                             offset - ivd.vd_next + ivd.vd_aux,
10293                                             sizeof (evda), 1,
10294                                             _("version def aux")) == NULL)
10295                                 break;
10296
10297                               ivda.vda_name = BYTE_GET (evda.vda_name);
10298
10299                               if (ivda.vda_name >= string_sec->sh_size)
10300                                 name = invalid;
10301                               else if (name != NULL && name != invalid)
10302                                 name = _("*both*");
10303                               else
10304                                 name = strtab + ivda.vda_name;
10305                             }
10306                         }
10307                       if (name != NULL)
10308                         nn += printf ("(%s%-*s",
10309                                       name,
10310                                       12 - (int) strlen (name),
10311                                       ")");
10312
10313                       if (nn < 18)
10314                         printf ("%*c", 18 - nn, ' ');
10315                     }
10316
10317                 putchar ('\n');
10318               }
10319
10320             free (data);
10321             free (strtab);
10322             free (symbols);
10323           }
10324           break;
10325
10326         default:
10327           break;
10328         }
10329     }
10330
10331   if (! found)
10332     printf (_("\nNo version information found in this file.\n"));
10333
10334   return 1;
10335 }
10336
10337 static const char *
10338 get_symbol_binding (unsigned int binding)
10339 {
10340   static char buff[32];
10341
10342   switch (binding)
10343     {
10344     case STB_LOCAL:     return "LOCAL";
10345     case STB_GLOBAL:    return "GLOBAL";
10346     case STB_WEAK:      return "WEAK";
10347     default:
10348       if (binding >= STB_LOPROC && binding <= STB_HIPROC)
10349         snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
10350                   binding);
10351       else if (binding >= STB_LOOS && binding <= STB_HIOS)
10352         {
10353           if (binding == STB_GNU_UNIQUE
10354               && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
10355                   /* GNU is still using the default value 0.  */
10356                   || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10357             return "UNIQUE";
10358           snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
10359         }
10360       else
10361         snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
10362       return buff;
10363     }
10364 }
10365
10366 static const char *
10367 get_symbol_type (unsigned int type)
10368 {
10369   static char buff[32];
10370
10371   switch (type)
10372     {
10373     case STT_NOTYPE:    return "NOTYPE";
10374     case STT_OBJECT:    return "OBJECT";
10375     case STT_FUNC:      return "FUNC";
10376     case STT_SECTION:   return "SECTION";
10377     case STT_FILE:      return "FILE";
10378     case STT_COMMON:    return "COMMON";
10379     case STT_TLS:       return "TLS";
10380     case STT_RELC:      return "RELC";
10381     case STT_SRELC:     return "SRELC";
10382     default:
10383       if (type >= STT_LOPROC && type <= STT_HIPROC)
10384         {
10385           if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
10386             return "THUMB_FUNC";
10387
10388           if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
10389             return "REGISTER";
10390
10391           if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
10392             return "PARISC_MILLI";
10393
10394           snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
10395         }
10396       else if (type >= STT_LOOS && type <= STT_HIOS)
10397         {
10398           if (elf_header.e_machine == EM_PARISC)
10399             {
10400               if (type == STT_HP_OPAQUE)
10401                 return "HP_OPAQUE";
10402               if (type == STT_HP_STUB)
10403                 return "HP_STUB";
10404             }
10405
10406           if (type == STT_GNU_IFUNC
10407               && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
10408                   || elf_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD
10409                   /* GNU is still using the default value 0.  */
10410                   || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10411             return "IFUNC";
10412
10413           snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
10414         }
10415       else
10416         snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
10417       return buff;
10418     }
10419 }
10420
10421 static const char *
10422 get_symbol_visibility (unsigned int visibility)
10423 {
10424   switch (visibility)
10425     {
10426     case STV_DEFAULT:   return "DEFAULT";
10427     case STV_INTERNAL:  return "INTERNAL";
10428     case STV_HIDDEN:    return "HIDDEN";
10429     case STV_PROTECTED: return "PROTECTED";
10430     default:
10431       error (_("Unrecognized visibility value: %u"), visibility);
10432       return _("<unknown>");
10433     }
10434 }
10435
10436 static const char *
10437 get_solaris_symbol_visibility (unsigned int visibility)
10438 {
10439   switch (visibility)
10440     {
10441     case 4: return "EXPORTED";
10442     case 5: return "SINGLETON";
10443     case 6: return "ELIMINATE";
10444     default: return get_symbol_visibility (visibility);
10445     }
10446 }
10447
10448 static const char *
10449 get_mips_symbol_other (unsigned int other)
10450 {
10451   switch (other)
10452     {
10453     case STO_OPTIONAL:
10454       return "OPTIONAL";
10455     case STO_MIPS_PLT:
10456       return "MIPS PLT";
10457     case STO_MIPS_PIC:
10458       return "MIPS PIC";
10459     case STO_MICROMIPS:
10460       return "MICROMIPS";
10461     case STO_MICROMIPS | STO_MIPS_PIC:
10462       return "MICROMIPS, MIPS PIC";
10463     case STO_MIPS16:
10464       return "MIPS16";
10465     default:
10466       return NULL;
10467     }
10468 }
10469
10470 static const char *
10471 get_ia64_symbol_other (unsigned int other)
10472 {
10473   if (is_ia64_vms ())
10474     {
10475       static char res[32];
10476
10477       res[0] = 0;
10478
10479       /* Function types is for images and .STB files only.  */
10480       switch (elf_header.e_type)
10481         {
10482         case ET_DYN:
10483         case ET_EXEC:
10484           switch (VMS_ST_FUNC_TYPE (other))
10485             {
10486             case VMS_SFT_CODE_ADDR:
10487               strcat (res, " CA");
10488               break;
10489             case VMS_SFT_SYMV_IDX:
10490               strcat (res, " VEC");
10491               break;
10492             case VMS_SFT_FD:
10493               strcat (res, " FD");
10494               break;
10495             case VMS_SFT_RESERVE:
10496               strcat (res, " RSV");
10497               break;
10498             default:
10499               warn (_("Unrecognized IA64 VMS ST Function type: %d\n"),
10500                     VMS_ST_FUNC_TYPE (other));
10501               strcat (res, " <unknown>");
10502               break;
10503             }
10504           break;
10505         default:
10506           break;
10507         }
10508       switch (VMS_ST_LINKAGE (other))
10509         {
10510         case VMS_STL_IGNORE:
10511           strcat (res, " IGN");
10512           break;
10513         case VMS_STL_RESERVE:
10514           strcat (res, " RSV");
10515           break;
10516         case VMS_STL_STD:
10517           strcat (res, " STD");
10518           break;
10519         case VMS_STL_LNK:
10520           strcat (res, " LNK");
10521           break;
10522         default:
10523           warn (_("Unrecognized IA64 VMS ST Linkage: %d\n"),
10524                 VMS_ST_LINKAGE (other));
10525           strcat (res, " <unknown>");
10526           break;
10527         }
10528
10529       if (res[0] != 0)
10530         return res + 1;
10531       else
10532         return res;
10533     }
10534   return NULL;
10535 }
10536
10537 static const char *
10538 get_ppc64_symbol_other (unsigned int other)
10539 {
10540   if (PPC64_LOCAL_ENTRY_OFFSET (other) != 0)
10541     {
10542       static char buf[32];
10543       snprintf (buf, sizeof buf, _("<localentry>: %d"),
10544                 PPC64_LOCAL_ENTRY_OFFSET (other));
10545       return buf;
10546     }
10547   return NULL;
10548 }
10549
10550 static const char *
10551 get_symbol_other (unsigned int other)
10552 {
10553   const char * result = NULL;
10554   static char buff [32];
10555
10556   if (other == 0)
10557     return "";
10558
10559   switch (elf_header.e_machine)
10560     {
10561     case EM_MIPS:
10562       result = get_mips_symbol_other (other);
10563       break;
10564     case EM_IA_64:
10565       result = get_ia64_symbol_other (other);
10566       break;
10567     case EM_PPC64:
10568       result = get_ppc64_symbol_other (other);
10569       break;
10570     default:
10571       result = NULL;
10572       break;
10573     }
10574
10575   if (result)
10576     return result;
10577
10578   snprintf (buff, sizeof buff, _("<other>: %x"), other);
10579   return buff;
10580 }
10581
10582 static const char *
10583 get_symbol_index_type (unsigned int type)
10584 {
10585   static char buff[32];
10586
10587   switch (type)
10588     {
10589     case SHN_UNDEF:     return "UND";
10590     case SHN_ABS:       return "ABS";
10591     case SHN_COMMON:    return "COM";
10592     default:
10593       if (type == SHN_IA_64_ANSI_COMMON
10594           && elf_header.e_machine == EM_IA_64
10595           && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
10596         return "ANSI_COM";
10597       else if ((elf_header.e_machine == EM_X86_64
10598                 || elf_header.e_machine == EM_L1OM
10599                 || elf_header.e_machine == EM_K1OM)
10600                && type == SHN_X86_64_LCOMMON)
10601         return "LARGE_COM";
10602       else if ((type == SHN_MIPS_SCOMMON
10603                 && elf_header.e_machine == EM_MIPS)
10604                || (type == SHN_TIC6X_SCOMMON
10605                    && elf_header.e_machine == EM_TI_C6000))
10606         return "SCOM";
10607       else if (type == SHN_MIPS_SUNDEFINED
10608                && elf_header.e_machine == EM_MIPS)
10609         return "SUND";
10610       else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
10611         sprintf (buff, "PRC[0x%04x]", type & 0xffff);
10612       else if (type >= SHN_LOOS && type <= SHN_HIOS)
10613         sprintf (buff, "OS [0x%04x]", type & 0xffff);
10614       else if (type >= SHN_LORESERVE)
10615         sprintf (buff, "RSV[0x%04x]", type & 0xffff);
10616       else if (type >= elf_header.e_shnum)
10617         sprintf (buff, _("bad section index[%3d]"), type);
10618       else
10619         sprintf (buff, "%3d", type);
10620       break;
10621     }
10622
10623   return buff;
10624 }
10625
10626 static bfd_vma *
10627 get_dynamic_data (FILE * file, bfd_size_type number, unsigned int ent_size)
10628 {
10629   unsigned char * e_data;
10630   bfd_vma * i_data;
10631
10632   /* If the size_t type is smaller than the bfd_size_type, eg because
10633      you are building a 32-bit tool on a 64-bit host, then make sure
10634      that when (number) is cast to (size_t) no information is lost.  */
10635   if (sizeof (size_t) < sizeof (bfd_size_type)
10636       && (bfd_size_type) ((size_t) number) != number)
10637     {
10638       error (_("Size truncation prevents reading %" BFD_VMA_FMT "u"
10639                " elements of size %u\n"),
10640              number, ent_size);
10641       return NULL;
10642     }
10643
10644   /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
10645      attempting to allocate memory when the read is bound to fail.  */
10646   if (ent_size * number > current_file_size)
10647     {
10648       error (_("Invalid number of dynamic entries: %" BFD_VMA_FMT "u\n"),
10649              number);
10650       return NULL;
10651     }
10652
10653   e_data = (unsigned char *) cmalloc ((size_t) number, ent_size);
10654   if (e_data == NULL)
10655     {
10656       error (_("Out of memory reading %" BFD_VMA_FMT "u dynamic entries\n"),
10657              number);
10658       return NULL;
10659     }
10660
10661   if (fread (e_data, ent_size, (size_t) number, file) != number)
10662     {
10663       error (_("Unable to read in %" BFD_VMA_FMT "u bytes of dynamic data\n"),
10664              number * ent_size);
10665       free (e_data);
10666       return NULL;
10667     }
10668
10669   i_data = (bfd_vma *) cmalloc ((size_t) number, sizeof (*i_data));
10670   if (i_data == NULL)
10671     {
10672       error (_("Out of memory allocating space for %" BFD_VMA_FMT "u"
10673                " dynamic entries\n"),
10674              number);
10675       free (e_data);
10676       return NULL;
10677     }
10678
10679   while (number--)
10680     i_data[number] = byte_get (e_data + number * ent_size, ent_size);
10681
10682   free (e_data);
10683
10684   return i_data;
10685 }
10686
10687 static void
10688 print_dynamic_symbol (bfd_vma si, unsigned long hn)
10689 {
10690   Elf_Internal_Sym * psym;
10691   int n;
10692
10693   n = print_vma (si, DEC_5);
10694   if (n < 5)
10695     fputs (&"     "[n], stdout);
10696   printf (" %3lu: ", hn);
10697
10698   if (dynamic_symbols == NULL || si >= num_dynamic_syms)
10699     {
10700       printf (_("<No info available for dynamic symbol number %lu>\n"),
10701               (unsigned long) si);
10702       return;
10703     }
10704
10705   psym = dynamic_symbols + si;
10706   print_vma (psym->st_value, LONG_HEX);
10707   putchar (' ');
10708   print_vma (psym->st_size, DEC_5);
10709
10710   printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
10711   printf (" %-6s",  get_symbol_binding (ELF_ST_BIND (psym->st_info)));
10712
10713   if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
10714     printf (" %-7s",  get_solaris_symbol_visibility (psym->st_other));
10715   else
10716     {
10717       unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
10718
10719       printf (" %-7s",  get_symbol_visibility (vis));
10720       /* Check to see if any other bits in the st_other field are set.
10721          Note - displaying this information disrupts the layout of the
10722          table being generated, but for the moment this case is very
10723          rare.  */
10724       if (psym->st_other ^ vis)
10725         printf (" [%s] ", get_symbol_other (psym->st_other ^ vis));
10726     }
10727
10728   printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
10729   if (VALID_DYNAMIC_NAME (psym->st_name))
10730     print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
10731   else
10732     printf (_(" <corrupt: %14ld>"), psym->st_name);
10733   putchar ('\n');
10734 }
10735
10736 static const char *
10737 get_symbol_version_string (FILE *file, int is_dynsym,
10738                            const char *strtab,
10739                            unsigned long int strtab_size,
10740                            unsigned int si, Elf_Internal_Sym *psym,
10741                            enum versioned_symbol_info *sym_info,
10742                            unsigned short *vna_other)
10743 {
10744   unsigned char data[2];
10745   unsigned short vers_data;
10746   unsigned long offset;
10747
10748   if (!is_dynsym
10749       || version_info[DT_VERSIONTAGIDX (DT_VERSYM)] == 0)
10750     return NULL;
10751
10752   offset = offset_from_vma (file, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10753                             sizeof data + si * sizeof (vers_data));
10754
10755   if (get_data (&data, file, offset + si * sizeof (vers_data),
10756                 sizeof (data), 1, _("version data")) == NULL)
10757     return NULL;
10758
10759   vers_data = byte_get (data, 2);
10760
10761   if ((vers_data & VERSYM_HIDDEN) == 0 && vers_data <= 1)
10762     return NULL;
10763
10764   /* Usually we'd only see verdef for defined symbols, and verneed for
10765      undefined symbols.  However, symbols defined by the linker in
10766      .dynbss for variables copied from a shared library in order to
10767      avoid text relocations are defined yet have verneed.  We could
10768      use a heuristic to detect the special case, for example, check
10769      for verneed first on symbols defined in SHT_NOBITS sections, but
10770      it is simpler and more reliable to just look for both verdef and
10771      verneed.  .dynbss might not be mapped to a SHT_NOBITS section.  */
10772
10773   if (psym->st_shndx != SHN_UNDEF
10774       && vers_data != 0x8001
10775       && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10776     {
10777       Elf_Internal_Verdef ivd;
10778       Elf_Internal_Verdaux ivda;
10779       Elf_External_Verdaux evda;
10780       unsigned long off;
10781
10782       off = offset_from_vma (file,
10783                              version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10784                              sizeof (Elf_External_Verdef));
10785
10786       do
10787         {
10788           Elf_External_Verdef evd;
10789
10790           if (get_data (&evd, file, off, sizeof (evd), 1,
10791                         _("version def")) == NULL)
10792             {
10793               ivd.vd_ndx = 0;
10794               ivd.vd_aux = 0;
10795               ivd.vd_next = 0;
10796             }
10797           else
10798             {
10799               ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
10800               ivd.vd_aux = BYTE_GET (evd.vd_aux);
10801               ivd.vd_next = BYTE_GET (evd.vd_next);
10802             }
10803
10804           off += ivd.vd_next;
10805         }
10806       while (ivd.vd_ndx != (vers_data & VERSYM_VERSION) && ivd.vd_next != 0);
10807
10808       if (ivd.vd_ndx == (vers_data & VERSYM_VERSION))
10809         {
10810           off -= ivd.vd_next;
10811           off += ivd.vd_aux;
10812
10813           if (get_data (&evda, file, off, sizeof (evda), 1,
10814                         _("version def aux")) != NULL)
10815             {
10816               ivda.vda_name = BYTE_GET (evda.vda_name);
10817
10818               if (psym->st_name != ivda.vda_name)
10819                 {
10820                   *sym_info = ((vers_data & VERSYM_HIDDEN) != 0
10821                                ? symbol_hidden : symbol_public);
10822                   return (ivda.vda_name < strtab_size
10823                           ? strtab + ivda.vda_name : _("<corrupt>"));
10824                 }
10825             }
10826         }
10827     }
10828
10829   if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
10830     {
10831       Elf_External_Verneed evn;
10832       Elf_Internal_Verneed ivn;
10833       Elf_Internal_Vernaux ivna;
10834
10835       offset = offset_from_vma (file,
10836                                 version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10837                                 sizeof evn);
10838       do
10839         {
10840           unsigned long vna_off;
10841
10842           if (get_data (&evn, file, offset, sizeof (evn), 1,
10843                         _("version need")) == NULL)
10844             {
10845               ivna.vna_next = 0;
10846               ivna.vna_other = 0;
10847               ivna.vna_name = 0;
10848               break;
10849             }
10850
10851           ivn.vn_aux  = BYTE_GET (evn.vn_aux);
10852           ivn.vn_next = BYTE_GET (evn.vn_next);
10853
10854           vna_off = offset + ivn.vn_aux;
10855
10856           do
10857             {
10858               Elf_External_Vernaux evna;
10859
10860               if (get_data (&evna, file, vna_off, sizeof (evna), 1,
10861                             _("version need aux (3)")) == NULL)
10862                 {
10863                   ivna.vna_next = 0;
10864                   ivna.vna_other = 0;
10865                   ivna.vna_name = 0;
10866                 }
10867               else
10868                 {
10869                   ivna.vna_other = BYTE_GET (evna.vna_other);
10870                   ivna.vna_next  = BYTE_GET (evna.vna_next);
10871                   ivna.vna_name  = BYTE_GET (evna.vna_name);
10872                 }
10873
10874               vna_off += ivna.vna_next;
10875             }
10876           while (ivna.vna_other != vers_data && ivna.vna_next != 0);
10877
10878           if (ivna.vna_other == vers_data)
10879             break;
10880
10881           offset += ivn.vn_next;
10882         }
10883       while (ivn.vn_next != 0);
10884
10885       if (ivna.vna_other == vers_data)
10886         {
10887           *sym_info = symbol_undefined;
10888           *vna_other = ivna.vna_other;
10889           return (ivna.vna_name < strtab_size
10890                   ? strtab + ivna.vna_name : _("<corrupt>"));
10891         }
10892     }
10893   return NULL;
10894 }
10895
10896 /* Dump the symbol table.  */
10897 static int
10898 process_symbol_table (FILE * file)
10899 {
10900   Elf_Internal_Shdr * section;
10901   bfd_size_type nbuckets = 0;
10902   bfd_size_type nchains = 0;
10903   bfd_vma * buckets = NULL;
10904   bfd_vma * chains = NULL;
10905   bfd_vma ngnubuckets = 0;
10906   bfd_vma * gnubuckets = NULL;
10907   bfd_vma * gnuchains = NULL;
10908   bfd_vma gnusymidx = 0;
10909   bfd_size_type ngnuchains = 0;
10910
10911   if (!do_syms && !do_dyn_syms && !do_histogram)
10912     return 1;
10913
10914   if (dynamic_info[DT_HASH]
10915       && (do_histogram
10916           || (do_using_dynamic
10917               && !do_dyn_syms
10918               && dynamic_strings != NULL)))
10919     {
10920       unsigned char nb[8];
10921       unsigned char nc[8];
10922       unsigned int hash_ent_size = 4;
10923
10924       if ((elf_header.e_machine == EM_ALPHA
10925            || elf_header.e_machine == EM_S390
10926            || elf_header.e_machine == EM_S390_OLD)
10927           && elf_header.e_ident[EI_CLASS] == ELFCLASS64)
10928         hash_ent_size = 8;
10929
10930       if (fseek (file,
10931                  (archive_file_offset
10932                   + offset_from_vma (file, dynamic_info[DT_HASH],
10933                                      sizeof nb + sizeof nc)),
10934                  SEEK_SET))
10935         {
10936           error (_("Unable to seek to start of dynamic information\n"));
10937           goto no_hash;
10938         }
10939
10940       if (fread (nb, hash_ent_size, 1, file) != 1)
10941         {
10942           error (_("Failed to read in number of buckets\n"));
10943           goto no_hash;
10944         }
10945
10946       if (fread (nc, hash_ent_size, 1, file) != 1)
10947         {
10948           error (_("Failed to read in number of chains\n"));
10949           goto no_hash;
10950         }
10951
10952       nbuckets = byte_get (nb, hash_ent_size);
10953       nchains  = byte_get (nc, hash_ent_size);
10954
10955       buckets = get_dynamic_data (file, nbuckets, hash_ent_size);
10956       chains  = get_dynamic_data (file, nchains, hash_ent_size);
10957
10958     no_hash:
10959       if (buckets == NULL || chains == NULL)
10960         {
10961           if (do_using_dynamic)
10962             return 0;
10963           free (buckets);
10964           free (chains);
10965           buckets = NULL;
10966           chains = NULL;
10967           nbuckets = 0;
10968           nchains = 0;
10969         }
10970     }
10971
10972   if (dynamic_info_DT_GNU_HASH
10973       && (do_histogram
10974           || (do_using_dynamic
10975               && !do_dyn_syms
10976               && dynamic_strings != NULL)))
10977     {
10978       unsigned char nb[16];
10979       bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
10980       bfd_vma buckets_vma;
10981
10982       if (fseek (file,
10983                  (archive_file_offset
10984                   + offset_from_vma (file, dynamic_info_DT_GNU_HASH,
10985                                      sizeof nb)),
10986                  SEEK_SET))
10987         {
10988           error (_("Unable to seek to start of dynamic information\n"));
10989           goto no_gnu_hash;
10990         }
10991
10992       if (fread (nb, 16, 1, file) != 1)
10993         {
10994           error (_("Failed to read in number of buckets\n"));
10995           goto no_gnu_hash;
10996         }
10997
10998       ngnubuckets = byte_get (nb, 4);
10999       gnusymidx = byte_get (nb + 4, 4);
11000       bitmaskwords = byte_get (nb + 8, 4);
11001       buckets_vma = dynamic_info_DT_GNU_HASH + 16;
11002       if (is_32bit_elf)
11003         buckets_vma += bitmaskwords * 4;
11004       else
11005         buckets_vma += bitmaskwords * 8;
11006
11007       if (fseek (file,
11008                  (archive_file_offset
11009                   + offset_from_vma (file, buckets_vma, 4)),
11010                  SEEK_SET))
11011         {
11012           error (_("Unable to seek to start of dynamic information\n"));
11013           goto no_gnu_hash;
11014         }
11015
11016       gnubuckets = get_dynamic_data (file, ngnubuckets, 4);
11017
11018       if (gnubuckets == NULL)
11019         goto no_gnu_hash;
11020
11021       for (i = 0; i < ngnubuckets; i++)
11022         if (gnubuckets[i] != 0)
11023           {
11024             if (gnubuckets[i] < gnusymidx)
11025               return 0;
11026
11027             if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
11028               maxchain = gnubuckets[i];
11029           }
11030
11031       if (maxchain == 0xffffffff)
11032         goto no_gnu_hash;
11033
11034       maxchain -= gnusymidx;
11035
11036       if (fseek (file,
11037                  (archive_file_offset
11038                   + offset_from_vma (file, buckets_vma
11039                                            + 4 * (ngnubuckets + maxchain), 4)),
11040                  SEEK_SET))
11041         {
11042           error (_("Unable to seek to start of dynamic information\n"));
11043           goto no_gnu_hash;
11044         }
11045
11046       do
11047         {
11048           if (fread (nb, 4, 1, file) != 1)
11049             {
11050               error (_("Failed to determine last chain length\n"));
11051               goto no_gnu_hash;
11052             }
11053
11054           if (maxchain + 1 == 0)
11055             goto no_gnu_hash;
11056
11057           ++maxchain;
11058         }
11059       while ((byte_get (nb, 4) & 1) == 0);
11060
11061       if (fseek (file,
11062                  (archive_file_offset
11063                   + offset_from_vma (file, buckets_vma + 4 * ngnubuckets, 4)),
11064                  SEEK_SET))
11065         {
11066           error (_("Unable to seek to start of dynamic information\n"));
11067           goto no_gnu_hash;
11068         }
11069
11070       gnuchains = get_dynamic_data (file, maxchain, 4);
11071       ngnuchains = maxchain;
11072
11073     no_gnu_hash:
11074       if (gnuchains == NULL)
11075         {
11076           free (gnubuckets);
11077           gnubuckets = NULL;
11078           ngnubuckets = 0;
11079           if (do_using_dynamic)
11080             return 0;
11081         }
11082     }
11083
11084   if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
11085       && do_syms
11086       && do_using_dynamic
11087       && dynamic_strings != NULL
11088       && dynamic_symbols != NULL)
11089     {
11090       unsigned long hn;
11091
11092       if (dynamic_info[DT_HASH])
11093         {
11094           bfd_vma si;
11095
11096           printf (_("\nSymbol table for image:\n"));
11097           if (is_32bit_elf)
11098             printf (_("  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"));
11099           else
11100             printf (_("  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"));
11101
11102           for (hn = 0; hn < nbuckets; hn++)
11103             {
11104               if (! buckets[hn])
11105                 continue;
11106
11107               for (si = buckets[hn]; si < nchains && si > 0; si = chains[si])
11108                 print_dynamic_symbol (si, hn);
11109             }
11110         }
11111
11112       if (dynamic_info_DT_GNU_HASH)
11113         {
11114           printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
11115           if (is_32bit_elf)
11116             printf (_("  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"));
11117           else
11118             printf (_("  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"));
11119
11120           for (hn = 0; hn < ngnubuckets; ++hn)
11121             if (gnubuckets[hn] != 0)
11122               {
11123                 bfd_vma si = gnubuckets[hn];
11124                 bfd_vma off = si - gnusymidx;
11125
11126                 do
11127                   {
11128                     print_dynamic_symbol (si, hn);
11129                     si++;
11130                   }
11131                 while (off < ngnuchains && (gnuchains[off++] & 1) == 0);
11132               }
11133         }
11134     }
11135   else if ((do_dyn_syms || (do_syms && !do_using_dynamic))
11136            && section_headers != NULL)
11137     {
11138       unsigned int i;
11139
11140       for (i = 0, section = section_headers;
11141            i < elf_header.e_shnum;
11142            i++, section++)
11143         {
11144           unsigned int si;
11145           char * strtab = NULL;
11146           unsigned long int strtab_size = 0;
11147           Elf_Internal_Sym * symtab;
11148           Elf_Internal_Sym * psym;
11149           unsigned long num_syms;
11150
11151           if ((section->sh_type != SHT_SYMTAB
11152                && section->sh_type != SHT_DYNSYM)
11153               || (!do_syms
11154                   && section->sh_type == SHT_SYMTAB))
11155             continue;
11156
11157           if (section->sh_entsize == 0)
11158             {
11159               printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
11160                       printable_section_name (section));
11161               continue;
11162             }
11163
11164           printf (_("\nSymbol table '%s' contains %lu entries:\n"),
11165                   printable_section_name (section),
11166                   (unsigned long) (section->sh_size / section->sh_entsize));
11167
11168           if (is_32bit_elf)
11169             printf (_("   Num:    Value  Size Type    Bind   Vis      Ndx Name\n"));
11170           else
11171             printf (_("   Num:    Value          Size Type    Bind   Vis      Ndx Name\n"));
11172
11173           symtab = GET_ELF_SYMBOLS (file, section, & num_syms);
11174           if (symtab == NULL)
11175             continue;
11176
11177           if (section->sh_link == elf_header.e_shstrndx)
11178             {
11179               strtab = string_table;
11180               strtab_size = string_table_length;
11181             }
11182           else if (section->sh_link < elf_header.e_shnum)
11183             {
11184               Elf_Internal_Shdr * string_sec;
11185
11186               string_sec = section_headers + section->sh_link;
11187
11188               strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
11189                                           1, string_sec->sh_size,
11190                                           _("string table"));
11191               strtab_size = strtab != NULL ? string_sec->sh_size : 0;
11192             }
11193
11194           for (si = 0, psym = symtab; si < num_syms; si++, psym++)
11195             {
11196               const char *version_string;
11197               enum versioned_symbol_info sym_info;
11198               unsigned short vna_other;
11199
11200               printf ("%6d: ", si);
11201               print_vma (psym->st_value, LONG_HEX);
11202               putchar (' ');
11203               print_vma (psym->st_size, DEC_5);
11204               printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
11205               printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
11206               if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
11207                 printf (" %-7s",  get_solaris_symbol_visibility (psym->st_other));
11208               else
11209                 {
11210                   unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
11211
11212                   printf (" %-7s", get_symbol_visibility (vis));
11213                   /* Check to see if any other bits in the st_other field are set.
11214                      Note - displaying this information disrupts the layout of the
11215                      table being generated, but for the moment this case is very rare.  */
11216                   if (psym->st_other ^ vis)
11217                     printf (" [%s] ", get_symbol_other (psym->st_other ^ vis));
11218                 }
11219               printf (" %4s ", get_symbol_index_type (psym->st_shndx));
11220               print_symbol (25, psym->st_name < strtab_size
11221                             ? strtab + psym->st_name : _("<corrupt>"));
11222
11223               version_string
11224                 = get_symbol_version_string (file,
11225                                              section->sh_type == SHT_DYNSYM,
11226                                              strtab, strtab_size, si,
11227                                              psym, &sym_info, &vna_other);
11228               if (version_string)
11229                 {
11230                   if (sym_info == symbol_undefined)
11231                     printf ("@%s (%d)", version_string, vna_other);
11232                   else
11233                     printf (sym_info == symbol_hidden ? "@%s" : "@@%s",
11234                             version_string);
11235                 }
11236
11237               putchar ('\n');
11238
11239               if (ELF_ST_BIND (psym->st_info) == STB_LOCAL
11240                   && si >= section->sh_info
11241                   /* Irix 5 and 6 MIPS binaries are known to ignore this requirement.  */
11242                   && elf_header.e_machine != EM_MIPS
11243                   /* Solaris binaries have been found to violate this requirement as
11244                      well.  Not sure if this is a bug or an ABI requirement.  */
11245                   && elf_header.e_ident[EI_OSABI] != ELFOSABI_SOLARIS)
11246                 warn (_("local symbol %u found at index >= %s's sh_info value of %u\n"),
11247                       si, printable_section_name (section), section->sh_info);
11248             }
11249
11250           free (symtab);
11251           if (strtab != string_table)
11252             free (strtab);
11253         }
11254     }
11255   else if (do_syms)
11256     printf
11257       (_("\nDynamic symbol information is not available for displaying symbols.\n"));
11258
11259   if (do_histogram && buckets != NULL)
11260     {
11261       unsigned long * lengths;
11262       unsigned long * counts;
11263       unsigned long hn;
11264       bfd_vma si;
11265       unsigned long maxlength = 0;
11266       unsigned long nzero_counts = 0;
11267       unsigned long nsyms = 0;
11268       unsigned long chained;
11269
11270       printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
11271               (unsigned long) nbuckets);
11272
11273       lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
11274       if (lengths == NULL)
11275         {
11276           error (_("Out of memory allocating space for histogram buckets\n"));
11277           return 0;
11278         }
11279
11280       printf (_(" Length  Number     %% of total  Coverage\n"));
11281       for (hn = 0; hn < nbuckets; ++hn)
11282         {
11283           for (si = buckets[hn], chained = 0;
11284                si > 0 && si < nchains && si < nbuckets && chained <= nchains;
11285                si = chains[si], ++chained)
11286             {
11287               ++nsyms;
11288               if (maxlength < ++lengths[hn])
11289                 ++maxlength;
11290             }
11291
11292             /* PR binutils/17531: A corrupt binary could contain broken
11293                histogram data.  Do not go into an infinite loop trying
11294                to process it.  */
11295             if (chained > nchains)
11296               {
11297                 error (_("histogram chain is corrupt\n"));
11298                 break;
11299               }
11300         }
11301
11302       counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
11303       if (counts == NULL)
11304         {
11305           free (lengths);
11306           error (_("Out of memory allocating space for histogram counts\n"));
11307           return 0;
11308         }
11309
11310       for (hn = 0; hn < nbuckets; ++hn)
11311         ++counts[lengths[hn]];
11312
11313       if (nbuckets > 0)
11314         {
11315           unsigned long i;
11316           printf ("      0  %-10lu (%5.1f%%)\n",
11317                   counts[0], (counts[0] * 100.0) / nbuckets);
11318           for (i = 1; i <= maxlength; ++i)
11319             {
11320               nzero_counts += counts[i] * i;
11321               printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
11322                       i, counts[i], (counts[i] * 100.0) / nbuckets,
11323                       (nzero_counts * 100.0) / nsyms);
11324             }
11325         }
11326
11327       free (counts);
11328       free (lengths);
11329     }
11330
11331   if (buckets != NULL)
11332     {
11333       free (buckets);
11334       free (chains);
11335     }
11336
11337   if (do_histogram && gnubuckets != NULL)
11338     {
11339       unsigned long * lengths;
11340       unsigned long * counts;
11341       unsigned long hn;
11342       unsigned long maxlength = 0;
11343       unsigned long nzero_counts = 0;
11344       unsigned long nsyms = 0;
11345
11346       printf (_("\nHistogram for `.gnu.hash' bucket list length (total of %lu buckets):\n"),
11347               (unsigned long) ngnubuckets);
11348
11349       lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
11350       if (lengths == NULL)
11351         {
11352           error (_("Out of memory allocating space for gnu histogram buckets\n"));
11353           return 0;
11354         }
11355
11356       printf (_(" Length  Number     %% of total  Coverage\n"));
11357
11358       for (hn = 0; hn < ngnubuckets; ++hn)
11359         if (gnubuckets[hn] != 0)
11360           {
11361             bfd_vma off, length = 1;
11362
11363             for (off = gnubuckets[hn] - gnusymidx;
11364                  /* PR 17531 file: 010-77222-0.004.  */
11365                  off < ngnuchains && (gnuchains[off] & 1) == 0;
11366                  ++off)
11367               ++length;
11368             lengths[hn] = length;
11369             if (length > maxlength)
11370               maxlength = length;
11371             nsyms += length;
11372           }
11373
11374       counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
11375       if (counts == NULL)
11376         {
11377           free (lengths);
11378           error (_("Out of memory allocating space for gnu histogram counts\n"));
11379           return 0;
11380         }
11381
11382       for (hn = 0; hn < ngnubuckets; ++hn)
11383         ++counts[lengths[hn]];
11384
11385       if (ngnubuckets > 0)
11386         {
11387           unsigned long j;
11388           printf ("      0  %-10lu (%5.1f%%)\n",
11389                   counts[0], (counts[0] * 100.0) / ngnubuckets);
11390           for (j = 1; j <= maxlength; ++j)
11391             {
11392               nzero_counts += counts[j] * j;
11393               printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
11394                       j, counts[j], (counts[j] * 100.0) / ngnubuckets,
11395                       (nzero_counts * 100.0) / nsyms);
11396             }
11397         }
11398
11399       free (counts);
11400       free (lengths);
11401       free (gnubuckets);
11402       free (gnuchains);
11403     }
11404
11405   return 1;
11406 }
11407
11408 static int
11409 process_syminfo (FILE * file ATTRIBUTE_UNUSED)
11410 {
11411   unsigned int i;
11412
11413   if (dynamic_syminfo == NULL
11414       || !do_dynamic)
11415     /* No syminfo, this is ok.  */
11416     return 1;
11417
11418   /* There better should be a dynamic symbol section.  */
11419   if (dynamic_symbols == NULL || dynamic_strings == NULL)
11420     return 0;
11421
11422   if (dynamic_addr)
11423     printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
11424             dynamic_syminfo_offset, dynamic_syminfo_nent);
11425
11426   printf (_(" Num: Name                           BoundTo     Flags\n"));
11427   for (i = 0; i < dynamic_syminfo_nent; ++i)
11428     {
11429       unsigned short int flags = dynamic_syminfo[i].si_flags;
11430
11431       printf ("%4d: ", i);
11432       if (i >= num_dynamic_syms)
11433         printf (_("<corrupt index>"));
11434       else if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
11435         print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
11436       else
11437         printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
11438       putchar (' ');
11439
11440       switch (dynamic_syminfo[i].si_boundto)
11441         {
11442         case SYMINFO_BT_SELF:
11443           fputs ("SELF       ", stdout);
11444           break;
11445         case SYMINFO_BT_PARENT:
11446           fputs ("PARENT     ", stdout);
11447           break;
11448         default:
11449           if (dynamic_syminfo[i].si_boundto > 0
11450               && dynamic_syminfo[i].si_boundto < dynamic_nent
11451               && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
11452             {
11453               print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
11454               putchar (' ' );
11455             }
11456           else
11457             printf ("%-10d ", dynamic_syminfo[i].si_boundto);
11458           break;
11459         }
11460
11461       if (flags & SYMINFO_FLG_DIRECT)
11462         printf (" DIRECT");
11463       if (flags & SYMINFO_FLG_PASSTHRU)
11464         printf (" PASSTHRU");
11465       if (flags & SYMINFO_FLG_COPY)
11466         printf (" COPY");
11467       if (flags & SYMINFO_FLG_LAZYLOAD)
11468         printf (" LAZYLOAD");
11469
11470       puts ("");
11471     }
11472
11473   return 1;
11474 }
11475
11476 /* Check to see if the given reloc needs to be handled in a target specific
11477    manner.  If so then process the reloc and return TRUE otherwise return
11478    FALSE.  */
11479
11480 static bfd_boolean
11481 target_specific_reloc_handling (Elf_Internal_Rela * reloc,
11482                                 unsigned char *     start,
11483                                 Elf_Internal_Sym *  symtab)
11484 {
11485   unsigned int reloc_type = get_reloc_type (reloc->r_info);
11486
11487   switch (elf_header.e_machine)
11488     {
11489     case EM_MSP430:
11490     case EM_MSP430_OLD:
11491       {
11492         static Elf_Internal_Sym * saved_sym = NULL;
11493
11494         switch (reloc_type)
11495           {
11496           case 10: /* R_MSP430_SYM_DIFF */
11497             if (uses_msp430x_relocs ())
11498               break;
11499             /* Fall through.  */
11500           case 21: /* R_MSP430X_SYM_DIFF */
11501             saved_sym = symtab + get_reloc_symindex (reloc->r_info);
11502             return TRUE;
11503
11504           case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
11505           case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
11506             goto handle_sym_diff;
11507
11508           case 5: /* R_MSP430_16_BYTE */
11509           case 9: /* R_MSP430_8 */
11510             if (uses_msp430x_relocs ())
11511               break;
11512             goto handle_sym_diff;
11513
11514           case 2: /* R_MSP430_ABS16 */
11515           case 15: /* R_MSP430X_ABS16 */
11516             if (! uses_msp430x_relocs ())
11517               break;
11518             goto handle_sym_diff;
11519
11520           handle_sym_diff:
11521             if (saved_sym != NULL)
11522               {
11523                 bfd_vma value;
11524
11525                 value = reloc->r_addend
11526                   + (symtab[get_reloc_symindex (reloc->r_info)].st_value
11527                      - saved_sym->st_value);
11528
11529                 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
11530
11531                 saved_sym = NULL;
11532                 return TRUE;
11533               }
11534             break;
11535
11536           default:
11537             if (saved_sym != NULL)
11538               error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc\n"));
11539             break;
11540           }
11541         break;
11542       }
11543
11544     case EM_MN10300:
11545     case EM_CYGNUS_MN10300:
11546       {
11547         static Elf_Internal_Sym * saved_sym = NULL;
11548
11549         switch (reloc_type)
11550           {
11551           case 34: /* R_MN10300_ALIGN */
11552             return TRUE;
11553           case 33: /* R_MN10300_SYM_DIFF */
11554             saved_sym = symtab + get_reloc_symindex (reloc->r_info);
11555             return TRUE;
11556           case 1: /* R_MN10300_32 */
11557           case 2: /* R_MN10300_16 */
11558             if (saved_sym != NULL)
11559               {
11560                 bfd_vma value;
11561
11562                 value = reloc->r_addend
11563                   + (symtab[get_reloc_symindex (reloc->r_info)].st_value
11564                      - saved_sym->st_value);
11565
11566                 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
11567
11568                 saved_sym = NULL;
11569                 return TRUE;
11570               }
11571             break;
11572           default:
11573             if (saved_sym != NULL)
11574               error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc\n"));
11575             break;
11576           }
11577         break;
11578       }
11579
11580     case EM_RL78:
11581       {
11582         static bfd_vma saved_sym1 = 0;
11583         static bfd_vma saved_sym2 = 0;
11584         static bfd_vma value;
11585
11586         switch (reloc_type)
11587           {
11588           case 0x80: /* R_RL78_SYM.  */
11589             saved_sym1 = saved_sym2;
11590             saved_sym2 = symtab[get_reloc_symindex (reloc->r_info)].st_value;
11591             saved_sym2 += reloc->r_addend;
11592             return TRUE;
11593
11594           case 0x83: /* R_RL78_OPsub.  */
11595             value = saved_sym1 - saved_sym2;
11596             saved_sym2 = saved_sym1 = 0;
11597             return TRUE;
11598             break;
11599
11600           case 0x41: /* R_RL78_ABS32.  */
11601             byte_put (start + reloc->r_offset, value, 4);
11602             value = 0;
11603             return TRUE;
11604
11605           case 0x43: /* R_RL78_ABS16.  */
11606             byte_put (start + reloc->r_offset, value, 2);
11607             value = 0;
11608             return TRUE;
11609
11610           default:
11611             break;
11612           }
11613         break;
11614       }
11615     }
11616
11617   return FALSE;
11618 }
11619
11620 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
11621    DWARF debug sections.  This is a target specific test.  Note - we do not
11622    go through the whole including-target-headers-multiple-times route, (as
11623    we have already done with <elf/h8.h>) because this would become very
11624    messy and even then this function would have to contain target specific
11625    information (the names of the relocs instead of their numeric values).
11626    FIXME: This is not the correct way to solve this problem.  The proper way
11627    is to have target specific reloc sizing and typing functions created by
11628    the reloc-macros.h header, in the same way that it already creates the
11629    reloc naming functions.  */
11630
11631 static bfd_boolean
11632 is_32bit_abs_reloc (unsigned int reloc_type)
11633 {
11634   /* Please keep this table alpha-sorted for ease of visual lookup.  */
11635   switch (elf_header.e_machine)
11636     {
11637     case EM_386:
11638     case EM_IAMCU:
11639       return reloc_type == 1; /* R_386_32.  */
11640     case EM_68K:
11641       return reloc_type == 1; /* R_68K_32.  */
11642     case EM_860:
11643       return reloc_type == 1; /* R_860_32.  */
11644     case EM_960:
11645       return reloc_type == 2; /* R_960_32.  */
11646     case EM_AARCH64:
11647       return reloc_type == 258; /* R_AARCH64_ABS32 */
11648     case EM_ADAPTEVA_EPIPHANY:
11649       return reloc_type == 3;
11650     case EM_ALPHA:
11651       return reloc_type == 1; /* R_ALPHA_REFLONG.  */
11652     case EM_ARC:
11653       return reloc_type == 1; /* R_ARC_32.  */
11654     case EM_ARC_COMPACT:
11655     case EM_ARC_COMPACT2:
11656       return reloc_type == 4; /* R_ARC_32.  */
11657     case EM_ARM:
11658       return reloc_type == 2; /* R_ARM_ABS32 */
11659     case EM_AVR_OLD:
11660     case EM_AVR:
11661       return reloc_type == 1;
11662     case EM_BLACKFIN:
11663       return reloc_type == 0x12; /* R_byte4_data.  */
11664     case EM_CRIS:
11665       return reloc_type == 3; /* R_CRIS_32.  */
11666     case EM_CR16:
11667       return reloc_type == 3; /* R_CR16_NUM32.  */
11668     case EM_CRX:
11669       return reloc_type == 15; /* R_CRX_NUM32.  */
11670     case EM_CYGNUS_FRV:
11671       return reloc_type == 1;
11672     case EM_CYGNUS_D10V:
11673     case EM_D10V:
11674       return reloc_type == 6; /* R_D10V_32.  */
11675     case EM_CYGNUS_D30V:
11676     case EM_D30V:
11677       return reloc_type == 12; /* R_D30V_32_NORMAL.  */
11678     case EM_DLX:
11679       return reloc_type == 3; /* R_DLX_RELOC_32.  */
11680     case EM_CYGNUS_FR30:
11681     case EM_FR30:
11682       return reloc_type == 3; /* R_FR30_32.  */
11683     case EM_FT32:
11684       return reloc_type == 1; /* R_FT32_32.  */
11685     case EM_H8S:
11686     case EM_H8_300:
11687     case EM_H8_300H:
11688       return reloc_type == 1; /* R_H8_DIR32.  */
11689     case EM_IA_64:
11690       return reloc_type == 0x65 /* R_IA64_SECREL32LSB.  */
11691         || reloc_type == 0x25;  /* R_IA64_DIR32LSB.  */
11692     case EM_IP2K_OLD:
11693     case EM_IP2K:
11694       return reloc_type == 2; /* R_IP2K_32.  */
11695     case EM_IQ2000:
11696       return reloc_type == 2; /* R_IQ2000_32.  */
11697     case EM_LATTICEMICO32:
11698       return reloc_type == 3; /* R_LM32_32.  */
11699     case EM_M32C_OLD:
11700     case EM_M32C:
11701       return reloc_type == 3; /* R_M32C_32.  */
11702     case EM_M32R:
11703       return reloc_type == 34; /* R_M32R_32_RELA.  */
11704     case EM_68HC11:
11705     case EM_68HC12:
11706       return reloc_type == 6; /* R_M68HC11_32.  */
11707     case EM_MCORE:
11708       return reloc_type == 1; /* R_MCORE_ADDR32.  */
11709     case EM_CYGNUS_MEP:
11710       return reloc_type == 4; /* R_MEP_32.  */
11711     case EM_METAG:
11712       return reloc_type == 2; /* R_METAG_ADDR32.  */
11713     case EM_MICROBLAZE:
11714       return reloc_type == 1; /* R_MICROBLAZE_32.  */
11715     case EM_MIPS:
11716       return reloc_type == 2; /* R_MIPS_32.  */
11717     case EM_MMIX:
11718       return reloc_type == 4; /* R_MMIX_32.  */
11719     case EM_CYGNUS_MN10200:
11720     case EM_MN10200:
11721       return reloc_type == 1; /* R_MN10200_32.  */
11722     case EM_CYGNUS_MN10300:
11723     case EM_MN10300:
11724       return reloc_type == 1; /* R_MN10300_32.  */
11725     case EM_MOXIE:
11726       return reloc_type == 1; /* R_MOXIE_32.  */
11727     case EM_MSP430_OLD:
11728     case EM_MSP430:
11729       return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32.  */
11730     case EM_MT:
11731       return reloc_type == 2; /* R_MT_32.  */
11732     case EM_NDS32:
11733       return reloc_type == 20; /* R_NDS32_RELA.  */
11734     case EM_ALTERA_NIOS2:
11735       return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32.  */
11736     case EM_NIOS32:
11737       return reloc_type == 1; /* R_NIOS_32.  */
11738     case EM_OR1K:
11739       return reloc_type == 1; /* R_OR1K_32.  */
11740     case EM_PARISC:
11741       return (reloc_type == 1 /* R_PARISC_DIR32.  */
11742               || reloc_type == 41); /* R_PARISC_SECREL32.  */
11743     case EM_PJ:
11744     case EM_PJ_OLD:
11745       return reloc_type == 1; /* R_PJ_DATA_DIR32.  */
11746     case EM_PPC64:
11747       return reloc_type == 1; /* R_PPC64_ADDR32.  */
11748     case EM_PPC:
11749       return reloc_type == 1; /* R_PPC_ADDR32.  */
11750     case EM_RL78:
11751       return reloc_type == 1; /* R_RL78_DIR32.  */
11752     case EM_RX:
11753       return reloc_type == 1; /* R_RX_DIR32.  */
11754     case EM_S370:
11755       return reloc_type == 1; /* R_I370_ADDR31.  */
11756     case EM_S390_OLD:
11757     case EM_S390:
11758       return reloc_type == 4; /* R_S390_32.  */
11759     case EM_SCORE:
11760       return reloc_type == 8; /* R_SCORE_ABS32.  */
11761     case EM_SH:
11762       return reloc_type == 1; /* R_SH_DIR32.  */
11763     case EM_SPARC32PLUS:
11764     case EM_SPARCV9:
11765     case EM_SPARC:
11766       return reloc_type == 3 /* R_SPARC_32.  */
11767         || reloc_type == 23; /* R_SPARC_UA32.  */
11768     case EM_SPU:
11769       return reloc_type == 6; /* R_SPU_ADDR32 */
11770     case EM_TI_C6000:
11771       return reloc_type == 1; /* R_C6000_ABS32.  */
11772     case EM_TILEGX:
11773       return reloc_type == 2; /* R_TILEGX_32.  */
11774     case EM_TILEPRO:
11775       return reloc_type == 1; /* R_TILEPRO_32.  */
11776     case EM_CYGNUS_V850:
11777     case EM_V850:
11778       return reloc_type == 6; /* R_V850_ABS32.  */
11779     case EM_V800:
11780       return reloc_type == 0x33; /* R_V810_WORD.  */
11781     case EM_VAX:
11782       return reloc_type == 1; /* R_VAX_32.  */
11783     case EM_VISIUM:
11784       return reloc_type == 3;  /* R_VISIUM_32. */
11785     case EM_X86_64:
11786     case EM_L1OM:
11787     case EM_K1OM:
11788       return reloc_type == 10; /* R_X86_64_32.  */
11789     case EM_XC16X:
11790     case EM_C166:
11791       return reloc_type == 3; /* R_XC16C_ABS_32.  */
11792     case EM_XGATE:
11793       return reloc_type == 4; /* R_XGATE_32.  */
11794     case EM_XSTORMY16:
11795       return reloc_type == 1; /* R_XSTROMY16_32.  */
11796     case EM_XTENSA_OLD:
11797     case EM_XTENSA:
11798       return reloc_type == 1; /* R_XTENSA_32.  */
11799     default:
11800       {
11801         static unsigned int prev_warn = 0;
11802
11803         /* Avoid repeating the same warning multiple times.  */
11804         if (prev_warn != elf_header.e_machine)
11805           error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
11806                  elf_header.e_machine);
11807         prev_warn = elf_header.e_machine;
11808         return FALSE;
11809       }
11810     }
11811 }
11812
11813 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11814    a 32-bit pc-relative RELA relocation used in DWARF debug sections.  */
11815
11816 static bfd_boolean
11817 is_32bit_pcrel_reloc (unsigned int reloc_type)
11818 {
11819   switch (elf_header.e_machine)
11820   /* Please keep this table alpha-sorted for ease of visual lookup.  */
11821     {
11822     case EM_386:
11823     case EM_IAMCU:
11824       return reloc_type == 2;  /* R_386_PC32.  */
11825     case EM_68K:
11826       return reloc_type == 4;  /* R_68K_PC32.  */
11827     case EM_AARCH64:
11828       return reloc_type == 261; /* R_AARCH64_PREL32 */
11829     case EM_ADAPTEVA_EPIPHANY:
11830       return reloc_type == 6;
11831     case EM_ALPHA:
11832       return reloc_type == 10; /* R_ALPHA_SREL32.  */
11833     case EM_ARC_COMPACT:
11834     case EM_ARC_COMPACT2:
11835       return reloc_type == 49; /* R_ARC_32_PCREL.  */
11836     case EM_ARM:
11837       return reloc_type == 3;  /* R_ARM_REL32 */
11838     case EM_AVR_OLD:
11839     case EM_AVR:
11840       return reloc_type == 36; /* R_AVR_32_PCREL.  */
11841     case EM_MICROBLAZE:
11842       return reloc_type == 2;  /* R_MICROBLAZE_32_PCREL.  */
11843     case EM_OR1K:
11844       return reloc_type == 9; /* R_OR1K_32_PCREL.  */
11845     case EM_PARISC:
11846       return reloc_type == 9;  /* R_PARISC_PCREL32.  */
11847     case EM_PPC:
11848       return reloc_type == 26; /* R_PPC_REL32.  */
11849     case EM_PPC64:
11850       return reloc_type == 26; /* R_PPC64_REL32.  */
11851     case EM_S390_OLD:
11852     case EM_S390:
11853       return reloc_type == 5;  /* R_390_PC32.  */
11854     case EM_SH:
11855       return reloc_type == 2;  /* R_SH_REL32.  */
11856     case EM_SPARC32PLUS:
11857     case EM_SPARCV9:
11858     case EM_SPARC:
11859       return reloc_type == 6;  /* R_SPARC_DISP32.  */
11860     case EM_SPU:
11861       return reloc_type == 13; /* R_SPU_REL32.  */
11862     case EM_TILEGX:
11863       return reloc_type == 6; /* R_TILEGX_32_PCREL.  */
11864     case EM_TILEPRO:
11865       return reloc_type == 4; /* R_TILEPRO_32_PCREL.  */
11866     case EM_VISIUM:
11867       return reloc_type == 6;  /* R_VISIUM_32_PCREL */
11868     case EM_X86_64:
11869     case EM_L1OM:
11870     case EM_K1OM:
11871       return reloc_type == 2;  /* R_X86_64_PC32.  */
11872     case EM_XTENSA_OLD:
11873     case EM_XTENSA:
11874       return reloc_type == 14; /* R_XTENSA_32_PCREL.  */
11875     default:
11876       /* Do not abort or issue an error message here.  Not all targets use
11877          pc-relative 32-bit relocs in their DWARF debug information and we
11878          have already tested for target coverage in is_32bit_abs_reloc.  A
11879          more helpful warning message will be generated by apply_relocations
11880          anyway, so just return.  */
11881       return FALSE;
11882     }
11883 }
11884
11885 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11886    a 64-bit absolute RELA relocation used in DWARF debug sections.  */
11887
11888 static bfd_boolean
11889 is_64bit_abs_reloc (unsigned int reloc_type)
11890 {
11891   switch (elf_header.e_machine)
11892     {
11893     case EM_AARCH64:
11894       return reloc_type == 257; /* R_AARCH64_ABS64.  */
11895     case EM_ALPHA:
11896       return reloc_type == 2; /* R_ALPHA_REFQUAD.  */
11897     case EM_IA_64:
11898       return reloc_type == 0x27; /* R_IA64_DIR64LSB.  */
11899     case EM_PARISC:
11900       return reloc_type == 80; /* R_PARISC_DIR64.  */
11901     case EM_PPC64:
11902       return reloc_type == 38; /* R_PPC64_ADDR64.  */
11903     case EM_SPARC32PLUS:
11904     case EM_SPARCV9:
11905     case EM_SPARC:
11906       return reloc_type == 54; /* R_SPARC_UA64.  */
11907     case EM_X86_64:
11908     case EM_L1OM:
11909     case EM_K1OM:
11910       return reloc_type == 1; /* R_X86_64_64.  */
11911     case EM_S390_OLD:
11912     case EM_S390:
11913       return reloc_type == 22;  /* R_S390_64.  */
11914     case EM_TILEGX:
11915       return reloc_type == 1; /* R_TILEGX_64.  */
11916     case EM_MIPS:
11917       return reloc_type == 18;  /* R_MIPS_64.  */
11918     default:
11919       return FALSE;
11920     }
11921 }
11922
11923 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
11924    a 64-bit pc-relative RELA relocation used in DWARF debug sections.  */
11925
11926 static bfd_boolean
11927 is_64bit_pcrel_reloc (unsigned int reloc_type)
11928 {
11929   switch (elf_header.e_machine)
11930     {
11931     case EM_AARCH64:
11932       return reloc_type == 260; /* R_AARCH64_PREL64.  */
11933     case EM_ALPHA:
11934       return reloc_type == 11; /* R_ALPHA_SREL64.  */
11935     case EM_IA_64:
11936       return reloc_type == 0x4f; /* R_IA64_PCREL64LSB.  */
11937     case EM_PARISC:
11938       return reloc_type == 72; /* R_PARISC_PCREL64.  */
11939     case EM_PPC64:
11940       return reloc_type == 44; /* R_PPC64_REL64.  */
11941     case EM_SPARC32PLUS:
11942     case EM_SPARCV9:
11943     case EM_SPARC:
11944       return reloc_type == 46; /* R_SPARC_DISP64.  */
11945     case EM_X86_64:
11946     case EM_L1OM:
11947     case EM_K1OM:
11948       return reloc_type == 24; /* R_X86_64_PC64.  */
11949     case EM_S390_OLD:
11950     case EM_S390:
11951       return reloc_type == 23;  /* R_S390_PC64.  */
11952     case EM_TILEGX:
11953       return reloc_type == 5;  /* R_TILEGX_64_PCREL.  */
11954     default:
11955       return FALSE;
11956     }
11957 }
11958
11959 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11960    a 24-bit absolute RELA relocation used in DWARF debug sections.  */
11961
11962 static bfd_boolean
11963 is_24bit_abs_reloc (unsigned int reloc_type)
11964 {
11965   switch (elf_header.e_machine)
11966     {
11967     case EM_CYGNUS_MN10200:
11968     case EM_MN10200:
11969       return reloc_type == 4; /* R_MN10200_24.  */
11970     case EM_FT32:
11971       return reloc_type == 5; /* R_FT32_20.  */
11972     default:
11973       return FALSE;
11974     }
11975 }
11976
11977 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11978    a 16-bit absolute RELA relocation used in DWARF debug sections.  */
11979
11980 static bfd_boolean
11981 is_16bit_abs_reloc (unsigned int reloc_type)
11982 {
11983   /* Please keep this table alpha-sorted for ease of visual lookup.  */
11984   switch (elf_header.e_machine)
11985     {
11986     case EM_ARC:
11987     case EM_ARC_COMPACT:
11988     case EM_ARC_COMPACT2:
11989       return reloc_type == 2; /* R_ARC_16.  */
11990     case EM_ADAPTEVA_EPIPHANY:
11991       return reloc_type == 5;
11992     case EM_AVR_OLD:
11993     case EM_AVR:
11994       return reloc_type == 4; /* R_AVR_16.  */
11995     case EM_CYGNUS_D10V:
11996     case EM_D10V:
11997       return reloc_type == 3; /* R_D10V_16.  */
11998     case EM_H8S:
11999     case EM_H8_300:
12000     case EM_H8_300H:
12001       return reloc_type == R_H8_DIR16;
12002     case EM_IP2K_OLD:
12003     case EM_IP2K:
12004       return reloc_type == 1; /* R_IP2K_16.  */
12005     case EM_M32C_OLD:
12006     case EM_M32C:
12007       return reloc_type == 1; /* R_M32C_16 */
12008     case EM_CYGNUS_MN10200:
12009     case EM_MN10200:
12010       return reloc_type == 2; /* R_MN10200_16.  */
12011     case EM_CYGNUS_MN10300:
12012     case EM_MN10300:
12013       return reloc_type == 2; /* R_MN10300_16.  */
12014     case EM_MSP430:
12015       if (uses_msp430x_relocs ())
12016         return reloc_type == 2; /* R_MSP430_ABS16.  */
12017       /* Fall through.  */
12018     case EM_MSP430_OLD:
12019       return reloc_type == 5; /* R_MSP430_16_BYTE.  */
12020     case EM_NDS32:
12021       return reloc_type == 19; /* R_NDS32_RELA.  */
12022     case EM_ALTERA_NIOS2:
12023       return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16.  */
12024     case EM_NIOS32:
12025       return reloc_type == 9; /* R_NIOS_16.  */
12026     case EM_OR1K:
12027       return reloc_type == 2; /* R_OR1K_16.  */
12028     case EM_TI_C6000:
12029       return reloc_type == 2; /* R_C6000_ABS16.  */
12030     case EM_VISIUM:
12031       return reloc_type == 2; /* R_VISIUM_16. */
12032     case EM_XC16X:
12033     case EM_C166:
12034       return reloc_type == 2; /* R_XC16C_ABS_16.  */
12035     case EM_XGATE:
12036       return reloc_type == 3; /* R_XGATE_16.  */
12037     default:
12038       return FALSE;
12039     }
12040 }
12041
12042 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
12043    relocation entries (possibly formerly used for SHT_GROUP sections).  */
12044
12045 static bfd_boolean
12046 is_none_reloc (unsigned int reloc_type)
12047 {
12048   switch (elf_header.e_machine)
12049     {
12050     case EM_386:     /* R_386_NONE.  */
12051     case EM_68K:     /* R_68K_NONE.  */
12052     case EM_ADAPTEVA_EPIPHANY:
12053     case EM_ALPHA:   /* R_ALPHA_NONE.  */
12054     case EM_ALTERA_NIOS2: /* R_NIOS2_NONE.  */
12055     case EM_ARC:     /* R_ARC_NONE.  */
12056     case EM_ARC_COMPACT2: /* R_ARC_NONE.  */
12057     case EM_ARC_COMPACT: /* R_ARC_NONE.  */
12058     case EM_ARM:     /* R_ARM_NONE.  */
12059     case EM_C166:    /* R_XC16X_NONE.  */
12060     case EM_CRIS:    /* R_CRIS_NONE.  */
12061     case EM_FT32:    /* R_FT32_NONE.  */
12062     case EM_IA_64:   /* R_IA64_NONE.  */
12063     case EM_K1OM:    /* R_X86_64_NONE.  */
12064     case EM_L1OM:    /* R_X86_64_NONE.  */
12065     case EM_M32R:    /* R_M32R_NONE.  */
12066     case EM_MIPS:    /* R_MIPS_NONE.  */
12067     case EM_MN10300: /* R_MN10300_NONE.  */
12068     case EM_MOXIE:   /* R_MOXIE_NONE.  */
12069     case EM_NIOS32:  /* R_NIOS_NONE.  */
12070     case EM_OR1K:    /* R_OR1K_NONE. */
12071     case EM_PARISC:  /* R_PARISC_NONE.  */
12072     case EM_PPC64:   /* R_PPC64_NONE.  */
12073     case EM_PPC:     /* R_PPC_NONE.  */
12074     case EM_S390:    /* R_390_NONE.  */
12075     case EM_S390_OLD:
12076     case EM_SH:      /* R_SH_NONE.  */
12077     case EM_SPARC32PLUS:
12078     case EM_SPARC:   /* R_SPARC_NONE.  */
12079     case EM_SPARCV9:
12080     case EM_TILEGX:  /* R_TILEGX_NONE.  */
12081     case EM_TILEPRO: /* R_TILEPRO_NONE.  */
12082     case EM_TI_C6000:/* R_C6000_NONE.  */
12083     case EM_X86_64:  /* R_X86_64_NONE.  */
12084     case EM_XC16X:
12085       return reloc_type == 0;
12086
12087     case EM_AARCH64:
12088       return reloc_type == 0 || reloc_type == 256;
12089     case EM_AVR_OLD:
12090     case EM_AVR:
12091       return (reloc_type == 0 /* R_AVR_NONE.  */
12092               || reloc_type == 30 /* R_AVR_DIFF8.  */
12093               || reloc_type == 31 /* R_AVR_DIFF16.  */
12094               || reloc_type == 32 /* R_AVR_DIFF32.  */);
12095     case EM_METAG:
12096       return reloc_type == 3; /* R_METAG_NONE.  */
12097     case EM_NDS32:
12098       return (reloc_type == 0       /* R_XTENSA_NONE.  */
12099               || reloc_type == 204  /* R_NDS32_DIFF8.  */
12100               || reloc_type == 205  /* R_NDS32_DIFF16.  */
12101               || reloc_type == 206  /* R_NDS32_DIFF32.  */
12102               || reloc_type == 207  /* R_NDS32_ULEB128.  */);
12103     case EM_XTENSA_OLD:
12104     case EM_XTENSA:
12105       return (reloc_type == 0      /* R_XTENSA_NONE.  */
12106               || reloc_type == 17  /* R_XTENSA_DIFF8.  */
12107               || reloc_type == 18  /* R_XTENSA_DIFF16.  */
12108               || reloc_type == 19  /* R_XTENSA_DIFF32.  */);
12109     }
12110   return FALSE;
12111 }
12112
12113 /* Returns TRUE if there is a relocation against
12114    section NAME at OFFSET bytes.  */
12115
12116 bfd_boolean
12117 reloc_at (struct dwarf_section * dsec, dwarf_vma offset)
12118 {
12119   Elf_Internal_Rela * relocs;
12120   Elf_Internal_Rela * rp;
12121
12122   if (dsec == NULL || dsec->reloc_info == NULL)
12123     return FALSE;
12124
12125   relocs = (Elf_Internal_Rela *) dsec->reloc_info;
12126
12127   for (rp = relocs; rp < relocs + dsec->num_relocs; ++rp)
12128     if (rp->r_offset == offset)
12129       return TRUE;
12130
12131    return FALSE;
12132 }
12133
12134 /* Apply relocations to a section.
12135    Note: So far support has been added only for those relocations
12136    which can be found in debug sections.
12137    If RELOCS_RETURN is non-NULL then returns in it a pointer to the
12138    loaded relocs.  It is then the caller's responsibility to free them.
12139    FIXME: Add support for more relocations ?  */
12140
12141 static void
12142 apply_relocations (void *                     file,
12143                    const Elf_Internal_Shdr *  section,
12144                    unsigned char *            start,
12145                    bfd_size_type              size,
12146                    void **                     relocs_return,
12147                    unsigned long *            num_relocs_return)
12148 {
12149   Elf_Internal_Shdr * relsec;
12150   unsigned char * end = start + size;
12151
12152   if (relocs_return != NULL)
12153     {
12154       * (Elf_Internal_Rela **) relocs_return = NULL;
12155       * num_relocs_return = 0;
12156     }
12157
12158   if (elf_header.e_type != ET_REL)
12159     return;
12160
12161   /* Find the reloc section associated with the section.  */
12162   for (relsec = section_headers;
12163        relsec < section_headers + elf_header.e_shnum;
12164        ++relsec)
12165     {
12166       bfd_boolean is_rela;
12167       unsigned long num_relocs;
12168       Elf_Internal_Rela * relocs;
12169       Elf_Internal_Rela * rp;
12170       Elf_Internal_Shdr * symsec;
12171       Elf_Internal_Sym * symtab;
12172       unsigned long num_syms;
12173       Elf_Internal_Sym * sym;
12174
12175       if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12176           || relsec->sh_info >= elf_header.e_shnum
12177           || section_headers + relsec->sh_info != section
12178           || relsec->sh_size == 0
12179           || relsec->sh_link >= elf_header.e_shnum)
12180         continue;
12181
12182       is_rela = relsec->sh_type == SHT_RELA;
12183
12184       if (is_rela)
12185         {
12186           if (!slurp_rela_relocs ((FILE *) file, relsec->sh_offset,
12187                                   relsec->sh_size, & relocs, & num_relocs))
12188             return;
12189         }
12190       else
12191         {
12192           if (!slurp_rel_relocs ((FILE *) file, relsec->sh_offset,
12193                                  relsec->sh_size, & relocs, & num_relocs))
12194             return;
12195         }
12196
12197       /* SH uses RELA but uses in place value instead of the addend field.  */
12198       if (elf_header.e_machine == EM_SH)
12199         is_rela = FALSE;
12200
12201       symsec = section_headers + relsec->sh_link;
12202       symtab = GET_ELF_SYMBOLS ((FILE *) file, symsec, & num_syms);
12203
12204       for (rp = relocs; rp < relocs + num_relocs; ++rp)
12205         {
12206           bfd_vma         addend;
12207           unsigned int    reloc_type;
12208           unsigned int    reloc_size;
12209           unsigned char * rloc;
12210           unsigned long   sym_index;
12211
12212           reloc_type = get_reloc_type (rp->r_info);
12213
12214           if (target_specific_reloc_handling (rp, start, symtab))
12215             continue;
12216           else if (is_none_reloc (reloc_type))
12217             continue;
12218           else if (is_32bit_abs_reloc (reloc_type)
12219                    || is_32bit_pcrel_reloc (reloc_type))
12220             reloc_size = 4;
12221           else if (is_64bit_abs_reloc (reloc_type)
12222                    || is_64bit_pcrel_reloc (reloc_type))
12223             reloc_size = 8;
12224           else if (is_24bit_abs_reloc (reloc_type))
12225             reloc_size = 3;
12226           else if (is_16bit_abs_reloc (reloc_type))
12227             reloc_size = 2;
12228           else
12229             {
12230               static unsigned int prev_reloc = 0;
12231               if (reloc_type != prev_reloc)
12232                 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
12233                       reloc_type, printable_section_name (section));
12234               prev_reloc = reloc_type;
12235               continue;
12236             }
12237
12238           rloc = start + rp->r_offset;
12239           if ((rloc + reloc_size) > end || (rloc < start))
12240             {
12241               warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
12242                     (unsigned long) rp->r_offset,
12243                     printable_section_name (section));
12244               continue;
12245             }
12246
12247           sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
12248           if (sym_index >= num_syms)
12249             {
12250               warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
12251                     sym_index, printable_section_name (section));
12252               continue;
12253             }
12254           sym = symtab + sym_index;
12255
12256           /* If the reloc has a symbol associated with it,
12257              make sure that it is of an appropriate type.
12258
12259              Relocations against symbols without type can happen.
12260              Gcc -feliminate-dwarf2-dups may generate symbols
12261              without type for debug info.
12262
12263              Icc generates relocations against function symbols
12264              instead of local labels.
12265
12266              Relocations against object symbols can happen, eg when
12267              referencing a global array.  For an example of this see
12268              the _clz.o binary in libgcc.a.  */
12269           if (sym != symtab
12270               && ELF_ST_TYPE (sym->st_info) != STT_COMMON
12271               && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
12272             {
12273               warn (_("skipping unexpected symbol type %s in %ld'th relocation in section %s\n"),
12274                     get_symbol_type (ELF_ST_TYPE (sym->st_info)),
12275                     (long int)(rp - relocs),
12276                     printable_section_name (relsec));
12277               continue;
12278             }
12279
12280           addend = 0;
12281           if (is_rela)
12282             addend += rp->r_addend;
12283           /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
12284              partial_inplace.  */
12285           if (!is_rela
12286               || (elf_header.e_machine == EM_XTENSA
12287                   && reloc_type == 1)
12288               || ((elf_header.e_machine == EM_PJ
12289                    || elf_header.e_machine == EM_PJ_OLD)
12290                   && reloc_type == 1)
12291               || ((elf_header.e_machine == EM_D30V
12292                    || elf_header.e_machine == EM_CYGNUS_D30V)
12293                   && reloc_type == 12))
12294             addend += byte_get (rloc, reloc_size);
12295
12296           if (is_32bit_pcrel_reloc (reloc_type)
12297               || is_64bit_pcrel_reloc (reloc_type))
12298             {
12299               /* On HPPA, all pc-relative relocations are biased by 8.  */
12300               if (elf_header.e_machine == EM_PARISC)
12301                 addend -= 8;
12302               byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
12303                         reloc_size);
12304             }
12305           else
12306             byte_put (rloc, addend + sym->st_value, reloc_size);
12307         }
12308
12309       free (symtab);
12310
12311       if (relocs_return)
12312         {
12313           * (Elf_Internal_Rela **) relocs_return = relocs;
12314           * num_relocs_return = num_relocs;
12315         }
12316       else
12317         free (relocs);
12318
12319       break;
12320     }
12321 }
12322
12323 #ifdef SUPPORT_DISASSEMBLY
12324 static int
12325 disassemble_section (Elf_Internal_Shdr * section, FILE * file)
12326 {
12327   printf (_("\nAssembly dump of section %s\n"), printable_section_name (section));
12328
12329   /* FIXME: XXX -- to be done --- XXX */
12330
12331   return 1;
12332 }
12333 #endif
12334
12335 /* Reads in the contents of SECTION from FILE, returning a pointer
12336    to a malloc'ed buffer or NULL if something went wrong.  */
12337
12338 static char *
12339 get_section_contents (Elf_Internal_Shdr * section, FILE * file)
12340 {
12341   bfd_size_type num_bytes;
12342
12343   num_bytes = section->sh_size;
12344
12345   if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
12346     {
12347       printf (_("\nSection '%s' has no data to dump.\n"),
12348               printable_section_name (section));
12349       return NULL;
12350     }
12351
12352   return  (char *) get_data (NULL, file, section->sh_offset, 1, num_bytes,
12353                              _("section contents"));
12354 }
12355
12356 /* Uncompresses a section that was compressed using zlib, in place.  */
12357
12358 static bfd_boolean
12359 uncompress_section_contents (unsigned char **buffer,
12360                              dwarf_size_type uncompressed_size,
12361                              dwarf_size_type *size)
12362 {
12363   dwarf_size_type compressed_size = *size;
12364   unsigned char * compressed_buffer = *buffer;
12365   unsigned char * uncompressed_buffer;
12366   z_stream strm;
12367   int rc;
12368
12369   /* It is possible the section consists of several compressed
12370      buffers concatenated together, so we uncompress in a loop.  */
12371   /* PR 18313: The state field in the z_stream structure is supposed
12372      to be invisible to the user (ie us), but some compilers will
12373      still complain about it being used without initialisation.  So
12374      we first zero the entire z_stream structure and then set the fields
12375      that we need.  */
12376   memset (& strm, 0, sizeof strm);
12377   strm.avail_in = compressed_size;
12378   strm.next_in = (Bytef *) compressed_buffer;
12379   strm.avail_out = uncompressed_size;
12380   uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
12381
12382   rc = inflateInit (& strm);
12383   while (strm.avail_in > 0)
12384     {
12385       if (rc != Z_OK)
12386         goto fail;
12387       strm.next_out = ((Bytef *) uncompressed_buffer
12388                        + (uncompressed_size - strm.avail_out));
12389       rc = inflate (&strm, Z_FINISH);
12390       if (rc != Z_STREAM_END)
12391         goto fail;
12392       rc = inflateReset (& strm);
12393     }
12394   rc = inflateEnd (& strm);
12395   if (rc != Z_OK
12396       || strm.avail_out != 0)
12397     goto fail;
12398
12399   *buffer = uncompressed_buffer;
12400   *size = uncompressed_size;
12401   return TRUE;
12402
12403  fail:
12404   free (uncompressed_buffer);
12405   /* Indicate decompression failure.  */
12406   *buffer = NULL;
12407   return FALSE;
12408 }
12409
12410 static void
12411 dump_section_as_strings (Elf_Internal_Shdr * section, FILE * file)
12412 {
12413   Elf_Internal_Shdr *  relsec;
12414   bfd_size_type        num_bytes;
12415   unsigned char *      data;
12416   unsigned char *      end;
12417   unsigned char *      real_start;
12418   unsigned char *      start;
12419   bfd_boolean          some_strings_shown;
12420
12421   real_start = start = (unsigned char *) get_section_contents (section,
12422                                                                file);
12423   if (start == NULL)
12424     return;
12425   num_bytes = section->sh_size;
12426
12427   printf (_("\nString dump of section '%s':\n"), printable_section_name (section));
12428
12429   if (decompress_dumps)
12430     {
12431       dwarf_size_type new_size = num_bytes;
12432       dwarf_size_type uncompressed_size = 0;
12433
12434       if ((section->sh_flags & SHF_COMPRESSED) != 0)
12435         {
12436           Elf_Internal_Chdr chdr;
12437           unsigned int compression_header_size
12438             = get_compression_header (& chdr, (unsigned char *) start);
12439
12440           if (chdr.ch_type != ELFCOMPRESS_ZLIB)
12441             {
12442               warn (_("section '%s' has unsupported compress type: %d\n"),
12443                     printable_section_name (section), chdr.ch_type);
12444               return;
12445             }
12446           else if (chdr.ch_addralign != section->sh_addralign)
12447             {
12448               warn (_("compressed section '%s' is corrupted\n"),
12449                     printable_section_name (section));
12450               return;
12451             }
12452           uncompressed_size = chdr.ch_size;
12453           start += compression_header_size;
12454           new_size -= compression_header_size;
12455         }
12456       else if (new_size > 12 && streq ((char *) start, "ZLIB"))
12457         {
12458           /* Read the zlib header.  In this case, it should be "ZLIB"
12459              followed by the uncompressed section size, 8 bytes in
12460              big-endian order.  */
12461           uncompressed_size = start[4]; uncompressed_size <<= 8;
12462           uncompressed_size += start[5]; uncompressed_size <<= 8;
12463           uncompressed_size += start[6]; uncompressed_size <<= 8;
12464           uncompressed_size += start[7]; uncompressed_size <<= 8;
12465           uncompressed_size += start[8]; uncompressed_size <<= 8;
12466           uncompressed_size += start[9]; uncompressed_size <<= 8;
12467           uncompressed_size += start[10]; uncompressed_size <<= 8;
12468           uncompressed_size += start[11];
12469           start += 12;
12470           new_size -= 12;
12471         }
12472
12473       if (uncompressed_size
12474           && uncompress_section_contents (& start,
12475                                           uncompressed_size, & new_size))
12476         num_bytes = new_size;
12477     }
12478
12479   /* If the section being dumped has relocations against it the user might
12480      be expecting these relocations to have been applied.  Check for this
12481      case and issue a warning message in order to avoid confusion.
12482      FIXME: Maybe we ought to have an option that dumps a section with
12483      relocs applied ?  */
12484   for (relsec = section_headers;
12485        relsec < section_headers + elf_header.e_shnum;
12486        ++relsec)
12487     {
12488       if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12489           || relsec->sh_info >= elf_header.e_shnum
12490           || section_headers + relsec->sh_info != section
12491           || relsec->sh_size == 0
12492           || relsec->sh_link >= elf_header.e_shnum)
12493         continue;
12494
12495       printf (_("  Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
12496       break;
12497     }
12498
12499   data = start;
12500   end  = start + num_bytes;
12501   some_strings_shown = FALSE;
12502
12503   while (data < end)
12504     {
12505       while (!ISPRINT (* data))
12506         if (++ data >= end)
12507           break;
12508
12509       if (data < end)
12510         {
12511           size_t maxlen = end - data;
12512
12513 #ifndef __MSVCRT__
12514           /* PR 11128: Use two separate invocations in order to work
12515              around bugs in the Solaris 8 implementation of printf.  */
12516           printf ("  [%6tx]  ", data - start);
12517 #else
12518           printf ("  [%6Ix]  ", (size_t) (data - start));
12519 #endif
12520           if (maxlen > 0)
12521             {
12522               print_symbol ((int) maxlen, (const char *) data);
12523               putchar ('\n');
12524               data += strnlen ((const char *) data, maxlen);
12525             }
12526           else
12527             {
12528               printf (_("<corrupt>\n"));
12529               data = end;
12530             }
12531           some_strings_shown = TRUE;
12532         }
12533     }
12534
12535   if (! some_strings_shown)
12536     printf (_("  No strings found in this section."));
12537
12538   free (real_start);
12539
12540   putchar ('\n');
12541 }
12542
12543 static void
12544 dump_section_as_bytes (Elf_Internal_Shdr * section,
12545                        FILE * file,
12546                        bfd_boolean relocate)
12547 {
12548   Elf_Internal_Shdr * relsec;
12549   bfd_size_type       bytes;
12550   bfd_size_type       section_size;
12551   bfd_vma             addr;
12552   unsigned char *     data;
12553   unsigned char *     real_start;
12554   unsigned char *     start;
12555
12556   real_start = start = (unsigned char *) get_section_contents (section, file);
12557   if (start == NULL)
12558     return;
12559   section_size = section->sh_size;
12560
12561   printf (_("\nHex dump of section '%s':\n"), printable_section_name (section));
12562
12563   if (decompress_dumps)
12564     {
12565       dwarf_size_type new_size = section_size;
12566       dwarf_size_type uncompressed_size = 0;
12567
12568       if ((section->sh_flags & SHF_COMPRESSED) != 0)
12569         {
12570           Elf_Internal_Chdr chdr;
12571           unsigned int compression_header_size
12572             = get_compression_header (& chdr, start);
12573
12574           if (chdr.ch_type != ELFCOMPRESS_ZLIB)
12575             {
12576               warn (_("section '%s' has unsupported compress type: %d\n"),
12577                     printable_section_name (section), chdr.ch_type);
12578               return;
12579             }
12580           else if (chdr.ch_addralign != section->sh_addralign)
12581             {
12582               warn (_("compressed section '%s' is corrupted\n"),
12583                     printable_section_name (section));
12584               return;
12585             }
12586           uncompressed_size = chdr.ch_size;
12587           start += compression_header_size;
12588           new_size -= compression_header_size;
12589         }
12590       else if (new_size > 12 && streq ((char *) start, "ZLIB"))
12591         {
12592           /* Read the zlib header.  In this case, it should be "ZLIB"
12593              followed by the uncompressed section size, 8 bytes in
12594              big-endian order.  */
12595           uncompressed_size = start[4]; uncompressed_size <<= 8;
12596           uncompressed_size += start[5]; uncompressed_size <<= 8;
12597           uncompressed_size += start[6]; uncompressed_size <<= 8;
12598           uncompressed_size += start[7]; uncompressed_size <<= 8;
12599           uncompressed_size += start[8]; uncompressed_size <<= 8;
12600           uncompressed_size += start[9]; uncompressed_size <<= 8;
12601           uncompressed_size += start[10]; uncompressed_size <<= 8;
12602           uncompressed_size += start[11];
12603           start += 12;
12604           new_size -= 12;
12605         }
12606
12607       if (uncompressed_size
12608           && uncompress_section_contents (& start, uncompressed_size,
12609                                           & new_size))
12610         section_size = new_size;
12611     }
12612
12613   if (relocate)
12614     {
12615       apply_relocations (file, section, start, section_size, NULL, NULL);
12616     }
12617   else
12618     {
12619       /* If the section being dumped has relocations against it the user might
12620          be expecting these relocations to have been applied.  Check for this
12621          case and issue a warning message in order to avoid confusion.
12622          FIXME: Maybe we ought to have an option that dumps a section with
12623          relocs applied ?  */
12624       for (relsec = section_headers;
12625            relsec < section_headers + elf_header.e_shnum;
12626            ++relsec)
12627         {
12628           if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12629               || relsec->sh_info >= elf_header.e_shnum
12630               || section_headers + relsec->sh_info != section
12631               || relsec->sh_size == 0
12632               || relsec->sh_link >= elf_header.e_shnum)
12633             continue;
12634
12635           printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
12636           break;
12637         }
12638     }
12639
12640   addr = section->sh_addr;
12641   bytes = section_size;
12642   data = start;
12643
12644   while (bytes)
12645     {
12646       int j;
12647       int k;
12648       int lbytes;
12649
12650       lbytes = (bytes > 16 ? 16 : bytes);
12651
12652       printf ("  0x%8.8lx ", (unsigned long) addr);
12653
12654       for (j = 0; j < 16; j++)
12655         {
12656           if (j < lbytes)
12657             printf ("%2.2x", data[j]);
12658           else
12659             printf ("  ");
12660
12661           if ((j & 3) == 3)
12662             printf (" ");
12663         }
12664
12665       for (j = 0; j < lbytes; j++)
12666         {
12667           k = data[j];
12668           if (k >= ' ' && k < 0x7f)
12669             printf ("%c", k);
12670           else
12671             printf (".");
12672         }
12673
12674       putchar ('\n');
12675
12676       data  += lbytes;
12677       addr  += lbytes;
12678       bytes -= lbytes;
12679     }
12680
12681   free (real_start);
12682
12683   putchar ('\n');
12684 }
12685
12686 static int
12687 load_specific_debug_section (enum dwarf_section_display_enum debug,
12688                              const Elf_Internal_Shdr * sec, void * file)
12689 {
12690   struct dwarf_section * section = &debug_displays [debug].section;
12691   char buf [64];
12692
12693   /* If it is already loaded, do nothing.  */
12694   if (section->start != NULL)
12695     return 1;
12696
12697   snprintf (buf, sizeof (buf), _("%s section data"), section->name);
12698   section->address = sec->sh_addr;
12699   section->user_data = NULL;
12700   section->start = (unsigned char *) get_data (NULL, (FILE *) file,
12701                                                sec->sh_offset, 1,
12702                                                sec->sh_size, buf);
12703   if (section->start == NULL)
12704     section->size = 0;
12705   else
12706     {
12707       unsigned char *start = section->start;
12708       dwarf_size_type size = sec->sh_size;
12709       dwarf_size_type uncompressed_size = 0;
12710
12711       if ((sec->sh_flags & SHF_COMPRESSED) != 0)
12712         {
12713           Elf_Internal_Chdr chdr;
12714           unsigned int compression_header_size;
12715
12716           if (size < (is_32bit_elf
12717                       ? sizeof (Elf32_External_Chdr)
12718                       : sizeof (Elf64_External_Chdr)))
12719             {
12720               warn (_("compressed section %s is too small to contain a compression header"),
12721                     section->name);
12722               return 0;
12723             }
12724
12725           compression_header_size = get_compression_header (&chdr, start);
12726
12727           if (chdr.ch_type != ELFCOMPRESS_ZLIB)
12728             {
12729               warn (_("section '%s' has unsupported compress type: %d\n"),
12730                     section->name, chdr.ch_type);
12731               return 0;
12732             }
12733           else if (chdr.ch_addralign != sec->sh_addralign)
12734             {
12735               warn (_("compressed section '%s' is corrupted\n"),
12736                     section->name);
12737               return 0;
12738             }
12739           uncompressed_size = chdr.ch_size;
12740           start += compression_header_size;
12741           size -= compression_header_size;
12742         }
12743       else if (size > 12 && streq ((char *) start, "ZLIB"))
12744         {
12745           /* Read the zlib header.  In this case, it should be "ZLIB"
12746              followed by the uncompressed section size, 8 bytes in
12747              big-endian order.  */
12748           uncompressed_size = start[4]; uncompressed_size <<= 8;
12749           uncompressed_size += start[5]; uncompressed_size <<= 8;
12750           uncompressed_size += start[6]; uncompressed_size <<= 8;
12751           uncompressed_size += start[7]; uncompressed_size <<= 8;
12752           uncompressed_size += start[8]; uncompressed_size <<= 8;
12753           uncompressed_size += start[9]; uncompressed_size <<= 8;
12754           uncompressed_size += start[10]; uncompressed_size <<= 8;
12755           uncompressed_size += start[11];
12756           start += 12;
12757           size -= 12;
12758         }
12759
12760       if (uncompressed_size
12761           && uncompress_section_contents (&start, uncompressed_size,
12762                                           &size))
12763         {
12764           /* Free the compressed buffer, update the section buffer
12765              and the section size if uncompress is successful.  */
12766           free (section->start);
12767           section->start = start;
12768         }
12769       section->size = size;
12770     }
12771
12772   if (section->start == NULL)
12773     return 0;
12774
12775   if (debug_displays [debug].relocate)
12776     apply_relocations ((FILE *) file, sec, section->start, section->size,
12777                        & section->reloc_info, & section->num_relocs);
12778   else
12779     {
12780       section->reloc_info = NULL;
12781       section->num_relocs = 0;
12782     }
12783
12784   return 1;
12785 }
12786
12787 /* If this is not NULL, load_debug_section will only look for sections
12788    within the list of sections given here.  */
12789 unsigned int *section_subset = NULL;
12790
12791 int
12792 load_debug_section (enum dwarf_section_display_enum debug, void * file)
12793 {
12794   struct dwarf_section * section = &debug_displays [debug].section;
12795   Elf_Internal_Shdr * sec;
12796
12797   /* Locate the debug section.  */
12798   sec = find_section_in_set (section->uncompressed_name, section_subset);
12799   if (sec != NULL)
12800     section->name = section->uncompressed_name;
12801   else
12802     {
12803       sec = find_section_in_set (section->compressed_name, section_subset);
12804       if (sec != NULL)
12805         section->name = section->compressed_name;
12806     }
12807   if (sec == NULL)
12808     return 0;
12809
12810   /* If we're loading from a subset of sections, and we've loaded
12811      a section matching this name before, it's likely that it's a
12812      different one.  */
12813   if (section_subset != NULL)
12814     free_debug_section (debug);
12815
12816   return load_specific_debug_section (debug, sec, (FILE *) file);
12817 }
12818
12819 void
12820 free_debug_section (enum dwarf_section_display_enum debug)
12821 {
12822   struct dwarf_section * section = &debug_displays [debug].section;
12823
12824   if (section->start == NULL)
12825     return;
12826
12827   free ((char *) section->start);
12828   section->start = NULL;
12829   section->address = 0;
12830   section->size = 0;
12831 }
12832
12833 static int
12834 display_debug_section (int shndx, Elf_Internal_Shdr * section, FILE * file)
12835 {
12836   char * name = SECTION_NAME (section);
12837   const char * print_name = printable_section_name (section);
12838   bfd_size_type length;
12839   int result = 1;
12840   int i;
12841
12842   length = section->sh_size;
12843   if (length == 0)
12844     {
12845       printf (_("\nSection '%s' has no debugging data.\n"), print_name);
12846       return 0;
12847     }
12848   if (section->sh_type == SHT_NOBITS)
12849     {
12850       /* There is no point in dumping the contents of a debugging section
12851          which has the NOBITS type - the bits in the file will be random.
12852          This can happen when a file containing a .eh_frame section is
12853          stripped with the --only-keep-debug command line option.  */
12854       printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"),
12855               print_name);
12856       return 0;
12857     }
12858
12859   if (const_strneq (name, ".gnu.linkonce.wi."))
12860     name = ".debug_info";
12861
12862   /* See if we know how to display the contents of this section.  */
12863   for (i = 0; i < max; i++)
12864     if (streq (debug_displays[i].section.uncompressed_name, name)
12865         || (i == line && const_strneq (name, ".debug_line."))
12866         || streq (debug_displays[i].section.compressed_name, name))
12867       {
12868         struct dwarf_section * sec = &debug_displays [i].section;
12869         int secondary = (section != find_section (name));
12870
12871         if (secondary)
12872           free_debug_section ((enum dwarf_section_display_enum) i);
12873
12874         if (i == line && const_strneq (name, ".debug_line."))
12875           sec->name = name;
12876         else if (streq (sec->uncompressed_name, name))
12877           sec->name = sec->uncompressed_name;
12878         else
12879           sec->name = sec->compressed_name;
12880         if (load_specific_debug_section ((enum dwarf_section_display_enum) i,
12881                                          section, file))
12882           {
12883             /* If this debug section is part of a CU/TU set in a .dwp file,
12884                restrict load_debug_section to the sections in that set.  */
12885             section_subset = find_cu_tu_set (file, shndx);
12886
12887             result &= debug_displays[i].display (sec, file);
12888
12889             section_subset = NULL;
12890
12891             if (secondary || (i != info && i != abbrev))
12892               free_debug_section ((enum dwarf_section_display_enum) i);
12893           }
12894
12895         break;
12896       }
12897
12898   if (i == max)
12899     {
12900       printf (_("Unrecognized debug section: %s\n"), print_name);
12901       result = 0;
12902     }
12903
12904   return result;
12905 }
12906
12907 /* Set DUMP_SECTS for all sections where dumps were requested
12908    based on section name.  */
12909
12910 static void
12911 initialise_dumps_byname (void)
12912 {
12913   struct dump_list_entry * cur;
12914
12915   for (cur = dump_sects_byname; cur; cur = cur->next)
12916     {
12917       unsigned int i;
12918       int any;
12919
12920       for (i = 0, any = 0; i < elf_header.e_shnum; i++)
12921         if (streq (SECTION_NAME (section_headers + i), cur->name))
12922           {
12923             request_dump_bynumber (i, cur->type);
12924             any = 1;
12925           }
12926
12927       if (!any)
12928         warn (_("Section '%s' was not dumped because it does not exist!\n"),
12929               cur->name);
12930     }
12931 }
12932
12933 static void
12934 process_section_contents (FILE * file)
12935 {
12936   Elf_Internal_Shdr * section;
12937   unsigned int i;
12938
12939   if (! do_dump)
12940     return;
12941
12942   initialise_dumps_byname ();
12943
12944   for (i = 0, section = section_headers;
12945        i < elf_header.e_shnum && i < num_dump_sects;
12946        i++, section++)
12947     {
12948 #ifdef SUPPORT_DISASSEMBLY
12949       if (dump_sects[i] & DISASS_DUMP)
12950         disassemble_section (section, file);
12951 #endif
12952       if (dump_sects[i] & HEX_DUMP)
12953         dump_section_as_bytes (section, file, FALSE);
12954
12955       if (dump_sects[i] & RELOC_DUMP)
12956         dump_section_as_bytes (section, file, TRUE);
12957
12958       if (dump_sects[i] & STRING_DUMP)
12959         dump_section_as_strings (section, file);
12960
12961       if (dump_sects[i] & DEBUG_DUMP)
12962         display_debug_section (i, section, file);
12963     }
12964
12965   /* Check to see if the user requested a
12966      dump of a section that does not exist.  */
12967   while (i++ < num_dump_sects)
12968     if (dump_sects[i])
12969       warn (_("Section %d was not dumped because it does not exist!\n"), i);
12970 }
12971
12972 static void
12973 process_mips_fpe_exception (int mask)
12974 {
12975   if (mask)
12976     {
12977       int first = 1;
12978       if (mask & OEX_FPU_INEX)
12979         fputs ("INEX", stdout), first = 0;
12980       if (mask & OEX_FPU_UFLO)
12981         printf ("%sUFLO", first ? "" : "|"), first = 0;
12982       if (mask & OEX_FPU_OFLO)
12983         printf ("%sOFLO", first ? "" : "|"), first = 0;
12984       if (mask & OEX_FPU_DIV0)
12985         printf ("%sDIV0", first ? "" : "|"), first = 0;
12986       if (mask & OEX_FPU_INVAL)
12987         printf ("%sINVAL", first ? "" : "|");
12988     }
12989   else
12990     fputs ("0", stdout);
12991 }
12992
12993 /* Display's the value of TAG at location P.  If TAG is
12994    greater than 0 it is assumed to be an unknown tag, and
12995    a message is printed to this effect.  Otherwise it is
12996    assumed that a message has already been printed.
12997
12998    If the bottom bit of TAG is set it assumed to have a
12999    string value, otherwise it is assumed to have an integer
13000    value.
13001
13002    Returns an updated P pointing to the first unread byte
13003    beyond the end of TAG's value.
13004
13005    Reads at or beyond END will not be made.  */
13006
13007 static unsigned char *
13008 display_tag_value (int tag,
13009                    unsigned char * p,
13010                    const unsigned char * const end)
13011 {
13012   unsigned long val;
13013
13014   if (tag > 0)
13015     printf ("  Tag_unknown_%d: ", tag);
13016
13017   if (p >= end)
13018     {
13019       warn (_("<corrupt tag>\n"));
13020     }
13021   else if (tag & 1)
13022     {
13023       /* PR 17531 file: 027-19978-0.004.  */
13024       size_t maxlen = (end - p) - 1;
13025
13026       putchar ('"');
13027       if (maxlen > 0)
13028         {
13029           print_symbol ((int) maxlen, (const char *) p);
13030           p += strnlen ((char *) p, maxlen) + 1;
13031         }
13032       else
13033         {
13034           printf (_("<corrupt string tag>"));
13035           p = (unsigned char *) end;
13036         }
13037       printf ("\"\n");
13038     }
13039   else
13040     {
13041       unsigned int len;
13042
13043       val = read_uleb128 (p, &len, end);
13044       p += len;
13045       printf ("%ld (0x%lx)\n", val, val);
13046     }
13047
13048   assert (p <= end);
13049   return p;
13050 }
13051
13052 /* ARM EABI attributes section.  */
13053 typedef struct
13054 {
13055   unsigned int tag;
13056   const char * name;
13057   /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup.  */
13058   unsigned int type;
13059   const char ** table;
13060 } arm_attr_public_tag;
13061
13062 static const char * arm_attr_tag_CPU_arch[] =
13063   {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
13064    "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8", "", "v8-M.baseline",
13065    "v8-M.mainline"};
13066 static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
13067 static const char * arm_attr_tag_THUMB_ISA_use[] =
13068   {"No", "Thumb-1", "Thumb-2", "Yes"};
13069 static const char * arm_attr_tag_FP_arch[] =
13070   {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
13071    "FP for ARMv8", "FPv5/FP-D16 for ARMv8"};
13072 static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
13073 static const char * arm_attr_tag_Advanced_SIMD_arch[] =
13074   {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8",
13075    "NEON for ARMv8.1"};
13076 static const char * arm_attr_tag_PCS_config[] =
13077   {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
13078    "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
13079 static const char * arm_attr_tag_ABI_PCS_R9_use[] =
13080   {"V6", "SB", "TLS", "Unused"};
13081 static const char * arm_attr_tag_ABI_PCS_RW_data[] =
13082   {"Absolute", "PC-relative", "SB-relative", "None"};
13083 static const char * arm_attr_tag_ABI_PCS_RO_data[] =
13084   {"Absolute", "PC-relative", "None"};
13085 static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
13086   {"None", "direct", "GOT-indirect"};
13087 static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
13088   {"None", "??? 1", "2", "??? 3", "4"};
13089 static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
13090 static const char * arm_attr_tag_ABI_FP_denormal[] =
13091   {"Unused", "Needed", "Sign only"};
13092 static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
13093 static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
13094 static const char * arm_attr_tag_ABI_FP_number_model[] =
13095   {"Unused", "Finite", "RTABI", "IEEE 754"};
13096 static const char * arm_attr_tag_ABI_enum_size[] =
13097   {"Unused", "small", "int", "forced to int"};
13098 static const char * arm_attr_tag_ABI_HardFP_use[] =
13099   {"As Tag_FP_arch", "SP only", "Reserved", "Deprecated"};
13100 static const char * arm_attr_tag_ABI_VFP_args[] =
13101   {"AAPCS", "VFP registers", "custom", "compatible"};
13102 static const char * arm_attr_tag_ABI_WMMX_args[] =
13103   {"AAPCS", "WMMX registers", "custom"};
13104 static const char * arm_attr_tag_ABI_optimization_goals[] =
13105   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
13106     "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
13107 static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
13108   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
13109     "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
13110 static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
13111 static const char * arm_attr_tag_FP_HP_extension[] =
13112   {"Not Allowed", "Allowed"};
13113 static const char * arm_attr_tag_ABI_FP_16bit_format[] =
13114   {"None", "IEEE 754", "Alternative Format"};
13115 static const char * arm_attr_tag_DSP_extension[] =
13116   {"Follow architecture", "Allowed"};
13117 static const char * arm_attr_tag_MPextension_use[] =
13118   {"Not Allowed", "Allowed"};
13119 static const char * arm_attr_tag_DIV_use[] =
13120   {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
13121     "Allowed in v7-A with integer division extension"};
13122 static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
13123 static const char * arm_attr_tag_Virtualization_use[] =
13124   {"Not Allowed", "TrustZone", "Virtualization Extensions",
13125     "TrustZone and Virtualization Extensions"};
13126 static const char * arm_attr_tag_MPextension_use_legacy[] =
13127   {"Not Allowed", "Allowed"};
13128
13129 #define LOOKUP(id, name) \
13130   {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
13131 static arm_attr_public_tag arm_attr_public_tags[] =
13132 {
13133   {4, "CPU_raw_name", 1, NULL},
13134   {5, "CPU_name", 1, NULL},
13135   LOOKUP(6, CPU_arch),
13136   {7, "CPU_arch_profile", 0, NULL},
13137   LOOKUP(8, ARM_ISA_use),
13138   LOOKUP(9, THUMB_ISA_use),
13139   LOOKUP(10, FP_arch),
13140   LOOKUP(11, WMMX_arch),
13141   LOOKUP(12, Advanced_SIMD_arch),
13142   LOOKUP(13, PCS_config),
13143   LOOKUP(14, ABI_PCS_R9_use),
13144   LOOKUP(15, ABI_PCS_RW_data),
13145   LOOKUP(16, ABI_PCS_RO_data),
13146   LOOKUP(17, ABI_PCS_GOT_use),
13147   LOOKUP(18, ABI_PCS_wchar_t),
13148   LOOKUP(19, ABI_FP_rounding),
13149   LOOKUP(20, ABI_FP_denormal),
13150   LOOKUP(21, ABI_FP_exceptions),
13151   LOOKUP(22, ABI_FP_user_exceptions),
13152   LOOKUP(23, ABI_FP_number_model),
13153   {24, "ABI_align_needed", 0, NULL},
13154   {25, "ABI_align_preserved", 0, NULL},
13155   LOOKUP(26, ABI_enum_size),
13156   LOOKUP(27, ABI_HardFP_use),
13157   LOOKUP(28, ABI_VFP_args),
13158   LOOKUP(29, ABI_WMMX_args),
13159   LOOKUP(30, ABI_optimization_goals),
13160   LOOKUP(31, ABI_FP_optimization_goals),
13161   {32, "compatibility", 0, NULL},
13162   LOOKUP(34, CPU_unaligned_access),
13163   LOOKUP(36, FP_HP_extension),
13164   LOOKUP(38, ABI_FP_16bit_format),
13165   LOOKUP(42, MPextension_use),
13166   LOOKUP(44, DIV_use),
13167   LOOKUP(46, DSP_extension),
13168   {64, "nodefaults", 0, NULL},
13169   {65, "also_compatible_with", 0, NULL},
13170   LOOKUP(66, T2EE_use),
13171   {67, "conformance", 1, NULL},
13172   LOOKUP(68, Virtualization_use),
13173   LOOKUP(70, MPextension_use_legacy)
13174 };
13175 #undef LOOKUP
13176
13177 static unsigned char *
13178 display_arm_attribute (unsigned char * p,
13179                        const unsigned char * const end)
13180 {
13181   unsigned int tag;
13182   unsigned int len;
13183   unsigned int val;
13184   arm_attr_public_tag * attr;
13185   unsigned i;
13186   unsigned int type;
13187
13188   tag = read_uleb128 (p, &len, end);
13189   p += len;
13190   attr = NULL;
13191   for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
13192     {
13193       if (arm_attr_public_tags[i].tag == tag)
13194         {
13195           attr = &arm_attr_public_tags[i];
13196           break;
13197         }
13198     }
13199
13200   if (attr)
13201     {
13202       printf ("  Tag_%s: ", attr->name);
13203       switch (attr->type)
13204         {
13205         case 0:
13206           switch (tag)
13207             {
13208             case 7: /* Tag_CPU_arch_profile.  */
13209               val = read_uleb128 (p, &len, end);
13210               p += len;
13211               switch (val)
13212                 {
13213                 case 0: printf (_("None\n")); break;
13214                 case 'A': printf (_("Application\n")); break;
13215                 case 'R': printf (_("Realtime\n")); break;
13216                 case 'M': printf (_("Microcontroller\n")); break;
13217                 case 'S': printf (_("Application or Realtime\n")); break;
13218                 default: printf ("??? (%d)\n", val); break;
13219                 }
13220               break;
13221
13222             case 24: /* Tag_align_needed.  */
13223               val = read_uleb128 (p, &len, end);
13224               p += len;
13225               switch (val)
13226                 {
13227                 case 0: printf (_("None\n")); break;
13228                 case 1: printf (_("8-byte\n")); break;
13229                 case 2: printf (_("4-byte\n")); break;
13230                 case 3: printf ("??? 3\n"); break;
13231                 default:
13232                   if (val <= 12)
13233                     printf (_("8-byte and up to %d-byte extended\n"),
13234                             1 << val);
13235                   else
13236                     printf ("??? (%d)\n", val);
13237                   break;
13238                 }
13239               break;
13240
13241             case 25: /* Tag_align_preserved.  */
13242               val = read_uleb128 (p, &len, end);
13243               p += len;
13244               switch (val)
13245                 {
13246                 case 0: printf (_("None\n")); break;
13247                 case 1: printf (_("8-byte, except leaf SP\n")); break;
13248                 case 2: printf (_("8-byte\n")); break;
13249                 case 3: printf ("??? 3\n"); break;
13250                 default:
13251                   if (val <= 12)
13252                     printf (_("8-byte and up to %d-byte extended\n"),
13253                             1 << val);
13254                   else
13255                     printf ("??? (%d)\n", val);
13256                   break;
13257                 }
13258               break;
13259
13260             case 32: /* Tag_compatibility.  */
13261               {
13262                 val = read_uleb128 (p, &len, end);
13263                 p += len;
13264                 printf (_("flag = %d, vendor = "), val);
13265                 if (p < end - 1)
13266                   {
13267                     size_t maxlen = (end - p) - 1;
13268
13269                     print_symbol ((int) maxlen, (const char *) p);
13270                     p += strnlen ((char *) p, maxlen) + 1;
13271                   }
13272                 else
13273                   {
13274                     printf (_("<corrupt>"));
13275                     p = (unsigned char *) end;
13276                   }
13277                 putchar ('\n');
13278               }
13279               break;
13280
13281             case 64: /* Tag_nodefaults.  */
13282               /* PR 17531: file: 001-505008-0.01.  */
13283               if (p < end)
13284                 p++;
13285               printf (_("True\n"));
13286               break;
13287
13288             case 65: /* Tag_also_compatible_with.  */
13289               val = read_uleb128 (p, &len, end);
13290               p += len;
13291               if (val == 6 /* Tag_CPU_arch.  */)
13292                 {
13293                   val = read_uleb128 (p, &len, end);
13294                   p += len;
13295                   if ((unsigned int) val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
13296                     printf ("??? (%d)\n", val);
13297                   else
13298                     printf ("%s\n", arm_attr_tag_CPU_arch[val]);
13299                 }
13300               else
13301                 printf ("???\n");
13302               while (p < end && *(p++) != '\0' /* NUL terminator.  */)
13303                 ;
13304               break;
13305
13306             default:
13307               printf (_("<unknown: %d>\n"), tag);
13308               break;
13309             }
13310           return p;
13311
13312         case 1:
13313           return display_tag_value (-1, p, end);
13314         case 2:
13315           return display_tag_value (0, p, end);
13316
13317         default:
13318           assert (attr->type & 0x80);
13319           val = read_uleb128 (p, &len, end);
13320           p += len;
13321           type = attr->type & 0x7f;
13322           if (val >= type)
13323             printf ("??? (%d)\n", val);
13324           else
13325             printf ("%s\n", attr->table[val]);
13326           return p;
13327         }
13328     }
13329
13330   return display_tag_value (tag, p, end);
13331 }
13332
13333 static unsigned char *
13334 display_gnu_attribute (unsigned char * p,
13335                        unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const),
13336                        const unsigned char * const end)
13337 {
13338   int tag;
13339   unsigned int len;
13340   int val;
13341
13342   tag = read_uleb128 (p, &len, end);
13343   p += len;
13344
13345   /* Tag_compatibility is the only generic GNU attribute defined at
13346      present.  */
13347   if (tag == 32)
13348     {
13349       val = read_uleb128 (p, &len, end);
13350       p += len;
13351
13352       printf (_("flag = %d, vendor = "), val);
13353       if (p == end)
13354         {
13355           printf (_("<corrupt>\n"));
13356           warn (_("corrupt vendor attribute\n"));
13357         }
13358       else
13359         {
13360           if (p < end - 1)
13361             {
13362               size_t maxlen = (end - p) - 1;
13363
13364               print_symbol ((int) maxlen, (const char *) p);
13365               p += strnlen ((char *) p, maxlen) + 1;
13366             }
13367           else
13368             {
13369               printf (_("<corrupt>"));
13370               p = (unsigned char *) end;
13371             }
13372           putchar ('\n');
13373         }
13374       return p;
13375     }
13376
13377   if ((tag & 2) == 0 && display_proc_gnu_attribute)
13378     return display_proc_gnu_attribute (p, tag, end);
13379
13380   return display_tag_value (tag, p, end);
13381 }
13382
13383 static unsigned char *
13384 display_power_gnu_attribute (unsigned char * p,
13385                              int tag,
13386                              const unsigned char * const end)
13387 {
13388   unsigned int len;
13389   unsigned int val;
13390
13391   if (tag == Tag_GNU_Power_ABI_FP)
13392     {
13393       val = read_uleb128 (p, &len, end);
13394       p += len;
13395       printf ("  Tag_GNU_Power_ABI_FP: ");
13396       if (len == 0)
13397         {
13398           printf (_("<corrupt>\n"));
13399           return p;
13400         }
13401
13402       if (val > 15)
13403         printf ("(%#x), ", val);
13404
13405       switch (val & 3)
13406         {
13407         case 0:
13408           printf (_("unspecified hard/soft float, "));
13409           break;
13410         case 1:
13411           printf (_("hard float, "));
13412           break;
13413         case 2:
13414           printf (_("soft float, "));
13415           break;
13416         case 3:
13417           printf (_("single-precision hard float, "));
13418           break;
13419         }
13420
13421       switch (val & 0xC)
13422         {
13423         case 0:
13424           printf (_("unspecified long double\n"));
13425           break;
13426         case 4:
13427           printf (_("128-bit IBM long double\n"));
13428           break;
13429         case 8:
13430           printf (_("64-bit long double\n"));
13431           break;
13432         case 12:
13433           printf (_("128-bit IEEE long double\n"));
13434           break;
13435         }
13436       return p;
13437     }
13438
13439   if (tag == Tag_GNU_Power_ABI_Vector)
13440     {
13441       val = read_uleb128 (p, &len, end);
13442       p += len;
13443       printf ("  Tag_GNU_Power_ABI_Vector: ");
13444       if (len == 0)
13445         {
13446           printf (_("<corrupt>\n"));
13447           return p;
13448         }
13449
13450       if (val > 3)
13451         printf ("(%#x), ", val);
13452
13453       switch (val & 3)
13454         {
13455         case 0:
13456           printf (_("unspecified\n"));
13457           break;
13458         case 1:
13459           printf (_("generic\n"));
13460           break;
13461         case 2:
13462           printf ("AltiVec\n");
13463           break;
13464         case 3:
13465           printf ("SPE\n");
13466           break;
13467         }
13468       return p;
13469     }
13470
13471   if (tag == Tag_GNU_Power_ABI_Struct_Return)
13472     {
13473       val = read_uleb128 (p, &len, end);
13474       p += len;
13475       printf ("  Tag_GNU_Power_ABI_Struct_Return: ");
13476       if (len == 0)
13477         {
13478           printf (_("<corrupt>\n"));
13479           return p;
13480         }
13481
13482       if (val > 2)
13483         printf ("(%#x), ", val);
13484
13485       switch (val & 3)
13486         {
13487         case 0:
13488           printf (_("unspecified\n"));
13489           break;
13490         case 1:
13491           printf ("r3/r4\n");
13492           break;
13493         case 2:
13494           printf (_("memory\n"));
13495           break;
13496         case 3:
13497           printf ("???\n");
13498           break;
13499         }
13500       return p;
13501     }
13502
13503   return display_tag_value (tag & 1, p, end);
13504 }
13505
13506 static unsigned char *
13507 display_s390_gnu_attribute (unsigned char * p,
13508                             int tag,
13509                             const unsigned char * const end)
13510 {
13511   unsigned int len;
13512   int val;
13513
13514   if (tag == Tag_GNU_S390_ABI_Vector)
13515     {
13516       val = read_uleb128 (p, &len, end);
13517       p += len;
13518       printf ("  Tag_GNU_S390_ABI_Vector: ");
13519
13520       switch (val)
13521         {
13522         case 0:
13523           printf (_("any\n"));
13524           break;
13525         case 1:
13526           printf (_("software\n"));
13527           break;
13528         case 2:
13529           printf (_("hardware\n"));
13530           break;
13531         default:
13532           printf ("??? (%d)\n", val);
13533           break;
13534         }
13535       return p;
13536    }
13537
13538   return display_tag_value (tag & 1, p, end);
13539 }
13540
13541 static void
13542 display_sparc_hwcaps (int mask)
13543 {
13544   if (mask)
13545     {
13546       int first = 1;
13547
13548       if (mask & ELF_SPARC_HWCAP_MUL32)
13549         fputs ("mul32", stdout), first = 0;
13550       if (mask & ELF_SPARC_HWCAP_DIV32)
13551         printf ("%sdiv32", first ? "" : "|"), first = 0;
13552       if (mask & ELF_SPARC_HWCAP_FSMULD)
13553         printf ("%sfsmuld", first ? "" : "|"), first = 0;
13554       if (mask & ELF_SPARC_HWCAP_V8PLUS)
13555         printf ("%sv8plus", first ? "" : "|"), first = 0;
13556       if (mask & ELF_SPARC_HWCAP_POPC)
13557         printf ("%spopc", first ? "" : "|"), first = 0;
13558       if (mask & ELF_SPARC_HWCAP_VIS)
13559         printf ("%svis", first ? "" : "|"), first = 0;
13560       if (mask & ELF_SPARC_HWCAP_VIS2)
13561         printf ("%svis2", first ? "" : "|"), first = 0;
13562       if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
13563         printf ("%sASIBlkInit", first ? "" : "|"), first = 0;
13564       if (mask & ELF_SPARC_HWCAP_FMAF)
13565         printf ("%sfmaf", first ? "" : "|"), first = 0;
13566       if (mask & ELF_SPARC_HWCAP_VIS3)
13567         printf ("%svis3", first ? "" : "|"), first = 0;
13568       if (mask & ELF_SPARC_HWCAP_HPC)
13569         printf ("%shpc", first ? "" : "|"), first = 0;
13570       if (mask & ELF_SPARC_HWCAP_RANDOM)
13571         printf ("%srandom", first ? "" : "|"), first = 0;
13572       if (mask & ELF_SPARC_HWCAP_TRANS)
13573         printf ("%strans", first ? "" : "|"), first = 0;
13574       if (mask & ELF_SPARC_HWCAP_FJFMAU)
13575         printf ("%sfjfmau", first ? "" : "|"), first = 0;
13576       if (mask & ELF_SPARC_HWCAP_IMA)
13577         printf ("%sima", first ? "" : "|"), first = 0;
13578       if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
13579         printf ("%scspare", first ? "" : "|"), first = 0;
13580     }
13581   else
13582     fputc ('0', stdout);
13583   fputc ('\n', stdout);
13584 }
13585
13586 static void
13587 display_sparc_hwcaps2 (int mask)
13588 {
13589   if (mask)
13590     {
13591       int first = 1;
13592
13593       if (mask & ELF_SPARC_HWCAP2_FJATHPLUS)
13594         fputs ("fjathplus", stdout), first = 0;
13595       if (mask & ELF_SPARC_HWCAP2_VIS3B)
13596         printf ("%svis3b", first ? "" : "|"), first = 0;
13597       if (mask & ELF_SPARC_HWCAP2_ADP)
13598         printf ("%sadp", first ? "" : "|"), first = 0;
13599       if (mask & ELF_SPARC_HWCAP2_SPARC5)
13600         printf ("%ssparc5", first ? "" : "|"), first = 0;
13601       if (mask & ELF_SPARC_HWCAP2_MWAIT)
13602         printf ("%smwait", first ? "" : "|"), first = 0;
13603       if (mask & ELF_SPARC_HWCAP2_XMPMUL)
13604         printf ("%sxmpmul", first ? "" : "|"), first = 0;
13605       if (mask & ELF_SPARC_HWCAP2_XMONT)
13606         printf ("%sxmont2", first ? "" : "|"), first = 0;
13607       if (mask & ELF_SPARC_HWCAP2_NSEC)
13608         printf ("%snsec", first ? "" : "|"), first = 0;
13609       if (mask & ELF_SPARC_HWCAP2_FJATHHPC)
13610         printf ("%sfjathhpc", first ? "" : "|"), first = 0;
13611       if (mask & ELF_SPARC_HWCAP2_FJDES)
13612         printf ("%sfjdes", first ? "" : "|"), first = 0;
13613       if (mask & ELF_SPARC_HWCAP2_FJAES)
13614         printf ("%sfjaes", first ? "" : "|"), first = 0;
13615     }
13616   else
13617     fputc ('0', stdout);
13618   fputc ('\n', stdout);
13619 }
13620
13621 static unsigned char *
13622 display_sparc_gnu_attribute (unsigned char * p,
13623                              int tag,
13624                              const unsigned char * const end)
13625 {
13626   unsigned int len;
13627   int val;
13628
13629   if (tag == Tag_GNU_Sparc_HWCAPS)
13630     {
13631       val = read_uleb128 (p, &len, end);
13632       p += len;
13633       printf ("  Tag_GNU_Sparc_HWCAPS: ");
13634       display_sparc_hwcaps (val);
13635       return p;
13636     }
13637   if (tag == Tag_GNU_Sparc_HWCAPS2)
13638     {
13639       val = read_uleb128 (p, &len, end);
13640       p += len;
13641       printf ("  Tag_GNU_Sparc_HWCAPS2: ");
13642       display_sparc_hwcaps2 (val);
13643       return p;
13644     }
13645
13646   return display_tag_value (tag, p, end);
13647 }
13648
13649 static void
13650 print_mips_fp_abi_value (int val)
13651 {
13652   switch (val)
13653     {
13654     case Val_GNU_MIPS_ABI_FP_ANY:
13655       printf (_("Hard or soft float\n"));
13656       break;
13657     case Val_GNU_MIPS_ABI_FP_DOUBLE:
13658       printf (_("Hard float (double precision)\n"));
13659       break;
13660     case Val_GNU_MIPS_ABI_FP_SINGLE:
13661       printf (_("Hard float (single precision)\n"));
13662       break;
13663     case Val_GNU_MIPS_ABI_FP_SOFT:
13664       printf (_("Soft float\n"));
13665       break;
13666     case Val_GNU_MIPS_ABI_FP_OLD_64:
13667       printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
13668       break;
13669     case Val_GNU_MIPS_ABI_FP_XX:
13670       printf (_("Hard float (32-bit CPU, Any FPU)\n"));
13671       break;
13672     case Val_GNU_MIPS_ABI_FP_64:
13673       printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
13674       break;
13675     case Val_GNU_MIPS_ABI_FP_64A:
13676       printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
13677       break;
13678     case Val_GNU_MIPS_ABI_FP_NAN2008:
13679       printf (_("NaN 2008 compatibility\n"));
13680       break;
13681     default:
13682       printf ("??? (%d)\n", val);
13683       break;
13684     }
13685 }
13686
13687 static unsigned char *
13688 display_mips_gnu_attribute (unsigned char * p,
13689                             int tag,
13690                             const unsigned char * const end)
13691 {
13692   if (tag == Tag_GNU_MIPS_ABI_FP)
13693     {
13694       unsigned int len;
13695       int val;
13696
13697       val = read_uleb128 (p, &len, end);
13698       p += len;
13699       printf ("  Tag_GNU_MIPS_ABI_FP: ");
13700
13701       print_mips_fp_abi_value (val);
13702
13703       return p;
13704    }
13705
13706   if (tag == Tag_GNU_MIPS_ABI_MSA)
13707     {
13708       unsigned int len;
13709       int val;
13710
13711       val = read_uleb128 (p, &len, end);
13712       p += len;
13713       printf ("  Tag_GNU_MIPS_ABI_MSA: ");
13714
13715       switch (val)
13716         {
13717         case Val_GNU_MIPS_ABI_MSA_ANY:
13718           printf (_("Any MSA or not\n"));
13719           break;
13720         case Val_GNU_MIPS_ABI_MSA_128:
13721           printf (_("128-bit MSA\n"));
13722           break;
13723         default:
13724           printf ("??? (%d)\n", val);
13725           break;
13726         }
13727       return p;
13728     }
13729
13730   return display_tag_value (tag & 1, p, end);
13731 }
13732
13733 static unsigned char *
13734 display_tic6x_attribute (unsigned char * p,
13735                          const unsigned char * const end)
13736 {
13737   int tag;
13738   unsigned int len;
13739   int val;
13740
13741   tag = read_uleb128 (p, &len, end);
13742   p += len;
13743
13744   switch (tag)
13745     {
13746     case Tag_ISA:
13747       val = read_uleb128 (p, &len, end);
13748       p += len;
13749       printf ("  Tag_ISA: ");
13750
13751       switch (val)
13752         {
13753         case C6XABI_Tag_ISA_none:
13754           printf (_("None\n"));
13755           break;
13756         case C6XABI_Tag_ISA_C62X:
13757           printf ("C62x\n");
13758           break;
13759         case C6XABI_Tag_ISA_C67X:
13760           printf ("C67x\n");
13761           break;
13762         case C6XABI_Tag_ISA_C67XP:
13763           printf ("C67x+\n");
13764           break;
13765         case C6XABI_Tag_ISA_C64X:
13766           printf ("C64x\n");
13767           break;
13768         case C6XABI_Tag_ISA_C64XP:
13769           printf ("C64x+\n");
13770           break;
13771         case C6XABI_Tag_ISA_C674X:
13772           printf ("C674x\n");
13773           break;
13774         default:
13775           printf ("??? (%d)\n", val);
13776           break;
13777         }
13778       return p;
13779
13780     case Tag_ABI_wchar_t:
13781       val = read_uleb128 (p, &len, end);
13782       p += len;
13783       printf ("  Tag_ABI_wchar_t: ");
13784       switch (val)
13785         {
13786         case 0:
13787           printf (_("Not used\n"));
13788           break;
13789         case 1:
13790           printf (_("2 bytes\n"));
13791           break;
13792         case 2:
13793           printf (_("4 bytes\n"));
13794           break;
13795         default:
13796           printf ("??? (%d)\n", val);
13797           break;
13798         }
13799       return p;
13800
13801     case Tag_ABI_stack_align_needed:
13802       val = read_uleb128 (p, &len, end);
13803       p += len;
13804       printf ("  Tag_ABI_stack_align_needed: ");
13805       switch (val)
13806         {
13807         case 0:
13808           printf (_("8-byte\n"));
13809           break;
13810         case 1:
13811           printf (_("16-byte\n"));
13812           break;
13813         default:
13814           printf ("??? (%d)\n", val);
13815           break;
13816         }
13817       return p;
13818
13819     case Tag_ABI_stack_align_preserved:
13820       val = read_uleb128 (p, &len, end);
13821       p += len;
13822       printf ("  Tag_ABI_stack_align_preserved: ");
13823       switch (val)
13824         {
13825         case 0:
13826           printf (_("8-byte\n"));
13827           break;
13828         case 1:
13829           printf (_("16-byte\n"));
13830           break;
13831         default:
13832           printf ("??? (%d)\n", val);
13833           break;
13834         }
13835       return p;
13836
13837     case Tag_ABI_DSBT:
13838       val = read_uleb128 (p, &len, end);
13839       p += len;
13840       printf ("  Tag_ABI_DSBT: ");
13841       switch (val)
13842         {
13843         case 0:
13844           printf (_("DSBT addressing not used\n"));
13845           break;
13846         case 1:
13847           printf (_("DSBT addressing used\n"));
13848           break;
13849         default:
13850           printf ("??? (%d)\n", val);
13851           break;
13852         }
13853       return p;
13854
13855     case Tag_ABI_PID:
13856       val = read_uleb128 (p, &len, end);
13857       p += len;
13858       printf ("  Tag_ABI_PID: ");
13859       switch (val)
13860         {
13861         case 0:
13862           printf (_("Data addressing position-dependent\n"));
13863           break;
13864         case 1:
13865           printf (_("Data addressing position-independent, GOT near DP\n"));
13866           break;
13867         case 2:
13868           printf (_("Data addressing position-independent, GOT far from DP\n"));
13869           break;
13870         default:
13871           printf ("??? (%d)\n", val);
13872           break;
13873         }
13874       return p;
13875
13876     case Tag_ABI_PIC:
13877       val = read_uleb128 (p, &len, end);
13878       p += len;
13879       printf ("  Tag_ABI_PIC: ");
13880       switch (val)
13881         {
13882         case 0:
13883           printf (_("Code addressing position-dependent\n"));
13884           break;
13885         case 1:
13886           printf (_("Code addressing position-independent\n"));
13887           break;
13888         default:
13889           printf ("??? (%d)\n", val);
13890           break;
13891         }
13892       return p;
13893
13894     case Tag_ABI_array_object_alignment:
13895       val = read_uleb128 (p, &len, end);
13896       p += len;
13897       printf ("  Tag_ABI_array_object_alignment: ");
13898       switch (val)
13899         {
13900         case 0:
13901           printf (_("8-byte\n"));
13902           break;
13903         case 1:
13904           printf (_("4-byte\n"));
13905           break;
13906         case 2:
13907           printf (_("16-byte\n"));
13908           break;
13909         default:
13910           printf ("??? (%d)\n", val);
13911           break;
13912         }
13913       return p;
13914
13915     case Tag_ABI_array_object_align_expected:
13916       val = read_uleb128 (p, &len, end);
13917       p += len;
13918       printf ("  Tag_ABI_array_object_align_expected: ");
13919       switch (val)
13920         {
13921         case 0:
13922           printf (_("8-byte\n"));
13923           break;
13924         case 1:
13925           printf (_("4-byte\n"));
13926           break;
13927         case 2:
13928           printf (_("16-byte\n"));
13929           break;
13930         default:
13931           printf ("??? (%d)\n", val);
13932           break;
13933         }
13934       return p;
13935
13936     case Tag_ABI_compatibility:
13937       {
13938         val = read_uleb128 (p, &len, end);
13939         p += len;
13940         printf ("  Tag_ABI_compatibility: ");
13941         printf (_("flag = %d, vendor = "), val);
13942         if (p < end - 1)
13943           {
13944             size_t maxlen = (end - p) - 1;
13945
13946             print_symbol ((int) maxlen, (const char *) p);
13947             p += strnlen ((char *) p, maxlen) + 1;
13948           }
13949         else
13950           {
13951             printf (_("<corrupt>"));
13952             p = (unsigned char *) end;
13953           }
13954         putchar ('\n');
13955         return p;
13956       }
13957
13958     case Tag_ABI_conformance:
13959       {
13960         printf ("  Tag_ABI_conformance: \"");
13961         if (p < end - 1)
13962           {
13963             size_t maxlen = (end - p) - 1;
13964
13965             print_symbol ((int) maxlen, (const char *) p);
13966             p += strnlen ((char *) p, maxlen) + 1;
13967           }
13968         else
13969           {
13970             printf (_("<corrupt>"));
13971             p = (unsigned char *) end;
13972           }
13973         printf ("\"\n");
13974         return p;
13975       }
13976     }
13977
13978   return display_tag_value (tag, p, end);
13979 }
13980
13981 static void
13982 display_raw_attribute (unsigned char * p, unsigned char * end)
13983 {
13984   unsigned long addr = 0;
13985   size_t bytes = end - p;
13986
13987   assert (end > p);
13988   while (bytes)
13989     {
13990       int j;
13991       int k;
13992       int lbytes = (bytes > 16 ? 16 : bytes);
13993
13994       printf ("  0x%8.8lx ", addr);
13995
13996       for (j = 0; j < 16; j++)
13997         {
13998           if (j < lbytes)
13999             printf ("%2.2x", p[j]);
14000           else
14001             printf ("  ");
14002
14003           if ((j & 3) == 3)
14004             printf (" ");
14005         }
14006
14007       for (j = 0; j < lbytes; j++)
14008         {
14009           k = p[j];
14010           if (k >= ' ' && k < 0x7f)
14011             printf ("%c", k);
14012           else
14013             printf (".");
14014         }
14015
14016       putchar ('\n');
14017
14018       p  += lbytes;
14019       bytes -= lbytes;
14020       addr += lbytes;
14021     }
14022
14023   putchar ('\n');
14024 }
14025
14026 static unsigned char *
14027 display_msp430x_attribute (unsigned char * p,
14028                            const unsigned char * const end)
14029 {
14030   unsigned int len;
14031   int val;
14032   int tag;
14033
14034   tag = read_uleb128 (p, & len, end);
14035   p += len;
14036
14037   switch (tag)
14038     {
14039     case OFBA_MSPABI_Tag_ISA:
14040       val = read_uleb128 (p, &len, end);
14041       p += len;
14042       printf ("  Tag_ISA: ");
14043       switch (val)
14044         {
14045         case 0: printf (_("None\n")); break;
14046         case 1: printf (_("MSP430\n")); break;
14047         case 2: printf (_("MSP430X\n")); break;
14048         default: printf ("??? (%d)\n", val); break;
14049         }
14050       break;
14051
14052     case OFBA_MSPABI_Tag_Code_Model:
14053       val = read_uleb128 (p, &len, end);
14054       p += len;
14055       printf ("  Tag_Code_Model: ");
14056       switch (val)
14057         {
14058         case 0: printf (_("None\n")); break;
14059         case 1: printf (_("Small\n")); break;
14060         case 2: printf (_("Large\n")); break;
14061         default: printf ("??? (%d)\n", val); break;
14062         }
14063       break;
14064
14065     case OFBA_MSPABI_Tag_Data_Model:
14066       val = read_uleb128 (p, &len, end);
14067       p += len;
14068       printf ("  Tag_Data_Model: ");
14069       switch (val)
14070         {
14071         case 0: printf (_("None\n")); break;
14072         case 1: printf (_("Small\n")); break;
14073         case 2: printf (_("Large\n")); break;
14074         case 3: printf (_("Restricted Large\n")); break;
14075         default: printf ("??? (%d)\n", val); break;
14076         }
14077       break;
14078
14079     default:
14080       printf (_("  <unknown tag %d>: "), tag);
14081
14082       if (tag & 1)
14083         {
14084           putchar ('"');
14085           if (p < end - 1)
14086             {
14087               size_t maxlen = (end - p) - 1;
14088
14089               print_symbol ((int) maxlen, (const char *) p);
14090               p += strnlen ((char *) p, maxlen) + 1;
14091             }
14092           else
14093             {
14094               printf (_("<corrupt>"));
14095               p = (unsigned char *) end;
14096             }
14097           printf ("\"\n");
14098         }
14099       else
14100         {
14101           val = read_uleb128 (p, &len, end);
14102           p += len;
14103           printf ("%d (0x%x)\n", val, val);
14104         }
14105       break;
14106    }
14107
14108   assert (p <= end);
14109   return p;
14110 }
14111
14112 static int
14113 process_attributes (FILE * file,
14114                     const char * public_name,
14115                     unsigned int proc_type,
14116                     unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
14117                     unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const))
14118 {
14119   Elf_Internal_Shdr * sect;
14120   unsigned i;
14121
14122   /* Find the section header so that we get the size.  */
14123   for (i = 0, sect = section_headers;
14124        i < elf_header.e_shnum;
14125        i++, sect++)
14126     {
14127       unsigned char * contents;
14128       unsigned char * p;
14129
14130       if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
14131         continue;
14132
14133       contents = (unsigned char *) get_data (NULL, file, sect->sh_offset, 1,
14134                                              sect->sh_size, _("attributes"));
14135       if (contents == NULL)
14136         continue;
14137
14138       p = contents;
14139       if (*p == 'A')
14140         {
14141           bfd_vma section_len;
14142
14143           section_len = sect->sh_size - 1;
14144           p++;
14145
14146           while (section_len > 0)
14147             {
14148               bfd_vma attr_len;
14149               unsigned int namelen;
14150               bfd_boolean public_section;
14151               bfd_boolean gnu_section;
14152
14153               if (section_len <= 4)
14154                 {
14155                   error (_("Tag section ends prematurely\n"));
14156                   break;
14157                 }
14158               attr_len = byte_get (p, 4);
14159               p += 4;
14160
14161               if (attr_len > section_len)
14162                 {
14163                   error (_("Bad attribute length (%u > %u)\n"),
14164                           (unsigned) attr_len, (unsigned) section_len);
14165                   attr_len = section_len;
14166                 }
14167               /* PR 17531: file: 001-101425-0.004  */
14168               else if (attr_len < 5)
14169                 {
14170                   error (_("Attribute length of %u is too small\n"), (unsigned) attr_len);
14171                   break;
14172                 }
14173
14174               section_len -= attr_len;
14175               attr_len -= 4;
14176
14177               namelen = strnlen ((char *) p, attr_len) + 1;
14178               if (namelen == 0 || namelen >= attr_len)
14179                 {
14180                   error (_("Corrupt attribute section name\n"));
14181                   break;
14182                 }
14183
14184               printf (_("Attribute Section: "));
14185               print_symbol (INT_MAX, (const char *) p);
14186               putchar ('\n');
14187
14188               if (public_name && streq ((char *) p, public_name))
14189                 public_section = TRUE;
14190               else
14191                 public_section = FALSE;
14192
14193               if (streq ((char *) p, "gnu"))
14194                 gnu_section = TRUE;
14195               else
14196                 gnu_section = FALSE;
14197
14198               p += namelen;
14199               attr_len -= namelen;
14200
14201               while (attr_len > 0 && p < contents + sect->sh_size)
14202                 {
14203                   int tag;
14204                   int val;
14205                   bfd_vma size;
14206                   unsigned char * end;
14207
14208                   /* PR binutils/17531: Safe handling of corrupt files.  */
14209                   if (attr_len < 6)
14210                     {
14211                       error (_("Unused bytes at end of section\n"));
14212                       section_len = 0;
14213                       break;
14214                     }
14215
14216                   tag = *(p++);
14217                   size = byte_get (p, 4);
14218                   if (size > attr_len)
14219                     {
14220                       error (_("Bad subsection length (%u > %u)\n"),
14221                               (unsigned) size, (unsigned) attr_len);
14222                       size = attr_len;
14223                     }
14224                   /* PR binutils/17531: Safe handling of corrupt files.  */
14225                   if (size < 6)
14226                     {
14227                       error (_("Bad subsection length (%u < 6)\n"),
14228                               (unsigned) size);
14229                       section_len = 0;
14230                       break;
14231                     }
14232
14233                   attr_len -= size;
14234                   end = p + size - 1;
14235                   assert (end <= contents + sect->sh_size);
14236                   p += 4;
14237
14238                   switch (tag)
14239                     {
14240                     case 1:
14241                       printf (_("File Attributes\n"));
14242                       break;
14243                     case 2:
14244                       printf (_("Section Attributes:"));
14245                       goto do_numlist;
14246                     case 3:
14247                       printf (_("Symbol Attributes:"));
14248                       /* Fall through.  */
14249                     do_numlist:
14250                       for (;;)
14251                         {
14252                           unsigned int j;
14253
14254                           val = read_uleb128 (p, &j, end);
14255                           p += j;
14256                           if (val == 0)
14257                             break;
14258                           printf (" %d", val);
14259                         }
14260                       printf ("\n");
14261                       break;
14262                     default:
14263                       printf (_("Unknown tag: %d\n"), tag);
14264                       public_section = FALSE;
14265                       break;
14266                     }
14267
14268                   if (public_section && display_pub_attribute != NULL)
14269                     {
14270                       while (p < end)
14271                         p = display_pub_attribute (p, end);
14272                       assert (p <= end);
14273                     }
14274                   else if (gnu_section && display_proc_gnu_attribute != NULL)
14275                     {
14276                       while (p < end)
14277                         p = display_gnu_attribute (p,
14278                                                    display_proc_gnu_attribute,
14279                                                    end);
14280                       assert (p <= end);
14281                     }
14282                   else if (p < end)
14283                     {
14284                       printf (_("  Unknown attribute:\n"));
14285                       display_raw_attribute (p, end);
14286                       p = end;
14287                     }
14288                   else
14289                     attr_len = 0;
14290                 }
14291             }
14292         }
14293       else
14294         printf (_("Unknown format '%c' (%d)\n"), *p, *p);
14295
14296       free (contents);
14297     }
14298   return 1;
14299 }
14300
14301 static int
14302 process_arm_specific (FILE * file)
14303 {
14304   return process_attributes (file, "aeabi", SHT_ARM_ATTRIBUTES,
14305                              display_arm_attribute, NULL);
14306 }
14307
14308 static int
14309 process_power_specific (FILE * file)
14310 {
14311   return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14312                              display_power_gnu_attribute);
14313 }
14314
14315 static int
14316 process_s390_specific (FILE * file)
14317 {
14318   return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14319                              display_s390_gnu_attribute);
14320 }
14321
14322 static int
14323 process_sparc_specific (FILE * file)
14324 {
14325   return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14326                              display_sparc_gnu_attribute);
14327 }
14328
14329 static int
14330 process_tic6x_specific (FILE * file)
14331 {
14332   return process_attributes (file, "c6xabi", SHT_C6000_ATTRIBUTES,
14333                              display_tic6x_attribute, NULL);
14334 }
14335
14336 static int
14337 process_msp430x_specific (FILE * file)
14338 {
14339   return process_attributes (file, "mspabi", SHT_MSP430_ATTRIBUTES,
14340                              display_msp430x_attribute, NULL);
14341 }
14342
14343 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
14344    Print the Address, Access and Initial fields of an entry at VMA ADDR
14345    and return the VMA of the next entry, or -1 if there was a problem.
14346    Does not read from DATA_END or beyond.  */
14347
14348 static bfd_vma
14349 print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr,
14350                       unsigned char * data_end)
14351 {
14352   printf ("  ");
14353   print_vma (addr, LONG_HEX);
14354   printf (" ");
14355   if (addr < pltgot + 0xfff0)
14356     printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
14357   else
14358     printf ("%10s", "");
14359   printf (" ");
14360   if (data == NULL)
14361     printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
14362   else
14363     {
14364       bfd_vma entry;
14365       unsigned char * from = data + addr - pltgot;
14366
14367       if (from + (is_32bit_elf ? 4 : 8) > data_end)
14368         {
14369           warn (_("MIPS GOT entry extends beyond the end of available data\n"));
14370           printf ("%*s", is_32bit_elf ? 8 : 16, _("<corrupt>"));
14371           return (bfd_vma) -1;
14372         }
14373       else
14374         {
14375           entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
14376           print_vma (entry, LONG_HEX);
14377         }
14378     }
14379   return addr + (is_32bit_elf ? 4 : 8);
14380 }
14381
14382 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
14383    PLTGOT.  Print the Address and Initial fields of an entry at VMA
14384    ADDR and return the VMA of the next entry.  */
14385
14386 static bfd_vma
14387 print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
14388 {
14389   printf ("  ");
14390   print_vma (addr, LONG_HEX);
14391   printf (" ");
14392   if (data == NULL)
14393     printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
14394   else
14395     {
14396       bfd_vma entry;
14397
14398       entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
14399       print_vma (entry, LONG_HEX);
14400     }
14401   return addr + (is_32bit_elf ? 4 : 8);
14402 }
14403
14404 static void
14405 print_mips_ases (unsigned int mask)
14406 {
14407   if (mask & AFL_ASE_DSP)
14408     fputs ("\n\tDSP ASE", stdout);
14409   if (mask & AFL_ASE_DSPR2)
14410     fputs ("\n\tDSP R2 ASE", stdout);
14411   if (mask & AFL_ASE_DSPR3)
14412     fputs ("\n\tDSP R3 ASE", stdout);
14413   if (mask & AFL_ASE_EVA)
14414     fputs ("\n\tEnhanced VA Scheme", stdout);
14415   if (mask & AFL_ASE_MCU)
14416     fputs ("\n\tMCU (MicroController) ASE", stdout);
14417   if (mask & AFL_ASE_MDMX)
14418     fputs ("\n\tMDMX ASE", stdout);
14419   if (mask & AFL_ASE_MIPS3D)
14420     fputs ("\n\tMIPS-3D ASE", stdout);
14421   if (mask & AFL_ASE_MT)
14422     fputs ("\n\tMT ASE", stdout);
14423   if (mask & AFL_ASE_SMARTMIPS)
14424     fputs ("\n\tSmartMIPS ASE", stdout);
14425   if (mask & AFL_ASE_VIRT)
14426     fputs ("\n\tVZ ASE", stdout);
14427   if (mask & AFL_ASE_MSA)
14428     fputs ("\n\tMSA ASE", stdout);
14429   if (mask & AFL_ASE_MIPS16)
14430     fputs ("\n\tMIPS16 ASE", stdout);
14431   if (mask & AFL_ASE_MICROMIPS)
14432     fputs ("\n\tMICROMIPS ASE", stdout);
14433   if (mask & AFL_ASE_XPA)
14434     fputs ("\n\tXPA ASE", stdout);
14435   if (mask == 0)
14436     fprintf (stdout, "\n\t%s", _("None"));
14437   else if ((mask & ~AFL_ASE_MASK) != 0)
14438     fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
14439 }
14440
14441 static void
14442 print_mips_isa_ext (unsigned int isa_ext)
14443 {
14444   switch (isa_ext)
14445     {
14446     case 0:
14447       fputs (_("None"), stdout);
14448       break;
14449     case AFL_EXT_XLR:
14450       fputs ("RMI XLR", stdout);
14451       break;
14452     case AFL_EXT_OCTEON3:
14453       fputs ("Cavium Networks Octeon3", stdout);
14454       break;
14455     case AFL_EXT_OCTEON2:
14456       fputs ("Cavium Networks Octeon2", stdout);
14457       break;
14458     case AFL_EXT_OCTEONP:
14459       fputs ("Cavium Networks OcteonP", stdout);
14460       break;
14461     case AFL_EXT_LOONGSON_3A:
14462       fputs ("Loongson 3A", stdout);
14463       break;
14464     case AFL_EXT_OCTEON:
14465       fputs ("Cavium Networks Octeon", stdout);
14466       break;
14467     case AFL_EXT_5900:
14468       fputs ("Toshiba R5900", stdout);
14469       break;
14470     case AFL_EXT_4650:
14471       fputs ("MIPS R4650", stdout);
14472       break;
14473     case AFL_EXT_4010:
14474       fputs ("LSI R4010", stdout);
14475       break;
14476     case AFL_EXT_4100:
14477       fputs ("NEC VR4100", stdout);
14478       break;
14479     case AFL_EXT_3900:
14480       fputs ("Toshiba R3900", stdout);
14481       break;
14482     case AFL_EXT_10000:
14483       fputs ("MIPS R10000", stdout);
14484       break;
14485     case AFL_EXT_SB1:
14486       fputs ("Broadcom SB-1", stdout);
14487       break;
14488     case AFL_EXT_4111:
14489       fputs ("NEC VR4111/VR4181", stdout);
14490       break;
14491     case AFL_EXT_4120:
14492       fputs ("NEC VR4120", stdout);
14493       break;
14494     case AFL_EXT_5400:
14495       fputs ("NEC VR5400", stdout);
14496       break;
14497     case AFL_EXT_5500:
14498       fputs ("NEC VR5500", stdout);
14499       break;
14500     case AFL_EXT_LOONGSON_2E:
14501       fputs ("ST Microelectronics Loongson 2E", stdout);
14502       break;
14503     case AFL_EXT_LOONGSON_2F:
14504       fputs ("ST Microelectronics Loongson 2F", stdout);
14505       break;
14506     default:
14507       fprintf (stdout, "%s (%d)", _("Unknown"), isa_ext);
14508     }
14509 }
14510
14511 static int
14512 get_mips_reg_size (int reg_size)
14513 {
14514   return (reg_size == AFL_REG_NONE) ? 0
14515          : (reg_size == AFL_REG_32) ? 32
14516          : (reg_size == AFL_REG_64) ? 64
14517          : (reg_size == AFL_REG_128) ? 128
14518          : -1;
14519 }
14520
14521 static int
14522 process_mips_specific (FILE * file)
14523 {
14524   Elf_Internal_Dyn * entry;
14525   Elf_Internal_Shdr *sect = NULL;
14526   size_t liblist_offset = 0;
14527   size_t liblistno = 0;
14528   size_t conflictsno = 0;
14529   size_t options_offset = 0;
14530   size_t conflicts_offset = 0;
14531   size_t pltrelsz = 0;
14532   size_t pltrel = 0;
14533   bfd_vma pltgot = 0;
14534   bfd_vma mips_pltgot = 0;
14535   bfd_vma jmprel = 0;
14536   bfd_vma local_gotno = 0;
14537   bfd_vma gotsym = 0;
14538   bfd_vma symtabno = 0;
14539
14540   process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14541                       display_mips_gnu_attribute);
14542
14543   sect = find_section (".MIPS.abiflags");
14544
14545   if (sect != NULL)
14546     {
14547       Elf_External_ABIFlags_v0 *abiflags_ext;
14548       Elf_Internal_ABIFlags_v0 abiflags_in;
14549
14550       if (sizeof (Elf_External_ABIFlags_v0) != sect->sh_size)
14551         fputs ("\nCorrupt ABI Flags section.\n", stdout);
14552       else
14553         {
14554           abiflags_ext = get_data (NULL, file, sect->sh_offset, 1,
14555                                    sect->sh_size, _("MIPS ABI Flags section"));
14556           if (abiflags_ext)
14557             {
14558               abiflags_in.version = BYTE_GET (abiflags_ext->version);
14559               abiflags_in.isa_level = BYTE_GET (abiflags_ext->isa_level);
14560               abiflags_in.isa_rev = BYTE_GET (abiflags_ext->isa_rev);
14561               abiflags_in.gpr_size = BYTE_GET (abiflags_ext->gpr_size);
14562               abiflags_in.cpr1_size = BYTE_GET (abiflags_ext->cpr1_size);
14563               abiflags_in.cpr2_size = BYTE_GET (abiflags_ext->cpr2_size);
14564               abiflags_in.fp_abi = BYTE_GET (abiflags_ext->fp_abi);
14565               abiflags_in.isa_ext = BYTE_GET (abiflags_ext->isa_ext);
14566               abiflags_in.ases = BYTE_GET (abiflags_ext->ases);
14567               abiflags_in.flags1 = BYTE_GET (abiflags_ext->flags1);
14568               abiflags_in.flags2 = BYTE_GET (abiflags_ext->flags2);
14569
14570               printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in.version);
14571               printf ("\nISA: MIPS%d", abiflags_in.isa_level);
14572               if (abiflags_in.isa_rev > 1)
14573                 printf ("r%d", abiflags_in.isa_rev);
14574               printf ("\nGPR size: %d",
14575                       get_mips_reg_size (abiflags_in.gpr_size));
14576               printf ("\nCPR1 size: %d",
14577                       get_mips_reg_size (abiflags_in.cpr1_size));
14578               printf ("\nCPR2 size: %d",
14579                       get_mips_reg_size (abiflags_in.cpr2_size));
14580               fputs ("\nFP ABI: ", stdout);
14581               print_mips_fp_abi_value (abiflags_in.fp_abi);
14582               fputs ("ISA Extension: ", stdout);
14583               print_mips_isa_ext (abiflags_in.isa_ext);
14584               fputs ("\nASEs:", stdout);
14585               print_mips_ases (abiflags_in.ases);
14586               printf ("\nFLAGS 1: %8.8lx", abiflags_in.flags1);
14587               printf ("\nFLAGS 2: %8.8lx", abiflags_in.flags2);
14588               fputc ('\n', stdout);
14589               free (abiflags_ext);
14590             }
14591         }
14592     }
14593
14594   /* We have a lot of special sections.  Thanks SGI!  */
14595   if (dynamic_section == NULL)
14596     /* No information available.  */
14597     return 0;
14598
14599   for (entry = dynamic_section;
14600        /* PR 17531 file: 012-50589-0.004.  */
14601        entry < dynamic_section + dynamic_nent && entry->d_tag != DT_NULL;
14602        ++entry)
14603     switch (entry->d_tag)
14604       {
14605       case DT_MIPS_LIBLIST:
14606         liblist_offset
14607           = offset_from_vma (file, entry->d_un.d_val,
14608                              liblistno * sizeof (Elf32_External_Lib));
14609         break;
14610       case DT_MIPS_LIBLISTNO:
14611         liblistno = entry->d_un.d_val;
14612         break;
14613       case DT_MIPS_OPTIONS:
14614         options_offset = offset_from_vma (file, entry->d_un.d_val, 0);
14615         break;
14616       case DT_MIPS_CONFLICT:
14617         conflicts_offset
14618           = offset_from_vma (file, entry->d_un.d_val,
14619                              conflictsno * sizeof (Elf32_External_Conflict));
14620         break;
14621       case DT_MIPS_CONFLICTNO:
14622         conflictsno = entry->d_un.d_val;
14623         break;
14624       case DT_PLTGOT:
14625         pltgot = entry->d_un.d_ptr;
14626         break;
14627       case DT_MIPS_LOCAL_GOTNO:
14628         local_gotno = entry->d_un.d_val;
14629         break;
14630       case DT_MIPS_GOTSYM:
14631         gotsym = entry->d_un.d_val;
14632         break;
14633       case DT_MIPS_SYMTABNO:
14634         symtabno = entry->d_un.d_val;
14635         break;
14636       case DT_MIPS_PLTGOT:
14637         mips_pltgot = entry->d_un.d_ptr;
14638         break;
14639       case DT_PLTREL:
14640         pltrel = entry->d_un.d_val;
14641         break;
14642       case DT_PLTRELSZ:
14643         pltrelsz = entry->d_un.d_val;
14644         break;
14645       case DT_JMPREL:
14646         jmprel = entry->d_un.d_ptr;
14647         break;
14648       default:
14649         break;
14650       }
14651
14652   if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
14653     {
14654       Elf32_External_Lib * elib;
14655       size_t cnt;
14656
14657       elib = (Elf32_External_Lib *) get_data (NULL, file, liblist_offset,
14658                                               liblistno,
14659                                               sizeof (Elf32_External_Lib),
14660                                               _("liblist section data"));
14661       if (elib)
14662         {
14663           printf (_("\nSection '.liblist' contains %lu entries:\n"),
14664                   (unsigned long) liblistno);
14665           fputs (_("     Library              Time Stamp          Checksum   Version Flags\n"),
14666                  stdout);
14667
14668           for (cnt = 0; cnt < liblistno; ++cnt)
14669             {
14670               Elf32_Lib liblist;
14671               time_t atime;
14672               char timebuf[128];
14673               struct tm * tmp;
14674
14675               liblist.l_name = BYTE_GET (elib[cnt].l_name);
14676               atime = BYTE_GET (elib[cnt].l_time_stamp);
14677               liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
14678               liblist.l_version = BYTE_GET (elib[cnt].l_version);
14679               liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
14680
14681               tmp = gmtime (&atime);
14682               snprintf (timebuf, sizeof (timebuf),
14683                         "%04u-%02u-%02uT%02u:%02u:%02u",
14684                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
14685                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
14686
14687               printf ("%3lu: ", (unsigned long) cnt);
14688               if (VALID_DYNAMIC_NAME (liblist.l_name))
14689                 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
14690               else
14691                 printf (_("<corrupt: %9ld>"), liblist.l_name);
14692               printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
14693                       liblist.l_version);
14694
14695               if (liblist.l_flags == 0)
14696                 puts (_(" NONE"));
14697               else
14698                 {
14699                   static const struct
14700                   {
14701                     const char * name;
14702                     int bit;
14703                   }
14704                   l_flags_vals[] =
14705                   {
14706                     { " EXACT_MATCH", LL_EXACT_MATCH },
14707                     { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
14708                     { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
14709                     { " EXPORTS", LL_EXPORTS },
14710                     { " DELAY_LOAD", LL_DELAY_LOAD },
14711                     { " DELTA", LL_DELTA }
14712                   };
14713                   int flags = liblist.l_flags;
14714                   size_t fcnt;
14715
14716                   for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
14717                     if ((flags & l_flags_vals[fcnt].bit) != 0)
14718                       {
14719                         fputs (l_flags_vals[fcnt].name, stdout);
14720                         flags ^= l_flags_vals[fcnt].bit;
14721                       }
14722                   if (flags != 0)
14723                     printf (" %#x", (unsigned int) flags);
14724
14725                   puts ("");
14726                 }
14727             }
14728
14729           free (elib);
14730         }
14731     }
14732
14733   if (options_offset != 0)
14734     {
14735       Elf_External_Options * eopt;
14736       Elf_Internal_Options * iopt;
14737       Elf_Internal_Options * option;
14738       size_t offset;
14739       int cnt;
14740       sect = section_headers;
14741
14742       /* Find the section header so that we get the size.  */
14743       sect = find_section_by_type (SHT_MIPS_OPTIONS);
14744       /* PR 17533 file: 012-277276-0.004.  */
14745       if (sect == NULL)
14746         {
14747           error (_("No MIPS_OPTIONS header found\n"));
14748           return 0;
14749         }
14750
14751       eopt = (Elf_External_Options *) get_data (NULL, file, options_offset, 1,
14752                                                 sect->sh_size, _("options"));
14753       if (eopt)
14754         {
14755           iopt = (Elf_Internal_Options *)
14756               cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
14757           if (iopt == NULL)
14758             {
14759               error (_("Out of memory allocating space for MIPS options\n"));
14760               return 0;
14761             }
14762
14763           offset = cnt = 0;
14764           option = iopt;
14765
14766           while (offset <= sect->sh_size - sizeof (* eopt))
14767             {
14768               Elf_External_Options * eoption;
14769
14770               eoption = (Elf_External_Options *) ((char *) eopt + offset);
14771
14772               option->kind = BYTE_GET (eoption->kind);
14773               option->size = BYTE_GET (eoption->size);
14774               option->section = BYTE_GET (eoption->section);
14775               option->info = BYTE_GET (eoption->info);
14776
14777               /* PR 17531: file: ffa0fa3b.  */
14778               if (option->size < sizeof (* eopt)
14779                   || offset + option->size > sect->sh_size)
14780                 {
14781                   error (_("Invalid size (%u) for MIPS option\n"), option->size);
14782                   return 0;
14783                 }
14784               offset += option->size;
14785
14786               ++option;
14787               ++cnt;
14788             }
14789
14790           printf (_("\nSection '%s' contains %d entries:\n"),
14791                   printable_section_name (sect), cnt);
14792
14793           option = iopt;
14794           offset = 0;
14795
14796           while (cnt-- > 0)
14797             {
14798               size_t len;
14799
14800               switch (option->kind)
14801                 {
14802                 case ODK_NULL:
14803                   /* This shouldn't happen.  */
14804                   printf (" NULL       %d %lx", option->section, option->info);
14805                   break;
14806                 case ODK_REGINFO:
14807                   printf (" REGINFO    ");
14808                   if (elf_header.e_machine == EM_MIPS)
14809                     {
14810                       /* 32bit form.  */
14811                       Elf32_External_RegInfo * ereg;
14812                       Elf32_RegInfo reginfo;
14813
14814                       ereg = (Elf32_External_RegInfo *) (option + 1);
14815                       reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
14816                       reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
14817                       reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
14818                       reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
14819                       reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
14820                       reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
14821
14822                       printf ("GPR %08lx  GP 0x%lx\n",
14823                               reginfo.ri_gprmask,
14824                               (unsigned long) reginfo.ri_gp_value);
14825                       printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
14826                               reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
14827                               reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
14828                     }
14829                   else
14830                     {
14831                       /* 64 bit form.  */
14832                       Elf64_External_RegInfo * ereg;
14833                       Elf64_Internal_RegInfo reginfo;
14834
14835                       ereg = (Elf64_External_RegInfo *) (option + 1);
14836                       reginfo.ri_gprmask    = BYTE_GET (ereg->ri_gprmask);
14837                       reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
14838                       reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
14839                       reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
14840                       reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
14841                       reginfo.ri_gp_value   = BYTE_GET (ereg->ri_gp_value);
14842
14843                       printf ("GPR %08lx  GP 0x",
14844                               reginfo.ri_gprmask);
14845                       printf_vma (reginfo.ri_gp_value);
14846                       printf ("\n");
14847
14848                       printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
14849                               reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
14850                               reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
14851                     }
14852                   ++option;
14853                   continue;
14854                 case ODK_EXCEPTIONS:
14855                   fputs (" EXCEPTIONS fpe_min(", stdout);
14856                   process_mips_fpe_exception (option->info & OEX_FPU_MIN);
14857                   fputs (") fpe_max(", stdout);
14858                   process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
14859                   fputs (")", stdout);
14860
14861                   if (option->info & OEX_PAGE0)
14862                     fputs (" PAGE0", stdout);
14863                   if (option->info & OEX_SMM)
14864                     fputs (" SMM", stdout);
14865                   if (option->info & OEX_FPDBUG)
14866                     fputs (" FPDBUG", stdout);
14867                   if (option->info & OEX_DISMISS)
14868                     fputs (" DISMISS", stdout);
14869                   break;
14870                 case ODK_PAD:
14871                   fputs (" PAD       ", stdout);
14872                   if (option->info & OPAD_PREFIX)
14873                     fputs (" PREFIX", stdout);
14874                   if (option->info & OPAD_POSTFIX)
14875                     fputs (" POSTFIX", stdout);
14876                   if (option->info & OPAD_SYMBOL)
14877                     fputs (" SYMBOL", stdout);
14878                   break;
14879                 case ODK_HWPATCH:
14880                   fputs (" HWPATCH   ", stdout);
14881                   if (option->info & OHW_R4KEOP)
14882                     fputs (" R4KEOP", stdout);
14883                   if (option->info & OHW_R8KPFETCH)
14884                     fputs (" R8KPFETCH", stdout);
14885                   if (option->info & OHW_R5KEOP)
14886                     fputs (" R5KEOP", stdout);
14887                   if (option->info & OHW_R5KCVTL)
14888                     fputs (" R5KCVTL", stdout);
14889                   break;
14890                 case ODK_FILL:
14891                   fputs (" FILL       ", stdout);
14892                   /* XXX Print content of info word?  */
14893                   break;
14894                 case ODK_TAGS:
14895                   fputs (" TAGS       ", stdout);
14896                   /* XXX Print content of info word?  */
14897                   break;
14898                 case ODK_HWAND:
14899                   fputs (" HWAND     ", stdout);
14900                   if (option->info & OHWA0_R4KEOP_CHECKED)
14901                     fputs (" R4KEOP_CHECKED", stdout);
14902                   if (option->info & OHWA0_R4KEOP_CLEAN)
14903                     fputs (" R4KEOP_CLEAN", stdout);
14904                   break;
14905                 case ODK_HWOR:
14906                   fputs (" HWOR      ", stdout);
14907                   if (option->info & OHWA0_R4KEOP_CHECKED)
14908                     fputs (" R4KEOP_CHECKED", stdout);
14909                   if (option->info & OHWA0_R4KEOP_CLEAN)
14910                     fputs (" R4KEOP_CLEAN", stdout);
14911                   break;
14912                 case ODK_GP_GROUP:
14913                   printf (" GP_GROUP  %#06lx  self-contained %#06lx",
14914                           option->info & OGP_GROUP,
14915                           (option->info & OGP_SELF) >> 16);
14916                   break;
14917                 case ODK_IDENT:
14918                   printf (" IDENT     %#06lx  self-contained %#06lx",
14919                           option->info & OGP_GROUP,
14920                           (option->info & OGP_SELF) >> 16);
14921                   break;
14922                 default:
14923                   /* This shouldn't happen.  */
14924                   printf (" %3d ???     %d %lx",
14925                           option->kind, option->section, option->info);
14926                   break;
14927                 }
14928
14929               len = sizeof (* eopt);
14930               while (len < option->size)
14931                 {
14932                   unsigned char datum = * ((unsigned char *) eopt + offset + len);
14933
14934                   if (ISPRINT (datum))
14935                     printf ("%c", datum);
14936                   else
14937                     printf ("\\%03o", datum);
14938                   len ++;
14939                 }
14940               fputs ("\n", stdout);
14941
14942               offset += option->size;
14943               ++option;
14944             }
14945
14946           free (eopt);
14947         }
14948     }
14949
14950   if (conflicts_offset != 0 && conflictsno != 0)
14951     {
14952       Elf32_Conflict * iconf;
14953       size_t cnt;
14954
14955       if (dynamic_symbols == NULL)
14956         {
14957           error (_("conflict list found without a dynamic symbol table\n"));
14958           return 0;
14959         }
14960
14961       iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
14962       if (iconf == NULL)
14963         {
14964           error (_("Out of memory allocating space for dynamic conflicts\n"));
14965           return 0;
14966         }
14967
14968       if (is_32bit_elf)
14969         {
14970           Elf32_External_Conflict * econf32;
14971
14972           econf32 = (Elf32_External_Conflict *)
14973               get_data (NULL, file, conflicts_offset, conflictsno,
14974                         sizeof (* econf32), _("conflict"));
14975           if (!econf32)
14976             return 0;
14977
14978           for (cnt = 0; cnt < conflictsno; ++cnt)
14979             iconf[cnt] = BYTE_GET (econf32[cnt]);
14980
14981           free (econf32);
14982         }
14983       else
14984         {
14985           Elf64_External_Conflict * econf64;
14986
14987           econf64 = (Elf64_External_Conflict *)
14988               get_data (NULL, file, conflicts_offset, conflictsno,
14989                         sizeof (* econf64), _("conflict"));
14990           if (!econf64)
14991             return 0;
14992
14993           for (cnt = 0; cnt < conflictsno; ++cnt)
14994             iconf[cnt] = BYTE_GET (econf64[cnt]);
14995
14996           free (econf64);
14997         }
14998
14999       printf (_("\nSection '.conflict' contains %lu entries:\n"),
15000               (unsigned long) conflictsno);
15001       puts (_("  Num:    Index       Value  Name"));
15002
15003       for (cnt = 0; cnt < conflictsno; ++cnt)
15004         {
15005           printf ("%5lu: %8lu  ", (unsigned long) cnt, iconf[cnt]);
15006
15007           if (iconf[cnt] >= num_dynamic_syms)
15008             printf (_("<corrupt symbol index>"));
15009           else
15010             {
15011               Elf_Internal_Sym * psym;
15012
15013               psym = & dynamic_symbols[iconf[cnt]];
15014               print_vma (psym->st_value, FULL_HEX);
15015               putchar (' ');
15016               if (VALID_DYNAMIC_NAME (psym->st_name))
15017                 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
15018               else
15019                 printf (_("<corrupt: %14ld>"), psym->st_name);
15020             }
15021           putchar ('\n');
15022         }
15023
15024       free (iconf);
15025     }
15026
15027   if (pltgot != 0 && local_gotno != 0)
15028     {
15029       bfd_vma ent, local_end, global_end;
15030       size_t i, offset;
15031       unsigned char * data;
15032       unsigned char * data_end;
15033       int addr_size;
15034
15035       ent = pltgot;
15036       addr_size = (is_32bit_elf ? 4 : 8);
15037       local_end = pltgot + local_gotno * addr_size;
15038
15039       /* PR binutils/17533 file: 012-111227-0.004  */
15040       if (symtabno < gotsym)
15041         {
15042           error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
15043                  (unsigned long) gotsym, (unsigned long) symtabno);
15044           return 0;
15045         }
15046
15047       global_end = local_end + (symtabno - gotsym) * addr_size;
15048       /* PR 17531: file: 54c91a34.  */
15049       if (global_end < local_end)
15050         {
15051           error (_("Too many GOT symbols: %lu\n"), (unsigned long) symtabno);
15052           return 0;
15053         }
15054
15055       offset = offset_from_vma (file, pltgot, global_end - pltgot);
15056       data = (unsigned char *) get_data (NULL, file, offset,
15057                                          global_end - pltgot, 1,
15058                                          _("Global Offset Table data"));
15059       if (data == NULL)
15060         return 0;
15061       data_end = data + (global_end - pltgot);
15062
15063       printf (_("\nPrimary GOT:\n"));
15064       printf (_(" Canonical gp value: "));
15065       print_vma (pltgot + 0x7ff0, LONG_HEX);
15066       printf ("\n\n");
15067
15068       printf (_(" Reserved entries:\n"));
15069       printf (_("  %*s %10s %*s Purpose\n"),
15070               addr_size * 2, _("Address"), _("Access"),
15071               addr_size * 2, _("Initial"));
15072       ent = print_mips_got_entry (data, pltgot, ent, data_end);
15073       printf (_(" Lazy resolver\n"));
15074       if (ent == (bfd_vma) -1)
15075         goto got_print_fail;
15076       if (data
15077           && (byte_get (data + ent - pltgot, addr_size)
15078               >> (addr_size * 8 - 1)) != 0)
15079         {
15080           ent = print_mips_got_entry (data, pltgot, ent, data_end);
15081           printf (_(" Module pointer (GNU extension)\n"));
15082           if (ent == (bfd_vma) -1)
15083             goto got_print_fail;
15084         }
15085       printf ("\n");
15086
15087       if (ent < local_end)
15088         {
15089           printf (_(" Local entries:\n"));
15090           printf ("  %*s %10s %*s\n",
15091                   addr_size * 2, _("Address"), _("Access"),
15092                   addr_size * 2, _("Initial"));
15093           while (ent < local_end)
15094             {
15095               ent = print_mips_got_entry (data, pltgot, ent, data_end);
15096               printf ("\n");
15097               if (ent == (bfd_vma) -1)
15098                 goto got_print_fail;
15099             }
15100           printf ("\n");
15101         }
15102
15103       if (gotsym < symtabno)
15104         {
15105           int sym_width;
15106
15107           printf (_(" Global entries:\n"));
15108           printf ("  %*s %10s %*s %*s %-7s %3s %s\n",
15109                   addr_size * 2, _("Address"),
15110                   _("Access"),
15111                   addr_size * 2, _("Initial"),
15112                   addr_size * 2, _("Sym.Val."),
15113                   _("Type"),
15114                   /* Note for translators: "Ndx" = abbreviated form of "Index".  */
15115                   _("Ndx"), _("Name"));
15116
15117           sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
15118
15119           for (i = gotsym; i < symtabno; i++)
15120             {
15121               ent = print_mips_got_entry (data, pltgot, ent, data_end);
15122               printf (" ");
15123
15124               if (dynamic_symbols == NULL)
15125                 printf (_("<no dynamic symbols>"));
15126               else if (i < num_dynamic_syms)
15127                 {
15128                   Elf_Internal_Sym * psym = dynamic_symbols + i;
15129
15130                   print_vma (psym->st_value, LONG_HEX);
15131                   printf (" %-7s %3s ",
15132                           get_symbol_type (ELF_ST_TYPE (psym->st_info)),
15133                           get_symbol_index_type (psym->st_shndx));
15134
15135                   if (VALID_DYNAMIC_NAME (psym->st_name))
15136                     print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
15137                   else
15138                     printf (_("<corrupt: %14ld>"), psym->st_name);
15139                 }
15140               else
15141                 printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
15142                         (unsigned long) i);
15143
15144               printf ("\n");
15145               if (ent == (bfd_vma) -1)
15146                 break;
15147             }
15148           printf ("\n");
15149         }
15150
15151     got_print_fail:
15152       if (data)
15153         free (data);
15154     }
15155
15156   if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
15157     {
15158       bfd_vma ent, end;
15159       size_t offset, rel_offset;
15160       unsigned long count, i;
15161       unsigned char * data;
15162       int addr_size, sym_width;
15163       Elf_Internal_Rela * rels;
15164
15165       rel_offset = offset_from_vma (file, jmprel, pltrelsz);
15166       if (pltrel == DT_RELA)
15167         {
15168           if (!slurp_rela_relocs (file, rel_offset, pltrelsz, &rels, &count))
15169             return 0;
15170         }
15171       else
15172         {
15173           if (!slurp_rel_relocs (file, rel_offset, pltrelsz, &rels, &count))
15174             return 0;
15175         }
15176
15177       ent = mips_pltgot;
15178       addr_size = (is_32bit_elf ? 4 : 8);
15179       end = mips_pltgot + (2 + count) * addr_size;
15180
15181       offset = offset_from_vma (file, mips_pltgot, end - mips_pltgot);
15182       data = (unsigned char *) get_data (NULL, file, offset, end - mips_pltgot,
15183                                          1, _("Procedure Linkage Table data"));
15184       if (data == NULL)
15185         return 0;
15186
15187       printf ("\nPLT GOT:\n\n");
15188       printf (_(" Reserved entries:\n"));
15189       printf (_("  %*s %*s Purpose\n"),
15190               addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
15191       ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
15192       printf (_(" PLT lazy resolver\n"));
15193       ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
15194       printf (_(" Module pointer\n"));
15195       printf ("\n");
15196
15197       printf (_(" Entries:\n"));
15198       printf ("  %*s %*s %*s %-7s %3s %s\n",
15199               addr_size * 2, _("Address"),
15200               addr_size * 2, _("Initial"),
15201               addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
15202       sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
15203       for (i = 0; i < count; i++)
15204         {
15205           unsigned long idx = get_reloc_symindex (rels[i].r_info);
15206
15207           ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
15208           printf (" ");
15209
15210           if (idx >= num_dynamic_syms)
15211             printf (_("<corrupt symbol index: %lu>"), idx);
15212           else
15213             {
15214               Elf_Internal_Sym * psym = dynamic_symbols + idx;
15215
15216               print_vma (psym->st_value, LONG_HEX);
15217               printf (" %-7s %3s ",
15218                       get_symbol_type (ELF_ST_TYPE (psym->st_info)),
15219                       get_symbol_index_type (psym->st_shndx));
15220               if (VALID_DYNAMIC_NAME (psym->st_name))
15221                 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
15222               else
15223                 printf (_("<corrupt: %14ld>"), psym->st_name);
15224             }
15225           printf ("\n");
15226         }
15227       printf ("\n");
15228
15229       if (data)
15230         free (data);
15231       free (rels);
15232     }
15233
15234   return 1;
15235 }
15236
15237 static int
15238 process_nds32_specific (FILE * file)
15239 {
15240   Elf_Internal_Shdr *sect = NULL;
15241
15242   sect = find_section (".nds32_e_flags");
15243   if (sect != NULL)
15244     {
15245       unsigned int *flag;
15246
15247       printf ("\nNDS32 elf flags section:\n");
15248       flag = get_data (NULL, file, sect->sh_offset, 1,
15249                        sect->sh_size, _("NDS32 elf flags section"));
15250
15251       switch ((*flag) & 0x3)
15252         {
15253         case 0:
15254           printf ("(VEC_SIZE):\tNo entry.\n");
15255           break;
15256         case 1:
15257           printf ("(VEC_SIZE):\t4 bytes\n");
15258           break;
15259         case 2:
15260           printf ("(VEC_SIZE):\t16 bytes\n");
15261           break;
15262         case 3:
15263           printf ("(VEC_SIZE):\treserved\n");
15264           break;
15265         }
15266     }
15267
15268   return TRUE;
15269 }
15270
15271 static int
15272 process_gnu_liblist (FILE * file)
15273 {
15274   Elf_Internal_Shdr * section;
15275   Elf_Internal_Shdr * string_sec;
15276   Elf32_External_Lib * elib;
15277   char * strtab;
15278   size_t strtab_size;
15279   size_t cnt;
15280   unsigned i;
15281
15282   if (! do_arch)
15283     return 0;
15284
15285   for (i = 0, section = section_headers;
15286        i < elf_header.e_shnum;
15287        i++, section++)
15288     {
15289       switch (section->sh_type)
15290         {
15291         case SHT_GNU_LIBLIST:
15292           if (section->sh_link >= elf_header.e_shnum)
15293             break;
15294
15295           elib = (Elf32_External_Lib *)
15296               get_data (NULL, file, section->sh_offset, 1, section->sh_size,
15297                         _("liblist section data"));
15298
15299           if (elib == NULL)
15300             break;
15301           string_sec = section_headers + section->sh_link;
15302
15303           strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
15304                                       string_sec->sh_size,
15305                                       _("liblist string table"));
15306           if (strtab == NULL
15307               || section->sh_entsize != sizeof (Elf32_External_Lib))
15308             {
15309               free (elib);
15310               free (strtab);
15311               break;
15312             }
15313           strtab_size = string_sec->sh_size;
15314
15315           printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
15316                   printable_section_name (section),
15317                   (unsigned long) (section->sh_size / sizeof (Elf32_External_Lib)));
15318
15319           puts (_("     Library              Time Stamp          Checksum   Version Flags"));
15320
15321           for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
15322                ++cnt)
15323             {
15324               Elf32_Lib liblist;
15325               time_t atime;
15326               char timebuf[128];
15327               struct tm * tmp;
15328
15329               liblist.l_name = BYTE_GET (elib[cnt].l_name);
15330               atime = BYTE_GET (elib[cnt].l_time_stamp);
15331               liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
15332               liblist.l_version = BYTE_GET (elib[cnt].l_version);
15333               liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
15334
15335               tmp = gmtime (&atime);
15336               snprintf (timebuf, sizeof (timebuf),
15337                         "%04u-%02u-%02uT%02u:%02u:%02u",
15338                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
15339                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
15340
15341               printf ("%3lu: ", (unsigned long) cnt);
15342               if (do_wide)
15343                 printf ("%-20s", liblist.l_name < strtab_size
15344                         ? strtab + liblist.l_name : _("<corrupt>"));
15345               else
15346                 printf ("%-20.20s", liblist.l_name < strtab_size
15347                         ? strtab + liblist.l_name : _("<corrupt>"));
15348               printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
15349                       liblist.l_version, liblist.l_flags);
15350             }
15351
15352           free (elib);
15353           free (strtab);
15354         }
15355     }
15356
15357   return 1;
15358 }
15359
15360 static const char *
15361 get_note_type (unsigned e_type)
15362 {
15363   static char buff[64];
15364
15365   if (elf_header.e_type == ET_CORE)
15366     switch (e_type)
15367       {
15368       case NT_AUXV:
15369         return _("NT_AUXV (auxiliary vector)");
15370       case NT_PRSTATUS:
15371         return _("NT_PRSTATUS (prstatus structure)");
15372       case NT_FPREGSET:
15373         return _("NT_FPREGSET (floating point registers)");
15374       case NT_PRPSINFO:
15375         return _("NT_PRPSINFO (prpsinfo structure)");
15376       case NT_TASKSTRUCT:
15377         return _("NT_TASKSTRUCT (task structure)");
15378       case NT_PRXFPREG:
15379         return _("NT_PRXFPREG (user_xfpregs structure)");
15380       case NT_PPC_VMX:
15381         return _("NT_PPC_VMX (ppc Altivec registers)");
15382       case NT_PPC_VSX:
15383         return _("NT_PPC_VSX (ppc VSX registers)");
15384       case NT_386_TLS:
15385         return _("NT_386_TLS (x86 TLS information)");
15386       case NT_386_IOPERM:
15387         return _("NT_386_IOPERM (x86 I/O permissions)");
15388       case NT_X86_XSTATE:
15389         return _("NT_X86_XSTATE (x86 XSAVE extended state)");
15390       case NT_S390_HIGH_GPRS:
15391         return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
15392       case NT_S390_TIMER:
15393         return _("NT_S390_TIMER (s390 timer register)");
15394       case NT_S390_TODCMP:
15395         return _("NT_S390_TODCMP (s390 TOD comparator register)");
15396       case NT_S390_TODPREG:
15397         return _("NT_S390_TODPREG (s390 TOD programmable register)");
15398       case NT_S390_CTRS:
15399         return _("NT_S390_CTRS (s390 control registers)");
15400       case NT_S390_PREFIX:
15401         return _("NT_S390_PREFIX (s390 prefix register)");
15402       case NT_S390_LAST_BREAK:
15403         return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
15404       case NT_S390_SYSTEM_CALL:
15405         return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
15406       case NT_S390_TDB:
15407         return _("NT_S390_TDB (s390 transaction diagnostic block)");
15408       case NT_S390_VXRS_LOW:
15409         return _("NT_S390_VXRS_LOW (s390 vector registers 0-15 upper half)");
15410       case NT_S390_VXRS_HIGH:
15411         return _("NT_S390_VXRS_HIGH (s390 vector registers 16-31)");
15412       case NT_ARM_VFP:
15413         return _("NT_ARM_VFP (arm VFP registers)");
15414       case NT_ARM_TLS:
15415         return _("NT_ARM_TLS (AArch TLS registers)");
15416       case NT_ARM_HW_BREAK:
15417         return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
15418       case NT_ARM_HW_WATCH:
15419         return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
15420       case NT_PSTATUS:
15421         return _("NT_PSTATUS (pstatus structure)");
15422       case NT_FPREGS:
15423         return _("NT_FPREGS (floating point registers)");
15424       case NT_PSINFO:
15425         return _("NT_PSINFO (psinfo structure)");
15426       case NT_LWPSTATUS:
15427         return _("NT_LWPSTATUS (lwpstatus_t structure)");
15428       case NT_LWPSINFO:
15429         return _("NT_LWPSINFO (lwpsinfo_t structure)");
15430       case NT_WIN32PSTATUS:
15431         return _("NT_WIN32PSTATUS (win32_pstatus structure)");
15432       case NT_SIGINFO:
15433         return _("NT_SIGINFO (siginfo_t data)");
15434       case NT_FILE:
15435         return _("NT_FILE (mapped files)");
15436       default:
15437         break;
15438       }
15439   else
15440     switch (e_type)
15441       {
15442       case NT_VERSION:
15443         return _("NT_VERSION (version)");
15444       case NT_ARCH:
15445         return _("NT_ARCH (architecture)");
15446       default:
15447         break;
15448       }
15449
15450   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15451   return buff;
15452 }
15453
15454 static int
15455 print_core_note (Elf_Internal_Note *pnote)
15456 {
15457   unsigned int addr_size = is_32bit_elf ? 4 : 8;
15458   bfd_vma count, page_size;
15459   unsigned char *descdata, *filenames, *descend;
15460
15461   if (pnote->type != NT_FILE)
15462     return 1;
15463
15464 #ifndef BFD64
15465   if (!is_32bit_elf)
15466     {
15467       printf (_("    Cannot decode 64-bit note in 32-bit build\n"));
15468       /* Still "successful".  */
15469       return 1;
15470     }
15471 #endif
15472
15473   if (pnote->descsz < 2 * addr_size)
15474     {
15475       printf (_("    Malformed note - too short for header\n"));
15476       return 0;
15477     }
15478
15479   descdata = (unsigned char *) pnote->descdata;
15480   descend = descdata + pnote->descsz;
15481
15482   if (descdata[pnote->descsz - 1] != '\0')
15483     {
15484       printf (_("    Malformed note - does not end with \\0\n"));
15485       return 0;
15486     }
15487
15488   count = byte_get (descdata, addr_size);
15489   descdata += addr_size;
15490
15491   page_size = byte_get (descdata, addr_size);
15492   descdata += addr_size;
15493
15494   if (pnote->descsz < 2 * addr_size + count * 3 * addr_size)
15495     {
15496       printf (_("    Malformed note - too short for supplied file count\n"));
15497       return 0;
15498     }
15499
15500   printf (_("    Page size: "));
15501   print_vma (page_size, DEC);
15502   printf ("\n");
15503
15504   printf (_("    %*s%*s%*s\n"),
15505           (int) (2 + 2 * addr_size), _("Start"),
15506           (int) (4 + 2 * addr_size), _("End"),
15507           (int) (4 + 2 * addr_size), _("Page Offset"));
15508   filenames = descdata + count * 3 * addr_size;
15509   while (count-- > 0)
15510     {
15511       bfd_vma start, end, file_ofs;
15512
15513       if (filenames == descend)
15514         {
15515           printf (_("    Malformed note - filenames end too early\n"));
15516           return 0;
15517         }
15518
15519       start = byte_get (descdata, addr_size);
15520       descdata += addr_size;
15521       end = byte_get (descdata, addr_size);
15522       descdata += addr_size;
15523       file_ofs = byte_get (descdata, addr_size);
15524       descdata += addr_size;
15525
15526       printf ("    ");
15527       print_vma (start, FULL_HEX);
15528       printf ("  ");
15529       print_vma (end, FULL_HEX);
15530       printf ("  ");
15531       print_vma (file_ofs, FULL_HEX);
15532       printf ("\n        %s\n", filenames);
15533
15534       filenames += 1 + strlen ((char *) filenames);
15535     }
15536
15537   return 1;
15538 }
15539
15540 static const char *
15541 get_gnu_elf_note_type (unsigned e_type)
15542 {
15543   static char buff[64];
15544
15545   switch (e_type)
15546     {
15547     case NT_GNU_ABI_TAG:
15548       return _("NT_GNU_ABI_TAG (ABI version tag)");
15549     case NT_GNU_HWCAP:
15550       return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
15551     case NT_GNU_BUILD_ID:
15552       return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
15553     case NT_GNU_GOLD_VERSION:
15554       return _("NT_GNU_GOLD_VERSION (gold version)");
15555     default:
15556       break;
15557     }
15558
15559   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15560   return buff;
15561 }
15562
15563 static int
15564 print_gnu_note (Elf_Internal_Note *pnote)
15565 {
15566   switch (pnote->type)
15567     {
15568     case NT_GNU_BUILD_ID:
15569       {
15570         unsigned long i;
15571
15572         printf (_("    Build ID: "));
15573         for (i = 0; i < pnote->descsz; ++i)
15574           printf ("%02x", pnote->descdata[i] & 0xff);
15575         printf ("\n");
15576       }
15577       break;
15578
15579     case NT_GNU_ABI_TAG:
15580       {
15581         unsigned long os, major, minor, subminor;
15582         const char *osname;
15583
15584         /* PR 17531: file: 030-599401-0.004.  */
15585         if (pnote->descsz < 16)
15586           {
15587             printf (_("    <corrupt GNU_ABI_TAG>\n"));
15588             break;
15589           }
15590
15591         os = byte_get ((unsigned char *) pnote->descdata, 4);
15592         major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
15593         minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
15594         subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
15595
15596         switch (os)
15597           {
15598           case GNU_ABI_TAG_LINUX:
15599             osname = "Linux";
15600             break;
15601           case GNU_ABI_TAG_HURD:
15602             osname = "Hurd";
15603             break;
15604           case GNU_ABI_TAG_SOLARIS:
15605             osname = "Solaris";
15606             break;
15607           case GNU_ABI_TAG_FREEBSD:
15608             osname = "FreeBSD";
15609             break;
15610           case GNU_ABI_TAG_NETBSD:
15611             osname = "NetBSD";
15612             break;
15613           case GNU_ABI_TAG_SYLLABLE:
15614             osname = "Syllable";
15615             break;
15616           case GNU_ABI_TAG_NACL:
15617             osname = "NaCl";
15618             break;
15619           default:
15620             osname = "Unknown";
15621             break;
15622           }
15623
15624         printf (_("    OS: %s, ABI: %ld.%ld.%ld\n"), osname,
15625                 major, minor, subminor);
15626       }
15627       break;
15628
15629     case NT_GNU_GOLD_VERSION:
15630       {
15631         unsigned long i;
15632
15633         printf (_("    Version: "));
15634         for (i = 0; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
15635           printf ("%c", pnote->descdata[i]);
15636         printf ("\n");
15637       }
15638       break;
15639     }
15640
15641   return 1;
15642 }
15643
15644 static const char *
15645 get_v850_elf_note_type (enum v850_notes n_type)
15646 {
15647   static char buff[64];
15648
15649   switch (n_type)
15650     {
15651     case V850_NOTE_ALIGNMENT:  return _("Alignment of 8-byte objects");
15652     case V850_NOTE_DATA_SIZE:  return _("Sizeof double and long double");
15653     case V850_NOTE_FPU_INFO:   return _("Type of FPU support needed");
15654     case V850_NOTE_SIMD_INFO:  return _("Use of SIMD instructions");
15655     case V850_NOTE_CACHE_INFO: return _("Use of cache");
15656     case V850_NOTE_MMU_INFO:   return _("Use of MMU");
15657     default:
15658       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), n_type);
15659       return buff;
15660     }
15661 }
15662
15663 static int
15664 print_v850_note (Elf_Internal_Note * pnote)
15665 {
15666   unsigned int val;
15667
15668   if (pnote->descsz != 4)
15669     return 0;
15670   val = byte_get ((unsigned char *) pnote->descdata, pnote->descsz);
15671
15672   if (val == 0)
15673     {
15674       printf (_("not set\n"));
15675       return 1;
15676     }
15677
15678   switch (pnote->type)
15679     {
15680     case V850_NOTE_ALIGNMENT:
15681       switch (val)
15682         {
15683         case EF_RH850_DATA_ALIGN4: printf (_("4-byte\n")); return 1;
15684         case EF_RH850_DATA_ALIGN8: printf (_("8-byte\n")); return 1;
15685         }
15686       break;
15687
15688     case V850_NOTE_DATA_SIZE:
15689       switch (val)
15690         {
15691         case EF_RH850_DOUBLE32: printf (_("4-bytes\n")); return 1;
15692         case EF_RH850_DOUBLE64: printf (_("8-bytes\n")); return 1;
15693         }
15694       break;
15695
15696     case V850_NOTE_FPU_INFO:
15697       switch (val)
15698         {
15699         case EF_RH850_FPU20: printf (_("FPU-2.0\n")); return 1;
15700         case EF_RH850_FPU30: printf (_("FPU-3.0\n")); return 1;
15701         }
15702       break;
15703
15704     case V850_NOTE_MMU_INFO:
15705     case V850_NOTE_CACHE_INFO:
15706     case V850_NOTE_SIMD_INFO:
15707       if (val == EF_RH850_SIMD)
15708         {
15709           printf (_("yes\n"));
15710           return 1;
15711         }
15712       break;
15713
15714     default:
15715       /* An 'unknown note type' message will already have been displayed.  */
15716       break;
15717     }
15718
15719   printf (_("unknown value: %x\n"), val);
15720   return 0;
15721 }
15722
15723 static int 
15724 process_netbsd_elf_note (Elf_Internal_Note * pnote)
15725 {
15726   unsigned int version;
15727
15728   switch (pnote->type)
15729     {
15730     case NT_NETBSD_IDENT:
15731       version = byte_get ((unsigned char *) pnote->descdata, sizeof (version));
15732       if ((version / 10000) % 100)
15733         printf ("  NetBSD\t\t0x%08lx\tIDENT %u (%u.%u%s%c)\n", pnote->descsz,
15734                 version, version / 100000000, (version / 1000000) % 100,
15735                 (version / 10000) % 100 > 26 ? "Z" : "",
15736                 'A' + (version / 10000) % 26); 
15737       else
15738         printf ("  NetBSD\t\t0x%08lx\tIDENT %u (%u.%u.%u)\n", pnote->descsz,
15739                 version, version / 100000000, (version / 1000000) % 100,
15740                 (version / 100) % 100); 
15741       return 1;
15742
15743     case NT_NETBSD_MARCH:
15744       printf ("  NetBSD\t0x%08lx\tMARCH <%s>\n", pnote->descsz,
15745               pnote->descdata);
15746       return 1;
15747
15748     default:
15749       break;
15750     }
15751
15752   printf ("  NetBSD\t0x%08lx\tUnknown note type: (0x%08lx)\n", pnote->descsz,
15753           pnote->type);
15754   return 1;
15755 }
15756
15757 static const char *
15758 get_freebsd_elfcore_note_type (unsigned e_type)
15759 {
15760   switch (e_type)
15761     {
15762     case NT_FREEBSD_THRMISC:
15763       return _("NT_THRMISC (thrmisc structure)");
15764     case NT_FREEBSD_PROCSTAT_PROC:
15765       return _("NT_PROCSTAT_PROC (proc data)");
15766     case NT_FREEBSD_PROCSTAT_FILES:
15767       return _("NT_PROCSTAT_FILES (files data)");
15768     case NT_FREEBSD_PROCSTAT_VMMAP:
15769       return _("NT_PROCSTAT_VMMAP (vmmap data)");
15770     case NT_FREEBSD_PROCSTAT_GROUPS:
15771       return _("NT_PROCSTAT_GROUPS (groups data)");
15772     case NT_FREEBSD_PROCSTAT_UMASK:
15773       return _("NT_PROCSTAT_UMASK (umask data)");
15774     case NT_FREEBSD_PROCSTAT_RLIMIT:
15775       return _("NT_PROCSTAT_RLIMIT (rlimit data)");
15776     case NT_FREEBSD_PROCSTAT_OSREL:
15777       return _("NT_PROCSTAT_OSREL (osreldate data)");
15778     case NT_FREEBSD_PROCSTAT_PSSTRINGS:
15779       return _("NT_PROCSTAT_PSSTRINGS (ps_strings data)");
15780     case NT_FREEBSD_PROCSTAT_AUXV:
15781       return _("NT_PROCSTAT_AUXV (auxv data)");
15782     }
15783   return get_note_type (e_type);
15784 }
15785
15786 static const char *
15787 get_netbsd_elfcore_note_type (unsigned e_type)
15788 {
15789   static char buff[64];
15790
15791   if (e_type == NT_NETBSDCORE_PROCINFO)
15792     {
15793       /* NetBSD core "procinfo" structure.  */
15794       return _("NetBSD procinfo structure");
15795     }
15796
15797   /* As of Jan 2002 there are no other machine-independent notes
15798      defined for NetBSD core files.  If the note type is less
15799      than the start of the machine-dependent note types, we don't
15800      understand it.  */
15801
15802   if (e_type < NT_NETBSDCORE_FIRSTMACH)
15803     {
15804       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15805       return buff;
15806     }
15807
15808   switch (elf_header.e_machine)
15809     {
15810     /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
15811        and PT_GETFPREGS == mach+2.  */
15812
15813     case EM_OLD_ALPHA:
15814     case EM_ALPHA:
15815     case EM_SPARC:
15816     case EM_SPARC32PLUS:
15817     case EM_SPARCV9:
15818       switch (e_type)
15819         {
15820         case NT_NETBSDCORE_FIRSTMACH + 0:
15821           return _("PT_GETREGS (reg structure)");
15822         case NT_NETBSDCORE_FIRSTMACH + 2:
15823           return _("PT_GETFPREGS (fpreg structure)");
15824         default:
15825           break;
15826         }
15827       break;
15828
15829     /* On all other arch's, PT_GETREGS == mach+1 and
15830        PT_GETFPREGS == mach+3.  */
15831     default:
15832       switch (e_type)
15833         {
15834         case NT_NETBSDCORE_FIRSTMACH + 1:
15835           return _("PT_GETREGS (reg structure)");
15836         case NT_NETBSDCORE_FIRSTMACH + 3:
15837           return _("PT_GETFPREGS (fpreg structure)");
15838         default:
15839           break;
15840         }
15841     }
15842
15843   snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
15844             e_type - NT_NETBSDCORE_FIRSTMACH);
15845   return buff;
15846 }
15847
15848 static const char *
15849 get_stapsdt_note_type (unsigned e_type)
15850 {
15851   static char buff[64];
15852
15853   switch (e_type)
15854     {
15855     case NT_STAPSDT:
15856       return _("NT_STAPSDT (SystemTap probe descriptors)");
15857
15858     default:
15859       break;
15860     }
15861
15862   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15863   return buff;
15864 }
15865
15866 static int
15867 print_stapsdt_note (Elf_Internal_Note *pnote)
15868 {
15869   int addr_size = is_32bit_elf ? 4 : 8;
15870   char *data = pnote->descdata;
15871   char *data_end = pnote->descdata + pnote->descsz;
15872   bfd_vma pc, base_addr, semaphore;
15873   char *provider, *probe, *arg_fmt;
15874
15875   pc = byte_get ((unsigned char *) data, addr_size);
15876   data += addr_size;
15877   base_addr = byte_get ((unsigned char *) data, addr_size);
15878   data += addr_size;
15879   semaphore = byte_get ((unsigned char *) data, addr_size);
15880   data += addr_size;
15881
15882   provider = data;
15883   data += strlen (data) + 1;
15884   probe = data;
15885   data += strlen (data) + 1;
15886   arg_fmt = data;
15887   data += strlen (data) + 1;
15888
15889   printf (_("    Provider: %s\n"), provider);
15890   printf (_("    Name: %s\n"), probe);
15891   printf (_("    Location: "));
15892   print_vma (pc, FULL_HEX);
15893   printf (_(", Base: "));
15894   print_vma (base_addr, FULL_HEX);
15895   printf (_(", Semaphore: "));
15896   print_vma (semaphore, FULL_HEX);
15897   printf ("\n");
15898   printf (_("    Arguments: %s\n"), arg_fmt);
15899
15900   return data == data_end;
15901 }
15902
15903 static const char *
15904 get_ia64_vms_note_type (unsigned e_type)
15905 {
15906   static char buff[64];
15907
15908   switch (e_type)
15909     {
15910     case NT_VMS_MHD:
15911       return _("NT_VMS_MHD (module header)");
15912     case NT_VMS_LNM:
15913       return _("NT_VMS_LNM (language name)");
15914     case NT_VMS_SRC:
15915       return _("NT_VMS_SRC (source files)");
15916     case NT_VMS_TITLE:
15917       return "NT_VMS_TITLE";
15918     case NT_VMS_EIDC:
15919       return _("NT_VMS_EIDC (consistency check)");
15920     case NT_VMS_FPMODE:
15921       return _("NT_VMS_FPMODE (FP mode)");
15922     case NT_VMS_LINKTIME:
15923       return "NT_VMS_LINKTIME";
15924     case NT_VMS_IMGNAM:
15925       return _("NT_VMS_IMGNAM (image name)");
15926     case NT_VMS_IMGID:
15927       return _("NT_VMS_IMGID (image id)");
15928     case NT_VMS_LINKID:
15929       return _("NT_VMS_LINKID (link id)");
15930     case NT_VMS_IMGBID:
15931       return _("NT_VMS_IMGBID (build id)");
15932     case NT_VMS_GSTNAM:
15933       return _("NT_VMS_GSTNAM (sym table name)");
15934     case NT_VMS_ORIG_DYN:
15935       return "NT_VMS_ORIG_DYN";
15936     case NT_VMS_PATCHTIME:
15937       return "NT_VMS_PATCHTIME";
15938     default:
15939       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15940       return buff;
15941     }
15942 }
15943
15944 static int
15945 print_ia64_vms_note (Elf_Internal_Note * pnote)
15946 {
15947   switch (pnote->type)
15948     {
15949     case NT_VMS_MHD:
15950       if (pnote->descsz > 36)
15951         {
15952           size_t l = strlen (pnote->descdata + 34);
15953           printf (_("    Creation date  : %.17s\n"), pnote->descdata);
15954           printf (_("    Last patch date: %.17s\n"), pnote->descdata + 17);
15955           printf (_("    Module name    : %s\n"), pnote->descdata + 34);
15956           printf (_("    Module version : %s\n"), pnote->descdata + 34 + l + 1);
15957         }
15958       else
15959         printf (_("    Invalid size\n"));
15960       break;
15961     case NT_VMS_LNM:
15962       printf (_("   Language: %s\n"), pnote->descdata);
15963       break;
15964 #ifdef BFD64
15965     case NT_VMS_FPMODE:
15966       printf (_("   Floating Point mode: "));
15967       printf ("0x%016" BFD_VMA_FMT "x\n",
15968               (bfd_vma) byte_get ((unsigned char *)pnote->descdata, 8));
15969       break;
15970     case NT_VMS_LINKTIME:
15971       printf (_("   Link time: "));
15972       print_vms_time
15973         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
15974       printf ("\n");
15975       break;
15976     case NT_VMS_PATCHTIME:
15977       printf (_("   Patch time: "));
15978       print_vms_time
15979         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
15980       printf ("\n");
15981       break;
15982     case NT_VMS_ORIG_DYN:
15983       printf (_("   Major id: %u,  minor id: %u\n"),
15984               (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
15985               (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
15986       printf (_("   Last modified  : "));
15987       print_vms_time
15988         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
15989       printf (_("\n   Link flags  : "));
15990       printf ("0x%016" BFD_VMA_FMT "x\n",
15991               (bfd_vma) byte_get ((unsigned char *)pnote->descdata + 16, 8));
15992       printf (_("   Header flags: 0x%08x\n"),
15993               (unsigned) byte_get ((unsigned char *)pnote->descdata + 24, 4));
15994       printf (_("   Image id    : %s\n"), pnote->descdata + 32);
15995       break;
15996 #endif
15997     case NT_VMS_IMGNAM:
15998       printf (_("    Image name: %s\n"), pnote->descdata);
15999       break;
16000     case NT_VMS_GSTNAM:
16001       printf (_("    Global symbol table name: %s\n"), pnote->descdata);
16002       break;
16003     case NT_VMS_IMGID:
16004       printf (_("    Image id: %s\n"), pnote->descdata);
16005       break;
16006     case NT_VMS_LINKID:
16007       printf (_("    Linker id: %s\n"), pnote->descdata);
16008       break;
16009     default:
16010       break;
16011     }
16012   return 1;
16013 }
16014
16015 /* Note that by the ELF standard, the name field is already null byte
16016    terminated, and namesz includes the terminating null byte.
16017    I.E. the value of namesz for the name "FSF" is 4.
16018
16019    If the value of namesz is zero, there is no name present.  */
16020 static int
16021 process_note (Elf_Internal_Note * pnote)
16022 {
16023   const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
16024   const char * nt;
16025
16026   if (pnote->namesz == 0)
16027     /* If there is no note name, then use the default set of
16028        note type strings.  */
16029     nt = get_note_type (pnote->type);
16030
16031   else if (const_strneq (pnote->namedata, "GNU"))
16032     /* GNU-specific object file notes.  */
16033     nt = get_gnu_elf_note_type (pnote->type);
16034
16035   else if (const_strneq (pnote->namedata, "FreeBSD"))
16036     /* FreeBSD-specific core file notes.  */
16037     nt = get_freebsd_elfcore_note_type (pnote->type);
16038
16039   else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
16040     /* NetBSD-specific core file notes.  */
16041     nt = get_netbsd_elfcore_note_type (pnote->type);
16042
16043   else if (const_strneq (pnote->namedata, "NetBSD"))
16044     /* NetBSD-specific core file notes.  */
16045     return process_netbsd_elf_note (pnote);
16046
16047   else if (strneq (pnote->namedata, "SPU/", 4))
16048     {
16049       /* SPU-specific core file notes.  */
16050       nt = pnote->namedata + 4;
16051       name = "SPU";
16052     }
16053
16054   else if (const_strneq (pnote->namedata, "IPF/VMS"))
16055     /* VMS/ia64-specific file notes.  */
16056     nt = get_ia64_vms_note_type (pnote->type);
16057
16058   else if (const_strneq (pnote->namedata, "stapsdt"))
16059     nt = get_stapsdt_note_type (pnote->type);
16060
16061   else
16062     /* Don't recognize this note name; just use the default set of
16063        note type strings.  */
16064     nt = get_note_type (pnote->type);
16065
16066   printf ("  %-20s 0x%08lx\t%s\n", name, pnote->descsz, nt);
16067
16068   if (const_strneq (pnote->namedata, "IPF/VMS"))
16069     return print_ia64_vms_note (pnote);
16070   else if (const_strneq (pnote->namedata, "GNU"))
16071     return print_gnu_note (pnote);
16072   else if (const_strneq (pnote->namedata, "stapsdt"))
16073     return print_stapsdt_note (pnote);
16074   else if (const_strneq (pnote->namedata, "CORE"))
16075     return print_core_note (pnote);
16076   else
16077     return 1;
16078 }
16079
16080
16081 static int
16082 process_corefile_note_segment (FILE * file, bfd_vma offset, bfd_vma length)
16083 {
16084   Elf_External_Note * pnotes;
16085   Elf_External_Note * external;
16086   char * end;
16087   int res = 1;
16088
16089   if (length <= 0)
16090     return 0;
16091
16092   pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
16093                                            _("notes"));
16094   if (pnotes == NULL)
16095     return 0;
16096
16097   external = pnotes;
16098
16099   printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
16100           (unsigned long) offset, (unsigned long) length);
16101   printf (_("  %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
16102
16103   end = (char *) pnotes + length;
16104   while ((char *) external < end)
16105     {
16106       Elf_Internal_Note inote;
16107       size_t min_notesz;
16108       char *next;
16109       char * temp = NULL;
16110       size_t data_remaining = end - (char *) external;
16111
16112       if (!is_ia64_vms ())
16113         {
16114           /* PR binutils/15191
16115              Make sure that there is enough data to read.  */
16116           min_notesz = offsetof (Elf_External_Note, name);
16117           if (data_remaining < min_notesz)
16118             {
16119               warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
16120                     (int) data_remaining);
16121               break;
16122             }
16123           inote.type     = BYTE_GET (external->type);
16124           inote.namesz   = BYTE_GET (external->namesz);
16125           inote.namedata = external->name;
16126           inote.descsz   = BYTE_GET (external->descsz);
16127           inote.descdata = inote.namedata + align_power (inote.namesz, 2);
16128           /* PR 17531: file: 3443835e.  */
16129           if (inote.descdata < (char *) pnotes || inote.descdata > end)
16130             {
16131               warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
16132               inote.descdata = inote.namedata;
16133               inote.namesz   = 0;
16134             }
16135
16136           inote.descpos  = offset + (inote.descdata - (char *) pnotes);
16137           next = inote.descdata + align_power (inote.descsz, 2);
16138         }
16139       else
16140         {
16141           Elf64_External_VMS_Note *vms_external;
16142
16143           /* PR binutils/15191
16144              Make sure that there is enough data to read.  */
16145           min_notesz = offsetof (Elf64_External_VMS_Note, name);
16146           if (data_remaining < min_notesz)
16147             {
16148               warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
16149                     (int) data_remaining);
16150               break;
16151             }
16152
16153           vms_external = (Elf64_External_VMS_Note *) external;
16154           inote.type     = BYTE_GET (vms_external->type);
16155           inote.namesz   = BYTE_GET (vms_external->namesz);
16156           inote.namedata = vms_external->name;
16157           inote.descsz   = BYTE_GET (vms_external->descsz);
16158           inote.descdata = inote.namedata + align_power (inote.namesz, 3);
16159           inote.descpos  = offset + (inote.descdata - (char *) pnotes);
16160           next = inote.descdata + align_power (inote.descsz, 3);
16161         }
16162
16163       if (inote.descdata < (char *) external + min_notesz
16164           || next < (char *) external + min_notesz
16165           /* PR binutils/17531: file: id:000000,sig:11,src:006986,op:havoc,rep:4.  */
16166           || inote.namedata + inote.namesz < inote.namedata
16167           || inote.descdata + inote.descsz < inote.descdata
16168           || data_remaining < (size_t)(next - (char *) external))
16169         {
16170           warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
16171                 (unsigned long) ((char *) external - (char *) pnotes));
16172           warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx\n"),
16173                 inote.type, inote.namesz, inote.descsz);
16174           break;
16175         }
16176
16177       external = (Elf_External_Note *) next;
16178
16179       /* Verify that name is null terminated.  It appears that at least
16180          one version of Linux (RedHat 6.0) generates corefiles that don't
16181          comply with the ELF spec by failing to include the null byte in
16182          namesz.  */
16183       if (inote.namedata[inote.namesz - 1] != '\0')
16184         {
16185           temp = (char *) malloc (inote.namesz + 1);
16186           if (temp == NULL)
16187             {
16188               error (_("Out of memory allocating space for inote name\n"));
16189               res = 0;
16190               break;
16191             }
16192
16193           strncpy (temp, inote.namedata, inote.namesz);
16194           temp[inote.namesz] = 0;
16195
16196           /* warn (_("'%s' NOTE name not properly null terminated\n"), temp);  */
16197           inote.namedata = temp;
16198         }
16199
16200       res &= process_note (& inote);
16201
16202       if (temp != NULL)
16203         {
16204           free (temp);
16205           temp = NULL;
16206         }
16207     }
16208
16209   free (pnotes);
16210
16211   return res;
16212 }
16213
16214 static int
16215 process_corefile_note_segments (FILE * file)
16216 {
16217   Elf_Internal_Phdr * segment;
16218   unsigned int i;
16219   int res = 1;
16220
16221   if (! get_program_headers (file))
16222       return 0;
16223
16224   for (i = 0, segment = program_headers;
16225        i < elf_header.e_phnum;
16226        i++, segment++)
16227     {
16228       if (segment->p_type == PT_NOTE)
16229         res &= process_corefile_note_segment (file,
16230                                               (bfd_vma) segment->p_offset,
16231                                               (bfd_vma) segment->p_filesz);
16232     }
16233
16234   return res;
16235 }
16236
16237 static int
16238 process_v850_notes (FILE * file, bfd_vma offset, bfd_vma length)
16239 {
16240   Elf_External_Note * pnotes;
16241   Elf_External_Note * external;
16242   char * end;
16243   int res = 1;
16244
16245   if (length <= 0)
16246     return 0;
16247
16248   pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
16249                                            _("v850 notes"));
16250   if (pnotes == NULL)
16251     return 0;
16252
16253   external = pnotes;
16254   end = (char*) pnotes + length;
16255
16256   printf (_("\nDisplaying contents of Renesas V850 notes section at offset 0x%lx with length 0x%lx:\n"),
16257           (unsigned long) offset, (unsigned long) length);
16258
16259   while ((char *) external + sizeof (Elf_External_Note) < end)
16260     {
16261       Elf_External_Note * next;
16262       Elf_Internal_Note inote;
16263
16264       inote.type     = BYTE_GET (external->type);
16265       inote.namesz   = BYTE_GET (external->namesz);
16266       inote.namedata = external->name;
16267       inote.descsz   = BYTE_GET (external->descsz);
16268       inote.descdata = inote.namedata + align_power (inote.namesz, 2);
16269       inote.descpos  = offset + (inote.descdata - (char *) pnotes);
16270
16271       if (inote.descdata < (char *) pnotes || inote.descdata >= end)
16272         {
16273           warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
16274           inote.descdata = inote.namedata;
16275           inote.namesz   = 0;
16276         }
16277
16278       next = (Elf_External_Note *) (inote.descdata + align_power (inote.descsz, 2));
16279
16280       if (   ((char *) next > end)
16281           || ((char *) next <  (char *) pnotes))
16282         {
16283           warn (_("corrupt descsz found in note at offset 0x%lx\n"),
16284                 (unsigned long) ((char *) external - (char *) pnotes));
16285           warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
16286                 inote.type, inote.namesz, inote.descsz);
16287           break;
16288         }
16289
16290       external = next;
16291
16292       /* Prevent out-of-bounds indexing.  */
16293       if (   inote.namedata + inote.namesz > end
16294           || inote.namedata + inote.namesz < inote.namedata)
16295         {
16296           warn (_("corrupt namesz found in note at offset 0x%lx\n"),
16297                 (unsigned long) ((char *) external - (char *) pnotes));
16298           warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
16299                 inote.type, inote.namesz, inote.descsz);
16300           break;
16301         }
16302
16303       printf ("  %s: ", get_v850_elf_note_type (inote.type));
16304
16305       if (! print_v850_note (& inote))
16306         {
16307           res = 0;
16308           printf ("<corrupt sizes: namesz: %lx, descsz: %lx>\n",
16309                   inote.namesz, inote.descsz);
16310         }
16311     }
16312
16313   free (pnotes);
16314
16315   return res;
16316 }
16317
16318 static int
16319 process_note_sections (FILE * file)
16320 {
16321   Elf_Internal_Shdr * section;
16322   unsigned long i;
16323   int n = 0;
16324   int res = 1;
16325
16326   for (i = 0, section = section_headers;
16327        i < elf_header.e_shnum && section != NULL;
16328        i++, section++)
16329     {
16330       if (section->sh_type == SHT_NOTE)
16331         {
16332           res &= process_corefile_note_segment (file,
16333                                                 (bfd_vma) section->sh_offset,
16334                                                 (bfd_vma) section->sh_size);
16335           n++;
16336         }
16337
16338       if ((   elf_header.e_machine == EM_V800
16339            || elf_header.e_machine == EM_V850
16340            || elf_header.e_machine == EM_CYGNUS_V850)
16341           && section->sh_type == SHT_RENESAS_INFO)
16342         {
16343           res &= process_v850_notes (file,
16344                                      (bfd_vma) section->sh_offset,
16345                                      (bfd_vma) section->sh_size);
16346           n++;
16347         }
16348     }
16349
16350   if (n == 0)
16351     /* Try processing NOTE segments instead.  */
16352     return process_corefile_note_segments (file);
16353
16354   return res;
16355 }
16356
16357 static int
16358 process_notes (FILE * file)
16359 {
16360   /* If we have not been asked to display the notes then do nothing.  */
16361   if (! do_notes)
16362     return 1;
16363
16364   if (elf_header.e_type != ET_CORE)
16365     return process_note_sections (file);
16366
16367   /* No program headers means no NOTE segment.  */
16368   if (elf_header.e_phnum > 0)
16369     return process_corefile_note_segments (file);
16370
16371   printf (_("No note segments present in the core file.\n"));
16372   return 1;
16373 }
16374
16375 static int
16376 process_arch_specific (FILE * file)
16377 {
16378   if (! do_arch)
16379     return 1;
16380
16381   switch (elf_header.e_machine)
16382     {
16383     case EM_ARM:
16384       return process_arm_specific (file);
16385     case EM_MIPS:
16386     case EM_MIPS_RS3_LE:
16387       return process_mips_specific (file);
16388       break;
16389     case EM_NDS32:
16390       return process_nds32_specific (file);
16391       break;
16392     case EM_PPC:
16393     case EM_PPC64:
16394       return process_power_specific (file);
16395       break;
16396     case EM_S390:
16397     case EM_S390_OLD:
16398       return process_s390_specific (file);
16399       break;
16400     case EM_SPARC:
16401     case EM_SPARC32PLUS:
16402     case EM_SPARCV9:
16403       return process_sparc_specific (file);
16404       break;
16405     case EM_TI_C6000:
16406       return process_tic6x_specific (file);
16407       break;
16408     case EM_MSP430:
16409       return process_msp430x_specific (file);
16410     default:
16411       break;
16412     }
16413   return 1;
16414 }
16415
16416 static int
16417 get_file_header (FILE * file)
16418 {
16419   /* Read in the identity array.  */
16420   if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
16421     return 0;
16422
16423   /* Determine how to read the rest of the header.  */
16424   switch (elf_header.e_ident[EI_DATA])
16425     {
16426     default:
16427     case ELFDATANONE:
16428     case ELFDATA2LSB:
16429       byte_get = byte_get_little_endian;
16430       byte_put = byte_put_little_endian;
16431       break;
16432     case ELFDATA2MSB:
16433       byte_get = byte_get_big_endian;
16434       byte_put = byte_put_big_endian;
16435       break;
16436     }
16437
16438   /* For now we only support 32 bit and 64 bit ELF files.  */
16439   is_32bit_elf = (elf_header.e_ident[EI_CLASS] != ELFCLASS64);
16440
16441   /* Read in the rest of the header.  */
16442   if (is_32bit_elf)
16443     {
16444       Elf32_External_Ehdr ehdr32;
16445
16446       if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
16447         return 0;
16448
16449       elf_header.e_type      = BYTE_GET (ehdr32.e_type);
16450       elf_header.e_machine   = BYTE_GET (ehdr32.e_machine);
16451       elf_header.e_version   = BYTE_GET (ehdr32.e_version);
16452       elf_header.e_entry     = BYTE_GET (ehdr32.e_entry);
16453       elf_header.e_phoff     = BYTE_GET (ehdr32.e_phoff);
16454       elf_header.e_shoff     = BYTE_GET (ehdr32.e_shoff);
16455       elf_header.e_flags     = BYTE_GET (ehdr32.e_flags);
16456       elf_header.e_ehsize    = BYTE_GET (ehdr32.e_ehsize);
16457       elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
16458       elf_header.e_phnum     = BYTE_GET (ehdr32.e_phnum);
16459       elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
16460       elf_header.e_shnum     = BYTE_GET (ehdr32.e_shnum);
16461       elf_header.e_shstrndx  = BYTE_GET (ehdr32.e_shstrndx);
16462     }
16463   else
16464     {
16465       Elf64_External_Ehdr ehdr64;
16466
16467       /* If we have been compiled with sizeof (bfd_vma) == 4, then
16468          we will not be able to cope with the 64bit data found in
16469          64 ELF files.  Detect this now and abort before we start
16470          overwriting things.  */
16471       if (sizeof (bfd_vma) < 8)
16472         {
16473           error (_("This instance of readelf has been built without support for a\n\
16474 64 bit data type and so it cannot read 64 bit ELF files.\n"));
16475           return 0;
16476         }
16477
16478       if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
16479         return 0;
16480
16481       elf_header.e_type      = BYTE_GET (ehdr64.e_type);
16482       elf_header.e_machine   = BYTE_GET (ehdr64.e_machine);
16483       elf_header.e_version   = BYTE_GET (ehdr64.e_version);
16484       elf_header.e_entry     = BYTE_GET (ehdr64.e_entry);
16485       elf_header.e_phoff     = BYTE_GET (ehdr64.e_phoff);
16486       elf_header.e_shoff     = BYTE_GET (ehdr64.e_shoff);
16487       elf_header.e_flags     = BYTE_GET (ehdr64.e_flags);
16488       elf_header.e_ehsize    = BYTE_GET (ehdr64.e_ehsize);
16489       elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
16490       elf_header.e_phnum     = BYTE_GET (ehdr64.e_phnum);
16491       elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
16492       elf_header.e_shnum     = BYTE_GET (ehdr64.e_shnum);
16493       elf_header.e_shstrndx  = BYTE_GET (ehdr64.e_shstrndx);
16494     }
16495
16496   if (elf_header.e_shoff)
16497     {
16498       /* There may be some extensions in the first section header.  Don't
16499          bomb if we can't read it.  */
16500       if (is_32bit_elf)
16501         get_32bit_section_headers (file, TRUE);
16502       else
16503         get_64bit_section_headers (file, TRUE);
16504     }
16505
16506   return 1;
16507 }
16508
16509 /* Process one ELF object file according to the command line options.
16510    This file may actually be stored in an archive.  The file is
16511    positioned at the start of the ELF object.  */
16512
16513 static int
16514 process_object (char * file_name, FILE * file)
16515 {
16516   unsigned int i;
16517
16518   if (! get_file_header (file))
16519     {
16520       error (_("%s: Failed to read file header\n"), file_name);
16521       return 1;
16522     }
16523
16524   /* Initialise per file variables.  */
16525   for (i = ARRAY_SIZE (version_info); i--;)
16526     version_info[i] = 0;
16527
16528   for (i = ARRAY_SIZE (dynamic_info); i--;)
16529     dynamic_info[i] = 0;
16530   dynamic_info_DT_GNU_HASH = 0;
16531
16532   /* Process the file.  */
16533   if (show_name)
16534     printf (_("\nFile: %s\n"), file_name);
16535
16536   /* Initialise the dump_sects array from the cmdline_dump_sects array.
16537      Note we do this even if cmdline_dump_sects is empty because we
16538      must make sure that the dump_sets array is zeroed out before each
16539      object file is processed.  */
16540   if (num_dump_sects > num_cmdline_dump_sects)
16541     memset (dump_sects, 0, num_dump_sects * sizeof (* dump_sects));
16542
16543   if (num_cmdline_dump_sects > 0)
16544     {
16545       if (num_dump_sects == 0)
16546         /* A sneaky way of allocating the dump_sects array.  */
16547         request_dump_bynumber (num_cmdline_dump_sects, 0);
16548
16549       assert (num_dump_sects >= num_cmdline_dump_sects);
16550       memcpy (dump_sects, cmdline_dump_sects,
16551               num_cmdline_dump_sects * sizeof (* dump_sects));
16552     }
16553
16554   if (! process_file_header ())
16555     return 1;
16556
16557   if (! process_section_headers (file))
16558     {
16559       /* Without loaded section headers we cannot process lots of
16560          things.  */
16561       do_unwind = do_version = do_dump = do_arch = 0;
16562
16563       if (! do_using_dynamic)
16564         do_syms = do_dyn_syms = do_reloc = 0;
16565     }
16566
16567   if (! process_section_groups (file))
16568     {
16569       /* Without loaded section groups we cannot process unwind.  */
16570       do_unwind = 0;
16571     }
16572
16573   if (process_program_headers (file))
16574     process_dynamic_section (file);
16575
16576   process_relocs (file);
16577
16578   process_unwind (file);
16579
16580   process_symbol_table (file);
16581
16582   process_syminfo (file);
16583
16584   process_version_sections (file);
16585
16586   process_section_contents (file);
16587
16588   process_notes (file);
16589
16590   process_gnu_liblist (file);
16591
16592   process_arch_specific (file);
16593
16594   if (program_headers)
16595     {
16596       free (program_headers);
16597       program_headers = NULL;
16598     }
16599
16600   if (section_headers)
16601     {
16602       free (section_headers);
16603       section_headers = NULL;
16604     }
16605
16606   if (string_table)
16607     {
16608       free (string_table);
16609       string_table = NULL;
16610       string_table_length = 0;
16611     }
16612
16613   if (dynamic_strings)
16614     {
16615       free (dynamic_strings);
16616       dynamic_strings = NULL;
16617       dynamic_strings_length = 0;
16618     }
16619
16620   if (dynamic_symbols)
16621     {
16622       free (dynamic_symbols);
16623       dynamic_symbols = NULL;
16624       num_dynamic_syms = 0;
16625     }
16626
16627   if (dynamic_syminfo)
16628     {
16629       free (dynamic_syminfo);
16630       dynamic_syminfo = NULL;
16631     }
16632
16633   if (dynamic_section)
16634     {
16635       free (dynamic_section);
16636       dynamic_section = NULL;
16637     }
16638
16639   if (section_headers_groups)
16640     {
16641       free (section_headers_groups);
16642       section_headers_groups = NULL;
16643     }
16644
16645   if (section_groups)
16646     {
16647       struct group_list * g;
16648       struct group_list * next;
16649
16650       for (i = 0; i < group_count; i++)
16651         {
16652           for (g = section_groups [i].root; g != NULL; g = next)
16653             {
16654               next = g->next;
16655               free (g);
16656             }
16657         }
16658
16659       free (section_groups);
16660       section_groups = NULL;
16661     }
16662
16663   free_debug_memory ();
16664
16665   return 0;
16666 }
16667
16668 /* Process an ELF archive.
16669    On entry the file is positioned just after the ARMAG string.  */
16670
16671 static int
16672 process_archive (char * file_name, FILE * file, bfd_boolean is_thin_archive)
16673 {
16674   struct archive_info arch;
16675   struct archive_info nested_arch;
16676   size_t got;
16677   int ret;
16678
16679   show_name = 1;
16680
16681   /* The ARCH structure is used to hold information about this archive.  */
16682   arch.file_name = NULL;
16683   arch.file = NULL;
16684   arch.index_array = NULL;
16685   arch.sym_table = NULL;
16686   arch.longnames = NULL;
16687
16688   /* The NESTED_ARCH structure is used as a single-item cache of information
16689      about a nested archive (when members of a thin archive reside within
16690      another regular archive file).  */
16691   nested_arch.file_name = NULL;
16692   nested_arch.file = NULL;
16693   nested_arch.index_array = NULL;
16694   nested_arch.sym_table = NULL;
16695   nested_arch.longnames = NULL;
16696
16697   if (setup_archive (&arch, file_name, file, is_thin_archive, do_archive_index) != 0)
16698     {
16699       ret = 1;
16700       goto out;
16701     }
16702
16703   if (do_archive_index)
16704     {
16705       if (arch.sym_table == NULL)
16706         error (_("%s: unable to dump the index as none was found\n"), file_name);
16707       else
16708         {
16709           unsigned long i, l;
16710           unsigned long current_pos;
16711
16712           printf (_("Index of archive %s: (%lu entries, 0x%lx bytes in the symbol table)\n"),
16713                   file_name, (unsigned long) arch.index_num, arch.sym_size);
16714           current_pos = ftell (file);
16715
16716           for (i = l = 0; i < arch.index_num; i++)
16717             {
16718               if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
16719                 {
16720                   char * member_name;
16721
16722                   member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
16723
16724                   if (member_name != NULL)
16725                     {
16726                       char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
16727
16728                       if (qualified_name != NULL)
16729                         {
16730                           printf (_("Contents of binary %s at offset "), qualified_name);
16731                           (void) print_vma (arch.index_array[i], PREFIX_HEX);
16732                           putchar ('\n');
16733                           free (qualified_name);
16734                         }
16735                     }
16736                 }
16737
16738               if (l >= arch.sym_size)
16739                 {
16740                   error (_("%s: end of the symbol table reached before the end of the index\n"),
16741                          file_name);
16742                   break;
16743                 }
16744               /* PR 17531: file: 0b6630b2.  */
16745               printf ("\t%.*s\n", (int) (arch.sym_size - l), arch.sym_table + l);
16746               l += strnlen (arch.sym_table + l, arch.sym_size - l) + 1;
16747             }
16748
16749           if (arch.uses_64bit_indicies)
16750             l = (l + 7) & ~ 7;
16751           else
16752             l += l & 1;
16753
16754           if (l < arch.sym_size)
16755             error (_("%s: %ld bytes remain in the symbol table, but without corresponding entries in the index table\n"),
16756                    file_name, arch.sym_size - l);
16757
16758           if (fseek (file, current_pos, SEEK_SET) != 0)
16759             {
16760               error (_("%s: failed to seek back to start of object files in the archive\n"), file_name);
16761               ret = 1;
16762               goto out;
16763             }
16764         }
16765
16766       if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
16767           && !do_segments && !do_header && !do_dump && !do_version
16768           && !do_histogram && !do_debugging && !do_arch && !do_notes
16769           && !do_section_groups && !do_dyn_syms)
16770         {
16771           ret = 0; /* Archive index only.  */
16772           goto out;
16773         }
16774     }
16775
16776   ret = 0;
16777
16778   while (1)
16779     {
16780       char * name;
16781       size_t namelen;
16782       char * qualified_name;
16783
16784       /* Read the next archive header.  */
16785       if (fseek (file, arch.next_arhdr_offset, SEEK_SET) != 0)
16786         {
16787           error (_("%s: failed to seek to next archive header\n"), file_name);
16788           return 1;
16789         }
16790       got = fread (&arch.arhdr, 1, sizeof arch.arhdr, file);
16791       if (got != sizeof arch.arhdr)
16792         {
16793           if (got == 0)
16794             break;
16795           error (_("%s: failed to read archive header\n"), file_name);
16796           ret = 1;
16797           break;
16798         }
16799       if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
16800         {
16801           error (_("%s: did not find a valid archive header\n"), arch.file_name);
16802           ret = 1;
16803           break;
16804         }
16805
16806       arch.next_arhdr_offset += sizeof arch.arhdr;
16807
16808       archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
16809       if (archive_file_size & 01)
16810         ++archive_file_size;
16811
16812       name = get_archive_member_name (&arch, &nested_arch);
16813       if (name == NULL)
16814         {
16815           error (_("%s: bad archive file name\n"), file_name);
16816           ret = 1;
16817           break;
16818         }
16819       namelen = strlen (name);
16820
16821       qualified_name = make_qualified_name (&arch, &nested_arch, name);
16822       if (qualified_name == NULL)
16823         {
16824           error (_("%s: bad archive file name\n"), file_name);
16825           ret = 1;
16826           break;
16827         }
16828
16829       if (is_thin_archive && arch.nested_member_origin == 0)
16830         {
16831           /* This is a proxy for an external member of a thin archive.  */
16832           FILE * member_file;
16833           char * member_file_name = adjust_relative_path (file_name, name, namelen);
16834           if (member_file_name == NULL)
16835             {
16836               ret = 1;
16837               break;
16838             }
16839
16840           member_file = fopen (member_file_name, "rb");
16841           if (member_file == NULL)
16842             {
16843               error (_("Input file '%s' is not readable.\n"), member_file_name);
16844               free (member_file_name);
16845               ret = 1;
16846               break;
16847             }
16848
16849           archive_file_offset = arch.nested_member_origin;
16850
16851           ret |= process_object (qualified_name, member_file);
16852
16853           fclose (member_file);
16854           free (member_file_name);
16855         }
16856       else if (is_thin_archive)
16857         {
16858           /* PR 15140: Allow for corrupt thin archives.  */
16859           if (nested_arch.file == NULL)
16860             {
16861               error (_("%s: contains corrupt thin archive: %s\n"),
16862                      file_name, name);
16863               ret = 1;
16864               break;
16865             }
16866
16867           /* This is a proxy for a member of a nested archive.  */
16868           archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
16869
16870           /* The nested archive file will have been opened and setup by
16871              get_archive_member_name.  */
16872           if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
16873             {
16874               error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
16875               ret = 1;
16876               break;
16877             }
16878
16879           ret |= process_object (qualified_name, nested_arch.file);
16880         }
16881       else
16882         {
16883           archive_file_offset = arch.next_arhdr_offset;
16884           arch.next_arhdr_offset += archive_file_size;
16885
16886           ret |= process_object (qualified_name, file);
16887         }
16888
16889       if (dump_sects != NULL)
16890         {
16891           free (dump_sects);
16892           dump_sects = NULL;
16893           num_dump_sects = 0;
16894         }
16895
16896       free (qualified_name);
16897     }
16898
16899  out:
16900   if (nested_arch.file != NULL)
16901     fclose (nested_arch.file);
16902   release_archive (&nested_arch);
16903   release_archive (&arch);
16904
16905   return ret;
16906 }
16907
16908 static int
16909 process_file (char * file_name)
16910 {
16911   FILE * file;
16912   struct stat statbuf;
16913   char armag[SARMAG];
16914   int ret;
16915
16916   if (stat (file_name, &statbuf) < 0)
16917     {
16918       if (errno == ENOENT)
16919         error (_("'%s': No such file\n"), file_name);
16920       else
16921         error (_("Could not locate '%s'.  System error message: %s\n"),
16922                file_name, strerror (errno));
16923       return 1;
16924     }
16925
16926   if (! S_ISREG (statbuf.st_mode))
16927     {
16928       error (_("'%s' is not an ordinary file\n"), file_name);
16929       return 1;
16930     }
16931
16932   file = fopen (file_name, "rb");
16933   if (file == NULL)
16934     {
16935       error (_("Input file '%s' is not readable.\n"), file_name);
16936       return 1;
16937     }
16938
16939   if (fread (armag, SARMAG, 1, file) != 1)
16940     {
16941       error (_("%s: Failed to read file's magic number\n"), file_name);
16942       fclose (file);
16943       return 1;
16944     }
16945
16946   current_file_size = (bfd_size_type) statbuf.st_size;
16947
16948   if (memcmp (armag, ARMAG, SARMAG) == 0)
16949     ret = process_archive (file_name, file, FALSE);
16950   else if (memcmp (armag, ARMAGT, SARMAG) == 0)
16951     ret = process_archive (file_name, file, TRUE);
16952   else
16953     {
16954       if (do_archive_index)
16955         error (_("File %s is not an archive so its index cannot be displayed.\n"),
16956                file_name);
16957
16958       rewind (file);
16959       archive_file_size = archive_file_offset = 0;
16960       ret = process_object (file_name, file);
16961     }
16962
16963   fclose (file);
16964
16965   current_file_size = 0;
16966   return ret;
16967 }
16968
16969 #ifdef SUPPORT_DISASSEMBLY
16970 /* Needed by the i386 disassembler.  For extra credit, someone could
16971    fix this so that we insert symbolic addresses here, esp for GOT/PLT
16972    symbols.  */
16973
16974 void
16975 print_address (unsigned int addr, FILE * outfile)
16976 {
16977   fprintf (outfile,"0x%8.8x", addr);
16978 }
16979
16980 /* Needed by the i386 disassembler.  */
16981 void
16982 db_task_printsym (unsigned int addr)
16983 {
16984   print_address (addr, stderr);
16985 }
16986 #endif
16987
16988 int
16989 main (int argc, char ** argv)
16990 {
16991   int err;
16992
16993 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
16994   setlocale (LC_MESSAGES, "");
16995 #endif
16996 #if defined (HAVE_SETLOCALE)
16997   setlocale (LC_CTYPE, "");
16998 #endif
16999   bindtextdomain (PACKAGE, LOCALEDIR);
17000   textdomain (PACKAGE);
17001
17002   expandargv (&argc, &argv);
17003
17004   parse_args (argc, argv);
17005
17006   if (num_dump_sects > 0)
17007     {
17008       /* Make a copy of the dump_sects array.  */
17009       cmdline_dump_sects = (dump_type *)
17010           malloc (num_dump_sects * sizeof (* dump_sects));
17011       if (cmdline_dump_sects == NULL)
17012         error (_("Out of memory allocating dump request table.\n"));
17013       else
17014         {
17015           memcpy (cmdline_dump_sects, dump_sects,
17016                   num_dump_sects * sizeof (* dump_sects));
17017           num_cmdline_dump_sects = num_dump_sects;
17018         }
17019     }
17020
17021   if (optind < (argc - 1))
17022     show_name = 1;
17023   else if (optind >= argc)
17024     {
17025       warn (_("Nothing to do.\n"));
17026       usage (stderr);
17027     }
17028
17029   err = 0;
17030   while (optind < argc)
17031     err |= process_file (argv[optind++]);
17032
17033   if (dump_sects != NULL)
17034     free (dump_sects);
17035   if (cmdline_dump_sects != NULL)
17036     free (cmdline_dump_sects);
17037
17038   return err;
17039 }