6dd3a4c48f87f72c3d9bb244d3a9e362c8aecc72
[external/binutils.git] / binutils / readelf.c
1 /* readelf.c -- display contents of an ELF format file
2    Copyright (C) 1998-2015 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/visium.h"
153 #include "elf/x86-64.h"
154 #include "elf/xc16x.h"
155 #include "elf/xgate.h"
156 #include "elf/xstormy16.h"
157 #include "elf/xtensa.h"
158
159 #include "getopt.h"
160 #include "libiberty.h"
161 #include "safe-ctype.h"
162 #include "filenames.h"
163
164 #ifndef offsetof
165 #define offsetof(TYPE, MEMBER) ((size_t) &(((TYPE *) 0)->MEMBER))
166 #endif
167
168 char * program_name = "readelf";
169 static unsigned long archive_file_offset;
170 static unsigned long archive_file_size;
171 static bfd_size_type current_file_size;
172 static unsigned long dynamic_addr;
173 static bfd_size_type dynamic_size;
174 static size_t dynamic_nent;
175 static char * dynamic_strings;
176 static unsigned long dynamic_strings_length;
177 static char * string_table;
178 static unsigned long string_table_length;
179 static unsigned long num_dynamic_syms;
180 static Elf_Internal_Sym * dynamic_symbols;
181 static Elf_Internal_Syminfo * dynamic_syminfo;
182 static unsigned long dynamic_syminfo_offset;
183 static unsigned int dynamic_syminfo_nent;
184 static char program_interpreter[PATH_MAX];
185 static bfd_vma dynamic_info[DT_ENCODING];
186 static bfd_vma dynamic_info_DT_GNU_HASH;
187 static bfd_vma version_info[16];
188 static Elf_Internal_Ehdr elf_header;
189 static Elf_Internal_Shdr * section_headers;
190 static Elf_Internal_Phdr * program_headers;
191 static Elf_Internal_Dyn *  dynamic_section;
192 static Elf_Internal_Shdr * symtab_shndx_hdr;
193 static int show_name;
194 static int do_dynamic;
195 static int do_syms;
196 static int do_dyn_syms;
197 static int do_reloc;
198 static int do_sections;
199 static int do_section_groups;
200 static int do_section_details;
201 static int do_segments;
202 static int do_unwind;
203 static int do_using_dynamic;
204 static int do_header;
205 static int do_dump;
206 static int do_version;
207 static int do_histogram;
208 static int do_debugging;
209 static int do_arch;
210 static int do_notes;
211 static int do_archive_index;
212 static int is_32bit_elf;
213
214 struct group_list
215 {
216   struct group_list * next;
217   unsigned int section_index;
218 };
219
220 struct group
221 {
222   struct group_list * root;
223   unsigned int group_index;
224 };
225
226 static size_t group_count;
227 static struct group * section_groups;
228 static struct group ** section_headers_groups;
229
230
231 /* Flag bits indicating particular types of dump.  */
232 #define HEX_DUMP        (1 << 0)        /* The -x command line switch.  */
233 #define DISASS_DUMP     (1 << 1)        /* The -i command line switch.  */
234 #define DEBUG_DUMP      (1 << 2)        /* The -w command line switch.  */
235 #define STRING_DUMP     (1 << 3)        /* The -p command line switch.  */
236 #define RELOC_DUMP      (1 << 4)        /* The -R command line switch.  */
237
238 typedef unsigned char dump_type;
239
240 /* A linked list of the section names for which dumps were requested.  */
241 struct dump_list_entry
242 {
243   char * name;
244   dump_type type;
245   struct dump_list_entry * next;
246 };
247 static struct dump_list_entry * dump_sects_byname;
248
249 /* A dynamic array of flags indicating for which sections a dump
250    has been requested via command line switches.  */
251 static dump_type *   cmdline_dump_sects = NULL;
252 static unsigned int  num_cmdline_dump_sects = 0;
253
254 /* A dynamic array of flags indicating for which sections a dump of
255    some kind has been requested.  It is reset on a per-object file
256    basis and then initialised from the cmdline_dump_sects array,
257    the results of interpreting the -w switch, and the
258    dump_sects_byname list.  */
259 static dump_type *   dump_sects = NULL;
260 static unsigned int  num_dump_sects = 0;
261
262
263 /* How to print a vma value.  */
264 typedef enum print_mode
265 {
266   HEX,
267   DEC,
268   DEC_5,
269   UNSIGNED,
270   PREFIX_HEX,
271   FULL_HEX,
272   LONG_HEX
273 }
274 print_mode;
275
276 /* Versioned symbol info.  */
277 enum versioned_symbol_info
278 {
279   symbol_undefined,
280   symbol_hidden,
281   symbol_public
282 };
283
284 static const char *get_symbol_version_string
285   (FILE *file, int is_dynsym, const char *strtab,
286    unsigned long int strtab_size, unsigned int si,
287    Elf_Internal_Sym *psym, enum versioned_symbol_info *sym_info,
288    unsigned short *vna_other);
289
290 #define UNKNOWN -1
291
292 #define SECTION_NAME(X)                                         \
293   ((X) == NULL ? _("<none>")                                    \
294    : string_table == NULL ? _("<no-name>")                      \
295    : ((X)->sh_name >= string_table_length ? _("<corrupt>")      \
296   : string_table + (X)->sh_name))
297
298 #define DT_VERSIONTAGIDX(tag)   (DT_VERNEEDNUM - (tag)) /* Reverse order!  */
299
300 #define GET_ELF_SYMBOLS(file, section, sym_count)                       \
301   (is_32bit_elf ? get_32bit_elf_symbols (file, section, sym_count)      \
302    : get_64bit_elf_symbols (file, section, sym_count))
303
304 #define VALID_DYNAMIC_NAME(offset)      ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
305 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
306    already been called and verified that the string exists.  */
307 #define GET_DYNAMIC_NAME(offset)        (dynamic_strings + offset)
308
309 #define REMOVE_ARCH_BITS(ADDR)                  \
310   do                                            \
311     {                                           \
312       if (elf_header.e_machine == EM_ARM)       \
313         (ADDR) &= ~1;                           \
314     }                                           \
315   while (0)
316 \f
317 /* Retrieve NMEMB structures, each SIZE bytes long from FILE starting at OFFSET +
318    the offset of the current archive member, if we are examining an archive.
319    Put the retrieved data into VAR, if it is not NULL.  Otherwise allocate a buffer
320    using malloc and fill that.  In either case return the pointer to the start of
321    the retrieved data or NULL if something went wrong.  If something does go wrong
322    and REASON is not NULL then emit an error message using REASON as part of the
323    context.  */
324
325 static void *
326 get_data (void * var, FILE * file, unsigned long offset, size_t size, size_t nmemb,
327           const char * reason)
328 {
329   void * mvar;
330   size_t amt = size * nmemb;
331
332   if (size == 0 || nmemb == 0)
333     return NULL;
334
335   /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
336      attempting to allocate memory when the read is bound to fail.  */
337   if (amt > current_file_size
338       || offset + archive_file_offset + amt > current_file_size)
339     {
340       if (reason)
341         error (_("Reading 0x%lx bytes extends past end of file for %s\n"),
342                (unsigned long) amt, reason);
343       return NULL;
344     }
345
346   if (fseek (file, archive_file_offset + offset, SEEK_SET))
347     {
348       if (reason)
349         error (_("Unable to seek to 0x%lx for %s\n"),
350                (unsigned long) archive_file_offset + offset, reason);
351       return NULL;
352     }
353
354   mvar = var;
355   if (mvar == NULL)
356     {
357       /* Check for overflow.  */
358       if (nmemb < (~(size_t) 0 - 1) / size)
359         /* + 1 so that we can '\0' terminate invalid string table sections.  */
360         mvar = malloc (size * nmemb + 1);
361
362       if (mvar == NULL)
363         {
364           if (reason)
365             error (_("Out of memory allocating 0x%lx bytes for %s\n"),
366                    (unsigned long)(size * nmemb), reason);
367           return NULL;
368         }
369
370       ((char *) mvar)[amt] = '\0';
371     }
372
373   if (fread (mvar, size, nmemb, file) != nmemb)
374     {
375       if (reason)
376         error (_("Unable to read in 0x%lx bytes of %s\n"),
377                (unsigned long) amt, reason);
378       if (mvar != var)
379         free (mvar);
380       return NULL;
381     }
382
383   return mvar;
384 }
385
386 /* Print a VMA value.  */
387
388 static int
389 print_vma (bfd_vma vma, print_mode mode)
390 {
391   int nc = 0;
392
393   switch (mode)
394     {
395     case FULL_HEX:
396       nc = printf ("0x");
397       /* Drop through.  */
398
399     case LONG_HEX:
400 #ifdef BFD64
401       if (is_32bit_elf)
402         return nc + printf ("%8.8" BFD_VMA_FMT "x", vma);
403 #endif
404       printf_vma (vma);
405       return nc + 16;
406
407     case DEC_5:
408       if (vma <= 99999)
409         return printf ("%5" BFD_VMA_FMT "d", vma);
410       /* Drop through.  */
411
412     case PREFIX_HEX:
413       nc = printf ("0x");
414       /* Drop through.  */
415
416     case HEX:
417       return nc + printf ("%" BFD_VMA_FMT "x", vma);
418
419     case DEC:
420       return printf ("%" BFD_VMA_FMT "d", vma);
421
422     case UNSIGNED:
423       return printf ("%" BFD_VMA_FMT "u", vma);
424     }
425   return 0;
426 }
427
428 /* Display a symbol on stdout.  Handles the display of control characters and
429    multibye characters (assuming the host environment supports them).
430
431    Display at most abs(WIDTH) characters, truncating as necessary, unless do_wide is true.
432
433    If WIDTH is negative then ensure that the output is at least (- WIDTH) characters,
434    padding as necessary.
435
436    Returns the number of emitted characters.  */
437
438 static unsigned int
439 print_symbol (int width, const char *symbol)
440 {
441   bfd_boolean extra_padding = FALSE;
442   int num_printed = 0;
443 #ifdef HAVE_MBSTATE_T
444   mbstate_t state;
445 #endif
446   int width_remaining;
447
448   if (width < 0)
449     {
450       /* Keep the width positive.  This also helps.  */
451       width = - width;
452       extra_padding = TRUE;
453     }
454   assert (width != 0);
455
456   if (do_wide)
457     /* Set the remaining width to a very large value.
458        This simplifies the code below.  */
459     width_remaining = INT_MAX;
460   else
461     width_remaining = width;
462
463 #ifdef HAVE_MBSTATE_T
464   /* Initialise the multibyte conversion state.  */
465   memset (& state, 0, sizeof (state));
466 #endif
467
468   while (width_remaining)
469     {
470       size_t  n;
471       const char c = *symbol++;
472
473       if (c == 0)
474         break;
475
476       /* Do not print control characters directly as they can affect terminal
477          settings.  Such characters usually appear in the names generated
478          by the assembler for local labels.  */
479       if (ISCNTRL (c))
480         {
481           if (width_remaining < 2)
482             break;
483
484           printf ("^%c", c + 0x40);
485           width_remaining -= 2;
486           num_printed += 2;
487         }
488       else if (ISPRINT (c))
489         {
490           putchar (c);
491           width_remaining --;
492           num_printed ++;
493         }
494       else
495         {
496 #ifdef HAVE_MBSTATE_T
497           wchar_t w;
498 #endif
499           /* Let printf do the hard work of displaying multibyte characters.  */
500           printf ("%.1s", symbol - 1);
501           width_remaining --;
502           num_printed ++;
503
504 #ifdef HAVE_MBSTATE_T
505           /* Try to find out how many bytes made up the character that was
506              just printed.  Advance the symbol pointer past the bytes that
507              were displayed.  */
508           n = mbrtowc (& w, symbol - 1, MB_CUR_MAX, & state);
509 #else
510           n = 1;
511 #endif
512           if (n != (size_t) -1 && n != (size_t) -2 && n > 0)
513             symbol += (n - 1);
514         }
515     }
516
517   if (extra_padding && num_printed < width)
518     {
519       /* Fill in the remaining spaces.  */
520       printf ("%-*s", width - num_printed, " ");
521       num_printed = width;
522     }
523
524   return num_printed;
525 }
526
527 /* Returns a pointer to a static buffer containing a  printable version of
528    the given section's name.  Like print_symbol, except that it does not try
529    to print multibyte characters, it just interprets them as hex values.  */
530
531 static const char *
532 printable_section_name (Elf_Internal_Shdr * sec)
533 {
534 #define MAX_PRINT_SEC_NAME_LEN 128
535   static char  sec_name_buf [MAX_PRINT_SEC_NAME_LEN + 1];
536   const char * name = SECTION_NAME (sec);
537   char *       buf = sec_name_buf;
538   char         c;
539   unsigned int remaining = MAX_PRINT_SEC_NAME_LEN;
540
541   while ((c = * name ++) != 0)
542     {
543       if (ISCNTRL (c))
544         {
545           if (remaining < 2)
546             break;
547           
548           * buf ++ = '^';
549           * buf ++ = c + 0x40;
550           remaining -= 2;
551         }
552       else if (ISPRINT (c))
553         {
554           * buf ++ = c;
555           remaining -= 1;
556         }
557       else
558         {
559           static char hex[17] = "0123456789ABCDEF";
560
561           if (remaining < 4)
562             break;
563           * buf ++ = '<';
564           * buf ++ = hex[(c & 0xf0) >> 4];
565           * buf ++ = hex[c & 0x0f];
566           * buf ++ = '>';
567           remaining -= 4;
568         }
569
570       if (remaining == 0)
571         break;
572     }
573
574   * buf = 0;
575   return sec_name_buf;
576 }
577
578 static const char *
579 printable_section_name_from_index (unsigned long ndx)
580 {
581   if (ndx >= elf_header.e_shnum)
582     return _("<corrupt>");
583
584   return printable_section_name (section_headers + ndx);
585 }
586
587 /* Return a pointer to section NAME, or NULL if no such section exists.  */
588
589 static Elf_Internal_Shdr *
590 find_section (const char * name)
591 {
592   unsigned int i;
593
594   for (i = 0; i < elf_header.e_shnum; i++)
595     if (streq (SECTION_NAME (section_headers + i), name))
596       return section_headers + i;
597
598   return NULL;
599 }
600
601 /* Return a pointer to a section containing ADDR, or NULL if no such
602    section exists.  */
603
604 static Elf_Internal_Shdr *
605 find_section_by_address (bfd_vma addr)
606 {
607   unsigned int i;
608
609   for (i = 0; i < elf_header.e_shnum; i++)
610     {
611       Elf_Internal_Shdr *sec = section_headers + i;
612       if (addr >= sec->sh_addr && addr < sec->sh_addr + sec->sh_size)
613         return sec;
614     }
615
616   return NULL;
617 }
618
619 static Elf_Internal_Shdr *
620 find_section_by_type (unsigned int type)
621 {
622   unsigned int i;
623
624   for (i = 0; i < elf_header.e_shnum; i++)
625     {
626       Elf_Internal_Shdr *sec = section_headers + i;
627       if (sec->sh_type == type)
628         return sec;
629     }
630
631   return NULL;
632 }
633
634 /* Return a pointer to section NAME, or NULL if no such section exists,
635    restricted to the list of sections given in SET.  */
636
637 static Elf_Internal_Shdr *
638 find_section_in_set (const char * name, unsigned int * set)
639 {
640   unsigned int i;
641
642   if (set != NULL)
643     {
644       while ((i = *set++) > 0)
645         if (streq (SECTION_NAME (section_headers + i), name))
646           return section_headers + i;
647     }
648
649   return find_section (name);
650 }
651
652 /* Read an unsigned LEB128 encoded value from p.  Set *PLEN to the number of
653    bytes read.  */
654
655 static inline unsigned long
656 read_uleb128 (unsigned char *data,
657               unsigned int *length_return,
658               const unsigned char * const end)
659 {
660   return read_leb128 (data, length_return, FALSE, end);
661 }
662
663 /* Return true if the current file is for IA-64 machine and OpenVMS ABI.
664    This OS has so many departures from the ELF standard that we test it at
665    many places.  */
666
667 static inline int
668 is_ia64_vms (void)
669 {
670   return elf_header.e_machine == EM_IA_64
671     && elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS;
672 }
673
674 /* Guess the relocation size commonly used by the specific machines.  */
675
676 static int
677 guess_is_rela (unsigned int e_machine)
678 {
679   switch (e_machine)
680     {
681       /* Targets that use REL relocations.  */
682     case EM_386:
683     case EM_486:
684     case EM_960:
685     case EM_ARM:
686     case EM_D10V:
687     case EM_CYGNUS_D10V:
688     case EM_DLX:
689     case EM_MIPS:
690     case EM_MIPS_RS3_LE:
691     case EM_CYGNUS_M32R:
692     case EM_SCORE:
693     case EM_XGATE:
694       return FALSE;
695
696       /* Targets that use RELA relocations.  */
697     case EM_68K:
698     case EM_860:
699     case EM_AARCH64:
700     case EM_ADAPTEVA_EPIPHANY:
701     case EM_ALPHA:
702     case EM_ALTERA_NIOS2:
703     case EM_AVR:
704     case EM_AVR_OLD:
705     case EM_BLACKFIN:
706     case EM_CR16:
707     case EM_CRIS:
708     case EM_CRX:
709     case EM_D30V:
710     case EM_CYGNUS_D30V:
711     case EM_FR30:
712     case EM_CYGNUS_FR30:
713     case EM_CYGNUS_FRV:
714     case EM_H8S:
715     case EM_H8_300:
716     case EM_H8_300H:
717     case EM_IA_64:
718     case EM_IP2K:
719     case EM_IP2K_OLD:
720     case EM_IQ2000:
721     case EM_LATTICEMICO32:
722     case EM_M32C_OLD:
723     case EM_M32C:
724     case EM_M32R:
725     case EM_MCORE:
726     case EM_CYGNUS_MEP:
727     case EM_METAG:
728     case EM_MMIX:
729     case EM_MN10200:
730     case EM_CYGNUS_MN10200:
731     case EM_MN10300:
732     case EM_CYGNUS_MN10300:
733     case EM_MOXIE:
734     case EM_MSP430:
735     case EM_MSP430_OLD:
736     case EM_MT:
737     case EM_NDS32:
738     case EM_NIOS32:
739     case EM_OR1K:
740     case EM_PPC64:
741     case EM_PPC:
742     case EM_RL78:
743     case EM_RX:
744     case EM_S390:
745     case EM_S390_OLD:
746     case EM_SH:
747     case EM_SPARC:
748     case EM_SPARC32PLUS:
749     case EM_SPARCV9:
750     case EM_SPU:
751     case EM_TI_C6000:
752     case EM_TILEGX:
753     case EM_TILEPRO:
754     case EM_V800:
755     case EM_V850:
756     case EM_CYGNUS_V850:
757     case EM_VAX:
758     case EM_VISIUM:
759     case EM_X86_64:
760     case EM_L1OM:
761     case EM_K1OM:
762     case EM_XSTORMY16:
763     case EM_XTENSA:
764     case EM_XTENSA_OLD:
765     case EM_MICROBLAZE:
766     case EM_MICROBLAZE_OLD:
767       return TRUE;
768
769     case EM_68HC05:
770     case EM_68HC08:
771     case EM_68HC11:
772     case EM_68HC16:
773     case EM_FX66:
774     case EM_ME16:
775     case EM_MMA:
776     case EM_NCPU:
777     case EM_NDR1:
778     case EM_PCP:
779     case EM_ST100:
780     case EM_ST19:
781     case EM_ST7:
782     case EM_ST9PLUS:
783     case EM_STARCORE:
784     case EM_SVX:
785     case EM_TINYJ:
786     default:
787       warn (_("Don't know about relocations on this machine architecture\n"));
788       return FALSE;
789     }
790 }
791
792 static int
793 slurp_rela_relocs (FILE * file,
794                    unsigned long rel_offset,
795                    unsigned long rel_size,
796                    Elf_Internal_Rela ** relasp,
797                    unsigned long * nrelasp)
798 {
799   Elf_Internal_Rela * relas;
800   size_t nrelas;
801   unsigned int i;
802
803   if (is_32bit_elf)
804     {
805       Elf32_External_Rela * erelas;
806
807       erelas = (Elf32_External_Rela *) get_data (NULL, file, rel_offset, 1,
808                                                  rel_size, _("32-bit relocation data"));
809       if (!erelas)
810         return 0;
811
812       nrelas = rel_size / sizeof (Elf32_External_Rela);
813
814       relas = (Elf_Internal_Rela *) cmalloc (nrelas,
815                                              sizeof (Elf_Internal_Rela));
816
817       if (relas == NULL)
818         {
819           free (erelas);
820           error (_("out of memory parsing relocs\n"));
821           return 0;
822         }
823
824       for (i = 0; i < nrelas; i++)
825         {
826           relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
827           relas[i].r_info   = BYTE_GET (erelas[i].r_info);
828           relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
829         }
830
831       free (erelas);
832     }
833   else
834     {
835       Elf64_External_Rela * erelas;
836
837       erelas = (Elf64_External_Rela *) get_data (NULL, file, rel_offset, 1,
838                                                  rel_size, _("64-bit relocation data"));
839       if (!erelas)
840         return 0;
841
842       nrelas = rel_size / sizeof (Elf64_External_Rela);
843
844       relas = (Elf_Internal_Rela *) cmalloc (nrelas,
845                                              sizeof (Elf_Internal_Rela));
846
847       if (relas == NULL)
848         {
849           free (erelas);
850           error (_("out of memory parsing relocs\n"));
851           return 0;
852         }
853
854       for (i = 0; i < nrelas; i++)
855         {
856           relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
857           relas[i].r_info   = BYTE_GET (erelas[i].r_info);
858           relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
859
860           /* The #ifdef BFD64 below is to prevent a compile time
861              warning.  We know that if we do not have a 64 bit data
862              type that we will never execute this code anyway.  */
863 #ifdef BFD64
864           if (elf_header.e_machine == EM_MIPS
865               && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
866             {
867               /* In little-endian objects, r_info isn't really a
868                  64-bit little-endian value: it has a 32-bit
869                  little-endian symbol index followed by four
870                  individual byte fields.  Reorder INFO
871                  accordingly.  */
872               bfd_vma inf = relas[i].r_info;
873               inf = (((inf & 0xffffffff) << 32)
874                       | ((inf >> 56) & 0xff)
875                       | ((inf >> 40) & 0xff00)
876                       | ((inf >> 24) & 0xff0000)
877                       | ((inf >> 8) & 0xff000000));
878               relas[i].r_info = inf;
879             }
880 #endif /* BFD64 */
881         }
882
883       free (erelas);
884     }
885   *relasp = relas;
886   *nrelasp = nrelas;
887   return 1;
888 }
889
890 static int
891 slurp_rel_relocs (FILE * file,
892                   unsigned long rel_offset,
893                   unsigned long rel_size,
894                   Elf_Internal_Rela ** relsp,
895                   unsigned long * nrelsp)
896 {
897   Elf_Internal_Rela * rels;
898   size_t nrels;
899   unsigned int i;
900
901   if (is_32bit_elf)
902     {
903       Elf32_External_Rel * erels;
904
905       erels = (Elf32_External_Rel *) get_data (NULL, file, rel_offset, 1,
906                                                rel_size, _("32-bit relocation data"));
907       if (!erels)
908         return 0;
909
910       nrels = rel_size / sizeof (Elf32_External_Rel);
911
912       rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
913
914       if (rels == NULL)
915         {
916           free (erels);
917           error (_("out of memory parsing relocs\n"));
918           return 0;
919         }
920
921       for (i = 0; i < nrels; i++)
922         {
923           rels[i].r_offset = BYTE_GET (erels[i].r_offset);
924           rels[i].r_info   = BYTE_GET (erels[i].r_info);
925           rels[i].r_addend = 0;
926         }
927
928       free (erels);
929     }
930   else
931     {
932       Elf64_External_Rel * erels;
933
934       erels = (Elf64_External_Rel *) get_data (NULL, file, rel_offset, 1,
935                                                rel_size, _("64-bit relocation data"));
936       if (!erels)
937         return 0;
938
939       nrels = rel_size / sizeof (Elf64_External_Rel);
940
941       rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
942
943       if (rels == NULL)
944         {
945           free (erels);
946           error (_("out of memory parsing relocs\n"));
947           return 0;
948         }
949
950       for (i = 0; i < nrels; i++)
951         {
952           rels[i].r_offset = BYTE_GET (erels[i].r_offset);
953           rels[i].r_info   = BYTE_GET (erels[i].r_info);
954           rels[i].r_addend = 0;
955
956           /* The #ifdef BFD64 below is to prevent a compile time
957              warning.  We know that if we do not have a 64 bit data
958              type that we will never execute this code anyway.  */
959 #ifdef BFD64
960           if (elf_header.e_machine == EM_MIPS
961               && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
962             {
963               /* In little-endian objects, r_info isn't really a
964                  64-bit little-endian value: it has a 32-bit
965                  little-endian symbol index followed by four
966                  individual byte fields.  Reorder INFO
967                  accordingly.  */
968               bfd_vma inf = rels[i].r_info;
969               inf = (((inf & 0xffffffff) << 32)
970                      | ((inf >> 56) & 0xff)
971                      | ((inf >> 40) & 0xff00)
972                      | ((inf >> 24) & 0xff0000)
973                      | ((inf >> 8) & 0xff000000));
974               rels[i].r_info = inf;
975             }
976 #endif /* BFD64 */
977         }
978
979       free (erels);
980     }
981   *relsp = rels;
982   *nrelsp = nrels;
983   return 1;
984 }
985
986 /* Returns the reloc type extracted from the reloc info field.  */
987
988 static unsigned int
989 get_reloc_type (bfd_vma reloc_info)
990 {
991   if (is_32bit_elf)
992     return ELF32_R_TYPE (reloc_info);
993
994   switch (elf_header.e_machine)
995     {
996     case EM_MIPS:
997       /* Note: We assume that reloc_info has already been adjusted for us.  */
998       return ELF64_MIPS_R_TYPE (reloc_info);
999
1000     case EM_SPARCV9:
1001       return ELF64_R_TYPE_ID (reloc_info);
1002
1003     default:
1004       return ELF64_R_TYPE (reloc_info);
1005     }
1006 }
1007
1008 /* Return the symbol index extracted from the reloc info field.  */
1009
1010 static bfd_vma
1011 get_reloc_symindex (bfd_vma reloc_info)
1012 {
1013   return is_32bit_elf ? ELF32_R_SYM (reloc_info) : ELF64_R_SYM (reloc_info);
1014 }
1015
1016 static inline bfd_boolean
1017 uses_msp430x_relocs (void)
1018 {
1019   return
1020     elf_header.e_machine == EM_MSP430 /* Paranoia.  */
1021     /* GCC uses osabi == ELFOSBI_STANDALONE.  */
1022     && (((elf_header.e_flags & EF_MSP430_MACH) == E_MSP430_MACH_MSP430X)
1023         /* TI compiler uses ELFOSABI_NONE.  */
1024         || (elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE));
1025 }
1026
1027 /* Display the contents of the relocation data found at the specified
1028    offset.  */
1029
1030 static void
1031 dump_relocations (FILE * file,
1032                   unsigned long rel_offset,
1033                   unsigned long rel_size,
1034                   Elf_Internal_Sym * symtab,
1035                   unsigned long nsyms,
1036                   char * strtab,
1037                   unsigned long strtablen,
1038                   int is_rela,
1039                   int is_dynsym)
1040 {
1041   unsigned int i;
1042   Elf_Internal_Rela * rels;
1043
1044   if (is_rela == UNKNOWN)
1045     is_rela = guess_is_rela (elf_header.e_machine);
1046
1047   if (is_rela)
1048     {
1049       if (!slurp_rela_relocs (file, rel_offset, rel_size, &rels, &rel_size))
1050         return;
1051     }
1052   else
1053     {
1054       if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
1055         return;
1056     }
1057
1058   if (is_32bit_elf)
1059     {
1060       if (is_rela)
1061         {
1062           if (do_wide)
1063             printf (_(" Offset     Info    Type                Sym. Value  Symbol's Name + Addend\n"));
1064           else
1065             printf (_(" Offset     Info    Type            Sym.Value  Sym. Name + Addend\n"));
1066         }
1067       else
1068         {
1069           if (do_wide)
1070             printf (_(" Offset     Info    Type                Sym. Value  Symbol's Name\n"));
1071           else
1072             printf (_(" Offset     Info    Type            Sym.Value  Sym. Name\n"));
1073         }
1074     }
1075   else
1076     {
1077       if (is_rela)
1078         {
1079           if (do_wide)
1080             printf (_("    Offset             Info             Type               Symbol's Value  Symbol's Name + Addend\n"));
1081           else
1082             printf (_("  Offset          Info           Type           Sym. Value    Sym. Name + Addend\n"));
1083         }
1084       else
1085         {
1086           if (do_wide)
1087             printf (_("    Offset             Info             Type               Symbol's Value  Symbol's Name\n"));
1088           else
1089             printf (_("  Offset          Info           Type           Sym. Value    Sym. Name\n"));
1090         }
1091     }
1092
1093   for (i = 0; i < rel_size; i++)
1094     {
1095       const char * rtype;
1096       bfd_vma offset;
1097       bfd_vma inf;
1098       bfd_vma symtab_index;
1099       bfd_vma type;
1100
1101       offset = rels[i].r_offset;
1102       inf    = rels[i].r_info;
1103
1104       type = get_reloc_type (inf);
1105       symtab_index = get_reloc_symindex  (inf);
1106
1107       if (is_32bit_elf)
1108         {
1109           printf ("%8.8lx  %8.8lx ",
1110                   (unsigned long) offset & 0xffffffff,
1111                   (unsigned long) inf & 0xffffffff);
1112         }
1113       else
1114         {
1115 #if BFD_HOST_64BIT_LONG
1116           printf (do_wide
1117                   ? "%16.16lx  %16.16lx "
1118                   : "%12.12lx  %12.12lx ",
1119                   offset, inf);
1120 #elif BFD_HOST_64BIT_LONG_LONG
1121 #ifndef __MSVCRT__
1122           printf (do_wide
1123                   ? "%16.16llx  %16.16llx "
1124                   : "%12.12llx  %12.12llx ",
1125                   offset, inf);
1126 #else
1127           printf (do_wide
1128                   ? "%16.16I64x  %16.16I64x "
1129                   : "%12.12I64x  %12.12I64x ",
1130                   offset, inf);
1131 #endif
1132 #else
1133           printf (do_wide
1134                   ? "%8.8lx%8.8lx  %8.8lx%8.8lx "
1135                   : "%4.4lx%8.8lx  %4.4lx%8.8lx ",
1136                   _bfd_int64_high (offset),
1137                   _bfd_int64_low (offset),
1138                   _bfd_int64_high (inf),
1139                   _bfd_int64_low (inf));
1140 #endif
1141         }
1142
1143       switch (elf_header.e_machine)
1144         {
1145         default:
1146           rtype = NULL;
1147           break;
1148
1149         case EM_AARCH64:
1150           rtype = elf_aarch64_reloc_type (type);
1151           break;
1152
1153         case EM_M32R:
1154         case EM_CYGNUS_M32R:
1155           rtype = elf_m32r_reloc_type (type);
1156           break;
1157
1158         case EM_386:
1159         case EM_486:
1160           rtype = elf_i386_reloc_type (type);
1161           break;
1162
1163         case EM_68HC11:
1164         case EM_68HC12:
1165           rtype = elf_m68hc11_reloc_type (type);
1166           break;
1167
1168         case EM_68K:
1169           rtype = elf_m68k_reloc_type (type);
1170           break;
1171
1172         case EM_960:
1173           rtype = elf_i960_reloc_type (type);
1174           break;
1175
1176         case EM_AVR:
1177         case EM_AVR_OLD:
1178           rtype = elf_avr_reloc_type (type);
1179           break;
1180
1181         case EM_OLD_SPARCV9:
1182         case EM_SPARC32PLUS:
1183         case EM_SPARCV9:
1184         case EM_SPARC:
1185           rtype = elf_sparc_reloc_type (type);
1186           break;
1187
1188         case EM_SPU:
1189           rtype = elf_spu_reloc_type (type);
1190           break;
1191
1192         case EM_V800:
1193           rtype = v800_reloc_type (type);
1194           break;
1195         case EM_V850:
1196         case EM_CYGNUS_V850:
1197           rtype = v850_reloc_type (type);
1198           break;
1199
1200         case EM_D10V:
1201         case EM_CYGNUS_D10V:
1202           rtype = elf_d10v_reloc_type (type);
1203           break;
1204
1205         case EM_D30V:
1206         case EM_CYGNUS_D30V:
1207           rtype = elf_d30v_reloc_type (type);
1208           break;
1209
1210         case EM_DLX:
1211           rtype = elf_dlx_reloc_type (type);
1212           break;
1213
1214         case EM_SH:
1215           rtype = elf_sh_reloc_type (type);
1216           break;
1217
1218         case EM_MN10300:
1219         case EM_CYGNUS_MN10300:
1220           rtype = elf_mn10300_reloc_type (type);
1221           break;
1222
1223         case EM_MN10200:
1224         case EM_CYGNUS_MN10200:
1225           rtype = elf_mn10200_reloc_type (type);
1226           break;
1227
1228         case EM_FR30:
1229         case EM_CYGNUS_FR30:
1230           rtype = elf_fr30_reloc_type (type);
1231           break;
1232
1233         case EM_CYGNUS_FRV:
1234           rtype = elf_frv_reloc_type (type);
1235           break;
1236
1237         case EM_MCORE:
1238           rtype = elf_mcore_reloc_type (type);
1239           break;
1240
1241         case EM_MMIX:
1242           rtype = elf_mmix_reloc_type (type);
1243           break;
1244
1245         case EM_MOXIE:
1246           rtype = elf_moxie_reloc_type (type);
1247           break;
1248
1249         case EM_MSP430:
1250           if (uses_msp430x_relocs ())
1251             {
1252               rtype = elf_msp430x_reloc_type (type);
1253               break;
1254             }
1255         case EM_MSP430_OLD:
1256           rtype = elf_msp430_reloc_type (type);
1257           break;
1258
1259         case EM_NDS32:
1260           rtype = elf_nds32_reloc_type (type);
1261           break;
1262
1263         case EM_PPC:
1264           rtype = elf_ppc_reloc_type (type);
1265           break;
1266
1267         case EM_PPC64:
1268           rtype = elf_ppc64_reloc_type (type);
1269           break;
1270
1271         case EM_MIPS:
1272         case EM_MIPS_RS3_LE:
1273           rtype = elf_mips_reloc_type (type);
1274           break;
1275
1276         case EM_ALPHA:
1277           rtype = elf_alpha_reloc_type (type);
1278           break;
1279
1280         case EM_ARM:
1281           rtype = elf_arm_reloc_type (type);
1282           break;
1283
1284         case EM_ARC:
1285           rtype = elf_arc_reloc_type (type);
1286           break;
1287
1288         case EM_PARISC:
1289           rtype = elf_hppa_reloc_type (type);
1290           break;
1291
1292         case EM_H8_300:
1293         case EM_H8_300H:
1294         case EM_H8S:
1295           rtype = elf_h8_reloc_type (type);
1296           break;
1297
1298         case EM_OR1K:
1299           rtype = elf_or1k_reloc_type (type);
1300           break;
1301
1302         case EM_PJ:
1303         case EM_PJ_OLD:
1304           rtype = elf_pj_reloc_type (type);
1305           break;
1306         case EM_IA_64:
1307           rtype = elf_ia64_reloc_type (type);
1308           break;
1309
1310         case EM_CRIS:
1311           rtype = elf_cris_reloc_type (type);
1312           break;
1313
1314         case EM_860:
1315           rtype = elf_i860_reloc_type (type);
1316           break;
1317
1318         case EM_X86_64:
1319         case EM_L1OM:
1320         case EM_K1OM:
1321           rtype = elf_x86_64_reloc_type (type);
1322           break;
1323
1324         case EM_S370:
1325           rtype = i370_reloc_type (type);
1326           break;
1327
1328         case EM_S390_OLD:
1329         case EM_S390:
1330           rtype = elf_s390_reloc_type (type);
1331           break;
1332
1333         case EM_SCORE:
1334           rtype = elf_score_reloc_type (type);
1335           break;
1336
1337         case EM_XSTORMY16:
1338           rtype = elf_xstormy16_reloc_type (type);
1339           break;
1340
1341         case EM_CRX:
1342           rtype = elf_crx_reloc_type (type);
1343           break;
1344
1345         case EM_VAX:
1346           rtype = elf_vax_reloc_type (type);
1347           break;
1348
1349         case EM_VISIUM:
1350           rtype = elf_visium_reloc_type (type);
1351           break;
1352
1353         case EM_ADAPTEVA_EPIPHANY:
1354           rtype = elf_epiphany_reloc_type (type);
1355           break;
1356
1357         case EM_IP2K:
1358         case EM_IP2K_OLD:
1359           rtype = elf_ip2k_reloc_type (type);
1360           break;
1361
1362         case EM_IQ2000:
1363           rtype = elf_iq2000_reloc_type (type);
1364           break;
1365
1366         case EM_XTENSA_OLD:
1367         case EM_XTENSA:
1368           rtype = elf_xtensa_reloc_type (type);
1369           break;
1370
1371         case EM_LATTICEMICO32:
1372           rtype = elf_lm32_reloc_type (type);
1373           break;
1374
1375         case EM_M32C_OLD:
1376         case EM_M32C:
1377           rtype = elf_m32c_reloc_type (type);
1378           break;
1379
1380         case EM_MT:
1381           rtype = elf_mt_reloc_type (type);
1382           break;
1383
1384         case EM_BLACKFIN:
1385           rtype = elf_bfin_reloc_type (type);
1386           break;
1387
1388         case EM_CYGNUS_MEP:
1389           rtype = elf_mep_reloc_type (type);
1390           break;
1391
1392         case EM_CR16:
1393           rtype = elf_cr16_reloc_type (type);
1394           break;
1395
1396         case EM_MICROBLAZE:
1397         case EM_MICROBLAZE_OLD:
1398           rtype = elf_microblaze_reloc_type (type);
1399           break;
1400
1401         case EM_RL78:
1402           rtype = elf_rl78_reloc_type (type);
1403           break;
1404
1405         case EM_RX:
1406           rtype = elf_rx_reloc_type (type);
1407           break;
1408
1409         case EM_METAG:
1410           rtype = elf_metag_reloc_type (type);
1411           break;
1412
1413         case EM_XC16X:
1414         case EM_C166:
1415           rtype = elf_xc16x_reloc_type (type);
1416           break;
1417
1418         case EM_TI_C6000:
1419           rtype = elf_tic6x_reloc_type (type);
1420           break;
1421
1422         case EM_TILEGX:
1423           rtype = elf_tilegx_reloc_type (type);
1424           break;
1425
1426         case EM_TILEPRO:
1427           rtype = elf_tilepro_reloc_type (type);
1428           break;
1429
1430         case EM_XGATE:
1431           rtype = elf_xgate_reloc_type (type);
1432           break;
1433
1434         case EM_ALTERA_NIOS2:
1435           rtype = elf_nios2_reloc_type (type);
1436           break;
1437         }
1438
1439       if (rtype == NULL)
1440         printf (_("unrecognized: %-7lx"), (unsigned long) type & 0xffffffff);
1441       else
1442         printf (do_wide ? "%-22.22s" : "%-17.17s", rtype);
1443
1444       if (elf_header.e_machine == EM_ALPHA
1445           && rtype != NULL
1446           && streq (rtype, "R_ALPHA_LITUSE")
1447           && is_rela)
1448         {
1449           switch (rels[i].r_addend)
1450             {
1451             case LITUSE_ALPHA_ADDR:   rtype = "ADDR";   break;
1452             case LITUSE_ALPHA_BASE:   rtype = "BASE";   break;
1453             case LITUSE_ALPHA_BYTOFF: rtype = "BYTOFF"; break;
1454             case LITUSE_ALPHA_JSR:    rtype = "JSR";    break;
1455             case LITUSE_ALPHA_TLSGD:  rtype = "TLSGD";  break;
1456             case LITUSE_ALPHA_TLSLDM: rtype = "TLSLDM"; break;
1457             case LITUSE_ALPHA_JSRDIRECT: rtype = "JSRDIRECT"; break;
1458             default: rtype = NULL;
1459             }
1460           if (rtype)
1461             printf (" (%s)", rtype);
1462           else
1463             {
1464               putchar (' ');
1465               printf (_("<unknown addend: %lx>"),
1466                       (unsigned long) rels[i].r_addend);
1467             }
1468         }
1469       else if (symtab_index)
1470         {
1471           if (symtab == NULL || symtab_index >= nsyms)
1472             printf (_(" bad symbol index: %08lx"), (unsigned long) symtab_index);
1473           else
1474             {
1475               Elf_Internal_Sym * psym;
1476               const char * version_string;
1477               enum versioned_symbol_info sym_info;
1478               unsigned short vna_other;
1479
1480               psym = symtab + symtab_index;
1481
1482               version_string
1483                 = get_symbol_version_string (file, is_dynsym,
1484                                              strtab, strtablen,
1485                                              symtab_index,
1486                                              psym,
1487                                              &sym_info,
1488                                              &vna_other);
1489
1490               printf (" ");
1491
1492               if (ELF_ST_TYPE (psym->st_info) == STT_GNU_IFUNC)
1493                 {
1494                   const char * name;
1495                   unsigned int len;
1496                   unsigned int width = is_32bit_elf ? 8 : 14;
1497
1498                   /* Relocations against GNU_IFUNC symbols do not use the value
1499                      of the symbol as the address to relocate against.  Instead
1500                      they invoke the function named by the symbol and use its
1501                      result as the address for relocation.
1502
1503                      To indicate this to the user, do not display the value of
1504                      the symbol in the "Symbols's Value" field.  Instead show
1505                      its name followed by () as a hint that the symbol is
1506                      invoked.  */
1507
1508                   if (strtab == NULL
1509                       || psym->st_name == 0
1510                       || psym->st_name >= strtablen)
1511                     name = "??";
1512                   else
1513                     name = strtab + psym->st_name;
1514
1515                   len = print_symbol (width, name);
1516                   if (version_string)
1517                     printf (sym_info == symbol_public ? "@@%s" : "@%s",
1518                             version_string);
1519                   printf ("()%-*s", len <= width ? (width + 1) - len : 1, " ");
1520                 }
1521               else
1522                 {
1523                   print_vma (psym->st_value, LONG_HEX);
1524
1525                   printf (is_32bit_elf ? "   " : " ");
1526                 }
1527
1528               if (psym->st_name == 0)
1529                 {
1530                   const char * sec_name = "<null>";
1531                   char name_buf[40];
1532
1533                   if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1534                     {
1535                       if (psym->st_shndx < elf_header.e_shnum)
1536                         sec_name = SECTION_NAME (section_headers + psym->st_shndx);
1537                       else if (psym->st_shndx == SHN_ABS)
1538                         sec_name = "ABS";
1539                       else if (psym->st_shndx == SHN_COMMON)
1540                         sec_name = "COMMON";
1541                       else if ((elf_header.e_machine == EM_MIPS
1542                                 && psym->st_shndx == SHN_MIPS_SCOMMON)
1543                                || (elf_header.e_machine == EM_TI_C6000
1544                                    && psym->st_shndx == SHN_TIC6X_SCOMMON))
1545                         sec_name = "SCOMMON";
1546                       else if (elf_header.e_machine == EM_MIPS
1547                                && psym->st_shndx == SHN_MIPS_SUNDEFINED)
1548                         sec_name = "SUNDEF";
1549                       else if ((elf_header.e_machine == EM_X86_64
1550                                 || elf_header.e_machine == EM_L1OM
1551                                 || elf_header.e_machine == EM_K1OM)
1552                                && psym->st_shndx == SHN_X86_64_LCOMMON)
1553                         sec_name = "LARGE_COMMON";
1554                       else if (elf_header.e_machine == EM_IA_64
1555                                && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
1556                                && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1557                         sec_name = "ANSI_COM";
1558                       else if (is_ia64_vms ()
1559                                && psym->st_shndx == SHN_IA_64_VMS_SYMVEC)
1560                         sec_name = "VMS_SYMVEC";
1561                       else
1562                         {
1563                           sprintf (name_buf, "<section 0x%x>",
1564                                    (unsigned int) psym->st_shndx);
1565                           sec_name = name_buf;
1566                         }
1567                     }
1568                   print_symbol (22, sec_name);
1569                 }
1570               else if (strtab == NULL)
1571                 printf (_("<string table index: %3ld>"), psym->st_name);
1572               else if (psym->st_name >= strtablen)
1573                 printf (_("<corrupt string table index: %3ld>"), psym->st_name);
1574               else
1575                 {
1576                   print_symbol (22, strtab + psym->st_name);
1577                   if (version_string)
1578                     printf (sym_info == symbol_public ? "@@%s" : "@%s",
1579                             version_string);
1580                 }
1581
1582               if (is_rela)
1583                 {
1584                   bfd_signed_vma off = rels[i].r_addend;
1585
1586                   if (off < 0)
1587                     printf (" - %" BFD_VMA_FMT "x", - off);
1588                   else
1589                     printf (" + %" BFD_VMA_FMT "x", off);
1590                 }
1591             }
1592         }
1593       else if (is_rela)
1594         {
1595           bfd_signed_vma off = rels[i].r_addend;
1596
1597           printf ("%*c", is_32bit_elf ? 12 : 20, ' ');
1598           if (off < 0)
1599             printf ("-%" BFD_VMA_FMT "x", - off);
1600           else
1601             printf ("%" BFD_VMA_FMT "x", off);
1602         }
1603
1604       if (elf_header.e_machine == EM_SPARCV9
1605           && rtype != NULL
1606           && streq (rtype, "R_SPARC_OLO10"))
1607         printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf));
1608
1609       putchar ('\n');
1610
1611 #ifdef BFD64
1612       if (! is_32bit_elf && elf_header.e_machine == EM_MIPS)
1613         {
1614           bfd_vma type2 = ELF64_MIPS_R_TYPE2 (inf);
1615           bfd_vma type3 = ELF64_MIPS_R_TYPE3 (inf);
1616           const char * rtype2 = elf_mips_reloc_type (type2);
1617           const char * rtype3 = elf_mips_reloc_type (type3);
1618
1619           printf ("                    Type2: ");
1620
1621           if (rtype2 == NULL)
1622             printf (_("unrecognized: %-7lx"),
1623                     (unsigned long) type2 & 0xffffffff);
1624           else
1625             printf ("%-17.17s", rtype2);
1626
1627           printf ("\n                    Type3: ");
1628
1629           if (rtype3 == NULL)
1630             printf (_("unrecognized: %-7lx"),
1631                     (unsigned long) type3 & 0xffffffff);
1632           else
1633             printf ("%-17.17s", rtype3);
1634
1635           putchar ('\n');
1636         }
1637 #endif /* BFD64 */
1638     }
1639
1640   free (rels);
1641 }
1642
1643 static const char *
1644 get_mips_dynamic_type (unsigned long type)
1645 {
1646   switch (type)
1647     {
1648     case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1649     case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1650     case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1651     case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1652     case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1653     case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1654     case DT_MIPS_MSYM: return "MIPS_MSYM";
1655     case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1656     case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1657     case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1658     case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1659     case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1660     case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1661     case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1662     case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1663     case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1664     case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1665     case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1666     case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1667     case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1668     case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1669     case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1670     case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1671     case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1672     case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1673     case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1674     case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1675     case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1676     case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1677     case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1678     case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1679     case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1680     case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1681     case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1682     case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1683     case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1684     case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1685     case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1686     case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1687     case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1688     case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1689     case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1690     case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1691     case DT_MIPS_PLTGOT: return "MIPS_PLTGOT";
1692     case DT_MIPS_RWPLT: return "MIPS_RWPLT";
1693     default:
1694       return NULL;
1695     }
1696 }
1697
1698 static const char *
1699 get_sparc64_dynamic_type (unsigned long type)
1700 {
1701   switch (type)
1702     {
1703     case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1704     default:
1705       return NULL;
1706     }
1707 }
1708
1709 static const char *
1710 get_ppc_dynamic_type (unsigned long type)
1711 {
1712   switch (type)
1713     {
1714     case DT_PPC_GOT:    return "PPC_GOT";
1715     case DT_PPC_OPT:    return "PPC_OPT";
1716     default:
1717       return NULL;
1718     }
1719 }
1720
1721 static const char *
1722 get_ppc64_dynamic_type (unsigned long type)
1723 {
1724   switch (type)
1725     {
1726     case DT_PPC64_GLINK:  return "PPC64_GLINK";
1727     case DT_PPC64_OPD:    return "PPC64_OPD";
1728     case DT_PPC64_OPDSZ:  return "PPC64_OPDSZ";
1729     case DT_PPC64_OPT:    return "PPC64_OPT";
1730     default:
1731       return NULL;
1732     }
1733 }
1734
1735 static const char *
1736 get_parisc_dynamic_type (unsigned long type)
1737 {
1738   switch (type)
1739     {
1740     case DT_HP_LOAD_MAP:        return "HP_LOAD_MAP";
1741     case DT_HP_DLD_FLAGS:       return "HP_DLD_FLAGS";
1742     case DT_HP_DLD_HOOK:        return "HP_DLD_HOOK";
1743     case DT_HP_UX10_INIT:       return "HP_UX10_INIT";
1744     case DT_HP_UX10_INITSZ:     return "HP_UX10_INITSZ";
1745     case DT_HP_PREINIT:         return "HP_PREINIT";
1746     case DT_HP_PREINITSZ:       return "HP_PREINITSZ";
1747     case DT_HP_NEEDED:          return "HP_NEEDED";
1748     case DT_HP_TIME_STAMP:      return "HP_TIME_STAMP";
1749     case DT_HP_CHECKSUM:        return "HP_CHECKSUM";
1750     case DT_HP_GST_SIZE:        return "HP_GST_SIZE";
1751     case DT_HP_GST_VERSION:     return "HP_GST_VERSION";
1752     case DT_HP_GST_HASHVAL:     return "HP_GST_HASHVAL";
1753     case DT_HP_EPLTREL:         return "HP_GST_EPLTREL";
1754     case DT_HP_EPLTRELSZ:       return "HP_GST_EPLTRELSZ";
1755     case DT_HP_FILTERED:        return "HP_FILTERED";
1756     case DT_HP_FILTER_TLS:      return "HP_FILTER_TLS";
1757     case DT_HP_COMPAT_FILTERED: return "HP_COMPAT_FILTERED";
1758     case DT_HP_LAZYLOAD:        return "HP_LAZYLOAD";
1759     case DT_HP_BIND_NOW_COUNT:  return "HP_BIND_NOW_COUNT";
1760     case DT_PLT:                return "PLT";
1761     case DT_PLT_SIZE:           return "PLT_SIZE";
1762     case DT_DLT:                return "DLT";
1763     case DT_DLT_SIZE:           return "DLT_SIZE";
1764     default:
1765       return NULL;
1766     }
1767 }
1768
1769 static const char *
1770 get_ia64_dynamic_type (unsigned long type)
1771 {
1772   switch (type)
1773     {
1774     case DT_IA_64_PLT_RESERVE:         return "IA_64_PLT_RESERVE";
1775     case DT_IA_64_VMS_SUBTYPE:         return "VMS_SUBTYPE";
1776     case DT_IA_64_VMS_IMGIOCNT:        return "VMS_IMGIOCNT";
1777     case DT_IA_64_VMS_LNKFLAGS:        return "VMS_LNKFLAGS";
1778     case DT_IA_64_VMS_VIR_MEM_BLK_SIZ: return "VMS_VIR_MEM_BLK_SIZ";
1779     case DT_IA_64_VMS_IDENT:           return "VMS_IDENT";
1780     case DT_IA_64_VMS_NEEDED_IDENT:    return "VMS_NEEDED_IDENT";
1781     case DT_IA_64_VMS_IMG_RELA_CNT:    return "VMS_IMG_RELA_CNT";
1782     case DT_IA_64_VMS_SEG_RELA_CNT:    return "VMS_SEG_RELA_CNT";
1783     case DT_IA_64_VMS_FIXUP_RELA_CNT:  return "VMS_FIXUP_RELA_CNT";
1784     case DT_IA_64_VMS_FIXUP_NEEDED:    return "VMS_FIXUP_NEEDED";
1785     case DT_IA_64_VMS_SYMVEC_CNT:      return "VMS_SYMVEC_CNT";
1786     case DT_IA_64_VMS_XLATED:          return "VMS_XLATED";
1787     case DT_IA_64_VMS_STACKSIZE:       return "VMS_STACKSIZE";
1788     case DT_IA_64_VMS_UNWINDSZ:        return "VMS_UNWINDSZ";
1789     case DT_IA_64_VMS_UNWIND_CODSEG:   return "VMS_UNWIND_CODSEG";
1790     case DT_IA_64_VMS_UNWIND_INFOSEG:  return "VMS_UNWIND_INFOSEG";
1791     case DT_IA_64_VMS_LINKTIME:        return "VMS_LINKTIME";
1792     case DT_IA_64_VMS_SEG_NO:          return "VMS_SEG_NO";
1793     case DT_IA_64_VMS_SYMVEC_OFFSET:   return "VMS_SYMVEC_OFFSET";
1794     case DT_IA_64_VMS_SYMVEC_SEG:      return "VMS_SYMVEC_SEG";
1795     case DT_IA_64_VMS_UNWIND_OFFSET:   return "VMS_UNWIND_OFFSET";
1796     case DT_IA_64_VMS_UNWIND_SEG:      return "VMS_UNWIND_SEG";
1797     case DT_IA_64_VMS_STRTAB_OFFSET:   return "VMS_STRTAB_OFFSET";
1798     case DT_IA_64_VMS_SYSVER_OFFSET:   return "VMS_SYSVER_OFFSET";
1799     case DT_IA_64_VMS_IMG_RELA_OFF:    return "VMS_IMG_RELA_OFF";
1800     case DT_IA_64_VMS_SEG_RELA_OFF:    return "VMS_SEG_RELA_OFF";
1801     case DT_IA_64_VMS_FIXUP_RELA_OFF:  return "VMS_FIXUP_RELA_OFF";
1802     case DT_IA_64_VMS_PLTGOT_OFFSET:   return "VMS_PLTGOT_OFFSET";
1803     case DT_IA_64_VMS_PLTGOT_SEG:      return "VMS_PLTGOT_SEG";
1804     case DT_IA_64_VMS_FPMODE:          return "VMS_FPMODE";
1805     default:
1806       return NULL;
1807     }
1808 }
1809
1810 static const char *
1811 get_alpha_dynamic_type (unsigned long type)
1812 {
1813   switch (type)
1814     {
1815     case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
1816     default:
1817       return NULL;
1818     }
1819 }
1820
1821 static const char *
1822 get_score_dynamic_type (unsigned long type)
1823 {
1824   switch (type)
1825     {
1826     case DT_SCORE_BASE_ADDRESS: return "SCORE_BASE_ADDRESS";
1827     case DT_SCORE_LOCAL_GOTNO:  return "SCORE_LOCAL_GOTNO";
1828     case DT_SCORE_SYMTABNO:     return "SCORE_SYMTABNO";
1829     case DT_SCORE_GOTSYM:       return "SCORE_GOTSYM";
1830     case DT_SCORE_UNREFEXTNO:   return "SCORE_UNREFEXTNO";
1831     case DT_SCORE_HIPAGENO:     return "SCORE_HIPAGENO";
1832     default:
1833       return NULL;
1834     }
1835 }
1836
1837 static const char *
1838 get_tic6x_dynamic_type (unsigned long type)
1839 {
1840   switch (type)
1841     {
1842     case DT_C6000_GSYM_OFFSET: return "C6000_GSYM_OFFSET";
1843     case DT_C6000_GSTR_OFFSET: return "C6000_GSTR_OFFSET";
1844     case DT_C6000_DSBT_BASE:   return "C6000_DSBT_BASE";
1845     case DT_C6000_DSBT_SIZE:   return "C6000_DSBT_SIZE";
1846     case DT_C6000_PREEMPTMAP:  return "C6000_PREEMPTMAP";
1847     case DT_C6000_DSBT_INDEX:  return "C6000_DSBT_INDEX";
1848     default:
1849       return NULL;
1850     }
1851 }
1852
1853 static const char *
1854 get_nios2_dynamic_type (unsigned long type)
1855 {
1856   switch (type)
1857     {
1858     case DT_NIOS2_GP: return "NIOS2_GP";
1859     default:
1860       return NULL;
1861     }
1862 }
1863
1864 static const char *
1865 get_dynamic_type (unsigned long type)
1866 {
1867   static char buff[64];
1868
1869   switch (type)
1870     {
1871     case DT_NULL:       return "NULL";
1872     case DT_NEEDED:     return "NEEDED";
1873     case DT_PLTRELSZ:   return "PLTRELSZ";
1874     case DT_PLTGOT:     return "PLTGOT";
1875     case DT_HASH:       return "HASH";
1876     case DT_STRTAB:     return "STRTAB";
1877     case DT_SYMTAB:     return "SYMTAB";
1878     case DT_RELA:       return "RELA";
1879     case DT_RELASZ:     return "RELASZ";
1880     case DT_RELAENT:    return "RELAENT";
1881     case DT_STRSZ:      return "STRSZ";
1882     case DT_SYMENT:     return "SYMENT";
1883     case DT_INIT:       return "INIT";
1884     case DT_FINI:       return "FINI";
1885     case DT_SONAME:     return "SONAME";
1886     case DT_RPATH:      return "RPATH";
1887     case DT_SYMBOLIC:   return "SYMBOLIC";
1888     case DT_REL:        return "REL";
1889     case DT_RELSZ:      return "RELSZ";
1890     case DT_RELENT:     return "RELENT";
1891     case DT_PLTREL:     return "PLTREL";
1892     case DT_DEBUG:      return "DEBUG";
1893     case DT_TEXTREL:    return "TEXTREL";
1894     case DT_JMPREL:     return "JMPREL";
1895     case DT_BIND_NOW:   return "BIND_NOW";
1896     case DT_INIT_ARRAY: return "INIT_ARRAY";
1897     case DT_FINI_ARRAY: return "FINI_ARRAY";
1898     case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
1899     case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
1900     case DT_RUNPATH:    return "RUNPATH";
1901     case DT_FLAGS:      return "FLAGS";
1902
1903     case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1904     case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
1905
1906     case DT_CHECKSUM:   return "CHECKSUM";
1907     case DT_PLTPADSZ:   return "PLTPADSZ";
1908     case DT_MOVEENT:    return "MOVEENT";
1909     case DT_MOVESZ:     return "MOVESZ";
1910     case DT_FEATURE:    return "FEATURE";
1911     case DT_POSFLAG_1:  return "POSFLAG_1";
1912     case DT_SYMINSZ:    return "SYMINSZ";
1913     case DT_SYMINENT:   return "SYMINENT"; /* aka VALRNGHI */
1914
1915     case DT_ADDRRNGLO:  return "ADDRRNGLO";
1916     case DT_CONFIG:     return "CONFIG";
1917     case DT_DEPAUDIT:   return "DEPAUDIT";
1918     case DT_AUDIT:      return "AUDIT";
1919     case DT_PLTPAD:     return "PLTPAD";
1920     case DT_MOVETAB:    return "MOVETAB";
1921     case DT_SYMINFO:    return "SYMINFO"; /* aka ADDRRNGHI */
1922
1923     case DT_VERSYM:     return "VERSYM";
1924
1925     case DT_TLSDESC_GOT: return "TLSDESC_GOT";
1926     case DT_TLSDESC_PLT: return "TLSDESC_PLT";
1927     case DT_RELACOUNT:  return "RELACOUNT";
1928     case DT_RELCOUNT:   return "RELCOUNT";
1929     case DT_FLAGS_1:    return "FLAGS_1";
1930     case DT_VERDEF:     return "VERDEF";
1931     case DT_VERDEFNUM:  return "VERDEFNUM";
1932     case DT_VERNEED:    return "VERNEED";
1933     case DT_VERNEEDNUM: return "VERNEEDNUM";
1934
1935     case DT_AUXILIARY:  return "AUXILIARY";
1936     case DT_USED:       return "USED";
1937     case DT_FILTER:     return "FILTER";
1938
1939     case DT_GNU_PRELINKED: return "GNU_PRELINKED";
1940     case DT_GNU_CONFLICT: return "GNU_CONFLICT";
1941     case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
1942     case DT_GNU_LIBLIST: return "GNU_LIBLIST";
1943     case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
1944     case DT_GNU_HASH:   return "GNU_HASH";
1945
1946     default:
1947       if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
1948         {
1949           const char * result;
1950
1951           switch (elf_header.e_machine)
1952             {
1953             case EM_MIPS:
1954             case EM_MIPS_RS3_LE:
1955               result = get_mips_dynamic_type (type);
1956               break;
1957             case EM_SPARCV9:
1958               result = get_sparc64_dynamic_type (type);
1959               break;
1960             case EM_PPC:
1961               result = get_ppc_dynamic_type (type);
1962               break;
1963             case EM_PPC64:
1964               result = get_ppc64_dynamic_type (type);
1965               break;
1966             case EM_IA_64:
1967               result = get_ia64_dynamic_type (type);
1968               break;
1969             case EM_ALPHA:
1970               result = get_alpha_dynamic_type (type);
1971               break;
1972             case EM_SCORE:
1973               result = get_score_dynamic_type (type);
1974               break;
1975             case EM_TI_C6000:
1976               result = get_tic6x_dynamic_type (type);
1977               break;
1978             case EM_ALTERA_NIOS2:
1979               result = get_nios2_dynamic_type (type);
1980               break;
1981             default:
1982               result = NULL;
1983               break;
1984             }
1985
1986           if (result != NULL)
1987             return result;
1988
1989           snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
1990         }
1991       else if (((type >= DT_LOOS) && (type <= DT_HIOS))
1992                || (elf_header.e_machine == EM_PARISC
1993                    && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
1994         {
1995           const char * result;
1996
1997           switch (elf_header.e_machine)
1998             {
1999             case EM_PARISC:
2000               result = get_parisc_dynamic_type (type);
2001               break;
2002             case EM_IA_64:
2003               result = get_ia64_dynamic_type (type);
2004               break;
2005             default:
2006               result = NULL;
2007               break;
2008             }
2009
2010           if (result != NULL)
2011             return result;
2012
2013           snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
2014                     type);
2015         }
2016       else
2017         snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
2018
2019       return buff;
2020     }
2021 }
2022
2023 static char *
2024 get_file_type (unsigned e_type)
2025 {
2026   static char buff[32];
2027
2028   switch (e_type)
2029     {
2030     case ET_NONE:       return _("NONE (None)");
2031     case ET_REL:        return _("REL (Relocatable file)");
2032     case ET_EXEC:       return _("EXEC (Executable file)");
2033     case ET_DYN:        return _("DYN (Shared object file)");
2034     case ET_CORE:       return _("CORE (Core file)");
2035
2036     default:
2037       if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
2038         snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
2039       else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
2040         snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
2041       else
2042         snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
2043       return buff;
2044     }
2045 }
2046
2047 static char *
2048 get_machine_name (unsigned e_machine)
2049 {
2050   static char buff[64]; /* XXX */
2051
2052   switch (e_machine)
2053     {
2054     case EM_NONE:               return _("None");
2055     case EM_AARCH64:            return "AArch64";
2056     case EM_M32:                return "WE32100";
2057     case EM_SPARC:              return "Sparc";
2058     case EM_SPU:                return "SPU";
2059     case EM_386:                return "Intel 80386";
2060     case EM_68K:                return "MC68000";
2061     case EM_88K:                return "MC88000";
2062     case EM_486:                return "Intel 80486";
2063     case EM_860:                return "Intel 80860";
2064     case EM_MIPS:               return "MIPS R3000";
2065     case EM_S370:               return "IBM System/370";
2066     case EM_MIPS_RS3_LE:        return "MIPS R4000 big-endian";
2067     case EM_OLD_SPARCV9:        return "Sparc v9 (old)";
2068     case EM_PARISC:             return "HPPA";
2069     case EM_PPC_OLD:            return "Power PC (old)";
2070     case EM_SPARC32PLUS:        return "Sparc v8+" ;
2071     case EM_960:                return "Intel 90860";
2072     case EM_PPC:                return "PowerPC";
2073     case EM_PPC64:              return "PowerPC64";
2074     case EM_FR20:               return "Fujitsu FR20";
2075     case EM_RH32:               return "TRW RH32";
2076     case EM_MCORE:              return "MCORE";
2077     case EM_ARM:                return "ARM";
2078     case EM_OLD_ALPHA:          return "Digital Alpha (old)";
2079     case EM_SH:                 return "Renesas / SuperH SH";
2080     case EM_SPARCV9:            return "Sparc v9";
2081     case EM_TRICORE:            return "Siemens Tricore";
2082     case EM_ARC:                return "ARC";
2083     case EM_H8_300:             return "Renesas H8/300";
2084     case EM_H8_300H:            return "Renesas H8/300H";
2085     case EM_H8S:                return "Renesas H8S";
2086     case EM_H8_500:             return "Renesas H8/500";
2087     case EM_IA_64:              return "Intel IA-64";
2088     case EM_MIPS_X:             return "Stanford MIPS-X";
2089     case EM_COLDFIRE:           return "Motorola Coldfire";
2090     case EM_ALPHA:              return "Alpha";
2091     case EM_CYGNUS_D10V:
2092     case EM_D10V:               return "d10v";
2093     case EM_CYGNUS_D30V:
2094     case EM_D30V:               return "d30v";
2095     case EM_CYGNUS_M32R:
2096     case EM_M32R:               return "Renesas M32R (formerly Mitsubishi M32r)";
2097     case EM_CYGNUS_V850:
2098     case EM_V800:               return "Renesas V850 (using RH850 ABI)";
2099     case EM_V850:               return "Renesas V850";
2100     case EM_CYGNUS_MN10300:
2101     case EM_MN10300:            return "mn10300";
2102     case EM_CYGNUS_MN10200:
2103     case EM_MN10200:            return "mn10200";
2104     case EM_MOXIE:              return "Moxie";
2105     case EM_CYGNUS_FR30:
2106     case EM_FR30:               return "Fujitsu FR30";
2107     case EM_CYGNUS_FRV:         return "Fujitsu FR-V";
2108     case EM_PJ_OLD:
2109     case EM_PJ:                 return "picoJava";
2110     case EM_MMA:                return "Fujitsu Multimedia Accelerator";
2111     case EM_PCP:                return "Siemens PCP";
2112     case EM_NCPU:               return "Sony nCPU embedded RISC processor";
2113     case EM_NDR1:               return "Denso NDR1 microprocesspr";
2114     case EM_STARCORE:           return "Motorola Star*Core processor";
2115     case EM_ME16:               return "Toyota ME16 processor";
2116     case EM_ST100:              return "STMicroelectronics ST100 processor";
2117     case EM_TINYJ:              return "Advanced Logic Corp. TinyJ embedded processor";
2118     case EM_PDSP:               return "Sony DSP processor";
2119     case EM_PDP10:              return "Digital Equipment Corp. PDP-10";
2120     case EM_PDP11:              return "Digital Equipment Corp. PDP-11";
2121     case EM_FX66:               return "Siemens FX66 microcontroller";
2122     case EM_ST9PLUS:            return "STMicroelectronics ST9+ 8/16 bit microcontroller";
2123     case EM_ST7:                return "STMicroelectronics ST7 8-bit microcontroller";
2124     case EM_68HC16:             return "Motorola MC68HC16 Microcontroller";
2125     case EM_68HC12:             return "Motorola MC68HC12 Microcontroller";
2126     case EM_68HC11:             return "Motorola MC68HC11 Microcontroller";
2127     case EM_68HC08:             return "Motorola MC68HC08 Microcontroller";
2128     case EM_68HC05:             return "Motorola MC68HC05 Microcontroller";
2129     case EM_SVX:                return "Silicon Graphics SVx";
2130     case EM_ST19:               return "STMicroelectronics ST19 8-bit microcontroller";
2131     case EM_VAX:                return "Digital VAX";
2132     case EM_VISIUM:             return "CDS VISIUMcore processor";
2133     case EM_AVR_OLD:
2134     case EM_AVR:                return "Atmel AVR 8-bit microcontroller";
2135     case EM_CRIS:               return "Axis Communications 32-bit embedded processor";
2136     case EM_JAVELIN:            return "Infineon Technologies 32-bit embedded cpu";
2137     case EM_FIREPATH:           return "Element 14 64-bit DSP processor";
2138     case EM_ZSP:                return "LSI Logic's 16-bit DSP processor";
2139     case EM_MMIX:               return "Donald Knuth's educational 64-bit processor";
2140     case EM_HUANY:              return "Harvard Universitys's machine-independent object format";
2141     case EM_PRISM:              return "Vitesse Prism";
2142     case EM_X86_64:             return "Advanced Micro Devices X86-64";
2143     case EM_L1OM:               return "Intel L1OM";
2144     case EM_K1OM:               return "Intel K1OM";
2145     case EM_S390_OLD:
2146     case EM_S390:               return "IBM S/390";
2147     case EM_SCORE:              return "SUNPLUS S+Core";
2148     case EM_XSTORMY16:          return "Sanyo XStormy16 CPU core";
2149     case EM_OR1K:               return "OpenRISC 1000";
2150     case EM_ARC_A5:             return "ARC International ARCompact processor";
2151     case EM_CRX:                return "National Semiconductor CRX microprocessor";
2152     case EM_ADAPTEVA_EPIPHANY:  return "Adapteva EPIPHANY";
2153     case EM_DLX:                return "OpenDLX";
2154     case EM_IP2K_OLD:
2155     case EM_IP2K:               return "Ubicom IP2xxx 8-bit microcontrollers";
2156     case EM_IQ2000:             return "Vitesse IQ2000";
2157     case EM_XTENSA_OLD:
2158     case EM_XTENSA:             return "Tensilica Xtensa Processor";
2159     case EM_VIDEOCORE:          return "Alphamosaic VideoCore processor";
2160     case EM_TMM_GPP:            return "Thompson Multimedia General Purpose Processor";
2161     case EM_NS32K:              return "National Semiconductor 32000 series";
2162     case EM_TPC:                return "Tenor Network TPC processor";
2163     case EM_ST200:              return "STMicroelectronics ST200 microcontroller";
2164     case EM_MAX:                return "MAX Processor";
2165     case EM_CR:                 return "National Semiconductor CompactRISC";
2166     case EM_F2MC16:             return "Fujitsu F2MC16";
2167     case EM_MSP430:             return "Texas Instruments msp430 microcontroller";
2168     case EM_LATTICEMICO32:      return "Lattice Mico32";
2169     case EM_M32C_OLD:
2170     case EM_M32C:               return "Renesas M32c";
2171     case EM_MT:                 return "Morpho Techologies MT processor";
2172     case EM_BLACKFIN:           return "Analog Devices Blackfin";
2173     case EM_SE_C33:             return "S1C33 Family of Seiko Epson processors";
2174     case EM_SEP:                return "Sharp embedded microprocessor";
2175     case EM_ARCA:               return "Arca RISC microprocessor";
2176     case EM_UNICORE:            return "Unicore";
2177     case EM_EXCESS:             return "eXcess 16/32/64-bit configurable embedded CPU";
2178     case EM_DXP:                return "Icera Semiconductor Inc. Deep Execution Processor";
2179     case EM_NIOS32:             return "Altera Nios";
2180     case EM_ALTERA_NIOS2:       return "Altera Nios II";
2181     case EM_C166:
2182     case EM_XC16X:              return "Infineon Technologies xc16x";
2183     case EM_M16C:               return "Renesas M16C series microprocessors";
2184     case EM_DSPIC30F:           return "Microchip Technology dsPIC30F Digital Signal Controller";
2185     case EM_CE:                 return "Freescale Communication Engine RISC core";
2186     case EM_TSK3000:            return "Altium TSK3000 core";
2187     case EM_RS08:               return "Freescale RS08 embedded processor";
2188     case EM_ECOG2:              return "Cyan Technology eCOG2 microprocessor";
2189     case EM_DSP24:              return "New Japan Radio (NJR) 24-bit DSP Processor";
2190     case EM_VIDEOCORE3:         return "Broadcom VideoCore III processor";
2191     case EM_SE_C17:             return "Seiko Epson C17 family";
2192     case EM_TI_C6000:           return "Texas Instruments TMS320C6000 DSP family";
2193     case EM_TI_C2000:           return "Texas Instruments TMS320C2000 DSP family";
2194     case EM_TI_C5500:           return "Texas Instruments TMS320C55x DSP family";
2195     case EM_MMDSP_PLUS:         return "STMicroelectronics 64bit VLIW Data Signal Processor";
2196     case EM_CYPRESS_M8C:        return "Cypress M8C microprocessor";
2197     case EM_R32C:               return "Renesas R32C series microprocessors";
2198     case EM_TRIMEDIA:           return "NXP Semiconductors TriMedia architecture family";
2199     case EM_QDSP6:              return "QUALCOMM DSP6 Processor";
2200     case EM_8051:               return "Intel 8051 and variants";
2201     case EM_STXP7X:             return "STMicroelectronics STxP7x family";
2202     case EM_NDS32:              return "Andes Technology compact code size embedded RISC processor family";
2203     case EM_ECOG1X:             return "Cyan Technology eCOG1X family";
2204     case EM_MAXQ30:             return "Dallas Semiconductor MAXQ30 Core microcontrollers";
2205     case EM_XIMO16:             return "New Japan Radio (NJR) 16-bit DSP Processor";
2206     case EM_MANIK:              return "M2000 Reconfigurable RISC Microprocessor";
2207     case EM_CRAYNV2:            return "Cray Inc. NV2 vector architecture";
2208     case EM_CYGNUS_MEP:         return "Toshiba MeP Media Engine";
2209     case EM_CR16:
2210     case EM_MICROBLAZE:
2211     case EM_MICROBLAZE_OLD:     return "Xilinx MicroBlaze";
2212     case EM_RL78:               return "Renesas RL78";
2213     case EM_RX:                 return "Renesas RX";
2214     case EM_METAG:              return "Imagination Technologies Meta processor architecture";
2215     case EM_MCST_ELBRUS:        return "MCST Elbrus general purpose hardware architecture";
2216     case EM_ECOG16:             return "Cyan Technology eCOG16 family";
2217     case EM_ETPU:               return "Freescale Extended Time Processing Unit";
2218     case EM_SLE9X:              return "Infineon Technologies SLE9X core";
2219     case EM_AVR32:              return "Atmel Corporation 32-bit microprocessor family";
2220     case EM_STM8:               return "STMicroeletronics STM8 8-bit microcontroller";
2221     case EM_TILE64:             return "Tilera TILE64 multicore architecture family";
2222     case EM_TILEPRO:            return "Tilera TILEPro multicore architecture family";
2223     case EM_TILEGX:             return "Tilera TILE-Gx multicore architecture family";
2224     case EM_CUDA:               return "NVIDIA CUDA architecture";
2225     case EM_XGATE:              return "Motorola XGATE embedded processor";
2226     default:
2227       snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
2228       return buff;
2229     }
2230 }
2231
2232 static void
2233 decode_ARM_machine_flags (unsigned e_flags, char buf[])
2234 {
2235   unsigned eabi;
2236   int unknown = 0;
2237
2238   eabi = EF_ARM_EABI_VERSION (e_flags);
2239   e_flags &= ~ EF_ARM_EABIMASK;
2240
2241   /* Handle "generic" ARM flags.  */
2242   if (e_flags & EF_ARM_RELEXEC)
2243     {
2244       strcat (buf, ", relocatable executable");
2245       e_flags &= ~ EF_ARM_RELEXEC;
2246     }
2247
2248   if (e_flags & EF_ARM_HASENTRY)
2249     {
2250       strcat (buf, ", has entry point");
2251       e_flags &= ~ EF_ARM_HASENTRY;
2252     }
2253
2254   /* Now handle EABI specific flags.  */
2255   switch (eabi)
2256     {
2257     default:
2258       strcat (buf, ", <unrecognized EABI>");
2259       if (e_flags)
2260         unknown = 1;
2261       break;
2262
2263     case EF_ARM_EABI_VER1:
2264       strcat (buf, ", Version1 EABI");
2265       while (e_flags)
2266         {
2267           unsigned flag;
2268
2269           /* Process flags one bit at a time.  */
2270           flag = e_flags & - e_flags;
2271           e_flags &= ~ flag;
2272
2273           switch (flag)
2274             {
2275             case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK.  */
2276               strcat (buf, ", sorted symbol tables");
2277               break;
2278
2279             default:
2280               unknown = 1;
2281               break;
2282             }
2283         }
2284       break;
2285
2286     case EF_ARM_EABI_VER2:
2287       strcat (buf, ", Version2 EABI");
2288       while (e_flags)
2289         {
2290           unsigned flag;
2291
2292           /* Process flags one bit at a time.  */
2293           flag = e_flags & - e_flags;
2294           e_flags &= ~ flag;
2295
2296           switch (flag)
2297             {
2298             case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK.  */
2299               strcat (buf, ", sorted symbol tables");
2300               break;
2301
2302             case EF_ARM_DYNSYMSUSESEGIDX:
2303               strcat (buf, ", dynamic symbols use segment index");
2304               break;
2305
2306             case EF_ARM_MAPSYMSFIRST:
2307               strcat (buf, ", mapping symbols precede others");
2308               break;
2309
2310             default:
2311               unknown = 1;
2312               break;
2313             }
2314         }
2315       break;
2316
2317     case EF_ARM_EABI_VER3:
2318       strcat (buf, ", Version3 EABI");
2319       break;
2320
2321     case EF_ARM_EABI_VER4:
2322       strcat (buf, ", Version4 EABI");
2323       while (e_flags)
2324         {
2325           unsigned flag;
2326
2327           /* Process flags one bit at a time.  */
2328           flag = e_flags & - e_flags;
2329           e_flags &= ~ flag;
2330
2331           switch (flag)
2332             {
2333             case EF_ARM_BE8:
2334               strcat (buf, ", BE8");
2335               break;
2336
2337             case EF_ARM_LE8:
2338               strcat (buf, ", LE8");
2339               break;
2340
2341             default:
2342               unknown = 1;
2343               break;
2344             }
2345       break;
2346         }
2347       break;
2348
2349     case EF_ARM_EABI_VER5:
2350       strcat (buf, ", Version5 EABI");
2351       while (e_flags)
2352         {
2353           unsigned flag;
2354
2355           /* Process flags one bit at a time.  */
2356           flag = e_flags & - e_flags;
2357           e_flags &= ~ flag;
2358
2359           switch (flag)
2360             {
2361             case EF_ARM_BE8:
2362               strcat (buf, ", BE8");
2363               break;
2364
2365             case EF_ARM_LE8:
2366               strcat (buf, ", LE8");
2367               break;
2368
2369             case EF_ARM_ABI_FLOAT_SOFT: /* Conflicts with EF_ARM_SOFT_FLOAT.  */
2370               strcat (buf, ", soft-float ABI");
2371               break;
2372
2373             case EF_ARM_ABI_FLOAT_HARD: /* Conflicts with EF_ARM_VFP_FLOAT.  */
2374               strcat (buf, ", hard-float ABI");
2375               break;
2376
2377             default:
2378               unknown = 1;
2379               break;
2380             }
2381         }
2382       break;
2383
2384     case EF_ARM_EABI_UNKNOWN:
2385       strcat (buf, ", GNU EABI");
2386       while (e_flags)
2387         {
2388           unsigned flag;
2389
2390           /* Process flags one bit at a time.  */
2391           flag = e_flags & - e_flags;
2392           e_flags &= ~ flag;
2393
2394           switch (flag)
2395             {
2396             case EF_ARM_INTERWORK:
2397               strcat (buf, ", interworking enabled");
2398               break;
2399
2400             case EF_ARM_APCS_26:
2401               strcat (buf, ", uses APCS/26");
2402               break;
2403
2404             case EF_ARM_APCS_FLOAT:
2405               strcat (buf, ", uses APCS/float");
2406               break;
2407
2408             case EF_ARM_PIC:
2409               strcat (buf, ", position independent");
2410               break;
2411
2412             case EF_ARM_ALIGN8:
2413               strcat (buf, ", 8 bit structure alignment");
2414               break;
2415
2416             case EF_ARM_NEW_ABI:
2417               strcat (buf, ", uses new ABI");
2418               break;
2419
2420             case EF_ARM_OLD_ABI:
2421               strcat (buf, ", uses old ABI");
2422               break;
2423
2424             case EF_ARM_SOFT_FLOAT:
2425               strcat (buf, ", software FP");
2426               break;
2427
2428             case EF_ARM_VFP_FLOAT:
2429               strcat (buf, ", VFP");
2430               break;
2431
2432             case EF_ARM_MAVERICK_FLOAT:
2433               strcat (buf, ", Maverick FP");
2434               break;
2435
2436             default:
2437               unknown = 1;
2438               break;
2439             }
2440         }
2441     }
2442
2443   if (unknown)
2444     strcat (buf,_(", <unknown>"));
2445 }
2446
2447 static void
2448 decode_AVR_machine_flags (unsigned e_flags, char buf[], size_t size)
2449 {
2450   --size; /* Leave space for null terminator.  */
2451
2452   switch (e_flags & EF_AVR_MACH)
2453     {
2454     case E_AVR_MACH_AVR1:
2455       strncat (buf, ", avr:1", size);
2456       break;
2457     case E_AVR_MACH_AVR2:
2458       strncat (buf, ", avr:2", size);
2459       break;
2460     case E_AVR_MACH_AVR25:
2461       strncat (buf, ", avr:25", size);
2462       break;
2463     case E_AVR_MACH_AVR3:
2464       strncat (buf, ", avr:3", size);
2465       break;
2466     case E_AVR_MACH_AVR31:
2467       strncat (buf, ", avr:31", size);
2468       break;
2469     case E_AVR_MACH_AVR35:
2470       strncat (buf, ", avr:35", size);
2471       break;
2472     case E_AVR_MACH_AVR4:
2473       strncat (buf, ", avr:4", size);
2474       break;
2475     case E_AVR_MACH_AVR5:
2476       strncat (buf, ", avr:5", size);
2477       break;
2478     case E_AVR_MACH_AVR51:
2479       strncat (buf, ", avr:51", size);
2480       break;
2481     case E_AVR_MACH_AVR6:
2482       strncat (buf, ", avr:6", size);
2483       break;
2484     case E_AVR_MACH_AVRTINY:
2485       strncat (buf, ", avr:100", size);
2486       break;
2487     case E_AVR_MACH_XMEGA1:
2488       strncat (buf, ", avr:101", size);
2489       break;
2490     case E_AVR_MACH_XMEGA2:
2491       strncat (buf, ", avr:102", size);
2492       break;
2493     case E_AVR_MACH_XMEGA3:
2494       strncat (buf, ", avr:103", size);
2495       break;
2496     case E_AVR_MACH_XMEGA4:
2497       strncat (buf, ", avr:104", size);
2498       break;
2499     case E_AVR_MACH_XMEGA5:
2500       strncat (buf, ", avr:105", size);
2501       break;
2502     case E_AVR_MACH_XMEGA6:
2503       strncat (buf, ", avr:106", size);
2504       break;
2505     case E_AVR_MACH_XMEGA7:
2506       strncat (buf, ", avr:107", size);
2507       break;
2508     default:
2509       strncat (buf, ", avr:<unknown>", size);
2510       break;
2511     }
2512
2513   size -= strlen (buf);
2514   if (e_flags & EF_AVR_LINKRELAX_PREPARED)
2515     strncat (buf, ", link-relax", size);
2516 }
2517
2518 static void
2519 decode_NDS32_machine_flags (unsigned e_flags, char buf[], size_t size)
2520 {
2521   unsigned abi;
2522   unsigned arch;
2523   unsigned config;
2524   unsigned version;
2525   int has_fpu = 0;
2526   int r = 0;
2527
2528   static const char *ABI_STRINGS[] =
2529   {
2530     "ABI v0", /* use r5 as return register; only used in N1213HC */
2531     "ABI v1", /* use r0 as return register */
2532     "ABI v2", /* use r0 as return register and don't reserve 24 bytes for arguments */
2533     "ABI v2fp", /* for FPU */
2534     "AABI",
2535     "ABI2 FP+"
2536   };
2537   static const char *VER_STRINGS[] =
2538   {
2539     "Andes ELF V1.3 or older",
2540     "Andes ELF V1.3.1",
2541     "Andes ELF V1.4"
2542   };
2543   static const char *ARCH_STRINGS[] =
2544   {
2545     "",
2546     "Andes Star v1.0",
2547     "Andes Star v2.0",
2548     "Andes Star v3.0",
2549     "Andes Star v3.0m"
2550   };
2551
2552   abi = EF_NDS_ABI & e_flags;
2553   arch = EF_NDS_ARCH & e_flags;
2554   config = EF_NDS_INST & e_flags;
2555   version = EF_NDS32_ELF_VERSION & e_flags;
2556
2557   memset (buf, 0, size);
2558
2559   switch (abi)
2560     {
2561     case E_NDS_ABI_V0:
2562     case E_NDS_ABI_V1:
2563     case E_NDS_ABI_V2:
2564     case E_NDS_ABI_V2FP:
2565     case E_NDS_ABI_AABI:
2566     case E_NDS_ABI_V2FP_PLUS:
2567       /* In case there are holes in the array.  */
2568       r += snprintf (buf + r, size - r, ", %s", ABI_STRINGS[abi >> EF_NDS_ABI_SHIFT]);
2569       break;
2570
2571     default:
2572       r += snprintf (buf + r, size - r, ", <unrecognized ABI>");
2573       break;
2574     }
2575
2576   switch (version)
2577     {
2578     case E_NDS32_ELF_VER_1_2:
2579     case E_NDS32_ELF_VER_1_3:
2580     case E_NDS32_ELF_VER_1_4:
2581       r += snprintf (buf + r, size - r, ", %s", VER_STRINGS[version >> EF_NDS32_ELF_VERSION_SHIFT]);
2582       break;
2583
2584     default:
2585       r += snprintf (buf + r, size - r, ", <unrecognized ELF version number>");
2586       break;
2587     }
2588
2589   if (E_NDS_ABI_V0 == abi)
2590     {
2591       /* OLD ABI; only used in N1213HC, has performance extension 1.  */
2592       r += snprintf (buf + r, size - r, ", Andes Star v1.0, N1213HC, MAC, PERF1");
2593       if (arch == E_NDS_ARCH_STAR_V1_0)
2594         r += snprintf (buf + r, size -r, ", 16b"); /* has 16-bit instructions */
2595       return;
2596     }
2597
2598   switch (arch)
2599     {
2600     case E_NDS_ARCH_STAR_V1_0:
2601     case E_NDS_ARCH_STAR_V2_0:
2602     case E_NDS_ARCH_STAR_V3_0:
2603     case E_NDS_ARCH_STAR_V3_M:
2604       r += snprintf (buf + r, size - r, ", %s", ARCH_STRINGS[arch >> EF_NDS_ARCH_SHIFT]);
2605       break;
2606
2607     default:
2608       r += snprintf (buf + r, size - r, ", <unrecognized architecture>");
2609       /* ARCH version determines how the e_flags are interpreted.
2610          If it is unknown, we cannot proceed.  */
2611       return;
2612     }
2613
2614   /* Newer ABI; Now handle architecture specific flags.  */
2615   if (arch == E_NDS_ARCH_STAR_V1_0)
2616     {
2617       if (config & E_NDS32_HAS_MFUSR_PC_INST)
2618         r += snprintf (buf + r, size -r, ", MFUSR_PC");
2619
2620       if (!(config & E_NDS32_HAS_NO_MAC_INST))
2621         r += snprintf (buf + r, size -r, ", MAC");
2622
2623       if (config & E_NDS32_HAS_DIV_INST)
2624         r += snprintf (buf + r, size -r, ", DIV");
2625
2626       if (config & E_NDS32_HAS_16BIT_INST)
2627         r += snprintf (buf + r, size -r, ", 16b");
2628     }
2629   else
2630     {
2631       if (config & E_NDS32_HAS_MFUSR_PC_INST)
2632         {
2633           if (version <= E_NDS32_ELF_VER_1_3)
2634             r += snprintf (buf + r, size -r, ", [B8]");
2635           else
2636             r += snprintf (buf + r, size -r, ", EX9");
2637         }
2638
2639       if (config & E_NDS32_HAS_MAC_DX_INST)
2640         r += snprintf (buf + r, size -r, ", MAC_DX");
2641
2642       if (config & E_NDS32_HAS_DIV_DX_INST)
2643         r += snprintf (buf + r, size -r, ", DIV_DX");
2644
2645       if (config & E_NDS32_HAS_16BIT_INST)
2646         {
2647           if (version <= E_NDS32_ELF_VER_1_3)
2648             r += snprintf (buf + r, size -r, ", 16b");
2649           else
2650             r += snprintf (buf + r, size -r, ", IFC");
2651         }
2652     }
2653
2654   if (config & E_NDS32_HAS_EXT_INST)
2655     r += snprintf (buf + r, size -r, ", PERF1");
2656
2657   if (config & E_NDS32_HAS_EXT2_INST)
2658     r += snprintf (buf + r, size -r, ", PERF2");
2659
2660   if (config & E_NDS32_HAS_FPU_INST)
2661     {
2662       has_fpu = 1;
2663       r += snprintf (buf + r, size -r, ", FPU_SP");
2664     }
2665
2666   if (config & E_NDS32_HAS_FPU_DP_INST)
2667     {
2668       has_fpu = 1;
2669       r += snprintf (buf + r, size -r, ", FPU_DP");
2670     }
2671
2672   if (config & E_NDS32_HAS_FPU_MAC_INST)
2673     {
2674       has_fpu = 1;
2675       r += snprintf (buf + r, size -r, ", FPU_MAC");
2676     }
2677
2678   if (has_fpu)
2679     {
2680       switch ((config & E_NDS32_FPU_REG_CONF) >> E_NDS32_FPU_REG_CONF_SHIFT)
2681         {
2682         case E_NDS32_FPU_REG_8SP_4DP:
2683           r += snprintf (buf + r, size -r, ", FPU_REG:8/4");
2684           break;
2685         case E_NDS32_FPU_REG_16SP_8DP:
2686           r += snprintf (buf + r, size -r, ", FPU_REG:16/8");
2687           break;
2688         case E_NDS32_FPU_REG_32SP_16DP:
2689           r += snprintf (buf + r, size -r, ", FPU_REG:32/16");
2690           break;
2691         case E_NDS32_FPU_REG_32SP_32DP:
2692           r += snprintf (buf + r, size -r, ", FPU_REG:32/32");
2693           break;
2694         }
2695     }
2696
2697   if (config & E_NDS32_HAS_AUDIO_INST)
2698     r += snprintf (buf + r, size -r, ", AUDIO");
2699
2700   if (config & E_NDS32_HAS_STRING_INST)
2701     r += snprintf (buf + r, size -r, ", STR");
2702
2703   if (config & E_NDS32_HAS_REDUCED_REGS)
2704     r += snprintf (buf + r, size -r, ", 16REG");
2705
2706   if (config & E_NDS32_HAS_VIDEO_INST)
2707     {
2708       if (version <= E_NDS32_ELF_VER_1_3)
2709         r += snprintf (buf + r, size -r, ", VIDEO");
2710       else
2711         r += snprintf (buf + r, size -r, ", SATURATION");
2712     }
2713
2714   if (config & E_NDS32_HAS_ENCRIPT_INST)
2715     r += snprintf (buf + r, size -r, ", ENCRP");
2716
2717   if (config & E_NDS32_HAS_L2C_INST)
2718     r += snprintf (buf + r, size -r, ", L2C");
2719 }
2720
2721 static char *
2722 get_machine_flags (unsigned e_flags, unsigned e_machine)
2723 {
2724   static char buf[1024];
2725
2726   buf[0] = '\0';
2727
2728   if (e_flags)
2729     {
2730       switch (e_machine)
2731         {
2732         default:
2733           break;
2734
2735         case EM_ARM:
2736           decode_ARM_machine_flags (e_flags, buf);
2737           break;
2738
2739         case EM_AVR:
2740           decode_AVR_machine_flags (e_flags, buf, sizeof buf);
2741           break;
2742
2743         case EM_BLACKFIN:
2744           if (e_flags & EF_BFIN_PIC)
2745             strcat (buf, ", PIC");
2746
2747           if (e_flags & EF_BFIN_FDPIC)
2748             strcat (buf, ", FDPIC");
2749
2750           if (e_flags & EF_BFIN_CODE_IN_L1)
2751             strcat (buf, ", code in L1");
2752
2753           if (e_flags & EF_BFIN_DATA_IN_L1)
2754             strcat (buf, ", data in L1");
2755
2756           break;
2757
2758         case EM_CYGNUS_FRV:
2759           switch (e_flags & EF_FRV_CPU_MASK)
2760             {
2761             case EF_FRV_CPU_GENERIC:
2762               break;
2763
2764             default:
2765               strcat (buf, ", fr???");
2766               break;
2767
2768             case EF_FRV_CPU_FR300:
2769               strcat (buf, ", fr300");
2770               break;
2771
2772             case EF_FRV_CPU_FR400:
2773               strcat (buf, ", fr400");
2774               break;
2775             case EF_FRV_CPU_FR405:
2776               strcat (buf, ", fr405");
2777               break;
2778
2779             case EF_FRV_CPU_FR450:
2780               strcat (buf, ", fr450");
2781               break;
2782
2783             case EF_FRV_CPU_FR500:
2784               strcat (buf, ", fr500");
2785               break;
2786             case EF_FRV_CPU_FR550:
2787               strcat (buf, ", fr550");
2788               break;
2789
2790             case EF_FRV_CPU_SIMPLE:
2791               strcat (buf, ", simple");
2792               break;
2793             case EF_FRV_CPU_TOMCAT:
2794               strcat (buf, ", tomcat");
2795               break;
2796             }
2797           break;
2798
2799         case EM_68K:
2800           if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
2801             strcat (buf, ", m68000");
2802           else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
2803             strcat (buf, ", cpu32");
2804           else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
2805             strcat (buf, ", fido_a");
2806           else
2807             {
2808               char const * isa = _("unknown");
2809               char const * mac = _("unknown mac");
2810               char const * additional = NULL;
2811
2812               switch (e_flags & EF_M68K_CF_ISA_MASK)
2813                 {
2814                 case EF_M68K_CF_ISA_A_NODIV:
2815                   isa = "A";
2816                   additional = ", nodiv";
2817                   break;
2818                 case EF_M68K_CF_ISA_A:
2819                   isa = "A";
2820                   break;
2821                 case EF_M68K_CF_ISA_A_PLUS:
2822                   isa = "A+";
2823                   break;
2824                 case EF_M68K_CF_ISA_B_NOUSP:
2825                   isa = "B";
2826                   additional = ", nousp";
2827                   break;
2828                 case EF_M68K_CF_ISA_B:
2829                   isa = "B";
2830                   break;
2831                 case EF_M68K_CF_ISA_C:
2832                   isa = "C";
2833                   break;
2834                 case EF_M68K_CF_ISA_C_NODIV:
2835                   isa = "C";
2836                   additional = ", nodiv";
2837                   break;
2838                 }
2839               strcat (buf, ", cf, isa ");
2840               strcat (buf, isa);
2841               if (additional)
2842                 strcat (buf, additional);
2843               if (e_flags & EF_M68K_CF_FLOAT)
2844                 strcat (buf, ", float");
2845               switch (e_flags & EF_M68K_CF_MAC_MASK)
2846                 {
2847                 case 0:
2848                   mac = NULL;
2849                   break;
2850                 case EF_M68K_CF_MAC:
2851                   mac = "mac";
2852                   break;
2853                 case EF_M68K_CF_EMAC:
2854                   mac = "emac";
2855                   break;
2856                 case EF_M68K_CF_EMAC_B:
2857                   mac = "emac_b";
2858                   break;
2859                 }
2860               if (mac)
2861                 {
2862                   strcat (buf, ", ");
2863                   strcat (buf, mac);
2864                 }
2865             }
2866           break;
2867
2868         case EM_PPC:
2869           if (e_flags & EF_PPC_EMB)
2870             strcat (buf, ", emb");
2871
2872           if (e_flags & EF_PPC_RELOCATABLE)
2873             strcat (buf, _(", relocatable"));
2874
2875           if (e_flags & EF_PPC_RELOCATABLE_LIB)
2876             strcat (buf, _(", relocatable-lib"));
2877           break;
2878
2879         case EM_PPC64:
2880           if (e_flags & EF_PPC64_ABI)
2881             {
2882               char abi[] = ", abiv0";
2883
2884               abi[6] += e_flags & EF_PPC64_ABI;
2885               strcat (buf, abi);
2886             }
2887           break;
2888
2889         case EM_V800:
2890           if ((e_flags & EF_RH850_ABI) == EF_RH850_ABI)
2891             strcat (buf, ", RH850 ABI");
2892
2893           if (e_flags & EF_V800_850E3)
2894             strcat (buf, ", V3 architecture");
2895
2896           if ((e_flags & (EF_RH850_FPU_DOUBLE | EF_RH850_FPU_SINGLE)) == 0)
2897             strcat (buf, ", FPU not used");
2898
2899           if ((e_flags & (EF_RH850_REGMODE22 | EF_RH850_REGMODE32)) == 0)
2900             strcat (buf, ", regmode: COMMON");
2901
2902           if ((e_flags & (EF_RH850_GP_FIX | EF_RH850_GP_NOFIX)) == 0)
2903             strcat (buf, ", r4 not used");
2904
2905           if ((e_flags & (EF_RH850_EP_FIX | EF_RH850_EP_NOFIX)) == 0)
2906             strcat (buf, ", r30 not used");
2907
2908           if ((e_flags & (EF_RH850_TP_FIX | EF_RH850_TP_NOFIX)) == 0)
2909             strcat (buf, ", r5 not used");
2910
2911           if ((e_flags & (EF_RH850_REG2_RESERVE | EF_RH850_REG2_NORESERVE)) == 0)
2912             strcat (buf, ", r2 not used");
2913
2914           for (e_flags &= 0xFFFF; e_flags; e_flags &= ~ (e_flags & - e_flags))
2915             {
2916               switch (e_flags & - e_flags)
2917                 {
2918                 case EF_RH850_FPU_DOUBLE: strcat (buf, ", double precision FPU"); break;
2919                 case EF_RH850_FPU_SINGLE: strcat (buf, ", single precision FPU"); break;
2920                 case EF_RH850_SIMD: strcat (buf, ", SIMD"); break;
2921                 case EF_RH850_CACHE: strcat (buf, ", CACHE"); break;
2922                 case EF_RH850_MMU: strcat (buf, ", MMU"); break;
2923                 case EF_RH850_REGMODE22: strcat (buf, ", regmode:22"); break;
2924                 case EF_RH850_REGMODE32: strcat (buf, ", regmode:23"); break;
2925                 case EF_RH850_DATA_ALIGN8: strcat (buf, ", 8-byte alignment"); break;
2926                 case EF_RH850_GP_FIX: strcat (buf, ", r4 fixed"); break;
2927                 case EF_RH850_GP_NOFIX: strcat (buf, ", r4 free"); break;
2928                 case EF_RH850_EP_FIX: strcat (buf, ", r30 fixed"); break;
2929                 case EF_RH850_EP_NOFIX: strcat (buf, ", r30 free"); break;
2930                 case EF_RH850_TP_FIX: strcat (buf, ", r5 fixed"); break;
2931                 case EF_RH850_TP_NOFIX: strcat (buf, ", r5 free"); break;
2932                 case EF_RH850_REG2_RESERVE: strcat (buf, ", r2 fixed"); break;
2933                 case EF_RH850_REG2_NORESERVE: strcat (buf, ", r2 free"); break;
2934                 default: break;
2935                 }
2936             }
2937           break;
2938
2939         case EM_V850:
2940         case EM_CYGNUS_V850:
2941           switch (e_flags & EF_V850_ARCH)
2942             {
2943             case E_V850E3V5_ARCH:
2944               strcat (buf, ", v850e3v5");
2945               break;
2946             case E_V850E2V3_ARCH:
2947               strcat (buf, ", v850e2v3");
2948               break;
2949             case E_V850E2_ARCH:
2950               strcat (buf, ", v850e2");
2951               break;
2952             case E_V850E1_ARCH:
2953               strcat (buf, ", v850e1");
2954               break;
2955             case E_V850E_ARCH:
2956               strcat (buf, ", v850e");
2957               break;
2958             case E_V850_ARCH:
2959               strcat (buf, ", v850");
2960               break;
2961             default:
2962               strcat (buf, _(", unknown v850 architecture variant"));
2963               break;
2964             }
2965           break;
2966
2967         case EM_M32R:
2968         case EM_CYGNUS_M32R:
2969           if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
2970             strcat (buf, ", m32r");
2971           break;
2972
2973         case EM_MIPS:
2974         case EM_MIPS_RS3_LE:
2975           if (e_flags & EF_MIPS_NOREORDER)
2976             strcat (buf, ", noreorder");
2977
2978           if (e_flags & EF_MIPS_PIC)
2979             strcat (buf, ", pic");
2980
2981           if (e_flags & EF_MIPS_CPIC)
2982             strcat (buf, ", cpic");
2983
2984           if (e_flags & EF_MIPS_UCODE)
2985             strcat (buf, ", ugen_reserved");
2986
2987           if (e_flags & EF_MIPS_ABI2)
2988             strcat (buf, ", abi2");
2989
2990           if (e_flags & EF_MIPS_OPTIONS_FIRST)
2991             strcat (buf, ", odk first");
2992
2993           if (e_flags & EF_MIPS_32BITMODE)
2994             strcat (buf, ", 32bitmode");
2995
2996           if (e_flags & EF_MIPS_NAN2008)
2997             strcat (buf, ", nan2008");
2998
2999           if (e_flags & EF_MIPS_FP64)
3000             strcat (buf, ", fp64");
3001
3002           switch ((e_flags & EF_MIPS_MACH))
3003             {
3004             case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
3005             case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
3006             case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
3007             case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
3008             case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
3009             case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
3010             case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
3011             case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
3012             case E_MIPS_MACH_SB1:  strcat (buf, ", sb1");  break;
3013             case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
3014             case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break;
3015             case E_MIPS_MACH_LS2F: strcat (buf, ", loongson-2f"); break;
3016             case E_MIPS_MACH_LS3A: strcat (buf, ", loongson-3a"); break;
3017             case E_MIPS_MACH_OCTEON: strcat (buf, ", octeon"); break;
3018             case E_MIPS_MACH_OCTEON2: strcat (buf, ", octeon2"); break;
3019             case E_MIPS_MACH_OCTEON3: strcat (buf, ", octeon3"); break;
3020             case E_MIPS_MACH_XLR:  strcat (buf, ", xlr"); break;
3021             case 0:
3022             /* We simply ignore the field in this case to avoid confusion:
3023                MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
3024                extension.  */
3025               break;
3026             default: strcat (buf, _(", unknown CPU")); break;
3027             }
3028
3029           switch ((e_flags & EF_MIPS_ABI))
3030             {
3031             case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
3032             case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
3033             case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
3034             case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
3035             case 0:
3036             /* We simply ignore the field in this case to avoid confusion:
3037                MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
3038                This means it is likely to be an o32 file, but not for
3039                sure.  */
3040               break;
3041             default: strcat (buf, _(", unknown ABI")); break;
3042             }
3043
3044           if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
3045             strcat (buf, ", mdmx");
3046
3047           if (e_flags & EF_MIPS_ARCH_ASE_M16)
3048             strcat (buf, ", mips16");
3049
3050           if (e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
3051             strcat (buf, ", micromips");
3052
3053           switch ((e_flags & EF_MIPS_ARCH))
3054             {
3055             case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
3056             case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
3057             case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
3058             case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
3059             case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
3060             case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
3061             case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
3062             case E_MIPS_ARCH_32R6: strcat (buf, ", mips32r6"); break;
3063             case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
3064             case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
3065             case E_MIPS_ARCH_64R6: strcat (buf, ", mips64r6"); break;
3066             default: strcat (buf, _(", unknown ISA")); break;
3067             }
3068           break;
3069
3070         case EM_NDS32:
3071           decode_NDS32_machine_flags (e_flags, buf, sizeof buf);
3072           break;
3073
3074         case EM_SH:
3075           switch ((e_flags & EF_SH_MACH_MASK))
3076             {
3077             case EF_SH1: strcat (buf, ", sh1"); break;
3078             case EF_SH2: strcat (buf, ", sh2"); break;
3079             case EF_SH3: strcat (buf, ", sh3"); break;
3080             case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
3081             case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
3082             case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
3083             case EF_SH3E: strcat (buf, ", sh3e"); break;
3084             case EF_SH4: strcat (buf, ", sh4"); break;
3085             case EF_SH5: strcat (buf, ", sh5"); break;
3086             case EF_SH2E: strcat (buf, ", sh2e"); break;
3087             case EF_SH4A: strcat (buf, ", sh4a"); break;
3088             case EF_SH2A: strcat (buf, ", sh2a"); break;
3089             case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
3090             case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
3091             case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
3092             case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
3093             case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
3094             case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
3095             case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
3096             case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
3097             case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
3098             default: strcat (buf, _(", unknown ISA")); break;
3099             }
3100
3101           if (e_flags & EF_SH_PIC)
3102             strcat (buf, ", pic");
3103
3104           if (e_flags & EF_SH_FDPIC)
3105             strcat (buf, ", fdpic");
3106           break;
3107           
3108         case EM_OR1K:
3109           if (e_flags & EF_OR1K_NODELAY)
3110             strcat (buf, ", no delay");
3111           break;
3112
3113         case EM_SPARCV9:
3114           if (e_flags & EF_SPARC_32PLUS)
3115             strcat (buf, ", v8+");
3116
3117           if (e_flags & EF_SPARC_SUN_US1)
3118             strcat (buf, ", ultrasparcI");
3119
3120           if (e_flags & EF_SPARC_SUN_US3)
3121             strcat (buf, ", ultrasparcIII");
3122
3123           if (e_flags & EF_SPARC_HAL_R1)
3124             strcat (buf, ", halr1");
3125
3126           if (e_flags & EF_SPARC_LEDATA)
3127             strcat (buf, ", ledata");
3128
3129           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
3130             strcat (buf, ", tso");
3131
3132           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
3133             strcat (buf, ", pso");
3134
3135           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
3136             strcat (buf, ", rmo");
3137           break;
3138
3139         case EM_PARISC:
3140           switch (e_flags & EF_PARISC_ARCH)
3141             {
3142             case EFA_PARISC_1_0:
3143               strcpy (buf, ", PA-RISC 1.0");
3144               break;
3145             case EFA_PARISC_1_1:
3146               strcpy (buf, ", PA-RISC 1.1");
3147               break;
3148             case EFA_PARISC_2_0:
3149               strcpy (buf, ", PA-RISC 2.0");
3150               break;
3151             default:
3152               break;
3153             }
3154           if (e_flags & EF_PARISC_TRAPNIL)
3155             strcat (buf, ", trapnil");
3156           if (e_flags & EF_PARISC_EXT)
3157             strcat (buf, ", ext");
3158           if (e_flags & EF_PARISC_LSB)
3159             strcat (buf, ", lsb");
3160           if (e_flags & EF_PARISC_WIDE)
3161             strcat (buf, ", wide");
3162           if (e_flags & EF_PARISC_NO_KABP)
3163             strcat (buf, ", no kabp");
3164           if (e_flags & EF_PARISC_LAZYSWAP)
3165             strcat (buf, ", lazyswap");
3166           break;
3167
3168         case EM_PJ:
3169         case EM_PJ_OLD:
3170           if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
3171             strcat (buf, ", new calling convention");
3172
3173           if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
3174             strcat (buf, ", gnu calling convention");
3175           break;
3176
3177         case EM_IA_64:
3178           if ((e_flags & EF_IA_64_ABI64))
3179             strcat (buf, ", 64-bit");
3180           else
3181             strcat (buf, ", 32-bit");
3182           if ((e_flags & EF_IA_64_REDUCEDFP))
3183             strcat (buf, ", reduced fp model");
3184           if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
3185             strcat (buf, ", no function descriptors, constant gp");
3186           else if ((e_flags & EF_IA_64_CONS_GP))
3187             strcat (buf, ", constant gp");
3188           if ((e_flags & EF_IA_64_ABSOLUTE))
3189             strcat (buf, ", absolute");
3190           if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
3191             {
3192               if ((e_flags & EF_IA_64_VMS_LINKAGES))
3193                 strcat (buf, ", vms_linkages");
3194               switch ((e_flags & EF_IA_64_VMS_COMCOD))
3195                 {
3196                 case EF_IA_64_VMS_COMCOD_SUCCESS:
3197                   break;
3198                 case EF_IA_64_VMS_COMCOD_WARNING:
3199                   strcat (buf, ", warning");
3200                   break;
3201                 case EF_IA_64_VMS_COMCOD_ERROR:
3202                   strcat (buf, ", error");
3203                   break;
3204                 case EF_IA_64_VMS_COMCOD_ABORT:
3205                   strcat (buf, ", abort");
3206                   break;
3207                 default:
3208                   warn (_("Unrecognised IA64 VMS Command Code: %x\n"),
3209                         e_flags & EF_IA_64_VMS_COMCOD);
3210                   strcat (buf, ", <unknown>");
3211                 }
3212             }
3213           break;
3214
3215         case EM_VAX:
3216           if ((e_flags & EF_VAX_NONPIC))
3217             strcat (buf, ", non-PIC");
3218           if ((e_flags & EF_VAX_DFLOAT))
3219             strcat (buf, ", D-Float");
3220           if ((e_flags & EF_VAX_GFLOAT))
3221             strcat (buf, ", G-Float");
3222           break;
3223
3224         case EM_VISIUM:
3225           if (e_flags & EF_VISIUM_ARCH_MCM)
3226             strcat (buf, ", mcm");
3227           else if (e_flags & EF_VISIUM_ARCH_MCM24)
3228             strcat (buf, ", mcm24");
3229           if (e_flags & EF_VISIUM_ARCH_GR6)
3230             strcat (buf, ", gr6");
3231           break;
3232
3233         case EM_RL78:
3234           if (e_flags & E_FLAG_RL78_G10)
3235             strcat (buf, ", G10");
3236           if (e_flags & E_FLAG_RL78_64BIT_DOUBLES)
3237             strcat (buf, ", 64-bit doubles");
3238           break;
3239
3240         case EM_RX:
3241           if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
3242             strcat (buf, ", 64-bit doubles");
3243           if (e_flags & E_FLAG_RX_DSP)
3244             strcat (buf, ", dsp");
3245           if (e_flags & E_FLAG_RX_PID)
3246             strcat (buf, ", pid");
3247           if (e_flags & E_FLAG_RX_ABI)
3248             strcat (buf, ", RX ABI");
3249           break;
3250
3251         case EM_S390:
3252           if (e_flags & EF_S390_HIGH_GPRS)
3253             strcat (buf, ", highgprs");
3254           break;
3255
3256         case EM_TI_C6000:
3257           if ((e_flags & EF_C6000_REL))
3258             strcat (buf, ", relocatable module");
3259           break;
3260
3261         case EM_MSP430:
3262           strcat (buf, _(": architecture variant: "));
3263           switch (e_flags & EF_MSP430_MACH)
3264             {
3265             case E_MSP430_MACH_MSP430x11: strcat (buf, "MSP430x11"); break;
3266             case E_MSP430_MACH_MSP430x11x1 : strcat (buf, "MSP430x11x1 "); break;
3267             case E_MSP430_MACH_MSP430x12: strcat (buf, "MSP430x12"); break;
3268             case E_MSP430_MACH_MSP430x13: strcat (buf, "MSP430x13"); break;
3269             case E_MSP430_MACH_MSP430x14: strcat (buf, "MSP430x14"); break;
3270             case E_MSP430_MACH_MSP430x15: strcat (buf, "MSP430x15"); break;
3271             case E_MSP430_MACH_MSP430x16: strcat (buf, "MSP430x16"); break;
3272             case E_MSP430_MACH_MSP430x31: strcat (buf, "MSP430x31"); break;
3273             case E_MSP430_MACH_MSP430x32: strcat (buf, "MSP430x32"); break;
3274             case E_MSP430_MACH_MSP430x33: strcat (buf, "MSP430x33"); break;
3275             case E_MSP430_MACH_MSP430x41: strcat (buf, "MSP430x41"); break;
3276             case E_MSP430_MACH_MSP430x42: strcat (buf, "MSP430x42"); break;
3277             case E_MSP430_MACH_MSP430x43: strcat (buf, "MSP430x43"); break;
3278             case E_MSP430_MACH_MSP430x44: strcat (buf, "MSP430x44"); break;
3279             case E_MSP430_MACH_MSP430X  : strcat (buf, "MSP430X"); break;
3280             default:
3281               strcat (buf, _(": unknown")); break;
3282             }
3283
3284           if (e_flags & ~ EF_MSP430_MACH)
3285             strcat (buf, _(": unknown extra flag bits also present"));
3286         }
3287     }
3288
3289   return buf;
3290 }
3291
3292 static const char *
3293 get_osabi_name (unsigned int osabi)
3294 {
3295   static char buff[32];
3296
3297   switch (osabi)
3298     {
3299     case ELFOSABI_NONE:         return "UNIX - System V";
3300     case ELFOSABI_HPUX:         return "UNIX - HP-UX";
3301     case ELFOSABI_NETBSD:       return "UNIX - NetBSD";
3302     case ELFOSABI_GNU:          return "UNIX - GNU";
3303     case ELFOSABI_SOLARIS:      return "UNIX - Solaris";
3304     case ELFOSABI_AIX:          return "UNIX - AIX";
3305     case ELFOSABI_IRIX:         return "UNIX - IRIX";
3306     case ELFOSABI_FREEBSD:      return "UNIX - FreeBSD";
3307     case ELFOSABI_TRU64:        return "UNIX - TRU64";
3308     case ELFOSABI_MODESTO:      return "Novell - Modesto";
3309     case ELFOSABI_OPENBSD:      return "UNIX - OpenBSD";
3310     case ELFOSABI_OPENVMS:      return "VMS - OpenVMS";
3311     case ELFOSABI_NSK:          return "HP - Non-Stop Kernel";
3312     case ELFOSABI_AROS:         return "AROS";
3313     case ELFOSABI_FENIXOS:      return "FenixOS";
3314     default:
3315       if (osabi >= 64)
3316         switch (elf_header.e_machine)
3317           {
3318           case EM_ARM:
3319             switch (osabi)
3320               {
3321               case ELFOSABI_ARM:        return "ARM";
3322               default:
3323                 break;
3324               }
3325             break;
3326
3327           case EM_MSP430:
3328           case EM_MSP430_OLD:
3329           case EM_VISIUM:
3330             switch (osabi)
3331               {
3332               case ELFOSABI_STANDALONE: return _("Standalone App");
3333               default:
3334                 break;
3335               }
3336             break;
3337
3338           case EM_TI_C6000:
3339             switch (osabi)
3340               {
3341               case ELFOSABI_C6000_ELFABI:       return _("Bare-metal C6000");
3342               case ELFOSABI_C6000_LINUX:        return "Linux C6000";
3343               default:
3344                 break;
3345               }
3346             break;
3347
3348           default:
3349             break;
3350           }
3351       snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
3352       return buff;
3353     }
3354 }
3355
3356 static const char *
3357 get_aarch64_segment_type (unsigned long type)
3358 {
3359   switch (type)
3360     {
3361     case PT_AARCH64_ARCHEXT:
3362       return "AARCH64_ARCHEXT";
3363     default:
3364       break;
3365     }
3366
3367   return NULL;
3368 }
3369
3370 static const char *
3371 get_arm_segment_type (unsigned long type)
3372 {
3373   switch (type)
3374     {
3375     case PT_ARM_EXIDX:
3376       return "EXIDX";
3377     default:
3378       break;
3379     }
3380
3381   return NULL;
3382 }
3383
3384 static const char *
3385 get_mips_segment_type (unsigned long type)
3386 {
3387   switch (type)
3388     {
3389     case PT_MIPS_REGINFO:
3390       return "REGINFO";
3391     case PT_MIPS_RTPROC:
3392       return "RTPROC";
3393     case PT_MIPS_OPTIONS:
3394       return "OPTIONS";
3395     case PT_MIPS_ABIFLAGS:
3396       return "ABIFLAGS";
3397     default:
3398       break;
3399     }
3400
3401   return NULL;
3402 }
3403
3404 static const char *
3405 get_parisc_segment_type (unsigned long type)
3406 {
3407   switch (type)
3408     {
3409     case PT_HP_TLS:             return "HP_TLS";
3410     case PT_HP_CORE_NONE:       return "HP_CORE_NONE";
3411     case PT_HP_CORE_VERSION:    return "HP_CORE_VERSION";
3412     case PT_HP_CORE_KERNEL:     return "HP_CORE_KERNEL";
3413     case PT_HP_CORE_COMM:       return "HP_CORE_COMM";
3414     case PT_HP_CORE_PROC:       return "HP_CORE_PROC";
3415     case PT_HP_CORE_LOADABLE:   return "HP_CORE_LOADABLE";
3416     case PT_HP_CORE_STACK:      return "HP_CORE_STACK";
3417     case PT_HP_CORE_SHM:        return "HP_CORE_SHM";
3418     case PT_HP_CORE_MMF:        return "HP_CORE_MMF";
3419     case PT_HP_PARALLEL:        return "HP_PARALLEL";
3420     case PT_HP_FASTBIND:        return "HP_FASTBIND";
3421     case PT_HP_OPT_ANNOT:       return "HP_OPT_ANNOT";
3422     case PT_HP_HSL_ANNOT:       return "HP_HSL_ANNOT";
3423     case PT_HP_STACK:           return "HP_STACK";
3424     case PT_HP_CORE_UTSNAME:    return "HP_CORE_UTSNAME";
3425     case PT_PARISC_ARCHEXT:     return "PARISC_ARCHEXT";
3426     case PT_PARISC_UNWIND:      return "PARISC_UNWIND";
3427     case PT_PARISC_WEAKORDER:   return "PARISC_WEAKORDER";
3428     default:
3429       break;
3430     }
3431
3432   return NULL;
3433 }
3434
3435 static const char *
3436 get_ia64_segment_type (unsigned long type)
3437 {
3438   switch (type)
3439     {
3440     case PT_IA_64_ARCHEXT:      return "IA_64_ARCHEXT";
3441     case PT_IA_64_UNWIND:       return "IA_64_UNWIND";
3442     case PT_HP_TLS:             return "HP_TLS";
3443     case PT_IA_64_HP_OPT_ANOT:  return "HP_OPT_ANNOT";
3444     case PT_IA_64_HP_HSL_ANOT:  return "HP_HSL_ANNOT";
3445     case PT_IA_64_HP_STACK:     return "HP_STACK";
3446     default:
3447       break;
3448     }
3449
3450   return NULL;
3451 }
3452
3453 static const char *
3454 get_tic6x_segment_type (unsigned long type)
3455 {
3456   switch (type)
3457     {
3458     case PT_C6000_PHATTR:       return "C6000_PHATTR";
3459     default:
3460       break;
3461     }
3462
3463   return NULL;
3464 }
3465
3466 static const char *
3467 get_segment_type (unsigned long p_type)
3468 {
3469   static char buff[32];
3470
3471   switch (p_type)
3472     {
3473     case PT_NULL:       return "NULL";
3474     case PT_LOAD:       return "LOAD";
3475     case PT_DYNAMIC:    return "DYNAMIC";
3476     case PT_INTERP:     return "INTERP";
3477     case PT_NOTE:       return "NOTE";
3478     case PT_SHLIB:      return "SHLIB";
3479     case PT_PHDR:       return "PHDR";
3480     case PT_TLS:        return "TLS";
3481
3482     case PT_GNU_EH_FRAME:
3483                         return "GNU_EH_FRAME";
3484     case PT_GNU_STACK:  return "GNU_STACK";
3485     case PT_GNU_RELRO:  return "GNU_RELRO";
3486
3487     default:
3488       if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
3489         {
3490           const char * result;
3491
3492           switch (elf_header.e_machine)
3493             {
3494             case EM_AARCH64:
3495               result = get_aarch64_segment_type (p_type);
3496               break;
3497             case EM_ARM:
3498               result = get_arm_segment_type (p_type);
3499               break;
3500             case EM_MIPS:
3501             case EM_MIPS_RS3_LE:
3502               result = get_mips_segment_type (p_type);
3503               break;
3504             case EM_PARISC:
3505               result = get_parisc_segment_type (p_type);
3506               break;
3507             case EM_IA_64:
3508               result = get_ia64_segment_type (p_type);
3509               break;
3510             case EM_TI_C6000:
3511               result = get_tic6x_segment_type (p_type);
3512               break;
3513             default:
3514               result = NULL;
3515               break;
3516             }
3517
3518           if (result != NULL)
3519             return result;
3520
3521           sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
3522         }
3523       else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
3524         {
3525           const char * result;
3526
3527           switch (elf_header.e_machine)
3528             {
3529             case EM_PARISC:
3530               result = get_parisc_segment_type (p_type);
3531               break;
3532             case EM_IA_64:
3533               result = get_ia64_segment_type (p_type);
3534               break;
3535             default:
3536               result = NULL;
3537               break;
3538             }
3539
3540           if (result != NULL)
3541             return result;
3542
3543           sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
3544         }
3545       else
3546         snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
3547
3548       return buff;
3549     }
3550 }
3551
3552 static const char *
3553 get_mips_section_type_name (unsigned int sh_type)
3554 {
3555   switch (sh_type)
3556     {
3557     case SHT_MIPS_LIBLIST:       return "MIPS_LIBLIST";
3558     case SHT_MIPS_MSYM:          return "MIPS_MSYM";
3559     case SHT_MIPS_CONFLICT:      return "MIPS_CONFLICT";
3560     case SHT_MIPS_GPTAB:         return "MIPS_GPTAB";
3561     case SHT_MIPS_UCODE:         return "MIPS_UCODE";
3562     case SHT_MIPS_DEBUG:         return "MIPS_DEBUG";
3563     case SHT_MIPS_REGINFO:       return "MIPS_REGINFO";
3564     case SHT_MIPS_PACKAGE:       return "MIPS_PACKAGE";
3565     case SHT_MIPS_PACKSYM:       return "MIPS_PACKSYM";
3566     case SHT_MIPS_RELD:          return "MIPS_RELD";
3567     case SHT_MIPS_IFACE:         return "MIPS_IFACE";
3568     case SHT_MIPS_CONTENT:       return "MIPS_CONTENT";
3569     case SHT_MIPS_OPTIONS:       return "MIPS_OPTIONS";
3570     case SHT_MIPS_SHDR:          return "MIPS_SHDR";
3571     case SHT_MIPS_FDESC:         return "MIPS_FDESC";
3572     case SHT_MIPS_EXTSYM:        return "MIPS_EXTSYM";
3573     case SHT_MIPS_DENSE:         return "MIPS_DENSE";
3574     case SHT_MIPS_PDESC:         return "MIPS_PDESC";
3575     case SHT_MIPS_LOCSYM:        return "MIPS_LOCSYM";
3576     case SHT_MIPS_AUXSYM:        return "MIPS_AUXSYM";
3577     case SHT_MIPS_OPTSYM:        return "MIPS_OPTSYM";
3578     case SHT_MIPS_LOCSTR:        return "MIPS_LOCSTR";
3579     case SHT_MIPS_LINE:          return "MIPS_LINE";
3580     case SHT_MIPS_RFDESC:        return "MIPS_RFDESC";
3581     case SHT_MIPS_DELTASYM:      return "MIPS_DELTASYM";
3582     case SHT_MIPS_DELTAINST:     return "MIPS_DELTAINST";
3583     case SHT_MIPS_DELTACLASS:    return "MIPS_DELTACLASS";
3584     case SHT_MIPS_DWARF:         return "MIPS_DWARF";
3585     case SHT_MIPS_DELTADECL:     return "MIPS_DELTADECL";
3586     case SHT_MIPS_SYMBOL_LIB:    return "MIPS_SYMBOL_LIB";
3587     case SHT_MIPS_EVENTS:        return "MIPS_EVENTS";
3588     case SHT_MIPS_TRANSLATE:     return "MIPS_TRANSLATE";
3589     case SHT_MIPS_PIXIE:         return "MIPS_PIXIE";
3590     case SHT_MIPS_XLATE:         return "MIPS_XLATE";
3591     case SHT_MIPS_XLATE_DEBUG:   return "MIPS_XLATE_DEBUG";
3592     case SHT_MIPS_WHIRL:         return "MIPS_WHIRL";
3593     case SHT_MIPS_EH_REGION:     return "MIPS_EH_REGION";
3594     case SHT_MIPS_XLATE_OLD:     return "MIPS_XLATE_OLD";
3595     case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
3596     case SHT_MIPS_ABIFLAGS:      return "MIPS_ABIFLAGS";
3597     default:
3598       break;
3599     }
3600   return NULL;
3601 }
3602
3603 static const char *
3604 get_parisc_section_type_name (unsigned int sh_type)
3605 {
3606   switch (sh_type)
3607     {
3608     case SHT_PARISC_EXT:        return "PARISC_EXT";
3609     case SHT_PARISC_UNWIND:     return "PARISC_UNWIND";
3610     case SHT_PARISC_DOC:        return "PARISC_DOC";
3611     case SHT_PARISC_ANNOT:      return "PARISC_ANNOT";
3612     case SHT_PARISC_SYMEXTN:    return "PARISC_SYMEXTN";
3613     case SHT_PARISC_STUBS:      return "PARISC_STUBS";
3614     case SHT_PARISC_DLKM:       return "PARISC_DLKM";
3615     default:
3616       break;
3617     }
3618   return NULL;
3619 }
3620
3621 static const char *
3622 get_ia64_section_type_name (unsigned int sh_type)
3623 {
3624   /* If the top 8 bits are 0x78 the next 8 are the os/abi ID.  */
3625   if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
3626     return get_osabi_name ((sh_type & 0x00FF0000) >> 16);
3627
3628   switch (sh_type)
3629     {
3630     case SHT_IA_64_EXT:                return "IA_64_EXT";
3631     case SHT_IA_64_UNWIND:             return "IA_64_UNWIND";
3632     case SHT_IA_64_PRIORITY_INIT:      return "IA_64_PRIORITY_INIT";
3633     case SHT_IA_64_VMS_TRACE:          return "VMS_TRACE";
3634     case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
3635     case SHT_IA_64_VMS_DEBUG:          return "VMS_DEBUG";
3636     case SHT_IA_64_VMS_DEBUG_STR:      return "VMS_DEBUG_STR";
3637     case SHT_IA_64_VMS_LINKAGES:       return "VMS_LINKAGES";
3638     case SHT_IA_64_VMS_SYMBOL_VECTOR:  return "VMS_SYMBOL_VECTOR";
3639     case SHT_IA_64_VMS_FIXUP:          return "VMS_FIXUP";
3640     default:
3641       break;
3642     }
3643   return NULL;
3644 }
3645
3646 static const char *
3647 get_x86_64_section_type_name (unsigned int sh_type)
3648 {
3649   switch (sh_type)
3650     {
3651     case SHT_X86_64_UNWIND:     return "X86_64_UNWIND";
3652     default:
3653       break;
3654     }
3655   return NULL;
3656 }
3657
3658 static const char *
3659 get_aarch64_section_type_name (unsigned int sh_type)
3660 {
3661   switch (sh_type)
3662     {
3663     case SHT_AARCH64_ATTRIBUTES:
3664       return "AARCH64_ATTRIBUTES";
3665     default:
3666       break;
3667     }
3668   return NULL;
3669 }
3670
3671 static const char *
3672 get_arm_section_type_name (unsigned int sh_type)
3673 {
3674   switch (sh_type)
3675     {
3676     case SHT_ARM_EXIDX:           return "ARM_EXIDX";
3677     case SHT_ARM_PREEMPTMAP:      return "ARM_PREEMPTMAP";
3678     case SHT_ARM_ATTRIBUTES:      return "ARM_ATTRIBUTES";
3679     case SHT_ARM_DEBUGOVERLAY:    return "ARM_DEBUGOVERLAY";
3680     case SHT_ARM_OVERLAYSECTION:  return "ARM_OVERLAYSECTION";
3681     default:
3682       break;
3683     }
3684   return NULL;
3685 }
3686
3687 static const char *
3688 get_tic6x_section_type_name (unsigned int sh_type)
3689 {
3690   switch (sh_type)
3691     {
3692     case SHT_C6000_UNWIND:
3693       return "C6000_UNWIND";
3694     case SHT_C6000_PREEMPTMAP:
3695       return "C6000_PREEMPTMAP";
3696     case SHT_C6000_ATTRIBUTES:
3697       return "C6000_ATTRIBUTES";
3698     case SHT_TI_ICODE:
3699       return "TI_ICODE";
3700     case SHT_TI_XREF:
3701       return "TI_XREF";
3702     case SHT_TI_HANDLER:
3703       return "TI_HANDLER";
3704     case SHT_TI_INITINFO:
3705       return "TI_INITINFO";
3706     case SHT_TI_PHATTRS:
3707       return "TI_PHATTRS";
3708     default:
3709       break;
3710     }
3711   return NULL;
3712 }
3713
3714 static const char *
3715 get_msp430x_section_type_name (unsigned int sh_type)
3716 {
3717   switch (sh_type)
3718     {
3719     case SHT_MSP430_SEC_FLAGS:   return "MSP430_SEC_FLAGS";
3720     case SHT_MSP430_SYM_ALIASES: return "MSP430_SYM_ALIASES";
3721     case SHT_MSP430_ATTRIBUTES:  return "MSP430_ATTRIBUTES";
3722     default: return NULL;
3723     }
3724 }
3725
3726 static const char *
3727 get_section_type_name (unsigned int sh_type)
3728 {
3729   static char buff[32];
3730
3731   switch (sh_type)
3732     {
3733     case SHT_NULL:              return "NULL";
3734     case SHT_PROGBITS:          return "PROGBITS";
3735     case SHT_SYMTAB:            return "SYMTAB";
3736     case SHT_STRTAB:            return "STRTAB";
3737     case SHT_RELA:              return "RELA";
3738     case SHT_HASH:              return "HASH";
3739     case SHT_DYNAMIC:           return "DYNAMIC";
3740     case SHT_NOTE:              return "NOTE";
3741     case SHT_NOBITS:            return "NOBITS";
3742     case SHT_REL:               return "REL";
3743     case SHT_SHLIB:             return "SHLIB";
3744     case SHT_DYNSYM:            return "DYNSYM";
3745     case SHT_INIT_ARRAY:        return "INIT_ARRAY";
3746     case SHT_FINI_ARRAY:        return "FINI_ARRAY";
3747     case SHT_PREINIT_ARRAY:     return "PREINIT_ARRAY";
3748     case SHT_GNU_HASH:          return "GNU_HASH";
3749     case SHT_GROUP:             return "GROUP";
3750     case SHT_SYMTAB_SHNDX:      return "SYMTAB SECTION INDICIES";
3751     case SHT_GNU_verdef:        return "VERDEF";
3752     case SHT_GNU_verneed:       return "VERNEED";
3753     case SHT_GNU_versym:        return "VERSYM";
3754     case 0x6ffffff0:            return "VERSYM";
3755     case 0x6ffffffc:            return "VERDEF";
3756     case 0x7ffffffd:            return "AUXILIARY";
3757     case 0x7fffffff:            return "FILTER";
3758     case SHT_GNU_LIBLIST:       return "GNU_LIBLIST";
3759
3760     default:
3761       if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
3762         {
3763           const char * result;
3764
3765           switch (elf_header.e_machine)
3766             {
3767             case EM_MIPS:
3768             case EM_MIPS_RS3_LE:
3769               result = get_mips_section_type_name (sh_type);
3770               break;
3771             case EM_PARISC:
3772               result = get_parisc_section_type_name (sh_type);
3773               break;
3774             case EM_IA_64:
3775               result = get_ia64_section_type_name (sh_type);
3776               break;
3777             case EM_X86_64:
3778             case EM_L1OM:
3779             case EM_K1OM:
3780               result = get_x86_64_section_type_name (sh_type);
3781               break;
3782             case EM_AARCH64:
3783               result = get_aarch64_section_type_name (sh_type);
3784               break;
3785             case EM_ARM:
3786               result = get_arm_section_type_name (sh_type);
3787               break;
3788             case EM_TI_C6000:
3789               result = get_tic6x_section_type_name (sh_type);
3790               break;
3791             case EM_MSP430:
3792               result = get_msp430x_section_type_name (sh_type);
3793               break;
3794             default:
3795               result = NULL;
3796               break;
3797             }
3798
3799           if (result != NULL)
3800             return result;
3801
3802           sprintf (buff, "LOPROC+%x", sh_type - SHT_LOPROC);
3803         }
3804       else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
3805         {
3806           const char * result;
3807
3808           switch (elf_header.e_machine)
3809             {
3810             case EM_IA_64:
3811               result = get_ia64_section_type_name (sh_type);
3812               break;
3813             default:
3814               result = NULL;
3815               break;
3816             }
3817
3818           if (result != NULL)
3819             return result;
3820
3821           sprintf (buff, "LOOS+%x", sh_type - SHT_LOOS);
3822         }
3823       else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
3824         sprintf (buff, "LOUSER+%x", sh_type - SHT_LOUSER);
3825       else
3826         /* This message is probably going to be displayed in a 15
3827            character wide field, so put the hex value first.  */
3828         snprintf (buff, sizeof (buff), _("%08x: <unknown>"), sh_type);
3829
3830       return buff;
3831     }
3832 }
3833
3834 #define OPTION_DEBUG_DUMP       512
3835 #define OPTION_DYN_SYMS         513
3836 #define OPTION_DWARF_DEPTH      514
3837 #define OPTION_DWARF_START      515
3838 #define OPTION_DWARF_CHECK      516
3839
3840 static struct option options[] =
3841 {
3842   {"all",              no_argument, 0, 'a'},
3843   {"file-header",      no_argument, 0, 'h'},
3844   {"program-headers",  no_argument, 0, 'l'},
3845   {"headers",          no_argument, 0, 'e'},
3846   {"histogram",        no_argument, 0, 'I'},
3847   {"segments",         no_argument, 0, 'l'},
3848   {"sections",         no_argument, 0, 'S'},
3849   {"section-headers",  no_argument, 0, 'S'},
3850   {"section-groups",   no_argument, 0, 'g'},
3851   {"section-details",  no_argument, 0, 't'},
3852   {"full-section-name",no_argument, 0, 'N'},
3853   {"symbols",          no_argument, 0, 's'},
3854   {"syms",             no_argument, 0, 's'},
3855   {"dyn-syms",         no_argument, 0, OPTION_DYN_SYMS},
3856   {"relocs",           no_argument, 0, 'r'},
3857   {"notes",            no_argument, 0, 'n'},
3858   {"dynamic",          no_argument, 0, 'd'},
3859   {"arch-specific",    no_argument, 0, 'A'},
3860   {"version-info",     no_argument, 0, 'V'},
3861   {"use-dynamic",      no_argument, 0, 'D'},
3862   {"unwind",           no_argument, 0, 'u'},
3863   {"archive-index",    no_argument, 0, 'c'},
3864   {"hex-dump",         required_argument, 0, 'x'},
3865   {"relocated-dump",   required_argument, 0, 'R'},
3866   {"string-dump",      required_argument, 0, 'p'},
3867 #ifdef SUPPORT_DISASSEMBLY
3868   {"instruction-dump", required_argument, 0, 'i'},
3869 #endif
3870   {"debug-dump",       optional_argument, 0, OPTION_DEBUG_DUMP},
3871
3872   {"dwarf-depth",      required_argument, 0, OPTION_DWARF_DEPTH},
3873   {"dwarf-start",      required_argument, 0, OPTION_DWARF_START},
3874   {"dwarf-check",      no_argument, 0, OPTION_DWARF_CHECK},
3875
3876   {"version",          no_argument, 0, 'v'},
3877   {"wide",             no_argument, 0, 'W'},
3878   {"help",             no_argument, 0, 'H'},
3879   {0,                  no_argument, 0, 0}
3880 };
3881
3882 static void
3883 usage (FILE * stream)
3884 {
3885   fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
3886   fprintf (stream, _(" Display information about the contents of ELF format files\n"));
3887   fprintf (stream, _(" Options are:\n\
3888   -a --all               Equivalent to: -h -l -S -s -r -d -V -A -I\n\
3889   -h --file-header       Display the ELF file header\n\
3890   -l --program-headers   Display the program headers\n\
3891      --segments          An alias for --program-headers\n\
3892   -S --section-headers   Display the sections' header\n\
3893      --sections          An alias for --section-headers\n\
3894   -g --section-groups    Display the section groups\n\
3895   -t --section-details   Display the section details\n\
3896   -e --headers           Equivalent to: -h -l -S\n\
3897   -s --syms              Display the symbol table\n\
3898      --symbols           An alias for --syms\n\
3899   --dyn-syms             Display the dynamic symbol table\n\
3900   -n --notes             Display the core notes (if present)\n\
3901   -r --relocs            Display the relocations (if present)\n\
3902   -u --unwind            Display the unwind info (if present)\n\
3903   -d --dynamic           Display the dynamic section (if present)\n\
3904   -V --version-info      Display the version sections (if present)\n\
3905   -A --arch-specific     Display architecture specific information (if any)\n\
3906   -c --archive-index     Display the symbol/file index in an archive\n\
3907   -D --use-dynamic       Use the dynamic section info when displaying symbols\n\
3908   -x --hex-dump=<number|name>\n\
3909                          Dump the contents of section <number|name> as bytes\n\
3910   -p --string-dump=<number|name>\n\
3911                          Dump the contents of section <number|name> as strings\n\
3912   -R --relocated-dump=<number|name>\n\
3913                          Dump the contents of section <number|name> as relocated bytes\n\
3914   -w[lLiaprmfFsoRt] or\n\
3915   --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
3916                =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
3917                =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
3918                =addr,=cu_index]\n\
3919                          Display the contents of DWARF2 debug sections\n"));
3920   fprintf (stream, _("\
3921   --dwarf-depth=N        Do not display DIEs at depth N or greater\n\
3922   --dwarf-start=N        Display DIEs starting with N, at the same depth\n\
3923                          or deeper\n"));
3924 #ifdef SUPPORT_DISASSEMBLY
3925   fprintf (stream, _("\
3926   -i --instruction-dump=<number|name>\n\
3927                          Disassemble the contents of section <number|name>\n"));
3928 #endif
3929   fprintf (stream, _("\
3930   -I --histogram         Display histogram of bucket list lengths\n\
3931   -W --wide              Allow output width to exceed 80 characters\n\
3932   @<file>                Read options from <file>\n\
3933   -H --help              Display this information\n\
3934   -v --version           Display the version number of readelf\n"));
3935
3936   if (REPORT_BUGS_TO[0] && stream == stdout)
3937     fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
3938
3939   exit (stream == stdout ? 0 : 1);
3940 }
3941
3942 /* Record the fact that the user wants the contents of section number
3943    SECTION to be displayed using the method(s) encoded as flags bits
3944    in TYPE.  Note, TYPE can be zero if we are creating the array for
3945    the first time.  */
3946
3947 static void
3948 request_dump_bynumber (unsigned int section, dump_type type)
3949 {
3950   if (section >= num_dump_sects)
3951     {
3952       dump_type * new_dump_sects;
3953
3954       new_dump_sects = (dump_type *) calloc (section + 1,
3955                                              sizeof (* dump_sects));
3956
3957       if (new_dump_sects == NULL)
3958         error (_("Out of memory allocating dump request table.\n"));
3959       else
3960         {
3961           /* Copy current flag settings.  */
3962           memcpy (new_dump_sects, dump_sects, num_dump_sects * sizeof (* dump_sects));
3963
3964           free (dump_sects);
3965
3966           dump_sects = new_dump_sects;
3967           num_dump_sects = section + 1;
3968         }
3969     }
3970
3971   if (dump_sects)
3972     dump_sects[section] |= type;
3973
3974   return;
3975 }
3976
3977 /* Request a dump by section name.  */
3978
3979 static void
3980 request_dump_byname (const char * section, dump_type type)
3981 {
3982   struct dump_list_entry * new_request;
3983
3984   new_request = (struct dump_list_entry *)
3985       malloc (sizeof (struct dump_list_entry));
3986   if (!new_request)
3987     error (_("Out of memory allocating dump request table.\n"));
3988
3989   new_request->name = strdup (section);
3990   if (!new_request->name)
3991     error (_("Out of memory allocating dump request table.\n"));
3992
3993   new_request->type = type;
3994
3995   new_request->next = dump_sects_byname;
3996   dump_sects_byname = new_request;
3997 }
3998
3999 static inline void
4000 request_dump (dump_type type)
4001 {
4002   int section;
4003   char * cp;
4004
4005   do_dump++;
4006   section = strtoul (optarg, & cp, 0);
4007
4008   if (! *cp && section >= 0)
4009     request_dump_bynumber (section, type);
4010   else
4011     request_dump_byname (optarg, type);
4012 }
4013
4014
4015 static void
4016 parse_args (int argc, char ** argv)
4017 {
4018   int c;
4019
4020   if (argc < 2)
4021     usage (stderr);
4022
4023   while ((c = getopt_long
4024           (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:", options, NULL)) != EOF)
4025     {
4026       switch (c)
4027         {
4028         case 0:
4029           /* Long options.  */
4030           break;
4031         case 'H':
4032           usage (stdout);
4033           break;
4034
4035         case 'a':
4036           do_syms++;
4037           do_reloc++;
4038           do_unwind++;
4039           do_dynamic++;
4040           do_header++;
4041           do_sections++;
4042           do_section_groups++;
4043           do_segments++;
4044           do_version++;
4045           do_histogram++;
4046           do_arch++;
4047           do_notes++;
4048           break;
4049         case 'g':
4050           do_section_groups++;
4051           break;
4052         case 't':
4053         case 'N':
4054           do_sections++;
4055           do_section_details++;
4056           break;
4057         case 'e':
4058           do_header++;
4059           do_sections++;
4060           do_segments++;
4061           break;
4062         case 'A':
4063           do_arch++;
4064           break;
4065         case 'D':
4066           do_using_dynamic++;
4067           break;
4068         case 'r':
4069           do_reloc++;
4070           break;
4071         case 'u':
4072           do_unwind++;
4073           break;
4074         case 'h':
4075           do_header++;
4076           break;
4077         case 'l':
4078           do_segments++;
4079           break;
4080         case 's':
4081           do_syms++;
4082           break;
4083         case 'S':
4084           do_sections++;
4085           break;
4086         case 'd':
4087           do_dynamic++;
4088           break;
4089         case 'I':
4090           do_histogram++;
4091           break;
4092         case 'n':
4093           do_notes++;
4094           break;
4095         case 'c':
4096           do_archive_index++;
4097           break;
4098         case 'x':
4099           request_dump (HEX_DUMP);
4100           break;
4101         case 'p':
4102           request_dump (STRING_DUMP);
4103           break;
4104         case 'R':
4105           request_dump (RELOC_DUMP);
4106           break;
4107         case 'w':
4108           do_dump++;
4109           if (optarg == 0)
4110             {
4111               do_debugging = 1;
4112               dwarf_select_sections_all ();
4113             }
4114           else
4115             {
4116               do_debugging = 0;
4117               dwarf_select_sections_by_letters (optarg);
4118             }
4119           break;
4120         case OPTION_DEBUG_DUMP:
4121           do_dump++;
4122           if (optarg == 0)
4123             do_debugging = 1;
4124           else
4125             {
4126               do_debugging = 0;
4127               dwarf_select_sections_by_names (optarg);
4128             }
4129           break;
4130         case OPTION_DWARF_DEPTH:
4131           {
4132             char *cp;
4133
4134             dwarf_cutoff_level = strtoul (optarg, & cp, 0);
4135           }
4136           break;
4137         case OPTION_DWARF_START:
4138           {
4139             char *cp;
4140
4141             dwarf_start_die = strtoul (optarg, & cp, 0);
4142           }
4143           break;
4144         case OPTION_DWARF_CHECK:
4145           dwarf_check = 1;
4146           break;
4147         case OPTION_DYN_SYMS:
4148           do_dyn_syms++;
4149           break;
4150 #ifdef SUPPORT_DISASSEMBLY
4151         case 'i':
4152           request_dump (DISASS_DUMP);
4153           break;
4154 #endif
4155         case 'v':
4156           print_version (program_name);
4157           break;
4158         case 'V':
4159           do_version++;
4160           break;
4161         case 'W':
4162           do_wide++;
4163           break;
4164         default:
4165           /* xgettext:c-format */
4166           error (_("Invalid option '-%c'\n"), c);
4167           /* Drop through.  */
4168         case '?':
4169           usage (stderr);
4170         }
4171     }
4172
4173   if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
4174       && !do_segments && !do_header && !do_dump && !do_version
4175       && !do_histogram && !do_debugging && !do_arch && !do_notes
4176       && !do_section_groups && !do_archive_index
4177       && !do_dyn_syms)
4178     usage (stderr);
4179   else if (argc < 3)
4180     {
4181       warn (_("Nothing to do.\n"));
4182       usage (stderr);
4183     }
4184 }
4185
4186 static const char *
4187 get_elf_class (unsigned int elf_class)
4188 {
4189   static char buff[32];
4190
4191   switch (elf_class)
4192     {
4193     case ELFCLASSNONE: return _("none");
4194     case ELFCLASS32:   return "ELF32";
4195     case ELFCLASS64:   return "ELF64";
4196     default:
4197       snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
4198       return buff;
4199     }
4200 }
4201
4202 static const char *
4203 get_data_encoding (unsigned int encoding)
4204 {
4205   static char buff[32];
4206
4207   switch (encoding)
4208     {
4209     case ELFDATANONE: return _("none");
4210     case ELFDATA2LSB: return _("2's complement, little endian");
4211     case ELFDATA2MSB: return _("2's complement, big endian");
4212     default:
4213       snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
4214       return buff;
4215     }
4216 }
4217
4218 /* Decode the data held in 'elf_header'.  */
4219
4220 static int
4221 process_file_header (void)
4222 {
4223   if (   elf_header.e_ident[EI_MAG0] != ELFMAG0
4224       || elf_header.e_ident[EI_MAG1] != ELFMAG1
4225       || elf_header.e_ident[EI_MAG2] != ELFMAG2
4226       || elf_header.e_ident[EI_MAG3] != ELFMAG3)
4227     {
4228       error
4229         (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
4230       return 0;
4231     }
4232
4233   init_dwarf_regnames (elf_header.e_machine);
4234
4235   if (do_header)
4236     {
4237       int i;
4238
4239       printf (_("ELF Header:\n"));
4240       printf (_("  Magic:   "));
4241       for (i = 0; i < EI_NIDENT; i++)
4242         printf ("%2.2x ", elf_header.e_ident[i]);
4243       printf ("\n");
4244       printf (_("  Class:                             %s\n"),
4245               get_elf_class (elf_header.e_ident[EI_CLASS]));
4246       printf (_("  Data:                              %s\n"),
4247               get_data_encoding (elf_header.e_ident[EI_DATA]));
4248       printf (_("  Version:                           %d %s\n"),
4249               elf_header.e_ident[EI_VERSION],
4250               (elf_header.e_ident[EI_VERSION] == EV_CURRENT
4251                ? "(current)"
4252                : (elf_header.e_ident[EI_VERSION] != EV_NONE
4253                   ? _("<unknown: %lx>")
4254                   : "")));
4255       printf (_("  OS/ABI:                            %s\n"),
4256               get_osabi_name (elf_header.e_ident[EI_OSABI]));
4257       printf (_("  ABI Version:                       %d\n"),
4258               elf_header.e_ident[EI_ABIVERSION]);
4259       printf (_("  Type:                              %s\n"),
4260               get_file_type (elf_header.e_type));
4261       printf (_("  Machine:                           %s\n"),
4262               get_machine_name (elf_header.e_machine));
4263       printf (_("  Version:                           0x%lx\n"),
4264               (unsigned long) elf_header.e_version);
4265
4266       printf (_("  Entry point address:               "));
4267       print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4268       printf (_("\n  Start of program headers:          "));
4269       print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4270       printf (_(" (bytes into file)\n  Start of section headers:          "));
4271       print_vma ((bfd_vma) elf_header.e_shoff, DEC);
4272       printf (_(" (bytes into file)\n"));
4273
4274       printf (_("  Flags:                             0x%lx%s\n"),
4275               (unsigned long) elf_header.e_flags,
4276               get_machine_flags (elf_header.e_flags, elf_header.e_machine));
4277       printf (_("  Size of this header:               %ld (bytes)\n"),
4278               (long) elf_header.e_ehsize);
4279       printf (_("  Size of program headers:           %ld (bytes)\n"),
4280               (long) elf_header.e_phentsize);
4281       printf (_("  Number of program headers:         %ld"),
4282               (long) elf_header.e_phnum);
4283       if (section_headers != NULL
4284           && elf_header.e_phnum == PN_XNUM
4285           && section_headers[0].sh_info != 0)
4286         printf (" (%ld)", (long) section_headers[0].sh_info);
4287       putc ('\n', stdout);
4288       printf (_("  Size of section headers:           %ld (bytes)\n"),
4289               (long) elf_header.e_shentsize);
4290       printf (_("  Number of section headers:         %ld"),
4291               (long) elf_header.e_shnum);
4292       if (section_headers != NULL && elf_header.e_shnum == SHN_UNDEF)
4293         printf (" (%ld)", (long) section_headers[0].sh_size);
4294       putc ('\n', stdout);
4295       printf (_("  Section header string table index: %ld"),
4296               (long) elf_header.e_shstrndx);
4297       if (section_headers != NULL
4298           && elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
4299         printf (" (%u)", section_headers[0].sh_link);
4300       else if (elf_header.e_shstrndx != SHN_UNDEF
4301                && elf_header.e_shstrndx >= elf_header.e_shnum)
4302         printf (_(" <corrupt: out of range>"));
4303       putc ('\n', stdout);
4304     }
4305
4306   if (section_headers != NULL)
4307     {
4308       if (elf_header.e_phnum == PN_XNUM
4309           && section_headers[0].sh_info != 0)
4310         elf_header.e_phnum = section_headers[0].sh_info;
4311       if (elf_header.e_shnum == SHN_UNDEF)
4312         elf_header.e_shnum = section_headers[0].sh_size;
4313       if (elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
4314         elf_header.e_shstrndx = section_headers[0].sh_link;
4315       else if (elf_header.e_shstrndx >= elf_header.e_shnum)
4316         elf_header.e_shstrndx = SHN_UNDEF;
4317       free (section_headers);
4318       section_headers = NULL;
4319     }
4320
4321   return 1;
4322 }
4323
4324 static bfd_boolean
4325 get_32bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
4326 {
4327   Elf32_External_Phdr * phdrs;
4328   Elf32_External_Phdr * external;
4329   Elf_Internal_Phdr *   internal;
4330   unsigned int i;
4331   unsigned int size = elf_header.e_phentsize;
4332   unsigned int num  = elf_header.e_phnum;
4333
4334   /* PR binutils/17531: Cope with unexpected section header sizes.  */
4335   if (size == 0 || num == 0)
4336     return FALSE;
4337   if (size < sizeof * phdrs)
4338     {
4339       error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4340       return FALSE;
4341     }
4342   if (size > sizeof * phdrs)
4343     warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4344
4345   phdrs = (Elf32_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
4346                                             size, num, _("program headers"));
4347   if (phdrs == NULL)
4348     return FALSE;
4349
4350   for (i = 0, internal = pheaders, external = phdrs;
4351        i < elf_header.e_phnum;
4352        i++, internal++, external++)
4353     {
4354       internal->p_type   = BYTE_GET (external->p_type);
4355       internal->p_offset = BYTE_GET (external->p_offset);
4356       internal->p_vaddr  = BYTE_GET (external->p_vaddr);
4357       internal->p_paddr  = BYTE_GET (external->p_paddr);
4358       internal->p_filesz = BYTE_GET (external->p_filesz);
4359       internal->p_memsz  = BYTE_GET (external->p_memsz);
4360       internal->p_flags  = BYTE_GET (external->p_flags);
4361       internal->p_align  = BYTE_GET (external->p_align);
4362     }
4363
4364   free (phdrs);
4365   return TRUE;
4366 }
4367
4368 static bfd_boolean
4369 get_64bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
4370 {
4371   Elf64_External_Phdr * phdrs;
4372   Elf64_External_Phdr * external;
4373   Elf_Internal_Phdr *   internal;
4374   unsigned int i;
4375   unsigned int size = elf_header.e_phentsize;
4376   unsigned int num  = elf_header.e_phnum;
4377
4378   /* PR binutils/17531: Cope with unexpected section header sizes.  */
4379   if (size == 0 || num == 0)
4380     return FALSE;
4381   if (size < sizeof * phdrs)
4382     {
4383       error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4384       return FALSE;
4385     }
4386   if (size > sizeof * phdrs)
4387     warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4388
4389   phdrs = (Elf64_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
4390                                             size, num, _("program headers"));
4391   if (!phdrs)
4392     return FALSE;
4393
4394   for (i = 0, internal = pheaders, external = phdrs;
4395        i < elf_header.e_phnum;
4396        i++, internal++, external++)
4397     {
4398       internal->p_type   = BYTE_GET (external->p_type);
4399       internal->p_flags  = BYTE_GET (external->p_flags);
4400       internal->p_offset = BYTE_GET (external->p_offset);
4401       internal->p_vaddr  = BYTE_GET (external->p_vaddr);
4402       internal->p_paddr  = BYTE_GET (external->p_paddr);
4403       internal->p_filesz = BYTE_GET (external->p_filesz);
4404       internal->p_memsz  = BYTE_GET (external->p_memsz);
4405       internal->p_align  = BYTE_GET (external->p_align);
4406     }
4407
4408   free (phdrs);
4409   return TRUE;
4410 }
4411
4412 /* Returns 1 if the program headers were read into `program_headers'.  */
4413
4414 static int
4415 get_program_headers (FILE * file)
4416 {
4417   Elf_Internal_Phdr * phdrs;
4418
4419   /* Check cache of prior read.  */
4420   if (program_headers != NULL)
4421     return 1;
4422
4423   phdrs = (Elf_Internal_Phdr *) cmalloc (elf_header.e_phnum,
4424                                          sizeof (Elf_Internal_Phdr));
4425
4426   if (phdrs == NULL)
4427     {
4428       error (_("Out of memory reading %u program headers\n"),
4429              elf_header.e_phnum);
4430       return 0;
4431     }
4432
4433   if (is_32bit_elf
4434       ? get_32bit_program_headers (file, phdrs)
4435       : get_64bit_program_headers (file, phdrs))
4436     {
4437       program_headers = phdrs;
4438       return 1;
4439     }
4440
4441   free (phdrs);
4442   return 0;
4443 }
4444
4445 /* Returns 1 if the program headers were loaded.  */
4446
4447 static int
4448 process_program_headers (FILE * file)
4449 {
4450   Elf_Internal_Phdr * segment;
4451   unsigned int i;
4452
4453   if (elf_header.e_phnum == 0)
4454     {
4455       /* PR binutils/12467.  */
4456       if (elf_header.e_phoff != 0)
4457         warn (_("possibly corrupt ELF header - it has a non-zero program"
4458                 " header offset, but no program headers"));
4459       else if (do_segments)
4460         printf (_("\nThere are no program headers in this file.\n"));
4461       return 0;
4462     }
4463
4464   if (do_segments && !do_header)
4465     {
4466       printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
4467       printf (_("Entry point "));
4468       print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4469       printf (_("\nThere are %d program headers, starting at offset "),
4470               elf_header.e_phnum);
4471       print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4472       printf ("\n");
4473     }
4474
4475   if (! get_program_headers (file))
4476       return 0;
4477
4478   if (do_segments)
4479     {
4480       if (elf_header.e_phnum > 1)
4481         printf (_("\nProgram Headers:\n"));
4482       else
4483         printf (_("\nProgram Headers:\n"));
4484
4485       if (is_32bit_elf)
4486         printf
4487           (_("  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align\n"));
4488       else if (do_wide)
4489         printf
4490           (_("  Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align\n"));
4491       else
4492         {
4493           printf
4494             (_("  Type           Offset             VirtAddr           PhysAddr\n"));
4495           printf
4496             (_("                 FileSiz            MemSiz              Flags  Align\n"));
4497         }
4498     }
4499
4500   dynamic_addr = 0;
4501   dynamic_size = 0;
4502
4503   for (i = 0, segment = program_headers;
4504        i < elf_header.e_phnum;
4505        i++, segment++)
4506     {
4507       if (do_segments)
4508         {
4509           printf ("  %-14.14s ", get_segment_type (segment->p_type));
4510
4511           if (is_32bit_elf)
4512             {
4513               printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4514               printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
4515               printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
4516               printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
4517               printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
4518               printf ("%c%c%c ",
4519                       (segment->p_flags & PF_R ? 'R' : ' '),
4520                       (segment->p_flags & PF_W ? 'W' : ' '),
4521                       (segment->p_flags & PF_X ? 'E' : ' '));
4522               printf ("%#lx", (unsigned long) segment->p_align);
4523             }
4524           else if (do_wide)
4525             {
4526               if ((unsigned long) segment->p_offset == segment->p_offset)
4527                 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4528               else
4529                 {
4530                   print_vma (segment->p_offset, FULL_HEX);
4531                   putchar (' ');
4532                 }
4533
4534               print_vma (segment->p_vaddr, FULL_HEX);
4535               putchar (' ');
4536               print_vma (segment->p_paddr, FULL_HEX);
4537               putchar (' ');
4538
4539               if ((unsigned long) segment->p_filesz == segment->p_filesz)
4540                 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
4541               else
4542                 {
4543                   print_vma (segment->p_filesz, FULL_HEX);
4544                   putchar (' ');
4545                 }
4546
4547               if ((unsigned long) segment->p_memsz == segment->p_memsz)
4548                 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
4549               else
4550                 {
4551                   print_vma (segment->p_memsz, FULL_HEX);
4552                 }
4553
4554               printf (" %c%c%c ",
4555                       (segment->p_flags & PF_R ? 'R' : ' '),
4556                       (segment->p_flags & PF_W ? 'W' : ' '),
4557                       (segment->p_flags & PF_X ? 'E' : ' '));
4558
4559               if ((unsigned long) segment->p_align == segment->p_align)
4560                 printf ("%#lx", (unsigned long) segment->p_align);
4561               else
4562                 {
4563                   print_vma (segment->p_align, PREFIX_HEX);
4564                 }
4565             }
4566           else
4567             {
4568               print_vma (segment->p_offset, FULL_HEX);
4569               putchar (' ');
4570               print_vma (segment->p_vaddr, FULL_HEX);
4571               putchar (' ');
4572               print_vma (segment->p_paddr, FULL_HEX);
4573               printf ("\n                 ");
4574               print_vma (segment->p_filesz, FULL_HEX);
4575               putchar (' ');
4576               print_vma (segment->p_memsz, FULL_HEX);
4577               printf ("  %c%c%c    ",
4578                       (segment->p_flags & PF_R ? 'R' : ' '),
4579                       (segment->p_flags & PF_W ? 'W' : ' '),
4580                       (segment->p_flags & PF_X ? 'E' : ' '));
4581               print_vma (segment->p_align, HEX);
4582             }
4583         }
4584
4585       if (do_segments)
4586         putc ('\n', stdout);
4587
4588       switch (segment->p_type)
4589         {
4590         case PT_DYNAMIC:
4591           if (dynamic_addr)
4592             error (_("more than one dynamic segment\n"));
4593
4594           /* By default, assume that the .dynamic section is the first
4595              section in the DYNAMIC segment.  */
4596           dynamic_addr = segment->p_offset;
4597           dynamic_size = segment->p_filesz;
4598           /* PR binutils/17512: Avoid corrupt dynamic section info in the segment.  */
4599           if (dynamic_addr + dynamic_size >= current_file_size)
4600             {
4601               error (_("the dynamic segment offset + size exceeds the size of the file\n"));
4602               dynamic_addr = dynamic_size = 0;
4603             }
4604
4605           /* Try to locate the .dynamic section. If there is
4606              a section header table, we can easily locate it.  */
4607           if (section_headers != NULL)
4608             {
4609               Elf_Internal_Shdr * sec;
4610
4611               sec = find_section (".dynamic");
4612               if (sec == NULL || sec->sh_size == 0)
4613                 {
4614                   /* A corresponding .dynamic section is expected, but on
4615                      IA-64/OpenVMS it is OK for it to be missing.  */
4616                   if (!is_ia64_vms ())
4617                     error (_("no .dynamic section in the dynamic segment\n"));
4618                   break;
4619                 }
4620
4621               if (sec->sh_type == SHT_NOBITS)
4622                 {
4623                   dynamic_size = 0;
4624                   break;
4625                 }
4626
4627               dynamic_addr = sec->sh_offset;
4628               dynamic_size = sec->sh_size;
4629
4630               if (dynamic_addr < segment->p_offset
4631                   || dynamic_addr > segment->p_offset + segment->p_filesz)
4632                 warn (_("the .dynamic section is not contained"
4633                         " within the dynamic segment\n"));
4634               else if (dynamic_addr > segment->p_offset)
4635                 warn (_("the .dynamic section is not the first section"
4636                         " in the dynamic segment.\n"));
4637             }
4638           break;
4639
4640         case PT_INTERP:
4641           if (fseek (file, archive_file_offset + (long) segment->p_offset,
4642                      SEEK_SET))
4643             error (_("Unable to find program interpreter name\n"));
4644           else
4645             {
4646               char fmt [32];
4647               int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX - 1);
4648
4649               if (ret >= (int) sizeof (fmt) || ret < 0)
4650                 error (_("Internal error: failed to create format string to display program interpreter\n"));
4651
4652               program_interpreter[0] = 0;
4653               if (fscanf (file, fmt, program_interpreter) <= 0)
4654                 error (_("Unable to read program interpreter name\n"));
4655
4656               if (do_segments)
4657                 printf (_("      [Requesting program interpreter: %s]\n"),
4658                     program_interpreter);
4659             }
4660           break;
4661         }
4662     }
4663
4664   if (do_segments && section_headers != NULL && string_table != NULL)
4665     {
4666       printf (_("\n Section to Segment mapping:\n"));
4667       printf (_("  Segment Sections...\n"));
4668
4669       for (i = 0; i < elf_header.e_phnum; i++)
4670         {
4671           unsigned int j;
4672           Elf_Internal_Shdr * section;
4673
4674           segment = program_headers + i;
4675           section = section_headers + 1;
4676
4677           printf ("   %2.2d     ", i);
4678
4679           for (j = 1; j < elf_header.e_shnum; j++, section++)
4680             {
4681               if (!ELF_TBSS_SPECIAL (section, segment)
4682                   && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
4683                 printf ("%s ", printable_section_name (section));
4684             }
4685
4686           putc ('\n',stdout);
4687         }
4688     }
4689
4690   return 1;
4691 }
4692
4693
4694 /* Find the file offset corresponding to VMA by using the program headers.  */
4695
4696 static long
4697 offset_from_vma (FILE * file, bfd_vma vma, bfd_size_type size)
4698 {
4699   Elf_Internal_Phdr * seg;
4700
4701   if (! get_program_headers (file))
4702     {
4703       warn (_("Cannot interpret virtual addresses without program headers.\n"));
4704       return (long) vma;
4705     }
4706
4707   for (seg = program_headers;
4708        seg < program_headers + elf_header.e_phnum;
4709        ++seg)
4710     {
4711       if (seg->p_type != PT_LOAD)
4712         continue;
4713
4714       if (vma >= (seg->p_vaddr & -seg->p_align)
4715           && vma + size <= seg->p_vaddr + seg->p_filesz)
4716         return vma - seg->p_vaddr + seg->p_offset;
4717     }
4718
4719   warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
4720         (unsigned long) vma);
4721   return (long) vma;
4722 }
4723
4724
4725 /* Allocate memory and load the sections headers into the global pointer
4726    SECTION_HEADERS.  If PROBE is true, this is just a probe and we do not
4727    generate any error messages if the load fails.  */
4728
4729 static bfd_boolean
4730 get_32bit_section_headers (FILE * file, bfd_boolean probe)
4731 {
4732   Elf32_External_Shdr * shdrs;
4733   Elf_Internal_Shdr *   internal;
4734   unsigned int i;
4735   unsigned int size = elf_header.e_shentsize;
4736   unsigned int num = probe ? 1 : elf_header.e_shnum;
4737
4738   /* PR binutils/17531: Cope with unexpected section header sizes.  */
4739   if (size == 0 || num == 0)
4740     return FALSE;
4741   if (size < sizeof * shdrs)
4742     {
4743       if (! probe)
4744         error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
4745       return FALSE;
4746     }
4747   if (!probe && size > sizeof * shdrs)
4748     warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
4749
4750   shdrs = (Elf32_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
4751                                             size, num,
4752                                             probe ? NULL : _("section headers"));
4753   if (shdrs == NULL)
4754     return FALSE;
4755
4756   if (section_headers != NULL)
4757     free (section_headers);
4758   section_headers = (Elf_Internal_Shdr *) cmalloc (num,
4759                                                    sizeof (Elf_Internal_Shdr));
4760   if (section_headers == NULL)
4761     {
4762       if (!probe)
4763         error (_("Out of memory reading %u section headers\n"), num);
4764       return FALSE;
4765     }
4766
4767   for (i = 0, internal = section_headers;
4768        i < num;
4769        i++, internal++)
4770     {
4771       internal->sh_name      = BYTE_GET (shdrs[i].sh_name);
4772       internal->sh_type      = BYTE_GET (shdrs[i].sh_type);
4773       internal->sh_flags     = BYTE_GET (shdrs[i].sh_flags);
4774       internal->sh_addr      = BYTE_GET (shdrs[i].sh_addr);
4775       internal->sh_offset    = BYTE_GET (shdrs[i].sh_offset);
4776       internal->sh_size      = BYTE_GET (shdrs[i].sh_size);
4777       internal->sh_link      = BYTE_GET (shdrs[i].sh_link);
4778       internal->sh_info      = BYTE_GET (shdrs[i].sh_info);
4779       internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
4780       internal->sh_entsize   = BYTE_GET (shdrs[i].sh_entsize);
4781     }
4782
4783   free (shdrs);
4784   return TRUE;
4785 }
4786
4787 static bfd_boolean
4788 get_64bit_section_headers (FILE * file, bfd_boolean probe)
4789 {
4790   Elf64_External_Shdr * shdrs;
4791   Elf_Internal_Shdr *   internal;
4792   unsigned int i;
4793   unsigned int size = elf_header.e_shentsize;
4794   unsigned int num = probe ? 1 : elf_header.e_shnum;
4795
4796   /* PR binutils/17531: Cope with unexpected section header sizes.  */
4797   if (size == 0 || num == 0)
4798     return FALSE;
4799   if (size < sizeof * shdrs)
4800     {
4801       if (! probe)
4802         error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
4803       return FALSE;
4804     }
4805   if (! probe && size > sizeof * shdrs)
4806     warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
4807
4808   shdrs = (Elf64_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
4809                                             size, num,
4810                                             probe ? NULL : _("section headers"));
4811   if (shdrs == NULL)
4812     return FALSE;
4813
4814   if (section_headers != NULL)
4815     free (section_headers);
4816   section_headers = (Elf_Internal_Shdr *) cmalloc (num,
4817                                                    sizeof (Elf_Internal_Shdr));
4818   if (section_headers == NULL)
4819     {
4820       if (! probe)
4821         error (_("Out of memory reading %u section headers\n"), num);
4822       return FALSE;
4823     }
4824
4825   for (i = 0, internal = section_headers;
4826        i < num;
4827        i++, internal++)
4828     {
4829       internal->sh_name      = BYTE_GET (shdrs[i].sh_name);
4830       internal->sh_type      = BYTE_GET (shdrs[i].sh_type);
4831       internal->sh_flags     = BYTE_GET (shdrs[i].sh_flags);
4832       internal->sh_addr      = BYTE_GET (shdrs[i].sh_addr);
4833       internal->sh_size      = BYTE_GET (shdrs[i].sh_size);
4834       internal->sh_entsize   = BYTE_GET (shdrs[i].sh_entsize);
4835       internal->sh_link      = BYTE_GET (shdrs[i].sh_link);
4836       internal->sh_info      = BYTE_GET (shdrs[i].sh_info);
4837       internal->sh_offset    = BYTE_GET (shdrs[i].sh_offset);
4838       internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
4839     }
4840
4841   free (shdrs);
4842   return TRUE;
4843 }
4844
4845 static Elf_Internal_Sym *
4846 get_32bit_elf_symbols (FILE * file,
4847                        Elf_Internal_Shdr * section,
4848                        unsigned long * num_syms_return)
4849 {
4850   unsigned long number = 0;
4851   Elf32_External_Sym * esyms = NULL;
4852   Elf_External_Sym_Shndx * shndx = NULL;
4853   Elf_Internal_Sym * isyms = NULL;
4854   Elf_Internal_Sym * psym;
4855   unsigned int j;
4856
4857   if (section->sh_size == 0)
4858     {
4859       if (num_syms_return != NULL)
4860         * num_syms_return = 0;
4861       return NULL;
4862     }
4863
4864   /* Run some sanity checks first.  */
4865   if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
4866     {
4867       error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
4868              printable_section_name (section), (unsigned long) section->sh_entsize);
4869       goto exit_point;
4870     }
4871
4872   if (section->sh_size > current_file_size)
4873     {
4874       error (_("Section %s has an invalid sh_size of 0x%lx\n"),
4875              printable_section_name (section), (unsigned long) section->sh_size);
4876       goto exit_point;
4877     }
4878
4879   number = section->sh_size / section->sh_entsize;
4880
4881   if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
4882     {
4883       error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
4884              (unsigned long) section->sh_size,
4885              printable_section_name (section),
4886              (unsigned long) section->sh_entsize);
4887       goto exit_point;
4888     }
4889
4890   esyms = (Elf32_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
4891                                            section->sh_size, _("symbols"));
4892   if (esyms == NULL)
4893     goto exit_point;
4894
4895   shndx = NULL;
4896   if (symtab_shndx_hdr != NULL
4897       && (symtab_shndx_hdr->sh_link
4898           == (unsigned long) (section - section_headers)))
4899     {
4900       shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
4901                                                    symtab_shndx_hdr->sh_offset,
4902                                                    1, symtab_shndx_hdr->sh_size,
4903                                                    _("symbol table section indicies"));
4904       if (shndx == NULL)
4905         goto exit_point;
4906       /* PR17531: file: heap-buffer-overflow */
4907       else if (symtab_shndx_hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
4908         {
4909           error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
4910                  printable_section_name (symtab_shndx_hdr),
4911                  (unsigned long) symtab_shndx_hdr->sh_size,
4912                  (unsigned long) section->sh_size);
4913           goto exit_point;
4914         }
4915     }
4916
4917   isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
4918
4919   if (isyms == NULL)
4920     {
4921       error (_("Out of memory reading %lu symbols\n"),
4922              (unsigned long) number);
4923       goto exit_point;
4924     }
4925
4926   for (j = 0, psym = isyms; j < number; j++, psym++)
4927     {
4928       psym->st_name  = BYTE_GET (esyms[j].st_name);
4929       psym->st_value = BYTE_GET (esyms[j].st_value);
4930       psym->st_size  = BYTE_GET (esyms[j].st_size);
4931       psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
4932       if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
4933         psym->st_shndx
4934           = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
4935       else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
4936         psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
4937       psym->st_info  = BYTE_GET (esyms[j].st_info);
4938       psym->st_other = BYTE_GET (esyms[j].st_other);
4939     }
4940
4941  exit_point:
4942   if (shndx != NULL)
4943     free (shndx);
4944   if (esyms != NULL)
4945     free (esyms);
4946
4947   if (num_syms_return != NULL)
4948     * num_syms_return = isyms == NULL ? 0 : number;
4949
4950   return isyms;
4951 }
4952
4953 static Elf_Internal_Sym *
4954 get_64bit_elf_symbols (FILE * file,
4955                        Elf_Internal_Shdr * section,
4956                        unsigned long * num_syms_return)
4957 {
4958   unsigned long number = 0;
4959   Elf64_External_Sym * esyms = NULL;
4960   Elf_External_Sym_Shndx * shndx = NULL;
4961   Elf_Internal_Sym * isyms = NULL;
4962   Elf_Internal_Sym * psym;
4963   unsigned int j;
4964
4965   if (section->sh_size == 0)
4966     {
4967       if (num_syms_return != NULL)
4968         * num_syms_return = 0;
4969       return NULL;
4970     }
4971
4972   /* Run some sanity checks first.  */
4973   if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
4974     {
4975       error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
4976              printable_section_name (section),
4977              (unsigned long) section->sh_entsize);
4978       goto exit_point;
4979     }
4980
4981   if (section->sh_size > current_file_size)
4982     {
4983       error (_("Section %s has an invalid sh_size of 0x%lx\n"),
4984              printable_section_name (section),
4985              (unsigned long) section->sh_size);
4986       goto exit_point;
4987     }
4988
4989   number = section->sh_size / section->sh_entsize;
4990
4991   if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
4992     {
4993       error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
4994              (unsigned long) section->sh_size,
4995              printable_section_name (section),
4996              (unsigned long) section->sh_entsize);
4997       goto exit_point;
4998     }
4999
5000   esyms = (Elf64_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
5001                                            section->sh_size, _("symbols"));
5002   if (!esyms)
5003     goto exit_point;
5004
5005   if (symtab_shndx_hdr != NULL
5006       && (symtab_shndx_hdr->sh_link
5007           == (unsigned long) (section - section_headers)))
5008     {
5009       shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
5010                                                    symtab_shndx_hdr->sh_offset,
5011                                                    1, symtab_shndx_hdr->sh_size,
5012                                                    _("symbol table section indicies"));
5013       if (shndx == NULL)
5014         goto exit_point;
5015       else if (symtab_shndx_hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5016         {
5017           error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5018                  printable_section_name (symtab_shndx_hdr),
5019                  (unsigned long) symtab_shndx_hdr->sh_size,
5020                  (unsigned long) section->sh_size);
5021           goto exit_point;
5022         }
5023     }
5024
5025   isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5026
5027   if (isyms == NULL)
5028     {
5029       error (_("Out of memory reading %lu symbols\n"),
5030              (unsigned long) number);
5031       goto exit_point;
5032     }
5033
5034   for (j = 0, psym = isyms; j < number; j++, psym++)
5035     {
5036       psym->st_name  = BYTE_GET (esyms[j].st_name);
5037       psym->st_info  = BYTE_GET (esyms[j].st_info);
5038       psym->st_other = BYTE_GET (esyms[j].st_other);
5039       psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5040
5041       if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5042         psym->st_shndx
5043           = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5044       else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5045         psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5046
5047       psym->st_value = BYTE_GET (esyms[j].st_value);
5048       psym->st_size  = BYTE_GET (esyms[j].st_size);
5049     }
5050
5051  exit_point:
5052   if (shndx != NULL)
5053     free (shndx);
5054   if (esyms != NULL)
5055     free (esyms);
5056
5057   if (num_syms_return != NULL)
5058     * num_syms_return = isyms == NULL ? 0 : number;
5059
5060   return isyms;
5061 }
5062
5063 static const char *
5064 get_elf_section_flags (bfd_vma sh_flags)
5065 {
5066   static char buff[1024];
5067   char * p = buff;
5068   int field_size = is_32bit_elf ? 8 : 16;
5069   int sindex;
5070   int size = sizeof (buff) - (field_size + 4 + 1);
5071   bfd_vma os_flags = 0;
5072   bfd_vma proc_flags = 0;
5073   bfd_vma unknown_flags = 0;
5074   static const struct
5075     {
5076       const char * str;
5077       int len;
5078     }
5079   flags [] =
5080     {
5081       /*  0 */ { STRING_COMMA_LEN ("WRITE") },
5082       /*  1 */ { STRING_COMMA_LEN ("ALLOC") },
5083       /*  2 */ { STRING_COMMA_LEN ("EXEC") },
5084       /*  3 */ { STRING_COMMA_LEN ("MERGE") },
5085       /*  4 */ { STRING_COMMA_LEN ("STRINGS") },
5086       /*  5 */ { STRING_COMMA_LEN ("INFO LINK") },
5087       /*  6 */ { STRING_COMMA_LEN ("LINK ORDER") },
5088       /*  7 */ { STRING_COMMA_LEN ("OS NONCONF") },
5089       /*  8 */ { STRING_COMMA_LEN ("GROUP") },
5090       /*  9 */ { STRING_COMMA_LEN ("TLS") },
5091       /* IA-64 specific.  */
5092       /* 10 */ { STRING_COMMA_LEN ("SHORT") },
5093       /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
5094       /* IA-64 OpenVMS specific.  */
5095       /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
5096       /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
5097       /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
5098       /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
5099       /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
5100       /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
5101       /* Generic.  */
5102       /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
5103       /* SPARC specific.  */
5104       /* 19 */ { STRING_COMMA_LEN ("ORDERED") }
5105     };
5106
5107   if (do_section_details)
5108     {
5109       sprintf (buff, "[%*.*lx]: ",
5110                field_size, field_size, (unsigned long) sh_flags);
5111       p += field_size + 4;
5112     }
5113
5114   while (sh_flags)
5115     {
5116       bfd_vma flag;
5117
5118       flag = sh_flags & - sh_flags;
5119       sh_flags &= ~ flag;
5120
5121       if (do_section_details)
5122         {
5123           switch (flag)
5124             {
5125             case SHF_WRITE:             sindex = 0; break;
5126             case SHF_ALLOC:             sindex = 1; break;
5127             case SHF_EXECINSTR:         sindex = 2; break;
5128             case SHF_MERGE:             sindex = 3; break;
5129             case SHF_STRINGS:           sindex = 4; break;
5130             case SHF_INFO_LINK:         sindex = 5; break;
5131             case SHF_LINK_ORDER:        sindex = 6; break;
5132             case SHF_OS_NONCONFORMING:  sindex = 7; break;
5133             case SHF_GROUP:             sindex = 8; break;
5134             case SHF_TLS:               sindex = 9; break;
5135             case SHF_EXCLUDE:           sindex = 18; break;
5136
5137             default:
5138               sindex = -1;
5139               switch (elf_header.e_machine)
5140                 {
5141                 case EM_IA_64:
5142                   if (flag == SHF_IA_64_SHORT)
5143                     sindex = 10;
5144                   else if (flag == SHF_IA_64_NORECOV)
5145                     sindex = 11;
5146 #ifdef BFD64
5147                   else if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
5148                     switch (flag)
5149                       {
5150                       case SHF_IA_64_VMS_GLOBAL:      sindex = 12; break;
5151                       case SHF_IA_64_VMS_OVERLAID:    sindex = 13; break;
5152                       case SHF_IA_64_VMS_SHARED:      sindex = 14; break;
5153                       case SHF_IA_64_VMS_VECTOR:      sindex = 15; break;
5154                       case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
5155                       case SHF_IA_64_VMS_PROTECTED:   sindex = 17; break;
5156                       default:                        break;
5157                       }
5158 #endif
5159                   break;
5160
5161                 case EM_386:
5162                 case EM_486:
5163                 case EM_X86_64:
5164                 case EM_L1OM:
5165                 case EM_K1OM:
5166                 case EM_OLD_SPARCV9:
5167                 case EM_SPARC32PLUS:
5168                 case EM_SPARCV9:
5169                 case EM_SPARC:
5170                   if (flag == SHF_ORDERED)
5171                     sindex = 19;
5172                   break;
5173                 default:
5174                   break;
5175                 }
5176             }
5177
5178           if (sindex != -1)
5179             {
5180               if (p != buff + field_size + 4)
5181                 {
5182                   if (size < (10 + 2))
5183                     {
5184                       warn (_("Internal error: not enough buffer room for section flag info"));
5185                       return _("<unknown>");
5186                     }
5187                   size -= 2;
5188                   *p++ = ',';
5189                   *p++ = ' ';
5190                 }
5191
5192               size -= flags [sindex].len;
5193               p = stpcpy (p, flags [sindex].str);
5194             }
5195           else if (flag & SHF_MASKOS)
5196             os_flags |= flag;
5197           else if (flag & SHF_MASKPROC)
5198             proc_flags |= flag;
5199           else
5200             unknown_flags |= flag;
5201         }
5202       else
5203         {
5204           switch (flag)
5205             {
5206             case SHF_WRITE:             *p = 'W'; break;
5207             case SHF_ALLOC:             *p = 'A'; break;
5208             case SHF_EXECINSTR:         *p = 'X'; break;
5209             case SHF_MERGE:             *p = 'M'; break;
5210             case SHF_STRINGS:           *p = 'S'; break;
5211             case SHF_INFO_LINK:         *p = 'I'; break;
5212             case SHF_LINK_ORDER:        *p = 'L'; break;
5213             case SHF_OS_NONCONFORMING:  *p = 'O'; break;
5214             case SHF_GROUP:             *p = 'G'; break;
5215             case SHF_TLS:               *p = 'T'; break;
5216             case SHF_EXCLUDE:           *p = 'E'; break;
5217
5218             default:
5219               if ((elf_header.e_machine == EM_X86_64
5220                    || elf_header.e_machine == EM_L1OM
5221                    || elf_header.e_machine == EM_K1OM)
5222                   && flag == SHF_X86_64_LARGE)
5223                 *p = 'l';
5224               else if (flag & SHF_MASKOS)
5225                 {
5226                   *p = 'o';
5227                   sh_flags &= ~ SHF_MASKOS;
5228                 }
5229               else if (flag & SHF_MASKPROC)
5230                 {
5231                   *p = 'p';
5232                   sh_flags &= ~ SHF_MASKPROC;
5233                 }
5234               else
5235                 *p = 'x';
5236               break;
5237             }
5238           p++;
5239         }
5240     }
5241
5242   if (do_section_details)
5243     {
5244       if (os_flags)
5245         {
5246           size -= 5 + field_size;
5247           if (p != buff + field_size + 4)
5248             {
5249               if (size < (2 + 1))
5250                 {
5251                   warn (_("Internal error: not enough buffer room for section flag info"));
5252                   return _("<unknown>");
5253                 }
5254               size -= 2;
5255               *p++ = ',';
5256               *p++ = ' ';
5257             }
5258           sprintf (p, "OS (%*.*lx)", field_size, field_size,
5259                    (unsigned long) os_flags);
5260           p += 5 + field_size;
5261         }
5262       if (proc_flags)
5263         {
5264           size -= 7 + field_size;
5265           if (p != buff + field_size + 4)
5266             {
5267               if (size < (2 + 1))
5268                 {
5269                   warn (_("Internal error: not enough buffer room for section flag info"));
5270                   return _("<unknown>");
5271                 }
5272               size -= 2;
5273               *p++ = ',';
5274               *p++ = ' ';
5275             }
5276           sprintf (p, "PROC (%*.*lx)", field_size, field_size,
5277                    (unsigned long) proc_flags);
5278           p += 7 + field_size;
5279         }
5280       if (unknown_flags)
5281         {
5282           size -= 10 + field_size;
5283           if (p != buff + field_size + 4)
5284             {
5285               if (size < (2 + 1))
5286                 {
5287                   warn (_("Internal error: not enough buffer room for section flag info"));
5288                   return _("<unknown>");
5289                 }
5290               size -= 2;
5291               *p++ = ',';
5292               *p++ = ' ';
5293             }
5294           sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
5295                    (unsigned long) unknown_flags);
5296           p += 10 + field_size;
5297         }
5298     }
5299
5300   *p = '\0';
5301   return buff;
5302 }
5303
5304 static int
5305 process_section_headers (FILE * file)
5306 {
5307   Elf_Internal_Shdr * section;
5308   unsigned int i;
5309
5310   section_headers = NULL;
5311
5312   if (elf_header.e_shnum == 0)
5313     {
5314       /* PR binutils/12467.  */
5315       if (elf_header.e_shoff != 0)
5316         warn (_("possibly corrupt ELF file header - it has a non-zero"
5317                 " section header offset, but no section headers\n"));
5318       else if (do_sections)
5319         printf (_("\nThere are no sections in this file.\n"));
5320
5321       return 1;
5322     }
5323
5324   if (do_sections && !do_header)
5325     printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
5326             elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
5327
5328   if (is_32bit_elf)
5329     {
5330       if (! get_32bit_section_headers (file, FALSE))
5331         return 0;
5332     }
5333   else if (! get_64bit_section_headers (file, FALSE))
5334     return 0;
5335
5336   /* Read in the string table, so that we have names to display.  */
5337   if (elf_header.e_shstrndx != SHN_UNDEF
5338        && elf_header.e_shstrndx < elf_header.e_shnum)
5339     {
5340       section = section_headers + elf_header.e_shstrndx;
5341
5342       if (section->sh_size != 0)
5343         {
5344           string_table = (char *) get_data (NULL, file, section->sh_offset,
5345                                             1, section->sh_size,
5346                                             _("string table"));
5347
5348           string_table_length = string_table != NULL ? section->sh_size : 0;
5349         }
5350     }
5351
5352   /* Scan the sections for the dynamic symbol table
5353      and dynamic string table and debug sections.  */
5354   dynamic_symbols = NULL;
5355   dynamic_strings = NULL;
5356   dynamic_syminfo = NULL;
5357   symtab_shndx_hdr = NULL;
5358
5359   eh_addr_size = is_32bit_elf ? 4 : 8;
5360   switch (elf_header.e_machine)
5361     {
5362     case EM_MIPS:
5363     case EM_MIPS_RS3_LE:
5364       /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
5365          FDE addresses.  However, the ABI also has a semi-official ILP32
5366          variant for which the normal FDE address size rules apply.
5367
5368          GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
5369          section, where XX is the size of longs in bits.  Unfortunately,
5370          earlier compilers provided no way of distinguishing ILP32 objects
5371          from LP64 objects, so if there's any doubt, we should assume that
5372          the official LP64 form is being used.  */
5373       if ((elf_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
5374           && find_section (".gcc_compiled_long32") == NULL)
5375         eh_addr_size = 8;
5376       break;
5377
5378     case EM_H8_300:
5379     case EM_H8_300H:
5380       switch (elf_header.e_flags & EF_H8_MACH)
5381         {
5382         case E_H8_MACH_H8300:
5383         case E_H8_MACH_H8300HN:
5384         case E_H8_MACH_H8300SN:
5385         case E_H8_MACH_H8300SXN:
5386           eh_addr_size = 2;
5387           break;
5388         case E_H8_MACH_H8300H:
5389         case E_H8_MACH_H8300S:
5390         case E_H8_MACH_H8300SX:
5391           eh_addr_size = 4;
5392           break;
5393         }
5394       break;
5395
5396     case EM_M32C_OLD:
5397     case EM_M32C:
5398       switch (elf_header.e_flags & EF_M32C_CPU_MASK)
5399         {
5400         case EF_M32C_CPU_M16C:
5401           eh_addr_size = 2;
5402           break;
5403         }
5404       break;
5405     }
5406
5407 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64)                \
5408   do                                                                    \
5409     {                                                                   \
5410       bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64;  \
5411       if (section->sh_entsize != expected_entsize)                      \
5412         {                                                               \
5413           char buf[40];                                                 \
5414           sprintf_vma (buf, section->sh_entsize);                       \
5415           /* Note: coded this way so that there is a single string for  \
5416              translation.  */ \
5417           error (_("Section %d has invalid sh_entsize of %s\n"), i, buf); \
5418           error (_("(Using the expected size of %u for the rest of this dump)\n"), \
5419                    (unsigned) expected_entsize);                        \
5420           section->sh_entsize = expected_entsize;                       \
5421         }                                                               \
5422     }                                                                   \
5423   while (0)
5424
5425 #define CHECK_ENTSIZE(section, i, type)                                 \
5426   CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type),         \
5427                         sizeof (Elf64_External_##type))
5428
5429   for (i = 0, section = section_headers;
5430        i < elf_header.e_shnum;
5431        i++, section++)
5432     {
5433       char * name = SECTION_NAME (section);
5434
5435       if (section->sh_type == SHT_DYNSYM)
5436         {
5437           if (dynamic_symbols != NULL)
5438             {
5439               error (_("File contains multiple dynamic symbol tables\n"));
5440               continue;
5441             }
5442
5443           CHECK_ENTSIZE (section, i, Sym);
5444           dynamic_symbols = GET_ELF_SYMBOLS (file, section, & num_dynamic_syms);
5445         }
5446       else if (section->sh_type == SHT_STRTAB
5447                && streq (name, ".dynstr"))
5448         {
5449           if (dynamic_strings != NULL)
5450             {
5451               error (_("File contains multiple dynamic string tables\n"));
5452               continue;
5453             }
5454
5455           dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
5456                                                1, section->sh_size,
5457                                                _("dynamic strings"));
5458           dynamic_strings_length = dynamic_strings == NULL ? 0 : section->sh_size;
5459         }
5460       else if (section->sh_type == SHT_SYMTAB_SHNDX)
5461         {
5462           if (symtab_shndx_hdr != NULL)
5463             {
5464               error (_("File contains multiple symtab shndx tables\n"));
5465               continue;
5466             }
5467           symtab_shndx_hdr = section;
5468         }
5469       else if (section->sh_type == SHT_SYMTAB)
5470         CHECK_ENTSIZE (section, i, Sym);
5471       else if (section->sh_type == SHT_GROUP)
5472         CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
5473       else if (section->sh_type == SHT_REL)
5474         CHECK_ENTSIZE (section, i, Rel);
5475       else if (section->sh_type == SHT_RELA)
5476         CHECK_ENTSIZE (section, i, Rela);
5477       else if ((do_debugging || do_debug_info || do_debug_abbrevs
5478                 || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
5479                 || do_debug_aranges || do_debug_frames || do_debug_macinfo
5480                 || do_debug_str || do_debug_loc || do_debug_ranges
5481                 || do_debug_addr || do_debug_cu_index)
5482                && (const_strneq (name, ".debug_")
5483                    || const_strneq (name, ".zdebug_")))
5484         {
5485           if (name[1] == 'z')
5486             name += sizeof (".zdebug_") - 1;
5487           else
5488             name += sizeof (".debug_") - 1;
5489
5490           if (do_debugging
5491               || (do_debug_info     && const_strneq (name, "info"))
5492               || (do_debug_info     && const_strneq (name, "types"))
5493               || (do_debug_abbrevs  && const_strneq (name, "abbrev"))
5494               || (do_debug_lines    && strcmp (name, "line") == 0)
5495               || (do_debug_lines    && const_strneq (name, "line."))
5496               || (do_debug_pubnames && const_strneq (name, "pubnames"))
5497               || (do_debug_pubtypes && const_strneq (name, "pubtypes"))
5498               || (do_debug_pubnames && const_strneq (name, "gnu_pubnames"))
5499               || (do_debug_pubtypes && const_strneq (name, "gnu_pubtypes"))
5500               || (do_debug_aranges  && const_strneq (name, "aranges"))
5501               || (do_debug_ranges   && const_strneq (name, "ranges"))
5502               || (do_debug_frames   && const_strneq (name, "frame"))
5503               || (do_debug_macinfo  && const_strneq (name, "macinfo"))
5504               || (do_debug_macinfo  && const_strneq (name, "macro"))
5505               || (do_debug_str      && const_strneq (name, "str"))
5506               || (do_debug_loc      && const_strneq (name, "loc"))
5507               || (do_debug_addr     && const_strneq (name, "addr"))
5508               || (do_debug_cu_index && const_strneq (name, "cu_index"))
5509               || (do_debug_cu_index && const_strneq (name, "tu_index"))
5510               )
5511             request_dump_bynumber (i, DEBUG_DUMP);
5512         }
5513       /* Linkonce section to be combined with .debug_info at link time.  */
5514       else if ((do_debugging || do_debug_info)
5515                && const_strneq (name, ".gnu.linkonce.wi."))
5516         request_dump_bynumber (i, DEBUG_DUMP);
5517       else if (do_debug_frames && streq (name, ".eh_frame"))
5518         request_dump_bynumber (i, DEBUG_DUMP);
5519       else if (do_gdb_index && streq (name, ".gdb_index"))
5520         request_dump_bynumber (i, DEBUG_DUMP);
5521       /* Trace sections for Itanium VMS.  */
5522       else if ((do_debugging || do_trace_info || do_trace_abbrevs
5523                 || do_trace_aranges)
5524                && const_strneq (name, ".trace_"))
5525         {
5526           name += sizeof (".trace_") - 1;
5527
5528           if (do_debugging
5529               || (do_trace_info     && streq (name, "info"))
5530               || (do_trace_abbrevs  && streq (name, "abbrev"))
5531               || (do_trace_aranges  && streq (name, "aranges"))
5532               )
5533             request_dump_bynumber (i, DEBUG_DUMP);
5534         }
5535     }
5536
5537   if (! do_sections)
5538     return 1;
5539
5540   if (elf_header.e_shnum > 1)
5541     printf (_("\nSection Headers:\n"));
5542   else
5543     printf (_("\nSection Header:\n"));
5544
5545   if (is_32bit_elf)
5546     {
5547       if (do_section_details)
5548         {
5549           printf (_("  [Nr] Name\n"));
5550           printf (_("       Type            Addr     Off    Size   ES   Lk Inf Al\n"));
5551         }
5552       else
5553         printf
5554           (_("  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al\n"));
5555     }
5556   else if (do_wide)
5557     {
5558       if (do_section_details)
5559         {
5560           printf (_("  [Nr] Name\n"));
5561           printf (_("       Type            Address          Off    Size   ES   Lk Inf Al\n"));
5562         }
5563       else
5564         printf
5565           (_("  [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al\n"));
5566     }
5567   else
5568     {
5569       if (do_section_details)
5570         {
5571           printf (_("  [Nr] Name\n"));
5572           printf (_("       Type              Address          Offset            Link\n"));
5573           printf (_("       Size              EntSize          Info              Align\n"));
5574         }
5575       else
5576         {
5577           printf (_("  [Nr] Name              Type             Address           Offset\n"));
5578           printf (_("       Size              EntSize          Flags  Link  Info  Align\n"));
5579         }
5580     }
5581
5582   if (do_section_details)
5583     printf (_("       Flags\n"));
5584
5585   for (i = 0, section = section_headers;
5586        i < elf_header.e_shnum;
5587        i++, section++)
5588     {
5589       printf ("  [%2u] ", i);
5590       if (do_section_details)
5591         printf ("%s\n      ", printable_section_name (section));
5592       else
5593         print_symbol (-17, SECTION_NAME (section));
5594
5595       printf (do_wide ? " %-15s " : " %-15.15s ",
5596               get_section_type_name (section->sh_type));
5597
5598       if (is_32bit_elf)
5599         {
5600           const char * link_too_big = NULL;
5601
5602           print_vma (section->sh_addr, LONG_HEX);
5603
5604           printf ( " %6.6lx %6.6lx %2.2lx",
5605                    (unsigned long) section->sh_offset,
5606                    (unsigned long) section->sh_size,
5607                    (unsigned long) section->sh_entsize);
5608
5609           if (do_section_details)
5610             fputs ("  ", stdout);
5611           else
5612             printf (" %3s ", get_elf_section_flags (section->sh_flags));
5613
5614           if (section->sh_link >= elf_header.e_shnum)
5615             {
5616               link_too_big = "";
5617               /* The sh_link value is out of range.  Normally this indicates
5618                  an error but it can have special values in Solaris binaries.  */
5619               switch (elf_header.e_machine)
5620                 {
5621                 case EM_386:
5622                 case EM_486:
5623                 case EM_X86_64:
5624                 case EM_L1OM:
5625                 case EM_K1OM:
5626                 case EM_OLD_SPARCV9:
5627                 case EM_SPARC32PLUS:
5628                 case EM_SPARCV9:
5629                 case EM_SPARC:
5630                   if (section->sh_link == (SHN_BEFORE & 0xffff))
5631                     link_too_big = "BEFORE";
5632                   else if (section->sh_link == (SHN_AFTER & 0xffff))
5633                     link_too_big = "AFTER";
5634                   break;
5635                 default:
5636                   break;
5637                 }
5638             }
5639
5640           if (do_section_details)
5641             {
5642               if (link_too_big != NULL && * link_too_big)
5643                 printf ("<%s> ", link_too_big);
5644               else
5645                 printf ("%2u ", section->sh_link);
5646               printf ("%3u %2lu\n", section->sh_info,
5647                       (unsigned long) section->sh_addralign);
5648             }
5649           else
5650             printf ("%2u %3u %2lu\n",
5651                     section->sh_link,
5652                     section->sh_info,
5653                     (unsigned long) section->sh_addralign);
5654
5655           if (link_too_big && ! * link_too_big)
5656             warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
5657                   i, section->sh_link);
5658         }
5659       else if (do_wide)
5660         {
5661           print_vma (section->sh_addr, LONG_HEX);
5662
5663           if ((long) section->sh_offset == section->sh_offset)
5664             printf (" %6.6lx", (unsigned long) section->sh_offset);
5665           else
5666             {
5667               putchar (' ');
5668               print_vma (section->sh_offset, LONG_HEX);
5669             }
5670
5671           if ((unsigned long) section->sh_size == section->sh_size)
5672             printf (" %6.6lx", (unsigned long) section->sh_size);
5673           else
5674             {
5675               putchar (' ');
5676               print_vma (section->sh_size, LONG_HEX);
5677             }
5678
5679           if ((unsigned long) section->sh_entsize == section->sh_entsize)
5680             printf (" %2.2lx", (unsigned long) section->sh_entsize);
5681           else
5682             {
5683               putchar (' ');
5684               print_vma (section->sh_entsize, LONG_HEX);
5685             }
5686
5687           if (do_section_details)
5688             fputs ("  ", stdout);
5689           else
5690             printf (" %3s ", get_elf_section_flags (section->sh_flags));
5691
5692           printf ("%2u %3u ", section->sh_link, section->sh_info);
5693
5694           if ((unsigned long) section->sh_addralign == section->sh_addralign)
5695             printf ("%2lu\n", (unsigned long) section->sh_addralign);
5696           else
5697             {
5698               print_vma (section->sh_addralign, DEC);
5699               putchar ('\n');
5700             }
5701         }
5702       else if (do_section_details)
5703         {
5704           printf ("       %-15.15s  ",
5705                   get_section_type_name (section->sh_type));
5706           print_vma (section->sh_addr, LONG_HEX);
5707           if ((long) section->sh_offset == section->sh_offset)
5708             printf ("  %16.16lx", (unsigned long) section->sh_offset);
5709           else
5710             {
5711               printf ("  ");
5712               print_vma (section->sh_offset, LONG_HEX);
5713             }
5714           printf ("  %u\n       ", section->sh_link);
5715           print_vma (section->sh_size, LONG_HEX);
5716           putchar (' ');
5717           print_vma (section->sh_entsize, LONG_HEX);
5718
5719           printf ("  %-16u  %lu\n",
5720                   section->sh_info,
5721                   (unsigned long) section->sh_addralign);
5722         }
5723       else
5724         {
5725           putchar (' ');
5726           print_vma (section->sh_addr, LONG_HEX);
5727           if ((long) section->sh_offset == section->sh_offset)
5728             printf ("  %8.8lx", (unsigned long) section->sh_offset);
5729           else
5730             {
5731               printf ("  ");
5732               print_vma (section->sh_offset, LONG_HEX);
5733             }
5734           printf ("\n       ");
5735           print_vma (section->sh_size, LONG_HEX);
5736           printf ("  ");
5737           print_vma (section->sh_entsize, LONG_HEX);
5738
5739           printf (" %3s ", get_elf_section_flags (section->sh_flags));
5740
5741           printf ("     %2u   %3u     %lu\n",
5742                   section->sh_link,
5743                   section->sh_info,
5744                   (unsigned long) section->sh_addralign);
5745         }
5746
5747       if (do_section_details)
5748         printf ("       %s\n", get_elf_section_flags (section->sh_flags));
5749     }
5750
5751   if (!do_section_details)
5752     {
5753       if (elf_header.e_machine == EM_X86_64
5754           || elf_header.e_machine == EM_L1OM
5755           || elf_header.e_machine == EM_K1OM)
5756         printf (_("Key to Flags:\n\
5757   W (write), A (alloc), X (execute), M (merge), S (strings), l (large)\n\
5758   I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)\n\
5759   O (extra OS processing required) o (OS specific), p (processor specific)\n"));
5760       else
5761         printf (_("Key to Flags:\n\
5762   W (write), A (alloc), X (execute), M (merge), S (strings)\n\
5763   I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)\n\
5764   O (extra OS processing required) o (OS specific), p (processor specific)\n"));
5765     }
5766
5767   return 1;
5768 }
5769
5770 static const char *
5771 get_group_flags (unsigned int flags)
5772 {
5773   static char buff[32];
5774   switch (flags)
5775     {
5776     case 0:
5777       return "";
5778
5779     case GRP_COMDAT:
5780       return "COMDAT ";
5781
5782    default:
5783       snprintf (buff, sizeof (buff), _("[<unknown>: 0x%x] "), flags);
5784       break;
5785     }
5786   return buff;
5787 }
5788
5789 static int
5790 process_section_groups (FILE * file)
5791 {
5792   Elf_Internal_Shdr * section;
5793   unsigned int i;
5794   struct group * group;
5795   Elf_Internal_Shdr * symtab_sec;
5796   Elf_Internal_Shdr * strtab_sec;
5797   Elf_Internal_Sym * symtab;
5798   unsigned long num_syms;
5799   char * strtab;
5800   size_t strtab_size;
5801
5802   /* Don't process section groups unless needed.  */
5803   if (!do_unwind && !do_section_groups)
5804     return 1;
5805
5806   if (elf_header.e_shnum == 0)
5807     {
5808       if (do_section_groups)
5809         printf (_("\nThere are no sections to group in this file.\n"));
5810
5811       return 1;
5812     }
5813
5814   if (section_headers == NULL)
5815     {
5816       error (_("Section headers are not available!\n"));
5817       /* PR 13622: This can happen with a corrupt ELF header.  */
5818       return 0;
5819     }
5820
5821   section_headers_groups = (struct group **) calloc (elf_header.e_shnum,
5822                                                      sizeof (struct group *));
5823
5824   if (section_headers_groups == NULL)
5825     {
5826       error (_("Out of memory reading %u section group headers\n"),
5827              elf_header.e_shnum);
5828       return 0;
5829     }
5830
5831   /* Scan the sections for the group section.  */
5832   group_count = 0;
5833   for (i = 0, section = section_headers;
5834        i < elf_header.e_shnum;
5835        i++, section++)
5836     if (section->sh_type == SHT_GROUP)
5837       group_count++;
5838
5839   if (group_count == 0)
5840     {
5841       if (do_section_groups)
5842         printf (_("\nThere are no section groups in this file.\n"));
5843
5844       return 1;
5845     }
5846
5847   section_groups = (struct group *) calloc (group_count, sizeof (struct group));
5848
5849   if (section_groups == NULL)
5850     {
5851       error (_("Out of memory reading %lu groups\n"),
5852              (unsigned long) group_count);
5853       return 0;
5854     }
5855
5856   symtab_sec = NULL;
5857   strtab_sec = NULL;
5858   symtab = NULL;
5859   num_syms = 0;
5860   strtab = NULL;
5861   strtab_size = 0;
5862   for (i = 0, section = section_headers, group = section_groups;
5863        i < elf_header.e_shnum;
5864        i++, section++)
5865     {
5866       if (section->sh_type == SHT_GROUP)
5867         {
5868           const char * name = printable_section_name (section);
5869           const char * group_name;
5870           unsigned char * start;
5871           unsigned char * indices;
5872           unsigned int entry, j, size;
5873           Elf_Internal_Shdr * sec;
5874           Elf_Internal_Sym * sym;
5875
5876           /* Get the symbol table.  */
5877           if (section->sh_link >= elf_header.e_shnum
5878               || ((sec = section_headers + section->sh_link)->sh_type
5879                   != SHT_SYMTAB))
5880             {
5881               error (_("Bad sh_link in group section `%s'\n"), name);
5882               continue;
5883             }
5884
5885           if (symtab_sec != sec)
5886             {
5887               symtab_sec = sec;
5888               if (symtab)
5889                 free (symtab);
5890               symtab = GET_ELF_SYMBOLS (file, symtab_sec, & num_syms);
5891             }
5892
5893           if (symtab == NULL)
5894             {
5895               error (_("Corrupt header in group section `%s'\n"), name);
5896               continue;
5897             }
5898
5899           if (section->sh_info >= num_syms)
5900             {
5901               error (_("Bad sh_info in group section `%s'\n"), name);
5902               continue;
5903             }
5904
5905           sym = symtab + section->sh_info;
5906
5907           if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
5908             {
5909               if (sym->st_shndx == 0
5910                   || sym->st_shndx >= elf_header.e_shnum)
5911                 {
5912                   error (_("Bad sh_info in group section `%s'\n"), name);
5913                   continue;
5914                 }
5915
5916               group_name = SECTION_NAME (section_headers + sym->st_shndx);
5917               strtab_sec = NULL;
5918               if (strtab)
5919                 free (strtab);
5920               strtab = NULL;
5921               strtab_size = 0;
5922             }
5923           else
5924             {
5925               /* Get the string table.  */
5926               if (symtab_sec->sh_link >= elf_header.e_shnum)
5927                 {
5928                   strtab_sec = NULL;
5929                   if (strtab)
5930                     free (strtab);
5931                   strtab = NULL;
5932                   strtab_size = 0;
5933                 }
5934               else if (strtab_sec
5935                        != (sec = section_headers + symtab_sec->sh_link))
5936                 {
5937                   strtab_sec = sec;
5938                   if (strtab)
5939                     free (strtab);
5940
5941                   strtab = (char *) get_data (NULL, file, strtab_sec->sh_offset,
5942                                               1, strtab_sec->sh_size,
5943                                               _("string table"));
5944                   strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
5945                 }
5946               group_name = sym->st_name < strtab_size
5947                 ? strtab + sym->st_name : _("<corrupt>");
5948             }
5949
5950           /* PR 17531: file: loop.  */
5951           if (section->sh_entsize > section->sh_size)
5952             {
5953               error (_("Section %s has sh_entsize (0x%lx) which is larger than its size (0x%lx)\n"),
5954                      printable_section_name (section),
5955                      (unsigned long) section->sh_entsize,
5956                      (unsigned long) section->sh_size);
5957               break;
5958             }
5959
5960           start = (unsigned char *) get_data (NULL, file, section->sh_offset,
5961                                               1, section->sh_size,
5962                                               _("section data"));
5963           if (start == NULL)
5964             continue;
5965
5966           indices = start;
5967           size = (section->sh_size / section->sh_entsize) - 1;
5968           entry = byte_get (indices, 4);
5969           indices += 4;
5970
5971           if (do_section_groups)
5972             {
5973               printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
5974                       get_group_flags (entry), i, name, group_name, size);
5975
5976               printf (_("   [Index]    Name\n"));
5977             }
5978
5979           group->group_index = i;
5980
5981           for (j = 0; j < size; j++)
5982             {
5983               struct group_list * g;
5984
5985               entry = byte_get (indices, 4);
5986               indices += 4;
5987
5988               if (entry >= elf_header.e_shnum)
5989                 {
5990                   error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
5991                          entry, i, elf_header.e_shnum - 1);
5992                   continue;
5993                 }
5994
5995               if (section_headers_groups [entry] != NULL)
5996                 {
5997                   if (entry)
5998                     {
5999                       error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
6000                              entry, i,
6001                              section_headers_groups [entry]->group_index);
6002                       continue;
6003                     }
6004                   else
6005                     {
6006                       /* Intel C/C++ compiler may put section 0 in a
6007                          section group. We just warn it the first time
6008                          and ignore it afterwards.  */
6009                       static int warned = 0;
6010                       if (!warned)
6011                         {
6012                           error (_("section 0 in group section [%5u]\n"),
6013                                  section_headers_groups [entry]->group_index);
6014                           warned++;
6015                         }
6016                     }
6017                 }
6018
6019               section_headers_groups [entry] = group;
6020
6021               if (do_section_groups)
6022                 {
6023                   sec = section_headers + entry;
6024                   printf ("   [%5u]   %s\n", entry, printable_section_name (sec));
6025                 }
6026
6027               g = (struct group_list *) xmalloc (sizeof (struct group_list));
6028               g->section_index = entry;
6029               g->next = group->root;
6030               group->root = g;
6031             }
6032
6033           if (start)
6034             free (start);
6035
6036           group++;
6037         }
6038     }
6039
6040   if (symtab)
6041     free (symtab);
6042   if (strtab)
6043     free (strtab);
6044   return 1;
6045 }
6046
6047 /* Data used to display dynamic fixups.  */
6048
6049 struct ia64_vms_dynfixup
6050 {
6051   bfd_vma needed_ident;         /* Library ident number.  */
6052   bfd_vma needed;               /* Index in the dstrtab of the library name.  */
6053   bfd_vma fixup_needed;         /* Index of the library.  */
6054   bfd_vma fixup_rela_cnt;       /* Number of fixups.  */
6055   bfd_vma fixup_rela_off;       /* Fixups offset in the dynamic segment.  */
6056 };
6057
6058 /* Data used to display dynamic relocations.  */
6059
6060 struct ia64_vms_dynimgrela
6061 {
6062   bfd_vma img_rela_cnt;         /* Number of relocations.  */
6063   bfd_vma img_rela_off;         /* Reloc offset in the dynamic segment.  */
6064 };
6065
6066 /* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
6067    library).  */
6068
6069 static void
6070 dump_ia64_vms_dynamic_fixups (FILE *file, struct ia64_vms_dynfixup *fixup,
6071                               const char *strtab, unsigned int strtab_sz)
6072 {
6073   Elf64_External_VMS_IMAGE_FIXUP *imfs;
6074   long i;
6075   const char *lib_name;
6076
6077   imfs = get_data (NULL, file, dynamic_addr + fixup->fixup_rela_off,
6078                    1, fixup->fixup_rela_cnt * sizeof (*imfs),
6079                    _("dynamic section image fixups"));
6080   if (!imfs)
6081     return;
6082
6083   if (fixup->needed < strtab_sz)
6084     lib_name = strtab + fixup->needed;
6085   else
6086     {
6087       warn ("corrupt library name index of 0x%lx found in dynamic entry",
6088             (unsigned long) fixup->needed);
6089       lib_name = "???";
6090     }
6091   printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
6092           (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
6093   printf
6094     (_("Seg Offset           Type                             SymVec DataType\n"));
6095
6096   for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
6097     {
6098       unsigned int type;
6099       const char *rtype;
6100
6101       printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
6102       printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
6103       type = BYTE_GET (imfs [i].type);
6104       rtype = elf_ia64_reloc_type (type);
6105       if (rtype == NULL)
6106         printf (" 0x%08x                       ", type);
6107       else
6108         printf (" %-32s ", rtype);
6109       printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
6110       printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
6111     }
6112
6113   free (imfs);
6114 }
6115
6116 /* Display IA-64 OpenVMS dynamic relocations (used to relocate an image).  */
6117
6118 static void
6119 dump_ia64_vms_dynamic_relocs (FILE *file, struct ia64_vms_dynimgrela *imgrela)
6120 {
6121   Elf64_External_VMS_IMAGE_RELA *imrs;
6122   long i;
6123
6124   imrs = get_data (NULL, file, dynamic_addr + imgrela->img_rela_off,
6125                    1, imgrela->img_rela_cnt * sizeof (*imrs),
6126                    _("dynamic section image relocations"));
6127   if (!imrs)
6128     return;
6129
6130   printf (_("\nImage relocs\n"));
6131   printf
6132     (_("Seg Offset   Type                            Addend            Seg Sym Off\n"));
6133
6134   for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
6135     {
6136       unsigned int type;
6137       const char *rtype;
6138
6139       printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
6140       printf ("%08" BFD_VMA_FMT "x ",
6141               (bfd_vma) BYTE_GET (imrs [i].rela_offset));
6142       type = BYTE_GET (imrs [i].type);
6143       rtype = elf_ia64_reloc_type (type);
6144       if (rtype == NULL)
6145         printf ("0x%08x                      ", type);
6146       else
6147         printf ("%-31s ", rtype);
6148       print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
6149       printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
6150       printf ("%08" BFD_VMA_FMT "x\n",
6151               (bfd_vma) BYTE_GET (imrs [i].sym_offset));
6152     }
6153
6154   free (imrs);
6155 }
6156
6157 /* Display IA-64 OpenVMS dynamic relocations and fixups.  */
6158
6159 static int
6160 process_ia64_vms_dynamic_relocs (FILE *file)
6161 {
6162   struct ia64_vms_dynfixup fixup;
6163   struct ia64_vms_dynimgrela imgrela;
6164   Elf_Internal_Dyn *entry;
6165   int res = 0;
6166   bfd_vma strtab_off = 0;
6167   bfd_vma strtab_sz = 0;
6168   char *strtab = NULL;
6169
6170   memset (&fixup, 0, sizeof (fixup));
6171   memset (&imgrela, 0, sizeof (imgrela));
6172
6173   /* Note: the order of the entries is specified by the OpenVMS specs.  */
6174   for (entry = dynamic_section;
6175        entry < dynamic_section + dynamic_nent;
6176        entry++)
6177     {
6178       switch (entry->d_tag)
6179         {
6180         case DT_IA_64_VMS_STRTAB_OFFSET:
6181           strtab_off = entry->d_un.d_val;
6182           break;
6183         case DT_STRSZ:
6184           strtab_sz = entry->d_un.d_val;
6185           if (strtab == NULL)
6186             strtab = get_data (NULL, file, dynamic_addr + strtab_off,
6187                                1, strtab_sz, _("dynamic string section"));
6188           break;
6189
6190         case DT_IA_64_VMS_NEEDED_IDENT:
6191           fixup.needed_ident = entry->d_un.d_val;
6192           break;
6193         case DT_NEEDED:
6194           fixup.needed = entry->d_un.d_val;
6195           break;
6196         case DT_IA_64_VMS_FIXUP_NEEDED:
6197           fixup.fixup_needed = entry->d_un.d_val;
6198           break;
6199         case DT_IA_64_VMS_FIXUP_RELA_CNT:
6200           fixup.fixup_rela_cnt = entry->d_un.d_val;
6201           break;
6202         case DT_IA_64_VMS_FIXUP_RELA_OFF:
6203           fixup.fixup_rela_off = entry->d_un.d_val;
6204           res++;
6205           dump_ia64_vms_dynamic_fixups (file, &fixup, strtab, strtab_sz);
6206           break;
6207
6208         case DT_IA_64_VMS_IMG_RELA_CNT:
6209           imgrela.img_rela_cnt = entry->d_un.d_val;
6210           break;
6211         case DT_IA_64_VMS_IMG_RELA_OFF:
6212           imgrela.img_rela_off = entry->d_un.d_val;
6213           res++;
6214           dump_ia64_vms_dynamic_relocs (file, &imgrela);
6215           break;
6216
6217         default:
6218           break;
6219         }
6220     }
6221
6222   if (strtab != NULL)
6223     free (strtab);
6224
6225   return res;
6226 }
6227
6228 static struct
6229 {
6230   const char * name;
6231   int reloc;
6232   int size;
6233   int rela;
6234 } dynamic_relocations [] =
6235 {
6236     { "REL", DT_REL, DT_RELSZ, FALSE },
6237     { "RELA", DT_RELA, DT_RELASZ, TRUE },
6238     { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
6239 };
6240
6241 /* Process the reloc section.  */
6242
6243 static int
6244 process_relocs (FILE * file)
6245 {
6246   unsigned long rel_size;
6247   unsigned long rel_offset;
6248
6249
6250   if (!do_reloc)
6251     return 1;
6252
6253   if (do_using_dynamic)
6254     {
6255       int is_rela;
6256       const char * name;
6257       int has_dynamic_reloc;
6258       unsigned int i;
6259
6260       has_dynamic_reloc = 0;
6261
6262       for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
6263         {
6264           is_rela = dynamic_relocations [i].rela;
6265           name = dynamic_relocations [i].name;
6266           rel_size = dynamic_info [dynamic_relocations [i].size];
6267           rel_offset = dynamic_info [dynamic_relocations [i].reloc];
6268
6269           has_dynamic_reloc |= rel_size;
6270
6271           if (is_rela == UNKNOWN)
6272             {
6273               if (dynamic_relocations [i].reloc == DT_JMPREL)
6274                 switch (dynamic_info[DT_PLTREL])
6275                   {
6276                   case DT_REL:
6277                     is_rela = FALSE;
6278                     break;
6279                   case DT_RELA:
6280                     is_rela = TRUE;
6281                     break;
6282                   }
6283             }
6284
6285           if (rel_size)
6286             {
6287               printf
6288                 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
6289                  name, rel_offset, rel_size);
6290
6291               dump_relocations (file,
6292                                 offset_from_vma (file, rel_offset, rel_size),
6293                                 rel_size,
6294                                 dynamic_symbols, num_dynamic_syms,
6295                                 dynamic_strings, dynamic_strings_length,
6296                                 is_rela, 1);
6297             }
6298         }
6299
6300       if (is_ia64_vms ())
6301         has_dynamic_reloc |= process_ia64_vms_dynamic_relocs (file);
6302
6303       if (! has_dynamic_reloc)
6304         printf (_("\nThere are no dynamic relocations in this file.\n"));
6305     }
6306   else
6307     {
6308       Elf_Internal_Shdr * section;
6309       unsigned long i;
6310       int found = 0;
6311
6312       for (i = 0, section = section_headers;
6313            i < elf_header.e_shnum;
6314            i++, section++)
6315         {
6316           if (   section->sh_type != SHT_RELA
6317               && section->sh_type != SHT_REL)
6318             continue;
6319
6320           rel_offset = section->sh_offset;
6321           rel_size   = section->sh_size;
6322
6323           if (rel_size)
6324             {
6325               Elf_Internal_Shdr * strsec;
6326               int is_rela;
6327
6328               printf (_("\nRelocation section "));
6329
6330               if (string_table == NULL)
6331                 printf ("%d", section->sh_name);
6332               else
6333                 printf ("'%s'", printable_section_name (section));
6334
6335               printf (_(" at offset 0x%lx contains %lu entries:\n"),
6336                  rel_offset, (unsigned long) (rel_size / section->sh_entsize));
6337
6338               is_rela = section->sh_type == SHT_RELA;
6339
6340               if (section->sh_link != 0
6341                   && section->sh_link < elf_header.e_shnum)
6342                 {
6343                   Elf_Internal_Shdr * symsec;
6344                   Elf_Internal_Sym *  symtab;
6345                   unsigned long nsyms;
6346                   unsigned long strtablen = 0;
6347                   char * strtab = NULL;
6348
6349                   symsec = section_headers + section->sh_link;
6350                   if (symsec->sh_type != SHT_SYMTAB
6351                       && symsec->sh_type != SHT_DYNSYM)
6352                     continue;
6353
6354                   symtab = GET_ELF_SYMBOLS (file, symsec, & nsyms);
6355
6356                   if (symtab == NULL)
6357                     continue;
6358
6359                   if (symsec->sh_link != 0
6360                       && symsec->sh_link < elf_header.e_shnum)
6361                     {
6362                       strsec = section_headers + symsec->sh_link;
6363
6364                       strtab = (char *) get_data (NULL, file, strsec->sh_offset,
6365                                                   1, strsec->sh_size,
6366                                                   _("string table"));
6367                       strtablen = strtab == NULL ? 0 : strsec->sh_size;
6368                     }
6369
6370                   dump_relocations (file, rel_offset, rel_size,
6371                                     symtab, nsyms, strtab, strtablen,
6372                                     is_rela,
6373                                     symsec->sh_type == SHT_DYNSYM);
6374                   if (strtab)
6375                     free (strtab);
6376                   free (symtab);
6377                 }
6378               else
6379                 dump_relocations (file, rel_offset, rel_size,
6380                                   NULL, 0, NULL, 0, is_rela, 0);
6381
6382               found = 1;
6383             }
6384         }
6385
6386       if (! found)
6387         printf (_("\nThere are no relocations in this file.\n"));
6388     }
6389
6390   return 1;
6391 }
6392
6393 /* Process the unwind section.  */
6394
6395 #include "unwind-ia64.h"
6396
6397 /* An absolute address consists of a section and an offset.  If the
6398    section is NULL, the offset itself is the address, otherwise, the
6399    address equals to LOAD_ADDRESS(section) + offset.  */
6400
6401 struct absaddr
6402   {
6403     unsigned short section;
6404     bfd_vma offset;
6405   };
6406
6407 #define ABSADDR(a) \
6408   ((a).section \
6409    ? section_headers [(a).section].sh_addr + (a).offset \
6410    : (a).offset)
6411
6412 struct ia64_unw_table_entry
6413   {
6414     struct absaddr start;
6415     struct absaddr end;
6416     struct absaddr info;
6417   };
6418
6419 struct ia64_unw_aux_info
6420   {
6421
6422     struct ia64_unw_table_entry *table; /* Unwind table.  */
6423     unsigned long table_len;    /* Length of unwind table.  */
6424     unsigned char * info;       /* Unwind info.  */
6425     unsigned long info_size;    /* Size of unwind info.  */
6426     bfd_vma info_addr;          /* starting address of unwind info.  */
6427     bfd_vma seg_base;           /* Starting address of segment.  */
6428     Elf_Internal_Sym * symtab;  /* The symbol table.  */
6429     unsigned long nsyms;        /* Number of symbols.  */
6430     char * strtab;              /* The string table.  */
6431     unsigned long strtab_size;  /* Size of string table.  */
6432   };
6433
6434 static void
6435 find_symbol_for_address (Elf_Internal_Sym * symtab,
6436                          unsigned long nsyms,
6437                          const char * strtab,
6438                          unsigned long strtab_size,
6439                          struct absaddr addr,
6440                          const char ** symname,
6441                          bfd_vma * offset)
6442 {
6443   bfd_vma dist = 0x100000;
6444   Elf_Internal_Sym * sym;
6445   Elf_Internal_Sym * best = NULL;
6446   unsigned long i;
6447
6448   REMOVE_ARCH_BITS (addr.offset);
6449
6450   for (i = 0, sym = symtab; i < nsyms; ++i, ++sym)
6451     {
6452       bfd_vma value = sym->st_value;
6453
6454       REMOVE_ARCH_BITS (value);
6455
6456       if (ELF_ST_TYPE (sym->st_info) == STT_FUNC
6457           && sym->st_name != 0
6458           && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
6459           && addr.offset >= value
6460           && addr.offset - value < dist)
6461         {
6462           best = sym;
6463           dist = addr.offset - value;
6464           if (!dist)
6465             break;
6466         }
6467     }
6468
6469   if (best)
6470     {
6471       *symname = (best->st_name >= strtab_size
6472                   ? _("<corrupt>") : strtab + best->st_name);
6473       *offset = dist;
6474       return;
6475     }
6476
6477   *symname = NULL;
6478   *offset = addr.offset;
6479 }
6480
6481 static void
6482 dump_ia64_unwind (struct ia64_unw_aux_info * aux)
6483 {
6484   struct ia64_unw_table_entry * tp;
6485   int in_body;
6486
6487   for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
6488     {
6489       bfd_vma stamp;
6490       bfd_vma offset;
6491       const unsigned char * dp;
6492       const unsigned char * head;
6493       const unsigned char * end;
6494       const char * procname;
6495
6496       find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
6497                                aux->strtab_size, tp->start, &procname, &offset);
6498
6499       fputs ("\n<", stdout);
6500
6501       if (procname)
6502         {
6503           fputs (procname, stdout);
6504
6505           if (offset)
6506             printf ("+%lx", (unsigned long) offset);
6507         }
6508
6509       fputs (">: [", stdout);
6510       print_vma (tp->start.offset, PREFIX_HEX);
6511       fputc ('-', stdout);
6512       print_vma (tp->end.offset, PREFIX_HEX);
6513       printf ("], info at +0x%lx\n",
6514               (unsigned long) (tp->info.offset - aux->seg_base));
6515
6516       /* PR 17531: file: 86232b32.  */
6517       if (aux->info == NULL)
6518         continue;
6519
6520       /* PR 17531: file: 0997b4d1.  */
6521       if ((ABSADDR (tp->info) - aux->info_addr) >= aux->info_size)
6522         {
6523           warn (_("Invalid offset %lx in table entry %ld\n"),
6524                 (long) tp->info.offset, (long) (tp - aux->table));
6525           continue;
6526         }
6527
6528       head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
6529       stamp = byte_get ((unsigned char *) head, sizeof (stamp));
6530
6531       printf ("  v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
6532               (unsigned) UNW_VER (stamp),
6533               (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
6534               UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
6535               UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
6536               (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
6537
6538       if (UNW_VER (stamp) != 1)
6539         {
6540           printf (_("\tUnknown version.\n"));
6541           continue;
6542         }
6543
6544       in_body = 0;
6545       end = head + 8 + eh_addr_size * UNW_LENGTH (stamp);
6546       /* PR 17531: file: 16ceda89.  */
6547       if (end > aux->info + aux->info_size)
6548         end = aux->info + aux->info_size;
6549       for (dp = head + 8; dp < end;)
6550         dp = unw_decode (dp, in_body, & in_body);
6551     }
6552 }
6553
6554 static bfd_boolean
6555 slurp_ia64_unwind_table (FILE * file,
6556                          struct ia64_unw_aux_info * aux,
6557                          Elf_Internal_Shdr * sec)
6558 {
6559   unsigned long size, nrelas, i;
6560   Elf_Internal_Phdr * seg;
6561   struct ia64_unw_table_entry * tep;
6562   Elf_Internal_Shdr * relsec;
6563   Elf_Internal_Rela * rela;
6564   Elf_Internal_Rela * rp;
6565   unsigned char * table;
6566   unsigned char * tp;
6567   Elf_Internal_Sym * sym;
6568   const char * relname;
6569
6570   aux->table_len = 0;
6571
6572   /* First, find the starting address of the segment that includes
6573      this section: */
6574
6575   if (elf_header.e_phnum)
6576     {
6577       if (! get_program_headers (file))
6578           return FALSE;
6579
6580       for (seg = program_headers;
6581            seg < program_headers + elf_header.e_phnum;
6582            ++seg)
6583         {
6584           if (seg->p_type != PT_LOAD)
6585             continue;
6586
6587           if (sec->sh_addr >= seg->p_vaddr
6588               && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
6589             {
6590               aux->seg_base = seg->p_vaddr;
6591               break;
6592             }
6593         }
6594     }
6595
6596   /* Second, build the unwind table from the contents of the unwind section:  */
6597   size = sec->sh_size;
6598   table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
6599                                       _("unwind table"));
6600   if (!table)
6601     return FALSE;
6602
6603   aux->table_len = size / (3 * eh_addr_size);
6604   aux->table = (struct ia64_unw_table_entry *)
6605     xcmalloc (aux->table_len, sizeof (aux->table[0]));
6606   tep = aux->table;
6607
6608   for (tp = table; tp <= table + size - (3 * eh_addr_size); ++tep)
6609     {
6610       tep->start.section = SHN_UNDEF;
6611       tep->end.section   = SHN_UNDEF;
6612       tep->info.section  = SHN_UNDEF;
6613       tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
6614       tep->end.offset   = byte_get (tp, eh_addr_size); tp += eh_addr_size;
6615       tep->info.offset  = byte_get (tp, eh_addr_size); tp += eh_addr_size;
6616       tep->start.offset += aux->seg_base;
6617       tep->end.offset   += aux->seg_base;
6618       tep->info.offset  += aux->seg_base;
6619     }
6620   free (table);
6621
6622   /* Third, apply any relocations to the unwind table:  */
6623   for (relsec = section_headers;
6624        relsec < section_headers + elf_header.e_shnum;
6625        ++relsec)
6626     {
6627       if (relsec->sh_type != SHT_RELA
6628           || relsec->sh_info >= elf_header.e_shnum
6629           || section_headers + relsec->sh_info != sec)
6630         continue;
6631
6632       if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
6633                               & rela, & nrelas))
6634         {
6635           free (aux->table);
6636           aux->table = NULL;
6637           aux->table_len = 0;
6638           return FALSE;
6639         }
6640
6641       for (rp = rela; rp < rela + nrelas; ++rp)
6642         {
6643           relname = elf_ia64_reloc_type (get_reloc_type (rp->r_info));
6644           sym = aux->symtab + get_reloc_symindex (rp->r_info);
6645
6646           /* PR 17531: file: 9fa67536.  */
6647           if (relname == NULL)
6648             {
6649               warn (_("Skipping unknown relocation type: %u\n"), get_reloc_type (rp->r_info));
6650               continue;
6651             }
6652  
6653           if (! const_strneq (relname, "R_IA64_SEGREL"))
6654             {
6655               warn (_("Skipping unexpected relocation type: %s\n"), relname);
6656               continue;
6657             }
6658
6659           i = rp->r_offset / (3 * eh_addr_size);
6660
6661           /* PR 17531: file: 5bc8d9bf.  */
6662           if (i >= aux->table_len)
6663             {
6664               warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
6665               continue;
6666             }
6667
6668           switch (rp->r_offset / eh_addr_size % 3)
6669             {
6670             case 0:
6671               aux->table[i].start.section = sym->st_shndx;
6672               aux->table[i].start.offset  = rp->r_addend + sym->st_value;
6673               break;
6674             case 1:
6675               aux->table[i].end.section   = sym->st_shndx;
6676               aux->table[i].end.offset    = rp->r_addend + sym->st_value;
6677               break;
6678             case 2:
6679               aux->table[i].info.section  = sym->st_shndx;
6680               aux->table[i].info.offset   = rp->r_addend + sym->st_value;
6681               break;
6682             default:
6683               break;
6684             }
6685         }
6686
6687       free (rela);
6688     }
6689
6690   return TRUE;
6691 }
6692
6693 static void
6694 ia64_process_unwind (FILE * file)
6695 {
6696   Elf_Internal_Shdr * sec;
6697   Elf_Internal_Shdr * unwsec = NULL;
6698   Elf_Internal_Shdr * strsec;
6699   unsigned long i, unwcount = 0, unwstart = 0;
6700   struct ia64_unw_aux_info aux;
6701
6702   memset (& aux, 0, sizeof (aux));
6703
6704   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
6705     {
6706       if (sec->sh_type == SHT_SYMTAB
6707           && sec->sh_link < elf_header.e_shnum)
6708         {
6709           aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
6710
6711           strsec = section_headers + sec->sh_link;
6712           if (aux.strtab != NULL)
6713             {
6714               error (_("Multiple auxillary string tables encountered\n"));
6715               free (aux.strtab);
6716             }
6717           aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
6718                                           1, strsec->sh_size,
6719                                           _("string table"));
6720           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
6721         }
6722       else if (sec->sh_type == SHT_IA_64_UNWIND)
6723         unwcount++;
6724     }
6725
6726   if (!unwcount)
6727     printf (_("\nThere are no unwind sections in this file.\n"));
6728
6729   while (unwcount-- > 0)
6730     {
6731       char * suffix;
6732       size_t len, len2;
6733
6734       for (i = unwstart, sec = section_headers + unwstart, unwsec = NULL;
6735            i < elf_header.e_shnum; ++i, ++sec)
6736         if (sec->sh_type == SHT_IA_64_UNWIND)
6737           {
6738             unwsec = sec;
6739             break;
6740           }
6741       /* We have already counted the number of SHT_IA64_UNWIND
6742          sections so the loop above should never fail.  */
6743       assert (unwsec != NULL);
6744
6745       unwstart = i + 1;
6746       len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
6747
6748       if ((unwsec->sh_flags & SHF_GROUP) != 0)
6749         {
6750           /* We need to find which section group it is in.  */
6751           struct group_list * g;
6752
6753           if (section_headers_groups == NULL
6754               || section_headers_groups [i] == NULL)
6755             i = elf_header.e_shnum;
6756           else
6757             {
6758               g = section_headers_groups [i]->root;
6759
6760               for (; g != NULL; g = g->next)
6761                 {
6762                   sec = section_headers + g->section_index;
6763
6764                   if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
6765                     break;
6766                 }
6767
6768               if (g == NULL)
6769                 i = elf_header.e_shnum;
6770             }
6771         }
6772       else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
6773         {
6774           /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO.  */
6775           len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
6776           suffix = SECTION_NAME (unwsec) + len;
6777           for (i = 0, sec = section_headers; i < elf_header.e_shnum;
6778                ++i, ++sec)
6779             if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
6780                 && streq (SECTION_NAME (sec) + len2, suffix))
6781               break;
6782         }
6783       else
6784         {
6785           /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
6786              .IA_64.unwind or BAR -> .IA_64.unwind_info.  */
6787           len = sizeof (ELF_STRING_ia64_unwind) - 1;
6788           len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
6789           suffix = "";
6790           if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
6791             suffix = SECTION_NAME (unwsec) + len;
6792           for (i = 0, sec = section_headers; i < elf_header.e_shnum;
6793                ++i, ++sec)
6794             if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
6795                 && streq (SECTION_NAME (sec) + len2, suffix))
6796               break;
6797         }
6798
6799       if (i == elf_header.e_shnum)
6800         {
6801           printf (_("\nCould not find unwind info section for "));
6802
6803           if (string_table == NULL)
6804             printf ("%d", unwsec->sh_name);
6805           else
6806             printf ("'%s'", printable_section_name (unwsec));
6807         }
6808       else
6809         {
6810           aux.info_addr = sec->sh_addr;
6811           aux.info = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1,
6812                                                  sec->sh_size,
6813                                                  _("unwind info"));
6814           aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
6815
6816           printf (_("\nUnwind section "));
6817
6818           if (string_table == NULL)
6819             printf ("%d", unwsec->sh_name);
6820           else
6821             printf ("'%s'", printable_section_name (unwsec));
6822
6823           printf (_(" at offset 0x%lx contains %lu entries:\n"),
6824                   (unsigned long) unwsec->sh_offset,
6825                   (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
6826
6827           if (slurp_ia64_unwind_table (file, & aux, unwsec)
6828               && aux.table_len > 0)
6829             dump_ia64_unwind (& aux);
6830
6831           if (aux.table)
6832             free ((char *) aux.table);
6833           if (aux.info)
6834             free ((char *) aux.info);
6835           aux.table = NULL;
6836           aux.info = NULL;
6837         }
6838     }
6839
6840   if (aux.symtab)
6841     free (aux.symtab);
6842   if (aux.strtab)
6843     free ((char *) aux.strtab);
6844 }
6845
6846 struct hppa_unw_table_entry
6847   {
6848     struct absaddr start;
6849     struct absaddr end;
6850     unsigned int Cannot_unwind:1;                       /* 0 */
6851     unsigned int Millicode:1;                   /* 1 */
6852     unsigned int Millicode_save_sr0:1;          /* 2 */
6853     unsigned int Region_description:2;          /* 3..4 */
6854     unsigned int reserved1:1;                   /* 5 */
6855     unsigned int Entry_SR:1;                    /* 6 */
6856     unsigned int Entry_FR:4;     /* number saved */     /* 7..10 */
6857     unsigned int Entry_GR:5;     /* number saved */     /* 11..15 */
6858     unsigned int Args_stored:1;                 /* 16 */
6859     unsigned int Variable_Frame:1;                      /* 17 */
6860     unsigned int Separate_Package_Body:1;               /* 18 */
6861     unsigned int Frame_Extension_Millicode:1;   /* 19 */
6862     unsigned int Stack_Overflow_Check:1;                /* 20 */
6863     unsigned int Two_Instruction_SP_Increment:1;        /* 21 */
6864     unsigned int Ada_Region:1;                  /* 22 */
6865     unsigned int cxx_info:1;                    /* 23 */
6866     unsigned int cxx_try_catch:1;                       /* 24 */
6867     unsigned int sched_entry_seq:1;                     /* 25 */
6868     unsigned int reserved2:1;                   /* 26 */
6869     unsigned int Save_SP:1;                             /* 27 */
6870     unsigned int Save_RP:1;                             /* 28 */
6871     unsigned int Save_MRP_in_frame:1;           /* 29 */
6872     unsigned int extn_ptr_defined:1;            /* 30 */
6873     unsigned int Cleanup_defined:1;                     /* 31 */
6874
6875     unsigned int MPE_XL_interrupt_marker:1;             /* 0 */
6876     unsigned int HP_UX_interrupt_marker:1;              /* 1 */
6877     unsigned int Large_frame:1;                 /* 2 */
6878     unsigned int Pseudo_SP_Set:1;                       /* 3 */
6879     unsigned int reserved4:1;                   /* 4 */
6880     unsigned int Total_frame_size:27;           /* 5..31 */
6881   };
6882
6883 struct hppa_unw_aux_info
6884   {
6885     struct hppa_unw_table_entry *table; /* Unwind table.  */
6886     unsigned long table_len;    /* Length of unwind table.  */
6887     bfd_vma seg_base;           /* Starting address of segment.  */
6888     Elf_Internal_Sym * symtab;  /* The symbol table.  */
6889     unsigned long nsyms;        /* Number of symbols.  */
6890     char * strtab;              /* The string table.  */
6891     unsigned long strtab_size;  /* Size of string table.  */
6892   };
6893
6894 static void
6895 dump_hppa_unwind (struct hppa_unw_aux_info * aux)
6896 {
6897   struct hppa_unw_table_entry * tp;
6898
6899   for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
6900     {
6901       bfd_vma offset;
6902       const char * procname;
6903
6904       find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
6905                                aux->strtab_size, tp->start, &procname,
6906                                &offset);
6907
6908       fputs ("\n<", stdout);
6909
6910       if (procname)
6911         {
6912           fputs (procname, stdout);
6913
6914           if (offset)
6915             printf ("+%lx", (unsigned long) offset);
6916         }
6917
6918       fputs (">: [", stdout);
6919       print_vma (tp->start.offset, PREFIX_HEX);
6920       fputc ('-', stdout);
6921       print_vma (tp->end.offset, PREFIX_HEX);
6922       printf ("]\n\t");
6923
6924 #define PF(_m) if (tp->_m) printf (#_m " ");
6925 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
6926       PF(Cannot_unwind);
6927       PF(Millicode);
6928       PF(Millicode_save_sr0);
6929       /* PV(Region_description);  */
6930       PF(Entry_SR);
6931       PV(Entry_FR);
6932       PV(Entry_GR);
6933       PF(Args_stored);
6934       PF(Variable_Frame);
6935       PF(Separate_Package_Body);
6936       PF(Frame_Extension_Millicode);
6937       PF(Stack_Overflow_Check);
6938       PF(Two_Instruction_SP_Increment);
6939       PF(Ada_Region);
6940       PF(cxx_info);
6941       PF(cxx_try_catch);
6942       PF(sched_entry_seq);
6943       PF(Save_SP);
6944       PF(Save_RP);
6945       PF(Save_MRP_in_frame);
6946       PF(extn_ptr_defined);
6947       PF(Cleanup_defined);
6948       PF(MPE_XL_interrupt_marker);
6949       PF(HP_UX_interrupt_marker);
6950       PF(Large_frame);
6951       PF(Pseudo_SP_Set);
6952       PV(Total_frame_size);
6953 #undef PF
6954 #undef PV
6955     }
6956
6957   printf ("\n");
6958 }
6959
6960 static int
6961 slurp_hppa_unwind_table (FILE * file,
6962                          struct hppa_unw_aux_info * aux,
6963                          Elf_Internal_Shdr * sec)
6964 {
6965   unsigned long size, unw_ent_size, nentries, nrelas, i;
6966   Elf_Internal_Phdr * seg;
6967   struct hppa_unw_table_entry * tep;
6968   Elf_Internal_Shdr * relsec;
6969   Elf_Internal_Rela * rela;
6970   Elf_Internal_Rela * rp;
6971   unsigned char * table;
6972   unsigned char * tp;
6973   Elf_Internal_Sym * sym;
6974   const char * relname;
6975
6976   /* First, find the starting address of the segment that includes
6977      this section.  */
6978
6979   if (elf_header.e_phnum)
6980     {
6981       if (! get_program_headers (file))
6982         return 0;
6983
6984       for (seg = program_headers;
6985            seg < program_headers + elf_header.e_phnum;
6986            ++seg)
6987         {
6988           if (seg->p_type != PT_LOAD)
6989             continue;
6990
6991           if (sec->sh_addr >= seg->p_vaddr
6992               && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
6993             {
6994               aux->seg_base = seg->p_vaddr;
6995               break;
6996             }
6997         }
6998     }
6999
7000   /* Second, build the unwind table from the contents of the unwind
7001      section.  */
7002   size = sec->sh_size;
7003   table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
7004                                       _("unwind table"));
7005   if (!table)
7006     return 0;
7007
7008   unw_ent_size = 16;
7009   nentries = size / unw_ent_size;
7010   size = unw_ent_size * nentries;
7011
7012   tep = aux->table = (struct hppa_unw_table_entry *)
7013       xcmalloc (nentries, sizeof (aux->table[0]));
7014
7015   for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
7016     {
7017       unsigned int tmp1, tmp2;
7018
7019       tep->start.section = SHN_UNDEF;
7020       tep->end.section   = SHN_UNDEF;
7021
7022       tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
7023       tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
7024       tmp1 = byte_get ((unsigned char *) tp + 8, 4);
7025       tmp2 = byte_get ((unsigned char *) tp + 12, 4);
7026
7027       tep->start.offset += aux->seg_base;
7028       tep->end.offset   += aux->seg_base;
7029
7030       tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
7031       tep->Millicode = (tmp1 >> 30) & 0x1;
7032       tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
7033       tep->Region_description = (tmp1 >> 27) & 0x3;
7034       tep->reserved1 = (tmp1 >> 26) & 0x1;
7035       tep->Entry_SR = (tmp1 >> 25) & 0x1;
7036       tep->Entry_FR = (tmp1 >> 21) & 0xf;
7037       tep->Entry_GR = (tmp1 >> 16) & 0x1f;
7038       tep->Args_stored = (tmp1 >> 15) & 0x1;
7039       tep->Variable_Frame = (tmp1 >> 14) & 0x1;
7040       tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
7041       tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
7042       tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
7043       tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
7044       tep->Ada_Region = (tmp1 >> 9) & 0x1;
7045       tep->cxx_info = (tmp1 >> 8) & 0x1;
7046       tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
7047       tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
7048       tep->reserved2 = (tmp1 >> 5) & 0x1;
7049       tep->Save_SP = (tmp1 >> 4) & 0x1;
7050       tep->Save_RP = (tmp1 >> 3) & 0x1;
7051       tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
7052       tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
7053       tep->Cleanup_defined = tmp1 & 0x1;
7054
7055       tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
7056       tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
7057       tep->Large_frame = (tmp2 >> 29) & 0x1;
7058       tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
7059       tep->reserved4 = (tmp2 >> 27) & 0x1;
7060       tep->Total_frame_size = tmp2 & 0x7ffffff;
7061     }
7062   free (table);
7063
7064   /* Third, apply any relocations to the unwind table.  */
7065   for (relsec = section_headers;
7066        relsec < section_headers + elf_header.e_shnum;
7067        ++relsec)
7068     {
7069       if (relsec->sh_type != SHT_RELA
7070           || relsec->sh_info >= elf_header.e_shnum
7071           || section_headers + relsec->sh_info != sec)
7072         continue;
7073
7074       if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7075                               & rela, & nrelas))
7076         return 0;
7077
7078       for (rp = rela; rp < rela + nrelas; ++rp)
7079         {
7080           relname = elf_hppa_reloc_type (get_reloc_type (rp->r_info));
7081           sym = aux->symtab + get_reloc_symindex (rp->r_info);
7082
7083           /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64.  */
7084           if (! const_strneq (relname, "R_PARISC_SEGREL"))
7085             {
7086               warn (_("Skipping unexpected relocation type %s\n"), relname);
7087               continue;
7088             }
7089
7090           i = rp->r_offset / unw_ent_size;
7091
7092           switch ((rp->r_offset % unw_ent_size) / eh_addr_size)
7093             {
7094             case 0:
7095               aux->table[i].start.section = sym->st_shndx;
7096               aux->table[i].start.offset  = sym->st_value + rp->r_addend;
7097               break;
7098             case 1:
7099               aux->table[i].end.section   = sym->st_shndx;
7100               aux->table[i].end.offset    = sym->st_value + rp->r_addend;
7101               break;
7102             default:
7103               break;
7104             }
7105         }
7106
7107       free (rela);
7108     }
7109
7110   aux->table_len = nentries;
7111
7112   return 1;
7113 }
7114
7115 static void
7116 hppa_process_unwind (FILE * file)
7117 {
7118   struct hppa_unw_aux_info aux;
7119   Elf_Internal_Shdr * unwsec = NULL;
7120   Elf_Internal_Shdr * strsec;
7121   Elf_Internal_Shdr * sec;
7122   unsigned long i;
7123
7124   if (string_table == NULL)
7125     return;
7126
7127   memset (& aux, 0, sizeof (aux));
7128
7129   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7130     {
7131       if (sec->sh_type == SHT_SYMTAB
7132           && sec->sh_link < elf_header.e_shnum)
7133         {
7134           aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
7135
7136           strsec = section_headers + sec->sh_link;
7137           if (aux.strtab != NULL)
7138             {
7139               error (_("Multiple auxillary string tables encountered\n"));
7140               free (aux.strtab);
7141             }
7142           aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
7143                                           1, strsec->sh_size,
7144                                           _("string table"));
7145           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7146         }
7147       else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
7148         unwsec = sec;
7149     }
7150
7151   if (!unwsec)
7152     printf (_("\nThere are no unwind sections in this file.\n"));
7153
7154   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7155     {
7156       if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
7157         {
7158           printf (_("\nUnwind section '%s' at offset 0x%lx contains %lu entries:\n"),
7159                   printable_section_name (sec),
7160                   (unsigned long) sec->sh_offset,
7161                   (unsigned long) (sec->sh_size / (2 * eh_addr_size + 8)));
7162
7163           slurp_hppa_unwind_table (file, &aux, sec);
7164           if (aux.table_len > 0)
7165             dump_hppa_unwind (&aux);
7166
7167           if (aux.table)
7168             free ((char *) aux.table);
7169           aux.table = NULL;
7170         }
7171     }
7172
7173   if (aux.symtab)
7174     free (aux.symtab);
7175   if (aux.strtab)
7176     free ((char *) aux.strtab);
7177 }
7178
7179 struct arm_section
7180 {
7181   unsigned char *      data;            /* The unwind data.  */
7182   Elf_Internal_Shdr *  sec;             /* The cached unwind section header.  */
7183   Elf_Internal_Rela *  rela;            /* The cached relocations for this section.  */
7184   unsigned long        nrelas;          /* The number of relocations.  */
7185   unsigned int         rel_type;        /* REL or RELA ?  */
7186   Elf_Internal_Rela *  next_rela;       /* Cyclic pointer to the next reloc to process.  */
7187 };
7188
7189 struct arm_unw_aux_info
7190 {
7191   FILE *              file;             /* The file containing the unwind sections.  */
7192   Elf_Internal_Sym *  symtab;           /* The file's symbol table.  */
7193   unsigned long       nsyms;            /* Number of symbols.  */
7194   char *              strtab;           /* The file's string table.  */
7195   unsigned long       strtab_size;      /* Size of string table.  */
7196 };
7197
7198 static const char *
7199 arm_print_vma_and_name (struct arm_unw_aux_info *aux,
7200                         bfd_vma fn, struct absaddr addr)
7201 {
7202   const char *procname;
7203   bfd_vma sym_offset;
7204
7205   if (addr.section == SHN_UNDEF)
7206     addr.offset = fn;
7207
7208   find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
7209                            aux->strtab_size, addr, &procname,
7210                            &sym_offset);
7211
7212   print_vma (fn, PREFIX_HEX);
7213
7214   if (procname)
7215     {
7216       fputs (" <", stdout);
7217       fputs (procname, stdout);
7218
7219       if (sym_offset)
7220         printf ("+0x%lx", (unsigned long) sym_offset);
7221       fputc ('>', stdout);
7222     }
7223
7224   return procname;
7225 }
7226
7227 static void
7228 arm_free_section (struct arm_section *arm_sec)
7229 {
7230   if (arm_sec->data != NULL)
7231     free (arm_sec->data);
7232
7233   if (arm_sec->rela != NULL)
7234     free (arm_sec->rela);
7235 }
7236
7237 /* 1) If SEC does not match the one cached in ARM_SEC, then free the current
7238       cached section and install SEC instead.
7239    2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
7240       and return its valued in * WORDP, relocating if necessary.
7241    3) Update the NEXT_RELA field in ARM_SEC and store the section index and
7242       relocation's offset in ADDR.
7243    4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
7244       into the string table of the symbol associated with the reloc.  If no
7245       reloc was applied store -1 there.
7246    5) Return TRUE upon success, FALSE otherwise.  */
7247
7248 static bfd_boolean
7249 get_unwind_section_word (struct arm_unw_aux_info *  aux,
7250                          struct arm_section *       arm_sec,
7251                          Elf_Internal_Shdr *        sec,
7252                          bfd_vma                    word_offset,
7253                          unsigned int *             wordp,
7254                          struct absaddr *           addr,
7255                          bfd_vma *                  sym_name)
7256 {
7257   Elf_Internal_Rela *rp;
7258   Elf_Internal_Sym *sym;
7259   const char * relname;
7260   unsigned int word;
7261   bfd_boolean wrapped;
7262
7263   if (sec == NULL || arm_sec == NULL)
7264     return FALSE;
7265
7266   addr->section = SHN_UNDEF;
7267   addr->offset = 0;
7268
7269   if (sym_name != NULL)
7270     *sym_name = (bfd_vma) -1;
7271
7272   /* If necessary, update the section cache.  */
7273   if (sec != arm_sec->sec)
7274     {
7275       Elf_Internal_Shdr *relsec;
7276
7277       arm_free_section (arm_sec);
7278
7279       arm_sec->sec = sec;
7280       arm_sec->data = get_data (NULL, aux->file, sec->sh_offset, 1,
7281                                 sec->sh_size, _("unwind data"));
7282       arm_sec->rela = NULL;
7283       arm_sec->nrelas = 0;
7284
7285       for (relsec = section_headers;
7286            relsec < section_headers + elf_header.e_shnum;
7287            ++relsec)
7288         {
7289           if (relsec->sh_info >= elf_header.e_shnum
7290               || section_headers + relsec->sh_info != sec
7291               /* PR 15745: Check the section type as well.  */
7292               || (relsec->sh_type != SHT_REL
7293                   && relsec->sh_type != SHT_RELA))
7294             continue;
7295
7296           arm_sec->rel_type = relsec->sh_type;
7297           if (relsec->sh_type == SHT_REL)
7298             {
7299               if (!slurp_rel_relocs (aux->file, relsec->sh_offset,
7300                                      relsec->sh_size,
7301                                      & arm_sec->rela, & arm_sec->nrelas))
7302                 return FALSE;
7303             }
7304           else /* relsec->sh_type == SHT_RELA */
7305             {
7306               if (!slurp_rela_relocs (aux->file, relsec->sh_offset,
7307                                       relsec->sh_size,
7308                                       & arm_sec->rela, & arm_sec->nrelas))
7309                 return FALSE;
7310             }
7311           break;
7312         }
7313
7314       arm_sec->next_rela = arm_sec->rela;
7315     }
7316
7317   /* If there is no unwind data we can do nothing.  */
7318   if (arm_sec->data == NULL)
7319     return FALSE;
7320
7321   /* If the offset is invalid then fail.  */
7322   if (word_offset > sec->sh_size - 4)
7323     return FALSE;
7324
7325   /* Get the word at the required offset.  */
7326   word = byte_get (arm_sec->data + word_offset, 4);
7327
7328   /* PR 17531: file: id:000001,src:001266+003044,op:splice,rep:128.  */
7329   if (arm_sec->rela == NULL)
7330     {
7331       * wordp = word;
7332       return TRUE;
7333     }
7334
7335   /* Look through the relocs to find the one that applies to the provided offset.  */
7336   wrapped = FALSE;
7337   for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
7338     {
7339       bfd_vma prelval, offset;
7340
7341       if (rp->r_offset > word_offset && !wrapped)
7342         {
7343           rp = arm_sec->rela;
7344           wrapped = TRUE;
7345         }
7346       if (rp->r_offset > word_offset)
7347         break;
7348
7349       if (rp->r_offset & 3)
7350         {
7351           warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
7352                 (unsigned long) rp->r_offset);
7353           continue;
7354         }
7355
7356       if (rp->r_offset < word_offset)
7357         continue;
7358
7359       /* PR 17531: file: 027-161405-0.004  */
7360       if (aux->symtab == NULL)
7361         continue;
7362
7363       if (arm_sec->rel_type == SHT_REL)
7364         {
7365           offset = word & 0x7fffffff;
7366           if (offset & 0x40000000)
7367             offset |= ~ (bfd_vma) 0x7fffffff;
7368         }
7369       else if (arm_sec->rel_type == SHT_RELA)
7370         offset = rp->r_addend;
7371       else
7372         {
7373           error (_("Unknown section relocation type %d encountered\n"),
7374                  arm_sec->rel_type);
7375           break;
7376         }
7377
7378       /* PR 17531 file: 027-1241568-0.004.  */
7379       if (ELF32_R_SYM (rp->r_info) >= aux->nsyms)
7380         {
7381           error (_("Bad symbol index in unwind relocation (%lu > %lu)\n"),
7382                  (unsigned long) ELF32_R_SYM (rp->r_info), aux->nsyms);
7383           break;
7384         }
7385
7386       sym = aux->symtab + ELF32_R_SYM (rp->r_info);
7387       offset += sym->st_value;
7388       prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
7389
7390       /* Check that we are processing the expected reloc type.  */
7391       if (elf_header.e_machine == EM_ARM)
7392         {
7393           relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
7394           if (relname == NULL)
7395             {
7396               warn (_("Skipping unknown ARM relocation type: %d\n"),
7397                     (int) ELF32_R_TYPE (rp->r_info));
7398               continue;
7399             }
7400
7401           if (streq (relname, "R_ARM_NONE"))
7402               continue;
7403
7404           if (! streq (relname, "R_ARM_PREL31"))
7405             {
7406               warn (_("Skipping unexpected ARM relocation type %s\n"), relname);
7407               continue;
7408             }
7409         }
7410       else if (elf_header.e_machine == EM_TI_C6000)
7411         {
7412           relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
7413           if (relname == NULL)
7414             {
7415               warn (_("Skipping unknown C6000 relocation type: %d\n"),
7416                     (int) ELF32_R_TYPE (rp->r_info));
7417               continue;
7418             }
7419
7420           if (streq (relname, "R_C6000_NONE"))
7421             continue;
7422
7423           if (! streq (relname, "R_C6000_PREL31"))
7424             {
7425               warn (_("Skipping unexpected C6000 relocation type %s\n"), relname);
7426               continue;
7427             }
7428
7429           prelval >>= 1;
7430         }
7431       else
7432         {
7433           /* This function currently only supports ARM and TI unwinders.  */
7434           warn (_("Only TI and ARM unwinders are currently supported\n"));
7435           break;
7436         }
7437
7438       word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
7439       addr->section = sym->st_shndx;
7440       addr->offset = offset;
7441
7442       if (sym_name)
7443         * sym_name = sym->st_name;
7444       break;
7445     }
7446
7447   *wordp = word;
7448   arm_sec->next_rela = rp;
7449
7450   return TRUE;
7451 }
7452
7453 static const char *tic6x_unwind_regnames[16] =
7454 {
7455   "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
7456   "A14", "A13", "A12", "A11", "A10",
7457   "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
7458 };
7459
7460 static void
7461 decode_tic6x_unwind_regmask (unsigned int mask)
7462 {
7463   int i;
7464
7465   for (i = 12; mask; mask >>= 1, i--)
7466     {
7467       if (mask & 1)
7468         {
7469           fputs (tic6x_unwind_regnames[i], stdout);
7470           if (mask > 1)
7471             fputs (", ", stdout);
7472         }
7473     }
7474 }
7475
7476 #define ADVANCE                                                 \
7477   if (remaining == 0 && more_words)                             \
7478     {                                                           \
7479       data_offset += 4;                                         \
7480       if (! get_unwind_section_word (aux, data_arm_sec, data_sec,       \
7481                                      data_offset, & word, & addr, NULL))        \
7482         return;                                                 \
7483       remaining = 4;                                            \
7484       more_words--;                                             \
7485     }                                                           \
7486
7487 #define GET_OP(OP)                      \
7488   ADVANCE;                              \
7489   if (remaining)                        \
7490     {                                   \
7491       remaining--;                      \
7492       (OP) = word >> 24;                \
7493       word <<= 8;                       \
7494     }                                   \
7495   else                                  \
7496     {                                   \
7497       printf (_("[Truncated opcode]\n"));       \
7498       return;                           \
7499     }                                   \
7500   printf ("0x%02x ", OP)
7501
7502 static void
7503 decode_arm_unwind_bytecode (struct arm_unw_aux_info *aux,
7504                             unsigned int word, unsigned int remaining,
7505                             unsigned int more_words,
7506                             bfd_vma data_offset, Elf_Internal_Shdr *data_sec,
7507                             struct arm_section *data_arm_sec)
7508 {
7509   struct absaddr addr;
7510
7511   /* Decode the unwinding instructions.  */
7512   while (1)
7513     {
7514       unsigned int op, op2;
7515
7516       ADVANCE;
7517       if (remaining == 0)
7518         break;
7519       remaining--;
7520       op = word >> 24;
7521       word <<= 8;
7522
7523       printf ("  0x%02x ", op);
7524
7525       if ((op & 0xc0) == 0x00)
7526         {
7527           int offset = ((op & 0x3f) << 2) + 4;
7528
7529           printf ("     vsp = vsp + %d", offset);
7530         }
7531       else if ((op & 0xc0) == 0x40)
7532         {
7533           int offset = ((op & 0x3f) << 2) + 4;
7534
7535           printf ("     vsp = vsp - %d", offset);
7536         }
7537       else if ((op & 0xf0) == 0x80)
7538         {
7539           GET_OP (op2);
7540           if (op == 0x80 && op2 == 0)
7541             printf (_("Refuse to unwind"));
7542           else
7543             {
7544               unsigned int mask = ((op & 0x0f) << 8) | op2;
7545               int first = 1;
7546               int i;
7547
7548               printf ("pop {");
7549               for (i = 0; i < 12; i++)
7550                 if (mask & (1 << i))
7551                   {
7552                     if (first)
7553                       first = 0;
7554                     else
7555                       printf (", ");
7556                     printf ("r%d", 4 + i);
7557                   }
7558               printf ("}");
7559             }
7560         }
7561       else if ((op & 0xf0) == 0x90)
7562         {
7563           if (op == 0x9d || op == 0x9f)
7564             printf (_("     [Reserved]"));
7565           else
7566             printf ("     vsp = r%d", op & 0x0f);
7567         }
7568       else if ((op & 0xf0) == 0xa0)
7569         {
7570           int end = 4 + (op & 0x07);
7571           int first = 1;
7572           int i;
7573
7574           printf ("     pop {");
7575           for (i = 4; i <= end; i++)
7576             {
7577               if (first)
7578                 first = 0;
7579               else
7580                 printf (", ");
7581               printf ("r%d", i);
7582             }
7583           if (op & 0x08)
7584             {
7585               if (!first)
7586                 printf (", ");
7587               printf ("r14");
7588             }
7589           printf ("}");
7590         }
7591       else if (op == 0xb0)
7592         printf (_("     finish"));
7593       else if (op == 0xb1)
7594         {
7595           GET_OP (op2);
7596           if (op2 == 0 || (op2 & 0xf0) != 0)
7597             printf (_("[Spare]"));
7598           else
7599             {
7600               unsigned int mask = op2 & 0x0f;
7601               int first = 1;
7602               int i;
7603
7604               printf ("pop {");
7605               for (i = 0; i < 12; i++)
7606                 if (mask & (1 << i))
7607                   {
7608                     if (first)
7609                       first = 0;
7610                     else
7611                       printf (", ");
7612                     printf ("r%d", i);
7613                   }
7614               printf ("}");
7615             }
7616         }
7617       else if (op == 0xb2)
7618         {
7619           unsigned char buf[9];
7620           unsigned int i, len;
7621           unsigned long offset;
7622
7623           for (i = 0; i < sizeof (buf); i++)
7624             {
7625               GET_OP (buf[i]);
7626               if ((buf[i] & 0x80) == 0)
7627                 break;
7628             }
7629           if (i == sizeof (buf))
7630             printf (_("corrupt change to vsp"));
7631           else
7632             {
7633               offset = read_uleb128 (buf, &len, buf + i + 1);
7634               assert (len == i + 1);
7635               offset = offset * 4 + 0x204;
7636               printf ("vsp = vsp + %ld", offset);
7637             }
7638         }
7639       else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
7640         {
7641           unsigned int first, last;
7642
7643           GET_OP (op2);
7644           first = op2 >> 4;
7645           last = op2 & 0x0f;
7646           if (op == 0xc8)
7647             first = first + 16;
7648           printf ("pop {D%d", first);
7649           if (last)
7650             printf ("-D%d", first + last);
7651           printf ("}");
7652         }
7653       else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
7654         {
7655           unsigned int count = op & 0x07;
7656
7657           printf ("pop {D8");
7658           if (count)
7659             printf ("-D%d", 8 + count);
7660           printf ("}");
7661         }
7662       else if (op >= 0xc0 && op <= 0xc5)
7663         {
7664           unsigned int count = op & 0x07;
7665
7666           printf ("     pop {wR10");
7667           if (count)
7668             printf ("-wR%d", 10 + count);
7669           printf ("}");
7670         }
7671       else if (op == 0xc6)
7672         {
7673           unsigned int first, last;
7674
7675           GET_OP (op2);
7676           first = op2 >> 4;
7677           last = op2 & 0x0f;
7678           printf ("pop {wR%d", first);
7679           if (last)
7680             printf ("-wR%d", first + last);
7681           printf ("}");
7682         }
7683       else if (op == 0xc7)
7684         {
7685           GET_OP (op2);
7686           if (op2 == 0 || (op2 & 0xf0) != 0)
7687             printf (_("[Spare]"));
7688           else
7689             {
7690               unsigned int mask = op2 & 0x0f;
7691               int first = 1;
7692               int i;
7693
7694               printf ("pop {");
7695               for (i = 0; i < 4; i++)
7696                 if (mask & (1 << i))
7697                   {
7698                     if (first)
7699                       first = 0;
7700                     else
7701                       printf (", ");
7702                     printf ("wCGR%d", i);
7703                   }
7704               printf ("}");
7705             }
7706         }
7707       else
7708         printf (_("     [unsupported opcode]"));
7709       printf ("\n");
7710     }
7711 }
7712
7713 static void
7714 decode_tic6x_unwind_bytecode (struct arm_unw_aux_info *aux,
7715                             unsigned int word, unsigned int remaining,
7716                             unsigned int more_words,
7717                             bfd_vma data_offset, Elf_Internal_Shdr *data_sec,
7718                             struct arm_section *data_arm_sec)
7719 {
7720   struct absaddr addr;
7721
7722   /* Decode the unwinding instructions.  */
7723   while (1)
7724     {
7725       unsigned int op, op2;
7726
7727       ADVANCE;
7728       if (remaining == 0)
7729         break;
7730       remaining--;
7731       op = word >> 24;
7732       word <<= 8;
7733
7734       printf ("  0x%02x ", op);
7735
7736       if ((op & 0xc0) == 0x00)
7737         {
7738           int offset = ((op & 0x3f) << 3) + 8;
7739           printf ("     sp = sp + %d", offset);
7740         }
7741       else if ((op & 0xc0) == 0x80)
7742         {
7743           GET_OP (op2);
7744           if (op == 0x80 && op2 == 0)
7745             printf (_("Refuse to unwind"));
7746           else
7747             {
7748               unsigned int mask = ((op & 0x1f) << 8) | op2;
7749               if (op & 0x20)
7750                 printf ("pop compact {");
7751               else
7752                 printf ("pop {");
7753
7754               decode_tic6x_unwind_regmask (mask);
7755               printf("}");
7756             }
7757         }
7758       else if ((op & 0xf0) == 0xc0)
7759         {
7760           unsigned int reg;
7761           unsigned int nregs;
7762           unsigned int i;
7763           const char *name;
7764           struct
7765           {
7766               unsigned int offset;
7767               unsigned int reg;
7768           } regpos[16];
7769
7770           /* Scan entire instruction first so that GET_OP output is not
7771              interleaved with disassembly.  */
7772           nregs = 0;
7773           for (i = 0; nregs < (op & 0xf); i++)
7774             {
7775               GET_OP (op2);
7776               reg = op2 >> 4;
7777               if (reg != 0xf)
7778                 {
7779                   regpos[nregs].offset = i * 2;
7780                   regpos[nregs].reg = reg;
7781                   nregs++;
7782                 }
7783
7784               reg = op2 & 0xf;
7785               if (reg != 0xf)
7786                 {
7787                   regpos[nregs].offset = i * 2 + 1;
7788                   regpos[nregs].reg = reg;
7789                   nregs++;
7790                 }
7791             }
7792
7793           printf (_("pop frame {"));
7794           reg = nregs - 1;
7795           for (i = i * 2; i > 0; i--)
7796             {
7797               if (regpos[reg].offset == i - 1)
7798                 {
7799                   name = tic6x_unwind_regnames[regpos[reg].reg];
7800                   if (reg > 0)
7801                     reg--;
7802                 }
7803               else
7804                 name = _("[pad]");
7805
7806               fputs (name, stdout);
7807               if (i > 1)
7808                 printf (", ");
7809             }
7810
7811           printf ("}");
7812         }
7813       else if (op == 0xd0)
7814         printf ("     MOV FP, SP");
7815       else if (op == 0xd1)
7816         printf ("     __c6xabi_pop_rts");
7817       else if (op == 0xd2)
7818         {
7819           unsigned char buf[9];
7820           unsigned int i, len;
7821           unsigned long offset;
7822
7823           for (i = 0; i < sizeof (buf); i++)
7824             {
7825               GET_OP (buf[i]);
7826               if ((buf[i] & 0x80) == 0)
7827                 break;
7828             }
7829           /* PR 17531: file: id:000001,src:001906+004739,op:splice,rep:2.  */
7830           if (i == sizeof (buf))
7831             {
7832               printf ("<corrupt sp adjust>\n");
7833               warn (_("Corrupt stack pointer adjustment detected\n"));
7834               return;
7835             }
7836           
7837           offset = read_uleb128 (buf, &len, buf + i + 1);
7838           assert (len == i + 1);
7839           offset = offset * 8 + 0x408;
7840           printf (_("sp = sp + %ld"), offset);
7841         }
7842       else if ((op & 0xf0) == 0xe0)
7843         {
7844           if ((op & 0x0f) == 7)
7845             printf ("     RETURN");
7846           else
7847             printf ("     MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
7848         }
7849       else
7850         {
7851           printf (_("     [unsupported opcode]"));
7852         }
7853       putchar ('\n');
7854     }
7855 }
7856
7857 static bfd_vma
7858 arm_expand_prel31 (bfd_vma word, bfd_vma where)
7859 {
7860   bfd_vma offset;
7861
7862   offset = word & 0x7fffffff;
7863   if (offset & 0x40000000)
7864     offset |= ~ (bfd_vma) 0x7fffffff;
7865
7866   if (elf_header.e_machine == EM_TI_C6000)
7867     offset <<= 1;
7868
7869   return offset + where;
7870 }
7871
7872 static void
7873 decode_arm_unwind (struct arm_unw_aux_info *  aux,
7874                    unsigned int               word,
7875                    unsigned int               remaining,
7876                    bfd_vma                    data_offset,
7877                    Elf_Internal_Shdr *        data_sec,
7878                    struct arm_section *       data_arm_sec)
7879 {
7880   int per_index;
7881   unsigned int more_words = 0;
7882   struct absaddr addr;
7883   bfd_vma sym_name = (bfd_vma) -1;
7884
7885   if (remaining == 0)
7886     {
7887       /* Fetch the first word.
7888          Note - when decoding an object file the address extracted
7889          here will always be 0.  So we also pass in the sym_name
7890          parameter so that we can find the symbol associated with
7891          the personality routine.  */
7892       if (! get_unwind_section_word (aux, data_arm_sec, data_sec, data_offset,
7893                                      & word, & addr, & sym_name))
7894         return;
7895
7896       remaining = 4;
7897     }
7898
7899   if ((word & 0x80000000) == 0)
7900     {
7901       /* Expand prel31 for personality routine.  */
7902       bfd_vma fn;
7903       const char *procname;
7904
7905       fn = arm_expand_prel31 (word, data_sec->sh_addr + data_offset);
7906       printf (_("  Personality routine: "));
7907       if (fn == 0
7908           && addr.section == SHN_UNDEF && addr.offset == 0
7909           && sym_name != (bfd_vma) -1 && sym_name < aux->strtab_size)
7910         {
7911           procname = aux->strtab + sym_name;
7912           print_vma (fn, PREFIX_HEX);
7913           if (procname)
7914             {
7915               fputs (" <", stdout);
7916               fputs (procname, stdout);
7917               fputc ('>', stdout);
7918             }
7919         }
7920       else
7921         procname = arm_print_vma_and_name (aux, fn, addr);
7922       fputc ('\n', stdout);
7923
7924       /* The GCC personality routines use the standard compact
7925          encoding, starting with one byte giving the number of
7926          words.  */
7927       if (procname != NULL
7928           && (const_strneq (procname, "__gcc_personality_v0")
7929               || const_strneq (procname, "__gxx_personality_v0")
7930               || const_strneq (procname, "__gcj_personality_v0")
7931               || const_strneq (procname, "__gnu_objc_personality_v0")))
7932         {
7933           remaining = 0;
7934           more_words = 1;
7935           ADVANCE;
7936           if (!remaining)
7937             {
7938               printf (_("  [Truncated data]\n"));
7939               return;
7940             }
7941           more_words = word >> 24;
7942           word <<= 8;
7943           remaining--;
7944           per_index = -1;
7945         }
7946       else
7947         return;
7948     }
7949   else
7950     {
7951       /* ARM EHABI Section 6.3:
7952
7953          An exception-handling table entry for the compact model looks like:
7954
7955            31 30-28 27-24 23-0
7956            -- ----- ----- ----
7957             1   0   index Data for personalityRoutine[index]    */
7958
7959       if (elf_header.e_machine == EM_ARM
7960           && (word & 0x70000000))
7961         warn (_("Corrupt ARM compact model table entry: %x \n"), word);
7962
7963       per_index = (word >> 24) & 0x7f;
7964       printf (_("  Compact model index: %d\n"), per_index);
7965       if (per_index == 0)
7966         {
7967           more_words = 0;
7968           word <<= 8;
7969           remaining--;
7970         }
7971       else if (per_index < 3)
7972         {
7973           more_words = (word >> 16) & 0xff;
7974           word <<= 16;
7975           remaining -= 2;
7976         }
7977     }
7978
7979   switch (elf_header.e_machine)
7980     {
7981     case EM_ARM:
7982       if (per_index < 3)
7983         {
7984           decode_arm_unwind_bytecode (aux, word, remaining, more_words,
7985                                       data_offset, data_sec, data_arm_sec);
7986         }
7987       else
7988         {
7989           warn (_("Unknown ARM compact model index encountered\n"));
7990           printf (_("  [reserved]\n"));
7991         }
7992       break;
7993
7994     case EM_TI_C6000:
7995       if (per_index < 3)
7996         {
7997           decode_tic6x_unwind_bytecode (aux, word, remaining, more_words,
7998                                         data_offset, data_sec, data_arm_sec);
7999         }
8000       else if (per_index < 5)
8001         {
8002           if (((word >> 17) & 0x7f) == 0x7f)
8003             printf (_("  Restore stack from frame pointer\n"));
8004           else
8005             printf (_("  Stack increment %d\n"), (word >> 14) & 0x1fc);
8006           printf (_("  Registers restored: "));
8007           if (per_index == 4)
8008             printf (" (compact) ");
8009           decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
8010           putchar ('\n');
8011           printf (_("  Return register: %s\n"),
8012                   tic6x_unwind_regnames[word & 0xf]);
8013         }
8014       else
8015         printf (_("  [reserved (%d)]\n"), per_index);
8016       break;
8017
8018     default:
8019       error (_("Unsupported architecture type %d encountered when decoding unwind table\n"),
8020              elf_header.e_machine);
8021     }
8022
8023   /* Decode the descriptors.  Not implemented.  */
8024 }
8025
8026 static void
8027 dump_arm_unwind (struct arm_unw_aux_info *aux, Elf_Internal_Shdr *exidx_sec)
8028 {
8029   struct arm_section exidx_arm_sec, extab_arm_sec;
8030   unsigned int i, exidx_len;
8031
8032   memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
8033   memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
8034   exidx_len = exidx_sec->sh_size / 8;
8035
8036   for (i = 0; i < exidx_len; i++)
8037     {
8038       unsigned int exidx_fn, exidx_entry;
8039       struct absaddr fn_addr, entry_addr;
8040       bfd_vma fn;
8041
8042       fputc ('\n', stdout);
8043
8044       if (! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
8045                                      8 * i, & exidx_fn, & fn_addr, NULL)
8046           || ! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
8047                                         8 * i + 4, & exidx_entry, & entry_addr, NULL))
8048         {
8049           arm_free_section (& exidx_arm_sec);
8050           arm_free_section (& extab_arm_sec);
8051           return;
8052         }
8053
8054       /* ARM EHABI, Section 5:
8055          An index table entry consists of 2 words.
8056          The first word contains a prel31 offset to the start of a function, with bit 31 clear.  */
8057       if (exidx_fn & 0x80000000)
8058         warn (_("corrupt index table entry: %x\n"), exidx_fn);
8059
8060       fn = arm_expand_prel31 (exidx_fn, exidx_sec->sh_addr + 8 * i);
8061
8062       arm_print_vma_and_name (aux, fn, fn_addr);
8063       fputs (": ", stdout);
8064
8065       if (exidx_entry == 1)
8066         {
8067           print_vma (exidx_entry, PREFIX_HEX);
8068           fputs (" [cantunwind]\n", stdout);
8069         }
8070       else if (exidx_entry & 0x80000000)
8071         {
8072           print_vma (exidx_entry, PREFIX_HEX);
8073           fputc ('\n', stdout);
8074           decode_arm_unwind (aux, exidx_entry, 4, 0, NULL, NULL);
8075         }
8076       else
8077         {
8078           bfd_vma table, table_offset = 0;
8079           Elf_Internal_Shdr *table_sec;
8080
8081           fputs ("@", stdout);
8082           table = arm_expand_prel31 (exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
8083           print_vma (table, PREFIX_HEX);
8084           printf ("\n");
8085
8086           /* Locate the matching .ARM.extab.  */
8087           if (entry_addr.section != SHN_UNDEF
8088               && entry_addr.section < elf_header.e_shnum)
8089             {
8090               table_sec = section_headers + entry_addr.section;
8091               table_offset = entry_addr.offset;
8092             }
8093           else
8094             {
8095               table_sec = find_section_by_address (table);
8096               if (table_sec != NULL)
8097                 table_offset = table - table_sec->sh_addr;
8098             }
8099           if (table_sec == NULL)
8100             {
8101               warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
8102                     (unsigned long) table);
8103               continue;
8104             }
8105           decode_arm_unwind (aux, 0, 0, table_offset, table_sec,
8106                              &extab_arm_sec);
8107         }
8108     }
8109
8110   printf ("\n");
8111
8112   arm_free_section (&exidx_arm_sec);
8113   arm_free_section (&extab_arm_sec);
8114 }
8115
8116 /* Used for both ARM and C6X unwinding tables.  */
8117
8118 static void
8119 arm_process_unwind (FILE *file)
8120 {
8121   struct arm_unw_aux_info aux;
8122   Elf_Internal_Shdr *unwsec = NULL;
8123   Elf_Internal_Shdr *strsec;
8124   Elf_Internal_Shdr *sec;
8125   unsigned long i;
8126   unsigned int sec_type;
8127
8128   switch (elf_header.e_machine)
8129     {
8130     case EM_ARM:
8131       sec_type = SHT_ARM_EXIDX;
8132       break;
8133
8134     case EM_TI_C6000:
8135       sec_type = SHT_C6000_UNWIND;
8136       break;
8137
8138     default:
8139       error (_("Unsupported architecture type %d encountered when processing unwind table\n"),
8140              elf_header.e_machine);
8141       return;
8142     }
8143
8144   if (string_table == NULL)
8145     return;
8146
8147   memset (& aux, 0, sizeof (aux));
8148   aux.file = file;
8149
8150   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
8151     {
8152       if (sec->sh_type == SHT_SYMTAB && sec->sh_link < elf_header.e_shnum)
8153         {
8154           aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
8155
8156           strsec = section_headers + sec->sh_link;
8157
8158           /* PR binutils/17531 file: 011-12666-0.004.  */
8159           if (aux.strtab != NULL)
8160             {
8161               error (_("Multiple string tables found in file.\n"));
8162               free (aux.strtab);
8163             }
8164           aux.strtab = get_data (NULL, file, strsec->sh_offset,
8165                                  1, strsec->sh_size, _("string table"));
8166           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
8167         }
8168       else if (sec->sh_type == sec_type)
8169         unwsec = sec;
8170     }
8171
8172   if (unwsec == NULL)
8173     printf (_("\nThere are no unwind sections in this file.\n"));
8174   else
8175     for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
8176       {
8177         if (sec->sh_type == sec_type)
8178           {
8179             printf (_("\nUnwind table index '%s' at offset 0x%lx contains %lu entries:\n"),
8180                     printable_section_name (sec),
8181                     (unsigned long) sec->sh_offset,
8182                     (unsigned long) (sec->sh_size / (2 * eh_addr_size)));
8183
8184             dump_arm_unwind (&aux, sec);
8185           }
8186       }
8187
8188   if (aux.symtab)
8189     free (aux.symtab);
8190   if (aux.strtab)
8191     free ((char *) aux.strtab);
8192 }
8193
8194 static void
8195 process_unwind (FILE * file)
8196 {
8197   struct unwind_handler
8198   {
8199     int machtype;
8200     void (* handler)(FILE *);
8201   } handlers[] =
8202   {
8203     { EM_ARM, arm_process_unwind },
8204     { EM_IA_64, ia64_process_unwind },
8205     { EM_PARISC, hppa_process_unwind },
8206     { EM_TI_C6000, arm_process_unwind },
8207     { 0, 0 }
8208   };
8209   int i;
8210
8211   if (!do_unwind)
8212     return;
8213
8214   for (i = 0; handlers[i].handler != NULL; i++)
8215     if (elf_header.e_machine == handlers[i].machtype)
8216       {
8217         handlers[i].handler (file);
8218         return;
8219       }
8220
8221   printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
8222           get_machine_name (elf_header.e_machine));
8223 }
8224
8225 static void
8226 dynamic_section_mips_val (Elf_Internal_Dyn * entry)
8227 {
8228   switch (entry->d_tag)
8229     {
8230     case DT_MIPS_FLAGS:
8231       if (entry->d_un.d_val == 0)
8232         printf (_("NONE"));
8233       else
8234         {
8235           static const char * opts[] =
8236           {
8237             "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
8238             "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
8239             "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
8240             "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
8241             "RLD_ORDER_SAFE"
8242           };
8243           unsigned int cnt;
8244           int first = 1;
8245
8246           for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
8247             if (entry->d_un.d_val & (1 << cnt))
8248               {
8249                 printf ("%s%s", first ? "" : " ", opts[cnt]);
8250                 first = 0;
8251               }
8252         }
8253       break;
8254
8255     case DT_MIPS_IVERSION:
8256       if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
8257         printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry->d_un.d_val));
8258       else
8259         {
8260           char buf[40];
8261           sprintf_vma (buf, entry->d_un.d_ptr);
8262           /* Note: coded this way so that there is a single string for translation.  */
8263           printf (_("<corrupt: %s>"), buf);
8264         }
8265       break;
8266
8267     case DT_MIPS_TIME_STAMP:
8268       {
8269         char timebuf[20];
8270         struct tm * tmp;
8271         time_t atime = entry->d_un.d_val;
8272
8273         tmp = gmtime (&atime);
8274         /* PR 17531: file: 6accc532.  */
8275         if (tmp == NULL)
8276           snprintf (timebuf, sizeof (timebuf), _("<corrupt>"));
8277         else
8278           snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
8279                     tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
8280                     tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
8281         printf (_("Time Stamp: %s"), timebuf);
8282       }
8283       break;
8284
8285     case DT_MIPS_RLD_VERSION:
8286     case DT_MIPS_LOCAL_GOTNO:
8287     case DT_MIPS_CONFLICTNO:
8288     case DT_MIPS_LIBLISTNO:
8289     case DT_MIPS_SYMTABNO:
8290     case DT_MIPS_UNREFEXTNO:
8291     case DT_MIPS_HIPAGENO:
8292     case DT_MIPS_DELTA_CLASS_NO:
8293     case DT_MIPS_DELTA_INSTANCE_NO:
8294     case DT_MIPS_DELTA_RELOC_NO:
8295     case DT_MIPS_DELTA_SYM_NO:
8296     case DT_MIPS_DELTA_CLASSSYM_NO:
8297     case DT_MIPS_COMPACT_SIZE:
8298       print_vma (entry->d_un.d_ptr, DEC);
8299       break;
8300
8301     default:
8302       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8303     }
8304     putchar ('\n');
8305 }
8306
8307 static void
8308 dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
8309 {
8310   switch (entry->d_tag)
8311     {
8312     case DT_HP_DLD_FLAGS:
8313       {
8314         static struct
8315         {
8316           long int bit;
8317           const char * str;
8318         }
8319         flags[] =
8320         {
8321           { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
8322           { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
8323           { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
8324           { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
8325           { DT_HP_BIND_NOW, "HP_BIND_NOW" },
8326           { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
8327           { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
8328           { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
8329           { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
8330           { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
8331           { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
8332           { DT_HP_GST, "HP_GST" },
8333           { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
8334           { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
8335           { DT_HP_NODELETE, "HP_NODELETE" },
8336           { DT_HP_GROUP, "HP_GROUP" },
8337           { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
8338         };
8339         int first = 1;
8340         size_t cnt;
8341         bfd_vma val = entry->d_un.d_val;
8342
8343         for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
8344           if (val & flags[cnt].bit)
8345             {
8346               if (! first)
8347                 putchar (' ');
8348               fputs (flags[cnt].str, stdout);
8349               first = 0;
8350               val ^= flags[cnt].bit;
8351             }
8352
8353         if (val != 0 || first)
8354           {
8355             if (! first)
8356               putchar (' ');
8357             print_vma (val, HEX);
8358           }
8359       }
8360       break;
8361
8362     default:
8363       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8364       break;
8365     }
8366   putchar ('\n');
8367 }
8368
8369 #ifdef BFD64
8370
8371 /* VMS vs Unix time offset and factor.  */
8372
8373 #define VMS_EPOCH_OFFSET 35067168000000000LL
8374 #define VMS_GRANULARITY_FACTOR 10000000
8375
8376 /* Display a VMS time in a human readable format.  */
8377
8378 static void
8379 print_vms_time (bfd_int64_t vmstime)
8380 {
8381   struct tm *tm;
8382   time_t unxtime;
8383
8384   unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
8385   tm = gmtime (&unxtime);
8386   printf ("%04u-%02u-%02uT%02u:%02u:%02u",
8387           tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
8388           tm->tm_hour, tm->tm_min, tm->tm_sec);
8389 }
8390 #endif /* BFD64 */
8391
8392 static void
8393 dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
8394 {
8395   switch (entry->d_tag)
8396     {
8397     case DT_IA_64_PLT_RESERVE:
8398       /* First 3 slots reserved.  */
8399       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8400       printf (" -- ");
8401       print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
8402       break;
8403
8404     case DT_IA_64_VMS_LINKTIME:
8405 #ifdef BFD64
8406       print_vms_time (entry->d_un.d_val);
8407 #endif
8408       break;
8409
8410     case DT_IA_64_VMS_LNKFLAGS:
8411       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8412       if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
8413         printf (" CALL_DEBUG");
8414       if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
8415         printf (" NOP0BUFS");
8416       if (entry->d_un.d_val & VMS_LF_P0IMAGE)
8417         printf (" P0IMAGE");
8418       if (entry->d_un.d_val & VMS_LF_MKTHREADS)
8419         printf (" MKTHREADS");
8420       if (entry->d_un.d_val & VMS_LF_UPCALLS)
8421         printf (" UPCALLS");
8422       if (entry->d_un.d_val & VMS_LF_IMGSTA)
8423         printf (" IMGSTA");
8424       if (entry->d_un.d_val & VMS_LF_INITIALIZE)
8425         printf (" INITIALIZE");
8426       if (entry->d_un.d_val & VMS_LF_MAIN)
8427         printf (" MAIN");
8428       if (entry->d_un.d_val & VMS_LF_EXE_INIT)
8429         printf (" EXE_INIT");
8430       if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
8431         printf (" TBK_IN_IMG");
8432       if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
8433         printf (" DBG_IN_IMG");
8434       if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
8435         printf (" TBK_IN_DSF");
8436       if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
8437         printf (" DBG_IN_DSF");
8438       if (entry->d_un.d_val & VMS_LF_SIGNATURES)
8439         printf (" SIGNATURES");
8440       if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
8441         printf (" REL_SEG_OFF");
8442       break;
8443
8444     default:
8445       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8446       break;
8447     }
8448   putchar ('\n');
8449 }
8450
8451 static int
8452 get_32bit_dynamic_section (FILE * file)
8453 {
8454   Elf32_External_Dyn * edyn;
8455   Elf32_External_Dyn * ext;
8456   Elf_Internal_Dyn * entry;
8457
8458   edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
8459                                           dynamic_size, _("dynamic section"));
8460   if (!edyn)
8461     return 0;
8462
8463   /* SGI's ELF has more than one section in the DYNAMIC segment, and we
8464      might not have the luxury of section headers.  Look for the DT_NULL
8465      terminator to determine the number of entries.  */
8466   for (ext = edyn, dynamic_nent = 0;
8467        (char *) ext < (char *) edyn + dynamic_size - sizeof (* entry);
8468        ext++)
8469     {
8470       dynamic_nent++;
8471       if (BYTE_GET (ext->d_tag) == DT_NULL)
8472         break;
8473     }
8474
8475   dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
8476                                                   sizeof (* entry));
8477   if (dynamic_section == NULL)
8478     {
8479       error (_("Out of memory allocating space for %lu dynamic entries\n"),
8480              (unsigned long) dynamic_nent);
8481       free (edyn);
8482       return 0;
8483     }
8484
8485   for (ext = edyn, entry = dynamic_section;
8486        entry < dynamic_section + dynamic_nent;
8487        ext++, entry++)
8488     {
8489       entry->d_tag      = BYTE_GET (ext->d_tag);
8490       entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
8491     }
8492
8493   free (edyn);
8494
8495   return 1;
8496 }
8497
8498 static int
8499 get_64bit_dynamic_section (FILE * file)
8500 {
8501   Elf64_External_Dyn * edyn;
8502   Elf64_External_Dyn * ext;
8503   Elf_Internal_Dyn * entry;
8504
8505   /* Read in the data.  */
8506   edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
8507                                           dynamic_size, _("dynamic section"));
8508   if (!edyn)
8509     return 0;
8510
8511   /* SGI's ELF has more than one section in the DYNAMIC segment, and we
8512      might not have the luxury of section headers.  Look for the DT_NULL
8513      terminator to determine the number of entries.  */
8514   for (ext = edyn, dynamic_nent = 0;
8515        /* PR 17533 file: 033-67080-0.004 - do not read off the end of the buffer.  */
8516        (char *) ext < ((char *) edyn) + dynamic_size - sizeof (* ext);
8517        ext++)
8518     {
8519       dynamic_nent++;
8520       if (BYTE_GET (ext->d_tag) == DT_NULL)
8521         break;
8522     }
8523
8524   dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
8525                                                   sizeof (* entry));
8526   if (dynamic_section == NULL)
8527     {
8528       error (_("Out of memory allocating space for %lu dynamic entries\n"),
8529              (unsigned long) dynamic_nent);
8530       free (edyn);
8531       return 0;
8532     }
8533
8534   /* Convert from external to internal formats.  */
8535   for (ext = edyn, entry = dynamic_section;
8536        entry < dynamic_section + dynamic_nent;
8537        ext++, entry++)
8538     {
8539       entry->d_tag      = BYTE_GET (ext->d_tag);
8540       entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
8541     }
8542
8543   free (edyn);
8544
8545   return 1;
8546 }
8547
8548 static void
8549 print_dynamic_flags (bfd_vma flags)
8550 {
8551   int first = 1;
8552
8553   while (flags)
8554     {
8555       bfd_vma flag;
8556
8557       flag = flags & - flags;
8558       flags &= ~ flag;
8559
8560       if (first)
8561         first = 0;
8562       else
8563         putc (' ', stdout);
8564
8565       switch (flag)
8566         {
8567         case DF_ORIGIN:         fputs ("ORIGIN", stdout); break;
8568         case DF_SYMBOLIC:       fputs ("SYMBOLIC", stdout); break;
8569         case DF_TEXTREL:        fputs ("TEXTREL", stdout); break;
8570         case DF_BIND_NOW:       fputs ("BIND_NOW", stdout); break;
8571         case DF_STATIC_TLS:     fputs ("STATIC_TLS", stdout); break;
8572         default:                fputs (_("unknown"), stdout); break;
8573         }
8574     }
8575   puts ("");
8576 }
8577
8578 /* Parse and display the contents of the dynamic section.  */
8579
8580 static int
8581 process_dynamic_section (FILE * file)
8582 {
8583   Elf_Internal_Dyn * entry;
8584
8585   if (dynamic_size == 0)
8586     {
8587       if (do_dynamic)
8588         printf (_("\nThere is no dynamic section in this file.\n"));
8589
8590       return 1;
8591     }
8592
8593   if (is_32bit_elf)
8594     {
8595       if (! get_32bit_dynamic_section (file))
8596         return 0;
8597     }
8598   else if (! get_64bit_dynamic_section (file))
8599     return 0;
8600
8601   /* Find the appropriate symbol table.  */
8602   if (dynamic_symbols == NULL)
8603     {
8604       for (entry = dynamic_section;
8605            entry < dynamic_section + dynamic_nent;
8606            ++entry)
8607         {
8608           Elf_Internal_Shdr section;
8609
8610           if (entry->d_tag != DT_SYMTAB)
8611             continue;
8612
8613           dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
8614
8615           /* Since we do not know how big the symbol table is,
8616              we default to reading in the entire file (!) and
8617              processing that.  This is overkill, I know, but it
8618              should work.  */
8619           section.sh_offset = offset_from_vma (file, entry->d_un.d_val, 0);
8620
8621           if (archive_file_offset != 0)
8622             section.sh_size = archive_file_size - section.sh_offset;
8623           else
8624             {
8625               if (fseek (file, 0, SEEK_END))
8626                 error (_("Unable to seek to end of file!\n"));
8627
8628               section.sh_size = ftell (file) - section.sh_offset;
8629             }
8630
8631           if (is_32bit_elf)
8632             section.sh_entsize = sizeof (Elf32_External_Sym);
8633           else
8634             section.sh_entsize = sizeof (Elf64_External_Sym);
8635           section.sh_name = string_table_length;
8636
8637           dynamic_symbols = GET_ELF_SYMBOLS (file, &section, & num_dynamic_syms);
8638           if (num_dynamic_syms < 1)
8639             {
8640               error (_("Unable to determine the number of symbols to load\n"));
8641               continue;
8642             }
8643         }
8644     }
8645
8646   /* Similarly find a string table.  */
8647   if (dynamic_strings == NULL)
8648     {
8649       for (entry = dynamic_section;
8650            entry < dynamic_section + dynamic_nent;
8651            ++entry)
8652         {
8653           unsigned long offset;
8654           long str_tab_len;
8655
8656           if (entry->d_tag != DT_STRTAB)
8657             continue;
8658
8659           dynamic_info[DT_STRTAB] = entry->d_un.d_val;
8660
8661           /* Since we do not know how big the string table is,
8662              we default to reading in the entire file (!) and
8663              processing that.  This is overkill, I know, but it
8664              should work.  */
8665
8666           offset = offset_from_vma (file, entry->d_un.d_val, 0);
8667
8668           if (archive_file_offset != 0)
8669             str_tab_len = archive_file_size - offset;
8670           else
8671             {
8672               if (fseek (file, 0, SEEK_END))
8673                 error (_("Unable to seek to end of file\n"));
8674               str_tab_len = ftell (file) - offset;
8675             }
8676
8677           if (str_tab_len < 1)
8678             {
8679               error
8680                 (_("Unable to determine the length of the dynamic string table\n"));
8681               continue;
8682             }
8683
8684           dynamic_strings = (char *) get_data (NULL, file, offset, 1,
8685                                                str_tab_len,
8686                                                _("dynamic string table"));
8687           dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
8688           break;
8689         }
8690     }
8691
8692   /* And find the syminfo section if available.  */
8693   if (dynamic_syminfo == NULL)
8694     {
8695       unsigned long syminsz = 0;
8696
8697       for (entry = dynamic_section;
8698            entry < dynamic_section + dynamic_nent;
8699            ++entry)
8700         {
8701           if (entry->d_tag == DT_SYMINENT)
8702             {
8703               /* Note: these braces are necessary to avoid a syntax
8704                  error from the SunOS4 C compiler.  */
8705               /* PR binutils/17531: A corrupt file can trigger this test.
8706                  So do not use an assert, instead generate an error message.  */
8707               if (sizeof (Elf_External_Syminfo) != entry->d_un.d_val)
8708                 error (_("Bad value (%d) for SYMINENT entry\n"),
8709                        (int) entry->d_un.d_val);
8710             }
8711           else if (entry->d_tag == DT_SYMINSZ)
8712             syminsz = entry->d_un.d_val;
8713           else if (entry->d_tag == DT_SYMINFO)
8714             dynamic_syminfo_offset = offset_from_vma (file, entry->d_un.d_val,
8715                                                       syminsz);
8716         }
8717
8718       if (dynamic_syminfo_offset != 0 && syminsz != 0)
8719         {
8720           Elf_External_Syminfo * extsyminfo;
8721           Elf_External_Syminfo * extsym;
8722           Elf_Internal_Syminfo * syminfo;
8723
8724           /* There is a syminfo section.  Read the data.  */
8725           extsyminfo = (Elf_External_Syminfo *)
8726               get_data (NULL, file, dynamic_syminfo_offset, 1, syminsz,
8727                         _("symbol information"));
8728           if (!extsyminfo)
8729             return 0;
8730
8731           dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
8732           if (dynamic_syminfo == NULL)
8733             {
8734               error (_("Out of memory allocating %lu byte for dynamic symbol info\n"),
8735                      (unsigned long) syminsz);
8736               return 0;
8737             }
8738
8739           dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
8740           for (syminfo = dynamic_syminfo, extsym = extsyminfo;
8741                syminfo < dynamic_syminfo + dynamic_syminfo_nent;
8742                ++syminfo, ++extsym)
8743             {
8744               syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
8745               syminfo->si_flags = BYTE_GET (extsym->si_flags);
8746             }
8747
8748           free (extsyminfo);
8749         }
8750     }
8751
8752   if (do_dynamic && dynamic_addr)
8753     printf (_("\nDynamic section at offset 0x%lx contains %lu entries:\n"),
8754             dynamic_addr, (unsigned long) dynamic_nent);
8755   if (do_dynamic)
8756     printf (_("  Tag        Type                         Name/Value\n"));
8757
8758   for (entry = dynamic_section;
8759        entry < dynamic_section + dynamic_nent;
8760        entry++)
8761     {
8762       if (do_dynamic)
8763         {
8764           const char * dtype;
8765
8766           putchar (' ');
8767           print_vma (entry->d_tag, FULL_HEX);
8768           dtype = get_dynamic_type (entry->d_tag);
8769           printf (" (%s)%*s", dtype,
8770                   ((is_32bit_elf ? 27 : 19)
8771                    - (int) strlen (dtype)),
8772                   " ");
8773         }
8774
8775       switch (entry->d_tag)
8776         {
8777         case DT_FLAGS:
8778           if (do_dynamic)
8779             print_dynamic_flags (entry->d_un.d_val);
8780           break;
8781
8782         case DT_AUXILIARY:
8783         case DT_FILTER:
8784         case DT_CONFIG:
8785         case DT_DEPAUDIT:
8786         case DT_AUDIT:
8787           if (do_dynamic)
8788             {
8789               switch (entry->d_tag)
8790                 {
8791                 case DT_AUXILIARY:
8792                   printf (_("Auxiliary library"));
8793                   break;
8794
8795                 case DT_FILTER:
8796                   printf (_("Filter library"));
8797                   break;
8798
8799                 case DT_CONFIG:
8800                   printf (_("Configuration file"));
8801                   break;
8802
8803                 case DT_DEPAUDIT:
8804                   printf (_("Dependency audit library"));
8805                   break;
8806
8807                 case DT_AUDIT:
8808                   printf (_("Audit library"));
8809                   break;
8810                 }
8811
8812               if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
8813                 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
8814               else
8815                 {
8816                   printf (": ");
8817                   print_vma (entry->d_un.d_val, PREFIX_HEX);
8818                   putchar ('\n');
8819                 }
8820             }
8821           break;
8822
8823         case DT_FEATURE:
8824           if (do_dynamic)
8825             {
8826               printf (_("Flags:"));
8827
8828               if (entry->d_un.d_val == 0)
8829                 printf (_(" None\n"));
8830               else
8831                 {
8832                   unsigned long int val = entry->d_un.d_val;
8833
8834                   if (val & DTF_1_PARINIT)
8835                     {
8836                       printf (" PARINIT");
8837                       val ^= DTF_1_PARINIT;
8838                     }
8839                   if (val & DTF_1_CONFEXP)
8840                     {
8841                       printf (" CONFEXP");
8842                       val ^= DTF_1_CONFEXP;
8843                     }
8844                   if (val != 0)
8845                     printf (" %lx", val);
8846                   puts ("");
8847                 }
8848             }
8849           break;
8850
8851         case DT_POSFLAG_1:
8852           if (do_dynamic)
8853             {
8854               printf (_("Flags:"));
8855
8856               if (entry->d_un.d_val == 0)
8857                 printf (_(" None\n"));
8858               else
8859                 {
8860                   unsigned long int val = entry->d_un.d_val;
8861
8862                   if (val & DF_P1_LAZYLOAD)
8863                     {
8864                       printf (" LAZYLOAD");
8865                       val ^= DF_P1_LAZYLOAD;
8866                     }
8867                   if (val & DF_P1_GROUPPERM)
8868                     {
8869                       printf (" GROUPPERM");
8870                       val ^= DF_P1_GROUPPERM;
8871                     }
8872                   if (val != 0)
8873                     printf (" %lx", val);
8874                   puts ("");
8875                 }
8876             }
8877           break;
8878
8879         case DT_FLAGS_1:
8880           if (do_dynamic)
8881             {
8882               printf (_("Flags:"));
8883               if (entry->d_un.d_val == 0)
8884                 printf (_(" None\n"));
8885               else
8886                 {
8887                   unsigned long int val = entry->d_un.d_val;
8888
8889                   if (val & DF_1_NOW)
8890                     {
8891                       printf (" NOW");
8892                       val ^= DF_1_NOW;
8893                     }
8894                   if (val & DF_1_GLOBAL)
8895                     {
8896                       printf (" GLOBAL");
8897                       val ^= DF_1_GLOBAL;
8898                     }
8899                   if (val & DF_1_GROUP)
8900                     {
8901                       printf (" GROUP");
8902                       val ^= DF_1_GROUP;
8903                     }
8904                   if (val & DF_1_NODELETE)
8905                     {
8906                       printf (" NODELETE");
8907                       val ^= DF_1_NODELETE;
8908                     }
8909                   if (val & DF_1_LOADFLTR)
8910                     {
8911                       printf (" LOADFLTR");
8912                       val ^= DF_1_LOADFLTR;
8913                     }
8914                   if (val & DF_1_INITFIRST)
8915                     {
8916                       printf (" INITFIRST");
8917                       val ^= DF_1_INITFIRST;
8918                     }
8919                   if (val & DF_1_NOOPEN)
8920                     {
8921                       printf (" NOOPEN");
8922                       val ^= DF_1_NOOPEN;
8923                     }
8924                   if (val & DF_1_ORIGIN)
8925                     {
8926                       printf (" ORIGIN");
8927                       val ^= DF_1_ORIGIN;
8928                     }
8929                   if (val & DF_1_DIRECT)
8930                     {
8931                       printf (" DIRECT");
8932                       val ^= DF_1_DIRECT;
8933                     }
8934                   if (val & DF_1_TRANS)
8935                     {
8936                       printf (" TRANS");
8937                       val ^= DF_1_TRANS;
8938                     }
8939                   if (val & DF_1_INTERPOSE)
8940                     {
8941                       printf (" INTERPOSE");
8942                       val ^= DF_1_INTERPOSE;
8943                     }
8944                   if (val & DF_1_NODEFLIB)
8945                     {
8946                       printf (" NODEFLIB");
8947                       val ^= DF_1_NODEFLIB;
8948                     }
8949                   if (val & DF_1_NODUMP)
8950                     {
8951                       printf (" NODUMP");
8952                       val ^= DF_1_NODUMP;
8953                     }
8954                   if (val & DF_1_CONFALT)
8955                     {
8956                       printf (" CONFALT");
8957                       val ^= DF_1_CONFALT;
8958                     }
8959                   if (val & DF_1_ENDFILTEE)
8960                     {
8961                       printf (" ENDFILTEE");
8962                       val ^= DF_1_ENDFILTEE;
8963                     }
8964                   if (val & DF_1_DISPRELDNE)
8965                     {
8966                       printf (" DISPRELDNE");
8967                       val ^= DF_1_DISPRELDNE;
8968                     }
8969                   if (val & DF_1_DISPRELPND)
8970                     {
8971                       printf (" DISPRELPND");
8972                       val ^= DF_1_DISPRELPND;
8973                     }
8974                   if (val & DF_1_NODIRECT)
8975                     {
8976                       printf (" NODIRECT");
8977                       val ^= DF_1_NODIRECT;
8978                     }
8979                   if (val & DF_1_IGNMULDEF)
8980                     {
8981                       printf (" IGNMULDEF");
8982                       val ^= DF_1_IGNMULDEF;
8983                     }
8984                   if (val & DF_1_NOKSYMS)
8985                     {
8986                       printf (" NOKSYMS");
8987                       val ^= DF_1_NOKSYMS;
8988                     }
8989                   if (val & DF_1_NOHDR)
8990                     {
8991                       printf (" NOHDR");
8992                       val ^= DF_1_NOHDR;
8993                     }
8994                   if (val & DF_1_EDITED)
8995                     {
8996                       printf (" EDITED");
8997                       val ^= DF_1_EDITED;
8998                     }
8999                   if (val & DF_1_NORELOC)
9000                     {
9001                       printf (" NORELOC");
9002                       val ^= DF_1_NORELOC;
9003                     }
9004                   if (val & DF_1_SYMINTPOSE)
9005                     {
9006                       printf (" SYMINTPOSE");
9007                       val ^= DF_1_SYMINTPOSE;
9008                     }
9009                   if (val & DF_1_GLOBAUDIT)
9010                     {
9011                       printf (" GLOBAUDIT");
9012                       val ^= DF_1_GLOBAUDIT;
9013                     }
9014                   if (val & DF_1_SINGLETON)
9015                     {
9016                       printf (" SINGLETON");
9017                       val ^= DF_1_SINGLETON;
9018                     }
9019                   if (val != 0)
9020                     printf (" %lx", val);
9021                   puts ("");
9022                 }
9023             }
9024           break;
9025
9026         case DT_PLTREL:
9027           dynamic_info[entry->d_tag] = entry->d_un.d_val;
9028           if (do_dynamic)
9029             puts (get_dynamic_type (entry->d_un.d_val));
9030           break;
9031
9032         case DT_NULL    :
9033         case DT_NEEDED  :
9034         case DT_PLTGOT  :
9035         case DT_HASH    :
9036         case DT_STRTAB  :
9037         case DT_SYMTAB  :
9038         case DT_RELA    :
9039         case DT_INIT    :
9040         case DT_FINI    :
9041         case DT_SONAME  :
9042         case DT_RPATH   :
9043         case DT_SYMBOLIC:
9044         case DT_REL     :
9045         case DT_DEBUG   :
9046         case DT_TEXTREL :
9047         case DT_JMPREL  :
9048         case DT_RUNPATH :
9049           dynamic_info[entry->d_tag] = entry->d_un.d_val;
9050
9051           if (do_dynamic)
9052             {
9053               char * name;
9054
9055               if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9056                 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
9057               else
9058                 name = NULL;
9059
9060               if (name)
9061                 {
9062                   switch (entry->d_tag)
9063                     {
9064                     case DT_NEEDED:
9065                       printf (_("Shared library: [%s]"), name);
9066
9067                       if (streq (name, program_interpreter))
9068                         printf (_(" program interpreter"));
9069                       break;
9070
9071                     case DT_SONAME:
9072                       printf (_("Library soname: [%s]"), name);
9073                       break;
9074
9075                     case DT_RPATH:
9076                       printf (_("Library rpath: [%s]"), name);
9077                       break;
9078
9079                     case DT_RUNPATH:
9080                       printf (_("Library runpath: [%s]"), name);
9081                       break;
9082
9083                     default:
9084                       print_vma (entry->d_un.d_val, PREFIX_HEX);
9085                       break;
9086                     }
9087                 }
9088               else
9089                 print_vma (entry->d_un.d_val, PREFIX_HEX);
9090
9091               putchar ('\n');
9092             }
9093           break;
9094
9095         case DT_PLTRELSZ:
9096         case DT_RELASZ  :
9097         case DT_STRSZ   :
9098         case DT_RELSZ   :
9099         case DT_RELAENT :
9100         case DT_SYMENT  :
9101         case DT_RELENT  :
9102           dynamic_info[entry->d_tag] = entry->d_un.d_val;
9103         case DT_PLTPADSZ:
9104         case DT_MOVEENT :
9105         case DT_MOVESZ  :
9106         case DT_INIT_ARRAYSZ:
9107         case DT_FINI_ARRAYSZ:
9108         case DT_GNU_CONFLICTSZ:
9109         case DT_GNU_LIBLISTSZ:
9110           if (do_dynamic)
9111             {
9112               print_vma (entry->d_un.d_val, UNSIGNED);
9113               printf (_(" (bytes)\n"));
9114             }
9115           break;
9116
9117         case DT_VERDEFNUM:
9118         case DT_VERNEEDNUM:
9119         case DT_RELACOUNT:
9120         case DT_RELCOUNT:
9121           if (do_dynamic)
9122             {
9123               print_vma (entry->d_un.d_val, UNSIGNED);
9124               putchar ('\n');
9125             }
9126           break;
9127
9128         case DT_SYMINSZ:
9129         case DT_SYMINENT:
9130         case DT_SYMINFO:
9131         case DT_USED:
9132         case DT_INIT_ARRAY:
9133         case DT_FINI_ARRAY:
9134           if (do_dynamic)
9135             {
9136               if (entry->d_tag == DT_USED
9137                   && VALID_DYNAMIC_NAME (entry->d_un.d_val))
9138                 {
9139                   char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
9140
9141                   if (*name)
9142                     {
9143                       printf (_("Not needed object: [%s]\n"), name);
9144                       break;
9145                     }
9146                 }
9147
9148               print_vma (entry->d_un.d_val, PREFIX_HEX);
9149               putchar ('\n');
9150             }
9151           break;
9152
9153         case DT_BIND_NOW:
9154           /* The value of this entry is ignored.  */
9155           if (do_dynamic)
9156             putchar ('\n');
9157           break;
9158
9159         case DT_GNU_PRELINKED:
9160           if (do_dynamic)
9161             {
9162               struct tm * tmp;
9163               time_t atime = entry->d_un.d_val;
9164
9165               tmp = gmtime (&atime);
9166               /* PR 17533 file: 041-1244816-0.004.  */
9167               if (tmp == NULL)
9168                 printf (_("<corrupt time val: %lx"),
9169                         (unsigned long) atime);
9170               else
9171                 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
9172                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9173                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
9174
9175             }
9176           break;
9177
9178         case DT_GNU_HASH:
9179           dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
9180           if (do_dynamic)
9181             {
9182               print_vma (entry->d_un.d_val, PREFIX_HEX);
9183               putchar ('\n');
9184             }
9185           break;
9186
9187         default:
9188           if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
9189             version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
9190               entry->d_un.d_val;
9191
9192           if (do_dynamic)
9193             {
9194               switch (elf_header.e_machine)
9195                 {
9196                 case EM_MIPS:
9197                 case EM_MIPS_RS3_LE:
9198                   dynamic_section_mips_val (entry);
9199                   break;
9200                 case EM_PARISC:
9201                   dynamic_section_parisc_val (entry);
9202                   break;
9203                 case EM_IA_64:
9204                   dynamic_section_ia64_val (entry);
9205                   break;
9206                 default:
9207                   print_vma (entry->d_un.d_val, PREFIX_HEX);
9208                   putchar ('\n');
9209                 }
9210             }
9211           break;
9212         }
9213     }
9214
9215   return 1;
9216 }
9217
9218 static char *
9219 get_ver_flags (unsigned int flags)
9220 {
9221   static char buff[32];
9222
9223   buff[0] = 0;
9224
9225   if (flags == 0)
9226     return _("none");
9227
9228   if (flags & VER_FLG_BASE)
9229     strcat (buff, "BASE ");
9230
9231   if (flags & VER_FLG_WEAK)
9232     {
9233       if (flags & VER_FLG_BASE)
9234         strcat (buff, "| ");
9235
9236       strcat (buff, "WEAK ");
9237     }
9238
9239   if (flags & VER_FLG_INFO)
9240     {
9241       if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
9242         strcat (buff, "| ");
9243
9244       strcat (buff, "INFO ");
9245     }
9246
9247   if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
9248     strcat (buff, _("| <unknown>"));
9249
9250   return buff;
9251 }
9252
9253 /* Display the contents of the version sections.  */
9254
9255 static int
9256 process_version_sections (FILE * file)
9257 {
9258   Elf_Internal_Shdr * section;
9259   unsigned i;
9260   int found = 0;
9261
9262   if (! do_version)
9263     return 1;
9264
9265   for (i = 0, section = section_headers;
9266        i < elf_header.e_shnum;
9267        i++, section++)
9268     {
9269       switch (section->sh_type)
9270         {
9271         case SHT_GNU_verdef:
9272           {
9273             Elf_External_Verdef * edefs;
9274             unsigned int idx;
9275             unsigned int cnt;
9276             char * endbuf;
9277
9278             found = 1;
9279
9280             printf (_("\nVersion definition section '%s' contains %u entries:\n"),
9281                     printable_section_name (section),
9282                     section->sh_info);
9283
9284             printf (_("  Addr: 0x"));
9285             printf_vma (section->sh_addr);
9286             printf (_("  Offset: %#08lx  Link: %u (%s)"),
9287                     (unsigned long) section->sh_offset, section->sh_link,
9288                     printable_section_name_from_index (section->sh_link));
9289
9290             edefs = (Elf_External_Verdef *)
9291                 get_data (NULL, file, section->sh_offset, 1,section->sh_size,
9292                           _("version definition section"));
9293             if (!edefs)
9294               break;
9295             endbuf = (char *) edefs + section->sh_size;
9296
9297             for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
9298               {
9299                 char * vstart;
9300                 Elf_External_Verdef * edef;
9301                 Elf_Internal_Verdef ent;
9302                 Elf_External_Verdaux * eaux;
9303                 Elf_Internal_Verdaux aux;
9304                 int j;
9305                 int isum;
9306
9307                 /* Check for very large indicies.  */
9308                 if (idx > (size_t) (endbuf - (char *) edefs))
9309                   break;
9310
9311                 vstart = ((char *) edefs) + idx;
9312                 if (vstart + sizeof (*edef) > endbuf)
9313                   break;
9314
9315                 edef = (Elf_External_Verdef *) vstart;
9316
9317                 ent.vd_version = BYTE_GET (edef->vd_version);
9318                 ent.vd_flags   = BYTE_GET (edef->vd_flags);
9319                 ent.vd_ndx     = BYTE_GET (edef->vd_ndx);
9320                 ent.vd_cnt     = BYTE_GET (edef->vd_cnt);
9321                 ent.vd_hash    = BYTE_GET (edef->vd_hash);
9322                 ent.vd_aux     = BYTE_GET (edef->vd_aux);
9323                 ent.vd_next    = BYTE_GET (edef->vd_next);
9324
9325                 printf (_("  %#06x: Rev: %d  Flags: %s"),
9326                         idx, ent.vd_version, get_ver_flags (ent.vd_flags));
9327
9328                 printf (_("  Index: %d  Cnt: %d  "),
9329                         ent.vd_ndx, ent.vd_cnt);
9330
9331                 /* Check for overflow.  */
9332                 if (ent.vd_aux > (size_t) (endbuf - vstart))
9333                   break;
9334
9335                 vstart += ent.vd_aux;
9336
9337                 eaux = (Elf_External_Verdaux *) vstart;
9338
9339                 aux.vda_name = BYTE_GET (eaux->vda_name);
9340                 aux.vda_next = BYTE_GET (eaux->vda_next);
9341
9342                 if (VALID_DYNAMIC_NAME (aux.vda_name))
9343                   printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
9344                 else
9345                   printf (_("Name index: %ld\n"), aux.vda_name);
9346
9347                 isum = idx + ent.vd_aux;
9348
9349                 for (j = 1; j < ent.vd_cnt; j++)
9350                   {
9351                     /* Check for overflow.  */
9352                     if (aux.vda_next > (size_t) (endbuf - vstart))
9353                       break;
9354
9355                     isum   += aux.vda_next;
9356                     vstart += aux.vda_next;
9357
9358                     eaux = (Elf_External_Verdaux *) vstart;
9359                     if (vstart + sizeof (*eaux) > endbuf)
9360                       break;
9361
9362                     aux.vda_name = BYTE_GET (eaux->vda_name);
9363                     aux.vda_next = BYTE_GET (eaux->vda_next);
9364
9365                     if (VALID_DYNAMIC_NAME (aux.vda_name))
9366                       printf (_("  %#06x: Parent %d: %s\n"),
9367                               isum, j, GET_DYNAMIC_NAME (aux.vda_name));
9368                     else
9369                       printf (_("  %#06x: Parent %d, name index: %ld\n"),
9370                               isum, j, aux.vda_name);
9371                   }
9372
9373                 if (j < ent.vd_cnt)
9374                   printf (_("  Version def aux past end of section\n"));
9375
9376                 /* PR 17531: file: id:000001,src:000172+005151,op:splice,rep:2.  */
9377                 if (idx + ent.vd_next <= idx)
9378                   break;
9379
9380                 idx += ent.vd_next;
9381               }
9382
9383             if (cnt < section->sh_info)
9384               printf (_("  Version definition past end of section\n"));
9385
9386             free (edefs);
9387           }
9388           break;
9389
9390         case SHT_GNU_verneed:
9391           {
9392             Elf_External_Verneed * eneed;
9393             unsigned int idx;
9394             unsigned int cnt;
9395             char * endbuf;
9396
9397             found = 1;
9398
9399             printf (_("\nVersion needs section '%s' contains %u entries:\n"),
9400                     printable_section_name (section), section->sh_info);
9401
9402             printf (_(" Addr: 0x"));
9403             printf_vma (section->sh_addr);
9404             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
9405                     (unsigned long) section->sh_offset, section->sh_link,
9406                     printable_section_name_from_index (section->sh_link));
9407
9408             eneed = (Elf_External_Verneed *) get_data (NULL, file,
9409                                                        section->sh_offset, 1,
9410                                                        section->sh_size,
9411                                                        _("Version Needs section"));
9412             if (!eneed)
9413               break;
9414             endbuf = (char *) eneed + section->sh_size;
9415
9416             for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
9417               {
9418                 Elf_External_Verneed * entry;
9419                 Elf_Internal_Verneed ent;
9420                 int j;
9421                 int isum;
9422                 char * vstart;
9423
9424                 if (idx > (size_t) (endbuf - (char *) eneed))
9425                   break;
9426
9427                 vstart = ((char *) eneed) + idx;
9428                 if (vstart + sizeof (*entry) > endbuf)
9429                   break;
9430
9431                 entry = (Elf_External_Verneed *) vstart;
9432
9433                 ent.vn_version = BYTE_GET (entry->vn_version);
9434                 ent.vn_cnt     = BYTE_GET (entry->vn_cnt);
9435                 ent.vn_file    = BYTE_GET (entry->vn_file);
9436                 ent.vn_aux     = BYTE_GET (entry->vn_aux);
9437                 ent.vn_next    = BYTE_GET (entry->vn_next);
9438
9439                 printf (_("  %#06x: Version: %d"), idx, ent.vn_version);
9440
9441                 if (VALID_DYNAMIC_NAME (ent.vn_file))
9442                   printf (_("  File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
9443                 else
9444                   printf (_("  File: %lx"), ent.vn_file);
9445
9446                 printf (_("  Cnt: %d\n"), ent.vn_cnt);
9447
9448                 /* Check for overflow.  */
9449                 if (ent.vn_aux > (size_t) (endbuf - vstart))
9450                   break;
9451                 vstart += ent.vn_aux;
9452
9453                 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
9454                   {
9455                     Elf_External_Vernaux * eaux;
9456                     Elf_Internal_Vernaux aux;
9457
9458                     if (vstart + sizeof (*eaux) > endbuf)
9459                       break;
9460                     eaux = (Elf_External_Vernaux *) vstart;
9461
9462                     aux.vna_hash  = BYTE_GET (eaux->vna_hash);
9463                     aux.vna_flags = BYTE_GET (eaux->vna_flags);
9464                     aux.vna_other = BYTE_GET (eaux->vna_other);
9465                     aux.vna_name  = BYTE_GET (eaux->vna_name);
9466                     aux.vna_next  = BYTE_GET (eaux->vna_next);
9467
9468                     if (VALID_DYNAMIC_NAME (aux.vna_name))
9469                       printf (_("  %#06x:   Name: %s"),
9470                               isum, GET_DYNAMIC_NAME (aux.vna_name));
9471                     else
9472                       printf (_("  %#06x:   Name index: %lx"),
9473                               isum, aux.vna_name);
9474
9475                     printf (_("  Flags: %s  Version: %d\n"),
9476                             get_ver_flags (aux.vna_flags), aux.vna_other);
9477
9478                     /* Check for overflow.  */
9479                     if (aux.vna_next > (size_t) (endbuf - vstart)
9480                         || (aux.vna_next == 0 && j < ent.vn_cnt - 1))
9481                       {
9482                         warn (_("Invalid vna_next field of %lx\n"),
9483                               aux.vna_next);
9484                         j = ent.vn_cnt;
9485                         break;
9486                       }
9487                     isum   += aux.vna_next;
9488                     vstart += aux.vna_next;
9489                   }
9490
9491                 if (j < ent.vn_cnt)
9492                   warn (_("Missing Version Needs auxillary information\n"));
9493
9494                 if (ent.vn_next == 0 && cnt < section->sh_info - 1)
9495                   {
9496                     warn (_("Corrupt Version Needs structure - offset to next structure is zero with entries still left to be processed\n"));
9497                     cnt = section->sh_info;
9498                     break;
9499                   }
9500                 idx += ent.vn_next;
9501               }
9502
9503             if (cnt < section->sh_info)
9504               warn (_("Missing Version Needs information\n"));
9505
9506             free (eneed);
9507           }
9508           break;
9509
9510         case SHT_GNU_versym:
9511           {
9512             Elf_Internal_Shdr * link_section;
9513             size_t total;
9514             unsigned int cnt;
9515             unsigned char * edata;
9516             unsigned short * data;
9517             char * strtab;
9518             Elf_Internal_Sym * symbols;
9519             Elf_Internal_Shdr * string_sec;
9520             unsigned long num_syms;
9521             long off;
9522
9523             if (section->sh_link >= elf_header.e_shnum)
9524               break;
9525
9526             link_section = section_headers + section->sh_link;
9527             total = section->sh_size / sizeof (Elf_External_Versym);
9528
9529             if (link_section->sh_link >= elf_header.e_shnum)
9530               break;
9531
9532             found = 1;
9533
9534             symbols = GET_ELF_SYMBOLS (file, link_section, & num_syms);
9535             if (symbols == NULL)
9536               break;
9537
9538             string_sec = section_headers + link_section->sh_link;
9539
9540             strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
9541                                         string_sec->sh_size,
9542                                         _("version string table"));
9543             if (!strtab)
9544               {
9545                 free (symbols);
9546                 break;
9547               }
9548
9549             printf (_("\nVersion symbols section '%s' contains %lu entries:\n"),
9550                     printable_section_name (section), (unsigned long) total);
9551
9552             printf (_(" Addr: "));
9553             printf_vma (section->sh_addr);
9554             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
9555                     (unsigned long) section->sh_offset, section->sh_link,
9556                     printable_section_name (link_section));
9557
9558             off = offset_from_vma (file,
9559                                    version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
9560                                    total * sizeof (short));
9561             edata = (unsigned char *) get_data (NULL, file, off, total,
9562                                                 sizeof (short),
9563                                                 _("version symbol data"));
9564             if (!edata)
9565               {
9566                 free (strtab);
9567                 free (symbols);
9568                 break;
9569               }
9570
9571             data = (short unsigned int *) cmalloc (total, sizeof (short));
9572
9573             for (cnt = total; cnt --;)
9574               data[cnt] = byte_get (edata + cnt * sizeof (short),
9575                                     sizeof (short));
9576
9577             free (edata);
9578
9579             for (cnt = 0; cnt < total; cnt += 4)
9580               {
9581                 int j, nn;
9582                 int check_def, check_need;
9583                 char * name;
9584
9585                 printf ("  %03x:", cnt);
9586
9587                 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
9588                   switch (data[cnt + j])
9589                     {
9590                     case 0:
9591                       fputs (_("   0 (*local*)    "), stdout);
9592                       break;
9593
9594                     case 1:
9595                       fputs (_("   1 (*global*)   "), stdout);
9596                       break;
9597
9598                     default:
9599                       nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
9600                                    data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
9601
9602                       /* If this index value is greater than the size of the symbols
9603                          array, break to avoid an out-of-bounds read.  */
9604                       if ((unsigned long)(cnt + j) >= num_syms)
9605                         {
9606                           warn (_("invalid index into symbol array\n"));
9607                           break;
9608                         }
9609
9610                       check_def = 1;
9611                       check_need = 1;
9612                       if (symbols[cnt + j].st_shndx >= elf_header.e_shnum
9613                           || section_headers[symbols[cnt + j].st_shndx].sh_type
9614                              != SHT_NOBITS)
9615                         {
9616                           if (symbols[cnt + j].st_shndx == SHN_UNDEF)
9617                             check_def = 0;
9618                           else
9619                             check_need = 0;
9620                         }
9621
9622                       if (check_need
9623                           && version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
9624                         {
9625                           Elf_Internal_Verneed ivn;
9626                           unsigned long offset;
9627
9628                           offset = offset_from_vma
9629                             (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
9630                              sizeof (Elf_External_Verneed));
9631
9632                           do
9633                             {
9634                               Elf_Internal_Vernaux ivna;
9635                               Elf_External_Verneed evn;
9636                               Elf_External_Vernaux evna;
9637                               unsigned long a_off;
9638
9639                               if (get_data (&evn, file, offset, sizeof (evn), 1,
9640                                             _("version need")) == NULL)
9641                                 break;
9642
9643                               ivn.vn_aux  = BYTE_GET (evn.vn_aux);
9644                               ivn.vn_next = BYTE_GET (evn.vn_next);
9645
9646                               a_off = offset + ivn.vn_aux;
9647
9648                               do
9649                                 {
9650                                   if (get_data (&evna, file, a_off, sizeof (evna),
9651                                                 1, _("version need aux (2)")) == NULL)
9652                                     {
9653                                       ivna.vna_next  = 0;
9654                                       ivna.vna_other = 0;
9655                                     }
9656                                   else
9657                                     {
9658                                       ivna.vna_next  = BYTE_GET (evna.vna_next);
9659                                       ivna.vna_other = BYTE_GET (evna.vna_other);
9660                                     }
9661
9662                                   a_off += ivna.vna_next;
9663                                 }
9664                               while (ivna.vna_other != data[cnt + j]
9665                                      && ivna.vna_next != 0);
9666
9667                               if (ivna.vna_other == data[cnt + j])
9668                                 {
9669                                   ivna.vna_name = BYTE_GET (evna.vna_name);
9670
9671                                   if (ivna.vna_name >= string_sec->sh_size)
9672                                     name = _("*invalid*");
9673                                   else
9674                                     name = strtab + ivna.vna_name;
9675                                   nn += printf ("(%s%-*s",
9676                                                 name,
9677                                                 12 - (int) strlen (name),
9678                                                 ")");
9679                                   check_def = 0;
9680                                   break;
9681                                 }
9682
9683                               offset += ivn.vn_next;
9684                             }
9685                           while (ivn.vn_next);
9686                         }
9687
9688                       if (check_def && data[cnt + j] != 0x8001
9689                           && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
9690                         {
9691                           Elf_Internal_Verdef ivd;
9692                           Elf_External_Verdef evd;
9693                           unsigned long offset;
9694
9695                           offset = offset_from_vma
9696                             (file, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
9697                              sizeof evd);
9698
9699                           do
9700                             {
9701                               if (get_data (&evd, file, offset, sizeof (evd), 1,
9702                                             _("version def")) == NULL)
9703                                 {
9704                                   ivd.vd_next = 0;
9705                                   /* PR 17531: file: 046-1082287-0.004.  */ 
9706                                   ivd.vd_ndx  = (data[cnt + j] & VERSYM_VERSION) + 1;
9707                                   break;
9708                                 }
9709                               else
9710                                 {
9711                                   ivd.vd_next = BYTE_GET (evd.vd_next);
9712                                   ivd.vd_ndx  = BYTE_GET (evd.vd_ndx);
9713                                 }
9714
9715                               offset += ivd.vd_next;
9716                             }
9717                           while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
9718                                  && ivd.vd_next != 0);
9719
9720                           if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
9721                             {
9722                               Elf_External_Verdaux evda;
9723                               Elf_Internal_Verdaux ivda;
9724
9725                               ivd.vd_aux = BYTE_GET (evd.vd_aux);
9726
9727                               if (get_data (&evda, file,
9728                                             offset - ivd.vd_next + ivd.vd_aux,
9729                                             sizeof (evda), 1,
9730                                             _("version def aux")) == NULL)
9731                                 break;
9732
9733                               ivda.vda_name = BYTE_GET (evda.vda_name);
9734
9735                               if (ivda.vda_name >= string_sec->sh_size)
9736                                 name = _("*invalid*");
9737                               else
9738                                 name = strtab + ivda.vda_name;
9739                               nn += printf ("(%s%-*s",
9740                                             name,
9741                                             12 - (int) strlen (name),
9742                                             ")");
9743                             }
9744                         }
9745
9746                       if (nn < 18)
9747                         printf ("%*c", 18 - nn, ' ');
9748                     }
9749
9750                 putchar ('\n');
9751               }
9752
9753             free (data);
9754             free (strtab);
9755             free (symbols);
9756           }
9757           break;
9758
9759         default:
9760           break;
9761         }
9762     }
9763
9764   if (! found)
9765     printf (_("\nNo version information found in this file.\n"));
9766
9767   return 1;
9768 }
9769
9770 static const char *
9771 get_symbol_binding (unsigned int binding)
9772 {
9773   static char buff[32];
9774
9775   switch (binding)
9776     {
9777     case STB_LOCAL:     return "LOCAL";
9778     case STB_GLOBAL:    return "GLOBAL";
9779     case STB_WEAK:      return "WEAK";
9780     default:
9781       if (binding >= STB_LOPROC && binding <= STB_HIPROC)
9782         snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
9783                   binding);
9784       else if (binding >= STB_LOOS && binding <= STB_HIOS)
9785         {
9786           if (binding == STB_GNU_UNIQUE
9787               && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
9788                   /* GNU is still using the default value 0.  */
9789                   || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
9790             return "UNIQUE";
9791           snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
9792         }
9793       else
9794         snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
9795       return buff;
9796     }
9797 }
9798
9799 static const char *
9800 get_symbol_type (unsigned int type)
9801 {
9802   static char buff[32];
9803
9804   switch (type)
9805     {
9806     case STT_NOTYPE:    return "NOTYPE";
9807     case STT_OBJECT:    return "OBJECT";
9808     case STT_FUNC:      return "FUNC";
9809     case STT_SECTION:   return "SECTION";
9810     case STT_FILE:      return "FILE";
9811     case STT_COMMON:    return "COMMON";
9812     case STT_TLS:       return "TLS";
9813     case STT_RELC:      return "RELC";
9814     case STT_SRELC:     return "SRELC";
9815     default:
9816       if (type >= STT_LOPROC && type <= STT_HIPROC)
9817         {
9818           if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
9819             return "THUMB_FUNC";
9820
9821           if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
9822             return "REGISTER";
9823
9824           if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
9825             return "PARISC_MILLI";
9826
9827           snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
9828         }
9829       else if (type >= STT_LOOS && type <= STT_HIOS)
9830         {
9831           if (elf_header.e_machine == EM_PARISC)
9832             {
9833               if (type == STT_HP_OPAQUE)
9834                 return "HP_OPAQUE";
9835               if (type == STT_HP_STUB)
9836                 return "HP_STUB";
9837             }
9838
9839           if (type == STT_GNU_IFUNC
9840               && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
9841                   || elf_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD
9842                   /* GNU is still using the default value 0.  */
9843                   || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
9844             return "IFUNC";
9845
9846           snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
9847         }
9848       else
9849         snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
9850       return buff;
9851     }
9852 }
9853
9854 static const char *
9855 get_symbol_visibility (unsigned int visibility)
9856 {
9857   switch (visibility)
9858     {
9859     case STV_DEFAULT:   return "DEFAULT";
9860     case STV_INTERNAL:  return "INTERNAL";
9861     case STV_HIDDEN:    return "HIDDEN";
9862     case STV_PROTECTED: return "PROTECTED";
9863     default:
9864       error (_("Unrecognized visibility value: %u"), visibility);
9865       return _("<unknown>");
9866     }
9867 }
9868
9869 static const char *
9870 get_mips_symbol_other (unsigned int other)
9871 {
9872   switch (other)
9873     {
9874     case STO_OPTIONAL:
9875       return "OPTIONAL";
9876     case STO_MIPS_PLT:
9877       return "MIPS PLT";
9878     case STO_MIPS_PIC:
9879       return "MIPS PIC";
9880     case STO_MICROMIPS:
9881       return "MICROMIPS";
9882     case STO_MICROMIPS | STO_MIPS_PIC:
9883       return "MICROMIPS, MIPS PIC";
9884     case STO_MIPS16:
9885       return "MIPS16";
9886     default:
9887       return NULL;
9888     }
9889 }
9890
9891 static const char *
9892 get_ia64_symbol_other (unsigned int other)
9893 {
9894   if (is_ia64_vms ())
9895     {
9896       static char res[32];
9897
9898       res[0] = 0;
9899
9900       /* Function types is for images and .STB files only.  */
9901       switch (elf_header.e_type)
9902         {
9903         case ET_DYN:
9904         case ET_EXEC:
9905           switch (VMS_ST_FUNC_TYPE (other))
9906             {
9907             case VMS_SFT_CODE_ADDR:
9908               strcat (res, " CA");
9909               break;
9910             case VMS_SFT_SYMV_IDX:
9911               strcat (res, " VEC");
9912               break;
9913             case VMS_SFT_FD:
9914               strcat (res, " FD");
9915               break;
9916             case VMS_SFT_RESERVE:
9917               strcat (res, " RSV");
9918               break;
9919             default:
9920               warn (_("Unrecognized IA64 VMS ST Function type: %d\n"),
9921                     VMS_ST_FUNC_TYPE (other));
9922               strcat (res, " <unknown>");
9923               break;
9924             }
9925           break;
9926         default:
9927           break;
9928         }
9929       switch (VMS_ST_LINKAGE (other))
9930         {
9931         case VMS_STL_IGNORE:
9932           strcat (res, " IGN");
9933           break;
9934         case VMS_STL_RESERVE:
9935           strcat (res, " RSV");
9936           break;
9937         case VMS_STL_STD:
9938           strcat (res, " STD");
9939           break;
9940         case VMS_STL_LNK:
9941           strcat (res, " LNK");
9942           break;
9943         default:
9944           warn (_("Unrecognized IA64 VMS ST Linkage: %d\n"),
9945                 VMS_ST_LINKAGE (other));
9946           strcat (res, " <unknown>");
9947           break;
9948         }
9949
9950       if (res[0] != 0)
9951         return res + 1;
9952       else
9953         return res;
9954     }
9955   return NULL;
9956 }
9957
9958 static const char *
9959 get_ppc64_symbol_other (unsigned int other)
9960 {
9961   if (PPC64_LOCAL_ENTRY_OFFSET (other) != 0)
9962     {
9963       static char buf[32];
9964       snprintf (buf, sizeof buf, _("<localentry>: %d"),
9965                 PPC64_LOCAL_ENTRY_OFFSET (other));
9966       return buf;
9967     }
9968   return NULL;
9969 }
9970
9971 static const char *
9972 get_symbol_other (unsigned int other)
9973 {
9974   const char * result = NULL;
9975   static char buff [32];
9976
9977   if (other == 0)
9978     return "";
9979
9980   switch (elf_header.e_machine)
9981     {
9982     case EM_MIPS:
9983       result = get_mips_symbol_other (other);
9984       break;
9985     case EM_IA_64:
9986       result = get_ia64_symbol_other (other);
9987       break;
9988     case EM_PPC64:
9989       result = get_ppc64_symbol_other (other);
9990       break;
9991     default:
9992       break;
9993     }
9994
9995   if (result)
9996     return result;
9997
9998   snprintf (buff, sizeof buff, _("<other>: %x"), other);
9999   return buff;
10000 }
10001
10002 static const char *
10003 get_symbol_index_type (unsigned int type)
10004 {
10005   static char buff[32];
10006
10007   switch (type)
10008     {
10009     case SHN_UNDEF:     return "UND";
10010     case SHN_ABS:       return "ABS";
10011     case SHN_COMMON:    return "COM";
10012     default:
10013       if (type == SHN_IA_64_ANSI_COMMON
10014           && elf_header.e_machine == EM_IA_64
10015           && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
10016         return "ANSI_COM";
10017       else if ((elf_header.e_machine == EM_X86_64
10018                 || elf_header.e_machine == EM_L1OM
10019                 || elf_header.e_machine == EM_K1OM)
10020                && type == SHN_X86_64_LCOMMON)
10021         return "LARGE_COM";
10022       else if ((type == SHN_MIPS_SCOMMON
10023                 && elf_header.e_machine == EM_MIPS)
10024                || (type == SHN_TIC6X_SCOMMON
10025                    && elf_header.e_machine == EM_TI_C6000))
10026         return "SCOM";
10027       else if (type == SHN_MIPS_SUNDEFINED
10028                && elf_header.e_machine == EM_MIPS)
10029         return "SUND";
10030       else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
10031         sprintf (buff, "PRC[0x%04x]", type & 0xffff);
10032       else if (type >= SHN_LOOS && type <= SHN_HIOS)
10033         sprintf (buff, "OS [0x%04x]", type & 0xffff);
10034       else if (type >= SHN_LORESERVE)
10035         sprintf (buff, "RSV[0x%04x]", type & 0xffff);
10036       else if (type >= elf_header.e_shnum)
10037         sprintf (buff, _("bad section index[%3d]"), type);
10038       else
10039         sprintf (buff, "%3d", type);
10040       break;
10041     }
10042
10043   return buff;
10044 }
10045
10046 static bfd_vma *
10047 get_dynamic_data (FILE * file, size_t number, unsigned int ent_size)
10048 {
10049   unsigned char * e_data;
10050   bfd_vma * i_data;
10051
10052   /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
10053      attempting to allocate memory when the read is bound to fail.  */
10054   if (ent_size * number > current_file_size)
10055     {
10056       error (_("Invalid number of dynamic entries: %lu\n"),
10057              (unsigned long) number);
10058       return NULL;
10059     }
10060
10061   e_data = (unsigned char *) cmalloc (number, ent_size);
10062   if (e_data == NULL)
10063     {
10064       error (_("Out of memory reading %lu dynamic entries\n"),
10065              (unsigned long) number);
10066       return NULL;
10067     }
10068
10069   if (fread (e_data, ent_size, number, file) != number)
10070     {
10071       error (_("Unable to read in %lu bytes of dynamic data\n"),
10072              (unsigned long) (number * ent_size));
10073       free (e_data);
10074       return NULL;
10075     }
10076
10077   i_data = (bfd_vma *) cmalloc (number, sizeof (*i_data));
10078   if (i_data == NULL)
10079     {
10080       error (_("Out of memory allocating space for %lu dynamic entries\n"),
10081              (unsigned long) number);
10082       free (e_data);
10083       return NULL;
10084     }
10085
10086   while (number--)
10087     i_data[number] = byte_get (e_data + number * ent_size, ent_size);
10088
10089   free (e_data);
10090
10091   return i_data;
10092 }
10093
10094 static void
10095 print_dynamic_symbol (bfd_vma si, unsigned long hn)
10096 {
10097   Elf_Internal_Sym * psym;
10098   int n;
10099
10100   n = print_vma (si, DEC_5);
10101   if (n < 5)
10102     fputs (&"     "[n], stdout);
10103   printf (" %3lu: ", hn);
10104
10105   if (dynamic_symbols == NULL || si >= num_dynamic_syms)
10106     {
10107       printf (_("<No info available for dynamic symbol number %lu>\n"),
10108               (unsigned long) si);
10109       return;
10110     }
10111
10112   psym = dynamic_symbols + si;
10113   print_vma (psym->st_value, LONG_HEX);
10114   putchar (' ');
10115   print_vma (psym->st_size, DEC_5);
10116
10117   printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
10118   printf (" %-6s",  get_symbol_binding (ELF_ST_BIND (psym->st_info)));
10119   printf (" %-7s",  get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
10120   /* Check to see if any other bits in the st_other field are set.
10121      Note - displaying this information disrupts the layout of the
10122      table being generated, but for the moment this case is very
10123      rare.  */
10124   if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
10125     printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
10126   printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
10127   if (VALID_DYNAMIC_NAME (psym->st_name))
10128     print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
10129   else
10130     printf (_(" <corrupt: %14ld>"), psym->st_name);
10131   putchar ('\n');
10132 }
10133
10134 static const char *
10135 get_symbol_version_string (FILE *file, int is_dynsym,
10136                            const char *strtab,
10137                            unsigned long int strtab_size,
10138                            unsigned int si, Elf_Internal_Sym *psym,
10139                            enum versioned_symbol_info *sym_info,
10140                            unsigned short *vna_other)
10141 {
10142   const char *version_string = NULL;
10143
10144   if (is_dynsym
10145       && version_info[DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
10146     {
10147       unsigned char data[2];
10148       unsigned short vers_data;
10149       unsigned long offset;
10150       int is_nobits;
10151       int check_def;
10152
10153       offset = offset_from_vma
10154         (file, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10155          sizeof data + si * sizeof (vers_data));
10156
10157       if (get_data (&data, file, offset + si * sizeof (vers_data),
10158                     sizeof (data), 1, _("version data")) == NULL)
10159         return NULL;
10160
10161       vers_data = byte_get (data, 2);
10162
10163       is_nobits = (section_headers != NULL
10164                    && psym->st_shndx < elf_header.e_shnum
10165                    && section_headers[psym->st_shndx].sh_type
10166                    == SHT_NOBITS);
10167
10168       check_def = (psym->st_shndx != SHN_UNDEF);
10169
10170       if ((vers_data & VERSYM_HIDDEN) || vers_data > 1)
10171         {
10172           if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)]
10173               && (is_nobits || ! check_def))
10174             {
10175               Elf_External_Verneed evn;
10176               Elf_Internal_Verneed ivn;
10177               Elf_Internal_Vernaux ivna;
10178
10179               /* We must test both.  */
10180               offset = offset_from_vma
10181                 (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10182                  sizeof evn);
10183
10184               do
10185                 {
10186                   unsigned long vna_off;
10187
10188                   if (get_data (&evn, file, offset, sizeof (evn), 1,
10189                                 _("version need")) == NULL)
10190                     {
10191                       ivna.vna_next = 0;
10192                       ivna.vna_other = 0;
10193                       ivna.vna_name = 0;
10194                       break;
10195                     }
10196
10197                   ivn.vn_aux  = BYTE_GET (evn.vn_aux);
10198                   ivn.vn_next = BYTE_GET (evn.vn_next);
10199
10200                   vna_off = offset + ivn.vn_aux;
10201
10202                   do
10203                     {
10204                       Elf_External_Vernaux evna;
10205
10206                       if (get_data (&evna, file, vna_off,
10207                                     sizeof (evna), 1,
10208                                     _("version need aux (3)")) == NULL)
10209                         {
10210                           ivna.vna_next = 0;
10211                           ivna.vna_other = 0;
10212                           ivna.vna_name = 0;
10213                         }
10214                       else
10215                         {
10216                           ivna.vna_other = BYTE_GET (evna.vna_other);
10217                           ivna.vna_next  = BYTE_GET (evna.vna_next);
10218                           ivna.vna_name  = BYTE_GET (evna.vna_name);
10219                         }
10220
10221                       vna_off += ivna.vna_next;
10222                     }
10223                   while (ivna.vna_other != vers_data
10224                          && ivna.vna_next != 0);
10225
10226                   if (ivna.vna_other == vers_data)
10227                     break;
10228
10229                   offset += ivn.vn_next;
10230                 }
10231               while (ivn.vn_next != 0);
10232
10233               if (ivna.vna_other == vers_data)
10234                 {
10235                   *sym_info = symbol_undefined;
10236                   *vna_other = ivna.vna_other;
10237                   version_string = (ivna.vna_name < strtab_size
10238                                     ? strtab + ivna.vna_name
10239                                     : _("<corrupt>"));
10240                   check_def = 0;
10241                 }
10242               else if (! is_nobits)
10243                 error (_("bad dynamic symbol\n"));
10244               else
10245                 check_def = 1;
10246             }
10247
10248           if (check_def)
10249             {
10250               if (vers_data != 0x8001
10251                   && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10252                 {
10253                   Elf_Internal_Verdef ivd;
10254                   Elf_Internal_Verdaux ivda;
10255                   Elf_External_Verdaux evda;
10256                   unsigned long off;
10257
10258                   off = offset_from_vma
10259                     (file,
10260                      version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10261                      sizeof (Elf_External_Verdef));
10262
10263                   do
10264                     {
10265                       Elf_External_Verdef evd;
10266
10267                       if (get_data (&evd, file, off, sizeof (evd),
10268                                     1, _("version def")) == NULL)
10269                         {
10270                           ivd.vd_ndx = 0;
10271                           ivd.vd_aux = 0;
10272                           ivd.vd_next = 0;
10273                         }
10274                       else
10275                         {
10276                           ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
10277                           ivd.vd_aux = BYTE_GET (evd.vd_aux);
10278                           ivd.vd_next = BYTE_GET (evd.vd_next);
10279                         }
10280
10281                       off += ivd.vd_next;
10282                     }
10283                   while (ivd.vd_ndx != (vers_data & VERSYM_VERSION)
10284                          && ivd.vd_next != 0);
10285
10286                   off -= ivd.vd_next;
10287                   off += ivd.vd_aux;
10288
10289                   if (get_data (&evda, file, off, sizeof (evda),
10290                                 1, _("version def aux")) == NULL)
10291                     return version_string;
10292
10293                   ivda.vda_name = BYTE_GET (evda.vda_name);
10294
10295                   if (psym->st_name != ivda.vda_name)
10296                     {
10297                       *sym_info = ((vers_data & VERSYM_HIDDEN) != 0
10298                                    ? symbol_hidden : symbol_public);
10299                       version_string = (ivda.vda_name < strtab_size
10300                                         ? strtab + ivda.vda_name
10301                                         : _("<corrupt>"));
10302                     }
10303                 }
10304             }
10305         }
10306     }
10307   return version_string;
10308 }
10309
10310 /* Dump the symbol table.  */
10311 static int
10312 process_symbol_table (FILE * file)
10313 {
10314   Elf_Internal_Shdr * section;
10315   bfd_size_type nbuckets = 0;
10316   bfd_size_type nchains = 0;
10317   bfd_vma * buckets = NULL;
10318   bfd_vma * chains = NULL;
10319   bfd_vma ngnubuckets = 0;
10320   bfd_vma * gnubuckets = NULL;
10321   bfd_vma * gnuchains = NULL;
10322   bfd_vma gnusymidx = 0;
10323   bfd_size_type ngnuchains = 0;
10324
10325   if (!do_syms && !do_dyn_syms && !do_histogram)
10326     return 1;
10327
10328   if (dynamic_info[DT_HASH]
10329       && (do_histogram
10330           || (do_using_dynamic
10331               && !do_dyn_syms
10332               && dynamic_strings != NULL)))
10333     {
10334       unsigned char nb[8];
10335       unsigned char nc[8];
10336       unsigned int hash_ent_size = 4;
10337
10338       if ((elf_header.e_machine == EM_ALPHA
10339            || elf_header.e_machine == EM_S390
10340            || elf_header.e_machine == EM_S390_OLD)
10341           && elf_header.e_ident[EI_CLASS] == ELFCLASS64)
10342         hash_ent_size = 8;
10343
10344       if (fseek (file,
10345                  (archive_file_offset
10346                   + offset_from_vma (file, dynamic_info[DT_HASH],
10347                                      sizeof nb + sizeof nc)),
10348                  SEEK_SET))
10349         {
10350           error (_("Unable to seek to start of dynamic information\n"));
10351           goto no_hash;
10352         }
10353
10354       if (fread (nb, hash_ent_size, 1, file) != 1)
10355         {
10356           error (_("Failed to read in number of buckets\n"));
10357           goto no_hash;
10358         }
10359
10360       if (fread (nc, hash_ent_size, 1, file) != 1)
10361         {
10362           error (_("Failed to read in number of chains\n"));
10363           goto no_hash;
10364         }
10365
10366       nbuckets = byte_get (nb, hash_ent_size);
10367       nchains  = byte_get (nc, hash_ent_size);
10368
10369       buckets = get_dynamic_data (file, nbuckets, hash_ent_size);
10370       chains  = get_dynamic_data (file, nchains, hash_ent_size);
10371
10372     no_hash:
10373       if (buckets == NULL || chains == NULL)
10374         {
10375           if (do_using_dynamic)
10376             return 0;
10377           free (buckets);
10378           free (chains);
10379           buckets = NULL;
10380           chains = NULL;
10381           nbuckets = 0;
10382           nchains = 0;
10383         }
10384     }
10385
10386   if (dynamic_info_DT_GNU_HASH
10387       && (do_histogram
10388           || (do_using_dynamic
10389               && !do_dyn_syms
10390               && dynamic_strings != NULL)))
10391     {
10392       unsigned char nb[16];
10393       bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
10394       bfd_vma buckets_vma;
10395
10396       if (fseek (file,
10397                  (archive_file_offset
10398                   + offset_from_vma (file, dynamic_info_DT_GNU_HASH,
10399                                      sizeof nb)),
10400                  SEEK_SET))
10401         {
10402           error (_("Unable to seek to start of dynamic information\n"));
10403           goto no_gnu_hash;
10404         }
10405
10406       if (fread (nb, 16, 1, file) != 1)
10407         {
10408           error (_("Failed to read in number of buckets\n"));
10409           goto no_gnu_hash;
10410         }
10411
10412       ngnubuckets = byte_get (nb, 4);
10413       gnusymidx = byte_get (nb + 4, 4);
10414       bitmaskwords = byte_get (nb + 8, 4);
10415       buckets_vma = dynamic_info_DT_GNU_HASH + 16;
10416       if (is_32bit_elf)
10417         buckets_vma += bitmaskwords * 4;
10418       else
10419         buckets_vma += bitmaskwords * 8;
10420
10421       if (fseek (file,
10422                  (archive_file_offset
10423                   + offset_from_vma (file, buckets_vma, 4)),
10424                  SEEK_SET))
10425         {
10426           error (_("Unable to seek to start of dynamic information\n"));
10427           goto no_gnu_hash;
10428         }
10429
10430       gnubuckets = get_dynamic_data (file, ngnubuckets, 4);
10431
10432       if (gnubuckets == NULL)
10433         goto no_gnu_hash;
10434
10435       for (i = 0; i < ngnubuckets; i++)
10436         if (gnubuckets[i] != 0)
10437           {
10438             if (gnubuckets[i] < gnusymidx)
10439               return 0;
10440
10441             if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
10442               maxchain = gnubuckets[i];
10443           }
10444
10445       if (maxchain == 0xffffffff)
10446         goto no_gnu_hash;
10447
10448       maxchain -= gnusymidx;
10449
10450       if (fseek (file,
10451                  (archive_file_offset
10452                   + offset_from_vma (file, buckets_vma
10453                                            + 4 * (ngnubuckets + maxchain), 4)),
10454                  SEEK_SET))
10455         {
10456           error (_("Unable to seek to start of dynamic information\n"));
10457           goto no_gnu_hash;
10458         }
10459
10460       do
10461         {
10462           if (fread (nb, 4, 1, file) != 1)
10463             {
10464               error (_("Failed to determine last chain length\n"));
10465               goto no_gnu_hash;
10466             }
10467
10468           if (maxchain + 1 == 0)
10469             goto no_gnu_hash;
10470
10471           ++maxchain;
10472         }
10473       while ((byte_get (nb, 4) & 1) == 0);
10474
10475       if (fseek (file,
10476                  (archive_file_offset
10477                   + offset_from_vma (file, buckets_vma + 4 * ngnubuckets, 4)),
10478                  SEEK_SET))
10479         {
10480           error (_("Unable to seek to start of dynamic information\n"));
10481           goto no_gnu_hash;
10482         }
10483
10484       gnuchains = get_dynamic_data (file, maxchain, 4);
10485       ngnuchains = maxchain;
10486
10487     no_gnu_hash:
10488       if (gnuchains == NULL)
10489         {
10490           free (gnubuckets);
10491           gnubuckets = NULL;
10492           ngnubuckets = 0;
10493           if (do_using_dynamic)
10494             return 0;
10495         }
10496     }
10497
10498   if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
10499       && do_syms
10500       && do_using_dynamic
10501       && dynamic_strings != NULL
10502       && dynamic_symbols != NULL)
10503     {
10504       unsigned long hn;
10505
10506       if (dynamic_info[DT_HASH])
10507         {
10508           bfd_vma si;
10509
10510           printf (_("\nSymbol table for image:\n"));
10511           if (is_32bit_elf)
10512             printf (_("  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"));
10513           else
10514             printf (_("  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"));
10515
10516           for (hn = 0; hn < nbuckets; hn++)
10517             {
10518               if (! buckets[hn])
10519                 continue;
10520
10521               for (si = buckets[hn]; si < nchains && si > 0; si = chains[si])
10522                 print_dynamic_symbol (si, hn);
10523             }
10524         }
10525
10526       if (dynamic_info_DT_GNU_HASH)
10527         {
10528           printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
10529           if (is_32bit_elf)
10530             printf (_("  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"));
10531           else
10532             printf (_("  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"));
10533
10534           for (hn = 0; hn < ngnubuckets; ++hn)
10535             if (gnubuckets[hn] != 0)
10536               {
10537                 bfd_vma si = gnubuckets[hn];
10538                 bfd_vma off = si - gnusymidx;
10539
10540                 do
10541                   {
10542                     print_dynamic_symbol (si, hn);
10543                     si++;
10544                   }
10545                 while (off < ngnuchains && (gnuchains[off++] & 1) == 0);
10546               }
10547         }
10548     }
10549   else if ((do_dyn_syms || (do_syms && !do_using_dynamic))
10550            && section_headers != NULL)
10551     {
10552       unsigned int i;
10553
10554       for (i = 0, section = section_headers;
10555            i < elf_header.e_shnum;
10556            i++, section++)
10557         {
10558           unsigned int si;
10559           char * strtab = NULL;
10560           unsigned long int strtab_size = 0;
10561           Elf_Internal_Sym * symtab;
10562           Elf_Internal_Sym * psym;
10563           unsigned long num_syms;
10564
10565           if ((section->sh_type != SHT_SYMTAB
10566                && section->sh_type != SHT_DYNSYM)
10567               || (!do_syms
10568                   && section->sh_type == SHT_SYMTAB))
10569             continue;
10570
10571           if (section->sh_entsize == 0)
10572             {
10573               printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
10574                       printable_section_name (section));
10575               continue;
10576             }
10577
10578           printf (_("\nSymbol table '%s' contains %lu entries:\n"),
10579                   printable_section_name (section),
10580                   (unsigned long) (section->sh_size / section->sh_entsize));
10581
10582           if (is_32bit_elf)
10583             printf (_("   Num:    Value  Size Type    Bind   Vis      Ndx Name\n"));
10584           else
10585             printf (_("   Num:    Value          Size Type    Bind   Vis      Ndx Name\n"));
10586
10587           symtab = GET_ELF_SYMBOLS (file, section, & num_syms);
10588           if (symtab == NULL)
10589             continue;
10590
10591           if (section->sh_link == elf_header.e_shstrndx)
10592             {
10593               strtab = string_table;
10594               strtab_size = string_table_length;
10595             }
10596           else if (section->sh_link < elf_header.e_shnum)
10597             {
10598               Elf_Internal_Shdr * string_sec;
10599
10600               string_sec = section_headers + section->sh_link;
10601
10602               strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
10603                                           1, string_sec->sh_size,
10604                                           _("string table"));
10605               strtab_size = strtab != NULL ? string_sec->sh_size : 0;
10606             }
10607
10608           for (si = 0, psym = symtab; si < num_syms; si++, psym++)
10609             {
10610               const char *version_string;
10611               enum versioned_symbol_info sym_info;
10612               unsigned short vna_other;
10613
10614               printf ("%6d: ", si);
10615               print_vma (psym->st_value, LONG_HEX);
10616               putchar (' ');
10617               print_vma (psym->st_size, DEC_5);
10618               printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
10619               printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
10620               printf (" %-7s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
10621               /* Check to see if any other bits in the st_other field are set.
10622                  Note - displaying this information disrupts the layout of the
10623                  table being generated, but for the moment this case is very rare.  */
10624               if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
10625                 printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
10626               printf (" %4s ", get_symbol_index_type (psym->st_shndx));
10627               print_symbol (25, psym->st_name < strtab_size
10628                             ? strtab + psym->st_name : _("<corrupt>"));
10629
10630               version_string
10631                 = get_symbol_version_string (file,
10632                                              section->sh_type == SHT_DYNSYM,
10633                                              strtab, strtab_size, si,
10634                                              psym, &sym_info, &vna_other);
10635               if (version_string)
10636                 {
10637                   if (sym_info == symbol_undefined)
10638                     printf ("@%s (%d)", version_string, vna_other);
10639                   else
10640                     printf (sym_info == symbol_hidden ? "@%s" : "@@%s",
10641                             version_string);
10642                 }
10643
10644               putchar ('\n');
10645             }
10646
10647           free (symtab);
10648           if (strtab != string_table)
10649             free (strtab);
10650         }
10651     }
10652   else if (do_syms)
10653     printf
10654       (_("\nDynamic symbol information is not available for displaying symbols.\n"));
10655
10656   if (do_histogram && buckets != NULL)
10657     {
10658       unsigned long * lengths;
10659       unsigned long * counts;
10660       unsigned long hn;
10661       bfd_vma si;
10662       unsigned long maxlength = 0;
10663       unsigned long nzero_counts = 0;
10664       unsigned long nsyms = 0;
10665
10666       printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
10667               (unsigned long) nbuckets);
10668
10669       lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
10670       if (lengths == NULL)
10671         {
10672           error (_("Out of memory allocating space for histogram buckets\n"));
10673           return 0;
10674         }
10675
10676       printf (_(" Length  Number     %% of total  Coverage\n"));
10677       for (hn = 0; hn < nbuckets; ++hn)
10678         {
10679           for (si = buckets[hn]; si > 0 && si < nchains; si = chains[si])
10680             {
10681               ++nsyms;
10682               if (maxlength < ++lengths[hn])
10683                 ++maxlength;
10684
10685               /* PR binutils/17531: A corrupt binary could contain broken
10686                  histogram data.  Do not go into an infinite loop trying
10687                  to process it.  */
10688               if (chains[si] == si)
10689                 {
10690                   error (_("histogram chain links to itself\n"));
10691                   break;
10692                 }
10693             }
10694         }
10695
10696       counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
10697       if (counts == NULL)
10698         {
10699           free (lengths);
10700           error (_("Out of memory allocating space for histogram counts\n"));
10701           return 0;
10702         }
10703
10704       for (hn = 0; hn < nbuckets; ++hn)
10705         ++counts[lengths[hn]];
10706
10707       if (nbuckets > 0)
10708         {
10709           unsigned long i;
10710           printf ("      0  %-10lu (%5.1f%%)\n",
10711                   counts[0], (counts[0] * 100.0) / nbuckets);
10712           for (i = 1; i <= maxlength; ++i)
10713             {
10714               nzero_counts += counts[i] * i;
10715               printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
10716                       i, counts[i], (counts[i] * 100.0) / nbuckets,
10717                       (nzero_counts * 100.0) / nsyms);
10718             }
10719         }
10720
10721       free (counts);
10722       free (lengths);
10723     }
10724
10725   if (buckets != NULL)
10726     {
10727       free (buckets);
10728       free (chains);
10729     }
10730
10731   if (do_histogram && gnubuckets != NULL)
10732     {
10733       unsigned long * lengths;
10734       unsigned long * counts;
10735       unsigned long hn;
10736       unsigned long maxlength = 0;
10737       unsigned long nzero_counts = 0;
10738       unsigned long nsyms = 0;
10739
10740       printf (_("\nHistogram for `.gnu.hash' bucket list length (total of %lu buckets):\n"),
10741               (unsigned long) ngnubuckets);
10742
10743       lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
10744       if (lengths == NULL)
10745         {
10746           error (_("Out of memory allocating space for gnu histogram buckets\n"));
10747           return 0;
10748         }
10749
10750       printf (_(" Length  Number     %% of total  Coverage\n"));
10751
10752       for (hn = 0; hn < ngnubuckets; ++hn)
10753         if (gnubuckets[hn] != 0)
10754           {
10755             bfd_vma off, length = 1;
10756
10757             for (off = gnubuckets[hn] - gnusymidx;
10758                  /* PR 17531 file: 010-77222-0.004.  */
10759                  off < ngnuchains && (gnuchains[off] & 1) == 0;
10760                  ++off)
10761               ++length;
10762             lengths[hn] = length;
10763             if (length > maxlength)
10764               maxlength = length;
10765             nsyms += length;
10766           }
10767
10768       counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
10769       if (counts == NULL)
10770         {
10771           free (lengths);
10772           error (_("Out of memory allocating space for gnu histogram counts\n"));
10773           return 0;
10774         }
10775
10776       for (hn = 0; hn < ngnubuckets; ++hn)
10777         ++counts[lengths[hn]];
10778
10779       if (ngnubuckets > 0)
10780         {
10781           unsigned long j;
10782           printf ("      0  %-10lu (%5.1f%%)\n",
10783                   counts[0], (counts[0] * 100.0) / ngnubuckets);
10784           for (j = 1; j <= maxlength; ++j)
10785             {
10786               nzero_counts += counts[j] * j;
10787               printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
10788                       j, counts[j], (counts[j] * 100.0) / ngnubuckets,
10789                       (nzero_counts * 100.0) / nsyms);
10790             }
10791         }
10792
10793       free (counts);
10794       free (lengths);
10795       free (gnubuckets);
10796       free (gnuchains);
10797     }
10798
10799   return 1;
10800 }
10801
10802 static int
10803 process_syminfo (FILE * file ATTRIBUTE_UNUSED)
10804 {
10805   unsigned int i;
10806
10807   if (dynamic_syminfo == NULL
10808       || !do_dynamic)
10809     /* No syminfo, this is ok.  */
10810     return 1;
10811
10812   /* There better should be a dynamic symbol section.  */
10813   if (dynamic_symbols == NULL || dynamic_strings == NULL)
10814     return 0;
10815
10816   if (dynamic_addr)
10817     printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
10818             dynamic_syminfo_offset, dynamic_syminfo_nent);
10819
10820   printf (_(" Num: Name                           BoundTo     Flags\n"));
10821   for (i = 0; i < dynamic_syminfo_nent; ++i)
10822     {
10823       unsigned short int flags = dynamic_syminfo[i].si_flags;
10824
10825       printf ("%4d: ", i);
10826       if (i >= num_dynamic_syms)
10827         printf (_("<corrupt index>"));
10828       else if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
10829         print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
10830       else
10831         printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
10832       putchar (' ');
10833
10834       switch (dynamic_syminfo[i].si_boundto)
10835         {
10836         case SYMINFO_BT_SELF:
10837           fputs ("SELF       ", stdout);
10838           break;
10839         case SYMINFO_BT_PARENT:
10840           fputs ("PARENT     ", stdout);
10841           break;
10842         default:
10843           if (dynamic_syminfo[i].si_boundto > 0
10844               && dynamic_syminfo[i].si_boundto < dynamic_nent
10845               && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
10846             {
10847               print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
10848               putchar (' ' );
10849             }
10850           else
10851             printf ("%-10d ", dynamic_syminfo[i].si_boundto);
10852           break;
10853         }
10854
10855       if (flags & SYMINFO_FLG_DIRECT)
10856         printf (" DIRECT");
10857       if (flags & SYMINFO_FLG_PASSTHRU)
10858         printf (" PASSTHRU");
10859       if (flags & SYMINFO_FLG_COPY)
10860         printf (" COPY");
10861       if (flags & SYMINFO_FLG_LAZYLOAD)
10862         printf (" LAZYLOAD");
10863
10864       puts ("");
10865     }
10866
10867   return 1;
10868 }
10869
10870 /* Check to see if the given reloc needs to be handled in a target specific
10871    manner.  If so then process the reloc and return TRUE otherwise return
10872    FALSE.  */
10873
10874 static bfd_boolean
10875 target_specific_reloc_handling (Elf_Internal_Rela * reloc,
10876                                 unsigned char *     start,
10877                                 Elf_Internal_Sym *  symtab)
10878 {
10879   unsigned int reloc_type = get_reloc_type (reloc->r_info);
10880
10881   switch (elf_header.e_machine)
10882     {
10883     case EM_MSP430:
10884     case EM_MSP430_OLD:
10885       {
10886         static Elf_Internal_Sym * saved_sym = NULL;
10887
10888         switch (reloc_type)
10889           {
10890           case 10: /* R_MSP430_SYM_DIFF */
10891             if (uses_msp430x_relocs ())
10892               break;
10893           case 21: /* R_MSP430X_SYM_DIFF */
10894             saved_sym = symtab + get_reloc_symindex (reloc->r_info);
10895             return TRUE;
10896
10897           case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
10898           case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
10899             goto handle_sym_diff;
10900
10901           case 5: /* R_MSP430_16_BYTE */
10902           case 9: /* R_MSP430_8 */
10903             if (uses_msp430x_relocs ())
10904               break;
10905             goto handle_sym_diff;
10906
10907           case 2: /* R_MSP430_ABS16 */
10908           case 15: /* R_MSP430X_ABS16 */
10909             if (! uses_msp430x_relocs ())
10910               break;
10911             goto handle_sym_diff;
10912
10913           handle_sym_diff:
10914             if (saved_sym != NULL)
10915               {
10916                 bfd_vma value;
10917
10918                 value = reloc->r_addend
10919                   + (symtab[get_reloc_symindex (reloc->r_info)].st_value
10920                      - saved_sym->st_value);
10921
10922                 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
10923
10924                 saved_sym = NULL;
10925                 return TRUE;
10926               }
10927             break;
10928
10929           default:
10930             if (saved_sym != NULL)
10931               error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc\n"));
10932             break;
10933           }
10934         break;
10935       }
10936
10937     case EM_MN10300:
10938     case EM_CYGNUS_MN10300:
10939       {
10940         static Elf_Internal_Sym * saved_sym = NULL;
10941
10942         switch (reloc_type)
10943           {
10944           case 34: /* R_MN10300_ALIGN */
10945             return TRUE;
10946           case 33: /* R_MN10300_SYM_DIFF */
10947             saved_sym = symtab + get_reloc_symindex (reloc->r_info);
10948             return TRUE;
10949           case 1: /* R_MN10300_32 */
10950           case 2: /* R_MN10300_16 */
10951             if (saved_sym != NULL)
10952               {
10953                 bfd_vma value;
10954
10955                 value = reloc->r_addend
10956                   + (symtab[get_reloc_symindex (reloc->r_info)].st_value
10957                      - saved_sym->st_value);
10958
10959                 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
10960
10961                 saved_sym = NULL;
10962                 return TRUE;
10963               }
10964             break;
10965           default:
10966             if (saved_sym != NULL)
10967               error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc\n"));
10968             break;
10969           }
10970         break;
10971       }
10972     }
10973
10974   return FALSE;
10975 }
10976
10977 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
10978    DWARF debug sections.  This is a target specific test.  Note - we do not
10979    go through the whole including-target-headers-multiple-times route, (as
10980    we have already done with <elf/h8.h>) because this would become very
10981    messy and even then this function would have to contain target specific
10982    information (the names of the relocs instead of their numeric values).
10983    FIXME: This is not the correct way to solve this problem.  The proper way
10984    is to have target specific reloc sizing and typing functions created by
10985    the reloc-macros.h header, in the same way that it already creates the
10986    reloc naming functions.  */
10987
10988 static bfd_boolean
10989 is_32bit_abs_reloc (unsigned int reloc_type)
10990 {
10991   switch (elf_header.e_machine)
10992     {
10993     case EM_386:
10994     case EM_486:
10995       return reloc_type == 1; /* R_386_32.  */
10996     case EM_68K:
10997       return reloc_type == 1; /* R_68K_32.  */
10998     case EM_860:
10999       return reloc_type == 1; /* R_860_32.  */
11000     case EM_960:
11001       return reloc_type == 2; /* R_960_32.  */
11002     case EM_AARCH64:
11003       return reloc_type == 258; /* R_AARCH64_ABS32 */
11004     case EM_ALPHA:
11005       return reloc_type == 1; /* R_ALPHA_REFLONG.  */
11006     case EM_ARC:
11007       return reloc_type == 1; /* R_ARC_32.  */
11008     case EM_ARM:
11009       return reloc_type == 2; /* R_ARM_ABS32 */
11010     case EM_AVR_OLD:
11011     case EM_AVR:
11012       return reloc_type == 1;
11013     case EM_ADAPTEVA_EPIPHANY:
11014       return reloc_type == 3;
11015     case EM_BLACKFIN:
11016       return reloc_type == 0x12; /* R_byte4_data.  */
11017     case EM_CRIS:
11018       return reloc_type == 3; /* R_CRIS_32.  */
11019     case EM_CR16:
11020       return reloc_type == 3; /* R_CR16_NUM32.  */
11021     case EM_CRX:
11022       return reloc_type == 15; /* R_CRX_NUM32.  */
11023     case EM_CYGNUS_FRV:
11024       return reloc_type == 1;
11025     case EM_CYGNUS_D10V:
11026     case EM_D10V:
11027       return reloc_type == 6; /* R_D10V_32.  */
11028     case EM_CYGNUS_D30V:
11029     case EM_D30V:
11030       return reloc_type == 12; /* R_D30V_32_NORMAL.  */
11031     case EM_DLX:
11032       return reloc_type == 3; /* R_DLX_RELOC_32.  */
11033     case EM_CYGNUS_FR30:
11034     case EM_FR30:
11035       return reloc_type == 3; /* R_FR30_32.  */
11036     case EM_H8S:
11037     case EM_H8_300:
11038     case EM_H8_300H:
11039       return reloc_type == 1; /* R_H8_DIR32.  */
11040     case EM_IA_64:
11041       return reloc_type == 0x65; /* R_IA64_SECREL32LSB.  */
11042     case EM_IP2K_OLD:
11043     case EM_IP2K:
11044       return reloc_type == 2; /* R_IP2K_32.  */
11045     case EM_IQ2000:
11046       return reloc_type == 2; /* R_IQ2000_32.  */
11047     case EM_LATTICEMICO32:
11048       return reloc_type == 3; /* R_LM32_32.  */
11049     case EM_M32C_OLD:
11050     case EM_M32C:
11051       return reloc_type == 3; /* R_M32C_32.  */
11052     case EM_M32R:
11053       return reloc_type == 34; /* R_M32R_32_RELA.  */
11054     case EM_MCORE:
11055       return reloc_type == 1; /* R_MCORE_ADDR32.  */
11056     case EM_CYGNUS_MEP:
11057       return reloc_type == 4; /* R_MEP_32.  */
11058     case EM_METAG:
11059       return reloc_type == 2; /* R_METAG_ADDR32.  */
11060     case EM_MICROBLAZE:
11061       return reloc_type == 1; /* R_MICROBLAZE_32.  */
11062     case EM_MIPS:
11063       return reloc_type == 2; /* R_MIPS_32.  */
11064     case EM_MMIX:
11065       return reloc_type == 4; /* R_MMIX_32.  */
11066     case EM_CYGNUS_MN10200:
11067     case EM_MN10200:
11068       return reloc_type == 1; /* R_MN10200_32.  */
11069     case EM_CYGNUS_MN10300:
11070     case EM_MN10300:
11071       return reloc_type == 1; /* R_MN10300_32.  */
11072     case EM_MOXIE:
11073       return reloc_type == 1; /* R_MOXIE_32.  */
11074     case EM_MSP430_OLD:
11075     case EM_MSP430:
11076       return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32.  */
11077     case EM_MT:
11078       return reloc_type == 2; /* R_MT_32.  */
11079     case EM_NDS32:
11080       return reloc_type == 20; /* R_NDS32_RELA.  */
11081     case EM_ALTERA_NIOS2:
11082       return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32.  */
11083     case EM_NIOS32:
11084       return reloc_type == 1; /* R_NIOS_32.  */
11085     case EM_OR1K:
11086       return reloc_type == 1; /* R_OR1K_32.  */
11087     case EM_PARISC:
11088       return (reloc_type == 1 /* R_PARISC_DIR32.  */
11089               || reloc_type == 41); /* R_PARISC_SECREL32.  */
11090     case EM_PJ:
11091     case EM_PJ_OLD:
11092       return reloc_type == 1; /* R_PJ_DATA_DIR32.  */
11093     case EM_PPC64:
11094       return reloc_type == 1; /* R_PPC64_ADDR32.  */
11095     case EM_PPC:
11096       return reloc_type == 1; /* R_PPC_ADDR32.  */
11097     case EM_RL78:
11098       return reloc_type == 1; /* R_RL78_DIR32.  */
11099     case EM_RX:
11100       return reloc_type == 1; /* R_RX_DIR32.  */
11101     case EM_S370:
11102       return reloc_type == 1; /* R_I370_ADDR31.  */
11103     case EM_S390_OLD:
11104     case EM_S390:
11105       return reloc_type == 4; /* R_S390_32.  */
11106     case EM_SCORE:
11107       return reloc_type == 8; /* R_SCORE_ABS32.  */
11108     case EM_SH:
11109       return reloc_type == 1; /* R_SH_DIR32.  */
11110     case EM_SPARC32PLUS:
11111     case EM_SPARCV9:
11112     case EM_SPARC:
11113       return reloc_type == 3 /* R_SPARC_32.  */
11114         || reloc_type == 23; /* R_SPARC_UA32.  */
11115     case EM_SPU:
11116       return reloc_type == 6; /* R_SPU_ADDR32 */
11117     case EM_TI_C6000:
11118       return reloc_type == 1; /* R_C6000_ABS32.  */
11119     case EM_TILEGX:
11120       return reloc_type == 2; /* R_TILEGX_32.  */
11121     case EM_TILEPRO:
11122       return reloc_type == 1; /* R_TILEPRO_32.  */
11123     case EM_CYGNUS_V850:
11124     case EM_V850:
11125       return reloc_type == 6; /* R_V850_ABS32.  */
11126     case EM_V800:
11127       return reloc_type == 0x33; /* R_V810_WORD.  */
11128     case EM_VAX:
11129       return reloc_type == 1; /* R_VAX_32.  */
11130     case EM_VISIUM:
11131       return reloc_type == 3;  /* R_VISIUM_32. */
11132     case EM_X86_64:
11133     case EM_L1OM:
11134     case EM_K1OM:
11135       return reloc_type == 10; /* R_X86_64_32.  */
11136     case EM_XC16X:
11137     case EM_C166:
11138       return reloc_type == 3; /* R_XC16C_ABS_32.  */
11139     case EM_XGATE:
11140       return reloc_type == 4; /* R_XGATE_32.  */
11141     case EM_XSTORMY16:
11142       return reloc_type == 1; /* R_XSTROMY16_32.  */
11143     case EM_XTENSA_OLD:
11144     case EM_XTENSA:
11145       return reloc_type == 1; /* R_XTENSA_32.  */
11146     default:
11147       {
11148         static unsigned int prev_warn = 0;
11149
11150         /* Avoid repeating the same warning multiple times.  */
11151         if (prev_warn != elf_header.e_machine)
11152           error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
11153                  elf_header.e_machine);
11154         prev_warn = elf_header.e_machine;
11155         return FALSE;
11156       }
11157     }
11158 }
11159
11160 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11161    a 32-bit pc-relative RELA relocation used in DWARF debug sections.  */
11162
11163 static bfd_boolean
11164 is_32bit_pcrel_reloc (unsigned int reloc_type)
11165 {
11166   switch (elf_header.e_machine)
11167     {
11168     case EM_386:
11169     case EM_486:
11170       return reloc_type == 2;  /* R_386_PC32.  */
11171     case EM_68K:
11172       return reloc_type == 4;  /* R_68K_PC32.  */
11173     case EM_AARCH64:
11174       return reloc_type == 261; /* R_AARCH64_PREL32 */
11175     case EM_ADAPTEVA_EPIPHANY:
11176       return reloc_type == 6;
11177     case EM_ALPHA:
11178       return reloc_type == 10; /* R_ALPHA_SREL32.  */
11179     case EM_ARM:
11180       return reloc_type == 3;  /* R_ARM_REL32 */
11181     case EM_MICROBLAZE:
11182       return reloc_type == 2;  /* R_MICROBLAZE_32_PCREL.  */
11183     case EM_OR1K:
11184       return reloc_type == 9; /* R_OR1K_32_PCREL.  */
11185     case EM_PARISC:
11186       return reloc_type == 9;  /* R_PARISC_PCREL32.  */
11187     case EM_PPC:
11188       return reloc_type == 26; /* R_PPC_REL32.  */
11189     case EM_PPC64:
11190       return reloc_type == 26; /* R_PPC64_REL32.  */
11191     case EM_S390_OLD:
11192     case EM_S390:
11193       return reloc_type == 5;  /* R_390_PC32.  */
11194     case EM_SH:
11195       return reloc_type == 2;  /* R_SH_REL32.  */
11196     case EM_SPARC32PLUS:
11197     case EM_SPARCV9:
11198     case EM_SPARC:
11199       return reloc_type == 6;  /* R_SPARC_DISP32.  */
11200     case EM_SPU:
11201       return reloc_type == 13; /* R_SPU_REL32.  */
11202     case EM_TILEGX:
11203       return reloc_type == 6; /* R_TILEGX_32_PCREL.  */
11204     case EM_TILEPRO:
11205       return reloc_type == 4; /* R_TILEPRO_32_PCREL.  */
11206     case EM_VISIUM:
11207       return reloc_type == 6;  /* R_VISIUM_32_PCREL */
11208     case EM_X86_64:
11209     case EM_L1OM:
11210     case EM_K1OM:
11211       return reloc_type == 2;  /* R_X86_64_PC32.  */
11212     case EM_XTENSA_OLD:
11213     case EM_XTENSA:
11214       return reloc_type == 14; /* R_XTENSA_32_PCREL.  */
11215     default:
11216       /* Do not abort or issue an error message here.  Not all targets use
11217          pc-relative 32-bit relocs in their DWARF debug information and we
11218          have already tested for target coverage in is_32bit_abs_reloc.  A
11219          more helpful warning message will be generated by apply_relocations
11220          anyway, so just return.  */
11221       return FALSE;
11222     }
11223 }
11224
11225 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11226    a 64-bit absolute RELA relocation used in DWARF debug sections.  */
11227
11228 static bfd_boolean
11229 is_64bit_abs_reloc (unsigned int reloc_type)
11230 {
11231   switch (elf_header.e_machine)
11232     {
11233     case EM_AARCH64:
11234       return reloc_type == 257; /* R_AARCH64_ABS64.  */
11235     case EM_ALPHA:
11236       return reloc_type == 2; /* R_ALPHA_REFQUAD.  */
11237     case EM_IA_64:
11238       return reloc_type == 0x27; /* R_IA64_DIR64LSB.  */
11239     case EM_PARISC:
11240       return reloc_type == 80; /* R_PARISC_DIR64.  */
11241     case EM_PPC64:
11242       return reloc_type == 38; /* R_PPC64_ADDR64.  */
11243     case EM_SPARC32PLUS:
11244     case EM_SPARCV9:
11245     case EM_SPARC:
11246       return reloc_type == 54; /* R_SPARC_UA64.  */
11247     case EM_X86_64:
11248     case EM_L1OM:
11249     case EM_K1OM:
11250       return reloc_type == 1; /* R_X86_64_64.  */
11251     case EM_S390_OLD:
11252     case EM_S390:
11253       return reloc_type == 22;  /* R_S390_64.  */
11254     case EM_TILEGX:
11255       return reloc_type == 1; /* R_TILEGX_64.  */
11256     case EM_MIPS:
11257       return reloc_type == 18;  /* R_MIPS_64.  */
11258     default:
11259       return FALSE;
11260     }
11261 }
11262
11263 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
11264    a 64-bit pc-relative RELA relocation used in DWARF debug sections.  */
11265
11266 static bfd_boolean
11267 is_64bit_pcrel_reloc (unsigned int reloc_type)
11268 {
11269   switch (elf_header.e_machine)
11270     {
11271     case EM_AARCH64:
11272       return reloc_type == 260; /* R_AARCH64_PREL64.  */
11273     case EM_ALPHA:
11274       return reloc_type == 11; /* R_ALPHA_SREL64.  */
11275     case EM_IA_64:
11276       return reloc_type == 0x4f; /* R_IA64_PCREL64LSB.  */
11277     case EM_PARISC:
11278       return reloc_type == 72; /* R_PARISC_PCREL64.  */
11279     case EM_PPC64:
11280       return reloc_type == 44; /* R_PPC64_REL64.  */
11281     case EM_SPARC32PLUS:
11282     case EM_SPARCV9:
11283     case EM_SPARC:
11284       return reloc_type == 46; /* R_SPARC_DISP64.  */
11285     case EM_X86_64:
11286     case EM_L1OM:
11287     case EM_K1OM:
11288       return reloc_type == 24; /* R_X86_64_PC64.  */
11289     case EM_S390_OLD:
11290     case EM_S390:
11291       return reloc_type == 23;  /* R_S390_PC64.  */
11292     case EM_TILEGX:
11293       return reloc_type == 5;  /* R_TILEGX_64_PCREL.  */
11294     default:
11295       return FALSE;
11296     }
11297 }
11298
11299 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11300    a 24-bit absolute RELA relocation used in DWARF debug sections.  */
11301
11302 static bfd_boolean
11303 is_24bit_abs_reloc (unsigned int reloc_type)
11304 {
11305   switch (elf_header.e_machine)
11306     {
11307     case EM_CYGNUS_MN10200:
11308     case EM_MN10200:
11309       return reloc_type == 4; /* R_MN10200_24.  */
11310     default:
11311       return FALSE;
11312     }
11313 }
11314
11315 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11316    a 16-bit absolute RELA relocation used in DWARF debug sections.  */
11317
11318 static bfd_boolean
11319 is_16bit_abs_reloc (unsigned int reloc_type)
11320 {
11321   switch (elf_header.e_machine)
11322     {
11323     case EM_AVR_OLD:
11324     case EM_AVR:
11325       return reloc_type == 4; /* R_AVR_16.  */
11326     case EM_ADAPTEVA_EPIPHANY:
11327       return reloc_type == 5;
11328     case EM_CYGNUS_D10V:
11329     case EM_D10V:
11330       return reloc_type == 3; /* R_D10V_16.  */
11331     case EM_H8S:
11332     case EM_H8_300:
11333     case EM_H8_300H:
11334       return reloc_type == R_H8_DIR16;
11335     case EM_IP2K_OLD:
11336     case EM_IP2K:
11337       return reloc_type == 1; /* R_IP2K_16.  */
11338     case EM_M32C_OLD:
11339     case EM_M32C:
11340       return reloc_type == 1; /* R_M32C_16 */
11341     case EM_MSP430:
11342       if (uses_msp430x_relocs ())
11343         return reloc_type == 2; /* R_MSP430_ABS16.  */
11344     case EM_MSP430_OLD:
11345       return reloc_type == 5; /* R_MSP430_16_BYTE.  */
11346     case EM_NDS32:
11347       return reloc_type == 19; /* R_NDS32_RELA.  */
11348     case EM_ALTERA_NIOS2:
11349       return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16.  */
11350     case EM_NIOS32:
11351       return reloc_type == 9; /* R_NIOS_16.  */
11352     case EM_OR1K:
11353       return reloc_type == 2; /* R_OR1K_16.  */
11354     case EM_TI_C6000:
11355       return reloc_type == 2; /* R_C6000_ABS16.  */
11356     case EM_XC16X:
11357     case EM_C166:
11358       return reloc_type == 2; /* R_XC16C_ABS_16.  */
11359     case EM_CYGNUS_MN10200:
11360     case EM_MN10200:
11361       return reloc_type == 2; /* R_MN10200_16.  */
11362     case EM_CYGNUS_MN10300:
11363     case EM_MN10300:
11364       return reloc_type == 2; /* R_MN10300_16.  */
11365     case EM_VISIUM:
11366       return reloc_type == 2; /* R_VISIUM_16. */
11367     case EM_XGATE:
11368       return reloc_type == 3; /* R_XGATE_16.  */
11369     default:
11370       return FALSE;
11371     }
11372 }
11373
11374 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
11375    relocation entries (possibly formerly used for SHT_GROUP sections).  */
11376
11377 static bfd_boolean
11378 is_none_reloc (unsigned int reloc_type)
11379 {
11380   switch (elf_header.e_machine)
11381     {
11382     case EM_68K:     /* R_68K_NONE.  */
11383     case EM_386:     /* R_386_NONE.  */
11384     case EM_SPARC32PLUS:
11385     case EM_SPARCV9:
11386     case EM_SPARC:   /* R_SPARC_NONE.  */
11387     case EM_MIPS:    /* R_MIPS_NONE.  */
11388     case EM_PARISC:  /* R_PARISC_NONE.  */
11389     case EM_ALPHA:   /* R_ALPHA_NONE.  */
11390     case EM_ADAPTEVA_EPIPHANY:
11391     case EM_PPC:     /* R_PPC_NONE.  */
11392     case EM_PPC64:   /* R_PPC64_NONE.  */
11393     case EM_ARM:     /* R_ARM_NONE.  */
11394     case EM_IA_64:   /* R_IA64_NONE.  */
11395     case EM_SH:      /* R_SH_NONE.  */
11396     case EM_S390_OLD:
11397     case EM_S390:    /* R_390_NONE.  */
11398     case EM_CRIS:    /* R_CRIS_NONE.  */
11399     case EM_X86_64:  /* R_X86_64_NONE.  */
11400     case EM_L1OM:    /* R_X86_64_NONE.  */
11401     case EM_K1OM:    /* R_X86_64_NONE.  */
11402     case EM_MN10300: /* R_MN10300_NONE.  */
11403     case EM_MOXIE:   /* R_MOXIE_NONE.  */
11404     case EM_M32R:    /* R_M32R_NONE.  */
11405     case EM_TI_C6000:/* R_C6000_NONE.  */
11406     case EM_TILEGX:  /* R_TILEGX_NONE.  */
11407     case EM_TILEPRO: /* R_TILEPRO_NONE.  */
11408     case EM_XC16X:
11409     case EM_C166:    /* R_XC16X_NONE.  */
11410     case EM_ALTERA_NIOS2: /* R_NIOS2_NONE.  */
11411     case EM_NIOS32:  /* R_NIOS_NONE.  */
11412     case EM_OR1K:    /* R_OR1K_NONE. */
11413       return reloc_type == 0;
11414     case EM_AARCH64:
11415       return reloc_type == 0 || reloc_type == 256;
11416     case EM_NDS32:
11417       return (reloc_type == 0       /* R_XTENSA_NONE.  */
11418               || reloc_type == 204  /* R_NDS32_DIFF8.  */
11419               || reloc_type == 205  /* R_NDS32_DIFF16.  */
11420               || reloc_type == 206  /* R_NDS32_DIFF32.  */
11421               || reloc_type == 207  /* R_NDS32_ULEB128.  */);
11422     case EM_XTENSA_OLD:
11423     case EM_XTENSA:
11424       return (reloc_type == 0      /* R_XTENSA_NONE.  */
11425               || reloc_type == 17  /* R_XTENSA_DIFF8.  */
11426               || reloc_type == 18  /* R_XTENSA_DIFF16.  */
11427               || reloc_type == 19  /* R_XTENSA_DIFF32.  */);
11428     case EM_METAG:
11429       return reloc_type == 3; /* R_METAG_NONE.  */
11430     }
11431   return FALSE;
11432 }
11433
11434 /* Apply relocations to a section.
11435    Note: So far support has been added only for those relocations
11436    which can be found in debug sections.
11437    FIXME: Add support for more relocations ?  */
11438
11439 static void
11440 apply_relocations (void * file,
11441                    Elf_Internal_Shdr * section,
11442                    unsigned char * start)
11443 {
11444   Elf_Internal_Shdr * relsec;
11445   unsigned char * end = start + section->sh_size;
11446
11447   if (elf_header.e_type != ET_REL)
11448     return;
11449
11450   /* Find the reloc section associated with the section.  */
11451   for (relsec = section_headers;
11452        relsec < section_headers + elf_header.e_shnum;
11453        ++relsec)
11454     {
11455       bfd_boolean is_rela;
11456       unsigned long num_relocs;
11457       Elf_Internal_Rela * relocs;
11458       Elf_Internal_Rela * rp;
11459       Elf_Internal_Shdr * symsec;
11460       Elf_Internal_Sym * symtab;
11461       unsigned long num_syms;
11462       Elf_Internal_Sym * sym;
11463
11464       if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
11465           || relsec->sh_info >= elf_header.e_shnum
11466           || section_headers + relsec->sh_info != section
11467           || relsec->sh_size == 0
11468           || relsec->sh_link >= elf_header.e_shnum)
11469         continue;
11470
11471       is_rela = relsec->sh_type == SHT_RELA;
11472
11473       if (is_rela)
11474         {
11475           if (!slurp_rela_relocs ((FILE *) file, relsec->sh_offset,
11476                                   relsec->sh_size, & relocs, & num_relocs))
11477             return;
11478         }
11479       else
11480         {
11481           if (!slurp_rel_relocs ((FILE *) file, relsec->sh_offset,
11482                                  relsec->sh_size, & relocs, & num_relocs))
11483             return;
11484         }
11485
11486       /* SH uses RELA but uses in place value instead of the addend field.  */
11487       if (elf_header.e_machine == EM_SH)
11488         is_rela = FALSE;
11489
11490       symsec = section_headers + relsec->sh_link;
11491       symtab = GET_ELF_SYMBOLS ((FILE *) file, symsec, & num_syms);
11492
11493       for (rp = relocs; rp < relocs + num_relocs; ++rp)
11494         {
11495           bfd_vma         addend;
11496           unsigned int    reloc_type;
11497           unsigned int    reloc_size;
11498           unsigned char * rloc;
11499           unsigned long   sym_index;
11500
11501           reloc_type = get_reloc_type (rp->r_info);
11502
11503           if (target_specific_reloc_handling (rp, start, symtab))
11504             continue;
11505           else if (is_none_reloc (reloc_type))
11506             continue;
11507           else if (is_32bit_abs_reloc (reloc_type)
11508                    || is_32bit_pcrel_reloc (reloc_type))
11509             reloc_size = 4;
11510           else if (is_64bit_abs_reloc (reloc_type)
11511                    || is_64bit_pcrel_reloc (reloc_type))
11512             reloc_size = 8;
11513           else if (is_24bit_abs_reloc (reloc_type))
11514             reloc_size = 3;
11515           else if (is_16bit_abs_reloc (reloc_type))
11516             reloc_size = 2;
11517           else
11518             {
11519               static unsigned int prev_reloc = 0;
11520               if (reloc_type != prev_reloc)
11521                 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
11522                       reloc_type, printable_section_name (section));
11523               prev_reloc = reloc_type;
11524               continue;
11525             }
11526
11527           rloc = start + rp->r_offset;
11528           if ((rloc + reloc_size) > end || (rloc < start))
11529             {
11530               warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
11531                     (unsigned long) rp->r_offset,
11532                     printable_section_name (section));
11533               continue;
11534             }
11535
11536           sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
11537           if (sym_index >= num_syms)
11538             {
11539               warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
11540                     sym_index, printable_section_name (section));
11541               continue;
11542             }
11543           sym = symtab + sym_index;
11544
11545           /* If the reloc has a symbol associated with it,
11546              make sure that it is of an appropriate type.
11547
11548              Relocations against symbols without type can happen.
11549              Gcc -feliminate-dwarf2-dups may generate symbols
11550              without type for debug info.
11551
11552              Icc generates relocations against function symbols
11553              instead of local labels.
11554
11555              Relocations against object symbols can happen, eg when
11556              referencing a global array.  For an example of this see
11557              the _clz.o binary in libgcc.a.  */
11558           if (sym != symtab
11559               && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
11560             {
11561               warn (_("skipping unexpected symbol type %s in %ld'th relocation in section %s\n"),
11562                     get_symbol_type (ELF_ST_TYPE (sym->st_info)),
11563                     (long int)(rp - relocs),
11564                     printable_section_name (relsec));
11565               continue;
11566             }
11567
11568           addend = 0;
11569           if (is_rela)
11570             addend += rp->r_addend;
11571           /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
11572              partial_inplace.  */
11573           if (!is_rela
11574               || (elf_header.e_machine == EM_XTENSA
11575                   && reloc_type == 1)
11576               || ((elf_header.e_machine == EM_PJ
11577                    || elf_header.e_machine == EM_PJ_OLD)
11578                   && reloc_type == 1)
11579               || ((elf_header.e_machine == EM_D30V
11580                    || elf_header.e_machine == EM_CYGNUS_D30V)
11581                   && reloc_type == 12))
11582             addend += byte_get (rloc, reloc_size);
11583
11584           if (is_32bit_pcrel_reloc (reloc_type)
11585               || is_64bit_pcrel_reloc (reloc_type))
11586             {
11587               /* On HPPA, all pc-relative relocations are biased by 8.  */
11588               if (elf_header.e_machine == EM_PARISC)
11589                 addend -= 8;
11590               byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
11591                         reloc_size);
11592             }
11593           else
11594             byte_put (rloc, addend + sym->st_value, reloc_size);
11595         }
11596
11597       free (symtab);
11598       free (relocs);
11599       break;
11600     }
11601 }
11602
11603 #ifdef SUPPORT_DISASSEMBLY
11604 static int
11605 disassemble_section (Elf_Internal_Shdr * section, FILE * file)
11606 {
11607   printf (_("\nAssembly dump of section %s\n"), printable_section_name (section));
11608
11609   /* FIXME: XXX -- to be done --- XXX */
11610
11611   return 1;
11612 }
11613 #endif
11614
11615 /* Reads in the contents of SECTION from FILE, returning a pointer
11616    to a malloc'ed buffer or NULL if something went wrong.  */
11617
11618 static char *
11619 get_section_contents (Elf_Internal_Shdr * section, FILE * file)
11620 {
11621   bfd_size_type num_bytes;
11622
11623   num_bytes = section->sh_size;
11624
11625   if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
11626     {
11627       printf (_("\nSection '%s' has no data to dump.\n"),
11628               printable_section_name (section));
11629       return NULL;
11630     }
11631
11632   return  (char *) get_data (NULL, file, section->sh_offset, 1, num_bytes,
11633                              _("section contents"));
11634 }
11635
11636
11637 static void
11638 dump_section_as_strings (Elf_Internal_Shdr * section, FILE * file)
11639 {
11640   Elf_Internal_Shdr * relsec;
11641   bfd_size_type num_bytes;
11642   char * data;
11643   char * end;
11644   char * start;
11645   bfd_boolean some_strings_shown;
11646
11647   start = get_section_contents (section, file);
11648   if (start == NULL)
11649     return;
11650
11651   printf (_("\nString dump of section '%s':\n"), printable_section_name (section));
11652
11653   /* If the section being dumped has relocations against it the user might
11654      be expecting these relocations to have been applied.  Check for this
11655      case and issue a warning message in order to avoid confusion.
11656      FIXME: Maybe we ought to have an option that dumps a section with
11657      relocs applied ?  */
11658   for (relsec = section_headers;
11659        relsec < section_headers + elf_header.e_shnum;
11660        ++relsec)
11661     {
11662       if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
11663           || relsec->sh_info >= elf_header.e_shnum
11664           || section_headers + relsec->sh_info != section
11665           || relsec->sh_size == 0
11666           || relsec->sh_link >= elf_header.e_shnum)
11667         continue;
11668
11669       printf (_("  Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
11670       break;
11671     }
11672
11673   num_bytes = section->sh_size;
11674   data = start;
11675   end  = start + num_bytes;
11676   some_strings_shown = FALSE;
11677
11678   while (data < end)
11679     {
11680       while (!ISPRINT (* data))
11681         if (++ data >= end)
11682           break;
11683
11684       if (data < end)
11685         {
11686           size_t maxlen = end - data;
11687
11688 #ifndef __MSVCRT__
11689           /* PR 11128: Use two separate invocations in order to work
11690              around bugs in the Solaris 8 implementation of printf.  */
11691           printf ("  [%6tx]  ", data - start);
11692 #else
11693           printf ("  [%6Ix]  ", (size_t) (data - start));
11694 #endif
11695           if (maxlen > 0)
11696             {
11697               print_symbol ((int) maxlen, data);
11698               putchar ('\n');
11699               data += strnlen (data, maxlen);
11700             }
11701           else
11702             {
11703               printf (_("<corrupt>\n"));
11704               data = end;
11705             }
11706           some_strings_shown = TRUE;
11707         }
11708     }
11709
11710   if (! some_strings_shown)
11711     printf (_("  No strings found in this section."));
11712
11713   free (start);
11714
11715   putchar ('\n');
11716 }
11717
11718 static void
11719 dump_section_as_bytes (Elf_Internal_Shdr * section,
11720                        FILE * file,
11721                        bfd_boolean relocate)
11722 {
11723   Elf_Internal_Shdr * relsec;
11724   bfd_size_type bytes;
11725   bfd_vma addr;
11726   unsigned char * data;
11727   unsigned char * start;
11728
11729   start = (unsigned char *) get_section_contents (section, file);
11730   if (start == NULL)
11731     return;
11732
11733   printf (_("\nHex dump of section '%s':\n"), printable_section_name (section));
11734
11735   if (relocate)
11736     {
11737       apply_relocations (file, section, start);
11738     }
11739   else
11740     {
11741       /* If the section being dumped has relocations against it the user might
11742          be expecting these relocations to have been applied.  Check for this
11743          case and issue a warning message in order to avoid confusion.
11744          FIXME: Maybe we ought to have an option that dumps a section with
11745          relocs applied ?  */
11746       for (relsec = section_headers;
11747            relsec < section_headers + elf_header.e_shnum;
11748            ++relsec)
11749         {
11750           if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
11751               || relsec->sh_info >= elf_header.e_shnum
11752               || section_headers + relsec->sh_info != section
11753               || relsec->sh_size == 0
11754               || relsec->sh_link >= elf_header.e_shnum)
11755             continue;
11756
11757           printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
11758           break;
11759         }
11760     }
11761
11762   addr = section->sh_addr;
11763   bytes = section->sh_size;
11764   data = start;
11765
11766   while (bytes)
11767     {
11768       int j;
11769       int k;
11770       int lbytes;
11771
11772       lbytes = (bytes > 16 ? 16 : bytes);
11773
11774       printf ("  0x%8.8lx ", (unsigned long) addr);
11775
11776       for (j = 0; j < 16; j++)
11777         {
11778           if (j < lbytes)
11779             printf ("%2.2x", data[j]);
11780           else
11781             printf ("  ");
11782
11783           if ((j & 3) == 3)
11784             printf (" ");
11785         }
11786
11787       for (j = 0; j < lbytes; j++)
11788         {
11789           k = data[j];
11790           if (k >= ' ' && k < 0x7f)
11791             printf ("%c", k);
11792           else
11793             printf (".");
11794         }
11795
11796       putchar ('\n');
11797
11798       data  += lbytes;
11799       addr  += lbytes;
11800       bytes -= lbytes;
11801     }
11802
11803   free (start);
11804
11805   putchar ('\n');
11806 }
11807
11808 /* Uncompresses a section that was compressed using zlib, in place.  */
11809
11810 static int
11811 uncompress_section_contents (unsigned char **buffer ATTRIBUTE_UNUSED,
11812                              dwarf_size_type *size ATTRIBUTE_UNUSED)
11813 {
11814 #ifndef HAVE_ZLIB_H
11815   return FALSE;
11816 #else
11817   dwarf_size_type compressed_size = *size;
11818   unsigned char * compressed_buffer = *buffer;
11819   dwarf_size_type uncompressed_size;
11820   unsigned char * uncompressed_buffer;
11821   z_stream strm;
11822   int rc;
11823   dwarf_size_type header_size = 12;
11824
11825   /* Read the zlib header.  In this case, it should be "ZLIB" followed
11826      by the uncompressed section size, 8 bytes in big-endian order.  */
11827   if (compressed_size < header_size
11828       || ! streq ((char *) compressed_buffer, "ZLIB"))
11829     return 0;
11830
11831   uncompressed_size = compressed_buffer[4]; uncompressed_size <<= 8;
11832   uncompressed_size += compressed_buffer[5]; uncompressed_size <<= 8;
11833   uncompressed_size += compressed_buffer[6]; uncompressed_size <<= 8;
11834   uncompressed_size += compressed_buffer[7]; uncompressed_size <<= 8;
11835   uncompressed_size += compressed_buffer[8]; uncompressed_size <<= 8;
11836   uncompressed_size += compressed_buffer[9]; uncompressed_size <<= 8;
11837   uncompressed_size += compressed_buffer[10]; uncompressed_size <<= 8;
11838   uncompressed_size += compressed_buffer[11];
11839
11840   /* It is possible the section consists of several compressed
11841      buffers concatenated together, so we uncompress in a loop.  */
11842   strm.zalloc = NULL;
11843   strm.zfree = NULL;
11844   strm.opaque = NULL;
11845   strm.avail_in = compressed_size - header_size;
11846   strm.next_in = (Bytef *) compressed_buffer + header_size;
11847   strm.avail_out = uncompressed_size;
11848   uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
11849
11850   rc = inflateInit (& strm);
11851   while (strm.avail_in > 0)
11852     {
11853       if (rc != Z_OK)
11854         goto fail;
11855       strm.next_out = ((Bytef *) uncompressed_buffer
11856                        + (uncompressed_size - strm.avail_out));
11857       rc = inflate (&strm, Z_FINISH);
11858       if (rc != Z_STREAM_END)
11859         goto fail;
11860       rc = inflateReset (& strm);
11861     }
11862   rc = inflateEnd (& strm);
11863   if (rc != Z_OK
11864       || strm.avail_out != 0)
11865     goto fail;
11866
11867   free (compressed_buffer);
11868   *buffer = uncompressed_buffer;
11869   *size = uncompressed_size;
11870   return 1;
11871
11872  fail:
11873   free (uncompressed_buffer);
11874   /* Indicate decompression failure.  */
11875   *buffer = NULL;
11876   return 0;
11877 #endif  /* HAVE_ZLIB_H */
11878 }
11879
11880 static int
11881 load_specific_debug_section (enum dwarf_section_display_enum debug,
11882                              Elf_Internal_Shdr * sec, void * file)
11883 {
11884   struct dwarf_section * section = &debug_displays [debug].section;
11885   char buf [64];
11886
11887   /* If it is already loaded, do nothing.  */
11888   if (section->start != NULL)
11889     return 1;
11890
11891   snprintf (buf, sizeof (buf), _("%s section data"), section->name);
11892   section->address = sec->sh_addr;
11893   section->user_data = NULL;
11894   section->start = (unsigned char *) get_data (NULL, (FILE *) file,
11895                                                sec->sh_offset, 1,
11896                                                sec->sh_size, buf);
11897   if (section->start == NULL)
11898     section->size = 0;
11899   else
11900     {
11901       section->size = sec->sh_size;
11902       if (uncompress_section_contents (&section->start, &section->size))
11903         sec->sh_size = section->size;
11904     }
11905
11906   if (section->start == NULL)
11907     return 0;
11908
11909   if (debug_displays [debug].relocate)
11910     apply_relocations ((FILE *) file, sec, section->start);
11911
11912   return 1;
11913 }
11914
11915 /* If this is not NULL, load_debug_section will only look for sections
11916    within the list of sections given here.  */
11917 unsigned int *section_subset = NULL;
11918
11919 int
11920 load_debug_section (enum dwarf_section_display_enum debug, void * file)
11921 {
11922   struct dwarf_section * section = &debug_displays [debug].section;
11923   Elf_Internal_Shdr * sec;
11924
11925   /* Locate the debug section.  */
11926   sec = find_section_in_set (section->uncompressed_name, section_subset);
11927   if (sec != NULL)
11928     section->name = section->uncompressed_name;
11929   else
11930     {
11931       sec = find_section_in_set (section->compressed_name, section_subset);
11932       if (sec != NULL)
11933         section->name = section->compressed_name;
11934     }
11935   if (sec == NULL)
11936     return 0;
11937
11938   /* If we're loading from a subset of sections, and we've loaded
11939      a section matching this name before, it's likely that it's a
11940      different one.  */
11941   if (section_subset != NULL)
11942     free_debug_section (debug);
11943
11944   return load_specific_debug_section (debug, sec, (FILE *) file);
11945 }
11946
11947 void
11948 free_debug_section (enum dwarf_section_display_enum debug)
11949 {
11950   struct dwarf_section * section = &debug_displays [debug].section;
11951
11952   if (section->start == NULL)
11953     return;
11954
11955   free ((char *) section->start);
11956   section->start = NULL;
11957   section->address = 0;
11958   section->size = 0;
11959 }
11960
11961 static int
11962 display_debug_section (int shndx, Elf_Internal_Shdr * section, FILE * file)
11963 {
11964   char * name = SECTION_NAME (section);
11965   const char * print_name = printable_section_name (section);
11966   bfd_size_type length;
11967   int result = 1;
11968   int i;
11969
11970   length = section->sh_size;
11971   if (length == 0)
11972     {
11973       printf (_("\nSection '%s' has no debugging data.\n"), print_name);
11974       return 0;
11975     }
11976   if (section->sh_type == SHT_NOBITS)
11977     {
11978       /* There is no point in dumping the contents of a debugging section
11979          which has the NOBITS type - the bits in the file will be random.
11980          This can happen when a file containing a .eh_frame section is
11981          stripped with the --only-keep-debug command line option.  */
11982       printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"),
11983               print_name);
11984       return 0;
11985     }
11986
11987   if (const_strneq (name, ".gnu.linkonce.wi."))
11988     name = ".debug_info";
11989
11990   /* See if we know how to display the contents of this section.  */
11991   for (i = 0; i < max; i++)
11992     if (streq (debug_displays[i].section.uncompressed_name, name)
11993         || (i == line && const_strneq (name, ".debug_line."))
11994         || streq (debug_displays[i].section.compressed_name, name))
11995       {
11996         struct dwarf_section * sec = &debug_displays [i].section;
11997         int secondary = (section != find_section (name));
11998
11999         if (secondary)
12000           free_debug_section ((enum dwarf_section_display_enum) i);
12001
12002         if (i == line && const_strneq (name, ".debug_line."))
12003           sec->name = name;
12004         else if (streq (sec->uncompressed_name, name))
12005           sec->name = sec->uncompressed_name;
12006         else
12007           sec->name = sec->compressed_name;
12008         if (load_specific_debug_section ((enum dwarf_section_display_enum) i,
12009                                          section, file))
12010           {
12011             /* If this debug section is part of a CU/TU set in a .dwp file,
12012                restrict load_debug_section to the sections in that set.  */
12013             section_subset = find_cu_tu_set (file, shndx);
12014
12015             result &= debug_displays[i].display (sec, file);
12016
12017             section_subset = NULL;
12018
12019             if (secondary || (i != info && i != abbrev))
12020               free_debug_section ((enum dwarf_section_display_enum) i);
12021           }
12022
12023         break;
12024       }
12025
12026   if (i == max)
12027     {
12028       printf (_("Unrecognized debug section: %s\n"), print_name);
12029       result = 0;
12030     }
12031
12032   return result;
12033 }
12034
12035 /* Set DUMP_SECTS for all sections where dumps were requested
12036    based on section name.  */
12037
12038 static void
12039 initialise_dumps_byname (void)
12040 {
12041   struct dump_list_entry * cur;
12042
12043   for (cur = dump_sects_byname; cur; cur = cur->next)
12044     {
12045       unsigned int i;
12046       int any;
12047
12048       for (i = 0, any = 0; i < elf_header.e_shnum; i++)
12049         if (streq (SECTION_NAME (section_headers + i), cur->name))
12050           {
12051             request_dump_bynumber (i, cur->type);
12052             any = 1;
12053           }
12054
12055       if (!any)
12056         warn (_("Section '%s' was not dumped because it does not exist!\n"),
12057               cur->name);
12058     }
12059 }
12060
12061 static void
12062 process_section_contents (FILE * file)
12063 {
12064   Elf_Internal_Shdr * section;
12065   unsigned int i;
12066
12067   if (! do_dump)
12068     return;
12069
12070   initialise_dumps_byname ();
12071
12072   for (i = 0, section = section_headers;
12073        i < elf_header.e_shnum && i < num_dump_sects;
12074        i++, section++)
12075     {
12076 #ifdef SUPPORT_DISASSEMBLY
12077       if (dump_sects[i] & DISASS_DUMP)
12078         disassemble_section (section, file);
12079 #endif
12080       if (dump_sects[i] & HEX_DUMP)
12081         dump_section_as_bytes (section, file, FALSE);
12082
12083       if (dump_sects[i] & RELOC_DUMP)
12084         dump_section_as_bytes (section, file, TRUE);
12085
12086       if (dump_sects[i] & STRING_DUMP)
12087         dump_section_as_strings (section, file);
12088
12089       if (dump_sects[i] & DEBUG_DUMP)
12090         display_debug_section (i, section, file);
12091     }
12092
12093   /* Check to see if the user requested a
12094      dump of a section that does not exist.  */
12095   while (i++ < num_dump_sects)
12096     if (dump_sects[i])
12097       warn (_("Section %d was not dumped because it does not exist!\n"), i);
12098 }
12099
12100 static void
12101 process_mips_fpe_exception (int mask)
12102 {
12103   if (mask)
12104     {
12105       int first = 1;
12106       if (mask & OEX_FPU_INEX)
12107         fputs ("INEX", stdout), first = 0;
12108       if (mask & OEX_FPU_UFLO)
12109         printf ("%sUFLO", first ? "" : "|"), first = 0;
12110       if (mask & OEX_FPU_OFLO)
12111         printf ("%sOFLO", first ? "" : "|"), first = 0;
12112       if (mask & OEX_FPU_DIV0)
12113         printf ("%sDIV0", first ? "" : "|"), first = 0;
12114       if (mask & OEX_FPU_INVAL)
12115         printf ("%sINVAL", first ? "" : "|");
12116     }
12117   else
12118     fputs ("0", stdout);
12119 }
12120
12121 /* Display's the value of TAG at location P.  If TAG is
12122    greater than 0 it is assumed to be an unknown tag, and
12123    a message is printed to this effect.  Otherwise it is
12124    assumed that a message has already been printed.
12125
12126    If the bottom bit of TAG is set it assumed to have a
12127    string value, otherwise it is assumed to have an integer
12128    value.
12129
12130    Returns an updated P pointing to the first unread byte
12131    beyond the end of TAG's value.
12132
12133    Reads at or beyond END will not be made.  */
12134
12135 static unsigned char *
12136 display_tag_value (int tag,
12137                    unsigned char * p,
12138                    const unsigned char * const end)
12139 {
12140   unsigned long val;
12141
12142   if (tag > 0)
12143     printf ("  Tag_unknown_%d: ", tag);
12144
12145   if (p >= end)
12146     {
12147       warn (_("<corrupt tag>\n"));
12148     }
12149   else if (tag & 1)
12150     {
12151       /* PR 17531 file: 027-19978-0.004.  */
12152       size_t maxlen = (end - p) - 1;
12153
12154       putchar ('"');
12155       if (maxlen > 0)
12156         {
12157           print_symbol ((int) maxlen, (const char *) p);
12158           p += strnlen ((char *) p, maxlen) + 1;
12159         }
12160       else
12161         {
12162           printf (_("<corrupt string tag>"));
12163           p = (unsigned char *) end;
12164         }
12165       printf ("\"\n");
12166     }
12167   else
12168     {
12169       unsigned int len;
12170
12171       val = read_uleb128 (p, &len, end);
12172       p += len;
12173       printf ("%ld (0x%lx)\n", val, val);
12174     }
12175
12176   assert (p <= end);
12177   return p;
12178 }
12179
12180 /* ARM EABI attributes section.  */
12181 typedef struct
12182 {
12183   unsigned int tag;
12184   const char * name;
12185   /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup.  */
12186   unsigned int type;
12187   const char ** table;
12188 } arm_attr_public_tag;
12189
12190 static const char * arm_attr_tag_CPU_arch[] =
12191   {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
12192    "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8"};
12193 static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
12194 static const char * arm_attr_tag_THUMB_ISA_use[] =
12195   {"No", "Thumb-1", "Thumb-2"};
12196 static const char * arm_attr_tag_FP_arch[] =
12197   {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
12198    "FP for ARMv8", "FPv5/FP-D16 for ARMv8"};
12199 static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
12200 static const char * arm_attr_tag_Advanced_SIMD_arch[] =
12201   {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8"};
12202 static const char * arm_attr_tag_PCS_config[] =
12203   {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
12204    "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
12205 static const char * arm_attr_tag_ABI_PCS_R9_use[] =
12206   {"V6", "SB", "TLS", "Unused"};
12207 static const char * arm_attr_tag_ABI_PCS_RW_data[] =
12208   {"Absolute", "PC-relative", "SB-relative", "None"};
12209 static const char * arm_attr_tag_ABI_PCS_RO_data[] =
12210   {"Absolute", "PC-relative", "None"};
12211 static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
12212   {"None", "direct", "GOT-indirect"};
12213 static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
12214   {"None", "??? 1", "2", "??? 3", "4"};
12215 static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
12216 static const char * arm_attr_tag_ABI_FP_denormal[] =
12217   {"Unused", "Needed", "Sign only"};
12218 static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
12219 static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
12220 static const char * arm_attr_tag_ABI_FP_number_model[] =
12221   {"Unused", "Finite", "RTABI", "IEEE 754"};
12222 static const char * arm_attr_tag_ABI_enum_size[] =
12223   {"Unused", "small", "int", "forced to int"};
12224 static const char * arm_attr_tag_ABI_HardFP_use[] =
12225   {"As Tag_FP_arch", "SP only", "DP only", "SP and DP"};
12226 static const char * arm_attr_tag_ABI_VFP_args[] =
12227   {"AAPCS", "VFP registers", "custom", "compatible"};
12228 static const char * arm_attr_tag_ABI_WMMX_args[] =
12229   {"AAPCS", "WMMX registers", "custom"};
12230 static const char * arm_attr_tag_ABI_optimization_goals[] =
12231   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
12232     "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
12233 static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
12234   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
12235     "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
12236 static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
12237 static const char * arm_attr_tag_FP_HP_extension[] =
12238   {"Not Allowed", "Allowed"};
12239 static const char * arm_attr_tag_ABI_FP_16bit_format[] =
12240   {"None", "IEEE 754", "Alternative Format"};
12241 static const char * arm_attr_tag_MPextension_use[] =
12242   {"Not Allowed", "Allowed"};
12243 static const char * arm_attr_tag_DIV_use[] =
12244   {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
12245     "Allowed in v7-A with integer division extension"};
12246 static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
12247 static const char * arm_attr_tag_Virtualization_use[] =
12248   {"Not Allowed", "TrustZone", "Virtualization Extensions",
12249     "TrustZone and Virtualization Extensions"};
12250 static const char * arm_attr_tag_MPextension_use_legacy[] =
12251   {"Not Allowed", "Allowed"};
12252
12253 #define LOOKUP(id, name) \
12254   {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
12255 static arm_attr_public_tag arm_attr_public_tags[] =
12256 {
12257   {4, "CPU_raw_name", 1, NULL},
12258   {5, "CPU_name", 1, NULL},
12259   LOOKUP(6, CPU_arch),
12260   {7, "CPU_arch_profile", 0, NULL},
12261   LOOKUP(8, ARM_ISA_use),
12262   LOOKUP(9, THUMB_ISA_use),
12263   LOOKUP(10, FP_arch),
12264   LOOKUP(11, WMMX_arch),
12265   LOOKUP(12, Advanced_SIMD_arch),
12266   LOOKUP(13, PCS_config),
12267   LOOKUP(14, ABI_PCS_R9_use),
12268   LOOKUP(15, ABI_PCS_RW_data),
12269   LOOKUP(16, ABI_PCS_RO_data),
12270   LOOKUP(17, ABI_PCS_GOT_use),
12271   LOOKUP(18, ABI_PCS_wchar_t),
12272   LOOKUP(19, ABI_FP_rounding),
12273   LOOKUP(20, ABI_FP_denormal),
12274   LOOKUP(21, ABI_FP_exceptions),
12275   LOOKUP(22, ABI_FP_user_exceptions),
12276   LOOKUP(23, ABI_FP_number_model),
12277   {24, "ABI_align_needed", 0, NULL},
12278   {25, "ABI_align_preserved", 0, NULL},
12279   LOOKUP(26, ABI_enum_size),
12280   LOOKUP(27, ABI_HardFP_use),
12281   LOOKUP(28, ABI_VFP_args),
12282   LOOKUP(29, ABI_WMMX_args),
12283   LOOKUP(30, ABI_optimization_goals),
12284   LOOKUP(31, ABI_FP_optimization_goals),
12285   {32, "compatibility", 0, NULL},
12286   LOOKUP(34, CPU_unaligned_access),
12287   LOOKUP(36, FP_HP_extension),
12288   LOOKUP(38, ABI_FP_16bit_format),
12289   LOOKUP(42, MPextension_use),
12290   LOOKUP(44, DIV_use),
12291   {64, "nodefaults", 0, NULL},
12292   {65, "also_compatible_with", 0, NULL},
12293   LOOKUP(66, T2EE_use),
12294   {67, "conformance", 1, NULL},
12295   LOOKUP(68, Virtualization_use),
12296   LOOKUP(70, MPextension_use_legacy)
12297 };
12298 #undef LOOKUP
12299
12300 static unsigned char *
12301 display_arm_attribute (unsigned char * p,
12302                        const unsigned char * const end)
12303 {
12304   unsigned int tag;
12305   unsigned int len;
12306   unsigned int val;
12307   arm_attr_public_tag * attr;
12308   unsigned i;
12309   unsigned int type;
12310
12311   tag = read_uleb128 (p, &len, end);
12312   p += len;
12313   attr = NULL;
12314   for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
12315     {
12316       if (arm_attr_public_tags[i].tag == tag)
12317         {
12318           attr = &arm_attr_public_tags[i];
12319           break;
12320         }
12321     }
12322
12323   if (attr)
12324     {
12325       printf ("  Tag_%s: ", attr->name);
12326       switch (attr->type)
12327         {
12328         case 0:
12329           switch (tag)
12330             {
12331             case 7: /* Tag_CPU_arch_profile.  */
12332               val = read_uleb128 (p, &len, end);
12333               p += len;
12334               switch (val)
12335                 {
12336                 case 0: printf (_("None\n")); break;
12337                 case 'A': printf (_("Application\n")); break;
12338                 case 'R': printf (_("Realtime\n")); break;
12339                 case 'M': printf (_("Microcontroller\n")); break;
12340                 case 'S': printf (_("Application or Realtime\n")); break;
12341                 default: printf ("??? (%d)\n", val); break;
12342                 }
12343               break;
12344
12345             case 24: /* Tag_align_needed.  */
12346               val = read_uleb128 (p, &len, end);
12347               p += len;
12348               switch (val)
12349                 {
12350                 case 0: printf (_("None\n")); break;
12351                 case 1: printf (_("8-byte\n")); break;
12352                 case 2: printf (_("4-byte\n")); break;
12353                 case 3: printf ("??? 3\n"); break;
12354                 default:
12355                   if (val <= 12)
12356                     printf (_("8-byte and up to %d-byte extended\n"),
12357                             1 << val);
12358                   else
12359                     printf ("??? (%d)\n", val);
12360                   break;
12361                 }
12362               break;
12363
12364             case 25: /* Tag_align_preserved.  */
12365               val = read_uleb128 (p, &len, end);
12366               p += len;
12367               switch (val)
12368                 {
12369                 case 0: printf (_("None\n")); break;
12370                 case 1: printf (_("8-byte, except leaf SP\n")); break;
12371                 case 2: printf (_("8-byte\n")); break;
12372                 case 3: printf ("??? 3\n"); break;
12373                 default:
12374                   if (val <= 12)
12375                     printf (_("8-byte and up to %d-byte extended\n"),
12376                             1 << val);
12377                   else
12378                     printf ("??? (%d)\n", val);
12379                   break;
12380                 }
12381               break;
12382
12383             case 32: /* Tag_compatibility.  */
12384               {
12385                 val = read_uleb128 (p, &len, end);
12386                 p += len;
12387                 printf (_("flag = %d, vendor = "), val);
12388                 if (p < end - 1)
12389                   {
12390                     size_t maxlen = (end - p) - 1;
12391
12392                     print_symbol ((int) maxlen, (const char *) p);
12393                     p += strnlen ((char *) p, maxlen) + 1;
12394                   }
12395                 else
12396                   {
12397                     printf (_("<corrupt>"));
12398                     p = (unsigned char *) end;
12399                   }
12400                 putchar ('\n');
12401               }
12402               break;
12403
12404             case 64: /* Tag_nodefaults.  */
12405               /* PR 17531: file: 001-505008-0.01.  */
12406               if (p < end)
12407                 p++;
12408               printf (_("True\n"));
12409               break;
12410
12411             case 65: /* Tag_also_compatible_with.  */
12412               val = read_uleb128 (p, &len, end);
12413               p += len;
12414               if (val == 6 /* Tag_CPU_arch.  */)
12415                 {
12416                   val = read_uleb128 (p, &len, end);
12417                   p += len;
12418                   if ((unsigned int) val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
12419                     printf ("??? (%d)\n", val);
12420                   else
12421                     printf ("%s\n", arm_attr_tag_CPU_arch[val]);
12422                 }
12423               else
12424                 printf ("???\n");
12425               while (p < end && *(p++) != '\0' /* NUL terminator.  */)
12426                 ;
12427               break;
12428
12429             default:
12430               printf (_("<unknown: %d>\n"), tag);
12431               break;
12432             }
12433           return p;
12434
12435         case 1:
12436           return display_tag_value (-1, p, end);
12437         case 2:
12438           return display_tag_value (0, p, end);
12439
12440         default:
12441           assert (attr->type & 0x80);
12442           val = read_uleb128 (p, &len, end);
12443           p += len;
12444           type = attr->type & 0x7f;
12445           if (val >= type)
12446             printf ("??? (%d)\n", val);
12447           else
12448             printf ("%s\n", attr->table[val]);
12449           return p;
12450         }
12451     }
12452
12453   return display_tag_value (tag, p, end);
12454 }
12455
12456 static unsigned char *
12457 display_gnu_attribute (unsigned char * p,
12458                        unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const),
12459                        const unsigned char * const end)
12460 {
12461   int tag;
12462   unsigned int len;
12463   int val;
12464
12465   tag = read_uleb128 (p, &len, end);
12466   p += len;
12467
12468   /* Tag_compatibility is the only generic GNU attribute defined at
12469      present.  */
12470   if (tag == 32)
12471     {
12472       val = read_uleb128 (p, &len, end);
12473       p += len;
12474
12475       printf (_("flag = %d, vendor = "), val);
12476       if (p == end)
12477         {
12478           printf (_("<corrupt>\n"));
12479           warn (_("corrupt vendor attribute\n"));
12480         }
12481       else
12482         {
12483           if (p < end - 1)
12484             {
12485               size_t maxlen = (end - p) - 1;
12486
12487               print_symbol ((int) maxlen, (const char *) p);
12488               p += strnlen ((char *) p, maxlen) + 1;
12489             }
12490           else
12491             {
12492               printf (_("<corrupt>"));
12493               p = (unsigned char *) end;
12494             }
12495           putchar ('\n');
12496         }
12497       return p;
12498     }
12499
12500   if ((tag & 2) == 0 && display_proc_gnu_attribute)
12501     return display_proc_gnu_attribute (p, tag, end);
12502
12503   return display_tag_value (tag, p, end);
12504 }
12505
12506 static unsigned char *
12507 display_power_gnu_attribute (unsigned char * p,
12508                              int tag,
12509                              const unsigned char * const end)
12510 {
12511   unsigned int len;
12512   int val;
12513
12514   if (tag == Tag_GNU_Power_ABI_FP)
12515     {
12516       val = read_uleb128 (p, &len, end);
12517       p += len;
12518       printf ("  Tag_GNU_Power_ABI_FP: ");
12519
12520       switch (val)
12521         {
12522         case 0:
12523           printf (_("Hard or soft float\n"));
12524           break;
12525         case 1:
12526           printf (_("Hard float\n"));
12527           break;
12528         case 2:
12529           printf (_("Soft float\n"));
12530           break;
12531         case 3:
12532           printf (_("Single-precision hard float\n"));
12533           break;
12534         default:
12535           printf ("??? (%d)\n", val);
12536           break;
12537         }
12538       return p;
12539    }
12540
12541   if (tag == Tag_GNU_Power_ABI_Vector)
12542     {
12543       val = read_uleb128 (p, &len, end);
12544       p += len;
12545       printf ("  Tag_GNU_Power_ABI_Vector: ");
12546       switch (val)
12547         {
12548         case 0:
12549           printf (_("Any\n"));
12550           break;
12551         case 1:
12552           printf (_("Generic\n"));
12553           break;
12554         case 2:
12555           printf ("AltiVec\n");
12556           break;
12557         case 3:
12558           printf ("SPE\n");
12559           break;
12560         default:
12561           printf ("??? (%d)\n", val);
12562           break;
12563         }
12564       return p;
12565    }
12566
12567   if (tag == Tag_GNU_Power_ABI_Struct_Return)
12568     {
12569       if (p == end)
12570         {
12571           warn (_("corrupt Tag_GNU_Power_ABI_Struct_Return\n"));
12572           return p;
12573         }
12574
12575       val = read_uleb128 (p, &len, end);
12576       p += len;
12577       printf ("  Tag_GNU_Power_ABI_Struct_Return: ");
12578       switch (val)
12579        {
12580        case 0:
12581          printf (_("Any\n"));
12582          break;
12583        case 1:
12584          printf ("r3/r4\n");
12585          break;
12586        case 2:
12587          printf (_("Memory\n"));
12588          break;
12589        default:
12590          printf ("??? (%d)\n", val);
12591          break;
12592        }
12593       return p;
12594     }
12595
12596   return display_tag_value (tag & 1, p, end);
12597 }
12598
12599 static void
12600 display_sparc_hwcaps (int mask)
12601 {
12602   if (mask)
12603     {
12604       int first = 1;
12605
12606       if (mask & ELF_SPARC_HWCAP_MUL32)
12607         fputs ("mul32", stdout), first = 0;
12608       if (mask & ELF_SPARC_HWCAP_DIV32)
12609         printf ("%sdiv32", first ? "" : "|"), first = 0;
12610       if (mask & ELF_SPARC_HWCAP_FSMULD)
12611         printf ("%sfsmuld", first ? "" : "|"), first = 0;
12612       if (mask & ELF_SPARC_HWCAP_V8PLUS)
12613         printf ("%sv8plus", first ? "" : "|"), first = 0;
12614       if (mask & ELF_SPARC_HWCAP_POPC)
12615         printf ("%spopc", first ? "" : "|"), first = 0;
12616       if (mask & ELF_SPARC_HWCAP_VIS)
12617         printf ("%svis", first ? "" : "|"), first = 0;
12618       if (mask & ELF_SPARC_HWCAP_VIS2)
12619         printf ("%svis2", first ? "" : "|"), first = 0;
12620       if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
12621         printf ("%sASIBlkInit", first ? "" : "|"), first = 0;
12622       if (mask & ELF_SPARC_HWCAP_FMAF)
12623         printf ("%sfmaf", first ? "" : "|"), first = 0;
12624       if (mask & ELF_SPARC_HWCAP_VIS3)
12625         printf ("%svis3", first ? "" : "|"), first = 0;
12626       if (mask & ELF_SPARC_HWCAP_HPC)
12627         printf ("%shpc", first ? "" : "|"), first = 0;
12628       if (mask & ELF_SPARC_HWCAP_RANDOM)
12629         printf ("%srandom", first ? "" : "|"), first = 0;
12630       if (mask & ELF_SPARC_HWCAP_TRANS)
12631         printf ("%strans", first ? "" : "|"), first = 0;
12632       if (mask & ELF_SPARC_HWCAP_FJFMAU)
12633         printf ("%sfjfmau", first ? "" : "|"), first = 0;
12634       if (mask & ELF_SPARC_HWCAP_IMA)
12635         printf ("%sima", first ? "" : "|"), first = 0;
12636       if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
12637         printf ("%scspare", first ? "" : "|"), first = 0;
12638     }
12639   else
12640     fputc ('0', stdout);
12641   fputc ('\n', stdout);
12642 }
12643
12644 static void
12645 display_sparc_hwcaps2 (int mask)
12646 {
12647   if (mask)
12648     {
12649       int first = 1;
12650
12651       if (mask & ELF_SPARC_HWCAP2_FJATHPLUS)
12652         fputs ("fjathplus", stdout), first = 0;
12653       if (mask & ELF_SPARC_HWCAP2_VIS3B)
12654         printf ("%svis3b", first ? "" : "|"), first = 0;
12655       if (mask & ELF_SPARC_HWCAP2_ADP)
12656         printf ("%sadp", first ? "" : "|"), first = 0;
12657       if (mask & ELF_SPARC_HWCAP2_SPARC5)
12658         printf ("%ssparc5", first ? "" : "|"), first = 0;
12659       if (mask & ELF_SPARC_HWCAP2_MWAIT)
12660         printf ("%smwait", first ? "" : "|"), first = 0;
12661       if (mask & ELF_SPARC_HWCAP2_XMPMUL)
12662         printf ("%sxmpmul", first ? "" : "|"), first = 0;
12663       if (mask & ELF_SPARC_HWCAP2_XMONT)
12664         printf ("%sxmont2", first ? "" : "|"), first = 0;
12665       if (mask & ELF_SPARC_HWCAP2_NSEC)
12666         printf ("%snsec", first ? "" : "|"), first = 0;
12667       if (mask & ELF_SPARC_HWCAP2_FJATHHPC)
12668         printf ("%sfjathhpc", first ? "" : "|"), first = 0;
12669       if (mask & ELF_SPARC_HWCAP2_FJDES)
12670         printf ("%sfjdes", first ? "" : "|"), first = 0;
12671       if (mask & ELF_SPARC_HWCAP2_FJAES)
12672         printf ("%sfjaes", first ? "" : "|"), first = 0;
12673     }
12674   else
12675     fputc ('0', stdout);
12676   fputc ('\n', stdout);
12677 }
12678
12679 static unsigned char *
12680 display_sparc_gnu_attribute (unsigned char * p,
12681                              int tag,
12682                              const unsigned char * const end)
12683 {
12684   unsigned int len;
12685   int val;
12686
12687   if (tag == Tag_GNU_Sparc_HWCAPS)
12688     {
12689       val = read_uleb128 (p, &len, end);
12690       p += len;
12691       printf ("  Tag_GNU_Sparc_HWCAPS: ");
12692       display_sparc_hwcaps (val);
12693       return p;
12694     }
12695   if (tag == Tag_GNU_Sparc_HWCAPS2)
12696     {
12697       val = read_uleb128 (p, &len, end);
12698       p += len;
12699       printf ("  Tag_GNU_Sparc_HWCAPS2: ");
12700       display_sparc_hwcaps2 (val);
12701       return p;
12702     }
12703
12704   return display_tag_value (tag, p, end);
12705 }
12706
12707 static void
12708 print_mips_fp_abi_value (int val)
12709 {
12710   switch (val)
12711     {
12712     case Val_GNU_MIPS_ABI_FP_ANY:
12713       printf (_("Hard or soft float\n"));
12714       break;
12715     case Val_GNU_MIPS_ABI_FP_DOUBLE:
12716       printf (_("Hard float (double precision)\n"));
12717       break;
12718     case Val_GNU_MIPS_ABI_FP_SINGLE:
12719       printf (_("Hard float (single precision)\n"));
12720       break;
12721     case Val_GNU_MIPS_ABI_FP_SOFT:
12722       printf (_("Soft float\n"));
12723       break;
12724     case Val_GNU_MIPS_ABI_FP_OLD_64:
12725       printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
12726       break;
12727     case Val_GNU_MIPS_ABI_FP_XX:
12728       printf (_("Hard float (32-bit CPU, Any FPU)\n"));
12729       break;
12730     case Val_GNU_MIPS_ABI_FP_64:
12731       printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
12732       break;
12733     case Val_GNU_MIPS_ABI_FP_64A:
12734       printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
12735       break;
12736     default:
12737       printf ("??? (%d)\n", val);
12738       break;
12739     }
12740 }
12741
12742 static unsigned char *
12743 display_mips_gnu_attribute (unsigned char * p,
12744                             int tag,
12745                             const unsigned char * const end)
12746 {
12747   if (tag == Tag_GNU_MIPS_ABI_FP)
12748     {
12749       unsigned int len;
12750       int val;
12751
12752       val = read_uleb128 (p, &len, end);
12753       p += len;
12754       printf ("  Tag_GNU_MIPS_ABI_FP: ");
12755
12756       print_mips_fp_abi_value (val);
12757
12758       return p;
12759    }
12760
12761   if (tag == Tag_GNU_MIPS_ABI_MSA)
12762     {
12763       unsigned int len;
12764       int val;
12765
12766       val = read_uleb128 (p, &len, end);
12767       p += len;
12768       printf ("  Tag_GNU_MIPS_ABI_MSA: ");
12769
12770       switch (val)
12771         {
12772         case Val_GNU_MIPS_ABI_MSA_ANY:
12773           printf (_("Any MSA or not\n"));
12774           break;
12775         case Val_GNU_MIPS_ABI_MSA_128:
12776           printf (_("128-bit MSA\n"));
12777           break;
12778         default:
12779           printf ("??? (%d)\n", val);
12780           break;
12781         }
12782       return p;
12783     }
12784
12785   return display_tag_value (tag & 1, p, end);
12786 }
12787
12788 static unsigned char *
12789 display_tic6x_attribute (unsigned char * p,
12790                          const unsigned char * const end)
12791 {
12792   int tag;
12793   unsigned int len;
12794   int val;
12795
12796   tag = read_uleb128 (p, &len, end);
12797   p += len;
12798
12799   switch (tag)
12800     {
12801     case Tag_ISA:
12802       val = read_uleb128 (p, &len, end);
12803       p += len;
12804       printf ("  Tag_ISA: ");
12805
12806       switch (val)
12807         {
12808         case C6XABI_Tag_ISA_none:
12809           printf (_("None\n"));
12810           break;
12811         case C6XABI_Tag_ISA_C62X:
12812           printf ("C62x\n");
12813           break;
12814         case C6XABI_Tag_ISA_C67X:
12815           printf ("C67x\n");
12816           break;
12817         case C6XABI_Tag_ISA_C67XP:
12818           printf ("C67x+\n");
12819           break;
12820         case C6XABI_Tag_ISA_C64X:
12821           printf ("C64x\n");
12822           break;
12823         case C6XABI_Tag_ISA_C64XP:
12824           printf ("C64x+\n");
12825           break;
12826         case C6XABI_Tag_ISA_C674X:
12827           printf ("C674x\n");
12828           break;
12829         default:
12830           printf ("??? (%d)\n", val);
12831           break;
12832         }
12833       return p;
12834
12835     case Tag_ABI_wchar_t:
12836       val = read_uleb128 (p, &len, end);
12837       p += len;
12838       printf ("  Tag_ABI_wchar_t: ");
12839       switch (val)
12840         {
12841         case 0:
12842           printf (_("Not used\n"));
12843           break;
12844         case 1:
12845           printf (_("2 bytes\n"));
12846           break;
12847         case 2:
12848           printf (_("4 bytes\n"));
12849           break;
12850         default:
12851           printf ("??? (%d)\n", val);
12852           break;
12853         }
12854       return p;
12855
12856     case Tag_ABI_stack_align_needed:
12857       val = read_uleb128 (p, &len, end);
12858       p += len;
12859       printf ("  Tag_ABI_stack_align_needed: ");
12860       switch (val)
12861         {
12862         case 0:
12863           printf (_("8-byte\n"));
12864           break;
12865         case 1:
12866           printf (_("16-byte\n"));
12867           break;
12868         default:
12869           printf ("??? (%d)\n", val);
12870           break;
12871         }
12872       return p;
12873
12874     case Tag_ABI_stack_align_preserved:
12875       val = read_uleb128 (p, &len, end);
12876       p += len;
12877       printf ("  Tag_ABI_stack_align_preserved: ");
12878       switch (val)
12879         {
12880         case 0:
12881           printf (_("8-byte\n"));
12882           break;
12883         case 1:
12884           printf (_("16-byte\n"));
12885           break;
12886         default:
12887           printf ("??? (%d)\n", val);
12888           break;
12889         }
12890       return p;
12891
12892     case Tag_ABI_DSBT:
12893       val = read_uleb128 (p, &len, end);
12894       p += len;
12895       printf ("  Tag_ABI_DSBT: ");
12896       switch (val)
12897         {
12898         case 0:
12899           printf (_("DSBT addressing not used\n"));
12900           break;
12901         case 1:
12902           printf (_("DSBT addressing used\n"));
12903           break;
12904         default:
12905           printf ("??? (%d)\n", val);
12906           break;
12907         }
12908       return p;
12909
12910     case Tag_ABI_PID:
12911       val = read_uleb128 (p, &len, end);
12912       p += len;
12913       printf ("  Tag_ABI_PID: ");
12914       switch (val)
12915         {
12916         case 0:
12917           printf (_("Data addressing position-dependent\n"));
12918           break;
12919         case 1:
12920           printf (_("Data addressing position-independent, GOT near DP\n"));
12921           break;
12922         case 2:
12923           printf (_("Data addressing position-independent, GOT far from DP\n"));
12924           break;
12925         default:
12926           printf ("??? (%d)\n", val);
12927           break;
12928         }
12929       return p;
12930
12931     case Tag_ABI_PIC:
12932       val = read_uleb128 (p, &len, end);
12933       p += len;
12934       printf ("  Tag_ABI_PIC: ");
12935       switch (val)
12936         {
12937         case 0:
12938           printf (_("Code addressing position-dependent\n"));
12939           break;
12940         case 1:
12941           printf (_("Code addressing position-independent\n"));
12942           break;
12943         default:
12944           printf ("??? (%d)\n", val);
12945           break;
12946         }
12947       return p;
12948
12949     case Tag_ABI_array_object_alignment:
12950       val = read_uleb128 (p, &len, end);
12951       p += len;
12952       printf ("  Tag_ABI_array_object_alignment: ");
12953       switch (val)
12954         {
12955         case 0:
12956           printf (_("8-byte\n"));
12957           break;
12958         case 1:
12959           printf (_("4-byte\n"));
12960           break;
12961         case 2:
12962           printf (_("16-byte\n"));
12963           break;
12964         default:
12965           printf ("??? (%d)\n", val);
12966           break;
12967         }
12968       return p;
12969
12970     case Tag_ABI_array_object_align_expected:
12971       val = read_uleb128 (p, &len, end);
12972       p += len;
12973       printf ("  Tag_ABI_array_object_align_expected: ");
12974       switch (val)
12975         {
12976         case 0:
12977           printf (_("8-byte\n"));
12978           break;
12979         case 1:
12980           printf (_("4-byte\n"));
12981           break;
12982         case 2:
12983           printf (_("16-byte\n"));
12984           break;
12985         default:
12986           printf ("??? (%d)\n", val);
12987           break;
12988         }
12989       return p;
12990
12991     case Tag_ABI_compatibility:
12992       {
12993         val = read_uleb128 (p, &len, end);
12994         p += len;
12995         printf ("  Tag_ABI_compatibility: ");
12996         printf (_("flag = %d, vendor = "), val);
12997         if (p < end - 1)
12998           {
12999             size_t maxlen = (end - p) - 1;
13000
13001             print_symbol ((int) maxlen, (const char *) p);
13002             p += strnlen ((char *) p, maxlen) + 1;
13003           }
13004         else
13005           {
13006             printf (_("<corrupt>"));
13007             p = (unsigned char *) end;
13008           }
13009         putchar ('\n');
13010         return p;
13011       }
13012
13013     case Tag_ABI_conformance:
13014       {
13015         printf ("  Tag_ABI_conformance: \"");
13016         if (p < end - 1)
13017           {
13018             size_t maxlen = (end - p) - 1;
13019
13020             print_symbol ((int) maxlen, (const char *) p);
13021             p += strnlen ((char *) p, maxlen) + 1;
13022           }
13023         else
13024           {
13025             printf (_("<corrupt>"));
13026             p = (unsigned char *) end;
13027           }
13028         printf ("\"\n");
13029         return p;
13030       }
13031     }
13032
13033   return display_tag_value (tag, p, end);
13034 }
13035
13036 static void
13037 display_raw_attribute (unsigned char * p, unsigned char * end)
13038 {
13039   unsigned long addr = 0;
13040   size_t bytes = end - p;
13041
13042   assert (end > p);
13043   while (bytes)
13044     {
13045       int j;
13046       int k;
13047       int lbytes = (bytes > 16 ? 16 : bytes);
13048
13049       printf ("  0x%8.8lx ", addr);
13050
13051       for (j = 0; j < 16; j++)
13052         {
13053           if (j < lbytes)
13054             printf ("%2.2x", p[j]);
13055           else
13056             printf ("  ");
13057
13058           if ((j & 3) == 3)
13059             printf (" ");
13060         }
13061
13062       for (j = 0; j < lbytes; j++)
13063         {
13064           k = p[j];
13065           if (k >= ' ' && k < 0x7f)
13066             printf ("%c", k);
13067           else
13068             printf (".");
13069         }
13070
13071       putchar ('\n');
13072
13073       p  += lbytes;
13074       bytes -= lbytes;
13075       addr += lbytes;
13076     }
13077
13078   putchar ('\n');
13079 }
13080
13081 static unsigned char *
13082 display_msp430x_attribute (unsigned char * p,
13083                            const unsigned char * const end)
13084 {
13085   unsigned int len;
13086   int val;
13087   int tag;
13088
13089   tag = read_uleb128 (p, & len, end);
13090   p += len;
13091
13092   switch (tag)
13093     {
13094     case OFBA_MSPABI_Tag_ISA:
13095       val = read_uleb128 (p, &len, end);
13096       p += len;
13097       printf ("  Tag_ISA: ");
13098       switch (val)
13099         {
13100         case 0: printf (_("None\n")); break;
13101         case 1: printf (_("MSP430\n")); break;
13102         case 2: printf (_("MSP430X\n")); break;
13103         default: printf ("??? (%d)\n", val); break;
13104         }
13105       break;
13106
13107     case OFBA_MSPABI_Tag_Code_Model:
13108       val = read_uleb128 (p, &len, end);
13109       p += len;
13110       printf ("  Tag_Code_Model: ");
13111       switch (val)
13112         {
13113         case 0: printf (_("None\n")); break;
13114         case 1: printf (_("Small\n")); break;
13115         case 2: printf (_("Large\n")); break;
13116         default: printf ("??? (%d)\n", val); break;
13117         }
13118       break;
13119
13120     case OFBA_MSPABI_Tag_Data_Model:
13121       val = read_uleb128 (p, &len, end);
13122       p += len;
13123       printf ("  Tag_Data_Model: ");
13124       switch (val)
13125         {
13126         case 0: printf (_("None\n")); break;
13127         case 1: printf (_("Small\n")); break;
13128         case 2: printf (_("Large\n")); break;
13129         case 3: printf (_("Restricted Large\n")); break;
13130         default: printf ("??? (%d)\n", val); break;
13131         }
13132       break;
13133
13134     default:
13135       printf (_("  <unknown tag %d>: "), tag);
13136
13137       if (tag & 1)
13138         {
13139           putchar ('"');
13140           if (p < end - 1)
13141             {
13142               size_t maxlen = (end - p) - 1;
13143
13144               print_symbol ((int) maxlen, (const char *) p);
13145               p += strnlen ((char *) p, maxlen) + 1;
13146             }
13147           else
13148             {
13149               printf (_("<corrupt>"));
13150               p = (unsigned char *) end;
13151             }
13152           printf ("\"\n");
13153         }
13154       else
13155         {
13156           val = read_uleb128 (p, &len, end);
13157           p += len;
13158           printf ("%d (0x%x)\n", val, val);
13159         }
13160       break;
13161    }
13162
13163   assert (p <= end);
13164   return p;
13165 }
13166
13167 static int
13168 process_attributes (FILE * file,
13169                     const char * public_name,
13170                     unsigned int proc_type,
13171                     unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
13172                     unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const))
13173 {
13174   Elf_Internal_Shdr * sect;
13175   unsigned i;
13176
13177   /* Find the section header so that we get the size.  */
13178   for (i = 0, sect = section_headers;
13179        i < elf_header.e_shnum;
13180        i++, sect++)
13181     {
13182       unsigned char * contents;
13183       unsigned char * p;
13184
13185       if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
13186         continue;
13187
13188       contents = (unsigned char *) get_data (NULL, file, sect->sh_offset, 1,
13189                                              sect->sh_size, _("attributes"));
13190       if (contents == NULL)
13191         continue;
13192
13193       p = contents;
13194       if (*p == 'A')
13195         {
13196           bfd_vma section_len;
13197
13198           section_len = sect->sh_size - 1;
13199           p++;
13200
13201           while (section_len > 0)
13202             {
13203               bfd_vma attr_len;
13204               unsigned int namelen;
13205               bfd_boolean public_section;
13206               bfd_boolean gnu_section;
13207
13208               if (section_len <= 4)
13209                 {
13210                   error (_("Tag section ends prematurely\n"));
13211                   break;
13212                 }
13213               attr_len = byte_get (p, 4);
13214               p += 4;
13215
13216               if (attr_len > section_len)
13217                 {
13218                   error (_("Bad attribute length (%u > %u)\n"),
13219                           (unsigned) attr_len, (unsigned) section_len);
13220                   attr_len = section_len;
13221                 }
13222               /* PR 17531: file: 001-101425-0.004  */
13223               else if (attr_len < 5)
13224                 {
13225                   error (_("Attribute length of %u is too small\n"), (unsigned) attr_len);
13226                   break;
13227                 }
13228
13229               section_len -= attr_len;
13230               attr_len -= 4;
13231
13232               namelen = strnlen ((char *) p, attr_len) + 1;
13233               if (namelen == 0 || namelen >= attr_len)
13234                 {
13235                   error (_("Corrupt attribute section name\n"));
13236                   break;
13237                 }
13238
13239               printf (_("Attribute Section: "));
13240               print_symbol (INT_MAX, (const char *) p);
13241               putchar ('\n');
13242
13243               if (public_name && streq ((char *) p, public_name))
13244                 public_section = TRUE;
13245               else
13246                 public_section = FALSE;
13247
13248               if (streq ((char *) p, "gnu"))
13249                 gnu_section = TRUE;
13250               else
13251                 gnu_section = FALSE;
13252
13253               p += namelen;
13254               attr_len -= namelen;
13255
13256               while (attr_len > 0 && p < contents + sect->sh_size)
13257                 {
13258                   int tag;
13259                   int val;
13260                   bfd_vma size;
13261                   unsigned char * end;
13262
13263                   /* PR binutils/17531: Safe handling of corrupt files.  */
13264                   if (attr_len < 6)
13265                     {
13266                       error (_("Unused bytes at end of section\n"));
13267                       section_len = 0;
13268                       break;
13269                     }
13270
13271                   tag = *(p++);
13272                   size = byte_get (p, 4);
13273                   if (size > attr_len)
13274                     {
13275                       error (_("Bad subsection length (%u > %u)\n"),
13276                               (unsigned) size, (unsigned) attr_len);
13277                       size = attr_len;
13278                     }
13279                   /* PR binutils/17531: Safe handling of corrupt files.  */
13280                   if (size < 6)
13281                     {
13282                       error (_("Bad subsection length (%u < 6)\n"),
13283                               (unsigned) size);
13284                       section_len = 0;
13285                       break;
13286                     }
13287
13288                   attr_len -= size;
13289                   end = p + size - 1;
13290                   assert (end <= contents + sect->sh_size);
13291                   p += 4;
13292
13293                   switch (tag)
13294                     {
13295                     case 1:
13296                       printf (_("File Attributes\n"));
13297                       break;
13298                     case 2:
13299                       printf (_("Section Attributes:"));
13300                       goto do_numlist;
13301                     case 3:
13302                       printf (_("Symbol Attributes:"));
13303                     do_numlist:
13304                       for (;;)
13305                         {
13306                           unsigned int j;
13307
13308                           val = read_uleb128 (p, &j, end);
13309                           p += j;
13310                           if (val == 0)
13311                             break;
13312                           printf (" %d", val);
13313                         }
13314                       printf ("\n");
13315                       break;
13316                     default:
13317                       printf (_("Unknown tag: %d\n"), tag);
13318                       public_section = FALSE;
13319                       break;
13320                     }
13321
13322                   if (public_section && display_pub_attribute != NULL)
13323                     {
13324                       while (p < end)
13325                         p = display_pub_attribute (p, end);
13326                       assert (p <= end);
13327                     }
13328                   else if (gnu_section && display_proc_gnu_attribute != NULL)
13329                     {
13330                       while (p < end)
13331                         p = display_gnu_attribute (p,
13332                                                    display_proc_gnu_attribute,
13333                                                    end);
13334                       assert (p <= end);
13335                     }
13336                   else if (p < end)
13337                     {
13338                       printf (_("  Unknown attribute:\n"));
13339                       display_raw_attribute (p, end);
13340                       p = end;
13341                     }
13342                   else
13343                     attr_len = 0;
13344                 }
13345             }
13346         }
13347       else
13348         printf (_("Unknown format '%c' (%d)\n"), *p, *p);
13349
13350       free (contents);
13351     }
13352   return 1;
13353 }
13354
13355 static int
13356 process_arm_specific (FILE * file)
13357 {
13358   return process_attributes (file, "aeabi", SHT_ARM_ATTRIBUTES,
13359                              display_arm_attribute, NULL);
13360 }
13361
13362 static int
13363 process_power_specific (FILE * file)
13364 {
13365   return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
13366                              display_power_gnu_attribute);
13367 }
13368
13369 static int
13370 process_sparc_specific (FILE * file)
13371 {
13372   return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
13373                              display_sparc_gnu_attribute);
13374 }
13375
13376 static int
13377 process_tic6x_specific (FILE * file)
13378 {
13379   return process_attributes (file, "c6xabi", SHT_C6000_ATTRIBUTES,
13380                              display_tic6x_attribute, NULL);
13381 }
13382
13383 static int
13384 process_msp430x_specific (FILE * file)
13385 {
13386   return process_attributes (file, "mspabi", SHT_MSP430_ATTRIBUTES,
13387                              display_msp430x_attribute, NULL);
13388 }
13389
13390 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
13391    Print the Address, Access and Initial fields of an entry at VMA ADDR
13392    and return the VMA of the next entry, or -1 if there was a problem.
13393    Does not read from DATA_END or beyond.  */
13394
13395 static bfd_vma
13396 print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr,
13397                       unsigned char * data_end)
13398 {
13399   printf ("  ");
13400   print_vma (addr, LONG_HEX);
13401   printf (" ");
13402   if (addr < pltgot + 0xfff0)
13403     printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
13404   else
13405     printf ("%10s", "");
13406   printf (" ");
13407   if (data == NULL)
13408     printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
13409   else
13410     {
13411       bfd_vma entry;
13412       unsigned char * from = data + addr - pltgot;
13413
13414       if (from + (is_32bit_elf ? 4 : 8) > data_end)
13415         {
13416           warn (_("MIPS GOT entry extends beyond the end of available data\n"));
13417           printf ("%*s", is_32bit_elf ? 8 : 16, _("<corrupt>"));
13418           return (bfd_vma) -1;
13419         }
13420       else
13421         {
13422           entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
13423           print_vma (entry, LONG_HEX);
13424         }
13425     }
13426   return addr + (is_32bit_elf ? 4 : 8);
13427 }
13428
13429 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
13430    PLTGOT.  Print the Address and Initial fields of an entry at VMA
13431    ADDR and return the VMA of the next entry.  */
13432
13433 static bfd_vma
13434 print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
13435 {
13436   printf ("  ");
13437   print_vma (addr, LONG_HEX);
13438   printf (" ");
13439   if (data == NULL)
13440     printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
13441   else
13442     {
13443       bfd_vma entry;
13444
13445       entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
13446       print_vma (entry, LONG_HEX);
13447     }
13448   return addr + (is_32bit_elf ? 4 : 8);
13449 }
13450
13451 static void
13452 print_mips_ases (unsigned int mask)
13453 {
13454   if (mask & AFL_ASE_DSP)
13455     fputs ("\n\tDSP ASE", stdout);
13456   if (mask & AFL_ASE_DSPR2)
13457     fputs ("\n\tDSP R2 ASE", stdout);
13458   if (mask & AFL_ASE_EVA)
13459     fputs ("\n\tEnhanced VA Scheme", stdout);
13460   if (mask & AFL_ASE_MCU)
13461     fputs ("\n\tMCU (MicroController) ASE", stdout);
13462   if (mask & AFL_ASE_MDMX)
13463     fputs ("\n\tMDMX ASE", stdout);
13464   if (mask & AFL_ASE_MIPS3D)
13465     fputs ("\n\tMIPS-3D ASE", stdout);
13466   if (mask & AFL_ASE_MT)
13467     fputs ("\n\tMT ASE", stdout);
13468   if (mask & AFL_ASE_SMARTMIPS)
13469     fputs ("\n\tSmartMIPS ASE", stdout);
13470   if (mask & AFL_ASE_VIRT)
13471     fputs ("\n\tVZ ASE", stdout);
13472   if (mask & AFL_ASE_MSA)
13473     fputs ("\n\tMSA ASE", stdout);
13474   if (mask & AFL_ASE_MIPS16)
13475     fputs ("\n\tMIPS16 ASE", stdout);
13476   if (mask & AFL_ASE_MICROMIPS)
13477     fputs ("\n\tMICROMIPS ASE", stdout);
13478   if (mask & AFL_ASE_XPA)
13479     fputs ("\n\tXPA ASE", stdout);
13480   if (mask == 0)
13481     fprintf (stdout, "\n\t%s", _("None"));
13482   else if ((mask & ~AFL_ASE_MASK) != 0)
13483     fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
13484 }
13485
13486 static void
13487 print_mips_isa_ext (unsigned int isa_ext)
13488 {
13489   switch (isa_ext)
13490     {
13491     case 0:
13492       fputs (_("None"), stdout);
13493       break;
13494     case AFL_EXT_XLR:
13495       fputs ("RMI XLR", stdout);
13496       break;
13497     case AFL_EXT_OCTEON3:
13498       fputs ("Cavium Networks Octeon3", stdout);
13499       break;
13500     case AFL_EXT_OCTEON2:
13501       fputs ("Cavium Networks Octeon2", stdout);
13502       break;
13503     case AFL_EXT_OCTEONP:
13504       fputs ("Cavium Networks OcteonP", stdout);
13505       break;
13506     case AFL_EXT_LOONGSON_3A:
13507       fputs ("Loongson 3A", stdout);
13508       break;
13509     case AFL_EXT_OCTEON:
13510       fputs ("Cavium Networks Octeon", stdout);
13511       break;
13512     case AFL_EXT_5900:
13513       fputs ("Toshiba R5900", stdout);
13514       break;
13515     case AFL_EXT_4650:
13516       fputs ("MIPS R4650", stdout);
13517       break;
13518     case AFL_EXT_4010:
13519       fputs ("LSI R4010", stdout);
13520       break;
13521     case AFL_EXT_4100:
13522       fputs ("NEC VR4100", stdout);
13523       break;
13524     case AFL_EXT_3900:
13525       fputs ("Toshiba R3900", stdout);
13526       break;
13527     case AFL_EXT_10000:
13528       fputs ("MIPS R10000", stdout);
13529       break;
13530     case AFL_EXT_SB1:
13531       fputs ("Broadcom SB-1", stdout);
13532       break;
13533     case AFL_EXT_4111:
13534       fputs ("NEC VR4111/VR4181", stdout);
13535       break;
13536     case AFL_EXT_4120:
13537       fputs ("NEC VR4120", stdout);
13538       break;
13539     case AFL_EXT_5400:
13540       fputs ("NEC VR5400", stdout);
13541       break;
13542     case AFL_EXT_5500:
13543       fputs ("NEC VR5500", stdout);
13544       break;
13545     case AFL_EXT_LOONGSON_2E:
13546       fputs ("ST Microelectronics Loongson 2E", stdout);
13547       break;
13548     case AFL_EXT_LOONGSON_2F:
13549       fputs ("ST Microelectronics Loongson 2F", stdout);
13550       break;
13551     default:
13552       fprintf (stdout, "%s (%d)", _("Unknown"), isa_ext);
13553     }
13554 }
13555
13556 static int
13557 get_mips_reg_size (int reg_size)
13558 {
13559   return (reg_size == AFL_REG_NONE) ? 0
13560          : (reg_size == AFL_REG_32) ? 32
13561          : (reg_size == AFL_REG_64) ? 64
13562          : (reg_size == AFL_REG_128) ? 128
13563          : -1;
13564 }
13565
13566 static int
13567 process_mips_specific (FILE * file)
13568 {
13569   Elf_Internal_Dyn * entry;
13570   Elf_Internal_Shdr *sect = NULL;
13571   size_t liblist_offset = 0;
13572   size_t liblistno = 0;
13573   size_t conflictsno = 0;
13574   size_t options_offset = 0;
13575   size_t conflicts_offset = 0;
13576   size_t pltrelsz = 0;
13577   size_t pltrel = 0;
13578   bfd_vma pltgot = 0;
13579   bfd_vma mips_pltgot = 0;
13580   bfd_vma jmprel = 0;
13581   bfd_vma local_gotno = 0;
13582   bfd_vma gotsym = 0;
13583   bfd_vma symtabno = 0;
13584
13585   process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
13586                       display_mips_gnu_attribute);
13587
13588   sect = find_section (".MIPS.abiflags");
13589
13590   if (sect != NULL)
13591     {
13592       Elf_External_ABIFlags_v0 *abiflags_ext;
13593       Elf_Internal_ABIFlags_v0 abiflags_in;
13594
13595       if (sizeof (Elf_External_ABIFlags_v0) != sect->sh_size)
13596         fputs ("\nCorrupt ABI Flags section.\n", stdout);
13597       else
13598         {
13599           abiflags_ext = get_data (NULL, file, sect->sh_offset, 1,
13600                                    sect->sh_size, _("MIPS ABI Flags section"));
13601           if (abiflags_ext)
13602             {
13603               abiflags_in.version = BYTE_GET (abiflags_ext->version);
13604               abiflags_in.isa_level = BYTE_GET (abiflags_ext->isa_level);
13605               abiflags_in.isa_rev = BYTE_GET (abiflags_ext->isa_rev);
13606               abiflags_in.gpr_size = BYTE_GET (abiflags_ext->gpr_size);
13607               abiflags_in.cpr1_size = BYTE_GET (abiflags_ext->cpr1_size);
13608               abiflags_in.cpr2_size = BYTE_GET (abiflags_ext->cpr2_size);
13609               abiflags_in.fp_abi = BYTE_GET (abiflags_ext->fp_abi);
13610               abiflags_in.isa_ext = BYTE_GET (abiflags_ext->isa_ext);
13611               abiflags_in.ases = BYTE_GET (abiflags_ext->ases);
13612               abiflags_in.flags1 = BYTE_GET (abiflags_ext->flags1);
13613               abiflags_in.flags2 = BYTE_GET (abiflags_ext->flags2);
13614
13615               printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in.version);
13616               printf ("\nISA: MIPS%d", abiflags_in.isa_level);
13617               if (abiflags_in.isa_rev > 1)
13618                 printf ("r%d", abiflags_in.isa_rev);
13619               printf ("\nGPR size: %d",
13620                       get_mips_reg_size (abiflags_in.gpr_size));
13621               printf ("\nCPR1 size: %d",
13622                       get_mips_reg_size (abiflags_in.cpr1_size));
13623               printf ("\nCPR2 size: %d",
13624                       get_mips_reg_size (abiflags_in.cpr2_size));
13625               fputs ("\nFP ABI: ", stdout);
13626               print_mips_fp_abi_value (abiflags_in.fp_abi);
13627               fputs ("ISA Extension: ", stdout);
13628               print_mips_isa_ext (abiflags_in.isa_ext);
13629               fputs ("\nASEs:", stdout);
13630               print_mips_ases (abiflags_in.ases);
13631               printf ("\nFLAGS 1: %8.8lx", abiflags_in.flags1);
13632               printf ("\nFLAGS 2: %8.8lx", abiflags_in.flags2);
13633               fputc ('\n', stdout);
13634               free (abiflags_ext);
13635             }
13636         }
13637     }
13638
13639   /* We have a lot of special sections.  Thanks SGI!  */
13640   if (dynamic_section == NULL)
13641     /* No information available.  */
13642     return 0;
13643
13644   for (entry = dynamic_section;
13645        /* PR 17531 file: 012-50589-0.004.  */
13646        entry < dynamic_section + dynamic_nent && entry->d_tag != DT_NULL;
13647        ++entry)
13648     switch (entry->d_tag)
13649       {
13650       case DT_MIPS_LIBLIST:
13651         liblist_offset
13652           = offset_from_vma (file, entry->d_un.d_val,
13653                              liblistno * sizeof (Elf32_External_Lib));
13654         break;
13655       case DT_MIPS_LIBLISTNO:
13656         liblistno = entry->d_un.d_val;
13657         break;
13658       case DT_MIPS_OPTIONS:
13659         options_offset = offset_from_vma (file, entry->d_un.d_val, 0);
13660         break;
13661       case DT_MIPS_CONFLICT:
13662         conflicts_offset
13663           = offset_from_vma (file, entry->d_un.d_val,
13664                              conflictsno * sizeof (Elf32_External_Conflict));
13665         break;
13666       case DT_MIPS_CONFLICTNO:
13667         conflictsno = entry->d_un.d_val;
13668         break;
13669       case DT_PLTGOT:
13670         pltgot = entry->d_un.d_ptr;
13671         break;
13672       case DT_MIPS_LOCAL_GOTNO:
13673         local_gotno = entry->d_un.d_val;
13674         break;
13675       case DT_MIPS_GOTSYM:
13676         gotsym = entry->d_un.d_val;
13677         break;
13678       case DT_MIPS_SYMTABNO:
13679         symtabno = entry->d_un.d_val;
13680         break;
13681       case DT_MIPS_PLTGOT:
13682         mips_pltgot = entry->d_un.d_ptr;
13683         break;
13684       case DT_PLTREL:
13685         pltrel = entry->d_un.d_val;
13686         break;
13687       case DT_PLTRELSZ:
13688         pltrelsz = entry->d_un.d_val;
13689         break;
13690       case DT_JMPREL:
13691         jmprel = entry->d_un.d_ptr;
13692         break;
13693       default:
13694         break;
13695       }
13696
13697   if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
13698     {
13699       Elf32_External_Lib * elib;
13700       size_t cnt;
13701
13702       elib = (Elf32_External_Lib *) get_data (NULL, file, liblist_offset,
13703                                               liblistno,
13704                                               sizeof (Elf32_External_Lib),
13705                                               _("liblist section data"));
13706       if (elib)
13707         {
13708           printf (_("\nSection '.liblist' contains %lu entries:\n"),
13709                   (unsigned long) liblistno);
13710           fputs (_("     Library              Time Stamp          Checksum   Version Flags\n"),
13711                  stdout);
13712
13713           for (cnt = 0; cnt < liblistno; ++cnt)
13714             {
13715               Elf32_Lib liblist;
13716               time_t atime;
13717               char timebuf[20];
13718               struct tm * tmp;
13719
13720               liblist.l_name = BYTE_GET (elib[cnt].l_name);
13721               atime = BYTE_GET (elib[cnt].l_time_stamp);
13722               liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
13723               liblist.l_version = BYTE_GET (elib[cnt].l_version);
13724               liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
13725
13726               tmp = gmtime (&atime);
13727               snprintf (timebuf, sizeof (timebuf),
13728                         "%04u-%02u-%02uT%02u:%02u:%02u",
13729                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
13730                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
13731
13732               printf ("%3lu: ", (unsigned long) cnt);
13733               if (VALID_DYNAMIC_NAME (liblist.l_name))
13734                 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
13735               else
13736                 printf (_("<corrupt: %9ld>"), liblist.l_name);
13737               printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
13738                       liblist.l_version);
13739
13740               if (liblist.l_flags == 0)
13741                 puts (_(" NONE"));
13742               else
13743                 {
13744                   static const struct
13745                   {
13746                     const char * name;
13747                     int bit;
13748                   }
13749                   l_flags_vals[] =
13750                   {
13751                     { " EXACT_MATCH", LL_EXACT_MATCH },
13752                     { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
13753                     { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
13754                     { " EXPORTS", LL_EXPORTS },
13755                     { " DELAY_LOAD", LL_DELAY_LOAD },
13756                     { " DELTA", LL_DELTA }
13757                   };
13758                   int flags = liblist.l_flags;
13759                   size_t fcnt;
13760
13761                   for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
13762                     if ((flags & l_flags_vals[fcnt].bit) != 0)
13763                       {
13764                         fputs (l_flags_vals[fcnt].name, stdout);
13765                         flags ^= l_flags_vals[fcnt].bit;
13766                       }
13767                   if (flags != 0)
13768                     printf (" %#x", (unsigned int) flags);
13769
13770                   puts ("");
13771                 }
13772             }
13773
13774           free (elib);
13775         }
13776     }
13777
13778   if (options_offset != 0)
13779     {
13780       Elf_External_Options * eopt;
13781       Elf_Internal_Options * iopt;
13782       Elf_Internal_Options * option;
13783       size_t offset;
13784       int cnt;
13785       sect = section_headers;
13786
13787       /* Find the section header so that we get the size.  */
13788       sect = find_section_by_type (SHT_MIPS_OPTIONS);
13789       /* PR 17533 file: 012-277276-0.004.  */ 
13790       if (sect == NULL)
13791         {
13792           error (_("No MIPS_OPTIONS header found\n"));
13793           return 0;
13794         }
13795
13796       eopt = (Elf_External_Options *) get_data (NULL, file, options_offset, 1,
13797                                                 sect->sh_size, _("options"));
13798       if (eopt)
13799         {
13800           iopt = (Elf_Internal_Options *)
13801               cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
13802           if (iopt == NULL)
13803             {
13804               error (_("Out of memory allocatinf space for MIPS options\n"));
13805               return 0;
13806             }
13807
13808           offset = cnt = 0;
13809           option = iopt;
13810
13811           while (offset <= sect->sh_size - sizeof (* eopt))
13812             {
13813               Elf_External_Options * eoption;
13814
13815               eoption = (Elf_External_Options *) ((char *) eopt + offset);
13816
13817               option->kind = BYTE_GET (eoption->kind);
13818               option->size = BYTE_GET (eoption->size);
13819               option->section = BYTE_GET (eoption->section);
13820               option->info = BYTE_GET (eoption->info);
13821
13822               /* PR 17531: file: ffa0fa3b.  */
13823               if (option->size < sizeof (* eopt)
13824                   || offset + option->size > sect->sh_size)
13825                 {
13826                   warn (_("Invalid size (%u) for MIPS option\n"), option->size);
13827                   option->size = sizeof (* eopt);
13828                   break;
13829                 }
13830               offset += option->size;
13831                 
13832               ++option;
13833               ++cnt;
13834             }
13835
13836           printf (_("\nSection '%s' contains %d entries:\n"),
13837                   printable_section_name (sect), cnt);
13838
13839           option = iopt;
13840           offset = 0;
13841
13842           while (cnt-- > 0)
13843             {
13844               size_t len;
13845
13846               switch (option->kind)
13847                 {
13848                 case ODK_NULL:
13849                   /* This shouldn't happen.  */
13850                   printf (" NULL       %d %lx", option->section, option->info);
13851                   break;
13852                 case ODK_REGINFO:
13853                   printf (" REGINFO    ");
13854                   if (elf_header.e_machine == EM_MIPS)
13855                     {
13856                       /* 32bit form.  */
13857                       Elf32_External_RegInfo * ereg;
13858                       Elf32_RegInfo reginfo;
13859
13860                       ereg = (Elf32_External_RegInfo *) (option + 1);
13861                       reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
13862                       reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
13863                       reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
13864                       reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
13865                       reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
13866                       reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
13867
13868                       printf ("GPR %08lx  GP 0x%lx\n",
13869                               reginfo.ri_gprmask,
13870                               (unsigned long) reginfo.ri_gp_value);
13871                       printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
13872                               reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
13873                               reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
13874                     }
13875                   else
13876                     {
13877                       /* 64 bit form.  */
13878                       Elf64_External_RegInfo * ereg;
13879                       Elf64_Internal_RegInfo reginfo;
13880
13881                       ereg = (Elf64_External_RegInfo *) (option + 1);
13882                       reginfo.ri_gprmask    = BYTE_GET (ereg->ri_gprmask);
13883                       reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
13884                       reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
13885                       reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
13886                       reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
13887                       reginfo.ri_gp_value   = BYTE_GET (ereg->ri_gp_value);
13888
13889                       printf ("GPR %08lx  GP 0x",
13890                               reginfo.ri_gprmask);
13891                       printf_vma (reginfo.ri_gp_value);
13892                       printf ("\n");
13893
13894                       printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
13895                               reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
13896                               reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
13897                     }
13898                   ++option;
13899                   continue;
13900                 case ODK_EXCEPTIONS:
13901                   fputs (" EXCEPTIONS fpe_min(", stdout);
13902                   process_mips_fpe_exception (option->info & OEX_FPU_MIN);
13903                   fputs (") fpe_max(", stdout);
13904                   process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
13905                   fputs (")", stdout);
13906
13907                   if (option->info & OEX_PAGE0)
13908                     fputs (" PAGE0", stdout);
13909                   if (option->info & OEX_SMM)
13910                     fputs (" SMM", stdout);
13911                   if (option->info & OEX_FPDBUG)
13912                     fputs (" FPDBUG", stdout);
13913                   if (option->info & OEX_DISMISS)
13914                     fputs (" DISMISS", stdout);
13915                   break;
13916                 case ODK_PAD:
13917                   fputs (" PAD       ", stdout);
13918                   if (option->info & OPAD_PREFIX)
13919                     fputs (" PREFIX", stdout);
13920                   if (option->info & OPAD_POSTFIX)
13921                     fputs (" POSTFIX", stdout);
13922                   if (option->info & OPAD_SYMBOL)
13923                     fputs (" SYMBOL", stdout);
13924                   break;
13925                 case ODK_HWPATCH:
13926                   fputs (" HWPATCH   ", stdout);
13927                   if (option->info & OHW_R4KEOP)
13928                     fputs (" R4KEOP", stdout);
13929                   if (option->info & OHW_R8KPFETCH)
13930                     fputs (" R8KPFETCH", stdout);
13931                   if (option->info & OHW_R5KEOP)
13932                     fputs (" R5KEOP", stdout);
13933                   if (option->info & OHW_R5KCVTL)
13934                     fputs (" R5KCVTL", stdout);
13935                   break;
13936                 case ODK_FILL:
13937                   fputs (" FILL       ", stdout);
13938                   /* XXX Print content of info word?  */
13939                   break;
13940                 case ODK_TAGS:
13941                   fputs (" TAGS       ", stdout);
13942                   /* XXX Print content of info word?  */
13943                   break;
13944                 case ODK_HWAND:
13945                   fputs (" HWAND     ", stdout);
13946                   if (option->info & OHWA0_R4KEOP_CHECKED)
13947                     fputs (" R4KEOP_CHECKED", stdout);
13948                   if (option->info & OHWA0_R4KEOP_CLEAN)
13949                     fputs (" R4KEOP_CLEAN", stdout);
13950                   break;
13951                 case ODK_HWOR:
13952                   fputs (" HWOR      ", stdout);
13953                   if (option->info & OHWA0_R4KEOP_CHECKED)
13954                     fputs (" R4KEOP_CHECKED", stdout);
13955                   if (option->info & OHWA0_R4KEOP_CLEAN)
13956                     fputs (" R4KEOP_CLEAN", stdout);
13957                   break;
13958                 case ODK_GP_GROUP:
13959                   printf (" GP_GROUP  %#06lx  self-contained %#06lx",
13960                           option->info & OGP_GROUP,
13961                           (option->info & OGP_SELF) >> 16);
13962                   break;
13963                 case ODK_IDENT:
13964                   printf (" IDENT     %#06lx  self-contained %#06lx",
13965                           option->info & OGP_GROUP,
13966                           (option->info & OGP_SELF) >> 16);
13967                   break;
13968                 default:
13969                   /* This shouldn't happen.  */
13970                   printf (" %3d ???     %d %lx",
13971                           option->kind, option->section, option->info);
13972                   break;
13973                 }
13974
13975               len = sizeof (* eopt);
13976               while (len < option->size)
13977                 {
13978                   char datum = * ((char *) eopt + offset + len);
13979
13980                   if (ISPRINT (datum))
13981                     printf ("%c", datum);
13982                   else
13983                     printf ("\\%03o", datum);
13984                   len ++;
13985                 }
13986               fputs ("\n", stdout);
13987
13988               offset += option->size;
13989               ++option;
13990             }
13991
13992           free (eopt);
13993         }
13994     }
13995
13996   if (conflicts_offset != 0 && conflictsno != 0)
13997     {
13998       Elf32_Conflict * iconf;
13999       size_t cnt;
14000
14001       if (dynamic_symbols == NULL)
14002         {
14003           error (_("conflict list found without a dynamic symbol table\n"));
14004           return 0;
14005         }
14006
14007       iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
14008       if (iconf == NULL)
14009         {
14010           error (_("Out of memory allocating space for dynamic conflicts\n"));
14011           return 0;
14012         }
14013
14014       if (is_32bit_elf)
14015         {
14016           Elf32_External_Conflict * econf32;
14017
14018           econf32 = (Elf32_External_Conflict *)
14019               get_data (NULL, file, conflicts_offset, conflictsno,
14020                         sizeof (* econf32), _("conflict"));
14021           if (!econf32)
14022             return 0;
14023
14024           for (cnt = 0; cnt < conflictsno; ++cnt)
14025             iconf[cnt] = BYTE_GET (econf32[cnt]);
14026
14027           free (econf32);
14028         }
14029       else
14030         {
14031           Elf64_External_Conflict * econf64;
14032
14033           econf64 = (Elf64_External_Conflict *)
14034               get_data (NULL, file, conflicts_offset, conflictsno,
14035                         sizeof (* econf64), _("conflict"));
14036           if (!econf64)
14037             return 0;
14038
14039           for (cnt = 0; cnt < conflictsno; ++cnt)
14040             iconf[cnt] = BYTE_GET (econf64[cnt]);
14041
14042           free (econf64);
14043         }
14044
14045       printf (_("\nSection '.conflict' contains %lu entries:\n"),
14046               (unsigned long) conflictsno);
14047       puts (_("  Num:    Index       Value  Name"));
14048
14049       for (cnt = 0; cnt < conflictsno; ++cnt)
14050         {
14051           printf ("%5lu: %8lu  ", (unsigned long) cnt, iconf[cnt]);
14052
14053           if (iconf[cnt] >= num_dynamic_syms)
14054             printf (_("<corrupt symbol index>"));
14055           else
14056             {
14057               Elf_Internal_Sym * psym;
14058
14059               psym = & dynamic_symbols[iconf[cnt]];
14060               print_vma (psym->st_value, FULL_HEX);
14061               putchar (' ');
14062               if (VALID_DYNAMIC_NAME (psym->st_name))
14063                 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
14064               else
14065                 printf (_("<corrupt: %14ld>"), psym->st_name);
14066             }
14067           putchar ('\n');
14068         }
14069
14070       free (iconf);
14071     }
14072
14073   if (pltgot != 0 && local_gotno != 0)
14074     {
14075       bfd_vma ent, local_end, global_end;
14076       size_t i, offset;
14077       unsigned char * data;
14078       unsigned char * data_end;
14079       int addr_size;
14080
14081       ent = pltgot;
14082       addr_size = (is_32bit_elf ? 4 : 8);
14083       local_end = pltgot + local_gotno * addr_size;
14084
14085       /* PR binutils/17533 file: 012-111227-0.004  */
14086       if (symtabno < gotsym)
14087         {
14088           error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
14089                  (unsigned long) gotsym, (unsigned long) symtabno);
14090           return 0;
14091         }
14092
14093       global_end = local_end + (symtabno - gotsym) * addr_size;
14094       /* PR 17531: file: 54c91a34.  */
14095       if (global_end < local_end)
14096         {
14097           error (_("Too many GOT symbols: %lu\n"), (unsigned long) symtabno);
14098           return 0;
14099         }
14100       
14101       offset = offset_from_vma (file, pltgot, global_end - pltgot);
14102       data = (unsigned char *) get_data (NULL, file, offset,
14103                                          global_end - pltgot, 1,
14104                                          _("Global Offset Table data"));
14105       if (data == NULL)
14106         return 0;
14107       data_end = data + (global_end - pltgot);
14108
14109       printf (_("\nPrimary GOT:\n"));
14110       printf (_(" Canonical gp value: "));
14111       print_vma (pltgot + 0x7ff0, LONG_HEX);
14112       printf ("\n\n");
14113
14114       printf (_(" Reserved entries:\n"));
14115       printf (_("  %*s %10s %*s Purpose\n"),
14116               addr_size * 2, _("Address"), _("Access"),
14117               addr_size * 2, _("Initial"));
14118       ent = print_mips_got_entry (data, pltgot, ent, data_end);
14119       printf (_(" Lazy resolver\n"));
14120       if (ent == (bfd_vma) -1)
14121         goto got_print_fail;
14122       if (data
14123           && (byte_get (data + ent - pltgot, addr_size)
14124               >> (addr_size * 8 - 1)) != 0)
14125         {
14126           ent = print_mips_got_entry (data, pltgot, ent, data_end);
14127           printf (_(" Module pointer (GNU extension)\n"));
14128           if (ent == (bfd_vma) -1)
14129             goto got_print_fail;
14130         }
14131       printf ("\n");
14132
14133       if (ent < local_end)
14134         {
14135           printf (_(" Local entries:\n"));
14136           printf ("  %*s %10s %*s\n",
14137                   addr_size * 2, _("Address"), _("Access"),
14138                   addr_size * 2, _("Initial"));
14139           while (ent < local_end)
14140             {
14141               ent = print_mips_got_entry (data, pltgot, ent, data_end);
14142               printf ("\n");
14143               if (ent == (bfd_vma) -1)
14144                 goto got_print_fail;
14145             }
14146           printf ("\n");
14147         }
14148
14149       if (gotsym < symtabno)
14150         {
14151           int sym_width;
14152
14153           printf (_(" Global entries:\n"));
14154           printf ("  %*s %10s %*s %*s %-7s %3s %s\n",
14155                   addr_size * 2, _("Address"),
14156                   _("Access"),
14157                   addr_size * 2, _("Initial"),
14158                   addr_size * 2, _("Sym.Val."),
14159                   _("Type"),
14160                   /* Note for translators: "Ndx" = abbreviated form of "Index".  */
14161                   _("Ndx"), _("Name"));
14162
14163           sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
14164
14165           for (i = gotsym; i < symtabno; i++)
14166             {
14167               ent = print_mips_got_entry (data, pltgot, ent, data_end);
14168               printf (" ");
14169
14170               if (dynamic_symbols == NULL)
14171                 printf (_("<no dynamic symbols>"));
14172               else if (i < num_dynamic_syms)
14173                 {
14174                   Elf_Internal_Sym * psym = dynamic_symbols + i;
14175
14176                   print_vma (psym->st_value, LONG_HEX);
14177                   printf (" %-7s %3s ",
14178                           get_symbol_type (ELF_ST_TYPE (psym->st_info)),
14179                           get_symbol_index_type (psym->st_shndx));
14180
14181                   if (VALID_DYNAMIC_NAME (psym->st_name))
14182                     print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
14183                   else
14184                     printf (_("<corrupt: %14ld>"), psym->st_name);
14185                 }
14186               else
14187                 printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
14188                         (unsigned long) i);
14189
14190               printf ("\n");
14191               if (ent == (bfd_vma) -1)
14192                 break;
14193             }
14194           printf ("\n");
14195         }
14196
14197     got_print_fail:
14198       if (data)
14199         free (data);
14200     }
14201
14202   if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
14203     {
14204       bfd_vma ent, end;
14205       size_t offset, rel_offset;
14206       unsigned long count, i;
14207       unsigned char * data;
14208       int addr_size, sym_width;
14209       Elf_Internal_Rela * rels;
14210
14211       rel_offset = offset_from_vma (file, jmprel, pltrelsz);
14212       if (pltrel == DT_RELA)
14213         {
14214           if (!slurp_rela_relocs (file, rel_offset, pltrelsz, &rels, &count))
14215             return 0;
14216         }
14217       else
14218         {
14219           if (!slurp_rel_relocs (file, rel_offset, pltrelsz, &rels, &count))
14220             return 0;
14221         }
14222
14223       ent = mips_pltgot;
14224       addr_size = (is_32bit_elf ? 4 : 8);
14225       end = mips_pltgot + (2 + count) * addr_size;
14226
14227       offset = offset_from_vma (file, mips_pltgot, end - mips_pltgot);
14228       data = (unsigned char *) get_data (NULL, file, offset, end - mips_pltgot,
14229                                          1, _("Procedure Linkage Table data"));
14230       if (data == NULL)
14231         return 0;
14232
14233       printf ("\nPLT GOT:\n\n");
14234       printf (_(" Reserved entries:\n"));
14235       printf (_("  %*s %*s Purpose\n"),
14236               addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
14237       ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
14238       printf (_(" PLT lazy resolver\n"));
14239       ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
14240       printf (_(" Module pointer\n"));
14241       printf ("\n");
14242
14243       printf (_(" Entries:\n"));
14244       printf ("  %*s %*s %*s %-7s %3s %s\n",
14245               addr_size * 2, _("Address"),
14246               addr_size * 2, _("Initial"),
14247               addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
14248       sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
14249       for (i = 0; i < count; i++)
14250         {
14251           unsigned long idx = get_reloc_symindex (rels[i].r_info);
14252
14253           ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
14254           printf (" ");
14255
14256           if (idx >= num_dynamic_syms)
14257             printf (_("<corrupt symbol index: %lu>"), idx);
14258           else
14259             {
14260               Elf_Internal_Sym * psym = dynamic_symbols + idx;
14261
14262               print_vma (psym->st_value, LONG_HEX);
14263               printf (" %-7s %3s ",
14264                       get_symbol_type (ELF_ST_TYPE (psym->st_info)),
14265                       get_symbol_index_type (psym->st_shndx));
14266               if (VALID_DYNAMIC_NAME (psym->st_name))
14267                 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
14268               else
14269                 printf (_("<corrupt: %14ld>"), psym->st_name);
14270             }
14271           printf ("\n");
14272         }
14273       printf ("\n");
14274
14275       if (data)
14276         free (data);
14277       free (rels);
14278     }
14279
14280   return 1;
14281 }
14282
14283 static int
14284 process_nds32_specific (FILE * file)
14285 {
14286   Elf_Internal_Shdr *sect = NULL;
14287
14288   sect = find_section (".nds32_e_flags");
14289   if (sect != NULL)
14290     {
14291       unsigned int *flag;
14292
14293       printf ("\nNDS32 elf flags section:\n");
14294       flag = get_data (NULL, file, sect->sh_offset, 1,
14295                        sect->sh_size, _("NDS32 elf flags section"));
14296
14297       switch ((*flag) & 0x3)
14298         {
14299         case 0:
14300           printf ("(VEC_SIZE):\tNo entry.\n");
14301           break;
14302         case 1:
14303           printf ("(VEC_SIZE):\t4 bytes\n");
14304           break;
14305         case 2:
14306           printf ("(VEC_SIZE):\t16 bytes\n");
14307           break;
14308         case 3:
14309           printf ("(VEC_SIZE):\treserved\n");
14310           break;
14311         }
14312     }
14313
14314   return TRUE;
14315 }
14316
14317 static int
14318 process_gnu_liblist (FILE * file)
14319 {
14320   Elf_Internal_Shdr * section;
14321   Elf_Internal_Shdr * string_sec;
14322   Elf32_External_Lib * elib;
14323   char * strtab;
14324   size_t strtab_size;
14325   size_t cnt;
14326   unsigned i;
14327
14328   if (! do_arch)
14329     return 0;
14330
14331   for (i = 0, section = section_headers;
14332        i < elf_header.e_shnum;
14333        i++, section++)
14334     {
14335       switch (section->sh_type)
14336         {
14337         case SHT_GNU_LIBLIST:
14338           if (section->sh_link >= elf_header.e_shnum)
14339             break;
14340
14341           elib = (Elf32_External_Lib *)
14342               get_data (NULL, file, section->sh_offset, 1, section->sh_size,
14343                         _("liblist section data"));
14344
14345           if (elib == NULL)
14346             break;
14347           string_sec = section_headers + section->sh_link;
14348
14349           strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
14350                                       string_sec->sh_size,
14351                                       _("liblist string table"));
14352           if (strtab == NULL
14353               || section->sh_entsize != sizeof (Elf32_External_Lib))
14354             {
14355               free (elib);
14356               free (strtab);
14357               break;
14358             }
14359           strtab_size = string_sec->sh_size;
14360
14361           printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
14362                   printable_section_name (section),
14363                   (unsigned long) (section->sh_size / sizeof (Elf32_External_Lib)));
14364
14365           puts (_("     Library              Time Stamp          Checksum   Version Flags"));
14366
14367           for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
14368                ++cnt)
14369             {
14370               Elf32_Lib liblist;
14371               time_t atime;
14372               char timebuf[20];
14373               struct tm * tmp;
14374
14375               liblist.l_name = BYTE_GET (elib[cnt].l_name);
14376               atime = BYTE_GET (elib[cnt].l_time_stamp);
14377               liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
14378               liblist.l_version = BYTE_GET (elib[cnt].l_version);
14379               liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
14380
14381               tmp = gmtime (&atime);
14382               snprintf (timebuf, sizeof (timebuf),
14383                         "%04u-%02u-%02uT%02u:%02u:%02u",
14384                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
14385                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
14386
14387               printf ("%3lu: ", (unsigned long) cnt);
14388               if (do_wide)
14389                 printf ("%-20s", liblist.l_name < strtab_size
14390                         ? strtab + liblist.l_name : _("<corrupt>"));
14391               else
14392                 printf ("%-20.20s", liblist.l_name < strtab_size
14393                         ? strtab + liblist.l_name : _("<corrupt>"));
14394               printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
14395                       liblist.l_version, liblist.l_flags);
14396             }
14397
14398           free (elib);
14399           free (strtab);
14400         }
14401     }
14402
14403   return 1;
14404 }
14405
14406 static const char *
14407 get_note_type (unsigned e_type)
14408 {
14409   static char buff[64];
14410
14411   if (elf_header.e_type == ET_CORE)
14412     switch (e_type)
14413       {
14414       case NT_AUXV:
14415         return _("NT_AUXV (auxiliary vector)");
14416       case NT_PRSTATUS:
14417         return _("NT_PRSTATUS (prstatus structure)");
14418       case NT_FPREGSET:
14419         return _("NT_FPREGSET (floating point registers)");
14420       case NT_PRPSINFO:
14421         return _("NT_PRPSINFO (prpsinfo structure)");
14422       case NT_TASKSTRUCT:
14423         return _("NT_TASKSTRUCT (task structure)");
14424       case NT_PRXFPREG:
14425         return _("NT_PRXFPREG (user_xfpregs structure)");
14426       case NT_PPC_VMX:
14427         return _("NT_PPC_VMX (ppc Altivec registers)");
14428       case NT_PPC_VSX:
14429         return _("NT_PPC_VSX (ppc VSX registers)");
14430       case NT_386_TLS:
14431         return _("NT_386_TLS (x86 TLS information)");
14432       case NT_386_IOPERM:
14433         return _("NT_386_IOPERM (x86 I/O permissions)");
14434       case NT_X86_XSTATE:
14435         return _("NT_X86_XSTATE (x86 XSAVE extended state)");
14436       case NT_S390_HIGH_GPRS:
14437         return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
14438       case NT_S390_TIMER:
14439         return _("NT_S390_TIMER (s390 timer register)");
14440       case NT_S390_TODCMP:
14441         return _("NT_S390_TODCMP (s390 TOD comparator register)");
14442       case NT_S390_TODPREG:
14443         return _("NT_S390_TODPREG (s390 TOD programmable register)");
14444       case NT_S390_CTRS:
14445         return _("NT_S390_CTRS (s390 control registers)");
14446       case NT_S390_PREFIX:
14447         return _("NT_S390_PREFIX (s390 prefix register)");
14448       case NT_S390_LAST_BREAK:
14449         return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
14450       case NT_S390_SYSTEM_CALL:
14451         return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
14452       case NT_S390_TDB:
14453         return _("NT_S390_TDB (s390 transaction diagnostic block)");
14454       case NT_ARM_VFP:
14455         return _("NT_ARM_VFP (arm VFP registers)");
14456       case NT_ARM_TLS:
14457         return _("NT_ARM_TLS (AArch TLS registers)");
14458       case NT_ARM_HW_BREAK:
14459         return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
14460       case NT_ARM_HW_WATCH:
14461         return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
14462       case NT_PSTATUS:
14463         return _("NT_PSTATUS (pstatus structure)");
14464       case NT_FPREGS:
14465         return _("NT_FPREGS (floating point registers)");
14466       case NT_PSINFO:
14467         return _("NT_PSINFO (psinfo structure)");
14468       case NT_LWPSTATUS:
14469         return _("NT_LWPSTATUS (lwpstatus_t structure)");
14470       case NT_LWPSINFO:
14471         return _("NT_LWPSINFO (lwpsinfo_t structure)");
14472       case NT_WIN32PSTATUS:
14473         return _("NT_WIN32PSTATUS (win32_pstatus structure)");
14474       case NT_SIGINFO:
14475         return _("NT_SIGINFO (siginfo_t data)");
14476       case NT_FILE:
14477         return _("NT_FILE (mapped files)");
14478       default:
14479         break;
14480       }
14481   else
14482     switch (e_type)
14483       {
14484       case NT_VERSION:
14485         return _("NT_VERSION (version)");
14486       case NT_ARCH:
14487         return _("NT_ARCH (architecture)");
14488       default:
14489         break;
14490       }
14491
14492   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
14493   return buff;
14494 }
14495
14496 static int
14497 print_core_note (Elf_Internal_Note *pnote)
14498 {
14499   unsigned int addr_size = is_32bit_elf ? 4 : 8;
14500   bfd_vma count, page_size;
14501   unsigned char *descdata, *filenames, *descend;
14502
14503   if (pnote->type != NT_FILE)
14504     return 1;
14505
14506 #ifndef BFD64
14507   if (!is_32bit_elf)
14508     {
14509       printf (_("    Cannot decode 64-bit note in 32-bit build\n"));
14510       /* Still "successful".  */
14511       return 1;
14512     }
14513 #endif
14514
14515   if (pnote->descsz < 2 * addr_size)
14516     {
14517       printf (_("    Malformed note - too short for header\n"));
14518       return 0;
14519     }
14520
14521   descdata = (unsigned char *) pnote->descdata;
14522   descend = descdata + pnote->descsz;
14523
14524   if (descdata[pnote->descsz - 1] != '\0')
14525     {
14526       printf (_("    Malformed note - does not end with \\0\n"));
14527       return 0;
14528     }
14529
14530   count = byte_get (descdata, addr_size);
14531   descdata += addr_size;
14532
14533   page_size = byte_get (descdata, addr_size);
14534   descdata += addr_size;
14535
14536   if (pnote->descsz < 2 * addr_size + count * 3 * addr_size)
14537     {
14538       printf (_("    Malformed note - too short for supplied file count\n"));
14539       return 0;
14540     }
14541
14542   printf (_("    Page size: "));
14543   print_vma (page_size, DEC);
14544   printf ("\n");
14545
14546   printf (_("    %*s%*s%*s\n"),
14547           (int) (2 + 2 * addr_size), _("Start"),
14548           (int) (4 + 2 * addr_size), _("End"),
14549           (int) (4 + 2 * addr_size), _("Page Offset"));
14550   filenames = descdata + count * 3 * addr_size;
14551   while (--count > 0)
14552     {
14553       bfd_vma start, end, file_ofs;
14554
14555       if (filenames == descend)
14556         {
14557           printf (_("    Malformed note - filenames end too early\n"));
14558           return 0;
14559         }
14560
14561       start = byte_get (descdata, addr_size);
14562       descdata += addr_size;
14563       end = byte_get (descdata, addr_size);
14564       descdata += addr_size;
14565       file_ofs = byte_get (descdata, addr_size);
14566       descdata += addr_size;
14567
14568       printf ("    ");
14569       print_vma (start, FULL_HEX);
14570       printf ("  ");
14571       print_vma (end, FULL_HEX);
14572       printf ("  ");
14573       print_vma (file_ofs, FULL_HEX);
14574       printf ("\n        %s\n", filenames);
14575
14576       filenames += 1 + strlen ((char *) filenames);
14577     }
14578
14579   return 1;
14580 }
14581
14582 static const char *
14583 get_gnu_elf_note_type (unsigned e_type)
14584 {
14585   static char buff[64];
14586
14587   switch (e_type)
14588     {
14589     case NT_GNU_ABI_TAG:
14590       return _("NT_GNU_ABI_TAG (ABI version tag)");
14591     case NT_GNU_HWCAP:
14592       return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
14593     case NT_GNU_BUILD_ID:
14594       return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
14595     case NT_GNU_GOLD_VERSION:
14596       return _("NT_GNU_GOLD_VERSION (gold version)");
14597     default:
14598       break;
14599     }
14600
14601   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
14602   return buff;
14603 }
14604
14605 static int
14606 print_gnu_note (Elf_Internal_Note *pnote)
14607 {
14608   switch (pnote->type)
14609     {
14610     case NT_GNU_BUILD_ID:
14611       {
14612         unsigned long i;
14613
14614         printf (_("    Build ID: "));
14615         for (i = 0; i < pnote->descsz; ++i)
14616           printf ("%02x", pnote->descdata[i] & 0xff);
14617         printf ("\n");
14618       }
14619       break;
14620
14621     case NT_GNU_ABI_TAG:
14622       {
14623         unsigned long os, major, minor, subminor;
14624         const char *osname;
14625
14626         /* PR 17531: file: 030-599401-0.004.  */
14627         if (pnote->descsz < 16)
14628           {
14629             printf (_("    <corrupt GNU_ABI_TAG>\n"));
14630             break;
14631           }
14632
14633         os = byte_get ((unsigned char *) pnote->descdata, 4);
14634         major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
14635         minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
14636         subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
14637
14638         switch (os)
14639           {
14640           case GNU_ABI_TAG_LINUX:
14641             osname = "Linux";
14642             break;
14643           case GNU_ABI_TAG_HURD:
14644             osname = "Hurd";
14645             break;
14646           case GNU_ABI_TAG_SOLARIS:
14647             osname = "Solaris";
14648             break;
14649           case GNU_ABI_TAG_FREEBSD:
14650             osname = "FreeBSD";
14651             break;
14652           case GNU_ABI_TAG_NETBSD:
14653             osname = "NetBSD";
14654             break;
14655           default:
14656             osname = "Unknown";
14657             break;
14658           }
14659
14660         printf (_("    OS: %s, ABI: %ld.%ld.%ld\n"), osname,
14661                 major, minor, subminor);
14662       }
14663       break;
14664
14665     case NT_GNU_GOLD_VERSION:
14666       {
14667         unsigned long i;
14668
14669         printf (_("    Version: "));
14670         for (i = 0; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
14671           printf ("%c", pnote->descdata[i]);
14672         printf ("\n");
14673       }
14674       break;
14675     }
14676
14677   return 1;
14678 }
14679
14680 static const char *
14681 get_netbsd_elfcore_note_type (unsigned e_type)
14682 {
14683   static char buff[64];
14684
14685   if (e_type == NT_NETBSDCORE_PROCINFO)
14686     {
14687       /* NetBSD core "procinfo" structure.  */
14688       return _("NetBSD procinfo structure");
14689     }
14690
14691   /* As of Jan 2002 there are no other machine-independent notes
14692      defined for NetBSD core files.  If the note type is less
14693      than the start of the machine-dependent note types, we don't
14694      understand it.  */
14695
14696   if (e_type < NT_NETBSDCORE_FIRSTMACH)
14697     {
14698       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
14699       return buff;
14700     }
14701
14702   switch (elf_header.e_machine)
14703     {
14704     /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
14705        and PT_GETFPREGS == mach+2.  */
14706
14707     case EM_OLD_ALPHA:
14708     case EM_ALPHA:
14709     case EM_SPARC:
14710     case EM_SPARC32PLUS:
14711     case EM_SPARCV9:
14712       switch (e_type)
14713         {
14714         case NT_NETBSDCORE_FIRSTMACH + 0:
14715           return _("PT_GETREGS (reg structure)");
14716         case NT_NETBSDCORE_FIRSTMACH + 2:
14717           return _("PT_GETFPREGS (fpreg structure)");
14718         default:
14719           break;
14720         }
14721       break;
14722
14723     /* On all other arch's, PT_GETREGS == mach+1 and
14724        PT_GETFPREGS == mach+3.  */
14725     default:
14726       switch (e_type)
14727         {
14728         case NT_NETBSDCORE_FIRSTMACH + 1:
14729           return _("PT_GETREGS (reg structure)");
14730         case NT_NETBSDCORE_FIRSTMACH + 3:
14731           return _("PT_GETFPREGS (fpreg structure)");
14732         default:
14733           break;
14734         }
14735     }
14736
14737   snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
14738             e_type - NT_NETBSDCORE_FIRSTMACH);
14739   return buff;
14740 }
14741
14742 static const char *
14743 get_stapsdt_note_type (unsigned e_type)
14744 {
14745   static char buff[64];
14746
14747   switch (e_type)
14748     {
14749     case NT_STAPSDT:
14750       return _("NT_STAPSDT (SystemTap probe descriptors)");
14751
14752     default:
14753       break;
14754     }
14755
14756   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
14757   return buff;
14758 }
14759
14760 static int
14761 print_stapsdt_note (Elf_Internal_Note *pnote)
14762 {
14763   int addr_size = is_32bit_elf ? 4 : 8;
14764   char *data = pnote->descdata;
14765   char *data_end = pnote->descdata + pnote->descsz;
14766   bfd_vma pc, base_addr, semaphore;
14767   char *provider, *probe, *arg_fmt;
14768
14769   pc = byte_get ((unsigned char *) data, addr_size);
14770   data += addr_size;
14771   base_addr = byte_get ((unsigned char *) data, addr_size);
14772   data += addr_size;
14773   semaphore = byte_get ((unsigned char *) data, addr_size);
14774   data += addr_size;
14775
14776   provider = data;
14777   data += strlen (data) + 1;
14778   probe = data;
14779   data += strlen (data) + 1;
14780   arg_fmt = data;
14781   data += strlen (data) + 1;
14782
14783   printf (_("    Provider: %s\n"), provider);
14784   printf (_("    Name: %s\n"), probe);
14785   printf (_("    Location: "));
14786   print_vma (pc, FULL_HEX);
14787   printf (_(", Base: "));
14788   print_vma (base_addr, FULL_HEX);
14789   printf (_(", Semaphore: "));
14790   print_vma (semaphore, FULL_HEX);
14791   printf ("\n");
14792   printf (_("    Arguments: %s\n"), arg_fmt);
14793
14794   return data == data_end;
14795 }
14796
14797 static const char *
14798 get_ia64_vms_note_type (unsigned e_type)
14799 {
14800   static char buff[64];
14801
14802   switch (e_type)
14803     {
14804     case NT_VMS_MHD:
14805       return _("NT_VMS_MHD (module header)");
14806     case NT_VMS_LNM:
14807       return _("NT_VMS_LNM (language name)");
14808     case NT_VMS_SRC:
14809       return _("NT_VMS_SRC (source files)");
14810     case NT_VMS_TITLE:
14811       return "NT_VMS_TITLE";
14812     case NT_VMS_EIDC:
14813       return _("NT_VMS_EIDC (consistency check)");
14814     case NT_VMS_FPMODE:
14815       return _("NT_VMS_FPMODE (FP mode)");
14816     case NT_VMS_LINKTIME:
14817       return "NT_VMS_LINKTIME";
14818     case NT_VMS_IMGNAM:
14819       return _("NT_VMS_IMGNAM (image name)");
14820     case NT_VMS_IMGID:
14821       return _("NT_VMS_IMGID (image id)");
14822     case NT_VMS_LINKID:
14823       return _("NT_VMS_LINKID (link id)");
14824     case NT_VMS_IMGBID:
14825       return _("NT_VMS_IMGBID (build id)");
14826     case NT_VMS_GSTNAM:
14827       return _("NT_VMS_GSTNAM (sym table name)");
14828     case NT_VMS_ORIG_DYN:
14829       return "NT_VMS_ORIG_DYN";
14830     case NT_VMS_PATCHTIME:
14831       return "NT_VMS_PATCHTIME";
14832     default:
14833       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
14834       return buff;
14835     }
14836 }
14837
14838 static int
14839 print_ia64_vms_note (Elf_Internal_Note * pnote)
14840 {
14841   switch (pnote->type)
14842     {
14843     case NT_VMS_MHD:
14844       if (pnote->descsz > 36)
14845         {
14846           size_t l = strlen (pnote->descdata + 34);
14847           printf (_("    Creation date  : %.17s\n"), pnote->descdata);
14848           printf (_("    Last patch date: %.17s\n"), pnote->descdata + 17);
14849           printf (_("    Module name    : %s\n"), pnote->descdata + 34);
14850           printf (_("    Module version : %s\n"), pnote->descdata + 34 + l + 1);
14851         }
14852       else
14853         printf (_("    Invalid size\n"));
14854       break;
14855     case NT_VMS_LNM:
14856       printf (_("   Language: %s\n"), pnote->descdata);
14857       break;
14858 #ifdef BFD64
14859     case NT_VMS_FPMODE:
14860       printf (_("   Floating Point mode: "));
14861       printf ("0x%016" BFD_VMA_FMT "x\n",
14862               (bfd_vma)byte_get ((unsigned char *)pnote->descdata, 8));
14863       break;
14864     case NT_VMS_LINKTIME:
14865       printf (_("   Link time: "));
14866       print_vms_time
14867         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
14868       printf ("\n");
14869       break;
14870     case NT_VMS_PATCHTIME:
14871       printf (_("   Patch time: "));
14872       print_vms_time
14873         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
14874       printf ("\n");
14875       break;
14876     case NT_VMS_ORIG_DYN:
14877       printf (_("   Major id: %u,  minor id: %u\n"),
14878               (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
14879               (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
14880       printf (_("   Last modified  : "));
14881       print_vms_time
14882         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
14883       printf (_("\n   Link flags  : "));
14884       printf ("0x%016" BFD_VMA_FMT "x\n",
14885               (bfd_vma)byte_get ((unsigned char *)pnote->descdata + 16, 8));
14886       printf (_("   Header flags: 0x%08x\n"),
14887               (unsigned)byte_get ((unsigned char *)pnote->descdata + 24, 4));
14888       printf (_("   Image id    : %s\n"), pnote->descdata + 32);
14889       break;
14890 #endif
14891     case NT_VMS_IMGNAM:
14892       printf (_("    Image name: %s\n"), pnote->descdata);
14893       break;
14894     case NT_VMS_GSTNAM:
14895       printf (_("    Global symbol table name: %s\n"), pnote->descdata);
14896       break;
14897     case NT_VMS_IMGID:
14898       printf (_("    Image id: %s\n"), pnote->descdata);
14899       break;
14900     case NT_VMS_LINKID:
14901       printf (_("    Linker id: %s\n"), pnote->descdata);
14902       break;
14903     default:
14904       break;
14905     }
14906   return 1;
14907 }
14908
14909 /* Note that by the ELF standard, the name field is already null byte
14910    terminated, and namesz includes the terminating null byte.
14911    I.E. the value of namesz for the name "FSF" is 4.
14912
14913    If the value of namesz is zero, there is no name present.  */
14914 static int
14915 process_note (Elf_Internal_Note * pnote)
14916 {
14917   const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
14918   const char * nt;
14919
14920   if (pnote->namesz == 0)
14921     /* If there is no note name, then use the default set of
14922        note type strings.  */
14923     nt = get_note_type (pnote->type);
14924
14925   else if (const_strneq (pnote->namedata, "GNU"))
14926     /* GNU-specific object file notes.  */
14927     nt = get_gnu_elf_note_type (pnote->type);
14928
14929   else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
14930     /* NetBSD-specific core file notes.  */
14931     nt = get_netbsd_elfcore_note_type (pnote->type);
14932
14933   else if (strneq (pnote->namedata, "SPU/", 4))
14934     {
14935       /* SPU-specific core file notes.  */
14936       nt = pnote->namedata + 4;
14937       name = "SPU";
14938     }
14939
14940   else if (const_strneq (pnote->namedata, "IPF/VMS"))
14941     /* VMS/ia64-specific file notes.  */
14942     nt = get_ia64_vms_note_type (pnote->type);
14943
14944   else if (const_strneq (pnote->namedata, "stapsdt"))
14945     nt = get_stapsdt_note_type (pnote->type);
14946
14947   else
14948     /* Don't recognize this note name; just use the default set of
14949        note type strings.  */
14950     nt = get_note_type (pnote->type);
14951
14952   printf ("  %-20s 0x%08lx\t%s\n", name, pnote->descsz, nt);
14953
14954   if (const_strneq (pnote->namedata, "IPF/VMS"))
14955     return print_ia64_vms_note (pnote);
14956   else if (const_strneq (pnote->namedata, "GNU"))
14957     return print_gnu_note (pnote);
14958   else if (const_strneq (pnote->namedata, "stapsdt"))
14959     return print_stapsdt_note (pnote);
14960   else if (const_strneq (pnote->namedata, "CORE"))
14961     return print_core_note (pnote);
14962   else
14963     return 1;
14964 }
14965
14966
14967 static int
14968 process_corefile_note_segment (FILE * file, bfd_vma offset, bfd_vma length)
14969 {
14970   Elf_External_Note * pnotes;
14971   Elf_External_Note * external;
14972   int res = 1;
14973
14974   if (length <= 0)
14975     return 0;
14976
14977   pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
14978                                            _("notes"));
14979   if (pnotes == NULL)
14980     return 0;
14981
14982   external = pnotes;
14983
14984   printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
14985           (unsigned long) offset, (unsigned long) length);
14986   printf (_("  %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
14987
14988   while ((char *) external < (char *) pnotes + length)
14989     {
14990       Elf_Internal_Note inote;
14991       size_t min_notesz;
14992       char *next;
14993       char * temp = NULL;
14994       size_t data_remaining = ((char *) pnotes + length) - (char *) external;
14995
14996       if (!is_ia64_vms ())
14997         {
14998           /* PR binutils/15191
14999              Make sure that there is enough data to read.  */
15000           min_notesz = offsetof (Elf_External_Note, name);
15001           if (data_remaining < min_notesz)
15002             {
15003               warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
15004                     (int) data_remaining);
15005               break;
15006             }
15007           inote.type     = BYTE_GET (external->type);
15008           inote.namesz   = BYTE_GET (external->namesz);
15009           inote.namedata = external->name;
15010           inote.descsz   = BYTE_GET (external->descsz);
15011           inote.descdata = inote.namedata + align_power (inote.namesz, 2);
15012           inote.descpos  = offset + (inote.descdata - (char *) pnotes);
15013           next = inote.descdata + align_power (inote.descsz, 2);
15014         }
15015       else
15016         {
15017           Elf64_External_VMS_Note *vms_external;
15018
15019           /* PR binutils/15191
15020              Make sure that there is enough data to read.  */
15021           min_notesz = offsetof (Elf64_External_VMS_Note, name);
15022           if (data_remaining < min_notesz)
15023             {
15024               warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
15025                     (int) data_remaining);
15026               break;
15027             }
15028
15029           vms_external = (Elf64_External_VMS_Note *) external;
15030           inote.type     = BYTE_GET (vms_external->type);
15031           inote.namesz   = BYTE_GET (vms_external->namesz);
15032           inote.namedata = vms_external->name;
15033           inote.descsz   = BYTE_GET (vms_external->descsz);
15034           inote.descdata = inote.namedata + align_power (inote.namesz, 3);
15035           inote.descpos  = offset + (inote.descdata - (char *) pnotes);
15036           next = inote.descdata + align_power (inote.descsz, 3);
15037         }
15038
15039       if (inote.descdata < (char *) external + min_notesz
15040           || next < (char *) external + min_notesz
15041           /* PR binutils/17531: file: id:000000,sig:11,src:006986,op:havoc,rep:4.  */
15042           || inote.namedata + inote.namesz < inote.namedata
15043           || inote.descdata + inote.descsz < inote.descdata
15044           || data_remaining < (size_t)(next - (char *) external))
15045         {
15046           warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
15047                 (unsigned long) ((char *) external - (char *) pnotes));
15048           warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx\n"),
15049                 inote.type, inote.namesz, inote.descsz);
15050           break;
15051         }
15052
15053       external = (Elf_External_Note *) next;
15054
15055       /* Verify that name is null terminated.  It appears that at least
15056          one version of Linux (RedHat 6.0) generates corefiles that don't
15057          comply with the ELF spec by failing to include the null byte in
15058          namesz.  */
15059       if (inote.namedata[inote.namesz - 1] != '\0')
15060         {
15061           temp = (char *) malloc (inote.namesz + 1);
15062           if (temp == NULL)
15063             {
15064               error (_("Out of memory allocating space for inote name\n"));
15065               res = 0;
15066               break;
15067             }
15068
15069           strncpy (temp, inote.namedata, inote.namesz);
15070           temp[inote.namesz] = 0;
15071
15072           /* warn (_("'%s' NOTE name not properly null terminated\n"), temp);  */
15073           inote.namedata = temp;
15074         }
15075
15076       res &= process_note (& inote);
15077
15078       if (temp != NULL)
15079         {
15080           free (temp);
15081           temp = NULL;
15082         }
15083     }
15084
15085   free (pnotes);
15086
15087   return res;
15088 }
15089
15090 static int
15091 process_corefile_note_segments (FILE * file)
15092 {
15093   Elf_Internal_Phdr * segment;
15094   unsigned int i;
15095   int res = 1;
15096
15097   if (! get_program_headers (file))
15098       return 0;
15099
15100   for (i = 0, segment = program_headers;
15101        i < elf_header.e_phnum;
15102        i++, segment++)
15103     {
15104       if (segment->p_type == PT_NOTE)
15105         res &= process_corefile_note_segment (file,
15106                                               (bfd_vma) segment->p_offset,
15107                                               (bfd_vma) segment->p_filesz);
15108     }
15109
15110   return res;
15111 }
15112
15113 static int
15114 process_note_sections (FILE * file)
15115 {
15116   Elf_Internal_Shdr * section;
15117   unsigned long i;
15118   int n = 0;
15119   int res = 1;
15120
15121   for (i = 0, section = section_headers;
15122        i < elf_header.e_shnum && section != NULL;
15123        i++, section++)
15124     if (section->sh_type == SHT_NOTE)
15125       {
15126         res &= process_corefile_note_segment (file,
15127                                               (bfd_vma) section->sh_offset,
15128                                               (bfd_vma) section->sh_size);
15129         n++;
15130       }
15131
15132   if (n == 0)
15133     /* Try processing NOTE segments instead.  */
15134     return process_corefile_note_segments (file);
15135
15136   return res;
15137 }
15138
15139 static int
15140 process_notes (FILE * file)
15141 {
15142   /* If we have not been asked to display the notes then do nothing.  */
15143   if (! do_notes)
15144     return 1;
15145
15146   if (elf_header.e_type != ET_CORE)
15147     return process_note_sections (file);
15148
15149   /* No program headers means no NOTE segment.  */
15150   if (elf_header.e_phnum > 0)
15151     return process_corefile_note_segments (file);
15152
15153   printf (_("No note segments present in the core file.\n"));
15154   return 1;
15155 }
15156
15157 static int
15158 process_arch_specific (FILE * file)
15159 {
15160   if (! do_arch)
15161     return 1;
15162
15163   switch (elf_header.e_machine)
15164     {
15165     case EM_ARM:
15166       return process_arm_specific (file);
15167     case EM_MIPS:
15168     case EM_MIPS_RS3_LE:
15169       return process_mips_specific (file);
15170       break;
15171     case EM_NDS32:
15172       return process_nds32_specific (file);
15173       break;
15174     case EM_PPC:
15175       return process_power_specific (file);
15176       break;
15177     case EM_SPARC:
15178     case EM_SPARC32PLUS:
15179     case EM_SPARCV9:
15180       return process_sparc_specific (file);
15181       break;
15182     case EM_TI_C6000:
15183       return process_tic6x_specific (file);
15184       break;
15185     case EM_MSP430:
15186       return process_msp430x_specific (file);
15187     default:
15188       break;
15189     }
15190   return 1;
15191 }
15192
15193 static int
15194 get_file_header (FILE * file)
15195 {
15196   /* Read in the identity array.  */
15197   if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
15198     return 0;
15199
15200   /* Determine how to read the rest of the header.  */
15201   switch (elf_header.e_ident[EI_DATA])
15202     {
15203     default: /* fall through */
15204     case ELFDATANONE: /* fall through */
15205     case ELFDATA2LSB:
15206       byte_get = byte_get_little_endian;
15207       byte_put = byte_put_little_endian;
15208       break;
15209     case ELFDATA2MSB:
15210       byte_get = byte_get_big_endian;
15211       byte_put = byte_put_big_endian;
15212       break;
15213     }
15214
15215   /* For now we only support 32 bit and 64 bit ELF files.  */
15216   is_32bit_elf = (elf_header.e_ident[EI_CLASS] != ELFCLASS64);
15217
15218   /* Read in the rest of the header.  */
15219   if (is_32bit_elf)
15220     {
15221       Elf32_External_Ehdr ehdr32;
15222
15223       if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
15224         return 0;
15225
15226       elf_header.e_type      = BYTE_GET (ehdr32.e_type);
15227       elf_header.e_machine   = BYTE_GET (ehdr32.e_machine);
15228       elf_header.e_version   = BYTE_GET (ehdr32.e_version);
15229       elf_header.e_entry     = BYTE_GET (ehdr32.e_entry);
15230       elf_header.e_phoff     = BYTE_GET (ehdr32.e_phoff);
15231       elf_header.e_shoff     = BYTE_GET (ehdr32.e_shoff);
15232       elf_header.e_flags     = BYTE_GET (ehdr32.e_flags);
15233       elf_header.e_ehsize    = BYTE_GET (ehdr32.e_ehsize);
15234       elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
15235       elf_header.e_phnum     = BYTE_GET (ehdr32.e_phnum);
15236       elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
15237       elf_header.e_shnum     = BYTE_GET (ehdr32.e_shnum);
15238       elf_header.e_shstrndx  = BYTE_GET (ehdr32.e_shstrndx);
15239     }
15240   else
15241     {
15242       Elf64_External_Ehdr ehdr64;
15243
15244       /* If we have been compiled with sizeof (bfd_vma) == 4, then
15245          we will not be able to cope with the 64bit data found in
15246          64 ELF files.  Detect this now and abort before we start
15247          overwriting things.  */
15248       if (sizeof (bfd_vma) < 8)
15249         {
15250           error (_("This instance of readelf has been built without support for a\n\
15251 64 bit data type and so it cannot read 64 bit ELF files.\n"));
15252           return 0;
15253         }
15254
15255       if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
15256         return 0;
15257
15258       elf_header.e_type      = BYTE_GET (ehdr64.e_type);
15259       elf_header.e_machine   = BYTE_GET (ehdr64.e_machine);
15260       elf_header.e_version   = BYTE_GET (ehdr64.e_version);
15261       elf_header.e_entry     = BYTE_GET (ehdr64.e_entry);
15262       elf_header.e_phoff     = BYTE_GET (ehdr64.e_phoff);
15263       elf_header.e_shoff     = BYTE_GET (ehdr64.e_shoff);
15264       elf_header.e_flags     = BYTE_GET (ehdr64.e_flags);
15265       elf_header.e_ehsize    = BYTE_GET (ehdr64.e_ehsize);
15266       elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
15267       elf_header.e_phnum     = BYTE_GET (ehdr64.e_phnum);
15268       elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
15269       elf_header.e_shnum     = BYTE_GET (ehdr64.e_shnum);
15270       elf_header.e_shstrndx  = BYTE_GET (ehdr64.e_shstrndx);
15271     }
15272
15273   if (elf_header.e_shoff)
15274     {
15275       /* There may be some extensions in the first section header.  Don't
15276          bomb if we can't read it.  */
15277       if (is_32bit_elf)
15278         get_32bit_section_headers (file, TRUE);
15279       else
15280         get_64bit_section_headers (file, TRUE);
15281     }
15282
15283   return 1;
15284 }
15285
15286 /* Process one ELF object file according to the command line options.
15287    This file may actually be stored in an archive.  The file is
15288    positioned at the start of the ELF object.  */
15289
15290 static int
15291 process_object (char * file_name, FILE * file)
15292 {
15293   unsigned int i;
15294
15295   if (! get_file_header (file))
15296     {
15297       error (_("%s: Failed to read file header\n"), file_name);
15298       return 1;
15299     }
15300
15301   /* Initialise per file variables.  */
15302   for (i = ARRAY_SIZE (version_info); i--;)
15303     version_info[i] = 0;
15304
15305   for (i = ARRAY_SIZE (dynamic_info); i--;)
15306     dynamic_info[i] = 0;
15307   dynamic_info_DT_GNU_HASH = 0;
15308
15309   /* Process the file.  */
15310   if (show_name)
15311     printf (_("\nFile: %s\n"), file_name);
15312
15313   /* Initialise the dump_sects array from the cmdline_dump_sects array.
15314      Note we do this even if cmdline_dump_sects is empty because we
15315      must make sure that the dump_sets array is zeroed out before each
15316      object file is processed.  */
15317   if (num_dump_sects > num_cmdline_dump_sects)
15318     memset (dump_sects, 0, num_dump_sects * sizeof (* dump_sects));
15319
15320   if (num_cmdline_dump_sects > 0)
15321     {
15322       if (num_dump_sects == 0)
15323         /* A sneaky way of allocating the dump_sects array.  */
15324         request_dump_bynumber (num_cmdline_dump_sects, 0);
15325
15326       assert (num_dump_sects >= num_cmdline_dump_sects);
15327       memcpy (dump_sects, cmdline_dump_sects,
15328               num_cmdline_dump_sects * sizeof (* dump_sects));
15329     }
15330
15331   if (! process_file_header ())
15332     return 1;
15333
15334   if (! process_section_headers (file))
15335     {
15336       /* Without loaded section headers we cannot process lots of
15337          things.  */
15338       do_unwind = do_version = do_dump = do_arch = 0;
15339
15340       if (! do_using_dynamic)
15341         do_syms = do_dyn_syms = do_reloc = 0;
15342     }
15343
15344   if (! process_section_groups (file))
15345     {
15346       /* Without loaded section groups we cannot process unwind.  */
15347       do_unwind = 0;
15348     }
15349
15350   if (process_program_headers (file))
15351     process_dynamic_section (file);
15352
15353   process_relocs (file);
15354
15355   process_unwind (file);
15356
15357   process_symbol_table (file);
15358
15359   process_syminfo (file);
15360
15361   process_version_sections (file);
15362
15363   process_section_contents (file);
15364
15365   process_notes (file);
15366
15367   process_gnu_liblist (file);
15368
15369   process_arch_specific (file);
15370
15371   if (program_headers)
15372     {
15373       free (program_headers);
15374       program_headers = NULL;
15375     }
15376
15377   if (section_headers)
15378     {
15379       free (section_headers);
15380       section_headers = NULL;
15381     }
15382
15383   if (string_table)
15384     {
15385       free (string_table);
15386       string_table = NULL;
15387       string_table_length = 0;
15388     }
15389
15390   if (dynamic_strings)
15391     {
15392       free (dynamic_strings);
15393       dynamic_strings = NULL;
15394       dynamic_strings_length = 0;
15395     }
15396
15397   if (dynamic_symbols)
15398     {
15399       free (dynamic_symbols);
15400       dynamic_symbols = NULL;
15401       num_dynamic_syms = 0;
15402     }
15403
15404   if (dynamic_syminfo)
15405     {
15406       free (dynamic_syminfo);
15407       dynamic_syminfo = NULL;
15408     }
15409
15410   if (dynamic_section)
15411     {
15412       free (dynamic_section);
15413       dynamic_section = NULL;
15414     }
15415
15416   if (section_headers_groups)
15417     {
15418       free (section_headers_groups);
15419       section_headers_groups = NULL;
15420     }
15421
15422   if (section_groups)
15423     {
15424       struct group_list * g;
15425       struct group_list * next;
15426
15427       for (i = 0; i < group_count; i++)
15428         {
15429           for (g = section_groups [i].root; g != NULL; g = next)
15430             {
15431               next = g->next;
15432               free (g);
15433             }
15434         }
15435
15436       free (section_groups);
15437       section_groups = NULL;
15438     }
15439
15440   free_debug_memory ();
15441
15442   return 0;
15443 }
15444
15445 /* Process an ELF archive.
15446    On entry the file is positioned just after the ARMAG string.  */
15447
15448 static int
15449 process_archive (char * file_name, FILE * file, bfd_boolean is_thin_archive)
15450 {
15451   struct archive_info arch;
15452   struct archive_info nested_arch;
15453   size_t got;
15454   int ret;
15455
15456   show_name = 1;
15457
15458   /* The ARCH structure is used to hold information about this archive.  */
15459   arch.file_name = NULL;
15460   arch.file = NULL;
15461   arch.index_array = NULL;
15462   arch.sym_table = NULL;
15463   arch.longnames = NULL;
15464
15465   /* The NESTED_ARCH structure is used as a single-item cache of information
15466      about a nested archive (when members of a thin archive reside within
15467      another regular archive file).  */
15468   nested_arch.file_name = NULL;
15469   nested_arch.file = NULL;
15470   nested_arch.index_array = NULL;
15471   nested_arch.sym_table = NULL;
15472   nested_arch.longnames = NULL;
15473
15474   if (setup_archive (&arch, file_name, file, is_thin_archive, do_archive_index) != 0)
15475     {
15476       ret = 1;
15477       goto out;
15478     }
15479
15480   if (do_archive_index)
15481     {
15482       if (arch.sym_table == NULL)
15483         error (_("%s: unable to dump the index as none was found\n"), file_name);
15484       else
15485         {
15486           unsigned long i, l;
15487           unsigned long current_pos;
15488
15489           printf (_("Index of archive %s: (%lu entries, 0x%lx bytes in the symbol table)\n"),
15490                   file_name, (unsigned long) arch.index_num, arch.sym_size);
15491           current_pos = ftell (file);
15492
15493           for (i = l = 0; i < arch.index_num; i++)
15494             {
15495               if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
15496                 {
15497                   char * member_name;
15498
15499                   member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
15500
15501                   if (member_name != NULL)
15502                     {
15503                       char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
15504
15505                       if (qualified_name != NULL)
15506                         {
15507                           printf (_("Contents of binary %s at offset "), qualified_name);
15508                           (void) print_vma (arch.index_array[i], PREFIX_HEX);
15509                           putchar ('\n');
15510                           free (qualified_name);
15511                         }
15512                     }
15513                 }
15514
15515               if (l >= arch.sym_size)
15516                 {
15517                   error (_("%s: end of the symbol table reached before the end of the index\n"),
15518                          file_name);
15519                   break;
15520                 }
15521               /* PR 17531: file: 0b6630b2.  */
15522               printf ("\t%.*s\n", (int) (arch.sym_size - l), arch.sym_table + l);
15523               l += strnlen (arch.sym_table + l, arch.sym_size - l) + 1;
15524             }
15525
15526           if (arch.uses_64bit_indicies)
15527             l = (l + 7) & ~ 7;
15528           else
15529             l += l & 1;
15530
15531           if (l < arch.sym_size)
15532             error (_("%s: %ld bytes remain in the symbol table, but without corresponding entries in the index table\n"),
15533                    file_name, arch.sym_size - l);
15534
15535           if (fseek (file, current_pos, SEEK_SET) != 0)
15536             {
15537               error (_("%s: failed to seek back to start of object files in the archive\n"), file_name);
15538               ret = 1;
15539               goto out;
15540             }
15541         }
15542
15543       if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
15544           && !do_segments && !do_header && !do_dump && !do_version
15545           && !do_histogram && !do_debugging && !do_arch && !do_notes
15546           && !do_section_groups && !do_dyn_syms)
15547         {
15548           ret = 0; /* Archive index only.  */
15549           goto out;
15550         }
15551     }
15552
15553   ret = 0;
15554
15555   while (1)
15556     {
15557       char * name;
15558       size_t namelen;
15559       char * qualified_name;
15560
15561       /* Read the next archive header.  */
15562       if (fseek (file, arch.next_arhdr_offset, SEEK_SET) != 0)
15563         {
15564           error (_("%s: failed to seek to next archive header\n"), file_name);
15565           return 1;
15566         }
15567       got = fread (&arch.arhdr, 1, sizeof arch.arhdr, file);
15568       if (got != sizeof arch.arhdr)
15569         {
15570           if (got == 0)
15571             break;
15572           error (_("%s: failed to read archive header\n"), file_name);
15573           ret = 1;
15574           break;
15575         }
15576       if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
15577         {
15578           error (_("%s: did not find a valid archive header\n"), arch.file_name);
15579           ret = 1;
15580           break;
15581         }
15582
15583       arch.next_arhdr_offset += sizeof arch.arhdr;
15584
15585       archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
15586       if (archive_file_size & 01)
15587         ++archive_file_size;
15588
15589       name = get_archive_member_name (&arch, &nested_arch);
15590       if (name == NULL)
15591         {
15592           error (_("%s: bad archive file name\n"), file_name);
15593           ret = 1;
15594           break;
15595         }
15596       namelen = strlen (name);
15597
15598       qualified_name = make_qualified_name (&arch, &nested_arch, name);
15599       if (qualified_name == NULL)
15600         {
15601           error (_("%s: bad archive file name\n"), file_name);
15602           ret = 1;
15603           break;
15604         }
15605
15606       if (is_thin_archive && arch.nested_member_origin == 0)
15607         {
15608           /* This is a proxy for an external member of a thin archive.  */
15609           FILE * member_file;
15610           char * member_file_name = adjust_relative_path (file_name, name, namelen);
15611           if (member_file_name == NULL)
15612             {
15613               ret = 1;
15614               break;
15615             }
15616
15617           member_file = fopen (member_file_name, "rb");
15618           if (member_file == NULL)
15619             {
15620               error (_("Input file '%s' is not readable.\n"), member_file_name);
15621               free (member_file_name);
15622               ret = 1;
15623               break;
15624             }
15625
15626           archive_file_offset = arch.nested_member_origin;
15627
15628           ret |= process_object (qualified_name, member_file);
15629
15630           fclose (member_file);
15631           free (member_file_name);
15632         }
15633       else if (is_thin_archive)
15634         {
15635           /* PR 15140: Allow for corrupt thin archives.  */
15636           if (nested_arch.file == NULL)
15637             {
15638               error (_("%s: contains corrupt thin archive: %s\n"),
15639                      file_name, name);
15640               ret = 1;
15641               break;
15642             }
15643
15644           /* This is a proxy for a member of a nested archive.  */
15645           archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
15646
15647           /* The nested archive file will have been opened and setup by
15648              get_archive_member_name.  */
15649           if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
15650             {
15651               error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
15652               ret = 1;
15653               break;
15654             }
15655
15656           ret |= process_object (qualified_name, nested_arch.file);
15657         }
15658       else
15659         {
15660           archive_file_offset = arch.next_arhdr_offset;
15661           arch.next_arhdr_offset += archive_file_size;
15662
15663           ret |= process_object (qualified_name, file);
15664         }
15665
15666       if (dump_sects != NULL)
15667         {
15668           free (dump_sects);
15669           dump_sects = NULL;
15670           num_dump_sects = 0;
15671         }
15672
15673       free (qualified_name);
15674     }
15675
15676  out:
15677   if (nested_arch.file != NULL)
15678     fclose (nested_arch.file);
15679   release_archive (&nested_arch);
15680   release_archive (&arch);
15681
15682   return ret;
15683 }
15684
15685 static int
15686 process_file (char * file_name)
15687 {
15688   FILE * file;
15689   struct stat statbuf;
15690   char armag[SARMAG];
15691   int ret;
15692
15693   if (stat (file_name, &statbuf) < 0)
15694     {
15695       if (errno == ENOENT)
15696         error (_("'%s': No such file\n"), file_name);
15697       else
15698         error (_("Could not locate '%s'.  System error message: %s\n"),
15699                file_name, strerror (errno));
15700       return 1;
15701     }
15702
15703   if (! S_ISREG (statbuf.st_mode))
15704     {
15705       error (_("'%s' is not an ordinary file\n"), file_name);
15706       return 1;
15707     }
15708
15709   file = fopen (file_name, "rb");
15710   if (file == NULL)
15711     {
15712       error (_("Input file '%s' is not readable.\n"), file_name);
15713       return 1;
15714     }
15715
15716   if (fread (armag, SARMAG, 1, file) != 1)
15717     {
15718       error (_("%s: Failed to read file's magic number\n"), file_name);
15719       fclose (file);
15720       return 1;
15721     }
15722
15723   current_file_size = (bfd_size_type) statbuf.st_size;
15724
15725   if (memcmp (armag, ARMAG, SARMAG) == 0)
15726     ret = process_archive (file_name, file, FALSE);
15727   else if (memcmp (armag, ARMAGT, SARMAG) == 0)
15728     ret = process_archive (file_name, file, TRUE);
15729   else
15730     {
15731       if (do_archive_index)
15732         error (_("File %s is not an archive so its index cannot be displayed.\n"),
15733                file_name);
15734
15735       rewind (file);
15736       archive_file_size = archive_file_offset = 0;
15737       ret = process_object (file_name, file);
15738     }
15739
15740   fclose (file);
15741
15742   current_file_size = 0;
15743   return ret;
15744 }
15745
15746 #ifdef SUPPORT_DISASSEMBLY
15747 /* Needed by the i386 disassembler.  For extra credit, someone could
15748    fix this so that we insert symbolic addresses here, esp for GOT/PLT
15749    symbols.  */
15750
15751 void
15752 print_address (unsigned int addr, FILE * outfile)
15753 {
15754   fprintf (outfile,"0x%8.8x", addr);
15755 }
15756
15757 /* Needed by the i386 disassembler.  */
15758 void
15759 db_task_printsym (unsigned int addr)
15760 {
15761   print_address (addr, stderr);
15762 }
15763 #endif
15764
15765 int
15766 main (int argc, char ** argv)
15767 {
15768   int err;
15769
15770 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
15771   setlocale (LC_MESSAGES, "");
15772 #endif
15773 #if defined (HAVE_SETLOCALE)
15774   setlocale (LC_CTYPE, "");
15775 #endif
15776   bindtextdomain (PACKAGE, LOCALEDIR);
15777   textdomain (PACKAGE);
15778
15779   expandargv (&argc, &argv);
15780
15781   parse_args (argc, argv);
15782
15783   if (num_dump_sects > 0)
15784     {
15785       /* Make a copy of the dump_sects array.  */
15786       cmdline_dump_sects = (dump_type *)
15787           malloc (num_dump_sects * sizeof (* dump_sects));
15788       if (cmdline_dump_sects == NULL)
15789         error (_("Out of memory allocating dump request table.\n"));
15790       else
15791         {
15792           memcpy (cmdline_dump_sects, dump_sects,
15793                   num_dump_sects * sizeof (* dump_sects));
15794           num_cmdline_dump_sects = num_dump_sects;
15795         }
15796     }
15797
15798   if (optind < (argc - 1))
15799     show_name = 1;
15800
15801   err = 0;
15802   while (optind < argc)
15803     err |= process_file (argv[optind++]);
15804
15805   if (dump_sects != NULL)
15806     free (dump_sects);
15807   if (cmdline_dump_sects != NULL)
15808     free (cmdline_dump_sects);
15809
15810   return err;
15811 }