More fixes for memory access violations exposed by fuzzed binaries.
[external/binutils.git] / binutils / readelf.c
1 /* readelf.c -- display contents of an ELF format file
2    Copyright (C) 1998-2014 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 #ifdef HAVE_ZLIB_H
47 #include <zlib.h>
48 #endif
49 #ifdef HAVE_WCHAR_H
50 #include <wchar.h>
51 #endif
52
53 #if __GNUC__ >= 2
54 /* Define BFD64 here, even if our default architecture is 32 bit ELF
55    as this will allow us to read in and parse 64bit and 32bit ELF files.
56    Only do this if we believe that the compiler can support a 64 bit
57    data type.  For now we only rely on GCC being able to do this.  */
58 #define BFD64
59 #endif
60
61 #include "bfd.h"
62 #include "bucomm.h"
63 #include "elfcomm.h"
64 #include "dwarf.h"
65
66 #include "elf/common.h"
67 #include "elf/external.h"
68 #include "elf/internal.h"
69
70
71 /* Included here, before RELOC_MACROS_GEN_FUNC is defined, so that
72    we can obtain the H8 reloc numbers.  We need these for the
73    get_reloc_size() function.  We include h8.h again after defining
74    RELOC_MACROS_GEN_FUNC so that we get the naming function as well.  */
75
76 #include "elf/h8.h"
77 #undef _ELF_H8_H
78
79 /* Undo the effects of #including reloc-macros.h.  */
80
81 #undef START_RELOC_NUMBERS
82 #undef RELOC_NUMBER
83 #undef FAKE_RELOC
84 #undef EMPTY_RELOC
85 #undef END_RELOC_NUMBERS
86 #undef _RELOC_MACROS_H
87
88 /* The following headers use the elf/reloc-macros.h file to
89    automatically generate relocation recognition functions
90    such as elf_mips_reloc_type()  */
91
92 #define RELOC_MACROS_GEN_FUNC
93
94 #include "elf/aarch64.h"
95 #include "elf/alpha.h"
96 #include "elf/arc.h"
97 #include "elf/arm.h"
98 #include "elf/avr.h"
99 #include "elf/bfin.h"
100 #include "elf/cr16.h"
101 #include "elf/cris.h"
102 #include "elf/crx.h"
103 #include "elf/d10v.h"
104 #include "elf/d30v.h"
105 #include "elf/dlx.h"
106 #include "elf/epiphany.h"
107 #include "elf/fr30.h"
108 #include "elf/frv.h"
109 #include "elf/h8.h"
110 #include "elf/hppa.h"
111 #include "elf/i386.h"
112 #include "elf/i370.h"
113 #include "elf/i860.h"
114 #include "elf/i960.h"
115 #include "elf/ia64.h"
116 #include "elf/ip2k.h"
117 #include "elf/lm32.h"
118 #include "elf/iq2000.h"
119 #include "elf/m32c.h"
120 #include "elf/m32r.h"
121 #include "elf/m68k.h"
122 #include "elf/m68hc11.h"
123 #include "elf/mcore.h"
124 #include "elf/mep.h"
125 #include "elf/metag.h"
126 #include "elf/microblaze.h"
127 #include "elf/mips.h"
128 #include "elf/mmix.h"
129 #include "elf/mn10200.h"
130 #include "elf/mn10300.h"
131 #include "elf/moxie.h"
132 #include "elf/mt.h"
133 #include "elf/msp430.h"
134 #include "elf/nds32.h"
135 #include "elf/nios2.h"
136 #include "elf/or1k.h"
137 #include "elf/pj.h"
138 #include "elf/ppc.h"
139 #include "elf/ppc64.h"
140 #include "elf/rl78.h"
141 #include "elf/rx.h"
142 #include "elf/s390.h"
143 #include "elf/score.h"
144 #include "elf/sh.h"
145 #include "elf/sparc.h"
146 #include "elf/spu.h"
147 #include "elf/tic6x.h"
148 #include "elf/tilegx.h"
149 #include "elf/tilepro.h"
150 #include "elf/v850.h"
151 #include "elf/vax.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 char * program_name = "readelf";
168 static unsigned long archive_file_offset;
169 static unsigned long archive_file_size;
170 static bfd_size_type current_file_size;
171 static unsigned long dynamic_addr;
172 static bfd_size_type dynamic_size;
173 static size_t dynamic_nent;
174 static char * dynamic_strings;
175 static unsigned long dynamic_strings_length;
176 static char * string_table;
177 static unsigned long string_table_length;
178 static unsigned long num_dynamic_syms;
179 static Elf_Internal_Sym * dynamic_symbols;
180 static Elf_Internal_Syminfo * dynamic_syminfo;
181 static unsigned long dynamic_syminfo_offset;
182 static unsigned int dynamic_syminfo_nent;
183 static char program_interpreter[PATH_MAX];
184 static bfd_vma dynamic_info[DT_ENCODING];
185 static bfd_vma dynamic_info_DT_GNU_HASH;
186 static bfd_vma version_info[16];
187 static Elf_Internal_Ehdr elf_header;
188 static Elf_Internal_Shdr * section_headers;
189 static Elf_Internal_Phdr * program_headers;
190 static Elf_Internal_Dyn *  dynamic_section;
191 static Elf_Internal_Shdr * symtab_shndx_hdr;
192 static int show_name;
193 static int do_dynamic;
194 static int do_syms;
195 static int do_dyn_syms;
196 static int do_reloc;
197 static int do_sections;
198 static int do_section_groups;
199 static int do_section_details;
200 static int do_segments;
201 static int do_unwind;
202 static int do_using_dynamic;
203 static int do_header;
204 static int do_dump;
205 static int do_version;
206 static int do_histogram;
207 static int do_debugging;
208 static int do_arch;
209 static int do_notes;
210 static int do_archive_index;
211 static int is_32bit_elf;
212
213 struct group_list
214 {
215   struct group_list * next;
216   unsigned int section_index;
217 };
218
219 struct group
220 {
221   struct group_list * root;
222   unsigned int group_index;
223 };
224
225 static size_t group_count;
226 static struct group * section_groups;
227 static struct group ** section_headers_groups;
228
229
230 /* Flag bits indicating particular types of dump.  */
231 #define HEX_DUMP        (1 << 0)        /* The -x command line switch.  */
232 #define DISASS_DUMP     (1 << 1)        /* The -i command line switch.  */
233 #define DEBUG_DUMP      (1 << 2)        /* The -w command line switch.  */
234 #define STRING_DUMP     (1 << 3)        /* The -p command line switch.  */
235 #define RELOC_DUMP      (1 << 4)        /* The -R command line switch.  */
236
237 typedef unsigned char dump_type;
238
239 /* A linked list of the section names for which dumps were requested.  */
240 struct dump_list_entry
241 {
242   char * name;
243   dump_type type;
244   struct dump_list_entry * next;
245 };
246 static struct dump_list_entry * dump_sects_byname;
247
248 /* A dynamic array of flags indicating for which sections a dump
249    has been requested via command line switches.  */
250 static dump_type *   cmdline_dump_sects = NULL;
251 static unsigned int  num_cmdline_dump_sects = 0;
252
253 /* A dynamic array of flags indicating for which sections a dump of
254    some kind has been requested.  It is reset on a per-object file
255    basis and then initialised from the cmdline_dump_sects array,
256    the results of interpreting the -w switch, and the
257    dump_sects_byname list.  */
258 static dump_type *   dump_sects = NULL;
259 static unsigned int  num_dump_sects = 0;
260
261
262 /* How to print a vma value.  */
263 typedef enum print_mode
264 {
265   HEX,
266   DEC,
267   DEC_5,
268   UNSIGNED,
269   PREFIX_HEX,
270   FULL_HEX,
271   LONG_HEX
272 }
273 print_mode;
274
275 /* Versioned symbol info.  */
276 enum versioned_symbol_info
277 {
278   symbol_undefined,
279   symbol_hidden,
280   symbol_public
281 };
282
283 static const char *get_symbol_version_string
284   (FILE *file, int is_dynsym, const char *strtab,
285    unsigned long int strtab_size, unsigned int si,
286    Elf_Internal_Sym *psym, enum versioned_symbol_info *sym_info,
287    unsigned short *vna_other);
288
289 #define UNKNOWN -1
290
291 #define SECTION_NAME(X)                                         \
292   ((X) == NULL ? _("<none>")                                    \
293    : string_table == NULL ? _("<no-name>")                      \
294    : ((X)->sh_name >= string_table_length ? _("<corrupt>")      \
295   : string_table + (X)->sh_name))
296
297 #define DT_VERSIONTAGIDX(tag)   (DT_VERNEEDNUM - (tag)) /* Reverse order!  */
298
299 #define GET_ELF_SYMBOLS(file, section, sym_count)                       \
300   (is_32bit_elf ? get_32bit_elf_symbols (file, section, sym_count)      \
301    : get_64bit_elf_symbols (file, section, sym_count))
302
303 #define VALID_DYNAMIC_NAME(offset)      ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
304 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
305    already been called and verified that the string exists.  */
306 #define GET_DYNAMIC_NAME(offset)        (dynamic_strings + offset)
307
308 #define REMOVE_ARCH_BITS(ADDR)                  \
309   do                                            \
310     {                                           \
311       if (elf_header.e_machine == EM_ARM)       \
312         (ADDR) &= ~1;                           \
313     }                                           \
314   while (0)
315 \f
316 /* Retrieve NMEMB structures, each SIZE bytes long from FILE starting at OFFSET +
317    the offset of the current archive member, if we are examining an archive.
318    Put the retrieved data into VAR, if it is not NULL.  Otherwise allocate a buffer
319    using malloc and fill that.  In either case return the pointer to the start of
320    the retrieved data or NULL if something went wrong.  If something does go wrong
321    and REASON is not NULL then emit an error message using REASON as part of the
322    context.  */
323
324 static void *
325 get_data (void * var, FILE * file, unsigned long offset, size_t size, size_t nmemb,
326           const char * reason)
327 {
328   void * mvar;
329   size_t amt = size * nmemb;
330
331   if (size == 0 || nmemb == 0)
332     return NULL;
333
334   /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
335      attempting to allocate memory when the read is bound to fail.  */
336   if (amt > current_file_size
337       || offset + archive_file_offset + amt > current_file_size)
338     {
339       if (reason)
340         error (_("Reading 0x%lx bytes extends past end of file for %s\n"),
341                (unsigned long) amt, reason);
342       return NULL;
343     }
344
345   if (fseek (file, archive_file_offset + offset, SEEK_SET))
346     {
347       if (reason)
348         error (_("Unable to seek to 0x%lx for %s\n"),
349                (unsigned long) archive_file_offset + offset, reason);
350       return NULL;
351     }
352
353   mvar = var;
354   if (mvar == NULL)
355     {
356       /* Check for overflow.  */
357       if (nmemb < (~(size_t) 0 - 1) / size)
358         /* + 1 so that we can '\0' terminate invalid string table sections.  */
359         mvar = malloc (size * nmemb + 1);
360
361       if (mvar == NULL)
362         {
363           if (reason)
364             error (_("Out of memory allocating 0x%lx bytes for %s\n"),
365                    (unsigned long)(size * nmemb), reason);
366           return NULL;
367         }
368
369       ((char *) mvar)[amt] = '\0';
370     }
371
372   if (fread (mvar, size, nmemb, file) != nmemb)
373     {
374       if (reason)
375         error (_("Unable to read in 0x%lx bytes of %s\n"),
376                (unsigned long) amt, reason);
377       if (mvar != var)
378         free (mvar);
379       return NULL;
380     }
381
382   return mvar;
383 }
384
385 /* Print a VMA value.  */
386
387 static int
388 print_vma (bfd_vma vma, print_mode mode)
389 {
390   int nc = 0;
391
392   switch (mode)
393     {
394     case FULL_HEX:
395       nc = printf ("0x");
396       /* Drop through.  */
397
398     case LONG_HEX:
399 #ifdef BFD64
400       if (is_32bit_elf)
401         return nc + printf ("%8.8" BFD_VMA_FMT "x", vma);
402 #endif
403       printf_vma (vma);
404       return nc + 16;
405
406     case DEC_5:
407       if (vma <= 99999)
408         return printf ("%5" BFD_VMA_FMT "d", vma);
409       /* Drop through.  */
410
411     case PREFIX_HEX:
412       nc = printf ("0x");
413       /* Drop through.  */
414
415     case HEX:
416       return nc + printf ("%" BFD_VMA_FMT "x", vma);
417
418     case DEC:
419       return printf ("%" BFD_VMA_FMT "d", vma);
420
421     case UNSIGNED:
422       return printf ("%" BFD_VMA_FMT "u", vma);
423     }
424   return 0;
425 }
426
427 /* Display a symbol on stdout.  Handles the display of control characters and
428    multibye characters (assuming the host environment supports them).
429
430    Display at most abs(WIDTH) characters, truncating as necessary, unless do_wide is true.
431
432    If WIDTH is negative then ensure that the output is at least (- WIDTH) characters,
433    padding as necessary.
434
435    Returns the number of emitted characters.  */
436
437 static unsigned int
438 print_symbol (int width, const char *symbol)
439 {
440   bfd_boolean extra_padding = FALSE;
441   int num_printed = 0;
442 #ifdef HAVE_MBSTATE_T
443   mbstate_t state;
444 #endif
445   int width_remaining;
446
447   if (width < 0)
448     {
449       /* Keep the width positive.  This also helps.  */
450       width = - width;
451       extra_padding = TRUE;
452     }
453   assert (width != 0);
454
455   if (do_wide)
456     /* Set the remaining width to a very large value.
457        This simplifies the code below.  */
458     width_remaining = INT_MAX;
459   else
460     width_remaining = width;
461
462 #ifdef HAVE_MBSTATE_T
463   /* Initialise the multibyte conversion state.  */
464   memset (& state, 0, sizeof (state));
465 #endif
466
467   while (width_remaining)
468     {
469       size_t  n;
470       const char c = *symbol++;
471
472       if (c == 0)
473         break;
474
475       /* Do not print control characters directly as they can affect terminal
476          settings.  Such characters usually appear in the names generated
477          by the assembler for local labels.  */
478       if (ISCNTRL (c))
479         {
480           if (width_remaining < 2)
481             break;
482
483           printf ("^%c", c + 0x40);
484           width_remaining -= 2;
485           num_printed += 2;
486         }
487       else if (ISPRINT (c))
488         {
489           putchar (c);
490           width_remaining --;
491           num_printed ++;
492         }
493       else
494         {
495 #ifdef HAVE_MBSTATE_T
496           wchar_t w;
497 #endif
498           /* Let printf do the hard work of displaying multibyte characters.  */
499           printf ("%.1s", symbol - 1);
500           width_remaining --;
501           num_printed ++;
502
503 #ifdef HAVE_MBSTATE_T
504           /* Try to find out how many bytes made up the character that was
505              just printed.  Advance the symbol pointer past the bytes that
506              were displayed.  */
507           n = mbrtowc (& w, symbol - 1, MB_CUR_MAX, & state);
508 #else
509           n = 1;
510 #endif
511           if (n != (size_t) -1 && n != (size_t) -2 && n > 0)
512             symbol += (n - 1);
513         }
514     }
515
516   if (extra_padding && num_printed < width)
517     {
518       /* Fill in the remaining spaces.  */
519       printf ("%-*s", width - num_printed, " ");
520       num_printed = width;
521     }
522
523   return num_printed;
524 }
525
526 /* Returns a pointer to a static buffer containing a  printable version of
527    the given section's name.  Like print_symbol, except that it does not try
528    to print multibyte characters, it just interprets them as hex values.  */
529
530 static const char *
531 printable_section_name (Elf_Internal_Shdr * sec)
532 {
533 #define MAX_PRINT_SEC_NAME_LEN 128
534   static char  sec_name_buf [MAX_PRINT_SEC_NAME_LEN + 1];
535   const char * name = SECTION_NAME (sec);
536   char *       buf = sec_name_buf;
537   char         c;
538   unsigned int remaining = MAX_PRINT_SEC_NAME_LEN;
539
540   while ((c = * name ++) != 0)
541     {
542       if (ISCNTRL (c))
543         {
544           if (remaining < 2)
545             break;
546           
547           * buf ++ = '^';
548           * buf ++ = c + 0x40;
549           remaining -= 2;
550         }
551       else if (ISPRINT (c))
552         {
553           * buf ++ = c;
554           remaining -= 1;
555         }
556       else
557         {
558           static char hex[17] = "0123456789ABCDEF";
559
560           if (remaining < 4)
561             break;
562           * buf ++ = '<';
563           * buf ++ = hex[(c & 0xf0) >> 4];
564           * buf ++ = hex[c & 0x0f];
565           * buf ++ = '>';
566           remaining -= 4;
567         }
568
569       if (remaining == 0)
570         break;
571     }
572
573   * buf = 0;
574   return sec_name_buf;
575 }
576
577 static const char *
578 printable_section_name_from_index (unsigned long ndx)
579 {
580   if (ndx >= elf_header.e_shnum)
581     return _("<corrupt>");
582
583   return printable_section_name (section_headers + ndx);
584 }
585
586 /* Return a pointer to section NAME, or NULL if no such section exists.  */
587
588 static Elf_Internal_Shdr *
589 find_section (const char * name)
590 {
591   unsigned int i;
592
593   for (i = 0; i < elf_header.e_shnum; i++)
594     if (streq (SECTION_NAME (section_headers + i), name))
595       return section_headers + i;
596
597   return NULL;
598 }
599
600 /* Return a pointer to a section containing ADDR, or NULL if no such
601    section exists.  */
602
603 static Elf_Internal_Shdr *
604 find_section_by_address (bfd_vma addr)
605 {
606   unsigned int i;
607
608   for (i = 0; i < elf_header.e_shnum; i++)
609     {
610       Elf_Internal_Shdr *sec = section_headers + i;
611       if (addr >= sec->sh_addr && addr < sec->sh_addr + sec->sh_size)
612         return sec;
613     }
614
615   return NULL;
616 }
617
618 static Elf_Internal_Shdr *
619 find_section_by_type (unsigned int type)
620 {
621   unsigned int i;
622
623   for (i = 0; i < elf_header.e_shnum; i++)
624     {
625       Elf_Internal_Shdr *sec = section_headers + i;
626       if (sec->sh_type == type)
627         return sec;
628     }
629
630   return NULL;
631 }
632
633 /* Return a pointer to section NAME, or NULL if no such section exists,
634    restricted to the list of sections given in SET.  */
635
636 static Elf_Internal_Shdr *
637 find_section_in_set (const char * name, unsigned int * set)
638 {
639   unsigned int i;
640
641   if (set != NULL)
642     {
643       while ((i = *set++) > 0)
644         if (streq (SECTION_NAME (section_headers + i), name))
645           return section_headers + i;
646     }
647
648   return find_section (name);
649 }
650
651 /* Read an unsigned LEB128 encoded value from p.  Set *PLEN to the number of
652    bytes read.  */
653
654 static inline unsigned long
655 read_uleb128 (unsigned char *data,
656               unsigned int *length_return,
657               const unsigned char * const end)
658 {
659   return read_leb128 (data, length_return, FALSE, end);
660 }
661
662 /* Return true if the current file is for IA-64 machine and OpenVMS ABI.
663    This OS has so many departures from the ELF standard that we test it at
664    many places.  */
665
666 static inline int
667 is_ia64_vms (void)
668 {
669   return elf_header.e_machine == EM_IA_64
670     && elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS;
671 }
672
673 /* Guess the relocation size commonly used by the specific machines.  */
674
675 static int
676 guess_is_rela (unsigned int e_machine)
677 {
678   switch (e_machine)
679     {
680       /* Targets that use REL relocations.  */
681     case EM_386:
682     case EM_486:
683     case EM_960:
684     case EM_ARM:
685     case EM_D10V:
686     case EM_CYGNUS_D10V:
687     case EM_DLX:
688     case EM_MIPS:
689     case EM_MIPS_RS3_LE:
690     case EM_CYGNUS_M32R:
691     case EM_SCORE:
692     case EM_XGATE:
693       return FALSE;
694
695       /* Targets that use RELA relocations.  */
696     case EM_68K:
697     case EM_860:
698     case EM_AARCH64:
699     case EM_ADAPTEVA_EPIPHANY:
700     case EM_ALPHA:
701     case EM_ALTERA_NIOS2:
702     case EM_AVR:
703     case EM_AVR_OLD:
704     case EM_BLACKFIN:
705     case EM_CR16:
706     case EM_CRIS:
707     case EM_CRX:
708     case EM_D30V:
709     case EM_CYGNUS_D30V:
710     case EM_FR30:
711     case EM_CYGNUS_FR30:
712     case EM_CYGNUS_FRV:
713     case EM_H8S:
714     case EM_H8_300:
715     case EM_H8_300H:
716     case EM_IA_64:
717     case EM_IP2K:
718     case EM_IP2K_OLD:
719     case EM_IQ2000:
720     case EM_LATTICEMICO32:
721     case EM_M32C_OLD:
722     case EM_M32C:
723     case EM_M32R:
724     case EM_MCORE:
725     case EM_CYGNUS_MEP:
726     case EM_METAG:
727     case EM_MMIX:
728     case EM_MN10200:
729     case EM_CYGNUS_MN10200:
730     case EM_MN10300:
731     case EM_CYGNUS_MN10300:
732     case EM_MOXIE:
733     case EM_MSP430:
734     case EM_MSP430_OLD:
735     case EM_MT:
736     case EM_NDS32:
737     case EM_NIOS32:
738     case EM_OR1K:
739     case EM_PPC64:
740     case EM_PPC:
741     case EM_RL78:
742     case EM_RX:
743     case EM_S390:
744     case EM_S390_OLD:
745     case EM_SH:
746     case EM_SPARC:
747     case EM_SPARC32PLUS:
748     case EM_SPARCV9:
749     case EM_SPU:
750     case EM_TI_C6000:
751     case EM_TILEGX:
752     case EM_TILEPRO:
753     case EM_V800:
754     case EM_V850:
755     case EM_CYGNUS_V850:
756     case EM_VAX:
757     case EM_X86_64:
758     case EM_L1OM:
759     case EM_K1OM:
760     case EM_XSTORMY16:
761     case EM_XTENSA:
762     case EM_XTENSA_OLD:
763     case EM_MICROBLAZE:
764     case EM_MICROBLAZE_OLD:
765       return TRUE;
766
767     case EM_68HC05:
768     case EM_68HC08:
769     case EM_68HC11:
770     case EM_68HC16:
771     case EM_FX66:
772     case EM_ME16:
773     case EM_MMA:
774     case EM_NCPU:
775     case EM_NDR1:
776     case EM_PCP:
777     case EM_ST100:
778     case EM_ST19:
779     case EM_ST7:
780     case EM_ST9PLUS:
781     case EM_STARCORE:
782     case EM_SVX:
783     case EM_TINYJ:
784     default:
785       warn (_("Don't know about relocations on this machine architecture\n"));
786       return FALSE;
787     }
788 }
789
790 static int
791 slurp_rela_relocs (FILE * file,
792                    unsigned long rel_offset,
793                    unsigned long rel_size,
794                    Elf_Internal_Rela ** relasp,
795                    unsigned long * nrelasp)
796 {
797   Elf_Internal_Rela * relas;
798   size_t nrelas;
799   unsigned int i;
800
801   if (is_32bit_elf)
802     {
803       Elf32_External_Rela * erelas;
804
805       erelas = (Elf32_External_Rela *) get_data (NULL, file, rel_offset, 1,
806                                                  rel_size, _("32-bit relocation data"));
807       if (!erelas)
808         return 0;
809
810       nrelas = rel_size / sizeof (Elf32_External_Rela);
811
812       relas = (Elf_Internal_Rela *) cmalloc (nrelas,
813                                              sizeof (Elf_Internal_Rela));
814
815       if (relas == NULL)
816         {
817           free (erelas);
818           error (_("out of memory parsing relocs\n"));
819           return 0;
820         }
821
822       for (i = 0; i < nrelas; i++)
823         {
824           relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
825           relas[i].r_info   = BYTE_GET (erelas[i].r_info);
826           relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
827         }
828
829       free (erelas);
830     }
831   else
832     {
833       Elf64_External_Rela * erelas;
834
835       erelas = (Elf64_External_Rela *) get_data (NULL, file, rel_offset, 1,
836                                                  rel_size, _("64-bit relocation data"));
837       if (!erelas)
838         return 0;
839
840       nrelas = rel_size / sizeof (Elf64_External_Rela);
841
842       relas = (Elf_Internal_Rela *) cmalloc (nrelas,
843                                              sizeof (Elf_Internal_Rela));
844
845       if (relas == NULL)
846         {
847           free (erelas);
848           error (_("out of memory parsing relocs\n"));
849           return 0;
850         }
851
852       for (i = 0; i < nrelas; i++)
853         {
854           relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
855           relas[i].r_info   = BYTE_GET (erelas[i].r_info);
856           relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
857
858           /* The #ifdef BFD64 below is to prevent a compile time
859              warning.  We know that if we do not have a 64 bit data
860              type that we will never execute this code anyway.  */
861 #ifdef BFD64
862           if (elf_header.e_machine == EM_MIPS
863               && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
864             {
865               /* In little-endian objects, r_info isn't really a
866                  64-bit little-endian value: it has a 32-bit
867                  little-endian symbol index followed by four
868                  individual byte fields.  Reorder INFO
869                  accordingly.  */
870               bfd_vma inf = relas[i].r_info;
871               inf = (((inf & 0xffffffff) << 32)
872                       | ((inf >> 56) & 0xff)
873                       | ((inf >> 40) & 0xff00)
874                       | ((inf >> 24) & 0xff0000)
875                       | ((inf >> 8) & 0xff000000));
876               relas[i].r_info = inf;
877             }
878 #endif /* BFD64 */
879         }
880
881       free (erelas);
882     }
883   *relasp = relas;
884   *nrelasp = nrelas;
885   return 1;
886 }
887
888 static int
889 slurp_rel_relocs (FILE * file,
890                   unsigned long rel_offset,
891                   unsigned long rel_size,
892                   Elf_Internal_Rela ** relsp,
893                   unsigned long * nrelsp)
894 {
895   Elf_Internal_Rela * rels;
896   size_t nrels;
897   unsigned int i;
898
899   if (is_32bit_elf)
900     {
901       Elf32_External_Rel * erels;
902
903       erels = (Elf32_External_Rel *) get_data (NULL, file, rel_offset, 1,
904                                                rel_size, _("32-bit relocation data"));
905       if (!erels)
906         return 0;
907
908       nrels = rel_size / sizeof (Elf32_External_Rel);
909
910       rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
911
912       if (rels == NULL)
913         {
914           free (erels);
915           error (_("out of memory parsing relocs\n"));
916           return 0;
917         }
918
919       for (i = 0; i < nrels; i++)
920         {
921           rels[i].r_offset = BYTE_GET (erels[i].r_offset);
922           rels[i].r_info   = BYTE_GET (erels[i].r_info);
923           rels[i].r_addend = 0;
924         }
925
926       free (erels);
927     }
928   else
929     {
930       Elf64_External_Rel * erels;
931
932       erels = (Elf64_External_Rel *) get_data (NULL, file, rel_offset, 1,
933                                                rel_size, _("64-bit relocation data"));
934       if (!erels)
935         return 0;
936
937       nrels = rel_size / sizeof (Elf64_External_Rel);
938
939       rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
940
941       if (rels == NULL)
942         {
943           free (erels);
944           error (_("out of memory parsing relocs\n"));
945           return 0;
946         }
947
948       for (i = 0; i < nrels; i++)
949         {
950           rels[i].r_offset = BYTE_GET (erels[i].r_offset);
951           rels[i].r_info   = BYTE_GET (erels[i].r_info);
952           rels[i].r_addend = 0;
953
954           /* The #ifdef BFD64 below is to prevent a compile time
955              warning.  We know that if we do not have a 64 bit data
956              type that we will never execute this code anyway.  */
957 #ifdef BFD64
958           if (elf_header.e_machine == EM_MIPS
959               && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
960             {
961               /* In little-endian objects, r_info isn't really a
962                  64-bit little-endian value: it has a 32-bit
963                  little-endian symbol index followed by four
964                  individual byte fields.  Reorder INFO
965                  accordingly.  */
966               bfd_vma inf = rels[i].r_info;
967               inf = (((inf & 0xffffffff) << 32)
968                      | ((inf >> 56) & 0xff)
969                      | ((inf >> 40) & 0xff00)
970                      | ((inf >> 24) & 0xff0000)
971                      | ((inf >> 8) & 0xff000000));
972               rels[i].r_info = inf;
973             }
974 #endif /* BFD64 */
975         }
976
977       free (erels);
978     }
979   *relsp = rels;
980   *nrelsp = nrels;
981   return 1;
982 }
983
984 /* Returns the reloc type extracted from the reloc info field.  */
985
986 static unsigned int
987 get_reloc_type (bfd_vma reloc_info)
988 {
989   if (is_32bit_elf)
990     return ELF32_R_TYPE (reloc_info);
991
992   switch (elf_header.e_machine)
993     {
994     case EM_MIPS:
995       /* Note: We assume that reloc_info has already been adjusted for us.  */
996       return ELF64_MIPS_R_TYPE (reloc_info);
997
998     case EM_SPARCV9:
999       return ELF64_R_TYPE_ID (reloc_info);
1000
1001     default:
1002       return ELF64_R_TYPE (reloc_info);
1003     }
1004 }
1005
1006 /* Return the symbol index extracted from the reloc info field.  */
1007
1008 static bfd_vma
1009 get_reloc_symindex (bfd_vma reloc_info)
1010 {
1011   return is_32bit_elf ? ELF32_R_SYM (reloc_info) : ELF64_R_SYM (reloc_info);
1012 }
1013
1014 static inline bfd_boolean
1015 uses_msp430x_relocs (void)
1016 {
1017   return
1018     elf_header.e_machine == EM_MSP430 /* Paranoia.  */
1019     /* GCC uses osabi == ELFOSBI_STANDALONE.  */
1020     && (((elf_header.e_flags & EF_MSP430_MACH) == E_MSP430_MACH_MSP430X)
1021         /* TI compiler uses ELFOSABI_NONE.  */
1022         || (elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE));
1023 }
1024
1025 /* Display the contents of the relocation data found at the specified
1026    offset.  */
1027
1028 static void
1029 dump_relocations (FILE * file,
1030                   unsigned long rel_offset,
1031                   unsigned long rel_size,
1032                   Elf_Internal_Sym * symtab,
1033                   unsigned long nsyms,
1034                   char * strtab,
1035                   unsigned long strtablen,
1036                   int is_rela,
1037                   int is_dynsym)
1038 {
1039   unsigned int i;
1040   Elf_Internal_Rela * rels;
1041
1042   if (is_rela == UNKNOWN)
1043     is_rela = guess_is_rela (elf_header.e_machine);
1044
1045   if (is_rela)
1046     {
1047       if (!slurp_rela_relocs (file, rel_offset, rel_size, &rels, &rel_size))
1048         return;
1049     }
1050   else
1051     {
1052       if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
1053         return;
1054     }
1055
1056   if (is_32bit_elf)
1057     {
1058       if (is_rela)
1059         {
1060           if (do_wide)
1061             printf (_(" Offset     Info    Type                Sym. Value  Symbol's Name + Addend\n"));
1062           else
1063             printf (_(" Offset     Info    Type            Sym.Value  Sym. Name + Addend\n"));
1064         }
1065       else
1066         {
1067           if (do_wide)
1068             printf (_(" Offset     Info    Type                Sym. Value  Symbol's Name\n"));
1069           else
1070             printf (_(" Offset     Info    Type            Sym.Value  Sym. Name\n"));
1071         }
1072     }
1073   else
1074     {
1075       if (is_rela)
1076         {
1077           if (do_wide)
1078             printf (_("    Offset             Info             Type               Symbol's Value  Symbol's Name + Addend\n"));
1079           else
1080             printf (_("  Offset          Info           Type           Sym. Value    Sym. Name + Addend\n"));
1081         }
1082       else
1083         {
1084           if (do_wide)
1085             printf (_("    Offset             Info             Type               Symbol's Value  Symbol's Name\n"));
1086           else
1087             printf (_("  Offset          Info           Type           Sym. Value    Sym. Name\n"));
1088         }
1089     }
1090
1091   for (i = 0; i < rel_size; i++)
1092     {
1093       const char * rtype;
1094       bfd_vma offset;
1095       bfd_vma inf;
1096       bfd_vma symtab_index;
1097       bfd_vma type;
1098
1099       offset = rels[i].r_offset;
1100       inf    = rels[i].r_info;
1101
1102       type = get_reloc_type (inf);
1103       symtab_index = get_reloc_symindex  (inf);
1104
1105       if (is_32bit_elf)
1106         {
1107           printf ("%8.8lx  %8.8lx ",
1108                   (unsigned long) offset & 0xffffffff,
1109                   (unsigned long) inf & 0xffffffff);
1110         }
1111       else
1112         {
1113 #if BFD_HOST_64BIT_LONG
1114           printf (do_wide
1115                   ? "%16.16lx  %16.16lx "
1116                   : "%12.12lx  %12.12lx ",
1117                   offset, inf);
1118 #elif BFD_HOST_64BIT_LONG_LONG
1119 #ifndef __MSVCRT__
1120           printf (do_wide
1121                   ? "%16.16llx  %16.16llx "
1122                   : "%12.12llx  %12.12llx ",
1123                   offset, inf);
1124 #else
1125           printf (do_wide
1126                   ? "%16.16I64x  %16.16I64x "
1127                   : "%12.12I64x  %12.12I64x ",
1128                   offset, inf);
1129 #endif
1130 #else
1131           printf (do_wide
1132                   ? "%8.8lx%8.8lx  %8.8lx%8.8lx "
1133                   : "%4.4lx%8.8lx  %4.4lx%8.8lx ",
1134                   _bfd_int64_high (offset),
1135                   _bfd_int64_low (offset),
1136                   _bfd_int64_high (inf),
1137                   _bfd_int64_low (inf));
1138 #endif
1139         }
1140
1141       switch (elf_header.e_machine)
1142         {
1143         default:
1144           rtype = NULL;
1145           break;
1146
1147         case EM_AARCH64:
1148           rtype = elf_aarch64_reloc_type (type);
1149           break;
1150
1151         case EM_M32R:
1152         case EM_CYGNUS_M32R:
1153           rtype = elf_m32r_reloc_type (type);
1154           break;
1155
1156         case EM_386:
1157         case EM_486:
1158           rtype = elf_i386_reloc_type (type);
1159           break;
1160
1161         case EM_68HC11:
1162         case EM_68HC12:
1163           rtype = elf_m68hc11_reloc_type (type);
1164           break;
1165
1166         case EM_68K:
1167           rtype = elf_m68k_reloc_type (type);
1168           break;
1169
1170         case EM_960:
1171           rtype = elf_i960_reloc_type (type);
1172           break;
1173
1174         case EM_AVR:
1175         case EM_AVR_OLD:
1176           rtype = elf_avr_reloc_type (type);
1177           break;
1178
1179         case EM_OLD_SPARCV9:
1180         case EM_SPARC32PLUS:
1181         case EM_SPARCV9:
1182         case EM_SPARC:
1183           rtype = elf_sparc_reloc_type (type);
1184           break;
1185
1186         case EM_SPU:
1187           rtype = elf_spu_reloc_type (type);
1188           break;
1189
1190         case EM_V800:
1191           rtype = v800_reloc_type (type);
1192           break;
1193         case EM_V850:
1194         case EM_CYGNUS_V850:
1195           rtype = v850_reloc_type (type);
1196           break;
1197
1198         case EM_D10V:
1199         case EM_CYGNUS_D10V:
1200           rtype = elf_d10v_reloc_type (type);
1201           break;
1202
1203         case EM_D30V:
1204         case EM_CYGNUS_D30V:
1205           rtype = elf_d30v_reloc_type (type);
1206           break;
1207
1208         case EM_DLX:
1209           rtype = elf_dlx_reloc_type (type);
1210           break;
1211
1212         case EM_SH:
1213           rtype = elf_sh_reloc_type (type);
1214           break;
1215
1216         case EM_MN10300:
1217         case EM_CYGNUS_MN10300:
1218           rtype = elf_mn10300_reloc_type (type);
1219           break;
1220
1221         case EM_MN10200:
1222         case EM_CYGNUS_MN10200:
1223           rtype = elf_mn10200_reloc_type (type);
1224           break;
1225
1226         case EM_FR30:
1227         case EM_CYGNUS_FR30:
1228           rtype = elf_fr30_reloc_type (type);
1229           break;
1230
1231         case EM_CYGNUS_FRV:
1232           rtype = elf_frv_reloc_type (type);
1233           break;
1234
1235         case EM_MCORE:
1236           rtype = elf_mcore_reloc_type (type);
1237           break;
1238
1239         case EM_MMIX:
1240           rtype = elf_mmix_reloc_type (type);
1241           break;
1242
1243         case EM_MOXIE:
1244           rtype = elf_moxie_reloc_type (type);
1245           break;
1246
1247         case EM_MSP430:
1248           if (uses_msp430x_relocs ())
1249             {
1250               rtype = elf_msp430x_reloc_type (type);
1251               break;
1252             }
1253         case EM_MSP430_OLD:
1254           rtype = elf_msp430_reloc_type (type);
1255           break;
1256
1257         case EM_NDS32:
1258           rtype = elf_nds32_reloc_type (type);
1259           break;
1260
1261         case EM_PPC:
1262           rtype = elf_ppc_reloc_type (type);
1263           break;
1264
1265         case EM_PPC64:
1266           rtype = elf_ppc64_reloc_type (type);
1267           break;
1268
1269         case EM_MIPS:
1270         case EM_MIPS_RS3_LE:
1271           rtype = elf_mips_reloc_type (type);
1272           break;
1273
1274         case EM_ALPHA:
1275           rtype = elf_alpha_reloc_type (type);
1276           break;
1277
1278         case EM_ARM:
1279           rtype = elf_arm_reloc_type (type);
1280           break;
1281
1282         case EM_ARC:
1283           rtype = elf_arc_reloc_type (type);
1284           break;
1285
1286         case EM_PARISC:
1287           rtype = elf_hppa_reloc_type (type);
1288           break;
1289
1290         case EM_H8_300:
1291         case EM_H8_300H:
1292         case EM_H8S:
1293           rtype = elf_h8_reloc_type (type);
1294           break;
1295
1296         case EM_OR1K:
1297           rtype = elf_or1k_reloc_type (type);
1298           break;
1299
1300         case EM_PJ:
1301         case EM_PJ_OLD:
1302           rtype = elf_pj_reloc_type (type);
1303           break;
1304         case EM_IA_64:
1305           rtype = elf_ia64_reloc_type (type);
1306           break;
1307
1308         case EM_CRIS:
1309           rtype = elf_cris_reloc_type (type);
1310           break;
1311
1312         case EM_860:
1313           rtype = elf_i860_reloc_type (type);
1314           break;
1315
1316         case EM_X86_64:
1317         case EM_L1OM:
1318         case EM_K1OM:
1319           rtype = elf_x86_64_reloc_type (type);
1320           break;
1321
1322         case EM_S370:
1323           rtype = i370_reloc_type (type);
1324           break;
1325
1326         case EM_S390_OLD:
1327         case EM_S390:
1328           rtype = elf_s390_reloc_type (type);
1329           break;
1330
1331         case EM_SCORE:
1332           rtype = elf_score_reloc_type (type);
1333           break;
1334
1335         case EM_XSTORMY16:
1336           rtype = elf_xstormy16_reloc_type (type);
1337           break;
1338
1339         case EM_CRX:
1340           rtype = elf_crx_reloc_type (type);
1341           break;
1342
1343         case EM_VAX:
1344           rtype = elf_vax_reloc_type (type);
1345           break;
1346
1347         case EM_ADAPTEVA_EPIPHANY:
1348           rtype = elf_epiphany_reloc_type (type);
1349           break;
1350
1351         case EM_IP2K:
1352         case EM_IP2K_OLD:
1353           rtype = elf_ip2k_reloc_type (type);
1354           break;
1355
1356         case EM_IQ2000:
1357           rtype = elf_iq2000_reloc_type (type);
1358           break;
1359
1360         case EM_XTENSA_OLD:
1361         case EM_XTENSA:
1362           rtype = elf_xtensa_reloc_type (type);
1363           break;
1364
1365         case EM_LATTICEMICO32:
1366           rtype = elf_lm32_reloc_type (type);
1367           break;
1368
1369         case EM_M32C_OLD:
1370         case EM_M32C:
1371           rtype = elf_m32c_reloc_type (type);
1372           break;
1373
1374         case EM_MT:
1375           rtype = elf_mt_reloc_type (type);
1376           break;
1377
1378         case EM_BLACKFIN:
1379           rtype = elf_bfin_reloc_type (type);
1380           break;
1381
1382         case EM_CYGNUS_MEP:
1383           rtype = elf_mep_reloc_type (type);
1384           break;
1385
1386         case EM_CR16:
1387           rtype = elf_cr16_reloc_type (type);
1388           break;
1389
1390         case EM_MICROBLAZE:
1391         case EM_MICROBLAZE_OLD:
1392           rtype = elf_microblaze_reloc_type (type);
1393           break;
1394
1395         case EM_RL78:
1396           rtype = elf_rl78_reloc_type (type);
1397           break;
1398
1399         case EM_RX:
1400           rtype = elf_rx_reloc_type (type);
1401           break;
1402
1403         case EM_METAG:
1404           rtype = elf_metag_reloc_type (type);
1405           break;
1406
1407         case EM_XC16X:
1408         case EM_C166:
1409           rtype = elf_xc16x_reloc_type (type);
1410           break;
1411
1412         case EM_TI_C6000:
1413           rtype = elf_tic6x_reloc_type (type);
1414           break;
1415
1416         case EM_TILEGX:
1417           rtype = elf_tilegx_reloc_type (type);
1418           break;
1419
1420         case EM_TILEPRO:
1421           rtype = elf_tilepro_reloc_type (type);
1422           break;
1423
1424         case EM_XGATE:
1425           rtype = elf_xgate_reloc_type (type);
1426           break;
1427
1428         case EM_ALTERA_NIOS2:
1429           rtype = elf_nios2_reloc_type (type);
1430           break;
1431         }
1432
1433       if (rtype == NULL)
1434         printf (_("unrecognized: %-7lx"), (unsigned long) type & 0xffffffff);
1435       else
1436         printf (do_wide ? "%-22.22s" : "%-17.17s", rtype);
1437
1438       if (elf_header.e_machine == EM_ALPHA
1439           && rtype != NULL
1440           && streq (rtype, "R_ALPHA_LITUSE")
1441           && is_rela)
1442         {
1443           switch (rels[i].r_addend)
1444             {
1445             case LITUSE_ALPHA_ADDR:   rtype = "ADDR";   break;
1446             case LITUSE_ALPHA_BASE:   rtype = "BASE";   break;
1447             case LITUSE_ALPHA_BYTOFF: rtype = "BYTOFF"; break;
1448             case LITUSE_ALPHA_JSR:    rtype = "JSR";    break;
1449             case LITUSE_ALPHA_TLSGD:  rtype = "TLSGD";  break;
1450             case LITUSE_ALPHA_TLSLDM: rtype = "TLSLDM"; break;
1451             case LITUSE_ALPHA_JSRDIRECT: rtype = "JSRDIRECT"; break;
1452             default: rtype = NULL;
1453             }
1454           if (rtype)
1455             printf (" (%s)", rtype);
1456           else
1457             {
1458               putchar (' ');
1459               printf (_("<unknown addend: %lx>"),
1460                       (unsigned long) rels[i].r_addend);
1461             }
1462         }
1463       else if (symtab_index)
1464         {
1465           if (symtab == NULL || symtab_index >= nsyms)
1466             printf (_(" bad symbol index: %08lx"), (unsigned long) symtab_index);
1467           else
1468             {
1469               Elf_Internal_Sym * psym;
1470               const char * version_string;
1471               enum versioned_symbol_info sym_info;
1472               unsigned short vna_other;
1473
1474               psym = symtab + symtab_index;
1475
1476               version_string
1477                 = get_symbol_version_string (file, is_dynsym,
1478                                              strtab, strtablen,
1479                                              symtab_index,
1480                                              psym,
1481                                              &sym_info,
1482                                              &vna_other);
1483
1484               printf (" ");
1485
1486               if (ELF_ST_TYPE (psym->st_info) == STT_GNU_IFUNC)
1487                 {
1488                   const char * name;
1489                   unsigned int len;
1490                   unsigned int width = is_32bit_elf ? 8 : 14;
1491
1492                   /* Relocations against GNU_IFUNC symbols do not use the value
1493                      of the symbol as the address to relocate against.  Instead
1494                      they invoke the function named by the symbol and use its
1495                      result as the address for relocation.
1496
1497                      To indicate this to the user, do not display the value of
1498                      the symbol in the "Symbols's Value" field.  Instead show
1499                      its name followed by () as a hint that the symbol is
1500                      invoked.  */
1501
1502                   if (strtab == NULL
1503                       || psym->st_name == 0
1504                       || psym->st_name >= strtablen)
1505                     name = "??";
1506                   else
1507                     name = strtab + psym->st_name;
1508
1509                   len = print_symbol (width, name);
1510                   if (version_string)
1511                     printf (sym_info == symbol_public ? "@@%s" : "@%s",
1512                             version_string);
1513                   printf ("()%-*s", len <= width ? (width + 1) - len : 1, " ");
1514                 }
1515               else
1516                 {
1517                   print_vma (psym->st_value, LONG_HEX);
1518
1519                   printf (is_32bit_elf ? "   " : " ");
1520                 }
1521
1522               if (psym->st_name == 0)
1523                 {
1524                   const char * sec_name = "<null>";
1525                   char name_buf[40];
1526
1527                   if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1528                     {
1529                       if (psym->st_shndx < elf_header.e_shnum)
1530                         sec_name = SECTION_NAME (section_headers + psym->st_shndx);
1531                       else if (psym->st_shndx == SHN_ABS)
1532                         sec_name = "ABS";
1533                       else if (psym->st_shndx == SHN_COMMON)
1534                         sec_name = "COMMON";
1535                       else if ((elf_header.e_machine == EM_MIPS
1536                                 && psym->st_shndx == SHN_MIPS_SCOMMON)
1537                                || (elf_header.e_machine == EM_TI_C6000
1538                                    && psym->st_shndx == SHN_TIC6X_SCOMMON))
1539                         sec_name = "SCOMMON";
1540                       else if (elf_header.e_machine == EM_MIPS
1541                                && psym->st_shndx == SHN_MIPS_SUNDEFINED)
1542                         sec_name = "SUNDEF";
1543                       else if ((elf_header.e_machine == EM_X86_64
1544                                 || elf_header.e_machine == EM_L1OM
1545                                 || elf_header.e_machine == EM_K1OM)
1546                                && psym->st_shndx == SHN_X86_64_LCOMMON)
1547                         sec_name = "LARGE_COMMON";
1548                       else if (elf_header.e_machine == EM_IA_64
1549                                && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
1550                                && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1551                         sec_name = "ANSI_COM";
1552                       else if (is_ia64_vms ()
1553                                && psym->st_shndx == SHN_IA_64_VMS_SYMVEC)
1554                         sec_name = "VMS_SYMVEC";
1555                       else
1556                         {
1557                           sprintf (name_buf, "<section 0x%x>",
1558                                    (unsigned int) psym->st_shndx);
1559                           sec_name = name_buf;
1560                         }
1561                     }
1562                   print_symbol (22, sec_name);
1563                 }
1564               else if (strtab == NULL)
1565                 printf (_("<string table index: %3ld>"), psym->st_name);
1566               else if (psym->st_name >= strtablen)
1567                 printf (_("<corrupt string table index: %3ld>"), psym->st_name);
1568               else
1569                 {
1570                   print_symbol (22, strtab + psym->st_name);
1571                   if (version_string)
1572                     printf (sym_info == symbol_public ? "@@%s" : "@%s",
1573                             version_string);
1574                 }
1575
1576               if (is_rela)
1577                 {
1578                   bfd_signed_vma off = rels[i].r_addend;
1579
1580                   if (off < 0)
1581                     printf (" - %" BFD_VMA_FMT "x", - off);
1582                   else
1583                     printf (" + %" BFD_VMA_FMT "x", off);
1584                 }
1585             }
1586         }
1587       else if (is_rela)
1588         {
1589           bfd_signed_vma off = rels[i].r_addend;
1590
1591           printf ("%*c", is_32bit_elf ? 12 : 20, ' ');
1592           if (off < 0)
1593             printf ("-%" BFD_VMA_FMT "x", - off);
1594           else
1595             printf ("%" BFD_VMA_FMT "x", off);
1596         }
1597
1598       if (elf_header.e_machine == EM_SPARCV9
1599           && rtype != NULL
1600           && streq (rtype, "R_SPARC_OLO10"))
1601         printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf));
1602
1603       putchar ('\n');
1604
1605 #ifdef BFD64
1606       if (! is_32bit_elf && elf_header.e_machine == EM_MIPS)
1607         {
1608           bfd_vma type2 = ELF64_MIPS_R_TYPE2 (inf);
1609           bfd_vma type3 = ELF64_MIPS_R_TYPE3 (inf);
1610           const char * rtype2 = elf_mips_reloc_type (type2);
1611           const char * rtype3 = elf_mips_reloc_type (type3);
1612
1613           printf ("                    Type2: ");
1614
1615           if (rtype2 == NULL)
1616             printf (_("unrecognized: %-7lx"),
1617                     (unsigned long) type2 & 0xffffffff);
1618           else
1619             printf ("%-17.17s", rtype2);
1620
1621           printf ("\n                    Type3: ");
1622
1623           if (rtype3 == NULL)
1624             printf (_("unrecognized: %-7lx"),
1625                     (unsigned long) type3 & 0xffffffff);
1626           else
1627             printf ("%-17.17s", rtype3);
1628
1629           putchar ('\n');
1630         }
1631 #endif /* BFD64 */
1632     }
1633
1634   free (rels);
1635 }
1636
1637 static const char *
1638 get_mips_dynamic_type (unsigned long type)
1639 {
1640   switch (type)
1641     {
1642     case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1643     case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1644     case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1645     case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1646     case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1647     case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1648     case DT_MIPS_MSYM: return "MIPS_MSYM";
1649     case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1650     case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1651     case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1652     case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1653     case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1654     case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1655     case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1656     case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1657     case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1658     case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1659     case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1660     case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1661     case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1662     case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1663     case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1664     case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1665     case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1666     case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1667     case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1668     case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1669     case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1670     case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1671     case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1672     case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1673     case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1674     case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1675     case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1676     case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1677     case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1678     case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1679     case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1680     case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1681     case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1682     case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1683     case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1684     case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1685     case DT_MIPS_PLTGOT: return "MIPS_PLTGOT";
1686     case DT_MIPS_RWPLT: return "MIPS_RWPLT";
1687     default:
1688       return NULL;
1689     }
1690 }
1691
1692 static const char *
1693 get_sparc64_dynamic_type (unsigned long type)
1694 {
1695   switch (type)
1696     {
1697     case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1698     default:
1699       return NULL;
1700     }
1701 }
1702
1703 static const char *
1704 get_ppc_dynamic_type (unsigned long type)
1705 {
1706   switch (type)
1707     {
1708     case DT_PPC_GOT:    return "PPC_GOT";
1709     case DT_PPC_OPT:    return "PPC_OPT";
1710     default:
1711       return NULL;
1712     }
1713 }
1714
1715 static const char *
1716 get_ppc64_dynamic_type (unsigned long type)
1717 {
1718   switch (type)
1719     {
1720     case DT_PPC64_GLINK:  return "PPC64_GLINK";
1721     case DT_PPC64_OPD:    return "PPC64_OPD";
1722     case DT_PPC64_OPDSZ:  return "PPC64_OPDSZ";
1723     case DT_PPC64_OPT:    return "PPC64_OPT";
1724     default:
1725       return NULL;
1726     }
1727 }
1728
1729 static const char *
1730 get_parisc_dynamic_type (unsigned long type)
1731 {
1732   switch (type)
1733     {
1734     case DT_HP_LOAD_MAP:        return "HP_LOAD_MAP";
1735     case DT_HP_DLD_FLAGS:       return "HP_DLD_FLAGS";
1736     case DT_HP_DLD_HOOK:        return "HP_DLD_HOOK";
1737     case DT_HP_UX10_INIT:       return "HP_UX10_INIT";
1738     case DT_HP_UX10_INITSZ:     return "HP_UX10_INITSZ";
1739     case DT_HP_PREINIT:         return "HP_PREINIT";
1740     case DT_HP_PREINITSZ:       return "HP_PREINITSZ";
1741     case DT_HP_NEEDED:          return "HP_NEEDED";
1742     case DT_HP_TIME_STAMP:      return "HP_TIME_STAMP";
1743     case DT_HP_CHECKSUM:        return "HP_CHECKSUM";
1744     case DT_HP_GST_SIZE:        return "HP_GST_SIZE";
1745     case DT_HP_GST_VERSION:     return "HP_GST_VERSION";
1746     case DT_HP_GST_HASHVAL:     return "HP_GST_HASHVAL";
1747     case DT_HP_EPLTREL:         return "HP_GST_EPLTREL";
1748     case DT_HP_EPLTRELSZ:       return "HP_GST_EPLTRELSZ";
1749     case DT_HP_FILTERED:        return "HP_FILTERED";
1750     case DT_HP_FILTER_TLS:      return "HP_FILTER_TLS";
1751     case DT_HP_COMPAT_FILTERED: return "HP_COMPAT_FILTERED";
1752     case DT_HP_LAZYLOAD:        return "HP_LAZYLOAD";
1753     case DT_HP_BIND_NOW_COUNT:  return "HP_BIND_NOW_COUNT";
1754     case DT_PLT:                return "PLT";
1755     case DT_PLT_SIZE:           return "PLT_SIZE";
1756     case DT_DLT:                return "DLT";
1757     case DT_DLT_SIZE:           return "DLT_SIZE";
1758     default:
1759       return NULL;
1760     }
1761 }
1762
1763 static const char *
1764 get_ia64_dynamic_type (unsigned long type)
1765 {
1766   switch (type)
1767     {
1768     case DT_IA_64_PLT_RESERVE:         return "IA_64_PLT_RESERVE";
1769     case DT_IA_64_VMS_SUBTYPE:         return "VMS_SUBTYPE";
1770     case DT_IA_64_VMS_IMGIOCNT:        return "VMS_IMGIOCNT";
1771     case DT_IA_64_VMS_LNKFLAGS:        return "VMS_LNKFLAGS";
1772     case DT_IA_64_VMS_VIR_MEM_BLK_SIZ: return "VMS_VIR_MEM_BLK_SIZ";
1773     case DT_IA_64_VMS_IDENT:           return "VMS_IDENT";
1774     case DT_IA_64_VMS_NEEDED_IDENT:    return "VMS_NEEDED_IDENT";
1775     case DT_IA_64_VMS_IMG_RELA_CNT:    return "VMS_IMG_RELA_CNT";
1776     case DT_IA_64_VMS_SEG_RELA_CNT:    return "VMS_SEG_RELA_CNT";
1777     case DT_IA_64_VMS_FIXUP_RELA_CNT:  return "VMS_FIXUP_RELA_CNT";
1778     case DT_IA_64_VMS_FIXUP_NEEDED:    return "VMS_FIXUP_NEEDED";
1779     case DT_IA_64_VMS_SYMVEC_CNT:      return "VMS_SYMVEC_CNT";
1780     case DT_IA_64_VMS_XLATED:          return "VMS_XLATED";
1781     case DT_IA_64_VMS_STACKSIZE:       return "VMS_STACKSIZE";
1782     case DT_IA_64_VMS_UNWINDSZ:        return "VMS_UNWINDSZ";
1783     case DT_IA_64_VMS_UNWIND_CODSEG:   return "VMS_UNWIND_CODSEG";
1784     case DT_IA_64_VMS_UNWIND_INFOSEG:  return "VMS_UNWIND_INFOSEG";
1785     case DT_IA_64_VMS_LINKTIME:        return "VMS_LINKTIME";
1786     case DT_IA_64_VMS_SEG_NO:          return "VMS_SEG_NO";
1787     case DT_IA_64_VMS_SYMVEC_OFFSET:   return "VMS_SYMVEC_OFFSET";
1788     case DT_IA_64_VMS_SYMVEC_SEG:      return "VMS_SYMVEC_SEG";
1789     case DT_IA_64_VMS_UNWIND_OFFSET:   return "VMS_UNWIND_OFFSET";
1790     case DT_IA_64_VMS_UNWIND_SEG:      return "VMS_UNWIND_SEG";
1791     case DT_IA_64_VMS_STRTAB_OFFSET:   return "VMS_STRTAB_OFFSET";
1792     case DT_IA_64_VMS_SYSVER_OFFSET:   return "VMS_SYSVER_OFFSET";
1793     case DT_IA_64_VMS_IMG_RELA_OFF:    return "VMS_IMG_RELA_OFF";
1794     case DT_IA_64_VMS_SEG_RELA_OFF:    return "VMS_SEG_RELA_OFF";
1795     case DT_IA_64_VMS_FIXUP_RELA_OFF:  return "VMS_FIXUP_RELA_OFF";
1796     case DT_IA_64_VMS_PLTGOT_OFFSET:   return "VMS_PLTGOT_OFFSET";
1797     case DT_IA_64_VMS_PLTGOT_SEG:      return "VMS_PLTGOT_SEG";
1798     case DT_IA_64_VMS_FPMODE:          return "VMS_FPMODE";
1799     default:
1800       return NULL;
1801     }
1802 }
1803
1804 static const char *
1805 get_alpha_dynamic_type (unsigned long type)
1806 {
1807   switch (type)
1808     {
1809     case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
1810     default:
1811       return NULL;
1812     }
1813 }
1814
1815 static const char *
1816 get_score_dynamic_type (unsigned long type)
1817 {
1818   switch (type)
1819     {
1820     case DT_SCORE_BASE_ADDRESS: return "SCORE_BASE_ADDRESS";
1821     case DT_SCORE_LOCAL_GOTNO:  return "SCORE_LOCAL_GOTNO";
1822     case DT_SCORE_SYMTABNO:     return "SCORE_SYMTABNO";
1823     case DT_SCORE_GOTSYM:       return "SCORE_GOTSYM";
1824     case DT_SCORE_UNREFEXTNO:   return "SCORE_UNREFEXTNO";
1825     case DT_SCORE_HIPAGENO:     return "SCORE_HIPAGENO";
1826     default:
1827       return NULL;
1828     }
1829 }
1830
1831 static const char *
1832 get_tic6x_dynamic_type (unsigned long type)
1833 {
1834   switch (type)
1835     {
1836     case DT_C6000_GSYM_OFFSET: return "C6000_GSYM_OFFSET";
1837     case DT_C6000_GSTR_OFFSET: return "C6000_GSTR_OFFSET";
1838     case DT_C6000_DSBT_BASE:   return "C6000_DSBT_BASE";
1839     case DT_C6000_DSBT_SIZE:   return "C6000_DSBT_SIZE";
1840     case DT_C6000_PREEMPTMAP:  return "C6000_PREEMPTMAP";
1841     case DT_C6000_DSBT_INDEX:  return "C6000_DSBT_INDEX";
1842     default:
1843       return NULL;
1844     }
1845 }
1846
1847 static const char *
1848 get_nios2_dynamic_type (unsigned long type)
1849 {
1850   switch (type)
1851     {
1852     case DT_NIOS2_GP: return "NIOS2_GP";
1853     default:
1854       return NULL;
1855     }
1856 }
1857
1858 static const char *
1859 get_dynamic_type (unsigned long type)
1860 {
1861   static char buff[64];
1862
1863   switch (type)
1864     {
1865     case DT_NULL:       return "NULL";
1866     case DT_NEEDED:     return "NEEDED";
1867     case DT_PLTRELSZ:   return "PLTRELSZ";
1868     case DT_PLTGOT:     return "PLTGOT";
1869     case DT_HASH:       return "HASH";
1870     case DT_STRTAB:     return "STRTAB";
1871     case DT_SYMTAB:     return "SYMTAB";
1872     case DT_RELA:       return "RELA";
1873     case DT_RELASZ:     return "RELASZ";
1874     case DT_RELAENT:    return "RELAENT";
1875     case DT_STRSZ:      return "STRSZ";
1876     case DT_SYMENT:     return "SYMENT";
1877     case DT_INIT:       return "INIT";
1878     case DT_FINI:       return "FINI";
1879     case DT_SONAME:     return "SONAME";
1880     case DT_RPATH:      return "RPATH";
1881     case DT_SYMBOLIC:   return "SYMBOLIC";
1882     case DT_REL:        return "REL";
1883     case DT_RELSZ:      return "RELSZ";
1884     case DT_RELENT:     return "RELENT";
1885     case DT_PLTREL:     return "PLTREL";
1886     case DT_DEBUG:      return "DEBUG";
1887     case DT_TEXTREL:    return "TEXTREL";
1888     case DT_JMPREL:     return "JMPREL";
1889     case DT_BIND_NOW:   return "BIND_NOW";
1890     case DT_INIT_ARRAY: return "INIT_ARRAY";
1891     case DT_FINI_ARRAY: return "FINI_ARRAY";
1892     case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
1893     case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
1894     case DT_RUNPATH:    return "RUNPATH";
1895     case DT_FLAGS:      return "FLAGS";
1896
1897     case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1898     case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
1899
1900     case DT_CHECKSUM:   return "CHECKSUM";
1901     case DT_PLTPADSZ:   return "PLTPADSZ";
1902     case DT_MOVEENT:    return "MOVEENT";
1903     case DT_MOVESZ:     return "MOVESZ";
1904     case DT_FEATURE:    return "FEATURE";
1905     case DT_POSFLAG_1:  return "POSFLAG_1";
1906     case DT_SYMINSZ:    return "SYMINSZ";
1907     case DT_SYMINENT:   return "SYMINENT"; /* aka VALRNGHI */
1908
1909     case DT_ADDRRNGLO:  return "ADDRRNGLO";
1910     case DT_CONFIG:     return "CONFIG";
1911     case DT_DEPAUDIT:   return "DEPAUDIT";
1912     case DT_AUDIT:      return "AUDIT";
1913     case DT_PLTPAD:     return "PLTPAD";
1914     case DT_MOVETAB:    return "MOVETAB";
1915     case DT_SYMINFO:    return "SYMINFO"; /* aka ADDRRNGHI */
1916
1917     case DT_VERSYM:     return "VERSYM";
1918
1919     case DT_TLSDESC_GOT: return "TLSDESC_GOT";
1920     case DT_TLSDESC_PLT: return "TLSDESC_PLT";
1921     case DT_RELACOUNT:  return "RELACOUNT";
1922     case DT_RELCOUNT:   return "RELCOUNT";
1923     case DT_FLAGS_1:    return "FLAGS_1";
1924     case DT_VERDEF:     return "VERDEF";
1925     case DT_VERDEFNUM:  return "VERDEFNUM";
1926     case DT_VERNEED:    return "VERNEED";
1927     case DT_VERNEEDNUM: return "VERNEEDNUM";
1928
1929     case DT_AUXILIARY:  return "AUXILIARY";
1930     case DT_USED:       return "USED";
1931     case DT_FILTER:     return "FILTER";
1932
1933     case DT_GNU_PRELINKED: return "GNU_PRELINKED";
1934     case DT_GNU_CONFLICT: return "GNU_CONFLICT";
1935     case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
1936     case DT_GNU_LIBLIST: return "GNU_LIBLIST";
1937     case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
1938     case DT_GNU_HASH:   return "GNU_HASH";
1939
1940     default:
1941       if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
1942         {
1943           const char * result;
1944
1945           switch (elf_header.e_machine)
1946             {
1947             case EM_MIPS:
1948             case EM_MIPS_RS3_LE:
1949               result = get_mips_dynamic_type (type);
1950               break;
1951             case EM_SPARCV9:
1952               result = get_sparc64_dynamic_type (type);
1953               break;
1954             case EM_PPC:
1955               result = get_ppc_dynamic_type (type);
1956               break;
1957             case EM_PPC64:
1958               result = get_ppc64_dynamic_type (type);
1959               break;
1960             case EM_IA_64:
1961               result = get_ia64_dynamic_type (type);
1962               break;
1963             case EM_ALPHA:
1964               result = get_alpha_dynamic_type (type);
1965               break;
1966             case EM_SCORE:
1967               result = get_score_dynamic_type (type);
1968               break;
1969             case EM_TI_C6000:
1970               result = get_tic6x_dynamic_type (type);
1971               break;
1972             case EM_ALTERA_NIOS2:
1973               result = get_nios2_dynamic_type (type);
1974               break;
1975             default:
1976               result = NULL;
1977               break;
1978             }
1979
1980           if (result != NULL)
1981             return result;
1982
1983           snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
1984         }
1985       else if (((type >= DT_LOOS) && (type <= DT_HIOS))
1986                || (elf_header.e_machine == EM_PARISC
1987                    && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
1988         {
1989           const char * result;
1990
1991           switch (elf_header.e_machine)
1992             {
1993             case EM_PARISC:
1994               result = get_parisc_dynamic_type (type);
1995               break;
1996             case EM_IA_64:
1997               result = get_ia64_dynamic_type (type);
1998               break;
1999             default:
2000               result = NULL;
2001               break;
2002             }
2003
2004           if (result != NULL)
2005             return result;
2006
2007           snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
2008                     type);
2009         }
2010       else
2011         snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
2012
2013       return buff;
2014     }
2015 }
2016
2017 static char *
2018 get_file_type (unsigned e_type)
2019 {
2020   static char buff[32];
2021
2022   switch (e_type)
2023     {
2024     case ET_NONE:       return _("NONE (None)");
2025     case ET_REL:        return _("REL (Relocatable file)");
2026     case ET_EXEC:       return _("EXEC (Executable file)");
2027     case ET_DYN:        return _("DYN (Shared object file)");
2028     case ET_CORE:       return _("CORE (Core file)");
2029
2030     default:
2031       if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
2032         snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
2033       else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
2034         snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
2035       else
2036         snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
2037       return buff;
2038     }
2039 }
2040
2041 static char *
2042 get_machine_name (unsigned e_machine)
2043 {
2044   static char buff[64]; /* XXX */
2045
2046   switch (e_machine)
2047     {
2048     case EM_NONE:               return _("None");
2049     case EM_AARCH64:            return "AArch64";
2050     case EM_M32:                return "WE32100";
2051     case EM_SPARC:              return "Sparc";
2052     case EM_SPU:                return "SPU";
2053     case EM_386:                return "Intel 80386";
2054     case EM_68K:                return "MC68000";
2055     case EM_88K:                return "MC88000";
2056     case EM_486:                return "Intel 80486";
2057     case EM_860:                return "Intel 80860";
2058     case EM_MIPS:               return "MIPS R3000";
2059     case EM_S370:               return "IBM System/370";
2060     case EM_MIPS_RS3_LE:        return "MIPS R4000 big-endian";
2061     case EM_OLD_SPARCV9:        return "Sparc v9 (old)";
2062     case EM_PARISC:             return "HPPA";
2063     case EM_PPC_OLD:            return "Power PC (old)";
2064     case EM_SPARC32PLUS:        return "Sparc v8+" ;
2065     case EM_960:                return "Intel 90860";
2066     case EM_PPC:                return "PowerPC";
2067     case EM_PPC64:              return "PowerPC64";
2068     case EM_FR20:               return "Fujitsu FR20";
2069     case EM_RH32:               return "TRW RH32";
2070     case EM_MCORE:              return "MCORE";
2071     case EM_ARM:                return "ARM";
2072     case EM_OLD_ALPHA:          return "Digital Alpha (old)";
2073     case EM_SH:                 return "Renesas / SuperH SH";
2074     case EM_SPARCV9:            return "Sparc v9";
2075     case EM_TRICORE:            return "Siemens Tricore";
2076     case EM_ARC:                return "ARC";
2077     case EM_H8_300:             return "Renesas H8/300";
2078     case EM_H8_300H:            return "Renesas H8/300H";
2079     case EM_H8S:                return "Renesas H8S";
2080     case EM_H8_500:             return "Renesas H8/500";
2081     case EM_IA_64:              return "Intel IA-64";
2082     case EM_MIPS_X:             return "Stanford MIPS-X";
2083     case EM_COLDFIRE:           return "Motorola Coldfire";
2084     case EM_ALPHA:              return "Alpha";
2085     case EM_CYGNUS_D10V:
2086     case EM_D10V:               return "d10v";
2087     case EM_CYGNUS_D30V:
2088     case EM_D30V:               return "d30v";
2089     case EM_CYGNUS_M32R:
2090     case EM_M32R:               return "Renesas M32R (formerly Mitsubishi M32r)";
2091     case EM_CYGNUS_V850:
2092     case EM_V800:               return "Renesas V850 (using RH850 ABI)";
2093     case EM_V850:               return "Renesas V850";
2094     case EM_CYGNUS_MN10300:
2095     case EM_MN10300:            return "mn10300";
2096     case EM_CYGNUS_MN10200:
2097     case EM_MN10200:            return "mn10200";
2098     case EM_MOXIE:              return "Moxie";
2099     case EM_CYGNUS_FR30:
2100     case EM_FR30:               return "Fujitsu FR30";
2101     case EM_CYGNUS_FRV:         return "Fujitsu FR-V";
2102     case EM_PJ_OLD:
2103     case EM_PJ:                 return "picoJava";
2104     case EM_MMA:                return "Fujitsu Multimedia Accelerator";
2105     case EM_PCP:                return "Siemens PCP";
2106     case EM_NCPU:               return "Sony nCPU embedded RISC processor";
2107     case EM_NDR1:               return "Denso NDR1 microprocesspr";
2108     case EM_STARCORE:           return "Motorola Star*Core processor";
2109     case EM_ME16:               return "Toyota ME16 processor";
2110     case EM_ST100:              return "STMicroelectronics ST100 processor";
2111     case EM_TINYJ:              return "Advanced Logic Corp. TinyJ embedded processor";
2112     case EM_PDSP:               return "Sony DSP processor";
2113     case EM_PDP10:              return "Digital Equipment Corp. PDP-10";
2114     case EM_PDP11:              return "Digital Equipment Corp. PDP-11";
2115     case EM_FX66:               return "Siemens FX66 microcontroller";
2116     case EM_ST9PLUS:            return "STMicroelectronics ST9+ 8/16 bit microcontroller";
2117     case EM_ST7:                return "STMicroelectronics ST7 8-bit microcontroller";
2118     case EM_68HC16:             return "Motorola MC68HC16 Microcontroller";
2119     case EM_68HC12:             return "Motorola MC68HC12 Microcontroller";
2120     case EM_68HC11:             return "Motorola MC68HC11 Microcontroller";
2121     case EM_68HC08:             return "Motorola MC68HC08 Microcontroller";
2122     case EM_68HC05:             return "Motorola MC68HC05 Microcontroller";
2123     case EM_SVX:                return "Silicon Graphics SVx";
2124     case EM_ST19:               return "STMicroelectronics ST19 8-bit microcontroller";
2125     case EM_VAX:                return "Digital VAX";
2126     case EM_AVR_OLD:
2127     case EM_AVR:                return "Atmel AVR 8-bit microcontroller";
2128     case EM_CRIS:               return "Axis Communications 32-bit embedded processor";
2129     case EM_JAVELIN:            return "Infineon Technologies 32-bit embedded cpu";
2130     case EM_FIREPATH:           return "Element 14 64-bit DSP processor";
2131     case EM_ZSP:                return "LSI Logic's 16-bit DSP processor";
2132     case EM_MMIX:               return "Donald Knuth's educational 64-bit processor";
2133     case EM_HUANY:              return "Harvard Universitys's machine-independent object format";
2134     case EM_PRISM:              return "Vitesse Prism";
2135     case EM_X86_64:             return "Advanced Micro Devices X86-64";
2136     case EM_L1OM:               return "Intel L1OM";
2137     case EM_K1OM:               return "Intel K1OM";
2138     case EM_S390_OLD:
2139     case EM_S390:               return "IBM S/390";
2140     case EM_SCORE:              return "SUNPLUS S+Core";
2141     case EM_XSTORMY16:          return "Sanyo XStormy16 CPU core";
2142     case EM_OR1K:               return "OpenRISC 1000";
2143     case EM_ARC_A5:             return "ARC International ARCompact processor";
2144     case EM_CRX:                return "National Semiconductor CRX microprocessor";
2145     case EM_ADAPTEVA_EPIPHANY:  return "Adapteva EPIPHANY";
2146     case EM_DLX:                return "OpenDLX";
2147     case EM_IP2K_OLD:
2148     case EM_IP2K:               return "Ubicom IP2xxx 8-bit microcontrollers";
2149     case EM_IQ2000:             return "Vitesse IQ2000";
2150     case EM_XTENSA_OLD:
2151     case EM_XTENSA:             return "Tensilica Xtensa Processor";
2152     case EM_VIDEOCORE:          return "Alphamosaic VideoCore processor";
2153     case EM_TMM_GPP:            return "Thompson Multimedia General Purpose Processor";
2154     case EM_NS32K:              return "National Semiconductor 32000 series";
2155     case EM_TPC:                return "Tenor Network TPC processor";
2156     case EM_ST200:              return "STMicroelectronics ST200 microcontroller";
2157     case EM_MAX:                return "MAX Processor";
2158     case EM_CR:                 return "National Semiconductor CompactRISC";
2159     case EM_F2MC16:             return "Fujitsu F2MC16";
2160     case EM_MSP430:             return "Texas Instruments msp430 microcontroller";
2161     case EM_LATTICEMICO32:      return "Lattice Mico32";
2162     case EM_M32C_OLD:
2163     case EM_M32C:               return "Renesas M32c";
2164     case EM_MT:                 return "Morpho Techologies MT processor";
2165     case EM_BLACKFIN:           return "Analog Devices Blackfin";
2166     case EM_SE_C33:             return "S1C33 Family of Seiko Epson processors";
2167     case EM_SEP:                return "Sharp embedded microprocessor";
2168     case EM_ARCA:               return "Arca RISC microprocessor";
2169     case EM_UNICORE:            return "Unicore";
2170     case EM_EXCESS:             return "eXcess 16/32/64-bit configurable embedded CPU";
2171     case EM_DXP:                return "Icera Semiconductor Inc. Deep Execution Processor";
2172     case EM_NIOS32:             return "Altera Nios";
2173     case EM_ALTERA_NIOS2:       return "Altera Nios II";
2174     case EM_C166:
2175     case EM_XC16X:              return "Infineon Technologies xc16x";
2176     case EM_M16C:               return "Renesas M16C series microprocessors";
2177     case EM_DSPIC30F:           return "Microchip Technology dsPIC30F Digital Signal Controller";
2178     case EM_CE:                 return "Freescale Communication Engine RISC core";
2179     case EM_TSK3000:            return "Altium TSK3000 core";
2180     case EM_RS08:               return "Freescale RS08 embedded processor";
2181     case EM_ECOG2:              return "Cyan Technology eCOG2 microprocessor";
2182     case EM_DSP24:              return "New Japan Radio (NJR) 24-bit DSP Processor";
2183     case EM_VIDEOCORE3:         return "Broadcom VideoCore III processor";
2184     case EM_SE_C17:             return "Seiko Epson C17 family";
2185     case EM_TI_C6000:           return "Texas Instruments TMS320C6000 DSP family";
2186     case EM_TI_C2000:           return "Texas Instruments TMS320C2000 DSP family";
2187     case EM_TI_C5500:           return "Texas Instruments TMS320C55x DSP family";
2188     case EM_MMDSP_PLUS:         return "STMicroelectronics 64bit VLIW Data Signal Processor";
2189     case EM_CYPRESS_M8C:        return "Cypress M8C microprocessor";
2190     case EM_R32C:               return "Renesas R32C series microprocessors";
2191     case EM_TRIMEDIA:           return "NXP Semiconductors TriMedia architecture family";
2192     case EM_QDSP6:              return "QUALCOMM DSP6 Processor";
2193     case EM_8051:               return "Intel 8051 and variants";
2194     case EM_STXP7X:             return "STMicroelectronics STxP7x family";
2195     case EM_NDS32:              return "Andes Technology compact code size embedded RISC processor family";
2196     case EM_ECOG1X:             return "Cyan Technology eCOG1X family";
2197     case EM_MAXQ30:             return "Dallas Semiconductor MAXQ30 Core microcontrollers";
2198     case EM_XIMO16:             return "New Japan Radio (NJR) 16-bit DSP Processor";
2199     case EM_MANIK:              return "M2000 Reconfigurable RISC Microprocessor";
2200     case EM_CRAYNV2:            return "Cray Inc. NV2 vector architecture";
2201     case EM_CYGNUS_MEP:         return "Toshiba MeP Media Engine";
2202     case EM_CR16:
2203     case EM_MICROBLAZE:
2204     case EM_MICROBLAZE_OLD:     return "Xilinx MicroBlaze";
2205     case EM_RL78:               return "Renesas RL78";
2206     case EM_RX:                 return "Renesas RX";
2207     case EM_METAG:              return "Imagination Technologies Meta processor architecture";
2208     case EM_MCST_ELBRUS:        return "MCST Elbrus general purpose hardware architecture";
2209     case EM_ECOG16:             return "Cyan Technology eCOG16 family";
2210     case EM_ETPU:               return "Freescale Extended Time Processing Unit";
2211     case EM_SLE9X:              return "Infineon Technologies SLE9X core";
2212     case EM_AVR32:              return "Atmel Corporation 32-bit microprocessor family";
2213     case EM_STM8:               return "STMicroeletronics STM8 8-bit microcontroller";
2214     case EM_TILE64:             return "Tilera TILE64 multicore architecture family";
2215     case EM_TILEPRO:            return "Tilera TILEPro multicore architecture family";
2216     case EM_TILEGX:             return "Tilera TILE-Gx multicore architecture family";
2217     case EM_CUDA:               return "NVIDIA CUDA architecture";
2218     case EM_XGATE:              return "Motorola XGATE embedded processor";
2219     default:
2220       snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
2221       return buff;
2222     }
2223 }
2224
2225 static void
2226 decode_ARM_machine_flags (unsigned e_flags, char buf[])
2227 {
2228   unsigned eabi;
2229   int unknown = 0;
2230
2231   eabi = EF_ARM_EABI_VERSION (e_flags);
2232   e_flags &= ~ EF_ARM_EABIMASK;
2233
2234   /* Handle "generic" ARM flags.  */
2235   if (e_flags & EF_ARM_RELEXEC)
2236     {
2237       strcat (buf, ", relocatable executable");
2238       e_flags &= ~ EF_ARM_RELEXEC;
2239     }
2240
2241   if (e_flags & EF_ARM_HASENTRY)
2242     {
2243       strcat (buf, ", has entry point");
2244       e_flags &= ~ EF_ARM_HASENTRY;
2245     }
2246
2247   /* Now handle EABI specific flags.  */
2248   switch (eabi)
2249     {
2250     default:
2251       strcat (buf, ", <unrecognized EABI>");
2252       if (e_flags)
2253         unknown = 1;
2254       break;
2255
2256     case EF_ARM_EABI_VER1:
2257       strcat (buf, ", Version1 EABI");
2258       while (e_flags)
2259         {
2260           unsigned flag;
2261
2262           /* Process flags one bit at a time.  */
2263           flag = e_flags & - e_flags;
2264           e_flags &= ~ flag;
2265
2266           switch (flag)
2267             {
2268             case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK.  */
2269               strcat (buf, ", sorted symbol tables");
2270               break;
2271
2272             default:
2273               unknown = 1;
2274               break;
2275             }
2276         }
2277       break;
2278
2279     case EF_ARM_EABI_VER2:
2280       strcat (buf, ", Version2 EABI");
2281       while (e_flags)
2282         {
2283           unsigned flag;
2284
2285           /* Process flags one bit at a time.  */
2286           flag = e_flags & - e_flags;
2287           e_flags &= ~ flag;
2288
2289           switch (flag)
2290             {
2291             case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK.  */
2292               strcat (buf, ", sorted symbol tables");
2293               break;
2294
2295             case EF_ARM_DYNSYMSUSESEGIDX:
2296               strcat (buf, ", dynamic symbols use segment index");
2297               break;
2298
2299             case EF_ARM_MAPSYMSFIRST:
2300               strcat (buf, ", mapping symbols precede others");
2301               break;
2302
2303             default:
2304               unknown = 1;
2305               break;
2306             }
2307         }
2308       break;
2309
2310     case EF_ARM_EABI_VER3:
2311       strcat (buf, ", Version3 EABI");
2312       break;
2313
2314     case EF_ARM_EABI_VER4:
2315       strcat (buf, ", Version4 EABI");
2316       while (e_flags)
2317         {
2318           unsigned flag;
2319
2320           /* Process flags one bit at a time.  */
2321           flag = e_flags & - e_flags;
2322           e_flags &= ~ flag;
2323
2324           switch (flag)
2325             {
2326             case EF_ARM_BE8:
2327               strcat (buf, ", BE8");
2328               break;
2329
2330             case EF_ARM_LE8:
2331               strcat (buf, ", LE8");
2332               break;
2333
2334             default:
2335               unknown = 1;
2336               break;
2337             }
2338       break;
2339         }
2340       break;
2341
2342     case EF_ARM_EABI_VER5:
2343       strcat (buf, ", Version5 EABI");
2344       while (e_flags)
2345         {
2346           unsigned flag;
2347
2348           /* Process flags one bit at a time.  */
2349           flag = e_flags & - e_flags;
2350           e_flags &= ~ flag;
2351
2352           switch (flag)
2353             {
2354             case EF_ARM_BE8:
2355               strcat (buf, ", BE8");
2356               break;
2357
2358             case EF_ARM_LE8:
2359               strcat (buf, ", LE8");
2360               break;
2361
2362             case EF_ARM_ABI_FLOAT_SOFT: /* Conflicts with EF_ARM_SOFT_FLOAT.  */
2363               strcat (buf, ", soft-float ABI");
2364               break;
2365
2366             case EF_ARM_ABI_FLOAT_HARD: /* Conflicts with EF_ARM_VFP_FLOAT.  */
2367               strcat (buf, ", hard-float ABI");
2368               break;
2369
2370             default:
2371               unknown = 1;
2372               break;
2373             }
2374         }
2375       break;
2376
2377     case EF_ARM_EABI_UNKNOWN:
2378       strcat (buf, ", GNU EABI");
2379       while (e_flags)
2380         {
2381           unsigned flag;
2382
2383           /* Process flags one bit at a time.  */
2384           flag = e_flags & - e_flags;
2385           e_flags &= ~ flag;
2386
2387           switch (flag)
2388             {
2389             case EF_ARM_INTERWORK:
2390               strcat (buf, ", interworking enabled");
2391               break;
2392
2393             case EF_ARM_APCS_26:
2394               strcat (buf, ", uses APCS/26");
2395               break;
2396
2397             case EF_ARM_APCS_FLOAT:
2398               strcat (buf, ", uses APCS/float");
2399               break;
2400
2401             case EF_ARM_PIC:
2402               strcat (buf, ", position independent");
2403               break;
2404
2405             case EF_ARM_ALIGN8:
2406               strcat (buf, ", 8 bit structure alignment");
2407               break;
2408
2409             case EF_ARM_NEW_ABI:
2410               strcat (buf, ", uses new ABI");
2411               break;
2412
2413             case EF_ARM_OLD_ABI:
2414               strcat (buf, ", uses old ABI");
2415               break;
2416
2417             case EF_ARM_SOFT_FLOAT:
2418               strcat (buf, ", software FP");
2419               break;
2420
2421             case EF_ARM_VFP_FLOAT:
2422               strcat (buf, ", VFP");
2423               break;
2424
2425             case EF_ARM_MAVERICK_FLOAT:
2426               strcat (buf, ", Maverick FP");
2427               break;
2428
2429             default:
2430               unknown = 1;
2431               break;
2432             }
2433         }
2434     }
2435
2436   if (unknown)
2437     strcat (buf,_(", <unknown>"));
2438 }
2439
2440 static void
2441 decode_NDS32_machine_flags (unsigned e_flags, char buf[], size_t size)
2442 {
2443   unsigned abi;
2444   unsigned arch;
2445   unsigned config;
2446   unsigned version;
2447   int has_fpu = 0;
2448   int r = 0;
2449
2450   static const char *ABI_STRINGS[] =
2451   {
2452     "ABI v0", /* use r5 as return register; only used in N1213HC */
2453     "ABI v1", /* use r0 as return register */
2454     "ABI v2", /* use r0 as return register and don't reserve 24 bytes for arguments */
2455     "ABI v2fp", /* for FPU */
2456     "AABI",
2457     "ABI2 FP+"
2458   };
2459   static const char *VER_STRINGS[] =
2460   {
2461     "Andes ELF V1.3 or older",
2462     "Andes ELF V1.3.1",
2463     "Andes ELF V1.4"
2464   };
2465   static const char *ARCH_STRINGS[] =
2466   {
2467     "",
2468     "Andes Star v1.0",
2469     "Andes Star v2.0",
2470     "Andes Star v3.0",
2471     "Andes Star v3.0m"
2472   };
2473
2474   abi = EF_NDS_ABI & e_flags;
2475   arch = EF_NDS_ARCH & e_flags;
2476   config = EF_NDS_INST & e_flags;
2477   version = EF_NDS32_ELF_VERSION & e_flags;
2478
2479   memset (buf, 0, size);
2480
2481   switch (abi)
2482     {
2483     case E_NDS_ABI_V0:
2484     case E_NDS_ABI_V1:
2485     case E_NDS_ABI_V2:
2486     case E_NDS_ABI_V2FP:
2487     case E_NDS_ABI_AABI:
2488     case E_NDS_ABI_V2FP_PLUS:
2489       /* In case there are holes in the array.  */
2490       r += snprintf (buf + r, size - r, ", %s", ABI_STRINGS[abi >> EF_NDS_ABI_SHIFT]);
2491       break;
2492
2493     default:
2494       r += snprintf (buf + r, size - r, ", <unrecognized ABI>");
2495       break;
2496     }
2497
2498   switch (version)
2499     {
2500     case E_NDS32_ELF_VER_1_2:
2501     case E_NDS32_ELF_VER_1_3:
2502     case E_NDS32_ELF_VER_1_4:
2503       r += snprintf (buf + r, size - r, ", %s", VER_STRINGS[version >> EF_NDS32_ELF_VERSION_SHIFT]);
2504       break;
2505
2506     default:
2507       r += snprintf (buf + r, size - r, ", <unrecognized ELF version number>");
2508       break;
2509     }
2510
2511   if (E_NDS_ABI_V0 == abi)
2512     {
2513       /* OLD ABI; only used in N1213HC, has performance extension 1.  */
2514       r += snprintf (buf + r, size - r, ", Andes Star v1.0, N1213HC, MAC, PERF1");
2515       if (arch == E_NDS_ARCH_STAR_V1_0)
2516         r += snprintf (buf + r, size -r, ", 16b"); /* has 16-bit instructions */
2517       return;
2518     }
2519
2520   switch (arch)
2521     {
2522     case E_NDS_ARCH_STAR_V1_0:
2523     case E_NDS_ARCH_STAR_V2_0:
2524     case E_NDS_ARCH_STAR_V3_0:
2525     case E_NDS_ARCH_STAR_V3_M:
2526       r += snprintf (buf + r, size - r, ", %s", ARCH_STRINGS[arch >> EF_NDS_ARCH_SHIFT]);
2527       break;
2528
2529     default:
2530       r += snprintf (buf + r, size - r, ", <unrecognized architecture>");
2531       /* ARCH version determines how the e_flags are interpreted.
2532          If it is unknown, we cannot proceed.  */
2533       return;
2534     }
2535
2536   /* Newer ABI; Now handle architecture specific flags.  */
2537   if (arch == E_NDS_ARCH_STAR_V1_0)
2538     {
2539       if (config & E_NDS32_HAS_MFUSR_PC_INST)
2540         r += snprintf (buf + r, size -r, ", MFUSR_PC");
2541
2542       if (!(config & E_NDS32_HAS_NO_MAC_INST))
2543         r += snprintf (buf + r, size -r, ", MAC");
2544
2545       if (config & E_NDS32_HAS_DIV_INST)
2546         r += snprintf (buf + r, size -r, ", DIV");
2547
2548       if (config & E_NDS32_HAS_16BIT_INST)
2549         r += snprintf (buf + r, size -r, ", 16b");
2550     }
2551   else
2552     {
2553       if (config & E_NDS32_HAS_MFUSR_PC_INST)
2554         {
2555           if (version <= E_NDS32_ELF_VER_1_3)
2556             r += snprintf (buf + r, size -r, ", [B8]");
2557           else
2558             r += snprintf (buf + r, size -r, ", EX9");
2559         }
2560
2561       if (config & E_NDS32_HAS_MAC_DX_INST)
2562         r += snprintf (buf + r, size -r, ", MAC_DX");
2563
2564       if (config & E_NDS32_HAS_DIV_DX_INST)
2565         r += snprintf (buf + r, size -r, ", DIV_DX");
2566
2567       if (config & E_NDS32_HAS_16BIT_INST)
2568         {
2569           if (version <= E_NDS32_ELF_VER_1_3)
2570             r += snprintf (buf + r, size -r, ", 16b");
2571           else
2572             r += snprintf (buf + r, size -r, ", IFC");
2573         }
2574     }
2575
2576   if (config & E_NDS32_HAS_EXT_INST)
2577     r += snprintf (buf + r, size -r, ", PERF1");
2578
2579   if (config & E_NDS32_HAS_EXT2_INST)
2580     r += snprintf (buf + r, size -r, ", PERF2");
2581
2582   if (config & E_NDS32_HAS_FPU_INST)
2583     {
2584       has_fpu = 1;
2585       r += snprintf (buf + r, size -r, ", FPU_SP");
2586     }
2587
2588   if (config & E_NDS32_HAS_FPU_DP_INST)
2589     {
2590       has_fpu = 1;
2591       r += snprintf (buf + r, size -r, ", FPU_DP");
2592     }
2593
2594   if (config & E_NDS32_HAS_FPU_MAC_INST)
2595     {
2596       has_fpu = 1;
2597       r += snprintf (buf + r, size -r, ", FPU_MAC");
2598     }
2599
2600   if (has_fpu)
2601     {
2602       switch ((config & E_NDS32_FPU_REG_CONF) >> E_NDS32_FPU_REG_CONF_SHIFT)
2603         {
2604         case E_NDS32_FPU_REG_8SP_4DP:
2605           r += snprintf (buf + r, size -r, ", FPU_REG:8/4");
2606           break;
2607         case E_NDS32_FPU_REG_16SP_8DP:
2608           r += snprintf (buf + r, size -r, ", FPU_REG:16/8");
2609           break;
2610         case E_NDS32_FPU_REG_32SP_16DP:
2611           r += snprintf (buf + r, size -r, ", FPU_REG:32/16");
2612           break;
2613         case E_NDS32_FPU_REG_32SP_32DP:
2614           r += snprintf (buf + r, size -r, ", FPU_REG:32/32");
2615           break;
2616         }
2617     }
2618
2619   if (config & E_NDS32_HAS_AUDIO_INST)
2620     r += snprintf (buf + r, size -r, ", AUDIO");
2621
2622   if (config & E_NDS32_HAS_STRING_INST)
2623     r += snprintf (buf + r, size -r, ", STR");
2624
2625   if (config & E_NDS32_HAS_REDUCED_REGS)
2626     r += snprintf (buf + r, size -r, ", 16REG");
2627
2628   if (config & E_NDS32_HAS_VIDEO_INST)
2629     {
2630       if (version <= E_NDS32_ELF_VER_1_3)
2631         r += snprintf (buf + r, size -r, ", VIDEO");
2632       else
2633         r += snprintf (buf + r, size -r, ", SATURATION");
2634     }
2635
2636   if (config & E_NDS32_HAS_ENCRIPT_INST)
2637     r += snprintf (buf + r, size -r, ", ENCRP");
2638
2639   if (config & E_NDS32_HAS_L2C_INST)
2640     r += snprintf (buf + r, size -r, ", L2C");
2641 }
2642
2643 static char *
2644 get_machine_flags (unsigned e_flags, unsigned e_machine)
2645 {
2646   static char buf[1024];
2647
2648   buf[0] = '\0';
2649
2650   if (e_flags)
2651     {
2652       switch (e_machine)
2653         {
2654         default:
2655           break;
2656
2657         case EM_ARM:
2658           decode_ARM_machine_flags (e_flags, buf);
2659           break;
2660
2661         case EM_BLACKFIN:
2662           if (e_flags & EF_BFIN_PIC)
2663             strcat (buf, ", PIC");
2664
2665           if (e_flags & EF_BFIN_FDPIC)
2666             strcat (buf, ", FDPIC");
2667
2668           if (e_flags & EF_BFIN_CODE_IN_L1)
2669             strcat (buf, ", code in L1");
2670
2671           if (e_flags & EF_BFIN_DATA_IN_L1)
2672             strcat (buf, ", data in L1");
2673
2674           break;
2675
2676         case EM_CYGNUS_FRV:
2677           switch (e_flags & EF_FRV_CPU_MASK)
2678             {
2679             case EF_FRV_CPU_GENERIC:
2680               break;
2681
2682             default:
2683               strcat (buf, ", fr???");
2684               break;
2685
2686             case EF_FRV_CPU_FR300:
2687               strcat (buf, ", fr300");
2688               break;
2689
2690             case EF_FRV_CPU_FR400:
2691               strcat (buf, ", fr400");
2692               break;
2693             case EF_FRV_CPU_FR405:
2694               strcat (buf, ", fr405");
2695               break;
2696
2697             case EF_FRV_CPU_FR450:
2698               strcat (buf, ", fr450");
2699               break;
2700
2701             case EF_FRV_CPU_FR500:
2702               strcat (buf, ", fr500");
2703               break;
2704             case EF_FRV_CPU_FR550:
2705               strcat (buf, ", fr550");
2706               break;
2707
2708             case EF_FRV_CPU_SIMPLE:
2709               strcat (buf, ", simple");
2710               break;
2711             case EF_FRV_CPU_TOMCAT:
2712               strcat (buf, ", tomcat");
2713               break;
2714             }
2715           break;
2716
2717         case EM_68K:
2718           if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
2719             strcat (buf, ", m68000");
2720           else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
2721             strcat (buf, ", cpu32");
2722           else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
2723             strcat (buf, ", fido_a");
2724           else
2725             {
2726               char const * isa = _("unknown");
2727               char const * mac = _("unknown mac");
2728               char const * additional = NULL;
2729
2730               switch (e_flags & EF_M68K_CF_ISA_MASK)
2731                 {
2732                 case EF_M68K_CF_ISA_A_NODIV:
2733                   isa = "A";
2734                   additional = ", nodiv";
2735                   break;
2736                 case EF_M68K_CF_ISA_A:
2737                   isa = "A";
2738                   break;
2739                 case EF_M68K_CF_ISA_A_PLUS:
2740                   isa = "A+";
2741                   break;
2742                 case EF_M68K_CF_ISA_B_NOUSP:
2743                   isa = "B";
2744                   additional = ", nousp";
2745                   break;
2746                 case EF_M68K_CF_ISA_B:
2747                   isa = "B";
2748                   break;
2749                 case EF_M68K_CF_ISA_C:
2750                   isa = "C";
2751                   break;
2752                 case EF_M68K_CF_ISA_C_NODIV:
2753                   isa = "C";
2754                   additional = ", nodiv";
2755                   break;
2756                 }
2757               strcat (buf, ", cf, isa ");
2758               strcat (buf, isa);
2759               if (additional)
2760                 strcat (buf, additional);
2761               if (e_flags & EF_M68K_CF_FLOAT)
2762                 strcat (buf, ", float");
2763               switch (e_flags & EF_M68K_CF_MAC_MASK)
2764                 {
2765                 case 0:
2766                   mac = NULL;
2767                   break;
2768                 case EF_M68K_CF_MAC:
2769                   mac = "mac";
2770                   break;
2771                 case EF_M68K_CF_EMAC:
2772                   mac = "emac";
2773                   break;
2774                 case EF_M68K_CF_EMAC_B:
2775                   mac = "emac_b";
2776                   break;
2777                 }
2778               if (mac)
2779                 {
2780                   strcat (buf, ", ");
2781                   strcat (buf, mac);
2782                 }
2783             }
2784           break;
2785
2786         case EM_PPC:
2787           if (e_flags & EF_PPC_EMB)
2788             strcat (buf, ", emb");
2789
2790           if (e_flags & EF_PPC_RELOCATABLE)
2791             strcat (buf, _(", relocatable"));
2792
2793           if (e_flags & EF_PPC_RELOCATABLE_LIB)
2794             strcat (buf, _(", relocatable-lib"));
2795           break;
2796
2797         case EM_PPC64:
2798           if (e_flags & EF_PPC64_ABI)
2799             {
2800               char abi[] = ", abiv0";
2801
2802               abi[6] += e_flags & EF_PPC64_ABI;
2803               strcat (buf, abi);
2804             }
2805           break;
2806
2807         case EM_V800:
2808           if ((e_flags & EF_RH850_ABI) == EF_RH850_ABI)
2809             strcat (buf, ", RH850 ABI");
2810
2811           if (e_flags & EF_V800_850E3)
2812             strcat (buf, ", V3 architecture");
2813
2814           if ((e_flags & (EF_RH850_FPU_DOUBLE | EF_RH850_FPU_SINGLE)) == 0)
2815             strcat (buf, ", FPU not used");
2816
2817           if ((e_flags & (EF_RH850_REGMODE22 | EF_RH850_REGMODE32)) == 0)
2818             strcat (buf, ", regmode: COMMON");
2819
2820           if ((e_flags & (EF_RH850_GP_FIX | EF_RH850_GP_NOFIX)) == 0)
2821             strcat (buf, ", r4 not used");
2822
2823           if ((e_flags & (EF_RH850_EP_FIX | EF_RH850_EP_NOFIX)) == 0)
2824             strcat (buf, ", r30 not used");
2825
2826           if ((e_flags & (EF_RH850_TP_FIX | EF_RH850_TP_NOFIX)) == 0)
2827             strcat (buf, ", r5 not used");
2828
2829           if ((e_flags & (EF_RH850_REG2_RESERVE | EF_RH850_REG2_NORESERVE)) == 0)
2830             strcat (buf, ", r2 not used");
2831
2832           for (e_flags &= 0xFFFF; e_flags; e_flags &= ~ (e_flags & - e_flags))
2833             {
2834               switch (e_flags & - e_flags)
2835                 {
2836                 case EF_RH850_FPU_DOUBLE: strcat (buf, ", double precision FPU"); break;
2837                 case EF_RH850_FPU_SINGLE: strcat (buf, ", single precision FPU"); break;
2838                 case EF_RH850_SIMD: strcat (buf, ", SIMD"); break;
2839                 case EF_RH850_CACHE: strcat (buf, ", CACHE"); break;
2840                 case EF_RH850_MMU: strcat (buf, ", MMU"); break;
2841                 case EF_RH850_REGMODE22: strcat (buf, ", regmode:22"); break;
2842                 case EF_RH850_REGMODE32: strcat (buf, ", regmode:23"); break;
2843                 case EF_RH850_DATA_ALIGN8: strcat (buf, ", 8-byte alignment"); break;
2844                 case EF_RH850_GP_FIX: strcat (buf, ", r4 fixed"); break;
2845                 case EF_RH850_GP_NOFIX: strcat (buf, ", r4 free"); break;
2846                 case EF_RH850_EP_FIX: strcat (buf, ", r30 fixed"); break;
2847                 case EF_RH850_EP_NOFIX: strcat (buf, ", r30 free"); break;
2848                 case EF_RH850_TP_FIX: strcat (buf, ", r5 fixed"); break;
2849                 case EF_RH850_TP_NOFIX: strcat (buf, ", r5 free"); break;
2850                 case EF_RH850_REG2_RESERVE: strcat (buf, ", r2 fixed"); break;
2851                 case EF_RH850_REG2_NORESERVE: strcat (buf, ", r2 free"); break;
2852                 default: break;
2853                 }
2854             }
2855           break;
2856
2857         case EM_V850:
2858         case EM_CYGNUS_V850:
2859           switch (e_flags & EF_V850_ARCH)
2860             {
2861             case E_V850E3V5_ARCH:
2862               strcat (buf, ", v850e3v5");
2863               break;
2864             case E_V850E2V3_ARCH:
2865               strcat (buf, ", v850e2v3");
2866               break;
2867             case E_V850E2_ARCH:
2868               strcat (buf, ", v850e2");
2869               break;
2870             case E_V850E1_ARCH:
2871               strcat (buf, ", v850e1");
2872               break;
2873             case E_V850E_ARCH:
2874               strcat (buf, ", v850e");
2875               break;
2876             case E_V850_ARCH:
2877               strcat (buf, ", v850");
2878               break;
2879             default:
2880               strcat (buf, _(", unknown v850 architecture variant"));
2881               break;
2882             }
2883           break;
2884
2885         case EM_M32R:
2886         case EM_CYGNUS_M32R:
2887           if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
2888             strcat (buf, ", m32r");
2889           break;
2890
2891         case EM_MIPS:
2892         case EM_MIPS_RS3_LE:
2893           if (e_flags & EF_MIPS_NOREORDER)
2894             strcat (buf, ", noreorder");
2895
2896           if (e_flags & EF_MIPS_PIC)
2897             strcat (buf, ", pic");
2898
2899           if (e_flags & EF_MIPS_CPIC)
2900             strcat (buf, ", cpic");
2901
2902           if (e_flags & EF_MIPS_UCODE)
2903             strcat (buf, ", ugen_reserved");
2904
2905           if (e_flags & EF_MIPS_ABI2)
2906             strcat (buf, ", abi2");
2907
2908           if (e_flags & EF_MIPS_OPTIONS_FIRST)
2909             strcat (buf, ", odk first");
2910
2911           if (e_flags & EF_MIPS_32BITMODE)
2912             strcat (buf, ", 32bitmode");
2913
2914           if (e_flags & EF_MIPS_NAN2008)
2915             strcat (buf, ", nan2008");
2916
2917           if (e_flags & EF_MIPS_FP64)
2918             strcat (buf, ", fp64");
2919
2920           switch ((e_flags & EF_MIPS_MACH))
2921             {
2922             case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
2923             case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
2924             case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
2925             case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
2926             case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
2927             case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
2928             case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
2929             case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
2930             case E_MIPS_MACH_SB1:  strcat (buf, ", sb1");  break;
2931             case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
2932             case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break;
2933             case E_MIPS_MACH_LS2F: strcat (buf, ", loongson-2f"); break;
2934             case E_MIPS_MACH_LS3A: strcat (buf, ", loongson-3a"); break;
2935             case E_MIPS_MACH_OCTEON: strcat (buf, ", octeon"); break;
2936             case E_MIPS_MACH_OCTEON2: strcat (buf, ", octeon2"); break;
2937             case E_MIPS_MACH_OCTEON3: strcat (buf, ", octeon3"); break;
2938             case E_MIPS_MACH_XLR:  strcat (buf, ", xlr"); break;
2939             case 0:
2940             /* We simply ignore the field in this case to avoid confusion:
2941                MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
2942                extension.  */
2943               break;
2944             default: strcat (buf, _(", unknown CPU")); break;
2945             }
2946
2947           switch ((e_flags & EF_MIPS_ABI))
2948             {
2949             case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
2950             case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
2951             case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
2952             case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
2953             case 0:
2954             /* We simply ignore the field in this case to avoid confusion:
2955                MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
2956                This means it is likely to be an o32 file, but not for
2957                sure.  */
2958               break;
2959             default: strcat (buf, _(", unknown ABI")); break;
2960             }
2961
2962           if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
2963             strcat (buf, ", mdmx");
2964
2965           if (e_flags & EF_MIPS_ARCH_ASE_M16)
2966             strcat (buf, ", mips16");
2967
2968           if (e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
2969             strcat (buf, ", micromips");
2970
2971           switch ((e_flags & EF_MIPS_ARCH))
2972             {
2973             case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
2974             case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
2975             case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
2976             case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
2977             case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
2978             case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
2979             case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
2980             case E_MIPS_ARCH_32R6: strcat (buf, ", mips32r6"); break;
2981             case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
2982             case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
2983             case E_MIPS_ARCH_64R6: strcat (buf, ", mips64r6"); break;
2984             default: strcat (buf, _(", unknown ISA")); break;
2985             }
2986           break;
2987
2988         case EM_NDS32:
2989           decode_NDS32_machine_flags (e_flags, buf, sizeof buf);
2990           break;
2991
2992         case EM_SH:
2993           switch ((e_flags & EF_SH_MACH_MASK))
2994             {
2995             case EF_SH1: strcat (buf, ", sh1"); break;
2996             case EF_SH2: strcat (buf, ", sh2"); break;
2997             case EF_SH3: strcat (buf, ", sh3"); break;
2998             case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
2999             case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
3000             case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
3001             case EF_SH3E: strcat (buf, ", sh3e"); break;
3002             case EF_SH4: strcat (buf, ", sh4"); break;
3003             case EF_SH5: strcat (buf, ", sh5"); break;
3004             case EF_SH2E: strcat (buf, ", sh2e"); break;
3005             case EF_SH4A: strcat (buf, ", sh4a"); break;
3006             case EF_SH2A: strcat (buf, ", sh2a"); break;
3007             case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
3008             case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
3009             case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
3010             case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
3011             case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
3012             case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
3013             case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
3014             case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
3015             case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
3016             default: strcat (buf, _(", unknown ISA")); break;
3017             }
3018
3019           if (e_flags & EF_SH_PIC)
3020             strcat (buf, ", pic");
3021
3022           if (e_flags & EF_SH_FDPIC)
3023             strcat (buf, ", fdpic");
3024           break;
3025           
3026         case EM_OR1K:
3027           if (e_flags & EF_OR1K_NODELAY)
3028             strcat (buf, ", no delay");
3029           break;
3030
3031         case EM_SPARCV9:
3032           if (e_flags & EF_SPARC_32PLUS)
3033             strcat (buf, ", v8+");
3034
3035           if (e_flags & EF_SPARC_SUN_US1)
3036             strcat (buf, ", ultrasparcI");
3037
3038           if (e_flags & EF_SPARC_SUN_US3)
3039             strcat (buf, ", ultrasparcIII");
3040
3041           if (e_flags & EF_SPARC_HAL_R1)
3042             strcat (buf, ", halr1");
3043
3044           if (e_flags & EF_SPARC_LEDATA)
3045             strcat (buf, ", ledata");
3046
3047           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
3048             strcat (buf, ", tso");
3049
3050           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
3051             strcat (buf, ", pso");
3052
3053           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
3054             strcat (buf, ", rmo");
3055           break;
3056
3057         case EM_PARISC:
3058           switch (e_flags & EF_PARISC_ARCH)
3059             {
3060             case EFA_PARISC_1_0:
3061               strcpy (buf, ", PA-RISC 1.0");
3062               break;
3063             case EFA_PARISC_1_1:
3064               strcpy (buf, ", PA-RISC 1.1");
3065               break;
3066             case EFA_PARISC_2_0:
3067               strcpy (buf, ", PA-RISC 2.0");
3068               break;
3069             default:
3070               break;
3071             }
3072           if (e_flags & EF_PARISC_TRAPNIL)
3073             strcat (buf, ", trapnil");
3074           if (e_flags & EF_PARISC_EXT)
3075             strcat (buf, ", ext");
3076           if (e_flags & EF_PARISC_LSB)
3077             strcat (buf, ", lsb");
3078           if (e_flags & EF_PARISC_WIDE)
3079             strcat (buf, ", wide");
3080           if (e_flags & EF_PARISC_NO_KABP)
3081             strcat (buf, ", no kabp");
3082           if (e_flags & EF_PARISC_LAZYSWAP)
3083             strcat (buf, ", lazyswap");
3084           break;
3085
3086         case EM_PJ:
3087         case EM_PJ_OLD:
3088           if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
3089             strcat (buf, ", new calling convention");
3090
3091           if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
3092             strcat (buf, ", gnu calling convention");
3093           break;
3094
3095         case EM_IA_64:
3096           if ((e_flags & EF_IA_64_ABI64))
3097             strcat (buf, ", 64-bit");
3098           else
3099             strcat (buf, ", 32-bit");
3100           if ((e_flags & EF_IA_64_REDUCEDFP))
3101             strcat (buf, ", reduced fp model");
3102           if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
3103             strcat (buf, ", no function descriptors, constant gp");
3104           else if ((e_flags & EF_IA_64_CONS_GP))
3105             strcat (buf, ", constant gp");
3106           if ((e_flags & EF_IA_64_ABSOLUTE))
3107             strcat (buf, ", absolute");
3108           if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
3109             {
3110               if ((e_flags & EF_IA_64_VMS_LINKAGES))
3111                 strcat (buf, ", vms_linkages");
3112               switch ((e_flags & EF_IA_64_VMS_COMCOD))
3113                 {
3114                 case EF_IA_64_VMS_COMCOD_SUCCESS:
3115                   break;
3116                 case EF_IA_64_VMS_COMCOD_WARNING:
3117                   strcat (buf, ", warning");
3118                   break;
3119                 case EF_IA_64_VMS_COMCOD_ERROR:
3120                   strcat (buf, ", error");
3121                   break;
3122                 case EF_IA_64_VMS_COMCOD_ABORT:
3123                   strcat (buf, ", abort");
3124                   break;
3125                 default:
3126                   abort ();
3127                 }
3128             }
3129           break;
3130
3131         case EM_VAX:
3132           if ((e_flags & EF_VAX_NONPIC))
3133             strcat (buf, ", non-PIC");
3134           if ((e_flags & EF_VAX_DFLOAT))
3135             strcat (buf, ", D-Float");
3136           if ((e_flags & EF_VAX_GFLOAT))
3137             strcat (buf, ", G-Float");
3138           break;
3139
3140         case EM_RL78:
3141           if (e_flags & E_FLAG_RL78_G10)
3142             strcat (buf, ", G10");
3143           if (e_flags & E_FLAG_RL78_64BIT_DOUBLES)
3144             strcat (buf, ", 64-bit doubles");
3145           break;
3146
3147         case EM_RX:
3148           if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
3149             strcat (buf, ", 64-bit doubles");
3150           if (e_flags & E_FLAG_RX_DSP)
3151             strcat (buf, ", dsp");
3152           if (e_flags & E_FLAG_RX_PID)
3153             strcat (buf, ", pid");
3154           if (e_flags & E_FLAG_RX_ABI)
3155             strcat (buf, ", RX ABI");
3156           break;
3157
3158         case EM_S390:
3159           if (e_flags & EF_S390_HIGH_GPRS)
3160             strcat (buf, ", highgprs");
3161           break;
3162
3163         case EM_TI_C6000:
3164           if ((e_flags & EF_C6000_REL))
3165             strcat (buf, ", relocatable module");
3166           break;
3167
3168         case EM_MSP430:
3169           strcat (buf, _(": architecture variant: "));
3170           switch (e_flags & EF_MSP430_MACH)
3171             {
3172             case E_MSP430_MACH_MSP430x11: strcat (buf, "MSP430x11"); break;
3173             case E_MSP430_MACH_MSP430x11x1 : strcat (buf, "MSP430x11x1 "); break;
3174             case E_MSP430_MACH_MSP430x12: strcat (buf, "MSP430x12"); break;
3175             case E_MSP430_MACH_MSP430x13: strcat (buf, "MSP430x13"); break;
3176             case E_MSP430_MACH_MSP430x14: strcat (buf, "MSP430x14"); break;
3177             case E_MSP430_MACH_MSP430x15: strcat (buf, "MSP430x15"); break;
3178             case E_MSP430_MACH_MSP430x16: strcat (buf, "MSP430x16"); break;
3179             case E_MSP430_MACH_MSP430x31: strcat (buf, "MSP430x31"); break;
3180             case E_MSP430_MACH_MSP430x32: strcat (buf, "MSP430x32"); break;
3181             case E_MSP430_MACH_MSP430x33: strcat (buf, "MSP430x33"); break;
3182             case E_MSP430_MACH_MSP430x41: strcat (buf, "MSP430x41"); break;
3183             case E_MSP430_MACH_MSP430x42: strcat (buf, "MSP430x42"); break;
3184             case E_MSP430_MACH_MSP430x43: strcat (buf, "MSP430x43"); break;
3185             case E_MSP430_MACH_MSP430x44: strcat (buf, "MSP430x44"); break;
3186             case E_MSP430_MACH_MSP430X  : strcat (buf, "MSP430X"); break;
3187             default:
3188               strcat (buf, _(": unknown")); break;
3189             }
3190
3191           if (e_flags & ~ EF_MSP430_MACH)
3192             strcat (buf, _(": unknown extra flag bits also present"));
3193         }
3194     }
3195
3196   return buf;
3197 }
3198
3199 static const char *
3200 get_osabi_name (unsigned int osabi)
3201 {
3202   static char buff[32];
3203
3204   switch (osabi)
3205     {
3206     case ELFOSABI_NONE:         return "UNIX - System V";
3207     case ELFOSABI_HPUX:         return "UNIX - HP-UX";
3208     case ELFOSABI_NETBSD:       return "UNIX - NetBSD";
3209     case ELFOSABI_GNU:          return "UNIX - GNU";
3210     case ELFOSABI_SOLARIS:      return "UNIX - Solaris";
3211     case ELFOSABI_AIX:          return "UNIX - AIX";
3212     case ELFOSABI_IRIX:         return "UNIX - IRIX";
3213     case ELFOSABI_FREEBSD:      return "UNIX - FreeBSD";
3214     case ELFOSABI_TRU64:        return "UNIX - TRU64";
3215     case ELFOSABI_MODESTO:      return "Novell - Modesto";
3216     case ELFOSABI_OPENBSD:      return "UNIX - OpenBSD";
3217     case ELFOSABI_OPENVMS:      return "VMS - OpenVMS";
3218     case ELFOSABI_NSK:          return "HP - Non-Stop Kernel";
3219     case ELFOSABI_AROS:         return "AROS";
3220     case ELFOSABI_FENIXOS:      return "FenixOS";
3221     default:
3222       if (osabi >= 64)
3223         switch (elf_header.e_machine)
3224           {
3225           case EM_ARM:
3226             switch (osabi)
3227               {
3228               case ELFOSABI_ARM:        return "ARM";
3229               default:
3230                 break;
3231               }
3232             break;
3233
3234           case EM_MSP430:
3235           case EM_MSP430_OLD:
3236             switch (osabi)
3237               {
3238               case ELFOSABI_STANDALONE: return _("Standalone App");
3239               default:
3240                 break;
3241               }
3242             break;
3243
3244           case EM_TI_C6000:
3245             switch (osabi)
3246               {
3247               case ELFOSABI_C6000_ELFABI:       return _("Bare-metal C6000");
3248               case ELFOSABI_C6000_LINUX:        return "Linux C6000";
3249               default:
3250                 break;
3251               }
3252             break;
3253
3254           default:
3255             break;
3256           }
3257       snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
3258       return buff;
3259     }
3260 }
3261
3262 static const char *
3263 get_aarch64_segment_type (unsigned long type)
3264 {
3265   switch (type)
3266     {
3267     case PT_AARCH64_ARCHEXT:
3268       return "AARCH64_ARCHEXT";
3269     default:
3270       break;
3271     }
3272
3273   return NULL;
3274 }
3275
3276 static const char *
3277 get_arm_segment_type (unsigned long type)
3278 {
3279   switch (type)
3280     {
3281     case PT_ARM_EXIDX:
3282       return "EXIDX";
3283     default:
3284       break;
3285     }
3286
3287   return NULL;
3288 }
3289
3290 static const char *
3291 get_mips_segment_type (unsigned long type)
3292 {
3293   switch (type)
3294     {
3295     case PT_MIPS_REGINFO:
3296       return "REGINFO";
3297     case PT_MIPS_RTPROC:
3298       return "RTPROC";
3299     case PT_MIPS_OPTIONS:
3300       return "OPTIONS";
3301     case PT_MIPS_ABIFLAGS:
3302       return "ABIFLAGS";
3303     default:
3304       break;
3305     }
3306
3307   return NULL;
3308 }
3309
3310 static const char *
3311 get_parisc_segment_type (unsigned long type)
3312 {
3313   switch (type)
3314     {
3315     case PT_HP_TLS:             return "HP_TLS";
3316     case PT_HP_CORE_NONE:       return "HP_CORE_NONE";
3317     case PT_HP_CORE_VERSION:    return "HP_CORE_VERSION";
3318     case PT_HP_CORE_KERNEL:     return "HP_CORE_KERNEL";
3319     case PT_HP_CORE_COMM:       return "HP_CORE_COMM";
3320     case PT_HP_CORE_PROC:       return "HP_CORE_PROC";
3321     case PT_HP_CORE_LOADABLE:   return "HP_CORE_LOADABLE";
3322     case PT_HP_CORE_STACK:      return "HP_CORE_STACK";
3323     case PT_HP_CORE_SHM:        return "HP_CORE_SHM";
3324     case PT_HP_CORE_MMF:        return "HP_CORE_MMF";
3325     case PT_HP_PARALLEL:        return "HP_PARALLEL";
3326     case PT_HP_FASTBIND:        return "HP_FASTBIND";
3327     case PT_HP_OPT_ANNOT:       return "HP_OPT_ANNOT";
3328     case PT_HP_HSL_ANNOT:       return "HP_HSL_ANNOT";
3329     case PT_HP_STACK:           return "HP_STACK";
3330     case PT_HP_CORE_UTSNAME:    return "HP_CORE_UTSNAME";
3331     case PT_PARISC_ARCHEXT:     return "PARISC_ARCHEXT";
3332     case PT_PARISC_UNWIND:      return "PARISC_UNWIND";
3333     case PT_PARISC_WEAKORDER:   return "PARISC_WEAKORDER";
3334     default:
3335       break;
3336     }
3337
3338   return NULL;
3339 }
3340
3341 static const char *
3342 get_ia64_segment_type (unsigned long type)
3343 {
3344   switch (type)
3345     {
3346     case PT_IA_64_ARCHEXT:      return "IA_64_ARCHEXT";
3347     case PT_IA_64_UNWIND:       return "IA_64_UNWIND";
3348     case PT_HP_TLS:             return "HP_TLS";
3349     case PT_IA_64_HP_OPT_ANOT:  return "HP_OPT_ANNOT";
3350     case PT_IA_64_HP_HSL_ANOT:  return "HP_HSL_ANNOT";
3351     case PT_IA_64_HP_STACK:     return "HP_STACK";
3352     default:
3353       break;
3354     }
3355
3356   return NULL;
3357 }
3358
3359 static const char *
3360 get_tic6x_segment_type (unsigned long type)
3361 {
3362   switch (type)
3363     {
3364     case PT_C6000_PHATTR:       return "C6000_PHATTR";
3365     default:
3366       break;
3367     }
3368
3369   return NULL;
3370 }
3371
3372 static const char *
3373 get_segment_type (unsigned long p_type)
3374 {
3375   static char buff[32];
3376
3377   switch (p_type)
3378     {
3379     case PT_NULL:       return "NULL";
3380     case PT_LOAD:       return "LOAD";
3381     case PT_DYNAMIC:    return "DYNAMIC";
3382     case PT_INTERP:     return "INTERP";
3383     case PT_NOTE:       return "NOTE";
3384     case PT_SHLIB:      return "SHLIB";
3385     case PT_PHDR:       return "PHDR";
3386     case PT_TLS:        return "TLS";
3387
3388     case PT_GNU_EH_FRAME:
3389                         return "GNU_EH_FRAME";
3390     case PT_GNU_STACK:  return "GNU_STACK";
3391     case PT_GNU_RELRO:  return "GNU_RELRO";
3392
3393     default:
3394       if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
3395         {
3396           const char * result;
3397
3398           switch (elf_header.e_machine)
3399             {
3400             case EM_AARCH64:
3401               result = get_aarch64_segment_type (p_type);
3402               break;
3403             case EM_ARM:
3404               result = get_arm_segment_type (p_type);
3405               break;
3406             case EM_MIPS:
3407             case EM_MIPS_RS3_LE:
3408               result = get_mips_segment_type (p_type);
3409               break;
3410             case EM_PARISC:
3411               result = get_parisc_segment_type (p_type);
3412               break;
3413             case EM_IA_64:
3414               result = get_ia64_segment_type (p_type);
3415               break;
3416             case EM_TI_C6000:
3417               result = get_tic6x_segment_type (p_type);
3418               break;
3419             default:
3420               result = NULL;
3421               break;
3422             }
3423
3424           if (result != NULL)
3425             return result;
3426
3427           sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
3428         }
3429       else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
3430         {
3431           const char * result;
3432
3433           switch (elf_header.e_machine)
3434             {
3435             case EM_PARISC:
3436               result = get_parisc_segment_type (p_type);
3437               break;
3438             case EM_IA_64:
3439               result = get_ia64_segment_type (p_type);
3440               break;
3441             default:
3442               result = NULL;
3443               break;
3444             }
3445
3446           if (result != NULL)
3447             return result;
3448
3449           sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
3450         }
3451       else
3452         snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
3453
3454       return buff;
3455     }
3456 }
3457
3458 static const char *
3459 get_mips_section_type_name (unsigned int sh_type)
3460 {
3461   switch (sh_type)
3462     {
3463     case SHT_MIPS_LIBLIST:       return "MIPS_LIBLIST";
3464     case SHT_MIPS_MSYM:          return "MIPS_MSYM";
3465     case SHT_MIPS_CONFLICT:      return "MIPS_CONFLICT";
3466     case SHT_MIPS_GPTAB:         return "MIPS_GPTAB";
3467     case SHT_MIPS_UCODE:         return "MIPS_UCODE";
3468     case SHT_MIPS_DEBUG:         return "MIPS_DEBUG";
3469     case SHT_MIPS_REGINFO:       return "MIPS_REGINFO";
3470     case SHT_MIPS_PACKAGE:       return "MIPS_PACKAGE";
3471     case SHT_MIPS_PACKSYM:       return "MIPS_PACKSYM";
3472     case SHT_MIPS_RELD:          return "MIPS_RELD";
3473     case SHT_MIPS_IFACE:         return "MIPS_IFACE";
3474     case SHT_MIPS_CONTENT:       return "MIPS_CONTENT";
3475     case SHT_MIPS_OPTIONS:       return "MIPS_OPTIONS";
3476     case SHT_MIPS_SHDR:          return "MIPS_SHDR";
3477     case SHT_MIPS_FDESC:         return "MIPS_FDESC";
3478     case SHT_MIPS_EXTSYM:        return "MIPS_EXTSYM";
3479     case SHT_MIPS_DENSE:         return "MIPS_DENSE";
3480     case SHT_MIPS_PDESC:         return "MIPS_PDESC";
3481     case SHT_MIPS_LOCSYM:        return "MIPS_LOCSYM";
3482     case SHT_MIPS_AUXSYM:        return "MIPS_AUXSYM";
3483     case SHT_MIPS_OPTSYM:        return "MIPS_OPTSYM";
3484     case SHT_MIPS_LOCSTR:        return "MIPS_LOCSTR";
3485     case SHT_MIPS_LINE:          return "MIPS_LINE";
3486     case SHT_MIPS_RFDESC:        return "MIPS_RFDESC";
3487     case SHT_MIPS_DELTASYM:      return "MIPS_DELTASYM";
3488     case SHT_MIPS_DELTAINST:     return "MIPS_DELTAINST";
3489     case SHT_MIPS_DELTACLASS:    return "MIPS_DELTACLASS";
3490     case SHT_MIPS_DWARF:         return "MIPS_DWARF";
3491     case SHT_MIPS_DELTADECL:     return "MIPS_DELTADECL";
3492     case SHT_MIPS_SYMBOL_LIB:    return "MIPS_SYMBOL_LIB";
3493     case SHT_MIPS_EVENTS:        return "MIPS_EVENTS";
3494     case SHT_MIPS_TRANSLATE:     return "MIPS_TRANSLATE";
3495     case SHT_MIPS_PIXIE:         return "MIPS_PIXIE";
3496     case SHT_MIPS_XLATE:         return "MIPS_XLATE";
3497     case SHT_MIPS_XLATE_DEBUG:   return "MIPS_XLATE_DEBUG";
3498     case SHT_MIPS_WHIRL:         return "MIPS_WHIRL";
3499     case SHT_MIPS_EH_REGION:     return "MIPS_EH_REGION";
3500     case SHT_MIPS_XLATE_OLD:     return "MIPS_XLATE_OLD";
3501     case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
3502     case SHT_MIPS_ABIFLAGS:      return "MIPS_ABIFLAGS";
3503     default:
3504       break;
3505     }
3506   return NULL;
3507 }
3508
3509 static const char *
3510 get_parisc_section_type_name (unsigned int sh_type)
3511 {
3512   switch (sh_type)
3513     {
3514     case SHT_PARISC_EXT:        return "PARISC_EXT";
3515     case SHT_PARISC_UNWIND:     return "PARISC_UNWIND";
3516     case SHT_PARISC_DOC:        return "PARISC_DOC";
3517     case SHT_PARISC_ANNOT:      return "PARISC_ANNOT";
3518     case SHT_PARISC_SYMEXTN:    return "PARISC_SYMEXTN";
3519     case SHT_PARISC_STUBS:      return "PARISC_STUBS";
3520     case SHT_PARISC_DLKM:       return "PARISC_DLKM";
3521     default:
3522       break;
3523     }
3524   return NULL;
3525 }
3526
3527 static const char *
3528 get_ia64_section_type_name (unsigned int sh_type)
3529 {
3530   /* If the top 8 bits are 0x78 the next 8 are the os/abi ID.  */
3531   if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
3532     return get_osabi_name ((sh_type & 0x00FF0000) >> 16);
3533
3534   switch (sh_type)
3535     {
3536     case SHT_IA_64_EXT:                return "IA_64_EXT";
3537     case SHT_IA_64_UNWIND:             return "IA_64_UNWIND";
3538     case SHT_IA_64_PRIORITY_INIT:      return "IA_64_PRIORITY_INIT";
3539     case SHT_IA_64_VMS_TRACE:          return "VMS_TRACE";
3540     case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
3541     case SHT_IA_64_VMS_DEBUG:          return "VMS_DEBUG";
3542     case SHT_IA_64_VMS_DEBUG_STR:      return "VMS_DEBUG_STR";
3543     case SHT_IA_64_VMS_LINKAGES:       return "VMS_LINKAGES";
3544     case SHT_IA_64_VMS_SYMBOL_VECTOR:  return "VMS_SYMBOL_VECTOR";
3545     case SHT_IA_64_VMS_FIXUP:          return "VMS_FIXUP";
3546     default:
3547       break;
3548     }
3549   return NULL;
3550 }
3551
3552 static const char *
3553 get_x86_64_section_type_name (unsigned int sh_type)
3554 {
3555   switch (sh_type)
3556     {
3557     case SHT_X86_64_UNWIND:     return "X86_64_UNWIND";
3558     default:
3559       break;
3560     }
3561   return NULL;
3562 }
3563
3564 static const char *
3565 get_aarch64_section_type_name (unsigned int sh_type)
3566 {
3567   switch (sh_type)
3568     {
3569     case SHT_AARCH64_ATTRIBUTES:
3570       return "AARCH64_ATTRIBUTES";
3571     default:
3572       break;
3573     }
3574   return NULL;
3575 }
3576
3577 static const char *
3578 get_arm_section_type_name (unsigned int sh_type)
3579 {
3580   switch (sh_type)
3581     {
3582     case SHT_ARM_EXIDX:           return "ARM_EXIDX";
3583     case SHT_ARM_PREEMPTMAP:      return "ARM_PREEMPTMAP";
3584     case SHT_ARM_ATTRIBUTES:      return "ARM_ATTRIBUTES";
3585     case SHT_ARM_DEBUGOVERLAY:    return "ARM_DEBUGOVERLAY";
3586     case SHT_ARM_OVERLAYSECTION:  return "ARM_OVERLAYSECTION";
3587     default:
3588       break;
3589     }
3590   return NULL;
3591 }
3592
3593 static const char *
3594 get_tic6x_section_type_name (unsigned int sh_type)
3595 {
3596   switch (sh_type)
3597     {
3598     case SHT_C6000_UNWIND:
3599       return "C6000_UNWIND";
3600     case SHT_C6000_PREEMPTMAP:
3601       return "C6000_PREEMPTMAP";
3602     case SHT_C6000_ATTRIBUTES:
3603       return "C6000_ATTRIBUTES";
3604     case SHT_TI_ICODE:
3605       return "TI_ICODE";
3606     case SHT_TI_XREF:
3607       return "TI_XREF";
3608     case SHT_TI_HANDLER:
3609       return "TI_HANDLER";
3610     case SHT_TI_INITINFO:
3611       return "TI_INITINFO";
3612     case SHT_TI_PHATTRS:
3613       return "TI_PHATTRS";
3614     default:
3615       break;
3616     }
3617   return NULL;
3618 }
3619
3620 static const char *
3621 get_msp430x_section_type_name (unsigned int sh_type)
3622 {
3623   switch (sh_type)
3624     {
3625     case SHT_MSP430_SEC_FLAGS:   return "MSP430_SEC_FLAGS";
3626     case SHT_MSP430_SYM_ALIASES: return "MSP430_SYM_ALIASES";
3627     case SHT_MSP430_ATTRIBUTES:  return "MSP430_ATTRIBUTES";
3628     default: return NULL;
3629     }
3630 }
3631
3632 static const char *
3633 get_section_type_name (unsigned int sh_type)
3634 {
3635   static char buff[32];
3636
3637   switch (sh_type)
3638     {
3639     case SHT_NULL:              return "NULL";
3640     case SHT_PROGBITS:          return "PROGBITS";
3641     case SHT_SYMTAB:            return "SYMTAB";
3642     case SHT_STRTAB:            return "STRTAB";
3643     case SHT_RELA:              return "RELA";
3644     case SHT_HASH:              return "HASH";
3645     case SHT_DYNAMIC:           return "DYNAMIC";
3646     case SHT_NOTE:              return "NOTE";
3647     case SHT_NOBITS:            return "NOBITS";
3648     case SHT_REL:               return "REL";
3649     case SHT_SHLIB:             return "SHLIB";
3650     case SHT_DYNSYM:            return "DYNSYM";
3651     case SHT_INIT_ARRAY:        return "INIT_ARRAY";
3652     case SHT_FINI_ARRAY:        return "FINI_ARRAY";
3653     case SHT_PREINIT_ARRAY:     return "PREINIT_ARRAY";
3654     case SHT_GNU_HASH:          return "GNU_HASH";
3655     case SHT_GROUP:             return "GROUP";
3656     case SHT_SYMTAB_SHNDX:      return "SYMTAB SECTION INDICIES";
3657     case SHT_GNU_verdef:        return "VERDEF";
3658     case SHT_GNU_verneed:       return "VERNEED";
3659     case SHT_GNU_versym:        return "VERSYM";
3660     case 0x6ffffff0:            return "VERSYM";
3661     case 0x6ffffffc:            return "VERDEF";
3662     case 0x7ffffffd:            return "AUXILIARY";
3663     case 0x7fffffff:            return "FILTER";
3664     case SHT_GNU_LIBLIST:       return "GNU_LIBLIST";
3665
3666     default:
3667       if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
3668         {
3669           const char * result;
3670
3671           switch (elf_header.e_machine)
3672             {
3673             case EM_MIPS:
3674             case EM_MIPS_RS3_LE:
3675               result = get_mips_section_type_name (sh_type);
3676               break;
3677             case EM_PARISC:
3678               result = get_parisc_section_type_name (sh_type);
3679               break;
3680             case EM_IA_64:
3681               result = get_ia64_section_type_name (sh_type);
3682               break;
3683             case EM_X86_64:
3684             case EM_L1OM:
3685             case EM_K1OM:
3686               result = get_x86_64_section_type_name (sh_type);
3687               break;
3688             case EM_AARCH64:
3689               result = get_aarch64_section_type_name (sh_type);
3690               break;
3691             case EM_ARM:
3692               result = get_arm_section_type_name (sh_type);
3693               break;
3694             case EM_TI_C6000:
3695               result = get_tic6x_section_type_name (sh_type);
3696               break;
3697             case EM_MSP430:
3698               result = get_msp430x_section_type_name (sh_type);
3699               break;
3700             default:
3701               result = NULL;
3702               break;
3703             }
3704
3705           if (result != NULL)
3706             return result;
3707
3708           sprintf (buff, "LOPROC+%x", sh_type - SHT_LOPROC);
3709         }
3710       else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
3711         {
3712           const char * result;
3713
3714           switch (elf_header.e_machine)
3715             {
3716             case EM_IA_64:
3717               result = get_ia64_section_type_name (sh_type);
3718               break;
3719             default:
3720               result = NULL;
3721               break;
3722             }
3723
3724           if (result != NULL)
3725             return result;
3726
3727           sprintf (buff, "LOOS+%x", sh_type - SHT_LOOS);
3728         }
3729       else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
3730         sprintf (buff, "LOUSER+%x", sh_type - SHT_LOUSER);
3731       else
3732         /* This message is probably going to be displayed in a 15
3733            character wide field, so put the hex value first.  */
3734         snprintf (buff, sizeof (buff), _("%08x: <unknown>"), sh_type);
3735
3736       return buff;
3737     }
3738 }
3739
3740 #define OPTION_DEBUG_DUMP       512
3741 #define OPTION_DYN_SYMS         513
3742 #define OPTION_DWARF_DEPTH      514
3743 #define OPTION_DWARF_START      515
3744 #define OPTION_DWARF_CHECK      516
3745
3746 static struct option options[] =
3747 {
3748   {"all",              no_argument, 0, 'a'},
3749   {"file-header",      no_argument, 0, 'h'},
3750   {"program-headers",  no_argument, 0, 'l'},
3751   {"headers",          no_argument, 0, 'e'},
3752   {"histogram",        no_argument, 0, 'I'},
3753   {"segments",         no_argument, 0, 'l'},
3754   {"sections",         no_argument, 0, 'S'},
3755   {"section-headers",  no_argument, 0, 'S'},
3756   {"section-groups",   no_argument, 0, 'g'},
3757   {"section-details",  no_argument, 0, 't'},
3758   {"full-section-name",no_argument, 0, 'N'},
3759   {"symbols",          no_argument, 0, 's'},
3760   {"syms",             no_argument, 0, 's'},
3761   {"dyn-syms",         no_argument, 0, OPTION_DYN_SYMS},
3762   {"relocs",           no_argument, 0, 'r'},
3763   {"notes",            no_argument, 0, 'n'},
3764   {"dynamic",          no_argument, 0, 'd'},
3765   {"arch-specific",    no_argument, 0, 'A'},
3766   {"version-info",     no_argument, 0, 'V'},
3767   {"use-dynamic",      no_argument, 0, 'D'},
3768   {"unwind",           no_argument, 0, 'u'},
3769   {"archive-index",    no_argument, 0, 'c'},
3770   {"hex-dump",         required_argument, 0, 'x'},
3771   {"relocated-dump",   required_argument, 0, 'R'},
3772   {"string-dump",      required_argument, 0, 'p'},
3773 #ifdef SUPPORT_DISASSEMBLY
3774   {"instruction-dump", required_argument, 0, 'i'},
3775 #endif
3776   {"debug-dump",       optional_argument, 0, OPTION_DEBUG_DUMP},
3777
3778   {"dwarf-depth",      required_argument, 0, OPTION_DWARF_DEPTH},
3779   {"dwarf-start",      required_argument, 0, OPTION_DWARF_START},
3780   {"dwarf-check",      no_argument, 0, OPTION_DWARF_CHECK},
3781
3782   {"version",          no_argument, 0, 'v'},
3783   {"wide",             no_argument, 0, 'W'},
3784   {"help",             no_argument, 0, 'H'},
3785   {0,                  no_argument, 0, 0}
3786 };
3787
3788 static void
3789 usage (FILE * stream)
3790 {
3791   fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
3792   fprintf (stream, _(" Display information about the contents of ELF format files\n"));
3793   fprintf (stream, _(" Options are:\n\
3794   -a --all               Equivalent to: -h -l -S -s -r -d -V -A -I\n\
3795   -h --file-header       Display the ELF file header\n\
3796   -l --program-headers   Display the program headers\n\
3797      --segments          An alias for --program-headers\n\
3798   -S --section-headers   Display the sections' header\n\
3799      --sections          An alias for --section-headers\n\
3800   -g --section-groups    Display the section groups\n\
3801   -t --section-details   Display the section details\n\
3802   -e --headers           Equivalent to: -h -l -S\n\
3803   -s --syms              Display the symbol table\n\
3804      --symbols           An alias for --syms\n\
3805   --dyn-syms             Display the dynamic symbol table\n\
3806   -n --notes             Display the core notes (if present)\n\
3807   -r --relocs            Display the relocations (if present)\n\
3808   -u --unwind            Display the unwind info (if present)\n\
3809   -d --dynamic           Display the dynamic section (if present)\n\
3810   -V --version-info      Display the version sections (if present)\n\
3811   -A --arch-specific     Display architecture specific information (if any)\n\
3812   -c --archive-index     Display the symbol/file index in an archive\n\
3813   -D --use-dynamic       Use the dynamic section info when displaying symbols\n\
3814   -x --hex-dump=<number|name>\n\
3815                          Dump the contents of section <number|name> as bytes\n\
3816   -p --string-dump=<number|name>\n\
3817                          Dump the contents of section <number|name> as strings\n\
3818   -R --relocated-dump=<number|name>\n\
3819                          Dump the contents of section <number|name> as relocated bytes\n\
3820   -w[lLiaprmfFsoRt] or\n\
3821   --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
3822                =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
3823                =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
3824                =addr,=cu_index]\n\
3825                          Display the contents of DWARF2 debug sections\n"));
3826   fprintf (stream, _("\
3827   --dwarf-depth=N        Do not display DIEs at depth N or greater\n\
3828   --dwarf-start=N        Display DIEs starting with N, at the same depth\n\
3829                          or deeper\n"));
3830 #ifdef SUPPORT_DISASSEMBLY
3831   fprintf (stream, _("\
3832   -i --instruction-dump=<number|name>\n\
3833                          Disassemble the contents of section <number|name>\n"));
3834 #endif
3835   fprintf (stream, _("\
3836   -I --histogram         Display histogram of bucket list lengths\n\
3837   -W --wide              Allow output width to exceed 80 characters\n\
3838   @<file>                Read options from <file>\n\
3839   -H --help              Display this information\n\
3840   -v --version           Display the version number of readelf\n"));
3841
3842   if (REPORT_BUGS_TO[0] && stream == stdout)
3843     fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
3844
3845   exit (stream == stdout ? 0 : 1);
3846 }
3847
3848 /* Record the fact that the user wants the contents of section number
3849    SECTION to be displayed using the method(s) encoded as flags bits
3850    in TYPE.  Note, TYPE can be zero if we are creating the array for
3851    the first time.  */
3852
3853 static void
3854 request_dump_bynumber (unsigned int section, dump_type type)
3855 {
3856   if (section >= num_dump_sects)
3857     {
3858       dump_type * new_dump_sects;
3859
3860       new_dump_sects = (dump_type *) calloc (section + 1,
3861                                              sizeof (* dump_sects));
3862
3863       if (new_dump_sects == NULL)
3864         error (_("Out of memory allocating dump request table.\n"));
3865       else
3866         {
3867           /* Copy current flag settings.  */
3868           memcpy (new_dump_sects, dump_sects, num_dump_sects * sizeof (* dump_sects));
3869
3870           free (dump_sects);
3871
3872           dump_sects = new_dump_sects;
3873           num_dump_sects = section + 1;
3874         }
3875     }
3876
3877   if (dump_sects)
3878     dump_sects[section] |= type;
3879
3880   return;
3881 }
3882
3883 /* Request a dump by section name.  */
3884
3885 static void
3886 request_dump_byname (const char * section, dump_type type)
3887 {
3888   struct dump_list_entry * new_request;
3889
3890   new_request = (struct dump_list_entry *)
3891       malloc (sizeof (struct dump_list_entry));
3892   if (!new_request)
3893     error (_("Out of memory allocating dump request table.\n"));
3894
3895   new_request->name = strdup (section);
3896   if (!new_request->name)
3897     error (_("Out of memory allocating dump request table.\n"));
3898
3899   new_request->type = type;
3900
3901   new_request->next = dump_sects_byname;
3902   dump_sects_byname = new_request;
3903 }
3904
3905 static inline void
3906 request_dump (dump_type type)
3907 {
3908   int section;
3909   char * cp;
3910
3911   do_dump++;
3912   section = strtoul (optarg, & cp, 0);
3913
3914   if (! *cp && section >= 0)
3915     request_dump_bynumber (section, type);
3916   else
3917     request_dump_byname (optarg, type);
3918 }
3919
3920
3921 static void
3922 parse_args (int argc, char ** argv)
3923 {
3924   int c;
3925
3926   if (argc < 2)
3927     usage (stderr);
3928
3929   while ((c = getopt_long
3930           (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:", options, NULL)) != EOF)
3931     {
3932       switch (c)
3933         {
3934         case 0:
3935           /* Long options.  */
3936           break;
3937         case 'H':
3938           usage (stdout);
3939           break;
3940
3941         case 'a':
3942           do_syms++;
3943           do_reloc++;
3944           do_unwind++;
3945           do_dynamic++;
3946           do_header++;
3947           do_sections++;
3948           do_section_groups++;
3949           do_segments++;
3950           do_version++;
3951           do_histogram++;
3952           do_arch++;
3953           do_notes++;
3954           break;
3955         case 'g':
3956           do_section_groups++;
3957           break;
3958         case 't':
3959         case 'N':
3960           do_sections++;
3961           do_section_details++;
3962           break;
3963         case 'e':
3964           do_header++;
3965           do_sections++;
3966           do_segments++;
3967           break;
3968         case 'A':
3969           do_arch++;
3970           break;
3971         case 'D':
3972           do_using_dynamic++;
3973           break;
3974         case 'r':
3975           do_reloc++;
3976           break;
3977         case 'u':
3978           do_unwind++;
3979           break;
3980         case 'h':
3981           do_header++;
3982           break;
3983         case 'l':
3984           do_segments++;
3985           break;
3986         case 's':
3987           do_syms++;
3988           break;
3989         case 'S':
3990           do_sections++;
3991           break;
3992         case 'd':
3993           do_dynamic++;
3994           break;
3995         case 'I':
3996           do_histogram++;
3997           break;
3998         case 'n':
3999           do_notes++;
4000           break;
4001         case 'c':
4002           do_archive_index++;
4003           break;
4004         case 'x':
4005           request_dump (HEX_DUMP);
4006           break;
4007         case 'p':
4008           request_dump (STRING_DUMP);
4009           break;
4010         case 'R':
4011           request_dump (RELOC_DUMP);
4012           break;
4013         case 'w':
4014           do_dump++;
4015           if (optarg == 0)
4016             {
4017               do_debugging = 1;
4018               dwarf_select_sections_all ();
4019             }
4020           else
4021             {
4022               do_debugging = 0;
4023               dwarf_select_sections_by_letters (optarg);
4024             }
4025           break;
4026         case OPTION_DEBUG_DUMP:
4027           do_dump++;
4028           if (optarg == 0)
4029             do_debugging = 1;
4030           else
4031             {
4032               do_debugging = 0;
4033               dwarf_select_sections_by_names (optarg);
4034             }
4035           break;
4036         case OPTION_DWARF_DEPTH:
4037           {
4038             char *cp;
4039
4040             dwarf_cutoff_level = strtoul (optarg, & cp, 0);
4041           }
4042           break;
4043         case OPTION_DWARF_START:
4044           {
4045             char *cp;
4046
4047             dwarf_start_die = strtoul (optarg, & cp, 0);
4048           }
4049           break;
4050         case OPTION_DWARF_CHECK:
4051           dwarf_check = 1;
4052           break;
4053         case OPTION_DYN_SYMS:
4054           do_dyn_syms++;
4055           break;
4056 #ifdef SUPPORT_DISASSEMBLY
4057         case 'i':
4058           request_dump (DISASS_DUMP);
4059           break;
4060 #endif
4061         case 'v':
4062           print_version (program_name);
4063           break;
4064         case 'V':
4065           do_version++;
4066           break;
4067         case 'W':
4068           do_wide++;
4069           break;
4070         default:
4071           /* xgettext:c-format */
4072           error (_("Invalid option '-%c'\n"), c);
4073           /* Drop through.  */
4074         case '?':
4075           usage (stderr);
4076         }
4077     }
4078
4079   if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
4080       && !do_segments && !do_header && !do_dump && !do_version
4081       && !do_histogram && !do_debugging && !do_arch && !do_notes
4082       && !do_section_groups && !do_archive_index
4083       && !do_dyn_syms)
4084     usage (stderr);
4085   else if (argc < 3)
4086     {
4087       warn (_("Nothing to do.\n"));
4088       usage (stderr);
4089     }
4090 }
4091
4092 static const char *
4093 get_elf_class (unsigned int elf_class)
4094 {
4095   static char buff[32];
4096
4097   switch (elf_class)
4098     {
4099     case ELFCLASSNONE: return _("none");
4100     case ELFCLASS32:   return "ELF32";
4101     case ELFCLASS64:   return "ELF64";
4102     default:
4103       snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
4104       return buff;
4105     }
4106 }
4107
4108 static const char *
4109 get_data_encoding (unsigned int encoding)
4110 {
4111   static char buff[32];
4112
4113   switch (encoding)
4114     {
4115     case ELFDATANONE: return _("none");
4116     case ELFDATA2LSB: return _("2's complement, little endian");
4117     case ELFDATA2MSB: return _("2's complement, big endian");
4118     default:
4119       snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
4120       return buff;
4121     }
4122 }
4123
4124 /* Decode the data held in 'elf_header'.  */
4125
4126 static int
4127 process_file_header (void)
4128 {
4129   if (   elf_header.e_ident[EI_MAG0] != ELFMAG0
4130       || elf_header.e_ident[EI_MAG1] != ELFMAG1
4131       || elf_header.e_ident[EI_MAG2] != ELFMAG2
4132       || elf_header.e_ident[EI_MAG3] != ELFMAG3)
4133     {
4134       error
4135         (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
4136       return 0;
4137     }
4138
4139   init_dwarf_regnames (elf_header.e_machine);
4140
4141   if (do_header)
4142     {
4143       int i;
4144
4145       printf (_("ELF Header:\n"));
4146       printf (_("  Magic:   "));
4147       for (i = 0; i < EI_NIDENT; i++)
4148         printf ("%2.2x ", elf_header.e_ident[i]);
4149       printf ("\n");
4150       printf (_("  Class:                             %s\n"),
4151               get_elf_class (elf_header.e_ident[EI_CLASS]));
4152       printf (_("  Data:                              %s\n"),
4153               get_data_encoding (elf_header.e_ident[EI_DATA]));
4154       printf (_("  Version:                           %d %s\n"),
4155               elf_header.e_ident[EI_VERSION],
4156               (elf_header.e_ident[EI_VERSION] == EV_CURRENT
4157                ? "(current)"
4158                : (elf_header.e_ident[EI_VERSION] != EV_NONE
4159                   ? _("<unknown: %lx>")
4160                   : "")));
4161       printf (_("  OS/ABI:                            %s\n"),
4162               get_osabi_name (elf_header.e_ident[EI_OSABI]));
4163       printf (_("  ABI Version:                       %d\n"),
4164               elf_header.e_ident[EI_ABIVERSION]);
4165       printf (_("  Type:                              %s\n"),
4166               get_file_type (elf_header.e_type));
4167       printf (_("  Machine:                           %s\n"),
4168               get_machine_name (elf_header.e_machine));
4169       printf (_("  Version:                           0x%lx\n"),
4170               (unsigned long) elf_header.e_version);
4171
4172       printf (_("  Entry point address:               "));
4173       print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4174       printf (_("\n  Start of program headers:          "));
4175       print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4176       printf (_(" (bytes into file)\n  Start of section headers:          "));
4177       print_vma ((bfd_vma) elf_header.e_shoff, DEC);
4178       printf (_(" (bytes into file)\n"));
4179
4180       printf (_("  Flags:                             0x%lx%s\n"),
4181               (unsigned long) elf_header.e_flags,
4182               get_machine_flags (elf_header.e_flags, elf_header.e_machine));
4183       printf (_("  Size of this header:               %ld (bytes)\n"),
4184               (long) elf_header.e_ehsize);
4185       printf (_("  Size of program headers:           %ld (bytes)\n"),
4186               (long) elf_header.e_phentsize);
4187       printf (_("  Number of program headers:         %ld"),
4188               (long) elf_header.e_phnum);
4189       if (section_headers != NULL
4190           && elf_header.e_phnum == PN_XNUM
4191           && section_headers[0].sh_info != 0)
4192         printf (" (%ld)", (long) section_headers[0].sh_info);
4193       putc ('\n', stdout);
4194       printf (_("  Size of section headers:           %ld (bytes)\n"),
4195               (long) elf_header.e_shentsize);
4196       printf (_("  Number of section headers:         %ld"),
4197               (long) elf_header.e_shnum);
4198       if (section_headers != NULL && elf_header.e_shnum == SHN_UNDEF)
4199         printf (" (%ld)", (long) section_headers[0].sh_size);
4200       putc ('\n', stdout);
4201       printf (_("  Section header string table index: %ld"),
4202               (long) elf_header.e_shstrndx);
4203       if (section_headers != NULL
4204           && elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
4205         printf (" (%u)", section_headers[0].sh_link);
4206       else if (elf_header.e_shstrndx != SHN_UNDEF
4207                && elf_header.e_shstrndx >= elf_header.e_shnum)
4208         printf (_(" <corrupt: out of range>"));
4209       putc ('\n', stdout);
4210     }
4211
4212   if (section_headers != NULL)
4213     {
4214       if (elf_header.e_phnum == PN_XNUM
4215           && section_headers[0].sh_info != 0)
4216         elf_header.e_phnum = section_headers[0].sh_info;
4217       if (elf_header.e_shnum == SHN_UNDEF)
4218         elf_header.e_shnum = section_headers[0].sh_size;
4219       if (elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
4220         elf_header.e_shstrndx = section_headers[0].sh_link;
4221       else if (elf_header.e_shstrndx >= elf_header.e_shnum)
4222         elf_header.e_shstrndx = SHN_UNDEF;
4223       free (section_headers);
4224       section_headers = NULL;
4225     }
4226
4227   return 1;
4228 }
4229
4230 static bfd_boolean
4231 get_32bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
4232 {
4233   Elf32_External_Phdr * phdrs;
4234   Elf32_External_Phdr * external;
4235   Elf_Internal_Phdr *   internal;
4236   unsigned int i;
4237   unsigned int size = elf_header.e_phentsize;
4238   unsigned int num  = elf_header.e_phnum;
4239
4240   /* PR binutils/17531: Cope with unexpected section header sizes.  */
4241   if (size == 0 || num == 0)
4242     return FALSE;
4243   if (size < sizeof * phdrs)
4244     {
4245       error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4246       return FALSE;
4247     }
4248   if (size > sizeof * phdrs)
4249     warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4250
4251   phdrs = (Elf32_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
4252                                             size, num, _("program headers"));
4253   if (phdrs == NULL)
4254     return FALSE;
4255
4256   for (i = 0, internal = pheaders, external = phdrs;
4257        i < elf_header.e_phnum;
4258        i++, internal++, external++)
4259     {
4260       internal->p_type   = BYTE_GET (external->p_type);
4261       internal->p_offset = BYTE_GET (external->p_offset);
4262       internal->p_vaddr  = BYTE_GET (external->p_vaddr);
4263       internal->p_paddr  = BYTE_GET (external->p_paddr);
4264       internal->p_filesz = BYTE_GET (external->p_filesz);
4265       internal->p_memsz  = BYTE_GET (external->p_memsz);
4266       internal->p_flags  = BYTE_GET (external->p_flags);
4267       internal->p_align  = BYTE_GET (external->p_align);
4268     }
4269
4270   free (phdrs);
4271   return TRUE;
4272 }
4273
4274 static bfd_boolean
4275 get_64bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
4276 {
4277   Elf64_External_Phdr * phdrs;
4278   Elf64_External_Phdr * external;
4279   Elf_Internal_Phdr *   internal;
4280   unsigned int i;
4281   unsigned int size = elf_header.e_phentsize;
4282   unsigned int num  = elf_header.e_phnum;
4283
4284   /* PR binutils/17531: Cope with unexpected section header sizes.  */
4285   if (size == 0 || num == 0)
4286     return FALSE;
4287   if (size < sizeof * phdrs)
4288     {
4289       error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4290       return FALSE;
4291     }
4292   if (size > sizeof * phdrs)
4293     warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4294
4295   phdrs = (Elf64_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
4296                                             size, num, _("program headers"));
4297   if (!phdrs)
4298     return FALSE;
4299
4300   for (i = 0, internal = pheaders, external = phdrs;
4301        i < elf_header.e_phnum;
4302        i++, internal++, external++)
4303     {
4304       internal->p_type   = BYTE_GET (external->p_type);
4305       internal->p_flags  = BYTE_GET (external->p_flags);
4306       internal->p_offset = BYTE_GET (external->p_offset);
4307       internal->p_vaddr  = BYTE_GET (external->p_vaddr);
4308       internal->p_paddr  = BYTE_GET (external->p_paddr);
4309       internal->p_filesz = BYTE_GET (external->p_filesz);
4310       internal->p_memsz  = BYTE_GET (external->p_memsz);
4311       internal->p_align  = BYTE_GET (external->p_align);
4312     }
4313
4314   free (phdrs);
4315   return TRUE;
4316 }
4317
4318 /* Returns 1 if the program headers were read into `program_headers'.  */
4319
4320 static int
4321 get_program_headers (FILE * file)
4322 {
4323   Elf_Internal_Phdr * phdrs;
4324
4325   /* Check cache of prior read.  */
4326   if (program_headers != NULL)
4327     return 1;
4328
4329   phdrs = (Elf_Internal_Phdr *) cmalloc (elf_header.e_phnum,
4330                                          sizeof (Elf_Internal_Phdr));
4331
4332   if (phdrs == NULL)
4333     {
4334       error (_("Out of memory reading %u program headers\n"),
4335              elf_header.e_phnum);
4336       return 0;
4337     }
4338
4339   if (is_32bit_elf
4340       ? get_32bit_program_headers (file, phdrs)
4341       : get_64bit_program_headers (file, phdrs))
4342     {
4343       program_headers = phdrs;
4344       return 1;
4345     }
4346
4347   free (phdrs);
4348   return 0;
4349 }
4350
4351 /* Returns 1 if the program headers were loaded.  */
4352
4353 static int
4354 process_program_headers (FILE * file)
4355 {
4356   Elf_Internal_Phdr * segment;
4357   unsigned int i;
4358
4359   if (elf_header.e_phnum == 0)
4360     {
4361       /* PR binutils/12467.  */
4362       if (elf_header.e_phoff != 0)
4363         warn (_("possibly corrupt ELF header - it has a non-zero program"
4364                 " header offset, but no program headers"));
4365       else if (do_segments)
4366         printf (_("\nThere are no program headers in this file.\n"));
4367       return 0;
4368     }
4369
4370   if (do_segments && !do_header)
4371     {
4372       printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
4373       printf (_("Entry point "));
4374       print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4375       printf (_("\nThere are %d program headers, starting at offset "),
4376               elf_header.e_phnum);
4377       print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4378       printf ("\n");
4379     }
4380
4381   if (! get_program_headers (file))
4382       return 0;
4383
4384   if (do_segments)
4385     {
4386       if (elf_header.e_phnum > 1)
4387         printf (_("\nProgram Headers:\n"));
4388       else
4389         printf (_("\nProgram Headers:\n"));
4390
4391       if (is_32bit_elf)
4392         printf
4393           (_("  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align\n"));
4394       else if (do_wide)
4395         printf
4396           (_("  Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align\n"));
4397       else
4398         {
4399           printf
4400             (_("  Type           Offset             VirtAddr           PhysAddr\n"));
4401           printf
4402             (_("                 FileSiz            MemSiz              Flags  Align\n"));
4403         }
4404     }
4405
4406   dynamic_addr = 0;
4407   dynamic_size = 0;
4408
4409   for (i = 0, segment = program_headers;
4410        i < elf_header.e_phnum;
4411        i++, segment++)
4412     {
4413       if (do_segments)
4414         {
4415           printf ("  %-14.14s ", get_segment_type (segment->p_type));
4416
4417           if (is_32bit_elf)
4418             {
4419               printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4420               printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
4421               printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
4422               printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
4423               printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
4424               printf ("%c%c%c ",
4425                       (segment->p_flags & PF_R ? 'R' : ' '),
4426                       (segment->p_flags & PF_W ? 'W' : ' '),
4427                       (segment->p_flags & PF_X ? 'E' : ' '));
4428               printf ("%#lx", (unsigned long) segment->p_align);
4429             }
4430           else if (do_wide)
4431             {
4432               if ((unsigned long) segment->p_offset == segment->p_offset)
4433                 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4434               else
4435                 {
4436                   print_vma (segment->p_offset, FULL_HEX);
4437                   putchar (' ');
4438                 }
4439
4440               print_vma (segment->p_vaddr, FULL_HEX);
4441               putchar (' ');
4442               print_vma (segment->p_paddr, FULL_HEX);
4443               putchar (' ');
4444
4445               if ((unsigned long) segment->p_filesz == segment->p_filesz)
4446                 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
4447               else
4448                 {
4449                   print_vma (segment->p_filesz, FULL_HEX);
4450                   putchar (' ');
4451                 }
4452
4453               if ((unsigned long) segment->p_memsz == segment->p_memsz)
4454                 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
4455               else
4456                 {
4457                   print_vma (segment->p_memsz, FULL_HEX);
4458                 }
4459
4460               printf (" %c%c%c ",
4461                       (segment->p_flags & PF_R ? 'R' : ' '),
4462                       (segment->p_flags & PF_W ? 'W' : ' '),
4463                       (segment->p_flags & PF_X ? 'E' : ' '));
4464
4465               if ((unsigned long) segment->p_align == segment->p_align)
4466                 printf ("%#lx", (unsigned long) segment->p_align);
4467               else
4468                 {
4469                   print_vma (segment->p_align, PREFIX_HEX);
4470                 }
4471             }
4472           else
4473             {
4474               print_vma (segment->p_offset, FULL_HEX);
4475               putchar (' ');
4476               print_vma (segment->p_vaddr, FULL_HEX);
4477               putchar (' ');
4478               print_vma (segment->p_paddr, FULL_HEX);
4479               printf ("\n                 ");
4480               print_vma (segment->p_filesz, FULL_HEX);
4481               putchar (' ');
4482               print_vma (segment->p_memsz, FULL_HEX);
4483               printf ("  %c%c%c    ",
4484                       (segment->p_flags & PF_R ? 'R' : ' '),
4485                       (segment->p_flags & PF_W ? 'W' : ' '),
4486                       (segment->p_flags & PF_X ? 'E' : ' '));
4487               print_vma (segment->p_align, HEX);
4488             }
4489         }
4490
4491       if (do_segments)
4492         putc ('\n', stdout);
4493
4494       switch (segment->p_type)
4495         {
4496         case PT_DYNAMIC:
4497           if (dynamic_addr)
4498             error (_("more than one dynamic segment\n"));
4499
4500           /* By default, assume that the .dynamic section is the first
4501              section in the DYNAMIC segment.  */
4502           dynamic_addr = segment->p_offset;
4503           dynamic_size = segment->p_filesz;
4504           /* PR binutils/17512: Avoid corrupt dynamic section info in the segment.  */
4505           if (dynamic_addr + dynamic_size >= current_file_size)
4506             {
4507               error (_("the dynamic segment offset + size exceeds the size of the file\n"));
4508               dynamic_addr = dynamic_size = 0;
4509             }
4510
4511           /* Try to locate the .dynamic section. If there is
4512              a section header table, we can easily locate it.  */
4513           if (section_headers != NULL)
4514             {
4515               Elf_Internal_Shdr * sec;
4516
4517               sec = find_section (".dynamic");
4518               if (sec == NULL || sec->sh_size == 0)
4519                 {
4520                   /* A corresponding .dynamic section is expected, but on
4521                      IA-64/OpenVMS it is OK for it to be missing.  */
4522                   if (!is_ia64_vms ())
4523                     error (_("no .dynamic section in the dynamic segment\n"));
4524                   break;
4525                 }
4526
4527               if (sec->sh_type == SHT_NOBITS)
4528                 {
4529                   dynamic_size = 0;
4530                   break;
4531                 }
4532
4533               dynamic_addr = sec->sh_offset;
4534               dynamic_size = sec->sh_size;
4535
4536               if (dynamic_addr < segment->p_offset
4537                   || dynamic_addr > segment->p_offset + segment->p_filesz)
4538                 warn (_("the .dynamic section is not contained"
4539                         " within the dynamic segment\n"));
4540               else if (dynamic_addr > segment->p_offset)
4541                 warn (_("the .dynamic section is not the first section"
4542                         " in the dynamic segment.\n"));
4543             }
4544           break;
4545
4546         case PT_INTERP:
4547           if (fseek (file, archive_file_offset + (long) segment->p_offset,
4548                      SEEK_SET))
4549             error (_("Unable to find program interpreter name\n"));
4550           else
4551             {
4552               char fmt [32];
4553               int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX - 1);
4554
4555               if (ret >= (int) sizeof (fmt) || ret < 0)
4556                 error (_("Internal error: failed to create format string to display program interpreter\n"));
4557
4558               program_interpreter[0] = 0;
4559               if (fscanf (file, fmt, program_interpreter) <= 0)
4560                 error (_("Unable to read program interpreter name\n"));
4561
4562               if (do_segments)
4563                 printf (_("      [Requesting program interpreter: %s]\n"),
4564                     program_interpreter);
4565             }
4566           break;
4567         }
4568     }
4569
4570   if (do_segments && section_headers != NULL && string_table != NULL)
4571     {
4572       printf (_("\n Section to Segment mapping:\n"));
4573       printf (_("  Segment Sections...\n"));
4574
4575       for (i = 0; i < elf_header.e_phnum; i++)
4576         {
4577           unsigned int j;
4578           Elf_Internal_Shdr * section;
4579
4580           segment = program_headers + i;
4581           section = section_headers + 1;
4582
4583           printf ("   %2.2d     ", i);
4584
4585           for (j = 1; j < elf_header.e_shnum; j++, section++)
4586             {
4587               if (!ELF_TBSS_SPECIAL (section, segment)
4588                   && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
4589                 printf ("%s ", printable_section_name (section));
4590             }
4591
4592           putc ('\n',stdout);
4593         }
4594     }
4595
4596   return 1;
4597 }
4598
4599
4600 /* Find the file offset corresponding to VMA by using the program headers.  */
4601
4602 static long
4603 offset_from_vma (FILE * file, bfd_vma vma, bfd_size_type size)
4604 {
4605   Elf_Internal_Phdr * seg;
4606
4607   if (! get_program_headers (file))
4608     {
4609       warn (_("Cannot interpret virtual addresses without program headers.\n"));
4610       return (long) vma;
4611     }
4612
4613   for (seg = program_headers;
4614        seg < program_headers + elf_header.e_phnum;
4615        ++seg)
4616     {
4617       if (seg->p_type != PT_LOAD)
4618         continue;
4619
4620       if (vma >= (seg->p_vaddr & -seg->p_align)
4621           && vma + size <= seg->p_vaddr + seg->p_filesz)
4622         return vma - seg->p_vaddr + seg->p_offset;
4623     }
4624
4625   warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
4626         (unsigned long) vma);
4627   return (long) vma;
4628 }
4629
4630
4631 /* Allocate memory and load the sections headers into the global pointer
4632    SECTION_HEADERS.  If PROBE is true, this is just a probe and we do not
4633    generate any error messages if the load fails.  */
4634
4635 static bfd_boolean
4636 get_32bit_section_headers (FILE * file, bfd_boolean probe)
4637 {
4638   Elf32_External_Shdr * shdrs;
4639   Elf_Internal_Shdr *   internal;
4640   unsigned int i;
4641   unsigned int size = elf_header.e_shentsize;
4642   unsigned int num = probe ? 1 : elf_header.e_shnum;
4643
4644   /* PR binutils/17531: Cope with unexpected section header sizes.  */
4645   if (size == 0 || num == 0)
4646     return FALSE;
4647   if (size < sizeof * shdrs)
4648     {
4649       if (! probe)
4650         error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
4651       return FALSE;
4652     }
4653   if (!probe && size > sizeof * shdrs)
4654     warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
4655
4656   shdrs = (Elf32_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
4657                                             size, num,
4658                                             probe ? NULL : _("section headers"));
4659   if (shdrs == NULL)
4660     return FALSE;
4661
4662   if (section_headers != NULL)
4663     free (section_headers);
4664   section_headers = (Elf_Internal_Shdr *) cmalloc (num,
4665                                                    sizeof (Elf_Internal_Shdr));
4666   if (section_headers == NULL)
4667     {
4668       if (!probe)
4669         error (_("Out of memory reading %u section headers\n"), num);
4670       return FALSE;
4671     }
4672
4673   for (i = 0, internal = section_headers;
4674        i < num;
4675        i++, internal++)
4676     {
4677       internal->sh_name      = BYTE_GET (shdrs[i].sh_name);
4678       internal->sh_type      = BYTE_GET (shdrs[i].sh_type);
4679       internal->sh_flags     = BYTE_GET (shdrs[i].sh_flags);
4680       internal->sh_addr      = BYTE_GET (shdrs[i].sh_addr);
4681       internal->sh_offset    = BYTE_GET (shdrs[i].sh_offset);
4682       internal->sh_size      = BYTE_GET (shdrs[i].sh_size);
4683       internal->sh_link      = BYTE_GET (shdrs[i].sh_link);
4684       internal->sh_info      = BYTE_GET (shdrs[i].sh_info);
4685       internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
4686       internal->sh_entsize   = BYTE_GET (shdrs[i].sh_entsize);
4687     }
4688
4689   free (shdrs);
4690   return TRUE;
4691 }
4692
4693 static bfd_boolean
4694 get_64bit_section_headers (FILE * file, bfd_boolean probe)
4695 {
4696   Elf64_External_Shdr * shdrs;
4697   Elf_Internal_Shdr *   internal;
4698   unsigned int i;
4699   unsigned int size = elf_header.e_shentsize;
4700   unsigned int num = probe ? 1 : elf_header.e_shnum;
4701
4702   /* PR binutils/17531: Cope with unexpected section header sizes.  */
4703   if (size == 0 || num == 0)
4704     return FALSE;
4705   if (size < sizeof * shdrs)
4706     {
4707       if (! probe)
4708         error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
4709       return FALSE;
4710     }
4711   if (! probe && size > sizeof * shdrs)
4712     warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
4713
4714   shdrs = (Elf64_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
4715                                             size, num,
4716                                             probe ? NULL : _("section headers"));
4717   if (shdrs == NULL)
4718     return FALSE;
4719
4720   if (section_headers != NULL)
4721     free (section_headers);
4722   section_headers = (Elf_Internal_Shdr *) cmalloc (num,
4723                                                    sizeof (Elf_Internal_Shdr));
4724   if (section_headers == NULL)
4725     {
4726       if (! probe)
4727         error (_("Out of memory reading %u section headers\n"), num);
4728       return FALSE;
4729     }
4730
4731   for (i = 0, internal = section_headers;
4732        i < num;
4733        i++, internal++)
4734     {
4735       internal->sh_name      = BYTE_GET (shdrs[i].sh_name);
4736       internal->sh_type      = BYTE_GET (shdrs[i].sh_type);
4737       internal->sh_flags     = BYTE_GET (shdrs[i].sh_flags);
4738       internal->sh_addr      = BYTE_GET (shdrs[i].sh_addr);
4739       internal->sh_size      = BYTE_GET (shdrs[i].sh_size);
4740       internal->sh_entsize   = BYTE_GET (shdrs[i].sh_entsize);
4741       internal->sh_link      = BYTE_GET (shdrs[i].sh_link);
4742       internal->sh_info      = BYTE_GET (shdrs[i].sh_info);
4743       internal->sh_offset    = BYTE_GET (shdrs[i].sh_offset);
4744       internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
4745     }
4746
4747   free (shdrs);
4748   return TRUE;
4749 }
4750
4751 static Elf_Internal_Sym *
4752 get_32bit_elf_symbols (FILE * file,
4753                        Elf_Internal_Shdr * section,
4754                        unsigned long * num_syms_return)
4755 {
4756   unsigned long number = 0;
4757   Elf32_External_Sym * esyms = NULL;
4758   Elf_External_Sym_Shndx * shndx = NULL;
4759   Elf_Internal_Sym * isyms = NULL;
4760   Elf_Internal_Sym * psym;
4761   unsigned int j;
4762
4763   if (section->sh_size == 0)
4764     {
4765       if (num_syms_return != NULL)
4766         * num_syms_return = 0;
4767       return NULL;
4768     }
4769
4770   /* Run some sanity checks first.  */
4771   if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
4772     {
4773       error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
4774              printable_section_name (section), (unsigned long) section->sh_entsize);
4775       goto exit_point;
4776     }
4777
4778   if (section->sh_size > current_file_size)
4779     {
4780       error (_("Section %s has an invalid sh_size of 0x%lx\n"),
4781              printable_section_name (section), (unsigned long) section->sh_size);
4782       goto exit_point;
4783     }
4784
4785   number = section->sh_size / section->sh_entsize;
4786
4787   if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
4788     {
4789       error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
4790              (unsigned long) section->sh_size,
4791              printable_section_name (section),
4792              (unsigned long) section->sh_entsize);
4793       goto exit_point;
4794     }
4795
4796   esyms = (Elf32_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
4797                                            section->sh_size, _("symbols"));
4798   if (esyms == NULL)
4799     goto exit_point;
4800
4801   shndx = NULL;
4802   if (symtab_shndx_hdr != NULL
4803       && (symtab_shndx_hdr->sh_link
4804           == (unsigned long) (section - section_headers)))
4805     {
4806       shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
4807                                                    symtab_shndx_hdr->sh_offset,
4808                                                    1, symtab_shndx_hdr->sh_size,
4809                                                    _("symbol table section indicies"));
4810       if (shndx == NULL)
4811         goto exit_point;
4812       /* PR17531: file: heap-buffer-overflow */
4813       else if (symtab_shndx_hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
4814         {
4815           error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
4816                  printable_section_name (symtab_shndx_hdr),
4817                  (unsigned long) symtab_shndx_hdr->sh_size,
4818                  (unsigned long) section->sh_size);
4819           goto exit_point;
4820         }
4821     }
4822
4823   isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
4824
4825   if (isyms == NULL)
4826     {
4827       error (_("Out of memory reading %lu symbols\n"),
4828              (unsigned long) number);
4829       goto exit_point;
4830     }
4831
4832   for (j = 0, psym = isyms; j < number; j++, psym++)
4833     {
4834       psym->st_name  = BYTE_GET (esyms[j].st_name);
4835       psym->st_value = BYTE_GET (esyms[j].st_value);
4836       psym->st_size  = BYTE_GET (esyms[j].st_size);
4837       psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
4838       if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
4839         psym->st_shndx
4840           = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
4841       else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
4842         psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
4843       psym->st_info  = BYTE_GET (esyms[j].st_info);
4844       psym->st_other = BYTE_GET (esyms[j].st_other);
4845     }
4846
4847  exit_point:
4848   if (shndx != NULL)
4849     free (shndx);
4850   if (esyms != NULL)
4851     free (esyms);
4852
4853   if (num_syms_return != NULL)
4854     * num_syms_return = isyms == NULL ? 0 : number;
4855
4856   return isyms;
4857 }
4858
4859 static Elf_Internal_Sym *
4860 get_64bit_elf_symbols (FILE * file,
4861                        Elf_Internal_Shdr * section,
4862                        unsigned long * num_syms_return)
4863 {
4864   unsigned long number = 0;
4865   Elf64_External_Sym * esyms = NULL;
4866   Elf_External_Sym_Shndx * shndx = NULL;
4867   Elf_Internal_Sym * isyms = NULL;
4868   Elf_Internal_Sym * psym;
4869   unsigned int j;
4870
4871   if (section->sh_size == 0)
4872     {
4873       if (num_syms_return != NULL)
4874         * num_syms_return = 0;
4875       return NULL;
4876     }
4877
4878   /* Run some sanity checks first.  */
4879   if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
4880     {
4881       error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
4882              printable_section_name (section),
4883              (unsigned long) section->sh_entsize);
4884       goto exit_point;
4885     }
4886
4887   if (section->sh_size > current_file_size)
4888     {
4889       error (_("Section %s has an invalid sh_size of 0x%lx\n"),
4890              printable_section_name (section),
4891              (unsigned long) section->sh_size);
4892       goto exit_point;
4893     }
4894
4895   number = section->sh_size / section->sh_entsize;
4896
4897   if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
4898     {
4899       error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
4900              (unsigned long) section->sh_size,
4901              printable_section_name (section),
4902              (unsigned long) section->sh_entsize);
4903       goto exit_point;
4904     }
4905
4906   esyms = (Elf64_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
4907                                            section->sh_size, _("symbols"));
4908   if (!esyms)
4909     goto exit_point;
4910
4911   if (symtab_shndx_hdr != NULL
4912       && (symtab_shndx_hdr->sh_link
4913           == (unsigned long) (section - section_headers)))
4914     {
4915       shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
4916                                                    symtab_shndx_hdr->sh_offset,
4917                                                    1, symtab_shndx_hdr->sh_size,
4918                                                    _("symbol table section indicies"));
4919       if (shndx == NULL)
4920         goto exit_point;
4921       else if (symtab_shndx_hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
4922         {
4923           error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
4924                  printable_section_name (symtab_shndx_hdr),
4925                  (unsigned long) symtab_shndx_hdr->sh_size,
4926                  (unsigned long) section->sh_size);
4927           goto exit_point;
4928         }
4929     }
4930
4931   isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
4932
4933   if (isyms == NULL)
4934     {
4935       error (_("Out of memory reading %lu symbols\n"),
4936              (unsigned long) number);
4937       goto exit_point;
4938     }
4939
4940   for (j = 0, psym = isyms; j < number; j++, psym++)
4941     {
4942       psym->st_name  = BYTE_GET (esyms[j].st_name);
4943       psym->st_info  = BYTE_GET (esyms[j].st_info);
4944       psym->st_other = BYTE_GET (esyms[j].st_other);
4945       psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
4946
4947       if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
4948         psym->st_shndx
4949           = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
4950       else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
4951         psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
4952
4953       psym->st_value = BYTE_GET (esyms[j].st_value);
4954       psym->st_size  = BYTE_GET (esyms[j].st_size);
4955     }
4956
4957  exit_point:
4958   if (shndx != NULL)
4959     free (shndx);
4960   if (esyms != NULL)
4961     free (esyms);
4962
4963   if (num_syms_return != NULL)
4964     * num_syms_return = isyms == NULL ? 0 : number;
4965
4966   return isyms;
4967 }
4968
4969 static const char *
4970 get_elf_section_flags (bfd_vma sh_flags)
4971 {
4972   static char buff[1024];
4973   char * p = buff;
4974   int field_size = is_32bit_elf ? 8 : 16;
4975   int sindex;
4976   int size = sizeof (buff) - (field_size + 4 + 1);
4977   bfd_vma os_flags = 0;
4978   bfd_vma proc_flags = 0;
4979   bfd_vma unknown_flags = 0;
4980   static const struct
4981     {
4982       const char * str;
4983       int len;
4984     }
4985   flags [] =
4986     {
4987       /*  0 */ { STRING_COMMA_LEN ("WRITE") },
4988       /*  1 */ { STRING_COMMA_LEN ("ALLOC") },
4989       /*  2 */ { STRING_COMMA_LEN ("EXEC") },
4990       /*  3 */ { STRING_COMMA_LEN ("MERGE") },
4991       /*  4 */ { STRING_COMMA_LEN ("STRINGS") },
4992       /*  5 */ { STRING_COMMA_LEN ("INFO LINK") },
4993       /*  6 */ { STRING_COMMA_LEN ("LINK ORDER") },
4994       /*  7 */ { STRING_COMMA_LEN ("OS NONCONF") },
4995       /*  8 */ { STRING_COMMA_LEN ("GROUP") },
4996       /*  9 */ { STRING_COMMA_LEN ("TLS") },
4997       /* IA-64 specific.  */
4998       /* 10 */ { STRING_COMMA_LEN ("SHORT") },
4999       /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
5000       /* IA-64 OpenVMS specific.  */
5001       /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
5002       /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
5003       /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
5004       /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
5005       /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
5006       /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
5007       /* Generic.  */
5008       /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
5009       /* SPARC specific.  */
5010       /* 19 */ { STRING_COMMA_LEN ("ORDERED") }
5011     };
5012
5013   if (do_section_details)
5014     {
5015       sprintf (buff, "[%*.*lx]: ",
5016                field_size, field_size, (unsigned long) sh_flags);
5017       p += field_size + 4;
5018     }
5019
5020   while (sh_flags)
5021     {
5022       bfd_vma flag;
5023
5024       flag = sh_flags & - sh_flags;
5025       sh_flags &= ~ flag;
5026
5027       if (do_section_details)
5028         {
5029           switch (flag)
5030             {
5031             case SHF_WRITE:             sindex = 0; break;
5032             case SHF_ALLOC:             sindex = 1; break;
5033             case SHF_EXECINSTR:         sindex = 2; break;
5034             case SHF_MERGE:             sindex = 3; break;
5035             case SHF_STRINGS:           sindex = 4; break;
5036             case SHF_INFO_LINK:         sindex = 5; break;
5037             case SHF_LINK_ORDER:        sindex = 6; break;
5038             case SHF_OS_NONCONFORMING:  sindex = 7; break;
5039             case SHF_GROUP:             sindex = 8; break;
5040             case SHF_TLS:               sindex = 9; break;
5041             case SHF_EXCLUDE:           sindex = 18; break;
5042
5043             default:
5044               sindex = -1;
5045               switch (elf_header.e_machine)
5046                 {
5047                 case EM_IA_64:
5048                   if (flag == SHF_IA_64_SHORT)
5049                     sindex = 10;
5050                   else if (flag == SHF_IA_64_NORECOV)
5051                     sindex = 11;
5052 #ifdef BFD64
5053                   else if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
5054                     switch (flag)
5055                       {
5056                       case SHF_IA_64_VMS_GLOBAL:      sindex = 12; break;
5057                       case SHF_IA_64_VMS_OVERLAID:    sindex = 13; break;
5058                       case SHF_IA_64_VMS_SHARED:      sindex = 14; break;
5059                       case SHF_IA_64_VMS_VECTOR:      sindex = 15; break;
5060                       case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
5061                       case SHF_IA_64_VMS_PROTECTED:   sindex = 17; break;
5062                       default:                        break;
5063                       }
5064 #endif
5065                   break;
5066
5067                 case EM_386:
5068                 case EM_486:
5069                 case EM_X86_64:
5070                 case EM_L1OM:
5071                 case EM_K1OM:
5072                 case EM_OLD_SPARCV9:
5073                 case EM_SPARC32PLUS:
5074                 case EM_SPARCV9:
5075                 case EM_SPARC:
5076                   if (flag == SHF_ORDERED)
5077                     sindex = 19;
5078                   break;
5079                 default:
5080                   break;
5081                 }
5082             }
5083
5084           if (sindex != -1)
5085             {
5086               if (p != buff + field_size + 4)
5087                 {
5088                   if (size < (10 + 2))
5089                     abort ();
5090                   size -= 2;
5091                   *p++ = ',';
5092                   *p++ = ' ';
5093                 }
5094
5095               size -= flags [sindex].len;
5096               p = stpcpy (p, flags [sindex].str);
5097             }
5098           else if (flag & SHF_MASKOS)
5099             os_flags |= flag;
5100           else if (flag & SHF_MASKPROC)
5101             proc_flags |= flag;
5102           else
5103             unknown_flags |= flag;
5104         }
5105       else
5106         {
5107           switch (flag)
5108             {
5109             case SHF_WRITE:             *p = 'W'; break;
5110             case SHF_ALLOC:             *p = 'A'; break;
5111             case SHF_EXECINSTR:         *p = 'X'; break;
5112             case SHF_MERGE:             *p = 'M'; break;
5113             case SHF_STRINGS:           *p = 'S'; break;
5114             case SHF_INFO_LINK:         *p = 'I'; break;
5115             case SHF_LINK_ORDER:        *p = 'L'; break;
5116             case SHF_OS_NONCONFORMING:  *p = 'O'; break;
5117             case SHF_GROUP:             *p = 'G'; break;
5118             case SHF_TLS:               *p = 'T'; break;
5119             case SHF_EXCLUDE:           *p = 'E'; break;
5120
5121             default:
5122               if ((elf_header.e_machine == EM_X86_64
5123                    || elf_header.e_machine == EM_L1OM
5124                    || elf_header.e_machine == EM_K1OM)
5125                   && flag == SHF_X86_64_LARGE)
5126                 *p = 'l';
5127               else if (flag & SHF_MASKOS)
5128                 {
5129                   *p = 'o';
5130                   sh_flags &= ~ SHF_MASKOS;
5131                 }
5132               else if (flag & SHF_MASKPROC)
5133                 {
5134                   *p = 'p';
5135                   sh_flags &= ~ SHF_MASKPROC;
5136                 }
5137               else
5138                 *p = 'x';
5139               break;
5140             }
5141           p++;
5142         }
5143     }
5144
5145   if (do_section_details)
5146     {
5147       if (os_flags)
5148         {
5149           size -= 5 + field_size;
5150           if (p != buff + field_size + 4)
5151             {
5152               if (size < (2 + 1))
5153                 abort ();
5154               size -= 2;
5155               *p++ = ',';
5156               *p++ = ' ';
5157             }
5158           sprintf (p, "OS (%*.*lx)", field_size, field_size,
5159                    (unsigned long) os_flags);
5160           p += 5 + field_size;
5161         }
5162       if (proc_flags)
5163         {
5164           size -= 7 + field_size;
5165           if (p != buff + field_size + 4)
5166             {
5167               if (size < (2 + 1))
5168                 abort ();
5169               size -= 2;
5170               *p++ = ',';
5171               *p++ = ' ';
5172             }
5173           sprintf (p, "PROC (%*.*lx)", field_size, field_size,
5174                    (unsigned long) proc_flags);
5175           p += 7 + field_size;
5176         }
5177       if (unknown_flags)
5178         {
5179           size -= 10 + field_size;
5180           if (p != buff + field_size + 4)
5181             {
5182               if (size < (2 + 1))
5183                 abort ();
5184               size -= 2;
5185               *p++ = ',';
5186               *p++ = ' ';
5187             }
5188           sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
5189                    (unsigned long) unknown_flags);
5190           p += 10 + field_size;
5191         }
5192     }
5193
5194   *p = '\0';
5195   return buff;
5196 }
5197
5198 static int
5199 process_section_headers (FILE * file)
5200 {
5201   Elf_Internal_Shdr * section;
5202   unsigned int i;
5203
5204   section_headers = NULL;
5205
5206   if (elf_header.e_shnum == 0)
5207     {
5208       /* PR binutils/12467.  */
5209       if (elf_header.e_shoff != 0)
5210         warn (_("possibly corrupt ELF file header - it has a non-zero"
5211                 " section header offset, but no section headers\n"));
5212       else if (do_sections)
5213         printf (_("\nThere are no sections in this file.\n"));
5214
5215       return 1;
5216     }
5217
5218   if (do_sections && !do_header)
5219     printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
5220             elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
5221
5222   if (is_32bit_elf)
5223     {
5224       if (! get_32bit_section_headers (file, FALSE))
5225         return 0;
5226     }
5227   else if (! get_64bit_section_headers (file, FALSE))
5228     return 0;
5229
5230   /* Read in the string table, so that we have names to display.  */
5231   if (elf_header.e_shstrndx != SHN_UNDEF
5232        && elf_header.e_shstrndx < elf_header.e_shnum)
5233     {
5234       section = section_headers + elf_header.e_shstrndx;
5235
5236       if (section->sh_size != 0)
5237         {
5238           string_table = (char *) get_data (NULL, file, section->sh_offset,
5239                                             1, section->sh_size,
5240                                             _("string table"));
5241
5242           string_table_length = string_table != NULL ? section->sh_size : 0;
5243         }
5244     }
5245
5246   /* Scan the sections for the dynamic symbol table
5247      and dynamic string table and debug sections.  */
5248   dynamic_symbols = NULL;
5249   dynamic_strings = NULL;
5250   dynamic_syminfo = NULL;
5251   symtab_shndx_hdr = NULL;
5252
5253   eh_addr_size = is_32bit_elf ? 4 : 8;
5254   switch (elf_header.e_machine)
5255     {
5256     case EM_MIPS:
5257     case EM_MIPS_RS3_LE:
5258       /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
5259          FDE addresses.  However, the ABI also has a semi-official ILP32
5260          variant for which the normal FDE address size rules apply.
5261
5262          GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
5263          section, where XX is the size of longs in bits.  Unfortunately,
5264          earlier compilers provided no way of distinguishing ILP32 objects
5265          from LP64 objects, so if there's any doubt, we should assume that
5266          the official LP64 form is being used.  */
5267       if ((elf_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
5268           && find_section (".gcc_compiled_long32") == NULL)
5269         eh_addr_size = 8;
5270       break;
5271
5272     case EM_H8_300:
5273     case EM_H8_300H:
5274       switch (elf_header.e_flags & EF_H8_MACH)
5275         {
5276         case E_H8_MACH_H8300:
5277         case E_H8_MACH_H8300HN:
5278         case E_H8_MACH_H8300SN:
5279         case E_H8_MACH_H8300SXN:
5280           eh_addr_size = 2;
5281           break;
5282         case E_H8_MACH_H8300H:
5283         case E_H8_MACH_H8300S:
5284         case E_H8_MACH_H8300SX:
5285           eh_addr_size = 4;
5286           break;
5287         }
5288       break;
5289
5290     case EM_M32C_OLD:
5291     case EM_M32C:
5292       switch (elf_header.e_flags & EF_M32C_CPU_MASK)
5293         {
5294         case EF_M32C_CPU_M16C:
5295           eh_addr_size = 2;
5296           break;
5297         }
5298       break;
5299     }
5300
5301 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64)                \
5302   do                                                                    \
5303     {                                                                   \
5304       bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64;  \
5305       if (section->sh_entsize != expected_entsize)                      \
5306         {                                                               \
5307           char buf[40];                                                 \
5308           sprintf_vma (buf, section->sh_entsize);                       \
5309           /* Note: coded this way so that there is a single string for  \
5310              translation.  */ \
5311           error (_("Section %d has invalid sh_entsize of %s\n"), i, buf); \
5312           error (_("(Using the expected size of %u for the rest of this dump)\n"), \
5313                    (unsigned) expected_entsize);                        \
5314           section->sh_entsize = expected_entsize;                       \
5315         }                                                               \
5316     }                                                                   \
5317   while (0)
5318
5319 #define CHECK_ENTSIZE(section, i, type)                                 \
5320   CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type),         \
5321                         sizeof (Elf64_External_##type))
5322
5323   for (i = 0, section = section_headers;
5324        i < elf_header.e_shnum;
5325        i++, section++)
5326     {
5327       char * name = SECTION_NAME (section);
5328
5329       if (section->sh_type == SHT_DYNSYM)
5330         {
5331           if (dynamic_symbols != NULL)
5332             {
5333               error (_("File contains multiple dynamic symbol tables\n"));
5334               continue;
5335             }
5336
5337           CHECK_ENTSIZE (section, i, Sym);
5338           dynamic_symbols = GET_ELF_SYMBOLS (file, section, & num_dynamic_syms);
5339         }
5340       else if (section->sh_type == SHT_STRTAB
5341                && streq (name, ".dynstr"))
5342         {
5343           if (dynamic_strings != NULL)
5344             {
5345               error (_("File contains multiple dynamic string tables\n"));
5346               continue;
5347             }
5348
5349           dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
5350                                                1, section->sh_size,
5351                                                _("dynamic strings"));
5352           dynamic_strings_length = dynamic_strings == NULL ? 0 : section->sh_size;
5353         }
5354       else if (section->sh_type == SHT_SYMTAB_SHNDX)
5355         {
5356           if (symtab_shndx_hdr != NULL)
5357             {
5358               error (_("File contains multiple symtab shndx tables\n"));
5359               continue;
5360             }
5361           symtab_shndx_hdr = section;
5362         }
5363       else if (section->sh_type == SHT_SYMTAB)
5364         CHECK_ENTSIZE (section, i, Sym);
5365       else if (section->sh_type == SHT_GROUP)
5366         CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
5367       else if (section->sh_type == SHT_REL)
5368         CHECK_ENTSIZE (section, i, Rel);
5369       else if (section->sh_type == SHT_RELA)
5370         CHECK_ENTSIZE (section, i, Rela);
5371       else if ((do_debugging || do_debug_info || do_debug_abbrevs
5372                 || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
5373                 || do_debug_aranges || do_debug_frames || do_debug_macinfo
5374                 || do_debug_str || do_debug_loc || do_debug_ranges
5375                 || do_debug_addr || do_debug_cu_index)
5376                && (const_strneq (name, ".debug_")
5377                    || const_strneq (name, ".zdebug_")))
5378         {
5379           if (name[1] == 'z')
5380             name += sizeof (".zdebug_") - 1;
5381           else
5382             name += sizeof (".debug_") - 1;
5383
5384           if (do_debugging
5385               || (do_debug_info     && const_strneq (name, "info"))
5386               || (do_debug_info     && const_strneq (name, "types"))
5387               || (do_debug_abbrevs  && const_strneq (name, "abbrev"))
5388               || (do_debug_lines    && strcmp (name, "line") == 0)
5389               || (do_debug_lines    && const_strneq (name, "line."))
5390               || (do_debug_pubnames && const_strneq (name, "pubnames"))
5391               || (do_debug_pubtypes && const_strneq (name, "pubtypes"))
5392               || (do_debug_pubnames && const_strneq (name, "gnu_pubnames"))
5393               || (do_debug_pubtypes && const_strneq (name, "gnu_pubtypes"))
5394               || (do_debug_aranges  && const_strneq (name, "aranges"))
5395               || (do_debug_ranges   && const_strneq (name, "ranges"))
5396               || (do_debug_frames   && const_strneq (name, "frame"))
5397               || (do_debug_macinfo  && const_strneq (name, "macinfo"))
5398               || (do_debug_macinfo  && const_strneq (name, "macro"))
5399               || (do_debug_str      && const_strneq (name, "str"))
5400               || (do_debug_loc      && const_strneq (name, "loc"))
5401               || (do_debug_addr     && const_strneq (name, "addr"))
5402               || (do_debug_cu_index && const_strneq (name, "cu_index"))
5403               || (do_debug_cu_index && const_strneq (name, "tu_index"))
5404               )
5405             request_dump_bynumber (i, DEBUG_DUMP);
5406         }
5407       /* Linkonce section to be combined with .debug_info at link time.  */
5408       else if ((do_debugging || do_debug_info)
5409                && const_strneq (name, ".gnu.linkonce.wi."))
5410         request_dump_bynumber (i, DEBUG_DUMP);
5411       else if (do_debug_frames && streq (name, ".eh_frame"))
5412         request_dump_bynumber (i, DEBUG_DUMP);
5413       else if (do_gdb_index && streq (name, ".gdb_index"))
5414         request_dump_bynumber (i, DEBUG_DUMP);
5415       /* Trace sections for Itanium VMS.  */
5416       else if ((do_debugging || do_trace_info || do_trace_abbrevs
5417                 || do_trace_aranges)
5418                && const_strneq (name, ".trace_"))
5419         {
5420           name += sizeof (".trace_") - 1;
5421
5422           if (do_debugging
5423               || (do_trace_info     && streq (name, "info"))
5424               || (do_trace_abbrevs  && streq (name, "abbrev"))
5425               || (do_trace_aranges  && streq (name, "aranges"))
5426               )
5427             request_dump_bynumber (i, DEBUG_DUMP);
5428         }
5429     }
5430
5431   if (! do_sections)
5432     return 1;
5433
5434   if (elf_header.e_shnum > 1)
5435     printf (_("\nSection Headers:\n"));
5436   else
5437     printf (_("\nSection Header:\n"));
5438
5439   if (is_32bit_elf)
5440     {
5441       if (do_section_details)
5442         {
5443           printf (_("  [Nr] Name\n"));
5444           printf (_("       Type            Addr     Off    Size   ES   Lk Inf Al\n"));
5445         }
5446       else
5447         printf
5448           (_("  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al\n"));
5449     }
5450   else if (do_wide)
5451     {
5452       if (do_section_details)
5453         {
5454           printf (_("  [Nr] Name\n"));
5455           printf (_("       Type            Address          Off    Size   ES   Lk Inf Al\n"));
5456         }
5457       else
5458         printf
5459           (_("  [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al\n"));
5460     }
5461   else
5462     {
5463       if (do_section_details)
5464         {
5465           printf (_("  [Nr] Name\n"));
5466           printf (_("       Type              Address          Offset            Link\n"));
5467           printf (_("       Size              EntSize          Info              Align\n"));
5468         }
5469       else
5470         {
5471           printf (_("  [Nr] Name              Type             Address           Offset\n"));
5472           printf (_("       Size              EntSize          Flags  Link  Info  Align\n"));
5473         }
5474     }
5475
5476   if (do_section_details)
5477     printf (_("       Flags\n"));
5478
5479   for (i = 0, section = section_headers;
5480        i < elf_header.e_shnum;
5481        i++, section++)
5482     {
5483       printf ("  [%2u] ", i);
5484       if (do_section_details)
5485         printf ("%s\n      ", printable_section_name (section));
5486       else
5487         print_symbol (-17, SECTION_NAME (section));
5488
5489       printf (do_wide ? " %-15s " : " %-15.15s ",
5490               get_section_type_name (section->sh_type));
5491
5492       if (is_32bit_elf)
5493         {
5494           const char * link_too_big = NULL;
5495
5496           print_vma (section->sh_addr, LONG_HEX);
5497
5498           printf ( " %6.6lx %6.6lx %2.2lx",
5499                    (unsigned long) section->sh_offset,
5500                    (unsigned long) section->sh_size,
5501                    (unsigned long) section->sh_entsize);
5502
5503           if (do_section_details)
5504             fputs ("  ", stdout);
5505           else
5506             printf (" %3s ", get_elf_section_flags (section->sh_flags));
5507
5508           if (section->sh_link >= elf_header.e_shnum)
5509             {
5510               link_too_big = "";
5511               /* The sh_link value is out of range.  Normally this indicates
5512                  an error but it can have special values in Solaris binaries.  */
5513               switch (elf_header.e_machine)
5514                 {
5515                 case EM_386:
5516                 case EM_486:
5517                 case EM_X86_64:
5518                 case EM_L1OM:
5519                 case EM_K1OM:
5520                 case EM_OLD_SPARCV9:
5521                 case EM_SPARC32PLUS:
5522                 case EM_SPARCV9:
5523                 case EM_SPARC:
5524                   if (section->sh_link == (SHN_BEFORE & 0xffff))
5525                     link_too_big = "BEFORE";
5526                   else if (section->sh_link == (SHN_AFTER & 0xffff))
5527                     link_too_big = "AFTER";
5528                   break;
5529                 default:
5530                   break;
5531                 }
5532             }
5533
5534           if (do_section_details)
5535             {
5536               if (link_too_big != NULL && * link_too_big)
5537                 printf ("<%s> ", link_too_big);
5538               else
5539                 printf ("%2u ", section->sh_link);
5540               printf ("%3u %2lu\n", section->sh_info,
5541                       (unsigned long) section->sh_addralign);
5542             }
5543           else
5544             printf ("%2u %3u %2lu\n",
5545                     section->sh_link,
5546                     section->sh_info,
5547                     (unsigned long) section->sh_addralign);
5548
5549           if (link_too_big && ! * link_too_big)
5550             warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
5551                   i, section->sh_link);
5552         }
5553       else if (do_wide)
5554         {
5555           print_vma (section->sh_addr, LONG_HEX);
5556
5557           if ((long) section->sh_offset == section->sh_offset)
5558             printf (" %6.6lx", (unsigned long) section->sh_offset);
5559           else
5560             {
5561               putchar (' ');
5562               print_vma (section->sh_offset, LONG_HEX);
5563             }
5564
5565           if ((unsigned long) section->sh_size == section->sh_size)
5566             printf (" %6.6lx", (unsigned long) section->sh_size);
5567           else
5568             {
5569               putchar (' ');
5570               print_vma (section->sh_size, LONG_HEX);
5571             }
5572
5573           if ((unsigned long) section->sh_entsize == section->sh_entsize)
5574             printf (" %2.2lx", (unsigned long) section->sh_entsize);
5575           else
5576             {
5577               putchar (' ');
5578               print_vma (section->sh_entsize, LONG_HEX);
5579             }
5580
5581           if (do_section_details)
5582             fputs ("  ", stdout);
5583           else
5584             printf (" %3s ", get_elf_section_flags (section->sh_flags));
5585
5586           printf ("%2u %3u ", section->sh_link, section->sh_info);
5587
5588           if ((unsigned long) section->sh_addralign == section->sh_addralign)
5589             printf ("%2lu\n", (unsigned long) section->sh_addralign);
5590           else
5591             {
5592               print_vma (section->sh_addralign, DEC);
5593               putchar ('\n');
5594             }
5595         }
5596       else if (do_section_details)
5597         {
5598           printf ("       %-15.15s  ",
5599                   get_section_type_name (section->sh_type));
5600           print_vma (section->sh_addr, LONG_HEX);
5601           if ((long) section->sh_offset == section->sh_offset)
5602             printf ("  %16.16lx", (unsigned long) section->sh_offset);
5603           else
5604             {
5605               printf ("  ");
5606               print_vma (section->sh_offset, LONG_HEX);
5607             }
5608           printf ("  %u\n       ", section->sh_link);
5609           print_vma (section->sh_size, LONG_HEX);
5610           putchar (' ');
5611           print_vma (section->sh_entsize, LONG_HEX);
5612
5613           printf ("  %-16u  %lu\n",
5614                   section->sh_info,
5615                   (unsigned long) section->sh_addralign);
5616         }
5617       else
5618         {
5619           putchar (' ');
5620           print_vma (section->sh_addr, LONG_HEX);
5621           if ((long) section->sh_offset == section->sh_offset)
5622             printf ("  %8.8lx", (unsigned long) section->sh_offset);
5623           else
5624             {
5625               printf ("  ");
5626               print_vma (section->sh_offset, LONG_HEX);
5627             }
5628           printf ("\n       ");
5629           print_vma (section->sh_size, LONG_HEX);
5630           printf ("  ");
5631           print_vma (section->sh_entsize, LONG_HEX);
5632
5633           printf (" %3s ", get_elf_section_flags (section->sh_flags));
5634
5635           printf ("     %2u   %3u     %lu\n",
5636                   section->sh_link,
5637                   section->sh_info,
5638                   (unsigned long) section->sh_addralign);
5639         }
5640
5641       if (do_section_details)
5642         printf ("       %s\n", get_elf_section_flags (section->sh_flags));
5643     }
5644
5645   if (!do_section_details)
5646     {
5647       if (elf_header.e_machine == EM_X86_64
5648           || elf_header.e_machine == EM_L1OM
5649           || elf_header.e_machine == EM_K1OM)
5650         printf (_("Key to Flags:\n\
5651   W (write), A (alloc), X (execute), M (merge), S (strings), l (large)\n\
5652   I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)\n\
5653   O (extra OS processing required) o (OS specific), p (processor specific)\n"));
5654       else
5655         printf (_("Key to Flags:\n\
5656   W (write), A (alloc), X (execute), M (merge), S (strings)\n\
5657   I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)\n\
5658   O (extra OS processing required) o (OS specific), p (processor specific)\n"));
5659     }
5660
5661   return 1;
5662 }
5663
5664 static const char *
5665 get_group_flags (unsigned int flags)
5666 {
5667   static char buff[32];
5668   switch (flags)
5669     {
5670     case 0:
5671       return "";
5672
5673     case GRP_COMDAT:
5674       return "COMDAT ";
5675
5676    default:
5677       snprintf (buff, sizeof (buff), _("[<unknown>: 0x%x] "), flags);
5678       break;
5679     }
5680   return buff;
5681 }
5682
5683 static int
5684 process_section_groups (FILE * file)
5685 {
5686   Elf_Internal_Shdr * section;
5687   unsigned int i;
5688   struct group * group;
5689   Elf_Internal_Shdr * symtab_sec;
5690   Elf_Internal_Shdr * strtab_sec;
5691   Elf_Internal_Sym * symtab;
5692   unsigned long num_syms;
5693   char * strtab;
5694   size_t strtab_size;
5695
5696   /* Don't process section groups unless needed.  */
5697   if (!do_unwind && !do_section_groups)
5698     return 1;
5699
5700   if (elf_header.e_shnum == 0)
5701     {
5702       if (do_section_groups)
5703         printf (_("\nThere are no sections to group in this file.\n"));
5704
5705       return 1;
5706     }
5707
5708   if (section_headers == NULL)
5709     {
5710       error (_("Section headers are not available!\n"));
5711       /* PR 13622: This can happen with a corrupt ELF header.  */
5712       return 0;
5713     }
5714
5715   section_headers_groups = (struct group **) calloc (elf_header.e_shnum,
5716                                                      sizeof (struct group *));
5717
5718   if (section_headers_groups == NULL)
5719     {
5720       error (_("Out of memory reading %u section group headers\n"),
5721              elf_header.e_shnum);
5722       return 0;
5723     }
5724
5725   /* Scan the sections for the group section.  */
5726   group_count = 0;
5727   for (i = 0, section = section_headers;
5728        i < elf_header.e_shnum;
5729        i++, section++)
5730     if (section->sh_type == SHT_GROUP)
5731       group_count++;
5732
5733   if (group_count == 0)
5734     {
5735       if (do_section_groups)
5736         printf (_("\nThere are no section groups in this file.\n"));
5737
5738       return 1;
5739     }
5740
5741   section_groups = (struct group *) calloc (group_count, sizeof (struct group));
5742
5743   if (section_groups == NULL)
5744     {
5745       error (_("Out of memory reading %lu groups\n"),
5746              (unsigned long) group_count);
5747       return 0;
5748     }
5749
5750   symtab_sec = NULL;
5751   strtab_sec = NULL;
5752   symtab = NULL;
5753   num_syms = 0;
5754   strtab = NULL;
5755   strtab_size = 0;
5756   for (i = 0, section = section_headers, group = section_groups;
5757        i < elf_header.e_shnum;
5758        i++, section++)
5759     {
5760       if (section->sh_type == SHT_GROUP)
5761         {
5762           const char * name = printable_section_name (section);
5763           const char * group_name;
5764           unsigned char * start;
5765           unsigned char * indices;
5766           unsigned int entry, j, size;
5767           Elf_Internal_Shdr * sec;
5768           Elf_Internal_Sym * sym;
5769
5770           /* Get the symbol table.  */
5771           if (section->sh_link >= elf_header.e_shnum
5772               || ((sec = section_headers + section->sh_link)->sh_type
5773                   != SHT_SYMTAB))
5774             {
5775               error (_("Bad sh_link in group section `%s'\n"), name);
5776               continue;
5777             }
5778
5779           if (symtab_sec != sec)
5780             {
5781               symtab_sec = sec;
5782               if (symtab)
5783                 free (symtab);
5784               symtab = GET_ELF_SYMBOLS (file, symtab_sec, & num_syms);
5785             }
5786
5787           if (symtab == NULL)
5788             {
5789               error (_("Corrupt header in group section `%s'\n"), name);
5790               continue;
5791             }
5792
5793           if (section->sh_info >= num_syms)
5794             {
5795               error (_("Bad sh_info in group section `%s'\n"), name);
5796               continue;
5797             }
5798
5799           sym = symtab + section->sh_info;
5800
5801           if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
5802             {
5803               if (sym->st_shndx == 0
5804                   || sym->st_shndx >= elf_header.e_shnum)
5805                 {
5806                   error (_("Bad sh_info in group section `%s'\n"), name);
5807                   continue;
5808                 }
5809
5810               group_name = SECTION_NAME (section_headers + sym->st_shndx);
5811               strtab_sec = NULL;
5812               if (strtab)
5813                 free (strtab);
5814               strtab = NULL;
5815               strtab_size = 0;
5816             }
5817           else
5818             {
5819               /* Get the string table.  */
5820               if (symtab_sec->sh_link >= elf_header.e_shnum)
5821                 {
5822                   strtab_sec = NULL;
5823                   if (strtab)
5824                     free (strtab);
5825                   strtab = NULL;
5826                   strtab_size = 0;
5827                 }
5828               else if (strtab_sec
5829                        != (sec = section_headers + symtab_sec->sh_link))
5830                 {
5831                   strtab_sec = sec;
5832                   if (strtab)
5833                     free (strtab);
5834
5835                   strtab = (char *) get_data (NULL, file, strtab_sec->sh_offset,
5836                                               1, strtab_sec->sh_size,
5837                                               _("string table"));
5838                   strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
5839                 }
5840               group_name = sym->st_name < strtab_size
5841                 ? strtab + sym->st_name : _("<corrupt>");
5842             }
5843
5844           /* PR 17531: file: loop.  */
5845           if (section->sh_entsize > section->sh_size)
5846             {
5847               error (_("Section %s has sh_entsize (0x%lx) which is larger than its size (0x%lx)\n"),
5848                      printable_section_name (section),
5849                      (unsigned long) section->sh_entsize,
5850                      (unsigned long) section->sh_size);
5851               break;
5852             }
5853
5854           start = (unsigned char *) get_data (NULL, file, section->sh_offset,
5855                                               1, section->sh_size,
5856                                               _("section data"));
5857           if (start == NULL)
5858             continue;
5859
5860           indices = start;
5861           size = (section->sh_size / section->sh_entsize) - 1;
5862           entry = byte_get (indices, 4);
5863           indices += 4;
5864
5865           if (do_section_groups)
5866             {
5867               printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
5868                       get_group_flags (entry), i, name, group_name, size);
5869
5870               printf (_("   [Index]    Name\n"));
5871             }
5872
5873           group->group_index = i;
5874
5875           for (j = 0; j < size; j++)
5876             {
5877               struct group_list * g;
5878
5879               entry = byte_get (indices, 4);
5880               indices += 4;
5881
5882               if (entry >= elf_header.e_shnum)
5883                 {
5884                   error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
5885                          entry, i, elf_header.e_shnum - 1);
5886                   continue;
5887                 }
5888
5889               if (section_headers_groups [entry] != NULL)
5890                 {
5891                   if (entry)
5892                     {
5893                       error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
5894                              entry, i,
5895                              section_headers_groups [entry]->group_index);
5896                       continue;
5897                     }
5898                   else
5899                     {
5900                       /* Intel C/C++ compiler may put section 0 in a
5901                          section group. We just warn it the first time
5902                          and ignore it afterwards.  */
5903                       static int warned = 0;
5904                       if (!warned)
5905                         {
5906                           error (_("section 0 in group section [%5u]\n"),
5907                                  section_headers_groups [entry]->group_index);
5908                           warned++;
5909                         }
5910                     }
5911                 }
5912
5913               section_headers_groups [entry] = group;
5914
5915               if (do_section_groups)
5916                 {
5917                   sec = section_headers + entry;
5918                   printf ("   [%5u]   %s\n", entry, printable_section_name (sec));
5919                 }
5920
5921               g = (struct group_list *) xmalloc (sizeof (struct group_list));
5922               g->section_index = entry;
5923               g->next = group->root;
5924               group->root = g;
5925             }
5926
5927           if (start)
5928             free (start);
5929
5930           group++;
5931         }
5932     }
5933
5934   if (symtab)
5935     free (symtab);
5936   if (strtab)
5937     free (strtab);
5938   return 1;
5939 }
5940
5941 /* Data used to display dynamic fixups.  */
5942
5943 struct ia64_vms_dynfixup
5944 {
5945   bfd_vma needed_ident;         /* Library ident number.  */
5946   bfd_vma needed;               /* Index in the dstrtab of the library name.  */
5947   bfd_vma fixup_needed;         /* Index of the library.  */
5948   bfd_vma fixup_rela_cnt;       /* Number of fixups.  */
5949   bfd_vma fixup_rela_off;       /* Fixups offset in the dynamic segment.  */
5950 };
5951
5952 /* Data used to display dynamic relocations.  */
5953
5954 struct ia64_vms_dynimgrela
5955 {
5956   bfd_vma img_rela_cnt;         /* Number of relocations.  */
5957   bfd_vma img_rela_off;         /* Reloc offset in the dynamic segment.  */
5958 };
5959
5960 /* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
5961    library).  */
5962
5963 static void
5964 dump_ia64_vms_dynamic_fixups (FILE *file, struct ia64_vms_dynfixup *fixup,
5965                               const char *strtab, unsigned int strtab_sz)
5966 {
5967   Elf64_External_VMS_IMAGE_FIXUP *imfs;
5968   long i;
5969   const char *lib_name;
5970
5971   imfs = get_data (NULL, file, dynamic_addr + fixup->fixup_rela_off,
5972                    1, fixup->fixup_rela_cnt * sizeof (*imfs),
5973                    _("dynamic section image fixups"));
5974   if (!imfs)
5975     return;
5976
5977   if (fixup->needed < strtab_sz)
5978     lib_name = strtab + fixup->needed;
5979   else
5980     {
5981       warn ("corrupt library name index of 0x%lx found in dynamic entry",
5982             (unsigned long) fixup->needed);
5983       lib_name = "???";
5984     }
5985   printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
5986           (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
5987   printf
5988     (_("Seg Offset           Type                             SymVec DataType\n"));
5989
5990   for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
5991     {
5992       unsigned int type;
5993       const char *rtype;
5994
5995       printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
5996       printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
5997       type = BYTE_GET (imfs [i].type);
5998       rtype = elf_ia64_reloc_type (type);
5999       if (rtype == NULL)
6000         printf (" 0x%08x                       ", type);
6001       else
6002         printf (" %-32s ", rtype);
6003       printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
6004       printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
6005     }
6006
6007   free (imfs);
6008 }
6009
6010 /* Display IA-64 OpenVMS dynamic relocations (used to relocate an image).  */
6011
6012 static void
6013 dump_ia64_vms_dynamic_relocs (FILE *file, struct ia64_vms_dynimgrela *imgrela)
6014 {
6015   Elf64_External_VMS_IMAGE_RELA *imrs;
6016   long i;
6017
6018   imrs = get_data (NULL, file, dynamic_addr + imgrela->img_rela_off,
6019                    1, imgrela->img_rela_cnt * sizeof (*imrs),
6020                    _("dynamic section image relocations"));
6021   if (!imrs)
6022     return;
6023
6024   printf (_("\nImage relocs\n"));
6025   printf
6026     (_("Seg Offset   Type                            Addend            Seg Sym Off\n"));
6027
6028   for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
6029     {
6030       unsigned int type;
6031       const char *rtype;
6032
6033       printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
6034       printf ("%08" BFD_VMA_FMT "x ",
6035               (bfd_vma) BYTE_GET (imrs [i].rela_offset));
6036       type = BYTE_GET (imrs [i].type);
6037       rtype = elf_ia64_reloc_type (type);
6038       if (rtype == NULL)
6039         printf ("0x%08x                      ", type);
6040       else
6041         printf ("%-31s ", rtype);
6042       print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
6043       printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
6044       printf ("%08" BFD_VMA_FMT "x\n",
6045               (bfd_vma) BYTE_GET (imrs [i].sym_offset));
6046     }
6047
6048   free (imrs);
6049 }
6050
6051 /* Display IA-64 OpenVMS dynamic relocations and fixups.  */
6052
6053 static int
6054 process_ia64_vms_dynamic_relocs (FILE *file)
6055 {
6056   struct ia64_vms_dynfixup fixup;
6057   struct ia64_vms_dynimgrela imgrela;
6058   Elf_Internal_Dyn *entry;
6059   int res = 0;
6060   bfd_vma strtab_off = 0;
6061   bfd_vma strtab_sz = 0;
6062   char *strtab = NULL;
6063
6064   memset (&fixup, 0, sizeof (fixup));
6065   memset (&imgrela, 0, sizeof (imgrela));
6066
6067   /* Note: the order of the entries is specified by the OpenVMS specs.  */
6068   for (entry = dynamic_section;
6069        entry < dynamic_section + dynamic_nent;
6070        entry++)
6071     {
6072       switch (entry->d_tag)
6073         {
6074         case DT_IA_64_VMS_STRTAB_OFFSET:
6075           strtab_off = entry->d_un.d_val;
6076           break;
6077         case DT_STRSZ:
6078           strtab_sz = entry->d_un.d_val;
6079           if (strtab == NULL)
6080             strtab = get_data (NULL, file, dynamic_addr + strtab_off,
6081                                1, strtab_sz, _("dynamic string section"));
6082           break;
6083
6084         case DT_IA_64_VMS_NEEDED_IDENT:
6085           fixup.needed_ident = entry->d_un.d_val;
6086           break;
6087         case DT_NEEDED:
6088           fixup.needed = entry->d_un.d_val;
6089           break;
6090         case DT_IA_64_VMS_FIXUP_NEEDED:
6091           fixup.fixup_needed = entry->d_un.d_val;
6092           break;
6093         case DT_IA_64_VMS_FIXUP_RELA_CNT:
6094           fixup.fixup_rela_cnt = entry->d_un.d_val;
6095           break;
6096         case DT_IA_64_VMS_FIXUP_RELA_OFF:
6097           fixup.fixup_rela_off = entry->d_un.d_val;
6098           res++;
6099           dump_ia64_vms_dynamic_fixups (file, &fixup, strtab, strtab_sz);
6100           break;
6101
6102         case DT_IA_64_VMS_IMG_RELA_CNT:
6103           imgrela.img_rela_cnt = entry->d_un.d_val;
6104           break;
6105         case DT_IA_64_VMS_IMG_RELA_OFF:
6106           imgrela.img_rela_off = entry->d_un.d_val;
6107           res++;
6108           dump_ia64_vms_dynamic_relocs (file, &imgrela);
6109           break;
6110
6111         default:
6112           break;
6113         }
6114     }
6115
6116   if (strtab != NULL)
6117     free (strtab);
6118
6119   return res;
6120 }
6121
6122 static struct
6123 {
6124   const char * name;
6125   int reloc;
6126   int size;
6127   int rela;
6128 } dynamic_relocations [] =
6129 {
6130     { "REL", DT_REL, DT_RELSZ, FALSE },
6131     { "RELA", DT_RELA, DT_RELASZ, TRUE },
6132     { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
6133 };
6134
6135 /* Process the reloc section.  */
6136
6137 static int
6138 process_relocs (FILE * file)
6139 {
6140   unsigned long rel_size;
6141   unsigned long rel_offset;
6142
6143
6144   if (!do_reloc)
6145     return 1;
6146
6147   if (do_using_dynamic)
6148     {
6149       int is_rela;
6150       const char * name;
6151       int has_dynamic_reloc;
6152       unsigned int i;
6153
6154       has_dynamic_reloc = 0;
6155
6156       for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
6157         {
6158           is_rela = dynamic_relocations [i].rela;
6159           name = dynamic_relocations [i].name;
6160           rel_size = dynamic_info [dynamic_relocations [i].size];
6161           rel_offset = dynamic_info [dynamic_relocations [i].reloc];
6162
6163           has_dynamic_reloc |= rel_size;
6164
6165           if (is_rela == UNKNOWN)
6166             {
6167               if (dynamic_relocations [i].reloc == DT_JMPREL)
6168                 switch (dynamic_info[DT_PLTREL])
6169                   {
6170                   case DT_REL:
6171                     is_rela = FALSE;
6172                     break;
6173                   case DT_RELA:
6174                     is_rela = TRUE;
6175                     break;
6176                   }
6177             }
6178
6179           if (rel_size)
6180             {
6181               printf
6182                 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
6183                  name, rel_offset, rel_size);
6184
6185               dump_relocations (file,
6186                                 offset_from_vma (file, rel_offset, rel_size),
6187                                 rel_size,
6188                                 dynamic_symbols, num_dynamic_syms,
6189                                 dynamic_strings, dynamic_strings_length,
6190                                 is_rela, 1);
6191             }
6192         }
6193
6194       if (is_ia64_vms ())
6195         has_dynamic_reloc |= process_ia64_vms_dynamic_relocs (file);
6196
6197       if (! has_dynamic_reloc)
6198         printf (_("\nThere are no dynamic relocations in this file.\n"));
6199     }
6200   else
6201     {
6202       Elf_Internal_Shdr * section;
6203       unsigned long i;
6204       int found = 0;
6205
6206       for (i = 0, section = section_headers;
6207            i < elf_header.e_shnum;
6208            i++, section++)
6209         {
6210           if (   section->sh_type != SHT_RELA
6211               && section->sh_type != SHT_REL)
6212             continue;
6213
6214           rel_offset = section->sh_offset;
6215           rel_size   = section->sh_size;
6216
6217           if (rel_size)
6218             {
6219               Elf_Internal_Shdr * strsec;
6220               int is_rela;
6221
6222               printf (_("\nRelocation section "));
6223
6224               if (string_table == NULL)
6225                 printf ("%d", section->sh_name);
6226               else
6227                 printf ("'%s'", printable_section_name (section));
6228
6229               printf (_(" at offset 0x%lx contains %lu entries:\n"),
6230                  rel_offset, (unsigned long) (rel_size / section->sh_entsize));
6231
6232               is_rela = section->sh_type == SHT_RELA;
6233
6234               if (section->sh_link != 0
6235                   && section->sh_link < elf_header.e_shnum)
6236                 {
6237                   Elf_Internal_Shdr * symsec;
6238                   Elf_Internal_Sym *  symtab;
6239                   unsigned long nsyms;
6240                   unsigned long strtablen = 0;
6241                   char * strtab = NULL;
6242
6243                   symsec = section_headers + section->sh_link;
6244                   if (symsec->sh_type != SHT_SYMTAB
6245                       && symsec->sh_type != SHT_DYNSYM)
6246                     continue;
6247
6248                   symtab = GET_ELF_SYMBOLS (file, symsec, & nsyms);
6249
6250                   if (symtab == NULL)
6251                     continue;
6252
6253                   if (symsec->sh_link != 0
6254                       && symsec->sh_link < elf_header.e_shnum)
6255                     {
6256                       strsec = section_headers + symsec->sh_link;
6257
6258                       strtab = (char *) get_data (NULL, file, strsec->sh_offset,
6259                                                   1, strsec->sh_size,
6260                                                   _("string table"));
6261                       strtablen = strtab == NULL ? 0 : strsec->sh_size;
6262                     }
6263
6264                   dump_relocations (file, rel_offset, rel_size,
6265                                     symtab, nsyms, strtab, strtablen,
6266                                     is_rela,
6267                                     symsec->sh_type == SHT_DYNSYM);
6268                   if (strtab)
6269                     free (strtab);
6270                   free (symtab);
6271                 }
6272               else
6273                 dump_relocations (file, rel_offset, rel_size,
6274                                   NULL, 0, NULL, 0, is_rela, 0);
6275
6276               found = 1;
6277             }
6278         }
6279
6280       if (! found)
6281         printf (_("\nThere are no relocations in this file.\n"));
6282     }
6283
6284   return 1;
6285 }
6286
6287 /* Process the unwind section.  */
6288
6289 #include "unwind-ia64.h"
6290
6291 /* An absolute address consists of a section and an offset.  If the
6292    section is NULL, the offset itself is the address, otherwise, the
6293    address equals to LOAD_ADDRESS(section) + offset.  */
6294
6295 struct absaddr
6296   {
6297     unsigned short section;
6298     bfd_vma offset;
6299   };
6300
6301 #define ABSADDR(a) \
6302   ((a).section \
6303    ? section_headers [(a).section].sh_addr + (a).offset \
6304    : (a).offset)
6305
6306 struct ia64_unw_table_entry
6307   {
6308     struct absaddr start;
6309     struct absaddr end;
6310     struct absaddr info;
6311   };
6312
6313 struct ia64_unw_aux_info
6314   {
6315
6316     struct ia64_unw_table_entry *table; /* Unwind table.  */
6317     unsigned long table_len;    /* Length of unwind table.  */
6318     unsigned char * info;       /* Unwind info.  */
6319     unsigned long info_size;    /* Size of unwind info.  */
6320     bfd_vma info_addr;          /* starting address of unwind info.  */
6321     bfd_vma seg_base;           /* Starting address of segment.  */
6322     Elf_Internal_Sym * symtab;  /* The symbol table.  */
6323     unsigned long nsyms;        /* Number of symbols.  */
6324     char * strtab;              /* The string table.  */
6325     unsigned long strtab_size;  /* Size of string table.  */
6326   };
6327
6328 static void
6329 find_symbol_for_address (Elf_Internal_Sym * symtab,
6330                          unsigned long nsyms,
6331                          const char * strtab,
6332                          unsigned long strtab_size,
6333                          struct absaddr addr,
6334                          const char ** symname,
6335                          bfd_vma * offset)
6336 {
6337   bfd_vma dist = 0x100000;
6338   Elf_Internal_Sym * sym;
6339   Elf_Internal_Sym * best = NULL;
6340   unsigned long i;
6341
6342   REMOVE_ARCH_BITS (addr.offset);
6343
6344   for (i = 0, sym = symtab; i < nsyms; ++i, ++sym)
6345     {
6346       bfd_vma value = sym->st_value;
6347
6348       REMOVE_ARCH_BITS (value);
6349
6350       if (ELF_ST_TYPE (sym->st_info) == STT_FUNC
6351           && sym->st_name != 0
6352           && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
6353           && addr.offset >= value
6354           && addr.offset - value < dist)
6355         {
6356           best = sym;
6357           dist = addr.offset - value;
6358           if (!dist)
6359             break;
6360         }
6361     }
6362
6363   if (best)
6364     {
6365       *symname = (best->st_name >= strtab_size
6366                   ? _("<corrupt>") : strtab + best->st_name);
6367       *offset = dist;
6368       return;
6369     }
6370
6371   *symname = NULL;
6372   *offset = addr.offset;
6373 }
6374
6375 static void
6376 dump_ia64_unwind (struct ia64_unw_aux_info * aux)
6377 {
6378   struct ia64_unw_table_entry * tp;
6379   int in_body;
6380
6381   for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
6382     {
6383       bfd_vma stamp;
6384       bfd_vma offset;
6385       const unsigned char * dp;
6386       const unsigned char * head;
6387       const char * procname;
6388
6389       find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
6390                                aux->strtab_size, tp->start, &procname, &offset);
6391
6392       fputs ("\n<", stdout);
6393
6394       if (procname)
6395         {
6396           fputs (procname, stdout);
6397
6398           if (offset)
6399             printf ("+%lx", (unsigned long) offset);
6400         }
6401
6402       fputs (">: [", stdout);
6403       print_vma (tp->start.offset, PREFIX_HEX);
6404       fputc ('-', stdout);
6405       print_vma (tp->end.offset, PREFIX_HEX);
6406       printf ("], info at +0x%lx\n",
6407               (unsigned long) (tp->info.offset - aux->seg_base));
6408
6409       head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
6410       stamp = byte_get ((unsigned char *) head, sizeof (stamp));
6411
6412       printf ("  v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
6413               (unsigned) UNW_VER (stamp),
6414               (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
6415               UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
6416               UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
6417               (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
6418
6419       if (UNW_VER (stamp) != 1)
6420         {
6421           printf (_("\tUnknown version.\n"));
6422           continue;
6423         }
6424
6425       in_body = 0;
6426       for (dp = head + 8; dp < head + 8 + eh_addr_size * UNW_LENGTH (stamp);)
6427         dp = unw_decode (dp, in_body, & in_body);
6428     }
6429 }
6430
6431 static int
6432 slurp_ia64_unwind_table (FILE * file,
6433                          struct ia64_unw_aux_info * aux,
6434                          Elf_Internal_Shdr * sec)
6435 {
6436   unsigned long size, nrelas, i;
6437   Elf_Internal_Phdr * seg;
6438   struct ia64_unw_table_entry * tep;
6439   Elf_Internal_Shdr * relsec;
6440   Elf_Internal_Rela * rela;
6441   Elf_Internal_Rela * rp;
6442   unsigned char * table;
6443   unsigned char * tp;
6444   Elf_Internal_Sym * sym;
6445   const char * relname;
6446
6447   /* First, find the starting address of the segment that includes
6448      this section: */
6449
6450   if (elf_header.e_phnum)
6451     {
6452       if (! get_program_headers (file))
6453           return 0;
6454
6455       for (seg = program_headers;
6456            seg < program_headers + elf_header.e_phnum;
6457            ++seg)
6458         {
6459           if (seg->p_type != PT_LOAD)
6460             continue;
6461
6462           if (sec->sh_addr >= seg->p_vaddr
6463               && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
6464             {
6465               aux->seg_base = seg->p_vaddr;
6466               break;
6467             }
6468         }
6469     }
6470
6471   /* Second, build the unwind table from the contents of the unwind section:  */
6472   size = sec->sh_size;
6473   table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
6474                                       _("unwind table"));
6475   if (!table)
6476     return 0;
6477
6478   aux->table = (struct ia64_unw_table_entry *)
6479       xcmalloc (size / (3 * eh_addr_size), sizeof (aux->table[0]));
6480   tep = aux->table;
6481   for (tp = table; tp < table + size; ++tep)
6482     {
6483       tep->start.section = SHN_UNDEF;
6484       tep->end.section   = SHN_UNDEF;
6485       tep->info.section  = SHN_UNDEF;
6486       tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
6487       tep->end.offset   = byte_get (tp, eh_addr_size); tp += eh_addr_size;
6488       tep->info.offset  = byte_get (tp, eh_addr_size); tp += eh_addr_size;
6489       tep->start.offset += aux->seg_base;
6490       tep->end.offset   += aux->seg_base;
6491       tep->info.offset  += aux->seg_base;
6492     }
6493   free (table);
6494
6495   /* Third, apply any relocations to the unwind table:  */
6496   for (relsec = section_headers;
6497        relsec < section_headers + elf_header.e_shnum;
6498        ++relsec)
6499     {
6500       if (relsec->sh_type != SHT_RELA
6501           || relsec->sh_info >= elf_header.e_shnum
6502           || section_headers + relsec->sh_info != sec)
6503         continue;
6504
6505       if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
6506                               & rela, & nrelas))
6507         return 0;
6508
6509       for (rp = rela; rp < rela + nrelas; ++rp)
6510         {
6511           relname = elf_ia64_reloc_type (get_reloc_type (rp->r_info));
6512           sym = aux->symtab + get_reloc_symindex (rp->r_info);
6513
6514           if (! const_strneq (relname, "R_IA64_SEGREL"))
6515             {
6516               warn (_("Skipping unexpected relocation type %s\n"), relname);
6517               continue;
6518             }
6519
6520           i = rp->r_offset / (3 * eh_addr_size);
6521
6522           switch (rp->r_offset/eh_addr_size % 3)
6523             {
6524             case 0:
6525               aux->table[i].start.section = sym->st_shndx;
6526               aux->table[i].start.offset  = rp->r_addend + sym->st_value;
6527               break;
6528             case 1:
6529               aux->table[i].end.section   = sym->st_shndx;
6530               aux->table[i].end.offset    = rp->r_addend + sym->st_value;
6531               break;
6532             case 2:
6533               aux->table[i].info.section  = sym->st_shndx;
6534               aux->table[i].info.offset   = rp->r_addend + sym->st_value;
6535               break;
6536             default:
6537               break;
6538             }
6539         }
6540
6541       free (rela);
6542     }
6543
6544   aux->table_len = size / (3 * eh_addr_size);
6545   return 1;
6546 }
6547
6548 static void
6549 ia64_process_unwind (FILE * file)
6550 {
6551   Elf_Internal_Shdr * sec;
6552   Elf_Internal_Shdr * unwsec = NULL;
6553   Elf_Internal_Shdr * strsec;
6554   unsigned long i, unwcount = 0, unwstart = 0;
6555   struct ia64_unw_aux_info aux;
6556
6557   memset (& aux, 0, sizeof (aux));
6558
6559   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
6560     {
6561       if (sec->sh_type == SHT_SYMTAB
6562           && sec->sh_link < elf_header.e_shnum)
6563         {
6564           aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
6565
6566           strsec = section_headers + sec->sh_link;
6567           if (aux.strtab != NULL)
6568             {
6569               error (_("Multiple auxillary string tables encountered\n"));
6570               free (aux.strtab);
6571             }
6572           aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
6573                                           1, strsec->sh_size,
6574                                           _("string table"));
6575           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
6576         }
6577       else if (sec->sh_type == SHT_IA_64_UNWIND)
6578         unwcount++;
6579     }
6580
6581   if (!unwcount)
6582     printf (_("\nThere are no unwind sections in this file.\n"));
6583
6584   while (unwcount-- > 0)
6585     {
6586       char * suffix;
6587       size_t len, len2;
6588
6589       for (i = unwstart, sec = section_headers + unwstart, unwsec = NULL;
6590            i < elf_header.e_shnum; ++i, ++sec)
6591         if (sec->sh_type == SHT_IA_64_UNWIND)
6592           {
6593             unwsec = sec;
6594             break;
6595           }
6596       /* We have already counted the number of SHT_IA64_UNWIND
6597          sections so the loop above should never fail.  */
6598       assert (unwsec != NULL);
6599
6600       unwstart = i + 1;
6601       len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
6602
6603       if ((unwsec->sh_flags & SHF_GROUP) != 0)
6604         {
6605           /* We need to find which section group it is in.  */
6606           struct group_list * g;
6607
6608           if (section_headers_groups == NULL
6609               || section_headers_groups [i] == NULL)
6610             i = elf_header.e_shnum;
6611           else
6612             {
6613               g = section_headers_groups [i]->root;
6614
6615               for (; g != NULL; g = g->next)
6616                 {
6617                   sec = section_headers + g->section_index;
6618
6619                   if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
6620                     break;
6621                 }
6622
6623               if (g == NULL)
6624                 i = elf_header.e_shnum;
6625             }
6626         }
6627       else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
6628         {
6629           /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO.  */
6630           len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
6631           suffix = SECTION_NAME (unwsec) + len;
6632           for (i = 0, sec = section_headers; i < elf_header.e_shnum;
6633                ++i, ++sec)
6634             if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
6635                 && streq (SECTION_NAME (sec) + len2, suffix))
6636               break;
6637         }
6638       else
6639         {
6640           /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
6641              .IA_64.unwind or BAR -> .IA_64.unwind_info.  */
6642           len = sizeof (ELF_STRING_ia64_unwind) - 1;
6643           len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
6644           suffix = "";
6645           if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
6646             suffix = SECTION_NAME (unwsec) + len;
6647           for (i = 0, sec = section_headers; i < elf_header.e_shnum;
6648                ++i, ++sec)
6649             if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
6650                 && streq (SECTION_NAME (sec) + len2, suffix))
6651               break;
6652         }
6653
6654       if (i == elf_header.e_shnum)
6655         {
6656           printf (_("\nCould not find unwind info section for "));
6657
6658           if (string_table == NULL)
6659             printf ("%d", unwsec->sh_name);
6660           else
6661             printf ("'%s'", printable_section_name (unwsec));
6662         }
6663       else
6664         {
6665           aux.info_addr = sec->sh_addr;
6666           aux.info = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1,
6667                                                  sec->sh_size,
6668                                                  _("unwind info"));
6669           aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
6670
6671           printf (_("\nUnwind section "));
6672
6673           if (string_table == NULL)
6674             printf ("%d", unwsec->sh_name);
6675           else
6676             printf ("'%s'", printable_section_name (unwsec));
6677
6678           printf (_(" at offset 0x%lx contains %lu entries:\n"),
6679                   (unsigned long) unwsec->sh_offset,
6680                   (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
6681
6682           (void) slurp_ia64_unwind_table (file, & aux, unwsec);
6683
6684           if (aux.table_len > 0)
6685             dump_ia64_unwind (& aux);
6686
6687           if (aux.table)
6688             free ((char *) aux.table);
6689           if (aux.info)
6690             free ((char *) aux.info);
6691           aux.table = NULL;
6692           aux.info = NULL;
6693         }
6694     }
6695
6696   if (aux.symtab)
6697     free (aux.symtab);
6698   if (aux.strtab)
6699     free ((char *) aux.strtab);
6700 }
6701
6702 struct hppa_unw_table_entry
6703   {
6704     struct absaddr start;
6705     struct absaddr end;
6706     unsigned int Cannot_unwind:1;                       /* 0 */
6707     unsigned int Millicode:1;                   /* 1 */
6708     unsigned int Millicode_save_sr0:1;          /* 2 */
6709     unsigned int Region_description:2;          /* 3..4 */
6710     unsigned int reserved1:1;                   /* 5 */
6711     unsigned int Entry_SR:1;                    /* 6 */
6712     unsigned int Entry_FR:4;     /* number saved */     /* 7..10 */
6713     unsigned int Entry_GR:5;     /* number saved */     /* 11..15 */
6714     unsigned int Args_stored:1;                 /* 16 */
6715     unsigned int Variable_Frame:1;                      /* 17 */
6716     unsigned int Separate_Package_Body:1;               /* 18 */
6717     unsigned int Frame_Extension_Millicode:1;   /* 19 */
6718     unsigned int Stack_Overflow_Check:1;                /* 20 */
6719     unsigned int Two_Instruction_SP_Increment:1;        /* 21 */
6720     unsigned int Ada_Region:1;                  /* 22 */
6721     unsigned int cxx_info:1;                    /* 23 */
6722     unsigned int cxx_try_catch:1;                       /* 24 */
6723     unsigned int sched_entry_seq:1;                     /* 25 */
6724     unsigned int reserved2:1;                   /* 26 */
6725     unsigned int Save_SP:1;                             /* 27 */
6726     unsigned int Save_RP:1;                             /* 28 */
6727     unsigned int Save_MRP_in_frame:1;           /* 29 */
6728     unsigned int extn_ptr_defined:1;            /* 30 */
6729     unsigned int Cleanup_defined:1;                     /* 31 */
6730
6731     unsigned int MPE_XL_interrupt_marker:1;             /* 0 */
6732     unsigned int HP_UX_interrupt_marker:1;              /* 1 */
6733     unsigned int Large_frame:1;                 /* 2 */
6734     unsigned int Pseudo_SP_Set:1;                       /* 3 */
6735     unsigned int reserved4:1;                   /* 4 */
6736     unsigned int Total_frame_size:27;           /* 5..31 */
6737   };
6738
6739 struct hppa_unw_aux_info
6740   {
6741     struct hppa_unw_table_entry *table; /* Unwind table.  */
6742     unsigned long table_len;    /* Length of unwind table.  */
6743     bfd_vma seg_base;           /* Starting address of segment.  */
6744     Elf_Internal_Sym * symtab;  /* The symbol table.  */
6745     unsigned long nsyms;        /* Number of symbols.  */
6746     char * strtab;              /* The string table.  */
6747     unsigned long strtab_size;  /* Size of string table.  */
6748   };
6749
6750 static void
6751 dump_hppa_unwind (struct hppa_unw_aux_info * aux)
6752 {
6753   struct hppa_unw_table_entry * tp;
6754
6755   for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
6756     {
6757       bfd_vma offset;
6758       const char * procname;
6759
6760       find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
6761                                aux->strtab_size, tp->start, &procname,
6762                                &offset);
6763
6764       fputs ("\n<", stdout);
6765
6766       if (procname)
6767         {
6768           fputs (procname, stdout);
6769
6770           if (offset)
6771             printf ("+%lx", (unsigned long) offset);
6772         }
6773
6774       fputs (">: [", stdout);
6775       print_vma (tp->start.offset, PREFIX_HEX);
6776       fputc ('-', stdout);
6777       print_vma (tp->end.offset, PREFIX_HEX);
6778       printf ("]\n\t");
6779
6780 #define PF(_m) if (tp->_m) printf (#_m " ");
6781 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
6782       PF(Cannot_unwind);
6783       PF(Millicode);
6784       PF(Millicode_save_sr0);
6785       /* PV(Region_description);  */
6786       PF(Entry_SR);
6787       PV(Entry_FR);
6788       PV(Entry_GR);
6789       PF(Args_stored);
6790       PF(Variable_Frame);
6791       PF(Separate_Package_Body);
6792       PF(Frame_Extension_Millicode);
6793       PF(Stack_Overflow_Check);
6794       PF(Two_Instruction_SP_Increment);
6795       PF(Ada_Region);
6796       PF(cxx_info);
6797       PF(cxx_try_catch);
6798       PF(sched_entry_seq);
6799       PF(Save_SP);
6800       PF(Save_RP);
6801       PF(Save_MRP_in_frame);
6802       PF(extn_ptr_defined);
6803       PF(Cleanup_defined);
6804       PF(MPE_XL_interrupt_marker);
6805       PF(HP_UX_interrupt_marker);
6806       PF(Large_frame);
6807       PF(Pseudo_SP_Set);
6808       PV(Total_frame_size);
6809 #undef PF
6810 #undef PV
6811     }
6812
6813   printf ("\n");
6814 }
6815
6816 static int
6817 slurp_hppa_unwind_table (FILE * file,
6818                          struct hppa_unw_aux_info * aux,
6819                          Elf_Internal_Shdr * sec)
6820 {
6821   unsigned long size, unw_ent_size, nentries, nrelas, i;
6822   Elf_Internal_Phdr * seg;
6823   struct hppa_unw_table_entry * tep;
6824   Elf_Internal_Shdr * relsec;
6825   Elf_Internal_Rela * rela;
6826   Elf_Internal_Rela * rp;
6827   unsigned char * table;
6828   unsigned char * tp;
6829   Elf_Internal_Sym * sym;
6830   const char * relname;
6831
6832   /* First, find the starting address of the segment that includes
6833      this section.  */
6834
6835   if (elf_header.e_phnum)
6836     {
6837       if (! get_program_headers (file))
6838         return 0;
6839
6840       for (seg = program_headers;
6841            seg < program_headers + elf_header.e_phnum;
6842            ++seg)
6843         {
6844           if (seg->p_type != PT_LOAD)
6845             continue;
6846
6847           if (sec->sh_addr >= seg->p_vaddr
6848               && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
6849             {
6850               aux->seg_base = seg->p_vaddr;
6851               break;
6852             }
6853         }
6854     }
6855
6856   /* Second, build the unwind table from the contents of the unwind
6857      section.  */
6858   size = sec->sh_size;
6859   table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
6860                                       _("unwind table"));
6861   if (!table)
6862     return 0;
6863
6864   unw_ent_size = 16;
6865   nentries = size / unw_ent_size;
6866   size = unw_ent_size * nentries;
6867
6868   tep = aux->table = (struct hppa_unw_table_entry *)
6869       xcmalloc (nentries, sizeof (aux->table[0]));
6870
6871   for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
6872     {
6873       unsigned int tmp1, tmp2;
6874
6875       tep->start.section = SHN_UNDEF;
6876       tep->end.section   = SHN_UNDEF;
6877
6878       tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
6879       tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
6880       tmp1 = byte_get ((unsigned char *) tp + 8, 4);
6881       tmp2 = byte_get ((unsigned char *) tp + 12, 4);
6882
6883       tep->start.offset += aux->seg_base;
6884       tep->end.offset   += aux->seg_base;
6885
6886       tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
6887       tep->Millicode = (tmp1 >> 30) & 0x1;
6888       tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
6889       tep->Region_description = (tmp1 >> 27) & 0x3;
6890       tep->reserved1 = (tmp1 >> 26) & 0x1;
6891       tep->Entry_SR = (tmp1 >> 25) & 0x1;
6892       tep->Entry_FR = (tmp1 >> 21) & 0xf;
6893       tep->Entry_GR = (tmp1 >> 16) & 0x1f;
6894       tep->Args_stored = (tmp1 >> 15) & 0x1;
6895       tep->Variable_Frame = (tmp1 >> 14) & 0x1;
6896       tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
6897       tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
6898       tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
6899       tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
6900       tep->Ada_Region = (tmp1 >> 9) & 0x1;
6901       tep->cxx_info = (tmp1 >> 8) & 0x1;
6902       tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
6903       tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
6904       tep->reserved2 = (tmp1 >> 5) & 0x1;
6905       tep->Save_SP = (tmp1 >> 4) & 0x1;
6906       tep->Save_RP = (tmp1 >> 3) & 0x1;
6907       tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
6908       tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
6909       tep->Cleanup_defined = tmp1 & 0x1;
6910
6911       tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
6912       tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
6913       tep->Large_frame = (tmp2 >> 29) & 0x1;
6914       tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
6915       tep->reserved4 = (tmp2 >> 27) & 0x1;
6916       tep->Total_frame_size = tmp2 & 0x7ffffff;
6917     }
6918   free (table);
6919
6920   /* Third, apply any relocations to the unwind table.  */
6921   for (relsec = section_headers;
6922        relsec < section_headers + elf_header.e_shnum;
6923        ++relsec)
6924     {
6925       if (relsec->sh_type != SHT_RELA
6926           || relsec->sh_info >= elf_header.e_shnum
6927           || section_headers + relsec->sh_info != sec)
6928         continue;
6929
6930       if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
6931                               & rela, & nrelas))
6932         return 0;
6933
6934       for (rp = rela; rp < rela + nrelas; ++rp)
6935         {
6936           relname = elf_hppa_reloc_type (get_reloc_type (rp->r_info));
6937           sym = aux->symtab + get_reloc_symindex (rp->r_info);
6938
6939           /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64.  */
6940           if (! const_strneq (relname, "R_PARISC_SEGREL"))
6941             {
6942               warn (_("Skipping unexpected relocation type %s\n"), relname);
6943               continue;
6944             }
6945
6946           i = rp->r_offset / unw_ent_size;
6947
6948           switch ((rp->r_offset % unw_ent_size) / eh_addr_size)
6949             {
6950             case 0:
6951               aux->table[i].start.section = sym->st_shndx;
6952               aux->table[i].start.offset  = sym->st_value + rp->r_addend;
6953               break;
6954             case 1:
6955               aux->table[i].end.section   = sym->st_shndx;
6956               aux->table[i].end.offset    = sym->st_value + rp->r_addend;
6957               break;
6958             default:
6959               break;
6960             }
6961         }
6962
6963       free (rela);
6964     }
6965
6966   aux->table_len = nentries;
6967
6968   return 1;
6969 }
6970
6971 static void
6972 hppa_process_unwind (FILE * file)
6973 {
6974   struct hppa_unw_aux_info aux;
6975   Elf_Internal_Shdr * unwsec = NULL;
6976   Elf_Internal_Shdr * strsec;
6977   Elf_Internal_Shdr * sec;
6978   unsigned long i;
6979
6980   if (string_table == NULL)
6981     return;
6982
6983   memset (& aux, 0, sizeof (aux));
6984
6985   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
6986     {
6987       if (sec->sh_type == SHT_SYMTAB
6988           && sec->sh_link < elf_header.e_shnum)
6989         {
6990           aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
6991
6992           strsec = section_headers + sec->sh_link;
6993           if (aux.strtab != NULL)
6994             {
6995               error (_("Multiple auxillary string tables encountered\n"));
6996               free (aux.strtab);
6997             }
6998           aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
6999                                           1, strsec->sh_size,
7000                                           _("string table"));
7001           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7002         }
7003       else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
7004         unwsec = sec;
7005     }
7006
7007   if (!unwsec)
7008     printf (_("\nThere are no unwind sections in this file.\n"));
7009
7010   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7011     {
7012       if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
7013         {
7014           printf (_("\nUnwind section '%s' at offset 0x%lx contains %lu entries:\n"),
7015                   printable_section_name (sec),
7016                   (unsigned long) sec->sh_offset,
7017                   (unsigned long) (sec->sh_size / (2 * eh_addr_size + 8)));
7018
7019           slurp_hppa_unwind_table (file, &aux, sec);
7020           if (aux.table_len > 0)
7021             dump_hppa_unwind (&aux);
7022
7023           if (aux.table)
7024             free ((char *) aux.table);
7025           aux.table = NULL;
7026         }
7027     }
7028
7029   if (aux.symtab)
7030     free (aux.symtab);
7031   if (aux.strtab)
7032     free ((char *) aux.strtab);
7033 }
7034
7035 struct arm_section
7036 {
7037   unsigned char *      data;            /* The unwind data.  */
7038   Elf_Internal_Shdr *  sec;             /* The cached unwind section header.  */
7039   Elf_Internal_Rela *  rela;            /* The cached relocations for this section.  */
7040   unsigned long        nrelas;          /* The number of relocations.  */
7041   unsigned int         rel_type;        /* REL or RELA ?  */
7042   Elf_Internal_Rela *  next_rela;       /* Cyclic pointer to the next reloc to process.  */
7043 };
7044
7045 struct arm_unw_aux_info
7046 {
7047   FILE *              file;             /* The file containing the unwind sections.  */
7048   Elf_Internal_Sym *  symtab;           /* The file's symbol table.  */
7049   unsigned long       nsyms;            /* Number of symbols.  */
7050   char *              strtab;           /* The file's string table.  */
7051   unsigned long       strtab_size;      /* Size of string table.  */
7052 };
7053
7054 static const char *
7055 arm_print_vma_and_name (struct arm_unw_aux_info *aux,
7056                         bfd_vma fn, struct absaddr addr)
7057 {
7058   const char *procname;
7059   bfd_vma sym_offset;
7060
7061   if (addr.section == SHN_UNDEF)
7062     addr.offset = fn;
7063
7064   find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
7065                            aux->strtab_size, addr, &procname,
7066                            &sym_offset);
7067
7068   print_vma (fn, PREFIX_HEX);
7069
7070   if (procname)
7071     {
7072       fputs (" <", stdout);
7073       fputs (procname, stdout);
7074
7075       if (sym_offset)
7076         printf ("+0x%lx", (unsigned long) sym_offset);
7077       fputc ('>', stdout);
7078     }
7079
7080   return procname;
7081 }
7082
7083 static void
7084 arm_free_section (struct arm_section *arm_sec)
7085 {
7086   if (arm_sec->data != NULL)
7087     free (arm_sec->data);
7088
7089   if (arm_sec->rela != NULL)
7090     free (arm_sec->rela);
7091 }
7092
7093 /* 1) If SEC does not match the one cached in ARM_SEC, then free the current
7094       cached section and install SEC instead.
7095    2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
7096       and return its valued in * WORDP, relocating if necessary.
7097    3) Update the NEXT_RELA field in ARM_SEC and store the section index and
7098       relocation's offset in ADDR.
7099    4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
7100       into the string table of the symbol associated with the reloc.  If no
7101       reloc was applied store -1 there.
7102    5) Return TRUE upon success, FALSE otherwise.  */
7103
7104 static bfd_boolean
7105 get_unwind_section_word (struct arm_unw_aux_info *  aux,
7106                          struct arm_section *       arm_sec,
7107                          Elf_Internal_Shdr *        sec,
7108                          bfd_vma                    word_offset,
7109                          unsigned int *             wordp,
7110                          struct absaddr *           addr,
7111                          bfd_vma *                  sym_name)
7112 {
7113   Elf_Internal_Rela *rp;
7114   Elf_Internal_Sym *sym;
7115   const char * relname;
7116   unsigned int word;
7117   bfd_boolean wrapped;
7118
7119   if (sec == NULL || arm_sec == NULL)
7120     return FALSE;
7121
7122   addr->section = SHN_UNDEF;
7123   addr->offset = 0;
7124
7125   if (sym_name != NULL)
7126     *sym_name = (bfd_vma) -1;
7127
7128   /* If necessary, update the section cache.  */
7129   if (sec != arm_sec->sec)
7130     {
7131       Elf_Internal_Shdr *relsec;
7132
7133       arm_free_section (arm_sec);
7134
7135       arm_sec->sec = sec;
7136       arm_sec->data = get_data (NULL, aux->file, sec->sh_offset, 1,
7137                                 sec->sh_size, _("unwind data"));
7138       arm_sec->rela = NULL;
7139       arm_sec->nrelas = 0;
7140
7141       for (relsec = section_headers;
7142            relsec < section_headers + elf_header.e_shnum;
7143            ++relsec)
7144         {
7145           if (relsec->sh_info >= elf_header.e_shnum
7146               || section_headers + relsec->sh_info != sec
7147               /* PR 15745: Check the section type as well.  */
7148               || (relsec->sh_type != SHT_REL
7149                   && relsec->sh_type != SHT_RELA))
7150             continue;
7151
7152           arm_sec->rel_type = relsec->sh_type;
7153           if (relsec->sh_type == SHT_REL)
7154             {
7155               if (!slurp_rel_relocs (aux->file, relsec->sh_offset,
7156                                      relsec->sh_size,
7157                                      & arm_sec->rela, & arm_sec->nrelas))
7158                 return FALSE;
7159             }
7160           else /* relsec->sh_type == SHT_RELA */
7161             {
7162               if (!slurp_rela_relocs (aux->file, relsec->sh_offset,
7163                                       relsec->sh_size,
7164                                       & arm_sec->rela, & arm_sec->nrelas))
7165                 return FALSE;
7166             }
7167           break;
7168         }
7169
7170       arm_sec->next_rela = arm_sec->rela;
7171     }
7172
7173   /* If there is no unwind data we can do nothing.  */
7174   if (arm_sec->data == NULL)
7175     return FALSE;
7176
7177   /* If the offset is invalid then fail.  */
7178   if (word_offset > sec->sh_size - 4)
7179     return FALSE;
7180
7181   /* Get the word at the required offset.  */
7182   word = byte_get (arm_sec->data + word_offset, 4);
7183
7184   /* PR 17531: file: id:000001,src:001266+003044,op:splice,rep:128.  */
7185   if (arm_sec->rela == NULL)
7186     {
7187       * wordp = word;
7188       return TRUE;
7189     }
7190
7191   /* Look through the relocs to find the one that applies to the provided offset.  */
7192   wrapped = FALSE;
7193   for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
7194     {
7195       bfd_vma prelval, offset;
7196
7197       if (rp->r_offset > word_offset && !wrapped)
7198         {
7199           rp = arm_sec->rela;
7200           wrapped = TRUE;
7201         }
7202       if (rp->r_offset > word_offset)
7203         break;
7204
7205       if (rp->r_offset & 3)
7206         {
7207           warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
7208                 (unsigned long) rp->r_offset);
7209           continue;
7210         }
7211
7212       if (rp->r_offset < word_offset)
7213         continue;
7214
7215       /* PR 17531: file: 027-161405-0.004  */
7216       if (aux->symtab == NULL)
7217         continue;
7218
7219       if (arm_sec->rel_type == SHT_REL)
7220         {
7221           offset = word & 0x7fffffff;
7222           if (offset & 0x40000000)
7223             offset |= ~ (bfd_vma) 0x7fffffff;
7224         }
7225       else if (arm_sec->rel_type == SHT_RELA)
7226         offset = rp->r_addend;
7227       else
7228         {
7229           error (_("Unknown section relocation type %d encountered\n"),
7230                  arm_sec->rel_type);
7231           break;
7232         }
7233
7234       /* PR 17531 file: 027-1241568-0.004.  */
7235       if (ELF32_R_SYM (rp->r_info) >= aux->nsyms)
7236         {
7237           error (_("Bad symbol index in unwind relocation (%lu > %lu)\n"),
7238                  (unsigned long) ELF32_R_SYM (rp->r_info), aux->nsyms);
7239           break;
7240         }
7241
7242       sym = aux->symtab + ELF32_R_SYM (rp->r_info);
7243       offset += sym->st_value;
7244       prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
7245
7246       /* Check that we are processing the expected reloc type.  */
7247       if (elf_header.e_machine == EM_ARM)
7248         {
7249           relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
7250           if (relname == NULL)
7251             {
7252               warn (_("Skipping unknown ARM relocation type: %d\n"),
7253                     (int) ELF32_R_TYPE (rp->r_info));
7254               continue;
7255             }
7256
7257           if (streq (relname, "R_ARM_NONE"))
7258               continue;
7259
7260           if (! streq (relname, "R_ARM_PREL31"))
7261             {
7262               warn (_("Skipping unexpected ARM relocation type %s\n"), relname);
7263               continue;
7264             }
7265         }
7266       else if (elf_header.e_machine == EM_TI_C6000)
7267         {
7268           relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
7269           if (relname == NULL)
7270             {
7271               warn (_("Skipping unknown C6000 relocation type: %d\n"),
7272                     (int) ELF32_R_TYPE (rp->r_info));
7273               continue;
7274             }
7275
7276           if (streq (relname, "R_C6000_NONE"))
7277             continue;
7278
7279           if (! streq (relname, "R_C6000_PREL31"))
7280             {
7281               warn (_("Skipping unexpected C6000 relocation type %s\n"), relname);
7282               continue;
7283             }
7284
7285           prelval >>= 1;
7286         }
7287       else
7288         {
7289           /* This function currently only supports ARM and TI unwinders.  */
7290           warn (_("Only TI and ARM unwinders are currently supported\n"));
7291           break;
7292         }
7293
7294       word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
7295       addr->section = sym->st_shndx;
7296       addr->offset = offset;
7297
7298       if (sym_name)
7299         * sym_name = sym->st_name;
7300       break;
7301     }
7302
7303   *wordp = word;
7304   arm_sec->next_rela = rp;
7305
7306   return TRUE;
7307 }
7308
7309 static const char *tic6x_unwind_regnames[16] =
7310 {
7311   "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
7312   "A14", "A13", "A12", "A11", "A10",
7313   "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
7314 };
7315
7316 static void
7317 decode_tic6x_unwind_regmask (unsigned int mask)
7318 {
7319   int i;
7320
7321   for (i = 12; mask; mask >>= 1, i--)
7322     {
7323       if (mask & 1)
7324         {
7325           fputs (tic6x_unwind_regnames[i], stdout);
7326           if (mask > 1)
7327             fputs (", ", stdout);
7328         }
7329     }
7330 }
7331
7332 #define ADVANCE                                                 \
7333   if (remaining == 0 && more_words)                             \
7334     {                                                           \
7335       data_offset += 4;                                         \
7336       if (! get_unwind_section_word (aux, data_arm_sec, data_sec,       \
7337                                      data_offset, & word, & addr, NULL))        \
7338         return;                                                 \
7339       remaining = 4;                                            \
7340       more_words--;                                             \
7341     }                                                           \
7342
7343 #define GET_OP(OP)                      \
7344   ADVANCE;                              \
7345   if (remaining)                        \
7346     {                                   \
7347       remaining--;                      \
7348       (OP) = word >> 24;                \
7349       word <<= 8;                       \
7350     }                                   \
7351   else                                  \
7352     {                                   \
7353       printf (_("[Truncated opcode]\n"));       \
7354       return;                           \
7355     }                                   \
7356   printf ("0x%02x ", OP)
7357
7358 static void
7359 decode_arm_unwind_bytecode (struct arm_unw_aux_info *aux,
7360                             unsigned int word, unsigned int remaining,
7361                             unsigned int more_words,
7362                             bfd_vma data_offset, Elf_Internal_Shdr *data_sec,
7363                             struct arm_section *data_arm_sec)
7364 {
7365   struct absaddr addr;
7366
7367   /* Decode the unwinding instructions.  */
7368   while (1)
7369     {
7370       unsigned int op, op2;
7371
7372       ADVANCE;
7373       if (remaining == 0)
7374         break;
7375       remaining--;
7376       op = word >> 24;
7377       word <<= 8;
7378
7379       printf ("  0x%02x ", op);
7380
7381       if ((op & 0xc0) == 0x00)
7382         {
7383           int offset = ((op & 0x3f) << 2) + 4;
7384
7385           printf ("     vsp = vsp + %d", offset);
7386         }
7387       else if ((op & 0xc0) == 0x40)
7388         {
7389           int offset = ((op & 0x3f) << 2) + 4;
7390
7391           printf ("     vsp = vsp - %d", offset);
7392         }
7393       else if ((op & 0xf0) == 0x80)
7394         {
7395           GET_OP (op2);
7396           if (op == 0x80 && op2 == 0)
7397             printf (_("Refuse to unwind"));
7398           else
7399             {
7400               unsigned int mask = ((op & 0x0f) << 8) | op2;
7401               int first = 1;
7402               int i;
7403
7404               printf ("pop {");
7405               for (i = 0; i < 12; i++)
7406                 if (mask & (1 << i))
7407                   {
7408                     if (first)
7409                       first = 0;
7410                     else
7411                       printf (", ");
7412                     printf ("r%d", 4 + i);
7413                   }
7414               printf ("}");
7415             }
7416         }
7417       else if ((op & 0xf0) == 0x90)
7418         {
7419           if (op == 0x9d || op == 0x9f)
7420             printf (_("     [Reserved]"));
7421           else
7422             printf ("     vsp = r%d", op & 0x0f);
7423         }
7424       else if ((op & 0xf0) == 0xa0)
7425         {
7426           int end = 4 + (op & 0x07);
7427           int first = 1;
7428           int i;
7429
7430           printf ("     pop {");
7431           for (i = 4; i <= end; i++)
7432             {
7433               if (first)
7434                 first = 0;
7435               else
7436                 printf (", ");
7437               printf ("r%d", i);
7438             }
7439           if (op & 0x08)
7440             {
7441               if (!first)
7442                 printf (", ");
7443               printf ("r14");
7444             }
7445           printf ("}");
7446         }
7447       else if (op == 0xb0)
7448         printf (_("     finish"));
7449       else if (op == 0xb1)
7450         {
7451           GET_OP (op2);
7452           if (op2 == 0 || (op2 & 0xf0) != 0)
7453             printf (_("[Spare]"));
7454           else
7455             {
7456               unsigned int mask = op2 & 0x0f;
7457               int first = 1;
7458               int i;
7459
7460               printf ("pop {");
7461               for (i = 0; i < 12; i++)
7462                 if (mask & (1 << i))
7463                   {
7464                     if (first)
7465                       first = 0;
7466                     else
7467                       printf (", ");
7468                     printf ("r%d", i);
7469                   }
7470               printf ("}");
7471             }
7472         }
7473       else if (op == 0xb2)
7474         {
7475           unsigned char buf[9];
7476           unsigned int i, len;
7477           unsigned long offset;
7478
7479           for (i = 0; i < sizeof (buf); i++)
7480             {
7481               GET_OP (buf[i]);
7482               if ((buf[i] & 0x80) == 0)
7483                 break;
7484             }
7485           if (i == sizeof (buf))
7486             printf (_("corrupt change to vsp"));
7487           else
7488             {
7489               offset = read_uleb128 (buf, &len, buf + i + 1);
7490               assert (len == i + 1);
7491               offset = offset * 4 + 0x204;
7492               printf ("vsp = vsp + %ld", offset);
7493             }
7494         }
7495       else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
7496         {
7497           unsigned int first, last;
7498
7499           GET_OP (op2);
7500           first = op2 >> 4;
7501           last = op2 & 0x0f;
7502           if (op == 0xc8)
7503             first = first + 16;
7504           printf ("pop {D%d", first);
7505           if (last)
7506             printf ("-D%d", first + last);
7507           printf ("}");
7508         }
7509       else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
7510         {
7511           unsigned int count = op & 0x07;
7512
7513           printf ("pop {D8");
7514           if (count)
7515             printf ("-D%d", 8 + count);
7516           printf ("}");
7517         }
7518       else if (op >= 0xc0 && op <= 0xc5)
7519         {
7520           unsigned int count = op & 0x07;
7521
7522           printf ("     pop {wR10");
7523           if (count)
7524             printf ("-wR%d", 10 + count);
7525           printf ("}");
7526         }
7527       else if (op == 0xc6)
7528         {
7529           unsigned int first, last;
7530
7531           GET_OP (op2);
7532           first = op2 >> 4;
7533           last = op2 & 0x0f;
7534           printf ("pop {wR%d", first);
7535           if (last)
7536             printf ("-wR%d", first + last);
7537           printf ("}");
7538         }
7539       else if (op == 0xc7)
7540         {
7541           GET_OP (op2);
7542           if (op2 == 0 || (op2 & 0xf0) != 0)
7543             printf (_("[Spare]"));
7544           else
7545             {
7546               unsigned int mask = op2 & 0x0f;
7547               int first = 1;
7548               int i;
7549
7550               printf ("pop {");
7551               for (i = 0; i < 4; i++)
7552                 if (mask & (1 << i))
7553                   {
7554                     if (first)
7555                       first = 0;
7556                     else
7557                       printf (", ");
7558                     printf ("wCGR%d", i);
7559                   }
7560               printf ("}");
7561             }
7562         }
7563       else
7564         printf (_("     [unsupported opcode]"));
7565       printf ("\n");
7566     }
7567 }
7568
7569 static void
7570 decode_tic6x_unwind_bytecode (struct arm_unw_aux_info *aux,
7571                             unsigned int word, unsigned int remaining,
7572                             unsigned int more_words,
7573                             bfd_vma data_offset, Elf_Internal_Shdr *data_sec,
7574                             struct arm_section *data_arm_sec)
7575 {
7576   struct absaddr addr;
7577
7578   /* Decode the unwinding instructions.  */
7579   while (1)
7580     {
7581       unsigned int op, op2;
7582
7583       ADVANCE;
7584       if (remaining == 0)
7585         break;
7586       remaining--;
7587       op = word >> 24;
7588       word <<= 8;
7589
7590       printf ("  0x%02x ", op);
7591
7592       if ((op & 0xc0) == 0x00)
7593         {
7594           int offset = ((op & 0x3f) << 3) + 8;
7595           printf ("     sp = sp + %d", offset);
7596         }
7597       else if ((op & 0xc0) == 0x80)
7598         {
7599           GET_OP (op2);
7600           if (op == 0x80 && op2 == 0)
7601             printf (_("Refuse to unwind"));
7602           else
7603             {
7604               unsigned int mask = ((op & 0x1f) << 8) | op2;
7605               if (op & 0x20)
7606                 printf ("pop compact {");
7607               else
7608                 printf ("pop {");
7609
7610               decode_tic6x_unwind_regmask (mask);
7611               printf("}");
7612             }
7613         }
7614       else if ((op & 0xf0) == 0xc0)
7615         {
7616           unsigned int reg;
7617           unsigned int nregs;
7618           unsigned int i;
7619           const char *name;
7620           struct
7621           {
7622               unsigned int offset;
7623               unsigned int reg;
7624           } regpos[16];
7625
7626           /* Scan entire instruction first so that GET_OP output is not
7627              interleaved with disassembly.  */
7628           nregs = 0;
7629           for (i = 0; nregs < (op & 0xf); i++)
7630             {
7631               GET_OP (op2);
7632               reg = op2 >> 4;
7633               if (reg != 0xf)
7634                 {
7635                   regpos[nregs].offset = i * 2;
7636                   regpos[nregs].reg = reg;
7637                   nregs++;
7638                 }
7639
7640               reg = op2 & 0xf;
7641               if (reg != 0xf)
7642                 {
7643                   regpos[nregs].offset = i * 2 + 1;
7644                   regpos[nregs].reg = reg;
7645                   nregs++;
7646                 }
7647             }
7648
7649           printf (_("pop frame {"));
7650           reg = nregs - 1;
7651           for (i = i * 2; i > 0; i--)
7652             {
7653               if (regpos[reg].offset == i - 1)
7654                 {
7655                   name = tic6x_unwind_regnames[regpos[reg].reg];
7656                   if (reg > 0)
7657                     reg--;
7658                 }
7659               else
7660                 name = _("[pad]");
7661
7662               fputs (name, stdout);
7663               if (i > 1)
7664                 printf (", ");
7665             }
7666
7667           printf ("}");
7668         }
7669       else if (op == 0xd0)
7670         printf ("     MOV FP, SP");
7671       else if (op == 0xd1)
7672         printf ("     __c6xabi_pop_rts");
7673       else if (op == 0xd2)
7674         {
7675           unsigned char buf[9];
7676           unsigned int i, len;
7677           unsigned long offset;
7678
7679           for (i = 0; i < sizeof (buf); i++)
7680             {
7681               GET_OP (buf[i]);
7682               if ((buf[i] & 0x80) == 0)
7683                 break;
7684             }
7685           /* PR 17531: file: id:000001,src:001906+004739,op:splice,rep:2.  */
7686           if (i == sizeof (buf))
7687             {
7688               printf ("<corrupt sp adjust>\n");
7689               warn (_("Corrupt stack pointer adjustment detected\n"));
7690               return;
7691             }
7692           
7693           offset = read_uleb128 (buf, &len, buf + i + 1);
7694           assert (len == i + 1);
7695           offset = offset * 8 + 0x408;
7696           printf (_("sp = sp + %ld"), offset);
7697         }
7698       else if ((op & 0xf0) == 0xe0)
7699         {
7700           if ((op & 0x0f) == 7)
7701             printf ("     RETURN");
7702           else
7703             printf ("     MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
7704         }
7705       else
7706         {
7707           printf (_("     [unsupported opcode]"));
7708         }
7709       putchar ('\n');
7710     }
7711 }
7712
7713 static bfd_vma
7714 arm_expand_prel31 (bfd_vma word, bfd_vma where)
7715 {
7716   bfd_vma offset;
7717
7718   offset = word & 0x7fffffff;
7719   if (offset & 0x40000000)
7720     offset |= ~ (bfd_vma) 0x7fffffff;
7721
7722   if (elf_header.e_machine == EM_TI_C6000)
7723     offset <<= 1;
7724
7725   return offset + where;
7726 }
7727
7728 static void
7729 decode_arm_unwind (struct arm_unw_aux_info *  aux,
7730                    unsigned int               word,
7731                    unsigned int               remaining,
7732                    bfd_vma                    data_offset,
7733                    Elf_Internal_Shdr *        data_sec,
7734                    struct arm_section *       data_arm_sec)
7735 {
7736   int per_index;
7737   unsigned int more_words = 0;
7738   struct absaddr addr;
7739   bfd_vma sym_name = (bfd_vma) -1;
7740
7741   if (remaining == 0)
7742     {
7743       /* Fetch the first word.
7744          Note - when decoding an object file the address extracted
7745          here will always be 0.  So we also pass in the sym_name
7746          parameter so that we can find the symbol associated with
7747          the personality routine.  */
7748       if (! get_unwind_section_word (aux, data_arm_sec, data_sec, data_offset,
7749                                      & word, & addr, & sym_name))
7750         return;
7751
7752       remaining = 4;
7753     }
7754
7755   if ((word & 0x80000000) == 0)
7756     {
7757       /* Expand prel31 for personality routine.  */
7758       bfd_vma fn;
7759       const char *procname;
7760
7761       fn = arm_expand_prel31 (word, data_sec->sh_addr + data_offset);
7762       printf (_("  Personality routine: "));
7763       if (fn == 0
7764           && addr.section == SHN_UNDEF && addr.offset == 0
7765           && sym_name != (bfd_vma) -1 && sym_name < aux->strtab_size)
7766         {
7767           procname = aux->strtab + sym_name;
7768           print_vma (fn, PREFIX_HEX);
7769           if (procname)
7770             {
7771               fputs (" <", stdout);
7772               fputs (procname, stdout);
7773               fputc ('>', stdout);
7774             }
7775         }
7776       else
7777         procname = arm_print_vma_and_name (aux, fn, addr);
7778       fputc ('\n', stdout);
7779
7780       /* The GCC personality routines use the standard compact
7781          encoding, starting with one byte giving the number of
7782          words.  */
7783       if (procname != NULL
7784           && (const_strneq (procname, "__gcc_personality_v0")
7785               || const_strneq (procname, "__gxx_personality_v0")
7786               || const_strneq (procname, "__gcj_personality_v0")
7787               || const_strneq (procname, "__gnu_objc_personality_v0")))
7788         {
7789           remaining = 0;
7790           more_words = 1;
7791           ADVANCE;
7792           if (!remaining)
7793             {
7794               printf (_("  [Truncated data]\n"));
7795               return;
7796             }
7797           more_words = word >> 24;
7798           word <<= 8;
7799           remaining--;
7800           per_index = -1;
7801         }
7802       else
7803         return;
7804     }
7805   else
7806     {
7807       /* ARM EHABI Section 6.3:
7808
7809          An exception-handling table entry for the compact model looks like:
7810
7811            31 30-28 27-24 23-0
7812            -- ----- ----- ----
7813             1   0   index Data for personalityRoutine[index]    */
7814
7815       if (elf_header.e_machine == EM_ARM
7816           && (word & 0x70000000))
7817         warn (_("Corrupt ARM compact model table entry: %x \n"), word);
7818
7819       per_index = (word >> 24) & 0x7f;
7820       printf (_("  Compact model index: %d\n"), per_index);
7821       if (per_index == 0)
7822         {
7823           more_words = 0;
7824           word <<= 8;
7825           remaining--;
7826         }
7827       else if (per_index < 3)
7828         {
7829           more_words = (word >> 16) & 0xff;
7830           word <<= 16;
7831           remaining -= 2;
7832         }
7833     }
7834
7835   switch (elf_header.e_machine)
7836     {
7837     case EM_ARM:
7838       if (per_index < 3)
7839         {
7840           decode_arm_unwind_bytecode (aux, word, remaining, more_words,
7841                                       data_offset, data_sec, data_arm_sec);
7842         }
7843       else
7844         {
7845           warn (_("Unknown ARM compact model index encountered\n"));
7846           printf (_("  [reserved]\n"));
7847         }
7848       break;
7849
7850     case EM_TI_C6000:
7851       if (per_index < 3)
7852         {
7853           decode_tic6x_unwind_bytecode (aux, word, remaining, more_words,
7854                                         data_offset, data_sec, data_arm_sec);
7855         }
7856       else if (per_index < 5)
7857         {
7858           if (((word >> 17) & 0x7f) == 0x7f)
7859             printf (_("  Restore stack from frame pointer\n"));
7860           else
7861             printf (_("  Stack increment %d\n"), (word >> 14) & 0x1fc);
7862           printf (_("  Registers restored: "));
7863           if (per_index == 4)
7864             printf (" (compact) ");
7865           decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
7866           putchar ('\n');
7867           printf (_("  Return register: %s\n"),
7868                   tic6x_unwind_regnames[word & 0xf]);
7869         }
7870       else
7871         printf (_("  [reserved (%d)]\n"), per_index);
7872       break;
7873
7874     default:
7875       error (_("Unsupported architecture type %d encountered when decoding unwind table\n"),
7876              elf_header.e_machine);
7877     }
7878
7879   /* Decode the descriptors.  Not implemented.  */
7880 }
7881
7882 static void
7883 dump_arm_unwind (struct arm_unw_aux_info *aux, Elf_Internal_Shdr *exidx_sec)
7884 {
7885   struct arm_section exidx_arm_sec, extab_arm_sec;
7886   unsigned int i, exidx_len;
7887
7888   memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
7889   memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
7890   exidx_len = exidx_sec->sh_size / 8;
7891
7892   for (i = 0; i < exidx_len; i++)
7893     {
7894       unsigned int exidx_fn, exidx_entry;
7895       struct absaddr fn_addr, entry_addr;
7896       bfd_vma fn;
7897
7898       fputc ('\n', stdout);
7899
7900       if (! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
7901                                      8 * i, & exidx_fn, & fn_addr, NULL)
7902           || ! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
7903                                         8 * i + 4, & exidx_entry, & entry_addr, NULL))
7904         {
7905           arm_free_section (& exidx_arm_sec);
7906           arm_free_section (& extab_arm_sec);
7907           return;
7908         }
7909
7910       /* ARM EHABI, Section 5:
7911          An index table entry consists of 2 words.
7912          The first word contains a prel31 offset to the start of a function, with bit 31 clear.  */
7913       if (exidx_fn & 0x80000000)
7914         warn (_("corrupt index table entry: %x\n"), exidx_fn);
7915
7916       fn = arm_expand_prel31 (exidx_fn, exidx_sec->sh_addr + 8 * i);
7917
7918       arm_print_vma_and_name (aux, fn, fn_addr);
7919       fputs (": ", stdout);
7920
7921       if (exidx_entry == 1)
7922         {
7923           print_vma (exidx_entry, PREFIX_HEX);
7924           fputs (" [cantunwind]\n", stdout);
7925         }
7926       else if (exidx_entry & 0x80000000)
7927         {
7928           print_vma (exidx_entry, PREFIX_HEX);
7929           fputc ('\n', stdout);
7930           decode_arm_unwind (aux, exidx_entry, 4, 0, NULL, NULL);
7931         }
7932       else
7933         {
7934           bfd_vma table, table_offset = 0;
7935           Elf_Internal_Shdr *table_sec;
7936
7937           fputs ("@", stdout);
7938           table = arm_expand_prel31 (exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
7939           print_vma (table, PREFIX_HEX);
7940           printf ("\n");
7941
7942           /* Locate the matching .ARM.extab.  */
7943           if (entry_addr.section != SHN_UNDEF
7944               && entry_addr.section < elf_header.e_shnum)
7945             {
7946               table_sec = section_headers + entry_addr.section;
7947               table_offset = entry_addr.offset;
7948             }
7949           else
7950             {
7951               table_sec = find_section_by_address (table);
7952               if (table_sec != NULL)
7953                 table_offset = table - table_sec->sh_addr;
7954             }
7955           if (table_sec == NULL)
7956             {
7957               warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
7958                     (unsigned long) table);
7959               continue;
7960             }
7961           decode_arm_unwind (aux, 0, 0, table_offset, table_sec,
7962                              &extab_arm_sec);
7963         }
7964     }
7965
7966   printf ("\n");
7967
7968   arm_free_section (&exidx_arm_sec);
7969   arm_free_section (&extab_arm_sec);
7970 }
7971
7972 /* Used for both ARM and C6X unwinding tables.  */
7973
7974 static void
7975 arm_process_unwind (FILE *file)
7976 {
7977   struct arm_unw_aux_info aux;
7978   Elf_Internal_Shdr *unwsec = NULL;
7979   Elf_Internal_Shdr *strsec;
7980   Elf_Internal_Shdr *sec;
7981   unsigned long i;
7982   unsigned int sec_type;
7983
7984   switch (elf_header.e_machine)
7985     {
7986     case EM_ARM:
7987       sec_type = SHT_ARM_EXIDX;
7988       break;
7989
7990     case EM_TI_C6000:
7991       sec_type = SHT_C6000_UNWIND;
7992       break;
7993
7994     default:
7995       error (_("Unsupported architecture type %d encountered when processing unwind table\n"),
7996              elf_header.e_machine);
7997       return;
7998     }
7999
8000   if (string_table == NULL)
8001     return;
8002
8003   memset (& aux, 0, sizeof (aux));
8004   aux.file = file;
8005
8006   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
8007     {
8008       if (sec->sh_type == SHT_SYMTAB && sec->sh_link < elf_header.e_shnum)
8009         {
8010           aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
8011
8012           strsec = section_headers + sec->sh_link;
8013
8014           /* PR binutils/17531 file: 011-12666-0.004.  */
8015           if (aux.strtab != NULL)
8016             {
8017               error (_("Multiple string tables found in file.\n"));
8018               free (aux.strtab);
8019             }
8020           aux.strtab = get_data (NULL, file, strsec->sh_offset,
8021                                  1, strsec->sh_size, _("string table"));
8022           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
8023         }
8024       else if (sec->sh_type == sec_type)
8025         unwsec = sec;
8026     }
8027
8028   if (unwsec == NULL)
8029     printf (_("\nThere are no unwind sections in this file.\n"));
8030   else
8031     for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
8032       {
8033         if (sec->sh_type == sec_type)
8034           {
8035             printf (_("\nUnwind table index '%s' at offset 0x%lx contains %lu entries:\n"),
8036                     printable_section_name (sec),
8037                     (unsigned long) sec->sh_offset,
8038                     (unsigned long) (sec->sh_size / (2 * eh_addr_size)));
8039
8040             dump_arm_unwind (&aux, sec);
8041           }
8042       }
8043
8044   if (aux.symtab)
8045     free (aux.symtab);
8046   if (aux.strtab)
8047     free ((char *) aux.strtab);
8048 }
8049
8050 static void
8051 process_unwind (FILE * file)
8052 {
8053   struct unwind_handler
8054   {
8055     int machtype;
8056     void (* handler)(FILE *);
8057   } handlers[] =
8058   {
8059     { EM_ARM, arm_process_unwind },
8060     { EM_IA_64, ia64_process_unwind },
8061     { EM_PARISC, hppa_process_unwind },
8062     { EM_TI_C6000, arm_process_unwind },
8063     { 0, 0 }
8064   };
8065   int i;
8066
8067   if (!do_unwind)
8068     return;
8069
8070   for (i = 0; handlers[i].handler != NULL; i++)
8071     if (elf_header.e_machine == handlers[i].machtype)
8072       {
8073         handlers[i].handler (file);
8074         return;
8075       }
8076
8077   printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
8078           get_machine_name (elf_header.e_machine));
8079 }
8080
8081 static void
8082 dynamic_section_mips_val (Elf_Internal_Dyn * entry)
8083 {
8084   switch (entry->d_tag)
8085     {
8086     case DT_MIPS_FLAGS:
8087       if (entry->d_un.d_val == 0)
8088         printf (_("NONE"));
8089       else
8090         {
8091           static const char * opts[] =
8092           {
8093             "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
8094             "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
8095             "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
8096             "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
8097             "RLD_ORDER_SAFE"
8098           };
8099           unsigned int cnt;
8100           int first = 1;
8101
8102           for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
8103             if (entry->d_un.d_val & (1 << cnt))
8104               {
8105                 printf ("%s%s", first ? "" : " ", opts[cnt]);
8106                 first = 0;
8107               }
8108         }
8109       break;
8110
8111     case DT_MIPS_IVERSION:
8112       if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
8113         printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry->d_un.d_val));
8114       else
8115         {
8116           char buf[40];
8117           sprintf_vma (buf, entry->d_un.d_ptr);
8118           /* Note: coded this way so that there is a single string for translation.  */
8119           printf (_("<corrupt: %s>"), buf);
8120         }
8121       break;
8122
8123     case DT_MIPS_TIME_STAMP:
8124       {
8125         char timebuf[20];
8126         struct tm * tmp;
8127
8128         time_t atime = entry->d_un.d_val;
8129         tmp = gmtime (&atime);
8130         snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
8131                   tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
8132                   tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
8133         printf (_("Time Stamp: %s"), timebuf);
8134       }
8135       break;
8136
8137     case DT_MIPS_RLD_VERSION:
8138     case DT_MIPS_LOCAL_GOTNO:
8139     case DT_MIPS_CONFLICTNO:
8140     case DT_MIPS_LIBLISTNO:
8141     case DT_MIPS_SYMTABNO:
8142     case DT_MIPS_UNREFEXTNO:
8143     case DT_MIPS_HIPAGENO:
8144     case DT_MIPS_DELTA_CLASS_NO:
8145     case DT_MIPS_DELTA_INSTANCE_NO:
8146     case DT_MIPS_DELTA_RELOC_NO:
8147     case DT_MIPS_DELTA_SYM_NO:
8148     case DT_MIPS_DELTA_CLASSSYM_NO:
8149     case DT_MIPS_COMPACT_SIZE:
8150       print_vma (entry->d_un.d_ptr, DEC);
8151       break;
8152
8153     default:
8154       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8155     }
8156     putchar ('\n');
8157 }
8158
8159 static void
8160 dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
8161 {
8162   switch (entry->d_tag)
8163     {
8164     case DT_HP_DLD_FLAGS:
8165       {
8166         static struct
8167         {
8168           long int bit;
8169           const char * str;
8170         }
8171         flags[] =
8172         {
8173           { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
8174           { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
8175           { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
8176           { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
8177           { DT_HP_BIND_NOW, "HP_BIND_NOW" },
8178           { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
8179           { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
8180           { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
8181           { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
8182           { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
8183           { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
8184           { DT_HP_GST, "HP_GST" },
8185           { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
8186           { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
8187           { DT_HP_NODELETE, "HP_NODELETE" },
8188           { DT_HP_GROUP, "HP_GROUP" },
8189           { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
8190         };
8191         int first = 1;
8192         size_t cnt;
8193         bfd_vma val = entry->d_un.d_val;
8194
8195         for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
8196           if (val & flags[cnt].bit)
8197             {
8198               if (! first)
8199                 putchar (' ');
8200               fputs (flags[cnt].str, stdout);
8201               first = 0;
8202               val ^= flags[cnt].bit;
8203             }
8204
8205         if (val != 0 || first)
8206           {
8207             if (! first)
8208               putchar (' ');
8209             print_vma (val, HEX);
8210           }
8211       }
8212       break;
8213
8214     default:
8215       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8216       break;
8217     }
8218   putchar ('\n');
8219 }
8220
8221 #ifdef BFD64
8222
8223 /* VMS vs Unix time offset and factor.  */
8224
8225 #define VMS_EPOCH_OFFSET 35067168000000000LL
8226 #define VMS_GRANULARITY_FACTOR 10000000
8227
8228 /* Display a VMS time in a human readable format.  */
8229
8230 static void
8231 print_vms_time (bfd_int64_t vmstime)
8232 {
8233   struct tm *tm;
8234   time_t unxtime;
8235
8236   unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
8237   tm = gmtime (&unxtime);
8238   printf ("%04u-%02u-%02uT%02u:%02u:%02u",
8239           tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
8240           tm->tm_hour, tm->tm_min, tm->tm_sec);
8241 }
8242 #endif /* BFD64 */
8243
8244 static void
8245 dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
8246 {
8247   switch (entry->d_tag)
8248     {
8249     case DT_IA_64_PLT_RESERVE:
8250       /* First 3 slots reserved.  */
8251       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8252       printf (" -- ");
8253       print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
8254       break;
8255
8256     case DT_IA_64_VMS_LINKTIME:
8257 #ifdef BFD64
8258       print_vms_time (entry->d_un.d_val);
8259 #endif
8260       break;
8261
8262     case DT_IA_64_VMS_LNKFLAGS:
8263       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8264       if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
8265         printf (" CALL_DEBUG");
8266       if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
8267         printf (" NOP0BUFS");
8268       if (entry->d_un.d_val & VMS_LF_P0IMAGE)
8269         printf (" P0IMAGE");
8270       if (entry->d_un.d_val & VMS_LF_MKTHREADS)
8271         printf (" MKTHREADS");
8272       if (entry->d_un.d_val & VMS_LF_UPCALLS)
8273         printf (" UPCALLS");
8274       if (entry->d_un.d_val & VMS_LF_IMGSTA)
8275         printf (" IMGSTA");
8276       if (entry->d_un.d_val & VMS_LF_INITIALIZE)
8277         printf (" INITIALIZE");
8278       if (entry->d_un.d_val & VMS_LF_MAIN)
8279         printf (" MAIN");
8280       if (entry->d_un.d_val & VMS_LF_EXE_INIT)
8281         printf (" EXE_INIT");
8282       if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
8283         printf (" TBK_IN_IMG");
8284       if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
8285         printf (" DBG_IN_IMG");
8286       if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
8287         printf (" TBK_IN_DSF");
8288       if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
8289         printf (" DBG_IN_DSF");
8290       if (entry->d_un.d_val & VMS_LF_SIGNATURES)
8291         printf (" SIGNATURES");
8292       if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
8293         printf (" REL_SEG_OFF");
8294       break;
8295
8296     default:
8297       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8298       break;
8299     }
8300   putchar ('\n');
8301 }
8302
8303 static int
8304 get_32bit_dynamic_section (FILE * file)
8305 {
8306   Elf32_External_Dyn * edyn;
8307   Elf32_External_Dyn * ext;
8308   Elf_Internal_Dyn * entry;
8309
8310   edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
8311                                           dynamic_size, _("dynamic section"));
8312   if (!edyn)
8313     return 0;
8314
8315   /* SGI's ELF has more than one section in the DYNAMIC segment, and we
8316      might not have the luxury of section headers.  Look for the DT_NULL
8317      terminator to determine the number of entries.  */
8318   for (ext = edyn, dynamic_nent = 0;
8319        (char *) ext < (char *) edyn + dynamic_size - sizeof (* entry);
8320        ext++)
8321     {
8322       dynamic_nent++;
8323       if (BYTE_GET (ext->d_tag) == DT_NULL)
8324         break;
8325     }
8326
8327   dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
8328                                                   sizeof (* entry));
8329   if (dynamic_section == NULL)
8330     {
8331       error (_("Out of memory allocating space for %lu dynamic entries\n"),
8332              (unsigned long) dynamic_nent);
8333       free (edyn);
8334       return 0;
8335     }
8336
8337   for (ext = edyn, entry = dynamic_section;
8338        entry < dynamic_section + dynamic_nent;
8339        ext++, entry++)
8340     {
8341       entry->d_tag      = BYTE_GET (ext->d_tag);
8342       entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
8343     }
8344
8345   free (edyn);
8346
8347   return 1;
8348 }
8349
8350 static int
8351 get_64bit_dynamic_section (FILE * file)
8352 {
8353   Elf64_External_Dyn * edyn;
8354   Elf64_External_Dyn * ext;
8355   Elf_Internal_Dyn * entry;
8356
8357   /* Read in the data.  */
8358   edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
8359                                           dynamic_size, _("dynamic section"));
8360   if (!edyn)
8361     return 0;
8362
8363   /* SGI's ELF has more than one section in the DYNAMIC segment, and we
8364      might not have the luxury of section headers.  Look for the DT_NULL
8365      terminator to determine the number of entries.  */
8366   for (ext = edyn, dynamic_nent = 0;
8367        /* PR 17533 file: 033-67080-0.004 - do not read off the end of the buffer.  */
8368        (char *) ext < ((char *) edyn) + dynamic_size - sizeof (* ext);
8369        ext++)
8370     {
8371       dynamic_nent++;
8372       if (BYTE_GET (ext->d_tag) == DT_NULL)
8373         break;
8374     }
8375
8376   dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
8377                                                   sizeof (* entry));
8378   if (dynamic_section == NULL)
8379     {
8380       error (_("Out of memory allocating space for %lu dynamic entries\n"),
8381              (unsigned long) dynamic_nent);
8382       free (edyn);
8383       return 0;
8384     }
8385
8386   /* Convert from external to internal formats.  */
8387   for (ext = edyn, entry = dynamic_section;
8388        entry < dynamic_section + dynamic_nent;
8389        ext++, entry++)
8390     {
8391       entry->d_tag      = BYTE_GET (ext->d_tag);
8392       entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
8393     }
8394
8395   free (edyn);
8396
8397   return 1;
8398 }
8399
8400 static void
8401 print_dynamic_flags (bfd_vma flags)
8402 {
8403   int first = 1;
8404
8405   while (flags)
8406     {
8407       bfd_vma flag;
8408
8409       flag = flags & - flags;
8410       flags &= ~ flag;
8411
8412       if (first)
8413         first = 0;
8414       else
8415         putc (' ', stdout);
8416
8417       switch (flag)
8418         {
8419         case DF_ORIGIN:         fputs ("ORIGIN", stdout); break;
8420         case DF_SYMBOLIC:       fputs ("SYMBOLIC", stdout); break;
8421         case DF_TEXTREL:        fputs ("TEXTREL", stdout); break;
8422         case DF_BIND_NOW:       fputs ("BIND_NOW", stdout); break;
8423         case DF_STATIC_TLS:     fputs ("STATIC_TLS", stdout); break;
8424         default:                fputs (_("unknown"), stdout); break;
8425         }
8426     }
8427   puts ("");
8428 }
8429
8430 /* Parse and display the contents of the dynamic section.  */
8431
8432 static int
8433 process_dynamic_section (FILE * file)
8434 {
8435   Elf_Internal_Dyn * entry;
8436
8437   if (dynamic_size == 0)
8438     {
8439       if (do_dynamic)
8440         printf (_("\nThere is no dynamic section in this file.\n"));
8441
8442       return 1;
8443     }
8444
8445   if (is_32bit_elf)
8446     {
8447       if (! get_32bit_dynamic_section (file))
8448         return 0;
8449     }
8450   else if (! get_64bit_dynamic_section (file))
8451     return 0;
8452
8453   /* Find the appropriate symbol table.  */
8454   if (dynamic_symbols == NULL)
8455     {
8456       for (entry = dynamic_section;
8457            entry < dynamic_section + dynamic_nent;
8458            ++entry)
8459         {
8460           Elf_Internal_Shdr section;
8461
8462           if (entry->d_tag != DT_SYMTAB)
8463             continue;
8464
8465           dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
8466
8467           /* Since we do not know how big the symbol table is,
8468              we default to reading in the entire file (!) and
8469              processing that.  This is overkill, I know, but it
8470              should work.  */
8471           section.sh_offset = offset_from_vma (file, entry->d_un.d_val, 0);
8472
8473           if (archive_file_offset != 0)
8474             section.sh_size = archive_file_size - section.sh_offset;
8475           else
8476             {
8477               if (fseek (file, 0, SEEK_END))
8478                 error (_("Unable to seek to end of file!\n"));
8479
8480               section.sh_size = ftell (file) - section.sh_offset;
8481             }
8482
8483           if (is_32bit_elf)
8484             section.sh_entsize = sizeof (Elf32_External_Sym);
8485           else
8486             section.sh_entsize = sizeof (Elf64_External_Sym);
8487           section.sh_name = string_table_length;
8488
8489           dynamic_symbols = GET_ELF_SYMBOLS (file, &section, & num_dynamic_syms);
8490           if (num_dynamic_syms < 1)
8491             {
8492               error (_("Unable to determine the number of symbols to load\n"));
8493               continue;
8494             }
8495         }
8496     }
8497
8498   /* Similarly find a string table.  */
8499   if (dynamic_strings == NULL)
8500     {
8501       for (entry = dynamic_section;
8502            entry < dynamic_section + dynamic_nent;
8503            ++entry)
8504         {
8505           unsigned long offset;
8506           long str_tab_len;
8507
8508           if (entry->d_tag != DT_STRTAB)
8509             continue;
8510
8511           dynamic_info[DT_STRTAB] = entry->d_un.d_val;
8512
8513           /* Since we do not know how big the string table is,
8514              we default to reading in the entire file (!) and
8515              processing that.  This is overkill, I know, but it
8516              should work.  */
8517
8518           offset = offset_from_vma (file, entry->d_un.d_val, 0);
8519
8520           if (archive_file_offset != 0)
8521             str_tab_len = archive_file_size - offset;
8522           else
8523             {
8524               if (fseek (file, 0, SEEK_END))
8525                 error (_("Unable to seek to end of file\n"));
8526               str_tab_len = ftell (file) - offset;
8527             }
8528
8529           if (str_tab_len < 1)
8530             {
8531               error
8532                 (_("Unable to determine the length of the dynamic string table\n"));
8533               continue;
8534             }
8535
8536           dynamic_strings = (char *) get_data (NULL, file, offset, 1,
8537                                                str_tab_len,
8538                                                _("dynamic string table"));
8539           dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
8540           break;
8541         }
8542     }
8543
8544   /* And find the syminfo section if available.  */
8545   if (dynamic_syminfo == NULL)
8546     {
8547       unsigned long syminsz = 0;
8548
8549       for (entry = dynamic_section;
8550            entry < dynamic_section + dynamic_nent;
8551            ++entry)
8552         {
8553           if (entry->d_tag == DT_SYMINENT)
8554             {
8555               /* Note: these braces are necessary to avoid a syntax
8556                  error from the SunOS4 C compiler.  */
8557               /* PR binutils/17531: A corrupt file can trigger this test.
8558                  So do not use an assert, instead generate an error message.  */
8559               if (sizeof (Elf_External_Syminfo) != entry->d_un.d_val)
8560                 error (_("Bad value (%d) for SYMINENT entry\n"),
8561                        (int) entry->d_un.d_val);
8562             }
8563           else if (entry->d_tag == DT_SYMINSZ)
8564             syminsz = entry->d_un.d_val;
8565           else if (entry->d_tag == DT_SYMINFO)
8566             dynamic_syminfo_offset = offset_from_vma (file, entry->d_un.d_val,
8567                                                       syminsz);
8568         }
8569
8570       if (dynamic_syminfo_offset != 0 && syminsz != 0)
8571         {
8572           Elf_External_Syminfo * extsyminfo;
8573           Elf_External_Syminfo * extsym;
8574           Elf_Internal_Syminfo * syminfo;
8575
8576           /* There is a syminfo section.  Read the data.  */
8577           extsyminfo = (Elf_External_Syminfo *)
8578               get_data (NULL, file, dynamic_syminfo_offset, 1, syminsz,
8579                         _("symbol information"));
8580           if (!extsyminfo)
8581             return 0;
8582
8583           dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
8584           if (dynamic_syminfo == NULL)
8585             {
8586               error (_("Out of memory allocating %lu byte for dynamic symbol info\n"),
8587                      (unsigned long) syminsz);
8588               return 0;
8589             }
8590
8591           dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
8592           for (syminfo = dynamic_syminfo, extsym = extsyminfo;
8593                syminfo < dynamic_syminfo + dynamic_syminfo_nent;
8594                ++syminfo, ++extsym)
8595             {
8596               syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
8597               syminfo->si_flags = BYTE_GET (extsym->si_flags);
8598             }
8599
8600           free (extsyminfo);
8601         }
8602     }
8603
8604   if (do_dynamic && dynamic_addr)
8605     printf (_("\nDynamic section at offset 0x%lx contains %lu entries:\n"),
8606             dynamic_addr, (unsigned long) dynamic_nent);
8607   if (do_dynamic)
8608     printf (_("  Tag        Type                         Name/Value\n"));
8609
8610   for (entry = dynamic_section;
8611        entry < dynamic_section + dynamic_nent;
8612        entry++)
8613     {
8614       if (do_dynamic)
8615         {
8616           const char * dtype;
8617
8618           putchar (' ');
8619           print_vma (entry->d_tag, FULL_HEX);
8620           dtype = get_dynamic_type (entry->d_tag);
8621           printf (" (%s)%*s", dtype,
8622                   ((is_32bit_elf ? 27 : 19)
8623                    - (int) strlen (dtype)),
8624                   " ");
8625         }
8626
8627       switch (entry->d_tag)
8628         {
8629         case DT_FLAGS:
8630           if (do_dynamic)
8631             print_dynamic_flags (entry->d_un.d_val);
8632           break;
8633
8634         case DT_AUXILIARY:
8635         case DT_FILTER:
8636         case DT_CONFIG:
8637         case DT_DEPAUDIT:
8638         case DT_AUDIT:
8639           if (do_dynamic)
8640             {
8641               switch (entry->d_tag)
8642                 {
8643                 case DT_AUXILIARY:
8644                   printf (_("Auxiliary library"));
8645                   break;
8646
8647                 case DT_FILTER:
8648                   printf (_("Filter library"));
8649                   break;
8650
8651                 case DT_CONFIG:
8652                   printf (_("Configuration file"));
8653                   break;
8654
8655                 case DT_DEPAUDIT:
8656                   printf (_("Dependency audit library"));
8657                   break;
8658
8659                 case DT_AUDIT:
8660                   printf (_("Audit library"));
8661                   break;
8662                 }
8663
8664               if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
8665                 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
8666               else
8667                 {
8668                   printf (": ");
8669                   print_vma (entry->d_un.d_val, PREFIX_HEX);
8670                   putchar ('\n');
8671                 }
8672             }
8673           break;
8674
8675         case DT_FEATURE:
8676           if (do_dynamic)
8677             {
8678               printf (_("Flags:"));
8679
8680               if (entry->d_un.d_val == 0)
8681                 printf (_(" None\n"));
8682               else
8683                 {
8684                   unsigned long int val = entry->d_un.d_val;
8685
8686                   if (val & DTF_1_PARINIT)
8687                     {
8688                       printf (" PARINIT");
8689                       val ^= DTF_1_PARINIT;
8690                     }
8691                   if (val & DTF_1_CONFEXP)
8692                     {
8693                       printf (" CONFEXP");
8694                       val ^= DTF_1_CONFEXP;
8695                     }
8696                   if (val != 0)
8697                     printf (" %lx", val);
8698                   puts ("");
8699                 }
8700             }
8701           break;
8702
8703         case DT_POSFLAG_1:
8704           if (do_dynamic)
8705             {
8706               printf (_("Flags:"));
8707
8708               if (entry->d_un.d_val == 0)
8709                 printf (_(" None\n"));
8710               else
8711                 {
8712                   unsigned long int val = entry->d_un.d_val;
8713
8714                   if (val & DF_P1_LAZYLOAD)
8715                     {
8716                       printf (" LAZYLOAD");
8717                       val ^= DF_P1_LAZYLOAD;
8718                     }
8719                   if (val & DF_P1_GROUPPERM)
8720                     {
8721                       printf (" GROUPPERM");
8722                       val ^= DF_P1_GROUPPERM;
8723                     }
8724                   if (val != 0)
8725                     printf (" %lx", val);
8726                   puts ("");
8727                 }
8728             }
8729           break;
8730
8731         case DT_FLAGS_1:
8732           if (do_dynamic)
8733             {
8734               printf (_("Flags:"));
8735               if (entry->d_un.d_val == 0)
8736                 printf (_(" None\n"));
8737               else
8738                 {
8739                   unsigned long int val = entry->d_un.d_val;
8740
8741                   if (val & DF_1_NOW)
8742                     {
8743                       printf (" NOW");
8744                       val ^= DF_1_NOW;
8745                     }
8746                   if (val & DF_1_GLOBAL)
8747                     {
8748                       printf (" GLOBAL");
8749                       val ^= DF_1_GLOBAL;
8750                     }
8751                   if (val & DF_1_GROUP)
8752                     {
8753                       printf (" GROUP");
8754                       val ^= DF_1_GROUP;
8755                     }
8756                   if (val & DF_1_NODELETE)
8757                     {
8758                       printf (" NODELETE");
8759                       val ^= DF_1_NODELETE;
8760                     }
8761                   if (val & DF_1_LOADFLTR)
8762                     {
8763                       printf (" LOADFLTR");
8764                       val ^= DF_1_LOADFLTR;
8765                     }
8766                   if (val & DF_1_INITFIRST)
8767                     {
8768                       printf (" INITFIRST");
8769                       val ^= DF_1_INITFIRST;
8770                     }
8771                   if (val & DF_1_NOOPEN)
8772                     {
8773                       printf (" NOOPEN");
8774                       val ^= DF_1_NOOPEN;
8775                     }
8776                   if (val & DF_1_ORIGIN)
8777                     {
8778                       printf (" ORIGIN");
8779                       val ^= DF_1_ORIGIN;
8780                     }
8781                   if (val & DF_1_DIRECT)
8782                     {
8783                       printf (" DIRECT");
8784                       val ^= DF_1_DIRECT;
8785                     }
8786                   if (val & DF_1_TRANS)
8787                     {
8788                       printf (" TRANS");
8789                       val ^= DF_1_TRANS;
8790                     }
8791                   if (val & DF_1_INTERPOSE)
8792                     {
8793                       printf (" INTERPOSE");
8794                       val ^= DF_1_INTERPOSE;
8795                     }
8796                   if (val & DF_1_NODEFLIB)
8797                     {
8798                       printf (" NODEFLIB");
8799                       val ^= DF_1_NODEFLIB;
8800                     }
8801                   if (val & DF_1_NODUMP)
8802                     {
8803                       printf (" NODUMP");
8804                       val ^= DF_1_NODUMP;
8805                     }
8806                   if (val & DF_1_CONFALT)
8807                     {
8808                       printf (" CONFALT");
8809                       val ^= DF_1_CONFALT;
8810                     }
8811                   if (val & DF_1_ENDFILTEE)
8812                     {
8813                       printf (" ENDFILTEE");
8814                       val ^= DF_1_ENDFILTEE;
8815                     }
8816                   if (val & DF_1_DISPRELDNE)
8817                     {
8818                       printf (" DISPRELDNE");
8819                       val ^= DF_1_DISPRELDNE;
8820                     }
8821                   if (val & DF_1_DISPRELPND)
8822                     {
8823                       printf (" DISPRELPND");
8824                       val ^= DF_1_DISPRELPND;
8825                     }
8826                   if (val & DF_1_NODIRECT)
8827                     {
8828                       printf (" NODIRECT");
8829                       val ^= DF_1_NODIRECT;
8830                     }
8831                   if (val & DF_1_IGNMULDEF)
8832                     {
8833                       printf (" IGNMULDEF");
8834                       val ^= DF_1_IGNMULDEF;
8835                     }
8836                   if (val & DF_1_NOKSYMS)
8837                     {
8838                       printf (" NOKSYMS");
8839                       val ^= DF_1_NOKSYMS;
8840                     }
8841                   if (val & DF_1_NOHDR)
8842                     {
8843                       printf (" NOHDR");
8844                       val ^= DF_1_NOHDR;
8845                     }
8846                   if (val & DF_1_EDITED)
8847                     {
8848                       printf (" EDITED");
8849                       val ^= DF_1_EDITED;
8850                     }
8851                   if (val & DF_1_NORELOC)
8852                     {
8853                       printf (" NORELOC");
8854                       val ^= DF_1_NORELOC;
8855                     }
8856                   if (val & DF_1_SYMINTPOSE)
8857                     {
8858                       printf (" SYMINTPOSE");
8859                       val ^= DF_1_SYMINTPOSE;
8860                     }
8861                   if (val & DF_1_GLOBAUDIT)
8862                     {
8863                       printf (" GLOBAUDIT");
8864                       val ^= DF_1_GLOBAUDIT;
8865                     }
8866                   if (val & DF_1_SINGLETON)
8867                     {
8868                       printf (" SINGLETON");
8869                       val ^= DF_1_SINGLETON;
8870                     }
8871                   if (val != 0)
8872                     printf (" %lx", val);
8873                   puts ("");
8874                 }
8875             }
8876           break;
8877
8878         case DT_PLTREL:
8879           dynamic_info[entry->d_tag] = entry->d_un.d_val;
8880           if (do_dynamic)
8881             puts (get_dynamic_type (entry->d_un.d_val));
8882           break;
8883
8884         case DT_NULL    :
8885         case DT_NEEDED  :
8886         case DT_PLTGOT  :
8887         case DT_HASH    :
8888         case DT_STRTAB  :
8889         case DT_SYMTAB  :
8890         case DT_RELA    :
8891         case DT_INIT    :
8892         case DT_FINI    :
8893         case DT_SONAME  :
8894         case DT_RPATH   :
8895         case DT_SYMBOLIC:
8896         case DT_REL     :
8897         case DT_DEBUG   :
8898         case DT_TEXTREL :
8899         case DT_JMPREL  :
8900         case DT_RUNPATH :
8901           dynamic_info[entry->d_tag] = entry->d_un.d_val;
8902
8903           if (do_dynamic)
8904             {
8905               char * name;
8906
8907               if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
8908                 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
8909               else
8910                 name = NULL;
8911
8912               if (name)
8913                 {
8914                   switch (entry->d_tag)
8915                     {
8916                     case DT_NEEDED:
8917                       printf (_("Shared library: [%s]"), name);
8918
8919                       if (streq (name, program_interpreter))
8920                         printf (_(" program interpreter"));
8921                       break;
8922
8923                     case DT_SONAME:
8924                       printf (_("Library soname: [%s]"), name);
8925                       break;
8926
8927                     case DT_RPATH:
8928                       printf (_("Library rpath: [%s]"), name);
8929                       break;
8930
8931                     case DT_RUNPATH:
8932                       printf (_("Library runpath: [%s]"), name);
8933                       break;
8934
8935                     default:
8936                       print_vma (entry->d_un.d_val, PREFIX_HEX);
8937                       break;
8938                     }
8939                 }
8940               else
8941                 print_vma (entry->d_un.d_val, PREFIX_HEX);
8942
8943               putchar ('\n');
8944             }
8945           break;
8946
8947         case DT_PLTRELSZ:
8948         case DT_RELASZ  :
8949         case DT_STRSZ   :
8950         case DT_RELSZ   :
8951         case DT_RELAENT :
8952         case DT_SYMENT  :
8953         case DT_RELENT  :
8954           dynamic_info[entry->d_tag] = entry->d_un.d_val;
8955         case DT_PLTPADSZ:
8956         case DT_MOVEENT :
8957         case DT_MOVESZ  :
8958         case DT_INIT_ARRAYSZ:
8959         case DT_FINI_ARRAYSZ:
8960         case DT_GNU_CONFLICTSZ:
8961         case DT_GNU_LIBLISTSZ:
8962           if (do_dynamic)
8963             {
8964               print_vma (entry->d_un.d_val, UNSIGNED);
8965               printf (_(" (bytes)\n"));
8966             }
8967           break;
8968
8969         case DT_VERDEFNUM:
8970         case DT_VERNEEDNUM:
8971         case DT_RELACOUNT:
8972         case DT_RELCOUNT:
8973           if (do_dynamic)
8974             {
8975               print_vma (entry->d_un.d_val, UNSIGNED);
8976               putchar ('\n');
8977             }
8978           break;
8979
8980         case DT_SYMINSZ:
8981         case DT_SYMINENT:
8982         case DT_SYMINFO:
8983         case DT_USED:
8984         case DT_INIT_ARRAY:
8985         case DT_FINI_ARRAY:
8986           if (do_dynamic)
8987             {
8988               if (entry->d_tag == DT_USED
8989                   && VALID_DYNAMIC_NAME (entry->d_un.d_val))
8990                 {
8991                   char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
8992
8993                   if (*name)
8994                     {
8995                       printf (_("Not needed object: [%s]\n"), name);
8996                       break;
8997                     }
8998                 }
8999
9000               print_vma (entry->d_un.d_val, PREFIX_HEX);
9001               putchar ('\n');
9002             }
9003           break;
9004
9005         case DT_BIND_NOW:
9006           /* The value of this entry is ignored.  */
9007           if (do_dynamic)
9008             putchar ('\n');
9009           break;
9010
9011         case DT_GNU_PRELINKED:
9012           if (do_dynamic)
9013             {
9014               struct tm * tmp;
9015               time_t atime = entry->d_un.d_val;
9016
9017               tmp = gmtime (&atime);
9018               /* PR 17533 file: 041-1244816-0.004.  */
9019               if (tmp == NULL)
9020                 printf (_("<corrupt time val: %lx"),
9021                         (unsigned long) atime);
9022               else
9023                 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
9024                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9025                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
9026
9027             }
9028           break;
9029
9030         case DT_GNU_HASH:
9031           dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
9032           if (do_dynamic)
9033             {
9034               print_vma (entry->d_un.d_val, PREFIX_HEX);
9035               putchar ('\n');
9036             }
9037           break;
9038
9039         default:
9040           if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
9041             version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
9042               entry->d_un.d_val;
9043
9044           if (do_dynamic)
9045             {
9046               switch (elf_header.e_machine)
9047                 {
9048                 case EM_MIPS:
9049                 case EM_MIPS_RS3_LE:
9050                   dynamic_section_mips_val (entry);
9051                   break;
9052                 case EM_PARISC:
9053                   dynamic_section_parisc_val (entry);
9054                   break;
9055                 case EM_IA_64:
9056                   dynamic_section_ia64_val (entry);
9057                   break;
9058                 default:
9059                   print_vma (entry->d_un.d_val, PREFIX_HEX);
9060                   putchar ('\n');
9061                 }
9062             }
9063           break;
9064         }
9065     }
9066
9067   return 1;
9068 }
9069
9070 static char *
9071 get_ver_flags (unsigned int flags)
9072 {
9073   static char buff[32];
9074
9075   buff[0] = 0;
9076
9077   if (flags == 0)
9078     return _("none");
9079
9080   if (flags & VER_FLG_BASE)
9081     strcat (buff, "BASE ");
9082
9083   if (flags & VER_FLG_WEAK)
9084     {
9085       if (flags & VER_FLG_BASE)
9086         strcat (buff, "| ");
9087
9088       strcat (buff, "WEAK ");
9089     }
9090
9091   if (flags & VER_FLG_INFO)
9092     {
9093       if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
9094         strcat (buff, "| ");
9095
9096       strcat (buff, "INFO ");
9097     }
9098
9099   if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
9100     strcat (buff, _("| <unknown>"));
9101
9102   return buff;
9103 }
9104
9105 /* Display the contents of the version sections.  */
9106
9107 static int
9108 process_version_sections (FILE * file)
9109 {
9110   Elf_Internal_Shdr * section;
9111   unsigned i;
9112   int found = 0;
9113
9114   if (! do_version)
9115     return 1;
9116
9117   for (i = 0, section = section_headers;
9118        i < elf_header.e_shnum;
9119        i++, section++)
9120     {
9121       switch (section->sh_type)
9122         {
9123         case SHT_GNU_verdef:
9124           {
9125             Elf_External_Verdef * edefs;
9126             unsigned int idx;
9127             unsigned int cnt;
9128             char * endbuf;
9129
9130             found = 1;
9131
9132             printf (_("\nVersion definition section '%s' contains %u entries:\n"),
9133                     printable_section_name (section),
9134                     section->sh_info);
9135
9136             printf (_("  Addr: 0x"));
9137             printf_vma (section->sh_addr);
9138             printf (_("  Offset: %#08lx  Link: %u (%s)"),
9139                     (unsigned long) section->sh_offset, section->sh_link,
9140                     printable_section_name_from_index (section->sh_link));
9141
9142             edefs = (Elf_External_Verdef *)
9143                 get_data (NULL, file, section->sh_offset, 1,section->sh_size,
9144                           _("version definition section"));
9145             if (!edefs)
9146               break;
9147             endbuf = (char *) edefs + section->sh_size;
9148
9149             for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
9150               {
9151                 char * vstart;
9152                 Elf_External_Verdef * edef;
9153                 Elf_Internal_Verdef ent;
9154                 Elf_External_Verdaux * eaux;
9155                 Elf_Internal_Verdaux aux;
9156                 int j;
9157                 int isum;
9158
9159                 /* Check for very large indicies.  */
9160                 if (idx > (size_t) (endbuf - (char *) edefs))
9161                   break;
9162
9163                 vstart = ((char *) edefs) + idx;
9164                 if (vstart + sizeof (*edef) > endbuf)
9165                   break;
9166
9167                 edef = (Elf_External_Verdef *) vstart;
9168
9169                 ent.vd_version = BYTE_GET (edef->vd_version);
9170                 ent.vd_flags   = BYTE_GET (edef->vd_flags);
9171                 ent.vd_ndx     = BYTE_GET (edef->vd_ndx);
9172                 ent.vd_cnt     = BYTE_GET (edef->vd_cnt);
9173                 ent.vd_hash    = BYTE_GET (edef->vd_hash);
9174                 ent.vd_aux     = BYTE_GET (edef->vd_aux);
9175                 ent.vd_next    = BYTE_GET (edef->vd_next);
9176
9177                 printf (_("  %#06x: Rev: %d  Flags: %s"),
9178                         idx, ent.vd_version, get_ver_flags (ent.vd_flags));
9179
9180                 printf (_("  Index: %d  Cnt: %d  "),
9181                         ent.vd_ndx, ent.vd_cnt);
9182
9183                 /* Check for overflow.  */
9184                 if (ent.vd_aux > (size_t) (endbuf - vstart))
9185                   break;
9186
9187                 vstart += ent.vd_aux;
9188
9189                 eaux = (Elf_External_Verdaux *) vstart;
9190
9191                 aux.vda_name = BYTE_GET (eaux->vda_name);
9192                 aux.vda_next = BYTE_GET (eaux->vda_next);
9193
9194                 if (VALID_DYNAMIC_NAME (aux.vda_name))
9195                   printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
9196                 else
9197                   printf (_("Name index: %ld\n"), aux.vda_name);
9198
9199                 isum = idx + ent.vd_aux;
9200
9201                 for (j = 1; j < ent.vd_cnt; j++)
9202                   {
9203                     /* Check for overflow.  */
9204                     if (aux.vda_next > (size_t) (endbuf - vstart))
9205                       break;
9206
9207                     isum   += aux.vda_next;
9208                     vstart += aux.vda_next;
9209
9210                     eaux = (Elf_External_Verdaux *) vstart;
9211                     if (vstart + sizeof (*eaux) > endbuf)
9212                       break;
9213
9214                     aux.vda_name = BYTE_GET (eaux->vda_name);
9215                     aux.vda_next = BYTE_GET (eaux->vda_next);
9216
9217                     if (VALID_DYNAMIC_NAME (aux.vda_name))
9218                       printf (_("  %#06x: Parent %d: %s\n"),
9219                               isum, j, GET_DYNAMIC_NAME (aux.vda_name));
9220                     else
9221                       printf (_("  %#06x: Parent %d, name index: %ld\n"),
9222                               isum, j, aux.vda_name);
9223                   }
9224
9225                 if (j < ent.vd_cnt)
9226                   printf (_("  Version def aux past end of section\n"));
9227
9228                 /* PR 17531: file: id:000001,src:000172+005151,op:splice,rep:2.  */
9229                 if (idx + ent.vd_next <= idx)
9230                   break;
9231
9232                 idx += ent.vd_next;
9233               }
9234
9235             if (cnt < section->sh_info)
9236               printf (_("  Version definition past end of section\n"));
9237
9238             free (edefs);
9239           }
9240           break;
9241
9242         case SHT_GNU_verneed:
9243           {
9244             Elf_External_Verneed * eneed;
9245             unsigned int idx;
9246             unsigned int cnt;
9247             char * endbuf;
9248
9249             found = 1;
9250
9251             printf (_("\nVersion needs section '%s' contains %u entries:\n"),
9252                     printable_section_name (section), section->sh_info);
9253
9254             printf (_(" Addr: 0x"));
9255             printf_vma (section->sh_addr);
9256             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
9257                     (unsigned long) section->sh_offset, section->sh_link,
9258                     printable_section_name_from_index (section->sh_link));
9259
9260             eneed = (Elf_External_Verneed *) get_data (NULL, file,
9261                                                        section->sh_offset, 1,
9262                                                        section->sh_size,
9263                                                        _("Version Needs section"));
9264             if (!eneed)
9265               break;
9266             endbuf = (char *) eneed + section->sh_size;
9267
9268             for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
9269               {
9270                 Elf_External_Verneed * entry;
9271                 Elf_Internal_Verneed ent;
9272                 int j;
9273                 int isum;
9274                 char * vstart;
9275
9276                 if (idx > (size_t) (endbuf - (char *) eneed))
9277                   break;
9278
9279                 vstart = ((char *) eneed) + idx;
9280                 if (vstart + sizeof (*entry) > endbuf)
9281                   break;
9282
9283                 entry = (Elf_External_Verneed *) vstart;
9284
9285                 ent.vn_version = BYTE_GET (entry->vn_version);
9286                 ent.vn_cnt     = BYTE_GET (entry->vn_cnt);
9287                 ent.vn_file    = BYTE_GET (entry->vn_file);
9288                 ent.vn_aux     = BYTE_GET (entry->vn_aux);
9289                 ent.vn_next    = BYTE_GET (entry->vn_next);
9290
9291                 printf (_("  %#06x: Version: %d"), idx, ent.vn_version);
9292
9293                 if (VALID_DYNAMIC_NAME (ent.vn_file))
9294                   printf (_("  File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
9295                 else
9296                   printf (_("  File: %lx"), ent.vn_file);
9297
9298                 printf (_("  Cnt: %d\n"), ent.vn_cnt);
9299
9300                 /* Check for overflow.  */
9301                 if (ent.vn_aux > (size_t) (endbuf - vstart))
9302                   break;
9303
9304                 vstart += ent.vn_aux;
9305
9306                 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
9307                   {
9308                     Elf_External_Vernaux * eaux;
9309                     Elf_Internal_Vernaux aux;
9310
9311                     if (vstart + sizeof (*eaux) > endbuf)
9312                       break;
9313                     eaux = (Elf_External_Vernaux *) vstart;
9314
9315                     aux.vna_hash  = BYTE_GET (eaux->vna_hash);
9316                     aux.vna_flags = BYTE_GET (eaux->vna_flags);
9317                     aux.vna_other = BYTE_GET (eaux->vna_other);
9318                     aux.vna_name  = BYTE_GET (eaux->vna_name);
9319                     aux.vna_next  = BYTE_GET (eaux->vna_next);
9320
9321                     if (VALID_DYNAMIC_NAME (aux.vna_name))
9322                       printf (_("  %#06x:   Name: %s"),
9323                               isum, GET_DYNAMIC_NAME (aux.vna_name));
9324                     else
9325                       printf (_("  %#06x:   Name index: %lx"),
9326                               isum, aux.vna_name);
9327
9328                     printf (_("  Flags: %s  Version: %d\n"),
9329                             get_ver_flags (aux.vna_flags), aux.vna_other);
9330
9331                     /* Check for overflow.  */
9332                     if (aux.vna_next > (size_t) (endbuf - vstart))
9333                       break;
9334
9335                     isum   += aux.vna_next;
9336                     vstart += aux.vna_next;
9337                   }
9338
9339                 if (j < ent.vn_cnt)
9340                   warn (_("Missing Version Needs auxillary information\n"));
9341
9342                 if (ent.vn_next == 0 && cnt < section->sh_info - 1)
9343                   {
9344                     warn (_("Corrupt Version Needs structure - offset to next structure is zero with entries still left to be processed\n"));
9345                     cnt = section->sh_info;
9346                     break;
9347                   }
9348                 idx += ent.vn_next;
9349               }
9350
9351             if (cnt < section->sh_info)
9352               warn (_("Missing Version Needs information\n"));
9353
9354             free (eneed);
9355           }
9356           break;
9357
9358         case SHT_GNU_versym:
9359           {
9360             Elf_Internal_Shdr * link_section;
9361             size_t total;
9362             unsigned int cnt;
9363             unsigned char * edata;
9364             unsigned short * data;
9365             char * strtab;
9366             Elf_Internal_Sym * symbols;
9367             Elf_Internal_Shdr * string_sec;
9368             unsigned long num_syms;
9369             long off;
9370
9371             if (section->sh_link >= elf_header.e_shnum)
9372               break;
9373
9374             link_section = section_headers + section->sh_link;
9375             total = section->sh_size / sizeof (Elf_External_Versym);
9376
9377             if (link_section->sh_link >= elf_header.e_shnum)
9378               break;
9379
9380             found = 1;
9381
9382             symbols = GET_ELF_SYMBOLS (file, link_section, & num_syms);
9383             if (symbols == NULL)
9384               break;
9385
9386             string_sec = section_headers + link_section->sh_link;
9387
9388             strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
9389                                         string_sec->sh_size,
9390                                         _("version string table"));
9391             if (!strtab)
9392               {
9393                 free (symbols);
9394                 break;
9395               }
9396
9397             printf (_("\nVersion symbols section '%s' contains %lu entries:\n"),
9398                     printable_section_name (section), (unsigned long) total);
9399
9400             printf (_(" Addr: "));
9401             printf_vma (section->sh_addr);
9402             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
9403                     (unsigned long) section->sh_offset, section->sh_link,
9404                     printable_section_name (link_section));
9405
9406             off = offset_from_vma (file,
9407                                    version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
9408                                    total * sizeof (short));
9409             edata = (unsigned char *) get_data (NULL, file, off, total,
9410                                                 sizeof (short),
9411                                                 _("version symbol data"));
9412             if (!edata)
9413               {
9414                 free (strtab);
9415                 free (symbols);
9416                 break;
9417               }
9418
9419             data = (short unsigned int *) cmalloc (total, sizeof (short));
9420
9421             for (cnt = total; cnt --;)
9422               data[cnt] = byte_get (edata + cnt * sizeof (short),
9423                                     sizeof (short));
9424
9425             free (edata);
9426
9427             for (cnt = 0; cnt < total; cnt += 4)
9428               {
9429                 int j, nn;
9430                 int check_def, check_need;
9431                 char * name;
9432
9433                 printf ("  %03x:", cnt);
9434
9435                 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
9436                   switch (data[cnt + j])
9437                     {
9438                     case 0:
9439                       fputs (_("   0 (*local*)    "), stdout);
9440                       break;
9441
9442                     case 1:
9443                       fputs (_("   1 (*global*)   "), stdout);
9444                       break;
9445
9446                     default:
9447                       nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
9448                                    data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
9449
9450                       /* If this index value is greater than the size of the symbols
9451                          array, break to avoid an out-of-bounds read.  */
9452                       if ((unsigned long)(cnt + j) >= num_syms)
9453                         {
9454                           warn (_("invalid index into symbol array\n"));
9455                           break;
9456                         }
9457
9458                       check_def = 1;
9459                       check_need = 1;
9460                       if (symbols[cnt + j].st_shndx >= elf_header.e_shnum
9461                           || section_headers[symbols[cnt + j].st_shndx].sh_type
9462                              != SHT_NOBITS)
9463                         {
9464                           if (symbols[cnt + j].st_shndx == SHN_UNDEF)
9465                             check_def = 0;
9466                           else
9467                             check_need = 0;
9468                         }
9469
9470                       if (check_need
9471                           && version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
9472                         {
9473                           Elf_Internal_Verneed ivn;
9474                           unsigned long offset;
9475
9476                           offset = offset_from_vma
9477                             (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
9478                              sizeof (Elf_External_Verneed));
9479
9480                           do
9481                             {
9482                               Elf_Internal_Vernaux ivna;
9483                               Elf_External_Verneed evn;
9484                               Elf_External_Vernaux evna;
9485                               unsigned long a_off;
9486
9487                               if (get_data (&evn, file, offset, sizeof (evn), 1,
9488                                             _("version need")) == NULL)
9489                                 break;
9490
9491                               ivn.vn_aux  = BYTE_GET (evn.vn_aux);
9492                               ivn.vn_next = BYTE_GET (evn.vn_next);
9493
9494                               a_off = offset + ivn.vn_aux;
9495
9496                               do
9497                                 {
9498                                   if (get_data (&evna, file, a_off, sizeof (evna),
9499                                                 1, _("version need aux (2)")) == NULL)
9500                                     {
9501                                       ivna.vna_next  = 0;
9502                                       ivna.vna_other = 0;
9503                                     }
9504                                   else
9505                                     {
9506                                       ivna.vna_next  = BYTE_GET (evna.vna_next);
9507                                       ivna.vna_other = BYTE_GET (evna.vna_other);
9508                                     }
9509
9510                                   a_off += ivna.vna_next;
9511                                 }
9512                               while (ivna.vna_other != data[cnt + j]
9513                                      && ivna.vna_next != 0);
9514
9515                               if (ivna.vna_other == data[cnt + j])
9516                                 {
9517                                   ivna.vna_name = BYTE_GET (evna.vna_name);
9518
9519                                   if (ivna.vna_name >= string_sec->sh_size)
9520                                     name = _("*invalid*");
9521                                   else
9522                                     name = strtab + ivna.vna_name;
9523                                   nn += printf ("(%s%-*s",
9524                                                 name,
9525                                                 12 - (int) strlen (name),
9526                                                 ")");
9527                                   check_def = 0;
9528                                   break;
9529                                 }
9530
9531                               offset += ivn.vn_next;
9532                             }
9533                           while (ivn.vn_next);
9534                         }
9535
9536                       if (check_def && data[cnt + j] != 0x8001
9537                           && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
9538                         {
9539                           Elf_Internal_Verdef ivd;
9540                           Elf_External_Verdef evd;
9541                           unsigned long offset;
9542
9543                           offset = offset_from_vma
9544                             (file, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
9545                              sizeof evd);
9546
9547                           do
9548                             {
9549                               if (get_data (&evd, file, offset, sizeof (evd), 1,
9550                                             _("version def")) == NULL)
9551                                 {
9552                                   ivd.vd_next = 0;
9553                                   /* PR 17531: file: 046-1082287-0.004.  */ 
9554                                   ivd.vd_ndx  = (data[cnt + j] & VERSYM_VERSION) + 1;
9555                                   break;
9556                                 }
9557                               else
9558                                 {
9559                                   ivd.vd_next = BYTE_GET (evd.vd_next);
9560                                   ivd.vd_ndx  = BYTE_GET (evd.vd_ndx);
9561                                 }
9562
9563                               offset += ivd.vd_next;
9564                             }
9565                           while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
9566                                  && ivd.vd_next != 0);
9567
9568                           if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
9569                             {
9570                               Elf_External_Verdaux evda;
9571                               Elf_Internal_Verdaux ivda;
9572
9573                               ivd.vd_aux = BYTE_GET (evd.vd_aux);
9574
9575                               if (get_data (&evda, file,
9576                                             offset - ivd.vd_next + ivd.vd_aux,
9577                                             sizeof (evda), 1,
9578                                             _("version def aux")) == NULL)
9579                                 break;
9580
9581                               ivda.vda_name = BYTE_GET (evda.vda_name);
9582
9583                               if (ivda.vda_name >= string_sec->sh_size)
9584                                 name = _("*invalid*");
9585                               else
9586                                 name = strtab + ivda.vda_name;
9587                               nn += printf ("(%s%-*s",
9588                                             name,
9589                                             12 - (int) strlen (name),
9590                                             ")");
9591                             }
9592                         }
9593
9594                       if (nn < 18)
9595                         printf ("%*c", 18 - nn, ' ');
9596                     }
9597
9598                 putchar ('\n');
9599               }
9600
9601             free (data);
9602             free (strtab);
9603             free (symbols);
9604           }
9605           break;
9606
9607         default:
9608           break;
9609         }
9610     }
9611
9612   if (! found)
9613     printf (_("\nNo version information found in this file.\n"));
9614
9615   return 1;
9616 }
9617
9618 static const char *
9619 get_symbol_binding (unsigned int binding)
9620 {
9621   static char buff[32];
9622
9623   switch (binding)
9624     {
9625     case STB_LOCAL:     return "LOCAL";
9626     case STB_GLOBAL:    return "GLOBAL";
9627     case STB_WEAK:      return "WEAK";
9628     default:
9629       if (binding >= STB_LOPROC && binding <= STB_HIPROC)
9630         snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
9631                   binding);
9632       else if (binding >= STB_LOOS && binding <= STB_HIOS)
9633         {
9634           if (binding == STB_GNU_UNIQUE
9635               && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
9636                   /* GNU is still using the default value 0.  */
9637                   || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
9638             return "UNIQUE";
9639           snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
9640         }
9641       else
9642         snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
9643       return buff;
9644     }
9645 }
9646
9647 static const char *
9648 get_symbol_type (unsigned int type)
9649 {
9650   static char buff[32];
9651
9652   switch (type)
9653     {
9654     case STT_NOTYPE:    return "NOTYPE";
9655     case STT_OBJECT:    return "OBJECT";
9656     case STT_FUNC:      return "FUNC";
9657     case STT_SECTION:   return "SECTION";
9658     case STT_FILE:      return "FILE";
9659     case STT_COMMON:    return "COMMON";
9660     case STT_TLS:       return "TLS";
9661     case STT_RELC:      return "RELC";
9662     case STT_SRELC:     return "SRELC";
9663     default:
9664       if (type >= STT_LOPROC && type <= STT_HIPROC)
9665         {
9666           if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
9667             return "THUMB_FUNC";
9668
9669           if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
9670             return "REGISTER";
9671
9672           if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
9673             return "PARISC_MILLI";
9674
9675           snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
9676         }
9677       else if (type >= STT_LOOS && type <= STT_HIOS)
9678         {
9679           if (elf_header.e_machine == EM_PARISC)
9680             {
9681               if (type == STT_HP_OPAQUE)
9682                 return "HP_OPAQUE";
9683               if (type == STT_HP_STUB)
9684                 return "HP_STUB";
9685             }
9686
9687           if (type == STT_GNU_IFUNC
9688               && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
9689                   || elf_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD
9690                   /* GNU is still using the default value 0.  */
9691                   || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
9692             return "IFUNC";
9693
9694           snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
9695         }
9696       else
9697         snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
9698       return buff;
9699     }
9700 }
9701
9702 static const char *
9703 get_symbol_visibility (unsigned int visibility)
9704 {
9705   switch (visibility)
9706     {
9707     case STV_DEFAULT:   return "DEFAULT";
9708     case STV_INTERNAL:  return "INTERNAL";
9709     case STV_HIDDEN:    return "HIDDEN";
9710     case STV_PROTECTED: return "PROTECTED";
9711     default: abort ();
9712     }
9713 }
9714
9715 static const char *
9716 get_mips_symbol_other (unsigned int other)
9717 {
9718   switch (other)
9719     {
9720     case STO_OPTIONAL:
9721       return "OPTIONAL";
9722     case STO_MIPS_PLT:
9723       return "MIPS PLT";
9724     case STO_MIPS_PIC:
9725       return "MIPS PIC";
9726     case STO_MICROMIPS:
9727       return "MICROMIPS";
9728     case STO_MICROMIPS | STO_MIPS_PIC:
9729       return "MICROMIPS, MIPS PIC";
9730     case STO_MIPS16:
9731       return "MIPS16";
9732     default:
9733       return NULL;
9734     }
9735 }
9736
9737 static const char *
9738 get_ia64_symbol_other (unsigned int other)
9739 {
9740   if (is_ia64_vms ())
9741     {
9742       static char res[32];
9743
9744       res[0] = 0;
9745
9746       /* Function types is for images and .STB files only.  */
9747       switch (elf_header.e_type)
9748         {
9749         case ET_DYN:
9750         case ET_EXEC:
9751           switch (VMS_ST_FUNC_TYPE (other))
9752             {
9753             case VMS_SFT_CODE_ADDR:
9754               strcat (res, " CA");
9755               break;
9756             case VMS_SFT_SYMV_IDX:
9757               strcat (res, " VEC");
9758               break;
9759             case VMS_SFT_FD:
9760               strcat (res, " FD");
9761               break;
9762             case VMS_SFT_RESERVE:
9763               strcat (res, " RSV");
9764               break;
9765             default:
9766               abort ();
9767             }
9768           break;
9769         default:
9770           break;
9771         }
9772       switch (VMS_ST_LINKAGE (other))
9773         {
9774         case VMS_STL_IGNORE:
9775           strcat (res, " IGN");
9776           break;
9777         case VMS_STL_RESERVE:
9778           strcat (res, " RSV");
9779           break;
9780         case VMS_STL_STD:
9781           strcat (res, " STD");
9782           break;
9783         case VMS_STL_LNK:
9784           strcat (res, " LNK");
9785           break;
9786         default:
9787           abort ();
9788         }
9789
9790       if (res[0] != 0)
9791         return res + 1;
9792       else
9793         return res;
9794     }
9795   return NULL;
9796 }
9797
9798 static const char *
9799 get_ppc64_symbol_other (unsigned int other)
9800 {
9801   if (PPC64_LOCAL_ENTRY_OFFSET (other) != 0)
9802     {
9803       static char buf[32];
9804       snprintf (buf, sizeof buf, _("<localentry>: %d"),
9805                 PPC64_LOCAL_ENTRY_OFFSET (other));
9806       return buf;
9807     }
9808   return NULL;
9809 }
9810
9811 static const char *
9812 get_symbol_other (unsigned int other)
9813 {
9814   const char * result = NULL;
9815   static char buff [32];
9816
9817   if (other == 0)
9818     return "";
9819
9820   switch (elf_header.e_machine)
9821     {
9822     case EM_MIPS:
9823       result = get_mips_symbol_other (other);
9824       break;
9825     case EM_IA_64:
9826       result = get_ia64_symbol_other (other);
9827       break;
9828     case EM_PPC64:
9829       result = get_ppc64_symbol_other (other);
9830       break;
9831     default:
9832       break;
9833     }
9834
9835   if (result)
9836     return result;
9837
9838   snprintf (buff, sizeof buff, _("<other>: %x"), other);
9839   return buff;
9840 }
9841
9842 static const char *
9843 get_symbol_index_type (unsigned int type)
9844 {
9845   static char buff[32];
9846
9847   switch (type)
9848     {
9849     case SHN_UNDEF:     return "UND";
9850     case SHN_ABS:       return "ABS";
9851     case SHN_COMMON:    return "COM";
9852     default:
9853       if (type == SHN_IA_64_ANSI_COMMON
9854           && elf_header.e_machine == EM_IA_64
9855           && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
9856         return "ANSI_COM";
9857       else if ((elf_header.e_machine == EM_X86_64
9858                 || elf_header.e_machine == EM_L1OM
9859                 || elf_header.e_machine == EM_K1OM)
9860                && type == SHN_X86_64_LCOMMON)
9861         return "LARGE_COM";
9862       else if ((type == SHN_MIPS_SCOMMON
9863                 && elf_header.e_machine == EM_MIPS)
9864                || (type == SHN_TIC6X_SCOMMON
9865                    && elf_header.e_machine == EM_TI_C6000))
9866         return "SCOM";
9867       else if (type == SHN_MIPS_SUNDEFINED
9868                && elf_header.e_machine == EM_MIPS)
9869         return "SUND";
9870       else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
9871         sprintf (buff, "PRC[0x%04x]", type & 0xffff);
9872       else if (type >= SHN_LOOS && type <= SHN_HIOS)
9873         sprintf (buff, "OS [0x%04x]", type & 0xffff);
9874       else if (type >= SHN_LORESERVE)
9875         sprintf (buff, "RSV[0x%04x]", type & 0xffff);
9876       else if (type >= elf_header.e_shnum)
9877         sprintf (buff, _("bad section index[%3d]"), type);
9878       else
9879         sprintf (buff, "%3d", type);
9880       break;
9881     }
9882
9883   return buff;
9884 }
9885
9886 static bfd_vma *
9887 get_dynamic_data (FILE * file, size_t number, unsigned int ent_size)
9888 {
9889   unsigned char * e_data;
9890   bfd_vma * i_data;
9891
9892   /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
9893      attempting to allocate memory when the read is bound to fail.  */
9894   if (ent_size * number > current_file_size)
9895     {
9896       error (_("Invalid number of dynamic entries: %lu\n"),
9897              (unsigned long) number);
9898       return NULL;
9899     }
9900
9901   e_data = (unsigned char *) cmalloc (number, ent_size);
9902   if (e_data == NULL)
9903     {
9904       error (_("Out of memory reading %lu dynamic entries\n"),
9905              (unsigned long) number);
9906       return NULL;
9907     }
9908
9909   if (fread (e_data, ent_size, number, file) != number)
9910     {
9911       error (_("Unable to read in %lu bytes of dynamic data\n"),
9912              (unsigned long) (number * ent_size));
9913       free (e_data);
9914       return NULL;
9915     }
9916
9917   i_data = (bfd_vma *) cmalloc (number, sizeof (*i_data));
9918   if (i_data == NULL)
9919     {
9920       error (_("Out of memory allocating space for %lu dynamic entries\n"),
9921              (unsigned long) number);
9922       free (e_data);
9923       return NULL;
9924     }
9925
9926   while (number--)
9927     i_data[number] = byte_get (e_data + number * ent_size, ent_size);
9928
9929   free (e_data);
9930
9931   return i_data;
9932 }
9933
9934 static void
9935 print_dynamic_symbol (bfd_vma si, unsigned long hn)
9936 {
9937   Elf_Internal_Sym * psym;
9938   int n;
9939
9940   n = print_vma (si, DEC_5);
9941   if (n < 5)
9942     fputs (&"     "[n], stdout);
9943   printf (" %3lu: ", hn);
9944
9945   if (dynamic_symbols == NULL || si >= num_dynamic_syms)
9946     {
9947       printf (_("<No info available for dynamic symbol number %lu>\n"),
9948               (unsigned long) si);
9949       return;
9950     }
9951
9952   psym = dynamic_symbols + si;
9953   print_vma (psym->st_value, LONG_HEX);
9954   putchar (' ');
9955   print_vma (psym->st_size, DEC_5);
9956
9957   printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
9958   printf (" %-6s",  get_symbol_binding (ELF_ST_BIND (psym->st_info)));
9959   printf (" %-7s",  get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
9960   /* Check to see if any other bits in the st_other field are set.
9961      Note - displaying this information disrupts the layout of the
9962      table being generated, but for the moment this case is very
9963      rare.  */
9964   if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
9965     printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
9966   printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
9967   if (VALID_DYNAMIC_NAME (psym->st_name))
9968     print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
9969   else
9970     printf (_(" <corrupt: %14ld>"), psym->st_name);
9971   putchar ('\n');
9972 }
9973
9974 static const char *
9975 get_symbol_version_string (FILE *file, int is_dynsym,
9976                            const char *strtab,
9977                            unsigned long int strtab_size,
9978                            unsigned int si, Elf_Internal_Sym *psym,
9979                            enum versioned_symbol_info *sym_info,
9980                            unsigned short *vna_other)
9981 {
9982   const char *version_string = NULL;
9983
9984   if (is_dynsym
9985       && version_info[DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
9986     {
9987       unsigned char data[2];
9988       unsigned short vers_data;
9989       unsigned long offset;
9990       int is_nobits;
9991       int check_def;
9992
9993       offset = offset_from_vma
9994         (file, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
9995          sizeof data + si * sizeof (vers_data));
9996
9997       if (get_data (&data, file, offset + si * sizeof (vers_data),
9998                     sizeof (data), 1, _("version data")) == NULL)
9999         return NULL;
10000
10001       vers_data = byte_get (data, 2);
10002
10003       is_nobits = (psym->st_shndx < elf_header.e_shnum
10004                    && section_headers[psym->st_shndx].sh_type
10005                    == SHT_NOBITS);
10006
10007       check_def = (psym->st_shndx != SHN_UNDEF);
10008
10009       if ((vers_data & VERSYM_HIDDEN) || vers_data > 1)
10010         {
10011           if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)]
10012               && (is_nobits || ! check_def))
10013             {
10014               Elf_External_Verneed evn;
10015               Elf_Internal_Verneed ivn;
10016               Elf_Internal_Vernaux ivna;
10017
10018               /* We must test both.  */
10019               offset = offset_from_vma
10020                 (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10021                  sizeof evn);
10022
10023               do
10024                 {
10025                   unsigned long vna_off;
10026
10027                   if (get_data (&evn, file, offset, sizeof (evn), 1,
10028                                 _("version need")) == NULL)
10029                     {
10030                       ivna.vna_next = 0;
10031                       ivna.vna_other = 0;
10032                       ivna.vna_name = 0;
10033                       break;
10034                     }
10035
10036                   ivn.vn_aux  = BYTE_GET (evn.vn_aux);
10037                   ivn.vn_next = BYTE_GET (evn.vn_next);
10038
10039                   vna_off = offset + ivn.vn_aux;
10040
10041                   do
10042                     {
10043                       Elf_External_Vernaux evna;
10044
10045                       if (get_data (&evna, file, vna_off,
10046                                     sizeof (evna), 1,
10047                                     _("version need aux (3)")) == NULL)
10048                         {
10049                           ivna.vna_next = 0;
10050                           ivna.vna_other = 0;
10051                           ivna.vna_name = 0;
10052                         }
10053                       else
10054                         {
10055                           ivna.vna_other = BYTE_GET (evna.vna_other);
10056                           ivna.vna_next  = BYTE_GET (evna.vna_next);
10057                           ivna.vna_name  = BYTE_GET (evna.vna_name);
10058                         }
10059
10060                       vna_off += ivna.vna_next;
10061                     }
10062                   while (ivna.vna_other != vers_data
10063                          && ivna.vna_next != 0);
10064
10065                   if (ivna.vna_other == vers_data)
10066                     break;
10067
10068                   offset += ivn.vn_next;
10069                 }
10070               while (ivn.vn_next != 0);
10071
10072               if (ivna.vna_other == vers_data)
10073                 {
10074                   *sym_info = symbol_undefined;
10075                   *vna_other = ivna.vna_other;
10076                   version_string = (ivna.vna_name < strtab_size
10077                                     ? strtab + ivna.vna_name
10078                                     : _("<corrupt>"));
10079                   check_def = 0;
10080                 }
10081               else if (! is_nobits)
10082                 error (_("bad dynamic symbol\n"));
10083               else
10084                 check_def = 1;
10085             }
10086
10087           if (check_def)
10088             {
10089               if (vers_data != 0x8001
10090                   && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10091                 {
10092                   Elf_Internal_Verdef ivd;
10093                   Elf_Internal_Verdaux ivda;
10094                   Elf_External_Verdaux evda;
10095                   unsigned long off;
10096
10097                   off = offset_from_vma
10098                     (file,
10099                      version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10100                      sizeof (Elf_External_Verdef));
10101
10102                   do
10103                     {
10104                       Elf_External_Verdef evd;
10105
10106                       if (get_data (&evd, file, off, sizeof (evd),
10107                                     1, _("version def")) == NULL)
10108                         {
10109                           ivd.vd_ndx = 0;
10110                           ivd.vd_aux = 0;
10111                           ivd.vd_next = 0;
10112                         }
10113                       else
10114                         {
10115                           ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
10116                           ivd.vd_aux = BYTE_GET (evd.vd_aux);
10117                           ivd.vd_next = BYTE_GET (evd.vd_next);
10118                         }
10119
10120                       off += ivd.vd_next;
10121                     }
10122                   while (ivd.vd_ndx != (vers_data & VERSYM_VERSION)
10123                          && ivd.vd_next != 0);
10124
10125                   off -= ivd.vd_next;
10126                   off += ivd.vd_aux;
10127
10128                   if (get_data (&evda, file, off, sizeof (evda),
10129                                 1, _("version def aux")) == NULL)
10130                     return version_string;
10131
10132                   ivda.vda_name = BYTE_GET (evda.vda_name);
10133
10134                   if (psym->st_name != ivda.vda_name)
10135                     {
10136                       *sym_info = ((vers_data & VERSYM_HIDDEN) != 0
10137                                    ? symbol_hidden : symbol_public);
10138                       version_string = (ivda.vda_name < strtab_size
10139                                         ? strtab + ivda.vda_name
10140                                         : _("<corrupt>"));
10141                     }
10142                 }
10143             }
10144         }
10145     }
10146   return version_string;
10147 }
10148
10149 /* Dump the symbol table.  */
10150 static int
10151 process_symbol_table (FILE * file)
10152 {
10153   Elf_Internal_Shdr * section;
10154   bfd_size_type nbuckets = 0;
10155   bfd_size_type nchains = 0;
10156   bfd_vma * buckets = NULL;
10157   bfd_vma * chains = NULL;
10158   bfd_vma ngnubuckets = 0;
10159   bfd_vma * gnubuckets = NULL;
10160   bfd_vma * gnuchains = NULL;
10161   bfd_vma gnusymidx = 0;
10162   bfd_size_type ngnuchains = 0;
10163
10164   if (!do_syms && !do_dyn_syms && !do_histogram)
10165     return 1;
10166
10167   if (dynamic_info[DT_HASH]
10168       && (do_histogram
10169           || (do_using_dynamic
10170               && !do_dyn_syms
10171               && dynamic_strings != NULL)))
10172     {
10173       unsigned char nb[8];
10174       unsigned char nc[8];
10175       unsigned int hash_ent_size = 4;
10176
10177       if ((elf_header.e_machine == EM_ALPHA
10178            || elf_header.e_machine == EM_S390
10179            || elf_header.e_machine == EM_S390_OLD)
10180           && elf_header.e_ident[EI_CLASS] == ELFCLASS64)
10181         hash_ent_size = 8;
10182
10183       if (fseek (file,
10184                  (archive_file_offset
10185                   + offset_from_vma (file, dynamic_info[DT_HASH],
10186                                      sizeof nb + sizeof nc)),
10187                  SEEK_SET))
10188         {
10189           error (_("Unable to seek to start of dynamic information\n"));
10190           goto no_hash;
10191         }
10192
10193       if (fread (nb, hash_ent_size, 1, file) != 1)
10194         {
10195           error (_("Failed to read in number of buckets\n"));
10196           goto no_hash;
10197         }
10198
10199       if (fread (nc, hash_ent_size, 1, file) != 1)
10200         {
10201           error (_("Failed to read in number of chains\n"));
10202           goto no_hash;
10203         }
10204
10205       nbuckets = byte_get (nb, hash_ent_size);
10206       nchains  = byte_get (nc, hash_ent_size);
10207
10208       buckets = get_dynamic_data (file, nbuckets, hash_ent_size);
10209       chains  = get_dynamic_data (file, nchains, hash_ent_size);
10210
10211     no_hash:
10212       if (buckets == NULL || chains == NULL)
10213         {
10214           if (do_using_dynamic)
10215             return 0;
10216           free (buckets);
10217           free (chains);
10218           buckets = NULL;
10219           chains = NULL;
10220           nbuckets = 0;
10221           nchains = 0;
10222         }
10223     }
10224
10225   if (dynamic_info_DT_GNU_HASH
10226       && (do_histogram
10227           || (do_using_dynamic
10228               && !do_dyn_syms
10229               && dynamic_strings != NULL)))
10230     {
10231       unsigned char nb[16];
10232       bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
10233       bfd_vma buckets_vma;
10234
10235       if (fseek (file,
10236                  (archive_file_offset
10237                   + offset_from_vma (file, dynamic_info_DT_GNU_HASH,
10238                                      sizeof nb)),
10239                  SEEK_SET))
10240         {
10241           error (_("Unable to seek to start of dynamic information\n"));
10242           goto no_gnu_hash;
10243         }
10244
10245       if (fread (nb, 16, 1, file) != 1)
10246         {
10247           error (_("Failed to read in number of buckets\n"));
10248           goto no_gnu_hash;
10249         }
10250
10251       ngnubuckets = byte_get (nb, 4);
10252       gnusymidx = byte_get (nb + 4, 4);
10253       bitmaskwords = byte_get (nb + 8, 4);
10254       buckets_vma = dynamic_info_DT_GNU_HASH + 16;
10255       if (is_32bit_elf)
10256         buckets_vma += bitmaskwords * 4;
10257       else
10258         buckets_vma += bitmaskwords * 8;
10259
10260       if (fseek (file,
10261                  (archive_file_offset
10262                   + offset_from_vma (file, buckets_vma, 4)),
10263                  SEEK_SET))
10264         {
10265           error (_("Unable to seek to start of dynamic information\n"));
10266           goto no_gnu_hash;
10267         }
10268
10269       gnubuckets = get_dynamic_data (file, ngnubuckets, 4);
10270
10271       if (gnubuckets == NULL)
10272         goto no_gnu_hash;
10273
10274       for (i = 0; i < ngnubuckets; i++)
10275         if (gnubuckets[i] != 0)
10276           {
10277             if (gnubuckets[i] < gnusymidx)
10278               return 0;
10279
10280             if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
10281               maxchain = gnubuckets[i];
10282           }
10283
10284       if (maxchain == 0xffffffff)
10285         goto no_gnu_hash;
10286
10287       maxchain -= gnusymidx;
10288
10289       if (fseek (file,
10290                  (archive_file_offset
10291                   + offset_from_vma (file, buckets_vma
10292                                            + 4 * (ngnubuckets + maxchain), 4)),
10293                  SEEK_SET))
10294         {
10295           error (_("Unable to seek to start of dynamic information\n"));
10296           goto no_gnu_hash;
10297         }
10298
10299       do
10300         {
10301           if (fread (nb, 4, 1, file) != 1)
10302             {
10303               error (_("Failed to determine last chain length\n"));
10304               goto no_gnu_hash;
10305             }
10306
10307           if (maxchain + 1 == 0)
10308             goto no_gnu_hash;
10309
10310           ++maxchain;
10311         }
10312       while ((byte_get (nb, 4) & 1) == 0);
10313
10314       if (fseek (file,
10315                  (archive_file_offset
10316                   + offset_from_vma (file, buckets_vma + 4 * ngnubuckets, 4)),
10317                  SEEK_SET))
10318         {
10319           error (_("Unable to seek to start of dynamic information\n"));
10320           goto no_gnu_hash;
10321         }
10322
10323       gnuchains = get_dynamic_data (file, maxchain, 4);
10324       ngnuchains = maxchain;
10325
10326     no_gnu_hash:
10327       if (gnuchains == NULL)
10328         {
10329           free (gnubuckets);
10330           gnubuckets = NULL;
10331           ngnubuckets = 0;
10332           if (do_using_dynamic)
10333             return 0;
10334         }
10335     }
10336
10337   if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
10338       && do_syms
10339       && do_using_dynamic
10340       && dynamic_strings != NULL
10341       && dynamic_symbols != NULL)
10342     {
10343       unsigned long hn;
10344
10345       if (dynamic_info[DT_HASH])
10346         {
10347           bfd_vma si;
10348
10349           printf (_("\nSymbol table for image:\n"));
10350           if (is_32bit_elf)
10351             printf (_("  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"));
10352           else
10353             printf (_("  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"));
10354
10355           for (hn = 0; hn < nbuckets; hn++)
10356             {
10357               if (! buckets[hn])
10358                 continue;
10359
10360               for (si = buckets[hn]; si < nchains && si > 0; si = chains[si])
10361                 print_dynamic_symbol (si, hn);
10362             }
10363         }
10364
10365       if (dynamic_info_DT_GNU_HASH)
10366         {
10367           printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
10368           if (is_32bit_elf)
10369             printf (_("  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"));
10370           else
10371             printf (_("  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"));
10372
10373           for (hn = 0; hn < ngnubuckets; ++hn)
10374             if (gnubuckets[hn] != 0)
10375               {
10376                 bfd_vma si = gnubuckets[hn];
10377                 bfd_vma off = si - gnusymidx;
10378
10379                 do
10380                   {
10381                     print_dynamic_symbol (si, hn);
10382                     si++;
10383                   }
10384                 while (off < ngnuchains && (gnuchains[off++] & 1) == 0);
10385               }
10386         }
10387     }
10388   else if ((do_dyn_syms || (do_syms && !do_using_dynamic))
10389            && section_headers != NULL)
10390     {
10391       unsigned int i;
10392
10393       for (i = 0, section = section_headers;
10394            i < elf_header.e_shnum;
10395            i++, section++)
10396         {
10397           unsigned int si;
10398           char * strtab = NULL;
10399           unsigned long int strtab_size = 0;
10400           Elf_Internal_Sym * symtab;
10401           Elf_Internal_Sym * psym;
10402           unsigned long num_syms;
10403
10404           if ((section->sh_type != SHT_SYMTAB
10405                && section->sh_type != SHT_DYNSYM)
10406               || (!do_syms
10407                   && section->sh_type == SHT_SYMTAB))
10408             continue;
10409
10410           if (section->sh_entsize == 0)
10411             {
10412               printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
10413                       printable_section_name (section));
10414               continue;
10415             }
10416
10417           printf (_("\nSymbol table '%s' contains %lu entries:\n"),
10418                   printable_section_name (section),
10419                   (unsigned long) (section->sh_size / section->sh_entsize));
10420
10421           if (is_32bit_elf)
10422             printf (_("   Num:    Value  Size Type    Bind   Vis      Ndx Name\n"));
10423           else
10424             printf (_("   Num:    Value          Size Type    Bind   Vis      Ndx Name\n"));
10425
10426           symtab = GET_ELF_SYMBOLS (file, section, & num_syms);
10427           if (symtab == NULL)
10428             continue;
10429
10430           if (section->sh_link == elf_header.e_shstrndx)
10431             {
10432               strtab = string_table;
10433               strtab_size = string_table_length;
10434             }
10435           else if (section->sh_link < elf_header.e_shnum)
10436             {
10437               Elf_Internal_Shdr * string_sec;
10438
10439               string_sec = section_headers + section->sh_link;
10440
10441               strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
10442                                           1, string_sec->sh_size,
10443                                           _("string table"));
10444               strtab_size = strtab != NULL ? string_sec->sh_size : 0;
10445             }
10446
10447           for (si = 0, psym = symtab; si < num_syms; si++, psym++)
10448             {
10449               const char *version_string;
10450               enum versioned_symbol_info sym_info;
10451               unsigned short vna_other;
10452
10453               printf ("%6d: ", si);
10454               print_vma (psym->st_value, LONG_HEX);
10455               putchar (' ');
10456               print_vma (psym->st_size, DEC_5);
10457               printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
10458               printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
10459               printf (" %-7s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
10460               /* Check to see if any other bits in the st_other field are set.
10461                  Note - displaying this information disrupts the layout of the
10462                  table being generated, but for the moment this case is very rare.  */
10463               if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
10464                 printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
10465               printf (" %4s ", get_symbol_index_type (psym->st_shndx));
10466               print_symbol (25, psym->st_name < strtab_size
10467                             ? strtab + psym->st_name : _("<corrupt>"));
10468
10469               version_string
10470                 = get_symbol_version_string (file,
10471                                              section->sh_type == SHT_DYNSYM,
10472                                              strtab, strtab_size, si,
10473                                              psym, &sym_info, &vna_other);
10474               if (version_string)
10475                 {
10476                   if (sym_info == symbol_undefined)
10477                     printf ("@%s (%d)", version_string, vna_other);
10478                   else
10479                     printf (sym_info == symbol_hidden ? "@%s" : "@@%s",
10480                             version_string);
10481                 }
10482
10483               putchar ('\n');
10484             }
10485
10486           free (symtab);
10487           if (strtab != string_table)
10488             free (strtab);
10489         }
10490     }
10491   else if (do_syms)
10492     printf
10493       (_("\nDynamic symbol information is not available for displaying symbols.\n"));
10494
10495   if (do_histogram && buckets != NULL)
10496     {
10497       unsigned long * lengths;
10498       unsigned long * counts;
10499       unsigned long hn;
10500       bfd_vma si;
10501       unsigned long maxlength = 0;
10502       unsigned long nzero_counts = 0;
10503       unsigned long nsyms = 0;
10504
10505       printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
10506               (unsigned long) nbuckets);
10507
10508       lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
10509       if (lengths == NULL)
10510         {
10511           error (_("Out of memory allocating space for histogram buckets\n"));
10512           return 0;
10513         }
10514
10515       printf (_(" Length  Number     %% of total  Coverage\n"));
10516       for (hn = 0; hn < nbuckets; ++hn)
10517         {
10518           for (si = buckets[hn]; si > 0 && si < nchains; si = chains[si])
10519             {
10520               ++nsyms;
10521               if (maxlength < ++lengths[hn])
10522                 ++maxlength;
10523
10524               /* PR binutils/17531: A corrupt binary could contain broken
10525                  histogram data.  Do not go into an infinite loop trying
10526                  to process it.  */
10527               if (chains[si] == si)
10528                 {
10529                   error (_("histogram chain links to itself\n"));
10530                   break;
10531                 }
10532             }
10533         }
10534
10535       counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
10536       if (counts == NULL)
10537         {
10538           free (lengths);
10539           error (_("Out of memory allocating space for histogram counts\n"));
10540           return 0;
10541         }
10542
10543       for (hn = 0; hn < nbuckets; ++hn)
10544         ++counts[lengths[hn]];
10545
10546       if (nbuckets > 0)
10547         {
10548           unsigned long i;
10549           printf ("      0  %-10lu (%5.1f%%)\n",
10550                   counts[0], (counts[0] * 100.0) / nbuckets);
10551           for (i = 1; i <= maxlength; ++i)
10552             {
10553               nzero_counts += counts[i] * i;
10554               printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
10555                       i, counts[i], (counts[i] * 100.0) / nbuckets,
10556                       (nzero_counts * 100.0) / nsyms);
10557             }
10558         }
10559
10560       free (counts);
10561       free (lengths);
10562     }
10563
10564   if (buckets != NULL)
10565     {
10566       free (buckets);
10567       free (chains);
10568     }
10569
10570   if (do_histogram && gnubuckets != NULL)
10571     {
10572       unsigned long * lengths;
10573       unsigned long * counts;
10574       unsigned long hn;
10575       unsigned long maxlength = 0;
10576       unsigned long nzero_counts = 0;
10577       unsigned long nsyms = 0;
10578
10579       printf (_("\nHistogram for `.gnu.hash' bucket list length (total of %lu buckets):\n"),
10580               (unsigned long) ngnubuckets);
10581
10582       lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
10583       if (lengths == NULL)
10584         {
10585           error (_("Out of memory allocating space for gnu histogram buckets\n"));
10586           return 0;
10587         }
10588
10589       printf (_(" Length  Number     %% of total  Coverage\n"));
10590
10591       for (hn = 0; hn < ngnubuckets; ++hn)
10592         if (gnubuckets[hn] != 0)
10593           {
10594             bfd_vma off, length = 1;
10595
10596             for (off = gnubuckets[hn] - gnusymidx;
10597                  /* PR 17531 file: 010-77222-0.004.  */
10598                  off < ngnuchains && (gnuchains[off] & 1) == 0;
10599                  ++off)
10600               ++length;
10601             lengths[hn] = length;
10602             if (length > maxlength)
10603               maxlength = length;
10604             nsyms += length;
10605           }
10606
10607       counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
10608       if (counts == NULL)
10609         {
10610           free (lengths);
10611           error (_("Out of memory allocating space for gnu histogram counts\n"));
10612           return 0;
10613         }
10614
10615       for (hn = 0; hn < ngnubuckets; ++hn)
10616         ++counts[lengths[hn]];
10617
10618       if (ngnubuckets > 0)
10619         {
10620           unsigned long j;
10621           printf ("      0  %-10lu (%5.1f%%)\n",
10622                   counts[0], (counts[0] * 100.0) / ngnubuckets);
10623           for (j = 1; j <= maxlength; ++j)
10624             {
10625               nzero_counts += counts[j] * j;
10626               printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
10627                       j, counts[j], (counts[j] * 100.0) / ngnubuckets,
10628                       (nzero_counts * 100.0) / nsyms);
10629             }
10630         }
10631
10632       free (counts);
10633       free (lengths);
10634       free (gnubuckets);
10635       free (gnuchains);
10636     }
10637
10638   return 1;
10639 }
10640
10641 static int
10642 process_syminfo (FILE * file ATTRIBUTE_UNUSED)
10643 {
10644   unsigned int i;
10645
10646   if (dynamic_syminfo == NULL
10647       || !do_dynamic)
10648     /* No syminfo, this is ok.  */
10649     return 1;
10650
10651   /* There better should be a dynamic symbol section.  */
10652   if (dynamic_symbols == NULL || dynamic_strings == NULL)
10653     return 0;
10654
10655   if (dynamic_addr)
10656     printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
10657             dynamic_syminfo_offset, dynamic_syminfo_nent);
10658
10659   printf (_(" Num: Name                           BoundTo     Flags\n"));
10660   for (i = 0; i < dynamic_syminfo_nent; ++i)
10661     {
10662       unsigned short int flags = dynamic_syminfo[i].si_flags;
10663
10664       printf ("%4d: ", i);
10665       if (i >= num_dynamic_syms)
10666         printf (_("<corrupt index>"));
10667       else if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
10668         print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
10669       else
10670         printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
10671       putchar (' ');
10672
10673       switch (dynamic_syminfo[i].si_boundto)
10674         {
10675         case SYMINFO_BT_SELF:
10676           fputs ("SELF       ", stdout);
10677           break;
10678         case SYMINFO_BT_PARENT:
10679           fputs ("PARENT     ", stdout);
10680           break;
10681         default:
10682           if (dynamic_syminfo[i].si_boundto > 0
10683               && dynamic_syminfo[i].si_boundto < dynamic_nent
10684               && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
10685             {
10686               print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
10687               putchar (' ' );
10688             }
10689           else
10690             printf ("%-10d ", dynamic_syminfo[i].si_boundto);
10691           break;
10692         }
10693
10694       if (flags & SYMINFO_FLG_DIRECT)
10695         printf (" DIRECT");
10696       if (flags & SYMINFO_FLG_PASSTHRU)
10697         printf (" PASSTHRU");
10698       if (flags & SYMINFO_FLG_COPY)
10699         printf (" COPY");
10700       if (flags & SYMINFO_FLG_LAZYLOAD)
10701         printf (" LAZYLOAD");
10702
10703       puts ("");
10704     }
10705
10706   return 1;
10707 }
10708
10709 /* Check to see if the given reloc needs to be handled in a target specific
10710    manner.  If so then process the reloc and return TRUE otherwise return
10711    FALSE.  */
10712
10713 static bfd_boolean
10714 target_specific_reloc_handling (Elf_Internal_Rela * reloc,
10715                                 unsigned char *     start,
10716                                 Elf_Internal_Sym *  symtab)
10717 {
10718   unsigned int reloc_type = get_reloc_type (reloc->r_info);
10719
10720   switch (elf_header.e_machine)
10721     {
10722     case EM_MSP430:
10723     case EM_MSP430_OLD:
10724       {
10725         static Elf_Internal_Sym * saved_sym = NULL;
10726
10727         switch (reloc_type)
10728           {
10729           case 10: /* R_MSP430_SYM_DIFF */
10730             if (uses_msp430x_relocs ())
10731               break;
10732           case 21: /* R_MSP430X_SYM_DIFF */
10733             saved_sym = symtab + get_reloc_symindex (reloc->r_info);
10734             return TRUE;
10735
10736           case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
10737           case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
10738             goto handle_sym_diff;
10739
10740           case 5: /* R_MSP430_16_BYTE */
10741           case 9: /* R_MSP430_8 */
10742             if (uses_msp430x_relocs ())
10743               break;
10744             goto handle_sym_diff;
10745
10746           case 2: /* R_MSP430_ABS16 */
10747           case 15: /* R_MSP430X_ABS16 */
10748             if (! uses_msp430x_relocs ())
10749               break;
10750             goto handle_sym_diff;
10751
10752           handle_sym_diff:
10753             if (saved_sym != NULL)
10754               {
10755                 bfd_vma value;
10756
10757                 value = reloc->r_addend
10758                   + (symtab[get_reloc_symindex (reloc->r_info)].st_value
10759                      - saved_sym->st_value);
10760
10761                 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
10762
10763                 saved_sym = NULL;
10764                 return TRUE;
10765               }
10766             break;
10767
10768           default:
10769             if (saved_sym != NULL)
10770               error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc\n"));
10771             break;
10772           }
10773         break;
10774       }
10775
10776     case EM_MN10300:
10777     case EM_CYGNUS_MN10300:
10778       {
10779         static Elf_Internal_Sym * saved_sym = NULL;
10780
10781         switch (reloc_type)
10782           {
10783           case 34: /* R_MN10300_ALIGN */
10784             return TRUE;
10785           case 33: /* R_MN10300_SYM_DIFF */
10786             saved_sym = symtab + get_reloc_symindex (reloc->r_info);
10787             return TRUE;
10788           case 1: /* R_MN10300_32 */
10789           case 2: /* R_MN10300_16 */
10790             if (saved_sym != NULL)
10791               {
10792                 bfd_vma value;
10793
10794                 value = reloc->r_addend
10795                   + (symtab[get_reloc_symindex (reloc->r_info)].st_value
10796                      - saved_sym->st_value);
10797
10798                 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
10799
10800                 saved_sym = NULL;
10801                 return TRUE;
10802               }
10803             break;
10804           default:
10805             if (saved_sym != NULL)
10806               error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc\n"));
10807             break;
10808           }
10809         break;
10810       }
10811     }
10812
10813   return FALSE;
10814 }
10815
10816 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
10817    DWARF debug sections.  This is a target specific test.  Note - we do not
10818    go through the whole including-target-headers-multiple-times route, (as
10819    we have already done with <elf/h8.h>) because this would become very
10820    messy and even then this function would have to contain target specific
10821    information (the names of the relocs instead of their numeric values).
10822    FIXME: This is not the correct way to solve this problem.  The proper way
10823    is to have target specific reloc sizing and typing functions created by
10824    the reloc-macros.h header, in the same way that it already creates the
10825    reloc naming functions.  */
10826
10827 static bfd_boolean
10828 is_32bit_abs_reloc (unsigned int reloc_type)
10829 {
10830   switch (elf_header.e_machine)
10831     {
10832     case EM_386:
10833     case EM_486:
10834       return reloc_type == 1; /* R_386_32.  */
10835     case EM_68K:
10836       return reloc_type == 1; /* R_68K_32.  */
10837     case EM_860:
10838       return reloc_type == 1; /* R_860_32.  */
10839     case EM_960:
10840       return reloc_type == 2; /* R_960_32.  */
10841     case EM_AARCH64:
10842       return reloc_type == 258; /* R_AARCH64_ABS32 */
10843     case EM_ALPHA:
10844       return reloc_type == 1; /* R_ALPHA_REFLONG.  */
10845     case EM_ARC:
10846       return reloc_type == 1; /* R_ARC_32.  */
10847     case EM_ARM:
10848       return reloc_type == 2; /* R_ARM_ABS32 */
10849     case EM_AVR_OLD:
10850     case EM_AVR:
10851       return reloc_type == 1;
10852     case EM_ADAPTEVA_EPIPHANY:
10853       return reloc_type == 3;
10854     case EM_BLACKFIN:
10855       return reloc_type == 0x12; /* R_byte4_data.  */
10856     case EM_CRIS:
10857       return reloc_type == 3; /* R_CRIS_32.  */
10858     case EM_CR16:
10859       return reloc_type == 3; /* R_CR16_NUM32.  */
10860     case EM_CRX:
10861       return reloc_type == 15; /* R_CRX_NUM32.  */
10862     case EM_CYGNUS_FRV:
10863       return reloc_type == 1;
10864     case EM_CYGNUS_D10V:
10865     case EM_D10V:
10866       return reloc_type == 6; /* R_D10V_32.  */
10867     case EM_CYGNUS_D30V:
10868     case EM_D30V:
10869       return reloc_type == 12; /* R_D30V_32_NORMAL.  */
10870     case EM_DLX:
10871       return reloc_type == 3; /* R_DLX_RELOC_32.  */
10872     case EM_CYGNUS_FR30:
10873     case EM_FR30:
10874       return reloc_type == 3; /* R_FR30_32.  */
10875     case EM_H8S:
10876     case EM_H8_300:
10877     case EM_H8_300H:
10878       return reloc_type == 1; /* R_H8_DIR32.  */
10879     case EM_IA_64:
10880       return reloc_type == 0x65; /* R_IA64_SECREL32LSB.  */
10881     case EM_IP2K_OLD:
10882     case EM_IP2K:
10883       return reloc_type == 2; /* R_IP2K_32.  */
10884     case EM_IQ2000:
10885       return reloc_type == 2; /* R_IQ2000_32.  */
10886     case EM_LATTICEMICO32:
10887       return reloc_type == 3; /* R_LM32_32.  */
10888     case EM_M32C_OLD:
10889     case EM_M32C:
10890       return reloc_type == 3; /* R_M32C_32.  */
10891     case EM_M32R:
10892       return reloc_type == 34; /* R_M32R_32_RELA.  */
10893     case EM_MCORE:
10894       return reloc_type == 1; /* R_MCORE_ADDR32.  */
10895     case EM_CYGNUS_MEP:
10896       return reloc_type == 4; /* R_MEP_32.  */
10897     case EM_METAG:
10898       return reloc_type == 2; /* R_METAG_ADDR32.  */
10899     case EM_MICROBLAZE:
10900       return reloc_type == 1; /* R_MICROBLAZE_32.  */
10901     case EM_MIPS:
10902       return reloc_type == 2; /* R_MIPS_32.  */
10903     case EM_MMIX:
10904       return reloc_type == 4; /* R_MMIX_32.  */
10905     case EM_CYGNUS_MN10200:
10906     case EM_MN10200:
10907       return reloc_type == 1; /* R_MN10200_32.  */
10908     case EM_CYGNUS_MN10300:
10909     case EM_MN10300:
10910       return reloc_type == 1; /* R_MN10300_32.  */
10911     case EM_MOXIE:
10912       return reloc_type == 1; /* R_MOXIE_32.  */
10913     case EM_MSP430_OLD:
10914     case EM_MSP430:
10915       return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32.  */
10916     case EM_MT:
10917       return reloc_type == 2; /* R_MT_32.  */
10918     case EM_NDS32:
10919       return reloc_type == 20; /* R_NDS32_RELA.  */
10920     case EM_ALTERA_NIOS2:
10921       return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32.  */
10922     case EM_NIOS32:
10923       return reloc_type == 1; /* R_NIOS_32.  */
10924     case EM_OR1K:
10925       return reloc_type == 1; /* R_OR1K_32.  */
10926     case EM_PARISC:
10927       return (reloc_type == 1 /* R_PARISC_DIR32.  */
10928               || reloc_type == 41); /* R_PARISC_SECREL32.  */
10929     case EM_PJ:
10930     case EM_PJ_OLD:
10931       return reloc_type == 1; /* R_PJ_DATA_DIR32.  */
10932     case EM_PPC64:
10933       return reloc_type == 1; /* R_PPC64_ADDR32.  */
10934     case EM_PPC:
10935       return reloc_type == 1; /* R_PPC_ADDR32.  */
10936     case EM_RL78:
10937       return reloc_type == 1; /* R_RL78_DIR32.  */
10938     case EM_RX:
10939       return reloc_type == 1; /* R_RX_DIR32.  */
10940     case EM_S370:
10941       return reloc_type == 1; /* R_I370_ADDR31.  */
10942     case EM_S390_OLD:
10943     case EM_S390:
10944       return reloc_type == 4; /* R_S390_32.  */
10945     case EM_SCORE:
10946       return reloc_type == 8; /* R_SCORE_ABS32.  */
10947     case EM_SH:
10948       return reloc_type == 1; /* R_SH_DIR32.  */
10949     case EM_SPARC32PLUS:
10950     case EM_SPARCV9:
10951     case EM_SPARC:
10952       return reloc_type == 3 /* R_SPARC_32.  */
10953         || reloc_type == 23; /* R_SPARC_UA32.  */
10954     case EM_SPU:
10955       return reloc_type == 6; /* R_SPU_ADDR32 */
10956     case EM_TI_C6000:
10957       return reloc_type == 1; /* R_C6000_ABS32.  */
10958     case EM_TILEGX:
10959       return reloc_type == 2; /* R_TILEGX_32.  */
10960     case EM_TILEPRO:
10961       return reloc_type == 1; /* R_TILEPRO_32.  */
10962     case EM_CYGNUS_V850:
10963     case EM_V850:
10964       return reloc_type == 6; /* R_V850_ABS32.  */
10965     case EM_V800:
10966       return reloc_type == 0x33; /* R_V810_WORD.  */
10967     case EM_VAX:
10968       return reloc_type == 1; /* R_VAX_32.  */
10969     case EM_X86_64:
10970     case EM_L1OM:
10971     case EM_K1OM:
10972       return reloc_type == 10; /* R_X86_64_32.  */
10973     case EM_XC16X:
10974     case EM_C166:
10975       return reloc_type == 3; /* R_XC16C_ABS_32.  */
10976     case EM_XGATE:
10977       return reloc_type == 4; /* R_XGATE_32.  */
10978     case EM_XSTORMY16:
10979       return reloc_type == 1; /* R_XSTROMY16_32.  */
10980     case EM_XTENSA_OLD:
10981     case EM_XTENSA:
10982       return reloc_type == 1; /* R_XTENSA_32.  */
10983     default:
10984       error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
10985              elf_header.e_machine);
10986       abort ();
10987     }
10988 }
10989
10990 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
10991    a 32-bit pc-relative RELA relocation used in DWARF debug sections.  */
10992
10993 static bfd_boolean
10994 is_32bit_pcrel_reloc (unsigned int reloc_type)
10995 {
10996   switch (elf_header.e_machine)
10997     {
10998     case EM_386:
10999     case EM_486:
11000       return reloc_type == 2;  /* R_386_PC32.  */
11001     case EM_68K:
11002       return reloc_type == 4;  /* R_68K_PC32.  */
11003     case EM_AARCH64:
11004       return reloc_type == 261; /* R_AARCH64_PREL32 */
11005     case EM_ADAPTEVA_EPIPHANY:
11006       return reloc_type == 6;
11007     case EM_ALPHA:
11008       return reloc_type == 10; /* R_ALPHA_SREL32.  */
11009     case EM_ARM:
11010       return reloc_type == 3;  /* R_ARM_REL32 */
11011     case EM_MICROBLAZE:
11012       return reloc_type == 2;  /* R_MICROBLAZE_32_PCREL.  */
11013     case EM_OR1K:
11014       return reloc_type == 9; /* R_OR1K_32_PCREL.  */
11015     case EM_PARISC:
11016       return reloc_type == 9;  /* R_PARISC_PCREL32.  */
11017     case EM_PPC:
11018       return reloc_type == 26; /* R_PPC_REL32.  */
11019     case EM_PPC64:
11020       return reloc_type == 26; /* R_PPC64_REL32.  */
11021     case EM_S390_OLD:
11022     case EM_S390:
11023       return reloc_type == 5;  /* R_390_PC32.  */
11024     case EM_SH:
11025       return reloc_type == 2;  /* R_SH_REL32.  */
11026     case EM_SPARC32PLUS:
11027     case EM_SPARCV9:
11028     case EM_SPARC:
11029       return reloc_type == 6;  /* R_SPARC_DISP32.  */
11030     case EM_SPU:
11031       return reloc_type == 13; /* R_SPU_REL32.  */
11032     case EM_TILEGX:
11033       return reloc_type == 6; /* R_TILEGX_32_PCREL.  */
11034     case EM_TILEPRO:
11035       return reloc_type == 4; /* R_TILEPRO_32_PCREL.  */
11036     case EM_X86_64:
11037     case EM_L1OM:
11038     case EM_K1OM:
11039       return reloc_type == 2;  /* R_X86_64_PC32.  */
11040     case EM_XTENSA_OLD:
11041     case EM_XTENSA:
11042       return reloc_type == 14; /* R_XTENSA_32_PCREL.  */
11043     default:
11044       /* Do not abort or issue an error message here.  Not all targets use
11045          pc-relative 32-bit relocs in their DWARF debug information and we
11046          have already tested for target coverage in is_32bit_abs_reloc.  A
11047          more helpful warning message will be generated by apply_relocations
11048          anyway, so just return.  */
11049       return FALSE;
11050     }
11051 }
11052
11053 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11054    a 64-bit absolute RELA relocation used in DWARF debug sections.  */
11055
11056 static bfd_boolean
11057 is_64bit_abs_reloc (unsigned int reloc_type)
11058 {
11059   switch (elf_header.e_machine)
11060     {
11061     case EM_AARCH64:
11062       return reloc_type == 257; /* R_AARCH64_ABS64.  */
11063     case EM_ALPHA:
11064       return reloc_type == 2; /* R_ALPHA_REFQUAD.  */
11065     case EM_IA_64:
11066       return reloc_type == 0x27; /* R_IA64_DIR64LSB.  */
11067     case EM_PARISC:
11068       return reloc_type == 80; /* R_PARISC_DIR64.  */
11069     case EM_PPC64:
11070       return reloc_type == 38; /* R_PPC64_ADDR64.  */
11071     case EM_SPARC32PLUS:
11072     case EM_SPARCV9:
11073     case EM_SPARC:
11074       return reloc_type == 54; /* R_SPARC_UA64.  */
11075     case EM_X86_64:
11076     case EM_L1OM:
11077     case EM_K1OM:
11078       return reloc_type == 1; /* R_X86_64_64.  */
11079     case EM_S390_OLD:
11080     case EM_S390:
11081       return reloc_type == 22;  /* R_S390_64.  */
11082     case EM_TILEGX:
11083       return reloc_type == 1; /* R_TILEGX_64.  */
11084     case EM_MIPS:
11085       return reloc_type == 18;  /* R_MIPS_64.  */
11086     default:
11087       return FALSE;
11088     }
11089 }
11090
11091 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
11092    a 64-bit pc-relative RELA relocation used in DWARF debug sections.  */
11093
11094 static bfd_boolean
11095 is_64bit_pcrel_reloc (unsigned int reloc_type)
11096 {
11097   switch (elf_header.e_machine)
11098     {
11099     case EM_AARCH64:
11100       return reloc_type == 260; /* R_AARCH64_PREL64.  */
11101     case EM_ALPHA:
11102       return reloc_type == 11; /* R_ALPHA_SREL64.  */
11103     case EM_IA_64:
11104       return reloc_type == 0x4f; /* R_IA64_PCREL64LSB.  */
11105     case EM_PARISC:
11106       return reloc_type == 72; /* R_PARISC_PCREL64.  */
11107     case EM_PPC64:
11108       return reloc_type == 44; /* R_PPC64_REL64.  */
11109     case EM_SPARC32PLUS:
11110     case EM_SPARCV9:
11111     case EM_SPARC:
11112       return reloc_type == 46; /* R_SPARC_DISP64.  */
11113     case EM_X86_64:
11114     case EM_L1OM:
11115     case EM_K1OM:
11116       return reloc_type == 24; /* R_X86_64_PC64.  */
11117     case EM_S390_OLD:
11118     case EM_S390:
11119       return reloc_type == 23;  /* R_S390_PC64.  */
11120     case EM_TILEGX:
11121       return reloc_type == 5;  /* R_TILEGX_64_PCREL.  */
11122     default:
11123       return FALSE;
11124     }
11125 }
11126
11127 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11128    a 24-bit absolute RELA relocation used in DWARF debug sections.  */
11129
11130 static bfd_boolean
11131 is_24bit_abs_reloc (unsigned int reloc_type)
11132 {
11133   switch (elf_header.e_machine)
11134     {
11135     case EM_CYGNUS_MN10200:
11136     case EM_MN10200:
11137       return reloc_type == 4; /* R_MN10200_24.  */
11138     default:
11139       return FALSE;
11140     }
11141 }
11142
11143 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11144    a 16-bit absolute RELA relocation used in DWARF debug sections.  */
11145
11146 static bfd_boolean
11147 is_16bit_abs_reloc (unsigned int reloc_type)
11148 {
11149   switch (elf_header.e_machine)
11150     {
11151     case EM_AVR_OLD:
11152     case EM_AVR:
11153       return reloc_type == 4; /* R_AVR_16.  */
11154     case EM_ADAPTEVA_EPIPHANY:
11155       return reloc_type == 5;
11156     case EM_CYGNUS_D10V:
11157     case EM_D10V:
11158       return reloc_type == 3; /* R_D10V_16.  */
11159     case EM_H8S:
11160     case EM_H8_300:
11161     case EM_H8_300H:
11162       return reloc_type == R_H8_DIR16;
11163     case EM_IP2K_OLD:
11164     case EM_IP2K:
11165       return reloc_type == 1; /* R_IP2K_16.  */
11166     case EM_M32C_OLD:
11167     case EM_M32C:
11168       return reloc_type == 1; /* R_M32C_16 */
11169     case EM_MSP430:
11170       if (uses_msp430x_relocs ())
11171         return reloc_type == 2; /* R_MSP430_ABS16.  */
11172     case EM_MSP430_OLD:
11173       return reloc_type == 5; /* R_MSP430_16_BYTE.  */
11174     case EM_NDS32:
11175       return reloc_type == 19; /* R_NDS32_RELA.  */
11176     case EM_ALTERA_NIOS2:
11177       return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16.  */
11178     case EM_NIOS32:
11179       return reloc_type == 9; /* R_NIOS_16.  */
11180     case EM_OR1K:
11181       return reloc_type == 2; /* R_OR1K_16.  */
11182     case EM_TI_C6000:
11183       return reloc_type == 2; /* R_C6000_ABS16.  */
11184     case EM_XC16X:
11185     case EM_C166:
11186       return reloc_type == 2; /* R_XC16C_ABS_16.  */
11187     case EM_CYGNUS_MN10200:
11188     case EM_MN10200:
11189       return reloc_type == 2; /* R_MN10200_16.  */
11190     case EM_CYGNUS_MN10300:
11191     case EM_MN10300:
11192       return reloc_type == 2; /* R_MN10300_16.  */
11193     case EM_XGATE:
11194       return reloc_type == 3; /* R_XGATE_16.  */
11195     default:
11196       return FALSE;
11197     }
11198 }
11199
11200 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
11201    relocation entries (possibly formerly used for SHT_GROUP sections).  */
11202
11203 static bfd_boolean
11204 is_none_reloc (unsigned int reloc_type)
11205 {
11206   switch (elf_header.e_machine)
11207     {
11208     case EM_68K:     /* R_68K_NONE.  */
11209     case EM_386:     /* R_386_NONE.  */
11210     case EM_SPARC32PLUS:
11211     case EM_SPARCV9:
11212     case EM_SPARC:   /* R_SPARC_NONE.  */
11213     case EM_MIPS:    /* R_MIPS_NONE.  */
11214     case EM_PARISC:  /* R_PARISC_NONE.  */
11215     case EM_ALPHA:   /* R_ALPHA_NONE.  */
11216     case EM_ADAPTEVA_EPIPHANY:
11217     case EM_PPC:     /* R_PPC_NONE.  */
11218     case EM_PPC64:   /* R_PPC64_NONE.  */
11219     case EM_ARM:     /* R_ARM_NONE.  */
11220     case EM_IA_64:   /* R_IA64_NONE.  */
11221     case EM_SH:      /* R_SH_NONE.  */
11222     case EM_S390_OLD:
11223     case EM_S390:    /* R_390_NONE.  */
11224     case EM_CRIS:    /* R_CRIS_NONE.  */
11225     case EM_X86_64:  /* R_X86_64_NONE.  */
11226     case EM_L1OM:    /* R_X86_64_NONE.  */
11227     case EM_K1OM:    /* R_X86_64_NONE.  */
11228     case EM_MN10300: /* R_MN10300_NONE.  */
11229     case EM_MOXIE:   /* R_MOXIE_NONE.  */
11230     case EM_M32R:    /* R_M32R_NONE.  */
11231     case EM_TI_C6000:/* R_C6000_NONE.  */
11232     case EM_TILEGX:  /* R_TILEGX_NONE.  */
11233     case EM_TILEPRO: /* R_TILEPRO_NONE.  */
11234     case EM_XC16X:
11235     case EM_C166:    /* R_XC16X_NONE.  */
11236     case EM_ALTERA_NIOS2: /* R_NIOS2_NONE.  */
11237     case EM_NIOS32:  /* R_NIOS_NONE.  */
11238     case EM_OR1K:    /* R_OR1K_NONE. */
11239       return reloc_type == 0;
11240     case EM_AARCH64:
11241       return reloc_type == 0 || reloc_type == 256;
11242     case EM_NDS32:
11243       return (reloc_type == 0       /* R_XTENSA_NONE.  */
11244               || reloc_type == 204  /* R_NDS32_DIFF8.  */
11245               || reloc_type == 205  /* R_NDS32_DIFF16.  */
11246               || reloc_type == 206  /* R_NDS32_DIFF32.  */
11247               || reloc_type == 207  /* R_NDS32_ULEB128.  */);
11248     case EM_XTENSA_OLD:
11249     case EM_XTENSA:
11250       return (reloc_type == 0      /* R_XTENSA_NONE.  */
11251               || reloc_type == 17  /* R_XTENSA_DIFF8.  */
11252               || reloc_type == 18  /* R_XTENSA_DIFF16.  */
11253               || reloc_type == 19  /* R_XTENSA_DIFF32.  */);
11254     case EM_METAG:
11255       return reloc_type == 3; /* R_METAG_NONE.  */
11256     }
11257   return FALSE;
11258 }
11259
11260 /* Apply relocations to a section.
11261    Note: So far support has been added only for those relocations
11262    which can be found in debug sections.
11263    FIXME: Add support for more relocations ?  */
11264
11265 static void
11266 apply_relocations (void * file,
11267                    Elf_Internal_Shdr * section,
11268                    unsigned char * start)
11269 {
11270   Elf_Internal_Shdr * relsec;
11271   unsigned char * end = start + section->sh_size;
11272
11273   if (elf_header.e_type != ET_REL)
11274     return;
11275
11276   /* Find the reloc section associated with the section.  */
11277   for (relsec = section_headers;
11278        relsec < section_headers + elf_header.e_shnum;
11279        ++relsec)
11280     {
11281       bfd_boolean is_rela;
11282       unsigned long num_relocs;
11283       Elf_Internal_Rela * relocs;
11284       Elf_Internal_Rela * rp;
11285       Elf_Internal_Shdr * symsec;
11286       Elf_Internal_Sym * symtab;
11287       unsigned long num_syms;
11288       Elf_Internal_Sym * sym;
11289
11290       if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
11291           || relsec->sh_info >= elf_header.e_shnum
11292           || section_headers + relsec->sh_info != section
11293           || relsec->sh_size == 0
11294           || relsec->sh_link >= elf_header.e_shnum)
11295         continue;
11296
11297       is_rela = relsec->sh_type == SHT_RELA;
11298
11299       if (is_rela)
11300         {
11301           if (!slurp_rela_relocs ((FILE *) file, relsec->sh_offset,
11302                                   relsec->sh_size, & relocs, & num_relocs))
11303             return;
11304         }
11305       else
11306         {
11307           if (!slurp_rel_relocs ((FILE *) file, relsec->sh_offset,
11308                                  relsec->sh_size, & relocs, & num_relocs))
11309             return;
11310         }
11311
11312       /* SH uses RELA but uses in place value instead of the addend field.  */
11313       if (elf_header.e_machine == EM_SH)
11314         is_rela = FALSE;
11315
11316       symsec = section_headers + relsec->sh_link;
11317       symtab = GET_ELF_SYMBOLS ((FILE *) file, symsec, & num_syms);
11318
11319       for (rp = relocs; rp < relocs + num_relocs; ++rp)
11320         {
11321           bfd_vma         addend;
11322           unsigned int    reloc_type;
11323           unsigned int    reloc_size;
11324           unsigned char * rloc;
11325           unsigned long   sym_index;
11326
11327           reloc_type = get_reloc_type (rp->r_info);
11328
11329           if (target_specific_reloc_handling (rp, start, symtab))
11330             continue;
11331           else if (is_none_reloc (reloc_type))
11332             continue;
11333           else if (is_32bit_abs_reloc (reloc_type)
11334                    || is_32bit_pcrel_reloc (reloc_type))
11335             reloc_size = 4;
11336           else if (is_64bit_abs_reloc (reloc_type)
11337                    || is_64bit_pcrel_reloc (reloc_type))
11338             reloc_size = 8;
11339           else if (is_24bit_abs_reloc (reloc_type))
11340             reloc_size = 3;
11341           else if (is_16bit_abs_reloc (reloc_type))
11342             reloc_size = 2;
11343           else
11344             {
11345               warn (_("unable to apply unsupported reloc type %d to section %s\n"),
11346                     reloc_type, printable_section_name (section));
11347               continue;
11348             }
11349
11350           rloc = start + rp->r_offset;
11351           if ((rloc + reloc_size) > end || (rloc < start))
11352             {
11353               warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
11354                     (unsigned long) rp->r_offset,
11355                     printable_section_name (section));
11356               continue;
11357             }
11358
11359           sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
11360           if (sym_index >= num_syms)
11361             {
11362               warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
11363                     sym_index, printable_section_name (section));
11364               continue;
11365             }
11366           sym = symtab + sym_index;
11367
11368           /* If the reloc has a symbol associated with it,
11369              make sure that it is of an appropriate type.
11370
11371              Relocations against symbols without type can happen.
11372              Gcc -feliminate-dwarf2-dups may generate symbols
11373              without type for debug info.
11374
11375              Icc generates relocations against function symbols
11376              instead of local labels.
11377
11378              Relocations against object symbols can happen, eg when
11379              referencing a global array.  For an example of this see
11380              the _clz.o binary in libgcc.a.  */
11381           if (sym != symtab
11382               && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
11383             {
11384               warn (_("skipping unexpected symbol type %s in %ld'th relocation in section %s\n"),
11385                     get_symbol_type (ELF_ST_TYPE (sym->st_info)),
11386                     (long int)(rp - relocs),
11387                     printable_section_name (relsec));
11388               continue;
11389             }
11390
11391           addend = 0;
11392           if (is_rela)
11393             addend += rp->r_addend;
11394           /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
11395              partial_inplace.  */
11396           if (!is_rela
11397               || (elf_header.e_machine == EM_XTENSA
11398                   && reloc_type == 1)
11399               || ((elf_header.e_machine == EM_PJ
11400                    || elf_header.e_machine == EM_PJ_OLD)
11401                   && reloc_type == 1)
11402               || ((elf_header.e_machine == EM_D30V
11403                    || elf_header.e_machine == EM_CYGNUS_D30V)
11404                   && reloc_type == 12))
11405             addend += byte_get (rloc, reloc_size);
11406
11407           if (is_32bit_pcrel_reloc (reloc_type)
11408               || is_64bit_pcrel_reloc (reloc_type))
11409             {
11410               /* On HPPA, all pc-relative relocations are biased by 8.  */
11411               if (elf_header.e_machine == EM_PARISC)
11412                 addend -= 8;
11413               byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
11414                         reloc_size);
11415             }
11416           else
11417             byte_put (rloc, addend + sym->st_value, reloc_size);
11418         }
11419
11420       free (symtab);
11421       free (relocs);
11422       break;
11423     }
11424 }
11425
11426 #ifdef SUPPORT_DISASSEMBLY
11427 static int
11428 disassemble_section (Elf_Internal_Shdr * section, FILE * file)
11429 {
11430   printf (_("\nAssembly dump of section %s\n"), printable_section_name (section));
11431
11432   /* FIXME: XXX -- to be done --- XXX */
11433
11434   return 1;
11435 }
11436 #endif
11437
11438 /* Reads in the contents of SECTION from FILE, returning a pointer
11439    to a malloc'ed buffer or NULL if something went wrong.  */
11440
11441 static char *
11442 get_section_contents (Elf_Internal_Shdr * section, FILE * file)
11443 {
11444   bfd_size_type num_bytes;
11445
11446   num_bytes = section->sh_size;
11447
11448   if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
11449     {
11450       printf (_("\nSection '%s' has no data to dump.\n"),
11451               printable_section_name (section));
11452       return NULL;
11453     }
11454
11455   return  (char *) get_data (NULL, file, section->sh_offset, 1, num_bytes,
11456                              _("section contents"));
11457 }
11458
11459
11460 static void
11461 dump_section_as_strings (Elf_Internal_Shdr * section, FILE * file)
11462 {
11463   Elf_Internal_Shdr * relsec;
11464   bfd_size_type num_bytes;
11465   char * data;
11466   char * end;
11467   char * start;
11468   bfd_boolean some_strings_shown;
11469
11470   start = get_section_contents (section, file);
11471   if (start == NULL)
11472     return;
11473
11474   printf (_("\nString dump of section '%s':\n"), printable_section_name (section));
11475
11476   /* If the section being dumped has relocations against it the user might
11477      be expecting these relocations to have been applied.  Check for this
11478      case and issue a warning message in order to avoid confusion.
11479      FIXME: Maybe we ought to have an option that dumps a section with
11480      relocs applied ?  */
11481   for (relsec = section_headers;
11482        relsec < section_headers + elf_header.e_shnum;
11483        ++relsec)
11484     {
11485       if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
11486           || relsec->sh_info >= elf_header.e_shnum
11487           || section_headers + relsec->sh_info != section
11488           || relsec->sh_size == 0
11489           || relsec->sh_link >= elf_header.e_shnum)
11490         continue;
11491
11492       printf (_("  Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
11493       break;
11494     }
11495
11496   num_bytes = section->sh_size;
11497   data = start;
11498   end  = start + num_bytes;
11499   some_strings_shown = FALSE;
11500
11501   while (data < end)
11502     {
11503       while (!ISPRINT (* data))
11504         if (++ data >= end)
11505           break;
11506
11507       if (data < end)
11508         {
11509           size_t maxlen = end - data;
11510
11511 #ifndef __MSVCRT__
11512           /* PR 11128: Use two separate invocations in order to work
11513              around bugs in the Solaris 8 implementation of printf.  */
11514           printf ("  [%6tx]  ", data - start);
11515 #else
11516           printf ("  [%6Ix]  ", (size_t) (data - start));
11517 #endif
11518           if (maxlen > 0)
11519             {
11520               print_symbol ((int) maxlen, data);
11521               putchar ('\n');
11522               data += strnlen (data, maxlen);
11523             }
11524           else
11525             {
11526               printf (_("<corrupt>\n"));
11527               data = end;
11528             }
11529           some_strings_shown = TRUE;
11530         }
11531     }
11532
11533   if (! some_strings_shown)
11534     printf (_("  No strings found in this section."));
11535
11536   free (start);
11537
11538   putchar ('\n');
11539 }
11540
11541 static void
11542 dump_section_as_bytes (Elf_Internal_Shdr * section,
11543                        FILE * file,
11544                        bfd_boolean relocate)
11545 {
11546   Elf_Internal_Shdr * relsec;
11547   bfd_size_type bytes;
11548   bfd_vma addr;
11549   unsigned char * data;
11550   unsigned char * start;
11551
11552   start = (unsigned char *) get_section_contents (section, file);
11553   if (start == NULL)
11554     return;
11555
11556   printf (_("\nHex dump of section '%s':\n"), printable_section_name (section));
11557
11558   if (relocate)
11559     {
11560       apply_relocations (file, section, start);
11561     }
11562   else
11563     {
11564       /* If the section being dumped has relocations against it the user might
11565          be expecting these relocations to have been applied.  Check for this
11566          case and issue a warning message in order to avoid confusion.
11567          FIXME: Maybe we ought to have an option that dumps a section with
11568          relocs applied ?  */
11569       for (relsec = section_headers;
11570            relsec < section_headers + elf_header.e_shnum;
11571            ++relsec)
11572         {
11573           if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
11574               || relsec->sh_info >= elf_header.e_shnum
11575               || section_headers + relsec->sh_info != section
11576               || relsec->sh_size == 0
11577               || relsec->sh_link >= elf_header.e_shnum)
11578             continue;
11579
11580           printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
11581           break;
11582         }
11583     }
11584
11585   addr = section->sh_addr;
11586   bytes = section->sh_size;
11587   data = start;
11588
11589   while (bytes)
11590     {
11591       int j;
11592       int k;
11593       int lbytes;
11594
11595       lbytes = (bytes > 16 ? 16 : bytes);
11596
11597       printf ("  0x%8.8lx ", (unsigned long) addr);
11598
11599       for (j = 0; j < 16; j++)
11600         {
11601           if (j < lbytes)
11602             printf ("%2.2x", data[j]);
11603           else
11604             printf ("  ");
11605
11606           if ((j & 3) == 3)
11607             printf (" ");
11608         }
11609
11610       for (j = 0; j < lbytes; j++)
11611         {
11612           k = data[j];
11613           if (k >= ' ' && k < 0x7f)
11614             printf ("%c", k);
11615           else
11616             printf (".");
11617         }
11618
11619       putchar ('\n');
11620
11621       data  += lbytes;
11622       addr  += lbytes;
11623       bytes -= lbytes;
11624     }
11625
11626   free (start);
11627
11628   putchar ('\n');
11629 }
11630
11631 /* Uncompresses a section that was compressed using zlib, in place.  */
11632
11633 static int
11634 uncompress_section_contents (unsigned char **buffer ATTRIBUTE_UNUSED,
11635                              dwarf_size_type *size ATTRIBUTE_UNUSED)
11636 {
11637 #ifndef HAVE_ZLIB_H
11638   return FALSE;
11639 #else
11640   dwarf_size_type compressed_size = *size;
11641   unsigned char * compressed_buffer = *buffer;
11642   dwarf_size_type uncompressed_size;
11643   unsigned char * uncompressed_buffer;
11644   z_stream strm;
11645   int rc;
11646   dwarf_size_type header_size = 12;
11647
11648   /* Read the zlib header.  In this case, it should be "ZLIB" followed
11649      by the uncompressed section size, 8 bytes in big-endian order.  */
11650   if (compressed_size < header_size
11651       || ! streq ((char *) compressed_buffer, "ZLIB"))
11652     return 0;
11653
11654   uncompressed_size = compressed_buffer[4]; uncompressed_size <<= 8;
11655   uncompressed_size += compressed_buffer[5]; uncompressed_size <<= 8;
11656   uncompressed_size += compressed_buffer[6]; uncompressed_size <<= 8;
11657   uncompressed_size += compressed_buffer[7]; uncompressed_size <<= 8;
11658   uncompressed_size += compressed_buffer[8]; uncompressed_size <<= 8;
11659   uncompressed_size += compressed_buffer[9]; uncompressed_size <<= 8;
11660   uncompressed_size += compressed_buffer[10]; uncompressed_size <<= 8;
11661   uncompressed_size += compressed_buffer[11];
11662
11663   /* It is possible the section consists of several compressed
11664      buffers concatenated together, so we uncompress in a loop.  */
11665   strm.zalloc = NULL;
11666   strm.zfree = NULL;
11667   strm.opaque = NULL;
11668   strm.avail_in = compressed_size - header_size;
11669   strm.next_in = (Bytef *) compressed_buffer + header_size;
11670   strm.avail_out = uncompressed_size;
11671   uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
11672
11673   rc = inflateInit (& strm);
11674   while (strm.avail_in > 0)
11675     {
11676       if (rc != Z_OK)
11677         goto fail;
11678       strm.next_out = ((Bytef *) uncompressed_buffer
11679                        + (uncompressed_size - strm.avail_out));
11680       rc = inflate (&strm, Z_FINISH);
11681       if (rc != Z_STREAM_END)
11682         goto fail;
11683       rc = inflateReset (& strm);
11684     }
11685   rc = inflateEnd (& strm);
11686   if (rc != Z_OK
11687       || strm.avail_out != 0)
11688     goto fail;
11689
11690   free (compressed_buffer);
11691   *buffer = uncompressed_buffer;
11692   *size = uncompressed_size;
11693   return 1;
11694
11695  fail:
11696   free (uncompressed_buffer);
11697   /* Indicate decompression failure.  */
11698   *buffer = NULL;
11699   return 0;
11700 #endif  /* HAVE_ZLIB_H */
11701 }
11702
11703 static int
11704 load_specific_debug_section (enum dwarf_section_display_enum debug,
11705                              Elf_Internal_Shdr * sec, void * file)
11706 {
11707   struct dwarf_section * section = &debug_displays [debug].section;
11708   char buf [64];
11709
11710   /* If it is already loaded, do nothing.  */
11711   if (section->start != NULL)
11712     return 1;
11713
11714   snprintf (buf, sizeof (buf), _("%s section data"), section->name);
11715   section->address = sec->sh_addr;
11716   section->user_data = NULL;
11717   section->start = (unsigned char *) get_data (NULL, (FILE *) file,
11718                                                sec->sh_offset, 1,
11719                                                sec->sh_size, buf);
11720   if (section->start == NULL)
11721     section->size = 0;
11722   else
11723     {
11724       section->size = sec->sh_size;
11725       if (uncompress_section_contents (&section->start, &section->size))
11726         sec->sh_size = section->size;
11727     }
11728
11729   if (section->start == NULL)
11730     return 0;
11731
11732   if (debug_displays [debug].relocate)
11733     apply_relocations ((FILE *) file, sec, section->start);
11734
11735   return 1;
11736 }
11737
11738 /* If this is not NULL, load_debug_section will only look for sections
11739    within the list of sections given here.  */
11740 unsigned int *section_subset = NULL;
11741
11742 int
11743 load_debug_section (enum dwarf_section_display_enum debug, void * file)
11744 {
11745   struct dwarf_section * section = &debug_displays [debug].section;
11746   Elf_Internal_Shdr * sec;
11747
11748   /* Locate the debug section.  */
11749   sec = find_section_in_set (section->uncompressed_name, section_subset);
11750   if (sec != NULL)
11751     section->name = section->uncompressed_name;
11752   else
11753     {
11754       sec = find_section_in_set (section->compressed_name, section_subset);
11755       if (sec != NULL)
11756         section->name = section->compressed_name;
11757     }
11758   if (sec == NULL)
11759     return 0;
11760
11761   /* If we're loading from a subset of sections, and we've loaded
11762      a section matching this name before, it's likely that it's a
11763      different one.  */
11764   if (section_subset != NULL)
11765     free_debug_section (debug);
11766
11767   return load_specific_debug_section (debug, sec, (FILE *) file);
11768 }
11769
11770 void
11771 free_debug_section (enum dwarf_section_display_enum debug)
11772 {
11773   struct dwarf_section * section = &debug_displays [debug].section;
11774
11775   if (section->start == NULL)
11776     return;
11777
11778   free ((char *) section->start);
11779   section->start = NULL;
11780   section->address = 0;
11781   section->size = 0;
11782 }
11783
11784 static int
11785 display_debug_section (int shndx, Elf_Internal_Shdr * section, FILE * file)
11786 {
11787   char * name = SECTION_NAME (section);
11788   const char * print_name = printable_section_name (section);
11789   bfd_size_type length;
11790   int result = 1;
11791   int i;
11792
11793   length = section->sh_size;
11794   if (length == 0)
11795     {
11796       printf (_("\nSection '%s' has no debugging data.\n"), print_name);
11797       return 0;
11798     }
11799   if (section->sh_type == SHT_NOBITS)
11800     {
11801       /* There is no point in dumping the contents of a debugging section
11802          which has the NOBITS type - the bits in the file will be random.
11803          This can happen when a file containing a .eh_frame section is
11804          stripped with the --only-keep-debug command line option.  */
11805       printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"),
11806               print_name);
11807       return 0;
11808     }
11809
11810   if (const_strneq (name, ".gnu.linkonce.wi."))
11811     name = ".debug_info";
11812
11813   /* See if we know how to display the contents of this section.  */
11814   for (i = 0; i < max; i++)
11815     if (streq (debug_displays[i].section.uncompressed_name, name)
11816         || (i == line && const_strneq (name, ".debug_line."))
11817         || streq (debug_displays[i].section.compressed_name, name))
11818       {
11819         struct dwarf_section * sec = &debug_displays [i].section;
11820         int secondary = (section != find_section (name));
11821
11822         if (secondary)
11823           free_debug_section ((enum dwarf_section_display_enum) i);
11824
11825         if (i == line && const_strneq (name, ".debug_line."))
11826           sec->name = name;
11827         else if (streq (sec->uncompressed_name, name))
11828           sec->name = sec->uncompressed_name;
11829         else
11830           sec->name = sec->compressed_name;
11831         if (load_specific_debug_section ((enum dwarf_section_display_enum) i,
11832                                          section, file))
11833           {
11834             /* If this debug section is part of a CU/TU set in a .dwp file,
11835                restrict load_debug_section to the sections in that set.  */
11836             section_subset = find_cu_tu_set (file, shndx);
11837
11838             result &= debug_displays[i].display (sec, file);
11839
11840             section_subset = NULL;
11841
11842             if (secondary || (i != info && i != abbrev))
11843               free_debug_section ((enum dwarf_section_display_enum) i);
11844           }
11845
11846         break;
11847       }
11848
11849   if (i == max)
11850     {
11851       printf (_("Unrecognized debug section: %s\n"), print_name);
11852       result = 0;
11853     }
11854
11855   return result;
11856 }
11857
11858 /* Set DUMP_SECTS for all sections where dumps were requested
11859    based on section name.  */
11860
11861 static void
11862 initialise_dumps_byname (void)
11863 {
11864   struct dump_list_entry * cur;
11865
11866   for (cur = dump_sects_byname; cur; cur = cur->next)
11867     {
11868       unsigned int i;
11869       int any;
11870
11871       for (i = 0, any = 0; i < elf_header.e_shnum; i++)
11872         if (streq (SECTION_NAME (section_headers + i), cur->name))
11873           {
11874             request_dump_bynumber (i, cur->type);
11875             any = 1;
11876           }
11877
11878       if (!any)
11879         warn (_("Section '%s' was not dumped because it does not exist!\n"),
11880               cur->name);
11881     }
11882 }
11883
11884 static void
11885 process_section_contents (FILE * file)
11886 {
11887   Elf_Internal_Shdr * section;
11888   unsigned int i;
11889
11890   if (! do_dump)
11891     return;
11892
11893   initialise_dumps_byname ();
11894
11895   for (i = 0, section = section_headers;
11896        i < elf_header.e_shnum && i < num_dump_sects;
11897        i++, section++)
11898     {
11899 #ifdef SUPPORT_DISASSEMBLY
11900       if (dump_sects[i] & DISASS_DUMP)
11901         disassemble_section (section, file);
11902 #endif
11903       if (dump_sects[i] & HEX_DUMP)
11904         dump_section_as_bytes (section, file, FALSE);
11905
11906       if (dump_sects[i] & RELOC_DUMP)
11907         dump_section_as_bytes (section, file, TRUE);
11908
11909       if (dump_sects[i] & STRING_DUMP)
11910         dump_section_as_strings (section, file);
11911
11912       if (dump_sects[i] & DEBUG_DUMP)
11913         display_debug_section (i, section, file);
11914     }
11915
11916   /* Check to see if the user requested a
11917      dump of a section that does not exist.  */
11918   while (i++ < num_dump_sects)
11919     if (dump_sects[i])
11920       warn (_("Section %d was not dumped because it does not exist!\n"), i);
11921 }
11922
11923 static void
11924 process_mips_fpe_exception (int mask)
11925 {
11926   if (mask)
11927     {
11928       int first = 1;
11929       if (mask & OEX_FPU_INEX)
11930         fputs ("INEX", stdout), first = 0;
11931       if (mask & OEX_FPU_UFLO)
11932         printf ("%sUFLO", first ? "" : "|"), first = 0;
11933       if (mask & OEX_FPU_OFLO)
11934         printf ("%sOFLO", first ? "" : "|"), first = 0;
11935       if (mask & OEX_FPU_DIV0)
11936         printf ("%sDIV0", first ? "" : "|"), first = 0;
11937       if (mask & OEX_FPU_INVAL)
11938         printf ("%sINVAL", first ? "" : "|");
11939     }
11940   else
11941     fputs ("0", stdout);
11942 }
11943
11944 /* Display's the value of TAG at location P.  If TAG is
11945    greater than 0 it is assumed to be an unknown tag, and
11946    a message is printed to this effect.  Otherwise it is
11947    assumed that a message has already been printed.
11948
11949    If the bottom bit of TAG is set it assumed to have a
11950    string value, otherwise it is assumed to have an integer
11951    value.
11952
11953    Returns an updated P pointing to the first unread byte
11954    beyond the end of TAG's value.
11955
11956    Reads at or beyond END will not be made.  */
11957
11958 static unsigned char *
11959 display_tag_value (int tag,
11960                    unsigned char * p,
11961                    const unsigned char * const end)
11962 {
11963   unsigned long val;
11964
11965   if (tag > 0)
11966     printf ("  Tag_unknown_%d: ", tag);
11967
11968   if (p >= end)
11969     {
11970       warn (_("<corrupt tag>\n"));
11971     }
11972   else if (tag & 1)
11973     {
11974       /* PR 17531 file: 027-19978-0.004.  */
11975       size_t maxlen = (end - p) - 1;
11976
11977       putchar ('"');
11978       if (maxlen > 0)
11979         {
11980           print_symbol ((int) maxlen, (const char *) p);
11981           p += strnlen ((char *) p, maxlen) + 1;
11982         }
11983       else
11984         {
11985           printf (_("<corrupt string tag>"));
11986           p = (unsigned char *) end;
11987         }
11988       printf ("\"\n");
11989     }
11990   else
11991     {
11992       unsigned int len;
11993
11994       val = read_uleb128 (p, &len, end);
11995       p += len;
11996       printf ("%ld (0x%lx)\n", val, val);
11997     }
11998
11999   assert (p <= end);
12000   return p;
12001 }
12002
12003 /* ARM EABI attributes section.  */
12004 typedef struct
12005 {
12006   unsigned int tag;
12007   const char * name;
12008   /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup.  */
12009   unsigned int type;
12010   const char ** table;
12011 } arm_attr_public_tag;
12012
12013 static const char * arm_attr_tag_CPU_arch[] =
12014   {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
12015    "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8"};
12016 static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
12017 static const char * arm_attr_tag_THUMB_ISA_use[] =
12018   {"No", "Thumb-1", "Thumb-2"};
12019 static const char * arm_attr_tag_FP_arch[] =
12020   {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
12021    "FP for ARMv8", "FPv5/FP-D16 for ARMv8"};
12022 static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
12023 static const char * arm_attr_tag_Advanced_SIMD_arch[] =
12024   {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8"};
12025 static const char * arm_attr_tag_PCS_config[] =
12026   {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
12027    "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
12028 static const char * arm_attr_tag_ABI_PCS_R9_use[] =
12029   {"V6", "SB", "TLS", "Unused"};
12030 static const char * arm_attr_tag_ABI_PCS_RW_data[] =
12031   {"Absolute", "PC-relative", "SB-relative", "None"};
12032 static const char * arm_attr_tag_ABI_PCS_RO_data[] =
12033   {"Absolute", "PC-relative", "None"};
12034 static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
12035   {"None", "direct", "GOT-indirect"};
12036 static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
12037   {"None", "??? 1", "2", "??? 3", "4"};
12038 static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
12039 static const char * arm_attr_tag_ABI_FP_denormal[] =
12040   {"Unused", "Needed", "Sign only"};
12041 static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
12042 static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
12043 static const char * arm_attr_tag_ABI_FP_number_model[] =
12044   {"Unused", "Finite", "RTABI", "IEEE 754"};
12045 static const char * arm_attr_tag_ABI_enum_size[] =
12046   {"Unused", "small", "int", "forced to int"};
12047 static const char * arm_attr_tag_ABI_HardFP_use[] =
12048   {"As Tag_FP_arch", "SP only", "DP only", "SP and DP"};
12049 static const char * arm_attr_tag_ABI_VFP_args[] =
12050   {"AAPCS", "VFP registers", "custom"};
12051 static const char * arm_attr_tag_ABI_WMMX_args[] =
12052   {"AAPCS", "WMMX registers", "custom"};
12053 static const char * arm_attr_tag_ABI_optimization_goals[] =
12054   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
12055     "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
12056 static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
12057   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
12058     "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
12059 static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
12060 static const char * arm_attr_tag_FP_HP_extension[] =
12061   {"Not Allowed", "Allowed"};
12062 static const char * arm_attr_tag_ABI_FP_16bit_format[] =
12063   {"None", "IEEE 754", "Alternative Format"};
12064 static const char * arm_attr_tag_MPextension_use[] =
12065   {"Not Allowed", "Allowed"};
12066 static const char * arm_attr_tag_DIV_use[] =
12067   {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
12068     "Allowed in v7-A with integer division extension"};
12069 static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
12070 static const char * arm_attr_tag_Virtualization_use[] =
12071   {"Not Allowed", "TrustZone", "Virtualization Extensions",
12072     "TrustZone and Virtualization Extensions"};
12073 static const char * arm_attr_tag_MPextension_use_legacy[] =
12074   {"Not Allowed", "Allowed"};
12075
12076 #define LOOKUP(id, name) \
12077   {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
12078 static arm_attr_public_tag arm_attr_public_tags[] =
12079 {
12080   {4, "CPU_raw_name", 1, NULL},
12081   {5, "CPU_name", 1, NULL},
12082   LOOKUP(6, CPU_arch),
12083   {7, "CPU_arch_profile", 0, NULL},
12084   LOOKUP(8, ARM_ISA_use),
12085   LOOKUP(9, THUMB_ISA_use),
12086   LOOKUP(10, FP_arch),
12087   LOOKUP(11, WMMX_arch),
12088   LOOKUP(12, Advanced_SIMD_arch),
12089   LOOKUP(13, PCS_config),
12090   LOOKUP(14, ABI_PCS_R9_use),
12091   LOOKUP(15, ABI_PCS_RW_data),
12092   LOOKUP(16, ABI_PCS_RO_data),
12093   LOOKUP(17, ABI_PCS_GOT_use),
12094   LOOKUP(18, ABI_PCS_wchar_t),
12095   LOOKUP(19, ABI_FP_rounding),
12096   LOOKUP(20, ABI_FP_denormal),
12097   LOOKUP(21, ABI_FP_exceptions),
12098   LOOKUP(22, ABI_FP_user_exceptions),
12099   LOOKUP(23, ABI_FP_number_model),
12100   {24, "ABI_align_needed", 0, NULL},
12101   {25, "ABI_align_preserved", 0, NULL},
12102   LOOKUP(26, ABI_enum_size),
12103   LOOKUP(27, ABI_HardFP_use),
12104   LOOKUP(28, ABI_VFP_args),
12105   LOOKUP(29, ABI_WMMX_args),
12106   LOOKUP(30, ABI_optimization_goals),
12107   LOOKUP(31, ABI_FP_optimization_goals),
12108   {32, "compatibility", 0, NULL},
12109   LOOKUP(34, CPU_unaligned_access),
12110   LOOKUP(36, FP_HP_extension),
12111   LOOKUP(38, ABI_FP_16bit_format),
12112   LOOKUP(42, MPextension_use),
12113   LOOKUP(44, DIV_use),
12114   {64, "nodefaults", 0, NULL},
12115   {65, "also_compatible_with", 0, NULL},
12116   LOOKUP(66, T2EE_use),
12117   {67, "conformance", 1, NULL},
12118   LOOKUP(68, Virtualization_use),
12119   LOOKUP(70, MPextension_use_legacy)
12120 };
12121 #undef LOOKUP
12122
12123 static unsigned char *
12124 display_arm_attribute (unsigned char * p,
12125                        const unsigned char * const end)
12126 {
12127   unsigned int tag;
12128   unsigned int len;
12129   unsigned int val;
12130   arm_attr_public_tag * attr;
12131   unsigned i;
12132   unsigned int type;
12133
12134   tag = read_uleb128 (p, &len, end);
12135   p += len;
12136   attr = NULL;
12137   for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
12138     {
12139       if (arm_attr_public_tags[i].tag == tag)
12140         {
12141           attr = &arm_attr_public_tags[i];
12142           break;
12143         }
12144     }
12145
12146   if (attr)
12147     {
12148       printf ("  Tag_%s: ", attr->name);
12149       switch (attr->type)
12150         {
12151         case 0:
12152           switch (tag)
12153             {
12154             case 7: /* Tag_CPU_arch_profile.  */
12155               val = read_uleb128 (p, &len, end);
12156               p += len;
12157               switch (val)
12158                 {
12159                 case 0: printf (_("None\n")); break;
12160                 case 'A': printf (_("Application\n")); break;
12161                 case 'R': printf (_("Realtime\n")); break;
12162                 case 'M': printf (_("Microcontroller\n")); break;
12163                 case 'S': printf (_("Application or Realtime\n")); break;
12164                 default: printf ("??? (%d)\n", val); break;
12165                 }
12166               break;
12167
12168             case 24: /* Tag_align_needed.  */
12169               val = read_uleb128 (p, &len, end);
12170               p += len;
12171               switch (val)
12172                 {
12173                 case 0: printf (_("None\n")); break;
12174                 case 1: printf (_("8-byte\n")); break;
12175                 case 2: printf (_("4-byte\n")); break;
12176                 case 3: printf ("??? 3\n"); break;
12177                 default:
12178                   if (val <= 12)
12179                     printf (_("8-byte and up to %d-byte extended\n"),
12180                             1 << val);
12181                   else
12182                     printf ("??? (%d)\n", val);
12183                   break;
12184                 }
12185               break;
12186
12187             case 25: /* Tag_align_preserved.  */
12188               val = read_uleb128 (p, &len, end);
12189               p += len;
12190               switch (val)
12191                 {
12192                 case 0: printf (_("None\n")); break;
12193                 case 1: printf (_("8-byte, except leaf SP\n")); break;
12194                 case 2: printf (_("8-byte\n")); break;
12195                 case 3: printf ("??? 3\n"); break;
12196                 default:
12197                   if (val <= 12)
12198                     printf (_("8-byte and up to %d-byte extended\n"),
12199                             1 << val);
12200                   else
12201                     printf ("??? (%d)\n", val);
12202                   break;
12203                 }
12204               break;
12205
12206             case 32: /* Tag_compatibility.  */
12207               {
12208                 val = read_uleb128 (p, &len, end);
12209                 p += len;
12210                 printf (_("flag = %d, vendor = "), val);
12211                 if (p < end - 1)
12212                   {
12213                     size_t maxlen = (end - p) - 1;
12214
12215                     print_symbol ((int) maxlen, (const char *) p);
12216                     p += strnlen ((char *) p, maxlen) + 1;
12217                   }
12218                 else
12219                   {
12220                     printf (_("<corrupt>"));
12221                     p = (unsigned char *) end;
12222                   }
12223                 putchar ('\n');
12224               }
12225               break;
12226
12227             case 64: /* Tag_nodefaults.  */
12228               /* PR 17531: file: 001-505008-0.01.  */
12229               if (p < end)
12230                 p++;
12231               printf (_("True\n"));
12232               break;
12233
12234             case 65: /* Tag_also_compatible_with.  */
12235               val = read_uleb128 (p, &len, end);
12236               p += len;
12237               if (val == 6 /* Tag_CPU_arch.  */)
12238                 {
12239                   val = read_uleb128 (p, &len, end);
12240                   p += len;
12241                   if ((unsigned int) val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
12242                     printf ("??? (%d)\n", val);
12243                   else
12244                     printf ("%s\n", arm_attr_tag_CPU_arch[val]);
12245                 }
12246               else
12247                 printf ("???\n");
12248               while (p < end && *(p++) != '\0' /* NUL terminator.  */)
12249                 ;
12250               break;
12251
12252             default:
12253               abort ();
12254             }
12255           return p;
12256
12257         case 1:
12258           return display_tag_value (-1, p, end);
12259         case 2:
12260           return display_tag_value (0, p, end);
12261
12262         default:
12263           assert (attr->type & 0x80);
12264           val = read_uleb128 (p, &len, end);
12265           p += len;
12266           type = attr->type & 0x7f;
12267           if (val >= type)
12268             printf ("??? (%d)\n", val);
12269           else
12270             printf ("%s\n", attr->table[val]);
12271           return p;
12272         }
12273     }
12274
12275   return display_tag_value (tag, p, end);
12276 }
12277
12278 static unsigned char *
12279 display_gnu_attribute (unsigned char * p,
12280                        unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const),
12281                        const unsigned char * const end)
12282 {
12283   int tag;
12284   unsigned int len;
12285   int val;
12286
12287   tag = read_uleb128 (p, &len, end);
12288   p += len;
12289
12290   /* Tag_compatibility is the only generic GNU attribute defined at
12291      present.  */
12292   if (tag == 32)
12293     {
12294       val = read_uleb128 (p, &len, end);
12295       p += len;
12296
12297       printf (_("flag = %d, vendor = "), val);
12298       if (p == end)
12299         {
12300           printf (_("<corrupt>\n"));
12301           warn (_("corrupt vendor attribute\n"));
12302         }
12303       else
12304         {
12305           if (p < end - 1)
12306             {
12307               size_t maxlen = (end - p) - 1;
12308
12309               print_symbol ((int) maxlen, (const char *) p);
12310               p += strnlen ((char *) p, maxlen) + 1;
12311             }
12312           else
12313             {
12314               printf (_("<corrupt>"));
12315               p = (unsigned char *) end;
12316             }
12317           putchar ('\n');
12318         }
12319       return p;
12320     }
12321
12322   if ((tag & 2) == 0 && display_proc_gnu_attribute)
12323     return display_proc_gnu_attribute (p, tag, end);
12324
12325   return display_tag_value (tag, p, end);
12326 }
12327
12328 static unsigned char *
12329 display_power_gnu_attribute (unsigned char * p,
12330                              int tag,
12331                              const unsigned char * const end)
12332 {
12333   unsigned int len;
12334   int val;
12335
12336   if (tag == Tag_GNU_Power_ABI_FP)
12337     {
12338       val = read_uleb128 (p, &len, end);
12339       p += len;
12340       printf ("  Tag_GNU_Power_ABI_FP: ");
12341
12342       switch (val)
12343         {
12344         case 0:
12345           printf (_("Hard or soft float\n"));
12346           break;
12347         case 1:
12348           printf (_("Hard float\n"));
12349           break;
12350         case 2:
12351           printf (_("Soft float\n"));
12352           break;
12353         case 3:
12354           printf (_("Single-precision hard float\n"));
12355           break;
12356         default:
12357           printf ("??? (%d)\n", val);
12358           break;
12359         }
12360       return p;
12361    }
12362
12363   if (tag == Tag_GNU_Power_ABI_Vector)
12364     {
12365       val = read_uleb128 (p, &len, end);
12366       p += len;
12367       printf ("  Tag_GNU_Power_ABI_Vector: ");
12368       switch (val)
12369         {
12370         case 0:
12371           printf (_("Any\n"));
12372           break;
12373         case 1:
12374           printf (_("Generic\n"));
12375           break;
12376         case 2:
12377           printf ("AltiVec\n");
12378           break;
12379         case 3:
12380           printf ("SPE\n");
12381           break;
12382         default:
12383           printf ("??? (%d)\n", val);
12384           break;
12385         }
12386       return p;
12387    }
12388
12389   if (tag == Tag_GNU_Power_ABI_Struct_Return)
12390     {
12391       if (p == end)
12392         {
12393           warn (_("corrupt Tag_GNU_Power_ABI_Struct_Return\n"));
12394           return p;
12395         }
12396
12397       val = read_uleb128 (p, &len, end);
12398       p += len;
12399       printf ("  Tag_GNU_Power_ABI_Struct_Return: ");
12400       switch (val)
12401        {
12402        case 0:
12403          printf (_("Any\n"));
12404          break;
12405        case 1:
12406          printf ("r3/r4\n");
12407          break;
12408        case 2:
12409          printf (_("Memory\n"));
12410          break;
12411        default:
12412          printf ("??? (%d)\n", val);
12413          break;
12414        }
12415       return p;
12416     }
12417
12418   return display_tag_value (tag & 1, p, end);
12419 }
12420
12421 static void
12422 display_sparc_hwcaps (int mask)
12423 {
12424   if (mask)
12425     {
12426       int first = 1;
12427
12428       if (mask & ELF_SPARC_HWCAP_MUL32)
12429         fputs ("mul32", stdout), first = 0;
12430       if (mask & ELF_SPARC_HWCAP_DIV32)
12431         printf ("%sdiv32", first ? "" : "|"), first = 0;
12432       if (mask & ELF_SPARC_HWCAP_FSMULD)
12433         printf ("%sfsmuld", first ? "" : "|"), first = 0;
12434       if (mask & ELF_SPARC_HWCAP_V8PLUS)
12435         printf ("%sv8plus", first ? "" : "|"), first = 0;
12436       if (mask & ELF_SPARC_HWCAP_POPC)
12437         printf ("%spopc", first ? "" : "|"), first = 0;
12438       if (mask & ELF_SPARC_HWCAP_VIS)
12439         printf ("%svis", first ? "" : "|"), first = 0;
12440       if (mask & ELF_SPARC_HWCAP_VIS2)
12441         printf ("%svis2", first ? "" : "|"), first = 0;
12442       if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
12443         printf ("%sASIBlkInit", first ? "" : "|"), first = 0;
12444       if (mask & ELF_SPARC_HWCAP_FMAF)
12445         printf ("%sfmaf", first ? "" : "|"), first = 0;
12446       if (mask & ELF_SPARC_HWCAP_VIS3)
12447         printf ("%svis3", first ? "" : "|"), first = 0;
12448       if (mask & ELF_SPARC_HWCAP_HPC)
12449         printf ("%shpc", first ? "" : "|"), first = 0;
12450       if (mask & ELF_SPARC_HWCAP_RANDOM)
12451         printf ("%srandom", first ? "" : "|"), first = 0;
12452       if (mask & ELF_SPARC_HWCAP_TRANS)
12453         printf ("%strans", first ? "" : "|"), first = 0;
12454       if (mask & ELF_SPARC_HWCAP_FJFMAU)
12455         printf ("%sfjfmau", first ? "" : "|"), first = 0;
12456       if (mask & ELF_SPARC_HWCAP_IMA)
12457         printf ("%sima", first ? "" : "|"), first = 0;
12458       if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
12459         printf ("%scspare", first ? "" : "|"), first = 0;
12460     }
12461   else
12462     fputc ('0', stdout);
12463   fputc ('\n', stdout);
12464 }
12465
12466 static void
12467 display_sparc_hwcaps2 (int mask)
12468 {
12469   if (mask)
12470     {
12471       int first = 1;
12472
12473       if (mask & ELF_SPARC_HWCAP2_FJATHPLUS)
12474         fputs ("fjathplus", stdout), first = 0;
12475       if (mask & ELF_SPARC_HWCAP2_VIS3B)
12476         printf ("%svis3b", first ? "" : "|"), first = 0;
12477       if (mask & ELF_SPARC_HWCAP2_ADP)
12478         printf ("%sadp", first ? "" : "|"), first = 0;
12479       if (mask & ELF_SPARC_HWCAP2_SPARC5)
12480         printf ("%ssparc5", first ? "" : "|"), first = 0;
12481       if (mask & ELF_SPARC_HWCAP2_MWAIT)
12482         printf ("%smwait", first ? "" : "|"), first = 0;
12483       if (mask & ELF_SPARC_HWCAP2_XMPMUL)
12484         printf ("%sxmpmul", first ? "" : "|"), first = 0;
12485       if (mask & ELF_SPARC_HWCAP2_XMONT)
12486         printf ("%sxmont2", first ? "" : "|"), first = 0;
12487       if (mask & ELF_SPARC_HWCAP2_NSEC)
12488         printf ("%snsec", first ? "" : "|"), first = 0;
12489       if (mask & ELF_SPARC_HWCAP2_FJATHHPC)
12490         printf ("%sfjathhpc", first ? "" : "|"), first = 0;
12491       if (mask & ELF_SPARC_HWCAP2_FJDES)
12492         printf ("%sfjdes", first ? "" : "|"), first = 0;
12493       if (mask & ELF_SPARC_HWCAP2_FJAES)
12494         printf ("%sfjaes", first ? "" : "|"), first = 0;
12495     }
12496   else
12497     fputc ('0', stdout);
12498   fputc ('\n', stdout);
12499 }
12500
12501 static unsigned char *
12502 display_sparc_gnu_attribute (unsigned char * p,
12503                              int tag,
12504                              const unsigned char * const end)
12505 {
12506   unsigned int len;
12507   int val;
12508
12509   if (tag == Tag_GNU_Sparc_HWCAPS)
12510     {
12511       val = read_uleb128 (p, &len, end);
12512       p += len;
12513       printf ("  Tag_GNU_Sparc_HWCAPS: ");
12514       display_sparc_hwcaps (val);
12515       return p;
12516     }
12517   if (tag == Tag_GNU_Sparc_HWCAPS2)
12518     {
12519       val = read_uleb128 (p, &len, end);
12520       p += len;
12521       printf ("  Tag_GNU_Sparc_HWCAPS2: ");
12522       display_sparc_hwcaps2 (val);
12523       return p;
12524     }
12525
12526   return display_tag_value (tag, p, end);
12527 }
12528
12529 static void
12530 print_mips_fp_abi_value (int val)
12531 {
12532   switch (val)
12533     {
12534     case Val_GNU_MIPS_ABI_FP_ANY:
12535       printf (_("Hard or soft float\n"));
12536       break;
12537     case Val_GNU_MIPS_ABI_FP_DOUBLE:
12538       printf (_("Hard float (double precision)\n"));
12539       break;
12540     case Val_GNU_MIPS_ABI_FP_SINGLE:
12541       printf (_("Hard float (single precision)\n"));
12542       break;
12543     case Val_GNU_MIPS_ABI_FP_SOFT:
12544       printf (_("Soft float\n"));
12545       break;
12546     case Val_GNU_MIPS_ABI_FP_OLD_64:
12547       printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
12548       break;
12549     case Val_GNU_MIPS_ABI_FP_XX:
12550       printf (_("Hard float (32-bit CPU, Any FPU)\n"));
12551       break;
12552     case Val_GNU_MIPS_ABI_FP_64:
12553       printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
12554       break;
12555     case Val_GNU_MIPS_ABI_FP_64A:
12556       printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
12557       break;
12558     default:
12559       printf ("??? (%d)\n", val);
12560       break;
12561     }
12562 }
12563
12564 static unsigned char *
12565 display_mips_gnu_attribute (unsigned char * p,
12566                             int tag,
12567                             const unsigned char * const end)
12568 {
12569   if (tag == Tag_GNU_MIPS_ABI_FP)
12570     {
12571       unsigned int len;
12572       int val;
12573
12574       val = read_uleb128 (p, &len, end);
12575       p += len;
12576       printf ("  Tag_GNU_MIPS_ABI_FP: ");
12577
12578       print_mips_fp_abi_value (val);
12579
12580       return p;
12581    }
12582
12583   if (tag == Tag_GNU_MIPS_ABI_MSA)
12584     {
12585       unsigned int len;
12586       int val;
12587
12588       val = read_uleb128 (p, &len, end);
12589       p += len;
12590       printf ("  Tag_GNU_MIPS_ABI_MSA: ");
12591
12592       switch (val)
12593         {
12594         case Val_GNU_MIPS_ABI_MSA_ANY:
12595           printf (_("Any MSA or not\n"));
12596           break;
12597         case Val_GNU_MIPS_ABI_MSA_128:
12598           printf (_("128-bit MSA\n"));
12599           break;
12600         default:
12601           printf ("??? (%d)\n", val);
12602           break;
12603         }
12604       return p;
12605     }
12606
12607   return display_tag_value (tag & 1, p, end);
12608 }
12609
12610 static unsigned char *
12611 display_tic6x_attribute (unsigned char * p,
12612                          const unsigned char * const end)
12613 {
12614   int tag;
12615   unsigned int len;
12616   int val;
12617
12618   tag = read_uleb128 (p, &len, end);
12619   p += len;
12620
12621   switch (tag)
12622     {
12623     case Tag_ISA:
12624       val = read_uleb128 (p, &len, end);
12625       p += len;
12626       printf ("  Tag_ISA: ");
12627
12628       switch (val)
12629         {
12630         case C6XABI_Tag_ISA_none:
12631           printf (_("None\n"));
12632           break;
12633         case C6XABI_Tag_ISA_C62X:
12634           printf ("C62x\n");
12635           break;
12636         case C6XABI_Tag_ISA_C67X:
12637           printf ("C67x\n");
12638           break;
12639         case C6XABI_Tag_ISA_C67XP:
12640           printf ("C67x+\n");
12641           break;
12642         case C6XABI_Tag_ISA_C64X:
12643           printf ("C64x\n");
12644           break;
12645         case C6XABI_Tag_ISA_C64XP:
12646           printf ("C64x+\n");
12647           break;
12648         case C6XABI_Tag_ISA_C674X:
12649           printf ("C674x\n");
12650           break;
12651         default:
12652           printf ("??? (%d)\n", val);
12653           break;
12654         }
12655       return p;
12656
12657     case Tag_ABI_wchar_t:
12658       val = read_uleb128 (p, &len, end);
12659       p += len;
12660       printf ("  Tag_ABI_wchar_t: ");
12661       switch (val)
12662         {
12663         case 0:
12664           printf (_("Not used\n"));
12665           break;
12666         case 1:
12667           printf (_("2 bytes\n"));
12668           break;
12669         case 2:
12670           printf (_("4 bytes\n"));
12671           break;
12672         default:
12673           printf ("??? (%d)\n", val);
12674           break;
12675         }
12676       return p;
12677
12678     case Tag_ABI_stack_align_needed:
12679       val = read_uleb128 (p, &len, end);
12680       p += len;
12681       printf ("  Tag_ABI_stack_align_needed: ");
12682       switch (val)
12683         {
12684         case 0:
12685           printf (_("8-byte\n"));
12686           break;
12687         case 1:
12688           printf (_("16-byte\n"));
12689           break;
12690         default:
12691           printf ("??? (%d)\n", val);
12692           break;
12693         }
12694       return p;
12695
12696     case Tag_ABI_stack_align_preserved:
12697       val = read_uleb128 (p, &len, end);
12698       p += len;
12699       printf ("  Tag_ABI_stack_align_preserved: ");
12700       switch (val)
12701         {
12702         case 0:
12703           printf (_("8-byte\n"));
12704           break;
12705         case 1:
12706           printf (_("16-byte\n"));
12707           break;
12708         default:
12709           printf ("??? (%d)\n", val);
12710           break;
12711         }
12712       return p;
12713
12714     case Tag_ABI_DSBT:
12715       val = read_uleb128 (p, &len, end);
12716       p += len;
12717       printf ("  Tag_ABI_DSBT: ");
12718       switch (val)
12719         {
12720         case 0:
12721           printf (_("DSBT addressing not used\n"));
12722           break;
12723         case 1:
12724           printf (_("DSBT addressing used\n"));
12725           break;
12726         default:
12727           printf ("??? (%d)\n", val);
12728           break;
12729         }
12730       return p;
12731
12732     case Tag_ABI_PID:
12733       val = read_uleb128 (p, &len, end);
12734       p += len;
12735       printf ("  Tag_ABI_PID: ");
12736       switch (val)
12737         {
12738         case 0:
12739           printf (_("Data addressing position-dependent\n"));
12740           break;
12741         case 1:
12742           printf (_("Data addressing position-independent, GOT near DP\n"));
12743           break;
12744         case 2:
12745           printf (_("Data addressing position-independent, GOT far from DP\n"));
12746           break;
12747         default:
12748           printf ("??? (%d)\n", val);
12749           break;
12750         }
12751       return p;
12752
12753     case Tag_ABI_PIC:
12754       val = read_uleb128 (p, &len, end);
12755       p += len;
12756       printf ("  Tag_ABI_PIC: ");
12757       switch (val)
12758         {
12759         case 0:
12760           printf (_("Code addressing position-dependent\n"));
12761           break;
12762         case 1:
12763           printf (_("Code addressing position-independent\n"));
12764           break;
12765         default:
12766           printf ("??? (%d)\n", val);
12767           break;
12768         }
12769       return p;
12770
12771     case Tag_ABI_array_object_alignment:
12772       val = read_uleb128 (p, &len, end);
12773       p += len;
12774       printf ("  Tag_ABI_array_object_alignment: ");
12775       switch (val)
12776         {
12777         case 0:
12778           printf (_("8-byte\n"));
12779           break;
12780         case 1:
12781           printf (_("4-byte\n"));
12782           break;
12783         case 2:
12784           printf (_("16-byte\n"));
12785           break;
12786         default:
12787           printf ("??? (%d)\n", val);
12788           break;
12789         }
12790       return p;
12791
12792     case Tag_ABI_array_object_align_expected:
12793       val = read_uleb128 (p, &len, end);
12794       p += len;
12795       printf ("  Tag_ABI_array_object_align_expected: ");
12796       switch (val)
12797         {
12798         case 0:
12799           printf (_("8-byte\n"));
12800           break;
12801         case 1:
12802           printf (_("4-byte\n"));
12803           break;
12804         case 2:
12805           printf (_("16-byte\n"));
12806           break;
12807         default:
12808           printf ("??? (%d)\n", val);
12809           break;
12810         }
12811       return p;
12812
12813     case Tag_ABI_compatibility:
12814       {
12815         val = read_uleb128 (p, &len, end);
12816         p += len;
12817         printf ("  Tag_ABI_compatibility: ");
12818         printf (_("flag = %d, vendor = "), val);
12819         if (p < end - 1)
12820           {
12821             size_t maxlen = (end - p) - 1;
12822
12823             print_symbol ((int) maxlen, (const char *) p);
12824             p += strnlen ((char *) p, maxlen) + 1;
12825           }
12826         else
12827           {
12828             printf (_("<corrupt>"));
12829             p = (unsigned char *) end;
12830           }
12831         putchar ('\n');
12832         return p;
12833       }
12834
12835     case Tag_ABI_conformance:
12836       {
12837         printf ("  Tag_ABI_conformance: \"");
12838         if (p < end - 1)
12839           {
12840             size_t maxlen = (end - p) - 1;
12841
12842             print_symbol ((int) maxlen, (const char *) p);
12843             p += strnlen ((char *) p, maxlen) + 1;
12844           }
12845         else
12846           {
12847             printf (_("<corrupt>"));
12848             p = (unsigned char *) end;
12849           }
12850         printf ("\"\n");
12851         return p;
12852       }
12853     }
12854
12855   return display_tag_value (tag, p, end);
12856 }
12857
12858 static void
12859 display_raw_attribute (unsigned char * p, unsigned char * end)
12860 {
12861   unsigned long addr = 0;
12862   size_t bytes = end - p;
12863
12864   assert (end > p);
12865   while (bytes)
12866     {
12867       int j;
12868       int k;
12869       int lbytes = (bytes > 16 ? 16 : bytes);
12870
12871       printf ("  0x%8.8lx ", addr);
12872
12873       for (j = 0; j < 16; j++)
12874         {
12875           if (j < lbytes)
12876             printf ("%2.2x", p[j]);
12877           else
12878             printf ("  ");
12879
12880           if ((j & 3) == 3)
12881             printf (" ");
12882         }
12883
12884       for (j = 0; j < lbytes; j++)
12885         {
12886           k = p[j];
12887           if (k >= ' ' && k < 0x7f)
12888             printf ("%c", k);
12889           else
12890             printf (".");
12891         }
12892
12893       putchar ('\n');
12894
12895       p  += lbytes;
12896       bytes -= lbytes;
12897       addr += lbytes;
12898     }
12899
12900   putchar ('\n');
12901 }
12902
12903 static unsigned char *
12904 display_msp430x_attribute (unsigned char * p,
12905                            const unsigned char * const end)
12906 {
12907   unsigned int len;
12908   int val;
12909   int tag;
12910
12911   tag = read_uleb128 (p, & len, end);
12912   p += len;
12913
12914   switch (tag)
12915     {
12916     case OFBA_MSPABI_Tag_ISA:
12917       val = read_uleb128 (p, &len, end);
12918       p += len;
12919       printf ("  Tag_ISA: ");
12920       switch (val)
12921         {
12922         case 0: printf (_("None\n")); break;
12923         case 1: printf (_("MSP430\n")); break;
12924         case 2: printf (_("MSP430X\n")); break;
12925         default: printf ("??? (%d)\n", val); break;
12926         }
12927       break;
12928
12929     case OFBA_MSPABI_Tag_Code_Model:
12930       val = read_uleb128 (p, &len, end);
12931       p += len;
12932       printf ("  Tag_Code_Model: ");
12933       switch (val)
12934         {
12935         case 0: printf (_("None\n")); break;
12936         case 1: printf (_("Small\n")); break;
12937         case 2: printf (_("Large\n")); break;
12938         default: printf ("??? (%d)\n", val); break;
12939         }
12940       break;
12941
12942     case OFBA_MSPABI_Tag_Data_Model:
12943       val = read_uleb128 (p, &len, end);
12944       p += len;
12945       printf ("  Tag_Data_Model: ");
12946       switch (val)
12947         {
12948         case 0: printf (_("None\n")); break;
12949         case 1: printf (_("Small\n")); break;
12950         case 2: printf (_("Large\n")); break;
12951         case 3: printf (_("Restricted Large\n")); break;
12952         default: printf ("??? (%d)\n", val); break;
12953         }
12954       break;
12955
12956     default:
12957       printf (_("  <unknown tag %d>: "), tag);
12958
12959       if (tag & 1)
12960         {
12961           putchar ('"');
12962           if (p < end - 1)
12963             {
12964               size_t maxlen = (end - p) - 1;
12965
12966               print_symbol ((int) maxlen, (const char *) p);
12967               p += strnlen ((char *) p, maxlen) + 1;
12968             }
12969           else
12970             {
12971               printf (_("<corrupt>"));
12972               p = (unsigned char *) end;
12973             }
12974           printf ("\"\n");
12975         }
12976       else
12977         {
12978           val = read_uleb128 (p, &len, end);
12979           p += len;
12980           printf ("%d (0x%x)\n", val, val);
12981         }
12982       break;
12983    }
12984
12985   assert (p <= end);
12986   return p;
12987 }
12988
12989 static int
12990 process_attributes (FILE * file,
12991                     const char * public_name,
12992                     unsigned int proc_type,
12993                     unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
12994                     unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const))
12995 {
12996   Elf_Internal_Shdr * sect;
12997   unsigned i;
12998
12999   /* Find the section header so that we get the size.  */
13000   for (i = 0, sect = section_headers;
13001        i < elf_header.e_shnum;
13002        i++, sect++)
13003     {
13004       unsigned char * contents;
13005       unsigned char * p;
13006
13007       if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
13008         continue;
13009
13010       contents = (unsigned char *) get_data (NULL, file, sect->sh_offset, 1,
13011                                              sect->sh_size, _("attributes"));
13012       if (contents == NULL)
13013         continue;
13014
13015       p = contents;
13016       if (*p == 'A')
13017         {
13018           bfd_vma section_len;
13019
13020           section_len = sect->sh_size - 1;
13021           p++;
13022
13023           while (section_len > 0)
13024             {
13025               bfd_vma attr_len;
13026               unsigned int namelen;
13027               bfd_boolean public_section;
13028               bfd_boolean gnu_section;
13029
13030               if (section_len <= 4)
13031                 {
13032                   error (_("Tag section ends prematurely\n"));
13033                   break;
13034                 }
13035               attr_len = byte_get (p, 4);
13036               p += 4;
13037
13038               if (attr_len > section_len)
13039                 {
13040                   error (_("Bad attribute length (%u > %u)\n"),
13041                           (unsigned) attr_len, (unsigned) section_len);
13042                   attr_len = section_len;
13043                 }
13044               /* PR 17531: file: 001-101425-0.004  */
13045               else if (attr_len < 5)
13046                 {
13047                   error (_("Attribute length of %u is too small\n"), (unsigned) attr_len);
13048                   break;
13049                 }
13050
13051               section_len -= attr_len;
13052               attr_len -= 4;
13053
13054               namelen = strnlen ((char *) p, attr_len) + 1;
13055               if (namelen == 0 || namelen >= attr_len)
13056                 {
13057                   error (_("Corrupt attribute section name\n"));
13058                   break;
13059                 }
13060
13061               printf (_("Attribute Section: "));
13062               print_symbol (INT_MAX, (const char *) p);
13063               putchar ('\n');
13064
13065               if (public_name && streq ((char *) p, public_name))
13066                 public_section = TRUE;
13067               else
13068                 public_section = FALSE;
13069
13070               if (streq ((char *) p, "gnu"))
13071                 gnu_section = TRUE;
13072               else
13073                 gnu_section = FALSE;
13074
13075               p += namelen;
13076               attr_len -= namelen;
13077
13078               while (attr_len > 0 && p < contents + sect->sh_size)
13079                 {
13080                   int tag;
13081                   int val;
13082                   bfd_vma size;
13083                   unsigned char * end;
13084
13085                   /* PR binutils/17531: Safe handling of corrupt files.  */
13086                   if (attr_len < 6)
13087                     {
13088                       error (_("Unused bytes at end of section\n"));
13089                       section_len = 0;
13090                       break;
13091                     }
13092
13093                   tag = *(p++);
13094                   size = byte_get (p, 4);
13095                   if (size > attr_len)
13096                     {
13097                       error (_("Bad subsection length (%u > %u)\n"),
13098                               (unsigned) size, (unsigned) attr_len);
13099                       size = attr_len;
13100                     }
13101                   /* PR binutils/17531: Safe handling of corrupt files.  */
13102                   if (size < 6)
13103                     {
13104                       error (_("Bad subsection length (%u < 6)\n"),
13105                               (unsigned) size);
13106                       section_len = 0;
13107                       break;
13108                     }
13109
13110                   attr_len -= size;
13111                   end = p + size - 1;
13112                   assert (end <= contents + sect->sh_size);
13113                   p += 4;
13114
13115                   switch (tag)
13116                     {
13117                     case 1:
13118                       printf (_("File Attributes\n"));
13119                       break;
13120                     case 2:
13121                       printf (_("Section Attributes:"));
13122                       goto do_numlist;
13123                     case 3:
13124                       printf (_("Symbol Attributes:"));
13125                     do_numlist:
13126                       for (;;)
13127                         {
13128                           unsigned int j;
13129
13130                           val = read_uleb128 (p, &j, end);
13131                           p += j;
13132                           if (val == 0)
13133                             break;
13134                           printf (" %d", val);
13135                         }
13136                       printf ("\n");
13137                       break;
13138                     default:
13139                       printf (_("Unknown tag: %d\n"), tag);
13140                       public_section = FALSE;
13141                       break;
13142                     }
13143
13144                   if (public_section && display_pub_attribute != NULL)
13145                     {
13146                       while (p < end)
13147                         p = display_pub_attribute (p, end);
13148                       assert (p <= end);
13149                     }
13150                   else if (gnu_section && display_proc_gnu_attribute != NULL)
13151                     {
13152                       while (p < end)
13153                         p = display_gnu_attribute (p,
13154                                                    display_proc_gnu_attribute,
13155                                                    end);
13156                       assert (p <= end);
13157                     }
13158                   else if (p < end)
13159                     {
13160                       printf (_("  Unknown attribute:\n"));
13161                       display_raw_attribute (p, end);
13162                       p = end;
13163                     }
13164                   else
13165                     attr_len = 0;
13166                 }
13167             }
13168         }
13169       else
13170         printf (_("Unknown format '%c' (%d)\n"), *p, *p);
13171
13172       free (contents);
13173     }
13174   return 1;
13175 }
13176
13177 static int
13178 process_arm_specific (FILE * file)
13179 {
13180   return process_attributes (file, "aeabi", SHT_ARM_ATTRIBUTES,
13181                              display_arm_attribute, NULL);
13182 }
13183
13184 static int
13185 process_power_specific (FILE * file)
13186 {
13187   return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
13188                              display_power_gnu_attribute);
13189 }
13190
13191 static int
13192 process_sparc_specific (FILE * file)
13193 {
13194   return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
13195                              display_sparc_gnu_attribute);
13196 }
13197
13198 static int
13199 process_tic6x_specific (FILE * file)
13200 {
13201   return process_attributes (file, "c6xabi", SHT_C6000_ATTRIBUTES,
13202                              display_tic6x_attribute, NULL);
13203 }
13204
13205 static int
13206 process_msp430x_specific (FILE * file)
13207 {
13208   return process_attributes (file, "mspabi", SHT_MSP430_ATTRIBUTES,
13209                              display_msp430x_attribute, NULL);
13210 }
13211
13212 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
13213    Print the Address, Access and Initial fields of an entry at VMA ADDR
13214    and return the VMA of the next entry.  */
13215
13216 static bfd_vma
13217 print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
13218 {
13219   printf ("  ");
13220   print_vma (addr, LONG_HEX);
13221   printf (" ");
13222   if (addr < pltgot + 0xfff0)
13223     printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
13224   else
13225     printf ("%10s", "");
13226   printf (" ");
13227   if (data == NULL)
13228     printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
13229   else
13230     {
13231       bfd_vma entry;
13232
13233       entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
13234       print_vma (entry, LONG_HEX);
13235     }
13236   return addr + (is_32bit_elf ? 4 : 8);
13237 }
13238
13239 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
13240    PLTGOT.  Print the Address and Initial fields of an entry at VMA
13241    ADDR and return the VMA of the next entry.  */
13242
13243 static bfd_vma
13244 print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
13245 {
13246   printf ("  ");
13247   print_vma (addr, LONG_HEX);
13248   printf (" ");
13249   if (data == NULL)
13250     printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
13251   else
13252     {
13253       bfd_vma entry;
13254
13255       entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
13256       print_vma (entry, LONG_HEX);
13257     }
13258   return addr + (is_32bit_elf ? 4 : 8);
13259 }
13260
13261 static void
13262 print_mips_ases (unsigned int mask)
13263 {
13264   if (mask & AFL_ASE_DSP)
13265     fputs ("\n\tDSP ASE", stdout);
13266   if (mask & AFL_ASE_DSPR2)
13267     fputs ("\n\tDSP R2 ASE", stdout);
13268   if (mask & AFL_ASE_EVA)
13269     fputs ("\n\tEnhanced VA Scheme", stdout);
13270   if (mask & AFL_ASE_MCU)
13271     fputs ("\n\tMCU (MicroController) ASE", stdout);
13272   if (mask & AFL_ASE_MDMX)
13273     fputs ("\n\tMDMX ASE", stdout);
13274   if (mask & AFL_ASE_MIPS3D)
13275     fputs ("\n\tMIPS-3D ASE", stdout);
13276   if (mask & AFL_ASE_MT)
13277     fputs ("\n\tMT ASE", stdout);
13278   if (mask & AFL_ASE_SMARTMIPS)
13279     fputs ("\n\tSmartMIPS ASE", stdout);
13280   if (mask & AFL_ASE_VIRT)
13281     fputs ("\n\tVZ ASE", stdout);
13282   if (mask & AFL_ASE_MSA)
13283     fputs ("\n\tMSA ASE", stdout);
13284   if (mask & AFL_ASE_MIPS16)
13285     fputs ("\n\tMIPS16 ASE", stdout);
13286   if (mask & AFL_ASE_MICROMIPS)
13287     fputs ("\n\tMICROMIPS ASE", stdout);
13288   if (mask & AFL_ASE_XPA)
13289     fputs ("\n\tXPA ASE", stdout);
13290   if (mask == 0)
13291     fprintf (stdout, "\n\t%s", _("None"));
13292   else if ((mask & ~AFL_ASE_MASK) != 0)
13293     fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
13294 }
13295
13296 static void
13297 print_mips_isa_ext (unsigned int isa_ext)
13298 {
13299   switch (isa_ext)
13300     {
13301     case 0:
13302       fputs (_("None"), stdout);
13303       break;
13304     case AFL_EXT_XLR:
13305       fputs ("RMI XLR", stdout);
13306       break;
13307     case AFL_EXT_OCTEON3:
13308       fputs ("Cavium Networks Octeon3", stdout);
13309       break;
13310     case AFL_EXT_OCTEON2:
13311       fputs ("Cavium Networks Octeon2", stdout);
13312       break;
13313     case AFL_EXT_OCTEONP:
13314       fputs ("Cavium Networks OcteonP", stdout);
13315       break;
13316     case AFL_EXT_LOONGSON_3A:
13317       fputs ("Loongson 3A", stdout);
13318       break;
13319     case AFL_EXT_OCTEON:
13320       fputs ("Cavium Networks Octeon", stdout);
13321       break;
13322     case AFL_EXT_5900:
13323       fputs ("Toshiba R5900", stdout);
13324       break;
13325     case AFL_EXT_4650:
13326       fputs ("MIPS R4650", stdout);
13327       break;
13328     case AFL_EXT_4010:
13329       fputs ("LSI R4010", stdout);
13330       break;
13331     case AFL_EXT_4100:
13332       fputs ("NEC VR4100", stdout);
13333       break;
13334     case AFL_EXT_3900:
13335       fputs ("Toshiba R3900", stdout);
13336       break;
13337     case AFL_EXT_10000:
13338       fputs ("MIPS R10000", stdout);
13339       break;
13340     case AFL_EXT_SB1:
13341       fputs ("Broadcom SB-1", stdout);
13342       break;
13343     case AFL_EXT_4111:
13344       fputs ("NEC VR4111/VR4181", stdout);
13345       break;
13346     case AFL_EXT_4120:
13347       fputs ("NEC VR4120", stdout);
13348       break;
13349     case AFL_EXT_5400:
13350       fputs ("NEC VR5400", stdout);
13351       break;
13352     case AFL_EXT_5500:
13353       fputs ("NEC VR5500", stdout);
13354       break;
13355     case AFL_EXT_LOONGSON_2E:
13356       fputs ("ST Microelectronics Loongson 2E", stdout);
13357       break;
13358     case AFL_EXT_LOONGSON_2F:
13359       fputs ("ST Microelectronics Loongson 2F", stdout);
13360       break;
13361     default:
13362       fprintf (stdout, "%s (%d)", _("Unknown"), isa_ext);
13363     }
13364 }
13365
13366 static int
13367 get_mips_reg_size (int reg_size)
13368 {
13369   return (reg_size == AFL_REG_NONE) ? 0
13370          : (reg_size == AFL_REG_32) ? 32
13371          : (reg_size == AFL_REG_64) ? 64
13372          : (reg_size == AFL_REG_128) ? 128
13373          : -1;
13374 }
13375
13376 static int
13377 process_mips_specific (FILE * file)
13378 {
13379   Elf_Internal_Dyn * entry;
13380   Elf_Internal_Shdr *sect = NULL;
13381   size_t liblist_offset = 0;
13382   size_t liblistno = 0;
13383   size_t conflictsno = 0;
13384   size_t options_offset = 0;
13385   size_t conflicts_offset = 0;
13386   size_t pltrelsz = 0;
13387   size_t pltrel = 0;
13388   bfd_vma pltgot = 0;
13389   bfd_vma mips_pltgot = 0;
13390   bfd_vma jmprel = 0;
13391   bfd_vma local_gotno = 0;
13392   bfd_vma gotsym = 0;
13393   bfd_vma symtabno = 0;
13394
13395   process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
13396                       display_mips_gnu_attribute);
13397
13398   sect = find_section (".MIPS.abiflags");
13399
13400   if (sect != NULL)
13401     {
13402       Elf_External_ABIFlags_v0 *abiflags_ext;
13403       Elf_Internal_ABIFlags_v0 abiflags_in;
13404
13405       if (sizeof (Elf_External_ABIFlags_v0) != sect->sh_size)
13406         fputs ("\nCorrupt ABI Flags section.\n", stdout);
13407       else
13408         {
13409           abiflags_ext = get_data (NULL, file, sect->sh_offset, 1,
13410                                    sect->sh_size, _("MIPS ABI Flags section"));
13411           if (abiflags_ext)
13412             {
13413               abiflags_in.version = BYTE_GET (abiflags_ext->version);
13414               abiflags_in.isa_level = BYTE_GET (abiflags_ext->isa_level);
13415               abiflags_in.isa_rev = BYTE_GET (abiflags_ext->isa_rev);
13416               abiflags_in.gpr_size = BYTE_GET (abiflags_ext->gpr_size);
13417               abiflags_in.cpr1_size = BYTE_GET (abiflags_ext->cpr1_size);
13418               abiflags_in.cpr2_size = BYTE_GET (abiflags_ext->cpr2_size);
13419               abiflags_in.fp_abi = BYTE_GET (abiflags_ext->fp_abi);
13420               abiflags_in.isa_ext = BYTE_GET (abiflags_ext->isa_ext);
13421               abiflags_in.ases = BYTE_GET (abiflags_ext->ases);
13422               abiflags_in.flags1 = BYTE_GET (abiflags_ext->flags1);
13423               abiflags_in.flags2 = BYTE_GET (abiflags_ext->flags2);
13424
13425               printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in.version);
13426               printf ("\nISA: MIPS%d", abiflags_in.isa_level);
13427               if (abiflags_in.isa_rev > 1)
13428                 printf ("r%d", abiflags_in.isa_rev);
13429               printf ("\nGPR size: %d",
13430                       get_mips_reg_size (abiflags_in.gpr_size));
13431               printf ("\nCPR1 size: %d",
13432                       get_mips_reg_size (abiflags_in.cpr1_size));
13433               printf ("\nCPR2 size: %d",
13434                       get_mips_reg_size (abiflags_in.cpr2_size));
13435               fputs ("\nFP ABI: ", stdout);
13436               print_mips_fp_abi_value (abiflags_in.fp_abi);
13437               fputs ("ISA Extension: ", stdout);
13438               print_mips_isa_ext (abiflags_in.isa_ext);
13439               fputs ("\nASEs:", stdout);
13440               print_mips_ases (abiflags_in.ases);
13441               printf ("\nFLAGS 1: %8.8lx", abiflags_in.flags1);
13442               printf ("\nFLAGS 2: %8.8lx", abiflags_in.flags2);
13443               fputc ('\n', stdout);
13444               free (abiflags_ext);
13445             }
13446         }
13447     }
13448
13449   /* We have a lot of special sections.  Thanks SGI!  */
13450   if (dynamic_section == NULL)
13451     /* No information available.  */
13452     return 0;
13453
13454   for (entry = dynamic_section;
13455        /* PR 17531 file: 012-50589-0.004.  */
13456        entry < dynamic_section + dynamic_nent && entry->d_tag != DT_NULL;
13457        ++entry)
13458     switch (entry->d_tag)
13459       {
13460       case DT_MIPS_LIBLIST:
13461         liblist_offset
13462           = offset_from_vma (file, entry->d_un.d_val,
13463                              liblistno * sizeof (Elf32_External_Lib));
13464         break;
13465       case DT_MIPS_LIBLISTNO:
13466         liblistno = entry->d_un.d_val;
13467         break;
13468       case DT_MIPS_OPTIONS:
13469         options_offset = offset_from_vma (file, entry->d_un.d_val, 0);
13470         break;
13471       case DT_MIPS_CONFLICT:
13472         conflicts_offset
13473           = offset_from_vma (file, entry->d_un.d_val,
13474                              conflictsno * sizeof (Elf32_External_Conflict));
13475         break;
13476       case DT_MIPS_CONFLICTNO:
13477         conflictsno = entry->d_un.d_val;
13478         break;
13479       case DT_PLTGOT:
13480         pltgot = entry->d_un.d_ptr;
13481         break;
13482       case DT_MIPS_LOCAL_GOTNO:
13483         local_gotno = entry->d_un.d_val;
13484         break;
13485       case DT_MIPS_GOTSYM:
13486         gotsym = entry->d_un.d_val;
13487         break;
13488       case DT_MIPS_SYMTABNO:
13489         symtabno = entry->d_un.d_val;
13490         break;
13491       case DT_MIPS_PLTGOT:
13492         mips_pltgot = entry->d_un.d_ptr;
13493         break;
13494       case DT_PLTREL:
13495         pltrel = entry->d_un.d_val;
13496         break;
13497       case DT_PLTRELSZ:
13498         pltrelsz = entry->d_un.d_val;
13499         break;
13500       case DT_JMPREL:
13501         jmprel = entry->d_un.d_ptr;
13502         break;
13503       default:
13504         break;
13505       }
13506
13507   if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
13508     {
13509       Elf32_External_Lib * elib;
13510       size_t cnt;
13511
13512       elib = (Elf32_External_Lib *) get_data (NULL, file, liblist_offset,
13513                                               liblistno,
13514                                               sizeof (Elf32_External_Lib),
13515                                               _("liblist section data"));
13516       if (elib)
13517         {
13518           printf (_("\nSection '.liblist' contains %lu entries:\n"),
13519                   (unsigned long) liblistno);
13520           fputs (_("     Library              Time Stamp          Checksum   Version Flags\n"),
13521                  stdout);
13522
13523           for (cnt = 0; cnt < liblistno; ++cnt)
13524             {
13525               Elf32_Lib liblist;
13526               time_t atime;
13527               char timebuf[20];
13528               struct tm * tmp;
13529
13530               liblist.l_name = BYTE_GET (elib[cnt].l_name);
13531               atime = BYTE_GET (elib[cnt].l_time_stamp);
13532               liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
13533               liblist.l_version = BYTE_GET (elib[cnt].l_version);
13534               liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
13535
13536               tmp = gmtime (&atime);
13537               snprintf (timebuf, sizeof (timebuf),
13538                         "%04u-%02u-%02uT%02u:%02u:%02u",
13539                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
13540                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
13541
13542               printf ("%3lu: ", (unsigned long) cnt);
13543               if (VALID_DYNAMIC_NAME (liblist.l_name))
13544                 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
13545               else
13546                 printf (_("<corrupt: %9ld>"), liblist.l_name);
13547               printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
13548                       liblist.l_version);
13549
13550               if (liblist.l_flags == 0)
13551                 puts (_(" NONE"));
13552               else
13553                 {
13554                   static const struct
13555                   {
13556                     const char * name;
13557                     int bit;
13558                   }
13559                   l_flags_vals[] =
13560                   {
13561                     { " EXACT_MATCH", LL_EXACT_MATCH },
13562                     { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
13563                     { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
13564                     { " EXPORTS", LL_EXPORTS },
13565                     { " DELAY_LOAD", LL_DELAY_LOAD },
13566                     { " DELTA", LL_DELTA }
13567                   };
13568                   int flags = liblist.l_flags;
13569                   size_t fcnt;
13570
13571                   for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
13572                     if ((flags & l_flags_vals[fcnt].bit) != 0)
13573                       {
13574                         fputs (l_flags_vals[fcnt].name, stdout);
13575                         flags ^= l_flags_vals[fcnt].bit;
13576                       }
13577                   if (flags != 0)
13578                     printf (" %#x", (unsigned int) flags);
13579
13580                   puts ("");
13581                 }
13582             }
13583
13584           free (elib);
13585         }
13586     }
13587
13588   if (options_offset != 0)
13589     {
13590       Elf_External_Options * eopt;
13591       Elf_Internal_Options * iopt;
13592       Elf_Internal_Options * option;
13593       size_t offset;
13594       int cnt;
13595       sect = section_headers;
13596
13597       /* Find the section header so that we get the size.  */
13598       sect = find_section_by_type (SHT_MIPS_OPTIONS);
13599       /* PR 17533 file: 012-277276-0.004.  */ 
13600       if (sect == NULL)
13601         {
13602           error (_("No MIPS_OPTIONS header found\n"));
13603           return 0;
13604         }
13605
13606       eopt = (Elf_External_Options *) get_data (NULL, file, options_offset, 1,
13607                                                 sect->sh_size, _("options"));
13608       if (eopt)
13609         {
13610           iopt = (Elf_Internal_Options *)
13611               cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
13612           if (iopt == NULL)
13613             {
13614               error (_("Out of memory allocatinf space for MIPS options\n"));
13615               return 0;
13616             }
13617
13618           offset = cnt = 0;
13619           option = iopt;
13620
13621           while (offset < sect->sh_size)
13622             {
13623               Elf_External_Options * eoption;
13624
13625               eoption = (Elf_External_Options *) ((char *) eopt + offset);
13626
13627               option->kind = BYTE_GET (eoption->kind);
13628               option->size = BYTE_GET (eoption->size);
13629               option->section = BYTE_GET (eoption->section);
13630               option->info = BYTE_GET (eoption->info);
13631
13632               offset += option->size;
13633
13634               ++option;
13635               ++cnt;
13636             }
13637
13638           printf (_("\nSection '%s' contains %d entries:\n"),
13639                   printable_section_name (sect), cnt);
13640
13641           option = iopt;
13642
13643           while (cnt-- > 0)
13644             {
13645               size_t len;
13646
13647               switch (option->kind)
13648                 {
13649                 case ODK_NULL:
13650                   /* This shouldn't happen.  */
13651                   printf (" NULL       %d %lx", option->section, option->info);
13652                   break;
13653                 case ODK_REGINFO:
13654                   printf (" REGINFO    ");
13655                   if (elf_header.e_machine == EM_MIPS)
13656                     {
13657                       /* 32bit form.  */
13658                       Elf32_External_RegInfo * ereg;
13659                       Elf32_RegInfo reginfo;
13660
13661                       ereg = (Elf32_External_RegInfo *) (option + 1);
13662                       reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
13663                       reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
13664                       reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
13665                       reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
13666                       reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
13667                       reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
13668
13669                       printf ("GPR %08lx  GP 0x%lx\n",
13670                               reginfo.ri_gprmask,
13671                               (unsigned long) reginfo.ri_gp_value);
13672                       printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
13673                               reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
13674                               reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
13675                     }
13676                   else
13677                     {
13678                       /* 64 bit form.  */
13679                       Elf64_External_RegInfo * ereg;
13680                       Elf64_Internal_RegInfo reginfo;
13681
13682                       ereg = (Elf64_External_RegInfo *) (option + 1);
13683                       reginfo.ri_gprmask    = BYTE_GET (ereg->ri_gprmask);
13684                       reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
13685                       reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
13686                       reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
13687                       reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
13688                       reginfo.ri_gp_value   = BYTE_GET (ereg->ri_gp_value);
13689
13690                       printf ("GPR %08lx  GP 0x",
13691                               reginfo.ri_gprmask);
13692                       printf_vma (reginfo.ri_gp_value);
13693                       printf ("\n");
13694
13695                       printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
13696                               reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
13697                               reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
13698                     }
13699                   ++option;
13700                   continue;
13701                 case ODK_EXCEPTIONS:
13702                   fputs (" EXCEPTIONS fpe_min(", stdout);
13703                   process_mips_fpe_exception (option->info & OEX_FPU_MIN);
13704                   fputs (") fpe_max(", stdout);
13705                   process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
13706                   fputs (")", stdout);
13707
13708                   if (option->info & OEX_PAGE0)
13709                     fputs (" PAGE0", stdout);
13710                   if (option->info & OEX_SMM)
13711                     fputs (" SMM", stdout);
13712                   if (option->info & OEX_FPDBUG)
13713                     fputs (" FPDBUG", stdout);
13714                   if (option->info & OEX_DISMISS)
13715                     fputs (" DISMISS", stdout);
13716                   break;
13717                 case ODK_PAD:
13718                   fputs (" PAD       ", stdout);
13719                   if (option->info & OPAD_PREFIX)
13720                     fputs (" PREFIX", stdout);
13721                   if (option->info & OPAD_POSTFIX)
13722                     fputs (" POSTFIX", stdout);
13723                   if (option->info & OPAD_SYMBOL)
13724                     fputs (" SYMBOL", stdout);
13725                   break;
13726                 case ODK_HWPATCH:
13727                   fputs (" HWPATCH   ", stdout);
13728                   if (option->info & OHW_R4KEOP)
13729                     fputs (" R4KEOP", stdout);
13730                   if (option->info & OHW_R8KPFETCH)
13731                     fputs (" R8KPFETCH", stdout);
13732                   if (option->info & OHW_R5KEOP)
13733                     fputs (" R5KEOP", stdout);
13734                   if (option->info & OHW_R5KCVTL)
13735                     fputs (" R5KCVTL", stdout);
13736                   break;
13737                 case ODK_FILL:
13738                   fputs (" FILL       ", stdout);
13739                   /* XXX Print content of info word?  */
13740                   break;
13741                 case ODK_TAGS:
13742                   fputs (" TAGS       ", stdout);
13743                   /* XXX Print content of info word?  */
13744                   break;
13745                 case ODK_HWAND:
13746                   fputs (" HWAND     ", stdout);
13747                   if (option->info & OHWA0_R4KEOP_CHECKED)
13748                     fputs (" R4KEOP_CHECKED", stdout);
13749                   if (option->info & OHWA0_R4KEOP_CLEAN)
13750                     fputs (" R4KEOP_CLEAN", stdout);
13751                   break;
13752                 case ODK_HWOR:
13753                   fputs (" HWOR      ", stdout);
13754                   if (option->info & OHWA0_R4KEOP_CHECKED)
13755                     fputs (" R4KEOP_CHECKED", stdout);
13756                   if (option->info & OHWA0_R4KEOP_CLEAN)
13757                     fputs (" R4KEOP_CLEAN", stdout);
13758                   break;
13759                 case ODK_GP_GROUP:
13760                   printf (" GP_GROUP  %#06lx  self-contained %#06lx",
13761                           option->info & OGP_GROUP,
13762                           (option->info & OGP_SELF) >> 16);
13763                   break;
13764                 case ODK_IDENT:
13765                   printf (" IDENT     %#06lx  self-contained %#06lx",
13766                           option->info & OGP_GROUP,
13767                           (option->info & OGP_SELF) >> 16);
13768                   break;
13769                 default:
13770                   /* This shouldn't happen.  */
13771                   printf (" %3d ???     %d %lx",
13772                           option->kind, option->section, option->info);
13773                   break;
13774                 }
13775
13776               len = sizeof (* eopt);
13777               while (len < option->size)
13778                 if (((char *) option)[len] >= ' '
13779                     && ((char *) option)[len] < 0x7f)
13780                   printf ("%c", ((char *) option)[len++]);
13781                 else
13782                   printf ("\\%03o", ((char *) option)[len++]);
13783
13784               fputs ("\n", stdout);
13785               ++option;
13786             }
13787
13788           free (eopt);
13789         }
13790     }
13791
13792   if (conflicts_offset != 0 && conflictsno != 0)
13793     {
13794       Elf32_Conflict * iconf;
13795       size_t cnt;
13796
13797       if (dynamic_symbols == NULL)
13798         {
13799           error (_("conflict list found without a dynamic symbol table\n"));
13800           return 0;
13801         }
13802
13803       iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
13804       if (iconf == NULL)
13805         {
13806           error (_("Out of memory allocating space for dynamic conflicts\n"));
13807           return 0;
13808         }
13809
13810       if (is_32bit_elf)
13811         {
13812           Elf32_External_Conflict * econf32;
13813
13814           econf32 = (Elf32_External_Conflict *)
13815               get_data (NULL, file, conflicts_offset, conflictsno,
13816                         sizeof (* econf32), _("conflict"));
13817           if (!econf32)
13818             return 0;
13819
13820           for (cnt = 0; cnt < conflictsno; ++cnt)
13821             iconf[cnt] = BYTE_GET (econf32[cnt]);
13822
13823           free (econf32);
13824         }
13825       else
13826         {
13827           Elf64_External_Conflict * econf64;
13828
13829           econf64 = (Elf64_External_Conflict *)
13830               get_data (NULL, file, conflicts_offset, conflictsno,
13831                         sizeof (* econf64), _("conflict"));
13832           if (!econf64)
13833             return 0;
13834
13835           for (cnt = 0; cnt < conflictsno; ++cnt)
13836             iconf[cnt] = BYTE_GET (econf64[cnt]);
13837
13838           free (econf64);
13839         }
13840
13841       printf (_("\nSection '.conflict' contains %lu entries:\n"),
13842               (unsigned long) conflictsno);
13843       puts (_("  Num:    Index       Value  Name"));
13844
13845       for (cnt = 0; cnt < conflictsno; ++cnt)
13846         {
13847           printf ("%5lu: %8lu  ", (unsigned long) cnt, iconf[cnt]);
13848
13849           if (iconf[cnt] >= num_dynamic_syms)
13850             printf (_("<corrupt symbol index>"));
13851           else
13852             {
13853               Elf_Internal_Sym * psym;
13854
13855               psym = & dynamic_symbols[iconf[cnt]];
13856               print_vma (psym->st_value, FULL_HEX);
13857               putchar (' ');
13858               if (VALID_DYNAMIC_NAME (psym->st_name))
13859                 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
13860               else
13861                 printf (_("<corrupt: %14ld>"), psym->st_name);
13862             }
13863           putchar ('\n');
13864         }
13865
13866       free (iconf);
13867     }
13868
13869   if (pltgot != 0 && local_gotno != 0)
13870     {
13871       bfd_vma ent, local_end, global_end;
13872       size_t i, offset;
13873       unsigned char * data;
13874       int addr_size;
13875
13876       ent = pltgot;
13877       addr_size = (is_32bit_elf ? 4 : 8);
13878       local_end = pltgot + local_gotno * addr_size;
13879
13880       /* PR binutils/17533 file: 012-111227-0.004  */
13881       if (symtabno < gotsym)
13882         {
13883           error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
13884                  (long) gotsym, (long) symtabno);
13885           return 0;
13886         }
13887  
13888       global_end = local_end + (symtabno - gotsym) * addr_size;
13889       assert (global_end >= local_end);
13890       offset = offset_from_vma (file, pltgot, global_end - pltgot);
13891       data = (unsigned char *) get_data (NULL, file, offset,
13892                                          global_end - pltgot, 1,
13893                                          _("Global Offset Table data"));
13894       if (data == NULL)
13895         return 0;
13896
13897       printf (_("\nPrimary GOT:\n"));
13898       printf (_(" Canonical gp value: "));
13899       print_vma (pltgot + 0x7ff0, LONG_HEX);
13900       printf ("\n\n");
13901
13902       printf (_(" Reserved entries:\n"));
13903       printf (_("  %*s %10s %*s Purpose\n"),
13904               addr_size * 2, _("Address"), _("Access"),
13905               addr_size * 2, _("Initial"));
13906       ent = print_mips_got_entry (data, pltgot, ent);
13907       printf (_(" Lazy resolver\n"));
13908       if (data
13909           && (byte_get (data + ent - pltgot, addr_size)
13910               >> (addr_size * 8 - 1)) != 0)
13911         {
13912           ent = print_mips_got_entry (data, pltgot, ent);
13913           printf (_(" Module pointer (GNU extension)\n"));
13914         }
13915       printf ("\n");
13916
13917       if (ent < local_end)
13918         {
13919           printf (_(" Local entries:\n"));
13920           printf ("  %*s %10s %*s\n",
13921                   addr_size * 2, _("Address"), _("Access"),
13922                   addr_size * 2, _("Initial"));
13923           while (ent < local_end)
13924             {
13925               ent = print_mips_got_entry (data, pltgot, ent);
13926               printf ("\n");
13927             }
13928           printf ("\n");
13929         }
13930
13931       if (gotsym < symtabno)
13932         {
13933           int sym_width;
13934
13935           printf (_(" Global entries:\n"));
13936           printf ("  %*s %10s %*s %*s %-7s %3s %s\n",
13937                   addr_size * 2, _("Address"),
13938                   _("Access"),
13939                   addr_size * 2, _("Initial"),
13940                   addr_size * 2, _("Sym.Val."),
13941                   _("Type"),
13942                   /* Note for translators: "Ndx" = abbreviated form of "Index".  */
13943                   _("Ndx"), _("Name"));
13944
13945           sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
13946
13947           for (i = gotsym; i < symtabno; i++)
13948             {
13949               ent = print_mips_got_entry (data, pltgot, ent);
13950               printf (" ");
13951
13952               if (dynamic_symbols == NULL)
13953                 printf (_("<no dynamic symbols>"));
13954               else if (i < num_dynamic_syms)
13955                 {
13956                   Elf_Internal_Sym * psym = dynamic_symbols + i;
13957
13958                   print_vma (psym->st_value, LONG_HEX);
13959                   printf (" %-7s %3s ",
13960                           get_symbol_type (ELF_ST_TYPE (psym->st_info)),
13961                           get_symbol_index_type (psym->st_shndx));
13962
13963                   if (VALID_DYNAMIC_NAME (psym->st_name))
13964                     print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
13965                   else
13966                     printf (_("<corrupt: %14ld>"), psym->st_name);
13967                 }
13968               else
13969                 printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
13970                         (unsigned long) i);
13971
13972               printf ("\n");
13973             }
13974           printf ("\n");
13975         }
13976
13977       if (data)
13978         free (data);
13979     }
13980
13981   if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
13982     {
13983       bfd_vma ent, end;
13984       size_t offset, rel_offset;
13985       unsigned long count, i;
13986       unsigned char * data;
13987       int addr_size, sym_width;
13988       Elf_Internal_Rela * rels;
13989
13990       rel_offset = offset_from_vma (file, jmprel, pltrelsz);
13991       if (pltrel == DT_RELA)
13992         {
13993           if (!slurp_rela_relocs (file, rel_offset, pltrelsz, &rels, &count))
13994             return 0;
13995         }
13996       else
13997         {
13998           if (!slurp_rel_relocs (file, rel_offset, pltrelsz, &rels, &count))
13999             return 0;
14000         }
14001
14002       ent = mips_pltgot;
14003       addr_size = (is_32bit_elf ? 4 : 8);
14004       end = mips_pltgot + (2 + count) * addr_size;
14005
14006       offset = offset_from_vma (file, mips_pltgot, end - mips_pltgot);
14007       data = (unsigned char *) get_data (NULL, file, offset, end - mips_pltgot,
14008                                          1, _("Procedure Linkage Table data"));
14009       if (data == NULL)
14010         return 0;
14011
14012       printf ("\nPLT GOT:\n\n");
14013       printf (_(" Reserved entries:\n"));
14014       printf (_("  %*s %*s Purpose\n"),
14015               addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
14016       ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
14017       printf (_(" PLT lazy resolver\n"));
14018       ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
14019       printf (_(" Module pointer\n"));
14020       printf ("\n");
14021
14022       printf (_(" Entries:\n"));
14023       printf ("  %*s %*s %*s %-7s %3s %s\n",
14024               addr_size * 2, _("Address"),
14025               addr_size * 2, _("Initial"),
14026               addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
14027       sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
14028       for (i = 0; i < count; i++)
14029         {
14030           unsigned long idx = get_reloc_symindex (rels[i].r_info);
14031
14032           ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
14033           printf (" ");
14034
14035           if (idx >= num_dynamic_syms)
14036             printf (_("<corrupt symbol index: %lu>"), idx);
14037           else
14038             {
14039               Elf_Internal_Sym * psym = dynamic_symbols + idx;
14040
14041               print_vma (psym->st_value, LONG_HEX);
14042               printf (" %-7s %3s ",
14043                       get_symbol_type (ELF_ST_TYPE (psym->st_info)),
14044                       get_symbol_index_type (psym->st_shndx));
14045               if (VALID_DYNAMIC_NAME (psym->st_name))
14046                 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
14047               else
14048                 printf (_("<corrupt: %14ld>"), psym->st_name);
14049             }
14050           printf ("\n");
14051         }
14052       printf ("\n");
14053
14054       if (data)
14055         free (data);
14056       free (rels);
14057     }
14058
14059   return 1;
14060 }
14061
14062 static int
14063 process_nds32_specific (FILE * file)
14064 {
14065   Elf_Internal_Shdr *sect = NULL;
14066
14067   sect = find_section (".nds32_e_flags");
14068   if (sect != NULL)
14069     {
14070       unsigned int *flag;
14071
14072       printf ("\nNDS32 elf flags section:\n");
14073       flag = get_data (NULL, file, sect->sh_offset, 1,
14074                        sect->sh_size, _("NDS32 elf flags section"));
14075
14076       switch ((*flag) & 0x3)
14077         {
14078         case 0:
14079           printf ("(VEC_SIZE):\tNo entry.\n");
14080           break;
14081         case 1:
14082           printf ("(VEC_SIZE):\t4 bytes\n");
14083           break;
14084         case 2:
14085           printf ("(VEC_SIZE):\t16 bytes\n");
14086           break;
14087         case 3:
14088           printf ("(VEC_SIZE):\treserved\n");
14089           break;
14090         }
14091     }
14092
14093   return TRUE;
14094 }
14095
14096 static int
14097 process_gnu_liblist (FILE * file)
14098 {
14099   Elf_Internal_Shdr * section;
14100   Elf_Internal_Shdr * string_sec;
14101   Elf32_External_Lib * elib;
14102   char * strtab;
14103   size_t strtab_size;
14104   size_t cnt;
14105   unsigned i;
14106
14107   if (! do_arch)
14108     return 0;
14109
14110   for (i = 0, section = section_headers;
14111        i < elf_header.e_shnum;
14112        i++, section++)
14113     {
14114       switch (section->sh_type)
14115         {
14116         case SHT_GNU_LIBLIST:
14117           if (section->sh_link >= elf_header.e_shnum)
14118             break;
14119
14120           elib = (Elf32_External_Lib *)
14121               get_data (NULL, file, section->sh_offset, 1, section->sh_size,
14122                         _("liblist section data"));
14123
14124           if (elib == NULL)
14125             break;
14126           string_sec = section_headers + section->sh_link;
14127
14128           strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
14129                                       string_sec->sh_size,
14130                                       _("liblist string table"));
14131           if (strtab == NULL
14132               || section->sh_entsize != sizeof (Elf32_External_Lib))
14133             {
14134               free (elib);
14135               free (strtab);
14136               break;
14137             }
14138           strtab_size = string_sec->sh_size;
14139
14140           printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
14141                   printable_section_name (section),
14142                   (unsigned long) (section->sh_size / sizeof (Elf32_External_Lib)));
14143
14144           puts (_("     Library              Time Stamp          Checksum   Version Flags"));
14145
14146           for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
14147                ++cnt)
14148             {
14149               Elf32_Lib liblist;
14150               time_t atime;
14151               char timebuf[20];
14152               struct tm * tmp;
14153
14154               liblist.l_name = BYTE_GET (elib[cnt].l_name);
14155               atime = BYTE_GET (elib[cnt].l_time_stamp);
14156               liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
14157               liblist.l_version = BYTE_GET (elib[cnt].l_version);
14158               liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
14159
14160               tmp = gmtime (&atime);
14161               snprintf (timebuf, sizeof (timebuf),
14162                         "%04u-%02u-%02uT%02u:%02u:%02u",
14163                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
14164                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
14165
14166               printf ("%3lu: ", (unsigned long) cnt);
14167               if (do_wide)
14168                 printf ("%-20s", liblist.l_name < strtab_size
14169                         ? strtab + liblist.l_name : _("<corrupt>"));
14170               else
14171                 printf ("%-20.20s", liblist.l_name < strtab_size
14172                         ? strtab + liblist.l_name : _("<corrupt>"));
14173               printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
14174                       liblist.l_version, liblist.l_flags);
14175             }
14176
14177           free (elib);
14178           free (strtab);
14179         }
14180     }
14181
14182   return 1;
14183 }
14184
14185 static const char *
14186 get_note_type (unsigned e_type)
14187 {
14188   static char buff[64];
14189
14190   if (elf_header.e_type == ET_CORE)
14191     switch (e_type)
14192       {
14193       case NT_AUXV:
14194         return _("NT_AUXV (auxiliary vector)");
14195       case NT_PRSTATUS:
14196         return _("NT_PRSTATUS (prstatus structure)");
14197       case NT_FPREGSET:
14198         return _("NT_FPREGSET (floating point registers)");
14199       case NT_PRPSINFO:
14200         return _("NT_PRPSINFO (prpsinfo structure)");
14201       case NT_TASKSTRUCT:
14202         return _("NT_TASKSTRUCT (task structure)");
14203       case NT_PRXFPREG:
14204         return _("NT_PRXFPREG (user_xfpregs structure)");
14205       case NT_PPC_VMX:
14206         return _("NT_PPC_VMX (ppc Altivec registers)");
14207       case NT_PPC_VSX:
14208         return _("NT_PPC_VSX (ppc VSX registers)");
14209       case NT_386_TLS:
14210         return _("NT_386_TLS (x86 TLS information)");
14211       case NT_386_IOPERM:
14212         return _("NT_386_IOPERM (x86 I/O permissions)");
14213       case NT_X86_XSTATE:
14214         return _("NT_X86_XSTATE (x86 XSAVE extended state)");
14215       case NT_S390_HIGH_GPRS:
14216         return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
14217       case NT_S390_TIMER:
14218         return _("NT_S390_TIMER (s390 timer register)");
14219       case NT_S390_TODCMP:
14220         return _("NT_S390_TODCMP (s390 TOD comparator register)");
14221       case NT_S390_TODPREG:
14222         return _("NT_S390_TODPREG (s390 TOD programmable register)");
14223       case NT_S390_CTRS:
14224         return _("NT_S390_CTRS (s390 control registers)");
14225       case NT_S390_PREFIX:
14226         return _("NT_S390_PREFIX (s390 prefix register)");
14227       case NT_S390_LAST_BREAK:
14228         return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
14229       case NT_S390_SYSTEM_CALL:
14230         return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
14231       case NT_S390_TDB:
14232         return _("NT_S390_TDB (s390 transaction diagnostic block)");
14233       case NT_ARM_VFP:
14234         return _("NT_ARM_VFP (arm VFP registers)");
14235       case NT_ARM_TLS:
14236         return _("NT_ARM_TLS (AArch TLS registers)");
14237       case NT_ARM_HW_BREAK:
14238         return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
14239       case NT_ARM_HW_WATCH:
14240         return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
14241       case NT_PSTATUS:
14242         return _("NT_PSTATUS (pstatus structure)");
14243       case NT_FPREGS:
14244         return _("NT_FPREGS (floating point registers)");
14245       case NT_PSINFO:
14246         return _("NT_PSINFO (psinfo structure)");
14247       case NT_LWPSTATUS:
14248         return _("NT_LWPSTATUS (lwpstatus_t structure)");
14249       case NT_LWPSINFO:
14250         return _("NT_LWPSINFO (lwpsinfo_t structure)");
14251       case NT_WIN32PSTATUS:
14252         return _("NT_WIN32PSTATUS (win32_pstatus structure)");
14253       case NT_SIGINFO:
14254         return _("NT_SIGINFO (siginfo_t data)");
14255       case NT_FILE:
14256         return _("NT_FILE (mapped files)");
14257       default:
14258         break;
14259       }
14260   else
14261     switch (e_type)
14262       {
14263       case NT_VERSION:
14264         return _("NT_VERSION (version)");
14265       case NT_ARCH:
14266         return _("NT_ARCH (architecture)");
14267       default:
14268         break;
14269       }
14270
14271   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
14272   return buff;
14273 }
14274
14275 static int
14276 print_core_note (Elf_Internal_Note *pnote)
14277 {
14278   unsigned int addr_size = is_32bit_elf ? 4 : 8;
14279   bfd_vma count, page_size;
14280   unsigned char *descdata, *filenames, *descend;
14281
14282   if (pnote->type != NT_FILE)
14283     return 1;
14284
14285 #ifndef BFD64
14286   if (!is_32bit_elf)
14287     {
14288       printf (_("    Cannot decode 64-bit note in 32-bit build\n"));
14289       /* Still "successful".  */
14290       return 1;
14291     }
14292 #endif
14293
14294   if (pnote->descsz < 2 * addr_size)
14295     {
14296       printf (_("    Malformed note - too short for header\n"));
14297       return 0;
14298     }
14299
14300   descdata = (unsigned char *) pnote->descdata;
14301   descend = descdata + pnote->descsz;
14302
14303   if (descdata[pnote->descsz - 1] != '\0')
14304     {
14305       printf (_("    Malformed note - does not end with \\0\n"));
14306       return 0;
14307     }
14308
14309   count = byte_get (descdata, addr_size);
14310   descdata += addr_size;
14311
14312   page_size = byte_get (descdata, addr_size);
14313   descdata += addr_size;
14314
14315   if (pnote->descsz < 2 * addr_size + count * 3 * addr_size)
14316     {
14317       printf (_("    Malformed note - too short for supplied file count\n"));
14318       return 0;
14319     }
14320
14321   printf (_("    Page size: "));
14322   print_vma (page_size, DEC);
14323   printf ("\n");
14324
14325   printf (_("    %*s%*s%*s\n"),
14326           (int) (2 + 2 * addr_size), _("Start"),
14327           (int) (4 + 2 * addr_size), _("End"),
14328           (int) (4 + 2 * addr_size), _("Page Offset"));
14329   filenames = descdata + count * 3 * addr_size;
14330   while (--count > 0)
14331     {
14332       bfd_vma start, end, file_ofs;
14333
14334       if (filenames == descend)
14335         {
14336           printf (_("    Malformed note - filenames end too early\n"));
14337           return 0;
14338         }
14339
14340       start = byte_get (descdata, addr_size);
14341       descdata += addr_size;
14342       end = byte_get (descdata, addr_size);
14343       descdata += addr_size;
14344       file_ofs = byte_get (descdata, addr_size);
14345       descdata += addr_size;
14346
14347       printf ("    ");
14348       print_vma (start, FULL_HEX);
14349       printf ("  ");
14350       print_vma (end, FULL_HEX);
14351       printf ("  ");
14352       print_vma (file_ofs, FULL_HEX);
14353       printf ("\n        %s\n", filenames);
14354
14355       filenames += 1 + strlen ((char *) filenames);
14356     }
14357
14358   return 1;
14359 }
14360
14361 static const char *
14362 get_gnu_elf_note_type (unsigned e_type)
14363 {
14364   static char buff[64];
14365
14366   switch (e_type)
14367     {
14368     case NT_GNU_ABI_TAG:
14369       return _("NT_GNU_ABI_TAG (ABI version tag)");
14370     case NT_GNU_HWCAP:
14371       return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
14372     case NT_GNU_BUILD_ID:
14373       return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
14374     case NT_GNU_GOLD_VERSION:
14375       return _("NT_GNU_GOLD_VERSION (gold version)");
14376     default:
14377       break;
14378     }
14379
14380   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
14381   return buff;
14382 }
14383
14384 static int
14385 print_gnu_note (Elf_Internal_Note *pnote)
14386 {
14387   switch (pnote->type)
14388     {
14389     case NT_GNU_BUILD_ID:
14390       {
14391         unsigned long i;
14392
14393         printf (_("    Build ID: "));
14394         for (i = 0; i < pnote->descsz; ++i)
14395           printf ("%02x", pnote->descdata[i] & 0xff);
14396         printf ("\n");
14397       }
14398       break;
14399
14400     case NT_GNU_ABI_TAG:
14401       {
14402         unsigned long os, major, minor, subminor;
14403         const char *osname;
14404
14405         /* PR 17531: file: 030-599401-0.004.  */
14406         if (pnote->descsz < 16)
14407           {
14408             printf (_("    <corrupt GNU_ABI_TAG>\n"));
14409             break;
14410           }
14411
14412         os = byte_get ((unsigned char *) pnote->descdata, 4);
14413         major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
14414         minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
14415         subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
14416
14417         switch (os)
14418           {
14419           case GNU_ABI_TAG_LINUX:
14420             osname = "Linux";
14421             break;
14422           case GNU_ABI_TAG_HURD:
14423             osname = "Hurd";
14424             break;
14425           case GNU_ABI_TAG_SOLARIS:
14426             osname = "Solaris";
14427             break;
14428           case GNU_ABI_TAG_FREEBSD:
14429             osname = "FreeBSD";
14430             break;
14431           case GNU_ABI_TAG_NETBSD:
14432             osname = "NetBSD";
14433             break;
14434           default:
14435             osname = "Unknown";
14436             break;
14437           }
14438
14439         printf (_("    OS: %s, ABI: %ld.%ld.%ld\n"), osname,
14440                 major, minor, subminor);
14441       }
14442       break;
14443
14444     case NT_GNU_GOLD_VERSION:
14445       {
14446         unsigned long i;
14447
14448         printf (_("    Version: "));
14449         for (i = 0; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
14450           printf ("%c", pnote->descdata[i]);
14451         printf ("\n");
14452       }
14453       break;
14454     }
14455
14456   return 1;
14457 }
14458
14459 static const char *
14460 get_netbsd_elfcore_note_type (unsigned e_type)
14461 {
14462   static char buff[64];
14463
14464   if (e_type == NT_NETBSDCORE_PROCINFO)
14465     {
14466       /* NetBSD core "procinfo" structure.  */
14467       return _("NetBSD procinfo structure");
14468     }
14469
14470   /* As of Jan 2002 there are no other machine-independent notes
14471      defined for NetBSD core files.  If the note type is less
14472      than the start of the machine-dependent note types, we don't
14473      understand it.  */
14474
14475   if (e_type < NT_NETBSDCORE_FIRSTMACH)
14476     {
14477       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
14478       return buff;
14479     }
14480
14481   switch (elf_header.e_machine)
14482     {
14483     /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
14484        and PT_GETFPREGS == mach+2.  */
14485
14486     case EM_OLD_ALPHA:
14487     case EM_ALPHA:
14488     case EM_SPARC:
14489     case EM_SPARC32PLUS:
14490     case EM_SPARCV9:
14491       switch (e_type)
14492         {
14493         case NT_NETBSDCORE_FIRSTMACH + 0:
14494           return _("PT_GETREGS (reg structure)");
14495         case NT_NETBSDCORE_FIRSTMACH + 2:
14496           return _("PT_GETFPREGS (fpreg structure)");
14497         default:
14498           break;
14499         }
14500       break;
14501
14502     /* On all other arch's, PT_GETREGS == mach+1 and
14503        PT_GETFPREGS == mach+3.  */
14504     default:
14505       switch (e_type)
14506         {
14507         case NT_NETBSDCORE_FIRSTMACH + 1:
14508           return _("PT_GETREGS (reg structure)");
14509         case NT_NETBSDCORE_FIRSTMACH + 3:
14510           return _("PT_GETFPREGS (fpreg structure)");
14511         default:
14512           break;
14513         }
14514     }
14515
14516   snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
14517             e_type - NT_NETBSDCORE_FIRSTMACH);
14518   return buff;
14519 }
14520
14521 static const char *
14522 get_stapsdt_note_type (unsigned e_type)
14523 {
14524   static char buff[64];
14525
14526   switch (e_type)
14527     {
14528     case NT_STAPSDT:
14529       return _("NT_STAPSDT (SystemTap probe descriptors)");
14530
14531     default:
14532       break;
14533     }
14534
14535   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
14536   return buff;
14537 }
14538
14539 static int
14540 print_stapsdt_note (Elf_Internal_Note *pnote)
14541 {
14542   int addr_size = is_32bit_elf ? 4 : 8;
14543   char *data = pnote->descdata;
14544   char *data_end = pnote->descdata + pnote->descsz;
14545   bfd_vma pc, base_addr, semaphore;
14546   char *provider, *probe, *arg_fmt;
14547
14548   pc = byte_get ((unsigned char *) data, addr_size);
14549   data += addr_size;
14550   base_addr = byte_get ((unsigned char *) data, addr_size);
14551   data += addr_size;
14552   semaphore = byte_get ((unsigned char *) data, addr_size);
14553   data += addr_size;
14554
14555   provider = data;
14556   data += strlen (data) + 1;
14557   probe = data;
14558   data += strlen (data) + 1;
14559   arg_fmt = data;
14560   data += strlen (data) + 1;
14561
14562   printf (_("    Provider: %s\n"), provider);
14563   printf (_("    Name: %s\n"), probe);
14564   printf (_("    Location: "));
14565   print_vma (pc, FULL_HEX);
14566   printf (_(", Base: "));
14567   print_vma (base_addr, FULL_HEX);
14568   printf (_(", Semaphore: "));
14569   print_vma (semaphore, FULL_HEX);
14570   printf ("\n");
14571   printf (_("    Arguments: %s\n"), arg_fmt);
14572
14573   return data == data_end;
14574 }
14575
14576 static const char *
14577 get_ia64_vms_note_type (unsigned e_type)
14578 {
14579   static char buff[64];
14580
14581   switch (e_type)
14582     {
14583     case NT_VMS_MHD:
14584       return _("NT_VMS_MHD (module header)");
14585     case NT_VMS_LNM:
14586       return _("NT_VMS_LNM (language name)");
14587     case NT_VMS_SRC:
14588       return _("NT_VMS_SRC (source files)");
14589     case NT_VMS_TITLE:
14590       return "NT_VMS_TITLE";
14591     case NT_VMS_EIDC:
14592       return _("NT_VMS_EIDC (consistency check)");
14593     case NT_VMS_FPMODE:
14594       return _("NT_VMS_FPMODE (FP mode)");
14595     case NT_VMS_LINKTIME:
14596       return "NT_VMS_LINKTIME";
14597     case NT_VMS_IMGNAM:
14598       return _("NT_VMS_IMGNAM (image name)");
14599     case NT_VMS_IMGID:
14600       return _("NT_VMS_IMGID (image id)");
14601     case NT_VMS_LINKID:
14602       return _("NT_VMS_LINKID (link id)");
14603     case NT_VMS_IMGBID:
14604       return _("NT_VMS_IMGBID (build id)");
14605     case NT_VMS_GSTNAM:
14606       return _("NT_VMS_GSTNAM (sym table name)");
14607     case NT_VMS_ORIG_DYN:
14608       return "NT_VMS_ORIG_DYN";
14609     case NT_VMS_PATCHTIME:
14610       return "NT_VMS_PATCHTIME";
14611     default:
14612       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
14613       return buff;
14614     }
14615 }
14616
14617 static int
14618 print_ia64_vms_note (Elf_Internal_Note * pnote)
14619 {
14620   switch (pnote->type)
14621     {
14622     case NT_VMS_MHD:
14623       if (pnote->descsz > 36)
14624         {
14625           size_t l = strlen (pnote->descdata + 34);
14626           printf (_("    Creation date  : %.17s\n"), pnote->descdata);
14627           printf (_("    Last patch date: %.17s\n"), pnote->descdata + 17);
14628           printf (_("    Module name    : %s\n"), pnote->descdata + 34);
14629           printf (_("    Module version : %s\n"), pnote->descdata + 34 + l + 1);
14630         }
14631       else
14632         printf (_("    Invalid size\n"));
14633       break;
14634     case NT_VMS_LNM:
14635       printf (_("   Language: %s\n"), pnote->descdata);
14636       break;
14637 #ifdef BFD64
14638     case NT_VMS_FPMODE:
14639       printf (_("   Floating Point mode: "));
14640       printf ("0x%016" BFD_VMA_FMT "x\n",
14641               (bfd_vma)byte_get ((unsigned char *)pnote->descdata, 8));
14642       break;
14643     case NT_VMS_LINKTIME:
14644       printf (_("   Link time: "));
14645       print_vms_time
14646         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
14647       printf ("\n");
14648       break;
14649     case NT_VMS_PATCHTIME:
14650       printf (_("   Patch time: "));
14651       print_vms_time
14652         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
14653       printf ("\n");
14654       break;
14655     case NT_VMS_ORIG_DYN:
14656       printf (_("   Major id: %u,  minor id: %u\n"),
14657               (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
14658               (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
14659       printf (_("   Last modified  : "));
14660       print_vms_time
14661         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
14662       printf (_("\n   Link flags  : "));
14663       printf ("0x%016" BFD_VMA_FMT "x\n",
14664               (bfd_vma)byte_get ((unsigned char *)pnote->descdata + 16, 8));
14665       printf (_("   Header flags: 0x%08x\n"),
14666               (unsigned)byte_get ((unsigned char *)pnote->descdata + 24, 4));
14667       printf (_("   Image id    : %s\n"), pnote->descdata + 32);
14668       break;
14669 #endif
14670     case NT_VMS_IMGNAM:
14671       printf (_("    Image name: %s\n"), pnote->descdata);
14672       break;
14673     case NT_VMS_GSTNAM:
14674       printf (_("    Global symbol table name: %s\n"), pnote->descdata);
14675       break;
14676     case NT_VMS_IMGID:
14677       printf (_("    Image id: %s\n"), pnote->descdata);
14678       break;
14679     case NT_VMS_LINKID:
14680       printf (_("    Linker id: %s\n"), pnote->descdata);
14681       break;
14682     default:
14683       break;
14684     }
14685   return 1;
14686 }
14687
14688 /* Note that by the ELF standard, the name field is already null byte
14689    terminated, and namesz includes the terminating null byte.
14690    I.E. the value of namesz for the name "FSF" is 4.
14691
14692    If the value of namesz is zero, there is no name present.  */
14693 static int
14694 process_note (Elf_Internal_Note * pnote)
14695 {
14696   const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
14697   const char * nt;
14698
14699   if (pnote->namesz == 0)
14700     /* If there is no note name, then use the default set of
14701        note type strings.  */
14702     nt = get_note_type (pnote->type);
14703
14704   else if (const_strneq (pnote->namedata, "GNU"))
14705     /* GNU-specific object file notes.  */
14706     nt = get_gnu_elf_note_type (pnote->type);
14707
14708   else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
14709     /* NetBSD-specific core file notes.  */
14710     nt = get_netbsd_elfcore_note_type (pnote->type);
14711
14712   else if (strneq (pnote->namedata, "SPU/", 4))
14713     {
14714       /* SPU-specific core file notes.  */
14715       nt = pnote->namedata + 4;
14716       name = "SPU";
14717     }
14718
14719   else if (const_strneq (pnote->namedata, "IPF/VMS"))
14720     /* VMS/ia64-specific file notes.  */
14721     nt = get_ia64_vms_note_type (pnote->type);
14722
14723   else if (const_strneq (pnote->namedata, "stapsdt"))
14724     nt = get_stapsdt_note_type (pnote->type);
14725
14726   else
14727     /* Don't recognize this note name; just use the default set of
14728        note type strings.  */
14729     nt = get_note_type (pnote->type);
14730
14731   printf ("  %-20s 0x%08lx\t%s\n", name, pnote->descsz, nt);
14732
14733   if (const_strneq (pnote->namedata, "IPF/VMS"))
14734     return print_ia64_vms_note (pnote);
14735   else if (const_strneq (pnote->namedata, "GNU"))
14736     return print_gnu_note (pnote);
14737   else if (const_strneq (pnote->namedata, "stapsdt"))
14738     return print_stapsdt_note (pnote);
14739   else if (const_strneq (pnote->namedata, "CORE"))
14740     return print_core_note (pnote);
14741   else
14742     return 1;
14743 }
14744
14745
14746 static int
14747 process_corefile_note_segment (FILE * file, bfd_vma offset, bfd_vma length)
14748 {
14749   Elf_External_Note * pnotes;
14750   Elf_External_Note * external;
14751   int res = 1;
14752
14753   if (length <= 0)
14754     return 0;
14755
14756   pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
14757                                            _("notes"));
14758   if (pnotes == NULL)
14759     return 0;
14760
14761   external = pnotes;
14762
14763   printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
14764           (unsigned long) offset, (unsigned long) length);
14765   printf (_("  %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
14766
14767   while ((char *) external < (char *) pnotes + length)
14768     {
14769       Elf_Internal_Note inote;
14770       size_t min_notesz;
14771       char *next;
14772       char * temp = NULL;
14773       size_t data_remaining = ((char *) pnotes + length) - (char *) external;
14774
14775       if (!is_ia64_vms ())
14776         {
14777           /* PR binutils/15191
14778              Make sure that there is enough data to read.  */
14779           min_notesz = offsetof (Elf_External_Note, name);
14780           if (data_remaining < min_notesz)
14781             {
14782               warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
14783                     (int) data_remaining);
14784               break;
14785             }
14786           inote.type     = BYTE_GET (external->type);
14787           inote.namesz   = BYTE_GET (external->namesz);
14788           inote.namedata = external->name;
14789           inote.descsz   = BYTE_GET (external->descsz);
14790           inote.descdata = inote.namedata + align_power (inote.namesz, 2);
14791           inote.descpos  = offset + (inote.descdata - (char *) pnotes);
14792           next = inote.descdata + align_power (inote.descsz, 2);
14793         }
14794       else
14795         {
14796           Elf64_External_VMS_Note *vms_external;
14797
14798           /* PR binutils/15191
14799              Make sure that there is enough data to read.  */
14800           min_notesz = offsetof (Elf64_External_VMS_Note, name);
14801           if (data_remaining < min_notesz)
14802             {
14803               warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
14804                     (int) data_remaining);
14805               break;
14806             }
14807
14808           vms_external = (Elf64_External_VMS_Note *) external;
14809           inote.type     = BYTE_GET (vms_external->type);
14810           inote.namesz   = BYTE_GET (vms_external->namesz);
14811           inote.namedata = vms_external->name;
14812           inote.descsz   = BYTE_GET (vms_external->descsz);
14813           inote.descdata = inote.namedata + align_power (inote.namesz, 3);
14814           inote.descpos  = offset + (inote.descdata - (char *) pnotes);
14815           next = inote.descdata + align_power (inote.descsz, 3);
14816         }
14817
14818       if (inote.descdata < (char *) external + min_notesz
14819           || next < (char *) external + min_notesz
14820           /* PR binutils/17531: file: id:000000,sig:11,src:006986,op:havoc,rep:4.  */
14821           || inote.namedata + inote.namesz < inote.namedata
14822           || inote.descdata + inote.descsz < inote.descdata
14823           || data_remaining < (size_t)(next - (char *) external))
14824         {
14825           warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
14826                 (unsigned long) ((char *) external - (char *) pnotes));
14827           warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx\n"),
14828                 inote.type, inote.namesz, inote.descsz);
14829           break;
14830         }
14831
14832       external = (Elf_External_Note *) next;
14833
14834       /* Verify that name is null terminated.  It appears that at least
14835          one version of Linux (RedHat 6.0) generates corefiles that don't
14836          comply with the ELF spec by failing to include the null byte in
14837          namesz.  */
14838       if (inote.namedata[inote.namesz - 1] != '\0')
14839         {
14840           temp = (char *) malloc (inote.namesz + 1);
14841           if (temp == NULL)
14842             {
14843               error (_("Out of memory allocating space for inote name\n"));
14844               res = 0;
14845               break;
14846             }
14847
14848           strncpy (temp, inote.namedata, inote.namesz);
14849           temp[inote.namesz] = 0;
14850
14851           /* warn (_("'%s' NOTE name not properly null terminated\n"), temp);  */
14852           inote.namedata = temp;
14853         }
14854
14855       res &= process_note (& inote);
14856
14857       if (temp != NULL)
14858         {
14859           free (temp);
14860           temp = NULL;
14861         }
14862     }
14863
14864   free (pnotes);
14865
14866   return res;
14867 }
14868
14869 static int
14870 process_corefile_note_segments (FILE * file)
14871 {
14872   Elf_Internal_Phdr * segment;
14873   unsigned int i;
14874   int res = 1;
14875
14876   if (! get_program_headers (file))
14877       return 0;
14878
14879   for (i = 0, segment = program_headers;
14880        i < elf_header.e_phnum;
14881        i++, segment++)
14882     {
14883       if (segment->p_type == PT_NOTE)
14884         res &= process_corefile_note_segment (file,
14885                                               (bfd_vma) segment->p_offset,
14886                                               (bfd_vma) segment->p_filesz);
14887     }
14888
14889   return res;
14890 }
14891
14892 static int
14893 process_note_sections (FILE * file)
14894 {
14895   Elf_Internal_Shdr * section;
14896   unsigned long i;
14897   int n = 0;
14898   int res = 1;
14899
14900   for (i = 0, section = section_headers;
14901        i < elf_header.e_shnum && section != NULL;
14902        i++, section++)
14903     if (section->sh_type == SHT_NOTE)
14904       {
14905         res &= process_corefile_note_segment (file,
14906                                               (bfd_vma) section->sh_offset,
14907                                               (bfd_vma) section->sh_size);
14908         n++;
14909       }
14910
14911   if (n == 0)
14912     /* Try processing NOTE segments instead.  */
14913     return process_corefile_note_segments (file);
14914
14915   return res;
14916 }
14917
14918 static int
14919 process_notes (FILE * file)
14920 {
14921   /* If we have not been asked to display the notes then do nothing.  */
14922   if (! do_notes)
14923     return 1;
14924
14925   if (elf_header.e_type != ET_CORE)
14926     return process_note_sections (file);
14927
14928   /* No program headers means no NOTE segment.  */
14929   if (elf_header.e_phnum > 0)
14930     return process_corefile_note_segments (file);
14931
14932   printf (_("No note segments present in the core file.\n"));
14933   return 1;
14934 }
14935
14936 static int
14937 process_arch_specific (FILE * file)
14938 {
14939   if (! do_arch)
14940     return 1;
14941
14942   switch (elf_header.e_machine)
14943     {
14944     case EM_ARM:
14945       return process_arm_specific (file);
14946     case EM_MIPS:
14947     case EM_MIPS_RS3_LE:
14948       return process_mips_specific (file);
14949       break;
14950     case EM_NDS32:
14951       return process_nds32_specific (file);
14952       break;
14953     case EM_PPC:
14954       return process_power_specific (file);
14955       break;
14956     case EM_SPARC:
14957     case EM_SPARC32PLUS:
14958     case EM_SPARCV9:
14959       return process_sparc_specific (file);
14960       break;
14961     case EM_TI_C6000:
14962       return process_tic6x_specific (file);
14963       break;
14964     case EM_MSP430:
14965       return process_msp430x_specific (file);
14966     default:
14967       break;
14968     }
14969   return 1;
14970 }
14971
14972 static int
14973 get_file_header (FILE * file)
14974 {
14975   /* Read in the identity array.  */
14976   if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
14977     return 0;
14978
14979   /* Determine how to read the rest of the header.  */
14980   switch (elf_header.e_ident[EI_DATA])
14981     {
14982     default: /* fall through */
14983     case ELFDATANONE: /* fall through */
14984     case ELFDATA2LSB:
14985       byte_get = byte_get_little_endian;
14986       byte_put = byte_put_little_endian;
14987       break;
14988     case ELFDATA2MSB:
14989       byte_get = byte_get_big_endian;
14990       byte_put = byte_put_big_endian;
14991       break;
14992     }
14993
14994   /* For now we only support 32 bit and 64 bit ELF files.  */
14995   is_32bit_elf = (elf_header.e_ident[EI_CLASS] != ELFCLASS64);
14996
14997   /* Read in the rest of the header.  */
14998   if (is_32bit_elf)
14999     {
15000       Elf32_External_Ehdr ehdr32;
15001
15002       if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
15003         return 0;
15004
15005       elf_header.e_type      = BYTE_GET (ehdr32.e_type);
15006       elf_header.e_machine   = BYTE_GET (ehdr32.e_machine);
15007       elf_header.e_version   = BYTE_GET (ehdr32.e_version);
15008       elf_header.e_entry     = BYTE_GET (ehdr32.e_entry);
15009       elf_header.e_phoff     = BYTE_GET (ehdr32.e_phoff);
15010       elf_header.e_shoff     = BYTE_GET (ehdr32.e_shoff);
15011       elf_header.e_flags     = BYTE_GET (ehdr32.e_flags);
15012       elf_header.e_ehsize    = BYTE_GET (ehdr32.e_ehsize);
15013       elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
15014       elf_header.e_phnum     = BYTE_GET (ehdr32.e_phnum);
15015       elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
15016       elf_header.e_shnum     = BYTE_GET (ehdr32.e_shnum);
15017       elf_header.e_shstrndx  = BYTE_GET (ehdr32.e_shstrndx);
15018     }
15019   else
15020     {
15021       Elf64_External_Ehdr ehdr64;
15022
15023       /* If we have been compiled with sizeof (bfd_vma) == 4, then
15024          we will not be able to cope with the 64bit data found in
15025          64 ELF files.  Detect this now and abort before we start
15026          overwriting things.  */
15027       if (sizeof (bfd_vma) < 8)
15028         {
15029           error (_("This instance of readelf has been built without support for a\n\
15030 64 bit data type and so it cannot read 64 bit ELF files.\n"));
15031           return 0;
15032         }
15033
15034       if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
15035         return 0;
15036
15037       elf_header.e_type      = BYTE_GET (ehdr64.e_type);
15038       elf_header.e_machine   = BYTE_GET (ehdr64.e_machine);
15039       elf_header.e_version   = BYTE_GET (ehdr64.e_version);
15040       elf_header.e_entry     = BYTE_GET (ehdr64.e_entry);
15041       elf_header.e_phoff     = BYTE_GET (ehdr64.e_phoff);
15042       elf_header.e_shoff     = BYTE_GET (ehdr64.e_shoff);
15043       elf_header.e_flags     = BYTE_GET (ehdr64.e_flags);
15044       elf_header.e_ehsize    = BYTE_GET (ehdr64.e_ehsize);
15045       elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
15046       elf_header.e_phnum     = BYTE_GET (ehdr64.e_phnum);
15047       elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
15048       elf_header.e_shnum     = BYTE_GET (ehdr64.e_shnum);
15049       elf_header.e_shstrndx  = BYTE_GET (ehdr64.e_shstrndx);
15050     }
15051
15052   if (elf_header.e_shoff)
15053     {
15054       /* There may be some extensions in the first section header.  Don't
15055          bomb if we can't read it.  */
15056       if (is_32bit_elf)
15057         get_32bit_section_headers (file, TRUE);
15058       else
15059         get_64bit_section_headers (file, TRUE);
15060     }
15061
15062   return 1;
15063 }
15064
15065 /* Process one ELF object file according to the command line options.
15066    This file may actually be stored in an archive.  The file is
15067    positioned at the start of the ELF object.  */
15068
15069 static int
15070 process_object (char * file_name, FILE * file)
15071 {
15072   unsigned int i;
15073
15074   if (! get_file_header (file))
15075     {
15076       error (_("%s: Failed to read file header\n"), file_name);
15077       return 1;
15078     }
15079
15080   /* Initialise per file variables.  */
15081   for (i = ARRAY_SIZE (version_info); i--;)
15082     version_info[i] = 0;
15083
15084   for (i = ARRAY_SIZE (dynamic_info); i--;)
15085     dynamic_info[i] = 0;
15086   dynamic_info_DT_GNU_HASH = 0;
15087
15088   /* Process the file.  */
15089   if (show_name)
15090     printf (_("\nFile: %s\n"), file_name);
15091
15092   /* Initialise the dump_sects array from the cmdline_dump_sects array.
15093      Note we do this even if cmdline_dump_sects is empty because we
15094      must make sure that the dump_sets array is zeroed out before each
15095      object file is processed.  */
15096   if (num_dump_sects > num_cmdline_dump_sects)
15097     memset (dump_sects, 0, num_dump_sects * sizeof (* dump_sects));
15098
15099   if (num_cmdline_dump_sects > 0)
15100     {
15101       if (num_dump_sects == 0)
15102         /* A sneaky way of allocating the dump_sects array.  */
15103         request_dump_bynumber (num_cmdline_dump_sects, 0);
15104
15105       assert (num_dump_sects >= num_cmdline_dump_sects);
15106       memcpy (dump_sects, cmdline_dump_sects,
15107               num_cmdline_dump_sects * sizeof (* dump_sects));
15108     }
15109
15110   if (! process_file_header ())
15111     return 1;
15112
15113   if (! process_section_headers (file))
15114     {
15115       /* Without loaded section headers we cannot process lots of
15116          things.  */
15117       do_unwind = do_version = do_dump = do_arch = 0;
15118
15119       if (! do_using_dynamic)
15120         do_syms = do_dyn_syms = do_reloc = 0;
15121     }
15122
15123   if (! process_section_groups (file))
15124     {
15125       /* Without loaded section groups we cannot process unwind.  */
15126       do_unwind = 0;
15127     }
15128
15129   if (process_program_headers (file))
15130     process_dynamic_section (file);
15131
15132   process_relocs (file);
15133
15134   process_unwind (file);
15135
15136   process_symbol_table (file);
15137
15138   process_syminfo (file);
15139
15140   process_version_sections (file);
15141
15142   process_section_contents (file);
15143
15144   process_notes (file);
15145
15146   process_gnu_liblist (file);
15147
15148   process_arch_specific (file);
15149
15150   if (program_headers)
15151     {
15152       free (program_headers);
15153       program_headers = NULL;
15154     }
15155
15156   if (section_headers)
15157     {
15158       free (section_headers);
15159       section_headers = NULL;
15160     }
15161
15162   if (string_table)
15163     {
15164       free (string_table);
15165       string_table = NULL;
15166       string_table_length = 0;
15167     }
15168
15169   if (dynamic_strings)
15170     {
15171       free (dynamic_strings);
15172       dynamic_strings = NULL;
15173       dynamic_strings_length = 0;
15174     }
15175
15176   if (dynamic_symbols)
15177     {
15178       free (dynamic_symbols);
15179       dynamic_symbols = NULL;
15180       num_dynamic_syms = 0;
15181     }
15182
15183   if (dynamic_syminfo)
15184     {
15185       free (dynamic_syminfo);
15186       dynamic_syminfo = NULL;
15187     }
15188
15189   if (dynamic_section)
15190     {
15191       free (dynamic_section);
15192       dynamic_section = NULL;
15193     }
15194
15195   if (section_headers_groups)
15196     {
15197       free (section_headers_groups);
15198       section_headers_groups = NULL;
15199     }
15200
15201   if (section_groups)
15202     {
15203       struct group_list * g;
15204       struct group_list * next;
15205
15206       for (i = 0; i < group_count; i++)
15207         {
15208           for (g = section_groups [i].root; g != NULL; g = next)
15209             {
15210               next = g->next;
15211               free (g);
15212             }
15213         }
15214
15215       free (section_groups);
15216       section_groups = NULL;
15217     }
15218
15219   free_debug_memory ();
15220
15221   return 0;
15222 }
15223
15224 /* Process an ELF archive.
15225    On entry the file is positioned just after the ARMAG string.  */
15226
15227 static int
15228 process_archive (char * file_name, FILE * file, bfd_boolean is_thin_archive)
15229 {
15230   struct archive_info arch;
15231   struct archive_info nested_arch;
15232   size_t got;
15233   int ret;
15234
15235   show_name = 1;
15236
15237   /* The ARCH structure is used to hold information about this archive.  */
15238   arch.file_name = NULL;
15239   arch.file = NULL;
15240   arch.index_array = NULL;
15241   arch.sym_table = NULL;
15242   arch.longnames = NULL;
15243
15244   /* The NESTED_ARCH structure is used as a single-item cache of information
15245      about a nested archive (when members of a thin archive reside within
15246      another regular archive file).  */
15247   nested_arch.file_name = NULL;
15248   nested_arch.file = NULL;
15249   nested_arch.index_array = NULL;
15250   nested_arch.sym_table = NULL;
15251   nested_arch.longnames = NULL;
15252
15253   if (setup_archive (&arch, file_name, file, is_thin_archive, do_archive_index) != 0)
15254     {
15255       ret = 1;
15256       goto out;
15257     }
15258
15259   if (do_archive_index)
15260     {
15261       if (arch.sym_table == NULL)
15262         error (_("%s: unable to dump the index as none was found\n"), file_name);
15263       else
15264         {
15265           unsigned long i, l;
15266           unsigned long current_pos;
15267
15268           printf (_("Index of archive %s: (%lu entries, 0x%lx bytes in the symbol table)\n"),
15269                   file_name, (unsigned long) arch.index_num, arch.sym_size);
15270           current_pos = ftell (file);
15271
15272           for (i = l = 0; i < arch.index_num; i++)
15273             {
15274               if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
15275                 {
15276                   char * member_name;
15277
15278                   member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
15279
15280                   if (member_name != NULL)
15281                     {
15282                       char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
15283
15284                       if (qualified_name != NULL)
15285                         {
15286                           printf (_("Contents of binary %s at offset "), qualified_name);
15287                           (void) print_vma (arch.index_array[i], PREFIX_HEX);
15288                           putchar ('\n');
15289                           free (qualified_name);
15290                         }
15291                     }
15292                 }
15293
15294               if (l >= arch.sym_size)
15295                 {
15296                   error (_("%s: end of the symbol table reached before the end of the index\n"),
15297                          file_name);
15298                   break;
15299                 }
15300               /* PR 17531: file: 0b6630b2.  */
15301               printf ("\t%.*s\n", (int) (arch.sym_size - l), arch.sym_table + l);
15302               l += strnlen (arch.sym_table + l, arch.sym_size - l) + 1;
15303             }
15304
15305           if (arch.uses_64bit_indicies)
15306             l = (l + 7) & ~ 7;
15307           else
15308             l += l & 1;
15309
15310           if (l < arch.sym_size)
15311             error (_("%s: %ld bytes remain in the symbol table, but without corresponding entries in the index table\n"),
15312                    file_name, arch.sym_size - l);
15313
15314           if (fseek (file, current_pos, SEEK_SET) != 0)
15315             {
15316               error (_("%s: failed to seek back to start of object files in the archive\n"), file_name);
15317               ret = 1;
15318               goto out;
15319             }
15320         }
15321
15322       if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
15323           && !do_segments && !do_header && !do_dump && !do_version
15324           && !do_histogram && !do_debugging && !do_arch && !do_notes
15325           && !do_section_groups && !do_dyn_syms)
15326         {
15327           ret = 0; /* Archive index only.  */
15328           goto out;
15329         }
15330     }
15331
15332   ret = 0;
15333
15334   while (1)
15335     {
15336       char * name;
15337       size_t namelen;
15338       char * qualified_name;
15339
15340       /* Read the next archive header.  */
15341       if (fseek (file, arch.next_arhdr_offset, SEEK_SET) != 0)
15342         {
15343           error (_("%s: failed to seek to next archive header\n"), file_name);
15344           return 1;
15345         }
15346       got = fread (&arch.arhdr, 1, sizeof arch.arhdr, file);
15347       if (got != sizeof arch.arhdr)
15348         {
15349           if (got == 0)
15350             break;
15351           error (_("%s: failed to read archive header\n"), file_name);
15352           ret = 1;
15353           break;
15354         }
15355       if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
15356         {
15357           error (_("%s: did not find a valid archive header\n"), arch.file_name);
15358           ret = 1;
15359           break;
15360         }
15361
15362       arch.next_arhdr_offset += sizeof arch.arhdr;
15363
15364       archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
15365       if (archive_file_size & 01)
15366         ++archive_file_size;
15367
15368       name = get_archive_member_name (&arch, &nested_arch);
15369       if (name == NULL)
15370         {
15371           error (_("%s: bad archive file name\n"), file_name);
15372           ret = 1;
15373           break;
15374         }
15375       namelen = strlen (name);
15376
15377       qualified_name = make_qualified_name (&arch, &nested_arch, name);
15378       if (qualified_name == NULL)
15379         {
15380           error (_("%s: bad archive file name\n"), file_name);
15381           ret = 1;
15382           break;
15383         }
15384
15385       if (is_thin_archive && arch.nested_member_origin == 0)
15386         {
15387           /* This is a proxy for an external member of a thin archive.  */
15388           FILE * member_file;
15389           char * member_file_name = adjust_relative_path (file_name, name, namelen);
15390           if (member_file_name == NULL)
15391             {
15392               ret = 1;
15393               break;
15394             }
15395
15396           member_file = fopen (member_file_name, "rb");
15397           if (member_file == NULL)
15398             {
15399               error (_("Input file '%s' is not readable.\n"), member_file_name);
15400               free (member_file_name);
15401               ret = 1;
15402               break;
15403             }
15404
15405           archive_file_offset = arch.nested_member_origin;
15406
15407           ret |= process_object (qualified_name, member_file);
15408
15409           fclose (member_file);
15410           free (member_file_name);
15411         }
15412       else if (is_thin_archive)
15413         {
15414           /* PR 15140: Allow for corrupt thin archives.  */
15415           if (nested_arch.file == NULL)
15416             {
15417               error (_("%s: contains corrupt thin archive: %s\n"),
15418                      file_name, name);
15419               ret = 1;
15420               break;
15421             }
15422
15423           /* This is a proxy for a member of a nested archive.  */
15424           archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
15425
15426           /* The nested archive file will have been opened and setup by
15427              get_archive_member_name.  */
15428           if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
15429             {
15430               error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
15431               ret = 1;
15432               break;
15433             }
15434
15435           ret |= process_object (qualified_name, nested_arch.file);
15436         }
15437       else
15438         {
15439           archive_file_offset = arch.next_arhdr_offset;
15440           arch.next_arhdr_offset += archive_file_size;
15441
15442           ret |= process_object (qualified_name, file);
15443         }
15444
15445       if (dump_sects != NULL)
15446         {
15447           free (dump_sects);
15448           dump_sects = NULL;
15449           num_dump_sects = 0;
15450         }
15451
15452       free (qualified_name);
15453     }
15454
15455  out:
15456   if (nested_arch.file != NULL)
15457     fclose (nested_arch.file);
15458   release_archive (&nested_arch);
15459   release_archive (&arch);
15460
15461   return ret;
15462 }
15463
15464 static int
15465 process_file (char * file_name)
15466 {
15467   FILE * file;
15468   struct stat statbuf;
15469   char armag[SARMAG];
15470   int ret;
15471
15472   if (stat (file_name, &statbuf) < 0)
15473     {
15474       if (errno == ENOENT)
15475         error (_("'%s': No such file\n"), file_name);
15476       else
15477         error (_("Could not locate '%s'.  System error message: %s\n"),
15478                file_name, strerror (errno));
15479       return 1;
15480     }
15481
15482   if (! S_ISREG (statbuf.st_mode))
15483     {
15484       error (_("'%s' is not an ordinary file\n"), file_name);
15485       return 1;
15486     }
15487
15488   file = fopen (file_name, "rb");
15489   if (file == NULL)
15490     {
15491       error (_("Input file '%s' is not readable.\n"), file_name);
15492       return 1;
15493     }
15494
15495   if (fread (armag, SARMAG, 1, file) != 1)
15496     {
15497       error (_("%s: Failed to read file's magic number\n"), file_name);
15498       fclose (file);
15499       return 1;
15500     }
15501
15502   current_file_size = (bfd_size_type) statbuf.st_size;
15503
15504   if (memcmp (armag, ARMAG, SARMAG) == 0)
15505     ret = process_archive (file_name, file, FALSE);
15506   else if (memcmp (armag, ARMAGT, SARMAG) == 0)
15507     ret = process_archive (file_name, file, TRUE);
15508   else
15509     {
15510       if (do_archive_index)
15511         error (_("File %s is not an archive so its index cannot be displayed.\n"),
15512                file_name);
15513
15514       rewind (file);
15515       archive_file_size = archive_file_offset = 0;
15516       ret = process_object (file_name, file);
15517     }
15518
15519   fclose (file);
15520
15521   current_file_size = 0;
15522   return ret;
15523 }
15524
15525 #ifdef SUPPORT_DISASSEMBLY
15526 /* Needed by the i386 disassembler.  For extra credit, someone could
15527    fix this so that we insert symbolic addresses here, esp for GOT/PLT
15528    symbols.  */
15529
15530 void
15531 print_address (unsigned int addr, FILE * outfile)
15532 {
15533   fprintf (outfile,"0x%8.8x", addr);
15534 }
15535
15536 /* Needed by the i386 disassembler.  */
15537 void
15538 db_task_printsym (unsigned int addr)
15539 {
15540   print_address (addr, stderr);
15541 }
15542 #endif
15543
15544 int
15545 main (int argc, char ** argv)
15546 {
15547   int err;
15548
15549 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
15550   setlocale (LC_MESSAGES, "");
15551 #endif
15552 #if defined (HAVE_SETLOCALE)
15553   setlocale (LC_CTYPE, "");
15554 #endif
15555   bindtextdomain (PACKAGE, LOCALEDIR);
15556   textdomain (PACKAGE);
15557
15558   expandargv (&argc, &argv);
15559
15560   parse_args (argc, argv);
15561
15562   if (num_dump_sects > 0)
15563     {
15564       /* Make a copy of the dump_sects array.  */
15565       cmdline_dump_sects = (dump_type *)
15566           malloc (num_dump_sects * sizeof (* dump_sects));
15567       if (cmdline_dump_sects == NULL)
15568         error (_("Out of memory allocating dump request table.\n"));
15569       else
15570         {
15571           memcpy (cmdline_dump_sects, dump_sects,
15572                   num_dump_sects * sizeof (* dump_sects));
15573           num_cmdline_dump_sects = num_dump_sects;
15574         }
15575     }
15576
15577   if (optind < (argc - 1))
15578     show_name = 1;
15579
15580   err = 0;
15581   while (optind < argc)
15582     err |= process_file (argv[optind++]);
15583
15584   if (dump_sects != NULL)
15585     free (dump_sects);
15586   if (cmdline_dump_sects != NULL)
15587     free (cmdline_dump_sects);
15588
15589   return err;
15590 }