Warn if the sh_info field of a symbol table does not index the first non-local symbol...
[external/binutils.git] / binutils / readelf.c
1 /* readelf.c -- display contents of an ELF format file
2    Copyright (C) 1998-2016 Free Software Foundation, Inc.
3
4    Originally developed by Eric Youngdale <eric@andante.jic.com>
5    Modifications by Nick Clifton <nickc@redhat.com>
6
7    This file is part of GNU Binutils.
8
9    This program is free software; you can redistribute it and/or modify
10    it under the terms of the GNU General Public License as published by
11    the Free Software Foundation; either version 3 of the License, or
12    (at your option) any later version.
13
14    This program is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17    GNU General Public License for more details.
18
19    You should have received a copy of the GNU General Public License
20    along with this program; if not, write to the Free Software
21    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
22    02110-1301, USA.  */
23 \f
24 /* The difference between readelf and objdump:
25
26   Both programs are capable of displaying the contents of ELF format files,
27   so why does the binutils project have two file dumpers ?
28
29   The reason is that objdump sees an ELF file through a BFD filter of the
30   world; if BFD has a bug where, say, it disagrees about a machine constant
31   in e_flags, then the odds are good that it will remain internally
32   consistent.  The linker sees it the BFD way, objdump sees it the BFD way,
33   GAS sees it the BFD way.  There was need for a tool to go find out what
34   the file actually says.
35
36   This is why the readelf program does not link against the BFD library - it
37   exists as an independent program to help verify the correct working of BFD.
38
39   There is also the case that readelf can provide more information about an
40   ELF file than is provided by objdump.  In particular it can display DWARF
41   debugging information which (at the moment) objdump cannot.  */
42 \f
43 #include "sysdep.h"
44 #include <assert.h>
45 #include <time.h>
46 #include <zlib.h>
47 #ifdef HAVE_WCHAR_H
48 #include <wchar.h>
49 #endif
50
51 #if __GNUC__ >= 2
52 /* Define BFD64 here, even if our default architecture is 32 bit ELF
53    as this will allow us to read in and parse 64bit and 32bit ELF files.
54    Only do this if we believe that the compiler can support a 64 bit
55    data type.  For now we only rely on GCC being able to do this.  */
56 #define BFD64
57 #endif
58
59 #include "bfd.h"
60 #include "bucomm.h"
61 #include "elfcomm.h"
62 #include "dwarf.h"
63
64 #include "elf/common.h"
65 #include "elf/external.h"
66 #include "elf/internal.h"
67
68
69 /* Included here, before RELOC_MACROS_GEN_FUNC is defined, so that
70    we can obtain the H8 reloc numbers.  We need these for the
71    get_reloc_size() function.  We include h8.h again after defining
72    RELOC_MACROS_GEN_FUNC so that we get the naming function as well.  */
73
74 #include "elf/h8.h"
75 #undef _ELF_H8_H
76
77 /* Undo the effects of #including reloc-macros.h.  */
78
79 #undef START_RELOC_NUMBERS
80 #undef RELOC_NUMBER
81 #undef FAKE_RELOC
82 #undef EMPTY_RELOC
83 #undef END_RELOC_NUMBERS
84 #undef _RELOC_MACROS_H
85
86 /* The following headers use the elf/reloc-macros.h file to
87    automatically generate relocation recognition functions
88    such as elf_mips_reloc_type()  */
89
90 #define RELOC_MACROS_GEN_FUNC
91
92 #include "elf/aarch64.h"
93 #include "elf/alpha.h"
94 #include "elf/arc.h"
95 #include "elf/arm.h"
96 #include "elf/avr.h"
97 #include "elf/bfin.h"
98 #include "elf/cr16.h"
99 #include "elf/cris.h"
100 #include "elf/crx.h"
101 #include "elf/d10v.h"
102 #include "elf/d30v.h"
103 #include "elf/dlx.h"
104 #include "elf/epiphany.h"
105 #include "elf/fr30.h"
106 #include "elf/frv.h"
107 #include "elf/ft32.h"
108 #include "elf/h8.h"
109 #include "elf/hppa.h"
110 #include "elf/i386.h"
111 #include "elf/i370.h"
112 #include "elf/i860.h"
113 #include "elf/i960.h"
114 #include "elf/ia64.h"
115 #include "elf/ip2k.h"
116 #include "elf/lm32.h"
117 #include "elf/iq2000.h"
118 #include "elf/m32c.h"
119 #include "elf/m32r.h"
120 #include "elf/m68k.h"
121 #include "elf/m68hc11.h"
122 #include "elf/mcore.h"
123 #include "elf/mep.h"
124 #include "elf/metag.h"
125 #include "elf/microblaze.h"
126 #include "elf/mips.h"
127 #include "elf/mmix.h"
128 #include "elf/mn10200.h"
129 #include "elf/mn10300.h"
130 #include "elf/moxie.h"
131 #include "elf/mt.h"
132 #include "elf/msp430.h"
133 #include "elf/nds32.h"
134 #include "elf/nios2.h"
135 #include "elf/or1k.h"
136 #include "elf/pj.h"
137 #include "elf/ppc.h"
138 #include "elf/ppc64.h"
139 #include "elf/rl78.h"
140 #include "elf/rx.h"
141 #include "elf/s390.h"
142 #include "elf/score.h"
143 #include "elf/sh.h"
144 #include "elf/sparc.h"
145 #include "elf/spu.h"
146 #include "elf/tic6x.h"
147 #include "elf/tilegx.h"
148 #include "elf/tilepro.h"
149 #include "elf/v850.h"
150 #include "elf/vax.h"
151 #include "elf/visium.h"
152 #include "elf/x86-64.h"
153 #include "elf/xc16x.h"
154 #include "elf/xgate.h"
155 #include "elf/xstormy16.h"
156 #include "elf/xtensa.h"
157
158 #include "getopt.h"
159 #include "libiberty.h"
160 #include "safe-ctype.h"
161 #include "filenames.h"
162
163 #ifndef offsetof
164 #define offsetof(TYPE, MEMBER) ((size_t) &(((TYPE *) 0)->MEMBER))
165 #endif
166
167 typedef struct elf_section_list
168 {
169   Elf_Internal_Shdr * hdr;
170   struct elf_section_list * next;
171 } elf_section_list;
172
173 char * program_name = "readelf";
174 static unsigned long archive_file_offset;
175 static unsigned long archive_file_size;
176 static bfd_size_type current_file_size;
177 static unsigned long dynamic_addr;
178 static bfd_size_type dynamic_size;
179 static size_t dynamic_nent;
180 static char * dynamic_strings;
181 static unsigned long dynamic_strings_length;
182 static char * string_table;
183 static unsigned long string_table_length;
184 static unsigned long num_dynamic_syms;
185 static Elf_Internal_Sym * dynamic_symbols;
186 static Elf_Internal_Syminfo * dynamic_syminfo;
187 static unsigned long dynamic_syminfo_offset;
188 static unsigned int dynamic_syminfo_nent;
189 static char program_interpreter[PATH_MAX];
190 static bfd_vma dynamic_info[DT_ENCODING];
191 static bfd_vma dynamic_info_DT_GNU_HASH;
192 static bfd_vma version_info[16];
193 static Elf_Internal_Ehdr elf_header;
194 static Elf_Internal_Shdr * section_headers;
195 static Elf_Internal_Phdr * program_headers;
196 static Elf_Internal_Dyn *  dynamic_section;
197 static elf_section_list * symtab_shndx_list;
198 static int show_name;
199 static int do_dynamic;
200 static int do_syms;
201 static int do_dyn_syms;
202 static int do_reloc;
203 static int do_sections;
204 static int do_section_groups;
205 static int do_section_details;
206 static int do_segments;
207 static int do_unwind;
208 static int do_using_dynamic;
209 static int do_header;
210 static int do_dump;
211 static int do_version;
212 static int do_histogram;
213 static int do_debugging;
214 static int do_arch;
215 static int do_notes;
216 static int do_archive_index;
217 static int is_32bit_elf;
218 static int decompress_dumps;
219
220 struct group_list
221 {
222   struct group_list * next;
223   unsigned int section_index;
224 };
225
226 struct group
227 {
228   struct group_list * root;
229   unsigned int group_index;
230 };
231
232 static size_t group_count;
233 static struct group * section_groups;
234 static struct group ** section_headers_groups;
235
236
237 /* Flag bits indicating particular types of dump.  */
238 #define HEX_DUMP        (1 << 0)        /* The -x command line switch.  */
239 #define DISASS_DUMP     (1 << 1)        /* The -i command line switch.  */
240 #define DEBUG_DUMP      (1 << 2)        /* The -w command line switch.  */
241 #define STRING_DUMP     (1 << 3)        /* The -p command line switch.  */
242 #define RELOC_DUMP      (1 << 4)        /* The -R command line switch.  */
243
244 typedef unsigned char dump_type;
245
246 /* A linked list of the section names for which dumps were requested.  */
247 struct dump_list_entry
248 {
249   char * name;
250   dump_type type;
251   struct dump_list_entry * next;
252 };
253 static struct dump_list_entry * dump_sects_byname;
254
255 /* A dynamic array of flags indicating for which sections a dump
256    has been requested via command line switches.  */
257 static dump_type *   cmdline_dump_sects = NULL;
258 static unsigned int  num_cmdline_dump_sects = 0;
259
260 /* A dynamic array of flags indicating for which sections a dump of
261    some kind has been requested.  It is reset on a per-object file
262    basis and then initialised from the cmdline_dump_sects array,
263    the results of interpreting the -w switch, and the
264    dump_sects_byname list.  */
265 static dump_type *   dump_sects = NULL;
266 static unsigned int  num_dump_sects = 0;
267
268
269 /* How to print a vma value.  */
270 typedef enum print_mode
271 {
272   HEX,
273   DEC,
274   DEC_5,
275   UNSIGNED,
276   PREFIX_HEX,
277   FULL_HEX,
278   LONG_HEX
279 }
280 print_mode;
281
282 /* Versioned symbol info.  */
283 enum versioned_symbol_info
284 {
285   symbol_undefined,
286   symbol_hidden,
287   symbol_public
288 };
289
290 static const char *get_symbol_version_string
291   (FILE *file, int is_dynsym, const char *strtab,
292    unsigned long int strtab_size, unsigned int si,
293    Elf_Internal_Sym *psym, enum versioned_symbol_info *sym_info,
294    unsigned short *vna_other);
295
296 #define UNKNOWN -1
297
298 #define SECTION_NAME(X)                                         \
299   ((X) == NULL ? _("<none>")                                    \
300    : string_table == NULL ? _("<no-name>")                      \
301    : ((X)->sh_name >= string_table_length ? _("<corrupt>")      \
302   : string_table + (X)->sh_name))
303
304 #define DT_VERSIONTAGIDX(tag)   (DT_VERNEEDNUM - (tag)) /* Reverse order!  */
305
306 #define GET_ELF_SYMBOLS(file, section, sym_count)                       \
307   (is_32bit_elf ? get_32bit_elf_symbols (file, section, sym_count)      \
308    : get_64bit_elf_symbols (file, section, sym_count))
309
310 #define VALID_DYNAMIC_NAME(offset)      ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
311 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
312    already been called and verified that the string exists.  */
313 #define GET_DYNAMIC_NAME(offset)        (dynamic_strings + offset)
314
315 #define REMOVE_ARCH_BITS(ADDR)                  \
316   do                                            \
317     {                                           \
318       if (elf_header.e_machine == EM_ARM)       \
319         (ADDR) &= ~1;                           \
320     }                                           \
321   while (0)
322 \f
323 /* Retrieve NMEMB structures, each SIZE bytes long from FILE starting at OFFSET +
324    the offset of the current archive member, if we are examining an archive.
325    Put the retrieved data into VAR, if it is not NULL.  Otherwise allocate a buffer
326    using malloc and fill that.  In either case return the pointer to the start of
327    the retrieved data or NULL if something went wrong.  If something does go wrong
328    and REASON is not NULL then emit an error message using REASON as part of the
329    context.  */
330
331 static void *
332 get_data (void * var, FILE * file, unsigned long offset, bfd_size_type size,
333           bfd_size_type nmemb, const char * reason)
334 {
335   void * mvar;
336   bfd_size_type amt = size * nmemb;
337
338   if (size == 0 || nmemb == 0)
339     return NULL;
340
341   /* If the size_t type is smaller than the bfd_size_type, eg because
342      you are building a 32-bit tool on a 64-bit host, then make sure
343      that when the sizes are cast to (size_t) no information is lost.  */
344   if (sizeof (size_t) < sizeof (bfd_size_type)
345       && (   (bfd_size_type) ((size_t) size) != size
346           || (bfd_size_type) ((size_t) nmemb) != nmemb))
347     {
348       if (reason)
349         error (_("Size truncation prevents reading 0x%" BFD_VMA_FMT "x"
350                  " elements of size 0x%" BFD_VMA_FMT "x for %s\n"),
351                nmemb, size, reason);
352       return NULL;
353     }
354
355   /* Check for size overflow.  */
356   if (amt < nmemb)
357     {
358       if (reason)
359         error (_("Size overflow prevents reading 0x%" BFD_VMA_FMT "x"
360                  " elements of size 0x%" BFD_VMA_FMT "x for %s\n"),
361                nmemb, size, reason);
362       return NULL;
363     }
364
365   /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
366      attempting to allocate memory when the read is bound to fail.  */
367   if (amt > current_file_size
368       || offset + archive_file_offset + amt > current_file_size)
369     {
370       if (reason)
371         error (_("Reading 0x%" BFD_VMA_FMT "x"
372                  " bytes extends past end of file for %s\n"),
373                amt, reason);
374       return NULL;
375     }
376
377   if (fseek (file, archive_file_offset + offset, SEEK_SET))
378     {
379       if (reason)
380         error (_("Unable to seek to 0x%lx for %s\n"),
381                archive_file_offset + offset, reason);
382       return NULL;
383     }
384
385   mvar = var;
386   if (mvar == NULL)
387     {
388       /* Check for overflow.  */
389       if (nmemb < (~(bfd_size_type) 0 - 1) / size)
390         /* + 1 so that we can '\0' terminate invalid string table sections.  */
391         mvar = malloc ((size_t) amt + 1);
392
393       if (mvar == NULL)
394         {
395           if (reason)
396             error (_("Out of memory allocating 0x%" BFD_VMA_FMT "x"
397                      " bytes for %s\n"),
398                    amt, reason);
399           return NULL;
400         }
401
402       ((char *) mvar)[amt] = '\0';
403     }
404
405   if (fread (mvar, (size_t) size, (size_t) nmemb, file) != nmemb)
406     {
407       if (reason)
408         error (_("Unable to read in 0x%" BFD_VMA_FMT "x bytes of %s\n"),
409                amt, reason);
410       if (mvar != var)
411         free (mvar);
412       return NULL;
413     }
414
415   return mvar;
416 }
417
418 /* Print a VMA value.  */
419
420 static int
421 print_vma (bfd_vma vma, print_mode mode)
422 {
423   int nc = 0;
424
425   switch (mode)
426     {
427     case FULL_HEX:
428       nc = printf ("0x");
429       /* Drop through.  */
430
431     case LONG_HEX:
432 #ifdef BFD64
433       if (is_32bit_elf)
434         return nc + printf ("%8.8" BFD_VMA_FMT "x", vma);
435 #endif
436       printf_vma (vma);
437       return nc + 16;
438
439     case DEC_5:
440       if (vma <= 99999)
441         return printf ("%5" BFD_VMA_FMT "d", vma);
442       /* Drop through.  */
443
444     case PREFIX_HEX:
445       nc = printf ("0x");
446       /* Drop through.  */
447
448     case HEX:
449       return nc + printf ("%" BFD_VMA_FMT "x", vma);
450
451     case DEC:
452       return printf ("%" BFD_VMA_FMT "d", vma);
453
454     case UNSIGNED:
455       return printf ("%" BFD_VMA_FMT "u", vma);
456     }
457   return 0;
458 }
459
460 /* Display a symbol on stdout.  Handles the display of control characters and
461    multibye characters (assuming the host environment supports them).
462
463    Display at most abs(WIDTH) characters, truncating as necessary, unless do_wide is true.
464
465    If WIDTH is negative then ensure that the output is at least (- WIDTH) characters,
466    padding as necessary.
467
468    Returns the number of emitted characters.  */
469
470 static unsigned int
471 print_symbol (int width, const char *symbol)
472 {
473   bfd_boolean extra_padding = FALSE;
474   int num_printed = 0;
475 #ifdef HAVE_MBSTATE_T
476   mbstate_t state;
477 #endif
478   int width_remaining;
479
480   if (width < 0)
481     {
482       /* Keep the width positive.  This also helps.  */
483       width = - width;
484       extra_padding = TRUE;
485     }
486   assert (width != 0);
487
488   if (do_wide)
489     /* Set the remaining width to a very large value.
490        This simplifies the code below.  */
491     width_remaining = INT_MAX;
492   else
493     width_remaining = width;
494
495 #ifdef HAVE_MBSTATE_T
496   /* Initialise the multibyte conversion state.  */
497   memset (& state, 0, sizeof (state));
498 #endif
499
500   while (width_remaining)
501     {
502       size_t  n;
503       const char c = *symbol++;
504
505       if (c == 0)
506         break;
507
508       /* Do not print control characters directly as they can affect terminal
509          settings.  Such characters usually appear in the names generated
510          by the assembler for local labels.  */
511       if (ISCNTRL (c))
512         {
513           if (width_remaining < 2)
514             break;
515
516           printf ("^%c", c + 0x40);
517           width_remaining -= 2;
518           num_printed += 2;
519         }
520       else if (ISPRINT (c))
521         {
522           putchar (c);
523           width_remaining --;
524           num_printed ++;
525         }
526       else
527         {
528 #ifdef HAVE_MBSTATE_T
529           wchar_t w;
530 #endif
531           /* Let printf do the hard work of displaying multibyte characters.  */
532           printf ("%.1s", symbol - 1);
533           width_remaining --;
534           num_printed ++;
535
536 #ifdef HAVE_MBSTATE_T
537           /* Try to find out how many bytes made up the character that was
538              just printed.  Advance the symbol pointer past the bytes that
539              were displayed.  */
540           n = mbrtowc (& w, symbol - 1, MB_CUR_MAX, & state);
541 #else
542           n = 1;
543 #endif
544           if (n != (size_t) -1 && n != (size_t) -2 && n > 0)
545             symbol += (n - 1);
546         }
547     }
548
549   if (extra_padding && num_printed < width)
550     {
551       /* Fill in the remaining spaces.  */
552       printf ("%-*s", width - num_printed, " ");
553       num_printed = width;
554     }
555
556   return num_printed;
557 }
558
559 /* Returns a pointer to a static buffer containing a  printable version of
560    the given section's name.  Like print_symbol, except that it does not try
561    to print multibyte characters, it just interprets them as hex values.  */
562
563 static const char *
564 printable_section_name (const Elf_Internal_Shdr * sec)
565 {
566 #define MAX_PRINT_SEC_NAME_LEN 128
567   static char  sec_name_buf [MAX_PRINT_SEC_NAME_LEN + 1];
568   const char * name = SECTION_NAME (sec);
569   char *       buf = sec_name_buf;
570   char         c;
571   unsigned int remaining = MAX_PRINT_SEC_NAME_LEN;
572
573   while ((c = * name ++) != 0)
574     {
575       if (ISCNTRL (c))
576         {
577           if (remaining < 2)
578             break;
579
580           * buf ++ = '^';
581           * buf ++ = c + 0x40;
582           remaining -= 2;
583         }
584       else if (ISPRINT (c))
585         {
586           * buf ++ = c;
587           remaining -= 1;
588         }
589       else
590         {
591           static char hex[17] = "0123456789ABCDEF";
592
593           if (remaining < 4)
594             break;
595           * buf ++ = '<';
596           * buf ++ = hex[(c & 0xf0) >> 4];
597           * buf ++ = hex[c & 0x0f];
598           * buf ++ = '>';
599           remaining -= 4;
600         }
601
602       if (remaining == 0)
603         break;
604     }
605
606   * buf = 0;
607   return sec_name_buf;
608 }
609
610 static const char *
611 printable_section_name_from_index (unsigned long ndx)
612 {
613   if (ndx >= elf_header.e_shnum)
614     return _("<corrupt>");
615
616   return printable_section_name (section_headers + ndx);
617 }
618
619 /* Return a pointer to section NAME, or NULL if no such section exists.  */
620
621 static Elf_Internal_Shdr *
622 find_section (const char * name)
623 {
624   unsigned int i;
625
626   for (i = 0; i < elf_header.e_shnum; i++)
627     if (streq (SECTION_NAME (section_headers + i), name))
628       return section_headers + i;
629
630   return NULL;
631 }
632
633 /* Return a pointer to a section containing ADDR, or NULL if no such
634    section exists.  */
635
636 static Elf_Internal_Shdr *
637 find_section_by_address (bfd_vma addr)
638 {
639   unsigned int i;
640
641   for (i = 0; i < elf_header.e_shnum; i++)
642     {
643       Elf_Internal_Shdr *sec = section_headers + i;
644       if (addr >= sec->sh_addr && addr < sec->sh_addr + sec->sh_size)
645         return sec;
646     }
647
648   return NULL;
649 }
650
651 static Elf_Internal_Shdr *
652 find_section_by_type (unsigned int type)
653 {
654   unsigned int i;
655
656   for (i = 0; i < elf_header.e_shnum; i++)
657     {
658       Elf_Internal_Shdr *sec = section_headers + i;
659       if (sec->sh_type == type)
660         return sec;
661     }
662
663   return NULL;
664 }
665
666 /* Return a pointer to section NAME, or NULL if no such section exists,
667    restricted to the list of sections given in SET.  */
668
669 static Elf_Internal_Shdr *
670 find_section_in_set (const char * name, unsigned int * set)
671 {
672   unsigned int i;
673
674   if (set != NULL)
675     {
676       while ((i = *set++) > 0)
677         if (streq (SECTION_NAME (section_headers + i), name))
678           return section_headers + i;
679     }
680
681   return find_section (name);
682 }
683
684 /* Read an unsigned LEB128 encoded value from p.  Set *PLEN to the number of
685    bytes read.  */
686
687 static inline unsigned long
688 read_uleb128 (unsigned char *data,
689               unsigned int *length_return,
690               const unsigned char * const end)
691 {
692   return read_leb128 (data, length_return, FALSE, end);
693 }
694
695 /* Return true if the current file is for IA-64 machine and OpenVMS ABI.
696    This OS has so many departures from the ELF standard that we test it at
697    many places.  */
698
699 static inline int
700 is_ia64_vms (void)
701 {
702   return elf_header.e_machine == EM_IA_64
703     && elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS;
704 }
705
706 /* Guess the relocation size commonly used by the specific machines.  */
707
708 static int
709 guess_is_rela (unsigned int e_machine)
710 {
711   switch (e_machine)
712     {
713       /* Targets that use REL relocations.  */
714     case EM_386:
715     case EM_IAMCU:
716     case EM_960:
717     case EM_ARM:
718     case EM_D10V:
719     case EM_CYGNUS_D10V:
720     case EM_DLX:
721     case EM_MIPS:
722     case EM_MIPS_RS3_LE:
723     case EM_CYGNUS_M32R:
724     case EM_SCORE:
725     case EM_XGATE:
726       return FALSE;
727
728       /* Targets that use RELA relocations.  */
729     case EM_68K:
730     case EM_860:
731     case EM_AARCH64:
732     case EM_ADAPTEVA_EPIPHANY:
733     case EM_ALPHA:
734     case EM_ALTERA_NIOS2:
735     case EM_ARC:
736     case EM_ARC_COMPACT:
737     case EM_ARC_COMPACT2:
738     case EM_AVR:
739     case EM_AVR_OLD:
740     case EM_BLACKFIN:
741     case EM_CR16:
742     case EM_CRIS:
743     case EM_CRX:
744     case EM_D30V:
745     case EM_CYGNUS_D30V:
746     case EM_FR30:
747     case EM_FT32:
748     case EM_CYGNUS_FR30:
749     case EM_CYGNUS_FRV:
750     case EM_H8S:
751     case EM_H8_300:
752     case EM_H8_300H:
753     case EM_IA_64:
754     case EM_IP2K:
755     case EM_IP2K_OLD:
756     case EM_IQ2000:
757     case EM_LATTICEMICO32:
758     case EM_M32C_OLD:
759     case EM_M32C:
760     case EM_M32R:
761     case EM_MCORE:
762     case EM_CYGNUS_MEP:
763     case EM_METAG:
764     case EM_MMIX:
765     case EM_MN10200:
766     case EM_CYGNUS_MN10200:
767     case EM_MN10300:
768     case EM_CYGNUS_MN10300:
769     case EM_MOXIE:
770     case EM_MSP430:
771     case EM_MSP430_OLD:
772     case EM_MT:
773     case EM_NDS32:
774     case EM_NIOS32:
775     case EM_OR1K:
776     case EM_PPC64:
777     case EM_PPC:
778     case EM_RL78:
779     case EM_RX:
780     case EM_S390:
781     case EM_S390_OLD:
782     case EM_SH:
783     case EM_SPARC:
784     case EM_SPARC32PLUS:
785     case EM_SPARCV9:
786     case EM_SPU:
787     case EM_TI_C6000:
788     case EM_TILEGX:
789     case EM_TILEPRO:
790     case EM_V800:
791     case EM_V850:
792     case EM_CYGNUS_V850:
793     case EM_VAX:
794     case EM_VISIUM:
795     case EM_X86_64:
796     case EM_L1OM:
797     case EM_K1OM:
798     case EM_XSTORMY16:
799     case EM_XTENSA:
800     case EM_XTENSA_OLD:
801     case EM_MICROBLAZE:
802     case EM_MICROBLAZE_OLD:
803       return TRUE;
804
805     case EM_68HC05:
806     case EM_68HC08:
807     case EM_68HC11:
808     case EM_68HC16:
809     case EM_FX66:
810     case EM_ME16:
811     case EM_MMA:
812     case EM_NCPU:
813     case EM_NDR1:
814     case EM_PCP:
815     case EM_ST100:
816     case EM_ST19:
817     case EM_ST7:
818     case EM_ST9PLUS:
819     case EM_STARCORE:
820     case EM_SVX:
821     case EM_TINYJ:
822     default:
823       warn (_("Don't know about relocations on this machine architecture\n"));
824       return FALSE;
825     }
826 }
827
828 static int
829 slurp_rela_relocs (FILE * file,
830                    unsigned long rel_offset,
831                    unsigned long rel_size,
832                    Elf_Internal_Rela ** relasp,
833                    unsigned long * nrelasp)
834 {
835   Elf_Internal_Rela * relas;
836   size_t nrelas;
837   unsigned int i;
838
839   if (is_32bit_elf)
840     {
841       Elf32_External_Rela * erelas;
842
843       erelas = (Elf32_External_Rela *) get_data (NULL, file, rel_offset, 1,
844                                                  rel_size, _("32-bit relocation data"));
845       if (!erelas)
846         return 0;
847
848       nrelas = rel_size / sizeof (Elf32_External_Rela);
849
850       relas = (Elf_Internal_Rela *) cmalloc (nrelas,
851                                              sizeof (Elf_Internal_Rela));
852
853       if (relas == NULL)
854         {
855           free (erelas);
856           error (_("out of memory parsing relocs\n"));
857           return 0;
858         }
859
860       for (i = 0; i < nrelas; i++)
861         {
862           relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
863           relas[i].r_info   = BYTE_GET (erelas[i].r_info);
864           relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
865         }
866
867       free (erelas);
868     }
869   else
870     {
871       Elf64_External_Rela * erelas;
872
873       erelas = (Elf64_External_Rela *) get_data (NULL, file, rel_offset, 1,
874                                                  rel_size, _("64-bit relocation data"));
875       if (!erelas)
876         return 0;
877
878       nrelas = rel_size / sizeof (Elf64_External_Rela);
879
880       relas = (Elf_Internal_Rela *) cmalloc (nrelas,
881                                              sizeof (Elf_Internal_Rela));
882
883       if (relas == NULL)
884         {
885           free (erelas);
886           error (_("out of memory parsing relocs\n"));
887           return 0;
888         }
889
890       for (i = 0; i < nrelas; i++)
891         {
892           relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
893           relas[i].r_info   = BYTE_GET (erelas[i].r_info);
894           relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
895
896           /* The #ifdef BFD64 below is to prevent a compile time
897              warning.  We know that if we do not have a 64 bit data
898              type that we will never execute this code anyway.  */
899 #ifdef BFD64
900           if (elf_header.e_machine == EM_MIPS
901               && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
902             {
903               /* In little-endian objects, r_info isn't really a
904                  64-bit little-endian value: it has a 32-bit
905                  little-endian symbol index followed by four
906                  individual byte fields.  Reorder INFO
907                  accordingly.  */
908               bfd_vma inf = relas[i].r_info;
909               inf = (((inf & 0xffffffff) << 32)
910                       | ((inf >> 56) & 0xff)
911                       | ((inf >> 40) & 0xff00)
912                       | ((inf >> 24) & 0xff0000)
913                       | ((inf >> 8) & 0xff000000));
914               relas[i].r_info = inf;
915             }
916 #endif /* BFD64 */
917         }
918
919       free (erelas);
920     }
921   *relasp = relas;
922   *nrelasp = nrelas;
923   return 1;
924 }
925
926 static int
927 slurp_rel_relocs (FILE * file,
928                   unsigned long rel_offset,
929                   unsigned long rel_size,
930                   Elf_Internal_Rela ** relsp,
931                   unsigned long * nrelsp)
932 {
933   Elf_Internal_Rela * rels;
934   size_t nrels;
935   unsigned int i;
936
937   if (is_32bit_elf)
938     {
939       Elf32_External_Rel * erels;
940
941       erels = (Elf32_External_Rel *) get_data (NULL, file, rel_offset, 1,
942                                                rel_size, _("32-bit relocation data"));
943       if (!erels)
944         return 0;
945
946       nrels = rel_size / sizeof (Elf32_External_Rel);
947
948       rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
949
950       if (rels == NULL)
951         {
952           free (erels);
953           error (_("out of memory parsing relocs\n"));
954           return 0;
955         }
956
957       for (i = 0; i < nrels; i++)
958         {
959           rels[i].r_offset = BYTE_GET (erels[i].r_offset);
960           rels[i].r_info   = BYTE_GET (erels[i].r_info);
961           rels[i].r_addend = 0;
962         }
963
964       free (erels);
965     }
966   else
967     {
968       Elf64_External_Rel * erels;
969
970       erels = (Elf64_External_Rel *) get_data (NULL, file, rel_offset, 1,
971                                                rel_size, _("64-bit relocation data"));
972       if (!erels)
973         return 0;
974
975       nrels = rel_size / sizeof (Elf64_External_Rel);
976
977       rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
978
979       if (rels == NULL)
980         {
981           free (erels);
982           error (_("out of memory parsing relocs\n"));
983           return 0;
984         }
985
986       for (i = 0; i < nrels; i++)
987         {
988           rels[i].r_offset = BYTE_GET (erels[i].r_offset);
989           rels[i].r_info   = BYTE_GET (erels[i].r_info);
990           rels[i].r_addend = 0;
991
992           /* The #ifdef BFD64 below is to prevent a compile time
993              warning.  We know that if we do not have a 64 bit data
994              type that we will never execute this code anyway.  */
995 #ifdef BFD64
996           if (elf_header.e_machine == EM_MIPS
997               && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
998             {
999               /* In little-endian objects, r_info isn't really a
1000                  64-bit little-endian value: it has a 32-bit
1001                  little-endian symbol index followed by four
1002                  individual byte fields.  Reorder INFO
1003                  accordingly.  */
1004               bfd_vma inf = rels[i].r_info;
1005               inf = (((inf & 0xffffffff) << 32)
1006                      | ((inf >> 56) & 0xff)
1007                      | ((inf >> 40) & 0xff00)
1008                      | ((inf >> 24) & 0xff0000)
1009                      | ((inf >> 8) & 0xff000000));
1010               rels[i].r_info = inf;
1011             }
1012 #endif /* BFD64 */
1013         }
1014
1015       free (erels);
1016     }
1017   *relsp = rels;
1018   *nrelsp = nrels;
1019   return 1;
1020 }
1021
1022 /* Returns the reloc type extracted from the reloc info field.  */
1023
1024 static unsigned int
1025 get_reloc_type (bfd_vma reloc_info)
1026 {
1027   if (is_32bit_elf)
1028     return ELF32_R_TYPE (reloc_info);
1029
1030   switch (elf_header.e_machine)
1031     {
1032     case EM_MIPS:
1033       /* Note: We assume that reloc_info has already been adjusted for us.  */
1034       return ELF64_MIPS_R_TYPE (reloc_info);
1035
1036     case EM_SPARCV9:
1037       return ELF64_R_TYPE_ID (reloc_info);
1038
1039     default:
1040       return ELF64_R_TYPE (reloc_info);
1041     }
1042 }
1043
1044 /* Return the symbol index extracted from the reloc info field.  */
1045
1046 static bfd_vma
1047 get_reloc_symindex (bfd_vma reloc_info)
1048 {
1049   return is_32bit_elf ? ELF32_R_SYM (reloc_info) : ELF64_R_SYM (reloc_info);
1050 }
1051
1052 static inline bfd_boolean
1053 uses_msp430x_relocs (void)
1054 {
1055   return
1056     elf_header.e_machine == EM_MSP430 /* Paranoia.  */
1057     /* GCC uses osabi == ELFOSBI_STANDALONE.  */
1058     && (((elf_header.e_flags & EF_MSP430_MACH) == E_MSP430_MACH_MSP430X)
1059         /* TI compiler uses ELFOSABI_NONE.  */
1060         || (elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE));
1061 }
1062
1063 /* Display the contents of the relocation data found at the specified
1064    offset.  */
1065
1066 static void
1067 dump_relocations (FILE * file,
1068                   unsigned long rel_offset,
1069                   unsigned long rel_size,
1070                   Elf_Internal_Sym * symtab,
1071                   unsigned long nsyms,
1072                   char * strtab,
1073                   unsigned long strtablen,
1074                   int is_rela,
1075                   int is_dynsym)
1076 {
1077   unsigned int i;
1078   Elf_Internal_Rela * rels;
1079
1080   if (is_rela == UNKNOWN)
1081     is_rela = guess_is_rela (elf_header.e_machine);
1082
1083   if (is_rela)
1084     {
1085       if (!slurp_rela_relocs (file, rel_offset, rel_size, &rels, &rel_size))
1086         return;
1087     }
1088   else
1089     {
1090       if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
1091         return;
1092     }
1093
1094   if (is_32bit_elf)
1095     {
1096       if (is_rela)
1097         {
1098           if (do_wide)
1099             printf (_(" Offset     Info    Type                Sym. Value  Symbol's Name + Addend\n"));
1100           else
1101             printf (_(" Offset     Info    Type            Sym.Value  Sym. Name + Addend\n"));
1102         }
1103       else
1104         {
1105           if (do_wide)
1106             printf (_(" Offset     Info    Type                Sym. Value  Symbol's Name\n"));
1107           else
1108             printf (_(" Offset     Info    Type            Sym.Value  Sym. Name\n"));
1109         }
1110     }
1111   else
1112     {
1113       if (is_rela)
1114         {
1115           if (do_wide)
1116             printf (_("    Offset             Info             Type               Symbol's Value  Symbol's Name + Addend\n"));
1117           else
1118             printf (_("  Offset          Info           Type           Sym. Value    Sym. Name + Addend\n"));
1119         }
1120       else
1121         {
1122           if (do_wide)
1123             printf (_("    Offset             Info             Type               Symbol's Value  Symbol's Name\n"));
1124           else
1125             printf (_("  Offset          Info           Type           Sym. Value    Sym. Name\n"));
1126         }
1127     }
1128
1129   for (i = 0; i < rel_size; i++)
1130     {
1131       const char * rtype;
1132       bfd_vma offset;
1133       bfd_vma inf;
1134       bfd_vma symtab_index;
1135       bfd_vma type;
1136
1137       offset = rels[i].r_offset;
1138       inf    = rels[i].r_info;
1139
1140       type = get_reloc_type (inf);
1141       symtab_index = get_reloc_symindex  (inf);
1142
1143       if (is_32bit_elf)
1144         {
1145           printf ("%8.8lx  %8.8lx ",
1146                   (unsigned long) offset & 0xffffffff,
1147                   (unsigned long) inf & 0xffffffff);
1148         }
1149       else
1150         {
1151 #if BFD_HOST_64BIT_LONG
1152           printf (do_wide
1153                   ? "%16.16lx  %16.16lx "
1154                   : "%12.12lx  %12.12lx ",
1155                   offset, inf);
1156 #elif BFD_HOST_64BIT_LONG_LONG
1157 #ifndef __MSVCRT__
1158           printf (do_wide
1159                   ? "%16.16llx  %16.16llx "
1160                   : "%12.12llx  %12.12llx ",
1161                   offset, inf);
1162 #else
1163           printf (do_wide
1164                   ? "%16.16I64x  %16.16I64x "
1165                   : "%12.12I64x  %12.12I64x ",
1166                   offset, inf);
1167 #endif
1168 #else
1169           printf (do_wide
1170                   ? "%8.8lx%8.8lx  %8.8lx%8.8lx "
1171                   : "%4.4lx%8.8lx  %4.4lx%8.8lx ",
1172                   _bfd_int64_high (offset),
1173                   _bfd_int64_low (offset),
1174                   _bfd_int64_high (inf),
1175                   _bfd_int64_low (inf));
1176 #endif
1177         }
1178
1179       switch (elf_header.e_machine)
1180         {
1181         default:
1182           rtype = NULL;
1183           break;
1184
1185         case EM_AARCH64:
1186           rtype = elf_aarch64_reloc_type (type);
1187           break;
1188
1189         case EM_M32R:
1190         case EM_CYGNUS_M32R:
1191           rtype = elf_m32r_reloc_type (type);
1192           break;
1193
1194         case EM_386:
1195         case EM_IAMCU:
1196           rtype = elf_i386_reloc_type (type);
1197           break;
1198
1199         case EM_68HC11:
1200         case EM_68HC12:
1201           rtype = elf_m68hc11_reloc_type (type);
1202           break;
1203
1204         case EM_68K:
1205           rtype = elf_m68k_reloc_type (type);
1206           break;
1207
1208         case EM_960:
1209           rtype = elf_i960_reloc_type (type);
1210           break;
1211
1212         case EM_AVR:
1213         case EM_AVR_OLD:
1214           rtype = elf_avr_reloc_type (type);
1215           break;
1216
1217         case EM_OLD_SPARCV9:
1218         case EM_SPARC32PLUS:
1219         case EM_SPARCV9:
1220         case EM_SPARC:
1221           rtype = elf_sparc_reloc_type (type);
1222           break;
1223
1224         case EM_SPU:
1225           rtype = elf_spu_reloc_type (type);
1226           break;
1227
1228         case EM_V800:
1229           rtype = v800_reloc_type (type);
1230           break;
1231         case EM_V850:
1232         case EM_CYGNUS_V850:
1233           rtype = v850_reloc_type (type);
1234           break;
1235
1236         case EM_D10V:
1237         case EM_CYGNUS_D10V:
1238           rtype = elf_d10v_reloc_type (type);
1239           break;
1240
1241         case EM_D30V:
1242         case EM_CYGNUS_D30V:
1243           rtype = elf_d30v_reloc_type (type);
1244           break;
1245
1246         case EM_DLX:
1247           rtype = elf_dlx_reloc_type (type);
1248           break;
1249
1250         case EM_SH:
1251           rtype = elf_sh_reloc_type (type);
1252           break;
1253
1254         case EM_MN10300:
1255         case EM_CYGNUS_MN10300:
1256           rtype = elf_mn10300_reloc_type (type);
1257           break;
1258
1259         case EM_MN10200:
1260         case EM_CYGNUS_MN10200:
1261           rtype = elf_mn10200_reloc_type (type);
1262           break;
1263
1264         case EM_FR30:
1265         case EM_CYGNUS_FR30:
1266           rtype = elf_fr30_reloc_type (type);
1267           break;
1268
1269         case EM_CYGNUS_FRV:
1270           rtype = elf_frv_reloc_type (type);
1271           break;
1272
1273         case EM_FT32:
1274           rtype = elf_ft32_reloc_type (type);
1275           break;
1276
1277         case EM_MCORE:
1278           rtype = elf_mcore_reloc_type (type);
1279           break;
1280
1281         case EM_MMIX:
1282           rtype = elf_mmix_reloc_type (type);
1283           break;
1284
1285         case EM_MOXIE:
1286           rtype = elf_moxie_reloc_type (type);
1287           break;
1288
1289         case EM_MSP430:
1290           if (uses_msp430x_relocs ())
1291             {
1292               rtype = elf_msp430x_reloc_type (type);
1293               break;
1294             }
1295         case EM_MSP430_OLD:
1296           rtype = elf_msp430_reloc_type (type);
1297           break;
1298
1299         case EM_NDS32:
1300           rtype = elf_nds32_reloc_type (type);
1301           break;
1302
1303         case EM_PPC:
1304           rtype = elf_ppc_reloc_type (type);
1305           break;
1306
1307         case EM_PPC64:
1308           rtype = elf_ppc64_reloc_type (type);
1309           break;
1310
1311         case EM_MIPS:
1312         case EM_MIPS_RS3_LE:
1313           rtype = elf_mips_reloc_type (type);
1314           break;
1315
1316         case EM_ALPHA:
1317           rtype = elf_alpha_reloc_type (type);
1318           break;
1319
1320         case EM_ARM:
1321           rtype = elf_arm_reloc_type (type);
1322           break;
1323
1324         case EM_ARC:
1325         case EM_ARC_COMPACT:
1326         case EM_ARC_COMPACT2:
1327           rtype = elf_arc_reloc_type (type);
1328           break;
1329
1330         case EM_PARISC:
1331           rtype = elf_hppa_reloc_type (type);
1332           break;
1333
1334         case EM_H8_300:
1335         case EM_H8_300H:
1336         case EM_H8S:
1337           rtype = elf_h8_reloc_type (type);
1338           break;
1339
1340         case EM_OR1K:
1341           rtype = elf_or1k_reloc_type (type);
1342           break;
1343
1344         case EM_PJ:
1345         case EM_PJ_OLD:
1346           rtype = elf_pj_reloc_type (type);
1347           break;
1348         case EM_IA_64:
1349           rtype = elf_ia64_reloc_type (type);
1350           break;
1351
1352         case EM_CRIS:
1353           rtype = elf_cris_reloc_type (type);
1354           break;
1355
1356         case EM_860:
1357           rtype = elf_i860_reloc_type (type);
1358           break;
1359
1360         case EM_X86_64:
1361         case EM_L1OM:
1362         case EM_K1OM:
1363           rtype = elf_x86_64_reloc_type (type);
1364           break;
1365
1366         case EM_S370:
1367           rtype = i370_reloc_type (type);
1368           break;
1369
1370         case EM_S390_OLD:
1371         case EM_S390:
1372           rtype = elf_s390_reloc_type (type);
1373           break;
1374
1375         case EM_SCORE:
1376           rtype = elf_score_reloc_type (type);
1377           break;
1378
1379         case EM_XSTORMY16:
1380           rtype = elf_xstormy16_reloc_type (type);
1381           break;
1382
1383         case EM_CRX:
1384           rtype = elf_crx_reloc_type (type);
1385           break;
1386
1387         case EM_VAX:
1388           rtype = elf_vax_reloc_type (type);
1389           break;
1390
1391         case EM_VISIUM:
1392           rtype = elf_visium_reloc_type (type);
1393           break;
1394
1395         case EM_ADAPTEVA_EPIPHANY:
1396           rtype = elf_epiphany_reloc_type (type);
1397           break;
1398
1399         case EM_IP2K:
1400         case EM_IP2K_OLD:
1401           rtype = elf_ip2k_reloc_type (type);
1402           break;
1403
1404         case EM_IQ2000:
1405           rtype = elf_iq2000_reloc_type (type);
1406           break;
1407
1408         case EM_XTENSA_OLD:
1409         case EM_XTENSA:
1410           rtype = elf_xtensa_reloc_type (type);
1411           break;
1412
1413         case EM_LATTICEMICO32:
1414           rtype = elf_lm32_reloc_type (type);
1415           break;
1416
1417         case EM_M32C_OLD:
1418         case EM_M32C:
1419           rtype = elf_m32c_reloc_type (type);
1420           break;
1421
1422         case EM_MT:
1423           rtype = elf_mt_reloc_type (type);
1424           break;
1425
1426         case EM_BLACKFIN:
1427           rtype = elf_bfin_reloc_type (type);
1428           break;
1429
1430         case EM_CYGNUS_MEP:
1431           rtype = elf_mep_reloc_type (type);
1432           break;
1433
1434         case EM_CR16:
1435           rtype = elf_cr16_reloc_type (type);
1436           break;
1437
1438         case EM_MICROBLAZE:
1439         case EM_MICROBLAZE_OLD:
1440           rtype = elf_microblaze_reloc_type (type);
1441           break;
1442
1443         case EM_RL78:
1444           rtype = elf_rl78_reloc_type (type);
1445           break;
1446
1447         case EM_RX:
1448           rtype = elf_rx_reloc_type (type);
1449           break;
1450
1451         case EM_METAG:
1452           rtype = elf_metag_reloc_type (type);
1453           break;
1454
1455         case EM_XC16X:
1456         case EM_C166:
1457           rtype = elf_xc16x_reloc_type (type);
1458           break;
1459
1460         case EM_TI_C6000:
1461           rtype = elf_tic6x_reloc_type (type);
1462           break;
1463
1464         case EM_TILEGX:
1465           rtype = elf_tilegx_reloc_type (type);
1466           break;
1467
1468         case EM_TILEPRO:
1469           rtype = elf_tilepro_reloc_type (type);
1470           break;
1471
1472         case EM_XGATE:
1473           rtype = elf_xgate_reloc_type (type);
1474           break;
1475
1476         case EM_ALTERA_NIOS2:
1477           rtype = elf_nios2_reloc_type (type);
1478           break;
1479         }
1480
1481       if (rtype == NULL)
1482         printf (_("unrecognized: %-7lx"), (unsigned long) type & 0xffffffff);
1483       else
1484         printf (do_wide ? "%-22.22s" : "%-17.17s", rtype);
1485
1486       if (elf_header.e_machine == EM_ALPHA
1487           && rtype != NULL
1488           && streq (rtype, "R_ALPHA_LITUSE")
1489           && is_rela)
1490         {
1491           switch (rels[i].r_addend)
1492             {
1493             case LITUSE_ALPHA_ADDR:   rtype = "ADDR";   break;
1494             case LITUSE_ALPHA_BASE:   rtype = "BASE";   break;
1495             case LITUSE_ALPHA_BYTOFF: rtype = "BYTOFF"; break;
1496             case LITUSE_ALPHA_JSR:    rtype = "JSR";    break;
1497             case LITUSE_ALPHA_TLSGD:  rtype = "TLSGD";  break;
1498             case LITUSE_ALPHA_TLSLDM: rtype = "TLSLDM"; break;
1499             case LITUSE_ALPHA_JSRDIRECT: rtype = "JSRDIRECT"; break;
1500             default: rtype = NULL;
1501             }
1502           if (rtype)
1503             printf (" (%s)", rtype);
1504           else
1505             {
1506               putchar (' ');
1507               printf (_("<unknown addend: %lx>"),
1508                       (unsigned long) rels[i].r_addend);
1509             }
1510         }
1511       else if (symtab_index)
1512         {
1513           if (symtab == NULL || symtab_index >= nsyms)
1514             printf (_(" bad symbol index: %08lx"), (unsigned long) symtab_index);
1515           else
1516             {
1517               Elf_Internal_Sym * psym;
1518               const char * version_string;
1519               enum versioned_symbol_info sym_info;
1520               unsigned short vna_other;
1521
1522               psym = symtab + symtab_index;
1523
1524               version_string
1525                 = get_symbol_version_string (file, is_dynsym,
1526                                              strtab, strtablen,
1527                                              symtab_index,
1528                                              psym,
1529                                              &sym_info,
1530                                              &vna_other);
1531
1532               printf (" ");
1533
1534               if (ELF_ST_TYPE (psym->st_info) == STT_GNU_IFUNC)
1535                 {
1536                   const char * name;
1537                   unsigned int len;
1538                   unsigned int width = is_32bit_elf ? 8 : 14;
1539
1540                   /* Relocations against GNU_IFUNC symbols do not use the value
1541                      of the symbol as the address to relocate against.  Instead
1542                      they invoke the function named by the symbol and use its
1543                      result as the address for relocation.
1544
1545                      To indicate this to the user, do not display the value of
1546                      the symbol in the "Symbols's Value" field.  Instead show
1547                      its name followed by () as a hint that the symbol is
1548                      invoked.  */
1549
1550                   if (strtab == NULL
1551                       || psym->st_name == 0
1552                       || psym->st_name >= strtablen)
1553                     name = "??";
1554                   else
1555                     name = strtab + psym->st_name;
1556
1557                   len = print_symbol (width, name);
1558                   if (version_string)
1559                     printf (sym_info == symbol_public ? "@@%s" : "@%s",
1560                             version_string);
1561                   printf ("()%-*s", len <= width ? (width + 1) - len : 1, " ");
1562                 }
1563               else
1564                 {
1565                   print_vma (psym->st_value, LONG_HEX);
1566
1567                   printf (is_32bit_elf ? "   " : " ");
1568                 }
1569
1570               if (psym->st_name == 0)
1571                 {
1572                   const char * sec_name = "<null>";
1573                   char name_buf[40];
1574
1575                   if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1576                     {
1577                       if (psym->st_shndx < elf_header.e_shnum)
1578                         sec_name = SECTION_NAME (section_headers + psym->st_shndx);
1579                       else if (psym->st_shndx == SHN_ABS)
1580                         sec_name = "ABS";
1581                       else if (psym->st_shndx == SHN_COMMON)
1582                         sec_name = "COMMON";
1583                       else if ((elf_header.e_machine == EM_MIPS
1584                                 && psym->st_shndx == SHN_MIPS_SCOMMON)
1585                                || (elf_header.e_machine == EM_TI_C6000
1586                                    && psym->st_shndx == SHN_TIC6X_SCOMMON))
1587                         sec_name = "SCOMMON";
1588                       else if (elf_header.e_machine == EM_MIPS
1589                                && psym->st_shndx == SHN_MIPS_SUNDEFINED)
1590                         sec_name = "SUNDEF";
1591                       else if ((elf_header.e_machine == EM_X86_64
1592                                 || elf_header.e_machine == EM_L1OM
1593                                 || elf_header.e_machine == EM_K1OM)
1594                                && psym->st_shndx == SHN_X86_64_LCOMMON)
1595                         sec_name = "LARGE_COMMON";
1596                       else if (elf_header.e_machine == EM_IA_64
1597                                && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
1598                                && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1599                         sec_name = "ANSI_COM";
1600                       else if (is_ia64_vms ()
1601                                && psym->st_shndx == SHN_IA_64_VMS_SYMVEC)
1602                         sec_name = "VMS_SYMVEC";
1603                       else
1604                         {
1605                           sprintf (name_buf, "<section 0x%x>",
1606                                    (unsigned int) psym->st_shndx);
1607                           sec_name = name_buf;
1608                         }
1609                     }
1610                   print_symbol (22, sec_name);
1611                 }
1612               else if (strtab == NULL)
1613                 printf (_("<string table index: %3ld>"), psym->st_name);
1614               else if (psym->st_name >= strtablen)
1615                 printf (_("<corrupt string table index: %3ld>"), psym->st_name);
1616               else
1617                 {
1618                   print_symbol (22, strtab + psym->st_name);
1619                   if (version_string)
1620                     printf (sym_info == symbol_public ? "@@%s" : "@%s",
1621                             version_string);
1622                 }
1623
1624               if (is_rela)
1625                 {
1626                   bfd_vma off = rels[i].r_addend;
1627
1628                   if ((bfd_signed_vma) off < 0)
1629                     printf (" - %" BFD_VMA_FMT "x", - off);
1630                   else
1631                     printf (" + %" BFD_VMA_FMT "x", off);
1632                 }
1633             }
1634         }
1635       else if (is_rela)
1636         {
1637           bfd_vma off = rels[i].r_addend;
1638
1639           printf ("%*c", is_32bit_elf ? 12 : 20, ' ');
1640           if ((bfd_signed_vma) off < 0)
1641             printf ("-%" BFD_VMA_FMT "x", - off);
1642           else
1643             printf ("%" BFD_VMA_FMT "x", off);
1644         }
1645
1646       if (elf_header.e_machine == EM_SPARCV9
1647           && rtype != NULL
1648           && streq (rtype, "R_SPARC_OLO10"))
1649         printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf));
1650
1651       putchar ('\n');
1652
1653 #ifdef BFD64
1654       if (! is_32bit_elf && elf_header.e_machine == EM_MIPS)
1655         {
1656           bfd_vma type2 = ELF64_MIPS_R_TYPE2 (inf);
1657           bfd_vma type3 = ELF64_MIPS_R_TYPE3 (inf);
1658           const char * rtype2 = elf_mips_reloc_type (type2);
1659           const char * rtype3 = elf_mips_reloc_type (type3);
1660
1661           printf ("                    Type2: ");
1662
1663           if (rtype2 == NULL)
1664             printf (_("unrecognized: %-7lx"),
1665                     (unsigned long) type2 & 0xffffffff);
1666           else
1667             printf ("%-17.17s", rtype2);
1668
1669           printf ("\n                    Type3: ");
1670
1671           if (rtype3 == NULL)
1672             printf (_("unrecognized: %-7lx"),
1673                     (unsigned long) type3 & 0xffffffff);
1674           else
1675             printf ("%-17.17s", rtype3);
1676
1677           putchar ('\n');
1678         }
1679 #endif /* BFD64 */
1680     }
1681
1682   free (rels);
1683 }
1684
1685 static const char *
1686 get_mips_dynamic_type (unsigned long type)
1687 {
1688   switch (type)
1689     {
1690     case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1691     case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1692     case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1693     case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1694     case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1695     case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1696     case DT_MIPS_MSYM: return "MIPS_MSYM";
1697     case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1698     case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1699     case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1700     case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1701     case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1702     case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1703     case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1704     case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1705     case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1706     case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1707     case DT_MIPS_RLD_MAP_REL: return "MIPS_RLD_MAP_REL";
1708     case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1709     case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1710     case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1711     case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1712     case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1713     case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1714     case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1715     case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1716     case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1717     case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1718     case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1719     case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1720     case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1721     case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1722     case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1723     case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1724     case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1725     case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1726     case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1727     case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1728     case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1729     case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1730     case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1731     case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1732     case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1733     case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1734     case DT_MIPS_PLTGOT: return "MIPS_PLTGOT";
1735     case DT_MIPS_RWPLT: return "MIPS_RWPLT";
1736     default:
1737       return NULL;
1738     }
1739 }
1740
1741 static const char *
1742 get_sparc64_dynamic_type (unsigned long type)
1743 {
1744   switch (type)
1745     {
1746     case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1747     default:
1748       return NULL;
1749     }
1750 }
1751
1752 static const char *
1753 get_ppc_dynamic_type (unsigned long type)
1754 {
1755   switch (type)
1756     {
1757     case DT_PPC_GOT:    return "PPC_GOT";
1758     case DT_PPC_OPT:    return "PPC_OPT";
1759     default:
1760       return NULL;
1761     }
1762 }
1763
1764 static const char *
1765 get_ppc64_dynamic_type (unsigned long type)
1766 {
1767   switch (type)
1768     {
1769     case DT_PPC64_GLINK:  return "PPC64_GLINK";
1770     case DT_PPC64_OPD:    return "PPC64_OPD";
1771     case DT_PPC64_OPDSZ:  return "PPC64_OPDSZ";
1772     case DT_PPC64_OPT:    return "PPC64_OPT";
1773     default:
1774       return NULL;
1775     }
1776 }
1777
1778 static const char *
1779 get_parisc_dynamic_type (unsigned long type)
1780 {
1781   switch (type)
1782     {
1783     case DT_HP_LOAD_MAP:        return "HP_LOAD_MAP";
1784     case DT_HP_DLD_FLAGS:       return "HP_DLD_FLAGS";
1785     case DT_HP_DLD_HOOK:        return "HP_DLD_HOOK";
1786     case DT_HP_UX10_INIT:       return "HP_UX10_INIT";
1787     case DT_HP_UX10_INITSZ:     return "HP_UX10_INITSZ";
1788     case DT_HP_PREINIT:         return "HP_PREINIT";
1789     case DT_HP_PREINITSZ:       return "HP_PREINITSZ";
1790     case DT_HP_NEEDED:          return "HP_NEEDED";
1791     case DT_HP_TIME_STAMP:      return "HP_TIME_STAMP";
1792     case DT_HP_CHECKSUM:        return "HP_CHECKSUM";
1793     case DT_HP_GST_SIZE:        return "HP_GST_SIZE";
1794     case DT_HP_GST_VERSION:     return "HP_GST_VERSION";
1795     case DT_HP_GST_HASHVAL:     return "HP_GST_HASHVAL";
1796     case DT_HP_EPLTREL:         return "HP_GST_EPLTREL";
1797     case DT_HP_EPLTRELSZ:       return "HP_GST_EPLTRELSZ";
1798     case DT_HP_FILTERED:        return "HP_FILTERED";
1799     case DT_HP_FILTER_TLS:      return "HP_FILTER_TLS";
1800     case DT_HP_COMPAT_FILTERED: return "HP_COMPAT_FILTERED";
1801     case DT_HP_LAZYLOAD:        return "HP_LAZYLOAD";
1802     case DT_HP_BIND_NOW_COUNT:  return "HP_BIND_NOW_COUNT";
1803     case DT_PLT:                return "PLT";
1804     case DT_PLT_SIZE:           return "PLT_SIZE";
1805     case DT_DLT:                return "DLT";
1806     case DT_DLT_SIZE:           return "DLT_SIZE";
1807     default:
1808       return NULL;
1809     }
1810 }
1811
1812 static const char *
1813 get_ia64_dynamic_type (unsigned long type)
1814 {
1815   switch (type)
1816     {
1817     case DT_IA_64_PLT_RESERVE:         return "IA_64_PLT_RESERVE";
1818     case DT_IA_64_VMS_SUBTYPE:         return "VMS_SUBTYPE";
1819     case DT_IA_64_VMS_IMGIOCNT:        return "VMS_IMGIOCNT";
1820     case DT_IA_64_VMS_LNKFLAGS:        return "VMS_LNKFLAGS";
1821     case DT_IA_64_VMS_VIR_MEM_BLK_SIZ: return "VMS_VIR_MEM_BLK_SIZ";
1822     case DT_IA_64_VMS_IDENT:           return "VMS_IDENT";
1823     case DT_IA_64_VMS_NEEDED_IDENT:    return "VMS_NEEDED_IDENT";
1824     case DT_IA_64_VMS_IMG_RELA_CNT:    return "VMS_IMG_RELA_CNT";
1825     case DT_IA_64_VMS_SEG_RELA_CNT:    return "VMS_SEG_RELA_CNT";
1826     case DT_IA_64_VMS_FIXUP_RELA_CNT:  return "VMS_FIXUP_RELA_CNT";
1827     case DT_IA_64_VMS_FIXUP_NEEDED:    return "VMS_FIXUP_NEEDED";
1828     case DT_IA_64_VMS_SYMVEC_CNT:      return "VMS_SYMVEC_CNT";
1829     case DT_IA_64_VMS_XLATED:          return "VMS_XLATED";
1830     case DT_IA_64_VMS_STACKSIZE:       return "VMS_STACKSIZE";
1831     case DT_IA_64_VMS_UNWINDSZ:        return "VMS_UNWINDSZ";
1832     case DT_IA_64_VMS_UNWIND_CODSEG:   return "VMS_UNWIND_CODSEG";
1833     case DT_IA_64_VMS_UNWIND_INFOSEG:  return "VMS_UNWIND_INFOSEG";
1834     case DT_IA_64_VMS_LINKTIME:        return "VMS_LINKTIME";
1835     case DT_IA_64_VMS_SEG_NO:          return "VMS_SEG_NO";
1836     case DT_IA_64_VMS_SYMVEC_OFFSET:   return "VMS_SYMVEC_OFFSET";
1837     case DT_IA_64_VMS_SYMVEC_SEG:      return "VMS_SYMVEC_SEG";
1838     case DT_IA_64_VMS_UNWIND_OFFSET:   return "VMS_UNWIND_OFFSET";
1839     case DT_IA_64_VMS_UNWIND_SEG:      return "VMS_UNWIND_SEG";
1840     case DT_IA_64_VMS_STRTAB_OFFSET:   return "VMS_STRTAB_OFFSET";
1841     case DT_IA_64_VMS_SYSVER_OFFSET:   return "VMS_SYSVER_OFFSET";
1842     case DT_IA_64_VMS_IMG_RELA_OFF:    return "VMS_IMG_RELA_OFF";
1843     case DT_IA_64_VMS_SEG_RELA_OFF:    return "VMS_SEG_RELA_OFF";
1844     case DT_IA_64_VMS_FIXUP_RELA_OFF:  return "VMS_FIXUP_RELA_OFF";
1845     case DT_IA_64_VMS_PLTGOT_OFFSET:   return "VMS_PLTGOT_OFFSET";
1846     case DT_IA_64_VMS_PLTGOT_SEG:      return "VMS_PLTGOT_SEG";
1847     case DT_IA_64_VMS_FPMODE:          return "VMS_FPMODE";
1848     default:
1849       return NULL;
1850     }
1851 }
1852
1853 static const char *
1854 get_solaris_section_type (unsigned long type)
1855 {
1856   switch (type)
1857     {
1858     case 0x6fffffee: return "SUNW_ancillary";
1859     case 0x6fffffef: return "SUNW_capchain";
1860     case 0x6ffffff0: return "SUNW_capinfo";
1861     case 0x6ffffff1: return "SUNW_symsort";
1862     case 0x6ffffff2: return "SUNW_tlssort";
1863     case 0x6ffffff3: return "SUNW_LDYNSYM";
1864     case 0x6ffffff4: return "SUNW_dof";
1865     case 0x6ffffff5: return "SUNW_cap";
1866     case 0x6ffffff6: return "SUNW_SIGNATURE";
1867     case 0x6ffffff7: return "SUNW_ANNOTATE";
1868     case 0x6ffffff8: return "SUNW_DEBUGSTR";
1869     case 0x6ffffff9: return "SUNW_DEBUG";
1870     case 0x6ffffffa: return "SUNW_move";
1871     case 0x6ffffffb: return "SUNW_COMDAT";
1872     case 0x6ffffffc: return "SUNW_syminfo";
1873     case 0x6ffffffd: return "SUNW_verdef";
1874     case 0x6ffffffe: return "SUNW_verneed";
1875     case 0x6fffffff: return "SUNW_versym";
1876     case 0x70000000: return "SPARC_GOTDATA";
1877     default: return NULL;
1878     }
1879 }
1880
1881 static const char *
1882 get_alpha_dynamic_type (unsigned long type)
1883 {
1884   switch (type)
1885     {
1886     case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
1887     default:
1888       return NULL;
1889     }
1890 }
1891
1892 static const char *
1893 get_score_dynamic_type (unsigned long type)
1894 {
1895   switch (type)
1896     {
1897     case DT_SCORE_BASE_ADDRESS: return "SCORE_BASE_ADDRESS";
1898     case DT_SCORE_LOCAL_GOTNO:  return "SCORE_LOCAL_GOTNO";
1899     case DT_SCORE_SYMTABNO:     return "SCORE_SYMTABNO";
1900     case DT_SCORE_GOTSYM:       return "SCORE_GOTSYM";
1901     case DT_SCORE_UNREFEXTNO:   return "SCORE_UNREFEXTNO";
1902     case DT_SCORE_HIPAGENO:     return "SCORE_HIPAGENO";
1903     default:
1904       return NULL;
1905     }
1906 }
1907
1908 static const char *
1909 get_tic6x_dynamic_type (unsigned long type)
1910 {
1911   switch (type)
1912     {
1913     case DT_C6000_GSYM_OFFSET: return "C6000_GSYM_OFFSET";
1914     case DT_C6000_GSTR_OFFSET: return "C6000_GSTR_OFFSET";
1915     case DT_C6000_DSBT_BASE:   return "C6000_DSBT_BASE";
1916     case DT_C6000_DSBT_SIZE:   return "C6000_DSBT_SIZE";
1917     case DT_C6000_PREEMPTMAP:  return "C6000_PREEMPTMAP";
1918     case DT_C6000_DSBT_INDEX:  return "C6000_DSBT_INDEX";
1919     default:
1920       return NULL;
1921     }
1922 }
1923
1924 static const char *
1925 get_nios2_dynamic_type (unsigned long type)
1926 {
1927   switch (type)
1928     {
1929     case DT_NIOS2_GP: return "NIOS2_GP";
1930     default:
1931       return NULL;
1932     }
1933 }
1934
1935 static const char *
1936 get_solaris_dynamic_type (unsigned long type)
1937 {
1938   switch (type)
1939     {
1940     case 0x6000000d: return "SUNW_AUXILIARY";
1941     case 0x6000000e: return "SUNW_RTLDINF";
1942     case 0x6000000f: return "SUNW_FILTER";
1943     case 0x60000010: return "SUNW_CAP";
1944     case 0x60000011: return "SUNW_SYMTAB";
1945     case 0x60000012: return "SUNW_SYMSZ";
1946     case 0x60000013: return "SUNW_SORTENT";
1947     case 0x60000014: return "SUNW_SYMSORT";
1948     case 0x60000015: return "SUNW_SYMSORTSZ";
1949     case 0x60000016: return "SUNW_TLSSORT";
1950     case 0x60000017: return "SUNW_TLSSORTSZ";
1951     case 0x60000018: return "SUNW_CAPINFO";
1952     case 0x60000019: return "SUNW_STRPAD";
1953     case 0x6000001a: return "SUNW_CAPCHAIN";
1954     case 0x6000001b: return "SUNW_LDMACH";
1955     case 0x6000001d: return "SUNW_CAPCHAINENT";
1956     case 0x6000001f: return "SUNW_CAPCHAINSZ";
1957     case 0x60000021: return "SUNW_PARENT";
1958     case 0x60000023: return "SUNW_ASLR";
1959     case 0x60000025: return "SUNW_RELAX";
1960     case 0x60000029: return "SUNW_NXHEAP";
1961     case 0x6000002b: return "SUNW_NXSTACK";
1962
1963     case 0x70000001: return "SPARC_REGISTER";
1964     case 0x7ffffffd: return "AUXILIARY";
1965     case 0x7ffffffe: return "USED";
1966     case 0x7fffffff: return "FILTER";
1967
1968     default: return NULL;      
1969     }
1970 }
1971
1972 static const char *
1973 get_dynamic_type (unsigned long type)
1974 {
1975   static char buff[64];
1976
1977   switch (type)
1978     {
1979     case DT_NULL:       return "NULL";
1980     case DT_NEEDED:     return "NEEDED";
1981     case DT_PLTRELSZ:   return "PLTRELSZ";
1982     case DT_PLTGOT:     return "PLTGOT";
1983     case DT_HASH:       return "HASH";
1984     case DT_STRTAB:     return "STRTAB";
1985     case DT_SYMTAB:     return "SYMTAB";
1986     case DT_RELA:       return "RELA";
1987     case DT_RELASZ:     return "RELASZ";
1988     case DT_RELAENT:    return "RELAENT";
1989     case DT_STRSZ:      return "STRSZ";
1990     case DT_SYMENT:     return "SYMENT";
1991     case DT_INIT:       return "INIT";
1992     case DT_FINI:       return "FINI";
1993     case DT_SONAME:     return "SONAME";
1994     case DT_RPATH:      return "RPATH";
1995     case DT_SYMBOLIC:   return "SYMBOLIC";
1996     case DT_REL:        return "REL";
1997     case DT_RELSZ:      return "RELSZ";
1998     case DT_RELENT:     return "RELENT";
1999     case DT_PLTREL:     return "PLTREL";
2000     case DT_DEBUG:      return "DEBUG";
2001     case DT_TEXTREL:    return "TEXTREL";
2002     case DT_JMPREL:     return "JMPREL";
2003     case DT_BIND_NOW:   return "BIND_NOW";
2004     case DT_INIT_ARRAY: return "INIT_ARRAY";
2005     case DT_FINI_ARRAY: return "FINI_ARRAY";
2006     case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
2007     case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
2008     case DT_RUNPATH:    return "RUNPATH";
2009     case DT_FLAGS:      return "FLAGS";
2010
2011     case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
2012     case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
2013
2014     case DT_CHECKSUM:   return "CHECKSUM";
2015     case DT_PLTPADSZ:   return "PLTPADSZ";
2016     case DT_MOVEENT:    return "MOVEENT";
2017     case DT_MOVESZ:     return "MOVESZ";
2018     case DT_FEATURE:    return "FEATURE";
2019     case DT_POSFLAG_1:  return "POSFLAG_1";
2020     case DT_SYMINSZ:    return "SYMINSZ";
2021     case DT_SYMINENT:   return "SYMINENT"; /* aka VALRNGHI */
2022
2023     case DT_ADDRRNGLO:  return "ADDRRNGLO";
2024     case DT_CONFIG:     return "CONFIG";
2025     case DT_DEPAUDIT:   return "DEPAUDIT";
2026     case DT_AUDIT:      return "AUDIT";
2027     case DT_PLTPAD:     return "PLTPAD";
2028     case DT_MOVETAB:    return "MOVETAB";
2029     case DT_SYMINFO:    return "SYMINFO"; /* aka ADDRRNGHI */
2030
2031     case DT_VERSYM:     return "VERSYM";
2032
2033     case DT_TLSDESC_GOT: return "TLSDESC_GOT";
2034     case DT_TLSDESC_PLT: return "TLSDESC_PLT";
2035     case DT_RELACOUNT:  return "RELACOUNT";
2036     case DT_RELCOUNT:   return "RELCOUNT";
2037     case DT_FLAGS_1:    return "FLAGS_1";
2038     case DT_VERDEF:     return "VERDEF";
2039     case DT_VERDEFNUM:  return "VERDEFNUM";
2040     case DT_VERNEED:    return "VERNEED";
2041     case DT_VERNEEDNUM: return "VERNEEDNUM";
2042
2043     case DT_AUXILIARY:  return "AUXILIARY";
2044     case DT_USED:       return "USED";
2045     case DT_FILTER:     return "FILTER";
2046
2047     case DT_GNU_PRELINKED: return "GNU_PRELINKED";
2048     case DT_GNU_CONFLICT: return "GNU_CONFLICT";
2049     case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
2050     case DT_GNU_LIBLIST: return "GNU_LIBLIST";
2051     case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
2052     case DT_GNU_HASH:   return "GNU_HASH";
2053
2054     default:
2055       if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
2056         {
2057           const char * result;
2058
2059           switch (elf_header.e_machine)
2060             {
2061             case EM_MIPS:
2062             case EM_MIPS_RS3_LE:
2063               result = get_mips_dynamic_type (type);
2064               break;
2065             case EM_SPARCV9:
2066               result = get_sparc64_dynamic_type (type);
2067               break;
2068             case EM_PPC:
2069               result = get_ppc_dynamic_type (type);
2070               break;
2071             case EM_PPC64:
2072               result = get_ppc64_dynamic_type (type);
2073               break;
2074             case EM_IA_64:
2075               result = get_ia64_dynamic_type (type);
2076               break;
2077             case EM_ALPHA:
2078               result = get_alpha_dynamic_type (type);
2079               break;
2080             case EM_SCORE:
2081               result = get_score_dynamic_type (type);
2082               break;
2083             case EM_TI_C6000:
2084               result = get_tic6x_dynamic_type (type);
2085               break;
2086             case EM_ALTERA_NIOS2:
2087               result = get_nios2_dynamic_type (type);
2088               break;
2089             default:
2090               if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
2091                 result = get_solaris_dynamic_type (type);
2092               else
2093                 result = NULL;
2094               break;
2095             }
2096
2097           if (result != NULL)
2098             return result;
2099
2100           snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
2101         }
2102       else if (((type >= DT_LOOS) && (type <= DT_HIOS))
2103                || (elf_header.e_machine == EM_PARISC
2104                    && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
2105         {
2106           const char * result;
2107
2108           switch (elf_header.e_machine)
2109             {
2110             case EM_PARISC:
2111               result = get_parisc_dynamic_type (type);
2112               break;
2113             case EM_IA_64:
2114               result = get_ia64_dynamic_type (type);
2115               break;
2116             default:
2117               if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
2118                 result = get_solaris_dynamic_type (type);
2119               else
2120                 result = NULL;
2121               break;
2122             }
2123
2124           if (result != NULL)
2125             return result;
2126
2127           snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
2128                     type);
2129         }
2130       else
2131         snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
2132
2133       return buff;
2134     }
2135 }
2136
2137 static char *
2138 get_file_type (unsigned e_type)
2139 {
2140   static char buff[32];
2141
2142   switch (e_type)
2143     {
2144     case ET_NONE:       return _("NONE (None)");
2145     case ET_REL:        return _("REL (Relocatable file)");
2146     case ET_EXEC:       return _("EXEC (Executable file)");
2147     case ET_DYN:        return _("DYN (Shared object file)");
2148     case ET_CORE:       return _("CORE (Core file)");
2149
2150     default:
2151       if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
2152         snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
2153       else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
2154         snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
2155       else
2156         snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
2157       return buff;
2158     }
2159 }
2160
2161 static char *
2162 get_machine_name (unsigned e_machine)
2163 {
2164   static char buff[64]; /* XXX */
2165
2166   switch (e_machine)
2167     {
2168     case EM_NONE:               return _("None");
2169     case EM_AARCH64:            return "AArch64";
2170     case EM_M32:                return "WE32100";
2171     case EM_SPARC:              return "Sparc";
2172     case EM_SPU:                return "SPU";
2173     case EM_386:                return "Intel 80386";
2174     case EM_68K:                return "MC68000";
2175     case EM_88K:                return "MC88000";
2176     case EM_IAMCU:              return "Intel MCU";
2177     case EM_860:                return "Intel 80860";
2178     case EM_MIPS:               return "MIPS R3000";
2179     case EM_S370:               return "IBM System/370";
2180     case EM_MIPS_RS3_LE:        return "MIPS R4000 big-endian";
2181     case EM_OLD_SPARCV9:        return "Sparc v9 (old)";
2182     case EM_PARISC:             return "HPPA";
2183     case EM_PPC_OLD:            return "Power PC (old)";
2184     case EM_SPARC32PLUS:        return "Sparc v8+" ;
2185     case EM_960:                return "Intel 90860";
2186     case EM_PPC:                return "PowerPC";
2187     case EM_PPC64:              return "PowerPC64";
2188     case EM_FR20:               return "Fujitsu FR20";
2189     case EM_FT32:               return "FTDI FT32";
2190     case EM_RH32:               return "TRW RH32";
2191     case EM_MCORE:              return "MCORE";
2192     case EM_ARM:                return "ARM";
2193     case EM_OLD_ALPHA:          return "Digital Alpha (old)";
2194     case EM_SH:                 return "Renesas / SuperH SH";
2195     case EM_SPARCV9:            return "Sparc v9";
2196     case EM_TRICORE:            return "Siemens Tricore";
2197     case EM_ARC:                return "ARC";
2198     case EM_ARC_COMPACT:        return "ARCompact";
2199     case EM_ARC_COMPACT2:       return "ARCv2";
2200     case EM_H8_300:             return "Renesas H8/300";
2201     case EM_H8_300H:            return "Renesas H8/300H";
2202     case EM_H8S:                return "Renesas H8S";
2203     case EM_H8_500:             return "Renesas H8/500";
2204     case EM_IA_64:              return "Intel IA-64";
2205     case EM_MIPS_X:             return "Stanford MIPS-X";
2206     case EM_COLDFIRE:           return "Motorola Coldfire";
2207     case EM_ALPHA:              return "Alpha";
2208     case EM_CYGNUS_D10V:
2209     case EM_D10V:               return "d10v";
2210     case EM_CYGNUS_D30V:
2211     case EM_D30V:               return "d30v";
2212     case EM_CYGNUS_M32R:
2213     case EM_M32R:               return "Renesas M32R (formerly Mitsubishi M32r)";
2214     case EM_CYGNUS_V850:
2215     case EM_V800:               return "Renesas V850 (using RH850 ABI)";
2216     case EM_V850:               return "Renesas V850";
2217     case EM_CYGNUS_MN10300:
2218     case EM_MN10300:            return "mn10300";
2219     case EM_CYGNUS_MN10200:
2220     case EM_MN10200:            return "mn10200";
2221     case EM_MOXIE:              return "Moxie";
2222     case EM_CYGNUS_FR30:
2223     case EM_FR30:               return "Fujitsu FR30";
2224     case EM_CYGNUS_FRV:         return "Fujitsu FR-V";
2225     case EM_PJ_OLD:
2226     case EM_PJ:                 return "picoJava";
2227     case EM_MMA:                return "Fujitsu Multimedia Accelerator";
2228     case EM_PCP:                return "Siemens PCP";
2229     case EM_NCPU:               return "Sony nCPU embedded RISC processor";
2230     case EM_NDR1:               return "Denso NDR1 microprocesspr";
2231     case EM_STARCORE:           return "Motorola Star*Core processor";
2232     case EM_ME16:               return "Toyota ME16 processor";
2233     case EM_ST100:              return "STMicroelectronics ST100 processor";
2234     case EM_TINYJ:              return "Advanced Logic Corp. TinyJ embedded processor";
2235     case EM_PDSP:               return "Sony DSP processor";
2236     case EM_PDP10:              return "Digital Equipment Corp. PDP-10";
2237     case EM_PDP11:              return "Digital Equipment Corp. PDP-11";
2238     case EM_FX66:               return "Siemens FX66 microcontroller";
2239     case EM_ST9PLUS:            return "STMicroelectronics ST9+ 8/16 bit microcontroller";
2240     case EM_ST7:                return "STMicroelectronics ST7 8-bit microcontroller";
2241     case EM_68HC16:             return "Motorola MC68HC16 Microcontroller";
2242     case EM_68HC12:             return "Motorola MC68HC12 Microcontroller";
2243     case EM_68HC11:             return "Motorola MC68HC11 Microcontroller";
2244     case EM_68HC08:             return "Motorola MC68HC08 Microcontroller";
2245     case EM_68HC05:             return "Motorola MC68HC05 Microcontroller";
2246     case EM_SVX:                return "Silicon Graphics SVx";
2247     case EM_ST19:               return "STMicroelectronics ST19 8-bit microcontroller";
2248     case EM_VAX:                return "Digital VAX";
2249     case EM_VISIUM:             return "CDS VISIUMcore processor";
2250     case EM_AVR_OLD:
2251     case EM_AVR:                return "Atmel AVR 8-bit microcontroller";
2252     case EM_CRIS:               return "Axis Communications 32-bit embedded processor";
2253     case EM_JAVELIN:            return "Infineon Technologies 32-bit embedded cpu";
2254     case EM_FIREPATH:           return "Element 14 64-bit DSP processor";
2255     case EM_ZSP:                return "LSI Logic's 16-bit DSP processor";
2256     case EM_MMIX:               return "Donald Knuth's educational 64-bit processor";
2257     case EM_HUANY:              return "Harvard Universitys's machine-independent object format";
2258     case EM_PRISM:              return "Vitesse Prism";
2259     case EM_X86_64:             return "Advanced Micro Devices X86-64";
2260     case EM_L1OM:               return "Intel L1OM";
2261     case EM_K1OM:               return "Intel K1OM";
2262     case EM_S390_OLD:
2263     case EM_S390:               return "IBM S/390";
2264     case EM_SCORE:              return "SUNPLUS S+Core";
2265     case EM_XSTORMY16:          return "Sanyo XStormy16 CPU core";
2266     case EM_OR1K:               return "OpenRISC 1000";
2267     case EM_CRX:                return "National Semiconductor CRX microprocessor";
2268     case EM_ADAPTEVA_EPIPHANY:  return "Adapteva EPIPHANY";
2269     case EM_DLX:                return "OpenDLX";
2270     case EM_IP2K_OLD:
2271     case EM_IP2K:               return "Ubicom IP2xxx 8-bit microcontrollers";
2272     case EM_IQ2000:             return "Vitesse IQ2000";
2273     case EM_XTENSA_OLD:
2274     case EM_XTENSA:             return "Tensilica Xtensa Processor";
2275     case EM_VIDEOCORE:          return "Alphamosaic VideoCore processor";
2276     case EM_TMM_GPP:            return "Thompson Multimedia General Purpose Processor";
2277     case EM_NS32K:              return "National Semiconductor 32000 series";
2278     case EM_TPC:                return "Tenor Network TPC processor";
2279     case EM_ST200:              return "STMicroelectronics ST200 microcontroller";
2280     case EM_MAX:                return "MAX Processor";
2281     case EM_CR:                 return "National Semiconductor CompactRISC";
2282     case EM_F2MC16:             return "Fujitsu F2MC16";
2283     case EM_MSP430:             return "Texas Instruments msp430 microcontroller";
2284     case EM_LATTICEMICO32:      return "Lattice Mico32";
2285     case EM_M32C_OLD:
2286     case EM_M32C:               return "Renesas M32c";
2287     case EM_MT:                 return "Morpho Techologies MT processor";
2288     case EM_BLACKFIN:           return "Analog Devices Blackfin";
2289     case EM_SE_C33:             return "S1C33 Family of Seiko Epson processors";
2290     case EM_SEP:                return "Sharp embedded microprocessor";
2291     case EM_ARCA:               return "Arca RISC microprocessor";
2292     case EM_UNICORE:            return "Unicore";
2293     case EM_EXCESS:             return "eXcess 16/32/64-bit configurable embedded CPU";
2294     case EM_DXP:                return "Icera Semiconductor Inc. Deep Execution Processor";
2295     case EM_NIOS32:             return "Altera Nios";
2296     case EM_ALTERA_NIOS2:       return "Altera Nios II";
2297     case EM_C166:
2298     case EM_XC16X:              return "Infineon Technologies xc16x";
2299     case EM_M16C:               return "Renesas M16C series microprocessors";
2300     case EM_DSPIC30F:           return "Microchip Technology dsPIC30F Digital Signal Controller";
2301     case EM_CE:                 return "Freescale Communication Engine RISC core";
2302     case EM_TSK3000:            return "Altium TSK3000 core";
2303     case EM_RS08:               return "Freescale RS08 embedded processor";
2304     case EM_ECOG2:              return "Cyan Technology eCOG2 microprocessor";
2305     case EM_DSP24:              return "New Japan Radio (NJR) 24-bit DSP Processor";
2306     case EM_VIDEOCORE3:         return "Broadcom VideoCore III processor";
2307     case EM_SE_C17:             return "Seiko Epson C17 family";
2308     case EM_TI_C6000:           return "Texas Instruments TMS320C6000 DSP family";
2309     case EM_TI_C2000:           return "Texas Instruments TMS320C2000 DSP family";
2310     case EM_TI_C5500:           return "Texas Instruments TMS320C55x DSP family";
2311     case EM_MMDSP_PLUS:         return "STMicroelectronics 64bit VLIW Data Signal Processor";
2312     case EM_CYPRESS_M8C:        return "Cypress M8C microprocessor";
2313     case EM_R32C:               return "Renesas R32C series microprocessors";
2314     case EM_TRIMEDIA:           return "NXP Semiconductors TriMedia architecture family";
2315     case EM_QDSP6:              return "QUALCOMM DSP6 Processor";
2316     case EM_8051:               return "Intel 8051 and variants";
2317     case EM_STXP7X:             return "STMicroelectronics STxP7x family";
2318     case EM_NDS32:              return "Andes Technology compact code size embedded RISC processor family";
2319     case EM_ECOG1X:             return "Cyan Technology eCOG1X family";
2320     case EM_MAXQ30:             return "Dallas Semiconductor MAXQ30 Core microcontrollers";
2321     case EM_XIMO16:             return "New Japan Radio (NJR) 16-bit DSP Processor";
2322     case EM_MANIK:              return "M2000 Reconfigurable RISC Microprocessor";
2323     case EM_CRAYNV2:            return "Cray Inc. NV2 vector architecture";
2324     case EM_CYGNUS_MEP:         return "Toshiba MeP Media Engine";
2325     case EM_CR16:
2326     case EM_MICROBLAZE:
2327     case EM_MICROBLAZE_OLD:     return "Xilinx MicroBlaze";
2328     case EM_RL78:               return "Renesas RL78";
2329     case EM_RX:                 return "Renesas RX";
2330     case EM_METAG:              return "Imagination Technologies Meta processor architecture";
2331     case EM_MCST_ELBRUS:        return "MCST Elbrus general purpose hardware architecture";
2332     case EM_ECOG16:             return "Cyan Technology eCOG16 family";
2333     case EM_ETPU:               return "Freescale Extended Time Processing Unit";
2334     case EM_SLE9X:              return "Infineon Technologies SLE9X core";
2335     case EM_AVR32:              return "Atmel Corporation 32-bit microprocessor family";
2336     case EM_STM8:               return "STMicroeletronics STM8 8-bit microcontroller";
2337     case EM_TILE64:             return "Tilera TILE64 multicore architecture family";
2338     case EM_TILEPRO:            return "Tilera TILEPro multicore architecture family";
2339     case EM_TILEGX:             return "Tilera TILE-Gx multicore architecture family";
2340     case EM_CUDA:               return "NVIDIA CUDA architecture";
2341     case EM_XGATE:              return "Motorola XGATE embedded processor";
2342     default:
2343       snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
2344       return buff;
2345     }
2346 }
2347
2348 static void
2349 decode_ARC_machine_flags (unsigned e_flags, unsigned e_machine, char buf[])
2350 {
2351   /* ARC has two machine types EM_ARC_COMPACT and EM_ARC_COMPACT2.  Some
2352      other compilers don't a specific architecture type in the e_flags, and
2353      instead use EM_ARC_COMPACT for old ARC600, ARC601, and ARC700
2354      architectures, and switch to EM_ARC_COMPACT2 for newer ARCEM and ARCHS
2355      architectures.
2356
2357      Th GNU tools follows this use of EM_ARC_COMPACT and EM_ARC_COMPACT2,
2358      but also sets a specific architecture type in the e_flags field.
2359
2360      However, when decoding the flags we don't worry if we see an
2361      unexpected pairing, for example EM_ARC_COMPACT machine type, with
2362      ARCEM architecture type.  */
2363
2364   switch (e_flags & EF_ARC_MACH_MSK)
2365     {
2366       /* We only expect these to occur for EM_ARC_COMPACT2.  */
2367     case EF_ARC_CPU_ARCV2EM:
2368       strcat (buf, ", ARC EM");
2369       break;
2370     case EF_ARC_CPU_ARCV2HS:
2371       strcat (buf, ", ARC HS");
2372       break;
2373
2374       /* We only expect these to occur for EM_ARC_COMPACT.  */
2375     case E_ARC_MACH_ARC600:
2376       strcat (buf, ", ARC600");
2377       break;
2378     case E_ARC_MACH_ARC601:
2379       strcat (buf, ", ARC601");
2380       break;
2381     case E_ARC_MACH_ARC700:
2382       strcat (buf, ", ARC700");
2383       break;
2384
2385       /* The only times we should end up here are (a) A corrupt ELF, (b) A
2386          new ELF with new architecture being read by an old version of
2387          readelf, or (c) An ELF built with non-GNU compiler that does not
2388          set the architecture in the e_flags.  */
2389     default:
2390       if (e_machine == EM_ARC_COMPACT)
2391         strcat (buf, ", Unknown ARCompact");
2392       else
2393         strcat (buf, ", Unknown ARC");
2394       break;
2395     }
2396
2397   switch (e_flags & EF_ARC_OSABI_MSK)
2398     {
2399     case E_ARC_OSABI_ORIG:
2400       strcat (buf, ", (ABI:legacy)");
2401       break;
2402     case E_ARC_OSABI_V2:
2403       strcat (buf, ", (ABI:v2)");
2404       break;
2405       /* Only upstream 3.9+ kernels will support ARCv2 ISA.  */
2406     case E_ARC_OSABI_V3:
2407       strcat (buf, ", v3 no-legacy-syscalls ABI");
2408       break;
2409     default:
2410       strcat (buf, ", unrecognised ARC OSABI flag");
2411       break;
2412     }
2413 }
2414
2415 static void
2416 decode_ARM_machine_flags (unsigned e_flags, char buf[])
2417 {
2418   unsigned eabi;
2419   int unknown = 0;
2420
2421   eabi = EF_ARM_EABI_VERSION (e_flags);
2422   e_flags &= ~ EF_ARM_EABIMASK;
2423
2424   /* Handle "generic" ARM flags.  */
2425   if (e_flags & EF_ARM_RELEXEC)
2426     {
2427       strcat (buf, ", relocatable executable");
2428       e_flags &= ~ EF_ARM_RELEXEC;
2429     }
2430
2431   /* Now handle EABI specific flags.  */
2432   switch (eabi)
2433     {
2434     default:
2435       strcat (buf, ", <unrecognized EABI>");
2436       if (e_flags)
2437         unknown = 1;
2438       break;
2439
2440     case EF_ARM_EABI_VER1:
2441       strcat (buf, ", Version1 EABI");
2442       while (e_flags)
2443         {
2444           unsigned flag;
2445
2446           /* Process flags one bit at a time.  */
2447           flag = e_flags & - e_flags;
2448           e_flags &= ~ flag;
2449
2450           switch (flag)
2451             {
2452             case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK.  */
2453               strcat (buf, ", sorted symbol tables");
2454               break;
2455
2456             default:
2457               unknown = 1;
2458               break;
2459             }
2460         }
2461       break;
2462
2463     case EF_ARM_EABI_VER2:
2464       strcat (buf, ", Version2 EABI");
2465       while (e_flags)
2466         {
2467           unsigned flag;
2468
2469           /* Process flags one bit at a time.  */
2470           flag = e_flags & - e_flags;
2471           e_flags &= ~ flag;
2472
2473           switch (flag)
2474             {
2475             case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK.  */
2476               strcat (buf, ", sorted symbol tables");
2477               break;
2478
2479             case EF_ARM_DYNSYMSUSESEGIDX:
2480               strcat (buf, ", dynamic symbols use segment index");
2481               break;
2482
2483             case EF_ARM_MAPSYMSFIRST:
2484               strcat (buf, ", mapping symbols precede others");
2485               break;
2486
2487             default:
2488               unknown = 1;
2489               break;
2490             }
2491         }
2492       break;
2493
2494     case EF_ARM_EABI_VER3:
2495       strcat (buf, ", Version3 EABI");
2496       break;
2497
2498     case EF_ARM_EABI_VER4:
2499       strcat (buf, ", Version4 EABI");
2500       while (e_flags)
2501         {
2502           unsigned flag;
2503
2504           /* Process flags one bit at a time.  */
2505           flag = e_flags & - e_flags;
2506           e_flags &= ~ flag;
2507
2508           switch (flag)
2509             {
2510             case EF_ARM_BE8:
2511               strcat (buf, ", BE8");
2512               break;
2513
2514             case EF_ARM_LE8:
2515               strcat (buf, ", LE8");
2516               break;
2517
2518             default:
2519               unknown = 1;
2520               break;
2521             }
2522       break;
2523         }
2524       break;
2525
2526     case EF_ARM_EABI_VER5:
2527       strcat (buf, ", Version5 EABI");
2528       while (e_flags)
2529         {
2530           unsigned flag;
2531
2532           /* Process flags one bit at a time.  */
2533           flag = e_flags & - e_flags;
2534           e_flags &= ~ flag;
2535
2536           switch (flag)
2537             {
2538             case EF_ARM_BE8:
2539               strcat (buf, ", BE8");
2540               break;
2541
2542             case EF_ARM_LE8:
2543               strcat (buf, ", LE8");
2544               break;
2545
2546             case EF_ARM_ABI_FLOAT_SOFT: /* Conflicts with EF_ARM_SOFT_FLOAT.  */
2547               strcat (buf, ", soft-float ABI");
2548               break;
2549
2550             case EF_ARM_ABI_FLOAT_HARD: /* Conflicts with EF_ARM_VFP_FLOAT.  */
2551               strcat (buf, ", hard-float ABI");
2552               break;
2553
2554             default:
2555               unknown = 1;
2556               break;
2557             }
2558         }
2559       break;
2560
2561     case EF_ARM_EABI_UNKNOWN:
2562       strcat (buf, ", GNU EABI");
2563       while (e_flags)
2564         {
2565           unsigned flag;
2566
2567           /* Process flags one bit at a time.  */
2568           flag = e_flags & - e_flags;
2569           e_flags &= ~ flag;
2570
2571           switch (flag)
2572             {
2573             case EF_ARM_INTERWORK:
2574               strcat (buf, ", interworking enabled");
2575               break;
2576
2577             case EF_ARM_APCS_26:
2578               strcat (buf, ", uses APCS/26");
2579               break;
2580
2581             case EF_ARM_APCS_FLOAT:
2582               strcat (buf, ", uses APCS/float");
2583               break;
2584
2585             case EF_ARM_PIC:
2586               strcat (buf, ", position independent");
2587               break;
2588
2589             case EF_ARM_ALIGN8:
2590               strcat (buf, ", 8 bit structure alignment");
2591               break;
2592
2593             case EF_ARM_NEW_ABI:
2594               strcat (buf, ", uses new ABI");
2595               break;
2596
2597             case EF_ARM_OLD_ABI:
2598               strcat (buf, ", uses old ABI");
2599               break;
2600
2601             case EF_ARM_SOFT_FLOAT:
2602               strcat (buf, ", software FP");
2603               break;
2604
2605             case EF_ARM_VFP_FLOAT:
2606               strcat (buf, ", VFP");
2607               break;
2608
2609             case EF_ARM_MAVERICK_FLOAT:
2610               strcat (buf, ", Maverick FP");
2611               break;
2612
2613             default:
2614               unknown = 1;
2615               break;
2616             }
2617         }
2618     }
2619
2620   if (unknown)
2621     strcat (buf,_(", <unknown>"));
2622 }
2623
2624 static void
2625 decode_AVR_machine_flags (unsigned e_flags, char buf[], size_t size)
2626 {
2627   --size; /* Leave space for null terminator.  */
2628
2629   switch (e_flags & EF_AVR_MACH)
2630     {
2631     case E_AVR_MACH_AVR1:
2632       strncat (buf, ", avr:1", size);
2633       break;
2634     case E_AVR_MACH_AVR2:
2635       strncat (buf, ", avr:2", size);
2636       break;
2637     case E_AVR_MACH_AVR25:
2638       strncat (buf, ", avr:25", size);
2639       break;
2640     case E_AVR_MACH_AVR3:
2641       strncat (buf, ", avr:3", size);
2642       break;
2643     case E_AVR_MACH_AVR31:
2644       strncat (buf, ", avr:31", size);
2645       break;
2646     case E_AVR_MACH_AVR35:
2647       strncat (buf, ", avr:35", size);
2648       break;
2649     case E_AVR_MACH_AVR4:
2650       strncat (buf, ", avr:4", size);
2651       break;
2652     case E_AVR_MACH_AVR5:
2653       strncat (buf, ", avr:5", size);
2654       break;
2655     case E_AVR_MACH_AVR51:
2656       strncat (buf, ", avr:51", size);
2657       break;
2658     case E_AVR_MACH_AVR6:
2659       strncat (buf, ", avr:6", size);
2660       break;
2661     case E_AVR_MACH_AVRTINY:
2662       strncat (buf, ", avr:100", size);
2663       break;
2664     case E_AVR_MACH_XMEGA1:
2665       strncat (buf, ", avr:101", size);
2666       break;
2667     case E_AVR_MACH_XMEGA2:
2668       strncat (buf, ", avr:102", size);
2669       break;
2670     case E_AVR_MACH_XMEGA3:
2671       strncat (buf, ", avr:103", size);
2672       break;
2673     case E_AVR_MACH_XMEGA4:
2674       strncat (buf, ", avr:104", size);
2675       break;
2676     case E_AVR_MACH_XMEGA5:
2677       strncat (buf, ", avr:105", size);
2678       break;
2679     case E_AVR_MACH_XMEGA6:
2680       strncat (buf, ", avr:106", size);
2681       break;
2682     case E_AVR_MACH_XMEGA7:
2683       strncat (buf, ", avr:107", size);
2684       break;
2685     default:
2686       strncat (buf, ", avr:<unknown>", size);
2687       break;
2688     }
2689
2690   size -= strlen (buf);
2691   if (e_flags & EF_AVR_LINKRELAX_PREPARED)
2692     strncat (buf, ", link-relax", size);
2693 }
2694
2695 static void
2696 decode_NDS32_machine_flags (unsigned e_flags, char buf[], size_t size)
2697 {
2698   unsigned abi;
2699   unsigned arch;
2700   unsigned config;
2701   unsigned version;
2702   int has_fpu = 0;
2703   int r = 0;
2704
2705   static const char *ABI_STRINGS[] =
2706   {
2707     "ABI v0", /* use r5 as return register; only used in N1213HC */
2708     "ABI v1", /* use r0 as return register */
2709     "ABI v2", /* use r0 as return register and don't reserve 24 bytes for arguments */
2710     "ABI v2fp", /* for FPU */
2711     "AABI",
2712     "ABI2 FP+"
2713   };
2714   static const char *VER_STRINGS[] =
2715   {
2716     "Andes ELF V1.3 or older",
2717     "Andes ELF V1.3.1",
2718     "Andes ELF V1.4"
2719   };
2720   static const char *ARCH_STRINGS[] =
2721   {
2722     "",
2723     "Andes Star v1.0",
2724     "Andes Star v2.0",
2725     "Andes Star v3.0",
2726     "Andes Star v3.0m"
2727   };
2728
2729   abi = EF_NDS_ABI & e_flags;
2730   arch = EF_NDS_ARCH & e_flags;
2731   config = EF_NDS_INST & e_flags;
2732   version = EF_NDS32_ELF_VERSION & e_flags;
2733
2734   memset (buf, 0, size);
2735
2736   switch (abi)
2737     {
2738     case E_NDS_ABI_V0:
2739     case E_NDS_ABI_V1:
2740     case E_NDS_ABI_V2:
2741     case E_NDS_ABI_V2FP:
2742     case E_NDS_ABI_AABI:
2743     case E_NDS_ABI_V2FP_PLUS:
2744       /* In case there are holes in the array.  */
2745       r += snprintf (buf + r, size - r, ", %s", ABI_STRINGS[abi >> EF_NDS_ABI_SHIFT]);
2746       break;
2747
2748     default:
2749       r += snprintf (buf + r, size - r, ", <unrecognized ABI>");
2750       break;
2751     }
2752
2753   switch (version)
2754     {
2755     case E_NDS32_ELF_VER_1_2:
2756     case E_NDS32_ELF_VER_1_3:
2757     case E_NDS32_ELF_VER_1_4:
2758       r += snprintf (buf + r, size - r, ", %s", VER_STRINGS[version >> EF_NDS32_ELF_VERSION_SHIFT]);
2759       break;
2760
2761     default:
2762       r += snprintf (buf + r, size - r, ", <unrecognized ELF version number>");
2763       break;
2764     }
2765
2766   if (E_NDS_ABI_V0 == abi)
2767     {
2768       /* OLD ABI; only used in N1213HC, has performance extension 1.  */
2769       r += snprintf (buf + r, size - r, ", Andes Star v1.0, N1213HC, MAC, PERF1");
2770       if (arch == E_NDS_ARCH_STAR_V1_0)
2771         r += snprintf (buf + r, size -r, ", 16b"); /* has 16-bit instructions */
2772       return;
2773     }
2774
2775   switch (arch)
2776     {
2777     case E_NDS_ARCH_STAR_V1_0:
2778     case E_NDS_ARCH_STAR_V2_0:
2779     case E_NDS_ARCH_STAR_V3_0:
2780     case E_NDS_ARCH_STAR_V3_M:
2781       r += snprintf (buf + r, size - r, ", %s", ARCH_STRINGS[arch >> EF_NDS_ARCH_SHIFT]);
2782       break;
2783
2784     default:
2785       r += snprintf (buf + r, size - r, ", <unrecognized architecture>");
2786       /* ARCH version determines how the e_flags are interpreted.
2787          If it is unknown, we cannot proceed.  */
2788       return;
2789     }
2790
2791   /* Newer ABI; Now handle architecture specific flags.  */
2792   if (arch == E_NDS_ARCH_STAR_V1_0)
2793     {
2794       if (config & E_NDS32_HAS_MFUSR_PC_INST)
2795         r += snprintf (buf + r, size -r, ", MFUSR_PC");
2796
2797       if (!(config & E_NDS32_HAS_NO_MAC_INST))
2798         r += snprintf (buf + r, size -r, ", MAC");
2799
2800       if (config & E_NDS32_HAS_DIV_INST)
2801         r += snprintf (buf + r, size -r, ", DIV");
2802
2803       if (config & E_NDS32_HAS_16BIT_INST)
2804         r += snprintf (buf + r, size -r, ", 16b");
2805     }
2806   else
2807     {
2808       if (config & E_NDS32_HAS_MFUSR_PC_INST)
2809         {
2810           if (version <= E_NDS32_ELF_VER_1_3)
2811             r += snprintf (buf + r, size -r, ", [B8]");
2812           else
2813             r += snprintf (buf + r, size -r, ", EX9");
2814         }
2815
2816       if (config & E_NDS32_HAS_MAC_DX_INST)
2817         r += snprintf (buf + r, size -r, ", MAC_DX");
2818
2819       if (config & E_NDS32_HAS_DIV_DX_INST)
2820         r += snprintf (buf + r, size -r, ", DIV_DX");
2821
2822       if (config & E_NDS32_HAS_16BIT_INST)
2823         {
2824           if (version <= E_NDS32_ELF_VER_1_3)
2825             r += snprintf (buf + r, size -r, ", 16b");
2826           else
2827             r += snprintf (buf + r, size -r, ", IFC");
2828         }
2829     }
2830
2831   if (config & E_NDS32_HAS_EXT_INST)
2832     r += snprintf (buf + r, size -r, ", PERF1");
2833
2834   if (config & E_NDS32_HAS_EXT2_INST)
2835     r += snprintf (buf + r, size -r, ", PERF2");
2836
2837   if (config & E_NDS32_HAS_FPU_INST)
2838     {
2839       has_fpu = 1;
2840       r += snprintf (buf + r, size -r, ", FPU_SP");
2841     }
2842
2843   if (config & E_NDS32_HAS_FPU_DP_INST)
2844     {
2845       has_fpu = 1;
2846       r += snprintf (buf + r, size -r, ", FPU_DP");
2847     }
2848
2849   if (config & E_NDS32_HAS_FPU_MAC_INST)
2850     {
2851       has_fpu = 1;
2852       r += snprintf (buf + r, size -r, ", FPU_MAC");
2853     }
2854
2855   if (has_fpu)
2856     {
2857       switch ((config & E_NDS32_FPU_REG_CONF) >> E_NDS32_FPU_REG_CONF_SHIFT)
2858         {
2859         case E_NDS32_FPU_REG_8SP_4DP:
2860           r += snprintf (buf + r, size -r, ", FPU_REG:8/4");
2861           break;
2862         case E_NDS32_FPU_REG_16SP_8DP:
2863           r += snprintf (buf + r, size -r, ", FPU_REG:16/8");
2864           break;
2865         case E_NDS32_FPU_REG_32SP_16DP:
2866           r += snprintf (buf + r, size -r, ", FPU_REG:32/16");
2867           break;
2868         case E_NDS32_FPU_REG_32SP_32DP:
2869           r += snprintf (buf + r, size -r, ", FPU_REG:32/32");
2870           break;
2871         }
2872     }
2873
2874   if (config & E_NDS32_HAS_AUDIO_INST)
2875     r += snprintf (buf + r, size -r, ", AUDIO");
2876
2877   if (config & E_NDS32_HAS_STRING_INST)
2878     r += snprintf (buf + r, size -r, ", STR");
2879
2880   if (config & E_NDS32_HAS_REDUCED_REGS)
2881     r += snprintf (buf + r, size -r, ", 16REG");
2882
2883   if (config & E_NDS32_HAS_VIDEO_INST)
2884     {
2885       if (version <= E_NDS32_ELF_VER_1_3)
2886         r += snprintf (buf + r, size -r, ", VIDEO");
2887       else
2888         r += snprintf (buf + r, size -r, ", SATURATION");
2889     }
2890
2891   if (config & E_NDS32_HAS_ENCRIPT_INST)
2892     r += snprintf (buf + r, size -r, ", ENCRP");
2893
2894   if (config & E_NDS32_HAS_L2C_INST)
2895     r += snprintf (buf + r, size -r, ", L2C");
2896 }
2897
2898 static char *
2899 get_machine_flags (unsigned e_flags, unsigned e_machine)
2900 {
2901   static char buf[1024];
2902
2903   buf[0] = '\0';
2904
2905   if (e_flags)
2906     {
2907       switch (e_machine)
2908         {
2909         default:
2910           break;
2911
2912         case EM_ARC_COMPACT2:
2913         case EM_ARC_COMPACT:
2914           decode_ARC_machine_flags (e_flags, e_machine, buf);
2915           break;
2916
2917         case EM_ARM:
2918           decode_ARM_machine_flags (e_flags, buf);
2919           break;
2920
2921         case EM_AVR:
2922           decode_AVR_machine_flags (e_flags, buf, sizeof buf);
2923           break;
2924
2925         case EM_BLACKFIN:
2926           if (e_flags & EF_BFIN_PIC)
2927             strcat (buf, ", PIC");
2928
2929           if (e_flags & EF_BFIN_FDPIC)
2930             strcat (buf, ", FDPIC");
2931
2932           if (e_flags & EF_BFIN_CODE_IN_L1)
2933             strcat (buf, ", code in L1");
2934
2935           if (e_flags & EF_BFIN_DATA_IN_L1)
2936             strcat (buf, ", data in L1");
2937
2938           break;
2939
2940         case EM_CYGNUS_FRV:
2941           switch (e_flags & EF_FRV_CPU_MASK)
2942             {
2943             case EF_FRV_CPU_GENERIC:
2944               break;
2945
2946             default:
2947               strcat (buf, ", fr???");
2948               break;
2949
2950             case EF_FRV_CPU_FR300:
2951               strcat (buf, ", fr300");
2952               break;
2953
2954             case EF_FRV_CPU_FR400:
2955               strcat (buf, ", fr400");
2956               break;
2957             case EF_FRV_CPU_FR405:
2958               strcat (buf, ", fr405");
2959               break;
2960
2961             case EF_FRV_CPU_FR450:
2962               strcat (buf, ", fr450");
2963               break;
2964
2965             case EF_FRV_CPU_FR500:
2966               strcat (buf, ", fr500");
2967               break;
2968             case EF_FRV_CPU_FR550:
2969               strcat (buf, ", fr550");
2970               break;
2971
2972             case EF_FRV_CPU_SIMPLE:
2973               strcat (buf, ", simple");
2974               break;
2975             case EF_FRV_CPU_TOMCAT:
2976               strcat (buf, ", tomcat");
2977               break;
2978             }
2979           break;
2980
2981         case EM_68K:
2982           if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
2983             strcat (buf, ", m68000");
2984           else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
2985             strcat (buf, ", cpu32");
2986           else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
2987             strcat (buf, ", fido_a");
2988           else
2989             {
2990               char const * isa = _("unknown");
2991               char const * mac = _("unknown mac");
2992               char const * additional = NULL;
2993
2994               switch (e_flags & EF_M68K_CF_ISA_MASK)
2995                 {
2996                 case EF_M68K_CF_ISA_A_NODIV:
2997                   isa = "A";
2998                   additional = ", nodiv";
2999                   break;
3000                 case EF_M68K_CF_ISA_A:
3001                   isa = "A";
3002                   break;
3003                 case EF_M68K_CF_ISA_A_PLUS:
3004                   isa = "A+";
3005                   break;
3006                 case EF_M68K_CF_ISA_B_NOUSP:
3007                   isa = "B";
3008                   additional = ", nousp";
3009                   break;
3010                 case EF_M68K_CF_ISA_B:
3011                   isa = "B";
3012                   break;
3013                 case EF_M68K_CF_ISA_C:
3014                   isa = "C";
3015                   break;
3016                 case EF_M68K_CF_ISA_C_NODIV:
3017                   isa = "C";
3018                   additional = ", nodiv";
3019                   break;
3020                 }
3021               strcat (buf, ", cf, isa ");
3022               strcat (buf, isa);
3023               if (additional)
3024                 strcat (buf, additional);
3025               if (e_flags & EF_M68K_CF_FLOAT)
3026                 strcat (buf, ", float");
3027               switch (e_flags & EF_M68K_CF_MAC_MASK)
3028                 {
3029                 case 0:
3030                   mac = NULL;
3031                   break;
3032                 case EF_M68K_CF_MAC:
3033                   mac = "mac";
3034                   break;
3035                 case EF_M68K_CF_EMAC:
3036                   mac = "emac";
3037                   break;
3038                 case EF_M68K_CF_EMAC_B:
3039                   mac = "emac_b";
3040                   break;
3041                 }
3042               if (mac)
3043                 {
3044                   strcat (buf, ", ");
3045                   strcat (buf, mac);
3046                 }
3047             }
3048           break;
3049
3050         case EM_CYGNUS_MEP:
3051           switch (e_flags & EF_MEP_CPU_MASK)
3052             {
3053             case EF_MEP_CPU_MEP: strcat (buf, ", generic MeP"); break;
3054             case EF_MEP_CPU_C2: strcat (buf, ", MeP C2"); break;
3055             case EF_MEP_CPU_C3: strcat (buf, ", MeP C3"); break;
3056             case EF_MEP_CPU_C4: strcat (buf, ", MeP C4"); break;
3057             case EF_MEP_CPU_C5: strcat (buf, ", MeP C5"); break;
3058             case EF_MEP_CPU_H1: strcat (buf, ", MeP H1"); break;
3059             default: strcat (buf, _(", <unknown MeP cpu type>")); break;
3060             }
3061
3062           switch (e_flags & EF_MEP_COP_MASK)
3063             {
3064             case EF_MEP_COP_NONE: break;
3065             case EF_MEP_COP_AVC: strcat (buf, ", AVC coprocessor"); break;
3066             case EF_MEP_COP_AVC2: strcat (buf, ", AVC2 coprocessor"); break;
3067             case EF_MEP_COP_FMAX: strcat (buf, ", FMAX coprocessor"); break;
3068             case EF_MEP_COP_IVC2: strcat (buf, ", IVC2 coprocessor"); break;
3069             default: strcat (buf, _("<unknown MeP copro type>")); break;
3070             }
3071
3072           if (e_flags & EF_MEP_LIBRARY)
3073             strcat (buf, ", Built for Library");
3074
3075           if (e_flags & EF_MEP_INDEX_MASK)
3076             sprintf (buf + strlen (buf), ", Configuration Index: %#x",
3077                      e_flags & EF_MEP_INDEX_MASK);
3078
3079           if (e_flags & ~ EF_MEP_ALL_FLAGS)
3080             sprintf (buf + strlen (buf), _(", unknown flags bits: %#x"),
3081                      e_flags & ~ EF_MEP_ALL_FLAGS);
3082           break;
3083
3084         case EM_PPC:
3085           if (e_flags & EF_PPC_EMB)
3086             strcat (buf, ", emb");
3087
3088           if (e_flags & EF_PPC_RELOCATABLE)
3089             strcat (buf, _(", relocatable"));
3090
3091           if (e_flags & EF_PPC_RELOCATABLE_LIB)
3092             strcat (buf, _(", relocatable-lib"));
3093           break;
3094
3095         case EM_PPC64:
3096           if (e_flags & EF_PPC64_ABI)
3097             {
3098               char abi[] = ", abiv0";
3099
3100               abi[6] += e_flags & EF_PPC64_ABI;
3101               strcat (buf, abi);
3102             }
3103           break;
3104
3105         case EM_V800:
3106           if ((e_flags & EF_RH850_ABI) == EF_RH850_ABI)
3107             strcat (buf, ", RH850 ABI");
3108
3109           if (e_flags & EF_V800_850E3)
3110             strcat (buf, ", V3 architecture");
3111
3112           if ((e_flags & (EF_RH850_FPU_DOUBLE | EF_RH850_FPU_SINGLE)) == 0)
3113             strcat (buf, ", FPU not used");
3114
3115           if ((e_flags & (EF_RH850_REGMODE22 | EF_RH850_REGMODE32)) == 0)
3116             strcat (buf, ", regmode: COMMON");
3117
3118           if ((e_flags & (EF_RH850_GP_FIX | EF_RH850_GP_NOFIX)) == 0)
3119             strcat (buf, ", r4 not used");
3120
3121           if ((e_flags & (EF_RH850_EP_FIX | EF_RH850_EP_NOFIX)) == 0)
3122             strcat (buf, ", r30 not used");
3123
3124           if ((e_flags & (EF_RH850_TP_FIX | EF_RH850_TP_NOFIX)) == 0)
3125             strcat (buf, ", r5 not used");
3126
3127           if ((e_flags & (EF_RH850_REG2_RESERVE | EF_RH850_REG2_NORESERVE)) == 0)
3128             strcat (buf, ", r2 not used");
3129
3130           for (e_flags &= 0xFFFF; e_flags; e_flags &= ~ (e_flags & - e_flags))
3131             {
3132               switch (e_flags & - e_flags)
3133                 {
3134                 case EF_RH850_FPU_DOUBLE: strcat (buf, ", double precision FPU"); break;
3135                 case EF_RH850_FPU_SINGLE: strcat (buf, ", single precision FPU"); break;
3136                 case EF_RH850_REGMODE22: strcat (buf, ", regmode:22"); break;
3137                 case EF_RH850_REGMODE32: strcat (buf, ", regmode:23"); break;
3138                 case EF_RH850_GP_FIX: strcat (buf, ", r4 fixed"); break;
3139                 case EF_RH850_GP_NOFIX: strcat (buf, ", r4 free"); break;
3140                 case EF_RH850_EP_FIX: strcat (buf, ", r30 fixed"); break;
3141                 case EF_RH850_EP_NOFIX: strcat (buf, ", r30 free"); break;
3142                 case EF_RH850_TP_FIX: strcat (buf, ", r5 fixed"); break;
3143                 case EF_RH850_TP_NOFIX: strcat (buf, ", r5 free"); break;
3144                 case EF_RH850_REG2_RESERVE: strcat (buf, ", r2 fixed"); break;
3145                 case EF_RH850_REG2_NORESERVE: strcat (buf, ", r2 free"); break;
3146                 default: break;
3147                 }
3148             }
3149           break;
3150
3151         case EM_V850:
3152         case EM_CYGNUS_V850:
3153           switch (e_flags & EF_V850_ARCH)
3154             {
3155             case E_V850E3V5_ARCH:
3156               strcat (buf, ", v850e3v5");
3157               break;
3158             case E_V850E2V3_ARCH:
3159               strcat (buf, ", v850e2v3");
3160               break;
3161             case E_V850E2_ARCH:
3162               strcat (buf, ", v850e2");
3163               break;
3164             case E_V850E1_ARCH:
3165               strcat (buf, ", v850e1");
3166               break;
3167             case E_V850E_ARCH:
3168               strcat (buf, ", v850e");
3169               break;
3170             case E_V850_ARCH:
3171               strcat (buf, ", v850");
3172               break;
3173             default:
3174               strcat (buf, _(", unknown v850 architecture variant"));
3175               break;
3176             }
3177           break;
3178
3179         case EM_M32R:
3180         case EM_CYGNUS_M32R:
3181           if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
3182             strcat (buf, ", m32r");
3183           break;
3184
3185         case EM_MIPS:
3186         case EM_MIPS_RS3_LE:
3187           if (e_flags & EF_MIPS_NOREORDER)
3188             strcat (buf, ", noreorder");
3189
3190           if (e_flags & EF_MIPS_PIC)
3191             strcat (buf, ", pic");
3192
3193           if (e_flags & EF_MIPS_CPIC)
3194             strcat (buf, ", cpic");
3195
3196           if (e_flags & EF_MIPS_UCODE)
3197             strcat (buf, ", ugen_reserved");
3198
3199           if (e_flags & EF_MIPS_ABI2)
3200             strcat (buf, ", abi2");
3201
3202           if (e_flags & EF_MIPS_OPTIONS_FIRST)
3203             strcat (buf, ", odk first");
3204
3205           if (e_flags & EF_MIPS_32BITMODE)
3206             strcat (buf, ", 32bitmode");
3207
3208           if (e_flags & EF_MIPS_NAN2008)
3209             strcat (buf, ", nan2008");
3210
3211           if (e_flags & EF_MIPS_FP64)
3212             strcat (buf, ", fp64");
3213
3214           switch ((e_flags & EF_MIPS_MACH))
3215             {
3216             case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
3217             case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
3218             case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
3219             case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
3220             case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
3221             case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
3222             case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
3223             case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
3224             case E_MIPS_MACH_SB1:  strcat (buf, ", sb1");  break;
3225             case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
3226             case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break;
3227             case E_MIPS_MACH_LS2F: strcat (buf, ", loongson-2f"); break;
3228             case E_MIPS_MACH_LS3A: strcat (buf, ", loongson-3a"); break;
3229             case E_MIPS_MACH_OCTEON: strcat (buf, ", octeon"); break;
3230             case E_MIPS_MACH_OCTEON2: strcat (buf, ", octeon2"); break;
3231             case E_MIPS_MACH_OCTEON3: strcat (buf, ", octeon3"); break;
3232             case E_MIPS_MACH_XLR:  strcat (buf, ", xlr"); break;
3233             case 0:
3234             /* We simply ignore the field in this case to avoid confusion:
3235                MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
3236                extension.  */
3237               break;
3238             default: strcat (buf, _(", unknown CPU")); break;
3239             }
3240
3241           switch ((e_flags & EF_MIPS_ABI))
3242             {
3243             case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
3244             case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
3245             case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
3246             case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
3247             case 0:
3248             /* We simply ignore the field in this case to avoid confusion:
3249                MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
3250                This means it is likely to be an o32 file, but not for
3251                sure.  */
3252               break;
3253             default: strcat (buf, _(", unknown ABI")); break;
3254             }
3255
3256           if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
3257             strcat (buf, ", mdmx");
3258
3259           if (e_flags & EF_MIPS_ARCH_ASE_M16)
3260             strcat (buf, ", mips16");
3261
3262           if (e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
3263             strcat (buf, ", micromips");
3264
3265           switch ((e_flags & EF_MIPS_ARCH))
3266             {
3267             case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
3268             case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
3269             case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
3270             case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
3271             case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
3272             case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
3273             case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
3274             case E_MIPS_ARCH_32R6: strcat (buf, ", mips32r6"); break;
3275             case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
3276             case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
3277             case E_MIPS_ARCH_64R6: strcat (buf, ", mips64r6"); break;
3278             default: strcat (buf, _(", unknown ISA")); break;
3279             }
3280           break;
3281
3282         case EM_NDS32:
3283           decode_NDS32_machine_flags (e_flags, buf, sizeof buf);
3284           break;
3285
3286         case EM_SH:
3287           switch ((e_flags & EF_SH_MACH_MASK))
3288             {
3289             case EF_SH1: strcat (buf, ", sh1"); break;
3290             case EF_SH2: strcat (buf, ", sh2"); break;
3291             case EF_SH3: strcat (buf, ", sh3"); break;
3292             case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
3293             case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
3294             case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
3295             case EF_SH3E: strcat (buf, ", sh3e"); break;
3296             case EF_SH4: strcat (buf, ", sh4"); break;
3297             case EF_SH5: strcat (buf, ", sh5"); break;
3298             case EF_SH2E: strcat (buf, ", sh2e"); break;
3299             case EF_SH4A: strcat (buf, ", sh4a"); break;
3300             case EF_SH2A: strcat (buf, ", sh2a"); break;
3301             case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
3302             case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
3303             case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
3304             case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
3305             case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
3306             case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
3307             case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
3308             case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
3309             case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
3310             default: strcat (buf, _(", unknown ISA")); break;
3311             }
3312
3313           if (e_flags & EF_SH_PIC)
3314             strcat (buf, ", pic");
3315
3316           if (e_flags & EF_SH_FDPIC)
3317             strcat (buf, ", fdpic");
3318           break;
3319
3320         case EM_OR1K:
3321           if (e_flags & EF_OR1K_NODELAY)
3322             strcat (buf, ", no delay");
3323           break;
3324
3325         case EM_SPARCV9:
3326           if (e_flags & EF_SPARC_32PLUS)
3327             strcat (buf, ", v8+");
3328
3329           if (e_flags & EF_SPARC_SUN_US1)
3330             strcat (buf, ", ultrasparcI");
3331
3332           if (e_flags & EF_SPARC_SUN_US3)
3333             strcat (buf, ", ultrasparcIII");
3334
3335           if (e_flags & EF_SPARC_HAL_R1)
3336             strcat (buf, ", halr1");
3337
3338           if (e_flags & EF_SPARC_LEDATA)
3339             strcat (buf, ", ledata");
3340
3341           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
3342             strcat (buf, ", tso");
3343
3344           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
3345             strcat (buf, ", pso");
3346
3347           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
3348             strcat (buf, ", rmo");
3349           break;
3350
3351         case EM_PARISC:
3352           switch (e_flags & EF_PARISC_ARCH)
3353             {
3354             case EFA_PARISC_1_0:
3355               strcpy (buf, ", PA-RISC 1.0");
3356               break;
3357             case EFA_PARISC_1_1:
3358               strcpy (buf, ", PA-RISC 1.1");
3359               break;
3360             case EFA_PARISC_2_0:
3361               strcpy (buf, ", PA-RISC 2.0");
3362               break;
3363             default:
3364               break;
3365             }
3366           if (e_flags & EF_PARISC_TRAPNIL)
3367             strcat (buf, ", trapnil");
3368           if (e_flags & EF_PARISC_EXT)
3369             strcat (buf, ", ext");
3370           if (e_flags & EF_PARISC_LSB)
3371             strcat (buf, ", lsb");
3372           if (e_flags & EF_PARISC_WIDE)
3373             strcat (buf, ", wide");
3374           if (e_flags & EF_PARISC_NO_KABP)
3375             strcat (buf, ", no kabp");
3376           if (e_flags & EF_PARISC_LAZYSWAP)
3377             strcat (buf, ", lazyswap");
3378           break;
3379
3380         case EM_PJ:
3381         case EM_PJ_OLD:
3382           if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
3383             strcat (buf, ", new calling convention");
3384
3385           if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
3386             strcat (buf, ", gnu calling convention");
3387           break;
3388
3389         case EM_IA_64:
3390           if ((e_flags & EF_IA_64_ABI64))
3391             strcat (buf, ", 64-bit");
3392           else
3393             strcat (buf, ", 32-bit");
3394           if ((e_flags & EF_IA_64_REDUCEDFP))
3395             strcat (buf, ", reduced fp model");
3396           if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
3397             strcat (buf, ", no function descriptors, constant gp");
3398           else if ((e_flags & EF_IA_64_CONS_GP))
3399             strcat (buf, ", constant gp");
3400           if ((e_flags & EF_IA_64_ABSOLUTE))
3401             strcat (buf, ", absolute");
3402           if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
3403             {
3404               if ((e_flags & EF_IA_64_VMS_LINKAGES))
3405                 strcat (buf, ", vms_linkages");
3406               switch ((e_flags & EF_IA_64_VMS_COMCOD))
3407                 {
3408                 case EF_IA_64_VMS_COMCOD_SUCCESS:
3409                   break;
3410                 case EF_IA_64_VMS_COMCOD_WARNING:
3411                   strcat (buf, ", warning");
3412                   break;
3413                 case EF_IA_64_VMS_COMCOD_ERROR:
3414                   strcat (buf, ", error");
3415                   break;
3416                 case EF_IA_64_VMS_COMCOD_ABORT:
3417                   strcat (buf, ", abort");
3418                   break;
3419                 default:
3420                   warn (_("Unrecognised IA64 VMS Command Code: %x\n"),
3421                         e_flags & EF_IA_64_VMS_COMCOD);
3422                   strcat (buf, ", <unknown>");
3423                 }
3424             }
3425           break;
3426
3427         case EM_VAX:
3428           if ((e_flags & EF_VAX_NONPIC))
3429             strcat (buf, ", non-PIC");
3430           if ((e_flags & EF_VAX_DFLOAT))
3431             strcat (buf, ", D-Float");
3432           if ((e_flags & EF_VAX_GFLOAT))
3433             strcat (buf, ", G-Float");
3434           break;
3435
3436         case EM_VISIUM:
3437           if (e_flags & EF_VISIUM_ARCH_MCM)
3438             strcat (buf, ", mcm");
3439           else if (e_flags & EF_VISIUM_ARCH_MCM24)
3440             strcat (buf, ", mcm24");
3441           if (e_flags & EF_VISIUM_ARCH_GR6)
3442             strcat (buf, ", gr6");
3443           break;
3444
3445         case EM_RL78:
3446           switch (e_flags & E_FLAG_RL78_CPU_MASK)
3447             {
3448             case E_FLAG_RL78_ANY_CPU: break;
3449             case E_FLAG_RL78_G10: strcat (buf, ", G10"); break;
3450             case E_FLAG_RL78_G13: strcat (buf, ", G13"); break;
3451             case E_FLAG_RL78_G14: strcat (buf, ", G14"); break;
3452             }
3453           if (e_flags & E_FLAG_RL78_64BIT_DOUBLES)
3454             strcat (buf, ", 64-bit doubles");
3455           break;
3456
3457         case EM_RX:
3458           if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
3459             strcat (buf, ", 64-bit doubles");
3460           if (e_flags & E_FLAG_RX_DSP)
3461             strcat (buf, ", dsp");
3462           if (e_flags & E_FLAG_RX_PID)
3463             strcat (buf, ", pid");
3464           if (e_flags & E_FLAG_RX_ABI)
3465             strcat (buf, ", RX ABI");
3466           if (e_flags & E_FLAG_RX_SINSNS_SET)
3467             strcat (buf, e_flags & E_FLAG_RX_SINSNS_YES
3468                     ? ", uses String instructions" : ", bans String instructions");
3469           if (e_flags & E_FLAG_RX_V2)
3470             strcat (buf, ", V2");
3471           break;
3472
3473         case EM_S390:
3474           if (e_flags & EF_S390_HIGH_GPRS)
3475             strcat (buf, ", highgprs");
3476           break;
3477
3478         case EM_TI_C6000:
3479           if ((e_flags & EF_C6000_REL))
3480             strcat (buf, ", relocatable module");
3481           break;
3482
3483         case EM_MSP430:
3484           strcat (buf, _(": architecture variant: "));
3485           switch (e_flags & EF_MSP430_MACH)
3486             {
3487             case E_MSP430_MACH_MSP430x11: strcat (buf, "MSP430x11"); break;
3488             case E_MSP430_MACH_MSP430x11x1 : strcat (buf, "MSP430x11x1 "); break;
3489             case E_MSP430_MACH_MSP430x12: strcat (buf, "MSP430x12"); break;
3490             case E_MSP430_MACH_MSP430x13: strcat (buf, "MSP430x13"); break;
3491             case E_MSP430_MACH_MSP430x14: strcat (buf, "MSP430x14"); break;
3492             case E_MSP430_MACH_MSP430x15: strcat (buf, "MSP430x15"); break;
3493             case E_MSP430_MACH_MSP430x16: strcat (buf, "MSP430x16"); break;
3494             case E_MSP430_MACH_MSP430x31: strcat (buf, "MSP430x31"); break;
3495             case E_MSP430_MACH_MSP430x32: strcat (buf, "MSP430x32"); break;
3496             case E_MSP430_MACH_MSP430x33: strcat (buf, "MSP430x33"); break;
3497             case E_MSP430_MACH_MSP430x41: strcat (buf, "MSP430x41"); break;
3498             case E_MSP430_MACH_MSP430x42: strcat (buf, "MSP430x42"); break;
3499             case E_MSP430_MACH_MSP430x43: strcat (buf, "MSP430x43"); break;
3500             case E_MSP430_MACH_MSP430x44: strcat (buf, "MSP430x44"); break;
3501             case E_MSP430_MACH_MSP430X  : strcat (buf, "MSP430X"); break;
3502             default:
3503               strcat (buf, _(": unknown")); break;
3504             }
3505
3506           if (e_flags & ~ EF_MSP430_MACH)
3507             strcat (buf, _(": unknown extra flag bits also present"));
3508         }
3509     }
3510
3511   return buf;
3512 }
3513
3514 static const char *
3515 get_osabi_name (unsigned int osabi)
3516 {
3517   static char buff[32];
3518
3519   switch (osabi)
3520     {
3521     case ELFOSABI_NONE:         return "UNIX - System V";
3522     case ELFOSABI_HPUX:         return "UNIX - HP-UX";
3523     case ELFOSABI_NETBSD:       return "UNIX - NetBSD";
3524     case ELFOSABI_GNU:          return "UNIX - GNU";
3525     case ELFOSABI_SOLARIS:      return "UNIX - Solaris";
3526     case ELFOSABI_AIX:          return "UNIX - AIX";
3527     case ELFOSABI_IRIX:         return "UNIX - IRIX";
3528     case ELFOSABI_FREEBSD:      return "UNIX - FreeBSD";
3529     case ELFOSABI_TRU64:        return "UNIX - TRU64";
3530     case ELFOSABI_MODESTO:      return "Novell - Modesto";
3531     case ELFOSABI_OPENBSD:      return "UNIX - OpenBSD";
3532     case ELFOSABI_OPENVMS:      return "VMS - OpenVMS";
3533     case ELFOSABI_NSK:          return "HP - Non-Stop Kernel";
3534     case ELFOSABI_AROS:         return "AROS";
3535     case ELFOSABI_FENIXOS:      return "FenixOS";
3536     default:
3537       if (osabi >= 64)
3538         switch (elf_header.e_machine)
3539           {
3540           case EM_ARM:
3541             switch (osabi)
3542               {
3543               case ELFOSABI_ARM:        return "ARM";
3544               default:
3545                 break;
3546               }
3547             break;
3548
3549           case EM_MSP430:
3550           case EM_MSP430_OLD:
3551           case EM_VISIUM:
3552             switch (osabi)
3553               {
3554               case ELFOSABI_STANDALONE: return _("Standalone App");
3555               default:
3556                 break;
3557               }
3558             break;
3559
3560           case EM_TI_C6000:
3561             switch (osabi)
3562               {
3563               case ELFOSABI_C6000_ELFABI:       return _("Bare-metal C6000");
3564               case ELFOSABI_C6000_LINUX:        return "Linux C6000";
3565               default:
3566                 break;
3567               }
3568             break;
3569
3570           default:
3571             break;
3572           }
3573       snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
3574       return buff;
3575     }
3576 }
3577
3578 static const char *
3579 get_aarch64_segment_type (unsigned long type)
3580 {
3581   switch (type)
3582     {
3583     case PT_AARCH64_ARCHEXT:
3584       return "AARCH64_ARCHEXT";
3585     default:
3586       break;
3587     }
3588
3589   return NULL;
3590 }
3591
3592 static const char *
3593 get_arm_segment_type (unsigned long type)
3594 {
3595   switch (type)
3596     {
3597     case PT_ARM_EXIDX:
3598       return "EXIDX";
3599     default:
3600       break;
3601     }
3602
3603   return NULL;
3604 }
3605
3606 static const char *
3607 get_mips_segment_type (unsigned long type)
3608 {
3609   switch (type)
3610     {
3611     case PT_MIPS_REGINFO:
3612       return "REGINFO";
3613     case PT_MIPS_RTPROC:
3614       return "RTPROC";
3615     case PT_MIPS_OPTIONS:
3616       return "OPTIONS";
3617     case PT_MIPS_ABIFLAGS:
3618       return "ABIFLAGS";
3619     default:
3620       break;
3621     }
3622
3623   return NULL;
3624 }
3625
3626 static const char *
3627 get_parisc_segment_type (unsigned long type)
3628 {
3629   switch (type)
3630     {
3631     case PT_HP_TLS:             return "HP_TLS";
3632     case PT_HP_CORE_NONE:       return "HP_CORE_NONE";
3633     case PT_HP_CORE_VERSION:    return "HP_CORE_VERSION";
3634     case PT_HP_CORE_KERNEL:     return "HP_CORE_KERNEL";
3635     case PT_HP_CORE_COMM:       return "HP_CORE_COMM";
3636     case PT_HP_CORE_PROC:       return "HP_CORE_PROC";
3637     case PT_HP_CORE_LOADABLE:   return "HP_CORE_LOADABLE";
3638     case PT_HP_CORE_STACK:      return "HP_CORE_STACK";
3639     case PT_HP_CORE_SHM:        return "HP_CORE_SHM";
3640     case PT_HP_CORE_MMF:        return "HP_CORE_MMF";
3641     case PT_HP_PARALLEL:        return "HP_PARALLEL";
3642     case PT_HP_FASTBIND:        return "HP_FASTBIND";
3643     case PT_HP_OPT_ANNOT:       return "HP_OPT_ANNOT";
3644     case PT_HP_HSL_ANNOT:       return "HP_HSL_ANNOT";
3645     case PT_HP_STACK:           return "HP_STACK";
3646     case PT_HP_CORE_UTSNAME:    return "HP_CORE_UTSNAME";
3647     case PT_PARISC_ARCHEXT:     return "PARISC_ARCHEXT";
3648     case PT_PARISC_UNWIND:      return "PARISC_UNWIND";
3649     case PT_PARISC_WEAKORDER:   return "PARISC_WEAKORDER";
3650     default:
3651       break;
3652     }
3653
3654   return NULL;
3655 }
3656
3657 static const char *
3658 get_ia64_segment_type (unsigned long type)
3659 {
3660   switch (type)
3661     {
3662     case PT_IA_64_ARCHEXT:      return "IA_64_ARCHEXT";
3663     case PT_IA_64_UNWIND:       return "IA_64_UNWIND";
3664     case PT_HP_TLS:             return "HP_TLS";
3665     case PT_IA_64_HP_OPT_ANOT:  return "HP_OPT_ANNOT";
3666     case PT_IA_64_HP_HSL_ANOT:  return "HP_HSL_ANNOT";
3667     case PT_IA_64_HP_STACK:     return "HP_STACK";
3668     default:
3669       break;
3670     }
3671
3672   return NULL;
3673 }
3674
3675 static const char *
3676 get_tic6x_segment_type (unsigned long type)
3677 {
3678   switch (type)
3679     {
3680     case PT_C6000_PHATTR:       return "C6000_PHATTR";
3681     default:
3682       break;
3683     }
3684
3685   return NULL;
3686 }
3687
3688 static const char *
3689 get_solaris_segment_type (unsigned long type)
3690 {
3691   switch (type)
3692     {
3693     case 0x6464e550: return "PT_SUNW_UNWIND";
3694     case 0x6474e550: return "PT_SUNW_EH_FRAME";
3695     case 0x6ffffff7: return "PT_LOSUNW";
3696     case 0x6ffffffa: return "PT_SUNWBSS";
3697     case 0x6ffffffb: return "PT_SUNWSTACK";
3698     case 0x6ffffffc: return "PT_SUNWDTRACE";
3699     case 0x6ffffffd: return "PT_SUNWCAP";
3700     case 0x6fffffff: return "PT_HISUNW";
3701     default: return NULL;
3702     }
3703 }
3704
3705 static const char *
3706 get_segment_type (unsigned long p_type)
3707 {
3708   static char buff[32];
3709
3710   switch (p_type)
3711     {
3712     case PT_NULL:       return "NULL";
3713     case PT_LOAD:       return "LOAD";
3714     case PT_DYNAMIC:    return "DYNAMIC";
3715     case PT_INTERP:     return "INTERP";
3716     case PT_NOTE:       return "NOTE";
3717     case PT_SHLIB:      return "SHLIB";
3718     case PT_PHDR:       return "PHDR";
3719     case PT_TLS:        return "TLS";
3720
3721     case PT_GNU_EH_FRAME:
3722                         return "GNU_EH_FRAME";
3723     case PT_GNU_STACK:  return "GNU_STACK";
3724     case PT_GNU_RELRO:  return "GNU_RELRO";
3725
3726     default:
3727       if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
3728         {
3729           const char * result;
3730
3731           switch (elf_header.e_machine)
3732             {
3733             case EM_AARCH64:
3734               result = get_aarch64_segment_type (p_type);
3735               break;
3736             case EM_ARM:
3737               result = get_arm_segment_type (p_type);
3738               break;
3739             case EM_MIPS:
3740             case EM_MIPS_RS3_LE:
3741               result = get_mips_segment_type (p_type);
3742               break;
3743             case EM_PARISC:
3744               result = get_parisc_segment_type (p_type);
3745               break;
3746             case EM_IA_64:
3747               result = get_ia64_segment_type (p_type);
3748               break;
3749             case EM_TI_C6000:
3750               result = get_tic6x_segment_type (p_type);
3751               break;
3752             default:
3753               result = NULL;
3754               break;
3755             }
3756
3757           if (result != NULL)
3758             return result;
3759
3760           sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
3761         }
3762       else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
3763         {
3764           const char * result;
3765
3766           switch (elf_header.e_machine)
3767             {
3768             case EM_PARISC:
3769               result = get_parisc_segment_type (p_type);
3770               break;
3771             case EM_IA_64:
3772               result = get_ia64_segment_type (p_type);
3773               break;
3774             default:
3775               if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
3776                 result = get_solaris_segment_type (p_type);
3777               else
3778                 result = NULL;
3779               break;
3780             }
3781
3782           if (result != NULL)
3783             return result;
3784
3785           sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
3786         }
3787       else
3788         snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
3789
3790       return buff;
3791     }
3792 }
3793
3794 static const char *
3795 get_mips_section_type_name (unsigned int sh_type)
3796 {
3797   switch (sh_type)
3798     {
3799     case SHT_MIPS_LIBLIST:       return "MIPS_LIBLIST";
3800     case SHT_MIPS_MSYM:          return "MIPS_MSYM";
3801     case SHT_MIPS_CONFLICT:      return "MIPS_CONFLICT";
3802     case SHT_MIPS_GPTAB:         return "MIPS_GPTAB";
3803     case SHT_MIPS_UCODE:         return "MIPS_UCODE";
3804     case SHT_MIPS_DEBUG:         return "MIPS_DEBUG";
3805     case SHT_MIPS_REGINFO:       return "MIPS_REGINFO";
3806     case SHT_MIPS_PACKAGE:       return "MIPS_PACKAGE";
3807     case SHT_MIPS_PACKSYM:       return "MIPS_PACKSYM";
3808     case SHT_MIPS_RELD:          return "MIPS_RELD";
3809     case SHT_MIPS_IFACE:         return "MIPS_IFACE";
3810     case SHT_MIPS_CONTENT:       return "MIPS_CONTENT";
3811     case SHT_MIPS_OPTIONS:       return "MIPS_OPTIONS";
3812     case SHT_MIPS_SHDR:          return "MIPS_SHDR";
3813     case SHT_MIPS_FDESC:         return "MIPS_FDESC";
3814     case SHT_MIPS_EXTSYM:        return "MIPS_EXTSYM";
3815     case SHT_MIPS_DENSE:         return "MIPS_DENSE";
3816     case SHT_MIPS_PDESC:         return "MIPS_PDESC";
3817     case SHT_MIPS_LOCSYM:        return "MIPS_LOCSYM";
3818     case SHT_MIPS_AUXSYM:        return "MIPS_AUXSYM";
3819     case SHT_MIPS_OPTSYM:        return "MIPS_OPTSYM";
3820     case SHT_MIPS_LOCSTR:        return "MIPS_LOCSTR";
3821     case SHT_MIPS_LINE:          return "MIPS_LINE";
3822     case SHT_MIPS_RFDESC:        return "MIPS_RFDESC";
3823     case SHT_MIPS_DELTASYM:      return "MIPS_DELTASYM";
3824     case SHT_MIPS_DELTAINST:     return "MIPS_DELTAINST";
3825     case SHT_MIPS_DELTACLASS:    return "MIPS_DELTACLASS";
3826     case SHT_MIPS_DWARF:         return "MIPS_DWARF";
3827     case SHT_MIPS_DELTADECL:     return "MIPS_DELTADECL";
3828     case SHT_MIPS_SYMBOL_LIB:    return "MIPS_SYMBOL_LIB";
3829     case SHT_MIPS_EVENTS:        return "MIPS_EVENTS";
3830     case SHT_MIPS_TRANSLATE:     return "MIPS_TRANSLATE";
3831     case SHT_MIPS_PIXIE:         return "MIPS_PIXIE";
3832     case SHT_MIPS_XLATE:         return "MIPS_XLATE";
3833     case SHT_MIPS_XLATE_DEBUG:   return "MIPS_XLATE_DEBUG";
3834     case SHT_MIPS_WHIRL:         return "MIPS_WHIRL";
3835     case SHT_MIPS_EH_REGION:     return "MIPS_EH_REGION";
3836     case SHT_MIPS_XLATE_OLD:     return "MIPS_XLATE_OLD";
3837     case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
3838     case SHT_MIPS_ABIFLAGS:      return "MIPS_ABIFLAGS";
3839     default:
3840       break;
3841     }
3842   return NULL;
3843 }
3844
3845 static const char *
3846 get_parisc_section_type_name (unsigned int sh_type)
3847 {
3848   switch (sh_type)
3849     {
3850     case SHT_PARISC_EXT:        return "PARISC_EXT";
3851     case SHT_PARISC_UNWIND:     return "PARISC_UNWIND";
3852     case SHT_PARISC_DOC:        return "PARISC_DOC";
3853     case SHT_PARISC_ANNOT:      return "PARISC_ANNOT";
3854     case SHT_PARISC_SYMEXTN:    return "PARISC_SYMEXTN";
3855     case SHT_PARISC_STUBS:      return "PARISC_STUBS";
3856     case SHT_PARISC_DLKM:       return "PARISC_DLKM";
3857     default:
3858       break;
3859     }
3860   return NULL;
3861 }
3862
3863 static const char *
3864 get_ia64_section_type_name (unsigned int sh_type)
3865 {
3866   /* If the top 8 bits are 0x78 the next 8 are the os/abi ID.  */
3867   if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
3868     return get_osabi_name ((sh_type & 0x00FF0000) >> 16);
3869
3870   switch (sh_type)
3871     {
3872     case SHT_IA_64_EXT:                return "IA_64_EXT";
3873     case SHT_IA_64_UNWIND:             return "IA_64_UNWIND";
3874     case SHT_IA_64_PRIORITY_INIT:      return "IA_64_PRIORITY_INIT";
3875     case SHT_IA_64_VMS_TRACE:          return "VMS_TRACE";
3876     case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
3877     case SHT_IA_64_VMS_DEBUG:          return "VMS_DEBUG";
3878     case SHT_IA_64_VMS_DEBUG_STR:      return "VMS_DEBUG_STR";
3879     case SHT_IA_64_VMS_LINKAGES:       return "VMS_LINKAGES";
3880     case SHT_IA_64_VMS_SYMBOL_VECTOR:  return "VMS_SYMBOL_VECTOR";
3881     case SHT_IA_64_VMS_FIXUP:          return "VMS_FIXUP";
3882     default:
3883       break;
3884     }
3885   return NULL;
3886 }
3887
3888 static const char *
3889 get_x86_64_section_type_name (unsigned int sh_type)
3890 {
3891   switch (sh_type)
3892     {
3893     case SHT_X86_64_UNWIND:     return "X86_64_UNWIND";
3894     default:
3895       break;
3896     }
3897   return NULL;
3898 }
3899
3900 static const char *
3901 get_aarch64_section_type_name (unsigned int sh_type)
3902 {
3903   switch (sh_type)
3904     {
3905     case SHT_AARCH64_ATTRIBUTES:
3906       return "AARCH64_ATTRIBUTES";
3907     default:
3908       break;
3909     }
3910   return NULL;
3911 }
3912
3913 static const char *
3914 get_arm_section_type_name (unsigned int sh_type)
3915 {
3916   switch (sh_type)
3917     {
3918     case SHT_ARM_EXIDX:           return "ARM_EXIDX";
3919     case SHT_ARM_PREEMPTMAP:      return "ARM_PREEMPTMAP";
3920     case SHT_ARM_ATTRIBUTES:      return "ARM_ATTRIBUTES";
3921     case SHT_ARM_DEBUGOVERLAY:    return "ARM_DEBUGOVERLAY";
3922     case SHT_ARM_OVERLAYSECTION:  return "ARM_OVERLAYSECTION";
3923     default:
3924       break;
3925     }
3926   return NULL;
3927 }
3928
3929 static const char *
3930 get_tic6x_section_type_name (unsigned int sh_type)
3931 {
3932   switch (sh_type)
3933     {
3934     case SHT_C6000_UNWIND:
3935       return "C6000_UNWIND";
3936     case SHT_C6000_PREEMPTMAP:
3937       return "C6000_PREEMPTMAP";
3938     case SHT_C6000_ATTRIBUTES:
3939       return "C6000_ATTRIBUTES";
3940     case SHT_TI_ICODE:
3941       return "TI_ICODE";
3942     case SHT_TI_XREF:
3943       return "TI_XREF";
3944     case SHT_TI_HANDLER:
3945       return "TI_HANDLER";
3946     case SHT_TI_INITINFO:
3947       return "TI_INITINFO";
3948     case SHT_TI_PHATTRS:
3949       return "TI_PHATTRS";
3950     default:
3951       break;
3952     }
3953   return NULL;
3954 }
3955
3956 static const char *
3957 get_msp430x_section_type_name (unsigned int sh_type)
3958 {
3959   switch (sh_type)
3960     {
3961     case SHT_MSP430_SEC_FLAGS:   return "MSP430_SEC_FLAGS";
3962     case SHT_MSP430_SYM_ALIASES: return "MSP430_SYM_ALIASES";
3963     case SHT_MSP430_ATTRIBUTES:  return "MSP430_ATTRIBUTES";
3964     default: return NULL;
3965     }
3966 }
3967
3968 static const char *
3969 get_v850_section_type_name (unsigned int sh_type)
3970 {
3971   switch (sh_type)
3972     {
3973     case SHT_V850_SCOMMON: return "V850 Small Common";
3974     case SHT_V850_TCOMMON: return "V850 Tiny Common";
3975     case SHT_V850_ZCOMMON: return "V850 Zero Common";
3976     case SHT_RENESAS_IOP:  return "RENESAS IOP";
3977     case SHT_RENESAS_INFO: return "RENESAS INFO";
3978     default: return NULL;
3979     }
3980 }
3981
3982 static const char *
3983 get_section_type_name (unsigned int sh_type)
3984 {
3985   static char buff[32];
3986   const char * result;
3987
3988   switch (sh_type)
3989     {
3990     case SHT_NULL:              return "NULL";
3991     case SHT_PROGBITS:          return "PROGBITS";
3992     case SHT_SYMTAB:            return "SYMTAB";
3993     case SHT_STRTAB:            return "STRTAB";
3994     case SHT_RELA:              return "RELA";
3995     case SHT_HASH:              return "HASH";
3996     case SHT_DYNAMIC:           return "DYNAMIC";
3997     case SHT_NOTE:              return "NOTE";
3998     case SHT_NOBITS:            return "NOBITS";
3999     case SHT_REL:               return "REL";
4000     case SHT_SHLIB:             return "SHLIB";
4001     case SHT_DYNSYM:            return "DYNSYM";
4002     case SHT_INIT_ARRAY:        return "INIT_ARRAY";
4003     case SHT_FINI_ARRAY:        return "FINI_ARRAY";
4004     case SHT_PREINIT_ARRAY:     return "PREINIT_ARRAY";
4005     case SHT_GNU_HASH:          return "GNU_HASH";
4006     case SHT_GROUP:             return "GROUP";
4007     case SHT_SYMTAB_SHNDX:      return "SYMTAB SECTION INDICIES";
4008     case SHT_GNU_verdef:        return "VERDEF";
4009     case SHT_GNU_verneed:       return "VERNEED";
4010     case SHT_GNU_versym:        return "VERSYM";
4011     case 0x6ffffff0:            return "VERSYM";
4012     case 0x6ffffffc:            return "VERDEF";
4013     case 0x7ffffffd:            return "AUXILIARY";
4014     case 0x7fffffff:            return "FILTER";
4015     case SHT_GNU_LIBLIST:       return "GNU_LIBLIST";
4016
4017     default:
4018       if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
4019         {
4020           switch (elf_header.e_machine)
4021             {
4022             case EM_MIPS:
4023             case EM_MIPS_RS3_LE:
4024               result = get_mips_section_type_name (sh_type);
4025               break;
4026             case EM_PARISC:
4027               result = get_parisc_section_type_name (sh_type);
4028               break;
4029             case EM_IA_64:
4030               result = get_ia64_section_type_name (sh_type);
4031               break;
4032             case EM_X86_64:
4033             case EM_L1OM:
4034             case EM_K1OM:
4035               result = get_x86_64_section_type_name (sh_type);
4036               break;
4037             case EM_AARCH64:
4038               result = get_aarch64_section_type_name (sh_type);
4039               break;
4040             case EM_ARM:
4041               result = get_arm_section_type_name (sh_type);
4042               break;
4043             case EM_TI_C6000:
4044               result = get_tic6x_section_type_name (sh_type);
4045               break;
4046             case EM_MSP430:
4047               result = get_msp430x_section_type_name (sh_type);
4048               break;
4049             case EM_V800:
4050             case EM_V850:
4051             case EM_CYGNUS_V850:
4052               result = get_v850_section_type_name (sh_type);
4053               break;
4054             default:
4055               result = NULL;
4056               break;
4057             }
4058
4059           if (result != NULL)
4060             return result;
4061
4062           sprintf (buff, "LOPROC+%#x", sh_type - SHT_LOPROC);
4063         }
4064       else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
4065         {
4066           switch (elf_header.e_machine)
4067             {
4068             case EM_IA_64:
4069               result = get_ia64_section_type_name (sh_type);
4070               break;
4071             default:
4072               if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
4073                 result = get_solaris_section_type (sh_type);
4074               else
4075                 result = NULL;
4076               break;
4077             }
4078
4079           if (result != NULL)
4080             return result;
4081
4082           sprintf (buff, "LOOS+%#x", sh_type - SHT_LOOS);
4083         }
4084       else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
4085         {
4086           switch (elf_header.e_machine)
4087             {
4088             case EM_V800:
4089             case EM_V850:
4090             case EM_CYGNUS_V850:
4091               result = get_v850_section_type_name (sh_type);
4092               break;
4093             default:
4094               result = NULL;
4095               break;
4096             }
4097
4098           if (result != NULL)
4099             return result;
4100
4101           sprintf (buff, "LOUSER+%#x", sh_type - SHT_LOUSER);
4102         }
4103       else
4104         /* This message is probably going to be displayed in a 15
4105            character wide field, so put the hex value first.  */
4106         snprintf (buff, sizeof (buff), _("%08x: <unknown>"), sh_type);
4107
4108       return buff;
4109     }
4110 }
4111
4112 #define OPTION_DEBUG_DUMP       512
4113 #define OPTION_DYN_SYMS         513
4114 #define OPTION_DWARF_DEPTH      514
4115 #define OPTION_DWARF_START      515
4116 #define OPTION_DWARF_CHECK      516
4117
4118 static struct option options[] =
4119 {
4120   {"all",              no_argument, 0, 'a'},
4121   {"file-header",      no_argument, 0, 'h'},
4122   {"program-headers",  no_argument, 0, 'l'},
4123   {"headers",          no_argument, 0, 'e'},
4124   {"histogram",        no_argument, 0, 'I'},
4125   {"segments",         no_argument, 0, 'l'},
4126   {"sections",         no_argument, 0, 'S'},
4127   {"section-headers",  no_argument, 0, 'S'},
4128   {"section-groups",   no_argument, 0, 'g'},
4129   {"section-details",  no_argument, 0, 't'},
4130   {"full-section-name",no_argument, 0, 'N'},
4131   {"symbols",          no_argument, 0, 's'},
4132   {"syms",             no_argument, 0, 's'},
4133   {"dyn-syms",         no_argument, 0, OPTION_DYN_SYMS},
4134   {"relocs",           no_argument, 0, 'r'},
4135   {"notes",            no_argument, 0, 'n'},
4136   {"dynamic",          no_argument, 0, 'd'},
4137   {"arch-specific",    no_argument, 0, 'A'},
4138   {"version-info",     no_argument, 0, 'V'},
4139   {"use-dynamic",      no_argument, 0, 'D'},
4140   {"unwind",           no_argument, 0, 'u'},
4141   {"archive-index",    no_argument, 0, 'c'},
4142   {"hex-dump",         required_argument, 0, 'x'},
4143   {"relocated-dump",   required_argument, 0, 'R'},
4144   {"string-dump",      required_argument, 0, 'p'},
4145   {"decompress",       no_argument, 0, 'z'},
4146 #ifdef SUPPORT_DISASSEMBLY
4147   {"instruction-dump", required_argument, 0, 'i'},
4148 #endif
4149   {"debug-dump",       optional_argument, 0, OPTION_DEBUG_DUMP},
4150
4151   {"dwarf-depth",      required_argument, 0, OPTION_DWARF_DEPTH},
4152   {"dwarf-start",      required_argument, 0, OPTION_DWARF_START},
4153   {"dwarf-check",      no_argument, 0, OPTION_DWARF_CHECK},
4154
4155   {"version",          no_argument, 0, 'v'},
4156   {"wide",             no_argument, 0, 'W'},
4157   {"help",             no_argument, 0, 'H'},
4158   {0,                  no_argument, 0, 0}
4159 };
4160
4161 static void
4162 usage (FILE * stream)
4163 {
4164   fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
4165   fprintf (stream, _(" Display information about the contents of ELF format files\n"));
4166   fprintf (stream, _(" Options are:\n\
4167   -a --all               Equivalent to: -h -l -S -s -r -d -V -A -I\n\
4168   -h --file-header       Display the ELF file header\n\
4169   -l --program-headers   Display the program headers\n\
4170      --segments          An alias for --program-headers\n\
4171   -S --section-headers   Display the sections' header\n\
4172      --sections          An alias for --section-headers\n\
4173   -g --section-groups    Display the section groups\n\
4174   -t --section-details   Display the section details\n\
4175   -e --headers           Equivalent to: -h -l -S\n\
4176   -s --syms              Display the symbol table\n\
4177      --symbols           An alias for --syms\n\
4178   --dyn-syms             Display the dynamic symbol table\n\
4179   -n --notes             Display the core notes (if present)\n\
4180   -r --relocs            Display the relocations (if present)\n\
4181   -u --unwind            Display the unwind info (if present)\n\
4182   -d --dynamic           Display the dynamic section (if present)\n\
4183   -V --version-info      Display the version sections (if present)\n\
4184   -A --arch-specific     Display architecture specific information (if any)\n\
4185   -c --archive-index     Display the symbol/file index in an archive\n\
4186   -D --use-dynamic       Use the dynamic section info when displaying symbols\n\
4187   -x --hex-dump=<number|name>\n\
4188                          Dump the contents of section <number|name> as bytes\n\
4189   -p --string-dump=<number|name>\n\
4190                          Dump the contents of section <number|name> as strings\n\
4191   -R --relocated-dump=<number|name>\n\
4192                          Dump the contents of section <number|name> as relocated bytes\n\
4193   -z --decompress        Decompress section before dumping it\n\
4194   -w[lLiaprmfFsoRt] or\n\
4195   --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
4196                =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
4197                =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
4198                =addr,=cu_index]\n\
4199                          Display the contents of DWARF2 debug sections\n"));
4200   fprintf (stream, _("\
4201   --dwarf-depth=N        Do not display DIEs at depth N or greater\n\
4202   --dwarf-start=N        Display DIEs starting with N, at the same depth\n\
4203                          or deeper\n"));
4204 #ifdef SUPPORT_DISASSEMBLY
4205   fprintf (stream, _("\
4206   -i --instruction-dump=<number|name>\n\
4207                          Disassemble the contents of section <number|name>\n"));
4208 #endif
4209   fprintf (stream, _("\
4210   -I --histogram         Display histogram of bucket list lengths\n\
4211   -W --wide              Allow output width to exceed 80 characters\n\
4212   @<file>                Read options from <file>\n\
4213   -H --help              Display this information\n\
4214   -v --version           Display the version number of readelf\n"));
4215
4216   if (REPORT_BUGS_TO[0] && stream == stdout)
4217     fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
4218
4219   exit (stream == stdout ? 0 : 1);
4220 }
4221
4222 /* Record the fact that the user wants the contents of section number
4223    SECTION to be displayed using the method(s) encoded as flags bits
4224    in TYPE.  Note, TYPE can be zero if we are creating the array for
4225    the first time.  */
4226
4227 static void
4228 request_dump_bynumber (unsigned int section, dump_type type)
4229 {
4230   if (section >= num_dump_sects)
4231     {
4232       dump_type * new_dump_sects;
4233
4234       new_dump_sects = (dump_type *) calloc (section + 1,
4235                                              sizeof (* dump_sects));
4236
4237       if (new_dump_sects == NULL)
4238         error (_("Out of memory allocating dump request table.\n"));
4239       else
4240         {
4241           /* Copy current flag settings.  */
4242           memcpy (new_dump_sects, dump_sects, num_dump_sects * sizeof (* dump_sects));
4243
4244           free (dump_sects);
4245
4246           dump_sects = new_dump_sects;
4247           num_dump_sects = section + 1;
4248         }
4249     }
4250
4251   if (dump_sects)
4252     dump_sects[section] |= type;
4253
4254   return;
4255 }
4256
4257 /* Request a dump by section name.  */
4258
4259 static void
4260 request_dump_byname (const char * section, dump_type type)
4261 {
4262   struct dump_list_entry * new_request;
4263
4264   new_request = (struct dump_list_entry *)
4265       malloc (sizeof (struct dump_list_entry));
4266   if (!new_request)
4267     error (_("Out of memory allocating dump request table.\n"));
4268
4269   new_request->name = strdup (section);
4270   if (!new_request->name)
4271     error (_("Out of memory allocating dump request table.\n"));
4272
4273   new_request->type = type;
4274
4275   new_request->next = dump_sects_byname;
4276   dump_sects_byname = new_request;
4277 }
4278
4279 static inline void
4280 request_dump (dump_type type)
4281 {
4282   int section;
4283   char * cp;
4284
4285   do_dump++;
4286   section = strtoul (optarg, & cp, 0);
4287
4288   if (! *cp && section >= 0)
4289     request_dump_bynumber (section, type);
4290   else
4291     request_dump_byname (optarg, type);
4292 }
4293
4294
4295 static void
4296 parse_args (int argc, char ** argv)
4297 {
4298   int c;
4299
4300   if (argc < 2)
4301     usage (stderr);
4302
4303   while ((c = getopt_long
4304           (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:z", options, NULL)) != EOF)
4305     {
4306       switch (c)
4307         {
4308         case 0:
4309           /* Long options.  */
4310           break;
4311         case 'H':
4312           usage (stdout);
4313           break;
4314
4315         case 'a':
4316           do_syms++;
4317           do_reloc++;
4318           do_unwind++;
4319           do_dynamic++;
4320           do_header++;
4321           do_sections++;
4322           do_section_groups++;
4323           do_segments++;
4324           do_version++;
4325           do_histogram++;
4326           do_arch++;
4327           do_notes++;
4328           break;
4329         case 'g':
4330           do_section_groups++;
4331           break;
4332         case 't':
4333         case 'N':
4334           do_sections++;
4335           do_section_details++;
4336           break;
4337         case 'e':
4338           do_header++;
4339           do_sections++;
4340           do_segments++;
4341           break;
4342         case 'A':
4343           do_arch++;
4344           break;
4345         case 'D':
4346           do_using_dynamic++;
4347           break;
4348         case 'r':
4349           do_reloc++;
4350           break;
4351         case 'u':
4352           do_unwind++;
4353           break;
4354         case 'h':
4355           do_header++;
4356           break;
4357         case 'l':
4358           do_segments++;
4359           break;
4360         case 's':
4361           do_syms++;
4362           break;
4363         case 'S':
4364           do_sections++;
4365           break;
4366         case 'd':
4367           do_dynamic++;
4368           break;
4369         case 'I':
4370           do_histogram++;
4371           break;
4372         case 'n':
4373           do_notes++;
4374           break;
4375         case 'c':
4376           do_archive_index++;
4377           break;
4378         case 'x':
4379           request_dump (HEX_DUMP);
4380           break;
4381         case 'p':
4382           request_dump (STRING_DUMP);
4383           break;
4384         case 'R':
4385           request_dump (RELOC_DUMP);
4386           break;
4387         case 'z':
4388           decompress_dumps++;
4389           break;
4390         case 'w':
4391           do_dump++;
4392           if (optarg == 0)
4393             {
4394               do_debugging = 1;
4395               dwarf_select_sections_all ();
4396             }
4397           else
4398             {
4399               do_debugging = 0;
4400               dwarf_select_sections_by_letters (optarg);
4401             }
4402           break;
4403         case OPTION_DEBUG_DUMP:
4404           do_dump++;
4405           if (optarg == 0)
4406             do_debugging = 1;
4407           else
4408             {
4409               do_debugging = 0;
4410               dwarf_select_sections_by_names (optarg);
4411             }
4412           break;
4413         case OPTION_DWARF_DEPTH:
4414           {
4415             char *cp;
4416
4417             dwarf_cutoff_level = strtoul (optarg, & cp, 0);
4418           }
4419           break;
4420         case OPTION_DWARF_START:
4421           {
4422             char *cp;
4423
4424             dwarf_start_die = strtoul (optarg, & cp, 0);
4425           }
4426           break;
4427         case OPTION_DWARF_CHECK:
4428           dwarf_check = 1;
4429           break;
4430         case OPTION_DYN_SYMS:
4431           do_dyn_syms++;
4432           break;
4433 #ifdef SUPPORT_DISASSEMBLY
4434         case 'i':
4435           request_dump (DISASS_DUMP);
4436           break;
4437 #endif
4438         case 'v':
4439           print_version (program_name);
4440           break;
4441         case 'V':
4442           do_version++;
4443           break;
4444         case 'W':
4445           do_wide++;
4446           break;
4447         default:
4448           /* xgettext:c-format */
4449           error (_("Invalid option '-%c'\n"), c);
4450           /* Drop through.  */
4451         case '?':
4452           usage (stderr);
4453         }
4454     }
4455
4456   if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
4457       && !do_segments && !do_header && !do_dump && !do_version
4458       && !do_histogram && !do_debugging && !do_arch && !do_notes
4459       && !do_section_groups && !do_archive_index
4460       && !do_dyn_syms)
4461     usage (stderr);
4462 }
4463
4464 static const char *
4465 get_elf_class (unsigned int elf_class)
4466 {
4467   static char buff[32];
4468
4469   switch (elf_class)
4470     {
4471     case ELFCLASSNONE: return _("none");
4472     case ELFCLASS32:   return "ELF32";
4473     case ELFCLASS64:   return "ELF64";
4474     default:
4475       snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
4476       return buff;
4477     }
4478 }
4479
4480 static const char *
4481 get_data_encoding (unsigned int encoding)
4482 {
4483   static char buff[32];
4484
4485   switch (encoding)
4486     {
4487     case ELFDATANONE: return _("none");
4488     case ELFDATA2LSB: return _("2's complement, little endian");
4489     case ELFDATA2MSB: return _("2's complement, big endian");
4490     default:
4491       snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
4492       return buff;
4493     }
4494 }
4495
4496 /* Decode the data held in 'elf_header'.  */
4497
4498 static int
4499 process_file_header (void)
4500 {
4501   if (   elf_header.e_ident[EI_MAG0] != ELFMAG0
4502       || elf_header.e_ident[EI_MAG1] != ELFMAG1
4503       || elf_header.e_ident[EI_MAG2] != ELFMAG2
4504       || elf_header.e_ident[EI_MAG3] != ELFMAG3)
4505     {
4506       error
4507         (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
4508       return 0;
4509     }
4510
4511   init_dwarf_regnames (elf_header.e_machine);
4512
4513   if (do_header)
4514     {
4515       int i;
4516
4517       printf (_("ELF Header:\n"));
4518       printf (_("  Magic:   "));
4519       for (i = 0; i < EI_NIDENT; i++)
4520         printf ("%2.2x ", elf_header.e_ident[i]);
4521       printf ("\n");
4522       printf (_("  Class:                             %s\n"),
4523               get_elf_class (elf_header.e_ident[EI_CLASS]));
4524       printf (_("  Data:                              %s\n"),
4525               get_data_encoding (elf_header.e_ident[EI_DATA]));
4526       printf (_("  Version:                           %d %s\n"),
4527               elf_header.e_ident[EI_VERSION],
4528               (elf_header.e_ident[EI_VERSION] == EV_CURRENT
4529                ? "(current)"
4530                : (elf_header.e_ident[EI_VERSION] != EV_NONE
4531                   ? _("<unknown: %lx>")
4532                   : "")));
4533       printf (_("  OS/ABI:                            %s\n"),
4534               get_osabi_name (elf_header.e_ident[EI_OSABI]));
4535       printf (_("  ABI Version:                       %d\n"),
4536               elf_header.e_ident[EI_ABIVERSION]);
4537       printf (_("  Type:                              %s\n"),
4538               get_file_type (elf_header.e_type));
4539       printf (_("  Machine:                           %s\n"),
4540               get_machine_name (elf_header.e_machine));
4541       printf (_("  Version:                           0x%lx\n"),
4542               (unsigned long) elf_header.e_version);
4543
4544       printf (_("  Entry point address:               "));
4545       print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4546       printf (_("\n  Start of program headers:          "));
4547       print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4548       printf (_(" (bytes into file)\n  Start of section headers:          "));
4549       print_vma ((bfd_vma) elf_header.e_shoff, DEC);
4550       printf (_(" (bytes into file)\n"));
4551
4552       printf (_("  Flags:                             0x%lx%s\n"),
4553               (unsigned long) elf_header.e_flags,
4554               get_machine_flags (elf_header.e_flags, elf_header.e_machine));
4555       printf (_("  Size of this header:               %ld (bytes)\n"),
4556               (long) elf_header.e_ehsize);
4557       printf (_("  Size of program headers:           %ld (bytes)\n"),
4558               (long) elf_header.e_phentsize);
4559       printf (_("  Number of program headers:         %ld"),
4560               (long) elf_header.e_phnum);
4561       if (section_headers != NULL
4562           && elf_header.e_phnum == PN_XNUM
4563           && section_headers[0].sh_info != 0)
4564         printf (" (%ld)", (long) section_headers[0].sh_info);
4565       putc ('\n', stdout);
4566       printf (_("  Size of section headers:           %ld (bytes)\n"),
4567               (long) elf_header.e_shentsize);
4568       printf (_("  Number of section headers:         %ld"),
4569               (long) elf_header.e_shnum);
4570       if (section_headers != NULL && elf_header.e_shnum == SHN_UNDEF)
4571         printf (" (%ld)", (long) section_headers[0].sh_size);
4572       putc ('\n', stdout);
4573       printf (_("  Section header string table index: %ld"),
4574               (long) elf_header.e_shstrndx);
4575       if (section_headers != NULL
4576           && elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
4577         printf (" (%u)", section_headers[0].sh_link);
4578       else if (elf_header.e_shstrndx != SHN_UNDEF
4579                && elf_header.e_shstrndx >= elf_header.e_shnum)
4580         printf (_(" <corrupt: out of range>"));
4581       putc ('\n', stdout);
4582     }
4583
4584   if (section_headers != NULL)
4585     {
4586       if (elf_header.e_phnum == PN_XNUM
4587           && section_headers[0].sh_info != 0)
4588         elf_header.e_phnum = section_headers[0].sh_info;
4589       if (elf_header.e_shnum == SHN_UNDEF)
4590         elf_header.e_shnum = section_headers[0].sh_size;
4591       if (elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
4592         elf_header.e_shstrndx = section_headers[0].sh_link;
4593       else if (elf_header.e_shstrndx >= elf_header.e_shnum)
4594         elf_header.e_shstrndx = SHN_UNDEF;
4595       free (section_headers);
4596       section_headers = NULL;
4597     }
4598
4599   return 1;
4600 }
4601
4602 static bfd_boolean
4603 get_32bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
4604 {
4605   Elf32_External_Phdr * phdrs;
4606   Elf32_External_Phdr * external;
4607   Elf_Internal_Phdr *   internal;
4608   unsigned int i;
4609   unsigned int size = elf_header.e_phentsize;
4610   unsigned int num  = elf_header.e_phnum;
4611
4612   /* PR binutils/17531: Cope with unexpected section header sizes.  */
4613   if (size == 0 || num == 0)
4614     return FALSE;
4615   if (size < sizeof * phdrs)
4616     {
4617       error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4618       return FALSE;
4619     }
4620   if (size > sizeof * phdrs)
4621     warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4622
4623   phdrs = (Elf32_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
4624                                             size, num, _("program headers"));
4625   if (phdrs == NULL)
4626     return FALSE;
4627
4628   for (i = 0, internal = pheaders, external = phdrs;
4629        i < elf_header.e_phnum;
4630        i++, internal++, external++)
4631     {
4632       internal->p_type   = BYTE_GET (external->p_type);
4633       internal->p_offset = BYTE_GET (external->p_offset);
4634       internal->p_vaddr  = BYTE_GET (external->p_vaddr);
4635       internal->p_paddr  = BYTE_GET (external->p_paddr);
4636       internal->p_filesz = BYTE_GET (external->p_filesz);
4637       internal->p_memsz  = BYTE_GET (external->p_memsz);
4638       internal->p_flags  = BYTE_GET (external->p_flags);
4639       internal->p_align  = BYTE_GET (external->p_align);
4640     }
4641
4642   free (phdrs);
4643   return TRUE;
4644 }
4645
4646 static bfd_boolean
4647 get_64bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
4648 {
4649   Elf64_External_Phdr * phdrs;
4650   Elf64_External_Phdr * external;
4651   Elf_Internal_Phdr *   internal;
4652   unsigned int i;
4653   unsigned int size = elf_header.e_phentsize;
4654   unsigned int num  = elf_header.e_phnum;
4655
4656   /* PR binutils/17531: Cope with unexpected section header sizes.  */
4657   if (size == 0 || num == 0)
4658     return FALSE;
4659   if (size < sizeof * phdrs)
4660     {
4661       error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4662       return FALSE;
4663     }
4664   if (size > sizeof * phdrs)
4665     warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4666
4667   phdrs = (Elf64_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
4668                                             size, num, _("program headers"));
4669   if (!phdrs)
4670     return FALSE;
4671
4672   for (i = 0, internal = pheaders, external = phdrs;
4673        i < elf_header.e_phnum;
4674        i++, internal++, external++)
4675     {
4676       internal->p_type   = BYTE_GET (external->p_type);
4677       internal->p_flags  = BYTE_GET (external->p_flags);
4678       internal->p_offset = BYTE_GET (external->p_offset);
4679       internal->p_vaddr  = BYTE_GET (external->p_vaddr);
4680       internal->p_paddr  = BYTE_GET (external->p_paddr);
4681       internal->p_filesz = BYTE_GET (external->p_filesz);
4682       internal->p_memsz  = BYTE_GET (external->p_memsz);
4683       internal->p_align  = BYTE_GET (external->p_align);
4684     }
4685
4686   free (phdrs);
4687   return TRUE;
4688 }
4689
4690 /* Returns 1 if the program headers were read into `program_headers'.  */
4691
4692 static int
4693 get_program_headers (FILE * file)
4694 {
4695   Elf_Internal_Phdr * phdrs;
4696
4697   /* Check cache of prior read.  */
4698   if (program_headers != NULL)
4699     return 1;
4700
4701   phdrs = (Elf_Internal_Phdr *) cmalloc (elf_header.e_phnum,
4702                                          sizeof (Elf_Internal_Phdr));
4703
4704   if (phdrs == NULL)
4705     {
4706       error (_("Out of memory reading %u program headers\n"),
4707              elf_header.e_phnum);
4708       return 0;
4709     }
4710
4711   if (is_32bit_elf
4712       ? get_32bit_program_headers (file, phdrs)
4713       : get_64bit_program_headers (file, phdrs))
4714     {
4715       program_headers = phdrs;
4716       return 1;
4717     }
4718
4719   free (phdrs);
4720   return 0;
4721 }
4722
4723 /* Returns 1 if the program headers were loaded.  */
4724
4725 static int
4726 process_program_headers (FILE * file)
4727 {
4728   Elf_Internal_Phdr * segment;
4729   unsigned int i;
4730
4731   if (elf_header.e_phnum == 0)
4732     {
4733       /* PR binutils/12467.  */
4734       if (elf_header.e_phoff != 0)
4735         warn (_("possibly corrupt ELF header - it has a non-zero program"
4736                 " header offset, but no program headers\n"));
4737       else if (do_segments)
4738         printf (_("\nThere are no program headers in this file.\n"));
4739       return 0;
4740     }
4741
4742   if (do_segments && !do_header)
4743     {
4744       printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
4745       printf (_("Entry point "));
4746       print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4747       printf (_("\nThere are %d program headers, starting at offset "),
4748               elf_header.e_phnum);
4749       print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4750       printf ("\n");
4751     }
4752
4753   if (! get_program_headers (file))
4754       return 0;
4755
4756   if (do_segments)
4757     {
4758       if (elf_header.e_phnum > 1)
4759         printf (_("\nProgram Headers:\n"));
4760       else
4761         printf (_("\nProgram Headers:\n"));
4762
4763       if (is_32bit_elf)
4764         printf
4765           (_("  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align\n"));
4766       else if (do_wide)
4767         printf
4768           (_("  Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align\n"));
4769       else
4770         {
4771           printf
4772             (_("  Type           Offset             VirtAddr           PhysAddr\n"));
4773           printf
4774             (_("                 FileSiz            MemSiz              Flags  Align\n"));
4775         }
4776     }
4777
4778   dynamic_addr = 0;
4779   dynamic_size = 0;
4780
4781   for (i = 0, segment = program_headers;
4782        i < elf_header.e_phnum;
4783        i++, segment++)
4784     {
4785       if (do_segments)
4786         {
4787           printf ("  %-14.14s ", get_segment_type (segment->p_type));
4788
4789           if (is_32bit_elf)
4790             {
4791               printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4792               printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
4793               printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
4794               printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
4795               printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
4796               printf ("%c%c%c ",
4797                       (segment->p_flags & PF_R ? 'R' : ' '),
4798                       (segment->p_flags & PF_W ? 'W' : ' '),
4799                       (segment->p_flags & PF_X ? 'E' : ' '));
4800               printf ("%#lx", (unsigned long) segment->p_align);
4801             }
4802           else if (do_wide)
4803             {
4804               if ((unsigned long) segment->p_offset == segment->p_offset)
4805                 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4806               else
4807                 {
4808                   print_vma (segment->p_offset, FULL_HEX);
4809                   putchar (' ');
4810                 }
4811
4812               print_vma (segment->p_vaddr, FULL_HEX);
4813               putchar (' ');
4814               print_vma (segment->p_paddr, FULL_HEX);
4815               putchar (' ');
4816
4817               if ((unsigned long) segment->p_filesz == segment->p_filesz)
4818                 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
4819               else
4820                 {
4821                   print_vma (segment->p_filesz, FULL_HEX);
4822                   putchar (' ');
4823                 }
4824
4825               if ((unsigned long) segment->p_memsz == segment->p_memsz)
4826                 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
4827               else
4828                 {
4829                   print_vma (segment->p_memsz, FULL_HEX);
4830                 }
4831
4832               printf (" %c%c%c ",
4833                       (segment->p_flags & PF_R ? 'R' : ' '),
4834                       (segment->p_flags & PF_W ? 'W' : ' '),
4835                       (segment->p_flags & PF_X ? 'E' : ' '));
4836
4837               if ((unsigned long) segment->p_align == segment->p_align)
4838                 printf ("%#lx", (unsigned long) segment->p_align);
4839               else
4840                 {
4841                   print_vma (segment->p_align, PREFIX_HEX);
4842                 }
4843             }
4844           else
4845             {
4846               print_vma (segment->p_offset, FULL_HEX);
4847               putchar (' ');
4848               print_vma (segment->p_vaddr, FULL_HEX);
4849               putchar (' ');
4850               print_vma (segment->p_paddr, FULL_HEX);
4851               printf ("\n                 ");
4852               print_vma (segment->p_filesz, FULL_HEX);
4853               putchar (' ');
4854               print_vma (segment->p_memsz, FULL_HEX);
4855               printf ("  %c%c%c    ",
4856                       (segment->p_flags & PF_R ? 'R' : ' '),
4857                       (segment->p_flags & PF_W ? 'W' : ' '),
4858                       (segment->p_flags & PF_X ? 'E' : ' '));
4859               print_vma (segment->p_align, HEX);
4860             }
4861         }
4862
4863       if (do_segments)
4864         putc ('\n', stdout);
4865
4866       switch (segment->p_type)
4867         {
4868         case PT_DYNAMIC:
4869           if (dynamic_addr)
4870             error (_("more than one dynamic segment\n"));
4871
4872           /* By default, assume that the .dynamic section is the first
4873              section in the DYNAMIC segment.  */
4874           dynamic_addr = segment->p_offset;
4875           dynamic_size = segment->p_filesz;
4876           /* PR binutils/17512: Avoid corrupt dynamic section info in the segment.  */
4877           if (dynamic_addr + dynamic_size >= current_file_size)
4878             {
4879               error (_("the dynamic segment offset + size exceeds the size of the file\n"));
4880               dynamic_addr = dynamic_size = 0;
4881             }
4882
4883           /* Try to locate the .dynamic section. If there is
4884              a section header table, we can easily locate it.  */
4885           if (section_headers != NULL)
4886             {
4887               Elf_Internal_Shdr * sec;
4888
4889               sec = find_section (".dynamic");
4890               if (sec == NULL || sec->sh_size == 0)
4891                 {
4892                   /* A corresponding .dynamic section is expected, but on
4893                      IA-64/OpenVMS it is OK for it to be missing.  */
4894                   if (!is_ia64_vms ())
4895                     error (_("no .dynamic section in the dynamic segment\n"));
4896                   break;
4897                 }
4898
4899               if (sec->sh_type == SHT_NOBITS)
4900                 {
4901                   dynamic_size = 0;
4902                   break;
4903                 }
4904
4905               dynamic_addr = sec->sh_offset;
4906               dynamic_size = sec->sh_size;
4907
4908               if (dynamic_addr < segment->p_offset
4909                   || dynamic_addr > segment->p_offset + segment->p_filesz)
4910                 warn (_("the .dynamic section is not contained"
4911                         " within the dynamic segment\n"));
4912               else if (dynamic_addr > segment->p_offset)
4913                 warn (_("the .dynamic section is not the first section"
4914                         " in the dynamic segment.\n"));
4915             }
4916           break;
4917
4918         case PT_INTERP:
4919           if (fseek (file, archive_file_offset + (long) segment->p_offset,
4920                      SEEK_SET))
4921             error (_("Unable to find program interpreter name\n"));
4922           else
4923             {
4924               char fmt [32];
4925               int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX - 1);
4926
4927               if (ret >= (int) sizeof (fmt) || ret < 0)
4928                 error (_("Internal error: failed to create format string to display program interpreter\n"));
4929
4930               program_interpreter[0] = 0;
4931               if (fscanf (file, fmt, program_interpreter) <= 0)
4932                 error (_("Unable to read program interpreter name\n"));
4933
4934               if (do_segments)
4935                 printf (_("      [Requesting program interpreter: %s]\n"),
4936                     program_interpreter);
4937             }
4938           break;
4939         }
4940     }
4941
4942   if (do_segments && section_headers != NULL && string_table != NULL)
4943     {
4944       printf (_("\n Section to Segment mapping:\n"));
4945       printf (_("  Segment Sections...\n"));
4946
4947       for (i = 0; i < elf_header.e_phnum; i++)
4948         {
4949           unsigned int j;
4950           Elf_Internal_Shdr * section;
4951
4952           segment = program_headers + i;
4953           section = section_headers + 1;
4954
4955           printf ("   %2.2d     ", i);
4956
4957           for (j = 1; j < elf_header.e_shnum; j++, section++)
4958             {
4959               if (!ELF_TBSS_SPECIAL (section, segment)
4960                   && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
4961                 printf ("%s ", printable_section_name (section));
4962             }
4963
4964           putc ('\n',stdout);
4965         }
4966     }
4967
4968   return 1;
4969 }
4970
4971
4972 /* Find the file offset corresponding to VMA by using the program headers.  */
4973
4974 static long
4975 offset_from_vma (FILE * file, bfd_vma vma, bfd_size_type size)
4976 {
4977   Elf_Internal_Phdr * seg;
4978
4979   if (! get_program_headers (file))
4980     {
4981       warn (_("Cannot interpret virtual addresses without program headers.\n"));
4982       return (long) vma;
4983     }
4984
4985   for (seg = program_headers;
4986        seg < program_headers + elf_header.e_phnum;
4987        ++seg)
4988     {
4989       if (seg->p_type != PT_LOAD)
4990         continue;
4991
4992       if (vma >= (seg->p_vaddr & -seg->p_align)
4993           && vma + size <= seg->p_vaddr + seg->p_filesz)
4994         return vma - seg->p_vaddr + seg->p_offset;
4995     }
4996
4997   warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
4998         (unsigned long) vma);
4999   return (long) vma;
5000 }
5001
5002
5003 /* Allocate memory and load the sections headers into the global pointer
5004    SECTION_HEADERS.  If PROBE is true, this is just a probe and we do not
5005    generate any error messages if the load fails.  */
5006
5007 static bfd_boolean
5008 get_32bit_section_headers (FILE * file, bfd_boolean probe)
5009 {
5010   Elf32_External_Shdr * shdrs;
5011   Elf_Internal_Shdr *   internal;
5012   unsigned int i;
5013   unsigned int size = elf_header.e_shentsize;
5014   unsigned int num = probe ? 1 : elf_header.e_shnum;
5015
5016   /* PR binutils/17531: Cope with unexpected section header sizes.  */
5017   if (size == 0 || num == 0)
5018     return FALSE;
5019   if (size < sizeof * shdrs)
5020     {
5021       if (! probe)
5022         error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5023       return FALSE;
5024     }
5025   if (!probe && size > sizeof * shdrs)
5026     warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
5027
5028   shdrs = (Elf32_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
5029                                             size, num,
5030                                             probe ? NULL : _("section headers"));
5031   if (shdrs == NULL)
5032     return FALSE;
5033
5034   if (section_headers != NULL)
5035     free (section_headers);
5036   section_headers = (Elf_Internal_Shdr *) cmalloc (num,
5037                                                    sizeof (Elf_Internal_Shdr));
5038   if (section_headers == NULL)
5039     {
5040       if (!probe)
5041         error (_("Out of memory reading %u section headers\n"), num);
5042       return FALSE;
5043     }
5044
5045   for (i = 0, internal = section_headers;
5046        i < num;
5047        i++, internal++)
5048     {
5049       internal->sh_name      = BYTE_GET (shdrs[i].sh_name);
5050       internal->sh_type      = BYTE_GET (shdrs[i].sh_type);
5051       internal->sh_flags     = BYTE_GET (shdrs[i].sh_flags);
5052       internal->sh_addr      = BYTE_GET (shdrs[i].sh_addr);
5053       internal->sh_offset    = BYTE_GET (shdrs[i].sh_offset);
5054       internal->sh_size      = BYTE_GET (shdrs[i].sh_size);
5055       internal->sh_link      = BYTE_GET (shdrs[i].sh_link);
5056       internal->sh_info      = BYTE_GET (shdrs[i].sh_info);
5057       internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5058       internal->sh_entsize   = BYTE_GET (shdrs[i].sh_entsize);
5059       if (!probe && internal->sh_link > num)
5060         warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5061       if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5062         warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
5063     }
5064
5065   free (shdrs);
5066   return TRUE;
5067 }
5068
5069 static bfd_boolean
5070 get_64bit_section_headers (FILE * file, bfd_boolean probe)
5071 {
5072   Elf64_External_Shdr * shdrs;
5073   Elf_Internal_Shdr *   internal;
5074   unsigned int i;
5075   unsigned int size = elf_header.e_shentsize;
5076   unsigned int num = probe ? 1 : elf_header.e_shnum;
5077
5078   /* PR binutils/17531: Cope with unexpected section header sizes.  */
5079   if (size == 0 || num == 0)
5080     return FALSE;
5081   if (size < sizeof * shdrs)
5082     {
5083       if (! probe)
5084         error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5085       return FALSE;
5086     }
5087   if (! probe && size > sizeof * shdrs)
5088     warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
5089
5090   shdrs = (Elf64_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
5091                                             size, num,
5092                                             probe ? NULL : _("section headers"));
5093   if (shdrs == NULL)
5094     return FALSE;
5095
5096   if (section_headers != NULL)
5097     free (section_headers);
5098   section_headers = (Elf_Internal_Shdr *) cmalloc (num,
5099                                                    sizeof (Elf_Internal_Shdr));
5100   if (section_headers == NULL)
5101     {
5102       if (! probe)
5103         error (_("Out of memory reading %u section headers\n"), num);
5104       return FALSE;
5105     }
5106
5107   for (i = 0, internal = section_headers;
5108        i < num;
5109        i++, internal++)
5110     {
5111       internal->sh_name      = BYTE_GET (shdrs[i].sh_name);
5112       internal->sh_type      = BYTE_GET (shdrs[i].sh_type);
5113       internal->sh_flags     = BYTE_GET (shdrs[i].sh_flags);
5114       internal->sh_addr      = BYTE_GET (shdrs[i].sh_addr);
5115       internal->sh_size      = BYTE_GET (shdrs[i].sh_size);
5116       internal->sh_entsize   = BYTE_GET (shdrs[i].sh_entsize);
5117       internal->sh_link      = BYTE_GET (shdrs[i].sh_link);
5118       internal->sh_info      = BYTE_GET (shdrs[i].sh_info);
5119       internal->sh_offset    = BYTE_GET (shdrs[i].sh_offset);
5120       internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5121       if (!probe && internal->sh_link > num)
5122         warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5123       if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5124         warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
5125     }
5126
5127   free (shdrs);
5128   return TRUE;
5129 }
5130
5131 static Elf_Internal_Sym *
5132 get_32bit_elf_symbols (FILE * file,
5133                        Elf_Internal_Shdr * section,
5134                        unsigned long * num_syms_return)
5135 {
5136   unsigned long number = 0;
5137   Elf32_External_Sym * esyms = NULL;
5138   Elf_External_Sym_Shndx * shndx = NULL;
5139   Elf_Internal_Sym * isyms = NULL;
5140   Elf_Internal_Sym * psym;
5141   unsigned int j;
5142
5143   if (section->sh_size == 0)
5144     {
5145       if (num_syms_return != NULL)
5146         * num_syms_return = 0;
5147       return NULL;
5148     }
5149
5150   /* Run some sanity checks first.  */
5151   if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5152     {
5153       error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5154              printable_section_name (section), (unsigned long) section->sh_entsize);
5155       goto exit_point;
5156     }
5157
5158   if (section->sh_size > current_file_size)
5159     {
5160       error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5161              printable_section_name (section), (unsigned long) section->sh_size);
5162       goto exit_point;
5163     }
5164
5165   number = section->sh_size / section->sh_entsize;
5166
5167   if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
5168     {
5169       error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5170              (unsigned long) section->sh_size,
5171              printable_section_name (section),
5172              (unsigned long) section->sh_entsize);
5173       goto exit_point;
5174     }
5175
5176   esyms = (Elf32_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
5177                                            section->sh_size, _("symbols"));
5178   if (esyms == NULL)
5179     goto exit_point;
5180
5181   {
5182     elf_section_list * entry;
5183
5184     shndx = NULL;
5185     for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5186       if (entry->hdr->sh_link == (unsigned long) (section - section_headers))
5187         {
5188           shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
5189                                                        entry->hdr->sh_offset,
5190                                                        1, entry->hdr->sh_size,
5191                                                        _("symbol table section indicies"));
5192           if (shndx == NULL)
5193             goto exit_point;
5194           /* PR17531: file: heap-buffer-overflow */
5195           else if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5196             {
5197               error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5198                      printable_section_name (entry->hdr),
5199                      (unsigned long) entry->hdr->sh_size,
5200                      (unsigned long) section->sh_size);
5201               goto exit_point;
5202             }
5203         }
5204   }
5205
5206   isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5207
5208   if (isyms == NULL)
5209     {
5210       error (_("Out of memory reading %lu symbols\n"),
5211              (unsigned long) number);
5212       goto exit_point;
5213     }
5214
5215   for (j = 0, psym = isyms; j < number; j++, psym++)
5216     {
5217       psym->st_name  = BYTE_GET (esyms[j].st_name);
5218       psym->st_value = BYTE_GET (esyms[j].st_value);
5219       psym->st_size  = BYTE_GET (esyms[j].st_size);
5220       psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5221       if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5222         psym->st_shndx
5223           = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5224       else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5225         psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5226       psym->st_info  = BYTE_GET (esyms[j].st_info);
5227       psym->st_other = BYTE_GET (esyms[j].st_other);
5228     }
5229
5230  exit_point:
5231   if (shndx != NULL)
5232     free (shndx);
5233   if (esyms != NULL)
5234     free (esyms);
5235
5236   if (num_syms_return != NULL)
5237     * num_syms_return = isyms == NULL ? 0 : number;
5238
5239   return isyms;
5240 }
5241
5242 static Elf_Internal_Sym *
5243 get_64bit_elf_symbols (FILE * file,
5244                        Elf_Internal_Shdr * section,
5245                        unsigned long * num_syms_return)
5246 {
5247   unsigned long number = 0;
5248   Elf64_External_Sym * esyms = NULL;
5249   Elf_External_Sym_Shndx * shndx = NULL;
5250   Elf_Internal_Sym * isyms = NULL;
5251   Elf_Internal_Sym * psym;
5252   unsigned int j;
5253
5254   if (section->sh_size == 0)
5255     {
5256       if (num_syms_return != NULL)
5257         * num_syms_return = 0;
5258       return NULL;
5259     }
5260
5261   /* Run some sanity checks first.  */
5262   if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5263     {
5264       error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5265              printable_section_name (section),
5266              (unsigned long) section->sh_entsize);
5267       goto exit_point;
5268     }
5269
5270   if (section->sh_size > current_file_size)
5271     {
5272       error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5273              printable_section_name (section),
5274              (unsigned long) section->sh_size);
5275       goto exit_point;
5276     }
5277
5278   number = section->sh_size / section->sh_entsize;
5279
5280   if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
5281     {
5282       error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5283              (unsigned long) section->sh_size,
5284              printable_section_name (section),
5285              (unsigned long) section->sh_entsize);
5286       goto exit_point;
5287     }
5288
5289   esyms = (Elf64_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
5290                                            section->sh_size, _("symbols"));
5291   if (!esyms)
5292     goto exit_point;
5293
5294   {
5295     elf_section_list * entry;
5296
5297     shndx = NULL;
5298     for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5299       if (entry->hdr->sh_link == (unsigned long) (section - section_headers))
5300         {
5301           shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
5302                                                        entry->hdr->sh_offset,
5303                                                        1, entry->hdr->sh_size,
5304                                                        _("symbol table section indicies"));
5305           if (shndx == NULL)
5306             goto exit_point;
5307           /* PR17531: file: heap-buffer-overflow */
5308           else if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5309             {
5310               error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5311                      printable_section_name (entry->hdr),
5312                      (unsigned long) entry->hdr->sh_size,
5313                      (unsigned long) section->sh_size);
5314               goto exit_point;
5315             }
5316         }
5317   }
5318
5319   isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5320
5321   if (isyms == NULL)
5322     {
5323       error (_("Out of memory reading %lu symbols\n"),
5324              (unsigned long) number);
5325       goto exit_point;
5326     }
5327
5328   for (j = 0, psym = isyms; j < number; j++, psym++)
5329     {
5330       psym->st_name  = BYTE_GET (esyms[j].st_name);
5331       psym->st_info  = BYTE_GET (esyms[j].st_info);
5332       psym->st_other = BYTE_GET (esyms[j].st_other);
5333       psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5334
5335       if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5336         psym->st_shndx
5337           = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5338       else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5339         psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5340
5341       psym->st_value = BYTE_GET (esyms[j].st_value);
5342       psym->st_size  = BYTE_GET (esyms[j].st_size);
5343     }
5344
5345  exit_point:
5346   if (shndx != NULL)
5347     free (shndx);
5348   if (esyms != NULL)
5349     free (esyms);
5350
5351   if (num_syms_return != NULL)
5352     * num_syms_return = isyms == NULL ? 0 : number;
5353
5354   return isyms;
5355 }
5356
5357 static const char *
5358 get_elf_section_flags (bfd_vma sh_flags)
5359 {
5360   static char buff[1024];
5361   char * p = buff;
5362   int field_size = is_32bit_elf ? 8 : 16;
5363   int sindex;
5364   int size = sizeof (buff) - (field_size + 4 + 1);
5365   bfd_vma os_flags = 0;
5366   bfd_vma proc_flags = 0;
5367   bfd_vma unknown_flags = 0;
5368   static const struct
5369     {
5370       const char * str;
5371       int len;
5372     }
5373   flags [] =
5374     {
5375       /*  0 */ { STRING_COMMA_LEN ("WRITE") },
5376       /*  1 */ { STRING_COMMA_LEN ("ALLOC") },
5377       /*  2 */ { STRING_COMMA_LEN ("EXEC") },
5378       /*  3 */ { STRING_COMMA_LEN ("MERGE") },
5379       /*  4 */ { STRING_COMMA_LEN ("STRINGS") },
5380       /*  5 */ { STRING_COMMA_LEN ("INFO LINK") },
5381       /*  6 */ { STRING_COMMA_LEN ("LINK ORDER") },
5382       /*  7 */ { STRING_COMMA_LEN ("OS NONCONF") },
5383       /*  8 */ { STRING_COMMA_LEN ("GROUP") },
5384       /*  9 */ { STRING_COMMA_LEN ("TLS") },
5385       /* IA-64 specific.  */
5386       /* 10 */ { STRING_COMMA_LEN ("SHORT") },
5387       /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
5388       /* IA-64 OpenVMS specific.  */
5389       /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
5390       /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
5391       /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
5392       /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
5393       /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
5394       /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
5395       /* Generic.  */
5396       /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
5397       /* SPARC specific.  */
5398       /* 19 */ { STRING_COMMA_LEN ("ORDERED") },
5399       /* 20 */ { STRING_COMMA_LEN ("COMPRESSED") },
5400       /* ARM specific.  */
5401       /* 21 */ { STRING_COMMA_LEN ("ENTRYSECT") },
5402       /* 22 */ { STRING_COMMA_LEN ("ARM_PURECODE") },
5403       /* 23 */ { STRING_COMMA_LEN ("COMDEF") }
5404     };
5405
5406   if (do_section_details)
5407     {
5408       sprintf (buff, "[%*.*lx]: ",
5409                field_size, field_size, (unsigned long) sh_flags);
5410       p += field_size + 4;
5411     }
5412
5413   while (sh_flags)
5414     {
5415       bfd_vma flag;
5416
5417       flag = sh_flags & - sh_flags;
5418       sh_flags &= ~ flag;
5419
5420       if (do_section_details)
5421         {
5422           switch (flag)
5423             {
5424             case SHF_WRITE:             sindex = 0; break;
5425             case SHF_ALLOC:             sindex = 1; break;
5426             case SHF_EXECINSTR:         sindex = 2; break;
5427             case SHF_MERGE:             sindex = 3; break;
5428             case SHF_STRINGS:           sindex = 4; break;
5429             case SHF_INFO_LINK:         sindex = 5; break;
5430             case SHF_LINK_ORDER:        sindex = 6; break;
5431             case SHF_OS_NONCONFORMING:  sindex = 7; break;
5432             case SHF_GROUP:             sindex = 8; break;
5433             case SHF_TLS:               sindex = 9; break;
5434             case SHF_EXCLUDE:           sindex = 18; break;
5435             case SHF_COMPRESSED:        sindex = 20; break;
5436
5437             default:
5438               sindex = -1;
5439               switch (elf_header.e_machine)
5440                 {
5441                 case EM_IA_64:
5442                   if (flag == SHF_IA_64_SHORT)
5443                     sindex = 10;
5444                   else if (flag == SHF_IA_64_NORECOV)
5445                     sindex = 11;
5446 #ifdef BFD64
5447                   else if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
5448                     switch (flag)
5449                       {
5450                       case SHF_IA_64_VMS_GLOBAL:      sindex = 12; break;
5451                       case SHF_IA_64_VMS_OVERLAID:    sindex = 13; break;
5452                       case SHF_IA_64_VMS_SHARED:      sindex = 14; break;
5453                       case SHF_IA_64_VMS_VECTOR:      sindex = 15; break;
5454                       case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
5455                       case SHF_IA_64_VMS_PROTECTED:   sindex = 17; break;
5456                       default:                        break;
5457                       }
5458 #endif
5459                   break;
5460
5461                 case EM_386:
5462                 case EM_IAMCU:
5463                 case EM_X86_64:
5464                 case EM_L1OM:
5465                 case EM_K1OM:
5466                 case EM_OLD_SPARCV9:
5467                 case EM_SPARC32PLUS:
5468                 case EM_SPARCV9:
5469                 case EM_SPARC:
5470                   if (flag == SHF_ORDERED)
5471                     sindex = 19;
5472                   break;
5473
5474                 case EM_ARM:
5475                   switch (flag)
5476                     {
5477                     case SHF_ENTRYSECT: sindex = 21; break;
5478                     case SHF_ARM_PURECODE: sindex = 22; break;
5479                     case SHF_COMDEF: sindex = 23; break;
5480                     default: break;
5481                     }
5482                   break;
5483
5484                 default:
5485                   break;
5486                 }
5487             }
5488
5489           if (sindex != -1)
5490             {
5491               if (p != buff + field_size + 4)
5492                 {
5493                   if (size < (10 + 2))
5494                     {
5495                       warn (_("Internal error: not enough buffer room for section flag info"));
5496                       return _("<unknown>");
5497                     }
5498                   size -= 2;
5499                   *p++ = ',';
5500                   *p++ = ' ';
5501                 }
5502
5503               size -= flags [sindex].len;
5504               p = stpcpy (p, flags [sindex].str);
5505             }
5506           else if (flag & SHF_MASKOS)
5507             os_flags |= flag;
5508           else if (flag & SHF_MASKPROC)
5509             proc_flags |= flag;
5510           else
5511             unknown_flags |= flag;
5512         }
5513       else
5514         {
5515           switch (flag)
5516             {
5517             case SHF_WRITE:             *p = 'W'; break;
5518             case SHF_ALLOC:             *p = 'A'; break;
5519             case SHF_EXECINSTR:         *p = 'X'; break;
5520             case SHF_MERGE:             *p = 'M'; break;
5521             case SHF_STRINGS:           *p = 'S'; break;
5522             case SHF_INFO_LINK:         *p = 'I'; break;
5523             case SHF_LINK_ORDER:        *p = 'L'; break;
5524             case SHF_OS_NONCONFORMING:  *p = 'O'; break;
5525             case SHF_GROUP:             *p = 'G'; break;
5526             case SHF_TLS:               *p = 'T'; break;
5527             case SHF_EXCLUDE:           *p = 'E'; break;
5528             case SHF_COMPRESSED:        *p = 'C'; break;
5529
5530             default:
5531               if ((elf_header.e_machine == EM_X86_64
5532                    || elf_header.e_machine == EM_L1OM
5533                    || elf_header.e_machine == EM_K1OM)
5534                   && flag == SHF_X86_64_LARGE)
5535                 *p = 'l';
5536               else if (elf_header.e_machine == EM_ARM
5537                        && flag == SHF_ARM_PURECODE)
5538                   *p = 'y';
5539               else if (flag & SHF_MASKOS)
5540                 {
5541                   *p = 'o';
5542                   sh_flags &= ~ SHF_MASKOS;
5543                 }
5544               else if (flag & SHF_MASKPROC)
5545                 {
5546                   *p = 'p';
5547                   sh_flags &= ~ SHF_MASKPROC;
5548                 }
5549               else
5550                 *p = 'x';
5551               break;
5552             }
5553           p++;
5554         }
5555     }
5556
5557   if (do_section_details)
5558     {
5559       if (os_flags)
5560         {
5561           size -= 5 + field_size;
5562           if (p != buff + field_size + 4)
5563             {
5564               if (size < (2 + 1))
5565                 {
5566                   warn (_("Internal error: not enough buffer room for section flag info"));
5567                   return _("<unknown>");
5568                 }
5569               size -= 2;
5570               *p++ = ',';
5571               *p++ = ' ';
5572             }
5573           sprintf (p, "OS (%*.*lx)", field_size, field_size,
5574                    (unsigned long) os_flags);
5575           p += 5 + field_size;
5576         }
5577       if (proc_flags)
5578         {
5579           size -= 7 + field_size;
5580           if (p != buff + field_size + 4)
5581             {
5582               if (size < (2 + 1))
5583                 {
5584                   warn (_("Internal error: not enough buffer room for section flag info"));
5585                   return _("<unknown>");
5586                 }
5587               size -= 2;
5588               *p++ = ',';
5589               *p++ = ' ';
5590             }
5591           sprintf (p, "PROC (%*.*lx)", field_size, field_size,
5592                    (unsigned long) proc_flags);
5593           p += 7 + field_size;
5594         }
5595       if (unknown_flags)
5596         {
5597           size -= 10 + field_size;
5598           if (p != buff + field_size + 4)
5599             {
5600               if (size < (2 + 1))
5601                 {
5602                   warn (_("Internal error: not enough buffer room for section flag info"));
5603                   return _("<unknown>");
5604                 }
5605               size -= 2;
5606               *p++ = ',';
5607               *p++ = ' ';
5608             }
5609           sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
5610                    (unsigned long) unknown_flags);
5611           p += 10 + field_size;
5612         }
5613     }
5614
5615   *p = '\0';
5616   return buff;
5617 }
5618
5619 static unsigned int
5620 get_compression_header (Elf_Internal_Chdr *chdr, unsigned char *buf)
5621 {
5622   if (is_32bit_elf)
5623     {
5624       Elf32_External_Chdr *echdr = (Elf32_External_Chdr *) buf;
5625
5626       chdr->ch_type = BYTE_GET (echdr->ch_type);
5627       chdr->ch_size = BYTE_GET (echdr->ch_size);
5628       chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5629       return sizeof (*echdr);
5630     }
5631   else
5632     {
5633       Elf64_External_Chdr *echdr = (Elf64_External_Chdr *) buf;
5634
5635       chdr->ch_type = BYTE_GET (echdr->ch_type);
5636       chdr->ch_size = BYTE_GET (echdr->ch_size);
5637       chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5638       return sizeof (*echdr);
5639     }
5640 }
5641
5642 static int
5643 process_section_headers (FILE * file)
5644 {
5645   Elf_Internal_Shdr * section;
5646   unsigned int i;
5647
5648   section_headers = NULL;
5649
5650   if (elf_header.e_shnum == 0)
5651     {
5652       /* PR binutils/12467.  */
5653       if (elf_header.e_shoff != 0)
5654         warn (_("possibly corrupt ELF file header - it has a non-zero"
5655                 " section header offset, but no section headers\n"));
5656       else if (do_sections)
5657         printf (_("\nThere are no sections in this file.\n"));
5658
5659       return 1;
5660     }
5661
5662   if (do_sections && !do_header)
5663     printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
5664             elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
5665
5666   if (is_32bit_elf)
5667     {
5668       if (! get_32bit_section_headers (file, FALSE))
5669         return 0;
5670     }
5671   else if (! get_64bit_section_headers (file, FALSE))
5672     return 0;
5673
5674   /* Read in the string table, so that we have names to display.  */
5675   if (elf_header.e_shstrndx != SHN_UNDEF
5676        && elf_header.e_shstrndx < elf_header.e_shnum)
5677     {
5678       section = section_headers + elf_header.e_shstrndx;
5679
5680       if (section->sh_size != 0)
5681         {
5682           string_table = (char *) get_data (NULL, file, section->sh_offset,
5683                                             1, section->sh_size,
5684                                             _("string table"));
5685
5686           string_table_length = string_table != NULL ? section->sh_size : 0;
5687         }
5688     }
5689
5690   /* Scan the sections for the dynamic symbol table
5691      and dynamic string table and debug sections.  */
5692   dynamic_symbols = NULL;
5693   dynamic_strings = NULL;
5694   dynamic_syminfo = NULL;
5695   symtab_shndx_list = NULL;
5696
5697   eh_addr_size = is_32bit_elf ? 4 : 8;
5698   switch (elf_header.e_machine)
5699     {
5700     case EM_MIPS:
5701     case EM_MIPS_RS3_LE:
5702       /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
5703          FDE addresses.  However, the ABI also has a semi-official ILP32
5704          variant for which the normal FDE address size rules apply.
5705
5706          GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
5707          section, where XX is the size of longs in bits.  Unfortunately,
5708          earlier compilers provided no way of distinguishing ILP32 objects
5709          from LP64 objects, so if there's any doubt, we should assume that
5710          the official LP64 form is being used.  */
5711       if ((elf_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
5712           && find_section (".gcc_compiled_long32") == NULL)
5713         eh_addr_size = 8;
5714       break;
5715
5716     case EM_H8_300:
5717     case EM_H8_300H:
5718       switch (elf_header.e_flags & EF_H8_MACH)
5719         {
5720         case E_H8_MACH_H8300:
5721         case E_H8_MACH_H8300HN:
5722         case E_H8_MACH_H8300SN:
5723         case E_H8_MACH_H8300SXN:
5724           eh_addr_size = 2;
5725           break;
5726         case E_H8_MACH_H8300H:
5727         case E_H8_MACH_H8300S:
5728         case E_H8_MACH_H8300SX:
5729           eh_addr_size = 4;
5730           break;
5731         }
5732       break;
5733
5734     case EM_M32C_OLD:
5735     case EM_M32C:
5736       switch (elf_header.e_flags & EF_M32C_CPU_MASK)
5737         {
5738         case EF_M32C_CPU_M16C:
5739           eh_addr_size = 2;
5740           break;
5741         }
5742       break;
5743     }
5744
5745 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64)                \
5746   do                                                                    \
5747     {                                                                   \
5748       bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64;  \
5749       if (section->sh_entsize != expected_entsize)                      \
5750         {                                                               \
5751           char buf[40];                                                 \
5752           sprintf_vma (buf, section->sh_entsize);                       \
5753           /* Note: coded this way so that there is a single string for  \
5754              translation.  */ \
5755           error (_("Section %d has invalid sh_entsize of %s\n"), i, buf); \
5756           error (_("(Using the expected size of %u for the rest of this dump)\n"), \
5757                    (unsigned) expected_entsize);                        \
5758           section->sh_entsize = expected_entsize;                       \
5759         }                                                               \
5760     }                                                                   \
5761   while (0)
5762
5763 #define CHECK_ENTSIZE(section, i, type)                                 \
5764   CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type),         \
5765                         sizeof (Elf64_External_##type))
5766
5767   for (i = 0, section = section_headers;
5768        i < elf_header.e_shnum;
5769        i++, section++)
5770     {
5771       char * name = SECTION_NAME (section);
5772
5773       if (section->sh_type == SHT_DYNSYM)
5774         {
5775           if (dynamic_symbols != NULL)
5776             {
5777               error (_("File contains multiple dynamic symbol tables\n"));
5778               continue;
5779             }
5780
5781           CHECK_ENTSIZE (section, i, Sym);
5782           dynamic_symbols = GET_ELF_SYMBOLS (file, section, & num_dynamic_syms);
5783         }
5784       else if (section->sh_type == SHT_STRTAB
5785                && streq (name, ".dynstr"))
5786         {
5787           if (dynamic_strings != NULL)
5788             {
5789               error (_("File contains multiple dynamic string tables\n"));
5790               continue;
5791             }
5792
5793           dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
5794                                                1, section->sh_size,
5795                                                _("dynamic strings"));
5796           dynamic_strings_length = dynamic_strings == NULL ? 0 : section->sh_size;
5797         }
5798       else if (section->sh_type == SHT_SYMTAB_SHNDX)
5799         {
5800           elf_section_list * entry = xmalloc (sizeof * entry);
5801           entry->hdr = section;
5802           entry->next = symtab_shndx_list;
5803           symtab_shndx_list = entry;
5804         }
5805       else if (section->sh_type == SHT_SYMTAB)
5806         CHECK_ENTSIZE (section, i, Sym);
5807       else if (section->sh_type == SHT_GROUP)
5808         CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
5809       else if (section->sh_type == SHT_REL)
5810         CHECK_ENTSIZE (section, i, Rel);
5811       else if (section->sh_type == SHT_RELA)
5812         CHECK_ENTSIZE (section, i, Rela);
5813       else if ((do_debugging || do_debug_info || do_debug_abbrevs
5814                 || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
5815                 || do_debug_aranges || do_debug_frames || do_debug_macinfo
5816                 || do_debug_str || do_debug_loc || do_debug_ranges
5817                 || do_debug_addr || do_debug_cu_index)
5818                && (const_strneq (name, ".debug_")
5819                    || const_strneq (name, ".zdebug_")))
5820         {
5821           if (name[1] == 'z')
5822             name += sizeof (".zdebug_") - 1;
5823           else
5824             name += sizeof (".debug_") - 1;
5825
5826           if (do_debugging
5827               || (do_debug_info     && const_strneq (name, "info"))
5828               || (do_debug_info     && const_strneq (name, "types"))
5829               || (do_debug_abbrevs  && const_strneq (name, "abbrev"))
5830               || (do_debug_lines    && strcmp (name, "line") == 0)
5831               || (do_debug_lines    && const_strneq (name, "line."))
5832               || (do_debug_pubnames && const_strneq (name, "pubnames"))
5833               || (do_debug_pubtypes && const_strneq (name, "pubtypes"))
5834               || (do_debug_pubnames && const_strneq (name, "gnu_pubnames"))
5835               || (do_debug_pubtypes && const_strneq (name, "gnu_pubtypes"))
5836               || (do_debug_aranges  && const_strneq (name, "aranges"))
5837               || (do_debug_ranges   && const_strneq (name, "ranges"))
5838               || (do_debug_frames   && const_strneq (name, "frame"))
5839               || (do_debug_macinfo  && const_strneq (name, "macinfo"))
5840               || (do_debug_macinfo  && const_strneq (name, "macro"))
5841               || (do_debug_str      && const_strneq (name, "str"))
5842               || (do_debug_loc      && const_strneq (name, "loc"))
5843               || (do_debug_addr     && const_strneq (name, "addr"))
5844               || (do_debug_cu_index && const_strneq (name, "cu_index"))
5845               || (do_debug_cu_index && const_strneq (name, "tu_index"))
5846               )
5847             request_dump_bynumber (i, DEBUG_DUMP);
5848         }
5849       /* Linkonce section to be combined with .debug_info at link time.  */
5850       else if ((do_debugging || do_debug_info)
5851                && const_strneq (name, ".gnu.linkonce.wi."))
5852         request_dump_bynumber (i, DEBUG_DUMP);
5853       else if (do_debug_frames && streq (name, ".eh_frame"))
5854         request_dump_bynumber (i, DEBUG_DUMP);
5855       else if (do_gdb_index && streq (name, ".gdb_index"))
5856         request_dump_bynumber (i, DEBUG_DUMP);
5857       /* Trace sections for Itanium VMS.  */
5858       else if ((do_debugging || do_trace_info || do_trace_abbrevs
5859                 || do_trace_aranges)
5860                && const_strneq (name, ".trace_"))
5861         {
5862           name += sizeof (".trace_") - 1;
5863
5864           if (do_debugging
5865               || (do_trace_info     && streq (name, "info"))
5866               || (do_trace_abbrevs  && streq (name, "abbrev"))
5867               || (do_trace_aranges  && streq (name, "aranges"))
5868               )
5869             request_dump_bynumber (i, DEBUG_DUMP);
5870         }
5871     }
5872
5873   if (! do_sections)
5874     return 1;
5875
5876   if (elf_header.e_shnum > 1)
5877     printf (_("\nSection Headers:\n"));
5878   else
5879     printf (_("\nSection Header:\n"));
5880
5881   if (is_32bit_elf)
5882     {
5883       if (do_section_details)
5884         {
5885           printf (_("  [Nr] Name\n"));
5886           printf (_("       Type            Addr     Off    Size   ES   Lk Inf Al\n"));
5887         }
5888       else
5889         printf
5890           (_("  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al\n"));
5891     }
5892   else if (do_wide)
5893     {
5894       if (do_section_details)
5895         {
5896           printf (_("  [Nr] Name\n"));
5897           printf (_("       Type            Address          Off    Size   ES   Lk Inf Al\n"));
5898         }
5899       else
5900         printf
5901           (_("  [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al\n"));
5902     }
5903   else
5904     {
5905       if (do_section_details)
5906         {
5907           printf (_("  [Nr] Name\n"));
5908           printf (_("       Type              Address          Offset            Link\n"));
5909           printf (_("       Size              EntSize          Info              Align\n"));
5910         }
5911       else
5912         {
5913           printf (_("  [Nr] Name              Type             Address           Offset\n"));
5914           printf (_("       Size              EntSize          Flags  Link  Info  Align\n"));
5915         }
5916     }
5917
5918   if (do_section_details)
5919     printf (_("       Flags\n"));
5920
5921   for (i = 0, section = section_headers;
5922        i < elf_header.e_shnum;
5923        i++, section++)
5924     {
5925       printf ("  [%2u] ", i);
5926       if (do_section_details)
5927         printf ("%s\n      ", printable_section_name (section));
5928       else
5929         print_symbol (-17, SECTION_NAME (section));
5930
5931       printf (do_wide ? " %-15s " : " %-15.15s ",
5932               get_section_type_name (section->sh_type));
5933
5934       if (is_32bit_elf)
5935         {
5936           const char * link_too_big = NULL;
5937
5938           print_vma (section->sh_addr, LONG_HEX);
5939
5940           printf ( " %6.6lx %6.6lx %2.2lx",
5941                    (unsigned long) section->sh_offset,
5942                    (unsigned long) section->sh_size,
5943                    (unsigned long) section->sh_entsize);
5944
5945           if (do_section_details)
5946             fputs ("  ", stdout);
5947           else
5948             printf (" %3s ", get_elf_section_flags (section->sh_flags));
5949
5950           if (section->sh_link >= elf_header.e_shnum)
5951             {
5952               link_too_big = "";
5953               /* The sh_link value is out of range.  Normally this indicates
5954                  an error but it can have special values in Solaris binaries.  */
5955               switch (elf_header.e_machine)
5956                 {
5957                 case EM_386:
5958                 case EM_IAMCU:
5959                 case EM_X86_64:
5960                 case EM_L1OM:
5961                 case EM_K1OM:
5962                 case EM_OLD_SPARCV9:
5963                 case EM_SPARC32PLUS:
5964                 case EM_SPARCV9:
5965                 case EM_SPARC:
5966                   if (section->sh_link == (SHN_BEFORE & 0xffff))
5967                     link_too_big = "BEFORE";
5968                   else if (section->sh_link == (SHN_AFTER & 0xffff))
5969                     link_too_big = "AFTER";
5970                   break;
5971                 default:
5972                   break;
5973                 }
5974             }
5975
5976           if (do_section_details)
5977             {
5978               if (link_too_big != NULL && * link_too_big)
5979                 printf ("<%s> ", link_too_big);
5980               else
5981                 printf ("%2u ", section->sh_link);
5982               printf ("%3u %2lu\n", section->sh_info,
5983                       (unsigned long) section->sh_addralign);
5984             }
5985           else
5986             printf ("%2u %3u %2lu\n",
5987                     section->sh_link,
5988                     section->sh_info,
5989                     (unsigned long) section->sh_addralign);
5990
5991           if (link_too_big && ! * link_too_big)
5992             warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
5993                   i, section->sh_link);
5994         }
5995       else if (do_wide)
5996         {
5997           print_vma (section->sh_addr, LONG_HEX);
5998
5999           if ((long) section->sh_offset == section->sh_offset)
6000             printf (" %6.6lx", (unsigned long) section->sh_offset);
6001           else
6002             {
6003               putchar (' ');
6004               print_vma (section->sh_offset, LONG_HEX);
6005             }
6006
6007           if ((unsigned long) section->sh_size == section->sh_size)
6008             printf (" %6.6lx", (unsigned long) section->sh_size);
6009           else
6010             {
6011               putchar (' ');
6012               print_vma (section->sh_size, LONG_HEX);
6013             }
6014
6015           if ((unsigned long) section->sh_entsize == section->sh_entsize)
6016             printf (" %2.2lx", (unsigned long) section->sh_entsize);
6017           else
6018             {
6019               putchar (' ');
6020               print_vma (section->sh_entsize, LONG_HEX);
6021             }
6022
6023           if (do_section_details)
6024             fputs ("  ", stdout);
6025           else
6026             printf (" %3s ", get_elf_section_flags (section->sh_flags));
6027
6028           printf ("%2u %3u ", section->sh_link, section->sh_info);
6029
6030           if ((unsigned long) section->sh_addralign == section->sh_addralign)
6031             printf ("%2lu\n", (unsigned long) section->sh_addralign);
6032           else
6033             {
6034               print_vma (section->sh_addralign, DEC);
6035               putchar ('\n');
6036             }
6037         }
6038       else if (do_section_details)
6039         {
6040           printf ("       %-15.15s  ",
6041                   get_section_type_name (section->sh_type));
6042           print_vma (section->sh_addr, LONG_HEX);
6043           if ((long) section->sh_offset == section->sh_offset)
6044             printf ("  %16.16lx", (unsigned long) section->sh_offset);
6045           else
6046             {
6047               printf ("  ");
6048               print_vma (section->sh_offset, LONG_HEX);
6049             }
6050           printf ("  %u\n       ", section->sh_link);
6051           print_vma (section->sh_size, LONG_HEX);
6052           putchar (' ');
6053           print_vma (section->sh_entsize, LONG_HEX);
6054
6055           printf ("  %-16u  %lu\n",
6056                   section->sh_info,
6057                   (unsigned long) section->sh_addralign);
6058         }
6059       else
6060         {
6061           putchar (' ');
6062           print_vma (section->sh_addr, LONG_HEX);
6063           if ((long) section->sh_offset == section->sh_offset)
6064             printf ("  %8.8lx", (unsigned long) section->sh_offset);
6065           else
6066             {
6067               printf ("  ");
6068               print_vma (section->sh_offset, LONG_HEX);
6069             }
6070           printf ("\n       ");
6071           print_vma (section->sh_size, LONG_HEX);
6072           printf ("  ");
6073           print_vma (section->sh_entsize, LONG_HEX);
6074
6075           printf (" %3s ", get_elf_section_flags (section->sh_flags));
6076
6077           printf ("     %2u   %3u     %lu\n",
6078                   section->sh_link,
6079                   section->sh_info,
6080                   (unsigned long) section->sh_addralign);
6081         }
6082
6083       if (do_section_details)
6084         {
6085           printf ("       %s\n", get_elf_section_flags (section->sh_flags));
6086           if ((section->sh_flags & SHF_COMPRESSED) != 0)
6087             {
6088               /* Minimum section size is 12 bytes for 32-bit compression
6089                  header + 12 bytes for compressed data header.  */
6090               unsigned char buf[24];
6091
6092               assert (sizeof (buf) >= sizeof (Elf64_External_Chdr));
6093               if (get_data (&buf, (FILE *) file, section->sh_offset, 1,
6094                             sizeof (buf), _("compression header")))
6095                 {
6096                   Elf_Internal_Chdr chdr;
6097
6098                   (void) get_compression_header (&chdr, buf);
6099
6100                   if (chdr.ch_type == ELFCOMPRESS_ZLIB)
6101                     printf ("       ZLIB, ");
6102                   else
6103                     printf (_("       [<unknown>: 0x%x], "),
6104                             chdr.ch_type);
6105                   print_vma (chdr.ch_size, LONG_HEX);
6106                   printf (", %lu\n", (unsigned long) chdr.ch_addralign);
6107                 }
6108             }
6109         }
6110     }
6111
6112   if (!do_section_details)
6113     {
6114       /* The ordering of the letters shown here matches the ordering of the
6115          corresponding SHF_xxx values, and hence the order in which these
6116          letters will be displayed to the user.  */
6117       printf (_("Key to Flags:\n\
6118   W (write), A (alloc), X (execute), M (merge), S (strings), I (info),\n\
6119   L (link order), O (extra OS processing required), G (group), T (TLS),\n\
6120   C (compressed), x (unknown), o (OS specific), E (exclude),\n  "));
6121       if (elf_header.e_machine == EM_X86_64
6122           || elf_header.e_machine == EM_L1OM
6123           || elf_header.e_machine == EM_K1OM)
6124         printf (_("l (large), "));
6125       else if (elf_header.e_machine == EM_ARM)
6126         printf (_("y (purecode), "));
6127       printf ("p (processor specific)\n");
6128     }
6129
6130   return 1;
6131 }
6132
6133 static const char *
6134 get_group_flags (unsigned int flags)
6135 {
6136   static char buff[32];
6137   switch (flags)
6138     {
6139     case 0:
6140       return "";
6141
6142     case GRP_COMDAT:
6143       return "COMDAT ";
6144
6145    default:
6146       snprintf (buff, sizeof (buff), _("[<unknown>: 0x%x] "), flags);
6147       break;
6148     }
6149   return buff;
6150 }
6151
6152 static int
6153 process_section_groups (FILE * file)
6154 {
6155   Elf_Internal_Shdr * section;
6156   unsigned int i;
6157   struct group * group;
6158   Elf_Internal_Shdr * symtab_sec;
6159   Elf_Internal_Shdr * strtab_sec;
6160   Elf_Internal_Sym * symtab;
6161   unsigned long num_syms;
6162   char * strtab;
6163   size_t strtab_size;
6164
6165   /* Don't process section groups unless needed.  */
6166   if (!do_unwind && !do_section_groups)
6167     return 1;
6168
6169   if (elf_header.e_shnum == 0)
6170     {
6171       if (do_section_groups)
6172         printf (_("\nThere are no sections to group in this file.\n"));
6173
6174       return 1;
6175     }
6176
6177   if (section_headers == NULL)
6178     {
6179       error (_("Section headers are not available!\n"));
6180       /* PR 13622: This can happen with a corrupt ELF header.  */
6181       return 0;
6182     }
6183
6184   section_headers_groups = (struct group **) calloc (elf_header.e_shnum,
6185                                                      sizeof (struct group *));
6186
6187   if (section_headers_groups == NULL)
6188     {
6189       error (_("Out of memory reading %u section group headers\n"),
6190              elf_header.e_shnum);
6191       return 0;
6192     }
6193
6194   /* Scan the sections for the group section.  */
6195   group_count = 0;
6196   for (i = 0, section = section_headers;
6197        i < elf_header.e_shnum;
6198        i++, section++)
6199     if (section->sh_type == SHT_GROUP)
6200       group_count++;
6201
6202   if (group_count == 0)
6203     {
6204       if (do_section_groups)
6205         printf (_("\nThere are no section groups in this file.\n"));
6206
6207       return 1;
6208     }
6209
6210   section_groups = (struct group *) calloc (group_count, sizeof (struct group));
6211
6212   if (section_groups == NULL)
6213     {
6214       error (_("Out of memory reading %lu groups\n"),
6215              (unsigned long) group_count);
6216       return 0;
6217     }
6218
6219   symtab_sec = NULL;
6220   strtab_sec = NULL;
6221   symtab = NULL;
6222   num_syms = 0;
6223   strtab = NULL;
6224   strtab_size = 0;
6225   for (i = 0, section = section_headers, group = section_groups;
6226        i < elf_header.e_shnum;
6227        i++, section++)
6228     {
6229       if (section->sh_type == SHT_GROUP)
6230         {
6231           const char * name = printable_section_name (section);
6232           const char * group_name;
6233           unsigned char * start;
6234           unsigned char * indices;
6235           unsigned int entry, j, size;
6236           Elf_Internal_Shdr * sec;
6237           Elf_Internal_Sym * sym;
6238
6239           /* Get the symbol table.  */
6240           if (section->sh_link >= elf_header.e_shnum
6241               || ((sec = section_headers + section->sh_link)->sh_type
6242                   != SHT_SYMTAB))
6243             {
6244               error (_("Bad sh_link in group section `%s'\n"), name);
6245               continue;
6246             }
6247
6248           if (symtab_sec != sec)
6249             {
6250               symtab_sec = sec;
6251               if (symtab)
6252                 free (symtab);
6253               symtab = GET_ELF_SYMBOLS (file, symtab_sec, & num_syms);
6254             }
6255
6256           if (symtab == NULL)
6257             {
6258               error (_("Corrupt header in group section `%s'\n"), name);
6259               continue;
6260             }
6261
6262           if (section->sh_info >= num_syms)
6263             {
6264               error (_("Bad sh_info in group section `%s'\n"), name);
6265               continue;
6266             }
6267
6268           sym = symtab + section->sh_info;
6269
6270           if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
6271             {
6272               if (sym->st_shndx == 0
6273                   || sym->st_shndx >= elf_header.e_shnum)
6274                 {
6275                   error (_("Bad sh_info in group section `%s'\n"), name);
6276                   continue;
6277                 }
6278
6279               group_name = SECTION_NAME (section_headers + sym->st_shndx);
6280               strtab_sec = NULL;
6281               if (strtab)
6282                 free (strtab);
6283               strtab = NULL;
6284               strtab_size = 0;
6285             }
6286           else
6287             {
6288               /* Get the string table.  */
6289               if (symtab_sec->sh_link >= elf_header.e_shnum)
6290                 {
6291                   strtab_sec = NULL;
6292                   if (strtab)
6293                     free (strtab);
6294                   strtab = NULL;
6295                   strtab_size = 0;
6296                 }
6297               else if (strtab_sec
6298                        != (sec = section_headers + symtab_sec->sh_link))
6299                 {
6300                   strtab_sec = sec;
6301                   if (strtab)
6302                     free (strtab);
6303
6304                   strtab = (char *) get_data (NULL, file, strtab_sec->sh_offset,
6305                                               1, strtab_sec->sh_size,
6306                                               _("string table"));
6307                   strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
6308                 }
6309               group_name = sym->st_name < strtab_size
6310                 ? strtab + sym->st_name : _("<corrupt>");
6311             }
6312
6313           /* PR 17531: file: loop.  */
6314           if (section->sh_entsize > section->sh_size)
6315             {
6316               error (_("Section %s has sh_entsize (0x%lx) which is larger than its size (0x%lx)\n"),
6317                      printable_section_name (section),
6318                      (unsigned long) section->sh_entsize,
6319                      (unsigned long) section->sh_size);
6320               break;
6321             }
6322
6323           start = (unsigned char *) get_data (NULL, file, section->sh_offset,
6324                                               1, section->sh_size,
6325                                               _("section data"));
6326           if (start == NULL)
6327             continue;
6328
6329           indices = start;
6330           size = (section->sh_size / section->sh_entsize) - 1;
6331           entry = byte_get (indices, 4);
6332           indices += 4;
6333
6334           if (do_section_groups)
6335             {
6336               printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
6337                       get_group_flags (entry), i, name, group_name, size);
6338
6339               printf (_("   [Index]    Name\n"));
6340             }
6341
6342           group->group_index = i;
6343
6344           for (j = 0; j < size; j++)
6345             {
6346               struct group_list * g;
6347
6348               entry = byte_get (indices, 4);
6349               indices += 4;
6350
6351               if (entry >= elf_header.e_shnum)
6352                 {
6353                   static unsigned num_group_errors = 0;
6354
6355                   if (num_group_errors ++ < 10)
6356                     {
6357                       error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
6358                              entry, i, elf_header.e_shnum - 1);
6359                       if (num_group_errors == 10)
6360                         warn (_("Futher error messages about overlarge group section indicies suppressed\n"));
6361                     }
6362                   continue;
6363                 }
6364
6365               if (section_headers_groups [entry] != NULL)
6366                 {
6367                   if (entry)
6368                     {
6369                       static unsigned num_errs = 0;
6370
6371                       if (num_errs ++ < 10)
6372                         {
6373                           error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
6374                                  entry, i,
6375                                  section_headers_groups [entry]->group_index);
6376                           if (num_errs == 10)
6377                             warn (_("Further error messages about already contained group sections suppressed\n"));
6378                         }
6379                       continue;
6380                     }
6381                   else
6382                     {
6383                       /* Intel C/C++ compiler may put section 0 in a
6384                          section group. We just warn it the first time
6385                          and ignore it afterwards.  */
6386                       static int warned = 0;
6387                       if (!warned)
6388                         {
6389                           error (_("section 0 in group section [%5u]\n"),
6390                                  section_headers_groups [entry]->group_index);
6391                           warned++;
6392                         }
6393                     }
6394                 }
6395
6396               section_headers_groups [entry] = group;
6397
6398               if (do_section_groups)
6399                 {
6400                   sec = section_headers + entry;
6401                   printf ("   [%5u]   %s\n", entry, printable_section_name (sec));
6402                 }
6403
6404               g = (struct group_list *) xmalloc (sizeof (struct group_list));
6405               g->section_index = entry;
6406               g->next = group->root;
6407               group->root = g;
6408             }
6409
6410           if (start)
6411             free (start);
6412
6413           group++;
6414         }
6415     }
6416
6417   if (symtab)
6418     free (symtab);
6419   if (strtab)
6420     free (strtab);
6421   return 1;
6422 }
6423
6424 /* Data used to display dynamic fixups.  */
6425
6426 struct ia64_vms_dynfixup
6427 {
6428   bfd_vma needed_ident;         /* Library ident number.  */
6429   bfd_vma needed;               /* Index in the dstrtab of the library name.  */
6430   bfd_vma fixup_needed;         /* Index of the library.  */
6431   bfd_vma fixup_rela_cnt;       /* Number of fixups.  */
6432   bfd_vma fixup_rela_off;       /* Fixups offset in the dynamic segment.  */
6433 };
6434
6435 /* Data used to display dynamic relocations.  */
6436
6437 struct ia64_vms_dynimgrela
6438 {
6439   bfd_vma img_rela_cnt;         /* Number of relocations.  */
6440   bfd_vma img_rela_off;         /* Reloc offset in the dynamic segment.  */
6441 };
6442
6443 /* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
6444    library).  */
6445
6446 static void
6447 dump_ia64_vms_dynamic_fixups (FILE *file, struct ia64_vms_dynfixup *fixup,
6448                               const char *strtab, unsigned int strtab_sz)
6449 {
6450   Elf64_External_VMS_IMAGE_FIXUP *imfs;
6451   long i;
6452   const char *lib_name;
6453
6454   imfs = get_data (NULL, file, dynamic_addr + fixup->fixup_rela_off,
6455                    1, fixup->fixup_rela_cnt * sizeof (*imfs),
6456                    _("dynamic section image fixups"));
6457   if (!imfs)
6458     return;
6459
6460   if (fixup->needed < strtab_sz)
6461     lib_name = strtab + fixup->needed;
6462   else
6463     {
6464       warn ("corrupt library name index of 0x%lx found in dynamic entry",
6465             (unsigned long) fixup->needed);
6466       lib_name = "???";
6467     }
6468   printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
6469           (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
6470   printf
6471     (_("Seg Offset           Type                             SymVec DataType\n"));
6472
6473   for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
6474     {
6475       unsigned int type;
6476       const char *rtype;
6477
6478       printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
6479       printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
6480       type = BYTE_GET (imfs [i].type);
6481       rtype = elf_ia64_reloc_type (type);
6482       if (rtype == NULL)
6483         printf (" 0x%08x                       ", type);
6484       else
6485         printf (" %-32s ", rtype);
6486       printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
6487       printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
6488     }
6489
6490   free (imfs);
6491 }
6492
6493 /* Display IA-64 OpenVMS dynamic relocations (used to relocate an image).  */
6494
6495 static void
6496 dump_ia64_vms_dynamic_relocs (FILE *file, struct ia64_vms_dynimgrela *imgrela)
6497 {
6498   Elf64_External_VMS_IMAGE_RELA *imrs;
6499   long i;
6500
6501   imrs = get_data (NULL, file, dynamic_addr + imgrela->img_rela_off,
6502                    1, imgrela->img_rela_cnt * sizeof (*imrs),
6503                    _("dynamic section image relocations"));
6504   if (!imrs)
6505     return;
6506
6507   printf (_("\nImage relocs\n"));
6508   printf
6509     (_("Seg Offset   Type                            Addend            Seg Sym Off\n"));
6510
6511   for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
6512     {
6513       unsigned int type;
6514       const char *rtype;
6515
6516       printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
6517       printf ("%08" BFD_VMA_FMT "x ",
6518               (bfd_vma) BYTE_GET (imrs [i].rela_offset));
6519       type = BYTE_GET (imrs [i].type);
6520       rtype = elf_ia64_reloc_type (type);
6521       if (rtype == NULL)
6522         printf ("0x%08x                      ", type);
6523       else
6524         printf ("%-31s ", rtype);
6525       print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
6526       printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
6527       printf ("%08" BFD_VMA_FMT "x\n",
6528               (bfd_vma) BYTE_GET (imrs [i].sym_offset));
6529     }
6530
6531   free (imrs);
6532 }
6533
6534 /* Display IA-64 OpenVMS dynamic relocations and fixups.  */
6535
6536 static int
6537 process_ia64_vms_dynamic_relocs (FILE *file)
6538 {
6539   struct ia64_vms_dynfixup fixup;
6540   struct ia64_vms_dynimgrela imgrela;
6541   Elf_Internal_Dyn *entry;
6542   int res = 0;
6543   bfd_vma strtab_off = 0;
6544   bfd_vma strtab_sz = 0;
6545   char *strtab = NULL;
6546
6547   memset (&fixup, 0, sizeof (fixup));
6548   memset (&imgrela, 0, sizeof (imgrela));
6549
6550   /* Note: the order of the entries is specified by the OpenVMS specs.  */
6551   for (entry = dynamic_section;
6552        entry < dynamic_section + dynamic_nent;
6553        entry++)
6554     {
6555       switch (entry->d_tag)
6556         {
6557         case DT_IA_64_VMS_STRTAB_OFFSET:
6558           strtab_off = entry->d_un.d_val;
6559           break;
6560         case DT_STRSZ:
6561           strtab_sz = entry->d_un.d_val;
6562           if (strtab == NULL)
6563             strtab = get_data (NULL, file, dynamic_addr + strtab_off,
6564                                1, strtab_sz, _("dynamic string section"));
6565           break;
6566
6567         case DT_IA_64_VMS_NEEDED_IDENT:
6568           fixup.needed_ident = entry->d_un.d_val;
6569           break;
6570         case DT_NEEDED:
6571           fixup.needed = entry->d_un.d_val;
6572           break;
6573         case DT_IA_64_VMS_FIXUP_NEEDED:
6574           fixup.fixup_needed = entry->d_un.d_val;
6575           break;
6576         case DT_IA_64_VMS_FIXUP_RELA_CNT:
6577           fixup.fixup_rela_cnt = entry->d_un.d_val;
6578           break;
6579         case DT_IA_64_VMS_FIXUP_RELA_OFF:
6580           fixup.fixup_rela_off = entry->d_un.d_val;
6581           res++;
6582           dump_ia64_vms_dynamic_fixups (file, &fixup, strtab, strtab_sz);
6583           break;
6584
6585         case DT_IA_64_VMS_IMG_RELA_CNT:
6586           imgrela.img_rela_cnt = entry->d_un.d_val;
6587           break;
6588         case DT_IA_64_VMS_IMG_RELA_OFF:
6589           imgrela.img_rela_off = entry->d_un.d_val;
6590           res++;
6591           dump_ia64_vms_dynamic_relocs (file, &imgrela);
6592           break;
6593
6594         default:
6595           break;
6596         }
6597     }
6598
6599   if (strtab != NULL)
6600     free (strtab);
6601
6602   return res;
6603 }
6604
6605 static struct
6606 {
6607   const char * name;
6608   int reloc;
6609   int size;
6610   int rela;
6611 } dynamic_relocations [] =
6612 {
6613     { "REL", DT_REL, DT_RELSZ, FALSE },
6614     { "RELA", DT_RELA, DT_RELASZ, TRUE },
6615     { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
6616 };
6617
6618 /* Process the reloc section.  */
6619
6620 static int
6621 process_relocs (FILE * file)
6622 {
6623   unsigned long rel_size;
6624   unsigned long rel_offset;
6625
6626
6627   if (!do_reloc)
6628     return 1;
6629
6630   if (do_using_dynamic)
6631     {
6632       int is_rela;
6633       const char * name;
6634       int has_dynamic_reloc;
6635       unsigned int i;
6636
6637       has_dynamic_reloc = 0;
6638
6639       for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
6640         {
6641           is_rela = dynamic_relocations [i].rela;
6642           name = dynamic_relocations [i].name;
6643           rel_size = dynamic_info [dynamic_relocations [i].size];
6644           rel_offset = dynamic_info [dynamic_relocations [i].reloc];
6645
6646           has_dynamic_reloc |= rel_size;
6647
6648           if (is_rela == UNKNOWN)
6649             {
6650               if (dynamic_relocations [i].reloc == DT_JMPREL)
6651                 switch (dynamic_info[DT_PLTREL])
6652                   {
6653                   case DT_REL:
6654                     is_rela = FALSE;
6655                     break;
6656                   case DT_RELA:
6657                     is_rela = TRUE;
6658                     break;
6659                   }
6660             }
6661
6662           if (rel_size)
6663             {
6664               printf
6665                 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
6666                  name, rel_offset, rel_size);
6667
6668               dump_relocations (file,
6669                                 offset_from_vma (file, rel_offset, rel_size),
6670                                 rel_size,
6671                                 dynamic_symbols, num_dynamic_syms,
6672                                 dynamic_strings, dynamic_strings_length,
6673                                 is_rela, 1);
6674             }
6675         }
6676
6677       if (is_ia64_vms ())
6678         has_dynamic_reloc |= process_ia64_vms_dynamic_relocs (file);
6679
6680       if (! has_dynamic_reloc)
6681         printf (_("\nThere are no dynamic relocations in this file.\n"));
6682     }
6683   else
6684     {
6685       Elf_Internal_Shdr * section;
6686       unsigned long i;
6687       int found = 0;
6688
6689       for (i = 0, section = section_headers;
6690            i < elf_header.e_shnum;
6691            i++, section++)
6692         {
6693           if (   section->sh_type != SHT_RELA
6694               && section->sh_type != SHT_REL)
6695             continue;
6696
6697           rel_offset = section->sh_offset;
6698           rel_size   = section->sh_size;
6699
6700           if (rel_size)
6701             {
6702               Elf_Internal_Shdr * strsec;
6703               int is_rela;
6704
6705               printf (_("\nRelocation section "));
6706
6707               if (string_table == NULL)
6708                 printf ("%d", section->sh_name);
6709               else
6710                 printf ("'%s'", printable_section_name (section));
6711
6712               printf (_(" at offset 0x%lx contains %lu entries:\n"),
6713                  rel_offset, (unsigned long) (rel_size / section->sh_entsize));
6714
6715               is_rela = section->sh_type == SHT_RELA;
6716
6717               if (section->sh_link != 0
6718                   && section->sh_link < elf_header.e_shnum)
6719                 {
6720                   Elf_Internal_Shdr * symsec;
6721                   Elf_Internal_Sym *  symtab;
6722                   unsigned long nsyms;
6723                   unsigned long strtablen = 0;
6724                   char * strtab = NULL;
6725
6726                   symsec = section_headers + section->sh_link;
6727                   if (symsec->sh_type != SHT_SYMTAB
6728                       && symsec->sh_type != SHT_DYNSYM)
6729                     continue;
6730
6731                   symtab = GET_ELF_SYMBOLS (file, symsec, & nsyms);
6732
6733                   if (symtab == NULL)
6734                     continue;
6735
6736                   if (symsec->sh_link != 0
6737                       && symsec->sh_link < elf_header.e_shnum)
6738                     {
6739                       strsec = section_headers + symsec->sh_link;
6740
6741                       strtab = (char *) get_data (NULL, file, strsec->sh_offset,
6742                                                   1, strsec->sh_size,
6743                                                   _("string table"));
6744                       strtablen = strtab == NULL ? 0 : strsec->sh_size;
6745                     }
6746
6747                   dump_relocations (file, rel_offset, rel_size,
6748                                     symtab, nsyms, strtab, strtablen,
6749                                     is_rela,
6750                                     symsec->sh_type == SHT_DYNSYM);
6751                   if (strtab)
6752                     free (strtab);
6753                   free (symtab);
6754                 }
6755               else
6756                 dump_relocations (file, rel_offset, rel_size,
6757                                   NULL, 0, NULL, 0, is_rela, 0);
6758
6759               found = 1;
6760             }
6761         }
6762
6763       if (! found)
6764         printf (_("\nThere are no relocations in this file.\n"));
6765     }
6766
6767   return 1;
6768 }
6769
6770 /* An absolute address consists of a section and an offset.  If the
6771    section is NULL, the offset itself is the address, otherwise, the
6772    address equals to LOAD_ADDRESS(section) + offset.  */
6773
6774 struct absaddr
6775 {
6776   unsigned short section;
6777   bfd_vma offset;
6778 };
6779
6780 #define ABSADDR(a) \
6781   ((a).section \
6782    ? section_headers [(a).section].sh_addr + (a).offset \
6783    : (a).offset)
6784
6785 /* Find the nearest symbol at or below ADDR.  Returns the symbol
6786    name, if found, and the offset from the symbol to ADDR.  */
6787
6788 static void
6789 find_symbol_for_address (Elf_Internal_Sym * symtab,
6790                          unsigned long      nsyms,
6791                          const char *       strtab,
6792                          unsigned long      strtab_size,
6793                          struct absaddr     addr,
6794                          const char **      symname,
6795                          bfd_vma *          offset)
6796 {
6797   bfd_vma dist = 0x100000;
6798   Elf_Internal_Sym * sym;
6799   Elf_Internal_Sym * beg;
6800   Elf_Internal_Sym * end;
6801   Elf_Internal_Sym * best = NULL;
6802
6803   REMOVE_ARCH_BITS (addr.offset);
6804   beg = symtab;
6805   end = symtab + nsyms;
6806
6807   while (beg < end)
6808     {
6809       bfd_vma value;
6810
6811       sym = beg + (end - beg) / 2;
6812
6813       value = sym->st_value;
6814       REMOVE_ARCH_BITS (value);
6815
6816       if (sym->st_name != 0
6817           && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
6818           && addr.offset >= value
6819           && addr.offset - value < dist)
6820         {
6821           best = sym;
6822           dist = addr.offset - value;
6823           if (!dist)
6824             break;
6825         }
6826
6827       if (addr.offset < value)
6828         end = sym;
6829       else
6830         beg = sym + 1;
6831     }
6832
6833   if (best)
6834     {
6835       *symname = (best->st_name >= strtab_size
6836                   ? _("<corrupt>") : strtab + best->st_name);
6837       *offset = dist;
6838       return;
6839     }
6840
6841   *symname = NULL;
6842   *offset = addr.offset;
6843 }
6844
6845 static int
6846 symcmp (const void *p, const void *q)
6847 {
6848   Elf_Internal_Sym *sp = (Elf_Internal_Sym *) p;
6849   Elf_Internal_Sym *sq = (Elf_Internal_Sym *) q;
6850
6851   return sp->st_value > sq->st_value ? 1 : (sp->st_value < sq->st_value ? -1 : 0);
6852 }
6853
6854 /* Process the unwind section.  */
6855
6856 #include "unwind-ia64.h"
6857
6858 struct ia64_unw_table_entry
6859 {
6860   struct absaddr start;
6861   struct absaddr end;
6862   struct absaddr info;
6863 };
6864
6865 struct ia64_unw_aux_info
6866 {
6867   struct ia64_unw_table_entry *table;   /* Unwind table.  */
6868   unsigned long table_len;              /* Length of unwind table.  */
6869   unsigned char * info;                 /* Unwind info.  */
6870   unsigned long info_size;              /* Size of unwind info.  */
6871   bfd_vma info_addr;                    /* Starting address of unwind info.  */
6872   bfd_vma seg_base;                     /* Starting address of segment.  */
6873   Elf_Internal_Sym * symtab;            /* The symbol table.  */
6874   unsigned long nsyms;                  /* Number of symbols.  */
6875   Elf_Internal_Sym * funtab;            /* Sorted table of STT_FUNC symbols.  */
6876   unsigned long nfuns;                  /* Number of entries in funtab.  */
6877   char * strtab;                        /* The string table.  */
6878   unsigned long strtab_size;            /* Size of string table.  */
6879 };
6880
6881 static void
6882 dump_ia64_unwind (struct ia64_unw_aux_info * aux)
6883 {
6884   struct ia64_unw_table_entry * tp;
6885   unsigned long j, nfuns;
6886   int in_body;
6887
6888   aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
6889   for (nfuns = 0, j = 0; j < aux->nsyms; j++)
6890     if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
6891       aux->funtab[nfuns++] = aux->symtab[j];
6892   aux->nfuns = nfuns;
6893   qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
6894
6895   for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
6896     {
6897       bfd_vma stamp;
6898       bfd_vma offset;
6899       const unsigned char * dp;
6900       const unsigned char * head;
6901       const unsigned char * end;
6902       const char * procname;
6903
6904       find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
6905                                aux->strtab_size, tp->start, &procname, &offset);
6906
6907       fputs ("\n<", stdout);
6908
6909       if (procname)
6910         {
6911           fputs (procname, stdout);
6912
6913           if (offset)
6914             printf ("+%lx", (unsigned long) offset);
6915         }
6916
6917       fputs (">: [", stdout);
6918       print_vma (tp->start.offset, PREFIX_HEX);
6919       fputc ('-', stdout);
6920       print_vma (tp->end.offset, PREFIX_HEX);
6921       printf ("], info at +0x%lx\n",
6922               (unsigned long) (tp->info.offset - aux->seg_base));
6923
6924       /* PR 17531: file: 86232b32.  */
6925       if (aux->info == NULL)
6926         continue;
6927
6928       /* PR 17531: file: 0997b4d1.  */
6929       if ((ABSADDR (tp->info) - aux->info_addr) >= aux->info_size)
6930         {
6931           warn (_("Invalid offset %lx in table entry %ld\n"),
6932                 (long) tp->info.offset, (long) (tp - aux->table));
6933           continue;
6934         }
6935
6936       head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
6937       stamp = byte_get ((unsigned char *) head, sizeof (stamp));
6938
6939       printf ("  v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
6940               (unsigned) UNW_VER (stamp),
6941               (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
6942               UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
6943               UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
6944               (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
6945
6946       if (UNW_VER (stamp) != 1)
6947         {
6948           printf (_("\tUnknown version.\n"));
6949           continue;
6950         }
6951
6952       in_body = 0;
6953       end = head + 8 + eh_addr_size * UNW_LENGTH (stamp);
6954       /* PR 17531: file: 16ceda89.  */
6955       if (end > aux->info + aux->info_size)
6956         end = aux->info + aux->info_size;
6957       for (dp = head + 8; dp < end;)
6958         dp = unw_decode (dp, in_body, & in_body, end);
6959     }
6960
6961   free (aux->funtab);
6962 }
6963
6964 static bfd_boolean
6965 slurp_ia64_unwind_table (FILE * file,
6966                          struct ia64_unw_aux_info * aux,
6967                          Elf_Internal_Shdr * sec)
6968 {
6969   unsigned long size, nrelas, i;
6970   Elf_Internal_Phdr * seg;
6971   struct ia64_unw_table_entry * tep;
6972   Elf_Internal_Shdr * relsec;
6973   Elf_Internal_Rela * rela;
6974   Elf_Internal_Rela * rp;
6975   unsigned char * table;
6976   unsigned char * tp;
6977   Elf_Internal_Sym * sym;
6978   const char * relname;
6979
6980   aux->table_len = 0;
6981
6982   /* First, find the starting address of the segment that includes
6983      this section: */
6984
6985   if (elf_header.e_phnum)
6986     {
6987       if (! get_program_headers (file))
6988           return FALSE;
6989
6990       for (seg = program_headers;
6991            seg < program_headers + elf_header.e_phnum;
6992            ++seg)
6993         {
6994           if (seg->p_type != PT_LOAD)
6995             continue;
6996
6997           if (sec->sh_addr >= seg->p_vaddr
6998               && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
6999             {
7000               aux->seg_base = seg->p_vaddr;
7001               break;
7002             }
7003         }
7004     }
7005
7006   /* Second, build the unwind table from the contents of the unwind section:  */
7007   size = sec->sh_size;
7008   table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
7009                                       _("unwind table"));
7010   if (!table)
7011     return FALSE;
7012
7013   aux->table_len = size / (3 * eh_addr_size);
7014   aux->table = (struct ia64_unw_table_entry *)
7015     xcmalloc (aux->table_len, sizeof (aux->table[0]));
7016   tep = aux->table;
7017
7018   for (tp = table; tp <= table + size - (3 * eh_addr_size); ++tep)
7019     {
7020       tep->start.section = SHN_UNDEF;
7021       tep->end.section   = SHN_UNDEF;
7022       tep->info.section  = SHN_UNDEF;
7023       tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7024       tep->end.offset   = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7025       tep->info.offset  = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7026       tep->start.offset += aux->seg_base;
7027       tep->end.offset   += aux->seg_base;
7028       tep->info.offset  += aux->seg_base;
7029     }
7030   free (table);
7031
7032   /* Third, apply any relocations to the unwind table:  */
7033   for (relsec = section_headers;
7034        relsec < section_headers + elf_header.e_shnum;
7035        ++relsec)
7036     {
7037       if (relsec->sh_type != SHT_RELA
7038           || relsec->sh_info >= elf_header.e_shnum
7039           || section_headers + relsec->sh_info != sec)
7040         continue;
7041
7042       if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7043                               & rela, & nrelas))
7044         {
7045           free (aux->table);
7046           aux->table = NULL;
7047           aux->table_len = 0;
7048           return FALSE;
7049         }
7050
7051       for (rp = rela; rp < rela + nrelas; ++rp)
7052         {
7053           relname = elf_ia64_reloc_type (get_reloc_type (rp->r_info));
7054           sym = aux->symtab + get_reloc_symindex (rp->r_info);
7055
7056           /* PR 17531: file: 9fa67536.  */
7057           if (relname == NULL)
7058             {
7059               warn (_("Skipping unknown relocation type: %u\n"), get_reloc_type (rp->r_info));
7060               continue;
7061             }
7062
7063           if (! const_strneq (relname, "R_IA64_SEGREL"))
7064             {
7065               warn (_("Skipping unexpected relocation type: %s\n"), relname);
7066               continue;
7067             }
7068
7069           i = rp->r_offset / (3 * eh_addr_size);
7070
7071           /* PR 17531: file: 5bc8d9bf.  */
7072           if (i >= aux->table_len)
7073             {
7074               warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
7075               continue;
7076             }
7077
7078           switch (rp->r_offset / eh_addr_size % 3)
7079             {
7080             case 0:
7081               aux->table[i].start.section = sym->st_shndx;
7082               aux->table[i].start.offset  = rp->r_addend + sym->st_value;
7083               break;
7084             case 1:
7085               aux->table[i].end.section   = sym->st_shndx;
7086               aux->table[i].end.offset    = rp->r_addend + sym->st_value;
7087               break;
7088             case 2:
7089               aux->table[i].info.section  = sym->st_shndx;
7090               aux->table[i].info.offset   = rp->r_addend + sym->st_value;
7091               break;
7092             default:
7093               break;
7094             }
7095         }
7096
7097       free (rela);
7098     }
7099
7100   return TRUE;
7101 }
7102
7103 static void
7104 ia64_process_unwind (FILE * file)
7105 {
7106   Elf_Internal_Shdr * sec;
7107   Elf_Internal_Shdr * unwsec = NULL;
7108   Elf_Internal_Shdr * strsec;
7109   unsigned long i, unwcount = 0, unwstart = 0;
7110   struct ia64_unw_aux_info aux;
7111
7112   memset (& aux, 0, sizeof (aux));
7113
7114   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7115     {
7116       if (sec->sh_type == SHT_SYMTAB
7117           && sec->sh_link < elf_header.e_shnum)
7118         {
7119           aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
7120
7121           strsec = section_headers + sec->sh_link;
7122           if (aux.strtab != NULL)
7123             {
7124               error (_("Multiple auxillary string tables encountered\n"));
7125               free (aux.strtab);
7126             }
7127           aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
7128                                           1, strsec->sh_size,
7129                                           _("string table"));
7130           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7131         }
7132       else if (sec->sh_type == SHT_IA_64_UNWIND)
7133         unwcount++;
7134     }
7135
7136   if (!unwcount)
7137     printf (_("\nThere are no unwind sections in this file.\n"));
7138
7139   while (unwcount-- > 0)
7140     {
7141       char * suffix;
7142       size_t len, len2;
7143
7144       for (i = unwstart, sec = section_headers + unwstart, unwsec = NULL;
7145            i < elf_header.e_shnum; ++i, ++sec)
7146         if (sec->sh_type == SHT_IA_64_UNWIND)
7147           {
7148             unwsec = sec;
7149             break;
7150           }
7151       /* We have already counted the number of SHT_IA64_UNWIND
7152          sections so the loop above should never fail.  */
7153       assert (unwsec != NULL);
7154
7155       unwstart = i + 1;
7156       len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
7157
7158       if ((unwsec->sh_flags & SHF_GROUP) != 0)
7159         {
7160           /* We need to find which section group it is in.  */
7161           struct group_list * g;
7162
7163           if (section_headers_groups == NULL
7164               || section_headers_groups [i] == NULL)
7165             i = elf_header.e_shnum;
7166           else
7167             {
7168               g = section_headers_groups [i]->root;
7169
7170               for (; g != NULL; g = g->next)
7171                 {
7172                   sec = section_headers + g->section_index;
7173
7174                   if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
7175                     break;
7176                 }
7177
7178               if (g == NULL)
7179                 i = elf_header.e_shnum;
7180             }
7181         }
7182       else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
7183         {
7184           /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO.  */
7185           len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
7186           suffix = SECTION_NAME (unwsec) + len;
7187           for (i = 0, sec = section_headers; i < elf_header.e_shnum;
7188                ++i, ++sec)
7189             if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
7190                 && streq (SECTION_NAME (sec) + len2, suffix))
7191               break;
7192         }
7193       else
7194         {
7195           /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
7196              .IA_64.unwind or BAR -> .IA_64.unwind_info.  */
7197           len = sizeof (ELF_STRING_ia64_unwind) - 1;
7198           len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
7199           suffix = "";
7200           if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
7201             suffix = SECTION_NAME (unwsec) + len;
7202           for (i = 0, sec = section_headers; i < elf_header.e_shnum;
7203                ++i, ++sec)
7204             if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
7205                 && streq (SECTION_NAME (sec) + len2, suffix))
7206               break;
7207         }
7208
7209       if (i == elf_header.e_shnum)
7210         {
7211           printf (_("\nCould not find unwind info section for "));
7212
7213           if (string_table == NULL)
7214             printf ("%d", unwsec->sh_name);
7215           else
7216             printf ("'%s'", printable_section_name (unwsec));
7217         }
7218       else
7219         {
7220           aux.info_addr = sec->sh_addr;
7221           aux.info = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1,
7222                                                  sec->sh_size,
7223                                                  _("unwind info"));
7224           aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
7225
7226           printf (_("\nUnwind section "));
7227
7228           if (string_table == NULL)
7229             printf ("%d", unwsec->sh_name);
7230           else
7231             printf ("'%s'", printable_section_name (unwsec));
7232
7233           printf (_(" at offset 0x%lx contains %lu entries:\n"),
7234                   (unsigned long) unwsec->sh_offset,
7235                   (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
7236
7237           if (slurp_ia64_unwind_table (file, & aux, unwsec)
7238               && aux.table_len > 0)
7239             dump_ia64_unwind (& aux);
7240
7241           if (aux.table)
7242             free ((char *) aux.table);
7243           if (aux.info)
7244             free ((char *) aux.info);
7245           aux.table = NULL;
7246           aux.info = NULL;
7247         }
7248     }
7249
7250   if (aux.symtab)
7251     free (aux.symtab);
7252   if (aux.strtab)
7253     free ((char *) aux.strtab);
7254 }
7255
7256 struct hppa_unw_table_entry
7257   {
7258     struct absaddr start;
7259     struct absaddr end;
7260     unsigned int Cannot_unwind:1;               /* 0 */
7261     unsigned int Millicode:1;                   /* 1 */
7262     unsigned int Millicode_save_sr0:1;          /* 2 */
7263     unsigned int Region_description:2;          /* 3..4 */
7264     unsigned int reserved1:1;                   /* 5 */
7265     unsigned int Entry_SR:1;                    /* 6 */
7266     unsigned int Entry_FR:4;     /* number saved */     /* 7..10 */
7267     unsigned int Entry_GR:5;     /* number saved */     /* 11..15 */
7268     unsigned int Args_stored:1;                 /* 16 */
7269     unsigned int Variable_Frame:1;              /* 17 */
7270     unsigned int Separate_Package_Body:1;       /* 18 */
7271     unsigned int Frame_Extension_Millicode:1;   /* 19 */
7272     unsigned int Stack_Overflow_Check:1;        /* 20 */
7273     unsigned int Two_Instruction_SP_Increment:1;/* 21 */
7274     unsigned int Ada_Region:1;                  /* 22 */
7275     unsigned int cxx_info:1;                    /* 23 */
7276     unsigned int cxx_try_catch:1;               /* 24 */
7277     unsigned int sched_entry_seq:1;             /* 25 */
7278     unsigned int reserved2:1;                   /* 26 */
7279     unsigned int Save_SP:1;                     /* 27 */
7280     unsigned int Save_RP:1;                     /* 28 */
7281     unsigned int Save_MRP_in_frame:1;           /* 29 */
7282     unsigned int extn_ptr_defined:1;            /* 30 */
7283     unsigned int Cleanup_defined:1;             /* 31 */
7284
7285     unsigned int MPE_XL_interrupt_marker:1;     /* 0 */
7286     unsigned int HP_UX_interrupt_marker:1;      /* 1 */
7287     unsigned int Large_frame:1;                 /* 2 */
7288     unsigned int Pseudo_SP_Set:1;               /* 3 */
7289     unsigned int reserved4:1;                   /* 4 */
7290     unsigned int Total_frame_size:27;           /* 5..31 */
7291   };
7292
7293 struct hppa_unw_aux_info
7294 {
7295   struct hppa_unw_table_entry * table;  /* Unwind table.  */
7296   unsigned long table_len;              /* Length of unwind table.  */
7297   bfd_vma seg_base;                     /* Starting address of segment.  */
7298   Elf_Internal_Sym * symtab;            /* The symbol table.  */
7299   unsigned long nsyms;                  /* Number of symbols.  */
7300   Elf_Internal_Sym * funtab;            /* Sorted table of STT_FUNC symbols.  */
7301   unsigned long nfuns;                  /* Number of entries in funtab.  */
7302   char * strtab;                        /* The string table.  */
7303   unsigned long strtab_size;            /* Size of string table.  */
7304 };
7305
7306 static void
7307 dump_hppa_unwind (struct hppa_unw_aux_info * aux)
7308 {
7309   struct hppa_unw_table_entry * tp;
7310   unsigned long j, nfuns;
7311
7312   aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7313   for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7314     if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7315       aux->funtab[nfuns++] = aux->symtab[j];
7316   aux->nfuns = nfuns;
7317   qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7318
7319   for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7320     {
7321       bfd_vma offset;
7322       const char * procname;
7323
7324       find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
7325                                aux->strtab_size, tp->start, &procname,
7326                                &offset);
7327
7328       fputs ("\n<", stdout);
7329
7330       if (procname)
7331         {
7332           fputs (procname, stdout);
7333
7334           if (offset)
7335             printf ("+%lx", (unsigned long) offset);
7336         }
7337
7338       fputs (">: [", stdout);
7339       print_vma (tp->start.offset, PREFIX_HEX);
7340       fputc ('-', stdout);
7341       print_vma (tp->end.offset, PREFIX_HEX);
7342       printf ("]\n\t");
7343
7344 #define PF(_m) if (tp->_m) printf (#_m " ");
7345 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
7346       PF(Cannot_unwind);
7347       PF(Millicode);
7348       PF(Millicode_save_sr0);
7349       /* PV(Region_description);  */
7350       PF(Entry_SR);
7351       PV(Entry_FR);
7352       PV(Entry_GR);
7353       PF(Args_stored);
7354       PF(Variable_Frame);
7355       PF(Separate_Package_Body);
7356       PF(Frame_Extension_Millicode);
7357       PF(Stack_Overflow_Check);
7358       PF(Two_Instruction_SP_Increment);
7359       PF(Ada_Region);
7360       PF(cxx_info);
7361       PF(cxx_try_catch);
7362       PF(sched_entry_seq);
7363       PF(Save_SP);
7364       PF(Save_RP);
7365       PF(Save_MRP_in_frame);
7366       PF(extn_ptr_defined);
7367       PF(Cleanup_defined);
7368       PF(MPE_XL_interrupt_marker);
7369       PF(HP_UX_interrupt_marker);
7370       PF(Large_frame);
7371       PF(Pseudo_SP_Set);
7372       PV(Total_frame_size);
7373 #undef PF
7374 #undef PV
7375     }
7376
7377   printf ("\n");
7378
7379   free (aux->funtab);
7380 }
7381
7382 static int
7383 slurp_hppa_unwind_table (FILE * file,
7384                          struct hppa_unw_aux_info * aux,
7385                          Elf_Internal_Shdr * sec)
7386 {
7387   unsigned long size, unw_ent_size, nentries, nrelas, i;
7388   Elf_Internal_Phdr * seg;
7389   struct hppa_unw_table_entry * tep;
7390   Elf_Internal_Shdr * relsec;
7391   Elf_Internal_Rela * rela;
7392   Elf_Internal_Rela * rp;
7393   unsigned char * table;
7394   unsigned char * tp;
7395   Elf_Internal_Sym * sym;
7396   const char * relname;
7397
7398   /* First, find the starting address of the segment that includes
7399      this section.  */
7400
7401   if (elf_header.e_phnum)
7402     {
7403       if (! get_program_headers (file))
7404         return 0;
7405
7406       for (seg = program_headers;
7407            seg < program_headers + elf_header.e_phnum;
7408            ++seg)
7409         {
7410           if (seg->p_type != PT_LOAD)
7411             continue;
7412
7413           if (sec->sh_addr >= seg->p_vaddr
7414               && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7415             {
7416               aux->seg_base = seg->p_vaddr;
7417               break;
7418             }
7419         }
7420     }
7421
7422   /* Second, build the unwind table from the contents of the unwind
7423      section.  */
7424   size = sec->sh_size;
7425   table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
7426                                       _("unwind table"));
7427   if (!table)
7428     return 0;
7429
7430   unw_ent_size = 16;
7431   nentries = size / unw_ent_size;
7432   size = unw_ent_size * nentries;
7433
7434   tep = aux->table = (struct hppa_unw_table_entry *)
7435       xcmalloc (nentries, sizeof (aux->table[0]));
7436
7437   for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
7438     {
7439       unsigned int tmp1, tmp2;
7440
7441       tep->start.section = SHN_UNDEF;
7442       tep->end.section   = SHN_UNDEF;
7443
7444       tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
7445       tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
7446       tmp1 = byte_get ((unsigned char *) tp + 8, 4);
7447       tmp2 = byte_get ((unsigned char *) tp + 12, 4);
7448
7449       tep->start.offset += aux->seg_base;
7450       tep->end.offset   += aux->seg_base;
7451
7452       tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
7453       tep->Millicode = (tmp1 >> 30) & 0x1;
7454       tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
7455       tep->Region_description = (tmp1 >> 27) & 0x3;
7456       tep->reserved1 = (tmp1 >> 26) & 0x1;
7457       tep->Entry_SR = (tmp1 >> 25) & 0x1;
7458       tep->Entry_FR = (tmp1 >> 21) & 0xf;
7459       tep->Entry_GR = (tmp1 >> 16) & 0x1f;
7460       tep->Args_stored = (tmp1 >> 15) & 0x1;
7461       tep->Variable_Frame = (tmp1 >> 14) & 0x1;
7462       tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
7463       tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
7464       tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
7465       tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
7466       tep->Ada_Region = (tmp1 >> 9) & 0x1;
7467       tep->cxx_info = (tmp1 >> 8) & 0x1;
7468       tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
7469       tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
7470       tep->reserved2 = (tmp1 >> 5) & 0x1;
7471       tep->Save_SP = (tmp1 >> 4) & 0x1;
7472       tep->Save_RP = (tmp1 >> 3) & 0x1;
7473       tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
7474       tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
7475       tep->Cleanup_defined = tmp1 & 0x1;
7476
7477       tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
7478       tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
7479       tep->Large_frame = (tmp2 >> 29) & 0x1;
7480       tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
7481       tep->reserved4 = (tmp2 >> 27) & 0x1;
7482       tep->Total_frame_size = tmp2 & 0x7ffffff;
7483     }
7484   free (table);
7485
7486   /* Third, apply any relocations to the unwind table.  */
7487   for (relsec = section_headers;
7488        relsec < section_headers + elf_header.e_shnum;
7489        ++relsec)
7490     {
7491       if (relsec->sh_type != SHT_RELA
7492           || relsec->sh_info >= elf_header.e_shnum
7493           || section_headers + relsec->sh_info != sec)
7494         continue;
7495
7496       if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7497                               & rela, & nrelas))
7498         return 0;
7499
7500       for (rp = rela; rp < rela + nrelas; ++rp)
7501         {
7502           relname = elf_hppa_reloc_type (get_reloc_type (rp->r_info));
7503           sym = aux->symtab + get_reloc_symindex (rp->r_info);
7504
7505           /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64.  */
7506           if (! const_strneq (relname, "R_PARISC_SEGREL"))
7507             {
7508               warn (_("Skipping unexpected relocation type %s\n"), relname);
7509               continue;
7510             }
7511
7512           i = rp->r_offset / unw_ent_size;
7513
7514           switch ((rp->r_offset % unw_ent_size) / eh_addr_size)
7515             {
7516             case 0:
7517               aux->table[i].start.section = sym->st_shndx;
7518               aux->table[i].start.offset  = sym->st_value + rp->r_addend;
7519               break;
7520             case 1:
7521               aux->table[i].end.section   = sym->st_shndx;
7522               aux->table[i].end.offset    = sym->st_value + rp->r_addend;
7523               break;
7524             default:
7525               break;
7526             }
7527         }
7528
7529       free (rela);
7530     }
7531
7532   aux->table_len = nentries;
7533
7534   return 1;
7535 }
7536
7537 static void
7538 hppa_process_unwind (FILE * file)
7539 {
7540   struct hppa_unw_aux_info aux;
7541   Elf_Internal_Shdr * unwsec = NULL;
7542   Elf_Internal_Shdr * strsec;
7543   Elf_Internal_Shdr * sec;
7544   unsigned long i;
7545
7546   if (string_table == NULL)
7547     return;
7548
7549   memset (& aux, 0, sizeof (aux));
7550
7551   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7552     {
7553       if (sec->sh_type == SHT_SYMTAB
7554           && sec->sh_link < elf_header.e_shnum)
7555         {
7556           aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
7557
7558           strsec = section_headers + sec->sh_link;
7559           if (aux.strtab != NULL)
7560             {
7561               error (_("Multiple auxillary string tables encountered\n"));
7562               free (aux.strtab);
7563             }
7564           aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
7565                                           1, strsec->sh_size,
7566                                           _("string table"));
7567           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7568         }
7569       else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
7570         unwsec = sec;
7571     }
7572
7573   if (!unwsec)
7574     printf (_("\nThere are no unwind sections in this file.\n"));
7575
7576   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7577     {
7578       if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
7579         {
7580           printf (_("\nUnwind section '%s' at offset 0x%lx contains %lu entries:\n"),
7581                   printable_section_name (sec),
7582                   (unsigned long) sec->sh_offset,
7583                   (unsigned long) (sec->sh_size / (2 * eh_addr_size + 8)));
7584
7585           slurp_hppa_unwind_table (file, &aux, sec);
7586           if (aux.table_len > 0)
7587             dump_hppa_unwind (&aux);
7588
7589           if (aux.table)
7590             free ((char *) aux.table);
7591           aux.table = NULL;
7592         }
7593     }
7594
7595   if (aux.symtab)
7596     free (aux.symtab);
7597   if (aux.strtab)
7598     free ((char *) aux.strtab);
7599 }
7600
7601 struct arm_section
7602 {
7603   unsigned char *      data;            /* The unwind data.  */
7604   Elf_Internal_Shdr *  sec;             /* The cached unwind section header.  */
7605   Elf_Internal_Rela *  rela;            /* The cached relocations for this section.  */
7606   unsigned long        nrelas;          /* The number of relocations.  */
7607   unsigned int         rel_type;        /* REL or RELA ?  */
7608   Elf_Internal_Rela *  next_rela;       /* Cyclic pointer to the next reloc to process.  */
7609 };
7610
7611 struct arm_unw_aux_info
7612 {
7613   FILE *              file;             /* The file containing the unwind sections.  */
7614   Elf_Internal_Sym *  symtab;           /* The file's symbol table.  */
7615   unsigned long       nsyms;            /* Number of symbols.  */
7616   Elf_Internal_Sym *  funtab;           /* Sorted table of STT_FUNC symbols.  */
7617   unsigned long       nfuns;            /* Number of these symbols.  */
7618   char *              strtab;           /* The file's string table.  */
7619   unsigned long       strtab_size;      /* Size of string table.  */
7620 };
7621
7622 static const char *
7623 arm_print_vma_and_name (struct arm_unw_aux_info *aux,
7624                         bfd_vma fn, struct absaddr addr)
7625 {
7626   const char *procname;
7627   bfd_vma sym_offset;
7628
7629   if (addr.section == SHN_UNDEF)
7630     addr.offset = fn;
7631
7632   find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
7633                            aux->strtab_size, addr, &procname,
7634                            &sym_offset);
7635
7636   print_vma (fn, PREFIX_HEX);
7637
7638   if (procname)
7639     {
7640       fputs (" <", stdout);
7641       fputs (procname, stdout);
7642
7643       if (sym_offset)
7644         printf ("+0x%lx", (unsigned long) sym_offset);
7645       fputc ('>', stdout);
7646     }
7647
7648   return procname;
7649 }
7650
7651 static void
7652 arm_free_section (struct arm_section *arm_sec)
7653 {
7654   if (arm_sec->data != NULL)
7655     free (arm_sec->data);
7656
7657   if (arm_sec->rela != NULL)
7658     free (arm_sec->rela);
7659 }
7660
7661 /* 1) If SEC does not match the one cached in ARM_SEC, then free the current
7662       cached section and install SEC instead.
7663    2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
7664       and return its valued in * WORDP, relocating if necessary.
7665    3) Update the NEXT_RELA field in ARM_SEC and store the section index and
7666       relocation's offset in ADDR.
7667    4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
7668       into the string table of the symbol associated with the reloc.  If no
7669       reloc was applied store -1 there.
7670    5) Return TRUE upon success, FALSE otherwise.  */
7671
7672 static bfd_boolean
7673 get_unwind_section_word (struct arm_unw_aux_info *  aux,
7674                          struct arm_section *       arm_sec,
7675                          Elf_Internal_Shdr *        sec,
7676                          bfd_vma                    word_offset,
7677                          unsigned int *             wordp,
7678                          struct absaddr *           addr,
7679                          bfd_vma *                  sym_name)
7680 {
7681   Elf_Internal_Rela *rp;
7682   Elf_Internal_Sym *sym;
7683   const char * relname;
7684   unsigned int word;
7685   bfd_boolean wrapped;
7686
7687   if (sec == NULL || arm_sec == NULL)
7688     return FALSE;
7689
7690   addr->section = SHN_UNDEF;
7691   addr->offset = 0;
7692
7693   if (sym_name != NULL)
7694     *sym_name = (bfd_vma) -1;
7695
7696   /* If necessary, update the section cache.  */
7697   if (sec != arm_sec->sec)
7698     {
7699       Elf_Internal_Shdr *relsec;
7700
7701       arm_free_section (arm_sec);
7702
7703       arm_sec->sec = sec;
7704       arm_sec->data = get_data (NULL, aux->file, sec->sh_offset, 1,
7705                                 sec->sh_size, _("unwind data"));
7706       arm_sec->rela = NULL;
7707       arm_sec->nrelas = 0;
7708
7709       for (relsec = section_headers;
7710            relsec < section_headers + elf_header.e_shnum;
7711            ++relsec)
7712         {
7713           if (relsec->sh_info >= elf_header.e_shnum
7714               || section_headers + relsec->sh_info != sec
7715               /* PR 15745: Check the section type as well.  */
7716               || (relsec->sh_type != SHT_REL
7717                   && relsec->sh_type != SHT_RELA))
7718             continue;
7719
7720           arm_sec->rel_type = relsec->sh_type;
7721           if (relsec->sh_type == SHT_REL)
7722             {
7723               if (!slurp_rel_relocs (aux->file, relsec->sh_offset,
7724                                      relsec->sh_size,
7725                                      & arm_sec->rela, & arm_sec->nrelas))
7726                 return FALSE;
7727             }
7728           else /* relsec->sh_type == SHT_RELA */
7729             {
7730               if (!slurp_rela_relocs (aux->file, relsec->sh_offset,
7731                                       relsec->sh_size,
7732                                       & arm_sec->rela, & arm_sec->nrelas))
7733                 return FALSE;
7734             }
7735           break;
7736         }
7737
7738       arm_sec->next_rela = arm_sec->rela;
7739     }
7740
7741   /* If there is no unwind data we can do nothing.  */
7742   if (arm_sec->data == NULL)
7743     return FALSE;
7744
7745   /* If the offset is invalid then fail.  */
7746   if (word_offset > (sec->sh_size - 4)
7747       /* PR 18879 */
7748       || (sec->sh_size < 5 && word_offset >= sec->sh_size)
7749       || ((bfd_signed_vma) word_offset) < 0)
7750     return FALSE;
7751
7752   /* Get the word at the required offset.  */
7753   word = byte_get (arm_sec->data + word_offset, 4);
7754
7755   /* PR 17531: file: id:000001,src:001266+003044,op:splice,rep:128.  */
7756   if (arm_sec->rela == NULL)
7757     {
7758       * wordp = word;
7759       return TRUE;
7760     }
7761
7762   /* Look through the relocs to find the one that applies to the provided offset.  */
7763   wrapped = FALSE;
7764   for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
7765     {
7766       bfd_vma prelval, offset;
7767
7768       if (rp->r_offset > word_offset && !wrapped)
7769         {
7770           rp = arm_sec->rela;
7771           wrapped = TRUE;
7772         }
7773       if (rp->r_offset > word_offset)
7774         break;
7775
7776       if (rp->r_offset & 3)
7777         {
7778           warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
7779                 (unsigned long) rp->r_offset);
7780           continue;
7781         }
7782
7783       if (rp->r_offset < word_offset)
7784         continue;
7785
7786       /* PR 17531: file: 027-161405-0.004  */
7787       if (aux->symtab == NULL)
7788         continue;
7789
7790       if (arm_sec->rel_type == SHT_REL)
7791         {
7792           offset = word & 0x7fffffff;
7793           if (offset & 0x40000000)
7794             offset |= ~ (bfd_vma) 0x7fffffff;
7795         }
7796       else if (arm_sec->rel_type == SHT_RELA)
7797         offset = rp->r_addend;
7798       else
7799         {
7800           error (_("Unknown section relocation type %d encountered\n"),
7801                  arm_sec->rel_type);
7802           break;
7803         }
7804
7805       /* PR 17531 file: 027-1241568-0.004.  */
7806       if (ELF32_R_SYM (rp->r_info) >= aux->nsyms)
7807         {
7808           error (_("Bad symbol index in unwind relocation (%lu > %lu)\n"),
7809                  (unsigned long) ELF32_R_SYM (rp->r_info), aux->nsyms);
7810           break;
7811         }
7812
7813       sym = aux->symtab + ELF32_R_SYM (rp->r_info);
7814       offset += sym->st_value;
7815       prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
7816
7817       /* Check that we are processing the expected reloc type.  */
7818       if (elf_header.e_machine == EM_ARM)
7819         {
7820           relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
7821           if (relname == NULL)
7822             {
7823               warn (_("Skipping unknown ARM relocation type: %d\n"),
7824                     (int) ELF32_R_TYPE (rp->r_info));
7825               continue;
7826             }
7827
7828           if (streq (relname, "R_ARM_NONE"))
7829               continue;
7830
7831           if (! streq (relname, "R_ARM_PREL31"))
7832             {
7833               warn (_("Skipping unexpected ARM relocation type %s\n"), relname);
7834               continue;
7835             }
7836         }
7837       else if (elf_header.e_machine == EM_TI_C6000)
7838         {
7839           relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
7840           if (relname == NULL)
7841             {
7842               warn (_("Skipping unknown C6000 relocation type: %d\n"),
7843                     (int) ELF32_R_TYPE (rp->r_info));
7844               continue;
7845             }
7846
7847           if (streq (relname, "R_C6000_NONE"))
7848             continue;
7849
7850           if (! streq (relname, "R_C6000_PREL31"))
7851             {
7852               warn (_("Skipping unexpected C6000 relocation type %s\n"), relname);
7853               continue;
7854             }
7855
7856           prelval >>= 1;
7857         }
7858       else
7859         {
7860           /* This function currently only supports ARM and TI unwinders.  */
7861           warn (_("Only TI and ARM unwinders are currently supported\n"));
7862           break;
7863         }
7864
7865       word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
7866       addr->section = sym->st_shndx;
7867       addr->offset = offset;
7868
7869       if (sym_name)
7870         * sym_name = sym->st_name;
7871       break;
7872     }
7873
7874   *wordp = word;
7875   arm_sec->next_rela = rp;
7876
7877   return TRUE;
7878 }
7879
7880 static const char *tic6x_unwind_regnames[16] =
7881 {
7882   "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
7883   "A14", "A13", "A12", "A11", "A10",
7884   "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
7885 };
7886
7887 static void
7888 decode_tic6x_unwind_regmask (unsigned int mask)
7889 {
7890   int i;
7891
7892   for (i = 12; mask; mask >>= 1, i--)
7893     {
7894       if (mask & 1)
7895         {
7896           fputs (tic6x_unwind_regnames[i], stdout);
7897           if (mask > 1)
7898             fputs (", ", stdout);
7899         }
7900     }
7901 }
7902
7903 #define ADVANCE                                                 \
7904   if (remaining == 0 && more_words)                             \
7905     {                                                           \
7906       data_offset += 4;                                         \
7907       if (! get_unwind_section_word (aux, data_arm_sec, data_sec,       \
7908                                      data_offset, & word, & addr, NULL))        \
7909         return;                                                 \
7910       remaining = 4;                                            \
7911       more_words--;                                             \
7912     }                                                           \
7913
7914 #define GET_OP(OP)                      \
7915   ADVANCE;                              \
7916   if (remaining)                        \
7917     {                                   \
7918       remaining--;                      \
7919       (OP) = word >> 24;                \
7920       word <<= 8;                       \
7921     }                                   \
7922   else                                  \
7923     {                                   \
7924       printf (_("[Truncated opcode]\n"));       \
7925       return;                           \
7926     }                                   \
7927   printf ("0x%02x ", OP)
7928
7929 static void
7930 decode_arm_unwind_bytecode (struct arm_unw_aux_info *  aux,
7931                             unsigned int               word,
7932                             unsigned int               remaining,
7933                             unsigned int               more_words,
7934                             bfd_vma                    data_offset,
7935                             Elf_Internal_Shdr *        data_sec,
7936                             struct arm_section *       data_arm_sec)
7937 {
7938   struct absaddr addr;
7939
7940   /* Decode the unwinding instructions.  */
7941   while (1)
7942     {
7943       unsigned int op, op2;
7944
7945       ADVANCE;
7946       if (remaining == 0)
7947         break;
7948       remaining--;
7949       op = word >> 24;
7950       word <<= 8;
7951
7952       printf ("  0x%02x ", op);
7953
7954       if ((op & 0xc0) == 0x00)
7955         {
7956           int offset = ((op & 0x3f) << 2) + 4;
7957
7958           printf ("     vsp = vsp + %d", offset);
7959         }
7960       else if ((op & 0xc0) == 0x40)
7961         {
7962           int offset = ((op & 0x3f) << 2) + 4;
7963
7964           printf ("     vsp = vsp - %d", offset);
7965         }
7966       else if ((op & 0xf0) == 0x80)
7967         {
7968           GET_OP (op2);
7969           if (op == 0x80 && op2 == 0)
7970             printf (_("Refuse to unwind"));
7971           else
7972             {
7973               unsigned int mask = ((op & 0x0f) << 8) | op2;
7974               int first = 1;
7975               int i;
7976
7977               printf ("pop {");
7978               for (i = 0; i < 12; i++)
7979                 if (mask & (1 << i))
7980                   {
7981                     if (first)
7982                       first = 0;
7983                     else
7984                       printf (", ");
7985                     printf ("r%d", 4 + i);
7986                   }
7987               printf ("}");
7988             }
7989         }
7990       else if ((op & 0xf0) == 0x90)
7991         {
7992           if (op == 0x9d || op == 0x9f)
7993             printf (_("     [Reserved]"));
7994           else
7995             printf ("     vsp = r%d", op & 0x0f);
7996         }
7997       else if ((op & 0xf0) == 0xa0)
7998         {
7999           int end = 4 + (op & 0x07);
8000           int first = 1;
8001           int i;
8002
8003           printf ("     pop {");
8004           for (i = 4; i <= end; i++)
8005             {
8006               if (first)
8007                 first = 0;
8008               else
8009                 printf (", ");
8010               printf ("r%d", i);
8011             }
8012           if (op & 0x08)
8013             {
8014               if (!first)
8015                 printf (", ");
8016               printf ("r14");
8017             }
8018           printf ("}");
8019         }
8020       else if (op == 0xb0)
8021         printf (_("     finish"));
8022       else if (op == 0xb1)
8023         {
8024           GET_OP (op2);
8025           if (op2 == 0 || (op2 & 0xf0) != 0)
8026             printf (_("[Spare]"));
8027           else
8028             {
8029               unsigned int mask = op2 & 0x0f;
8030               int first = 1;
8031               int i;
8032
8033               printf ("pop {");
8034               for (i = 0; i < 12; i++)
8035                 if (mask & (1 << i))
8036                   {
8037                     if (first)
8038                       first = 0;
8039                     else
8040                       printf (", ");
8041                     printf ("r%d", i);
8042                   }
8043               printf ("}");
8044             }
8045         }
8046       else if (op == 0xb2)
8047         {
8048           unsigned char buf[9];
8049           unsigned int i, len;
8050           unsigned long offset;
8051
8052           for (i = 0; i < sizeof (buf); i++)
8053             {
8054               GET_OP (buf[i]);
8055               if ((buf[i] & 0x80) == 0)
8056                 break;
8057             }
8058           if (i == sizeof (buf))
8059             printf (_("corrupt change to vsp"));
8060           else
8061             {
8062               offset = read_uleb128 (buf, &len, buf + i + 1);
8063               assert (len == i + 1);
8064               offset = offset * 4 + 0x204;
8065               printf ("vsp = vsp + %ld", offset);
8066             }
8067         }
8068       else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
8069         {
8070           unsigned int first, last;
8071
8072           GET_OP (op2);
8073           first = op2 >> 4;
8074           last = op2 & 0x0f;
8075           if (op == 0xc8)
8076             first = first + 16;
8077           printf ("pop {D%d", first);
8078           if (last)
8079             printf ("-D%d", first + last);
8080           printf ("}");
8081         }
8082       else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
8083         {
8084           unsigned int count = op & 0x07;
8085
8086           printf ("pop {D8");
8087           if (count)
8088             printf ("-D%d", 8 + count);
8089           printf ("}");
8090         }
8091       else if (op >= 0xc0 && op <= 0xc5)
8092         {
8093           unsigned int count = op & 0x07;
8094
8095           printf ("     pop {wR10");
8096           if (count)
8097             printf ("-wR%d", 10 + count);
8098           printf ("}");
8099         }
8100       else if (op == 0xc6)
8101         {
8102           unsigned int first, last;
8103
8104           GET_OP (op2);
8105           first = op2 >> 4;
8106           last = op2 & 0x0f;
8107           printf ("pop {wR%d", first);
8108           if (last)
8109             printf ("-wR%d", first + last);
8110           printf ("}");
8111         }
8112       else if (op == 0xc7)
8113         {
8114           GET_OP (op2);
8115           if (op2 == 0 || (op2 & 0xf0) != 0)
8116             printf (_("[Spare]"));
8117           else
8118             {
8119               unsigned int mask = op2 & 0x0f;
8120               int first = 1;
8121               int i;
8122
8123               printf ("pop {");
8124               for (i = 0; i < 4; i++)
8125                 if (mask & (1 << i))
8126                   {
8127                     if (first)
8128                       first = 0;
8129                     else
8130                       printf (", ");
8131                     printf ("wCGR%d", i);
8132                   }
8133               printf ("}");
8134             }
8135         }
8136       else
8137         printf (_("     [unsupported opcode]"));
8138       printf ("\n");
8139     }
8140 }
8141
8142 static void
8143 decode_tic6x_unwind_bytecode (struct arm_unw_aux_info *  aux,
8144                               unsigned int               word,
8145                               unsigned int               remaining,
8146                               unsigned int               more_words,
8147                               bfd_vma                    data_offset,
8148                               Elf_Internal_Shdr *        data_sec,
8149                               struct arm_section *       data_arm_sec)
8150 {
8151   struct absaddr addr;
8152
8153   /* Decode the unwinding instructions.  */
8154   while (1)
8155     {
8156       unsigned int op, op2;
8157
8158       ADVANCE;
8159       if (remaining == 0)
8160         break;
8161       remaining--;
8162       op = word >> 24;
8163       word <<= 8;
8164
8165       printf ("  0x%02x ", op);
8166
8167       if ((op & 0xc0) == 0x00)
8168         {
8169           int offset = ((op & 0x3f) << 3) + 8;
8170           printf ("     sp = sp + %d", offset);
8171         }
8172       else if ((op & 0xc0) == 0x80)
8173         {
8174           GET_OP (op2);
8175           if (op == 0x80 && op2 == 0)
8176             printf (_("Refuse to unwind"));
8177           else
8178             {
8179               unsigned int mask = ((op & 0x1f) << 8) | op2;
8180               if (op & 0x20)
8181                 printf ("pop compact {");
8182               else
8183                 printf ("pop {");
8184
8185               decode_tic6x_unwind_regmask (mask);
8186               printf("}");
8187             }
8188         }
8189       else if ((op & 0xf0) == 0xc0)
8190         {
8191           unsigned int reg;
8192           unsigned int nregs;
8193           unsigned int i;
8194           const char *name;
8195           struct
8196           {
8197               unsigned int offset;
8198               unsigned int reg;
8199           } regpos[16];
8200
8201           /* Scan entire instruction first so that GET_OP output is not
8202              interleaved with disassembly.  */
8203           nregs = 0;
8204           for (i = 0; nregs < (op & 0xf); i++)
8205             {
8206               GET_OP (op2);
8207               reg = op2 >> 4;
8208               if (reg != 0xf)
8209                 {
8210                   regpos[nregs].offset = i * 2;
8211                   regpos[nregs].reg = reg;
8212                   nregs++;
8213                 }
8214
8215               reg = op2 & 0xf;
8216               if (reg != 0xf)
8217                 {
8218                   regpos[nregs].offset = i * 2 + 1;
8219                   regpos[nregs].reg = reg;
8220                   nregs++;
8221                 }
8222             }
8223
8224           printf (_("pop frame {"));
8225           reg = nregs - 1;
8226           for (i = i * 2; i > 0; i--)
8227             {
8228               if (regpos[reg].offset == i - 1)
8229                 {
8230                   name = tic6x_unwind_regnames[regpos[reg].reg];
8231                   if (reg > 0)
8232                     reg--;
8233                 }
8234               else
8235                 name = _("[pad]");
8236
8237               fputs (name, stdout);
8238               if (i > 1)
8239                 printf (", ");
8240             }
8241
8242           printf ("}");
8243         }
8244       else if (op == 0xd0)
8245         printf ("     MOV FP, SP");
8246       else if (op == 0xd1)
8247         printf ("     __c6xabi_pop_rts");
8248       else if (op == 0xd2)
8249         {
8250           unsigned char buf[9];
8251           unsigned int i, len;
8252           unsigned long offset;
8253
8254           for (i = 0; i < sizeof (buf); i++)
8255             {
8256               GET_OP (buf[i]);
8257               if ((buf[i] & 0x80) == 0)
8258                 break;
8259             }
8260           /* PR 17531: file: id:000001,src:001906+004739,op:splice,rep:2.  */
8261           if (i == sizeof (buf))
8262             {
8263               printf ("<corrupt sp adjust>\n");
8264               warn (_("Corrupt stack pointer adjustment detected\n"));
8265               return;
8266             }
8267
8268           offset = read_uleb128 (buf, &len, buf + i + 1);
8269           assert (len == i + 1);
8270           offset = offset * 8 + 0x408;
8271           printf (_("sp = sp + %ld"), offset);
8272         }
8273       else if ((op & 0xf0) == 0xe0)
8274         {
8275           if ((op & 0x0f) == 7)
8276             printf ("     RETURN");
8277           else
8278             printf ("     MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
8279         }
8280       else
8281         {
8282           printf (_("     [unsupported opcode]"));
8283         }
8284       putchar ('\n');
8285     }
8286 }
8287
8288 static bfd_vma
8289 arm_expand_prel31 (bfd_vma word, bfd_vma where)
8290 {
8291   bfd_vma offset;
8292
8293   offset = word & 0x7fffffff;
8294   if (offset & 0x40000000)
8295     offset |= ~ (bfd_vma) 0x7fffffff;
8296
8297   if (elf_header.e_machine == EM_TI_C6000)
8298     offset <<= 1;
8299
8300   return offset + where;
8301 }
8302
8303 static void
8304 decode_arm_unwind (struct arm_unw_aux_info *  aux,
8305                    unsigned int               word,
8306                    unsigned int               remaining,
8307                    bfd_vma                    data_offset,
8308                    Elf_Internal_Shdr *        data_sec,
8309                    struct arm_section *       data_arm_sec)
8310 {
8311   int per_index;
8312   unsigned int more_words = 0;
8313   struct absaddr addr;
8314   bfd_vma sym_name = (bfd_vma) -1;
8315
8316   if (remaining == 0)
8317     {
8318       /* Fetch the first word.
8319          Note - when decoding an object file the address extracted
8320          here will always be 0.  So we also pass in the sym_name
8321          parameter so that we can find the symbol associated with
8322          the personality routine.  */
8323       if (! get_unwind_section_word (aux, data_arm_sec, data_sec, data_offset,
8324                                      & word, & addr, & sym_name))
8325         return;
8326
8327       remaining = 4;
8328     }
8329
8330   if ((word & 0x80000000) == 0)
8331     {
8332       /* Expand prel31 for personality routine.  */
8333       bfd_vma fn;
8334       const char *procname;
8335
8336       fn = arm_expand_prel31 (word, data_sec->sh_addr + data_offset);
8337       printf (_("  Personality routine: "));
8338       if (fn == 0
8339           && addr.section == SHN_UNDEF && addr.offset == 0
8340           && sym_name != (bfd_vma) -1 && sym_name < aux->strtab_size)
8341         {
8342           procname = aux->strtab + sym_name;
8343           print_vma (fn, PREFIX_HEX);
8344           if (procname)
8345             {
8346               fputs (" <", stdout);
8347               fputs (procname, stdout);
8348               fputc ('>', stdout);
8349             }
8350         }
8351       else
8352         procname = arm_print_vma_and_name (aux, fn, addr);
8353       fputc ('\n', stdout);
8354
8355       /* The GCC personality routines use the standard compact
8356          encoding, starting with one byte giving the number of
8357          words.  */
8358       if (procname != NULL
8359           && (const_strneq (procname, "__gcc_personality_v0")
8360               || const_strneq (procname, "__gxx_personality_v0")
8361               || const_strneq (procname, "__gcj_personality_v0")
8362               || const_strneq (procname, "__gnu_objc_personality_v0")))
8363         {
8364           remaining = 0;
8365           more_words = 1;
8366           ADVANCE;
8367           if (!remaining)
8368             {
8369               printf (_("  [Truncated data]\n"));
8370               return;
8371             }
8372           more_words = word >> 24;
8373           word <<= 8;
8374           remaining--;
8375           per_index = -1;
8376         }
8377       else
8378         return;
8379     }
8380   else
8381     {
8382       /* ARM EHABI Section 6.3:
8383
8384          An exception-handling table entry for the compact model looks like:
8385
8386            31 30-28 27-24 23-0
8387            -- ----- ----- ----
8388             1   0   index Data for personalityRoutine[index]    */
8389
8390       if (elf_header.e_machine == EM_ARM
8391           && (word & 0x70000000))
8392         warn (_("Corrupt ARM compact model table entry: %x \n"), word);
8393
8394       per_index = (word >> 24) & 0x7f;
8395       printf (_("  Compact model index: %d\n"), per_index);
8396       if (per_index == 0)
8397         {
8398           more_words = 0;
8399           word <<= 8;
8400           remaining--;
8401         }
8402       else if (per_index < 3)
8403         {
8404           more_words = (word >> 16) & 0xff;
8405           word <<= 16;
8406           remaining -= 2;
8407         }
8408     }
8409
8410   switch (elf_header.e_machine)
8411     {
8412     case EM_ARM:
8413       if (per_index < 3)
8414         {
8415           decode_arm_unwind_bytecode (aux, word, remaining, more_words,
8416                                       data_offset, data_sec, data_arm_sec);
8417         }
8418       else
8419         {
8420           warn (_("Unknown ARM compact model index encountered\n"));
8421           printf (_("  [reserved]\n"));
8422         }
8423       break;
8424
8425     case EM_TI_C6000:
8426       if (per_index < 3)
8427         {
8428           decode_tic6x_unwind_bytecode (aux, word, remaining, more_words,
8429                                         data_offset, data_sec, data_arm_sec);
8430         }
8431       else if (per_index < 5)
8432         {
8433           if (((word >> 17) & 0x7f) == 0x7f)
8434             printf (_("  Restore stack from frame pointer\n"));
8435           else
8436             printf (_("  Stack increment %d\n"), (word >> 14) & 0x1fc);
8437           printf (_("  Registers restored: "));
8438           if (per_index == 4)
8439             printf (" (compact) ");
8440           decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
8441           putchar ('\n');
8442           printf (_("  Return register: %s\n"),
8443                   tic6x_unwind_regnames[word & 0xf]);
8444         }
8445       else
8446         printf (_("  [reserved (%d)]\n"), per_index);
8447       break;
8448
8449     default:
8450       error (_("Unsupported architecture type %d encountered when decoding unwind table\n"),
8451              elf_header.e_machine);
8452     }
8453
8454   /* Decode the descriptors.  Not implemented.  */
8455 }
8456
8457 static void
8458 dump_arm_unwind (struct arm_unw_aux_info *aux, Elf_Internal_Shdr *exidx_sec)
8459 {
8460   struct arm_section exidx_arm_sec, extab_arm_sec;
8461   unsigned int i, exidx_len;
8462   unsigned long j, nfuns;
8463
8464   memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
8465   memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
8466   exidx_len = exidx_sec->sh_size / 8;
8467
8468   aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
8469   for (nfuns = 0, j = 0; j < aux->nsyms; j++)
8470     if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
8471       aux->funtab[nfuns++] = aux->symtab[j];
8472   aux->nfuns = nfuns;
8473   qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
8474
8475   for (i = 0; i < exidx_len; i++)
8476     {
8477       unsigned int exidx_fn, exidx_entry;
8478       struct absaddr fn_addr, entry_addr;
8479       bfd_vma fn;
8480
8481       fputc ('\n', stdout);
8482
8483       if (! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
8484                                      8 * i, & exidx_fn, & fn_addr, NULL)
8485           || ! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
8486                                         8 * i + 4, & exidx_entry, & entry_addr, NULL))
8487         {
8488           free (aux->funtab);
8489           arm_free_section (& exidx_arm_sec);
8490           arm_free_section (& extab_arm_sec);
8491           return;
8492         }
8493
8494       /* ARM EHABI, Section 5:
8495          An index table entry consists of 2 words.
8496          The first word contains a prel31 offset to the start of a function, with bit 31 clear.  */
8497       if (exidx_fn & 0x80000000)
8498         warn (_("corrupt index table entry: %x\n"), exidx_fn);
8499
8500       fn = arm_expand_prel31 (exidx_fn, exidx_sec->sh_addr + 8 * i);
8501
8502       arm_print_vma_and_name (aux, fn, fn_addr);
8503       fputs (": ", stdout);
8504
8505       if (exidx_entry == 1)
8506         {
8507           print_vma (exidx_entry, PREFIX_HEX);
8508           fputs (" [cantunwind]\n", stdout);
8509         }
8510       else if (exidx_entry & 0x80000000)
8511         {
8512           print_vma (exidx_entry, PREFIX_HEX);
8513           fputc ('\n', stdout);
8514           decode_arm_unwind (aux, exidx_entry, 4, 0, NULL, NULL);
8515         }
8516       else
8517         {
8518           bfd_vma table, table_offset = 0;
8519           Elf_Internal_Shdr *table_sec;
8520
8521           fputs ("@", stdout);
8522           table = arm_expand_prel31 (exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
8523           print_vma (table, PREFIX_HEX);
8524           printf ("\n");
8525
8526           /* Locate the matching .ARM.extab.  */
8527           if (entry_addr.section != SHN_UNDEF
8528               && entry_addr.section < elf_header.e_shnum)
8529             {
8530               table_sec = section_headers + entry_addr.section;
8531               table_offset = entry_addr.offset;
8532               /* PR 18879 */
8533               if (table_offset > table_sec->sh_size
8534                   || ((bfd_signed_vma) table_offset) < 0)
8535                 {
8536                   warn (_("Unwind entry contains corrupt offset (0x%lx) into section %s\n"),
8537                         (unsigned long) table_offset,
8538                         printable_section_name (table_sec));
8539                   continue;
8540                 }
8541             }
8542           else
8543             {
8544               table_sec = find_section_by_address (table);
8545               if (table_sec != NULL)
8546                 table_offset = table - table_sec->sh_addr;
8547             }
8548           if (table_sec == NULL)
8549             {
8550               warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
8551                     (unsigned long) table);
8552               continue;
8553             }
8554           decode_arm_unwind (aux, 0, 0, table_offset, table_sec,
8555                              &extab_arm_sec);
8556         }
8557     }
8558
8559   printf ("\n");
8560
8561   free (aux->funtab);
8562   arm_free_section (&exidx_arm_sec);
8563   arm_free_section (&extab_arm_sec);
8564 }
8565
8566 /* Used for both ARM and C6X unwinding tables.  */
8567
8568 static void
8569 arm_process_unwind (FILE *file)
8570 {
8571   struct arm_unw_aux_info aux;
8572   Elf_Internal_Shdr *unwsec = NULL;
8573   Elf_Internal_Shdr *strsec;
8574   Elf_Internal_Shdr *sec;
8575   unsigned long i;
8576   unsigned int sec_type;
8577
8578   switch (elf_header.e_machine)
8579     {
8580     case EM_ARM:
8581       sec_type = SHT_ARM_EXIDX;
8582       break;
8583
8584     case EM_TI_C6000:
8585       sec_type = SHT_C6000_UNWIND;
8586       break;
8587
8588     default:
8589       error (_("Unsupported architecture type %d encountered when processing unwind table\n"),
8590              elf_header.e_machine);
8591       return;
8592     }
8593
8594   if (string_table == NULL)
8595     return;
8596
8597   memset (& aux, 0, sizeof (aux));
8598   aux.file = file;
8599
8600   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
8601     {
8602       if (sec->sh_type == SHT_SYMTAB && sec->sh_link < elf_header.e_shnum)
8603         {
8604           aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
8605
8606           strsec = section_headers + sec->sh_link;
8607
8608           /* PR binutils/17531 file: 011-12666-0.004.  */
8609           if (aux.strtab != NULL)
8610             {
8611               error (_("Multiple string tables found in file.\n"));
8612               free (aux.strtab);
8613             }
8614           aux.strtab = get_data (NULL, file, strsec->sh_offset,
8615                                  1, strsec->sh_size, _("string table"));
8616           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
8617         }
8618       else if (sec->sh_type == sec_type)
8619         unwsec = sec;
8620     }
8621
8622   if (unwsec == NULL)
8623     printf (_("\nThere are no unwind sections in this file.\n"));
8624   else
8625     for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
8626       {
8627         if (sec->sh_type == sec_type)
8628           {
8629             printf (_("\nUnwind table index '%s' at offset 0x%lx contains %lu entries:\n"),
8630                     printable_section_name (sec),
8631                     (unsigned long) sec->sh_offset,
8632                     (unsigned long) (sec->sh_size / (2 * eh_addr_size)));
8633
8634             dump_arm_unwind (&aux, sec);
8635           }
8636       }
8637
8638   if (aux.symtab)
8639     free (aux.symtab);
8640   if (aux.strtab)
8641     free ((char *) aux.strtab);
8642 }
8643
8644 static void
8645 process_unwind (FILE * file)
8646 {
8647   struct unwind_handler
8648   {
8649     int machtype;
8650     void (* handler)(FILE *);
8651   } handlers[] =
8652   {
8653     { EM_ARM, arm_process_unwind },
8654     { EM_IA_64, ia64_process_unwind },
8655     { EM_PARISC, hppa_process_unwind },
8656     { EM_TI_C6000, arm_process_unwind },
8657     { 0, 0 }
8658   };
8659   int i;
8660
8661   if (!do_unwind)
8662     return;
8663
8664   for (i = 0; handlers[i].handler != NULL; i++)
8665     if (elf_header.e_machine == handlers[i].machtype)
8666       {
8667         handlers[i].handler (file);
8668         return;
8669       }
8670
8671   printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
8672           get_machine_name (elf_header.e_machine));
8673 }
8674
8675 static void
8676 dynamic_section_mips_val (Elf_Internal_Dyn * entry)
8677 {
8678   switch (entry->d_tag)
8679     {
8680     case DT_MIPS_FLAGS:
8681       if (entry->d_un.d_val == 0)
8682         printf (_("NONE"));
8683       else
8684         {
8685           static const char * opts[] =
8686           {
8687             "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
8688             "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
8689             "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
8690             "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
8691             "RLD_ORDER_SAFE"
8692           };
8693           unsigned int cnt;
8694           int first = 1;
8695
8696           for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
8697             if (entry->d_un.d_val & (1 << cnt))
8698               {
8699                 printf ("%s%s", first ? "" : " ", opts[cnt]);
8700                 first = 0;
8701               }
8702         }
8703       break;
8704
8705     case DT_MIPS_IVERSION:
8706       if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
8707         printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry->d_un.d_val));
8708       else
8709         {
8710           char buf[40];
8711           sprintf_vma (buf, entry->d_un.d_ptr);
8712           /* Note: coded this way so that there is a single string for translation.  */
8713           printf (_("<corrupt: %s>"), buf);
8714         }
8715       break;
8716
8717     case DT_MIPS_TIME_STAMP:
8718       {
8719         char timebuf[128];
8720         struct tm * tmp;
8721         time_t atime = entry->d_un.d_val;
8722
8723         tmp = gmtime (&atime);
8724         /* PR 17531: file: 6accc532.  */
8725         if (tmp == NULL)
8726           snprintf (timebuf, sizeof (timebuf), _("<corrupt>"));
8727         else
8728           snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
8729                     tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
8730                     tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
8731         printf (_("Time Stamp: %s"), timebuf);
8732       }
8733       break;
8734
8735     case DT_MIPS_RLD_VERSION:
8736     case DT_MIPS_LOCAL_GOTNO:
8737     case DT_MIPS_CONFLICTNO:
8738     case DT_MIPS_LIBLISTNO:
8739     case DT_MIPS_SYMTABNO:
8740     case DT_MIPS_UNREFEXTNO:
8741     case DT_MIPS_HIPAGENO:
8742     case DT_MIPS_DELTA_CLASS_NO:
8743     case DT_MIPS_DELTA_INSTANCE_NO:
8744     case DT_MIPS_DELTA_RELOC_NO:
8745     case DT_MIPS_DELTA_SYM_NO:
8746     case DT_MIPS_DELTA_CLASSSYM_NO:
8747     case DT_MIPS_COMPACT_SIZE:
8748       print_vma (entry->d_un.d_val, DEC);
8749       break;
8750
8751     default:
8752       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8753     }
8754     putchar ('\n');
8755 }
8756
8757 static void
8758 dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
8759 {
8760   switch (entry->d_tag)
8761     {
8762     case DT_HP_DLD_FLAGS:
8763       {
8764         static struct
8765         {
8766           long int bit;
8767           const char * str;
8768         }
8769         flags[] =
8770         {
8771           { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
8772           { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
8773           { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
8774           { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
8775           { DT_HP_BIND_NOW, "HP_BIND_NOW" },
8776           { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
8777           { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
8778           { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
8779           { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
8780           { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
8781           { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
8782           { DT_HP_GST, "HP_GST" },
8783           { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
8784           { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
8785           { DT_HP_NODELETE, "HP_NODELETE" },
8786           { DT_HP_GROUP, "HP_GROUP" },
8787           { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
8788         };
8789         int first = 1;
8790         size_t cnt;
8791         bfd_vma val = entry->d_un.d_val;
8792
8793         for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
8794           if (val & flags[cnt].bit)
8795             {
8796               if (! first)
8797                 putchar (' ');
8798               fputs (flags[cnt].str, stdout);
8799               first = 0;
8800               val ^= flags[cnt].bit;
8801             }
8802
8803         if (val != 0 || first)
8804           {
8805             if (! first)
8806               putchar (' ');
8807             print_vma (val, HEX);
8808           }
8809       }
8810       break;
8811
8812     default:
8813       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8814       break;
8815     }
8816   putchar ('\n');
8817 }
8818
8819 #ifdef BFD64
8820
8821 /* VMS vs Unix time offset and factor.  */
8822
8823 #define VMS_EPOCH_OFFSET 35067168000000000LL
8824 #define VMS_GRANULARITY_FACTOR 10000000
8825
8826 /* Display a VMS time in a human readable format.  */
8827
8828 static void
8829 print_vms_time (bfd_int64_t vmstime)
8830 {
8831   struct tm *tm;
8832   time_t unxtime;
8833
8834   unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
8835   tm = gmtime (&unxtime);
8836   printf ("%04u-%02u-%02uT%02u:%02u:%02u",
8837           tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
8838           tm->tm_hour, tm->tm_min, tm->tm_sec);
8839 }
8840 #endif /* BFD64 */
8841
8842 static void
8843 dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
8844 {
8845   switch (entry->d_tag)
8846     {
8847     case DT_IA_64_PLT_RESERVE:
8848       /* First 3 slots reserved.  */
8849       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8850       printf (" -- ");
8851       print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
8852       break;
8853
8854     case DT_IA_64_VMS_LINKTIME:
8855 #ifdef BFD64
8856       print_vms_time (entry->d_un.d_val);
8857 #endif
8858       break;
8859
8860     case DT_IA_64_VMS_LNKFLAGS:
8861       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8862       if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
8863         printf (" CALL_DEBUG");
8864       if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
8865         printf (" NOP0BUFS");
8866       if (entry->d_un.d_val & VMS_LF_P0IMAGE)
8867         printf (" P0IMAGE");
8868       if (entry->d_un.d_val & VMS_LF_MKTHREADS)
8869         printf (" MKTHREADS");
8870       if (entry->d_un.d_val & VMS_LF_UPCALLS)
8871         printf (" UPCALLS");
8872       if (entry->d_un.d_val & VMS_LF_IMGSTA)
8873         printf (" IMGSTA");
8874       if (entry->d_un.d_val & VMS_LF_INITIALIZE)
8875         printf (" INITIALIZE");
8876       if (entry->d_un.d_val & VMS_LF_MAIN)
8877         printf (" MAIN");
8878       if (entry->d_un.d_val & VMS_LF_EXE_INIT)
8879         printf (" EXE_INIT");
8880       if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
8881         printf (" TBK_IN_IMG");
8882       if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
8883         printf (" DBG_IN_IMG");
8884       if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
8885         printf (" TBK_IN_DSF");
8886       if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
8887         printf (" DBG_IN_DSF");
8888       if (entry->d_un.d_val & VMS_LF_SIGNATURES)
8889         printf (" SIGNATURES");
8890       if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
8891         printf (" REL_SEG_OFF");
8892       break;
8893
8894     default:
8895       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8896       break;
8897     }
8898   putchar ('\n');
8899 }
8900
8901 static int
8902 get_32bit_dynamic_section (FILE * file)
8903 {
8904   Elf32_External_Dyn * edyn;
8905   Elf32_External_Dyn * ext;
8906   Elf_Internal_Dyn * entry;
8907
8908   edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
8909                                           dynamic_size, _("dynamic section"));
8910   if (!edyn)
8911     return 0;
8912
8913   /* SGI's ELF has more than one section in the DYNAMIC segment, and we
8914      might not have the luxury of section headers.  Look for the DT_NULL
8915      terminator to determine the number of entries.  */
8916   for (ext = edyn, dynamic_nent = 0;
8917        (char *) (ext + 1) <= (char *) edyn + dynamic_size;
8918        ext++)
8919     {
8920       dynamic_nent++;
8921       if (BYTE_GET (ext->d_tag) == DT_NULL)
8922         break;
8923     }
8924
8925   dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
8926                                                   sizeof (* entry));
8927   if (dynamic_section == NULL)
8928     {
8929       error (_("Out of memory allocating space for %lu dynamic entries\n"),
8930              (unsigned long) dynamic_nent);
8931       free (edyn);
8932       return 0;
8933     }
8934
8935   for (ext = edyn, entry = dynamic_section;
8936        entry < dynamic_section + dynamic_nent;
8937        ext++, entry++)
8938     {
8939       entry->d_tag      = BYTE_GET (ext->d_tag);
8940       entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
8941     }
8942
8943   free (edyn);
8944
8945   return 1;
8946 }
8947
8948 static int
8949 get_64bit_dynamic_section (FILE * file)
8950 {
8951   Elf64_External_Dyn * edyn;
8952   Elf64_External_Dyn * ext;
8953   Elf_Internal_Dyn * entry;
8954
8955   /* Read in the data.  */
8956   edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
8957                                           dynamic_size, _("dynamic section"));
8958   if (!edyn)
8959     return 0;
8960
8961   /* SGI's ELF has more than one section in the DYNAMIC segment, and we
8962      might not have the luxury of section headers.  Look for the DT_NULL
8963      terminator to determine the number of entries.  */
8964   for (ext = edyn, dynamic_nent = 0;
8965        /* PR 17533 file: 033-67080-0.004 - do not read past end of buffer.  */
8966        (char *) (ext + 1) <= (char *) edyn + dynamic_size;
8967        ext++)
8968     {
8969       dynamic_nent++;
8970       if (BYTE_GET (ext->d_tag) == DT_NULL)
8971         break;
8972     }
8973
8974   dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
8975                                                   sizeof (* entry));
8976   if (dynamic_section == NULL)
8977     {
8978       error (_("Out of memory allocating space for %lu dynamic entries\n"),
8979              (unsigned long) dynamic_nent);
8980       free (edyn);
8981       return 0;
8982     }
8983
8984   /* Convert from external to internal formats.  */
8985   for (ext = edyn, entry = dynamic_section;
8986        entry < dynamic_section + dynamic_nent;
8987        ext++, entry++)
8988     {
8989       entry->d_tag      = BYTE_GET (ext->d_tag);
8990       entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
8991     }
8992
8993   free (edyn);
8994
8995   return 1;
8996 }
8997
8998 static void
8999 print_dynamic_flags (bfd_vma flags)
9000 {
9001   int first = 1;
9002
9003   while (flags)
9004     {
9005       bfd_vma flag;
9006
9007       flag = flags & - flags;
9008       flags &= ~ flag;
9009
9010       if (first)
9011         first = 0;
9012       else
9013         putc (' ', stdout);
9014
9015       switch (flag)
9016         {
9017         case DF_ORIGIN:         fputs ("ORIGIN", stdout); break;
9018         case DF_SYMBOLIC:       fputs ("SYMBOLIC", stdout); break;
9019         case DF_TEXTREL:        fputs ("TEXTREL", stdout); break;
9020         case DF_BIND_NOW:       fputs ("BIND_NOW", stdout); break;
9021         case DF_STATIC_TLS:     fputs ("STATIC_TLS", stdout); break;
9022         default:                fputs (_("unknown"), stdout); break;
9023         }
9024     }
9025   puts ("");
9026 }
9027
9028 /* Parse and display the contents of the dynamic section.  */
9029
9030 static int
9031 process_dynamic_section (FILE * file)
9032 {
9033   Elf_Internal_Dyn * entry;
9034
9035   if (dynamic_size == 0)
9036     {
9037       if (do_dynamic)
9038         printf (_("\nThere is no dynamic section in this file.\n"));
9039
9040       return 1;
9041     }
9042
9043   if (is_32bit_elf)
9044     {
9045       if (! get_32bit_dynamic_section (file))
9046         return 0;
9047     }
9048   else if (! get_64bit_dynamic_section (file))
9049     return 0;
9050
9051   /* Find the appropriate symbol table.  */
9052   if (dynamic_symbols == NULL)
9053     {
9054       for (entry = dynamic_section;
9055            entry < dynamic_section + dynamic_nent;
9056            ++entry)
9057         {
9058           Elf_Internal_Shdr section;
9059
9060           if (entry->d_tag != DT_SYMTAB)
9061             continue;
9062
9063           dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
9064
9065           /* Since we do not know how big the symbol table is,
9066              we default to reading in the entire file (!) and
9067              processing that.  This is overkill, I know, but it
9068              should work.  */
9069           section.sh_offset = offset_from_vma (file, entry->d_un.d_val, 0);
9070
9071           if (archive_file_offset != 0)
9072             section.sh_size = archive_file_size - section.sh_offset;
9073           else
9074             {
9075               if (fseek (file, 0, SEEK_END))
9076                 error (_("Unable to seek to end of file!\n"));
9077
9078               section.sh_size = ftell (file) - section.sh_offset;
9079             }
9080
9081           if (is_32bit_elf)
9082             section.sh_entsize = sizeof (Elf32_External_Sym);
9083           else
9084             section.sh_entsize = sizeof (Elf64_External_Sym);
9085           section.sh_name = string_table_length;
9086
9087           dynamic_symbols = GET_ELF_SYMBOLS (file, &section, & num_dynamic_syms);
9088           if (num_dynamic_syms < 1)
9089             {
9090               error (_("Unable to determine the number of symbols to load\n"));
9091               continue;
9092             }
9093         }
9094     }
9095
9096   /* Similarly find a string table.  */
9097   if (dynamic_strings == NULL)
9098     {
9099       for (entry = dynamic_section;
9100            entry < dynamic_section + dynamic_nent;
9101            ++entry)
9102         {
9103           unsigned long offset;
9104           long str_tab_len;
9105
9106           if (entry->d_tag != DT_STRTAB)
9107             continue;
9108
9109           dynamic_info[DT_STRTAB] = entry->d_un.d_val;
9110
9111           /* Since we do not know how big the string table is,
9112              we default to reading in the entire file (!) and
9113              processing that.  This is overkill, I know, but it
9114              should work.  */
9115
9116           offset = offset_from_vma (file, entry->d_un.d_val, 0);
9117
9118           if (archive_file_offset != 0)
9119             str_tab_len = archive_file_size - offset;
9120           else
9121             {
9122               if (fseek (file, 0, SEEK_END))
9123                 error (_("Unable to seek to end of file\n"));
9124               str_tab_len = ftell (file) - offset;
9125             }
9126
9127           if (str_tab_len < 1)
9128             {
9129               error
9130                 (_("Unable to determine the length of the dynamic string table\n"));
9131               continue;
9132             }
9133
9134           dynamic_strings = (char *) get_data (NULL, file, offset, 1,
9135                                                str_tab_len,
9136                                                _("dynamic string table"));
9137           dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
9138           break;
9139         }
9140     }
9141
9142   /* And find the syminfo section if available.  */
9143   if (dynamic_syminfo == NULL)
9144     {
9145       unsigned long syminsz = 0;
9146
9147       for (entry = dynamic_section;
9148            entry < dynamic_section + dynamic_nent;
9149            ++entry)
9150         {
9151           if (entry->d_tag == DT_SYMINENT)
9152             {
9153               /* Note: these braces are necessary to avoid a syntax
9154                  error from the SunOS4 C compiler.  */
9155               /* PR binutils/17531: A corrupt file can trigger this test.
9156                  So do not use an assert, instead generate an error message.  */
9157               if (sizeof (Elf_External_Syminfo) != entry->d_un.d_val)
9158                 error (_("Bad value (%d) for SYMINENT entry\n"),
9159                        (int) entry->d_un.d_val);
9160             }
9161           else if (entry->d_tag == DT_SYMINSZ)
9162             syminsz = entry->d_un.d_val;
9163           else if (entry->d_tag == DT_SYMINFO)
9164             dynamic_syminfo_offset = offset_from_vma (file, entry->d_un.d_val,
9165                                                       syminsz);
9166         }
9167
9168       if (dynamic_syminfo_offset != 0 && syminsz != 0)
9169         {
9170           Elf_External_Syminfo * extsyminfo;
9171           Elf_External_Syminfo * extsym;
9172           Elf_Internal_Syminfo * syminfo;
9173
9174           /* There is a syminfo section.  Read the data.  */
9175           extsyminfo = (Elf_External_Syminfo *)
9176               get_data (NULL, file, dynamic_syminfo_offset, 1, syminsz,
9177                         _("symbol information"));
9178           if (!extsyminfo)
9179             return 0;
9180
9181           dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
9182           if (dynamic_syminfo == NULL)
9183             {
9184               error (_("Out of memory allocating %lu byte for dynamic symbol info\n"),
9185                      (unsigned long) syminsz);
9186               return 0;
9187             }
9188
9189           dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
9190           for (syminfo = dynamic_syminfo, extsym = extsyminfo;
9191                syminfo < dynamic_syminfo + dynamic_syminfo_nent;
9192                ++syminfo, ++extsym)
9193             {
9194               syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
9195               syminfo->si_flags = BYTE_GET (extsym->si_flags);
9196             }
9197
9198           free (extsyminfo);
9199         }
9200     }
9201
9202   if (do_dynamic && dynamic_addr)
9203     printf (_("\nDynamic section at offset 0x%lx contains %lu entries:\n"),
9204             dynamic_addr, (unsigned long) dynamic_nent);
9205   if (do_dynamic)
9206     printf (_("  Tag        Type                         Name/Value\n"));
9207
9208   for (entry = dynamic_section;
9209        entry < dynamic_section + dynamic_nent;
9210        entry++)
9211     {
9212       if (do_dynamic)
9213         {
9214           const char * dtype;
9215
9216           putchar (' ');
9217           print_vma (entry->d_tag, FULL_HEX);
9218           dtype = get_dynamic_type (entry->d_tag);
9219           printf (" (%s)%*s", dtype,
9220                   ((is_32bit_elf ? 27 : 19)
9221                    - (int) strlen (dtype)),
9222                   " ");
9223         }
9224
9225       switch (entry->d_tag)
9226         {
9227         case DT_FLAGS:
9228           if (do_dynamic)
9229             print_dynamic_flags (entry->d_un.d_val);
9230           break;
9231
9232         case DT_AUXILIARY:
9233         case DT_FILTER:
9234         case DT_CONFIG:
9235         case DT_DEPAUDIT:
9236         case DT_AUDIT:
9237           if (do_dynamic)
9238             {
9239               switch (entry->d_tag)
9240                 {
9241                 case DT_AUXILIARY:
9242                   printf (_("Auxiliary library"));
9243                   break;
9244
9245                 case DT_FILTER:
9246                   printf (_("Filter library"));
9247                   break;
9248
9249                 case DT_CONFIG:
9250                   printf (_("Configuration file"));
9251                   break;
9252
9253                 case DT_DEPAUDIT:
9254                   printf (_("Dependency audit library"));
9255                   break;
9256
9257                 case DT_AUDIT:
9258                   printf (_("Audit library"));
9259                   break;
9260                 }
9261
9262               if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9263                 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
9264               else
9265                 {
9266                   printf (": ");
9267                   print_vma (entry->d_un.d_val, PREFIX_HEX);
9268                   putchar ('\n');
9269                 }
9270             }
9271           break;
9272
9273         case DT_FEATURE:
9274           if (do_dynamic)
9275             {
9276               printf (_("Flags:"));
9277
9278               if (entry->d_un.d_val == 0)
9279                 printf (_(" None\n"));
9280               else
9281                 {
9282                   unsigned long int val = entry->d_un.d_val;
9283
9284                   if (val & DTF_1_PARINIT)
9285                     {
9286                       printf (" PARINIT");
9287                       val ^= DTF_1_PARINIT;
9288                     }
9289                   if (val & DTF_1_CONFEXP)
9290                     {
9291                       printf (" CONFEXP");
9292                       val ^= DTF_1_CONFEXP;
9293                     }
9294                   if (val != 0)
9295                     printf (" %lx", val);
9296                   puts ("");
9297                 }
9298             }
9299           break;
9300
9301         case DT_POSFLAG_1:
9302           if (do_dynamic)
9303             {
9304               printf (_("Flags:"));
9305
9306               if (entry->d_un.d_val == 0)
9307                 printf (_(" None\n"));
9308               else
9309                 {
9310                   unsigned long int val = entry->d_un.d_val;
9311
9312                   if (val & DF_P1_LAZYLOAD)
9313                     {
9314                       printf (" LAZYLOAD");
9315                       val ^= DF_P1_LAZYLOAD;
9316                     }
9317                   if (val & DF_P1_GROUPPERM)
9318                     {
9319                       printf (" GROUPPERM");
9320                       val ^= DF_P1_GROUPPERM;
9321                     }
9322                   if (val != 0)
9323                     printf (" %lx", val);
9324                   puts ("");
9325                 }
9326             }
9327           break;
9328
9329         case DT_FLAGS_1:
9330           if (do_dynamic)
9331             {
9332               printf (_("Flags:"));
9333               if (entry->d_un.d_val == 0)
9334                 printf (_(" None\n"));
9335               else
9336                 {
9337                   unsigned long int val = entry->d_un.d_val;
9338
9339                   if (val & DF_1_NOW)
9340                     {
9341                       printf (" NOW");
9342                       val ^= DF_1_NOW;
9343                     }
9344                   if (val & DF_1_GLOBAL)
9345                     {
9346                       printf (" GLOBAL");
9347                       val ^= DF_1_GLOBAL;
9348                     }
9349                   if (val & DF_1_GROUP)
9350                     {
9351                       printf (" GROUP");
9352                       val ^= DF_1_GROUP;
9353                     }
9354                   if (val & DF_1_NODELETE)
9355                     {
9356                       printf (" NODELETE");
9357                       val ^= DF_1_NODELETE;
9358                     }
9359                   if (val & DF_1_LOADFLTR)
9360                     {
9361                       printf (" LOADFLTR");
9362                       val ^= DF_1_LOADFLTR;
9363                     }
9364                   if (val & DF_1_INITFIRST)
9365                     {
9366                       printf (" INITFIRST");
9367                       val ^= DF_1_INITFIRST;
9368                     }
9369                   if (val & DF_1_NOOPEN)
9370                     {
9371                       printf (" NOOPEN");
9372                       val ^= DF_1_NOOPEN;
9373                     }
9374                   if (val & DF_1_ORIGIN)
9375                     {
9376                       printf (" ORIGIN");
9377                       val ^= DF_1_ORIGIN;
9378                     }
9379                   if (val & DF_1_DIRECT)
9380                     {
9381                       printf (" DIRECT");
9382                       val ^= DF_1_DIRECT;
9383                     }
9384                   if (val & DF_1_TRANS)
9385                     {
9386                       printf (" TRANS");
9387                       val ^= DF_1_TRANS;
9388                     }
9389                   if (val & DF_1_INTERPOSE)
9390                     {
9391                       printf (" INTERPOSE");
9392                       val ^= DF_1_INTERPOSE;
9393                     }
9394                   if (val & DF_1_NODEFLIB)
9395                     {
9396                       printf (" NODEFLIB");
9397                       val ^= DF_1_NODEFLIB;
9398                     }
9399                   if (val & DF_1_NODUMP)
9400                     {
9401                       printf (" NODUMP");
9402                       val ^= DF_1_NODUMP;
9403                     }
9404                   if (val & DF_1_CONFALT)
9405                     {
9406                       printf (" CONFALT");
9407                       val ^= DF_1_CONFALT;
9408                     }
9409                   if (val & DF_1_ENDFILTEE)
9410                     {
9411                       printf (" ENDFILTEE");
9412                       val ^= DF_1_ENDFILTEE;
9413                     }
9414                   if (val & DF_1_DISPRELDNE)
9415                     {
9416                       printf (" DISPRELDNE");
9417                       val ^= DF_1_DISPRELDNE;
9418                     }
9419                   if (val & DF_1_DISPRELPND)
9420                     {
9421                       printf (" DISPRELPND");
9422                       val ^= DF_1_DISPRELPND;
9423                     }
9424                   if (val & DF_1_NODIRECT)
9425                     {
9426                       printf (" NODIRECT");
9427                       val ^= DF_1_NODIRECT;
9428                     }
9429                   if (val & DF_1_IGNMULDEF)
9430                     {
9431                       printf (" IGNMULDEF");
9432                       val ^= DF_1_IGNMULDEF;
9433                     }
9434                   if (val & DF_1_NOKSYMS)
9435                     {
9436                       printf (" NOKSYMS");
9437                       val ^= DF_1_NOKSYMS;
9438                     }
9439                   if (val & DF_1_NOHDR)
9440                     {
9441                       printf (" NOHDR");
9442                       val ^= DF_1_NOHDR;
9443                     }
9444                   if (val & DF_1_EDITED)
9445                     {
9446                       printf (" EDITED");
9447                       val ^= DF_1_EDITED;
9448                     }
9449                   if (val & DF_1_NORELOC)
9450                     {
9451                       printf (" NORELOC");
9452                       val ^= DF_1_NORELOC;
9453                     }
9454                   if (val & DF_1_SYMINTPOSE)
9455                     {
9456                       printf (" SYMINTPOSE");
9457                       val ^= DF_1_SYMINTPOSE;
9458                     }
9459                   if (val & DF_1_GLOBAUDIT)
9460                     {
9461                       printf (" GLOBAUDIT");
9462                       val ^= DF_1_GLOBAUDIT;
9463                     }
9464                   if (val & DF_1_SINGLETON)
9465                     {
9466                       printf (" SINGLETON");
9467                       val ^= DF_1_SINGLETON;
9468                     }
9469                   if (val & DF_1_STUB)
9470                     {
9471                       printf (" STUB");
9472                       val ^= DF_1_STUB;
9473                     }
9474                   if (val & DF_1_PIE)
9475                     {
9476                       printf (" PIE");
9477                       val ^= DF_1_PIE;
9478                     }
9479                   if (val != 0)
9480                     printf (" %lx", val);
9481                   puts ("");
9482                 }
9483             }
9484           break;
9485
9486         case DT_PLTREL:
9487           dynamic_info[entry->d_tag] = entry->d_un.d_val;
9488           if (do_dynamic)
9489             puts (get_dynamic_type (entry->d_un.d_val));
9490           break;
9491
9492         case DT_NULL    :
9493         case DT_NEEDED  :
9494         case DT_PLTGOT  :
9495         case DT_HASH    :
9496         case DT_STRTAB  :
9497         case DT_SYMTAB  :
9498         case DT_RELA    :
9499         case DT_INIT    :
9500         case DT_FINI    :
9501         case DT_SONAME  :
9502         case DT_RPATH   :
9503         case DT_SYMBOLIC:
9504         case DT_REL     :
9505         case DT_DEBUG   :
9506         case DT_TEXTREL :
9507         case DT_JMPREL  :
9508         case DT_RUNPATH :
9509           dynamic_info[entry->d_tag] = entry->d_un.d_val;
9510
9511           if (do_dynamic)
9512             {
9513               char * name;
9514
9515               if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9516                 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
9517               else
9518                 name = NULL;
9519
9520               if (name)
9521                 {
9522                   switch (entry->d_tag)
9523                     {
9524                     case DT_NEEDED:
9525                       printf (_("Shared library: [%s]"), name);
9526
9527                       if (streq (name, program_interpreter))
9528                         printf (_(" program interpreter"));
9529                       break;
9530
9531                     case DT_SONAME:
9532                       printf (_("Library soname: [%s]"), name);
9533                       break;
9534
9535                     case DT_RPATH:
9536                       printf (_("Library rpath: [%s]"), name);
9537                       break;
9538
9539                     case DT_RUNPATH:
9540                       printf (_("Library runpath: [%s]"), name);
9541                       break;
9542
9543                     default:
9544                       print_vma (entry->d_un.d_val, PREFIX_HEX);
9545                       break;
9546                     }
9547                 }
9548               else
9549                 print_vma (entry->d_un.d_val, PREFIX_HEX);
9550
9551               putchar ('\n');
9552             }
9553           break;
9554
9555         case DT_PLTRELSZ:
9556         case DT_RELASZ  :
9557         case DT_STRSZ   :
9558         case DT_RELSZ   :
9559         case DT_RELAENT :
9560         case DT_SYMENT  :
9561         case DT_RELENT  :
9562           dynamic_info[entry->d_tag] = entry->d_un.d_val;
9563         case DT_PLTPADSZ:
9564         case DT_MOVEENT :
9565         case DT_MOVESZ  :
9566         case DT_INIT_ARRAYSZ:
9567         case DT_FINI_ARRAYSZ:
9568         case DT_GNU_CONFLICTSZ:
9569         case DT_GNU_LIBLISTSZ:
9570           if (do_dynamic)
9571             {
9572               print_vma (entry->d_un.d_val, UNSIGNED);
9573               printf (_(" (bytes)\n"));
9574             }
9575           break;
9576
9577         case DT_VERDEFNUM:
9578         case DT_VERNEEDNUM:
9579         case DT_RELACOUNT:
9580         case DT_RELCOUNT:
9581           if (do_dynamic)
9582             {
9583               print_vma (entry->d_un.d_val, UNSIGNED);
9584               putchar ('\n');
9585             }
9586           break;
9587
9588         case DT_SYMINSZ:
9589         case DT_SYMINENT:
9590         case DT_SYMINFO:
9591         case DT_USED:
9592         case DT_INIT_ARRAY:
9593         case DT_FINI_ARRAY:
9594           if (do_dynamic)
9595             {
9596               if (entry->d_tag == DT_USED
9597                   && VALID_DYNAMIC_NAME (entry->d_un.d_val))
9598                 {
9599                   char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
9600
9601                   if (*name)
9602                     {
9603                       printf (_("Not needed object: [%s]\n"), name);
9604                       break;
9605                     }
9606                 }
9607
9608               print_vma (entry->d_un.d_val, PREFIX_HEX);
9609               putchar ('\n');
9610             }
9611           break;
9612
9613         case DT_BIND_NOW:
9614           /* The value of this entry is ignored.  */
9615           if (do_dynamic)
9616             putchar ('\n');
9617           break;
9618
9619         case DT_GNU_PRELINKED:
9620           if (do_dynamic)
9621             {
9622               struct tm * tmp;
9623               time_t atime = entry->d_un.d_val;
9624
9625               tmp = gmtime (&atime);
9626               /* PR 17533 file: 041-1244816-0.004.  */
9627               if (tmp == NULL)
9628                 printf (_("<corrupt time val: %lx"),
9629                         (unsigned long) atime);
9630               else
9631                 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
9632                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9633                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
9634
9635             }
9636           break;
9637
9638         case DT_GNU_HASH:
9639           dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
9640           if (do_dynamic)
9641             {
9642               print_vma (entry->d_un.d_val, PREFIX_HEX);
9643               putchar ('\n');
9644             }
9645           break;
9646
9647         default:
9648           if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
9649             version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
9650               entry->d_un.d_val;
9651
9652           if (do_dynamic)
9653             {
9654               switch (elf_header.e_machine)
9655                 {
9656                 case EM_MIPS:
9657                 case EM_MIPS_RS3_LE:
9658                   dynamic_section_mips_val (entry);
9659                   break;
9660                 case EM_PARISC:
9661                   dynamic_section_parisc_val (entry);
9662                   break;
9663                 case EM_IA_64:
9664                   dynamic_section_ia64_val (entry);
9665                   break;
9666                 default:
9667                   print_vma (entry->d_un.d_val, PREFIX_HEX);
9668                   putchar ('\n');
9669                 }
9670             }
9671           break;
9672         }
9673     }
9674
9675   return 1;
9676 }
9677
9678 static char *
9679 get_ver_flags (unsigned int flags)
9680 {
9681   static char buff[32];
9682
9683   buff[0] = 0;
9684
9685   if (flags == 0)
9686     return _("none");
9687
9688   if (flags & VER_FLG_BASE)
9689     strcat (buff, "BASE ");
9690
9691   if (flags & VER_FLG_WEAK)
9692     {
9693       if (flags & VER_FLG_BASE)
9694         strcat (buff, "| ");
9695
9696       strcat (buff, "WEAK ");
9697     }
9698
9699   if (flags & VER_FLG_INFO)
9700     {
9701       if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
9702         strcat (buff, "| ");
9703
9704       strcat (buff, "INFO ");
9705     }
9706
9707   if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
9708     strcat (buff, _("| <unknown>"));
9709
9710   return buff;
9711 }
9712
9713 /* Display the contents of the version sections.  */
9714
9715 static int
9716 process_version_sections (FILE * file)
9717 {
9718   Elf_Internal_Shdr * section;
9719   unsigned i;
9720   int found = 0;
9721
9722   if (! do_version)
9723     return 1;
9724
9725   for (i = 0, section = section_headers;
9726        i < elf_header.e_shnum;
9727        i++, section++)
9728     {
9729       switch (section->sh_type)
9730         {
9731         case SHT_GNU_verdef:
9732           {
9733             Elf_External_Verdef * edefs;
9734             unsigned int idx;
9735             unsigned int cnt;
9736             char * endbuf;
9737
9738             found = 1;
9739
9740             printf (_("\nVersion definition section '%s' contains %u entries:\n"),
9741                     printable_section_name (section),
9742                     section->sh_info);
9743
9744             printf (_("  Addr: 0x"));
9745             printf_vma (section->sh_addr);
9746             printf (_("  Offset: %#08lx  Link: %u (%s)"),
9747                     (unsigned long) section->sh_offset, section->sh_link,
9748                     printable_section_name_from_index (section->sh_link));
9749
9750             edefs = (Elf_External_Verdef *)
9751                 get_data (NULL, file, section->sh_offset, 1,section->sh_size,
9752                           _("version definition section"));
9753             if (!edefs)
9754               break;
9755             endbuf = (char *) edefs + section->sh_size;
9756
9757             for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
9758               {
9759                 char * vstart;
9760                 Elf_External_Verdef * edef;
9761                 Elf_Internal_Verdef ent;
9762                 Elf_External_Verdaux * eaux;
9763                 Elf_Internal_Verdaux aux;
9764                 int j;
9765                 int isum;
9766
9767                 /* Check for very large indicies.  */
9768                 if (idx > (size_t) (endbuf - (char *) edefs))
9769                   break;
9770
9771                 vstart = ((char *) edefs) + idx;
9772                 if (vstart + sizeof (*edef) > endbuf)
9773                   break;
9774
9775                 edef = (Elf_External_Verdef *) vstart;
9776
9777                 ent.vd_version = BYTE_GET (edef->vd_version);
9778                 ent.vd_flags   = BYTE_GET (edef->vd_flags);
9779                 ent.vd_ndx     = BYTE_GET (edef->vd_ndx);
9780                 ent.vd_cnt     = BYTE_GET (edef->vd_cnt);
9781                 ent.vd_hash    = BYTE_GET (edef->vd_hash);
9782                 ent.vd_aux     = BYTE_GET (edef->vd_aux);
9783                 ent.vd_next    = BYTE_GET (edef->vd_next);
9784
9785                 printf (_("  %#06x: Rev: %d  Flags: %s"),
9786                         idx, ent.vd_version, get_ver_flags (ent.vd_flags));
9787
9788                 printf (_("  Index: %d  Cnt: %d  "),
9789                         ent.vd_ndx, ent.vd_cnt);
9790
9791                 /* Check for overflow.  */
9792                 if (ent.vd_aux > (size_t) (endbuf - vstart))
9793                   break;
9794
9795                 vstart += ent.vd_aux;
9796
9797                 eaux = (Elf_External_Verdaux *) vstart;
9798
9799                 aux.vda_name = BYTE_GET (eaux->vda_name);
9800                 aux.vda_next = BYTE_GET (eaux->vda_next);
9801
9802                 if (VALID_DYNAMIC_NAME (aux.vda_name))
9803                   printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
9804                 else
9805                   printf (_("Name index: %ld\n"), aux.vda_name);
9806
9807                 isum = idx + ent.vd_aux;
9808
9809                 for (j = 1; j < ent.vd_cnt; j++)
9810                   {
9811                     /* Check for overflow.  */
9812                     if (aux.vda_next > (size_t) (endbuf - vstart))
9813                       break;
9814
9815                     isum   += aux.vda_next;
9816                     vstart += aux.vda_next;
9817
9818                     eaux = (Elf_External_Verdaux *) vstart;
9819                     if (vstart + sizeof (*eaux) > endbuf)
9820                       break;
9821
9822                     aux.vda_name = BYTE_GET (eaux->vda_name);
9823                     aux.vda_next = BYTE_GET (eaux->vda_next);
9824
9825                     if (VALID_DYNAMIC_NAME (aux.vda_name))
9826                       printf (_("  %#06x: Parent %d: %s\n"),
9827                               isum, j, GET_DYNAMIC_NAME (aux.vda_name));
9828                     else
9829                       printf (_("  %#06x: Parent %d, name index: %ld\n"),
9830                               isum, j, aux.vda_name);
9831                   }
9832
9833                 if (j < ent.vd_cnt)
9834                   printf (_("  Version def aux past end of section\n"));
9835
9836                 /* PR 17531: file: id:000001,src:000172+005151,op:splice,rep:2.  */
9837                 if (idx + ent.vd_next <= idx)
9838                   break;
9839
9840                 idx += ent.vd_next;
9841               }
9842
9843             if (cnt < section->sh_info)
9844               printf (_("  Version definition past end of section\n"));
9845
9846             free (edefs);
9847           }
9848           break;
9849
9850         case SHT_GNU_verneed:
9851           {
9852             Elf_External_Verneed * eneed;
9853             unsigned int idx;
9854             unsigned int cnt;
9855             char * endbuf;
9856
9857             found = 1;
9858
9859             printf (_("\nVersion needs section '%s' contains %u entries:\n"),
9860                     printable_section_name (section), section->sh_info);
9861
9862             printf (_(" Addr: 0x"));
9863             printf_vma (section->sh_addr);
9864             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
9865                     (unsigned long) section->sh_offset, section->sh_link,
9866                     printable_section_name_from_index (section->sh_link));
9867
9868             eneed = (Elf_External_Verneed *) get_data (NULL, file,
9869                                                        section->sh_offset, 1,
9870                                                        section->sh_size,
9871                                                        _("Version Needs section"));
9872             if (!eneed)
9873               break;
9874             endbuf = (char *) eneed + section->sh_size;
9875
9876             for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
9877               {
9878                 Elf_External_Verneed * entry;
9879                 Elf_Internal_Verneed ent;
9880                 int j;
9881                 int isum;
9882                 char * vstart;
9883
9884                 if (idx > (size_t) (endbuf - (char *) eneed))
9885                   break;
9886
9887                 vstart = ((char *) eneed) + idx;
9888                 if (vstart + sizeof (*entry) > endbuf)
9889                   break;
9890
9891                 entry = (Elf_External_Verneed *) vstart;
9892
9893                 ent.vn_version = BYTE_GET (entry->vn_version);
9894                 ent.vn_cnt     = BYTE_GET (entry->vn_cnt);
9895                 ent.vn_file    = BYTE_GET (entry->vn_file);
9896                 ent.vn_aux     = BYTE_GET (entry->vn_aux);
9897                 ent.vn_next    = BYTE_GET (entry->vn_next);
9898
9899                 printf (_("  %#06x: Version: %d"), idx, ent.vn_version);
9900
9901                 if (VALID_DYNAMIC_NAME (ent.vn_file))
9902                   printf (_("  File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
9903                 else
9904                   printf (_("  File: %lx"), ent.vn_file);
9905
9906                 printf (_("  Cnt: %d\n"), ent.vn_cnt);
9907
9908                 /* Check for overflow.  */
9909                 if (ent.vn_aux > (size_t) (endbuf - vstart))
9910                   break;
9911                 vstart += ent.vn_aux;
9912
9913                 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
9914                   {
9915                     Elf_External_Vernaux * eaux;
9916                     Elf_Internal_Vernaux aux;
9917
9918                     if (vstart + sizeof (*eaux) > endbuf)
9919                       break;
9920                     eaux = (Elf_External_Vernaux *) vstart;
9921
9922                     aux.vna_hash  = BYTE_GET (eaux->vna_hash);
9923                     aux.vna_flags = BYTE_GET (eaux->vna_flags);
9924                     aux.vna_other = BYTE_GET (eaux->vna_other);
9925                     aux.vna_name  = BYTE_GET (eaux->vna_name);
9926                     aux.vna_next  = BYTE_GET (eaux->vna_next);
9927
9928                     if (VALID_DYNAMIC_NAME (aux.vna_name))
9929                       printf (_("  %#06x:   Name: %s"),
9930                               isum, GET_DYNAMIC_NAME (aux.vna_name));
9931                     else
9932                       printf (_("  %#06x:   Name index: %lx"),
9933                               isum, aux.vna_name);
9934
9935                     printf (_("  Flags: %s  Version: %d\n"),
9936                             get_ver_flags (aux.vna_flags), aux.vna_other);
9937
9938                     /* Check for overflow.  */
9939                     if (aux.vna_next > (size_t) (endbuf - vstart)
9940                         || (aux.vna_next == 0 && j < ent.vn_cnt - 1))
9941                       {
9942                         warn (_("Invalid vna_next field of %lx\n"),
9943                               aux.vna_next);
9944                         j = ent.vn_cnt;
9945                         break;
9946                       }
9947                     isum   += aux.vna_next;
9948                     vstart += aux.vna_next;
9949                   }
9950
9951                 if (j < ent.vn_cnt)
9952                   warn (_("Missing Version Needs auxillary information\n"));
9953
9954                 if (ent.vn_next == 0 && cnt < section->sh_info - 1)
9955                   {
9956                     warn (_("Corrupt Version Needs structure - offset to next structure is zero with entries still left to be processed\n"));
9957                     cnt = section->sh_info;
9958                     break;
9959                   }
9960                 idx += ent.vn_next;
9961               }
9962
9963             if (cnt < section->sh_info)
9964               warn (_("Missing Version Needs information\n"));
9965
9966             free (eneed);
9967           }
9968           break;
9969
9970         case SHT_GNU_versym:
9971           {
9972             Elf_Internal_Shdr * link_section;
9973             size_t total;
9974             unsigned int cnt;
9975             unsigned char * edata;
9976             unsigned short * data;
9977             char * strtab;
9978             Elf_Internal_Sym * symbols;
9979             Elf_Internal_Shdr * string_sec;
9980             unsigned long num_syms;
9981             long off;
9982
9983             if (section->sh_link >= elf_header.e_shnum)
9984               break;
9985
9986             link_section = section_headers + section->sh_link;
9987             total = section->sh_size / sizeof (Elf_External_Versym);
9988
9989             if (link_section->sh_link >= elf_header.e_shnum)
9990               break;
9991
9992             found = 1;
9993
9994             symbols = GET_ELF_SYMBOLS (file, link_section, & num_syms);
9995             if (symbols == NULL)
9996               break;
9997
9998             string_sec = section_headers + link_section->sh_link;
9999
10000             strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
10001                                         string_sec->sh_size,
10002                                         _("version string table"));
10003             if (!strtab)
10004               {
10005                 free (symbols);
10006                 break;
10007               }
10008
10009             printf (_("\nVersion symbols section '%s' contains %lu entries:\n"),
10010                     printable_section_name (section), (unsigned long) total);
10011
10012             printf (_(" Addr: "));
10013             printf_vma (section->sh_addr);
10014             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
10015                     (unsigned long) section->sh_offset, section->sh_link,
10016                     printable_section_name (link_section));
10017
10018             off = offset_from_vma (file,
10019                                    version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10020                                    total * sizeof (short));
10021             edata = (unsigned char *) get_data (NULL, file, off, total,
10022                                                 sizeof (short),
10023                                                 _("version symbol data"));
10024             if (!edata)
10025               {
10026                 free (strtab);
10027                 free (symbols);
10028                 break;
10029               }
10030
10031             data = (short unsigned int *) cmalloc (total, sizeof (short));
10032
10033             for (cnt = total; cnt --;)
10034               data[cnt] = byte_get (edata + cnt * sizeof (short),
10035                                     sizeof (short));
10036
10037             free (edata);
10038
10039             for (cnt = 0; cnt < total; cnt += 4)
10040               {
10041                 int j, nn;
10042                 char *name;
10043                 char *invalid = _("*invalid*");
10044
10045                 printf ("  %03x:", cnt);
10046
10047                 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
10048                   switch (data[cnt + j])
10049                     {
10050                     case 0:
10051                       fputs (_("   0 (*local*)    "), stdout);
10052                       break;
10053
10054                     case 1:
10055                       fputs (_("   1 (*global*)   "), stdout);
10056                       break;
10057
10058                     default:
10059                       nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
10060                                    data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
10061
10062                       /* If this index value is greater than the size of the symbols
10063                          array, break to avoid an out-of-bounds read.  */
10064                       if ((unsigned long)(cnt + j) >= num_syms)
10065                         {
10066                           warn (_("invalid index into symbol array\n"));
10067                           break;
10068                         }
10069
10070                       name = NULL;
10071                       if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
10072                         {
10073                           Elf_Internal_Verneed ivn;
10074                           unsigned long offset;
10075
10076                           offset = offset_from_vma
10077                             (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10078                              sizeof (Elf_External_Verneed));
10079
10080                           do
10081                             {
10082                               Elf_Internal_Vernaux ivna;
10083                               Elf_External_Verneed evn;
10084                               Elf_External_Vernaux evna;
10085                               unsigned long a_off;
10086
10087                               if (get_data (&evn, file, offset, sizeof (evn), 1,
10088                                             _("version need")) == NULL)
10089                                 break;
10090
10091                               ivn.vn_aux  = BYTE_GET (evn.vn_aux);
10092                               ivn.vn_next = BYTE_GET (evn.vn_next);
10093
10094                               a_off = offset + ivn.vn_aux;
10095
10096                               do
10097                                 {
10098                                   if (get_data (&evna, file, a_off, sizeof (evna),
10099                                                 1, _("version need aux (2)")) == NULL)
10100                                     {
10101                                       ivna.vna_next  = 0;
10102                                       ivna.vna_other = 0;
10103                                     }
10104                                   else
10105                                     {
10106                                       ivna.vna_next  = BYTE_GET (evna.vna_next);
10107                                       ivna.vna_other = BYTE_GET (evna.vna_other);
10108                                     }
10109
10110                                   a_off += ivna.vna_next;
10111                                 }
10112                               while (ivna.vna_other != data[cnt + j]
10113                                      && ivna.vna_next != 0);
10114
10115                               if (ivna.vna_other == data[cnt + j])
10116                                 {
10117                                   ivna.vna_name = BYTE_GET (evna.vna_name);
10118
10119                                   if (ivna.vna_name >= string_sec->sh_size)
10120                                     name = invalid;
10121                                   else
10122                                     name = strtab + ivna.vna_name;
10123                                   break;
10124                                 }
10125
10126                               offset += ivn.vn_next;
10127                             }
10128                           while (ivn.vn_next);
10129                         }
10130
10131                       if (data[cnt + j] != 0x8001
10132                           && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10133                         {
10134                           Elf_Internal_Verdef ivd;
10135                           Elf_External_Verdef evd;
10136                           unsigned long offset;
10137
10138                           offset = offset_from_vma
10139                             (file, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10140                              sizeof evd);
10141
10142                           do
10143                             {
10144                               if (get_data (&evd, file, offset, sizeof (evd), 1,
10145                                             _("version def")) == NULL)
10146                                 {
10147                                   ivd.vd_next = 0;
10148                                   /* PR 17531: file: 046-1082287-0.004.  */
10149                                   ivd.vd_ndx  = (data[cnt + j] & VERSYM_VERSION) + 1;
10150                                   break;
10151                                 }
10152                               else
10153                                 {
10154                                   ivd.vd_next = BYTE_GET (evd.vd_next);
10155                                   ivd.vd_ndx  = BYTE_GET (evd.vd_ndx);
10156                                 }
10157
10158                               offset += ivd.vd_next;
10159                             }
10160                           while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
10161                                  && ivd.vd_next != 0);
10162
10163                           if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
10164                             {
10165                               Elf_External_Verdaux evda;
10166                               Elf_Internal_Verdaux ivda;
10167
10168                               ivd.vd_aux = BYTE_GET (evd.vd_aux);
10169
10170                               if (get_data (&evda, file,
10171                                             offset - ivd.vd_next + ivd.vd_aux,
10172                                             sizeof (evda), 1,
10173                                             _("version def aux")) == NULL)
10174                                 break;
10175
10176                               ivda.vda_name = BYTE_GET (evda.vda_name);
10177
10178                               if (ivda.vda_name >= string_sec->sh_size)
10179                                 name = invalid;
10180                               else if (name != NULL && name != invalid)
10181                                 name = _("*both*");
10182                               else
10183                                 name = strtab + ivda.vda_name;
10184                             }
10185                         }
10186                       if (name != NULL)
10187                         nn += printf ("(%s%-*s",
10188                                       name,
10189                                       12 - (int) strlen (name),
10190                                       ")");
10191
10192                       if (nn < 18)
10193                         printf ("%*c", 18 - nn, ' ');
10194                     }
10195
10196                 putchar ('\n');
10197               }
10198
10199             free (data);
10200             free (strtab);
10201             free (symbols);
10202           }
10203           break;
10204
10205         default:
10206           break;
10207         }
10208     }
10209
10210   if (! found)
10211     printf (_("\nNo version information found in this file.\n"));
10212
10213   return 1;
10214 }
10215
10216 static const char *
10217 get_symbol_binding (unsigned int binding)
10218 {
10219   static char buff[32];
10220
10221   switch (binding)
10222     {
10223     case STB_LOCAL:     return "LOCAL";
10224     case STB_GLOBAL:    return "GLOBAL";
10225     case STB_WEAK:      return "WEAK";
10226     default:
10227       if (binding >= STB_LOPROC && binding <= STB_HIPROC)
10228         snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
10229                   binding);
10230       else if (binding >= STB_LOOS && binding <= STB_HIOS)
10231         {
10232           if (binding == STB_GNU_UNIQUE
10233               && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
10234                   /* GNU is still using the default value 0.  */
10235                   || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10236             return "UNIQUE";
10237           snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
10238         }
10239       else
10240         snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
10241       return buff;
10242     }
10243 }
10244
10245 static const char *
10246 get_symbol_type (unsigned int type)
10247 {
10248   static char buff[32];
10249
10250   switch (type)
10251     {
10252     case STT_NOTYPE:    return "NOTYPE";
10253     case STT_OBJECT:    return "OBJECT";
10254     case STT_FUNC:      return "FUNC";
10255     case STT_SECTION:   return "SECTION";
10256     case STT_FILE:      return "FILE";
10257     case STT_COMMON:    return "COMMON";
10258     case STT_TLS:       return "TLS";
10259     case STT_RELC:      return "RELC";
10260     case STT_SRELC:     return "SRELC";
10261     default:
10262       if (type >= STT_LOPROC && type <= STT_HIPROC)
10263         {
10264           if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
10265             return "THUMB_FUNC";
10266
10267           if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
10268             return "REGISTER";
10269
10270           if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
10271             return "PARISC_MILLI";
10272
10273           snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
10274         }
10275       else if (type >= STT_LOOS && type <= STT_HIOS)
10276         {
10277           if (elf_header.e_machine == EM_PARISC)
10278             {
10279               if (type == STT_HP_OPAQUE)
10280                 return "HP_OPAQUE";
10281               if (type == STT_HP_STUB)
10282                 return "HP_STUB";
10283             }
10284
10285           if (type == STT_GNU_IFUNC
10286               && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
10287                   || elf_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD
10288                   /* GNU is still using the default value 0.  */
10289                   || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10290             return "IFUNC";
10291
10292           snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
10293         }
10294       else
10295         snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
10296       return buff;
10297     }
10298 }
10299
10300 static const char *
10301 get_symbol_visibility (unsigned int visibility)
10302 {
10303   switch (visibility)
10304     {
10305     case STV_DEFAULT:   return "DEFAULT";
10306     case STV_INTERNAL:  return "INTERNAL";
10307     case STV_HIDDEN:    return "HIDDEN";
10308     case STV_PROTECTED: return "PROTECTED";
10309     default:
10310       error (_("Unrecognized visibility value: %u"), visibility);
10311       return _("<unknown>");
10312     }
10313 }
10314
10315 static const char *
10316 get_solaris_symbol_visibility (unsigned int visibility)
10317 {
10318   switch (visibility)
10319     {
10320     case 4: return "EXPORTED";
10321     case 5: return "SINGLETON";
10322     case 6: return "ELIMINATE";
10323     default: return get_symbol_visibility (visibility);
10324     }
10325 }
10326
10327 static const char *
10328 get_mips_symbol_other (unsigned int other)
10329 {
10330   switch (other)
10331     {
10332     case STO_OPTIONAL:
10333       return "OPTIONAL";
10334     case STO_MIPS_PLT:
10335       return "MIPS PLT";
10336     case STO_MIPS_PIC:
10337       return "MIPS PIC";
10338     case STO_MICROMIPS:
10339       return "MICROMIPS";
10340     case STO_MICROMIPS | STO_MIPS_PIC:
10341       return "MICROMIPS, MIPS PIC";
10342     case STO_MIPS16:
10343       return "MIPS16";
10344     default:
10345       return NULL;
10346     }
10347 }
10348
10349 static const char *
10350 get_ia64_symbol_other (unsigned int other)
10351 {
10352   if (is_ia64_vms ())
10353     {
10354       static char res[32];
10355
10356       res[0] = 0;
10357
10358       /* Function types is for images and .STB files only.  */
10359       switch (elf_header.e_type)
10360         {
10361         case ET_DYN:
10362         case ET_EXEC:
10363           switch (VMS_ST_FUNC_TYPE (other))
10364             {
10365             case VMS_SFT_CODE_ADDR:
10366               strcat (res, " CA");
10367               break;
10368             case VMS_SFT_SYMV_IDX:
10369               strcat (res, " VEC");
10370               break;
10371             case VMS_SFT_FD:
10372               strcat (res, " FD");
10373               break;
10374             case VMS_SFT_RESERVE:
10375               strcat (res, " RSV");
10376               break;
10377             default:
10378               warn (_("Unrecognized IA64 VMS ST Function type: %d\n"),
10379                     VMS_ST_FUNC_TYPE (other));
10380               strcat (res, " <unknown>");
10381               break;
10382             }
10383           break;
10384         default:
10385           break;
10386         }
10387       switch (VMS_ST_LINKAGE (other))
10388         {
10389         case VMS_STL_IGNORE:
10390           strcat (res, " IGN");
10391           break;
10392         case VMS_STL_RESERVE:
10393           strcat (res, " RSV");
10394           break;
10395         case VMS_STL_STD:
10396           strcat (res, " STD");
10397           break;
10398         case VMS_STL_LNK:
10399           strcat (res, " LNK");
10400           break;
10401         default:
10402           warn (_("Unrecognized IA64 VMS ST Linkage: %d\n"),
10403                 VMS_ST_LINKAGE (other));
10404           strcat (res, " <unknown>");
10405           break;
10406         }
10407
10408       if (res[0] != 0)
10409         return res + 1;
10410       else
10411         return res;
10412     }
10413   return NULL;
10414 }
10415
10416 static const char *
10417 get_ppc64_symbol_other (unsigned int other)
10418 {
10419   if (PPC64_LOCAL_ENTRY_OFFSET (other) != 0)
10420     {
10421       static char buf[32];
10422       snprintf (buf, sizeof buf, _("<localentry>: %d"),
10423                 PPC64_LOCAL_ENTRY_OFFSET (other));
10424       return buf;
10425     }
10426   return NULL;
10427 }
10428
10429 static const char *
10430 get_symbol_other (unsigned int other)
10431 {
10432   const char * result = NULL;
10433   static char buff [32];
10434
10435   if (other == 0)
10436     return "";
10437
10438   switch (elf_header.e_machine)
10439     {
10440     case EM_MIPS:
10441       result = get_mips_symbol_other (other);
10442       break;
10443     case EM_IA_64:
10444       result = get_ia64_symbol_other (other);
10445       break;
10446     case EM_PPC64:
10447       result = get_ppc64_symbol_other (other);
10448       break;
10449     default:
10450       result = NULL;
10451       break;
10452     }
10453
10454   if (result)
10455     return result;
10456
10457   snprintf (buff, sizeof buff, _("<other>: %x"), other);
10458   return buff;
10459 }
10460
10461 static const char *
10462 get_symbol_index_type (unsigned int type)
10463 {
10464   static char buff[32];
10465
10466   switch (type)
10467     {
10468     case SHN_UNDEF:     return "UND";
10469     case SHN_ABS:       return "ABS";
10470     case SHN_COMMON:    return "COM";
10471     default:
10472       if (type == SHN_IA_64_ANSI_COMMON
10473           && elf_header.e_machine == EM_IA_64
10474           && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
10475         return "ANSI_COM";
10476       else if ((elf_header.e_machine == EM_X86_64
10477                 || elf_header.e_machine == EM_L1OM
10478                 || elf_header.e_machine == EM_K1OM)
10479                && type == SHN_X86_64_LCOMMON)
10480         return "LARGE_COM";
10481       else if ((type == SHN_MIPS_SCOMMON
10482                 && elf_header.e_machine == EM_MIPS)
10483                || (type == SHN_TIC6X_SCOMMON
10484                    && elf_header.e_machine == EM_TI_C6000))
10485         return "SCOM";
10486       else if (type == SHN_MIPS_SUNDEFINED
10487                && elf_header.e_machine == EM_MIPS)
10488         return "SUND";
10489       else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
10490         sprintf (buff, "PRC[0x%04x]", type & 0xffff);
10491       else if (type >= SHN_LOOS && type <= SHN_HIOS)
10492         sprintf (buff, "OS [0x%04x]", type & 0xffff);
10493       else if (type >= SHN_LORESERVE)
10494         sprintf (buff, "RSV[0x%04x]", type & 0xffff);
10495       else if (type >= elf_header.e_shnum)
10496         sprintf (buff, _("bad section index[%3d]"), type);
10497       else
10498         sprintf (buff, "%3d", type);
10499       break;
10500     }
10501
10502   return buff;
10503 }
10504
10505 static bfd_vma *
10506 get_dynamic_data (FILE * file, bfd_size_type number, unsigned int ent_size)
10507 {
10508   unsigned char * e_data;
10509   bfd_vma * i_data;
10510
10511   /* If the size_t type is smaller than the bfd_size_type, eg because
10512      you are building a 32-bit tool on a 64-bit host, then make sure
10513      that when (number) is cast to (size_t) no information is lost.  */
10514   if (sizeof (size_t) < sizeof (bfd_size_type)
10515       && (bfd_size_type) ((size_t) number) != number)
10516     {
10517       error (_("Size truncation prevents reading %" BFD_VMA_FMT "u"
10518                " elements of size %u\n"),
10519              number, ent_size);
10520       return NULL;
10521     }
10522
10523   /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
10524      attempting to allocate memory when the read is bound to fail.  */
10525   if (ent_size * number > current_file_size)
10526     {
10527       error (_("Invalid number of dynamic entries: %" BFD_VMA_FMT "u\n"),
10528              number);
10529       return NULL;
10530     }
10531
10532   e_data = (unsigned char *) cmalloc ((size_t) number, ent_size);
10533   if (e_data == NULL)
10534     {
10535       error (_("Out of memory reading %" BFD_VMA_FMT "u dynamic entries\n"),
10536              number);
10537       return NULL;
10538     }
10539
10540   if (fread (e_data, ent_size, (size_t) number, file) != number)
10541     {
10542       error (_("Unable to read in %" BFD_VMA_FMT "u bytes of dynamic data\n"),
10543              number * ent_size);
10544       free (e_data);
10545       return NULL;
10546     }
10547
10548   i_data = (bfd_vma *) cmalloc ((size_t) number, sizeof (*i_data));
10549   if (i_data == NULL)
10550     {
10551       error (_("Out of memory allocating space for %" BFD_VMA_FMT "u"
10552                " dynamic entries\n"),
10553              number);
10554       free (e_data);
10555       return NULL;
10556     }
10557
10558   while (number--)
10559     i_data[number] = byte_get (e_data + number * ent_size, ent_size);
10560
10561   free (e_data);
10562
10563   return i_data;
10564 }
10565
10566 static void
10567 print_dynamic_symbol (bfd_vma si, unsigned long hn)
10568 {
10569   Elf_Internal_Sym * psym;
10570   int n;
10571
10572   n = print_vma (si, DEC_5);
10573   if (n < 5)
10574     fputs (&"     "[n], stdout);
10575   printf (" %3lu: ", hn);
10576
10577   if (dynamic_symbols == NULL || si >= num_dynamic_syms)
10578     {
10579       printf (_("<No info available for dynamic symbol number %lu>\n"),
10580               (unsigned long) si);
10581       return;
10582     }
10583
10584   psym = dynamic_symbols + si;
10585   print_vma (psym->st_value, LONG_HEX);
10586   putchar (' ');
10587   print_vma (psym->st_size, DEC_5);
10588
10589   printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
10590   printf (" %-6s",  get_symbol_binding (ELF_ST_BIND (psym->st_info)));
10591
10592   if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
10593     printf (" %-7s",  get_solaris_symbol_visibility (psym->st_other));
10594   else
10595     {
10596       unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
10597
10598       printf (" %-7s",  get_symbol_visibility (vis));
10599       /* Check to see if any other bits in the st_other field are set.
10600          Note - displaying this information disrupts the layout of the
10601          table being generated, but for the moment this case is very
10602          rare.  */
10603       if (psym->st_other ^ vis)
10604         printf (" [%s] ", get_symbol_other (psym->st_other ^ vis));
10605     }
10606
10607   printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
10608   if (VALID_DYNAMIC_NAME (psym->st_name))
10609     print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
10610   else
10611     printf (_(" <corrupt: %14ld>"), psym->st_name);
10612   putchar ('\n');
10613 }
10614
10615 static const char *
10616 get_symbol_version_string (FILE *file, int is_dynsym,
10617                            const char *strtab,
10618                            unsigned long int strtab_size,
10619                            unsigned int si, Elf_Internal_Sym *psym,
10620                            enum versioned_symbol_info *sym_info,
10621                            unsigned short *vna_other)
10622 {
10623   unsigned char data[2];
10624   unsigned short vers_data;
10625   unsigned long offset;
10626
10627   if (!is_dynsym
10628       || version_info[DT_VERSIONTAGIDX (DT_VERSYM)] == 0)
10629     return NULL;
10630
10631   offset = offset_from_vma (file, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10632                             sizeof data + si * sizeof (vers_data));
10633
10634   if (get_data (&data, file, offset + si * sizeof (vers_data),
10635                 sizeof (data), 1, _("version data")) == NULL)
10636     return NULL;
10637
10638   vers_data = byte_get (data, 2);
10639
10640   if ((vers_data & VERSYM_HIDDEN) == 0 && vers_data <= 1)
10641     return NULL;
10642
10643   /* Usually we'd only see verdef for defined symbols, and verneed for
10644      undefined symbols.  However, symbols defined by the linker in
10645      .dynbss for variables copied from a shared library in order to
10646      avoid text relocations are defined yet have verneed.  We could
10647      use a heuristic to detect the special case, for example, check
10648      for verneed first on symbols defined in SHT_NOBITS sections, but
10649      it is simpler and more reliable to just look for both verdef and
10650      verneed.  .dynbss might not be mapped to a SHT_NOBITS section.  */
10651
10652   if (psym->st_shndx != SHN_UNDEF
10653       && vers_data != 0x8001
10654       && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10655     {
10656       Elf_Internal_Verdef ivd;
10657       Elf_Internal_Verdaux ivda;
10658       Elf_External_Verdaux evda;
10659       unsigned long off;
10660
10661       off = offset_from_vma (file,
10662                              version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10663                              sizeof (Elf_External_Verdef));
10664
10665       do
10666         {
10667           Elf_External_Verdef evd;
10668
10669           if (get_data (&evd, file, off, sizeof (evd), 1,
10670                         _("version def")) == NULL)
10671             {
10672               ivd.vd_ndx = 0;
10673               ivd.vd_aux = 0;
10674               ivd.vd_next = 0;
10675             }
10676           else
10677             {
10678               ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
10679               ivd.vd_aux = BYTE_GET (evd.vd_aux);
10680               ivd.vd_next = BYTE_GET (evd.vd_next);
10681             }
10682
10683           off += ivd.vd_next;
10684         }
10685       while (ivd.vd_ndx != (vers_data & VERSYM_VERSION) && ivd.vd_next != 0);
10686
10687       if (ivd.vd_ndx == (vers_data & VERSYM_VERSION))
10688         {
10689           off -= ivd.vd_next;
10690           off += ivd.vd_aux;
10691
10692           if (get_data (&evda, file, off, sizeof (evda), 1,
10693                         _("version def aux")) != NULL)
10694             {
10695               ivda.vda_name = BYTE_GET (evda.vda_name);
10696
10697               if (psym->st_name != ivda.vda_name)
10698                 {
10699                   *sym_info = ((vers_data & VERSYM_HIDDEN) != 0
10700                                ? symbol_hidden : symbol_public);
10701                   return (ivda.vda_name < strtab_size
10702                           ? strtab + ivda.vda_name : _("<corrupt>"));
10703                 }
10704             }
10705         }
10706     }
10707
10708   if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
10709     {
10710       Elf_External_Verneed evn;
10711       Elf_Internal_Verneed ivn;
10712       Elf_Internal_Vernaux ivna;
10713
10714       offset = offset_from_vma (file,
10715                                 version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10716                                 sizeof evn);
10717       do
10718         {
10719           unsigned long vna_off;
10720
10721           if (get_data (&evn, file, offset, sizeof (evn), 1,
10722                         _("version need")) == NULL)
10723             {
10724               ivna.vna_next = 0;
10725               ivna.vna_other = 0;
10726               ivna.vna_name = 0;
10727               break;
10728             }
10729
10730           ivn.vn_aux  = BYTE_GET (evn.vn_aux);
10731           ivn.vn_next = BYTE_GET (evn.vn_next);
10732
10733           vna_off = offset + ivn.vn_aux;
10734
10735           do
10736             {
10737               Elf_External_Vernaux evna;
10738
10739               if (get_data (&evna, file, vna_off, sizeof (evna), 1,
10740                             _("version need aux (3)")) == NULL)
10741                 {
10742                   ivna.vna_next = 0;
10743                   ivna.vna_other = 0;
10744                   ivna.vna_name = 0;
10745                 }
10746               else
10747                 {
10748                   ivna.vna_other = BYTE_GET (evna.vna_other);
10749                   ivna.vna_next  = BYTE_GET (evna.vna_next);
10750                   ivna.vna_name  = BYTE_GET (evna.vna_name);
10751                 }
10752
10753               vna_off += ivna.vna_next;
10754             }
10755           while (ivna.vna_other != vers_data && ivna.vna_next != 0);
10756
10757           if (ivna.vna_other == vers_data)
10758             break;
10759
10760           offset += ivn.vn_next;
10761         }
10762       while (ivn.vn_next != 0);
10763
10764       if (ivna.vna_other == vers_data)
10765         {
10766           *sym_info = symbol_undefined;
10767           *vna_other = ivna.vna_other;
10768           return (ivna.vna_name < strtab_size
10769                   ? strtab + ivna.vna_name : _("<corrupt>"));
10770         }
10771     }
10772   return NULL;
10773 }
10774
10775 /* Dump the symbol table.  */
10776 static int
10777 process_symbol_table (FILE * file)
10778 {
10779   Elf_Internal_Shdr * section;
10780   bfd_size_type nbuckets = 0;
10781   bfd_size_type nchains = 0;
10782   bfd_vma * buckets = NULL;
10783   bfd_vma * chains = NULL;
10784   bfd_vma ngnubuckets = 0;
10785   bfd_vma * gnubuckets = NULL;
10786   bfd_vma * gnuchains = NULL;
10787   bfd_vma gnusymidx = 0;
10788   bfd_size_type ngnuchains = 0;
10789
10790   if (!do_syms && !do_dyn_syms && !do_histogram)
10791     return 1;
10792
10793   if (dynamic_info[DT_HASH]
10794       && (do_histogram
10795           || (do_using_dynamic
10796               && !do_dyn_syms
10797               && dynamic_strings != NULL)))
10798     {
10799       unsigned char nb[8];
10800       unsigned char nc[8];
10801       unsigned int hash_ent_size = 4;
10802
10803       if ((elf_header.e_machine == EM_ALPHA
10804            || elf_header.e_machine == EM_S390
10805            || elf_header.e_machine == EM_S390_OLD)
10806           && elf_header.e_ident[EI_CLASS] == ELFCLASS64)
10807         hash_ent_size = 8;
10808
10809       if (fseek (file,
10810                  (archive_file_offset
10811                   + offset_from_vma (file, dynamic_info[DT_HASH],
10812                                      sizeof nb + sizeof nc)),
10813                  SEEK_SET))
10814         {
10815           error (_("Unable to seek to start of dynamic information\n"));
10816           goto no_hash;
10817         }
10818
10819       if (fread (nb, hash_ent_size, 1, file) != 1)
10820         {
10821           error (_("Failed to read in number of buckets\n"));
10822           goto no_hash;
10823         }
10824
10825       if (fread (nc, hash_ent_size, 1, file) != 1)
10826         {
10827           error (_("Failed to read in number of chains\n"));
10828           goto no_hash;
10829         }
10830
10831       nbuckets = byte_get (nb, hash_ent_size);
10832       nchains  = byte_get (nc, hash_ent_size);
10833
10834       buckets = get_dynamic_data (file, nbuckets, hash_ent_size);
10835       chains  = get_dynamic_data (file, nchains, hash_ent_size);
10836
10837     no_hash:
10838       if (buckets == NULL || chains == NULL)
10839         {
10840           if (do_using_dynamic)
10841             return 0;
10842           free (buckets);
10843           free (chains);
10844           buckets = NULL;
10845           chains = NULL;
10846           nbuckets = 0;
10847           nchains = 0;
10848         }
10849     }
10850
10851   if (dynamic_info_DT_GNU_HASH
10852       && (do_histogram
10853           || (do_using_dynamic
10854               && !do_dyn_syms
10855               && dynamic_strings != NULL)))
10856     {
10857       unsigned char nb[16];
10858       bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
10859       bfd_vma buckets_vma;
10860
10861       if (fseek (file,
10862                  (archive_file_offset
10863                   + offset_from_vma (file, dynamic_info_DT_GNU_HASH,
10864                                      sizeof nb)),
10865                  SEEK_SET))
10866         {
10867           error (_("Unable to seek to start of dynamic information\n"));
10868           goto no_gnu_hash;
10869         }
10870
10871       if (fread (nb, 16, 1, file) != 1)
10872         {
10873           error (_("Failed to read in number of buckets\n"));
10874           goto no_gnu_hash;
10875         }
10876
10877       ngnubuckets = byte_get (nb, 4);
10878       gnusymidx = byte_get (nb + 4, 4);
10879       bitmaskwords = byte_get (nb + 8, 4);
10880       buckets_vma = dynamic_info_DT_GNU_HASH + 16;
10881       if (is_32bit_elf)
10882         buckets_vma += bitmaskwords * 4;
10883       else
10884         buckets_vma += bitmaskwords * 8;
10885
10886       if (fseek (file,
10887                  (archive_file_offset
10888                   + offset_from_vma (file, buckets_vma, 4)),
10889                  SEEK_SET))
10890         {
10891           error (_("Unable to seek to start of dynamic information\n"));
10892           goto no_gnu_hash;
10893         }
10894
10895       gnubuckets = get_dynamic_data (file, ngnubuckets, 4);
10896
10897       if (gnubuckets == NULL)
10898         goto no_gnu_hash;
10899
10900       for (i = 0; i < ngnubuckets; i++)
10901         if (gnubuckets[i] != 0)
10902           {
10903             if (gnubuckets[i] < gnusymidx)
10904               return 0;
10905
10906             if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
10907               maxchain = gnubuckets[i];
10908           }
10909
10910       if (maxchain == 0xffffffff)
10911         goto no_gnu_hash;
10912
10913       maxchain -= gnusymidx;
10914
10915       if (fseek (file,
10916                  (archive_file_offset
10917                   + offset_from_vma (file, buckets_vma
10918                                            + 4 * (ngnubuckets + maxchain), 4)),
10919                  SEEK_SET))
10920         {
10921           error (_("Unable to seek to start of dynamic information\n"));
10922           goto no_gnu_hash;
10923         }
10924
10925       do
10926         {
10927           if (fread (nb, 4, 1, file) != 1)
10928             {
10929               error (_("Failed to determine last chain length\n"));
10930               goto no_gnu_hash;
10931             }
10932
10933           if (maxchain + 1 == 0)
10934             goto no_gnu_hash;
10935
10936           ++maxchain;
10937         }
10938       while ((byte_get (nb, 4) & 1) == 0);
10939
10940       if (fseek (file,
10941                  (archive_file_offset
10942                   + offset_from_vma (file, buckets_vma + 4 * ngnubuckets, 4)),
10943                  SEEK_SET))
10944         {
10945           error (_("Unable to seek to start of dynamic information\n"));
10946           goto no_gnu_hash;
10947         }
10948
10949       gnuchains = get_dynamic_data (file, maxchain, 4);
10950       ngnuchains = maxchain;
10951
10952     no_gnu_hash:
10953       if (gnuchains == NULL)
10954         {
10955           free (gnubuckets);
10956           gnubuckets = NULL;
10957           ngnubuckets = 0;
10958           if (do_using_dynamic)
10959             return 0;
10960         }
10961     }
10962
10963   if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
10964       && do_syms
10965       && do_using_dynamic
10966       && dynamic_strings != NULL
10967       && dynamic_symbols != NULL)
10968     {
10969       unsigned long hn;
10970
10971       if (dynamic_info[DT_HASH])
10972         {
10973           bfd_vma si;
10974
10975           printf (_("\nSymbol table for image:\n"));
10976           if (is_32bit_elf)
10977             printf (_("  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"));
10978           else
10979             printf (_("  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"));
10980
10981           for (hn = 0; hn < nbuckets; hn++)
10982             {
10983               if (! buckets[hn])
10984                 continue;
10985
10986               for (si = buckets[hn]; si < nchains && si > 0; si = chains[si])
10987                 print_dynamic_symbol (si, hn);
10988             }
10989         }
10990
10991       if (dynamic_info_DT_GNU_HASH)
10992         {
10993           printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
10994           if (is_32bit_elf)
10995             printf (_("  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"));
10996           else
10997             printf (_("  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"));
10998
10999           for (hn = 0; hn < ngnubuckets; ++hn)
11000             if (gnubuckets[hn] != 0)
11001               {
11002                 bfd_vma si = gnubuckets[hn];
11003                 bfd_vma off = si - gnusymidx;
11004
11005                 do
11006                   {
11007                     print_dynamic_symbol (si, hn);
11008                     si++;
11009                   }
11010                 while (off < ngnuchains && (gnuchains[off++] & 1) == 0);
11011               }
11012         }
11013     }
11014   else if ((do_dyn_syms || (do_syms && !do_using_dynamic))
11015            && section_headers != NULL)
11016     {
11017       unsigned int i;
11018
11019       for (i = 0, section = section_headers;
11020            i < elf_header.e_shnum;
11021            i++, section++)
11022         {
11023           unsigned int si;
11024           char * strtab = NULL;
11025           unsigned long int strtab_size = 0;
11026           Elf_Internal_Sym * symtab;
11027           Elf_Internal_Sym * psym;
11028           unsigned long num_syms;
11029
11030           if ((section->sh_type != SHT_SYMTAB
11031                && section->sh_type != SHT_DYNSYM)
11032               || (!do_syms
11033                   && section->sh_type == SHT_SYMTAB))
11034             continue;
11035
11036           if (section->sh_entsize == 0)
11037             {
11038               printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
11039                       printable_section_name (section));
11040               continue;
11041             }
11042
11043           printf (_("\nSymbol table '%s' contains %lu entries:\n"),
11044                   printable_section_name (section),
11045                   (unsigned long) (section->sh_size / section->sh_entsize));
11046
11047           if (is_32bit_elf)
11048             printf (_("   Num:    Value  Size Type    Bind   Vis      Ndx Name\n"));
11049           else
11050             printf (_("   Num:    Value          Size Type    Bind   Vis      Ndx Name\n"));
11051
11052           symtab = GET_ELF_SYMBOLS (file, section, & num_syms);
11053           if (symtab == NULL)
11054             continue;
11055
11056           if (section->sh_link == elf_header.e_shstrndx)
11057             {
11058               strtab = string_table;
11059               strtab_size = string_table_length;
11060             }
11061           else if (section->sh_link < elf_header.e_shnum)
11062             {
11063               Elf_Internal_Shdr * string_sec;
11064
11065               string_sec = section_headers + section->sh_link;
11066
11067               strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
11068                                           1, string_sec->sh_size,
11069                                           _("string table"));
11070               strtab_size = strtab != NULL ? string_sec->sh_size : 0;
11071             }
11072
11073           for (si = 0, psym = symtab; si < num_syms; si++, psym++)
11074             {
11075               const char *version_string;
11076               enum versioned_symbol_info sym_info;
11077               unsigned short vna_other;
11078
11079               printf ("%6d: ", si);
11080               print_vma (psym->st_value, LONG_HEX);
11081               putchar (' ');
11082               print_vma (psym->st_size, DEC_5);
11083               printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
11084               printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
11085               if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
11086                 printf (" %-7s",  get_solaris_symbol_visibility (psym->st_other));
11087               else
11088                 {
11089                   unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
11090
11091                   printf (" %-7s", get_symbol_visibility (vis));
11092                   /* Check to see if any other bits in the st_other field are set.
11093                      Note - displaying this information disrupts the layout of the
11094                      table being generated, but for the moment this case is very rare.  */
11095                   if (psym->st_other ^ vis)
11096                     printf (" [%s] ", get_symbol_other (psym->st_other ^ vis));
11097                 }
11098               printf (" %4s ", get_symbol_index_type (psym->st_shndx));
11099               print_symbol (25, psym->st_name < strtab_size
11100                             ? strtab + psym->st_name : _("<corrupt>"));
11101
11102               version_string
11103                 = get_symbol_version_string (file,
11104                                              section->sh_type == SHT_DYNSYM,
11105                                              strtab, strtab_size, si,
11106                                              psym, &sym_info, &vna_other);
11107               if (version_string)
11108                 {
11109                   if (sym_info == symbol_undefined)
11110                     printf ("@%s (%d)", version_string, vna_other);
11111                   else
11112                     printf (sym_info == symbol_hidden ? "@%s" : "@@%s",
11113                             version_string);
11114                 }
11115
11116               putchar ('\n');
11117
11118               if (ELF_ST_BIND (psym->st_info) == STB_LOCAL
11119                   && si >= section->sh_info)
11120                 warn (_("local symbol %u found at index >= %s's sh_info value of %u\n"),
11121                       si, printable_section_name (section), section->sh_info);
11122             }
11123
11124           free (symtab);
11125           if (strtab != string_table)
11126             free (strtab);
11127         }
11128     }
11129   else if (do_syms)
11130     printf
11131       (_("\nDynamic symbol information is not available for displaying symbols.\n"));
11132
11133   if (do_histogram && buckets != NULL)
11134     {
11135       unsigned long * lengths;
11136       unsigned long * counts;
11137       unsigned long hn;
11138       bfd_vma si;
11139       unsigned long maxlength = 0;
11140       unsigned long nzero_counts = 0;
11141       unsigned long nsyms = 0;
11142       unsigned long chained;
11143
11144       printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
11145               (unsigned long) nbuckets);
11146
11147       lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
11148       if (lengths == NULL)
11149         {
11150           error (_("Out of memory allocating space for histogram buckets\n"));
11151           return 0;
11152         }
11153
11154       printf (_(" Length  Number     %% of total  Coverage\n"));
11155       for (hn = 0; hn < nbuckets; ++hn)
11156         {
11157           for (si = buckets[hn], chained = 0;
11158                si > 0 && si < nchains && si < nbuckets && chained <= nchains;
11159                si = chains[si], ++chained)
11160             {
11161               ++nsyms;
11162               if (maxlength < ++lengths[hn])
11163                 ++maxlength;
11164             }
11165
11166             /* PR binutils/17531: A corrupt binary could contain broken
11167                histogram data.  Do not go into an infinite loop trying
11168                to process it.  */
11169             if (chained > nchains)
11170               {
11171                 error (_("histogram chain is corrupt\n"));
11172                 break;
11173               }
11174         }
11175
11176       counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
11177       if (counts == NULL)
11178         {
11179           free (lengths);
11180           error (_("Out of memory allocating space for histogram counts\n"));
11181           return 0;
11182         }
11183
11184       for (hn = 0; hn < nbuckets; ++hn)
11185         ++counts[lengths[hn]];
11186
11187       if (nbuckets > 0)
11188         {
11189           unsigned long i;
11190           printf ("      0  %-10lu (%5.1f%%)\n",
11191                   counts[0], (counts[0] * 100.0) / nbuckets);
11192           for (i = 1; i <= maxlength; ++i)
11193             {
11194               nzero_counts += counts[i] * i;
11195               printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
11196                       i, counts[i], (counts[i] * 100.0) / nbuckets,
11197                       (nzero_counts * 100.0) / nsyms);
11198             }
11199         }
11200
11201       free (counts);
11202       free (lengths);
11203     }
11204
11205   if (buckets != NULL)
11206     {
11207       free (buckets);
11208       free (chains);
11209     }
11210
11211   if (do_histogram && gnubuckets != NULL)
11212     {
11213       unsigned long * lengths;
11214       unsigned long * counts;
11215       unsigned long hn;
11216       unsigned long maxlength = 0;
11217       unsigned long nzero_counts = 0;
11218       unsigned long nsyms = 0;
11219
11220       printf (_("\nHistogram for `.gnu.hash' bucket list length (total of %lu buckets):\n"),
11221               (unsigned long) ngnubuckets);
11222
11223       lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
11224       if (lengths == NULL)
11225         {
11226           error (_("Out of memory allocating space for gnu histogram buckets\n"));
11227           return 0;
11228         }
11229
11230       printf (_(" Length  Number     %% of total  Coverage\n"));
11231
11232       for (hn = 0; hn < ngnubuckets; ++hn)
11233         if (gnubuckets[hn] != 0)
11234           {
11235             bfd_vma off, length = 1;
11236
11237             for (off = gnubuckets[hn] - gnusymidx;
11238                  /* PR 17531 file: 010-77222-0.004.  */
11239                  off < ngnuchains && (gnuchains[off] & 1) == 0;
11240                  ++off)
11241               ++length;
11242             lengths[hn] = length;
11243             if (length > maxlength)
11244               maxlength = length;
11245             nsyms += length;
11246           }
11247
11248       counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
11249       if (counts == NULL)
11250         {
11251           free (lengths);
11252           error (_("Out of memory allocating space for gnu histogram counts\n"));
11253           return 0;
11254         }
11255
11256       for (hn = 0; hn < ngnubuckets; ++hn)
11257         ++counts[lengths[hn]];
11258
11259       if (ngnubuckets > 0)
11260         {
11261           unsigned long j;
11262           printf ("      0  %-10lu (%5.1f%%)\n",
11263                   counts[0], (counts[0] * 100.0) / ngnubuckets);
11264           for (j = 1; j <= maxlength; ++j)
11265             {
11266               nzero_counts += counts[j] * j;
11267               printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
11268                       j, counts[j], (counts[j] * 100.0) / ngnubuckets,
11269                       (nzero_counts * 100.0) / nsyms);
11270             }
11271         }
11272
11273       free (counts);
11274       free (lengths);
11275       free (gnubuckets);
11276       free (gnuchains);
11277     }
11278
11279   return 1;
11280 }
11281
11282 static int
11283 process_syminfo (FILE * file ATTRIBUTE_UNUSED)
11284 {
11285   unsigned int i;
11286
11287   if (dynamic_syminfo == NULL
11288       || !do_dynamic)
11289     /* No syminfo, this is ok.  */
11290     return 1;
11291
11292   /* There better should be a dynamic symbol section.  */
11293   if (dynamic_symbols == NULL || dynamic_strings == NULL)
11294     return 0;
11295
11296   if (dynamic_addr)
11297     printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
11298             dynamic_syminfo_offset, dynamic_syminfo_nent);
11299
11300   printf (_(" Num: Name                           BoundTo     Flags\n"));
11301   for (i = 0; i < dynamic_syminfo_nent; ++i)
11302     {
11303       unsigned short int flags = dynamic_syminfo[i].si_flags;
11304
11305       printf ("%4d: ", i);
11306       if (i >= num_dynamic_syms)
11307         printf (_("<corrupt index>"));
11308       else if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
11309         print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
11310       else
11311         printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
11312       putchar (' ');
11313
11314       switch (dynamic_syminfo[i].si_boundto)
11315         {
11316         case SYMINFO_BT_SELF:
11317           fputs ("SELF       ", stdout);
11318           break;
11319         case SYMINFO_BT_PARENT:
11320           fputs ("PARENT     ", stdout);
11321           break;
11322         default:
11323           if (dynamic_syminfo[i].si_boundto > 0
11324               && dynamic_syminfo[i].si_boundto < dynamic_nent
11325               && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
11326             {
11327               print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
11328               putchar (' ' );
11329             }
11330           else
11331             printf ("%-10d ", dynamic_syminfo[i].si_boundto);
11332           break;
11333         }
11334
11335       if (flags & SYMINFO_FLG_DIRECT)
11336         printf (" DIRECT");
11337       if (flags & SYMINFO_FLG_PASSTHRU)
11338         printf (" PASSTHRU");
11339       if (flags & SYMINFO_FLG_COPY)
11340         printf (" COPY");
11341       if (flags & SYMINFO_FLG_LAZYLOAD)
11342         printf (" LAZYLOAD");
11343
11344       puts ("");
11345     }
11346
11347   return 1;
11348 }
11349
11350 /* Check to see if the given reloc needs to be handled in a target specific
11351    manner.  If so then process the reloc and return TRUE otherwise return
11352    FALSE.  */
11353
11354 static bfd_boolean
11355 target_specific_reloc_handling (Elf_Internal_Rela * reloc,
11356                                 unsigned char *     start,
11357                                 Elf_Internal_Sym *  symtab)
11358 {
11359   unsigned int reloc_type = get_reloc_type (reloc->r_info);
11360
11361   switch (elf_header.e_machine)
11362     {
11363     case EM_MSP430:
11364     case EM_MSP430_OLD:
11365       {
11366         static Elf_Internal_Sym * saved_sym = NULL;
11367
11368         switch (reloc_type)
11369           {
11370           case 10: /* R_MSP430_SYM_DIFF */
11371             if (uses_msp430x_relocs ())
11372               break;
11373           case 21: /* R_MSP430X_SYM_DIFF */
11374             saved_sym = symtab + get_reloc_symindex (reloc->r_info);
11375             return TRUE;
11376
11377           case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
11378           case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
11379             goto handle_sym_diff;
11380
11381           case 5: /* R_MSP430_16_BYTE */
11382           case 9: /* R_MSP430_8 */
11383             if (uses_msp430x_relocs ())
11384               break;
11385             goto handle_sym_diff;
11386
11387           case 2: /* R_MSP430_ABS16 */
11388           case 15: /* R_MSP430X_ABS16 */
11389             if (! uses_msp430x_relocs ())
11390               break;
11391             goto handle_sym_diff;
11392
11393           handle_sym_diff:
11394             if (saved_sym != NULL)
11395               {
11396                 bfd_vma value;
11397
11398                 value = reloc->r_addend
11399                   + (symtab[get_reloc_symindex (reloc->r_info)].st_value
11400                      - saved_sym->st_value);
11401
11402                 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
11403
11404                 saved_sym = NULL;
11405                 return TRUE;
11406               }
11407             break;
11408
11409           default:
11410             if (saved_sym != NULL)
11411               error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc\n"));
11412             break;
11413           }
11414         break;
11415       }
11416
11417     case EM_MN10300:
11418     case EM_CYGNUS_MN10300:
11419       {
11420         static Elf_Internal_Sym * saved_sym = NULL;
11421
11422         switch (reloc_type)
11423           {
11424           case 34: /* R_MN10300_ALIGN */
11425             return TRUE;
11426           case 33: /* R_MN10300_SYM_DIFF */
11427             saved_sym = symtab + get_reloc_symindex (reloc->r_info);
11428             return TRUE;
11429           case 1: /* R_MN10300_32 */
11430           case 2: /* R_MN10300_16 */
11431             if (saved_sym != NULL)
11432               {
11433                 bfd_vma value;
11434
11435                 value = reloc->r_addend
11436                   + (symtab[get_reloc_symindex (reloc->r_info)].st_value
11437                      - saved_sym->st_value);
11438
11439                 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
11440
11441                 saved_sym = NULL;
11442                 return TRUE;
11443               }
11444             break;
11445           default:
11446             if (saved_sym != NULL)
11447               error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc\n"));
11448             break;
11449           }
11450         break;
11451       }
11452
11453     case EM_RL78:
11454       {
11455         static bfd_vma saved_sym1 = 0;
11456         static bfd_vma saved_sym2 = 0;
11457         static bfd_vma value;
11458
11459         switch (reloc_type)
11460           {
11461           case 0x80: /* R_RL78_SYM.  */
11462             saved_sym1 = saved_sym2;
11463             saved_sym2 = symtab[get_reloc_symindex (reloc->r_info)].st_value;
11464             saved_sym2 += reloc->r_addend;
11465             return TRUE;
11466
11467           case 0x83: /* R_RL78_OPsub.  */
11468             value = saved_sym1 - saved_sym2;
11469             saved_sym2 = saved_sym1 = 0;
11470             return TRUE;
11471             break;
11472
11473           case 0x41: /* R_RL78_ABS32.  */
11474             byte_put (start + reloc->r_offset, value, 4);
11475             value = 0;
11476             return TRUE;
11477
11478           case 0x43: /* R_RL78_ABS16.  */
11479             byte_put (start + reloc->r_offset, value, 2);
11480             value = 0;
11481             return TRUE;
11482
11483           default:
11484             break;
11485           }
11486         break;
11487       }
11488     }
11489
11490   return FALSE;
11491 }
11492
11493 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
11494    DWARF debug sections.  This is a target specific test.  Note - we do not
11495    go through the whole including-target-headers-multiple-times route, (as
11496    we have already done with <elf/h8.h>) because this would become very
11497    messy and even then this function would have to contain target specific
11498    information (the names of the relocs instead of their numeric values).
11499    FIXME: This is not the correct way to solve this problem.  The proper way
11500    is to have target specific reloc sizing and typing functions created by
11501    the reloc-macros.h header, in the same way that it already creates the
11502    reloc naming functions.  */
11503
11504 static bfd_boolean
11505 is_32bit_abs_reloc (unsigned int reloc_type)
11506 {
11507   /* Please keep this table alpha-sorted for ease of visual lookup.  */
11508   switch (elf_header.e_machine)
11509     {
11510     case EM_386:
11511     case EM_IAMCU:
11512       return reloc_type == 1; /* R_386_32.  */
11513     case EM_68K:
11514       return reloc_type == 1; /* R_68K_32.  */
11515     case EM_860:
11516       return reloc_type == 1; /* R_860_32.  */
11517     case EM_960:
11518       return reloc_type == 2; /* R_960_32.  */
11519     case EM_AARCH64:
11520       return reloc_type == 258; /* R_AARCH64_ABS32 */
11521     case EM_ADAPTEVA_EPIPHANY:
11522       return reloc_type == 3;
11523     case EM_ALPHA:
11524       return reloc_type == 1; /* R_ALPHA_REFLONG.  */
11525     case EM_ARC:
11526       return reloc_type == 1; /* R_ARC_32.  */
11527     case EM_ARC_COMPACT:
11528     case EM_ARC_COMPACT2:
11529       return reloc_type == 4; /* R_ARC_32.  */
11530     case EM_ARM:
11531       return reloc_type == 2; /* R_ARM_ABS32 */
11532     case EM_AVR_OLD:
11533     case EM_AVR:
11534       return reloc_type == 1;
11535     case EM_BLACKFIN:
11536       return reloc_type == 0x12; /* R_byte4_data.  */
11537     case EM_CRIS:
11538       return reloc_type == 3; /* R_CRIS_32.  */
11539     case EM_CR16:
11540       return reloc_type == 3; /* R_CR16_NUM32.  */
11541     case EM_CRX:
11542       return reloc_type == 15; /* R_CRX_NUM32.  */
11543     case EM_CYGNUS_FRV:
11544       return reloc_type == 1;
11545     case EM_CYGNUS_D10V:
11546     case EM_D10V:
11547       return reloc_type == 6; /* R_D10V_32.  */
11548     case EM_CYGNUS_D30V:
11549     case EM_D30V:
11550       return reloc_type == 12; /* R_D30V_32_NORMAL.  */
11551     case EM_DLX:
11552       return reloc_type == 3; /* R_DLX_RELOC_32.  */
11553     case EM_CYGNUS_FR30:
11554     case EM_FR30:
11555       return reloc_type == 3; /* R_FR30_32.  */
11556     case EM_FT32:
11557       return reloc_type == 1; /* R_FT32_32.  */
11558     case EM_H8S:
11559     case EM_H8_300:
11560     case EM_H8_300H:
11561       return reloc_type == 1; /* R_H8_DIR32.  */
11562     case EM_IA_64:
11563       return reloc_type == 0x65 /* R_IA64_SECREL32LSB.  */
11564         || reloc_type == 0x25;  /* R_IA64_DIR32LSB.  */
11565     case EM_IP2K_OLD:
11566     case EM_IP2K:
11567       return reloc_type == 2; /* R_IP2K_32.  */
11568     case EM_IQ2000:
11569       return reloc_type == 2; /* R_IQ2000_32.  */
11570     case EM_LATTICEMICO32:
11571       return reloc_type == 3; /* R_LM32_32.  */
11572     case EM_M32C_OLD:
11573     case EM_M32C:
11574       return reloc_type == 3; /* R_M32C_32.  */
11575     case EM_M32R:
11576       return reloc_type == 34; /* R_M32R_32_RELA.  */
11577     case EM_68HC11:
11578     case EM_68HC12:
11579       return reloc_type == 6; /* R_M68HC11_32.  */
11580     case EM_MCORE:
11581       return reloc_type == 1; /* R_MCORE_ADDR32.  */
11582     case EM_CYGNUS_MEP:
11583       return reloc_type == 4; /* R_MEP_32.  */
11584     case EM_METAG:
11585       return reloc_type == 2; /* R_METAG_ADDR32.  */
11586     case EM_MICROBLAZE:
11587       return reloc_type == 1; /* R_MICROBLAZE_32.  */
11588     case EM_MIPS:
11589       return reloc_type == 2; /* R_MIPS_32.  */
11590     case EM_MMIX:
11591       return reloc_type == 4; /* R_MMIX_32.  */
11592     case EM_CYGNUS_MN10200:
11593     case EM_MN10200:
11594       return reloc_type == 1; /* R_MN10200_32.  */
11595     case EM_CYGNUS_MN10300:
11596     case EM_MN10300:
11597       return reloc_type == 1; /* R_MN10300_32.  */
11598     case EM_MOXIE:
11599       return reloc_type == 1; /* R_MOXIE_32.  */
11600     case EM_MSP430_OLD:
11601     case EM_MSP430:
11602       return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32.  */
11603     case EM_MT:
11604       return reloc_type == 2; /* R_MT_32.  */
11605     case EM_NDS32:
11606       return reloc_type == 20; /* R_NDS32_RELA.  */
11607     case EM_ALTERA_NIOS2:
11608       return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32.  */
11609     case EM_NIOS32:
11610       return reloc_type == 1; /* R_NIOS_32.  */
11611     case EM_OR1K:
11612       return reloc_type == 1; /* R_OR1K_32.  */
11613     case EM_PARISC:
11614       return (reloc_type == 1 /* R_PARISC_DIR32.  */
11615               || reloc_type == 41); /* R_PARISC_SECREL32.  */
11616     case EM_PJ:
11617     case EM_PJ_OLD:
11618       return reloc_type == 1; /* R_PJ_DATA_DIR32.  */
11619     case EM_PPC64:
11620       return reloc_type == 1; /* R_PPC64_ADDR32.  */
11621     case EM_PPC:
11622       return reloc_type == 1; /* R_PPC_ADDR32.  */
11623     case EM_RL78:
11624       return reloc_type == 1; /* R_RL78_DIR32.  */
11625     case EM_RX:
11626       return reloc_type == 1; /* R_RX_DIR32.  */
11627     case EM_S370:
11628       return reloc_type == 1; /* R_I370_ADDR31.  */
11629     case EM_S390_OLD:
11630     case EM_S390:
11631       return reloc_type == 4; /* R_S390_32.  */
11632     case EM_SCORE:
11633       return reloc_type == 8; /* R_SCORE_ABS32.  */
11634     case EM_SH:
11635       return reloc_type == 1; /* R_SH_DIR32.  */
11636     case EM_SPARC32PLUS:
11637     case EM_SPARCV9:
11638     case EM_SPARC:
11639       return reloc_type == 3 /* R_SPARC_32.  */
11640         || reloc_type == 23; /* R_SPARC_UA32.  */
11641     case EM_SPU:
11642       return reloc_type == 6; /* R_SPU_ADDR32 */
11643     case EM_TI_C6000:
11644       return reloc_type == 1; /* R_C6000_ABS32.  */
11645     case EM_TILEGX:
11646       return reloc_type == 2; /* R_TILEGX_32.  */
11647     case EM_TILEPRO:
11648       return reloc_type == 1; /* R_TILEPRO_32.  */
11649     case EM_CYGNUS_V850:
11650     case EM_V850:
11651       return reloc_type == 6; /* R_V850_ABS32.  */
11652     case EM_V800:
11653       return reloc_type == 0x33; /* R_V810_WORD.  */
11654     case EM_VAX:
11655       return reloc_type == 1; /* R_VAX_32.  */
11656     case EM_VISIUM:
11657       return reloc_type == 3;  /* R_VISIUM_32. */
11658     case EM_X86_64:
11659     case EM_L1OM:
11660     case EM_K1OM:
11661       return reloc_type == 10; /* R_X86_64_32.  */
11662     case EM_XC16X:
11663     case EM_C166:
11664       return reloc_type == 3; /* R_XC16C_ABS_32.  */
11665     case EM_XGATE:
11666       return reloc_type == 4; /* R_XGATE_32.  */
11667     case EM_XSTORMY16:
11668       return reloc_type == 1; /* R_XSTROMY16_32.  */
11669     case EM_XTENSA_OLD:
11670     case EM_XTENSA:
11671       return reloc_type == 1; /* R_XTENSA_32.  */
11672     default:
11673       {
11674         static unsigned int prev_warn = 0;
11675
11676         /* Avoid repeating the same warning multiple times.  */
11677         if (prev_warn != elf_header.e_machine)
11678           error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
11679                  elf_header.e_machine);
11680         prev_warn = elf_header.e_machine;
11681         return FALSE;
11682       }
11683     }
11684 }
11685
11686 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11687    a 32-bit pc-relative RELA relocation used in DWARF debug sections.  */
11688
11689 static bfd_boolean
11690 is_32bit_pcrel_reloc (unsigned int reloc_type)
11691 {
11692   switch (elf_header.e_machine)
11693   /* Please keep this table alpha-sorted for ease of visual lookup.  */
11694     {
11695     case EM_386:
11696     case EM_IAMCU:
11697       return reloc_type == 2;  /* R_386_PC32.  */
11698     case EM_68K:
11699       return reloc_type == 4;  /* R_68K_PC32.  */
11700     case EM_AARCH64:
11701       return reloc_type == 261; /* R_AARCH64_PREL32 */
11702     case EM_ADAPTEVA_EPIPHANY:
11703       return reloc_type == 6;
11704     case EM_ALPHA:
11705       return reloc_type == 10; /* R_ALPHA_SREL32.  */
11706     case EM_ARC_COMPACT:
11707     case EM_ARC_COMPACT2:
11708       return reloc_type == 49; /* R_ARC_32_PCREL.  */
11709     case EM_ARM:
11710       return reloc_type == 3;  /* R_ARM_REL32 */
11711     case EM_AVR_OLD:
11712     case EM_AVR:
11713       return reloc_type == 36; /* R_AVR_32_PCREL.  */
11714     case EM_MICROBLAZE:
11715       return reloc_type == 2;  /* R_MICROBLAZE_32_PCREL.  */
11716     case EM_OR1K:
11717       return reloc_type == 9; /* R_OR1K_32_PCREL.  */
11718     case EM_PARISC:
11719       return reloc_type == 9;  /* R_PARISC_PCREL32.  */
11720     case EM_PPC:
11721       return reloc_type == 26; /* R_PPC_REL32.  */
11722     case EM_PPC64:
11723       return reloc_type == 26; /* R_PPC64_REL32.  */
11724     case EM_S390_OLD:
11725     case EM_S390:
11726       return reloc_type == 5;  /* R_390_PC32.  */
11727     case EM_SH:
11728       return reloc_type == 2;  /* R_SH_REL32.  */
11729     case EM_SPARC32PLUS:
11730     case EM_SPARCV9:
11731     case EM_SPARC:
11732       return reloc_type == 6;  /* R_SPARC_DISP32.  */
11733     case EM_SPU:
11734       return reloc_type == 13; /* R_SPU_REL32.  */
11735     case EM_TILEGX:
11736       return reloc_type == 6; /* R_TILEGX_32_PCREL.  */
11737     case EM_TILEPRO:
11738       return reloc_type == 4; /* R_TILEPRO_32_PCREL.  */
11739     case EM_VISIUM:
11740       return reloc_type == 6;  /* R_VISIUM_32_PCREL */
11741     case EM_X86_64:
11742     case EM_L1OM:
11743     case EM_K1OM:
11744       return reloc_type == 2;  /* R_X86_64_PC32.  */
11745     case EM_XTENSA_OLD:
11746     case EM_XTENSA:
11747       return reloc_type == 14; /* R_XTENSA_32_PCREL.  */
11748     default:
11749       /* Do not abort or issue an error message here.  Not all targets use
11750          pc-relative 32-bit relocs in their DWARF debug information and we
11751          have already tested for target coverage in is_32bit_abs_reloc.  A
11752          more helpful warning message will be generated by apply_relocations
11753          anyway, so just return.  */
11754       return FALSE;
11755     }
11756 }
11757
11758 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11759    a 64-bit absolute RELA relocation used in DWARF debug sections.  */
11760
11761 static bfd_boolean
11762 is_64bit_abs_reloc (unsigned int reloc_type)
11763 {
11764   switch (elf_header.e_machine)
11765     {
11766     case EM_AARCH64:
11767       return reloc_type == 257; /* R_AARCH64_ABS64.  */
11768     case EM_ALPHA:
11769       return reloc_type == 2; /* R_ALPHA_REFQUAD.  */
11770     case EM_IA_64:
11771       return reloc_type == 0x27; /* R_IA64_DIR64LSB.  */
11772     case EM_PARISC:
11773       return reloc_type == 80; /* R_PARISC_DIR64.  */
11774     case EM_PPC64:
11775       return reloc_type == 38; /* R_PPC64_ADDR64.  */
11776     case EM_SPARC32PLUS:
11777     case EM_SPARCV9:
11778     case EM_SPARC:
11779       return reloc_type == 54; /* R_SPARC_UA64.  */
11780     case EM_X86_64:
11781     case EM_L1OM:
11782     case EM_K1OM:
11783       return reloc_type == 1; /* R_X86_64_64.  */
11784     case EM_S390_OLD:
11785     case EM_S390:
11786       return reloc_type == 22;  /* R_S390_64.  */
11787     case EM_TILEGX:
11788       return reloc_type == 1; /* R_TILEGX_64.  */
11789     case EM_MIPS:
11790       return reloc_type == 18;  /* R_MIPS_64.  */
11791     default:
11792       return FALSE;
11793     }
11794 }
11795
11796 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
11797    a 64-bit pc-relative RELA relocation used in DWARF debug sections.  */
11798
11799 static bfd_boolean
11800 is_64bit_pcrel_reloc (unsigned int reloc_type)
11801 {
11802   switch (elf_header.e_machine)
11803     {
11804     case EM_AARCH64:
11805       return reloc_type == 260; /* R_AARCH64_PREL64.  */
11806     case EM_ALPHA:
11807       return reloc_type == 11; /* R_ALPHA_SREL64.  */
11808     case EM_IA_64:
11809       return reloc_type == 0x4f; /* R_IA64_PCREL64LSB.  */
11810     case EM_PARISC:
11811       return reloc_type == 72; /* R_PARISC_PCREL64.  */
11812     case EM_PPC64:
11813       return reloc_type == 44; /* R_PPC64_REL64.  */
11814     case EM_SPARC32PLUS:
11815     case EM_SPARCV9:
11816     case EM_SPARC:
11817       return reloc_type == 46; /* R_SPARC_DISP64.  */
11818     case EM_X86_64:
11819     case EM_L1OM:
11820     case EM_K1OM:
11821       return reloc_type == 24; /* R_X86_64_PC64.  */
11822     case EM_S390_OLD:
11823     case EM_S390:
11824       return reloc_type == 23;  /* R_S390_PC64.  */
11825     case EM_TILEGX:
11826       return reloc_type == 5;  /* R_TILEGX_64_PCREL.  */
11827     default:
11828       return FALSE;
11829     }
11830 }
11831
11832 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11833    a 24-bit absolute RELA relocation used in DWARF debug sections.  */
11834
11835 static bfd_boolean
11836 is_24bit_abs_reloc (unsigned int reloc_type)
11837 {
11838   switch (elf_header.e_machine)
11839     {
11840     case EM_CYGNUS_MN10200:
11841     case EM_MN10200:
11842       return reloc_type == 4; /* R_MN10200_24.  */
11843     case EM_FT32:
11844       return reloc_type == 5; /* R_FT32_20.  */
11845     default:
11846       return FALSE;
11847     }
11848 }
11849
11850 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11851    a 16-bit absolute RELA relocation used in DWARF debug sections.  */
11852
11853 static bfd_boolean
11854 is_16bit_abs_reloc (unsigned int reloc_type)
11855 {
11856   /* Please keep this table alpha-sorted for ease of visual lookup.  */
11857   switch (elf_header.e_machine)
11858     {
11859     case EM_ARC:
11860     case EM_ARC_COMPACT:
11861     case EM_ARC_COMPACT2:
11862       return reloc_type == 2; /* R_ARC_16.  */
11863     case EM_ADAPTEVA_EPIPHANY:
11864       return reloc_type == 5;
11865     case EM_AVR_OLD:
11866     case EM_AVR:
11867       return reloc_type == 4; /* R_AVR_16.  */
11868     case EM_CYGNUS_D10V:
11869     case EM_D10V:
11870       return reloc_type == 3; /* R_D10V_16.  */
11871     case EM_H8S:
11872     case EM_H8_300:
11873     case EM_H8_300H:
11874       return reloc_type == R_H8_DIR16;
11875     case EM_IP2K_OLD:
11876     case EM_IP2K:
11877       return reloc_type == 1; /* R_IP2K_16.  */
11878     case EM_M32C_OLD:
11879     case EM_M32C:
11880       return reloc_type == 1; /* R_M32C_16 */
11881     case EM_CYGNUS_MN10200:
11882     case EM_MN10200:
11883       return reloc_type == 2; /* R_MN10200_16.  */
11884     case EM_CYGNUS_MN10300:
11885     case EM_MN10300:
11886       return reloc_type == 2; /* R_MN10300_16.  */
11887     case EM_MSP430:
11888       if (uses_msp430x_relocs ())
11889         return reloc_type == 2; /* R_MSP430_ABS16.  */
11890     case EM_MSP430_OLD:
11891       return reloc_type == 5; /* R_MSP430_16_BYTE.  */
11892     case EM_NDS32:
11893       return reloc_type == 19; /* R_NDS32_RELA.  */
11894     case EM_ALTERA_NIOS2:
11895       return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16.  */
11896     case EM_NIOS32:
11897       return reloc_type == 9; /* R_NIOS_16.  */
11898     case EM_OR1K:
11899       return reloc_type == 2; /* R_OR1K_16.  */
11900     case EM_TI_C6000:
11901       return reloc_type == 2; /* R_C6000_ABS16.  */
11902     case EM_VISIUM:
11903       return reloc_type == 2; /* R_VISIUM_16. */
11904     case EM_XC16X:
11905     case EM_C166:
11906       return reloc_type == 2; /* R_XC16C_ABS_16.  */
11907     case EM_XGATE:
11908       return reloc_type == 3; /* R_XGATE_16.  */
11909     default:
11910       return FALSE;
11911     }
11912 }
11913
11914 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
11915    relocation entries (possibly formerly used for SHT_GROUP sections).  */
11916
11917 static bfd_boolean
11918 is_none_reloc (unsigned int reloc_type)
11919 {
11920   switch (elf_header.e_machine)
11921     {
11922     case EM_386:     /* R_386_NONE.  */
11923     case EM_68K:     /* R_68K_NONE.  */
11924     case EM_ADAPTEVA_EPIPHANY:
11925     case EM_ALPHA:   /* R_ALPHA_NONE.  */
11926     case EM_ALTERA_NIOS2: /* R_NIOS2_NONE.  */
11927     case EM_ARC:     /* R_ARC_NONE.  */
11928     case EM_ARC_COMPACT2: /* R_ARC_NONE.  */
11929     case EM_ARC_COMPACT: /* R_ARC_NONE.  */
11930     case EM_ARM:     /* R_ARM_NONE.  */
11931     case EM_C166:    /* R_XC16X_NONE.  */
11932     case EM_CRIS:    /* R_CRIS_NONE.  */
11933     case EM_FT32:    /* R_FT32_NONE.  */
11934     case EM_IA_64:   /* R_IA64_NONE.  */
11935     case EM_K1OM:    /* R_X86_64_NONE.  */
11936     case EM_L1OM:    /* R_X86_64_NONE.  */
11937     case EM_M32R:    /* R_M32R_NONE.  */
11938     case EM_MIPS:    /* R_MIPS_NONE.  */
11939     case EM_MN10300: /* R_MN10300_NONE.  */
11940     case EM_MOXIE:   /* R_MOXIE_NONE.  */
11941     case EM_NIOS32:  /* R_NIOS_NONE.  */
11942     case EM_OR1K:    /* R_OR1K_NONE. */
11943     case EM_PARISC:  /* R_PARISC_NONE.  */
11944     case EM_PPC64:   /* R_PPC64_NONE.  */
11945     case EM_PPC:     /* R_PPC_NONE.  */
11946     case EM_S390:    /* R_390_NONE.  */
11947     case EM_S390_OLD:
11948     case EM_SH:      /* R_SH_NONE.  */
11949     case EM_SPARC32PLUS:
11950     case EM_SPARC:   /* R_SPARC_NONE.  */
11951     case EM_SPARCV9:
11952     case EM_TILEGX:  /* R_TILEGX_NONE.  */
11953     case EM_TILEPRO: /* R_TILEPRO_NONE.  */
11954     case EM_TI_C6000:/* R_C6000_NONE.  */
11955     case EM_X86_64:  /* R_X86_64_NONE.  */
11956     case EM_XC16X:
11957       return reloc_type == 0;
11958
11959     case EM_AARCH64:
11960       return reloc_type == 0 || reloc_type == 256;
11961     case EM_AVR_OLD:
11962     case EM_AVR:
11963       return (reloc_type == 0 /* R_AVR_NONE.  */
11964               || reloc_type == 30 /* R_AVR_DIFF8.  */
11965               || reloc_type == 31 /* R_AVR_DIFF16.  */
11966               || reloc_type == 32 /* R_AVR_DIFF32.  */);
11967     case EM_METAG:
11968       return reloc_type == 3; /* R_METAG_NONE.  */
11969     case EM_NDS32:
11970       return (reloc_type == 0       /* R_XTENSA_NONE.  */
11971               || reloc_type == 204  /* R_NDS32_DIFF8.  */
11972               || reloc_type == 205  /* R_NDS32_DIFF16.  */
11973               || reloc_type == 206  /* R_NDS32_DIFF32.  */
11974               || reloc_type == 207  /* R_NDS32_ULEB128.  */);
11975     case EM_XTENSA_OLD:
11976     case EM_XTENSA:
11977       return (reloc_type == 0      /* R_XTENSA_NONE.  */
11978               || reloc_type == 17  /* R_XTENSA_DIFF8.  */
11979               || reloc_type == 18  /* R_XTENSA_DIFF16.  */
11980               || reloc_type == 19  /* R_XTENSA_DIFF32.  */);
11981     }
11982   return FALSE;
11983 }
11984
11985 /* Returns TRUE if there is a relocation against
11986    section NAME at OFFSET bytes.  */
11987
11988 bfd_boolean
11989 reloc_at (struct dwarf_section * dsec, dwarf_vma offset)
11990 {
11991   Elf_Internal_Rela * relocs;
11992   Elf_Internal_Rela * rp;
11993
11994   if (dsec == NULL || dsec->reloc_info == NULL)
11995     return FALSE;
11996
11997   relocs = (Elf_Internal_Rela *) dsec->reloc_info;
11998
11999   for (rp = relocs; rp < relocs + dsec->num_relocs; ++rp)
12000     if (rp->r_offset == offset)
12001       return TRUE;
12002
12003    return FALSE;
12004 }
12005
12006 /* Apply relocations to a section.
12007    Note: So far support has been added only for those relocations
12008    which can be found in debug sections.
12009    If RELOCS_RETURN is non-NULL then returns in it a pointer to the
12010    loaded relocs.  It is then the caller's responsibility to free them.
12011    FIXME: Add support for more relocations ?  */
12012
12013 static void
12014 apply_relocations (void *                     file,
12015                    const Elf_Internal_Shdr *  section,
12016                    unsigned char *            start,
12017                    bfd_size_type              size,
12018                    void **                     relocs_return,
12019                    unsigned long *            num_relocs_return)
12020 {
12021   Elf_Internal_Shdr * relsec;
12022   unsigned char * end = start + size;
12023
12024   if (relocs_return != NULL)
12025     {
12026       * (Elf_Internal_Rela **) relocs_return = NULL;
12027       * num_relocs_return = 0;
12028     }
12029
12030   if (elf_header.e_type != ET_REL)
12031     return;
12032
12033   /* Find the reloc section associated with the section.  */
12034   for (relsec = section_headers;
12035        relsec < section_headers + elf_header.e_shnum;
12036        ++relsec)
12037     {
12038       bfd_boolean is_rela;
12039       unsigned long num_relocs;
12040       Elf_Internal_Rela * relocs;
12041       Elf_Internal_Rela * rp;
12042       Elf_Internal_Shdr * symsec;
12043       Elf_Internal_Sym * symtab;
12044       unsigned long num_syms;
12045       Elf_Internal_Sym * sym;
12046
12047       if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12048           || relsec->sh_info >= elf_header.e_shnum
12049           || section_headers + relsec->sh_info != section
12050           || relsec->sh_size == 0
12051           || relsec->sh_link >= elf_header.e_shnum)
12052         continue;
12053
12054       is_rela = relsec->sh_type == SHT_RELA;
12055
12056       if (is_rela)
12057         {
12058           if (!slurp_rela_relocs ((FILE *) file, relsec->sh_offset,
12059                                   relsec->sh_size, & relocs, & num_relocs))
12060             return;
12061         }
12062       else
12063         {
12064           if (!slurp_rel_relocs ((FILE *) file, relsec->sh_offset,
12065                                  relsec->sh_size, & relocs, & num_relocs))
12066             return;
12067         }
12068
12069       /* SH uses RELA but uses in place value instead of the addend field.  */
12070       if (elf_header.e_machine == EM_SH)
12071         is_rela = FALSE;
12072
12073       symsec = section_headers + relsec->sh_link;
12074       symtab = GET_ELF_SYMBOLS ((FILE *) file, symsec, & num_syms);
12075
12076       for (rp = relocs; rp < relocs + num_relocs; ++rp)
12077         {
12078           bfd_vma         addend;
12079           unsigned int    reloc_type;
12080           unsigned int    reloc_size;
12081           unsigned char * rloc;
12082           unsigned long   sym_index;
12083
12084           reloc_type = get_reloc_type (rp->r_info);
12085
12086           if (target_specific_reloc_handling (rp, start, symtab))
12087             continue;
12088           else if (is_none_reloc (reloc_type))
12089             continue;
12090           else if (is_32bit_abs_reloc (reloc_type)
12091                    || is_32bit_pcrel_reloc (reloc_type))
12092             reloc_size = 4;
12093           else if (is_64bit_abs_reloc (reloc_type)
12094                    || is_64bit_pcrel_reloc (reloc_type))
12095             reloc_size = 8;
12096           else if (is_24bit_abs_reloc (reloc_type))
12097             reloc_size = 3;
12098           else if (is_16bit_abs_reloc (reloc_type))
12099             reloc_size = 2;
12100           else
12101             {
12102               static unsigned int prev_reloc = 0;
12103               if (reloc_type != prev_reloc)
12104                 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
12105                       reloc_type, printable_section_name (section));
12106               prev_reloc = reloc_type;
12107               continue;
12108             }
12109
12110           rloc = start + rp->r_offset;
12111           if ((rloc + reloc_size) > end || (rloc < start))
12112             {
12113               warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
12114                     (unsigned long) rp->r_offset,
12115                     printable_section_name (section));
12116               continue;
12117             }
12118
12119           sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
12120           if (sym_index >= num_syms)
12121             {
12122               warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
12123                     sym_index, printable_section_name (section));
12124               continue;
12125             }
12126           sym = symtab + sym_index;
12127
12128           /* If the reloc has a symbol associated with it,
12129              make sure that it is of an appropriate type.
12130
12131              Relocations against symbols without type can happen.
12132              Gcc -feliminate-dwarf2-dups may generate symbols
12133              without type for debug info.
12134
12135              Icc generates relocations against function symbols
12136              instead of local labels.
12137
12138              Relocations against object symbols can happen, eg when
12139              referencing a global array.  For an example of this see
12140              the _clz.o binary in libgcc.a.  */
12141           if (sym != symtab
12142               && ELF_ST_TYPE (sym->st_info) != STT_COMMON
12143               && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
12144             {
12145               warn (_("skipping unexpected symbol type %s in %ld'th relocation in section %s\n"),
12146                     get_symbol_type (ELF_ST_TYPE (sym->st_info)),
12147                     (long int)(rp - relocs),
12148                     printable_section_name (relsec));
12149               continue;
12150             }
12151
12152           addend = 0;
12153           if (is_rela)
12154             addend += rp->r_addend;
12155           /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
12156              partial_inplace.  */
12157           if (!is_rela
12158               || (elf_header.e_machine == EM_XTENSA
12159                   && reloc_type == 1)
12160               || ((elf_header.e_machine == EM_PJ
12161                    || elf_header.e_machine == EM_PJ_OLD)
12162                   && reloc_type == 1)
12163               || ((elf_header.e_machine == EM_D30V
12164                    || elf_header.e_machine == EM_CYGNUS_D30V)
12165                   && reloc_type == 12))
12166             addend += byte_get (rloc, reloc_size);
12167
12168           if (is_32bit_pcrel_reloc (reloc_type)
12169               || is_64bit_pcrel_reloc (reloc_type))
12170             {
12171               /* On HPPA, all pc-relative relocations are biased by 8.  */
12172               if (elf_header.e_machine == EM_PARISC)
12173                 addend -= 8;
12174               byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
12175                         reloc_size);
12176             }
12177           else
12178             byte_put (rloc, addend + sym->st_value, reloc_size);
12179         }
12180
12181       free (symtab);
12182
12183       if (relocs_return)
12184         {
12185           * (Elf_Internal_Rela **) relocs_return = relocs;
12186           * num_relocs_return = num_relocs;
12187         }
12188       else
12189         free (relocs);
12190
12191       break;
12192     }
12193 }
12194
12195 #ifdef SUPPORT_DISASSEMBLY
12196 static int
12197 disassemble_section (Elf_Internal_Shdr * section, FILE * file)
12198 {
12199   printf (_("\nAssembly dump of section %s\n"), printable_section_name (section));
12200
12201   /* FIXME: XXX -- to be done --- XXX */
12202
12203   return 1;
12204 }
12205 #endif
12206
12207 /* Reads in the contents of SECTION from FILE, returning a pointer
12208    to a malloc'ed buffer or NULL if something went wrong.  */
12209
12210 static char *
12211 get_section_contents (Elf_Internal_Shdr * section, FILE * file)
12212 {
12213   bfd_size_type num_bytes;
12214
12215   num_bytes = section->sh_size;
12216
12217   if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
12218     {
12219       printf (_("\nSection '%s' has no data to dump.\n"),
12220               printable_section_name (section));
12221       return NULL;
12222     }
12223
12224   return  (char *) get_data (NULL, file, section->sh_offset, 1, num_bytes,
12225                              _("section contents"));
12226 }
12227
12228 /* Uncompresses a section that was compressed using zlib, in place.  */
12229
12230 static bfd_boolean
12231 uncompress_section_contents (unsigned char **buffer,
12232                              dwarf_size_type uncompressed_size,
12233                              dwarf_size_type *size)
12234 {
12235   dwarf_size_type compressed_size = *size;
12236   unsigned char * compressed_buffer = *buffer;
12237   unsigned char * uncompressed_buffer;
12238   z_stream strm;
12239   int rc;
12240
12241   /* It is possible the section consists of several compressed
12242      buffers concatenated together, so we uncompress in a loop.  */
12243   /* PR 18313: The state field in the z_stream structure is supposed
12244      to be invisible to the user (ie us), but some compilers will
12245      still complain about it being used without initialisation.  So
12246      we first zero the entire z_stream structure and then set the fields
12247      that we need.  */
12248   memset (& strm, 0, sizeof strm);
12249   strm.avail_in = compressed_size;
12250   strm.next_in = (Bytef *) compressed_buffer;
12251   strm.avail_out = uncompressed_size;
12252   uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
12253
12254   rc = inflateInit (& strm);
12255   while (strm.avail_in > 0)
12256     {
12257       if (rc != Z_OK)
12258         goto fail;
12259       strm.next_out = ((Bytef *) uncompressed_buffer
12260                        + (uncompressed_size - strm.avail_out));
12261       rc = inflate (&strm, Z_FINISH);
12262       if (rc != Z_STREAM_END)
12263         goto fail;
12264       rc = inflateReset (& strm);
12265     }
12266   rc = inflateEnd (& strm);
12267   if (rc != Z_OK
12268       || strm.avail_out != 0)
12269     goto fail;
12270
12271   *buffer = uncompressed_buffer;
12272   *size = uncompressed_size;
12273   return TRUE;
12274
12275  fail:
12276   free (uncompressed_buffer);
12277   /* Indicate decompression failure.  */
12278   *buffer = NULL;
12279   return FALSE;
12280 }
12281
12282 static void
12283 dump_section_as_strings (Elf_Internal_Shdr * section, FILE * file)
12284 {
12285   Elf_Internal_Shdr *  relsec;
12286   bfd_size_type        num_bytes;
12287   unsigned char *      data;
12288   unsigned char *      end;
12289   unsigned char *      real_start;
12290   unsigned char *      start;
12291   bfd_boolean          some_strings_shown;
12292
12293   real_start = start = (unsigned char *) get_section_contents (section,
12294                                                                file);
12295   if (start == NULL)
12296     return;
12297   num_bytes = section->sh_size;
12298
12299   printf (_("\nString dump of section '%s':\n"), printable_section_name (section));
12300
12301   if (decompress_dumps)
12302     {
12303       dwarf_size_type new_size = num_bytes;
12304       dwarf_size_type uncompressed_size = 0;
12305
12306       if ((section->sh_flags & SHF_COMPRESSED) != 0)
12307         {
12308           Elf_Internal_Chdr chdr;
12309           unsigned int compression_header_size
12310             = get_compression_header (& chdr, (unsigned char *) start);
12311
12312           if (chdr.ch_type != ELFCOMPRESS_ZLIB)
12313             {
12314               warn (_("section '%s' has unsupported compress type: %d\n"),
12315                     printable_section_name (section), chdr.ch_type);
12316               return;
12317             }
12318           else if (chdr.ch_addralign != section->sh_addralign)
12319             {
12320               warn (_("compressed section '%s' is corrupted\n"),
12321                     printable_section_name (section));
12322               return;
12323             }
12324           uncompressed_size = chdr.ch_size;
12325           start += compression_header_size;
12326           new_size -= compression_header_size;
12327         }
12328       else if (new_size > 12 && streq ((char *) start, "ZLIB"))
12329         {
12330           /* Read the zlib header.  In this case, it should be "ZLIB"
12331              followed by the uncompressed section size, 8 bytes in
12332              big-endian order.  */
12333           uncompressed_size = start[4]; uncompressed_size <<= 8;
12334           uncompressed_size += start[5]; uncompressed_size <<= 8;
12335           uncompressed_size += start[6]; uncompressed_size <<= 8;
12336           uncompressed_size += start[7]; uncompressed_size <<= 8;
12337           uncompressed_size += start[8]; uncompressed_size <<= 8;
12338           uncompressed_size += start[9]; uncompressed_size <<= 8;
12339           uncompressed_size += start[10]; uncompressed_size <<= 8;
12340           uncompressed_size += start[11];
12341           start += 12;
12342           new_size -= 12;
12343         }
12344
12345       if (uncompressed_size
12346           && uncompress_section_contents (& start,
12347                                           uncompressed_size, & new_size))
12348         num_bytes = new_size;
12349     }
12350
12351   /* If the section being dumped has relocations against it the user might
12352      be expecting these relocations to have been applied.  Check for this
12353      case and issue a warning message in order to avoid confusion.
12354      FIXME: Maybe we ought to have an option that dumps a section with
12355      relocs applied ?  */
12356   for (relsec = section_headers;
12357        relsec < section_headers + elf_header.e_shnum;
12358        ++relsec)
12359     {
12360       if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12361           || relsec->sh_info >= elf_header.e_shnum
12362           || section_headers + relsec->sh_info != section
12363           || relsec->sh_size == 0
12364           || relsec->sh_link >= elf_header.e_shnum)
12365         continue;
12366
12367       printf (_("  Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
12368       break;
12369     }
12370
12371   data = start;
12372   end  = start + num_bytes;
12373   some_strings_shown = FALSE;
12374
12375   while (data < end)
12376     {
12377       while (!ISPRINT (* data))
12378         if (++ data >= end)
12379           break;
12380
12381       if (data < end)
12382         {
12383           size_t maxlen = end - data;
12384
12385 #ifndef __MSVCRT__
12386           /* PR 11128: Use two separate invocations in order to work
12387              around bugs in the Solaris 8 implementation of printf.  */
12388           printf ("  [%6tx]  ", data - start);
12389 #else
12390           printf ("  [%6Ix]  ", (size_t) (data - start));
12391 #endif
12392           if (maxlen > 0)
12393             {
12394               print_symbol ((int) maxlen, (const char *) data);
12395               putchar ('\n');
12396               data += strnlen ((const char *) data, maxlen);
12397             }
12398           else
12399             {
12400               printf (_("<corrupt>\n"));
12401               data = end;
12402             }
12403           some_strings_shown = TRUE;
12404         }
12405     }
12406
12407   if (! some_strings_shown)
12408     printf (_("  No strings found in this section."));
12409
12410   free (real_start);
12411
12412   putchar ('\n');
12413 }
12414
12415 static void
12416 dump_section_as_bytes (Elf_Internal_Shdr * section,
12417                        FILE * file,
12418                        bfd_boolean relocate)
12419 {
12420   Elf_Internal_Shdr * relsec;
12421   bfd_size_type       bytes;
12422   bfd_size_type       section_size;
12423   bfd_vma             addr;
12424   unsigned char *     data;
12425   unsigned char *     real_start;
12426   unsigned char *     start;
12427
12428   real_start = start = (unsigned char *) get_section_contents (section, file);
12429   if (start == NULL)
12430     return;
12431   section_size = section->sh_size;
12432
12433   printf (_("\nHex dump of section '%s':\n"), printable_section_name (section));
12434
12435   if (decompress_dumps)
12436     {
12437       dwarf_size_type new_size = section_size;
12438       dwarf_size_type uncompressed_size = 0;
12439
12440       if ((section->sh_flags & SHF_COMPRESSED) != 0)
12441         {
12442           Elf_Internal_Chdr chdr;
12443           unsigned int compression_header_size
12444             = get_compression_header (& chdr, start);
12445
12446           if (chdr.ch_type != ELFCOMPRESS_ZLIB)
12447             {
12448               warn (_("section '%s' has unsupported compress type: %d\n"),
12449                     printable_section_name (section), chdr.ch_type);
12450               return;
12451             }
12452           else if (chdr.ch_addralign != section->sh_addralign)
12453             {
12454               warn (_("compressed section '%s' is corrupted\n"),
12455                     printable_section_name (section));
12456               return;
12457             }
12458           uncompressed_size = chdr.ch_size;
12459           start += compression_header_size;
12460           new_size -= compression_header_size;
12461         }
12462       else if (new_size > 12 && streq ((char *) start, "ZLIB"))
12463         {
12464           /* Read the zlib header.  In this case, it should be "ZLIB"
12465              followed by the uncompressed section size, 8 bytes in
12466              big-endian order.  */
12467           uncompressed_size = start[4]; uncompressed_size <<= 8;
12468           uncompressed_size += start[5]; uncompressed_size <<= 8;
12469           uncompressed_size += start[6]; uncompressed_size <<= 8;
12470           uncompressed_size += start[7]; uncompressed_size <<= 8;
12471           uncompressed_size += start[8]; uncompressed_size <<= 8;
12472           uncompressed_size += start[9]; uncompressed_size <<= 8;
12473           uncompressed_size += start[10]; uncompressed_size <<= 8;
12474           uncompressed_size += start[11];
12475           start += 12;
12476           new_size -= 12;
12477         }
12478
12479       if (uncompressed_size
12480           && uncompress_section_contents (& start, uncompressed_size,
12481                                           & new_size))
12482         section_size = new_size;
12483     }
12484
12485   if (relocate)
12486     {
12487       apply_relocations (file, section, start, section_size, NULL, NULL);
12488     }
12489   else
12490     {
12491       /* If the section being dumped has relocations against it the user might
12492          be expecting these relocations to have been applied.  Check for this
12493          case and issue a warning message in order to avoid confusion.
12494          FIXME: Maybe we ought to have an option that dumps a section with
12495          relocs applied ?  */
12496       for (relsec = section_headers;
12497            relsec < section_headers + elf_header.e_shnum;
12498            ++relsec)
12499         {
12500           if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12501               || relsec->sh_info >= elf_header.e_shnum
12502               || section_headers + relsec->sh_info != section
12503               || relsec->sh_size == 0
12504               || relsec->sh_link >= elf_header.e_shnum)
12505             continue;
12506
12507           printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
12508           break;
12509         }
12510     }
12511
12512   addr = section->sh_addr;
12513   bytes = section_size;
12514   data = start;
12515
12516   while (bytes)
12517     {
12518       int j;
12519       int k;
12520       int lbytes;
12521
12522       lbytes = (bytes > 16 ? 16 : bytes);
12523
12524       printf ("  0x%8.8lx ", (unsigned long) addr);
12525
12526       for (j = 0; j < 16; j++)
12527         {
12528           if (j < lbytes)
12529             printf ("%2.2x", data[j]);
12530           else
12531             printf ("  ");
12532
12533           if ((j & 3) == 3)
12534             printf (" ");
12535         }
12536
12537       for (j = 0; j < lbytes; j++)
12538         {
12539           k = data[j];
12540           if (k >= ' ' && k < 0x7f)
12541             printf ("%c", k);
12542           else
12543             printf (".");
12544         }
12545
12546       putchar ('\n');
12547
12548       data  += lbytes;
12549       addr  += lbytes;
12550       bytes -= lbytes;
12551     }
12552
12553   free (real_start);
12554
12555   putchar ('\n');
12556 }
12557
12558 static int
12559 load_specific_debug_section (enum dwarf_section_display_enum debug,
12560                              const Elf_Internal_Shdr * sec, void * file)
12561 {
12562   struct dwarf_section * section = &debug_displays [debug].section;
12563   char buf [64];
12564
12565   /* If it is already loaded, do nothing.  */
12566   if (section->start != NULL)
12567     return 1;
12568
12569   snprintf (buf, sizeof (buf), _("%s section data"), section->name);
12570   section->address = sec->sh_addr;
12571   section->user_data = NULL;
12572   section->start = (unsigned char *) get_data (NULL, (FILE *) file,
12573                                                sec->sh_offset, 1,
12574                                                sec->sh_size, buf);
12575   if (section->start == NULL)
12576     section->size = 0;
12577   else
12578     {
12579       unsigned char *start = section->start;
12580       dwarf_size_type size = sec->sh_size;
12581       dwarf_size_type uncompressed_size = 0;
12582
12583       if ((sec->sh_flags & SHF_COMPRESSED) != 0)
12584         {
12585           Elf_Internal_Chdr chdr;
12586           unsigned int compression_header_size;
12587
12588           if (size < sizeof chdr)
12589             {
12590               warn (_("compressed section %s is too small to contain a compression header"),
12591                     section->name);
12592               return 0;
12593             }
12594
12595           compression_header_size = get_compression_header (&chdr, start);
12596
12597           if (chdr.ch_type != ELFCOMPRESS_ZLIB)
12598             {
12599               warn (_("section '%s' has unsupported compress type: %d\n"),
12600                     section->name, chdr.ch_type);
12601               return 0;
12602             }
12603           else if (chdr.ch_addralign != sec->sh_addralign)
12604             {
12605               warn (_("compressed section '%s' is corrupted\n"),
12606                     section->name);
12607               return 0;
12608             }
12609           uncompressed_size = chdr.ch_size;
12610           start += compression_header_size;
12611           size -= compression_header_size;
12612         }
12613       else if (size > 12 && streq ((char *) start, "ZLIB"))
12614         {
12615           /* Read the zlib header.  In this case, it should be "ZLIB"
12616              followed by the uncompressed section size, 8 bytes in
12617              big-endian order.  */
12618           uncompressed_size = start[4]; uncompressed_size <<= 8;
12619           uncompressed_size += start[5]; uncompressed_size <<= 8;
12620           uncompressed_size += start[6]; uncompressed_size <<= 8;
12621           uncompressed_size += start[7]; uncompressed_size <<= 8;
12622           uncompressed_size += start[8]; uncompressed_size <<= 8;
12623           uncompressed_size += start[9]; uncompressed_size <<= 8;
12624           uncompressed_size += start[10]; uncompressed_size <<= 8;
12625           uncompressed_size += start[11];
12626           start += 12;
12627           size -= 12;
12628         }
12629
12630       if (uncompressed_size
12631           && uncompress_section_contents (&start, uncompressed_size,
12632                                           &size))
12633         {
12634           /* Free the compressed buffer, update the section buffer
12635              and the section size if uncompress is successful.  */
12636           free (section->start);
12637           section->start = start;
12638         }
12639       section->size = size;
12640     }
12641
12642   if (section->start == NULL)
12643     return 0;
12644
12645   if (debug_displays [debug].relocate)
12646     apply_relocations ((FILE *) file, sec, section->start, section->size,
12647                        & section->reloc_info, & section->num_relocs);
12648   else
12649     {
12650       section->reloc_info = NULL;
12651       section->num_relocs = 0;
12652     }
12653
12654   return 1;
12655 }
12656
12657 /* If this is not NULL, load_debug_section will only look for sections
12658    within the list of sections given here.  */
12659 unsigned int *section_subset = NULL;
12660
12661 int
12662 load_debug_section (enum dwarf_section_display_enum debug, void * file)
12663 {
12664   struct dwarf_section * section = &debug_displays [debug].section;
12665   Elf_Internal_Shdr * sec;
12666
12667   /* Locate the debug section.  */
12668   sec = find_section_in_set (section->uncompressed_name, section_subset);
12669   if (sec != NULL)
12670     section->name = section->uncompressed_name;
12671   else
12672     {
12673       sec = find_section_in_set (section->compressed_name, section_subset);
12674       if (sec != NULL)
12675         section->name = section->compressed_name;
12676     }
12677   if (sec == NULL)
12678     return 0;
12679
12680   /* If we're loading from a subset of sections, and we've loaded
12681      a section matching this name before, it's likely that it's a
12682      different one.  */
12683   if (section_subset != NULL)
12684     free_debug_section (debug);
12685
12686   return load_specific_debug_section (debug, sec, (FILE *) file);
12687 }
12688
12689 void
12690 free_debug_section (enum dwarf_section_display_enum debug)
12691 {
12692   struct dwarf_section * section = &debug_displays [debug].section;
12693
12694   if (section->start == NULL)
12695     return;
12696
12697   free ((char *) section->start);
12698   section->start = NULL;
12699   section->address = 0;
12700   section->size = 0;
12701 }
12702
12703 static int
12704 display_debug_section (int shndx, Elf_Internal_Shdr * section, FILE * file)
12705 {
12706   char * name = SECTION_NAME (section);
12707   const char * print_name = printable_section_name (section);
12708   bfd_size_type length;
12709   int result = 1;
12710   int i;
12711
12712   length = section->sh_size;
12713   if (length == 0)
12714     {
12715       printf (_("\nSection '%s' has no debugging data.\n"), print_name);
12716       return 0;
12717     }
12718   if (section->sh_type == SHT_NOBITS)
12719     {
12720       /* There is no point in dumping the contents of a debugging section
12721          which has the NOBITS type - the bits in the file will be random.
12722          This can happen when a file containing a .eh_frame section is
12723          stripped with the --only-keep-debug command line option.  */
12724       printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"),
12725               print_name);
12726       return 0;
12727     }
12728
12729   if (const_strneq (name, ".gnu.linkonce.wi."))
12730     name = ".debug_info";
12731
12732   /* See if we know how to display the contents of this section.  */
12733   for (i = 0; i < max; i++)
12734     if (streq (debug_displays[i].section.uncompressed_name, name)
12735         || (i == line && const_strneq (name, ".debug_line."))
12736         || streq (debug_displays[i].section.compressed_name, name))
12737       {
12738         struct dwarf_section * sec = &debug_displays [i].section;
12739         int secondary = (section != find_section (name));
12740
12741         if (secondary)
12742           free_debug_section ((enum dwarf_section_display_enum) i);
12743
12744         if (i == line && const_strneq (name, ".debug_line."))
12745           sec->name = name;
12746         else if (streq (sec->uncompressed_name, name))
12747           sec->name = sec->uncompressed_name;
12748         else
12749           sec->name = sec->compressed_name;
12750         if (load_specific_debug_section ((enum dwarf_section_display_enum) i,
12751                                          section, file))
12752           {
12753             /* If this debug section is part of a CU/TU set in a .dwp file,
12754                restrict load_debug_section to the sections in that set.  */
12755             section_subset = find_cu_tu_set (file, shndx);
12756
12757             result &= debug_displays[i].display (sec, file);
12758
12759             section_subset = NULL;
12760
12761             if (secondary || (i != info && i != abbrev))
12762               free_debug_section ((enum dwarf_section_display_enum) i);
12763           }
12764
12765         break;
12766       }
12767
12768   if (i == max)
12769     {
12770       printf (_("Unrecognized debug section: %s\n"), print_name);
12771       result = 0;
12772     }
12773
12774   return result;
12775 }
12776
12777 /* Set DUMP_SECTS for all sections where dumps were requested
12778    based on section name.  */
12779
12780 static void
12781 initialise_dumps_byname (void)
12782 {
12783   struct dump_list_entry * cur;
12784
12785   for (cur = dump_sects_byname; cur; cur = cur->next)
12786     {
12787       unsigned int i;
12788       int any;
12789
12790       for (i = 0, any = 0; i < elf_header.e_shnum; i++)
12791         if (streq (SECTION_NAME (section_headers + i), cur->name))
12792           {
12793             request_dump_bynumber (i, cur->type);
12794             any = 1;
12795           }
12796
12797       if (!any)
12798         warn (_("Section '%s' was not dumped because it does not exist!\n"),
12799               cur->name);
12800     }
12801 }
12802
12803 static void
12804 process_section_contents (FILE * file)
12805 {
12806   Elf_Internal_Shdr * section;
12807   unsigned int i;
12808
12809   if (! do_dump)
12810     return;
12811
12812   initialise_dumps_byname ();
12813
12814   for (i = 0, section = section_headers;
12815        i < elf_header.e_shnum && i < num_dump_sects;
12816        i++, section++)
12817     {
12818 #ifdef SUPPORT_DISASSEMBLY
12819       if (dump_sects[i] & DISASS_DUMP)
12820         disassemble_section (section, file);
12821 #endif
12822       if (dump_sects[i] & HEX_DUMP)
12823         dump_section_as_bytes (section, file, FALSE);
12824
12825       if (dump_sects[i] & RELOC_DUMP)
12826         dump_section_as_bytes (section, file, TRUE);
12827
12828       if (dump_sects[i] & STRING_DUMP)
12829         dump_section_as_strings (section, file);
12830
12831       if (dump_sects[i] & DEBUG_DUMP)
12832         display_debug_section (i, section, file);
12833     }
12834
12835   /* Check to see if the user requested a
12836      dump of a section that does not exist.  */
12837   while (i++ < num_dump_sects)
12838     if (dump_sects[i])
12839       warn (_("Section %d was not dumped because it does not exist!\n"), i);
12840 }
12841
12842 static void
12843 process_mips_fpe_exception (int mask)
12844 {
12845   if (mask)
12846     {
12847       int first = 1;
12848       if (mask & OEX_FPU_INEX)
12849         fputs ("INEX", stdout), first = 0;
12850       if (mask & OEX_FPU_UFLO)
12851         printf ("%sUFLO", first ? "" : "|"), first = 0;
12852       if (mask & OEX_FPU_OFLO)
12853         printf ("%sOFLO", first ? "" : "|"), first = 0;
12854       if (mask & OEX_FPU_DIV0)
12855         printf ("%sDIV0", first ? "" : "|"), first = 0;
12856       if (mask & OEX_FPU_INVAL)
12857         printf ("%sINVAL", first ? "" : "|");
12858     }
12859   else
12860     fputs ("0", stdout);
12861 }
12862
12863 /* Display's the value of TAG at location P.  If TAG is
12864    greater than 0 it is assumed to be an unknown tag, and
12865    a message is printed to this effect.  Otherwise it is
12866    assumed that a message has already been printed.
12867
12868    If the bottom bit of TAG is set it assumed to have a
12869    string value, otherwise it is assumed to have an integer
12870    value.
12871
12872    Returns an updated P pointing to the first unread byte
12873    beyond the end of TAG's value.
12874
12875    Reads at or beyond END will not be made.  */
12876
12877 static unsigned char *
12878 display_tag_value (int tag,
12879                    unsigned char * p,
12880                    const unsigned char * const end)
12881 {
12882   unsigned long val;
12883
12884   if (tag > 0)
12885     printf ("  Tag_unknown_%d: ", tag);
12886
12887   if (p >= end)
12888     {
12889       warn (_("<corrupt tag>\n"));
12890     }
12891   else if (tag & 1)
12892     {
12893       /* PR 17531 file: 027-19978-0.004.  */
12894       size_t maxlen = (end - p) - 1;
12895
12896       putchar ('"');
12897       if (maxlen > 0)
12898         {
12899           print_symbol ((int) maxlen, (const char *) p);
12900           p += strnlen ((char *) p, maxlen) + 1;
12901         }
12902       else
12903         {
12904           printf (_("<corrupt string tag>"));
12905           p = (unsigned char *) end;
12906         }
12907       printf ("\"\n");
12908     }
12909   else
12910     {
12911       unsigned int len;
12912
12913       val = read_uleb128 (p, &len, end);
12914       p += len;
12915       printf ("%ld (0x%lx)\n", val, val);
12916     }
12917
12918   assert (p <= end);
12919   return p;
12920 }
12921
12922 /* ARM EABI attributes section.  */
12923 typedef struct
12924 {
12925   unsigned int tag;
12926   const char * name;
12927   /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup.  */
12928   unsigned int type;
12929   const char ** table;
12930 } arm_attr_public_tag;
12931
12932 static const char * arm_attr_tag_CPU_arch[] =
12933   {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
12934    "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8", "", "v8-M.baseline",
12935    "v8-M.mainline"};
12936 static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
12937 static const char * arm_attr_tag_THUMB_ISA_use[] =
12938   {"No", "Thumb-1", "Thumb-2", "Yes"};
12939 static const char * arm_attr_tag_FP_arch[] =
12940   {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
12941    "FP for ARMv8", "FPv5/FP-D16 for ARMv8"};
12942 static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
12943 static const char * arm_attr_tag_Advanced_SIMD_arch[] =
12944   {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8",
12945    "NEON for ARMv8.1"};
12946 static const char * arm_attr_tag_PCS_config[] =
12947   {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
12948    "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
12949 static const char * arm_attr_tag_ABI_PCS_R9_use[] =
12950   {"V6", "SB", "TLS", "Unused"};
12951 static const char * arm_attr_tag_ABI_PCS_RW_data[] =
12952   {"Absolute", "PC-relative", "SB-relative", "None"};
12953 static const char * arm_attr_tag_ABI_PCS_RO_data[] =
12954   {"Absolute", "PC-relative", "None"};
12955 static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
12956   {"None", "direct", "GOT-indirect"};
12957 static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
12958   {"None", "??? 1", "2", "??? 3", "4"};
12959 static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
12960 static const char * arm_attr_tag_ABI_FP_denormal[] =
12961   {"Unused", "Needed", "Sign only"};
12962 static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
12963 static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
12964 static const char * arm_attr_tag_ABI_FP_number_model[] =
12965   {"Unused", "Finite", "RTABI", "IEEE 754"};
12966 static const char * arm_attr_tag_ABI_enum_size[] =
12967   {"Unused", "small", "int", "forced to int"};
12968 static const char * arm_attr_tag_ABI_HardFP_use[] =
12969   {"As Tag_FP_arch", "SP only", "Reserved", "Deprecated"};
12970 static const char * arm_attr_tag_ABI_VFP_args[] =
12971   {"AAPCS", "VFP registers", "custom", "compatible"};
12972 static const char * arm_attr_tag_ABI_WMMX_args[] =
12973   {"AAPCS", "WMMX registers", "custom"};
12974 static const char * arm_attr_tag_ABI_optimization_goals[] =
12975   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
12976     "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
12977 static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
12978   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
12979     "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
12980 static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
12981 static const char * arm_attr_tag_FP_HP_extension[] =
12982   {"Not Allowed", "Allowed"};
12983 static const char * arm_attr_tag_ABI_FP_16bit_format[] =
12984   {"None", "IEEE 754", "Alternative Format"};
12985 static const char * arm_attr_tag_DSP_extension[] =
12986   {"Follow architecture", "Allowed"};
12987 static const char * arm_attr_tag_MPextension_use[] =
12988   {"Not Allowed", "Allowed"};
12989 static const char * arm_attr_tag_DIV_use[] =
12990   {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
12991     "Allowed in v7-A with integer division extension"};
12992 static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
12993 static const char * arm_attr_tag_Virtualization_use[] =
12994   {"Not Allowed", "TrustZone", "Virtualization Extensions",
12995     "TrustZone and Virtualization Extensions"};
12996 static const char * arm_attr_tag_MPextension_use_legacy[] =
12997   {"Not Allowed", "Allowed"};
12998
12999 #define LOOKUP(id, name) \
13000   {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
13001 static arm_attr_public_tag arm_attr_public_tags[] =
13002 {
13003   {4, "CPU_raw_name", 1, NULL},
13004   {5, "CPU_name", 1, NULL},
13005   LOOKUP(6, CPU_arch),
13006   {7, "CPU_arch_profile", 0, NULL},
13007   LOOKUP(8, ARM_ISA_use),
13008   LOOKUP(9, THUMB_ISA_use),
13009   LOOKUP(10, FP_arch),
13010   LOOKUP(11, WMMX_arch),
13011   LOOKUP(12, Advanced_SIMD_arch),
13012   LOOKUP(13, PCS_config),
13013   LOOKUP(14, ABI_PCS_R9_use),
13014   LOOKUP(15, ABI_PCS_RW_data),
13015   LOOKUP(16, ABI_PCS_RO_data),
13016   LOOKUP(17, ABI_PCS_GOT_use),
13017   LOOKUP(18, ABI_PCS_wchar_t),
13018   LOOKUP(19, ABI_FP_rounding),
13019   LOOKUP(20, ABI_FP_denormal),
13020   LOOKUP(21, ABI_FP_exceptions),
13021   LOOKUP(22, ABI_FP_user_exceptions),
13022   LOOKUP(23, ABI_FP_number_model),
13023   {24, "ABI_align_needed", 0, NULL},
13024   {25, "ABI_align_preserved", 0, NULL},
13025   LOOKUP(26, ABI_enum_size),
13026   LOOKUP(27, ABI_HardFP_use),
13027   LOOKUP(28, ABI_VFP_args),
13028   LOOKUP(29, ABI_WMMX_args),
13029   LOOKUP(30, ABI_optimization_goals),
13030   LOOKUP(31, ABI_FP_optimization_goals),
13031   {32, "compatibility", 0, NULL},
13032   LOOKUP(34, CPU_unaligned_access),
13033   LOOKUP(36, FP_HP_extension),
13034   LOOKUP(38, ABI_FP_16bit_format),
13035   LOOKUP(42, MPextension_use),
13036   LOOKUP(44, DIV_use),
13037   LOOKUP(46, DSP_extension),
13038   {64, "nodefaults", 0, NULL},
13039   {65, "also_compatible_with", 0, NULL},
13040   LOOKUP(66, T2EE_use),
13041   {67, "conformance", 1, NULL},
13042   LOOKUP(68, Virtualization_use),
13043   LOOKUP(70, MPextension_use_legacy)
13044 };
13045 #undef LOOKUP
13046
13047 static unsigned char *
13048 display_arm_attribute (unsigned char * p,
13049                        const unsigned char * const end)
13050 {
13051   unsigned int tag;
13052   unsigned int len;
13053   unsigned int val;
13054   arm_attr_public_tag * attr;
13055   unsigned i;
13056   unsigned int type;
13057
13058   tag = read_uleb128 (p, &len, end);
13059   p += len;
13060   attr = NULL;
13061   for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
13062     {
13063       if (arm_attr_public_tags[i].tag == tag)
13064         {
13065           attr = &arm_attr_public_tags[i];
13066           break;
13067         }
13068     }
13069
13070   if (attr)
13071     {
13072       printf ("  Tag_%s: ", attr->name);
13073       switch (attr->type)
13074         {
13075         case 0:
13076           switch (tag)
13077             {
13078             case 7: /* Tag_CPU_arch_profile.  */
13079               val = read_uleb128 (p, &len, end);
13080               p += len;
13081               switch (val)
13082                 {
13083                 case 0: printf (_("None\n")); break;
13084                 case 'A': printf (_("Application\n")); break;
13085                 case 'R': printf (_("Realtime\n")); break;
13086                 case 'M': printf (_("Microcontroller\n")); break;
13087                 case 'S': printf (_("Application or Realtime\n")); break;
13088                 default: printf ("??? (%d)\n", val); break;
13089                 }
13090               break;
13091
13092             case 24: /* Tag_align_needed.  */
13093               val = read_uleb128 (p, &len, end);
13094               p += len;
13095               switch (val)
13096                 {
13097                 case 0: printf (_("None\n")); break;
13098                 case 1: printf (_("8-byte\n")); break;
13099                 case 2: printf (_("4-byte\n")); break;
13100                 case 3: printf ("??? 3\n"); break;
13101                 default:
13102                   if (val <= 12)
13103                     printf (_("8-byte and up to %d-byte extended\n"),
13104                             1 << val);
13105                   else
13106                     printf ("??? (%d)\n", val);
13107                   break;
13108                 }
13109               break;
13110
13111             case 25: /* Tag_align_preserved.  */
13112               val = read_uleb128 (p, &len, end);
13113               p += len;
13114               switch (val)
13115                 {
13116                 case 0: printf (_("None\n")); break;
13117                 case 1: printf (_("8-byte, except leaf SP\n")); break;
13118                 case 2: printf (_("8-byte\n")); break;
13119                 case 3: printf ("??? 3\n"); break;
13120                 default:
13121                   if (val <= 12)
13122                     printf (_("8-byte and up to %d-byte extended\n"),
13123                             1 << val);
13124                   else
13125                     printf ("??? (%d)\n", val);
13126                   break;
13127                 }
13128               break;
13129
13130             case 32: /* Tag_compatibility.  */
13131               {
13132                 val = read_uleb128 (p, &len, end);
13133                 p += len;
13134                 printf (_("flag = %d, vendor = "), val);
13135                 if (p < end - 1)
13136                   {
13137                     size_t maxlen = (end - p) - 1;
13138
13139                     print_symbol ((int) maxlen, (const char *) p);
13140                     p += strnlen ((char *) p, maxlen) + 1;
13141                   }
13142                 else
13143                   {
13144                     printf (_("<corrupt>"));
13145                     p = (unsigned char *) end;
13146                   }
13147                 putchar ('\n');
13148               }
13149               break;
13150
13151             case 64: /* Tag_nodefaults.  */
13152               /* PR 17531: file: 001-505008-0.01.  */
13153               if (p < end)
13154                 p++;
13155               printf (_("True\n"));
13156               break;
13157
13158             case 65: /* Tag_also_compatible_with.  */
13159               val = read_uleb128 (p, &len, end);
13160               p += len;
13161               if (val == 6 /* Tag_CPU_arch.  */)
13162                 {
13163                   val = read_uleb128 (p, &len, end);
13164                   p += len;
13165                   if ((unsigned int) val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
13166                     printf ("??? (%d)\n", val);
13167                   else
13168                     printf ("%s\n", arm_attr_tag_CPU_arch[val]);
13169                 }
13170               else
13171                 printf ("???\n");
13172               while (p < end && *(p++) != '\0' /* NUL terminator.  */)
13173                 ;
13174               break;
13175
13176             default:
13177               printf (_("<unknown: %d>\n"), tag);
13178               break;
13179             }
13180           return p;
13181
13182         case 1:
13183           return display_tag_value (-1, p, end);
13184         case 2:
13185           return display_tag_value (0, p, end);
13186
13187         default:
13188           assert (attr->type & 0x80);
13189           val = read_uleb128 (p, &len, end);
13190           p += len;
13191           type = attr->type & 0x7f;
13192           if (val >= type)
13193             printf ("??? (%d)\n", val);
13194           else
13195             printf ("%s\n", attr->table[val]);
13196           return p;
13197         }
13198     }
13199
13200   return display_tag_value (tag, p, end);
13201 }
13202
13203 static unsigned char *
13204 display_gnu_attribute (unsigned char * p,
13205                        unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const),
13206                        const unsigned char * const end)
13207 {
13208   int tag;
13209   unsigned int len;
13210   int val;
13211
13212   tag = read_uleb128 (p, &len, end);
13213   p += len;
13214
13215   /* Tag_compatibility is the only generic GNU attribute defined at
13216      present.  */
13217   if (tag == 32)
13218     {
13219       val = read_uleb128 (p, &len, end);
13220       p += len;
13221
13222       printf (_("flag = %d, vendor = "), val);
13223       if (p == end)
13224         {
13225           printf (_("<corrupt>\n"));
13226           warn (_("corrupt vendor attribute\n"));
13227         }
13228       else
13229         {
13230           if (p < end - 1)
13231             {
13232               size_t maxlen = (end - p) - 1;
13233
13234               print_symbol ((int) maxlen, (const char *) p);
13235               p += strnlen ((char *) p, maxlen) + 1;
13236             }
13237           else
13238             {
13239               printf (_("<corrupt>"));
13240               p = (unsigned char *) end;
13241             }
13242           putchar ('\n');
13243         }
13244       return p;
13245     }
13246
13247   if ((tag & 2) == 0 && display_proc_gnu_attribute)
13248     return display_proc_gnu_attribute (p, tag, end);
13249
13250   return display_tag_value (tag, p, end);
13251 }
13252
13253 static unsigned char *
13254 display_power_gnu_attribute (unsigned char * p,
13255                              int tag,
13256                              const unsigned char * const end)
13257 {
13258   unsigned int len;
13259   int val;
13260
13261   if (tag == Tag_GNU_Power_ABI_FP)
13262     {
13263       val = read_uleb128 (p, &len, end);
13264       p += len;
13265       printf ("  Tag_GNU_Power_ABI_FP: ");
13266
13267       switch (val)
13268         {
13269         case 0:
13270           printf (_("Hard or soft float\n"));
13271           break;
13272         case 1:
13273           printf (_("Hard float\n"));
13274           break;
13275         case 2:
13276           printf (_("Soft float\n"));
13277           break;
13278         case 3:
13279           printf (_("Single-precision hard float\n"));
13280           break;
13281         default:
13282           printf ("??? (%d)\n", val);
13283           break;
13284         }
13285       return p;
13286    }
13287
13288   if (tag == Tag_GNU_Power_ABI_Vector)
13289     {
13290       val = read_uleb128 (p, &len, end);
13291       p += len;
13292       printf ("  Tag_GNU_Power_ABI_Vector: ");
13293       switch (val)
13294         {
13295         case 0:
13296           printf (_("Any\n"));
13297           break;
13298         case 1:
13299           printf (_("Generic\n"));
13300           break;
13301         case 2:
13302           printf ("AltiVec\n");
13303           break;
13304         case 3:
13305           printf ("SPE\n");
13306           break;
13307         default:
13308           printf ("??? (%d)\n", val);
13309           break;
13310         }
13311       return p;
13312    }
13313
13314   if (tag == Tag_GNU_Power_ABI_Struct_Return)
13315     {
13316       if (p == end)
13317         {
13318           warn (_("corrupt Tag_GNU_Power_ABI_Struct_Return\n"));
13319           return p;
13320         }
13321
13322       val = read_uleb128 (p, &len, end);
13323       p += len;
13324       printf ("  Tag_GNU_Power_ABI_Struct_Return: ");
13325       switch (val)
13326        {
13327        case 0:
13328          printf (_("Any\n"));
13329          break;
13330        case 1:
13331          printf ("r3/r4\n");
13332          break;
13333        case 2:
13334          printf (_("Memory\n"));
13335          break;
13336        default:
13337          printf ("??? (%d)\n", val);
13338          break;
13339        }
13340       return p;
13341     }
13342
13343   return display_tag_value (tag & 1, p, end);
13344 }
13345
13346 static unsigned char *
13347 display_s390_gnu_attribute (unsigned char * p,
13348                             int tag,
13349                             const unsigned char * const end)
13350 {
13351   unsigned int len;
13352   int val;
13353
13354   if (tag == Tag_GNU_S390_ABI_Vector)
13355     {
13356       val = read_uleb128 (p, &len, end);
13357       p += len;
13358       printf ("  Tag_GNU_S390_ABI_Vector: ");
13359
13360       switch (val)
13361         {
13362         case 0:
13363           printf (_("any\n"));
13364           break;
13365         case 1:
13366           printf (_("software\n"));
13367           break;
13368         case 2:
13369           printf (_("hardware\n"));
13370           break;
13371         default:
13372           printf ("??? (%d)\n", val);
13373           break;
13374         }
13375       return p;
13376    }
13377
13378   return display_tag_value (tag & 1, p, end);
13379 }
13380
13381 static void
13382 display_sparc_hwcaps (int mask)
13383 {
13384   if (mask)
13385     {
13386       int first = 1;
13387
13388       if (mask & ELF_SPARC_HWCAP_MUL32)
13389         fputs ("mul32", stdout), first = 0;
13390       if (mask & ELF_SPARC_HWCAP_DIV32)
13391         printf ("%sdiv32", first ? "" : "|"), first = 0;
13392       if (mask & ELF_SPARC_HWCAP_FSMULD)
13393         printf ("%sfsmuld", first ? "" : "|"), first = 0;
13394       if (mask & ELF_SPARC_HWCAP_V8PLUS)
13395         printf ("%sv8plus", first ? "" : "|"), first = 0;
13396       if (mask & ELF_SPARC_HWCAP_POPC)
13397         printf ("%spopc", first ? "" : "|"), first = 0;
13398       if (mask & ELF_SPARC_HWCAP_VIS)
13399         printf ("%svis", first ? "" : "|"), first = 0;
13400       if (mask & ELF_SPARC_HWCAP_VIS2)
13401         printf ("%svis2", first ? "" : "|"), first = 0;
13402       if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
13403         printf ("%sASIBlkInit", first ? "" : "|"), first = 0;
13404       if (mask & ELF_SPARC_HWCAP_FMAF)
13405         printf ("%sfmaf", first ? "" : "|"), first = 0;
13406       if (mask & ELF_SPARC_HWCAP_VIS3)
13407         printf ("%svis3", first ? "" : "|"), first = 0;
13408       if (mask & ELF_SPARC_HWCAP_HPC)
13409         printf ("%shpc", first ? "" : "|"), first = 0;
13410       if (mask & ELF_SPARC_HWCAP_RANDOM)
13411         printf ("%srandom", first ? "" : "|"), first = 0;
13412       if (mask & ELF_SPARC_HWCAP_TRANS)
13413         printf ("%strans", first ? "" : "|"), first = 0;
13414       if (mask & ELF_SPARC_HWCAP_FJFMAU)
13415         printf ("%sfjfmau", first ? "" : "|"), first = 0;
13416       if (mask & ELF_SPARC_HWCAP_IMA)
13417         printf ("%sima", first ? "" : "|"), first = 0;
13418       if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
13419         printf ("%scspare", first ? "" : "|"), first = 0;
13420     }
13421   else
13422     fputc ('0', stdout);
13423   fputc ('\n', stdout);
13424 }
13425
13426 static void
13427 display_sparc_hwcaps2 (int mask)
13428 {
13429   if (mask)
13430     {
13431       int first = 1;
13432
13433       if (mask & ELF_SPARC_HWCAP2_FJATHPLUS)
13434         fputs ("fjathplus", stdout), first = 0;
13435       if (mask & ELF_SPARC_HWCAP2_VIS3B)
13436         printf ("%svis3b", first ? "" : "|"), first = 0;
13437       if (mask & ELF_SPARC_HWCAP2_ADP)
13438         printf ("%sadp", first ? "" : "|"), first = 0;
13439       if (mask & ELF_SPARC_HWCAP2_SPARC5)
13440         printf ("%ssparc5", first ? "" : "|"), first = 0;
13441       if (mask & ELF_SPARC_HWCAP2_MWAIT)
13442         printf ("%smwait", first ? "" : "|"), first = 0;
13443       if (mask & ELF_SPARC_HWCAP2_XMPMUL)
13444         printf ("%sxmpmul", first ? "" : "|"), first = 0;
13445       if (mask & ELF_SPARC_HWCAP2_XMONT)
13446         printf ("%sxmont2", first ? "" : "|"), first = 0;
13447       if (mask & ELF_SPARC_HWCAP2_NSEC)
13448         printf ("%snsec", first ? "" : "|"), first = 0;
13449       if (mask & ELF_SPARC_HWCAP2_FJATHHPC)
13450         printf ("%sfjathhpc", first ? "" : "|"), first = 0;
13451       if (mask & ELF_SPARC_HWCAP2_FJDES)
13452         printf ("%sfjdes", first ? "" : "|"), first = 0;
13453       if (mask & ELF_SPARC_HWCAP2_FJAES)
13454         printf ("%sfjaes", first ? "" : "|"), first = 0;
13455     }
13456   else
13457     fputc ('0', stdout);
13458   fputc ('\n', stdout);
13459 }
13460
13461 static unsigned char *
13462 display_sparc_gnu_attribute (unsigned char * p,
13463                              int tag,
13464                              const unsigned char * const end)
13465 {
13466   unsigned int len;
13467   int val;
13468
13469   if (tag == Tag_GNU_Sparc_HWCAPS)
13470     {
13471       val = read_uleb128 (p, &len, end);
13472       p += len;
13473       printf ("  Tag_GNU_Sparc_HWCAPS: ");
13474       display_sparc_hwcaps (val);
13475       return p;
13476     }
13477   if (tag == Tag_GNU_Sparc_HWCAPS2)
13478     {
13479       val = read_uleb128 (p, &len, end);
13480       p += len;
13481       printf ("  Tag_GNU_Sparc_HWCAPS2: ");
13482       display_sparc_hwcaps2 (val);
13483       return p;
13484     }
13485
13486   return display_tag_value (tag, p, end);
13487 }
13488
13489 static void
13490 print_mips_fp_abi_value (int val)
13491 {
13492   switch (val)
13493     {
13494     case Val_GNU_MIPS_ABI_FP_ANY:
13495       printf (_("Hard or soft float\n"));
13496       break;
13497     case Val_GNU_MIPS_ABI_FP_DOUBLE:
13498       printf (_("Hard float (double precision)\n"));
13499       break;
13500     case Val_GNU_MIPS_ABI_FP_SINGLE:
13501       printf (_("Hard float (single precision)\n"));
13502       break;
13503     case Val_GNU_MIPS_ABI_FP_SOFT:
13504       printf (_("Soft float\n"));
13505       break;
13506     case Val_GNU_MIPS_ABI_FP_OLD_64:
13507       printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
13508       break;
13509     case Val_GNU_MIPS_ABI_FP_XX:
13510       printf (_("Hard float (32-bit CPU, Any FPU)\n"));
13511       break;
13512     case Val_GNU_MIPS_ABI_FP_64:
13513       printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
13514       break;
13515     case Val_GNU_MIPS_ABI_FP_64A:
13516       printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
13517       break;
13518     case Val_GNU_MIPS_ABI_FP_NAN2008:
13519       printf (_("NaN 2008 compatibility\n"));
13520       break;
13521     default:
13522       printf ("??? (%d)\n", val);
13523       break;
13524     }
13525 }
13526
13527 static unsigned char *
13528 display_mips_gnu_attribute (unsigned char * p,
13529                             int tag,
13530                             const unsigned char * const end)
13531 {
13532   if (tag == Tag_GNU_MIPS_ABI_FP)
13533     {
13534       unsigned int len;
13535       int val;
13536
13537       val = read_uleb128 (p, &len, end);
13538       p += len;
13539       printf ("  Tag_GNU_MIPS_ABI_FP: ");
13540
13541       print_mips_fp_abi_value (val);
13542
13543       return p;
13544    }
13545
13546   if (tag == Tag_GNU_MIPS_ABI_MSA)
13547     {
13548       unsigned int len;
13549       int val;
13550
13551       val = read_uleb128 (p, &len, end);
13552       p += len;
13553       printf ("  Tag_GNU_MIPS_ABI_MSA: ");
13554
13555       switch (val)
13556         {
13557         case Val_GNU_MIPS_ABI_MSA_ANY:
13558           printf (_("Any MSA or not\n"));
13559           break;
13560         case Val_GNU_MIPS_ABI_MSA_128:
13561           printf (_("128-bit MSA\n"));
13562           break;
13563         default:
13564           printf ("??? (%d)\n", val);
13565           break;
13566         }
13567       return p;
13568     }
13569
13570   return display_tag_value (tag & 1, p, end);
13571 }
13572
13573 static unsigned char *
13574 display_tic6x_attribute (unsigned char * p,
13575                          const unsigned char * const end)
13576 {
13577   int tag;
13578   unsigned int len;
13579   int val;
13580
13581   tag = read_uleb128 (p, &len, end);
13582   p += len;
13583
13584   switch (tag)
13585     {
13586     case Tag_ISA:
13587       val = read_uleb128 (p, &len, end);
13588       p += len;
13589       printf ("  Tag_ISA: ");
13590
13591       switch (val)
13592         {
13593         case C6XABI_Tag_ISA_none:
13594           printf (_("None\n"));
13595           break;
13596         case C6XABI_Tag_ISA_C62X:
13597           printf ("C62x\n");
13598           break;
13599         case C6XABI_Tag_ISA_C67X:
13600           printf ("C67x\n");
13601           break;
13602         case C6XABI_Tag_ISA_C67XP:
13603           printf ("C67x+\n");
13604           break;
13605         case C6XABI_Tag_ISA_C64X:
13606           printf ("C64x\n");
13607           break;
13608         case C6XABI_Tag_ISA_C64XP:
13609           printf ("C64x+\n");
13610           break;
13611         case C6XABI_Tag_ISA_C674X:
13612           printf ("C674x\n");
13613           break;
13614         default:
13615           printf ("??? (%d)\n", val);
13616           break;
13617         }
13618       return p;
13619
13620     case Tag_ABI_wchar_t:
13621       val = read_uleb128 (p, &len, end);
13622       p += len;
13623       printf ("  Tag_ABI_wchar_t: ");
13624       switch (val)
13625         {
13626         case 0:
13627           printf (_("Not used\n"));
13628           break;
13629         case 1:
13630           printf (_("2 bytes\n"));
13631           break;
13632         case 2:
13633           printf (_("4 bytes\n"));
13634           break;
13635         default:
13636           printf ("??? (%d)\n", val);
13637           break;
13638         }
13639       return p;
13640
13641     case Tag_ABI_stack_align_needed:
13642       val = read_uleb128 (p, &len, end);
13643       p += len;
13644       printf ("  Tag_ABI_stack_align_needed: ");
13645       switch (val)
13646         {
13647         case 0:
13648           printf (_("8-byte\n"));
13649           break;
13650         case 1:
13651           printf (_("16-byte\n"));
13652           break;
13653         default:
13654           printf ("??? (%d)\n", val);
13655           break;
13656         }
13657       return p;
13658
13659     case Tag_ABI_stack_align_preserved:
13660       val = read_uleb128 (p, &len, end);
13661       p += len;
13662       printf ("  Tag_ABI_stack_align_preserved: ");
13663       switch (val)
13664         {
13665         case 0:
13666           printf (_("8-byte\n"));
13667           break;
13668         case 1:
13669           printf (_("16-byte\n"));
13670           break;
13671         default:
13672           printf ("??? (%d)\n", val);
13673           break;
13674         }
13675       return p;
13676
13677     case Tag_ABI_DSBT:
13678       val = read_uleb128 (p, &len, end);
13679       p += len;
13680       printf ("  Tag_ABI_DSBT: ");
13681       switch (val)
13682         {
13683         case 0:
13684           printf (_("DSBT addressing not used\n"));
13685           break;
13686         case 1:
13687           printf (_("DSBT addressing used\n"));
13688           break;
13689         default:
13690           printf ("??? (%d)\n", val);
13691           break;
13692         }
13693       return p;
13694
13695     case Tag_ABI_PID:
13696       val = read_uleb128 (p, &len, end);
13697       p += len;
13698       printf ("  Tag_ABI_PID: ");
13699       switch (val)
13700         {
13701         case 0:
13702           printf (_("Data addressing position-dependent\n"));
13703           break;
13704         case 1:
13705           printf (_("Data addressing position-independent, GOT near DP\n"));
13706           break;
13707         case 2:
13708           printf (_("Data addressing position-independent, GOT far from DP\n"));
13709           break;
13710         default:
13711           printf ("??? (%d)\n", val);
13712           break;
13713         }
13714       return p;
13715
13716     case Tag_ABI_PIC:
13717       val = read_uleb128 (p, &len, end);
13718       p += len;
13719       printf ("  Tag_ABI_PIC: ");
13720       switch (val)
13721         {
13722         case 0:
13723           printf (_("Code addressing position-dependent\n"));
13724           break;
13725         case 1:
13726           printf (_("Code addressing position-independent\n"));
13727           break;
13728         default:
13729           printf ("??? (%d)\n", val);
13730           break;
13731         }
13732       return p;
13733
13734     case Tag_ABI_array_object_alignment:
13735       val = read_uleb128 (p, &len, end);
13736       p += len;
13737       printf ("  Tag_ABI_array_object_alignment: ");
13738       switch (val)
13739         {
13740         case 0:
13741           printf (_("8-byte\n"));
13742           break;
13743         case 1:
13744           printf (_("4-byte\n"));
13745           break;
13746         case 2:
13747           printf (_("16-byte\n"));
13748           break;
13749         default:
13750           printf ("??? (%d)\n", val);
13751           break;
13752         }
13753       return p;
13754
13755     case Tag_ABI_array_object_align_expected:
13756       val = read_uleb128 (p, &len, end);
13757       p += len;
13758       printf ("  Tag_ABI_array_object_align_expected: ");
13759       switch (val)
13760         {
13761         case 0:
13762           printf (_("8-byte\n"));
13763           break;
13764         case 1:
13765           printf (_("4-byte\n"));
13766           break;
13767         case 2:
13768           printf (_("16-byte\n"));
13769           break;
13770         default:
13771           printf ("??? (%d)\n", val);
13772           break;
13773         }
13774       return p;
13775
13776     case Tag_ABI_compatibility:
13777       {
13778         val = read_uleb128 (p, &len, end);
13779         p += len;
13780         printf ("  Tag_ABI_compatibility: ");
13781         printf (_("flag = %d, vendor = "), val);
13782         if (p < end - 1)
13783           {
13784             size_t maxlen = (end - p) - 1;
13785
13786             print_symbol ((int) maxlen, (const char *) p);
13787             p += strnlen ((char *) p, maxlen) + 1;
13788           }
13789         else
13790           {
13791             printf (_("<corrupt>"));
13792             p = (unsigned char *) end;
13793           }
13794         putchar ('\n');
13795         return p;
13796       }
13797
13798     case Tag_ABI_conformance:
13799       {
13800         printf ("  Tag_ABI_conformance: \"");
13801         if (p < end - 1)
13802           {
13803             size_t maxlen = (end - p) - 1;
13804
13805             print_symbol ((int) maxlen, (const char *) p);
13806             p += strnlen ((char *) p, maxlen) + 1;
13807           }
13808         else
13809           {
13810             printf (_("<corrupt>"));
13811             p = (unsigned char *) end;
13812           }
13813         printf ("\"\n");
13814         return p;
13815       }
13816     }
13817
13818   return display_tag_value (tag, p, end);
13819 }
13820
13821 static void
13822 display_raw_attribute (unsigned char * p, unsigned char * end)
13823 {
13824   unsigned long addr = 0;
13825   size_t bytes = end - p;
13826
13827   assert (end > p);
13828   while (bytes)
13829     {
13830       int j;
13831       int k;
13832       int lbytes = (bytes > 16 ? 16 : bytes);
13833
13834       printf ("  0x%8.8lx ", addr);
13835
13836       for (j = 0; j < 16; j++)
13837         {
13838           if (j < lbytes)
13839             printf ("%2.2x", p[j]);
13840           else
13841             printf ("  ");
13842
13843           if ((j & 3) == 3)
13844             printf (" ");
13845         }
13846
13847       for (j = 0; j < lbytes; j++)
13848         {
13849           k = p[j];
13850           if (k >= ' ' && k < 0x7f)
13851             printf ("%c", k);
13852           else
13853             printf (".");
13854         }
13855
13856       putchar ('\n');
13857
13858       p  += lbytes;
13859       bytes -= lbytes;
13860       addr += lbytes;
13861     }
13862
13863   putchar ('\n');
13864 }
13865
13866 static unsigned char *
13867 display_msp430x_attribute (unsigned char * p,
13868                            const unsigned char * const end)
13869 {
13870   unsigned int len;
13871   int val;
13872   int tag;
13873
13874   tag = read_uleb128 (p, & len, end);
13875   p += len;
13876
13877   switch (tag)
13878     {
13879     case OFBA_MSPABI_Tag_ISA:
13880       val = read_uleb128 (p, &len, end);
13881       p += len;
13882       printf ("  Tag_ISA: ");
13883       switch (val)
13884         {
13885         case 0: printf (_("None\n")); break;
13886         case 1: printf (_("MSP430\n")); break;
13887         case 2: printf (_("MSP430X\n")); break;
13888         default: printf ("??? (%d)\n", val); break;
13889         }
13890       break;
13891
13892     case OFBA_MSPABI_Tag_Code_Model:
13893       val = read_uleb128 (p, &len, end);
13894       p += len;
13895       printf ("  Tag_Code_Model: ");
13896       switch (val)
13897         {
13898         case 0: printf (_("None\n")); break;
13899         case 1: printf (_("Small\n")); break;
13900         case 2: printf (_("Large\n")); break;
13901         default: printf ("??? (%d)\n", val); break;
13902         }
13903       break;
13904
13905     case OFBA_MSPABI_Tag_Data_Model:
13906       val = read_uleb128 (p, &len, end);
13907       p += len;
13908       printf ("  Tag_Data_Model: ");
13909       switch (val)
13910         {
13911         case 0: printf (_("None\n")); break;
13912         case 1: printf (_("Small\n")); break;
13913         case 2: printf (_("Large\n")); break;
13914         case 3: printf (_("Restricted Large\n")); break;
13915         default: printf ("??? (%d)\n", val); break;
13916         }
13917       break;
13918
13919     default:
13920       printf (_("  <unknown tag %d>: "), tag);
13921
13922       if (tag & 1)
13923         {
13924           putchar ('"');
13925           if (p < end - 1)
13926             {
13927               size_t maxlen = (end - p) - 1;
13928
13929               print_symbol ((int) maxlen, (const char *) p);
13930               p += strnlen ((char *) p, maxlen) + 1;
13931             }
13932           else
13933             {
13934               printf (_("<corrupt>"));
13935               p = (unsigned char *) end;
13936             }
13937           printf ("\"\n");
13938         }
13939       else
13940         {
13941           val = read_uleb128 (p, &len, end);
13942           p += len;
13943           printf ("%d (0x%x)\n", val, val);
13944         }
13945       break;
13946    }
13947
13948   assert (p <= end);
13949   return p;
13950 }
13951
13952 static int
13953 process_attributes (FILE * file,
13954                     const char * public_name,
13955                     unsigned int proc_type,
13956                     unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
13957                     unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const))
13958 {
13959   Elf_Internal_Shdr * sect;
13960   unsigned i;
13961
13962   /* Find the section header so that we get the size.  */
13963   for (i = 0, sect = section_headers;
13964        i < elf_header.e_shnum;
13965        i++, sect++)
13966     {
13967       unsigned char * contents;
13968       unsigned char * p;
13969
13970       if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
13971         continue;
13972
13973       contents = (unsigned char *) get_data (NULL, file, sect->sh_offset, 1,
13974                                              sect->sh_size, _("attributes"));
13975       if (contents == NULL)
13976         continue;
13977
13978       p = contents;
13979       if (*p == 'A')
13980         {
13981           bfd_vma section_len;
13982
13983           section_len = sect->sh_size - 1;
13984           p++;
13985
13986           while (section_len > 0)
13987             {
13988               bfd_vma attr_len;
13989               unsigned int namelen;
13990               bfd_boolean public_section;
13991               bfd_boolean gnu_section;
13992
13993               if (section_len <= 4)
13994                 {
13995                   error (_("Tag section ends prematurely\n"));
13996                   break;
13997                 }
13998               attr_len = byte_get (p, 4);
13999               p += 4;
14000
14001               if (attr_len > section_len)
14002                 {
14003                   error (_("Bad attribute length (%u > %u)\n"),
14004                           (unsigned) attr_len, (unsigned) section_len);
14005                   attr_len = section_len;
14006                 }
14007               /* PR 17531: file: 001-101425-0.004  */
14008               else if (attr_len < 5)
14009                 {
14010                   error (_("Attribute length of %u is too small\n"), (unsigned) attr_len);
14011                   break;
14012                 }
14013
14014               section_len -= attr_len;
14015               attr_len -= 4;
14016
14017               namelen = strnlen ((char *) p, attr_len) + 1;
14018               if (namelen == 0 || namelen >= attr_len)
14019                 {
14020                   error (_("Corrupt attribute section name\n"));
14021                   break;
14022                 }
14023
14024               printf (_("Attribute Section: "));
14025               print_symbol (INT_MAX, (const char *) p);
14026               putchar ('\n');
14027
14028               if (public_name && streq ((char *) p, public_name))
14029                 public_section = TRUE;
14030               else
14031                 public_section = FALSE;
14032
14033               if (streq ((char *) p, "gnu"))
14034                 gnu_section = TRUE;
14035               else
14036                 gnu_section = FALSE;
14037
14038               p += namelen;
14039               attr_len -= namelen;
14040
14041               while (attr_len > 0 && p < contents + sect->sh_size)
14042                 {
14043                   int tag;
14044                   int val;
14045                   bfd_vma size;
14046                   unsigned char * end;
14047
14048                   /* PR binutils/17531: Safe handling of corrupt files.  */
14049                   if (attr_len < 6)
14050                     {
14051                       error (_("Unused bytes at end of section\n"));
14052                       section_len = 0;
14053                       break;
14054                     }
14055
14056                   tag = *(p++);
14057                   size = byte_get (p, 4);
14058                   if (size > attr_len)
14059                     {
14060                       error (_("Bad subsection length (%u > %u)\n"),
14061                               (unsigned) size, (unsigned) attr_len);
14062                       size = attr_len;
14063                     }
14064                   /* PR binutils/17531: Safe handling of corrupt files.  */
14065                   if (size < 6)
14066                     {
14067                       error (_("Bad subsection length (%u < 6)\n"),
14068                               (unsigned) size);
14069                       section_len = 0;
14070                       break;
14071                     }
14072
14073                   attr_len -= size;
14074                   end = p + size - 1;
14075                   assert (end <= contents + sect->sh_size);
14076                   p += 4;
14077
14078                   switch (tag)
14079                     {
14080                     case 1:
14081                       printf (_("File Attributes\n"));
14082                       break;
14083                     case 2:
14084                       printf (_("Section Attributes:"));
14085                       goto do_numlist;
14086                     case 3:
14087                       printf (_("Symbol Attributes:"));
14088                     do_numlist:
14089                       for (;;)
14090                         {
14091                           unsigned int j;
14092
14093                           val = read_uleb128 (p, &j, end);
14094                           p += j;
14095                           if (val == 0)
14096                             break;
14097                           printf (" %d", val);
14098                         }
14099                       printf ("\n");
14100                       break;
14101                     default:
14102                       printf (_("Unknown tag: %d\n"), tag);
14103                       public_section = FALSE;
14104                       break;
14105                     }
14106
14107                   if (public_section && display_pub_attribute != NULL)
14108                     {
14109                       while (p < end)
14110                         p = display_pub_attribute (p, end);
14111                       assert (p <= end);
14112                     }
14113                   else if (gnu_section && display_proc_gnu_attribute != NULL)
14114                     {
14115                       while (p < end)
14116                         p = display_gnu_attribute (p,
14117                                                    display_proc_gnu_attribute,
14118                                                    end);
14119                       assert (p <= end);
14120                     }
14121                   else if (p < end)
14122                     {
14123                       printf (_("  Unknown attribute:\n"));
14124                       display_raw_attribute (p, end);
14125                       p = end;
14126                     }
14127                   else
14128                     attr_len = 0;
14129                 }
14130             }
14131         }
14132       else
14133         printf (_("Unknown format '%c' (%d)\n"), *p, *p);
14134
14135       free (contents);
14136     }
14137   return 1;
14138 }
14139
14140 static int
14141 process_arm_specific (FILE * file)
14142 {
14143   return process_attributes (file, "aeabi", SHT_ARM_ATTRIBUTES,
14144                              display_arm_attribute, NULL);
14145 }
14146
14147 static int
14148 process_power_specific (FILE * file)
14149 {
14150   return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14151                              display_power_gnu_attribute);
14152 }
14153
14154 static int
14155 process_s390_specific (FILE * file)
14156 {
14157   return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14158                              display_s390_gnu_attribute);
14159 }
14160
14161 static int
14162 process_sparc_specific (FILE * file)
14163 {
14164   return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14165                              display_sparc_gnu_attribute);
14166 }
14167
14168 static int
14169 process_tic6x_specific (FILE * file)
14170 {
14171   return process_attributes (file, "c6xabi", SHT_C6000_ATTRIBUTES,
14172                              display_tic6x_attribute, NULL);
14173 }
14174
14175 static int
14176 process_msp430x_specific (FILE * file)
14177 {
14178   return process_attributes (file, "mspabi", SHT_MSP430_ATTRIBUTES,
14179                              display_msp430x_attribute, NULL);
14180 }
14181
14182 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
14183    Print the Address, Access and Initial fields of an entry at VMA ADDR
14184    and return the VMA of the next entry, or -1 if there was a problem.
14185    Does not read from DATA_END or beyond.  */
14186
14187 static bfd_vma
14188 print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr,
14189                       unsigned char * data_end)
14190 {
14191   printf ("  ");
14192   print_vma (addr, LONG_HEX);
14193   printf (" ");
14194   if (addr < pltgot + 0xfff0)
14195     printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
14196   else
14197     printf ("%10s", "");
14198   printf (" ");
14199   if (data == NULL)
14200     printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
14201   else
14202     {
14203       bfd_vma entry;
14204       unsigned char * from = data + addr - pltgot;
14205
14206       if (from + (is_32bit_elf ? 4 : 8) > data_end)
14207         {
14208           warn (_("MIPS GOT entry extends beyond the end of available data\n"));
14209           printf ("%*s", is_32bit_elf ? 8 : 16, _("<corrupt>"));
14210           return (bfd_vma) -1;
14211         }
14212       else
14213         {
14214           entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
14215           print_vma (entry, LONG_HEX);
14216         }
14217     }
14218   return addr + (is_32bit_elf ? 4 : 8);
14219 }
14220
14221 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
14222    PLTGOT.  Print the Address and Initial fields of an entry at VMA
14223    ADDR and return the VMA of the next entry.  */
14224
14225 static bfd_vma
14226 print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
14227 {
14228   printf ("  ");
14229   print_vma (addr, LONG_HEX);
14230   printf (" ");
14231   if (data == NULL)
14232     printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
14233   else
14234     {
14235       bfd_vma entry;
14236
14237       entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
14238       print_vma (entry, LONG_HEX);
14239     }
14240   return addr + (is_32bit_elf ? 4 : 8);
14241 }
14242
14243 static void
14244 print_mips_ases (unsigned int mask)
14245 {
14246   if (mask & AFL_ASE_DSP)
14247     fputs ("\n\tDSP ASE", stdout);
14248   if (mask & AFL_ASE_DSPR2)
14249     fputs ("\n\tDSP R2 ASE", stdout);
14250   if (mask & AFL_ASE_DSPR3)
14251     fputs ("\n\tDSP R3 ASE", stdout);
14252   if (mask & AFL_ASE_EVA)
14253     fputs ("\n\tEnhanced VA Scheme", stdout);
14254   if (mask & AFL_ASE_MCU)
14255     fputs ("\n\tMCU (MicroController) ASE", stdout);
14256   if (mask & AFL_ASE_MDMX)
14257     fputs ("\n\tMDMX ASE", stdout);
14258   if (mask & AFL_ASE_MIPS3D)
14259     fputs ("\n\tMIPS-3D ASE", stdout);
14260   if (mask & AFL_ASE_MT)
14261     fputs ("\n\tMT ASE", stdout);
14262   if (mask & AFL_ASE_SMARTMIPS)
14263     fputs ("\n\tSmartMIPS ASE", stdout);
14264   if (mask & AFL_ASE_VIRT)
14265     fputs ("\n\tVZ ASE", stdout);
14266   if (mask & AFL_ASE_MSA)
14267     fputs ("\n\tMSA ASE", stdout);
14268   if (mask & AFL_ASE_MIPS16)
14269     fputs ("\n\tMIPS16 ASE", stdout);
14270   if (mask & AFL_ASE_MICROMIPS)
14271     fputs ("\n\tMICROMIPS ASE", stdout);
14272   if (mask & AFL_ASE_XPA)
14273     fputs ("\n\tXPA ASE", stdout);
14274   if (mask == 0)
14275     fprintf (stdout, "\n\t%s", _("None"));
14276   else if ((mask & ~AFL_ASE_MASK) != 0)
14277     fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
14278 }
14279
14280 static void
14281 print_mips_isa_ext (unsigned int isa_ext)
14282 {
14283   switch (isa_ext)
14284     {
14285     case 0:
14286       fputs (_("None"), stdout);
14287       break;
14288     case AFL_EXT_XLR:
14289       fputs ("RMI XLR", stdout);
14290       break;
14291     case AFL_EXT_OCTEON3:
14292       fputs ("Cavium Networks Octeon3", stdout);
14293       break;
14294     case AFL_EXT_OCTEON2:
14295       fputs ("Cavium Networks Octeon2", stdout);
14296       break;
14297     case AFL_EXT_OCTEONP:
14298       fputs ("Cavium Networks OcteonP", stdout);
14299       break;
14300     case AFL_EXT_LOONGSON_3A:
14301       fputs ("Loongson 3A", stdout);
14302       break;
14303     case AFL_EXT_OCTEON:
14304       fputs ("Cavium Networks Octeon", stdout);
14305       break;
14306     case AFL_EXT_5900:
14307       fputs ("Toshiba R5900", stdout);
14308       break;
14309     case AFL_EXT_4650:
14310       fputs ("MIPS R4650", stdout);
14311       break;
14312     case AFL_EXT_4010:
14313       fputs ("LSI R4010", stdout);
14314       break;
14315     case AFL_EXT_4100:
14316       fputs ("NEC VR4100", stdout);
14317       break;
14318     case AFL_EXT_3900:
14319       fputs ("Toshiba R3900", stdout);
14320       break;
14321     case AFL_EXT_10000:
14322       fputs ("MIPS R10000", stdout);
14323       break;
14324     case AFL_EXT_SB1:
14325       fputs ("Broadcom SB-1", stdout);
14326       break;
14327     case AFL_EXT_4111:
14328       fputs ("NEC VR4111/VR4181", stdout);
14329       break;
14330     case AFL_EXT_4120:
14331       fputs ("NEC VR4120", stdout);
14332       break;
14333     case AFL_EXT_5400:
14334       fputs ("NEC VR5400", stdout);
14335       break;
14336     case AFL_EXT_5500:
14337       fputs ("NEC VR5500", stdout);
14338       break;
14339     case AFL_EXT_LOONGSON_2E:
14340       fputs ("ST Microelectronics Loongson 2E", stdout);
14341       break;
14342     case AFL_EXT_LOONGSON_2F:
14343       fputs ("ST Microelectronics Loongson 2F", stdout);
14344       break;
14345     default:
14346       fprintf (stdout, "%s (%d)", _("Unknown"), isa_ext);
14347     }
14348 }
14349
14350 static int
14351 get_mips_reg_size (int reg_size)
14352 {
14353   return (reg_size == AFL_REG_NONE) ? 0
14354          : (reg_size == AFL_REG_32) ? 32
14355          : (reg_size == AFL_REG_64) ? 64
14356          : (reg_size == AFL_REG_128) ? 128
14357          : -1;
14358 }
14359
14360 static int
14361 process_mips_specific (FILE * file)
14362 {
14363   Elf_Internal_Dyn * entry;
14364   Elf_Internal_Shdr *sect = NULL;
14365   size_t liblist_offset = 0;
14366   size_t liblistno = 0;
14367   size_t conflictsno = 0;
14368   size_t options_offset = 0;
14369   size_t conflicts_offset = 0;
14370   size_t pltrelsz = 0;
14371   size_t pltrel = 0;
14372   bfd_vma pltgot = 0;
14373   bfd_vma mips_pltgot = 0;
14374   bfd_vma jmprel = 0;
14375   bfd_vma local_gotno = 0;
14376   bfd_vma gotsym = 0;
14377   bfd_vma symtabno = 0;
14378
14379   process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14380                       display_mips_gnu_attribute);
14381
14382   sect = find_section (".MIPS.abiflags");
14383
14384   if (sect != NULL)
14385     {
14386       Elf_External_ABIFlags_v0 *abiflags_ext;
14387       Elf_Internal_ABIFlags_v0 abiflags_in;
14388
14389       if (sizeof (Elf_External_ABIFlags_v0) != sect->sh_size)
14390         fputs ("\nCorrupt ABI Flags section.\n", stdout);
14391       else
14392         {
14393           abiflags_ext = get_data (NULL, file, sect->sh_offset, 1,
14394                                    sect->sh_size, _("MIPS ABI Flags section"));
14395           if (abiflags_ext)
14396             {
14397               abiflags_in.version = BYTE_GET (abiflags_ext->version);
14398               abiflags_in.isa_level = BYTE_GET (abiflags_ext->isa_level);
14399               abiflags_in.isa_rev = BYTE_GET (abiflags_ext->isa_rev);
14400               abiflags_in.gpr_size = BYTE_GET (abiflags_ext->gpr_size);
14401               abiflags_in.cpr1_size = BYTE_GET (abiflags_ext->cpr1_size);
14402               abiflags_in.cpr2_size = BYTE_GET (abiflags_ext->cpr2_size);
14403               abiflags_in.fp_abi = BYTE_GET (abiflags_ext->fp_abi);
14404               abiflags_in.isa_ext = BYTE_GET (abiflags_ext->isa_ext);
14405               abiflags_in.ases = BYTE_GET (abiflags_ext->ases);
14406               abiflags_in.flags1 = BYTE_GET (abiflags_ext->flags1);
14407               abiflags_in.flags2 = BYTE_GET (abiflags_ext->flags2);
14408
14409               printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in.version);
14410               printf ("\nISA: MIPS%d", abiflags_in.isa_level);
14411               if (abiflags_in.isa_rev > 1)
14412                 printf ("r%d", abiflags_in.isa_rev);
14413               printf ("\nGPR size: %d",
14414                       get_mips_reg_size (abiflags_in.gpr_size));
14415               printf ("\nCPR1 size: %d",
14416                       get_mips_reg_size (abiflags_in.cpr1_size));
14417               printf ("\nCPR2 size: %d",
14418                       get_mips_reg_size (abiflags_in.cpr2_size));
14419               fputs ("\nFP ABI: ", stdout);
14420               print_mips_fp_abi_value (abiflags_in.fp_abi);
14421               fputs ("ISA Extension: ", stdout);
14422               print_mips_isa_ext (abiflags_in.isa_ext);
14423               fputs ("\nASEs:", stdout);
14424               print_mips_ases (abiflags_in.ases);
14425               printf ("\nFLAGS 1: %8.8lx", abiflags_in.flags1);
14426               printf ("\nFLAGS 2: %8.8lx", abiflags_in.flags2);
14427               fputc ('\n', stdout);
14428               free (abiflags_ext);
14429             }
14430         }
14431     }
14432
14433   /* We have a lot of special sections.  Thanks SGI!  */
14434   if (dynamic_section == NULL)
14435     /* No information available.  */
14436     return 0;
14437
14438   for (entry = dynamic_section;
14439        /* PR 17531 file: 012-50589-0.004.  */
14440        entry < dynamic_section + dynamic_nent && entry->d_tag != DT_NULL;
14441        ++entry)
14442     switch (entry->d_tag)
14443       {
14444       case DT_MIPS_LIBLIST:
14445         liblist_offset
14446           = offset_from_vma (file, entry->d_un.d_val,
14447                              liblistno * sizeof (Elf32_External_Lib));
14448         break;
14449       case DT_MIPS_LIBLISTNO:
14450         liblistno = entry->d_un.d_val;
14451         break;
14452       case DT_MIPS_OPTIONS:
14453         options_offset = offset_from_vma (file, entry->d_un.d_val, 0);
14454         break;
14455       case DT_MIPS_CONFLICT:
14456         conflicts_offset
14457           = offset_from_vma (file, entry->d_un.d_val,
14458                              conflictsno * sizeof (Elf32_External_Conflict));
14459         break;
14460       case DT_MIPS_CONFLICTNO:
14461         conflictsno = entry->d_un.d_val;
14462         break;
14463       case DT_PLTGOT:
14464         pltgot = entry->d_un.d_ptr;
14465         break;
14466       case DT_MIPS_LOCAL_GOTNO:
14467         local_gotno = entry->d_un.d_val;
14468         break;
14469       case DT_MIPS_GOTSYM:
14470         gotsym = entry->d_un.d_val;
14471         break;
14472       case DT_MIPS_SYMTABNO:
14473         symtabno = entry->d_un.d_val;
14474         break;
14475       case DT_MIPS_PLTGOT:
14476         mips_pltgot = entry->d_un.d_ptr;
14477         break;
14478       case DT_PLTREL:
14479         pltrel = entry->d_un.d_val;
14480         break;
14481       case DT_PLTRELSZ:
14482         pltrelsz = entry->d_un.d_val;
14483         break;
14484       case DT_JMPREL:
14485         jmprel = entry->d_un.d_ptr;
14486         break;
14487       default:
14488         break;
14489       }
14490
14491   if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
14492     {
14493       Elf32_External_Lib * elib;
14494       size_t cnt;
14495
14496       elib = (Elf32_External_Lib *) get_data (NULL, file, liblist_offset,
14497                                               liblistno,
14498                                               sizeof (Elf32_External_Lib),
14499                                               _("liblist section data"));
14500       if (elib)
14501         {
14502           printf (_("\nSection '.liblist' contains %lu entries:\n"),
14503                   (unsigned long) liblistno);
14504           fputs (_("     Library              Time Stamp          Checksum   Version Flags\n"),
14505                  stdout);
14506
14507           for (cnt = 0; cnt < liblistno; ++cnt)
14508             {
14509               Elf32_Lib liblist;
14510               time_t atime;
14511               char timebuf[128];
14512               struct tm * tmp;
14513
14514               liblist.l_name = BYTE_GET (elib[cnt].l_name);
14515               atime = BYTE_GET (elib[cnt].l_time_stamp);
14516               liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
14517               liblist.l_version = BYTE_GET (elib[cnt].l_version);
14518               liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
14519
14520               tmp = gmtime (&atime);
14521               snprintf (timebuf, sizeof (timebuf),
14522                         "%04u-%02u-%02uT%02u:%02u:%02u",
14523                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
14524                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
14525
14526               printf ("%3lu: ", (unsigned long) cnt);
14527               if (VALID_DYNAMIC_NAME (liblist.l_name))
14528                 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
14529               else
14530                 printf (_("<corrupt: %9ld>"), liblist.l_name);
14531               printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
14532                       liblist.l_version);
14533
14534               if (liblist.l_flags == 0)
14535                 puts (_(" NONE"));
14536               else
14537                 {
14538                   static const struct
14539                   {
14540                     const char * name;
14541                     int bit;
14542                   }
14543                   l_flags_vals[] =
14544                   {
14545                     { " EXACT_MATCH", LL_EXACT_MATCH },
14546                     { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
14547                     { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
14548                     { " EXPORTS", LL_EXPORTS },
14549                     { " DELAY_LOAD", LL_DELAY_LOAD },
14550                     { " DELTA", LL_DELTA }
14551                   };
14552                   int flags = liblist.l_flags;
14553                   size_t fcnt;
14554
14555                   for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
14556                     if ((flags & l_flags_vals[fcnt].bit) != 0)
14557                       {
14558                         fputs (l_flags_vals[fcnt].name, stdout);
14559                         flags ^= l_flags_vals[fcnt].bit;
14560                       }
14561                   if (flags != 0)
14562                     printf (" %#x", (unsigned int) flags);
14563
14564                   puts ("");
14565                 }
14566             }
14567
14568           free (elib);
14569         }
14570     }
14571
14572   if (options_offset != 0)
14573     {
14574       Elf_External_Options * eopt;
14575       Elf_Internal_Options * iopt;
14576       Elf_Internal_Options * option;
14577       size_t offset;
14578       int cnt;
14579       sect = section_headers;
14580
14581       /* Find the section header so that we get the size.  */
14582       sect = find_section_by_type (SHT_MIPS_OPTIONS);
14583       /* PR 17533 file: 012-277276-0.004.  */
14584       if (sect == NULL)
14585         {
14586           error (_("No MIPS_OPTIONS header found\n"));
14587           return 0;
14588         }
14589
14590       eopt = (Elf_External_Options *) get_data (NULL, file, options_offset, 1,
14591                                                 sect->sh_size, _("options"));
14592       if (eopt)
14593         {
14594           iopt = (Elf_Internal_Options *)
14595               cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
14596           if (iopt == NULL)
14597             {
14598               error (_("Out of memory allocatinf space for MIPS options\n"));
14599               return 0;
14600             }
14601
14602           offset = cnt = 0;
14603           option = iopt;
14604
14605           while (offset <= sect->sh_size - sizeof (* eopt))
14606             {
14607               Elf_External_Options * eoption;
14608
14609               eoption = (Elf_External_Options *) ((char *) eopt + offset);
14610
14611               option->kind = BYTE_GET (eoption->kind);
14612               option->size = BYTE_GET (eoption->size);
14613               option->section = BYTE_GET (eoption->section);
14614               option->info = BYTE_GET (eoption->info);
14615
14616               /* PR 17531: file: ffa0fa3b.  */
14617               if (option->size < sizeof (* eopt)
14618                   || offset + option->size > sect->sh_size)
14619                 {
14620                   error (_("Invalid size (%u) for MIPS option\n"), option->size);
14621                   return 0;
14622                 }
14623               offset += option->size;
14624
14625               ++option;
14626               ++cnt;
14627             }
14628
14629           printf (_("\nSection '%s' contains %d entries:\n"),
14630                   printable_section_name (sect), cnt);
14631
14632           option = iopt;
14633           offset = 0;
14634
14635           while (cnt-- > 0)
14636             {
14637               size_t len;
14638
14639               switch (option->kind)
14640                 {
14641                 case ODK_NULL:
14642                   /* This shouldn't happen.  */
14643                   printf (" NULL       %d %lx", option->section, option->info);
14644                   break;
14645                 case ODK_REGINFO:
14646                   printf (" REGINFO    ");
14647                   if (elf_header.e_machine == EM_MIPS)
14648                     {
14649                       /* 32bit form.  */
14650                       Elf32_External_RegInfo * ereg;
14651                       Elf32_RegInfo reginfo;
14652
14653                       ereg = (Elf32_External_RegInfo *) (option + 1);
14654                       reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
14655                       reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
14656                       reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
14657                       reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
14658                       reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
14659                       reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
14660
14661                       printf ("GPR %08lx  GP 0x%lx\n",
14662                               reginfo.ri_gprmask,
14663                               (unsigned long) reginfo.ri_gp_value);
14664                       printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
14665                               reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
14666                               reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
14667                     }
14668                   else
14669                     {
14670                       /* 64 bit form.  */
14671                       Elf64_External_RegInfo * ereg;
14672                       Elf64_Internal_RegInfo reginfo;
14673
14674                       ereg = (Elf64_External_RegInfo *) (option + 1);
14675                       reginfo.ri_gprmask    = BYTE_GET (ereg->ri_gprmask);
14676                       reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
14677                       reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
14678                       reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
14679                       reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
14680                       reginfo.ri_gp_value   = BYTE_GET (ereg->ri_gp_value);
14681
14682                       printf ("GPR %08lx  GP 0x",
14683                               reginfo.ri_gprmask);
14684                       printf_vma (reginfo.ri_gp_value);
14685                       printf ("\n");
14686
14687                       printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
14688                               reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
14689                               reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
14690                     }
14691                   ++option;
14692                   continue;
14693                 case ODK_EXCEPTIONS:
14694                   fputs (" EXCEPTIONS fpe_min(", stdout);
14695                   process_mips_fpe_exception (option->info & OEX_FPU_MIN);
14696                   fputs (") fpe_max(", stdout);
14697                   process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
14698                   fputs (")", stdout);
14699
14700                   if (option->info & OEX_PAGE0)
14701                     fputs (" PAGE0", stdout);
14702                   if (option->info & OEX_SMM)
14703                     fputs (" SMM", stdout);
14704                   if (option->info & OEX_FPDBUG)
14705                     fputs (" FPDBUG", stdout);
14706                   if (option->info & OEX_DISMISS)
14707                     fputs (" DISMISS", stdout);
14708                   break;
14709                 case ODK_PAD:
14710                   fputs (" PAD       ", stdout);
14711                   if (option->info & OPAD_PREFIX)
14712                     fputs (" PREFIX", stdout);
14713                   if (option->info & OPAD_POSTFIX)
14714                     fputs (" POSTFIX", stdout);
14715                   if (option->info & OPAD_SYMBOL)
14716                     fputs (" SYMBOL", stdout);
14717                   break;
14718                 case ODK_HWPATCH:
14719                   fputs (" HWPATCH   ", stdout);
14720                   if (option->info & OHW_R4KEOP)
14721                     fputs (" R4KEOP", stdout);
14722                   if (option->info & OHW_R8KPFETCH)
14723                     fputs (" R8KPFETCH", stdout);
14724                   if (option->info & OHW_R5KEOP)
14725                     fputs (" R5KEOP", stdout);
14726                   if (option->info & OHW_R5KCVTL)
14727                     fputs (" R5KCVTL", stdout);
14728                   break;
14729                 case ODK_FILL:
14730                   fputs (" FILL       ", stdout);
14731                   /* XXX Print content of info word?  */
14732                   break;
14733                 case ODK_TAGS:
14734                   fputs (" TAGS       ", stdout);
14735                   /* XXX Print content of info word?  */
14736                   break;
14737                 case ODK_HWAND:
14738                   fputs (" HWAND     ", stdout);
14739                   if (option->info & OHWA0_R4KEOP_CHECKED)
14740                     fputs (" R4KEOP_CHECKED", stdout);
14741                   if (option->info & OHWA0_R4KEOP_CLEAN)
14742                     fputs (" R4KEOP_CLEAN", stdout);
14743                   break;
14744                 case ODK_HWOR:
14745                   fputs (" HWOR      ", stdout);
14746                   if (option->info & OHWA0_R4KEOP_CHECKED)
14747                     fputs (" R4KEOP_CHECKED", stdout);
14748                   if (option->info & OHWA0_R4KEOP_CLEAN)
14749                     fputs (" R4KEOP_CLEAN", stdout);
14750                   break;
14751                 case ODK_GP_GROUP:
14752                   printf (" GP_GROUP  %#06lx  self-contained %#06lx",
14753                           option->info & OGP_GROUP,
14754                           (option->info & OGP_SELF) >> 16);
14755                   break;
14756                 case ODK_IDENT:
14757                   printf (" IDENT     %#06lx  self-contained %#06lx",
14758                           option->info & OGP_GROUP,
14759                           (option->info & OGP_SELF) >> 16);
14760                   break;
14761                 default:
14762                   /* This shouldn't happen.  */
14763                   printf (" %3d ???     %d %lx",
14764                           option->kind, option->section, option->info);
14765                   break;
14766                 }
14767
14768               len = sizeof (* eopt);
14769               while (len < option->size)
14770                 {
14771                   unsigned char datum = * ((unsigned char *) eopt + offset + len);
14772
14773                   if (ISPRINT (datum))
14774                     printf ("%c", datum);
14775                   else
14776                     printf ("\\%03o", datum);
14777                   len ++;
14778                 }
14779               fputs ("\n", stdout);
14780
14781               offset += option->size;
14782               ++option;
14783             }
14784
14785           free (eopt);
14786         }
14787     }
14788
14789   if (conflicts_offset != 0 && conflictsno != 0)
14790     {
14791       Elf32_Conflict * iconf;
14792       size_t cnt;
14793
14794       if (dynamic_symbols == NULL)
14795         {
14796           error (_("conflict list found without a dynamic symbol table\n"));
14797           return 0;
14798         }
14799
14800       iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
14801       if (iconf == NULL)
14802         {
14803           error (_("Out of memory allocating space for dynamic conflicts\n"));
14804           return 0;
14805         }
14806
14807       if (is_32bit_elf)
14808         {
14809           Elf32_External_Conflict * econf32;
14810
14811           econf32 = (Elf32_External_Conflict *)
14812               get_data (NULL, file, conflicts_offset, conflictsno,
14813                         sizeof (* econf32), _("conflict"));
14814           if (!econf32)
14815             return 0;
14816
14817           for (cnt = 0; cnt < conflictsno; ++cnt)
14818             iconf[cnt] = BYTE_GET (econf32[cnt]);
14819
14820           free (econf32);
14821         }
14822       else
14823         {
14824           Elf64_External_Conflict * econf64;
14825
14826           econf64 = (Elf64_External_Conflict *)
14827               get_data (NULL, file, conflicts_offset, conflictsno,
14828                         sizeof (* econf64), _("conflict"));
14829           if (!econf64)
14830             return 0;
14831
14832           for (cnt = 0; cnt < conflictsno; ++cnt)
14833             iconf[cnt] = BYTE_GET (econf64[cnt]);
14834
14835           free (econf64);
14836         }
14837
14838       printf (_("\nSection '.conflict' contains %lu entries:\n"),
14839               (unsigned long) conflictsno);
14840       puts (_("  Num:    Index       Value  Name"));
14841
14842       for (cnt = 0; cnt < conflictsno; ++cnt)
14843         {
14844           printf ("%5lu: %8lu  ", (unsigned long) cnt, iconf[cnt]);
14845
14846           if (iconf[cnt] >= num_dynamic_syms)
14847             printf (_("<corrupt symbol index>"));
14848           else
14849             {
14850               Elf_Internal_Sym * psym;
14851
14852               psym = & dynamic_symbols[iconf[cnt]];
14853               print_vma (psym->st_value, FULL_HEX);
14854               putchar (' ');
14855               if (VALID_DYNAMIC_NAME (psym->st_name))
14856                 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
14857               else
14858                 printf (_("<corrupt: %14ld>"), psym->st_name);
14859             }
14860           putchar ('\n');
14861         }
14862
14863       free (iconf);
14864     }
14865
14866   if (pltgot != 0 && local_gotno != 0)
14867     {
14868       bfd_vma ent, local_end, global_end;
14869       size_t i, offset;
14870       unsigned char * data;
14871       unsigned char * data_end;
14872       int addr_size;
14873
14874       ent = pltgot;
14875       addr_size = (is_32bit_elf ? 4 : 8);
14876       local_end = pltgot + local_gotno * addr_size;
14877
14878       /* PR binutils/17533 file: 012-111227-0.004  */
14879       if (symtabno < gotsym)
14880         {
14881           error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
14882                  (unsigned long) gotsym, (unsigned long) symtabno);
14883           return 0;
14884         }
14885
14886       global_end = local_end + (symtabno - gotsym) * addr_size;
14887       /* PR 17531: file: 54c91a34.  */
14888       if (global_end < local_end)
14889         {
14890           error (_("Too many GOT symbols: %lu\n"), (unsigned long) symtabno);
14891           return 0;
14892         }
14893
14894       offset = offset_from_vma (file, pltgot, global_end - pltgot);
14895       data = (unsigned char *) get_data (NULL, file, offset,
14896                                          global_end - pltgot, 1,
14897                                          _("Global Offset Table data"));
14898       if (data == NULL)
14899         return 0;
14900       data_end = data + (global_end - pltgot);
14901
14902       printf (_("\nPrimary GOT:\n"));
14903       printf (_(" Canonical gp value: "));
14904       print_vma (pltgot + 0x7ff0, LONG_HEX);
14905       printf ("\n\n");
14906
14907       printf (_(" Reserved entries:\n"));
14908       printf (_("  %*s %10s %*s Purpose\n"),
14909               addr_size * 2, _("Address"), _("Access"),
14910               addr_size * 2, _("Initial"));
14911       ent = print_mips_got_entry (data, pltgot, ent, data_end);
14912       printf (_(" Lazy resolver\n"));
14913       if (ent == (bfd_vma) -1)
14914         goto got_print_fail;
14915       if (data
14916           && (byte_get (data + ent - pltgot, addr_size)
14917               >> (addr_size * 8 - 1)) != 0)
14918         {
14919           ent = print_mips_got_entry (data, pltgot, ent, data_end);
14920           printf (_(" Module pointer (GNU extension)\n"));
14921           if (ent == (bfd_vma) -1)
14922             goto got_print_fail;
14923         }
14924       printf ("\n");
14925
14926       if (ent < local_end)
14927         {
14928           printf (_(" Local entries:\n"));
14929           printf ("  %*s %10s %*s\n",
14930                   addr_size * 2, _("Address"), _("Access"),
14931                   addr_size * 2, _("Initial"));
14932           while (ent < local_end)
14933             {
14934               ent = print_mips_got_entry (data, pltgot, ent, data_end);
14935               printf ("\n");
14936               if (ent == (bfd_vma) -1)
14937                 goto got_print_fail;
14938             }
14939           printf ("\n");
14940         }
14941
14942       if (gotsym < symtabno)
14943         {
14944           int sym_width;
14945
14946           printf (_(" Global entries:\n"));
14947           printf ("  %*s %10s %*s %*s %-7s %3s %s\n",
14948                   addr_size * 2, _("Address"),
14949                   _("Access"),
14950                   addr_size * 2, _("Initial"),
14951                   addr_size * 2, _("Sym.Val."),
14952                   _("Type"),
14953                   /* Note for translators: "Ndx" = abbreviated form of "Index".  */
14954                   _("Ndx"), _("Name"));
14955
14956           sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
14957
14958           for (i = gotsym; i < symtabno; i++)
14959             {
14960               ent = print_mips_got_entry (data, pltgot, ent, data_end);
14961               printf (" ");
14962
14963               if (dynamic_symbols == NULL)
14964                 printf (_("<no dynamic symbols>"));
14965               else if (i < num_dynamic_syms)
14966                 {
14967                   Elf_Internal_Sym * psym = dynamic_symbols + i;
14968
14969                   print_vma (psym->st_value, LONG_HEX);
14970                   printf (" %-7s %3s ",
14971                           get_symbol_type (ELF_ST_TYPE (psym->st_info)),
14972                           get_symbol_index_type (psym->st_shndx));
14973
14974                   if (VALID_DYNAMIC_NAME (psym->st_name))
14975                     print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
14976                   else
14977                     printf (_("<corrupt: %14ld>"), psym->st_name);
14978                 }
14979               else
14980                 printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
14981                         (unsigned long) i);
14982
14983               printf ("\n");
14984               if (ent == (bfd_vma) -1)
14985                 break;
14986             }
14987           printf ("\n");
14988         }
14989
14990     got_print_fail:
14991       if (data)
14992         free (data);
14993     }
14994
14995   if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
14996     {
14997       bfd_vma ent, end;
14998       size_t offset, rel_offset;
14999       unsigned long count, i;
15000       unsigned char * data;
15001       int addr_size, sym_width;
15002       Elf_Internal_Rela * rels;
15003
15004       rel_offset = offset_from_vma (file, jmprel, pltrelsz);
15005       if (pltrel == DT_RELA)
15006         {
15007           if (!slurp_rela_relocs (file, rel_offset, pltrelsz, &rels, &count))
15008             return 0;
15009         }
15010       else
15011         {
15012           if (!slurp_rel_relocs (file, rel_offset, pltrelsz, &rels, &count))
15013             return 0;
15014         }
15015
15016       ent = mips_pltgot;
15017       addr_size = (is_32bit_elf ? 4 : 8);
15018       end = mips_pltgot + (2 + count) * addr_size;
15019
15020       offset = offset_from_vma (file, mips_pltgot, end - mips_pltgot);
15021       data = (unsigned char *) get_data (NULL, file, offset, end - mips_pltgot,
15022                                          1, _("Procedure Linkage Table data"));
15023       if (data == NULL)
15024         return 0;
15025
15026       printf ("\nPLT GOT:\n\n");
15027       printf (_(" Reserved entries:\n"));
15028       printf (_("  %*s %*s Purpose\n"),
15029               addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
15030       ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
15031       printf (_(" PLT lazy resolver\n"));
15032       ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
15033       printf (_(" Module pointer\n"));
15034       printf ("\n");
15035
15036       printf (_(" Entries:\n"));
15037       printf ("  %*s %*s %*s %-7s %3s %s\n",
15038               addr_size * 2, _("Address"),
15039               addr_size * 2, _("Initial"),
15040               addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
15041       sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
15042       for (i = 0; i < count; i++)
15043         {
15044           unsigned long idx = get_reloc_symindex (rels[i].r_info);
15045
15046           ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
15047           printf (" ");
15048
15049           if (idx >= num_dynamic_syms)
15050             printf (_("<corrupt symbol index: %lu>"), idx);
15051           else
15052             {
15053               Elf_Internal_Sym * psym = dynamic_symbols + idx;
15054
15055               print_vma (psym->st_value, LONG_HEX);
15056               printf (" %-7s %3s ",
15057                       get_symbol_type (ELF_ST_TYPE (psym->st_info)),
15058                       get_symbol_index_type (psym->st_shndx));
15059               if (VALID_DYNAMIC_NAME (psym->st_name))
15060                 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
15061               else
15062                 printf (_("<corrupt: %14ld>"), psym->st_name);
15063             }
15064           printf ("\n");
15065         }
15066       printf ("\n");
15067
15068       if (data)
15069         free (data);
15070       free (rels);
15071     }
15072
15073   return 1;
15074 }
15075
15076 static int
15077 process_nds32_specific (FILE * file)
15078 {
15079   Elf_Internal_Shdr *sect = NULL;
15080
15081   sect = find_section (".nds32_e_flags");
15082   if (sect != NULL)
15083     {
15084       unsigned int *flag;
15085
15086       printf ("\nNDS32 elf flags section:\n");
15087       flag = get_data (NULL, file, sect->sh_offset, 1,
15088                        sect->sh_size, _("NDS32 elf flags section"));
15089
15090       switch ((*flag) & 0x3)
15091         {
15092         case 0:
15093           printf ("(VEC_SIZE):\tNo entry.\n");
15094           break;
15095         case 1:
15096           printf ("(VEC_SIZE):\t4 bytes\n");
15097           break;
15098         case 2:
15099           printf ("(VEC_SIZE):\t16 bytes\n");
15100           break;
15101         case 3:
15102           printf ("(VEC_SIZE):\treserved\n");
15103           break;
15104         }
15105     }
15106
15107   return TRUE;
15108 }
15109
15110 static int
15111 process_gnu_liblist (FILE * file)
15112 {
15113   Elf_Internal_Shdr * section;
15114   Elf_Internal_Shdr * string_sec;
15115   Elf32_External_Lib * elib;
15116   char * strtab;
15117   size_t strtab_size;
15118   size_t cnt;
15119   unsigned i;
15120
15121   if (! do_arch)
15122     return 0;
15123
15124   for (i = 0, section = section_headers;
15125        i < elf_header.e_shnum;
15126        i++, section++)
15127     {
15128       switch (section->sh_type)
15129         {
15130         case SHT_GNU_LIBLIST:
15131           if (section->sh_link >= elf_header.e_shnum)
15132             break;
15133
15134           elib = (Elf32_External_Lib *)
15135               get_data (NULL, file, section->sh_offset, 1, section->sh_size,
15136                         _("liblist section data"));
15137
15138           if (elib == NULL)
15139             break;
15140           string_sec = section_headers + section->sh_link;
15141
15142           strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
15143                                       string_sec->sh_size,
15144                                       _("liblist string table"));
15145           if (strtab == NULL
15146               || section->sh_entsize != sizeof (Elf32_External_Lib))
15147             {
15148               free (elib);
15149               free (strtab);
15150               break;
15151             }
15152           strtab_size = string_sec->sh_size;
15153
15154           printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
15155                   printable_section_name (section),
15156                   (unsigned long) (section->sh_size / sizeof (Elf32_External_Lib)));
15157
15158           puts (_("     Library              Time Stamp          Checksum   Version Flags"));
15159
15160           for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
15161                ++cnt)
15162             {
15163               Elf32_Lib liblist;
15164               time_t atime;
15165               char timebuf[128];
15166               struct tm * tmp;
15167
15168               liblist.l_name = BYTE_GET (elib[cnt].l_name);
15169               atime = BYTE_GET (elib[cnt].l_time_stamp);
15170               liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
15171               liblist.l_version = BYTE_GET (elib[cnt].l_version);
15172               liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
15173
15174               tmp = gmtime (&atime);
15175               snprintf (timebuf, sizeof (timebuf),
15176                         "%04u-%02u-%02uT%02u:%02u:%02u",
15177                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
15178                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
15179
15180               printf ("%3lu: ", (unsigned long) cnt);
15181               if (do_wide)
15182                 printf ("%-20s", liblist.l_name < strtab_size
15183                         ? strtab + liblist.l_name : _("<corrupt>"));
15184               else
15185                 printf ("%-20.20s", liblist.l_name < strtab_size
15186                         ? strtab + liblist.l_name : _("<corrupt>"));
15187               printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
15188                       liblist.l_version, liblist.l_flags);
15189             }
15190
15191           free (elib);
15192           free (strtab);
15193         }
15194     }
15195
15196   return 1;
15197 }
15198
15199 static const char *
15200 get_note_type (unsigned e_type)
15201 {
15202   static char buff[64];
15203
15204   if (elf_header.e_type == ET_CORE)
15205     switch (e_type)
15206       {
15207       case NT_AUXV:
15208         return _("NT_AUXV (auxiliary vector)");
15209       case NT_PRSTATUS:
15210         return _("NT_PRSTATUS (prstatus structure)");
15211       case NT_FPREGSET:
15212         return _("NT_FPREGSET (floating point registers)");
15213       case NT_PRPSINFO:
15214         return _("NT_PRPSINFO (prpsinfo structure)");
15215       case NT_TASKSTRUCT:
15216         return _("NT_TASKSTRUCT (task structure)");
15217       case NT_PRXFPREG:
15218         return _("NT_PRXFPREG (user_xfpregs structure)");
15219       case NT_PPC_VMX:
15220         return _("NT_PPC_VMX (ppc Altivec registers)");
15221       case NT_PPC_VSX:
15222         return _("NT_PPC_VSX (ppc VSX registers)");
15223       case NT_386_TLS:
15224         return _("NT_386_TLS (x86 TLS information)");
15225       case NT_386_IOPERM:
15226         return _("NT_386_IOPERM (x86 I/O permissions)");
15227       case NT_X86_XSTATE:
15228         return _("NT_X86_XSTATE (x86 XSAVE extended state)");
15229       case NT_S390_HIGH_GPRS:
15230         return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
15231       case NT_S390_TIMER:
15232         return _("NT_S390_TIMER (s390 timer register)");
15233       case NT_S390_TODCMP:
15234         return _("NT_S390_TODCMP (s390 TOD comparator register)");
15235       case NT_S390_TODPREG:
15236         return _("NT_S390_TODPREG (s390 TOD programmable register)");
15237       case NT_S390_CTRS:
15238         return _("NT_S390_CTRS (s390 control registers)");
15239       case NT_S390_PREFIX:
15240         return _("NT_S390_PREFIX (s390 prefix register)");
15241       case NT_S390_LAST_BREAK:
15242         return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
15243       case NT_S390_SYSTEM_CALL:
15244         return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
15245       case NT_S390_TDB:
15246         return _("NT_S390_TDB (s390 transaction diagnostic block)");
15247       case NT_S390_VXRS_LOW:
15248         return _("NT_S390_VXRS_LOW (s390 vector registers 0-15 upper half)");
15249       case NT_S390_VXRS_HIGH:
15250         return _("NT_S390_VXRS_HIGH (s390 vector registers 16-31)");
15251       case NT_ARM_VFP:
15252         return _("NT_ARM_VFP (arm VFP registers)");
15253       case NT_ARM_TLS:
15254         return _("NT_ARM_TLS (AArch TLS registers)");
15255       case NT_ARM_HW_BREAK:
15256         return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
15257       case NT_ARM_HW_WATCH:
15258         return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
15259       case NT_PSTATUS:
15260         return _("NT_PSTATUS (pstatus structure)");
15261       case NT_FPREGS:
15262         return _("NT_FPREGS (floating point registers)");
15263       case NT_PSINFO:
15264         return _("NT_PSINFO (psinfo structure)");
15265       case NT_LWPSTATUS:
15266         return _("NT_LWPSTATUS (lwpstatus_t structure)");
15267       case NT_LWPSINFO:
15268         return _("NT_LWPSINFO (lwpsinfo_t structure)");
15269       case NT_WIN32PSTATUS:
15270         return _("NT_WIN32PSTATUS (win32_pstatus structure)");
15271       case NT_SIGINFO:
15272         return _("NT_SIGINFO (siginfo_t data)");
15273       case NT_FILE:
15274         return _("NT_FILE (mapped files)");
15275       default:
15276         break;
15277       }
15278   else
15279     switch (e_type)
15280       {
15281       case NT_VERSION:
15282         return _("NT_VERSION (version)");
15283       case NT_ARCH:
15284         return _("NT_ARCH (architecture)");
15285       default:
15286         break;
15287       }
15288
15289   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15290   return buff;
15291 }
15292
15293 static int
15294 print_core_note (Elf_Internal_Note *pnote)
15295 {
15296   unsigned int addr_size = is_32bit_elf ? 4 : 8;
15297   bfd_vma count, page_size;
15298   unsigned char *descdata, *filenames, *descend;
15299
15300   if (pnote->type != NT_FILE)
15301     return 1;
15302
15303 #ifndef BFD64
15304   if (!is_32bit_elf)
15305     {
15306       printf (_("    Cannot decode 64-bit note in 32-bit build\n"));
15307       /* Still "successful".  */
15308       return 1;
15309     }
15310 #endif
15311
15312   if (pnote->descsz < 2 * addr_size)
15313     {
15314       printf (_("    Malformed note - too short for header\n"));
15315       return 0;
15316     }
15317
15318   descdata = (unsigned char *) pnote->descdata;
15319   descend = descdata + pnote->descsz;
15320
15321   if (descdata[pnote->descsz - 1] != '\0')
15322     {
15323       printf (_("    Malformed note - does not end with \\0\n"));
15324       return 0;
15325     }
15326
15327   count = byte_get (descdata, addr_size);
15328   descdata += addr_size;
15329
15330   page_size = byte_get (descdata, addr_size);
15331   descdata += addr_size;
15332
15333   if (pnote->descsz < 2 * addr_size + count * 3 * addr_size)
15334     {
15335       printf (_("    Malformed note - too short for supplied file count\n"));
15336       return 0;
15337     }
15338
15339   printf (_("    Page size: "));
15340   print_vma (page_size, DEC);
15341   printf ("\n");
15342
15343   printf (_("    %*s%*s%*s\n"),
15344           (int) (2 + 2 * addr_size), _("Start"),
15345           (int) (4 + 2 * addr_size), _("End"),
15346           (int) (4 + 2 * addr_size), _("Page Offset"));
15347   filenames = descdata + count * 3 * addr_size;
15348   while (count-- > 0)
15349     {
15350       bfd_vma start, end, file_ofs;
15351
15352       if (filenames == descend)
15353         {
15354           printf (_("    Malformed note - filenames end too early\n"));
15355           return 0;
15356         }
15357
15358       start = byte_get (descdata, addr_size);
15359       descdata += addr_size;
15360       end = byte_get (descdata, addr_size);
15361       descdata += addr_size;
15362       file_ofs = byte_get (descdata, addr_size);
15363       descdata += addr_size;
15364
15365       printf ("    ");
15366       print_vma (start, FULL_HEX);
15367       printf ("  ");
15368       print_vma (end, FULL_HEX);
15369       printf ("  ");
15370       print_vma (file_ofs, FULL_HEX);
15371       printf ("\n        %s\n", filenames);
15372
15373       filenames += 1 + strlen ((char *) filenames);
15374     }
15375
15376   return 1;
15377 }
15378
15379 static const char *
15380 get_gnu_elf_note_type (unsigned e_type)
15381 {
15382   static char buff[64];
15383
15384   switch (e_type)
15385     {
15386     case NT_GNU_ABI_TAG:
15387       return _("NT_GNU_ABI_TAG (ABI version tag)");
15388     case NT_GNU_HWCAP:
15389       return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
15390     case NT_GNU_BUILD_ID:
15391       return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
15392     case NT_GNU_GOLD_VERSION:
15393       return _("NT_GNU_GOLD_VERSION (gold version)");
15394     default:
15395       break;
15396     }
15397
15398   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15399   return buff;
15400 }
15401
15402 static int
15403 print_gnu_note (Elf_Internal_Note *pnote)
15404 {
15405   switch (pnote->type)
15406     {
15407     case NT_GNU_BUILD_ID:
15408       {
15409         unsigned long i;
15410
15411         printf (_("    Build ID: "));
15412         for (i = 0; i < pnote->descsz; ++i)
15413           printf ("%02x", pnote->descdata[i] & 0xff);
15414         printf ("\n");
15415       }
15416       break;
15417
15418     case NT_GNU_ABI_TAG:
15419       {
15420         unsigned long os, major, minor, subminor;
15421         const char *osname;
15422
15423         /* PR 17531: file: 030-599401-0.004.  */
15424         if (pnote->descsz < 16)
15425           {
15426             printf (_("    <corrupt GNU_ABI_TAG>\n"));
15427             break;
15428           }
15429
15430         os = byte_get ((unsigned char *) pnote->descdata, 4);
15431         major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
15432         minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
15433         subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
15434
15435         switch (os)
15436           {
15437           case GNU_ABI_TAG_LINUX:
15438             osname = "Linux";
15439             break;
15440           case GNU_ABI_TAG_HURD:
15441             osname = "Hurd";
15442             break;
15443           case GNU_ABI_TAG_SOLARIS:
15444             osname = "Solaris";
15445             break;
15446           case GNU_ABI_TAG_FREEBSD:
15447             osname = "FreeBSD";
15448             break;
15449           case GNU_ABI_TAG_NETBSD:
15450             osname = "NetBSD";
15451             break;
15452           case GNU_ABI_TAG_SYLLABLE:
15453             osname = "Syllable";
15454             break;
15455           case GNU_ABI_TAG_NACL:
15456             osname = "NaCl";
15457             break;
15458           default:
15459             osname = "Unknown";
15460             break;
15461           }
15462
15463         printf (_("    OS: %s, ABI: %ld.%ld.%ld\n"), osname,
15464                 major, minor, subminor);
15465       }
15466       break;
15467
15468     case NT_GNU_GOLD_VERSION:
15469       {
15470         unsigned long i;
15471
15472         printf (_("    Version: "));
15473         for (i = 0; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
15474           printf ("%c", pnote->descdata[i]);
15475         printf ("\n");
15476       }
15477       break;
15478     }
15479
15480   return 1;
15481 }
15482
15483 static const char *
15484 get_v850_elf_note_type (enum v850_notes n_type)
15485 {
15486   static char buff[64];
15487
15488   switch (n_type)
15489     {
15490     case V850_NOTE_ALIGNMENT:  return _("Alignment of 8-byte objects");
15491     case V850_NOTE_DATA_SIZE:  return _("Sizeof double and long double");
15492     case V850_NOTE_FPU_INFO:   return _("Type of FPU support needed");
15493     case V850_NOTE_SIMD_INFO:  return _("Use of SIMD instructions");
15494     case V850_NOTE_CACHE_INFO: return _("Use of cache");
15495     case V850_NOTE_MMU_INFO:   return _("Use of MMU");
15496     default:
15497       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), n_type);
15498       return buff;
15499     }
15500 }
15501
15502 static int
15503 print_v850_note (Elf_Internal_Note * pnote)
15504 {
15505   unsigned int val;
15506
15507   if (pnote->descsz != 4)
15508     return 0;
15509   val = byte_get ((unsigned char *) pnote->descdata, pnote->descsz);
15510
15511   if (val == 0)
15512     {
15513       printf (_("not set\n"));
15514       return 1;
15515     }
15516
15517   switch (pnote->type)
15518     {
15519     case V850_NOTE_ALIGNMENT:
15520       switch (val)
15521         {
15522         case EF_RH850_DATA_ALIGN4: printf (_("4-byte\n")); return 1;
15523         case EF_RH850_DATA_ALIGN8: printf (_("8-byte\n")); return 1;
15524         }
15525       break;
15526
15527     case V850_NOTE_DATA_SIZE:
15528       switch (val)
15529         {
15530         case EF_RH850_DOUBLE32: printf (_("4-bytes\n")); return 1;
15531         case EF_RH850_DOUBLE64: printf (_("8-bytes\n")); return 1;
15532         }
15533       break;
15534
15535     case V850_NOTE_FPU_INFO:
15536       switch (val)
15537         {
15538         case EF_RH850_FPU20: printf (_("FPU-2.0\n")); return 1;
15539         case EF_RH850_FPU30: printf (_("FPU-3.0\n")); return 1;
15540         }
15541       break;
15542
15543     case V850_NOTE_MMU_INFO:
15544     case V850_NOTE_CACHE_INFO:
15545     case V850_NOTE_SIMD_INFO:
15546       if (val == EF_RH850_SIMD)
15547         {
15548           printf (_("yes\n"));
15549           return 1;
15550         }
15551       break;
15552
15553     default:
15554       /* An 'unknown note type' message will already have been displayed.  */
15555       break;
15556     }
15557
15558   printf (_("unknown value: %x\n"), val);
15559   return 0;
15560 }
15561
15562 static int 
15563 process_netbsd_elf_note (Elf_Internal_Note * pnote)
15564 {
15565   unsigned int version;
15566
15567   switch (pnote->type)
15568     {
15569     case NT_NETBSD_IDENT:
15570       version = byte_get ((unsigned char *) pnote->descdata, sizeof (version));
15571       if ((version / 10000) % 100)
15572         printf ("  NetBSD\t\t0x%08lx\tIDENT %u (%u.%u%s%c)\n", pnote->descsz,
15573                 version, version / 100000000, (version / 1000000) % 100,
15574                 (version / 10000) % 100 > 26 ? "Z" : "",
15575                 'A' + (version / 10000) % 26); 
15576       else
15577         printf ("  NetBSD\t\t0x%08lx\tIDENT %u (%u.%u.%u)\n", pnote->descsz,
15578                 version, version / 100000000, (version / 1000000) % 100,
15579                 (version / 100) % 100); 
15580       return 1;
15581
15582     case NT_NETBSD_MARCH:
15583       printf ("  NetBSD\t0x%08lx\tMARCH <%s>\n", pnote->descsz,
15584               pnote->descdata);
15585       return 1;
15586
15587     default:
15588       break;
15589     }
15590
15591   printf ("  NetBSD\t0x%08lx\tUnknown note type: (0x%08lx)\n", pnote->descsz,
15592           pnote->type);
15593   return 1;
15594 }
15595
15596 static const char *
15597 get_freebsd_elfcore_note_type (unsigned e_type)
15598 {
15599   switch (e_type)
15600     {
15601     case NT_FREEBSD_THRMISC:
15602       return _("NT_THRMISC (thrmisc structure)");
15603     case NT_FREEBSD_PROCSTAT_PROC:
15604       return _("NT_PROCSTAT_PROC (proc data)");
15605     case NT_FREEBSD_PROCSTAT_FILES:
15606       return _("NT_PROCSTAT_FILES (files data)");
15607     case NT_FREEBSD_PROCSTAT_VMMAP:
15608       return _("NT_PROCSTAT_VMMAP (vmmap data)");
15609     case NT_FREEBSD_PROCSTAT_GROUPS:
15610       return _("NT_PROCSTAT_GROUPS (groups data)");
15611     case NT_FREEBSD_PROCSTAT_UMASK:
15612       return _("NT_PROCSTAT_UMASK (umask data)");
15613     case NT_FREEBSD_PROCSTAT_RLIMIT:
15614       return _("NT_PROCSTAT_RLIMIT (rlimit data)");
15615     case NT_FREEBSD_PROCSTAT_OSREL:
15616       return _("NT_PROCSTAT_OSREL (osreldate data)");
15617     case NT_FREEBSD_PROCSTAT_PSSTRINGS:
15618       return _("NT_PROCSTAT_PSSTRINGS (ps_strings data)");
15619     case NT_FREEBSD_PROCSTAT_AUXV:
15620       return _("NT_PROCSTAT_AUXV (auxv data)");
15621     }
15622   return get_note_type (e_type);
15623 }
15624
15625 static const char *
15626 get_netbsd_elfcore_note_type (unsigned e_type)
15627 {
15628   static char buff[64];
15629
15630   if (e_type == NT_NETBSDCORE_PROCINFO)
15631     {
15632       /* NetBSD core "procinfo" structure.  */
15633       return _("NetBSD procinfo structure");
15634     }
15635
15636   /* As of Jan 2002 there are no other machine-independent notes
15637      defined for NetBSD core files.  If the note type is less
15638      than the start of the machine-dependent note types, we don't
15639      understand it.  */
15640
15641   if (e_type < NT_NETBSDCORE_FIRSTMACH)
15642     {
15643       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15644       return buff;
15645     }
15646
15647   switch (elf_header.e_machine)
15648     {
15649     /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
15650        and PT_GETFPREGS == mach+2.  */
15651
15652     case EM_OLD_ALPHA:
15653     case EM_ALPHA:
15654     case EM_SPARC:
15655     case EM_SPARC32PLUS:
15656     case EM_SPARCV9:
15657       switch (e_type)
15658         {
15659         case NT_NETBSDCORE_FIRSTMACH + 0:
15660           return _("PT_GETREGS (reg structure)");
15661         case NT_NETBSDCORE_FIRSTMACH + 2:
15662           return _("PT_GETFPREGS (fpreg structure)");
15663         default:
15664           break;
15665         }
15666       break;
15667
15668     /* On all other arch's, PT_GETREGS == mach+1 and
15669        PT_GETFPREGS == mach+3.  */
15670     default:
15671       switch (e_type)
15672         {
15673         case NT_NETBSDCORE_FIRSTMACH + 1:
15674           return _("PT_GETREGS (reg structure)");
15675         case NT_NETBSDCORE_FIRSTMACH + 3:
15676           return _("PT_GETFPREGS (fpreg structure)");
15677         default:
15678           break;
15679         }
15680     }
15681
15682   snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
15683             e_type - NT_NETBSDCORE_FIRSTMACH);
15684   return buff;
15685 }
15686
15687 static const char *
15688 get_stapsdt_note_type (unsigned e_type)
15689 {
15690   static char buff[64];
15691
15692   switch (e_type)
15693     {
15694     case NT_STAPSDT:
15695       return _("NT_STAPSDT (SystemTap probe descriptors)");
15696
15697     default:
15698       break;
15699     }
15700
15701   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15702   return buff;
15703 }
15704
15705 static int
15706 print_stapsdt_note (Elf_Internal_Note *pnote)
15707 {
15708   int addr_size = is_32bit_elf ? 4 : 8;
15709   char *data = pnote->descdata;
15710   char *data_end = pnote->descdata + pnote->descsz;
15711   bfd_vma pc, base_addr, semaphore;
15712   char *provider, *probe, *arg_fmt;
15713
15714   pc = byte_get ((unsigned char *) data, addr_size);
15715   data += addr_size;
15716   base_addr = byte_get ((unsigned char *) data, addr_size);
15717   data += addr_size;
15718   semaphore = byte_get ((unsigned char *) data, addr_size);
15719   data += addr_size;
15720
15721   provider = data;
15722   data += strlen (data) + 1;
15723   probe = data;
15724   data += strlen (data) + 1;
15725   arg_fmt = data;
15726   data += strlen (data) + 1;
15727
15728   printf (_("    Provider: %s\n"), provider);
15729   printf (_("    Name: %s\n"), probe);
15730   printf (_("    Location: "));
15731   print_vma (pc, FULL_HEX);
15732   printf (_(", Base: "));
15733   print_vma (base_addr, FULL_HEX);
15734   printf (_(", Semaphore: "));
15735   print_vma (semaphore, FULL_HEX);
15736   printf ("\n");
15737   printf (_("    Arguments: %s\n"), arg_fmt);
15738
15739   return data == data_end;
15740 }
15741
15742 static const char *
15743 get_ia64_vms_note_type (unsigned e_type)
15744 {
15745   static char buff[64];
15746
15747   switch (e_type)
15748     {
15749     case NT_VMS_MHD:
15750       return _("NT_VMS_MHD (module header)");
15751     case NT_VMS_LNM:
15752       return _("NT_VMS_LNM (language name)");
15753     case NT_VMS_SRC:
15754       return _("NT_VMS_SRC (source files)");
15755     case NT_VMS_TITLE:
15756       return "NT_VMS_TITLE";
15757     case NT_VMS_EIDC:
15758       return _("NT_VMS_EIDC (consistency check)");
15759     case NT_VMS_FPMODE:
15760       return _("NT_VMS_FPMODE (FP mode)");
15761     case NT_VMS_LINKTIME:
15762       return "NT_VMS_LINKTIME";
15763     case NT_VMS_IMGNAM:
15764       return _("NT_VMS_IMGNAM (image name)");
15765     case NT_VMS_IMGID:
15766       return _("NT_VMS_IMGID (image id)");
15767     case NT_VMS_LINKID:
15768       return _("NT_VMS_LINKID (link id)");
15769     case NT_VMS_IMGBID:
15770       return _("NT_VMS_IMGBID (build id)");
15771     case NT_VMS_GSTNAM:
15772       return _("NT_VMS_GSTNAM (sym table name)");
15773     case NT_VMS_ORIG_DYN:
15774       return "NT_VMS_ORIG_DYN";
15775     case NT_VMS_PATCHTIME:
15776       return "NT_VMS_PATCHTIME";
15777     default:
15778       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15779       return buff;
15780     }
15781 }
15782
15783 static int
15784 print_ia64_vms_note (Elf_Internal_Note * pnote)
15785 {
15786   switch (pnote->type)
15787     {
15788     case NT_VMS_MHD:
15789       if (pnote->descsz > 36)
15790         {
15791           size_t l = strlen (pnote->descdata + 34);
15792           printf (_("    Creation date  : %.17s\n"), pnote->descdata);
15793           printf (_("    Last patch date: %.17s\n"), pnote->descdata + 17);
15794           printf (_("    Module name    : %s\n"), pnote->descdata + 34);
15795           printf (_("    Module version : %s\n"), pnote->descdata + 34 + l + 1);
15796         }
15797       else
15798         printf (_("    Invalid size\n"));
15799       break;
15800     case NT_VMS_LNM:
15801       printf (_("   Language: %s\n"), pnote->descdata);
15802       break;
15803 #ifdef BFD64
15804     case NT_VMS_FPMODE:
15805       printf (_("   Floating Point mode: "));
15806       printf ("0x%016" BFD_VMA_FMT "x\n",
15807               (bfd_vma) byte_get ((unsigned char *)pnote->descdata, 8));
15808       break;
15809     case NT_VMS_LINKTIME:
15810       printf (_("   Link time: "));
15811       print_vms_time
15812         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
15813       printf ("\n");
15814       break;
15815     case NT_VMS_PATCHTIME:
15816       printf (_("   Patch time: "));
15817       print_vms_time
15818         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
15819       printf ("\n");
15820       break;
15821     case NT_VMS_ORIG_DYN:
15822       printf (_("   Major id: %u,  minor id: %u\n"),
15823               (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
15824               (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
15825       printf (_("   Last modified  : "));
15826       print_vms_time
15827         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
15828       printf (_("\n   Link flags  : "));
15829       printf ("0x%016" BFD_VMA_FMT "x\n",
15830               (bfd_vma) byte_get ((unsigned char *)pnote->descdata + 16, 8));
15831       printf (_("   Header flags: 0x%08x\n"),
15832               (unsigned) byte_get ((unsigned char *)pnote->descdata + 24, 4));
15833       printf (_("   Image id    : %s\n"), pnote->descdata + 32);
15834       break;
15835 #endif
15836     case NT_VMS_IMGNAM:
15837       printf (_("    Image name: %s\n"), pnote->descdata);
15838       break;
15839     case NT_VMS_GSTNAM:
15840       printf (_("    Global symbol table name: %s\n"), pnote->descdata);
15841       break;
15842     case NT_VMS_IMGID:
15843       printf (_("    Image id: %s\n"), pnote->descdata);
15844       break;
15845     case NT_VMS_LINKID:
15846       printf (_("    Linker id: %s\n"), pnote->descdata);
15847       break;
15848     default:
15849       break;
15850     }
15851   return 1;
15852 }
15853
15854 /* Note that by the ELF standard, the name field is already null byte
15855    terminated, and namesz includes the terminating null byte.
15856    I.E. the value of namesz for the name "FSF" is 4.
15857
15858    If the value of namesz is zero, there is no name present.  */
15859 static int
15860 process_note (Elf_Internal_Note * pnote)
15861 {
15862   const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
15863   const char * nt;
15864
15865   if (pnote->namesz == 0)
15866     /* If there is no note name, then use the default set of
15867        note type strings.  */
15868     nt = get_note_type (pnote->type);
15869
15870   else if (const_strneq (pnote->namedata, "GNU"))
15871     /* GNU-specific object file notes.  */
15872     nt = get_gnu_elf_note_type (pnote->type);
15873
15874   else if (const_strneq (pnote->namedata, "FreeBSD"))
15875     /* FreeBSD-specific core file notes.  */
15876     nt = get_freebsd_elfcore_note_type (pnote->type);
15877
15878   else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
15879     /* NetBSD-specific core file notes.  */
15880     nt = get_netbsd_elfcore_note_type (pnote->type);
15881
15882   else if (const_strneq (pnote->namedata, "NetBSD"))
15883     /* NetBSD-specific core file notes.  */
15884     return process_netbsd_elf_note (pnote);
15885
15886   else if (strneq (pnote->namedata, "SPU/", 4))
15887     {
15888       /* SPU-specific core file notes.  */
15889       nt = pnote->namedata + 4;
15890       name = "SPU";
15891     }
15892
15893   else if (const_strneq (pnote->namedata, "IPF/VMS"))
15894     /* VMS/ia64-specific file notes.  */
15895     nt = get_ia64_vms_note_type (pnote->type);
15896
15897   else if (const_strneq (pnote->namedata, "stapsdt"))
15898     nt = get_stapsdt_note_type (pnote->type);
15899
15900   else
15901     /* Don't recognize this note name; just use the default set of
15902        note type strings.  */
15903     nt = get_note_type (pnote->type);
15904
15905   printf ("  %-20s 0x%08lx\t%s\n", name, pnote->descsz, nt);
15906
15907   if (const_strneq (pnote->namedata, "IPF/VMS"))
15908     return print_ia64_vms_note (pnote);
15909   else if (const_strneq (pnote->namedata, "GNU"))
15910     return print_gnu_note (pnote);
15911   else if (const_strneq (pnote->namedata, "stapsdt"))
15912     return print_stapsdt_note (pnote);
15913   else if (const_strneq (pnote->namedata, "CORE"))
15914     return print_core_note (pnote);
15915   else
15916     return 1;
15917 }
15918
15919
15920 static int
15921 process_corefile_note_segment (FILE * file, bfd_vma offset, bfd_vma length)
15922 {
15923   Elf_External_Note * pnotes;
15924   Elf_External_Note * external;
15925   char * end;
15926   int res = 1;
15927
15928   if (length <= 0)
15929     return 0;
15930
15931   pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
15932                                            _("notes"));
15933   if (pnotes == NULL)
15934     return 0;
15935
15936   external = pnotes;
15937
15938   printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
15939           (unsigned long) offset, (unsigned long) length);
15940   printf (_("  %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
15941
15942   end = (char *) pnotes + length;
15943   while ((char *) external < end)
15944     {
15945       Elf_Internal_Note inote;
15946       size_t min_notesz;
15947       char *next;
15948       char * temp = NULL;
15949       size_t data_remaining = end - (char *) external;
15950
15951       if (!is_ia64_vms ())
15952         {
15953           /* PR binutils/15191
15954              Make sure that there is enough data to read.  */
15955           min_notesz = offsetof (Elf_External_Note, name);
15956           if (data_remaining < min_notesz)
15957             {
15958               warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
15959                     (int) data_remaining);
15960               break;
15961             }
15962           inote.type     = BYTE_GET (external->type);
15963           inote.namesz   = BYTE_GET (external->namesz);
15964           inote.namedata = external->name;
15965           inote.descsz   = BYTE_GET (external->descsz);
15966           inote.descdata = inote.namedata + align_power (inote.namesz, 2);
15967           /* PR 17531: file: 3443835e.  */
15968           if (inote.descdata < (char *) pnotes || inote.descdata > end)
15969             {
15970               warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
15971               inote.descdata = inote.namedata;
15972               inote.namesz   = 0;
15973             }
15974
15975           inote.descpos  = offset + (inote.descdata - (char *) pnotes);
15976           next = inote.descdata + align_power (inote.descsz, 2);
15977         }
15978       else
15979         {
15980           Elf64_External_VMS_Note *vms_external;
15981
15982           /* PR binutils/15191
15983              Make sure that there is enough data to read.  */
15984           min_notesz = offsetof (Elf64_External_VMS_Note, name);
15985           if (data_remaining < min_notesz)
15986             {
15987               warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
15988                     (int) data_remaining);
15989               break;
15990             }
15991
15992           vms_external = (Elf64_External_VMS_Note *) external;
15993           inote.type     = BYTE_GET (vms_external->type);
15994           inote.namesz   = BYTE_GET (vms_external->namesz);
15995           inote.namedata = vms_external->name;
15996           inote.descsz   = BYTE_GET (vms_external->descsz);
15997           inote.descdata = inote.namedata + align_power (inote.namesz, 3);
15998           inote.descpos  = offset + (inote.descdata - (char *) pnotes);
15999           next = inote.descdata + align_power (inote.descsz, 3);
16000         }
16001
16002       if (inote.descdata < (char *) external + min_notesz
16003           || next < (char *) external + min_notesz
16004           /* PR binutils/17531: file: id:000000,sig:11,src:006986,op:havoc,rep:4.  */
16005           || inote.namedata + inote.namesz < inote.namedata
16006           || inote.descdata + inote.descsz < inote.descdata
16007           || data_remaining < (size_t)(next - (char *) external))
16008         {
16009           warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
16010                 (unsigned long) ((char *) external - (char *) pnotes));
16011           warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx\n"),
16012                 inote.type, inote.namesz, inote.descsz);
16013           break;
16014         }
16015
16016       external = (Elf_External_Note *) next;
16017
16018       /* Verify that name is null terminated.  It appears that at least
16019          one version of Linux (RedHat 6.0) generates corefiles that don't
16020          comply with the ELF spec by failing to include the null byte in
16021          namesz.  */
16022       if (inote.namedata[inote.namesz - 1] != '\0')
16023         {
16024           temp = (char *) malloc (inote.namesz + 1);
16025           if (temp == NULL)
16026             {
16027               error (_("Out of memory allocating space for inote name\n"));
16028               res = 0;
16029               break;
16030             }
16031
16032           strncpy (temp, inote.namedata, inote.namesz);
16033           temp[inote.namesz] = 0;
16034
16035           /* warn (_("'%s' NOTE name not properly null terminated\n"), temp);  */
16036           inote.namedata = temp;
16037         }
16038
16039       res &= process_note (& inote);
16040
16041       if (temp != NULL)
16042         {
16043           free (temp);
16044           temp = NULL;
16045         }
16046     }
16047
16048   free (pnotes);
16049
16050   return res;
16051 }
16052
16053 static int
16054 process_corefile_note_segments (FILE * file)
16055 {
16056   Elf_Internal_Phdr * segment;
16057   unsigned int i;
16058   int res = 1;
16059
16060   if (! get_program_headers (file))
16061       return 0;
16062
16063   for (i = 0, segment = program_headers;
16064        i < elf_header.e_phnum;
16065        i++, segment++)
16066     {
16067       if (segment->p_type == PT_NOTE)
16068         res &= process_corefile_note_segment (file,
16069                                               (bfd_vma) segment->p_offset,
16070                                               (bfd_vma) segment->p_filesz);
16071     }
16072
16073   return res;
16074 }
16075
16076 static int
16077 process_v850_notes (FILE * file, bfd_vma offset, bfd_vma length)
16078 {
16079   Elf_External_Note * pnotes;
16080   Elf_External_Note * external;
16081   char * end;
16082   int res = 1;
16083
16084   if (length <= 0)
16085     return 0;
16086
16087   pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
16088                                            _("v850 notes"));
16089   if (pnotes == NULL)
16090     return 0;
16091
16092   external = pnotes;
16093   end = (char*) pnotes + length;
16094
16095   printf (_("\nDisplaying contents of Renesas V850 notes section at offset 0x%lx with length 0x%lx:\n"),
16096           (unsigned long) offset, (unsigned long) length);
16097
16098   while ((char *) external + sizeof (Elf_External_Note) < end)
16099     {
16100       Elf_External_Note * next;
16101       Elf_Internal_Note inote;
16102
16103       inote.type     = BYTE_GET (external->type);
16104       inote.namesz   = BYTE_GET (external->namesz);
16105       inote.namedata = external->name;
16106       inote.descsz   = BYTE_GET (external->descsz);
16107       inote.descdata = inote.namedata + align_power (inote.namesz, 2);
16108       inote.descpos  = offset + (inote.descdata - (char *) pnotes);
16109
16110       if (inote.descdata < (char *) pnotes || inote.descdata >= end)
16111         {
16112           warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
16113           inote.descdata = inote.namedata;
16114           inote.namesz   = 0;
16115         }
16116
16117       next = (Elf_External_Note *) (inote.descdata + align_power (inote.descsz, 2));
16118
16119       if (   ((char *) next > end)
16120           || ((char *) next <  (char *) pnotes))
16121         {
16122           warn (_("corrupt descsz found in note at offset 0x%lx\n"),
16123                 (unsigned long) ((char *) external - (char *) pnotes));
16124           warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
16125                 inote.type, inote.namesz, inote.descsz);
16126           break;
16127         }
16128
16129       external = next;
16130
16131       /* Prevent out-of-bounds indexing.  */
16132       if (   inote.namedata + inote.namesz > end
16133           || inote.namedata + inote.namesz < inote.namedata)
16134         {
16135           warn (_("corrupt namesz found in note at offset 0x%lx\n"),
16136                 (unsigned long) ((char *) external - (char *) pnotes));
16137           warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
16138                 inote.type, inote.namesz, inote.descsz);
16139           break;
16140         }
16141
16142       printf ("  %s: ", get_v850_elf_note_type (inote.type));
16143
16144       if (! print_v850_note (& inote))
16145         {
16146           res = 0;
16147           printf ("<corrupt sizes: namesz: %lx, descsz: %lx>\n",
16148                   inote.namesz, inote.descsz);
16149         }
16150     }
16151
16152   free (pnotes);
16153
16154   return res;
16155 }
16156
16157 static int
16158 process_note_sections (FILE * file)
16159 {
16160   Elf_Internal_Shdr * section;
16161   unsigned long i;
16162   int n = 0;
16163   int res = 1;
16164
16165   for (i = 0, section = section_headers;
16166        i < elf_header.e_shnum && section != NULL;
16167        i++, section++)
16168     {
16169       if (section->sh_type == SHT_NOTE)
16170         {
16171           res &= process_corefile_note_segment (file,
16172                                                 (bfd_vma) section->sh_offset,
16173                                                 (bfd_vma) section->sh_size);
16174           n++;
16175         }
16176
16177       if ((   elf_header.e_machine == EM_V800
16178            || elf_header.e_machine == EM_V850
16179            || elf_header.e_machine == EM_CYGNUS_V850)
16180           && section->sh_type == SHT_RENESAS_INFO)
16181         {
16182           res &= process_v850_notes (file,
16183                                      (bfd_vma) section->sh_offset,
16184                                      (bfd_vma) section->sh_size);
16185           n++;
16186         }
16187     }
16188
16189   if (n == 0)
16190     /* Try processing NOTE segments instead.  */
16191     return process_corefile_note_segments (file);
16192
16193   return res;
16194 }
16195
16196 static int
16197 process_notes (FILE * file)
16198 {
16199   /* If we have not been asked to display the notes then do nothing.  */
16200   if (! do_notes)
16201     return 1;
16202
16203   if (elf_header.e_type != ET_CORE)
16204     return process_note_sections (file);
16205
16206   /* No program headers means no NOTE segment.  */
16207   if (elf_header.e_phnum > 0)
16208     return process_corefile_note_segments (file);
16209
16210   printf (_("No note segments present in the core file.\n"));
16211   return 1;
16212 }
16213
16214 static int
16215 process_arch_specific (FILE * file)
16216 {
16217   if (! do_arch)
16218     return 1;
16219
16220   switch (elf_header.e_machine)
16221     {
16222     case EM_ARM:
16223       return process_arm_specific (file);
16224     case EM_MIPS:
16225     case EM_MIPS_RS3_LE:
16226       return process_mips_specific (file);
16227       break;
16228     case EM_NDS32:
16229       return process_nds32_specific (file);
16230       break;
16231     case EM_PPC:
16232       return process_power_specific (file);
16233       break;
16234     case EM_S390:
16235     case EM_S390_OLD:
16236       return process_s390_specific (file);
16237       break;
16238     case EM_SPARC:
16239     case EM_SPARC32PLUS:
16240     case EM_SPARCV9:
16241       return process_sparc_specific (file);
16242       break;
16243     case EM_TI_C6000:
16244       return process_tic6x_specific (file);
16245       break;
16246     case EM_MSP430:
16247       return process_msp430x_specific (file);
16248     default:
16249       break;
16250     }
16251   return 1;
16252 }
16253
16254 static int
16255 get_file_header (FILE * file)
16256 {
16257   /* Read in the identity array.  */
16258   if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
16259     return 0;
16260
16261   /* Determine how to read the rest of the header.  */
16262   switch (elf_header.e_ident[EI_DATA])
16263     {
16264     default: /* fall through */
16265     case ELFDATANONE: /* fall through */
16266     case ELFDATA2LSB:
16267       byte_get = byte_get_little_endian;
16268       byte_put = byte_put_little_endian;
16269       break;
16270     case ELFDATA2MSB:
16271       byte_get = byte_get_big_endian;
16272       byte_put = byte_put_big_endian;
16273       break;
16274     }
16275
16276   /* For now we only support 32 bit and 64 bit ELF files.  */
16277   is_32bit_elf = (elf_header.e_ident[EI_CLASS] != ELFCLASS64);
16278
16279   /* Read in the rest of the header.  */
16280   if (is_32bit_elf)
16281     {
16282       Elf32_External_Ehdr ehdr32;
16283
16284       if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
16285         return 0;
16286
16287       elf_header.e_type      = BYTE_GET (ehdr32.e_type);
16288       elf_header.e_machine   = BYTE_GET (ehdr32.e_machine);
16289       elf_header.e_version   = BYTE_GET (ehdr32.e_version);
16290       elf_header.e_entry     = BYTE_GET (ehdr32.e_entry);
16291       elf_header.e_phoff     = BYTE_GET (ehdr32.e_phoff);
16292       elf_header.e_shoff     = BYTE_GET (ehdr32.e_shoff);
16293       elf_header.e_flags     = BYTE_GET (ehdr32.e_flags);
16294       elf_header.e_ehsize    = BYTE_GET (ehdr32.e_ehsize);
16295       elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
16296       elf_header.e_phnum     = BYTE_GET (ehdr32.e_phnum);
16297       elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
16298       elf_header.e_shnum     = BYTE_GET (ehdr32.e_shnum);
16299       elf_header.e_shstrndx  = BYTE_GET (ehdr32.e_shstrndx);
16300     }
16301   else
16302     {
16303       Elf64_External_Ehdr ehdr64;
16304
16305       /* If we have been compiled with sizeof (bfd_vma) == 4, then
16306          we will not be able to cope with the 64bit data found in
16307          64 ELF files.  Detect this now and abort before we start
16308          overwriting things.  */
16309       if (sizeof (bfd_vma) < 8)
16310         {
16311           error (_("This instance of readelf has been built without support for a\n\
16312 64 bit data type and so it cannot read 64 bit ELF files.\n"));
16313           return 0;
16314         }
16315
16316       if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
16317         return 0;
16318
16319       elf_header.e_type      = BYTE_GET (ehdr64.e_type);
16320       elf_header.e_machine   = BYTE_GET (ehdr64.e_machine);
16321       elf_header.e_version   = BYTE_GET (ehdr64.e_version);
16322       elf_header.e_entry     = BYTE_GET (ehdr64.e_entry);
16323       elf_header.e_phoff     = BYTE_GET (ehdr64.e_phoff);
16324       elf_header.e_shoff     = BYTE_GET (ehdr64.e_shoff);
16325       elf_header.e_flags     = BYTE_GET (ehdr64.e_flags);
16326       elf_header.e_ehsize    = BYTE_GET (ehdr64.e_ehsize);
16327       elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
16328       elf_header.e_phnum     = BYTE_GET (ehdr64.e_phnum);
16329       elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
16330       elf_header.e_shnum     = BYTE_GET (ehdr64.e_shnum);
16331       elf_header.e_shstrndx  = BYTE_GET (ehdr64.e_shstrndx);
16332     }
16333
16334   if (elf_header.e_shoff)
16335     {
16336       /* There may be some extensions in the first section header.  Don't
16337          bomb if we can't read it.  */
16338       if (is_32bit_elf)
16339         get_32bit_section_headers (file, TRUE);
16340       else
16341         get_64bit_section_headers (file, TRUE);
16342     }
16343
16344   return 1;
16345 }
16346
16347 /* Process one ELF object file according to the command line options.
16348    This file may actually be stored in an archive.  The file is
16349    positioned at the start of the ELF object.  */
16350
16351 static int
16352 process_object (char * file_name, FILE * file)
16353 {
16354   unsigned int i;
16355
16356   if (! get_file_header (file))
16357     {
16358       error (_("%s: Failed to read file header\n"), file_name);
16359       return 1;
16360     }
16361
16362   /* Initialise per file variables.  */
16363   for (i = ARRAY_SIZE (version_info); i--;)
16364     version_info[i] = 0;
16365
16366   for (i = ARRAY_SIZE (dynamic_info); i--;)
16367     dynamic_info[i] = 0;
16368   dynamic_info_DT_GNU_HASH = 0;
16369
16370   /* Process the file.  */
16371   if (show_name)
16372     printf (_("\nFile: %s\n"), file_name);
16373
16374   /* Initialise the dump_sects array from the cmdline_dump_sects array.
16375      Note we do this even if cmdline_dump_sects is empty because we
16376      must make sure that the dump_sets array is zeroed out before each
16377      object file is processed.  */
16378   if (num_dump_sects > num_cmdline_dump_sects)
16379     memset (dump_sects, 0, num_dump_sects * sizeof (* dump_sects));
16380
16381   if (num_cmdline_dump_sects > 0)
16382     {
16383       if (num_dump_sects == 0)
16384         /* A sneaky way of allocating the dump_sects array.  */
16385         request_dump_bynumber (num_cmdline_dump_sects, 0);
16386
16387       assert (num_dump_sects >= num_cmdline_dump_sects);
16388       memcpy (dump_sects, cmdline_dump_sects,
16389               num_cmdline_dump_sects * sizeof (* dump_sects));
16390     }
16391
16392   if (! process_file_header ())
16393     return 1;
16394
16395   if (! process_section_headers (file))
16396     {
16397       /* Without loaded section headers we cannot process lots of
16398          things.  */
16399       do_unwind = do_version = do_dump = do_arch = 0;
16400
16401       if (! do_using_dynamic)
16402         do_syms = do_dyn_syms = do_reloc = 0;
16403     }
16404
16405   if (! process_section_groups (file))
16406     {
16407       /* Without loaded section groups we cannot process unwind.  */
16408       do_unwind = 0;
16409     }
16410
16411   if (process_program_headers (file))
16412     process_dynamic_section (file);
16413
16414   process_relocs (file);
16415
16416   process_unwind (file);
16417
16418   process_symbol_table (file);
16419
16420   process_syminfo (file);
16421
16422   process_version_sections (file);
16423
16424   process_section_contents (file);
16425
16426   process_notes (file);
16427
16428   process_gnu_liblist (file);
16429
16430   process_arch_specific (file);
16431
16432   if (program_headers)
16433     {
16434       free (program_headers);
16435       program_headers = NULL;
16436     }
16437
16438   if (section_headers)
16439     {
16440       free (section_headers);
16441       section_headers = NULL;
16442     }
16443
16444   if (string_table)
16445     {
16446       free (string_table);
16447       string_table = NULL;
16448       string_table_length = 0;
16449     }
16450
16451   if (dynamic_strings)
16452     {
16453       free (dynamic_strings);
16454       dynamic_strings = NULL;
16455       dynamic_strings_length = 0;
16456     }
16457
16458   if (dynamic_symbols)
16459     {
16460       free (dynamic_symbols);
16461       dynamic_symbols = NULL;
16462       num_dynamic_syms = 0;
16463     }
16464
16465   if (dynamic_syminfo)
16466     {
16467       free (dynamic_syminfo);
16468       dynamic_syminfo = NULL;
16469     }
16470
16471   if (dynamic_section)
16472     {
16473       free (dynamic_section);
16474       dynamic_section = NULL;
16475     }
16476
16477   if (section_headers_groups)
16478     {
16479       free (section_headers_groups);
16480       section_headers_groups = NULL;
16481     }
16482
16483   if (section_groups)
16484     {
16485       struct group_list * g;
16486       struct group_list * next;
16487
16488       for (i = 0; i < group_count; i++)
16489         {
16490           for (g = section_groups [i].root; g != NULL; g = next)
16491             {
16492               next = g->next;
16493               free (g);
16494             }
16495         }
16496
16497       free (section_groups);
16498       section_groups = NULL;
16499     }
16500
16501   free_debug_memory ();
16502
16503   return 0;
16504 }
16505
16506 /* Process an ELF archive.
16507    On entry the file is positioned just after the ARMAG string.  */
16508
16509 static int
16510 process_archive (char * file_name, FILE * file, bfd_boolean is_thin_archive)
16511 {
16512   struct archive_info arch;
16513   struct archive_info nested_arch;
16514   size_t got;
16515   int ret;
16516
16517   show_name = 1;
16518
16519   /* The ARCH structure is used to hold information about this archive.  */
16520   arch.file_name = NULL;
16521   arch.file = NULL;
16522   arch.index_array = NULL;
16523   arch.sym_table = NULL;
16524   arch.longnames = NULL;
16525
16526   /* The NESTED_ARCH structure is used as a single-item cache of information
16527      about a nested archive (when members of a thin archive reside within
16528      another regular archive file).  */
16529   nested_arch.file_name = NULL;
16530   nested_arch.file = NULL;
16531   nested_arch.index_array = NULL;
16532   nested_arch.sym_table = NULL;
16533   nested_arch.longnames = NULL;
16534
16535   if (setup_archive (&arch, file_name, file, is_thin_archive, do_archive_index) != 0)
16536     {
16537       ret = 1;
16538       goto out;
16539     }
16540
16541   if (do_archive_index)
16542     {
16543       if (arch.sym_table == NULL)
16544         error (_("%s: unable to dump the index as none was found\n"), file_name);
16545       else
16546         {
16547           unsigned long i, l;
16548           unsigned long current_pos;
16549
16550           printf (_("Index of archive %s: (%lu entries, 0x%lx bytes in the symbol table)\n"),
16551                   file_name, (unsigned long) arch.index_num, arch.sym_size);
16552           current_pos = ftell (file);
16553
16554           for (i = l = 0; i < arch.index_num; i++)
16555             {
16556               if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
16557                 {
16558                   char * member_name;
16559
16560                   member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
16561
16562                   if (member_name != NULL)
16563                     {
16564                       char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
16565
16566                       if (qualified_name != NULL)
16567                         {
16568                           printf (_("Contents of binary %s at offset "), qualified_name);
16569                           (void) print_vma (arch.index_array[i], PREFIX_HEX);
16570                           putchar ('\n');
16571                           free (qualified_name);
16572                         }
16573                     }
16574                 }
16575
16576               if (l >= arch.sym_size)
16577                 {
16578                   error (_("%s: end of the symbol table reached before the end of the index\n"),
16579                          file_name);
16580                   break;
16581                 }
16582               /* PR 17531: file: 0b6630b2.  */
16583               printf ("\t%.*s\n", (int) (arch.sym_size - l), arch.sym_table + l);
16584               l += strnlen (arch.sym_table + l, arch.sym_size - l) + 1;
16585             }
16586
16587           if (arch.uses_64bit_indicies)
16588             l = (l + 7) & ~ 7;
16589           else
16590             l += l & 1;
16591
16592           if (l < arch.sym_size)
16593             error (_("%s: %ld bytes remain in the symbol table, but without corresponding entries in the index table\n"),
16594                    file_name, arch.sym_size - l);
16595
16596           if (fseek (file, current_pos, SEEK_SET) != 0)
16597             {
16598               error (_("%s: failed to seek back to start of object files in the archive\n"), file_name);
16599               ret = 1;
16600               goto out;
16601             }
16602         }
16603
16604       if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
16605           && !do_segments && !do_header && !do_dump && !do_version
16606           && !do_histogram && !do_debugging && !do_arch && !do_notes
16607           && !do_section_groups && !do_dyn_syms)
16608         {
16609           ret = 0; /* Archive index only.  */
16610           goto out;
16611         }
16612     }
16613
16614   ret = 0;
16615
16616   while (1)
16617     {
16618       char * name;
16619       size_t namelen;
16620       char * qualified_name;
16621
16622       /* Read the next archive header.  */
16623       if (fseek (file, arch.next_arhdr_offset, SEEK_SET) != 0)
16624         {
16625           error (_("%s: failed to seek to next archive header\n"), file_name);
16626           return 1;
16627         }
16628       got = fread (&arch.arhdr, 1, sizeof arch.arhdr, file);
16629       if (got != sizeof arch.arhdr)
16630         {
16631           if (got == 0)
16632             break;
16633           error (_("%s: failed to read archive header\n"), file_name);
16634           ret = 1;
16635           break;
16636         }
16637       if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
16638         {
16639           error (_("%s: did not find a valid archive header\n"), arch.file_name);
16640           ret = 1;
16641           break;
16642         }
16643
16644       arch.next_arhdr_offset += sizeof arch.arhdr;
16645
16646       archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
16647       if (archive_file_size & 01)
16648         ++archive_file_size;
16649
16650       name = get_archive_member_name (&arch, &nested_arch);
16651       if (name == NULL)
16652         {
16653           error (_("%s: bad archive file name\n"), file_name);
16654           ret = 1;
16655           break;
16656         }
16657       namelen = strlen (name);
16658
16659       qualified_name = make_qualified_name (&arch, &nested_arch, name);
16660       if (qualified_name == NULL)
16661         {
16662           error (_("%s: bad archive file name\n"), file_name);
16663           ret = 1;
16664           break;
16665         }
16666
16667       if (is_thin_archive && arch.nested_member_origin == 0)
16668         {
16669           /* This is a proxy for an external member of a thin archive.  */
16670           FILE * member_file;
16671           char * member_file_name = adjust_relative_path (file_name, name, namelen);
16672           if (member_file_name == NULL)
16673             {
16674               ret = 1;
16675               break;
16676             }
16677
16678           member_file = fopen (member_file_name, "rb");
16679           if (member_file == NULL)
16680             {
16681               error (_("Input file '%s' is not readable.\n"), member_file_name);
16682               free (member_file_name);
16683               ret = 1;
16684               break;
16685             }
16686
16687           archive_file_offset = arch.nested_member_origin;
16688
16689           ret |= process_object (qualified_name, member_file);
16690
16691           fclose (member_file);
16692           free (member_file_name);
16693         }
16694       else if (is_thin_archive)
16695         {
16696           /* PR 15140: Allow for corrupt thin archives.  */
16697           if (nested_arch.file == NULL)
16698             {
16699               error (_("%s: contains corrupt thin archive: %s\n"),
16700                      file_name, name);
16701               ret = 1;
16702               break;
16703             }
16704
16705           /* This is a proxy for a member of a nested archive.  */
16706           archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
16707
16708           /* The nested archive file will have been opened and setup by
16709              get_archive_member_name.  */
16710           if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
16711             {
16712               error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
16713               ret = 1;
16714               break;
16715             }
16716
16717           ret |= process_object (qualified_name, nested_arch.file);
16718         }
16719       else
16720         {
16721           archive_file_offset = arch.next_arhdr_offset;
16722           arch.next_arhdr_offset += archive_file_size;
16723
16724           ret |= process_object (qualified_name, file);
16725         }
16726
16727       if (dump_sects != NULL)
16728         {
16729           free (dump_sects);
16730           dump_sects = NULL;
16731           num_dump_sects = 0;
16732         }
16733
16734       free (qualified_name);
16735     }
16736
16737  out:
16738   if (nested_arch.file != NULL)
16739     fclose (nested_arch.file);
16740   release_archive (&nested_arch);
16741   release_archive (&arch);
16742
16743   return ret;
16744 }
16745
16746 static int
16747 process_file (char * file_name)
16748 {
16749   FILE * file;
16750   struct stat statbuf;
16751   char armag[SARMAG];
16752   int ret;
16753
16754   if (stat (file_name, &statbuf) < 0)
16755     {
16756       if (errno == ENOENT)
16757         error (_("'%s': No such file\n"), file_name);
16758       else
16759         error (_("Could not locate '%s'.  System error message: %s\n"),
16760                file_name, strerror (errno));
16761       return 1;
16762     }
16763
16764   if (! S_ISREG (statbuf.st_mode))
16765     {
16766       error (_("'%s' is not an ordinary file\n"), file_name);
16767       return 1;
16768     }
16769
16770   file = fopen (file_name, "rb");
16771   if (file == NULL)
16772     {
16773       error (_("Input file '%s' is not readable.\n"), file_name);
16774       return 1;
16775     }
16776
16777   if (fread (armag, SARMAG, 1, file) != 1)
16778     {
16779       error (_("%s: Failed to read file's magic number\n"), file_name);
16780       fclose (file);
16781       return 1;
16782     }
16783
16784   current_file_size = (bfd_size_type) statbuf.st_size;
16785
16786   if (memcmp (armag, ARMAG, SARMAG) == 0)
16787     ret = process_archive (file_name, file, FALSE);
16788   else if (memcmp (armag, ARMAGT, SARMAG) == 0)
16789     ret = process_archive (file_name, file, TRUE);
16790   else
16791     {
16792       if (do_archive_index)
16793         error (_("File %s is not an archive so its index cannot be displayed.\n"),
16794                file_name);
16795
16796       rewind (file);
16797       archive_file_size = archive_file_offset = 0;
16798       ret = process_object (file_name, file);
16799     }
16800
16801   fclose (file);
16802
16803   current_file_size = 0;
16804   return ret;
16805 }
16806
16807 #ifdef SUPPORT_DISASSEMBLY
16808 /* Needed by the i386 disassembler.  For extra credit, someone could
16809    fix this so that we insert symbolic addresses here, esp for GOT/PLT
16810    symbols.  */
16811
16812 void
16813 print_address (unsigned int addr, FILE * outfile)
16814 {
16815   fprintf (outfile,"0x%8.8x", addr);
16816 }
16817
16818 /* Needed by the i386 disassembler.  */
16819 void
16820 db_task_printsym (unsigned int addr)
16821 {
16822   print_address (addr, stderr);
16823 }
16824 #endif
16825
16826 int
16827 main (int argc, char ** argv)
16828 {
16829   int err;
16830
16831 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
16832   setlocale (LC_MESSAGES, "");
16833 #endif
16834 #if defined (HAVE_SETLOCALE)
16835   setlocale (LC_CTYPE, "");
16836 #endif
16837   bindtextdomain (PACKAGE, LOCALEDIR);
16838   textdomain (PACKAGE);
16839
16840   expandargv (&argc, &argv);
16841
16842   parse_args (argc, argv);
16843
16844   if (num_dump_sects > 0)
16845     {
16846       /* Make a copy of the dump_sects array.  */
16847       cmdline_dump_sects = (dump_type *)
16848           malloc (num_dump_sects * sizeof (* dump_sects));
16849       if (cmdline_dump_sects == NULL)
16850         error (_("Out of memory allocating dump request table.\n"));
16851       else
16852         {
16853           memcpy (cmdline_dump_sects, dump_sects,
16854                   num_dump_sects * sizeof (* dump_sects));
16855           num_cmdline_dump_sects = num_dump_sects;
16856         }
16857     }
16858
16859   if (optind < (argc - 1))
16860     show_name = 1;
16861   else if (optind >= argc)
16862     {
16863       warn (_("Nothing to do.\n"));
16864       usage (stderr);
16865     }
16866
16867   err = 0;
16868   while (optind < argc)
16869     err |= process_file (argv[optind++]);
16870
16871   if (dump_sects != NULL)
16872     free (dump_sects);
16873   if (cmdline_dump_sects != NULL)
16874     free (cmdline_dump_sects);
16875
16876   return err;
16877 }