ChangeLog rotatation and copyright year update
[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           if (! const_strneq (relname, "R_IA64_SEGREL"))
6647             {
6648               warn (_("Skipping unexpected relocation type %s\n"), relname);
6649               continue;
6650             }
6651
6652           i = rp->r_offset / (3 * eh_addr_size);
6653
6654           /* PR 17531: file: 5bc8d9bf.  */
6655           if (i >= aux->table_len)
6656             {
6657               warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
6658               continue;
6659             }
6660
6661           switch (rp->r_offset / eh_addr_size % 3)
6662             {
6663             case 0:
6664               aux->table[i].start.section = sym->st_shndx;
6665               aux->table[i].start.offset  = rp->r_addend + sym->st_value;
6666               break;
6667             case 1:
6668               aux->table[i].end.section   = sym->st_shndx;
6669               aux->table[i].end.offset    = rp->r_addend + sym->st_value;
6670               break;
6671             case 2:
6672               aux->table[i].info.section  = sym->st_shndx;
6673               aux->table[i].info.offset   = rp->r_addend + sym->st_value;
6674               break;
6675             default:
6676               break;
6677             }
6678         }
6679
6680       free (rela);
6681     }
6682
6683   return TRUE;
6684 }
6685
6686 static void
6687 ia64_process_unwind (FILE * file)
6688 {
6689   Elf_Internal_Shdr * sec;
6690   Elf_Internal_Shdr * unwsec = NULL;
6691   Elf_Internal_Shdr * strsec;
6692   unsigned long i, unwcount = 0, unwstart = 0;
6693   struct ia64_unw_aux_info aux;
6694
6695   memset (& aux, 0, sizeof (aux));
6696
6697   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
6698     {
6699       if (sec->sh_type == SHT_SYMTAB
6700           && sec->sh_link < elf_header.e_shnum)
6701         {
6702           aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
6703
6704           strsec = section_headers + sec->sh_link;
6705           if (aux.strtab != NULL)
6706             {
6707               error (_("Multiple auxillary string tables encountered\n"));
6708               free (aux.strtab);
6709             }
6710           aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
6711                                           1, strsec->sh_size,
6712                                           _("string table"));
6713           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
6714         }
6715       else if (sec->sh_type == SHT_IA_64_UNWIND)
6716         unwcount++;
6717     }
6718
6719   if (!unwcount)
6720     printf (_("\nThere are no unwind sections in this file.\n"));
6721
6722   while (unwcount-- > 0)
6723     {
6724       char * suffix;
6725       size_t len, len2;
6726
6727       for (i = unwstart, sec = section_headers + unwstart, unwsec = NULL;
6728            i < elf_header.e_shnum; ++i, ++sec)
6729         if (sec->sh_type == SHT_IA_64_UNWIND)
6730           {
6731             unwsec = sec;
6732             break;
6733           }
6734       /* We have already counted the number of SHT_IA64_UNWIND
6735          sections so the loop above should never fail.  */
6736       assert (unwsec != NULL);
6737
6738       unwstart = i + 1;
6739       len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
6740
6741       if ((unwsec->sh_flags & SHF_GROUP) != 0)
6742         {
6743           /* We need to find which section group it is in.  */
6744           struct group_list * g;
6745
6746           if (section_headers_groups == NULL
6747               || section_headers_groups [i] == NULL)
6748             i = elf_header.e_shnum;
6749           else
6750             {
6751               g = section_headers_groups [i]->root;
6752
6753               for (; g != NULL; g = g->next)
6754                 {
6755                   sec = section_headers + g->section_index;
6756
6757                   if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
6758                     break;
6759                 }
6760
6761               if (g == NULL)
6762                 i = elf_header.e_shnum;
6763             }
6764         }
6765       else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
6766         {
6767           /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO.  */
6768           len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
6769           suffix = SECTION_NAME (unwsec) + len;
6770           for (i = 0, sec = section_headers; i < elf_header.e_shnum;
6771                ++i, ++sec)
6772             if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
6773                 && streq (SECTION_NAME (sec) + len2, suffix))
6774               break;
6775         }
6776       else
6777         {
6778           /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
6779              .IA_64.unwind or BAR -> .IA_64.unwind_info.  */
6780           len = sizeof (ELF_STRING_ia64_unwind) - 1;
6781           len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
6782           suffix = "";
6783           if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
6784             suffix = SECTION_NAME (unwsec) + len;
6785           for (i = 0, sec = section_headers; i < elf_header.e_shnum;
6786                ++i, ++sec)
6787             if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
6788                 && streq (SECTION_NAME (sec) + len2, suffix))
6789               break;
6790         }
6791
6792       if (i == elf_header.e_shnum)
6793         {
6794           printf (_("\nCould not find unwind info section for "));
6795
6796           if (string_table == NULL)
6797             printf ("%d", unwsec->sh_name);
6798           else
6799             printf ("'%s'", printable_section_name (unwsec));
6800         }
6801       else
6802         {
6803           aux.info_addr = sec->sh_addr;
6804           aux.info = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1,
6805                                                  sec->sh_size,
6806                                                  _("unwind info"));
6807           aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
6808
6809           printf (_("\nUnwind section "));
6810
6811           if (string_table == NULL)
6812             printf ("%d", unwsec->sh_name);
6813           else
6814             printf ("'%s'", printable_section_name (unwsec));
6815
6816           printf (_(" at offset 0x%lx contains %lu entries:\n"),
6817                   (unsigned long) unwsec->sh_offset,
6818                   (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
6819
6820           if (slurp_ia64_unwind_table (file, & aux, unwsec)
6821               && aux.table_len > 0)
6822             dump_ia64_unwind (& aux);
6823
6824           if (aux.table)
6825             free ((char *) aux.table);
6826           if (aux.info)
6827             free ((char *) aux.info);
6828           aux.table = NULL;
6829           aux.info = NULL;
6830         }
6831     }
6832
6833   if (aux.symtab)
6834     free (aux.symtab);
6835   if (aux.strtab)
6836     free ((char *) aux.strtab);
6837 }
6838
6839 struct hppa_unw_table_entry
6840   {
6841     struct absaddr start;
6842     struct absaddr end;
6843     unsigned int Cannot_unwind:1;                       /* 0 */
6844     unsigned int Millicode:1;                   /* 1 */
6845     unsigned int Millicode_save_sr0:1;          /* 2 */
6846     unsigned int Region_description:2;          /* 3..4 */
6847     unsigned int reserved1:1;                   /* 5 */
6848     unsigned int Entry_SR:1;                    /* 6 */
6849     unsigned int Entry_FR:4;     /* number saved */     /* 7..10 */
6850     unsigned int Entry_GR:5;     /* number saved */     /* 11..15 */
6851     unsigned int Args_stored:1;                 /* 16 */
6852     unsigned int Variable_Frame:1;                      /* 17 */
6853     unsigned int Separate_Package_Body:1;               /* 18 */
6854     unsigned int Frame_Extension_Millicode:1;   /* 19 */
6855     unsigned int Stack_Overflow_Check:1;                /* 20 */
6856     unsigned int Two_Instruction_SP_Increment:1;        /* 21 */
6857     unsigned int Ada_Region:1;                  /* 22 */
6858     unsigned int cxx_info:1;                    /* 23 */
6859     unsigned int cxx_try_catch:1;                       /* 24 */
6860     unsigned int sched_entry_seq:1;                     /* 25 */
6861     unsigned int reserved2:1;                   /* 26 */
6862     unsigned int Save_SP:1;                             /* 27 */
6863     unsigned int Save_RP:1;                             /* 28 */
6864     unsigned int Save_MRP_in_frame:1;           /* 29 */
6865     unsigned int extn_ptr_defined:1;            /* 30 */
6866     unsigned int Cleanup_defined:1;                     /* 31 */
6867
6868     unsigned int MPE_XL_interrupt_marker:1;             /* 0 */
6869     unsigned int HP_UX_interrupt_marker:1;              /* 1 */
6870     unsigned int Large_frame:1;                 /* 2 */
6871     unsigned int Pseudo_SP_Set:1;                       /* 3 */
6872     unsigned int reserved4:1;                   /* 4 */
6873     unsigned int Total_frame_size:27;           /* 5..31 */
6874   };
6875
6876 struct hppa_unw_aux_info
6877   {
6878     struct hppa_unw_table_entry *table; /* Unwind table.  */
6879     unsigned long table_len;    /* Length of unwind table.  */
6880     bfd_vma seg_base;           /* Starting address of segment.  */
6881     Elf_Internal_Sym * symtab;  /* The symbol table.  */
6882     unsigned long nsyms;        /* Number of symbols.  */
6883     char * strtab;              /* The string table.  */
6884     unsigned long strtab_size;  /* Size of string table.  */
6885   };
6886
6887 static void
6888 dump_hppa_unwind (struct hppa_unw_aux_info * aux)
6889 {
6890   struct hppa_unw_table_entry * tp;
6891
6892   for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
6893     {
6894       bfd_vma offset;
6895       const char * procname;
6896
6897       find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
6898                                aux->strtab_size, tp->start, &procname,
6899                                &offset);
6900
6901       fputs ("\n<", stdout);
6902
6903       if (procname)
6904         {
6905           fputs (procname, stdout);
6906
6907           if (offset)
6908             printf ("+%lx", (unsigned long) offset);
6909         }
6910
6911       fputs (">: [", stdout);
6912       print_vma (tp->start.offset, PREFIX_HEX);
6913       fputc ('-', stdout);
6914       print_vma (tp->end.offset, PREFIX_HEX);
6915       printf ("]\n\t");
6916
6917 #define PF(_m) if (tp->_m) printf (#_m " ");
6918 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
6919       PF(Cannot_unwind);
6920       PF(Millicode);
6921       PF(Millicode_save_sr0);
6922       /* PV(Region_description);  */
6923       PF(Entry_SR);
6924       PV(Entry_FR);
6925       PV(Entry_GR);
6926       PF(Args_stored);
6927       PF(Variable_Frame);
6928       PF(Separate_Package_Body);
6929       PF(Frame_Extension_Millicode);
6930       PF(Stack_Overflow_Check);
6931       PF(Two_Instruction_SP_Increment);
6932       PF(Ada_Region);
6933       PF(cxx_info);
6934       PF(cxx_try_catch);
6935       PF(sched_entry_seq);
6936       PF(Save_SP);
6937       PF(Save_RP);
6938       PF(Save_MRP_in_frame);
6939       PF(extn_ptr_defined);
6940       PF(Cleanup_defined);
6941       PF(MPE_XL_interrupt_marker);
6942       PF(HP_UX_interrupt_marker);
6943       PF(Large_frame);
6944       PF(Pseudo_SP_Set);
6945       PV(Total_frame_size);
6946 #undef PF
6947 #undef PV
6948     }
6949
6950   printf ("\n");
6951 }
6952
6953 static int
6954 slurp_hppa_unwind_table (FILE * file,
6955                          struct hppa_unw_aux_info * aux,
6956                          Elf_Internal_Shdr * sec)
6957 {
6958   unsigned long size, unw_ent_size, nentries, nrelas, i;
6959   Elf_Internal_Phdr * seg;
6960   struct hppa_unw_table_entry * tep;
6961   Elf_Internal_Shdr * relsec;
6962   Elf_Internal_Rela * rela;
6963   Elf_Internal_Rela * rp;
6964   unsigned char * table;
6965   unsigned char * tp;
6966   Elf_Internal_Sym * sym;
6967   const char * relname;
6968
6969   /* First, find the starting address of the segment that includes
6970      this section.  */
6971
6972   if (elf_header.e_phnum)
6973     {
6974       if (! get_program_headers (file))
6975         return 0;
6976
6977       for (seg = program_headers;
6978            seg < program_headers + elf_header.e_phnum;
6979            ++seg)
6980         {
6981           if (seg->p_type != PT_LOAD)
6982             continue;
6983
6984           if (sec->sh_addr >= seg->p_vaddr
6985               && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
6986             {
6987               aux->seg_base = seg->p_vaddr;
6988               break;
6989             }
6990         }
6991     }
6992
6993   /* Second, build the unwind table from the contents of the unwind
6994      section.  */
6995   size = sec->sh_size;
6996   table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
6997                                       _("unwind table"));
6998   if (!table)
6999     return 0;
7000
7001   unw_ent_size = 16;
7002   nentries = size / unw_ent_size;
7003   size = unw_ent_size * nentries;
7004
7005   tep = aux->table = (struct hppa_unw_table_entry *)
7006       xcmalloc (nentries, sizeof (aux->table[0]));
7007
7008   for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
7009     {
7010       unsigned int tmp1, tmp2;
7011
7012       tep->start.section = SHN_UNDEF;
7013       tep->end.section   = SHN_UNDEF;
7014
7015       tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
7016       tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
7017       tmp1 = byte_get ((unsigned char *) tp + 8, 4);
7018       tmp2 = byte_get ((unsigned char *) tp + 12, 4);
7019
7020       tep->start.offset += aux->seg_base;
7021       tep->end.offset   += aux->seg_base;
7022
7023       tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
7024       tep->Millicode = (tmp1 >> 30) & 0x1;
7025       tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
7026       tep->Region_description = (tmp1 >> 27) & 0x3;
7027       tep->reserved1 = (tmp1 >> 26) & 0x1;
7028       tep->Entry_SR = (tmp1 >> 25) & 0x1;
7029       tep->Entry_FR = (tmp1 >> 21) & 0xf;
7030       tep->Entry_GR = (tmp1 >> 16) & 0x1f;
7031       tep->Args_stored = (tmp1 >> 15) & 0x1;
7032       tep->Variable_Frame = (tmp1 >> 14) & 0x1;
7033       tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
7034       tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
7035       tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
7036       tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
7037       tep->Ada_Region = (tmp1 >> 9) & 0x1;
7038       tep->cxx_info = (tmp1 >> 8) & 0x1;
7039       tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
7040       tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
7041       tep->reserved2 = (tmp1 >> 5) & 0x1;
7042       tep->Save_SP = (tmp1 >> 4) & 0x1;
7043       tep->Save_RP = (tmp1 >> 3) & 0x1;
7044       tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
7045       tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
7046       tep->Cleanup_defined = tmp1 & 0x1;
7047
7048       tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
7049       tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
7050       tep->Large_frame = (tmp2 >> 29) & 0x1;
7051       tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
7052       tep->reserved4 = (tmp2 >> 27) & 0x1;
7053       tep->Total_frame_size = tmp2 & 0x7ffffff;
7054     }
7055   free (table);
7056
7057   /* Third, apply any relocations to the unwind table.  */
7058   for (relsec = section_headers;
7059        relsec < section_headers + elf_header.e_shnum;
7060        ++relsec)
7061     {
7062       if (relsec->sh_type != SHT_RELA
7063           || relsec->sh_info >= elf_header.e_shnum
7064           || section_headers + relsec->sh_info != sec)
7065         continue;
7066
7067       if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7068                               & rela, & nrelas))
7069         return 0;
7070
7071       for (rp = rela; rp < rela + nrelas; ++rp)
7072         {
7073           relname = elf_hppa_reloc_type (get_reloc_type (rp->r_info));
7074           sym = aux->symtab + get_reloc_symindex (rp->r_info);
7075
7076           /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64.  */
7077           if (! const_strneq (relname, "R_PARISC_SEGREL"))
7078             {
7079               warn (_("Skipping unexpected relocation type %s\n"), relname);
7080               continue;
7081             }
7082
7083           i = rp->r_offset / unw_ent_size;
7084
7085           switch ((rp->r_offset % unw_ent_size) / eh_addr_size)
7086             {
7087             case 0:
7088               aux->table[i].start.section = sym->st_shndx;
7089               aux->table[i].start.offset  = sym->st_value + rp->r_addend;
7090               break;
7091             case 1:
7092               aux->table[i].end.section   = sym->st_shndx;
7093               aux->table[i].end.offset    = sym->st_value + rp->r_addend;
7094               break;
7095             default:
7096               break;
7097             }
7098         }
7099
7100       free (rela);
7101     }
7102
7103   aux->table_len = nentries;
7104
7105   return 1;
7106 }
7107
7108 static void
7109 hppa_process_unwind (FILE * file)
7110 {
7111   struct hppa_unw_aux_info aux;
7112   Elf_Internal_Shdr * unwsec = NULL;
7113   Elf_Internal_Shdr * strsec;
7114   Elf_Internal_Shdr * sec;
7115   unsigned long i;
7116
7117   if (string_table == NULL)
7118     return;
7119
7120   memset (& aux, 0, sizeof (aux));
7121
7122   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7123     {
7124       if (sec->sh_type == SHT_SYMTAB
7125           && sec->sh_link < elf_header.e_shnum)
7126         {
7127           aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
7128
7129           strsec = section_headers + sec->sh_link;
7130           if (aux.strtab != NULL)
7131             {
7132               error (_("Multiple auxillary string tables encountered\n"));
7133               free (aux.strtab);
7134             }
7135           aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
7136                                           1, strsec->sh_size,
7137                                           _("string table"));
7138           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7139         }
7140       else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
7141         unwsec = sec;
7142     }
7143
7144   if (!unwsec)
7145     printf (_("\nThere are no unwind sections in this file.\n"));
7146
7147   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7148     {
7149       if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
7150         {
7151           printf (_("\nUnwind section '%s' at offset 0x%lx contains %lu entries:\n"),
7152                   printable_section_name (sec),
7153                   (unsigned long) sec->sh_offset,
7154                   (unsigned long) (sec->sh_size / (2 * eh_addr_size + 8)));
7155
7156           slurp_hppa_unwind_table (file, &aux, sec);
7157           if (aux.table_len > 0)
7158             dump_hppa_unwind (&aux);
7159
7160           if (aux.table)
7161             free ((char *) aux.table);
7162           aux.table = NULL;
7163         }
7164     }
7165
7166   if (aux.symtab)
7167     free (aux.symtab);
7168   if (aux.strtab)
7169     free ((char *) aux.strtab);
7170 }
7171
7172 struct arm_section
7173 {
7174   unsigned char *      data;            /* The unwind data.  */
7175   Elf_Internal_Shdr *  sec;             /* The cached unwind section header.  */
7176   Elf_Internal_Rela *  rela;            /* The cached relocations for this section.  */
7177   unsigned long        nrelas;          /* The number of relocations.  */
7178   unsigned int         rel_type;        /* REL or RELA ?  */
7179   Elf_Internal_Rela *  next_rela;       /* Cyclic pointer to the next reloc to process.  */
7180 };
7181
7182 struct arm_unw_aux_info
7183 {
7184   FILE *              file;             /* The file containing the unwind sections.  */
7185   Elf_Internal_Sym *  symtab;           /* The file's symbol table.  */
7186   unsigned long       nsyms;            /* Number of symbols.  */
7187   char *              strtab;           /* The file's string table.  */
7188   unsigned long       strtab_size;      /* Size of string table.  */
7189 };
7190
7191 static const char *
7192 arm_print_vma_and_name (struct arm_unw_aux_info *aux,
7193                         bfd_vma fn, struct absaddr addr)
7194 {
7195   const char *procname;
7196   bfd_vma sym_offset;
7197
7198   if (addr.section == SHN_UNDEF)
7199     addr.offset = fn;
7200
7201   find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
7202                            aux->strtab_size, addr, &procname,
7203                            &sym_offset);
7204
7205   print_vma (fn, PREFIX_HEX);
7206
7207   if (procname)
7208     {
7209       fputs (" <", stdout);
7210       fputs (procname, stdout);
7211
7212       if (sym_offset)
7213         printf ("+0x%lx", (unsigned long) sym_offset);
7214       fputc ('>', stdout);
7215     }
7216
7217   return procname;
7218 }
7219
7220 static void
7221 arm_free_section (struct arm_section *arm_sec)
7222 {
7223   if (arm_sec->data != NULL)
7224     free (arm_sec->data);
7225
7226   if (arm_sec->rela != NULL)
7227     free (arm_sec->rela);
7228 }
7229
7230 /* 1) If SEC does not match the one cached in ARM_SEC, then free the current
7231       cached section and install SEC instead.
7232    2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
7233       and return its valued in * WORDP, relocating if necessary.
7234    3) Update the NEXT_RELA field in ARM_SEC and store the section index and
7235       relocation's offset in ADDR.
7236    4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
7237       into the string table of the symbol associated with the reloc.  If no
7238       reloc was applied store -1 there.
7239    5) Return TRUE upon success, FALSE otherwise.  */
7240
7241 static bfd_boolean
7242 get_unwind_section_word (struct arm_unw_aux_info *  aux,
7243                          struct arm_section *       arm_sec,
7244                          Elf_Internal_Shdr *        sec,
7245                          bfd_vma                    word_offset,
7246                          unsigned int *             wordp,
7247                          struct absaddr *           addr,
7248                          bfd_vma *                  sym_name)
7249 {
7250   Elf_Internal_Rela *rp;
7251   Elf_Internal_Sym *sym;
7252   const char * relname;
7253   unsigned int word;
7254   bfd_boolean wrapped;
7255
7256   if (sec == NULL || arm_sec == NULL)
7257     return FALSE;
7258
7259   addr->section = SHN_UNDEF;
7260   addr->offset = 0;
7261
7262   if (sym_name != NULL)
7263     *sym_name = (bfd_vma) -1;
7264
7265   /* If necessary, update the section cache.  */
7266   if (sec != arm_sec->sec)
7267     {
7268       Elf_Internal_Shdr *relsec;
7269
7270       arm_free_section (arm_sec);
7271
7272       arm_sec->sec = sec;
7273       arm_sec->data = get_data (NULL, aux->file, sec->sh_offset, 1,
7274                                 sec->sh_size, _("unwind data"));
7275       arm_sec->rela = NULL;
7276       arm_sec->nrelas = 0;
7277
7278       for (relsec = section_headers;
7279            relsec < section_headers + elf_header.e_shnum;
7280            ++relsec)
7281         {
7282           if (relsec->sh_info >= elf_header.e_shnum
7283               || section_headers + relsec->sh_info != sec
7284               /* PR 15745: Check the section type as well.  */
7285               || (relsec->sh_type != SHT_REL
7286                   && relsec->sh_type != SHT_RELA))
7287             continue;
7288
7289           arm_sec->rel_type = relsec->sh_type;
7290           if (relsec->sh_type == SHT_REL)
7291             {
7292               if (!slurp_rel_relocs (aux->file, relsec->sh_offset,
7293                                      relsec->sh_size,
7294                                      & arm_sec->rela, & arm_sec->nrelas))
7295                 return FALSE;
7296             }
7297           else /* relsec->sh_type == SHT_RELA */
7298             {
7299               if (!slurp_rela_relocs (aux->file, relsec->sh_offset,
7300                                       relsec->sh_size,
7301                                       & arm_sec->rela, & arm_sec->nrelas))
7302                 return FALSE;
7303             }
7304           break;
7305         }
7306
7307       arm_sec->next_rela = arm_sec->rela;
7308     }
7309
7310   /* If there is no unwind data we can do nothing.  */
7311   if (arm_sec->data == NULL)
7312     return FALSE;
7313
7314   /* If the offset is invalid then fail.  */
7315   if (word_offset > sec->sh_size - 4)
7316     return FALSE;
7317
7318   /* Get the word at the required offset.  */
7319   word = byte_get (arm_sec->data + word_offset, 4);
7320
7321   /* PR 17531: file: id:000001,src:001266+003044,op:splice,rep:128.  */
7322   if (arm_sec->rela == NULL)
7323     {
7324       * wordp = word;
7325       return TRUE;
7326     }
7327
7328   /* Look through the relocs to find the one that applies to the provided offset.  */
7329   wrapped = FALSE;
7330   for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
7331     {
7332       bfd_vma prelval, offset;
7333
7334       if (rp->r_offset > word_offset && !wrapped)
7335         {
7336           rp = arm_sec->rela;
7337           wrapped = TRUE;
7338         }
7339       if (rp->r_offset > word_offset)
7340         break;
7341
7342       if (rp->r_offset & 3)
7343         {
7344           warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
7345                 (unsigned long) rp->r_offset);
7346           continue;
7347         }
7348
7349       if (rp->r_offset < word_offset)
7350         continue;
7351
7352       /* PR 17531: file: 027-161405-0.004  */
7353       if (aux->symtab == NULL)
7354         continue;
7355
7356       if (arm_sec->rel_type == SHT_REL)
7357         {
7358           offset = word & 0x7fffffff;
7359           if (offset & 0x40000000)
7360             offset |= ~ (bfd_vma) 0x7fffffff;
7361         }
7362       else if (arm_sec->rel_type == SHT_RELA)
7363         offset = rp->r_addend;
7364       else
7365         {
7366           error (_("Unknown section relocation type %d encountered\n"),
7367                  arm_sec->rel_type);
7368           break;
7369         }
7370
7371       /* PR 17531 file: 027-1241568-0.004.  */
7372       if (ELF32_R_SYM (rp->r_info) >= aux->nsyms)
7373         {
7374           error (_("Bad symbol index in unwind relocation (%lu > %lu)\n"),
7375                  (unsigned long) ELF32_R_SYM (rp->r_info), aux->nsyms);
7376           break;
7377         }
7378
7379       sym = aux->symtab + ELF32_R_SYM (rp->r_info);
7380       offset += sym->st_value;
7381       prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
7382
7383       /* Check that we are processing the expected reloc type.  */
7384       if (elf_header.e_machine == EM_ARM)
7385         {
7386           relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
7387           if (relname == NULL)
7388             {
7389               warn (_("Skipping unknown ARM relocation type: %d\n"),
7390                     (int) ELF32_R_TYPE (rp->r_info));
7391               continue;
7392             }
7393
7394           if (streq (relname, "R_ARM_NONE"))
7395               continue;
7396
7397           if (! streq (relname, "R_ARM_PREL31"))
7398             {
7399               warn (_("Skipping unexpected ARM relocation type %s\n"), relname);
7400               continue;
7401             }
7402         }
7403       else if (elf_header.e_machine == EM_TI_C6000)
7404         {
7405           relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
7406           if (relname == NULL)
7407             {
7408               warn (_("Skipping unknown C6000 relocation type: %d\n"),
7409                     (int) ELF32_R_TYPE (rp->r_info));
7410               continue;
7411             }
7412
7413           if (streq (relname, "R_C6000_NONE"))
7414             continue;
7415
7416           if (! streq (relname, "R_C6000_PREL31"))
7417             {
7418               warn (_("Skipping unexpected C6000 relocation type %s\n"), relname);
7419               continue;
7420             }
7421
7422           prelval >>= 1;
7423         }
7424       else
7425         {
7426           /* This function currently only supports ARM and TI unwinders.  */
7427           warn (_("Only TI and ARM unwinders are currently supported\n"));
7428           break;
7429         }
7430
7431       word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
7432       addr->section = sym->st_shndx;
7433       addr->offset = offset;
7434
7435       if (sym_name)
7436         * sym_name = sym->st_name;
7437       break;
7438     }
7439
7440   *wordp = word;
7441   arm_sec->next_rela = rp;
7442
7443   return TRUE;
7444 }
7445
7446 static const char *tic6x_unwind_regnames[16] =
7447 {
7448   "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
7449   "A14", "A13", "A12", "A11", "A10",
7450   "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
7451 };
7452
7453 static void
7454 decode_tic6x_unwind_regmask (unsigned int mask)
7455 {
7456   int i;
7457
7458   for (i = 12; mask; mask >>= 1, i--)
7459     {
7460       if (mask & 1)
7461         {
7462           fputs (tic6x_unwind_regnames[i], stdout);
7463           if (mask > 1)
7464             fputs (", ", stdout);
7465         }
7466     }
7467 }
7468
7469 #define ADVANCE                                                 \
7470   if (remaining == 0 && more_words)                             \
7471     {                                                           \
7472       data_offset += 4;                                         \
7473       if (! get_unwind_section_word (aux, data_arm_sec, data_sec,       \
7474                                      data_offset, & word, & addr, NULL))        \
7475         return;                                                 \
7476       remaining = 4;                                            \
7477       more_words--;                                             \
7478     }                                                           \
7479
7480 #define GET_OP(OP)                      \
7481   ADVANCE;                              \
7482   if (remaining)                        \
7483     {                                   \
7484       remaining--;                      \
7485       (OP) = word >> 24;                \
7486       word <<= 8;                       \
7487     }                                   \
7488   else                                  \
7489     {                                   \
7490       printf (_("[Truncated opcode]\n"));       \
7491       return;                           \
7492     }                                   \
7493   printf ("0x%02x ", OP)
7494
7495 static void
7496 decode_arm_unwind_bytecode (struct arm_unw_aux_info *aux,
7497                             unsigned int word, unsigned int remaining,
7498                             unsigned int more_words,
7499                             bfd_vma data_offset, Elf_Internal_Shdr *data_sec,
7500                             struct arm_section *data_arm_sec)
7501 {
7502   struct absaddr addr;
7503
7504   /* Decode the unwinding instructions.  */
7505   while (1)
7506     {
7507       unsigned int op, op2;
7508
7509       ADVANCE;
7510       if (remaining == 0)
7511         break;
7512       remaining--;
7513       op = word >> 24;
7514       word <<= 8;
7515
7516       printf ("  0x%02x ", op);
7517
7518       if ((op & 0xc0) == 0x00)
7519         {
7520           int offset = ((op & 0x3f) << 2) + 4;
7521
7522           printf ("     vsp = vsp + %d", offset);
7523         }
7524       else if ((op & 0xc0) == 0x40)
7525         {
7526           int offset = ((op & 0x3f) << 2) + 4;
7527
7528           printf ("     vsp = vsp - %d", offset);
7529         }
7530       else if ((op & 0xf0) == 0x80)
7531         {
7532           GET_OP (op2);
7533           if (op == 0x80 && op2 == 0)
7534             printf (_("Refuse to unwind"));
7535           else
7536             {
7537               unsigned int mask = ((op & 0x0f) << 8) | op2;
7538               int first = 1;
7539               int i;
7540
7541               printf ("pop {");
7542               for (i = 0; i < 12; i++)
7543                 if (mask & (1 << i))
7544                   {
7545                     if (first)
7546                       first = 0;
7547                     else
7548                       printf (", ");
7549                     printf ("r%d", 4 + i);
7550                   }
7551               printf ("}");
7552             }
7553         }
7554       else if ((op & 0xf0) == 0x90)
7555         {
7556           if (op == 0x9d || op == 0x9f)
7557             printf (_("     [Reserved]"));
7558           else
7559             printf ("     vsp = r%d", op & 0x0f);
7560         }
7561       else if ((op & 0xf0) == 0xa0)
7562         {
7563           int end = 4 + (op & 0x07);
7564           int first = 1;
7565           int i;
7566
7567           printf ("     pop {");
7568           for (i = 4; i <= end; i++)
7569             {
7570               if (first)
7571                 first = 0;
7572               else
7573                 printf (", ");
7574               printf ("r%d", i);
7575             }
7576           if (op & 0x08)
7577             {
7578               if (!first)
7579                 printf (", ");
7580               printf ("r14");
7581             }
7582           printf ("}");
7583         }
7584       else if (op == 0xb0)
7585         printf (_("     finish"));
7586       else if (op == 0xb1)
7587         {
7588           GET_OP (op2);
7589           if (op2 == 0 || (op2 & 0xf0) != 0)
7590             printf (_("[Spare]"));
7591           else
7592             {
7593               unsigned int mask = op2 & 0x0f;
7594               int first = 1;
7595               int i;
7596
7597               printf ("pop {");
7598               for (i = 0; i < 12; i++)
7599                 if (mask & (1 << i))
7600                   {
7601                     if (first)
7602                       first = 0;
7603                     else
7604                       printf (", ");
7605                     printf ("r%d", i);
7606                   }
7607               printf ("}");
7608             }
7609         }
7610       else if (op == 0xb2)
7611         {
7612           unsigned char buf[9];
7613           unsigned int i, len;
7614           unsigned long offset;
7615
7616           for (i = 0; i < sizeof (buf); i++)
7617             {
7618               GET_OP (buf[i]);
7619               if ((buf[i] & 0x80) == 0)
7620                 break;
7621             }
7622           if (i == sizeof (buf))
7623             printf (_("corrupt change to vsp"));
7624           else
7625             {
7626               offset = read_uleb128 (buf, &len, buf + i + 1);
7627               assert (len == i + 1);
7628               offset = offset * 4 + 0x204;
7629               printf ("vsp = vsp + %ld", offset);
7630             }
7631         }
7632       else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
7633         {
7634           unsigned int first, last;
7635
7636           GET_OP (op2);
7637           first = op2 >> 4;
7638           last = op2 & 0x0f;
7639           if (op == 0xc8)
7640             first = first + 16;
7641           printf ("pop {D%d", first);
7642           if (last)
7643             printf ("-D%d", first + last);
7644           printf ("}");
7645         }
7646       else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
7647         {
7648           unsigned int count = op & 0x07;
7649
7650           printf ("pop {D8");
7651           if (count)
7652             printf ("-D%d", 8 + count);
7653           printf ("}");
7654         }
7655       else if (op >= 0xc0 && op <= 0xc5)
7656         {
7657           unsigned int count = op & 0x07;
7658
7659           printf ("     pop {wR10");
7660           if (count)
7661             printf ("-wR%d", 10 + count);
7662           printf ("}");
7663         }
7664       else if (op == 0xc6)
7665         {
7666           unsigned int first, last;
7667
7668           GET_OP (op2);
7669           first = op2 >> 4;
7670           last = op2 & 0x0f;
7671           printf ("pop {wR%d", first);
7672           if (last)
7673             printf ("-wR%d", first + last);
7674           printf ("}");
7675         }
7676       else if (op == 0xc7)
7677         {
7678           GET_OP (op2);
7679           if (op2 == 0 || (op2 & 0xf0) != 0)
7680             printf (_("[Spare]"));
7681           else
7682             {
7683               unsigned int mask = op2 & 0x0f;
7684               int first = 1;
7685               int i;
7686
7687               printf ("pop {");
7688               for (i = 0; i < 4; i++)
7689                 if (mask & (1 << i))
7690                   {
7691                     if (first)
7692                       first = 0;
7693                     else
7694                       printf (", ");
7695                     printf ("wCGR%d", i);
7696                   }
7697               printf ("}");
7698             }
7699         }
7700       else
7701         printf (_("     [unsupported opcode]"));
7702       printf ("\n");
7703     }
7704 }
7705
7706 static void
7707 decode_tic6x_unwind_bytecode (struct arm_unw_aux_info *aux,
7708                             unsigned int word, unsigned int remaining,
7709                             unsigned int more_words,
7710                             bfd_vma data_offset, Elf_Internal_Shdr *data_sec,
7711                             struct arm_section *data_arm_sec)
7712 {
7713   struct absaddr addr;
7714
7715   /* Decode the unwinding instructions.  */
7716   while (1)
7717     {
7718       unsigned int op, op2;
7719
7720       ADVANCE;
7721       if (remaining == 0)
7722         break;
7723       remaining--;
7724       op = word >> 24;
7725       word <<= 8;
7726
7727       printf ("  0x%02x ", op);
7728
7729       if ((op & 0xc0) == 0x00)
7730         {
7731           int offset = ((op & 0x3f) << 3) + 8;
7732           printf ("     sp = sp + %d", offset);
7733         }
7734       else if ((op & 0xc0) == 0x80)
7735         {
7736           GET_OP (op2);
7737           if (op == 0x80 && op2 == 0)
7738             printf (_("Refuse to unwind"));
7739           else
7740             {
7741               unsigned int mask = ((op & 0x1f) << 8) | op2;
7742               if (op & 0x20)
7743                 printf ("pop compact {");
7744               else
7745                 printf ("pop {");
7746
7747               decode_tic6x_unwind_regmask (mask);
7748               printf("}");
7749             }
7750         }
7751       else if ((op & 0xf0) == 0xc0)
7752         {
7753           unsigned int reg;
7754           unsigned int nregs;
7755           unsigned int i;
7756           const char *name;
7757           struct
7758           {
7759               unsigned int offset;
7760               unsigned int reg;
7761           } regpos[16];
7762
7763           /* Scan entire instruction first so that GET_OP output is not
7764              interleaved with disassembly.  */
7765           nregs = 0;
7766           for (i = 0; nregs < (op & 0xf); i++)
7767             {
7768               GET_OP (op2);
7769               reg = op2 >> 4;
7770               if (reg != 0xf)
7771                 {
7772                   regpos[nregs].offset = i * 2;
7773                   regpos[nregs].reg = reg;
7774                   nregs++;
7775                 }
7776
7777               reg = op2 & 0xf;
7778               if (reg != 0xf)
7779                 {
7780                   regpos[nregs].offset = i * 2 + 1;
7781                   regpos[nregs].reg = reg;
7782                   nregs++;
7783                 }
7784             }
7785
7786           printf (_("pop frame {"));
7787           reg = nregs - 1;
7788           for (i = i * 2; i > 0; i--)
7789             {
7790               if (regpos[reg].offset == i - 1)
7791                 {
7792                   name = tic6x_unwind_regnames[regpos[reg].reg];
7793                   if (reg > 0)
7794                     reg--;
7795                 }
7796               else
7797                 name = _("[pad]");
7798
7799               fputs (name, stdout);
7800               if (i > 1)
7801                 printf (", ");
7802             }
7803
7804           printf ("}");
7805         }
7806       else if (op == 0xd0)
7807         printf ("     MOV FP, SP");
7808       else if (op == 0xd1)
7809         printf ("     __c6xabi_pop_rts");
7810       else if (op == 0xd2)
7811         {
7812           unsigned char buf[9];
7813           unsigned int i, len;
7814           unsigned long offset;
7815
7816           for (i = 0; i < sizeof (buf); i++)
7817             {
7818               GET_OP (buf[i]);
7819               if ((buf[i] & 0x80) == 0)
7820                 break;
7821             }
7822           /* PR 17531: file: id:000001,src:001906+004739,op:splice,rep:2.  */
7823           if (i == sizeof (buf))
7824             {
7825               printf ("<corrupt sp adjust>\n");
7826               warn (_("Corrupt stack pointer adjustment detected\n"));
7827               return;
7828             }
7829           
7830           offset = read_uleb128 (buf, &len, buf + i + 1);
7831           assert (len == i + 1);
7832           offset = offset * 8 + 0x408;
7833           printf (_("sp = sp + %ld"), offset);
7834         }
7835       else if ((op & 0xf0) == 0xe0)
7836         {
7837           if ((op & 0x0f) == 7)
7838             printf ("     RETURN");
7839           else
7840             printf ("     MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
7841         }
7842       else
7843         {
7844           printf (_("     [unsupported opcode]"));
7845         }
7846       putchar ('\n');
7847     }
7848 }
7849
7850 static bfd_vma
7851 arm_expand_prel31 (bfd_vma word, bfd_vma where)
7852 {
7853   bfd_vma offset;
7854
7855   offset = word & 0x7fffffff;
7856   if (offset & 0x40000000)
7857     offset |= ~ (bfd_vma) 0x7fffffff;
7858
7859   if (elf_header.e_machine == EM_TI_C6000)
7860     offset <<= 1;
7861
7862   return offset + where;
7863 }
7864
7865 static void
7866 decode_arm_unwind (struct arm_unw_aux_info *  aux,
7867                    unsigned int               word,
7868                    unsigned int               remaining,
7869                    bfd_vma                    data_offset,
7870                    Elf_Internal_Shdr *        data_sec,
7871                    struct arm_section *       data_arm_sec)
7872 {
7873   int per_index;
7874   unsigned int more_words = 0;
7875   struct absaddr addr;
7876   bfd_vma sym_name = (bfd_vma) -1;
7877
7878   if (remaining == 0)
7879     {
7880       /* Fetch the first word.
7881          Note - when decoding an object file the address extracted
7882          here will always be 0.  So we also pass in the sym_name
7883          parameter so that we can find the symbol associated with
7884          the personality routine.  */
7885       if (! get_unwind_section_word (aux, data_arm_sec, data_sec, data_offset,
7886                                      & word, & addr, & sym_name))
7887         return;
7888
7889       remaining = 4;
7890     }
7891
7892   if ((word & 0x80000000) == 0)
7893     {
7894       /* Expand prel31 for personality routine.  */
7895       bfd_vma fn;
7896       const char *procname;
7897
7898       fn = arm_expand_prel31 (word, data_sec->sh_addr + data_offset);
7899       printf (_("  Personality routine: "));
7900       if (fn == 0
7901           && addr.section == SHN_UNDEF && addr.offset == 0
7902           && sym_name != (bfd_vma) -1 && sym_name < aux->strtab_size)
7903         {
7904           procname = aux->strtab + sym_name;
7905           print_vma (fn, PREFIX_HEX);
7906           if (procname)
7907             {
7908               fputs (" <", stdout);
7909               fputs (procname, stdout);
7910               fputc ('>', stdout);
7911             }
7912         }
7913       else
7914         procname = arm_print_vma_and_name (aux, fn, addr);
7915       fputc ('\n', stdout);
7916
7917       /* The GCC personality routines use the standard compact
7918          encoding, starting with one byte giving the number of
7919          words.  */
7920       if (procname != NULL
7921           && (const_strneq (procname, "__gcc_personality_v0")
7922               || const_strneq (procname, "__gxx_personality_v0")
7923               || const_strneq (procname, "__gcj_personality_v0")
7924               || const_strneq (procname, "__gnu_objc_personality_v0")))
7925         {
7926           remaining = 0;
7927           more_words = 1;
7928           ADVANCE;
7929           if (!remaining)
7930             {
7931               printf (_("  [Truncated data]\n"));
7932               return;
7933             }
7934           more_words = word >> 24;
7935           word <<= 8;
7936           remaining--;
7937           per_index = -1;
7938         }
7939       else
7940         return;
7941     }
7942   else
7943     {
7944       /* ARM EHABI Section 6.3:
7945
7946          An exception-handling table entry for the compact model looks like:
7947
7948            31 30-28 27-24 23-0
7949            -- ----- ----- ----
7950             1   0   index Data for personalityRoutine[index]    */
7951
7952       if (elf_header.e_machine == EM_ARM
7953           && (word & 0x70000000))
7954         warn (_("Corrupt ARM compact model table entry: %x \n"), word);
7955
7956       per_index = (word >> 24) & 0x7f;
7957       printf (_("  Compact model index: %d\n"), per_index);
7958       if (per_index == 0)
7959         {
7960           more_words = 0;
7961           word <<= 8;
7962           remaining--;
7963         }
7964       else if (per_index < 3)
7965         {
7966           more_words = (word >> 16) & 0xff;
7967           word <<= 16;
7968           remaining -= 2;
7969         }
7970     }
7971
7972   switch (elf_header.e_machine)
7973     {
7974     case EM_ARM:
7975       if (per_index < 3)
7976         {
7977           decode_arm_unwind_bytecode (aux, word, remaining, more_words,
7978                                       data_offset, data_sec, data_arm_sec);
7979         }
7980       else
7981         {
7982           warn (_("Unknown ARM compact model index encountered\n"));
7983           printf (_("  [reserved]\n"));
7984         }
7985       break;
7986
7987     case EM_TI_C6000:
7988       if (per_index < 3)
7989         {
7990           decode_tic6x_unwind_bytecode (aux, word, remaining, more_words,
7991                                         data_offset, data_sec, data_arm_sec);
7992         }
7993       else if (per_index < 5)
7994         {
7995           if (((word >> 17) & 0x7f) == 0x7f)
7996             printf (_("  Restore stack from frame pointer\n"));
7997           else
7998             printf (_("  Stack increment %d\n"), (word >> 14) & 0x1fc);
7999           printf (_("  Registers restored: "));
8000           if (per_index == 4)
8001             printf (" (compact) ");
8002           decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
8003           putchar ('\n');
8004           printf (_("  Return register: %s\n"),
8005                   tic6x_unwind_regnames[word & 0xf]);
8006         }
8007       else
8008         printf (_("  [reserved (%d)]\n"), per_index);
8009       break;
8010
8011     default:
8012       error (_("Unsupported architecture type %d encountered when decoding unwind table\n"),
8013              elf_header.e_machine);
8014     }
8015
8016   /* Decode the descriptors.  Not implemented.  */
8017 }
8018
8019 static void
8020 dump_arm_unwind (struct arm_unw_aux_info *aux, Elf_Internal_Shdr *exidx_sec)
8021 {
8022   struct arm_section exidx_arm_sec, extab_arm_sec;
8023   unsigned int i, exidx_len;
8024
8025   memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
8026   memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
8027   exidx_len = exidx_sec->sh_size / 8;
8028
8029   for (i = 0; i < exidx_len; i++)
8030     {
8031       unsigned int exidx_fn, exidx_entry;
8032       struct absaddr fn_addr, entry_addr;
8033       bfd_vma fn;
8034
8035       fputc ('\n', stdout);
8036
8037       if (! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
8038                                      8 * i, & exidx_fn, & fn_addr, NULL)
8039           || ! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
8040                                         8 * i + 4, & exidx_entry, & entry_addr, NULL))
8041         {
8042           arm_free_section (& exidx_arm_sec);
8043           arm_free_section (& extab_arm_sec);
8044           return;
8045         }
8046
8047       /* ARM EHABI, Section 5:
8048          An index table entry consists of 2 words.
8049          The first word contains a prel31 offset to the start of a function, with bit 31 clear.  */
8050       if (exidx_fn & 0x80000000)
8051         warn (_("corrupt index table entry: %x\n"), exidx_fn);
8052
8053       fn = arm_expand_prel31 (exidx_fn, exidx_sec->sh_addr + 8 * i);
8054
8055       arm_print_vma_and_name (aux, fn, fn_addr);
8056       fputs (": ", stdout);
8057
8058       if (exidx_entry == 1)
8059         {
8060           print_vma (exidx_entry, PREFIX_HEX);
8061           fputs (" [cantunwind]\n", stdout);
8062         }
8063       else if (exidx_entry & 0x80000000)
8064         {
8065           print_vma (exidx_entry, PREFIX_HEX);
8066           fputc ('\n', stdout);
8067           decode_arm_unwind (aux, exidx_entry, 4, 0, NULL, NULL);
8068         }
8069       else
8070         {
8071           bfd_vma table, table_offset = 0;
8072           Elf_Internal_Shdr *table_sec;
8073
8074           fputs ("@", stdout);
8075           table = arm_expand_prel31 (exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
8076           print_vma (table, PREFIX_HEX);
8077           printf ("\n");
8078
8079           /* Locate the matching .ARM.extab.  */
8080           if (entry_addr.section != SHN_UNDEF
8081               && entry_addr.section < elf_header.e_shnum)
8082             {
8083               table_sec = section_headers + entry_addr.section;
8084               table_offset = entry_addr.offset;
8085             }
8086           else
8087             {
8088               table_sec = find_section_by_address (table);
8089               if (table_sec != NULL)
8090                 table_offset = table - table_sec->sh_addr;
8091             }
8092           if (table_sec == NULL)
8093             {
8094               warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
8095                     (unsigned long) table);
8096               continue;
8097             }
8098           decode_arm_unwind (aux, 0, 0, table_offset, table_sec,
8099                              &extab_arm_sec);
8100         }
8101     }
8102
8103   printf ("\n");
8104
8105   arm_free_section (&exidx_arm_sec);
8106   arm_free_section (&extab_arm_sec);
8107 }
8108
8109 /* Used for both ARM and C6X unwinding tables.  */
8110
8111 static void
8112 arm_process_unwind (FILE *file)
8113 {
8114   struct arm_unw_aux_info aux;
8115   Elf_Internal_Shdr *unwsec = NULL;
8116   Elf_Internal_Shdr *strsec;
8117   Elf_Internal_Shdr *sec;
8118   unsigned long i;
8119   unsigned int sec_type;
8120
8121   switch (elf_header.e_machine)
8122     {
8123     case EM_ARM:
8124       sec_type = SHT_ARM_EXIDX;
8125       break;
8126
8127     case EM_TI_C6000:
8128       sec_type = SHT_C6000_UNWIND;
8129       break;
8130
8131     default:
8132       error (_("Unsupported architecture type %d encountered when processing unwind table\n"),
8133              elf_header.e_machine);
8134       return;
8135     }
8136
8137   if (string_table == NULL)
8138     return;
8139
8140   memset (& aux, 0, sizeof (aux));
8141   aux.file = file;
8142
8143   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
8144     {
8145       if (sec->sh_type == SHT_SYMTAB && sec->sh_link < elf_header.e_shnum)
8146         {
8147           aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
8148
8149           strsec = section_headers + sec->sh_link;
8150
8151           /* PR binutils/17531 file: 011-12666-0.004.  */
8152           if (aux.strtab != NULL)
8153             {
8154               error (_("Multiple string tables found in file.\n"));
8155               free (aux.strtab);
8156             }
8157           aux.strtab = get_data (NULL, file, strsec->sh_offset,
8158                                  1, strsec->sh_size, _("string table"));
8159           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
8160         }
8161       else if (sec->sh_type == sec_type)
8162         unwsec = sec;
8163     }
8164
8165   if (unwsec == NULL)
8166     printf (_("\nThere are no unwind sections in this file.\n"));
8167   else
8168     for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
8169       {
8170         if (sec->sh_type == sec_type)
8171           {
8172             printf (_("\nUnwind table index '%s' at offset 0x%lx contains %lu entries:\n"),
8173                     printable_section_name (sec),
8174                     (unsigned long) sec->sh_offset,
8175                     (unsigned long) (sec->sh_size / (2 * eh_addr_size)));
8176
8177             dump_arm_unwind (&aux, sec);
8178           }
8179       }
8180
8181   if (aux.symtab)
8182     free (aux.symtab);
8183   if (aux.strtab)
8184     free ((char *) aux.strtab);
8185 }
8186
8187 static void
8188 process_unwind (FILE * file)
8189 {
8190   struct unwind_handler
8191   {
8192     int machtype;
8193     void (* handler)(FILE *);
8194   } handlers[] =
8195   {
8196     { EM_ARM, arm_process_unwind },
8197     { EM_IA_64, ia64_process_unwind },
8198     { EM_PARISC, hppa_process_unwind },
8199     { EM_TI_C6000, arm_process_unwind },
8200     { 0, 0 }
8201   };
8202   int i;
8203
8204   if (!do_unwind)
8205     return;
8206
8207   for (i = 0; handlers[i].handler != NULL; i++)
8208     if (elf_header.e_machine == handlers[i].machtype)
8209       {
8210         handlers[i].handler (file);
8211         return;
8212       }
8213
8214   printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
8215           get_machine_name (elf_header.e_machine));
8216 }
8217
8218 static void
8219 dynamic_section_mips_val (Elf_Internal_Dyn * entry)
8220 {
8221   switch (entry->d_tag)
8222     {
8223     case DT_MIPS_FLAGS:
8224       if (entry->d_un.d_val == 0)
8225         printf (_("NONE"));
8226       else
8227         {
8228           static const char * opts[] =
8229           {
8230             "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
8231             "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
8232             "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
8233             "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
8234             "RLD_ORDER_SAFE"
8235           };
8236           unsigned int cnt;
8237           int first = 1;
8238
8239           for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
8240             if (entry->d_un.d_val & (1 << cnt))
8241               {
8242                 printf ("%s%s", first ? "" : " ", opts[cnt]);
8243                 first = 0;
8244               }
8245         }
8246       break;
8247
8248     case DT_MIPS_IVERSION:
8249       if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
8250         printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry->d_un.d_val));
8251       else
8252         {
8253           char buf[40];
8254           sprintf_vma (buf, entry->d_un.d_ptr);
8255           /* Note: coded this way so that there is a single string for translation.  */
8256           printf (_("<corrupt: %s>"), buf);
8257         }
8258       break;
8259
8260     case DT_MIPS_TIME_STAMP:
8261       {
8262         char timebuf[20];
8263         struct tm * tmp;
8264
8265         time_t atime = entry->d_un.d_val;
8266         tmp = gmtime (&atime);
8267         snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
8268                   tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
8269                   tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
8270         printf (_("Time Stamp: %s"), timebuf);
8271       }
8272       break;
8273
8274     case DT_MIPS_RLD_VERSION:
8275     case DT_MIPS_LOCAL_GOTNO:
8276     case DT_MIPS_CONFLICTNO:
8277     case DT_MIPS_LIBLISTNO:
8278     case DT_MIPS_SYMTABNO:
8279     case DT_MIPS_UNREFEXTNO:
8280     case DT_MIPS_HIPAGENO:
8281     case DT_MIPS_DELTA_CLASS_NO:
8282     case DT_MIPS_DELTA_INSTANCE_NO:
8283     case DT_MIPS_DELTA_RELOC_NO:
8284     case DT_MIPS_DELTA_SYM_NO:
8285     case DT_MIPS_DELTA_CLASSSYM_NO:
8286     case DT_MIPS_COMPACT_SIZE:
8287       print_vma (entry->d_un.d_ptr, DEC);
8288       break;
8289
8290     default:
8291       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8292     }
8293     putchar ('\n');
8294 }
8295
8296 static void
8297 dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
8298 {
8299   switch (entry->d_tag)
8300     {
8301     case DT_HP_DLD_FLAGS:
8302       {
8303         static struct
8304         {
8305           long int bit;
8306           const char * str;
8307         }
8308         flags[] =
8309         {
8310           { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
8311           { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
8312           { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
8313           { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
8314           { DT_HP_BIND_NOW, "HP_BIND_NOW" },
8315           { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
8316           { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
8317           { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
8318           { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
8319           { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
8320           { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
8321           { DT_HP_GST, "HP_GST" },
8322           { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
8323           { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
8324           { DT_HP_NODELETE, "HP_NODELETE" },
8325           { DT_HP_GROUP, "HP_GROUP" },
8326           { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
8327         };
8328         int first = 1;
8329         size_t cnt;
8330         bfd_vma val = entry->d_un.d_val;
8331
8332         for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
8333           if (val & flags[cnt].bit)
8334             {
8335               if (! first)
8336                 putchar (' ');
8337               fputs (flags[cnt].str, stdout);
8338               first = 0;
8339               val ^= flags[cnt].bit;
8340             }
8341
8342         if (val != 0 || first)
8343           {
8344             if (! first)
8345               putchar (' ');
8346             print_vma (val, HEX);
8347           }
8348       }
8349       break;
8350
8351     default:
8352       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8353       break;
8354     }
8355   putchar ('\n');
8356 }
8357
8358 #ifdef BFD64
8359
8360 /* VMS vs Unix time offset and factor.  */
8361
8362 #define VMS_EPOCH_OFFSET 35067168000000000LL
8363 #define VMS_GRANULARITY_FACTOR 10000000
8364
8365 /* Display a VMS time in a human readable format.  */
8366
8367 static void
8368 print_vms_time (bfd_int64_t vmstime)
8369 {
8370   struct tm *tm;
8371   time_t unxtime;
8372
8373   unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
8374   tm = gmtime (&unxtime);
8375   printf ("%04u-%02u-%02uT%02u:%02u:%02u",
8376           tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
8377           tm->tm_hour, tm->tm_min, tm->tm_sec);
8378 }
8379 #endif /* BFD64 */
8380
8381 static void
8382 dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
8383 {
8384   switch (entry->d_tag)
8385     {
8386     case DT_IA_64_PLT_RESERVE:
8387       /* First 3 slots reserved.  */
8388       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8389       printf (" -- ");
8390       print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
8391       break;
8392
8393     case DT_IA_64_VMS_LINKTIME:
8394 #ifdef BFD64
8395       print_vms_time (entry->d_un.d_val);
8396 #endif
8397       break;
8398
8399     case DT_IA_64_VMS_LNKFLAGS:
8400       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8401       if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
8402         printf (" CALL_DEBUG");
8403       if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
8404         printf (" NOP0BUFS");
8405       if (entry->d_un.d_val & VMS_LF_P0IMAGE)
8406         printf (" P0IMAGE");
8407       if (entry->d_un.d_val & VMS_LF_MKTHREADS)
8408         printf (" MKTHREADS");
8409       if (entry->d_un.d_val & VMS_LF_UPCALLS)
8410         printf (" UPCALLS");
8411       if (entry->d_un.d_val & VMS_LF_IMGSTA)
8412         printf (" IMGSTA");
8413       if (entry->d_un.d_val & VMS_LF_INITIALIZE)
8414         printf (" INITIALIZE");
8415       if (entry->d_un.d_val & VMS_LF_MAIN)
8416         printf (" MAIN");
8417       if (entry->d_un.d_val & VMS_LF_EXE_INIT)
8418         printf (" EXE_INIT");
8419       if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
8420         printf (" TBK_IN_IMG");
8421       if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
8422         printf (" DBG_IN_IMG");
8423       if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
8424         printf (" TBK_IN_DSF");
8425       if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
8426         printf (" DBG_IN_DSF");
8427       if (entry->d_un.d_val & VMS_LF_SIGNATURES)
8428         printf (" SIGNATURES");
8429       if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
8430         printf (" REL_SEG_OFF");
8431       break;
8432
8433     default:
8434       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8435       break;
8436     }
8437   putchar ('\n');
8438 }
8439
8440 static int
8441 get_32bit_dynamic_section (FILE * file)
8442 {
8443   Elf32_External_Dyn * edyn;
8444   Elf32_External_Dyn * ext;
8445   Elf_Internal_Dyn * entry;
8446
8447   edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
8448                                           dynamic_size, _("dynamic section"));
8449   if (!edyn)
8450     return 0;
8451
8452   /* SGI's ELF has more than one section in the DYNAMIC segment, and we
8453      might not have the luxury of section headers.  Look for the DT_NULL
8454      terminator to determine the number of entries.  */
8455   for (ext = edyn, dynamic_nent = 0;
8456        (char *) ext < (char *) edyn + dynamic_size - sizeof (* entry);
8457        ext++)
8458     {
8459       dynamic_nent++;
8460       if (BYTE_GET (ext->d_tag) == DT_NULL)
8461         break;
8462     }
8463
8464   dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
8465                                                   sizeof (* entry));
8466   if (dynamic_section == NULL)
8467     {
8468       error (_("Out of memory allocating space for %lu dynamic entries\n"),
8469              (unsigned long) dynamic_nent);
8470       free (edyn);
8471       return 0;
8472     }
8473
8474   for (ext = edyn, entry = dynamic_section;
8475        entry < dynamic_section + dynamic_nent;
8476        ext++, entry++)
8477     {
8478       entry->d_tag      = BYTE_GET (ext->d_tag);
8479       entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
8480     }
8481
8482   free (edyn);
8483
8484   return 1;
8485 }
8486
8487 static int
8488 get_64bit_dynamic_section (FILE * file)
8489 {
8490   Elf64_External_Dyn * edyn;
8491   Elf64_External_Dyn * ext;
8492   Elf_Internal_Dyn * entry;
8493
8494   /* Read in the data.  */
8495   edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
8496                                           dynamic_size, _("dynamic section"));
8497   if (!edyn)
8498     return 0;
8499
8500   /* SGI's ELF has more than one section in the DYNAMIC segment, and we
8501      might not have the luxury of section headers.  Look for the DT_NULL
8502      terminator to determine the number of entries.  */
8503   for (ext = edyn, dynamic_nent = 0;
8504        /* PR 17533 file: 033-67080-0.004 - do not read off the end of the buffer.  */
8505        (char *) ext < ((char *) edyn) + dynamic_size - sizeof (* ext);
8506        ext++)
8507     {
8508       dynamic_nent++;
8509       if (BYTE_GET (ext->d_tag) == DT_NULL)
8510         break;
8511     }
8512
8513   dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
8514                                                   sizeof (* entry));
8515   if (dynamic_section == NULL)
8516     {
8517       error (_("Out of memory allocating space for %lu dynamic entries\n"),
8518              (unsigned long) dynamic_nent);
8519       free (edyn);
8520       return 0;
8521     }
8522
8523   /* Convert from external to internal formats.  */
8524   for (ext = edyn, entry = dynamic_section;
8525        entry < dynamic_section + dynamic_nent;
8526        ext++, entry++)
8527     {
8528       entry->d_tag      = BYTE_GET (ext->d_tag);
8529       entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
8530     }
8531
8532   free (edyn);
8533
8534   return 1;
8535 }
8536
8537 static void
8538 print_dynamic_flags (bfd_vma flags)
8539 {
8540   int first = 1;
8541
8542   while (flags)
8543     {
8544       bfd_vma flag;
8545
8546       flag = flags & - flags;
8547       flags &= ~ flag;
8548
8549       if (first)
8550         first = 0;
8551       else
8552         putc (' ', stdout);
8553
8554       switch (flag)
8555         {
8556         case DF_ORIGIN:         fputs ("ORIGIN", stdout); break;
8557         case DF_SYMBOLIC:       fputs ("SYMBOLIC", stdout); break;
8558         case DF_TEXTREL:        fputs ("TEXTREL", stdout); break;
8559         case DF_BIND_NOW:       fputs ("BIND_NOW", stdout); break;
8560         case DF_STATIC_TLS:     fputs ("STATIC_TLS", stdout); break;
8561         default:                fputs (_("unknown"), stdout); break;
8562         }
8563     }
8564   puts ("");
8565 }
8566
8567 /* Parse and display the contents of the dynamic section.  */
8568
8569 static int
8570 process_dynamic_section (FILE * file)
8571 {
8572   Elf_Internal_Dyn * entry;
8573
8574   if (dynamic_size == 0)
8575     {
8576       if (do_dynamic)
8577         printf (_("\nThere is no dynamic section in this file.\n"));
8578
8579       return 1;
8580     }
8581
8582   if (is_32bit_elf)
8583     {
8584       if (! get_32bit_dynamic_section (file))
8585         return 0;
8586     }
8587   else if (! get_64bit_dynamic_section (file))
8588     return 0;
8589
8590   /* Find the appropriate symbol table.  */
8591   if (dynamic_symbols == NULL)
8592     {
8593       for (entry = dynamic_section;
8594            entry < dynamic_section + dynamic_nent;
8595            ++entry)
8596         {
8597           Elf_Internal_Shdr section;
8598
8599           if (entry->d_tag != DT_SYMTAB)
8600             continue;
8601
8602           dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
8603
8604           /* Since we do not know how big the symbol table is,
8605              we default to reading in the entire file (!) and
8606              processing that.  This is overkill, I know, but it
8607              should work.  */
8608           section.sh_offset = offset_from_vma (file, entry->d_un.d_val, 0);
8609
8610           if (archive_file_offset != 0)
8611             section.sh_size = archive_file_size - section.sh_offset;
8612           else
8613             {
8614               if (fseek (file, 0, SEEK_END))
8615                 error (_("Unable to seek to end of file!\n"));
8616
8617               section.sh_size = ftell (file) - section.sh_offset;
8618             }
8619
8620           if (is_32bit_elf)
8621             section.sh_entsize = sizeof (Elf32_External_Sym);
8622           else
8623             section.sh_entsize = sizeof (Elf64_External_Sym);
8624           section.sh_name = string_table_length;
8625
8626           dynamic_symbols = GET_ELF_SYMBOLS (file, &section, & num_dynamic_syms);
8627           if (num_dynamic_syms < 1)
8628             {
8629               error (_("Unable to determine the number of symbols to load\n"));
8630               continue;
8631             }
8632         }
8633     }
8634
8635   /* Similarly find a string table.  */
8636   if (dynamic_strings == NULL)
8637     {
8638       for (entry = dynamic_section;
8639            entry < dynamic_section + dynamic_nent;
8640            ++entry)
8641         {
8642           unsigned long offset;
8643           long str_tab_len;
8644
8645           if (entry->d_tag != DT_STRTAB)
8646             continue;
8647
8648           dynamic_info[DT_STRTAB] = entry->d_un.d_val;
8649
8650           /* Since we do not know how big the string table is,
8651              we default to reading in the entire file (!) and
8652              processing that.  This is overkill, I know, but it
8653              should work.  */
8654
8655           offset = offset_from_vma (file, entry->d_un.d_val, 0);
8656
8657           if (archive_file_offset != 0)
8658             str_tab_len = archive_file_size - offset;
8659           else
8660             {
8661               if (fseek (file, 0, SEEK_END))
8662                 error (_("Unable to seek to end of file\n"));
8663               str_tab_len = ftell (file) - offset;
8664             }
8665
8666           if (str_tab_len < 1)
8667             {
8668               error
8669                 (_("Unable to determine the length of the dynamic string table\n"));
8670               continue;
8671             }
8672
8673           dynamic_strings = (char *) get_data (NULL, file, offset, 1,
8674                                                str_tab_len,
8675                                                _("dynamic string table"));
8676           dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
8677           break;
8678         }
8679     }
8680
8681   /* And find the syminfo section if available.  */
8682   if (dynamic_syminfo == NULL)
8683     {
8684       unsigned long syminsz = 0;
8685
8686       for (entry = dynamic_section;
8687            entry < dynamic_section + dynamic_nent;
8688            ++entry)
8689         {
8690           if (entry->d_tag == DT_SYMINENT)
8691             {
8692               /* Note: these braces are necessary to avoid a syntax
8693                  error from the SunOS4 C compiler.  */
8694               /* PR binutils/17531: A corrupt file can trigger this test.
8695                  So do not use an assert, instead generate an error message.  */
8696               if (sizeof (Elf_External_Syminfo) != entry->d_un.d_val)
8697                 error (_("Bad value (%d) for SYMINENT entry\n"),
8698                        (int) entry->d_un.d_val);
8699             }
8700           else if (entry->d_tag == DT_SYMINSZ)
8701             syminsz = entry->d_un.d_val;
8702           else if (entry->d_tag == DT_SYMINFO)
8703             dynamic_syminfo_offset = offset_from_vma (file, entry->d_un.d_val,
8704                                                       syminsz);
8705         }
8706
8707       if (dynamic_syminfo_offset != 0 && syminsz != 0)
8708         {
8709           Elf_External_Syminfo * extsyminfo;
8710           Elf_External_Syminfo * extsym;
8711           Elf_Internal_Syminfo * syminfo;
8712
8713           /* There is a syminfo section.  Read the data.  */
8714           extsyminfo = (Elf_External_Syminfo *)
8715               get_data (NULL, file, dynamic_syminfo_offset, 1, syminsz,
8716                         _("symbol information"));
8717           if (!extsyminfo)
8718             return 0;
8719
8720           dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
8721           if (dynamic_syminfo == NULL)
8722             {
8723               error (_("Out of memory allocating %lu byte for dynamic symbol info\n"),
8724                      (unsigned long) syminsz);
8725               return 0;
8726             }
8727
8728           dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
8729           for (syminfo = dynamic_syminfo, extsym = extsyminfo;
8730                syminfo < dynamic_syminfo + dynamic_syminfo_nent;
8731                ++syminfo, ++extsym)
8732             {
8733               syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
8734               syminfo->si_flags = BYTE_GET (extsym->si_flags);
8735             }
8736
8737           free (extsyminfo);
8738         }
8739     }
8740
8741   if (do_dynamic && dynamic_addr)
8742     printf (_("\nDynamic section at offset 0x%lx contains %lu entries:\n"),
8743             dynamic_addr, (unsigned long) dynamic_nent);
8744   if (do_dynamic)
8745     printf (_("  Tag        Type                         Name/Value\n"));
8746
8747   for (entry = dynamic_section;
8748        entry < dynamic_section + dynamic_nent;
8749        entry++)
8750     {
8751       if (do_dynamic)
8752         {
8753           const char * dtype;
8754
8755           putchar (' ');
8756           print_vma (entry->d_tag, FULL_HEX);
8757           dtype = get_dynamic_type (entry->d_tag);
8758           printf (" (%s)%*s", dtype,
8759                   ((is_32bit_elf ? 27 : 19)
8760                    - (int) strlen (dtype)),
8761                   " ");
8762         }
8763
8764       switch (entry->d_tag)
8765         {
8766         case DT_FLAGS:
8767           if (do_dynamic)
8768             print_dynamic_flags (entry->d_un.d_val);
8769           break;
8770
8771         case DT_AUXILIARY:
8772         case DT_FILTER:
8773         case DT_CONFIG:
8774         case DT_DEPAUDIT:
8775         case DT_AUDIT:
8776           if (do_dynamic)
8777             {
8778               switch (entry->d_tag)
8779                 {
8780                 case DT_AUXILIARY:
8781                   printf (_("Auxiliary library"));
8782                   break;
8783
8784                 case DT_FILTER:
8785                   printf (_("Filter library"));
8786                   break;
8787
8788                 case DT_CONFIG:
8789                   printf (_("Configuration file"));
8790                   break;
8791
8792                 case DT_DEPAUDIT:
8793                   printf (_("Dependency audit library"));
8794                   break;
8795
8796                 case DT_AUDIT:
8797                   printf (_("Audit library"));
8798                   break;
8799                 }
8800
8801               if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
8802                 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
8803               else
8804                 {
8805                   printf (": ");
8806                   print_vma (entry->d_un.d_val, PREFIX_HEX);
8807                   putchar ('\n');
8808                 }
8809             }
8810           break;
8811
8812         case DT_FEATURE:
8813           if (do_dynamic)
8814             {
8815               printf (_("Flags:"));
8816
8817               if (entry->d_un.d_val == 0)
8818                 printf (_(" None\n"));
8819               else
8820                 {
8821                   unsigned long int val = entry->d_un.d_val;
8822
8823                   if (val & DTF_1_PARINIT)
8824                     {
8825                       printf (" PARINIT");
8826                       val ^= DTF_1_PARINIT;
8827                     }
8828                   if (val & DTF_1_CONFEXP)
8829                     {
8830                       printf (" CONFEXP");
8831                       val ^= DTF_1_CONFEXP;
8832                     }
8833                   if (val != 0)
8834                     printf (" %lx", val);
8835                   puts ("");
8836                 }
8837             }
8838           break;
8839
8840         case DT_POSFLAG_1:
8841           if (do_dynamic)
8842             {
8843               printf (_("Flags:"));
8844
8845               if (entry->d_un.d_val == 0)
8846                 printf (_(" None\n"));
8847               else
8848                 {
8849                   unsigned long int val = entry->d_un.d_val;
8850
8851                   if (val & DF_P1_LAZYLOAD)
8852                     {
8853                       printf (" LAZYLOAD");
8854                       val ^= DF_P1_LAZYLOAD;
8855                     }
8856                   if (val & DF_P1_GROUPPERM)
8857                     {
8858                       printf (" GROUPPERM");
8859                       val ^= DF_P1_GROUPPERM;
8860                     }
8861                   if (val != 0)
8862                     printf (" %lx", val);
8863                   puts ("");
8864                 }
8865             }
8866           break;
8867
8868         case DT_FLAGS_1:
8869           if (do_dynamic)
8870             {
8871               printf (_("Flags:"));
8872               if (entry->d_un.d_val == 0)
8873                 printf (_(" None\n"));
8874               else
8875                 {
8876                   unsigned long int val = entry->d_un.d_val;
8877
8878                   if (val & DF_1_NOW)
8879                     {
8880                       printf (" NOW");
8881                       val ^= DF_1_NOW;
8882                     }
8883                   if (val & DF_1_GLOBAL)
8884                     {
8885                       printf (" GLOBAL");
8886                       val ^= DF_1_GLOBAL;
8887                     }
8888                   if (val & DF_1_GROUP)
8889                     {
8890                       printf (" GROUP");
8891                       val ^= DF_1_GROUP;
8892                     }
8893                   if (val & DF_1_NODELETE)
8894                     {
8895                       printf (" NODELETE");
8896                       val ^= DF_1_NODELETE;
8897                     }
8898                   if (val & DF_1_LOADFLTR)
8899                     {
8900                       printf (" LOADFLTR");
8901                       val ^= DF_1_LOADFLTR;
8902                     }
8903                   if (val & DF_1_INITFIRST)
8904                     {
8905                       printf (" INITFIRST");
8906                       val ^= DF_1_INITFIRST;
8907                     }
8908                   if (val & DF_1_NOOPEN)
8909                     {
8910                       printf (" NOOPEN");
8911                       val ^= DF_1_NOOPEN;
8912                     }
8913                   if (val & DF_1_ORIGIN)
8914                     {
8915                       printf (" ORIGIN");
8916                       val ^= DF_1_ORIGIN;
8917                     }
8918                   if (val & DF_1_DIRECT)
8919                     {
8920                       printf (" DIRECT");
8921                       val ^= DF_1_DIRECT;
8922                     }
8923                   if (val & DF_1_TRANS)
8924                     {
8925                       printf (" TRANS");
8926                       val ^= DF_1_TRANS;
8927                     }
8928                   if (val & DF_1_INTERPOSE)
8929                     {
8930                       printf (" INTERPOSE");
8931                       val ^= DF_1_INTERPOSE;
8932                     }
8933                   if (val & DF_1_NODEFLIB)
8934                     {
8935                       printf (" NODEFLIB");
8936                       val ^= DF_1_NODEFLIB;
8937                     }
8938                   if (val & DF_1_NODUMP)
8939                     {
8940                       printf (" NODUMP");
8941                       val ^= DF_1_NODUMP;
8942                     }
8943                   if (val & DF_1_CONFALT)
8944                     {
8945                       printf (" CONFALT");
8946                       val ^= DF_1_CONFALT;
8947                     }
8948                   if (val & DF_1_ENDFILTEE)
8949                     {
8950                       printf (" ENDFILTEE");
8951                       val ^= DF_1_ENDFILTEE;
8952                     }
8953                   if (val & DF_1_DISPRELDNE)
8954                     {
8955                       printf (" DISPRELDNE");
8956                       val ^= DF_1_DISPRELDNE;
8957                     }
8958                   if (val & DF_1_DISPRELPND)
8959                     {
8960                       printf (" DISPRELPND");
8961                       val ^= DF_1_DISPRELPND;
8962                     }
8963                   if (val & DF_1_NODIRECT)
8964                     {
8965                       printf (" NODIRECT");
8966                       val ^= DF_1_NODIRECT;
8967                     }
8968                   if (val & DF_1_IGNMULDEF)
8969                     {
8970                       printf (" IGNMULDEF");
8971                       val ^= DF_1_IGNMULDEF;
8972                     }
8973                   if (val & DF_1_NOKSYMS)
8974                     {
8975                       printf (" NOKSYMS");
8976                       val ^= DF_1_NOKSYMS;
8977                     }
8978                   if (val & DF_1_NOHDR)
8979                     {
8980                       printf (" NOHDR");
8981                       val ^= DF_1_NOHDR;
8982                     }
8983                   if (val & DF_1_EDITED)
8984                     {
8985                       printf (" EDITED");
8986                       val ^= DF_1_EDITED;
8987                     }
8988                   if (val & DF_1_NORELOC)
8989                     {
8990                       printf (" NORELOC");
8991                       val ^= DF_1_NORELOC;
8992                     }
8993                   if (val & DF_1_SYMINTPOSE)
8994                     {
8995                       printf (" SYMINTPOSE");
8996                       val ^= DF_1_SYMINTPOSE;
8997                     }
8998                   if (val & DF_1_GLOBAUDIT)
8999                     {
9000                       printf (" GLOBAUDIT");
9001                       val ^= DF_1_GLOBAUDIT;
9002                     }
9003                   if (val & DF_1_SINGLETON)
9004                     {
9005                       printf (" SINGLETON");
9006                       val ^= DF_1_SINGLETON;
9007                     }
9008                   if (val != 0)
9009                     printf (" %lx", val);
9010                   puts ("");
9011                 }
9012             }
9013           break;
9014
9015         case DT_PLTREL:
9016           dynamic_info[entry->d_tag] = entry->d_un.d_val;
9017           if (do_dynamic)
9018             puts (get_dynamic_type (entry->d_un.d_val));
9019           break;
9020
9021         case DT_NULL    :
9022         case DT_NEEDED  :
9023         case DT_PLTGOT  :
9024         case DT_HASH    :
9025         case DT_STRTAB  :
9026         case DT_SYMTAB  :
9027         case DT_RELA    :
9028         case DT_INIT    :
9029         case DT_FINI    :
9030         case DT_SONAME  :
9031         case DT_RPATH   :
9032         case DT_SYMBOLIC:
9033         case DT_REL     :
9034         case DT_DEBUG   :
9035         case DT_TEXTREL :
9036         case DT_JMPREL  :
9037         case DT_RUNPATH :
9038           dynamic_info[entry->d_tag] = entry->d_un.d_val;
9039
9040           if (do_dynamic)
9041             {
9042               char * name;
9043
9044               if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9045                 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
9046               else
9047                 name = NULL;
9048
9049               if (name)
9050                 {
9051                   switch (entry->d_tag)
9052                     {
9053                     case DT_NEEDED:
9054                       printf (_("Shared library: [%s]"), name);
9055
9056                       if (streq (name, program_interpreter))
9057                         printf (_(" program interpreter"));
9058                       break;
9059
9060                     case DT_SONAME:
9061                       printf (_("Library soname: [%s]"), name);
9062                       break;
9063
9064                     case DT_RPATH:
9065                       printf (_("Library rpath: [%s]"), name);
9066                       break;
9067
9068                     case DT_RUNPATH:
9069                       printf (_("Library runpath: [%s]"), name);
9070                       break;
9071
9072                     default:
9073                       print_vma (entry->d_un.d_val, PREFIX_HEX);
9074                       break;
9075                     }
9076                 }
9077               else
9078                 print_vma (entry->d_un.d_val, PREFIX_HEX);
9079
9080               putchar ('\n');
9081             }
9082           break;
9083
9084         case DT_PLTRELSZ:
9085         case DT_RELASZ  :
9086         case DT_STRSZ   :
9087         case DT_RELSZ   :
9088         case DT_RELAENT :
9089         case DT_SYMENT  :
9090         case DT_RELENT  :
9091           dynamic_info[entry->d_tag] = entry->d_un.d_val;
9092         case DT_PLTPADSZ:
9093         case DT_MOVEENT :
9094         case DT_MOVESZ  :
9095         case DT_INIT_ARRAYSZ:
9096         case DT_FINI_ARRAYSZ:
9097         case DT_GNU_CONFLICTSZ:
9098         case DT_GNU_LIBLISTSZ:
9099           if (do_dynamic)
9100             {
9101               print_vma (entry->d_un.d_val, UNSIGNED);
9102               printf (_(" (bytes)\n"));
9103             }
9104           break;
9105
9106         case DT_VERDEFNUM:
9107         case DT_VERNEEDNUM:
9108         case DT_RELACOUNT:
9109         case DT_RELCOUNT:
9110           if (do_dynamic)
9111             {
9112               print_vma (entry->d_un.d_val, UNSIGNED);
9113               putchar ('\n');
9114             }
9115           break;
9116
9117         case DT_SYMINSZ:
9118         case DT_SYMINENT:
9119         case DT_SYMINFO:
9120         case DT_USED:
9121         case DT_INIT_ARRAY:
9122         case DT_FINI_ARRAY:
9123           if (do_dynamic)
9124             {
9125               if (entry->d_tag == DT_USED
9126                   && VALID_DYNAMIC_NAME (entry->d_un.d_val))
9127                 {
9128                   char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
9129
9130                   if (*name)
9131                     {
9132                       printf (_("Not needed object: [%s]\n"), name);
9133                       break;
9134                     }
9135                 }
9136
9137               print_vma (entry->d_un.d_val, PREFIX_HEX);
9138               putchar ('\n');
9139             }
9140           break;
9141
9142         case DT_BIND_NOW:
9143           /* The value of this entry is ignored.  */
9144           if (do_dynamic)
9145             putchar ('\n');
9146           break;
9147
9148         case DT_GNU_PRELINKED:
9149           if (do_dynamic)
9150             {
9151               struct tm * tmp;
9152               time_t atime = entry->d_un.d_val;
9153
9154               tmp = gmtime (&atime);
9155               /* PR 17533 file: 041-1244816-0.004.  */
9156               if (tmp == NULL)
9157                 printf (_("<corrupt time val: %lx"),
9158                         (unsigned long) atime);
9159               else
9160                 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
9161                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9162                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
9163
9164             }
9165           break;
9166
9167         case DT_GNU_HASH:
9168           dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
9169           if (do_dynamic)
9170             {
9171               print_vma (entry->d_un.d_val, PREFIX_HEX);
9172               putchar ('\n');
9173             }
9174           break;
9175
9176         default:
9177           if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
9178             version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
9179               entry->d_un.d_val;
9180
9181           if (do_dynamic)
9182             {
9183               switch (elf_header.e_machine)
9184                 {
9185                 case EM_MIPS:
9186                 case EM_MIPS_RS3_LE:
9187                   dynamic_section_mips_val (entry);
9188                   break;
9189                 case EM_PARISC:
9190                   dynamic_section_parisc_val (entry);
9191                   break;
9192                 case EM_IA_64:
9193                   dynamic_section_ia64_val (entry);
9194                   break;
9195                 default:
9196                   print_vma (entry->d_un.d_val, PREFIX_HEX);
9197                   putchar ('\n');
9198                 }
9199             }
9200           break;
9201         }
9202     }
9203
9204   return 1;
9205 }
9206
9207 static char *
9208 get_ver_flags (unsigned int flags)
9209 {
9210   static char buff[32];
9211
9212   buff[0] = 0;
9213
9214   if (flags == 0)
9215     return _("none");
9216
9217   if (flags & VER_FLG_BASE)
9218     strcat (buff, "BASE ");
9219
9220   if (flags & VER_FLG_WEAK)
9221     {
9222       if (flags & VER_FLG_BASE)
9223         strcat (buff, "| ");
9224
9225       strcat (buff, "WEAK ");
9226     }
9227
9228   if (flags & VER_FLG_INFO)
9229     {
9230       if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
9231         strcat (buff, "| ");
9232
9233       strcat (buff, "INFO ");
9234     }
9235
9236   if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
9237     strcat (buff, _("| <unknown>"));
9238
9239   return buff;
9240 }
9241
9242 /* Display the contents of the version sections.  */
9243
9244 static int
9245 process_version_sections (FILE * file)
9246 {
9247   Elf_Internal_Shdr * section;
9248   unsigned i;
9249   int found = 0;
9250
9251   if (! do_version)
9252     return 1;
9253
9254   for (i = 0, section = section_headers;
9255        i < elf_header.e_shnum;
9256        i++, section++)
9257     {
9258       switch (section->sh_type)
9259         {
9260         case SHT_GNU_verdef:
9261           {
9262             Elf_External_Verdef * edefs;
9263             unsigned int idx;
9264             unsigned int cnt;
9265             char * endbuf;
9266
9267             found = 1;
9268
9269             printf (_("\nVersion definition section '%s' contains %u entries:\n"),
9270                     printable_section_name (section),
9271                     section->sh_info);
9272
9273             printf (_("  Addr: 0x"));
9274             printf_vma (section->sh_addr);
9275             printf (_("  Offset: %#08lx  Link: %u (%s)"),
9276                     (unsigned long) section->sh_offset, section->sh_link,
9277                     printable_section_name_from_index (section->sh_link));
9278
9279             edefs = (Elf_External_Verdef *)
9280                 get_data (NULL, file, section->sh_offset, 1,section->sh_size,
9281                           _("version definition section"));
9282             if (!edefs)
9283               break;
9284             endbuf = (char *) edefs + section->sh_size;
9285
9286             for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
9287               {
9288                 char * vstart;
9289                 Elf_External_Verdef * edef;
9290                 Elf_Internal_Verdef ent;
9291                 Elf_External_Verdaux * eaux;
9292                 Elf_Internal_Verdaux aux;
9293                 int j;
9294                 int isum;
9295
9296                 /* Check for very large indicies.  */
9297                 if (idx > (size_t) (endbuf - (char *) edefs))
9298                   break;
9299
9300                 vstart = ((char *) edefs) + idx;
9301                 if (vstart + sizeof (*edef) > endbuf)
9302                   break;
9303
9304                 edef = (Elf_External_Verdef *) vstart;
9305
9306                 ent.vd_version = BYTE_GET (edef->vd_version);
9307                 ent.vd_flags   = BYTE_GET (edef->vd_flags);
9308                 ent.vd_ndx     = BYTE_GET (edef->vd_ndx);
9309                 ent.vd_cnt     = BYTE_GET (edef->vd_cnt);
9310                 ent.vd_hash    = BYTE_GET (edef->vd_hash);
9311                 ent.vd_aux     = BYTE_GET (edef->vd_aux);
9312                 ent.vd_next    = BYTE_GET (edef->vd_next);
9313
9314                 printf (_("  %#06x: Rev: %d  Flags: %s"),
9315                         idx, ent.vd_version, get_ver_flags (ent.vd_flags));
9316
9317                 printf (_("  Index: %d  Cnt: %d  "),
9318                         ent.vd_ndx, ent.vd_cnt);
9319
9320                 /* Check for overflow.  */
9321                 if (ent.vd_aux > (size_t) (endbuf - vstart))
9322                   break;
9323
9324                 vstart += ent.vd_aux;
9325
9326                 eaux = (Elf_External_Verdaux *) vstart;
9327
9328                 aux.vda_name = BYTE_GET (eaux->vda_name);
9329                 aux.vda_next = BYTE_GET (eaux->vda_next);
9330
9331                 if (VALID_DYNAMIC_NAME (aux.vda_name))
9332                   printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
9333                 else
9334                   printf (_("Name index: %ld\n"), aux.vda_name);
9335
9336                 isum = idx + ent.vd_aux;
9337
9338                 for (j = 1; j < ent.vd_cnt; j++)
9339                   {
9340                     /* Check for overflow.  */
9341                     if (aux.vda_next > (size_t) (endbuf - vstart))
9342                       break;
9343
9344                     isum   += aux.vda_next;
9345                     vstart += aux.vda_next;
9346
9347                     eaux = (Elf_External_Verdaux *) vstart;
9348                     if (vstart + sizeof (*eaux) > endbuf)
9349                       break;
9350
9351                     aux.vda_name = BYTE_GET (eaux->vda_name);
9352                     aux.vda_next = BYTE_GET (eaux->vda_next);
9353
9354                     if (VALID_DYNAMIC_NAME (aux.vda_name))
9355                       printf (_("  %#06x: Parent %d: %s\n"),
9356                               isum, j, GET_DYNAMIC_NAME (aux.vda_name));
9357                     else
9358                       printf (_("  %#06x: Parent %d, name index: %ld\n"),
9359                               isum, j, aux.vda_name);
9360                   }
9361
9362                 if (j < ent.vd_cnt)
9363                   printf (_("  Version def aux past end of section\n"));
9364
9365                 /* PR 17531: file: id:000001,src:000172+005151,op:splice,rep:2.  */
9366                 if (idx + ent.vd_next <= idx)
9367                   break;
9368
9369                 idx += ent.vd_next;
9370               }
9371
9372             if (cnt < section->sh_info)
9373               printf (_("  Version definition past end of section\n"));
9374
9375             free (edefs);
9376           }
9377           break;
9378
9379         case SHT_GNU_verneed:
9380           {
9381             Elf_External_Verneed * eneed;
9382             unsigned int idx;
9383             unsigned int cnt;
9384             char * endbuf;
9385
9386             found = 1;
9387
9388             printf (_("\nVersion needs section '%s' contains %u entries:\n"),
9389                     printable_section_name (section), section->sh_info);
9390
9391             printf (_(" Addr: 0x"));
9392             printf_vma (section->sh_addr);
9393             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
9394                     (unsigned long) section->sh_offset, section->sh_link,
9395                     printable_section_name_from_index (section->sh_link));
9396
9397             eneed = (Elf_External_Verneed *) get_data (NULL, file,
9398                                                        section->sh_offset, 1,
9399                                                        section->sh_size,
9400                                                        _("Version Needs section"));
9401             if (!eneed)
9402               break;
9403             endbuf = (char *) eneed + section->sh_size;
9404
9405             for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
9406               {
9407                 Elf_External_Verneed * entry;
9408                 Elf_Internal_Verneed ent;
9409                 int j;
9410                 int isum;
9411                 char * vstart;
9412
9413                 if (idx > (size_t) (endbuf - (char *) eneed))
9414                   break;
9415
9416                 vstart = ((char *) eneed) + idx;
9417                 if (vstart + sizeof (*entry) > endbuf)
9418                   break;
9419
9420                 entry = (Elf_External_Verneed *) vstart;
9421
9422                 ent.vn_version = BYTE_GET (entry->vn_version);
9423                 ent.vn_cnt     = BYTE_GET (entry->vn_cnt);
9424                 ent.vn_file    = BYTE_GET (entry->vn_file);
9425                 ent.vn_aux     = BYTE_GET (entry->vn_aux);
9426                 ent.vn_next    = BYTE_GET (entry->vn_next);
9427
9428                 printf (_("  %#06x: Version: %d"), idx, ent.vn_version);
9429
9430                 if (VALID_DYNAMIC_NAME (ent.vn_file))
9431                   printf (_("  File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
9432                 else
9433                   printf (_("  File: %lx"), ent.vn_file);
9434
9435                 printf (_("  Cnt: %d\n"), ent.vn_cnt);
9436
9437                 /* Check for overflow.  */
9438                 if (ent.vn_aux > (size_t) (endbuf - vstart))
9439                   break;
9440                 vstart += ent.vn_aux;
9441
9442                 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
9443                   {
9444                     Elf_External_Vernaux * eaux;
9445                     Elf_Internal_Vernaux aux;
9446
9447                     if (vstart + sizeof (*eaux) > endbuf)
9448                       break;
9449                     eaux = (Elf_External_Vernaux *) vstart;
9450
9451                     aux.vna_hash  = BYTE_GET (eaux->vna_hash);
9452                     aux.vna_flags = BYTE_GET (eaux->vna_flags);
9453                     aux.vna_other = BYTE_GET (eaux->vna_other);
9454                     aux.vna_name  = BYTE_GET (eaux->vna_name);
9455                     aux.vna_next  = BYTE_GET (eaux->vna_next);
9456
9457                     if (VALID_DYNAMIC_NAME (aux.vna_name))
9458                       printf (_("  %#06x:   Name: %s"),
9459                               isum, GET_DYNAMIC_NAME (aux.vna_name));
9460                     else
9461                       printf (_("  %#06x:   Name index: %lx"),
9462                               isum, aux.vna_name);
9463
9464                     printf (_("  Flags: %s  Version: %d\n"),
9465                             get_ver_flags (aux.vna_flags), aux.vna_other);
9466
9467                     /* Check for overflow.  */
9468                     if (aux.vna_next > (size_t) (endbuf - vstart)
9469                         || (aux.vna_next == 0 && j < ent.vn_cnt - 1))
9470                       {
9471                         warn (_("Invalid vna_next field of %lx\n"),
9472                               aux.vna_next);
9473                         j = ent.vn_cnt;
9474                         break;
9475                       }
9476                     isum   += aux.vna_next;
9477                     vstart += aux.vna_next;
9478                   }
9479
9480                 if (j < ent.vn_cnt)
9481                   warn (_("Missing Version Needs auxillary information\n"));
9482
9483                 if (ent.vn_next == 0 && cnt < section->sh_info - 1)
9484                   {
9485                     warn (_("Corrupt Version Needs structure - offset to next structure is zero with entries still left to be processed\n"));
9486                     cnt = section->sh_info;
9487                     break;
9488                   }
9489                 idx += ent.vn_next;
9490               }
9491
9492             if (cnt < section->sh_info)
9493               warn (_("Missing Version Needs information\n"));
9494
9495             free (eneed);
9496           }
9497           break;
9498
9499         case SHT_GNU_versym:
9500           {
9501             Elf_Internal_Shdr * link_section;
9502             size_t total;
9503             unsigned int cnt;
9504             unsigned char * edata;
9505             unsigned short * data;
9506             char * strtab;
9507             Elf_Internal_Sym * symbols;
9508             Elf_Internal_Shdr * string_sec;
9509             unsigned long num_syms;
9510             long off;
9511
9512             if (section->sh_link >= elf_header.e_shnum)
9513               break;
9514
9515             link_section = section_headers + section->sh_link;
9516             total = section->sh_size / sizeof (Elf_External_Versym);
9517
9518             if (link_section->sh_link >= elf_header.e_shnum)
9519               break;
9520
9521             found = 1;
9522
9523             symbols = GET_ELF_SYMBOLS (file, link_section, & num_syms);
9524             if (symbols == NULL)
9525               break;
9526
9527             string_sec = section_headers + link_section->sh_link;
9528
9529             strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
9530                                         string_sec->sh_size,
9531                                         _("version string table"));
9532             if (!strtab)
9533               {
9534                 free (symbols);
9535                 break;
9536               }
9537
9538             printf (_("\nVersion symbols section '%s' contains %lu entries:\n"),
9539                     printable_section_name (section), (unsigned long) total);
9540
9541             printf (_(" Addr: "));
9542             printf_vma (section->sh_addr);
9543             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
9544                     (unsigned long) section->sh_offset, section->sh_link,
9545                     printable_section_name (link_section));
9546
9547             off = offset_from_vma (file,
9548                                    version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
9549                                    total * sizeof (short));
9550             edata = (unsigned char *) get_data (NULL, file, off, total,
9551                                                 sizeof (short),
9552                                                 _("version symbol data"));
9553             if (!edata)
9554               {
9555                 free (strtab);
9556                 free (symbols);
9557                 break;
9558               }
9559
9560             data = (short unsigned int *) cmalloc (total, sizeof (short));
9561
9562             for (cnt = total; cnt --;)
9563               data[cnt] = byte_get (edata + cnt * sizeof (short),
9564                                     sizeof (short));
9565
9566             free (edata);
9567
9568             for (cnt = 0; cnt < total; cnt += 4)
9569               {
9570                 int j, nn;
9571                 int check_def, check_need;
9572                 char * name;
9573
9574                 printf ("  %03x:", cnt);
9575
9576                 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
9577                   switch (data[cnt + j])
9578                     {
9579                     case 0:
9580                       fputs (_("   0 (*local*)    "), stdout);
9581                       break;
9582
9583                     case 1:
9584                       fputs (_("   1 (*global*)   "), stdout);
9585                       break;
9586
9587                     default:
9588                       nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
9589                                    data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
9590
9591                       /* If this index value is greater than the size of the symbols
9592                          array, break to avoid an out-of-bounds read.  */
9593                       if ((unsigned long)(cnt + j) >= num_syms)
9594                         {
9595                           warn (_("invalid index into symbol array\n"));
9596                           break;
9597                         }
9598
9599                       check_def = 1;
9600                       check_need = 1;
9601                       if (symbols[cnt + j].st_shndx >= elf_header.e_shnum
9602                           || section_headers[symbols[cnt + j].st_shndx].sh_type
9603                              != SHT_NOBITS)
9604                         {
9605                           if (symbols[cnt + j].st_shndx == SHN_UNDEF)
9606                             check_def = 0;
9607                           else
9608                             check_need = 0;
9609                         }
9610
9611                       if (check_need
9612                           && version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
9613                         {
9614                           Elf_Internal_Verneed ivn;
9615                           unsigned long offset;
9616
9617                           offset = offset_from_vma
9618                             (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
9619                              sizeof (Elf_External_Verneed));
9620
9621                           do
9622                             {
9623                               Elf_Internal_Vernaux ivna;
9624                               Elf_External_Verneed evn;
9625                               Elf_External_Vernaux evna;
9626                               unsigned long a_off;
9627
9628                               if (get_data (&evn, file, offset, sizeof (evn), 1,
9629                                             _("version need")) == NULL)
9630                                 break;
9631
9632                               ivn.vn_aux  = BYTE_GET (evn.vn_aux);
9633                               ivn.vn_next = BYTE_GET (evn.vn_next);
9634
9635                               a_off = offset + ivn.vn_aux;
9636
9637                               do
9638                                 {
9639                                   if (get_data (&evna, file, a_off, sizeof (evna),
9640                                                 1, _("version need aux (2)")) == NULL)
9641                                     {
9642                                       ivna.vna_next  = 0;
9643                                       ivna.vna_other = 0;
9644                                     }
9645                                   else
9646                                     {
9647                                       ivna.vna_next  = BYTE_GET (evna.vna_next);
9648                                       ivna.vna_other = BYTE_GET (evna.vna_other);
9649                                     }
9650
9651                                   a_off += ivna.vna_next;
9652                                 }
9653                               while (ivna.vna_other != data[cnt + j]
9654                                      && ivna.vna_next != 0);
9655
9656                               if (ivna.vna_other == data[cnt + j])
9657                                 {
9658                                   ivna.vna_name = BYTE_GET (evna.vna_name);
9659
9660                                   if (ivna.vna_name >= string_sec->sh_size)
9661                                     name = _("*invalid*");
9662                                   else
9663                                     name = strtab + ivna.vna_name;
9664                                   nn += printf ("(%s%-*s",
9665                                                 name,
9666                                                 12 - (int) strlen (name),
9667                                                 ")");
9668                                   check_def = 0;
9669                                   break;
9670                                 }
9671
9672                               offset += ivn.vn_next;
9673                             }
9674                           while (ivn.vn_next);
9675                         }
9676
9677                       if (check_def && data[cnt + j] != 0x8001
9678                           && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
9679                         {
9680                           Elf_Internal_Verdef ivd;
9681                           Elf_External_Verdef evd;
9682                           unsigned long offset;
9683
9684                           offset = offset_from_vma
9685                             (file, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
9686                              sizeof evd);
9687
9688                           do
9689                             {
9690                               if (get_data (&evd, file, offset, sizeof (evd), 1,
9691                                             _("version def")) == NULL)
9692                                 {
9693                                   ivd.vd_next = 0;
9694                                   /* PR 17531: file: 046-1082287-0.004.  */ 
9695                                   ivd.vd_ndx  = (data[cnt + j] & VERSYM_VERSION) + 1;
9696                                   break;
9697                                 }
9698                               else
9699                                 {
9700                                   ivd.vd_next = BYTE_GET (evd.vd_next);
9701                                   ivd.vd_ndx  = BYTE_GET (evd.vd_ndx);
9702                                 }
9703
9704                               offset += ivd.vd_next;
9705                             }
9706                           while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
9707                                  && ivd.vd_next != 0);
9708
9709                           if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
9710                             {
9711                               Elf_External_Verdaux evda;
9712                               Elf_Internal_Verdaux ivda;
9713
9714                               ivd.vd_aux = BYTE_GET (evd.vd_aux);
9715
9716                               if (get_data (&evda, file,
9717                                             offset - ivd.vd_next + ivd.vd_aux,
9718                                             sizeof (evda), 1,
9719                                             _("version def aux")) == NULL)
9720                                 break;
9721
9722                               ivda.vda_name = BYTE_GET (evda.vda_name);
9723
9724                               if (ivda.vda_name >= string_sec->sh_size)
9725                                 name = _("*invalid*");
9726                               else
9727                                 name = strtab + ivda.vda_name;
9728                               nn += printf ("(%s%-*s",
9729                                             name,
9730                                             12 - (int) strlen (name),
9731                                             ")");
9732                             }
9733                         }
9734
9735                       if (nn < 18)
9736                         printf ("%*c", 18 - nn, ' ');
9737                     }
9738
9739                 putchar ('\n');
9740               }
9741
9742             free (data);
9743             free (strtab);
9744             free (symbols);
9745           }
9746           break;
9747
9748         default:
9749           break;
9750         }
9751     }
9752
9753   if (! found)
9754     printf (_("\nNo version information found in this file.\n"));
9755
9756   return 1;
9757 }
9758
9759 static const char *
9760 get_symbol_binding (unsigned int binding)
9761 {
9762   static char buff[32];
9763
9764   switch (binding)
9765     {
9766     case STB_LOCAL:     return "LOCAL";
9767     case STB_GLOBAL:    return "GLOBAL";
9768     case STB_WEAK:      return "WEAK";
9769     default:
9770       if (binding >= STB_LOPROC && binding <= STB_HIPROC)
9771         snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
9772                   binding);
9773       else if (binding >= STB_LOOS && binding <= STB_HIOS)
9774         {
9775           if (binding == STB_GNU_UNIQUE
9776               && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
9777                   /* GNU is still using the default value 0.  */
9778                   || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
9779             return "UNIQUE";
9780           snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
9781         }
9782       else
9783         snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
9784       return buff;
9785     }
9786 }
9787
9788 static const char *
9789 get_symbol_type (unsigned int type)
9790 {
9791   static char buff[32];
9792
9793   switch (type)
9794     {
9795     case STT_NOTYPE:    return "NOTYPE";
9796     case STT_OBJECT:    return "OBJECT";
9797     case STT_FUNC:      return "FUNC";
9798     case STT_SECTION:   return "SECTION";
9799     case STT_FILE:      return "FILE";
9800     case STT_COMMON:    return "COMMON";
9801     case STT_TLS:       return "TLS";
9802     case STT_RELC:      return "RELC";
9803     case STT_SRELC:     return "SRELC";
9804     default:
9805       if (type >= STT_LOPROC && type <= STT_HIPROC)
9806         {
9807           if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
9808             return "THUMB_FUNC";
9809
9810           if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
9811             return "REGISTER";
9812
9813           if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
9814             return "PARISC_MILLI";
9815
9816           snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
9817         }
9818       else if (type >= STT_LOOS && type <= STT_HIOS)
9819         {
9820           if (elf_header.e_machine == EM_PARISC)
9821             {
9822               if (type == STT_HP_OPAQUE)
9823                 return "HP_OPAQUE";
9824               if (type == STT_HP_STUB)
9825                 return "HP_STUB";
9826             }
9827
9828           if (type == STT_GNU_IFUNC
9829               && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
9830                   || elf_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD
9831                   /* GNU is still using the default value 0.  */
9832                   || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
9833             return "IFUNC";
9834
9835           snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
9836         }
9837       else
9838         snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
9839       return buff;
9840     }
9841 }
9842
9843 static const char *
9844 get_symbol_visibility (unsigned int visibility)
9845 {
9846   switch (visibility)
9847     {
9848     case STV_DEFAULT:   return "DEFAULT";
9849     case STV_INTERNAL:  return "INTERNAL";
9850     case STV_HIDDEN:    return "HIDDEN";
9851     case STV_PROTECTED: return "PROTECTED";
9852     default:
9853       error (_("Unrecognized visibility value: %u"), visibility);
9854       return _("<unknown>");
9855     }
9856 }
9857
9858 static const char *
9859 get_mips_symbol_other (unsigned int other)
9860 {
9861   switch (other)
9862     {
9863     case STO_OPTIONAL:
9864       return "OPTIONAL";
9865     case STO_MIPS_PLT:
9866       return "MIPS PLT";
9867     case STO_MIPS_PIC:
9868       return "MIPS PIC";
9869     case STO_MICROMIPS:
9870       return "MICROMIPS";
9871     case STO_MICROMIPS | STO_MIPS_PIC:
9872       return "MICROMIPS, MIPS PIC";
9873     case STO_MIPS16:
9874       return "MIPS16";
9875     default:
9876       return NULL;
9877     }
9878 }
9879
9880 static const char *
9881 get_ia64_symbol_other (unsigned int other)
9882 {
9883   if (is_ia64_vms ())
9884     {
9885       static char res[32];
9886
9887       res[0] = 0;
9888
9889       /* Function types is for images and .STB files only.  */
9890       switch (elf_header.e_type)
9891         {
9892         case ET_DYN:
9893         case ET_EXEC:
9894           switch (VMS_ST_FUNC_TYPE (other))
9895             {
9896             case VMS_SFT_CODE_ADDR:
9897               strcat (res, " CA");
9898               break;
9899             case VMS_SFT_SYMV_IDX:
9900               strcat (res, " VEC");
9901               break;
9902             case VMS_SFT_FD:
9903               strcat (res, " FD");
9904               break;
9905             case VMS_SFT_RESERVE:
9906               strcat (res, " RSV");
9907               break;
9908             default:
9909               warn (_("Unrecognized IA64 VMS ST Function type: %d\n"),
9910                     VMS_ST_FUNC_TYPE (other));
9911               strcat (res, " <unknown>");
9912               break;
9913             }
9914           break;
9915         default:
9916           break;
9917         }
9918       switch (VMS_ST_LINKAGE (other))
9919         {
9920         case VMS_STL_IGNORE:
9921           strcat (res, " IGN");
9922           break;
9923         case VMS_STL_RESERVE:
9924           strcat (res, " RSV");
9925           break;
9926         case VMS_STL_STD:
9927           strcat (res, " STD");
9928           break;
9929         case VMS_STL_LNK:
9930           strcat (res, " LNK");
9931           break;
9932         default:
9933           warn (_("Unrecognized IA64 VMS ST Linkage: %d\n"),
9934                 VMS_ST_LINKAGE (other));
9935           strcat (res, " <unknown>");
9936           break;
9937         }
9938
9939       if (res[0] != 0)
9940         return res + 1;
9941       else
9942         return res;
9943     }
9944   return NULL;
9945 }
9946
9947 static const char *
9948 get_ppc64_symbol_other (unsigned int other)
9949 {
9950   if (PPC64_LOCAL_ENTRY_OFFSET (other) != 0)
9951     {
9952       static char buf[32];
9953       snprintf (buf, sizeof buf, _("<localentry>: %d"),
9954                 PPC64_LOCAL_ENTRY_OFFSET (other));
9955       return buf;
9956     }
9957   return NULL;
9958 }
9959
9960 static const char *
9961 get_symbol_other (unsigned int other)
9962 {
9963   const char * result = NULL;
9964   static char buff [32];
9965
9966   if (other == 0)
9967     return "";
9968
9969   switch (elf_header.e_machine)
9970     {
9971     case EM_MIPS:
9972       result = get_mips_symbol_other (other);
9973       break;
9974     case EM_IA_64:
9975       result = get_ia64_symbol_other (other);
9976       break;
9977     case EM_PPC64:
9978       result = get_ppc64_symbol_other (other);
9979       break;
9980     default:
9981       break;
9982     }
9983
9984   if (result)
9985     return result;
9986
9987   snprintf (buff, sizeof buff, _("<other>: %x"), other);
9988   return buff;
9989 }
9990
9991 static const char *
9992 get_symbol_index_type (unsigned int type)
9993 {
9994   static char buff[32];
9995
9996   switch (type)
9997     {
9998     case SHN_UNDEF:     return "UND";
9999     case SHN_ABS:       return "ABS";
10000     case SHN_COMMON:    return "COM";
10001     default:
10002       if (type == SHN_IA_64_ANSI_COMMON
10003           && elf_header.e_machine == EM_IA_64
10004           && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
10005         return "ANSI_COM";
10006       else if ((elf_header.e_machine == EM_X86_64
10007                 || elf_header.e_machine == EM_L1OM
10008                 || elf_header.e_machine == EM_K1OM)
10009                && type == SHN_X86_64_LCOMMON)
10010         return "LARGE_COM";
10011       else if ((type == SHN_MIPS_SCOMMON
10012                 && elf_header.e_machine == EM_MIPS)
10013                || (type == SHN_TIC6X_SCOMMON
10014                    && elf_header.e_machine == EM_TI_C6000))
10015         return "SCOM";
10016       else if (type == SHN_MIPS_SUNDEFINED
10017                && elf_header.e_machine == EM_MIPS)
10018         return "SUND";
10019       else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
10020         sprintf (buff, "PRC[0x%04x]", type & 0xffff);
10021       else if (type >= SHN_LOOS && type <= SHN_HIOS)
10022         sprintf (buff, "OS [0x%04x]", type & 0xffff);
10023       else if (type >= SHN_LORESERVE)
10024         sprintf (buff, "RSV[0x%04x]", type & 0xffff);
10025       else if (type >= elf_header.e_shnum)
10026         sprintf (buff, _("bad section index[%3d]"), type);
10027       else
10028         sprintf (buff, "%3d", type);
10029       break;
10030     }
10031
10032   return buff;
10033 }
10034
10035 static bfd_vma *
10036 get_dynamic_data (FILE * file, size_t number, unsigned int ent_size)
10037 {
10038   unsigned char * e_data;
10039   bfd_vma * i_data;
10040
10041   /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
10042      attempting to allocate memory when the read is bound to fail.  */
10043   if (ent_size * number > current_file_size)
10044     {
10045       error (_("Invalid number of dynamic entries: %lu\n"),
10046              (unsigned long) number);
10047       return NULL;
10048     }
10049
10050   e_data = (unsigned char *) cmalloc (number, ent_size);
10051   if (e_data == NULL)
10052     {
10053       error (_("Out of memory reading %lu dynamic entries\n"),
10054              (unsigned long) number);
10055       return NULL;
10056     }
10057
10058   if (fread (e_data, ent_size, number, file) != number)
10059     {
10060       error (_("Unable to read in %lu bytes of dynamic data\n"),
10061              (unsigned long) (number * ent_size));
10062       free (e_data);
10063       return NULL;
10064     }
10065
10066   i_data = (bfd_vma *) cmalloc (number, sizeof (*i_data));
10067   if (i_data == NULL)
10068     {
10069       error (_("Out of memory allocating space for %lu dynamic entries\n"),
10070              (unsigned long) number);
10071       free (e_data);
10072       return NULL;
10073     }
10074
10075   while (number--)
10076     i_data[number] = byte_get (e_data + number * ent_size, ent_size);
10077
10078   free (e_data);
10079
10080   return i_data;
10081 }
10082
10083 static void
10084 print_dynamic_symbol (bfd_vma si, unsigned long hn)
10085 {
10086   Elf_Internal_Sym * psym;
10087   int n;
10088
10089   n = print_vma (si, DEC_5);
10090   if (n < 5)
10091     fputs (&"     "[n], stdout);
10092   printf (" %3lu: ", hn);
10093
10094   if (dynamic_symbols == NULL || si >= num_dynamic_syms)
10095     {
10096       printf (_("<No info available for dynamic symbol number %lu>\n"),
10097               (unsigned long) si);
10098       return;
10099     }
10100
10101   psym = dynamic_symbols + si;
10102   print_vma (psym->st_value, LONG_HEX);
10103   putchar (' ');
10104   print_vma (psym->st_size, DEC_5);
10105
10106   printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
10107   printf (" %-6s",  get_symbol_binding (ELF_ST_BIND (psym->st_info)));
10108   printf (" %-7s",  get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
10109   /* Check to see if any other bits in the st_other field are set.
10110      Note - displaying this information disrupts the layout of the
10111      table being generated, but for the moment this case is very
10112      rare.  */
10113   if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
10114     printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
10115   printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
10116   if (VALID_DYNAMIC_NAME (psym->st_name))
10117     print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
10118   else
10119     printf (_(" <corrupt: %14ld>"), psym->st_name);
10120   putchar ('\n');
10121 }
10122
10123 static const char *
10124 get_symbol_version_string (FILE *file, int is_dynsym,
10125                            const char *strtab,
10126                            unsigned long int strtab_size,
10127                            unsigned int si, Elf_Internal_Sym *psym,
10128                            enum versioned_symbol_info *sym_info,
10129                            unsigned short *vna_other)
10130 {
10131   const char *version_string = NULL;
10132
10133   if (is_dynsym
10134       && version_info[DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
10135     {
10136       unsigned char data[2];
10137       unsigned short vers_data;
10138       unsigned long offset;
10139       int is_nobits;
10140       int check_def;
10141
10142       offset = offset_from_vma
10143         (file, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10144          sizeof data + si * sizeof (vers_data));
10145
10146       if (get_data (&data, file, offset + si * sizeof (vers_data),
10147                     sizeof (data), 1, _("version data")) == NULL)
10148         return NULL;
10149
10150       vers_data = byte_get (data, 2);
10151
10152       is_nobits = (section_headers != NULL
10153                    && psym->st_shndx < elf_header.e_shnum
10154                    && section_headers[psym->st_shndx].sh_type
10155                    == SHT_NOBITS);
10156
10157       check_def = (psym->st_shndx != SHN_UNDEF);
10158
10159       if ((vers_data & VERSYM_HIDDEN) || vers_data > 1)
10160         {
10161           if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)]
10162               && (is_nobits || ! check_def))
10163             {
10164               Elf_External_Verneed evn;
10165               Elf_Internal_Verneed ivn;
10166               Elf_Internal_Vernaux ivna;
10167
10168               /* We must test both.  */
10169               offset = offset_from_vma
10170                 (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10171                  sizeof evn);
10172
10173               do
10174                 {
10175                   unsigned long vna_off;
10176
10177                   if (get_data (&evn, file, offset, sizeof (evn), 1,
10178                                 _("version need")) == NULL)
10179                     {
10180                       ivna.vna_next = 0;
10181                       ivna.vna_other = 0;
10182                       ivna.vna_name = 0;
10183                       break;
10184                     }
10185
10186                   ivn.vn_aux  = BYTE_GET (evn.vn_aux);
10187                   ivn.vn_next = BYTE_GET (evn.vn_next);
10188
10189                   vna_off = offset + ivn.vn_aux;
10190
10191                   do
10192                     {
10193                       Elf_External_Vernaux evna;
10194
10195                       if (get_data (&evna, file, vna_off,
10196                                     sizeof (evna), 1,
10197                                     _("version need aux (3)")) == NULL)
10198                         {
10199                           ivna.vna_next = 0;
10200                           ivna.vna_other = 0;
10201                           ivna.vna_name = 0;
10202                         }
10203                       else
10204                         {
10205                           ivna.vna_other = BYTE_GET (evna.vna_other);
10206                           ivna.vna_next  = BYTE_GET (evna.vna_next);
10207                           ivna.vna_name  = BYTE_GET (evna.vna_name);
10208                         }
10209
10210                       vna_off += ivna.vna_next;
10211                     }
10212                   while (ivna.vna_other != vers_data
10213                          && ivna.vna_next != 0);
10214
10215                   if (ivna.vna_other == vers_data)
10216                     break;
10217
10218                   offset += ivn.vn_next;
10219                 }
10220               while (ivn.vn_next != 0);
10221
10222               if (ivna.vna_other == vers_data)
10223                 {
10224                   *sym_info = symbol_undefined;
10225                   *vna_other = ivna.vna_other;
10226                   version_string = (ivna.vna_name < strtab_size
10227                                     ? strtab + ivna.vna_name
10228                                     : _("<corrupt>"));
10229                   check_def = 0;
10230                 }
10231               else if (! is_nobits)
10232                 error (_("bad dynamic symbol\n"));
10233               else
10234                 check_def = 1;
10235             }
10236
10237           if (check_def)
10238             {
10239               if (vers_data != 0x8001
10240                   && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10241                 {
10242                   Elf_Internal_Verdef ivd;
10243                   Elf_Internal_Verdaux ivda;
10244                   Elf_External_Verdaux evda;
10245                   unsigned long off;
10246
10247                   off = offset_from_vma
10248                     (file,
10249                      version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10250                      sizeof (Elf_External_Verdef));
10251
10252                   do
10253                     {
10254                       Elf_External_Verdef evd;
10255
10256                       if (get_data (&evd, file, off, sizeof (evd),
10257                                     1, _("version def")) == NULL)
10258                         {
10259                           ivd.vd_ndx = 0;
10260                           ivd.vd_aux = 0;
10261                           ivd.vd_next = 0;
10262                         }
10263                       else
10264                         {
10265                           ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
10266                           ivd.vd_aux = BYTE_GET (evd.vd_aux);
10267                           ivd.vd_next = BYTE_GET (evd.vd_next);
10268                         }
10269
10270                       off += ivd.vd_next;
10271                     }
10272                   while (ivd.vd_ndx != (vers_data & VERSYM_VERSION)
10273                          && ivd.vd_next != 0);
10274
10275                   off -= ivd.vd_next;
10276                   off += ivd.vd_aux;
10277
10278                   if (get_data (&evda, file, off, sizeof (evda),
10279                                 1, _("version def aux")) == NULL)
10280                     return version_string;
10281
10282                   ivda.vda_name = BYTE_GET (evda.vda_name);
10283
10284                   if (psym->st_name != ivda.vda_name)
10285                     {
10286                       *sym_info = ((vers_data & VERSYM_HIDDEN) != 0
10287                                    ? symbol_hidden : symbol_public);
10288                       version_string = (ivda.vda_name < strtab_size
10289                                         ? strtab + ivda.vda_name
10290                                         : _("<corrupt>"));
10291                     }
10292                 }
10293             }
10294         }
10295     }
10296   return version_string;
10297 }
10298
10299 /* Dump the symbol table.  */
10300 static int
10301 process_symbol_table (FILE * file)
10302 {
10303   Elf_Internal_Shdr * section;
10304   bfd_size_type nbuckets = 0;
10305   bfd_size_type nchains = 0;
10306   bfd_vma * buckets = NULL;
10307   bfd_vma * chains = NULL;
10308   bfd_vma ngnubuckets = 0;
10309   bfd_vma * gnubuckets = NULL;
10310   bfd_vma * gnuchains = NULL;
10311   bfd_vma gnusymidx = 0;
10312   bfd_size_type ngnuchains = 0;
10313
10314   if (!do_syms && !do_dyn_syms && !do_histogram)
10315     return 1;
10316
10317   if (dynamic_info[DT_HASH]
10318       && (do_histogram
10319           || (do_using_dynamic
10320               && !do_dyn_syms
10321               && dynamic_strings != NULL)))
10322     {
10323       unsigned char nb[8];
10324       unsigned char nc[8];
10325       unsigned int hash_ent_size = 4;
10326
10327       if ((elf_header.e_machine == EM_ALPHA
10328            || elf_header.e_machine == EM_S390
10329            || elf_header.e_machine == EM_S390_OLD)
10330           && elf_header.e_ident[EI_CLASS] == ELFCLASS64)
10331         hash_ent_size = 8;
10332
10333       if (fseek (file,
10334                  (archive_file_offset
10335                   + offset_from_vma (file, dynamic_info[DT_HASH],
10336                                      sizeof nb + sizeof nc)),
10337                  SEEK_SET))
10338         {
10339           error (_("Unable to seek to start of dynamic information\n"));
10340           goto no_hash;
10341         }
10342
10343       if (fread (nb, hash_ent_size, 1, file) != 1)
10344         {
10345           error (_("Failed to read in number of buckets\n"));
10346           goto no_hash;
10347         }
10348
10349       if (fread (nc, hash_ent_size, 1, file) != 1)
10350         {
10351           error (_("Failed to read in number of chains\n"));
10352           goto no_hash;
10353         }
10354
10355       nbuckets = byte_get (nb, hash_ent_size);
10356       nchains  = byte_get (nc, hash_ent_size);
10357
10358       buckets = get_dynamic_data (file, nbuckets, hash_ent_size);
10359       chains  = get_dynamic_data (file, nchains, hash_ent_size);
10360
10361     no_hash:
10362       if (buckets == NULL || chains == NULL)
10363         {
10364           if (do_using_dynamic)
10365             return 0;
10366           free (buckets);
10367           free (chains);
10368           buckets = NULL;
10369           chains = NULL;
10370           nbuckets = 0;
10371           nchains = 0;
10372         }
10373     }
10374
10375   if (dynamic_info_DT_GNU_HASH
10376       && (do_histogram
10377           || (do_using_dynamic
10378               && !do_dyn_syms
10379               && dynamic_strings != NULL)))
10380     {
10381       unsigned char nb[16];
10382       bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
10383       bfd_vma buckets_vma;
10384
10385       if (fseek (file,
10386                  (archive_file_offset
10387                   + offset_from_vma (file, dynamic_info_DT_GNU_HASH,
10388                                      sizeof nb)),
10389                  SEEK_SET))
10390         {
10391           error (_("Unable to seek to start of dynamic information\n"));
10392           goto no_gnu_hash;
10393         }
10394
10395       if (fread (nb, 16, 1, file) != 1)
10396         {
10397           error (_("Failed to read in number of buckets\n"));
10398           goto no_gnu_hash;
10399         }
10400
10401       ngnubuckets = byte_get (nb, 4);
10402       gnusymidx = byte_get (nb + 4, 4);
10403       bitmaskwords = byte_get (nb + 8, 4);
10404       buckets_vma = dynamic_info_DT_GNU_HASH + 16;
10405       if (is_32bit_elf)
10406         buckets_vma += bitmaskwords * 4;
10407       else
10408         buckets_vma += bitmaskwords * 8;
10409
10410       if (fseek (file,
10411                  (archive_file_offset
10412                   + offset_from_vma (file, buckets_vma, 4)),
10413                  SEEK_SET))
10414         {
10415           error (_("Unable to seek to start of dynamic information\n"));
10416           goto no_gnu_hash;
10417         }
10418
10419       gnubuckets = get_dynamic_data (file, ngnubuckets, 4);
10420
10421       if (gnubuckets == NULL)
10422         goto no_gnu_hash;
10423
10424       for (i = 0; i < ngnubuckets; i++)
10425         if (gnubuckets[i] != 0)
10426           {
10427             if (gnubuckets[i] < gnusymidx)
10428               return 0;
10429
10430             if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
10431               maxchain = gnubuckets[i];
10432           }
10433
10434       if (maxchain == 0xffffffff)
10435         goto no_gnu_hash;
10436
10437       maxchain -= gnusymidx;
10438
10439       if (fseek (file,
10440                  (archive_file_offset
10441                   + offset_from_vma (file, buckets_vma
10442                                            + 4 * (ngnubuckets + maxchain), 4)),
10443                  SEEK_SET))
10444         {
10445           error (_("Unable to seek to start of dynamic information\n"));
10446           goto no_gnu_hash;
10447         }
10448
10449       do
10450         {
10451           if (fread (nb, 4, 1, file) != 1)
10452             {
10453               error (_("Failed to determine last chain length\n"));
10454               goto no_gnu_hash;
10455             }
10456
10457           if (maxchain + 1 == 0)
10458             goto no_gnu_hash;
10459
10460           ++maxchain;
10461         }
10462       while ((byte_get (nb, 4) & 1) == 0);
10463
10464       if (fseek (file,
10465                  (archive_file_offset
10466                   + offset_from_vma (file, buckets_vma + 4 * ngnubuckets, 4)),
10467                  SEEK_SET))
10468         {
10469           error (_("Unable to seek to start of dynamic information\n"));
10470           goto no_gnu_hash;
10471         }
10472
10473       gnuchains = get_dynamic_data (file, maxchain, 4);
10474       ngnuchains = maxchain;
10475
10476     no_gnu_hash:
10477       if (gnuchains == NULL)
10478         {
10479           free (gnubuckets);
10480           gnubuckets = NULL;
10481           ngnubuckets = 0;
10482           if (do_using_dynamic)
10483             return 0;
10484         }
10485     }
10486
10487   if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
10488       && do_syms
10489       && do_using_dynamic
10490       && dynamic_strings != NULL
10491       && dynamic_symbols != NULL)
10492     {
10493       unsigned long hn;
10494
10495       if (dynamic_info[DT_HASH])
10496         {
10497           bfd_vma si;
10498
10499           printf (_("\nSymbol table for image:\n"));
10500           if (is_32bit_elf)
10501             printf (_("  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"));
10502           else
10503             printf (_("  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"));
10504
10505           for (hn = 0; hn < nbuckets; hn++)
10506             {
10507               if (! buckets[hn])
10508                 continue;
10509
10510               for (si = buckets[hn]; si < nchains && si > 0; si = chains[si])
10511                 print_dynamic_symbol (si, hn);
10512             }
10513         }
10514
10515       if (dynamic_info_DT_GNU_HASH)
10516         {
10517           printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
10518           if (is_32bit_elf)
10519             printf (_("  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"));
10520           else
10521             printf (_("  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"));
10522
10523           for (hn = 0; hn < ngnubuckets; ++hn)
10524             if (gnubuckets[hn] != 0)
10525               {
10526                 bfd_vma si = gnubuckets[hn];
10527                 bfd_vma off = si - gnusymidx;
10528
10529                 do
10530                   {
10531                     print_dynamic_symbol (si, hn);
10532                     si++;
10533                   }
10534                 while (off < ngnuchains && (gnuchains[off++] & 1) == 0);
10535               }
10536         }
10537     }
10538   else if ((do_dyn_syms || (do_syms && !do_using_dynamic))
10539            && section_headers != NULL)
10540     {
10541       unsigned int i;
10542
10543       for (i = 0, section = section_headers;
10544            i < elf_header.e_shnum;
10545            i++, section++)
10546         {
10547           unsigned int si;
10548           char * strtab = NULL;
10549           unsigned long int strtab_size = 0;
10550           Elf_Internal_Sym * symtab;
10551           Elf_Internal_Sym * psym;
10552           unsigned long num_syms;
10553
10554           if ((section->sh_type != SHT_SYMTAB
10555                && section->sh_type != SHT_DYNSYM)
10556               || (!do_syms
10557                   && section->sh_type == SHT_SYMTAB))
10558             continue;
10559
10560           if (section->sh_entsize == 0)
10561             {
10562               printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
10563                       printable_section_name (section));
10564               continue;
10565             }
10566
10567           printf (_("\nSymbol table '%s' contains %lu entries:\n"),
10568                   printable_section_name (section),
10569                   (unsigned long) (section->sh_size / section->sh_entsize));
10570
10571           if (is_32bit_elf)
10572             printf (_("   Num:    Value  Size Type    Bind   Vis      Ndx Name\n"));
10573           else
10574             printf (_("   Num:    Value          Size Type    Bind   Vis      Ndx Name\n"));
10575
10576           symtab = GET_ELF_SYMBOLS (file, section, & num_syms);
10577           if (symtab == NULL)
10578             continue;
10579
10580           if (section->sh_link == elf_header.e_shstrndx)
10581             {
10582               strtab = string_table;
10583               strtab_size = string_table_length;
10584             }
10585           else if (section->sh_link < elf_header.e_shnum)
10586             {
10587               Elf_Internal_Shdr * string_sec;
10588
10589               string_sec = section_headers + section->sh_link;
10590
10591               strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
10592                                           1, string_sec->sh_size,
10593                                           _("string table"));
10594               strtab_size = strtab != NULL ? string_sec->sh_size : 0;
10595             }
10596
10597           for (si = 0, psym = symtab; si < num_syms; si++, psym++)
10598             {
10599               const char *version_string;
10600               enum versioned_symbol_info sym_info;
10601               unsigned short vna_other;
10602
10603               printf ("%6d: ", si);
10604               print_vma (psym->st_value, LONG_HEX);
10605               putchar (' ');
10606               print_vma (psym->st_size, DEC_5);
10607               printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
10608               printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
10609               printf (" %-7s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
10610               /* Check to see if any other bits in the st_other field are set.
10611                  Note - displaying this information disrupts the layout of the
10612                  table being generated, but for the moment this case is very rare.  */
10613               if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
10614                 printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
10615               printf (" %4s ", get_symbol_index_type (psym->st_shndx));
10616               print_symbol (25, psym->st_name < strtab_size
10617                             ? strtab + psym->st_name : _("<corrupt>"));
10618
10619               version_string
10620                 = get_symbol_version_string (file,
10621                                              section->sh_type == SHT_DYNSYM,
10622                                              strtab, strtab_size, si,
10623                                              psym, &sym_info, &vna_other);
10624               if (version_string)
10625                 {
10626                   if (sym_info == symbol_undefined)
10627                     printf ("@%s (%d)", version_string, vna_other);
10628                   else
10629                     printf (sym_info == symbol_hidden ? "@%s" : "@@%s",
10630                             version_string);
10631                 }
10632
10633               putchar ('\n');
10634             }
10635
10636           free (symtab);
10637           if (strtab != string_table)
10638             free (strtab);
10639         }
10640     }
10641   else if (do_syms)
10642     printf
10643       (_("\nDynamic symbol information is not available for displaying symbols.\n"));
10644
10645   if (do_histogram && buckets != NULL)
10646     {
10647       unsigned long * lengths;
10648       unsigned long * counts;
10649       unsigned long hn;
10650       bfd_vma si;
10651       unsigned long maxlength = 0;
10652       unsigned long nzero_counts = 0;
10653       unsigned long nsyms = 0;
10654
10655       printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
10656               (unsigned long) nbuckets);
10657
10658       lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
10659       if (lengths == NULL)
10660         {
10661           error (_("Out of memory allocating space for histogram buckets\n"));
10662           return 0;
10663         }
10664
10665       printf (_(" Length  Number     %% of total  Coverage\n"));
10666       for (hn = 0; hn < nbuckets; ++hn)
10667         {
10668           for (si = buckets[hn]; si > 0 && si < nchains; si = chains[si])
10669             {
10670               ++nsyms;
10671               if (maxlength < ++lengths[hn])
10672                 ++maxlength;
10673
10674               /* PR binutils/17531: A corrupt binary could contain broken
10675                  histogram data.  Do not go into an infinite loop trying
10676                  to process it.  */
10677               if (chains[si] == si)
10678                 {
10679                   error (_("histogram chain links to itself\n"));
10680                   break;
10681                 }
10682             }
10683         }
10684
10685       counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
10686       if (counts == NULL)
10687         {
10688           free (lengths);
10689           error (_("Out of memory allocating space for histogram counts\n"));
10690           return 0;
10691         }
10692
10693       for (hn = 0; hn < nbuckets; ++hn)
10694         ++counts[lengths[hn]];
10695
10696       if (nbuckets > 0)
10697         {
10698           unsigned long i;
10699           printf ("      0  %-10lu (%5.1f%%)\n",
10700                   counts[0], (counts[0] * 100.0) / nbuckets);
10701           for (i = 1; i <= maxlength; ++i)
10702             {
10703               nzero_counts += counts[i] * i;
10704               printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
10705                       i, counts[i], (counts[i] * 100.0) / nbuckets,
10706                       (nzero_counts * 100.0) / nsyms);
10707             }
10708         }
10709
10710       free (counts);
10711       free (lengths);
10712     }
10713
10714   if (buckets != NULL)
10715     {
10716       free (buckets);
10717       free (chains);
10718     }
10719
10720   if (do_histogram && gnubuckets != NULL)
10721     {
10722       unsigned long * lengths;
10723       unsigned long * counts;
10724       unsigned long hn;
10725       unsigned long maxlength = 0;
10726       unsigned long nzero_counts = 0;
10727       unsigned long nsyms = 0;
10728
10729       printf (_("\nHistogram for `.gnu.hash' bucket list length (total of %lu buckets):\n"),
10730               (unsigned long) ngnubuckets);
10731
10732       lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
10733       if (lengths == NULL)
10734         {
10735           error (_("Out of memory allocating space for gnu histogram buckets\n"));
10736           return 0;
10737         }
10738
10739       printf (_(" Length  Number     %% of total  Coverage\n"));
10740
10741       for (hn = 0; hn < ngnubuckets; ++hn)
10742         if (gnubuckets[hn] != 0)
10743           {
10744             bfd_vma off, length = 1;
10745
10746             for (off = gnubuckets[hn] - gnusymidx;
10747                  /* PR 17531 file: 010-77222-0.004.  */
10748                  off < ngnuchains && (gnuchains[off] & 1) == 0;
10749                  ++off)
10750               ++length;
10751             lengths[hn] = length;
10752             if (length > maxlength)
10753               maxlength = length;
10754             nsyms += length;
10755           }
10756
10757       counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
10758       if (counts == NULL)
10759         {
10760           free (lengths);
10761           error (_("Out of memory allocating space for gnu histogram counts\n"));
10762           return 0;
10763         }
10764
10765       for (hn = 0; hn < ngnubuckets; ++hn)
10766         ++counts[lengths[hn]];
10767
10768       if (ngnubuckets > 0)
10769         {
10770           unsigned long j;
10771           printf ("      0  %-10lu (%5.1f%%)\n",
10772                   counts[0], (counts[0] * 100.0) / ngnubuckets);
10773           for (j = 1; j <= maxlength; ++j)
10774             {
10775               nzero_counts += counts[j] * j;
10776               printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
10777                       j, counts[j], (counts[j] * 100.0) / ngnubuckets,
10778                       (nzero_counts * 100.0) / nsyms);
10779             }
10780         }
10781
10782       free (counts);
10783       free (lengths);
10784       free (gnubuckets);
10785       free (gnuchains);
10786     }
10787
10788   return 1;
10789 }
10790
10791 static int
10792 process_syminfo (FILE * file ATTRIBUTE_UNUSED)
10793 {
10794   unsigned int i;
10795
10796   if (dynamic_syminfo == NULL
10797       || !do_dynamic)
10798     /* No syminfo, this is ok.  */
10799     return 1;
10800
10801   /* There better should be a dynamic symbol section.  */
10802   if (dynamic_symbols == NULL || dynamic_strings == NULL)
10803     return 0;
10804
10805   if (dynamic_addr)
10806     printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
10807             dynamic_syminfo_offset, dynamic_syminfo_nent);
10808
10809   printf (_(" Num: Name                           BoundTo     Flags\n"));
10810   for (i = 0; i < dynamic_syminfo_nent; ++i)
10811     {
10812       unsigned short int flags = dynamic_syminfo[i].si_flags;
10813
10814       printf ("%4d: ", i);
10815       if (i >= num_dynamic_syms)
10816         printf (_("<corrupt index>"));
10817       else if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
10818         print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
10819       else
10820         printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
10821       putchar (' ');
10822
10823       switch (dynamic_syminfo[i].si_boundto)
10824         {
10825         case SYMINFO_BT_SELF:
10826           fputs ("SELF       ", stdout);
10827           break;
10828         case SYMINFO_BT_PARENT:
10829           fputs ("PARENT     ", stdout);
10830           break;
10831         default:
10832           if (dynamic_syminfo[i].si_boundto > 0
10833               && dynamic_syminfo[i].si_boundto < dynamic_nent
10834               && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
10835             {
10836               print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
10837               putchar (' ' );
10838             }
10839           else
10840             printf ("%-10d ", dynamic_syminfo[i].si_boundto);
10841           break;
10842         }
10843
10844       if (flags & SYMINFO_FLG_DIRECT)
10845         printf (" DIRECT");
10846       if (flags & SYMINFO_FLG_PASSTHRU)
10847         printf (" PASSTHRU");
10848       if (flags & SYMINFO_FLG_COPY)
10849         printf (" COPY");
10850       if (flags & SYMINFO_FLG_LAZYLOAD)
10851         printf (" LAZYLOAD");
10852
10853       puts ("");
10854     }
10855
10856   return 1;
10857 }
10858
10859 /* Check to see if the given reloc needs to be handled in a target specific
10860    manner.  If so then process the reloc and return TRUE otherwise return
10861    FALSE.  */
10862
10863 static bfd_boolean
10864 target_specific_reloc_handling (Elf_Internal_Rela * reloc,
10865                                 unsigned char *     start,
10866                                 Elf_Internal_Sym *  symtab)
10867 {
10868   unsigned int reloc_type = get_reloc_type (reloc->r_info);
10869
10870   switch (elf_header.e_machine)
10871     {
10872     case EM_MSP430:
10873     case EM_MSP430_OLD:
10874       {
10875         static Elf_Internal_Sym * saved_sym = NULL;
10876
10877         switch (reloc_type)
10878           {
10879           case 10: /* R_MSP430_SYM_DIFF */
10880             if (uses_msp430x_relocs ())
10881               break;
10882           case 21: /* R_MSP430X_SYM_DIFF */
10883             saved_sym = symtab + get_reloc_symindex (reloc->r_info);
10884             return TRUE;
10885
10886           case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
10887           case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
10888             goto handle_sym_diff;
10889
10890           case 5: /* R_MSP430_16_BYTE */
10891           case 9: /* R_MSP430_8 */
10892             if (uses_msp430x_relocs ())
10893               break;
10894             goto handle_sym_diff;
10895
10896           case 2: /* R_MSP430_ABS16 */
10897           case 15: /* R_MSP430X_ABS16 */
10898             if (! uses_msp430x_relocs ())
10899               break;
10900             goto handle_sym_diff;
10901
10902           handle_sym_diff:
10903             if (saved_sym != NULL)
10904               {
10905                 bfd_vma value;
10906
10907                 value = reloc->r_addend
10908                   + (symtab[get_reloc_symindex (reloc->r_info)].st_value
10909                      - saved_sym->st_value);
10910
10911                 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
10912
10913                 saved_sym = NULL;
10914                 return TRUE;
10915               }
10916             break;
10917
10918           default:
10919             if (saved_sym != NULL)
10920               error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc\n"));
10921             break;
10922           }
10923         break;
10924       }
10925
10926     case EM_MN10300:
10927     case EM_CYGNUS_MN10300:
10928       {
10929         static Elf_Internal_Sym * saved_sym = NULL;
10930
10931         switch (reloc_type)
10932           {
10933           case 34: /* R_MN10300_ALIGN */
10934             return TRUE;
10935           case 33: /* R_MN10300_SYM_DIFF */
10936             saved_sym = symtab + get_reloc_symindex (reloc->r_info);
10937             return TRUE;
10938           case 1: /* R_MN10300_32 */
10939           case 2: /* R_MN10300_16 */
10940             if (saved_sym != NULL)
10941               {
10942                 bfd_vma value;
10943
10944                 value = reloc->r_addend
10945                   + (symtab[get_reloc_symindex (reloc->r_info)].st_value
10946                      - saved_sym->st_value);
10947
10948                 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
10949
10950                 saved_sym = NULL;
10951                 return TRUE;
10952               }
10953             break;
10954           default:
10955             if (saved_sym != NULL)
10956               error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc\n"));
10957             break;
10958           }
10959         break;
10960       }
10961     }
10962
10963   return FALSE;
10964 }
10965
10966 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
10967    DWARF debug sections.  This is a target specific test.  Note - we do not
10968    go through the whole including-target-headers-multiple-times route, (as
10969    we have already done with <elf/h8.h>) because this would become very
10970    messy and even then this function would have to contain target specific
10971    information (the names of the relocs instead of their numeric values).
10972    FIXME: This is not the correct way to solve this problem.  The proper way
10973    is to have target specific reloc sizing and typing functions created by
10974    the reloc-macros.h header, in the same way that it already creates the
10975    reloc naming functions.  */
10976
10977 static bfd_boolean
10978 is_32bit_abs_reloc (unsigned int reloc_type)
10979 {
10980   switch (elf_header.e_machine)
10981     {
10982     case EM_386:
10983     case EM_486:
10984       return reloc_type == 1; /* R_386_32.  */
10985     case EM_68K:
10986       return reloc_type == 1; /* R_68K_32.  */
10987     case EM_860:
10988       return reloc_type == 1; /* R_860_32.  */
10989     case EM_960:
10990       return reloc_type == 2; /* R_960_32.  */
10991     case EM_AARCH64:
10992       return reloc_type == 258; /* R_AARCH64_ABS32 */
10993     case EM_ALPHA:
10994       return reloc_type == 1; /* R_ALPHA_REFLONG.  */
10995     case EM_ARC:
10996       return reloc_type == 1; /* R_ARC_32.  */
10997     case EM_ARM:
10998       return reloc_type == 2; /* R_ARM_ABS32 */
10999     case EM_AVR_OLD:
11000     case EM_AVR:
11001       return reloc_type == 1;
11002     case EM_ADAPTEVA_EPIPHANY:
11003       return reloc_type == 3;
11004     case EM_BLACKFIN:
11005       return reloc_type == 0x12; /* R_byte4_data.  */
11006     case EM_CRIS:
11007       return reloc_type == 3; /* R_CRIS_32.  */
11008     case EM_CR16:
11009       return reloc_type == 3; /* R_CR16_NUM32.  */
11010     case EM_CRX:
11011       return reloc_type == 15; /* R_CRX_NUM32.  */
11012     case EM_CYGNUS_FRV:
11013       return reloc_type == 1;
11014     case EM_CYGNUS_D10V:
11015     case EM_D10V:
11016       return reloc_type == 6; /* R_D10V_32.  */
11017     case EM_CYGNUS_D30V:
11018     case EM_D30V:
11019       return reloc_type == 12; /* R_D30V_32_NORMAL.  */
11020     case EM_DLX:
11021       return reloc_type == 3; /* R_DLX_RELOC_32.  */
11022     case EM_CYGNUS_FR30:
11023     case EM_FR30:
11024       return reloc_type == 3; /* R_FR30_32.  */
11025     case EM_H8S:
11026     case EM_H8_300:
11027     case EM_H8_300H:
11028       return reloc_type == 1; /* R_H8_DIR32.  */
11029     case EM_IA_64:
11030       return reloc_type == 0x65; /* R_IA64_SECREL32LSB.  */
11031     case EM_IP2K_OLD:
11032     case EM_IP2K:
11033       return reloc_type == 2; /* R_IP2K_32.  */
11034     case EM_IQ2000:
11035       return reloc_type == 2; /* R_IQ2000_32.  */
11036     case EM_LATTICEMICO32:
11037       return reloc_type == 3; /* R_LM32_32.  */
11038     case EM_M32C_OLD:
11039     case EM_M32C:
11040       return reloc_type == 3; /* R_M32C_32.  */
11041     case EM_M32R:
11042       return reloc_type == 34; /* R_M32R_32_RELA.  */
11043     case EM_MCORE:
11044       return reloc_type == 1; /* R_MCORE_ADDR32.  */
11045     case EM_CYGNUS_MEP:
11046       return reloc_type == 4; /* R_MEP_32.  */
11047     case EM_METAG:
11048       return reloc_type == 2; /* R_METAG_ADDR32.  */
11049     case EM_MICROBLAZE:
11050       return reloc_type == 1; /* R_MICROBLAZE_32.  */
11051     case EM_MIPS:
11052       return reloc_type == 2; /* R_MIPS_32.  */
11053     case EM_MMIX:
11054       return reloc_type == 4; /* R_MMIX_32.  */
11055     case EM_CYGNUS_MN10200:
11056     case EM_MN10200:
11057       return reloc_type == 1; /* R_MN10200_32.  */
11058     case EM_CYGNUS_MN10300:
11059     case EM_MN10300:
11060       return reloc_type == 1; /* R_MN10300_32.  */
11061     case EM_MOXIE:
11062       return reloc_type == 1; /* R_MOXIE_32.  */
11063     case EM_MSP430_OLD:
11064     case EM_MSP430:
11065       return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32.  */
11066     case EM_MT:
11067       return reloc_type == 2; /* R_MT_32.  */
11068     case EM_NDS32:
11069       return reloc_type == 20; /* R_NDS32_RELA.  */
11070     case EM_ALTERA_NIOS2:
11071       return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32.  */
11072     case EM_NIOS32:
11073       return reloc_type == 1; /* R_NIOS_32.  */
11074     case EM_OR1K:
11075       return reloc_type == 1; /* R_OR1K_32.  */
11076     case EM_PARISC:
11077       return (reloc_type == 1 /* R_PARISC_DIR32.  */
11078               || reloc_type == 41); /* R_PARISC_SECREL32.  */
11079     case EM_PJ:
11080     case EM_PJ_OLD:
11081       return reloc_type == 1; /* R_PJ_DATA_DIR32.  */
11082     case EM_PPC64:
11083       return reloc_type == 1; /* R_PPC64_ADDR32.  */
11084     case EM_PPC:
11085       return reloc_type == 1; /* R_PPC_ADDR32.  */
11086     case EM_RL78:
11087       return reloc_type == 1; /* R_RL78_DIR32.  */
11088     case EM_RX:
11089       return reloc_type == 1; /* R_RX_DIR32.  */
11090     case EM_S370:
11091       return reloc_type == 1; /* R_I370_ADDR31.  */
11092     case EM_S390_OLD:
11093     case EM_S390:
11094       return reloc_type == 4; /* R_S390_32.  */
11095     case EM_SCORE:
11096       return reloc_type == 8; /* R_SCORE_ABS32.  */
11097     case EM_SH:
11098       return reloc_type == 1; /* R_SH_DIR32.  */
11099     case EM_SPARC32PLUS:
11100     case EM_SPARCV9:
11101     case EM_SPARC:
11102       return reloc_type == 3 /* R_SPARC_32.  */
11103         || reloc_type == 23; /* R_SPARC_UA32.  */
11104     case EM_SPU:
11105       return reloc_type == 6; /* R_SPU_ADDR32 */
11106     case EM_TI_C6000:
11107       return reloc_type == 1; /* R_C6000_ABS32.  */
11108     case EM_TILEGX:
11109       return reloc_type == 2; /* R_TILEGX_32.  */
11110     case EM_TILEPRO:
11111       return reloc_type == 1; /* R_TILEPRO_32.  */
11112     case EM_CYGNUS_V850:
11113     case EM_V850:
11114       return reloc_type == 6; /* R_V850_ABS32.  */
11115     case EM_V800:
11116       return reloc_type == 0x33; /* R_V810_WORD.  */
11117     case EM_VAX:
11118       return reloc_type == 1; /* R_VAX_32.  */
11119     case EM_VISIUM:
11120       return reloc_type == 3;  /* R_VISIUM_32. */
11121     case EM_X86_64:
11122     case EM_L1OM:
11123     case EM_K1OM:
11124       return reloc_type == 10; /* R_X86_64_32.  */
11125     case EM_XC16X:
11126     case EM_C166:
11127       return reloc_type == 3; /* R_XC16C_ABS_32.  */
11128     case EM_XGATE:
11129       return reloc_type == 4; /* R_XGATE_32.  */
11130     case EM_XSTORMY16:
11131       return reloc_type == 1; /* R_XSTROMY16_32.  */
11132     case EM_XTENSA_OLD:
11133     case EM_XTENSA:
11134       return reloc_type == 1; /* R_XTENSA_32.  */
11135     default:
11136       {
11137         static unsigned int prev_warn = 0;
11138
11139         /* Avoid repeating the same warning multiple times.  */
11140         if (prev_warn != elf_header.e_machine)
11141           error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
11142                  elf_header.e_machine);
11143         prev_warn = elf_header.e_machine;
11144         return FALSE;
11145       }
11146     }
11147 }
11148
11149 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11150    a 32-bit pc-relative RELA relocation used in DWARF debug sections.  */
11151
11152 static bfd_boolean
11153 is_32bit_pcrel_reloc (unsigned int reloc_type)
11154 {
11155   switch (elf_header.e_machine)
11156     {
11157     case EM_386:
11158     case EM_486:
11159       return reloc_type == 2;  /* R_386_PC32.  */
11160     case EM_68K:
11161       return reloc_type == 4;  /* R_68K_PC32.  */
11162     case EM_AARCH64:
11163       return reloc_type == 261; /* R_AARCH64_PREL32 */
11164     case EM_ADAPTEVA_EPIPHANY:
11165       return reloc_type == 6;
11166     case EM_ALPHA:
11167       return reloc_type == 10; /* R_ALPHA_SREL32.  */
11168     case EM_ARM:
11169       return reloc_type == 3;  /* R_ARM_REL32 */
11170     case EM_MICROBLAZE:
11171       return reloc_type == 2;  /* R_MICROBLAZE_32_PCREL.  */
11172     case EM_OR1K:
11173       return reloc_type == 9; /* R_OR1K_32_PCREL.  */
11174     case EM_PARISC:
11175       return reloc_type == 9;  /* R_PARISC_PCREL32.  */
11176     case EM_PPC:
11177       return reloc_type == 26; /* R_PPC_REL32.  */
11178     case EM_PPC64:
11179       return reloc_type == 26; /* R_PPC64_REL32.  */
11180     case EM_S390_OLD:
11181     case EM_S390:
11182       return reloc_type == 5;  /* R_390_PC32.  */
11183     case EM_SH:
11184       return reloc_type == 2;  /* R_SH_REL32.  */
11185     case EM_SPARC32PLUS:
11186     case EM_SPARCV9:
11187     case EM_SPARC:
11188       return reloc_type == 6;  /* R_SPARC_DISP32.  */
11189     case EM_SPU:
11190       return reloc_type == 13; /* R_SPU_REL32.  */
11191     case EM_TILEGX:
11192       return reloc_type == 6; /* R_TILEGX_32_PCREL.  */
11193     case EM_TILEPRO:
11194       return reloc_type == 4; /* R_TILEPRO_32_PCREL.  */
11195     case EM_VISIUM:
11196       return reloc_type == 6;  /* R_VISIUM_32_PCREL */
11197     case EM_X86_64:
11198     case EM_L1OM:
11199     case EM_K1OM:
11200       return reloc_type == 2;  /* R_X86_64_PC32.  */
11201     case EM_XTENSA_OLD:
11202     case EM_XTENSA:
11203       return reloc_type == 14; /* R_XTENSA_32_PCREL.  */
11204     default:
11205       /* Do not abort or issue an error message here.  Not all targets use
11206          pc-relative 32-bit relocs in their DWARF debug information and we
11207          have already tested for target coverage in is_32bit_abs_reloc.  A
11208          more helpful warning message will be generated by apply_relocations
11209          anyway, so just return.  */
11210       return FALSE;
11211     }
11212 }
11213
11214 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11215    a 64-bit absolute RELA relocation used in DWARF debug sections.  */
11216
11217 static bfd_boolean
11218 is_64bit_abs_reloc (unsigned int reloc_type)
11219 {
11220   switch (elf_header.e_machine)
11221     {
11222     case EM_AARCH64:
11223       return reloc_type == 257; /* R_AARCH64_ABS64.  */
11224     case EM_ALPHA:
11225       return reloc_type == 2; /* R_ALPHA_REFQUAD.  */
11226     case EM_IA_64:
11227       return reloc_type == 0x27; /* R_IA64_DIR64LSB.  */
11228     case EM_PARISC:
11229       return reloc_type == 80; /* R_PARISC_DIR64.  */
11230     case EM_PPC64:
11231       return reloc_type == 38; /* R_PPC64_ADDR64.  */
11232     case EM_SPARC32PLUS:
11233     case EM_SPARCV9:
11234     case EM_SPARC:
11235       return reloc_type == 54; /* R_SPARC_UA64.  */
11236     case EM_X86_64:
11237     case EM_L1OM:
11238     case EM_K1OM:
11239       return reloc_type == 1; /* R_X86_64_64.  */
11240     case EM_S390_OLD:
11241     case EM_S390:
11242       return reloc_type == 22;  /* R_S390_64.  */
11243     case EM_TILEGX:
11244       return reloc_type == 1; /* R_TILEGX_64.  */
11245     case EM_MIPS:
11246       return reloc_type == 18;  /* R_MIPS_64.  */
11247     default:
11248       return FALSE;
11249     }
11250 }
11251
11252 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
11253    a 64-bit pc-relative RELA relocation used in DWARF debug sections.  */
11254
11255 static bfd_boolean
11256 is_64bit_pcrel_reloc (unsigned int reloc_type)
11257 {
11258   switch (elf_header.e_machine)
11259     {
11260     case EM_AARCH64:
11261       return reloc_type == 260; /* R_AARCH64_PREL64.  */
11262     case EM_ALPHA:
11263       return reloc_type == 11; /* R_ALPHA_SREL64.  */
11264     case EM_IA_64:
11265       return reloc_type == 0x4f; /* R_IA64_PCREL64LSB.  */
11266     case EM_PARISC:
11267       return reloc_type == 72; /* R_PARISC_PCREL64.  */
11268     case EM_PPC64:
11269       return reloc_type == 44; /* R_PPC64_REL64.  */
11270     case EM_SPARC32PLUS:
11271     case EM_SPARCV9:
11272     case EM_SPARC:
11273       return reloc_type == 46; /* R_SPARC_DISP64.  */
11274     case EM_X86_64:
11275     case EM_L1OM:
11276     case EM_K1OM:
11277       return reloc_type == 24; /* R_X86_64_PC64.  */
11278     case EM_S390_OLD:
11279     case EM_S390:
11280       return reloc_type == 23;  /* R_S390_PC64.  */
11281     case EM_TILEGX:
11282       return reloc_type == 5;  /* R_TILEGX_64_PCREL.  */
11283     default:
11284       return FALSE;
11285     }
11286 }
11287
11288 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11289    a 24-bit absolute RELA relocation used in DWARF debug sections.  */
11290
11291 static bfd_boolean
11292 is_24bit_abs_reloc (unsigned int reloc_type)
11293 {
11294   switch (elf_header.e_machine)
11295     {
11296     case EM_CYGNUS_MN10200:
11297     case EM_MN10200:
11298       return reloc_type == 4; /* R_MN10200_24.  */
11299     default:
11300       return FALSE;
11301     }
11302 }
11303
11304 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11305    a 16-bit absolute RELA relocation used in DWARF debug sections.  */
11306
11307 static bfd_boolean
11308 is_16bit_abs_reloc (unsigned int reloc_type)
11309 {
11310   switch (elf_header.e_machine)
11311     {
11312     case EM_AVR_OLD:
11313     case EM_AVR:
11314       return reloc_type == 4; /* R_AVR_16.  */
11315     case EM_ADAPTEVA_EPIPHANY:
11316       return reloc_type == 5;
11317     case EM_CYGNUS_D10V:
11318     case EM_D10V:
11319       return reloc_type == 3; /* R_D10V_16.  */
11320     case EM_H8S:
11321     case EM_H8_300:
11322     case EM_H8_300H:
11323       return reloc_type == R_H8_DIR16;
11324     case EM_IP2K_OLD:
11325     case EM_IP2K:
11326       return reloc_type == 1; /* R_IP2K_16.  */
11327     case EM_M32C_OLD:
11328     case EM_M32C:
11329       return reloc_type == 1; /* R_M32C_16 */
11330     case EM_MSP430:
11331       if (uses_msp430x_relocs ())
11332         return reloc_type == 2; /* R_MSP430_ABS16.  */
11333     case EM_MSP430_OLD:
11334       return reloc_type == 5; /* R_MSP430_16_BYTE.  */
11335     case EM_NDS32:
11336       return reloc_type == 19; /* R_NDS32_RELA.  */
11337     case EM_ALTERA_NIOS2:
11338       return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16.  */
11339     case EM_NIOS32:
11340       return reloc_type == 9; /* R_NIOS_16.  */
11341     case EM_OR1K:
11342       return reloc_type == 2; /* R_OR1K_16.  */
11343     case EM_TI_C6000:
11344       return reloc_type == 2; /* R_C6000_ABS16.  */
11345     case EM_XC16X:
11346     case EM_C166:
11347       return reloc_type == 2; /* R_XC16C_ABS_16.  */
11348     case EM_CYGNUS_MN10200:
11349     case EM_MN10200:
11350       return reloc_type == 2; /* R_MN10200_16.  */
11351     case EM_CYGNUS_MN10300:
11352     case EM_MN10300:
11353       return reloc_type == 2; /* R_MN10300_16.  */
11354     case EM_VISIUM:
11355       return reloc_type == 2; /* R_VISIUM_16. */
11356     case EM_XGATE:
11357       return reloc_type == 3; /* R_XGATE_16.  */
11358     default:
11359       return FALSE;
11360     }
11361 }
11362
11363 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
11364    relocation entries (possibly formerly used for SHT_GROUP sections).  */
11365
11366 static bfd_boolean
11367 is_none_reloc (unsigned int reloc_type)
11368 {
11369   switch (elf_header.e_machine)
11370     {
11371     case EM_68K:     /* R_68K_NONE.  */
11372     case EM_386:     /* R_386_NONE.  */
11373     case EM_SPARC32PLUS:
11374     case EM_SPARCV9:
11375     case EM_SPARC:   /* R_SPARC_NONE.  */
11376     case EM_MIPS:    /* R_MIPS_NONE.  */
11377     case EM_PARISC:  /* R_PARISC_NONE.  */
11378     case EM_ALPHA:   /* R_ALPHA_NONE.  */
11379     case EM_ADAPTEVA_EPIPHANY:
11380     case EM_PPC:     /* R_PPC_NONE.  */
11381     case EM_PPC64:   /* R_PPC64_NONE.  */
11382     case EM_ARM:     /* R_ARM_NONE.  */
11383     case EM_IA_64:   /* R_IA64_NONE.  */
11384     case EM_SH:      /* R_SH_NONE.  */
11385     case EM_S390_OLD:
11386     case EM_S390:    /* R_390_NONE.  */
11387     case EM_CRIS:    /* R_CRIS_NONE.  */
11388     case EM_X86_64:  /* R_X86_64_NONE.  */
11389     case EM_L1OM:    /* R_X86_64_NONE.  */
11390     case EM_K1OM:    /* R_X86_64_NONE.  */
11391     case EM_MN10300: /* R_MN10300_NONE.  */
11392     case EM_MOXIE:   /* R_MOXIE_NONE.  */
11393     case EM_M32R:    /* R_M32R_NONE.  */
11394     case EM_TI_C6000:/* R_C6000_NONE.  */
11395     case EM_TILEGX:  /* R_TILEGX_NONE.  */
11396     case EM_TILEPRO: /* R_TILEPRO_NONE.  */
11397     case EM_XC16X:
11398     case EM_C166:    /* R_XC16X_NONE.  */
11399     case EM_ALTERA_NIOS2: /* R_NIOS2_NONE.  */
11400     case EM_NIOS32:  /* R_NIOS_NONE.  */
11401     case EM_OR1K:    /* R_OR1K_NONE. */
11402       return reloc_type == 0;
11403     case EM_AARCH64:
11404       return reloc_type == 0 || reloc_type == 256;
11405     case EM_NDS32:
11406       return (reloc_type == 0       /* R_XTENSA_NONE.  */
11407               || reloc_type == 204  /* R_NDS32_DIFF8.  */
11408               || reloc_type == 205  /* R_NDS32_DIFF16.  */
11409               || reloc_type == 206  /* R_NDS32_DIFF32.  */
11410               || reloc_type == 207  /* R_NDS32_ULEB128.  */);
11411     case EM_XTENSA_OLD:
11412     case EM_XTENSA:
11413       return (reloc_type == 0      /* R_XTENSA_NONE.  */
11414               || reloc_type == 17  /* R_XTENSA_DIFF8.  */
11415               || reloc_type == 18  /* R_XTENSA_DIFF16.  */
11416               || reloc_type == 19  /* R_XTENSA_DIFF32.  */);
11417     case EM_METAG:
11418       return reloc_type == 3; /* R_METAG_NONE.  */
11419     }
11420   return FALSE;
11421 }
11422
11423 /* Apply relocations to a section.
11424    Note: So far support has been added only for those relocations
11425    which can be found in debug sections.
11426    FIXME: Add support for more relocations ?  */
11427
11428 static void
11429 apply_relocations (void * file,
11430                    Elf_Internal_Shdr * section,
11431                    unsigned char * start)
11432 {
11433   Elf_Internal_Shdr * relsec;
11434   unsigned char * end = start + section->sh_size;
11435
11436   if (elf_header.e_type != ET_REL)
11437     return;
11438
11439   /* Find the reloc section associated with the section.  */
11440   for (relsec = section_headers;
11441        relsec < section_headers + elf_header.e_shnum;
11442        ++relsec)
11443     {
11444       bfd_boolean is_rela;
11445       unsigned long num_relocs;
11446       Elf_Internal_Rela * relocs;
11447       Elf_Internal_Rela * rp;
11448       Elf_Internal_Shdr * symsec;
11449       Elf_Internal_Sym * symtab;
11450       unsigned long num_syms;
11451       Elf_Internal_Sym * sym;
11452
11453       if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
11454           || relsec->sh_info >= elf_header.e_shnum
11455           || section_headers + relsec->sh_info != section
11456           || relsec->sh_size == 0
11457           || relsec->sh_link >= elf_header.e_shnum)
11458         continue;
11459
11460       is_rela = relsec->sh_type == SHT_RELA;
11461
11462       if (is_rela)
11463         {
11464           if (!slurp_rela_relocs ((FILE *) file, relsec->sh_offset,
11465                                   relsec->sh_size, & relocs, & num_relocs))
11466             return;
11467         }
11468       else
11469         {
11470           if (!slurp_rel_relocs ((FILE *) file, relsec->sh_offset,
11471                                  relsec->sh_size, & relocs, & num_relocs))
11472             return;
11473         }
11474
11475       /* SH uses RELA but uses in place value instead of the addend field.  */
11476       if (elf_header.e_machine == EM_SH)
11477         is_rela = FALSE;
11478
11479       symsec = section_headers + relsec->sh_link;
11480       symtab = GET_ELF_SYMBOLS ((FILE *) file, symsec, & num_syms);
11481
11482       for (rp = relocs; rp < relocs + num_relocs; ++rp)
11483         {
11484           bfd_vma         addend;
11485           unsigned int    reloc_type;
11486           unsigned int    reloc_size;
11487           unsigned char * rloc;
11488           unsigned long   sym_index;
11489
11490           reloc_type = get_reloc_type (rp->r_info);
11491
11492           if (target_specific_reloc_handling (rp, start, symtab))
11493             continue;
11494           else if (is_none_reloc (reloc_type))
11495             continue;
11496           else if (is_32bit_abs_reloc (reloc_type)
11497                    || is_32bit_pcrel_reloc (reloc_type))
11498             reloc_size = 4;
11499           else if (is_64bit_abs_reloc (reloc_type)
11500                    || is_64bit_pcrel_reloc (reloc_type))
11501             reloc_size = 8;
11502           else if (is_24bit_abs_reloc (reloc_type))
11503             reloc_size = 3;
11504           else if (is_16bit_abs_reloc (reloc_type))
11505             reloc_size = 2;
11506           else
11507             {
11508               static unsigned int prev_reloc = 0;
11509               if (reloc_type != prev_reloc)
11510                 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
11511                       reloc_type, printable_section_name (section));
11512               prev_reloc = reloc_type;
11513               continue;
11514             }
11515
11516           rloc = start + rp->r_offset;
11517           if ((rloc + reloc_size) > end || (rloc < start))
11518             {
11519               warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
11520                     (unsigned long) rp->r_offset,
11521                     printable_section_name (section));
11522               continue;
11523             }
11524
11525           sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
11526           if (sym_index >= num_syms)
11527             {
11528               warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
11529                     sym_index, printable_section_name (section));
11530               continue;
11531             }
11532           sym = symtab + sym_index;
11533
11534           /* If the reloc has a symbol associated with it,
11535              make sure that it is of an appropriate type.
11536
11537              Relocations against symbols without type can happen.
11538              Gcc -feliminate-dwarf2-dups may generate symbols
11539              without type for debug info.
11540
11541              Icc generates relocations against function symbols
11542              instead of local labels.
11543
11544              Relocations against object symbols can happen, eg when
11545              referencing a global array.  For an example of this see
11546              the _clz.o binary in libgcc.a.  */
11547           if (sym != symtab
11548               && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
11549             {
11550               warn (_("skipping unexpected symbol type %s in %ld'th relocation in section %s\n"),
11551                     get_symbol_type (ELF_ST_TYPE (sym->st_info)),
11552                     (long int)(rp - relocs),
11553                     printable_section_name (relsec));
11554               continue;
11555             }
11556
11557           addend = 0;
11558           if (is_rela)
11559             addend += rp->r_addend;
11560           /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
11561              partial_inplace.  */
11562           if (!is_rela
11563               || (elf_header.e_machine == EM_XTENSA
11564                   && reloc_type == 1)
11565               || ((elf_header.e_machine == EM_PJ
11566                    || elf_header.e_machine == EM_PJ_OLD)
11567                   && reloc_type == 1)
11568               || ((elf_header.e_machine == EM_D30V
11569                    || elf_header.e_machine == EM_CYGNUS_D30V)
11570                   && reloc_type == 12))
11571             addend += byte_get (rloc, reloc_size);
11572
11573           if (is_32bit_pcrel_reloc (reloc_type)
11574               || is_64bit_pcrel_reloc (reloc_type))
11575             {
11576               /* On HPPA, all pc-relative relocations are biased by 8.  */
11577               if (elf_header.e_machine == EM_PARISC)
11578                 addend -= 8;
11579               byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
11580                         reloc_size);
11581             }
11582           else
11583             byte_put (rloc, addend + sym->st_value, reloc_size);
11584         }
11585
11586       free (symtab);
11587       free (relocs);
11588       break;
11589     }
11590 }
11591
11592 #ifdef SUPPORT_DISASSEMBLY
11593 static int
11594 disassemble_section (Elf_Internal_Shdr * section, FILE * file)
11595 {
11596   printf (_("\nAssembly dump of section %s\n"), printable_section_name (section));
11597
11598   /* FIXME: XXX -- to be done --- XXX */
11599
11600   return 1;
11601 }
11602 #endif
11603
11604 /* Reads in the contents of SECTION from FILE, returning a pointer
11605    to a malloc'ed buffer or NULL if something went wrong.  */
11606
11607 static char *
11608 get_section_contents (Elf_Internal_Shdr * section, FILE * file)
11609 {
11610   bfd_size_type num_bytes;
11611
11612   num_bytes = section->sh_size;
11613
11614   if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
11615     {
11616       printf (_("\nSection '%s' has no data to dump.\n"),
11617               printable_section_name (section));
11618       return NULL;
11619     }
11620
11621   return  (char *) get_data (NULL, file, section->sh_offset, 1, num_bytes,
11622                              _("section contents"));
11623 }
11624
11625
11626 static void
11627 dump_section_as_strings (Elf_Internal_Shdr * section, FILE * file)
11628 {
11629   Elf_Internal_Shdr * relsec;
11630   bfd_size_type num_bytes;
11631   char * data;
11632   char * end;
11633   char * start;
11634   bfd_boolean some_strings_shown;
11635
11636   start = get_section_contents (section, file);
11637   if (start == NULL)
11638     return;
11639
11640   printf (_("\nString dump of section '%s':\n"), printable_section_name (section));
11641
11642   /* If the section being dumped has relocations against it the user might
11643      be expecting these relocations to have been applied.  Check for this
11644      case and issue a warning message in order to avoid confusion.
11645      FIXME: Maybe we ought to have an option that dumps a section with
11646      relocs applied ?  */
11647   for (relsec = section_headers;
11648        relsec < section_headers + elf_header.e_shnum;
11649        ++relsec)
11650     {
11651       if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
11652           || relsec->sh_info >= elf_header.e_shnum
11653           || section_headers + relsec->sh_info != section
11654           || relsec->sh_size == 0
11655           || relsec->sh_link >= elf_header.e_shnum)
11656         continue;
11657
11658       printf (_("  Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
11659       break;
11660     }
11661
11662   num_bytes = section->sh_size;
11663   data = start;
11664   end  = start + num_bytes;
11665   some_strings_shown = FALSE;
11666
11667   while (data < end)
11668     {
11669       while (!ISPRINT (* data))
11670         if (++ data >= end)
11671           break;
11672
11673       if (data < end)
11674         {
11675           size_t maxlen = end - data;
11676
11677 #ifndef __MSVCRT__
11678           /* PR 11128: Use two separate invocations in order to work
11679              around bugs in the Solaris 8 implementation of printf.  */
11680           printf ("  [%6tx]  ", data - start);
11681 #else
11682           printf ("  [%6Ix]  ", (size_t) (data - start));
11683 #endif
11684           if (maxlen > 0)
11685             {
11686               print_symbol ((int) maxlen, data);
11687               putchar ('\n');
11688               data += strnlen (data, maxlen);
11689             }
11690           else
11691             {
11692               printf (_("<corrupt>\n"));
11693               data = end;
11694             }
11695           some_strings_shown = TRUE;
11696         }
11697     }
11698
11699   if (! some_strings_shown)
11700     printf (_("  No strings found in this section."));
11701
11702   free (start);
11703
11704   putchar ('\n');
11705 }
11706
11707 static void
11708 dump_section_as_bytes (Elf_Internal_Shdr * section,
11709                        FILE * file,
11710                        bfd_boolean relocate)
11711 {
11712   Elf_Internal_Shdr * relsec;
11713   bfd_size_type bytes;
11714   bfd_vma addr;
11715   unsigned char * data;
11716   unsigned char * start;
11717
11718   start = (unsigned char *) get_section_contents (section, file);
11719   if (start == NULL)
11720     return;
11721
11722   printf (_("\nHex dump of section '%s':\n"), printable_section_name (section));
11723
11724   if (relocate)
11725     {
11726       apply_relocations (file, section, start);
11727     }
11728   else
11729     {
11730       /* If the section being dumped has relocations against it the user might
11731          be expecting these relocations to have been applied.  Check for this
11732          case and issue a warning message in order to avoid confusion.
11733          FIXME: Maybe we ought to have an option that dumps a section with
11734          relocs applied ?  */
11735       for (relsec = section_headers;
11736            relsec < section_headers + elf_header.e_shnum;
11737            ++relsec)
11738         {
11739           if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
11740               || relsec->sh_info >= elf_header.e_shnum
11741               || section_headers + relsec->sh_info != section
11742               || relsec->sh_size == 0
11743               || relsec->sh_link >= elf_header.e_shnum)
11744             continue;
11745
11746           printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
11747           break;
11748         }
11749     }
11750
11751   addr = section->sh_addr;
11752   bytes = section->sh_size;
11753   data = start;
11754
11755   while (bytes)
11756     {
11757       int j;
11758       int k;
11759       int lbytes;
11760
11761       lbytes = (bytes > 16 ? 16 : bytes);
11762
11763       printf ("  0x%8.8lx ", (unsigned long) addr);
11764
11765       for (j = 0; j < 16; j++)
11766         {
11767           if (j < lbytes)
11768             printf ("%2.2x", data[j]);
11769           else
11770             printf ("  ");
11771
11772           if ((j & 3) == 3)
11773             printf (" ");
11774         }
11775
11776       for (j = 0; j < lbytes; j++)
11777         {
11778           k = data[j];
11779           if (k >= ' ' && k < 0x7f)
11780             printf ("%c", k);
11781           else
11782             printf (".");
11783         }
11784
11785       putchar ('\n');
11786
11787       data  += lbytes;
11788       addr  += lbytes;
11789       bytes -= lbytes;
11790     }
11791
11792   free (start);
11793
11794   putchar ('\n');
11795 }
11796
11797 /* Uncompresses a section that was compressed using zlib, in place.  */
11798
11799 static int
11800 uncompress_section_contents (unsigned char **buffer ATTRIBUTE_UNUSED,
11801                              dwarf_size_type *size ATTRIBUTE_UNUSED)
11802 {
11803 #ifndef HAVE_ZLIB_H
11804   return FALSE;
11805 #else
11806   dwarf_size_type compressed_size = *size;
11807   unsigned char * compressed_buffer = *buffer;
11808   dwarf_size_type uncompressed_size;
11809   unsigned char * uncompressed_buffer;
11810   z_stream strm;
11811   int rc;
11812   dwarf_size_type header_size = 12;
11813
11814   /* Read the zlib header.  In this case, it should be "ZLIB" followed
11815      by the uncompressed section size, 8 bytes in big-endian order.  */
11816   if (compressed_size < header_size
11817       || ! streq ((char *) compressed_buffer, "ZLIB"))
11818     return 0;
11819
11820   uncompressed_size = compressed_buffer[4]; uncompressed_size <<= 8;
11821   uncompressed_size += compressed_buffer[5]; uncompressed_size <<= 8;
11822   uncompressed_size += compressed_buffer[6]; uncompressed_size <<= 8;
11823   uncompressed_size += compressed_buffer[7]; uncompressed_size <<= 8;
11824   uncompressed_size += compressed_buffer[8]; uncompressed_size <<= 8;
11825   uncompressed_size += compressed_buffer[9]; uncompressed_size <<= 8;
11826   uncompressed_size += compressed_buffer[10]; uncompressed_size <<= 8;
11827   uncompressed_size += compressed_buffer[11];
11828
11829   /* It is possible the section consists of several compressed
11830      buffers concatenated together, so we uncompress in a loop.  */
11831   strm.zalloc = NULL;
11832   strm.zfree = NULL;
11833   strm.opaque = NULL;
11834   strm.avail_in = compressed_size - header_size;
11835   strm.next_in = (Bytef *) compressed_buffer + header_size;
11836   strm.avail_out = uncompressed_size;
11837   uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
11838
11839   rc = inflateInit (& strm);
11840   while (strm.avail_in > 0)
11841     {
11842       if (rc != Z_OK)
11843         goto fail;
11844       strm.next_out = ((Bytef *) uncompressed_buffer
11845                        + (uncompressed_size - strm.avail_out));
11846       rc = inflate (&strm, Z_FINISH);
11847       if (rc != Z_STREAM_END)
11848         goto fail;
11849       rc = inflateReset (& strm);
11850     }
11851   rc = inflateEnd (& strm);
11852   if (rc != Z_OK
11853       || strm.avail_out != 0)
11854     goto fail;
11855
11856   free (compressed_buffer);
11857   *buffer = uncompressed_buffer;
11858   *size = uncompressed_size;
11859   return 1;
11860
11861  fail:
11862   free (uncompressed_buffer);
11863   /* Indicate decompression failure.  */
11864   *buffer = NULL;
11865   return 0;
11866 #endif  /* HAVE_ZLIB_H */
11867 }
11868
11869 static int
11870 load_specific_debug_section (enum dwarf_section_display_enum debug,
11871                              Elf_Internal_Shdr * sec, void * file)
11872 {
11873   struct dwarf_section * section = &debug_displays [debug].section;
11874   char buf [64];
11875
11876   /* If it is already loaded, do nothing.  */
11877   if (section->start != NULL)
11878     return 1;
11879
11880   snprintf (buf, sizeof (buf), _("%s section data"), section->name);
11881   section->address = sec->sh_addr;
11882   section->user_data = NULL;
11883   section->start = (unsigned char *) get_data (NULL, (FILE *) file,
11884                                                sec->sh_offset, 1,
11885                                                sec->sh_size, buf);
11886   if (section->start == NULL)
11887     section->size = 0;
11888   else
11889     {
11890       section->size = sec->sh_size;
11891       if (uncompress_section_contents (&section->start, &section->size))
11892         sec->sh_size = section->size;
11893     }
11894
11895   if (section->start == NULL)
11896     return 0;
11897
11898   if (debug_displays [debug].relocate)
11899     apply_relocations ((FILE *) file, sec, section->start);
11900
11901   return 1;
11902 }
11903
11904 /* If this is not NULL, load_debug_section will only look for sections
11905    within the list of sections given here.  */
11906 unsigned int *section_subset = NULL;
11907
11908 int
11909 load_debug_section (enum dwarf_section_display_enum debug, void * file)
11910 {
11911   struct dwarf_section * section = &debug_displays [debug].section;
11912   Elf_Internal_Shdr * sec;
11913
11914   /* Locate the debug section.  */
11915   sec = find_section_in_set (section->uncompressed_name, section_subset);
11916   if (sec != NULL)
11917     section->name = section->uncompressed_name;
11918   else
11919     {
11920       sec = find_section_in_set (section->compressed_name, section_subset);
11921       if (sec != NULL)
11922         section->name = section->compressed_name;
11923     }
11924   if (sec == NULL)
11925     return 0;
11926
11927   /* If we're loading from a subset of sections, and we've loaded
11928      a section matching this name before, it's likely that it's a
11929      different one.  */
11930   if (section_subset != NULL)
11931     free_debug_section (debug);
11932
11933   return load_specific_debug_section (debug, sec, (FILE *) file);
11934 }
11935
11936 void
11937 free_debug_section (enum dwarf_section_display_enum debug)
11938 {
11939   struct dwarf_section * section = &debug_displays [debug].section;
11940
11941   if (section->start == NULL)
11942     return;
11943
11944   free ((char *) section->start);
11945   section->start = NULL;
11946   section->address = 0;
11947   section->size = 0;
11948 }
11949
11950 static int
11951 display_debug_section (int shndx, Elf_Internal_Shdr * section, FILE * file)
11952 {
11953   char * name = SECTION_NAME (section);
11954   const char * print_name = printable_section_name (section);
11955   bfd_size_type length;
11956   int result = 1;
11957   int i;
11958
11959   length = section->sh_size;
11960   if (length == 0)
11961     {
11962       printf (_("\nSection '%s' has no debugging data.\n"), print_name);
11963       return 0;
11964     }
11965   if (section->sh_type == SHT_NOBITS)
11966     {
11967       /* There is no point in dumping the contents of a debugging section
11968          which has the NOBITS type - the bits in the file will be random.
11969          This can happen when a file containing a .eh_frame section is
11970          stripped with the --only-keep-debug command line option.  */
11971       printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"),
11972               print_name);
11973       return 0;
11974     }
11975
11976   if (const_strneq (name, ".gnu.linkonce.wi."))
11977     name = ".debug_info";
11978
11979   /* See if we know how to display the contents of this section.  */
11980   for (i = 0; i < max; i++)
11981     if (streq (debug_displays[i].section.uncompressed_name, name)
11982         || (i == line && const_strneq (name, ".debug_line."))
11983         || streq (debug_displays[i].section.compressed_name, name))
11984       {
11985         struct dwarf_section * sec = &debug_displays [i].section;
11986         int secondary = (section != find_section (name));
11987
11988         if (secondary)
11989           free_debug_section ((enum dwarf_section_display_enum) i);
11990
11991         if (i == line && const_strneq (name, ".debug_line."))
11992           sec->name = name;
11993         else if (streq (sec->uncompressed_name, name))
11994           sec->name = sec->uncompressed_name;
11995         else
11996           sec->name = sec->compressed_name;
11997         if (load_specific_debug_section ((enum dwarf_section_display_enum) i,
11998                                          section, file))
11999           {
12000             /* If this debug section is part of a CU/TU set in a .dwp file,
12001                restrict load_debug_section to the sections in that set.  */
12002             section_subset = find_cu_tu_set (file, shndx);
12003
12004             result &= debug_displays[i].display (sec, file);
12005
12006             section_subset = NULL;
12007
12008             if (secondary || (i != info && i != abbrev))
12009               free_debug_section ((enum dwarf_section_display_enum) i);
12010           }
12011
12012         break;
12013       }
12014
12015   if (i == max)
12016     {
12017       printf (_("Unrecognized debug section: %s\n"), print_name);
12018       result = 0;
12019     }
12020
12021   return result;
12022 }
12023
12024 /* Set DUMP_SECTS for all sections where dumps were requested
12025    based on section name.  */
12026
12027 static void
12028 initialise_dumps_byname (void)
12029 {
12030   struct dump_list_entry * cur;
12031
12032   for (cur = dump_sects_byname; cur; cur = cur->next)
12033     {
12034       unsigned int i;
12035       int any;
12036
12037       for (i = 0, any = 0; i < elf_header.e_shnum; i++)
12038         if (streq (SECTION_NAME (section_headers + i), cur->name))
12039           {
12040             request_dump_bynumber (i, cur->type);
12041             any = 1;
12042           }
12043
12044       if (!any)
12045         warn (_("Section '%s' was not dumped because it does not exist!\n"),
12046               cur->name);
12047     }
12048 }
12049
12050 static void
12051 process_section_contents (FILE * file)
12052 {
12053   Elf_Internal_Shdr * section;
12054   unsigned int i;
12055
12056   if (! do_dump)
12057     return;
12058
12059   initialise_dumps_byname ();
12060
12061   for (i = 0, section = section_headers;
12062        i < elf_header.e_shnum && i < num_dump_sects;
12063        i++, section++)
12064     {
12065 #ifdef SUPPORT_DISASSEMBLY
12066       if (dump_sects[i] & DISASS_DUMP)
12067         disassemble_section (section, file);
12068 #endif
12069       if (dump_sects[i] & HEX_DUMP)
12070         dump_section_as_bytes (section, file, FALSE);
12071
12072       if (dump_sects[i] & RELOC_DUMP)
12073         dump_section_as_bytes (section, file, TRUE);
12074
12075       if (dump_sects[i] & STRING_DUMP)
12076         dump_section_as_strings (section, file);
12077
12078       if (dump_sects[i] & DEBUG_DUMP)
12079         display_debug_section (i, section, file);
12080     }
12081
12082   /* Check to see if the user requested a
12083      dump of a section that does not exist.  */
12084   while (i++ < num_dump_sects)
12085     if (dump_sects[i])
12086       warn (_("Section %d was not dumped because it does not exist!\n"), i);
12087 }
12088
12089 static void
12090 process_mips_fpe_exception (int mask)
12091 {
12092   if (mask)
12093     {
12094       int first = 1;
12095       if (mask & OEX_FPU_INEX)
12096         fputs ("INEX", stdout), first = 0;
12097       if (mask & OEX_FPU_UFLO)
12098         printf ("%sUFLO", first ? "" : "|"), first = 0;
12099       if (mask & OEX_FPU_OFLO)
12100         printf ("%sOFLO", first ? "" : "|"), first = 0;
12101       if (mask & OEX_FPU_DIV0)
12102         printf ("%sDIV0", first ? "" : "|"), first = 0;
12103       if (mask & OEX_FPU_INVAL)
12104         printf ("%sINVAL", first ? "" : "|");
12105     }
12106   else
12107     fputs ("0", stdout);
12108 }
12109
12110 /* Display's the value of TAG at location P.  If TAG is
12111    greater than 0 it is assumed to be an unknown tag, and
12112    a message is printed to this effect.  Otherwise it is
12113    assumed that a message has already been printed.
12114
12115    If the bottom bit of TAG is set it assumed to have a
12116    string value, otherwise it is assumed to have an integer
12117    value.
12118
12119    Returns an updated P pointing to the first unread byte
12120    beyond the end of TAG's value.
12121
12122    Reads at or beyond END will not be made.  */
12123
12124 static unsigned char *
12125 display_tag_value (int tag,
12126                    unsigned char * p,
12127                    const unsigned char * const end)
12128 {
12129   unsigned long val;
12130
12131   if (tag > 0)
12132     printf ("  Tag_unknown_%d: ", tag);
12133
12134   if (p >= end)
12135     {
12136       warn (_("<corrupt tag>\n"));
12137     }
12138   else if (tag & 1)
12139     {
12140       /* PR 17531 file: 027-19978-0.004.  */
12141       size_t maxlen = (end - p) - 1;
12142
12143       putchar ('"');
12144       if (maxlen > 0)
12145         {
12146           print_symbol ((int) maxlen, (const char *) p);
12147           p += strnlen ((char *) p, maxlen) + 1;
12148         }
12149       else
12150         {
12151           printf (_("<corrupt string tag>"));
12152           p = (unsigned char *) end;
12153         }
12154       printf ("\"\n");
12155     }
12156   else
12157     {
12158       unsigned int len;
12159
12160       val = read_uleb128 (p, &len, end);
12161       p += len;
12162       printf ("%ld (0x%lx)\n", val, val);
12163     }
12164
12165   assert (p <= end);
12166   return p;
12167 }
12168
12169 /* ARM EABI attributes section.  */
12170 typedef struct
12171 {
12172   unsigned int tag;
12173   const char * name;
12174   /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup.  */
12175   unsigned int type;
12176   const char ** table;
12177 } arm_attr_public_tag;
12178
12179 static const char * arm_attr_tag_CPU_arch[] =
12180   {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
12181    "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8"};
12182 static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
12183 static const char * arm_attr_tag_THUMB_ISA_use[] =
12184   {"No", "Thumb-1", "Thumb-2"};
12185 static const char * arm_attr_tag_FP_arch[] =
12186   {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
12187    "FP for ARMv8", "FPv5/FP-D16 for ARMv8"};
12188 static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
12189 static const char * arm_attr_tag_Advanced_SIMD_arch[] =
12190   {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8"};
12191 static const char * arm_attr_tag_PCS_config[] =
12192   {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
12193    "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
12194 static const char * arm_attr_tag_ABI_PCS_R9_use[] =
12195   {"V6", "SB", "TLS", "Unused"};
12196 static const char * arm_attr_tag_ABI_PCS_RW_data[] =
12197   {"Absolute", "PC-relative", "SB-relative", "None"};
12198 static const char * arm_attr_tag_ABI_PCS_RO_data[] =
12199   {"Absolute", "PC-relative", "None"};
12200 static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
12201   {"None", "direct", "GOT-indirect"};
12202 static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
12203   {"None", "??? 1", "2", "??? 3", "4"};
12204 static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
12205 static const char * arm_attr_tag_ABI_FP_denormal[] =
12206   {"Unused", "Needed", "Sign only"};
12207 static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
12208 static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
12209 static const char * arm_attr_tag_ABI_FP_number_model[] =
12210   {"Unused", "Finite", "RTABI", "IEEE 754"};
12211 static const char * arm_attr_tag_ABI_enum_size[] =
12212   {"Unused", "small", "int", "forced to int"};
12213 static const char * arm_attr_tag_ABI_HardFP_use[] =
12214   {"As Tag_FP_arch", "SP only", "DP only", "SP and DP"};
12215 static const char * arm_attr_tag_ABI_VFP_args[] =
12216   {"AAPCS", "VFP registers", "custom", "compatible"};
12217 static const char * arm_attr_tag_ABI_WMMX_args[] =
12218   {"AAPCS", "WMMX registers", "custom"};
12219 static const char * arm_attr_tag_ABI_optimization_goals[] =
12220   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
12221     "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
12222 static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
12223   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
12224     "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
12225 static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
12226 static const char * arm_attr_tag_FP_HP_extension[] =
12227   {"Not Allowed", "Allowed"};
12228 static const char * arm_attr_tag_ABI_FP_16bit_format[] =
12229   {"None", "IEEE 754", "Alternative Format"};
12230 static const char * arm_attr_tag_MPextension_use[] =
12231   {"Not Allowed", "Allowed"};
12232 static const char * arm_attr_tag_DIV_use[] =
12233   {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
12234     "Allowed in v7-A with integer division extension"};
12235 static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
12236 static const char * arm_attr_tag_Virtualization_use[] =
12237   {"Not Allowed", "TrustZone", "Virtualization Extensions",
12238     "TrustZone and Virtualization Extensions"};
12239 static const char * arm_attr_tag_MPextension_use_legacy[] =
12240   {"Not Allowed", "Allowed"};
12241
12242 #define LOOKUP(id, name) \
12243   {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
12244 static arm_attr_public_tag arm_attr_public_tags[] =
12245 {
12246   {4, "CPU_raw_name", 1, NULL},
12247   {5, "CPU_name", 1, NULL},
12248   LOOKUP(6, CPU_arch),
12249   {7, "CPU_arch_profile", 0, NULL},
12250   LOOKUP(8, ARM_ISA_use),
12251   LOOKUP(9, THUMB_ISA_use),
12252   LOOKUP(10, FP_arch),
12253   LOOKUP(11, WMMX_arch),
12254   LOOKUP(12, Advanced_SIMD_arch),
12255   LOOKUP(13, PCS_config),
12256   LOOKUP(14, ABI_PCS_R9_use),
12257   LOOKUP(15, ABI_PCS_RW_data),
12258   LOOKUP(16, ABI_PCS_RO_data),
12259   LOOKUP(17, ABI_PCS_GOT_use),
12260   LOOKUP(18, ABI_PCS_wchar_t),
12261   LOOKUP(19, ABI_FP_rounding),
12262   LOOKUP(20, ABI_FP_denormal),
12263   LOOKUP(21, ABI_FP_exceptions),
12264   LOOKUP(22, ABI_FP_user_exceptions),
12265   LOOKUP(23, ABI_FP_number_model),
12266   {24, "ABI_align_needed", 0, NULL},
12267   {25, "ABI_align_preserved", 0, NULL},
12268   LOOKUP(26, ABI_enum_size),
12269   LOOKUP(27, ABI_HardFP_use),
12270   LOOKUP(28, ABI_VFP_args),
12271   LOOKUP(29, ABI_WMMX_args),
12272   LOOKUP(30, ABI_optimization_goals),
12273   LOOKUP(31, ABI_FP_optimization_goals),
12274   {32, "compatibility", 0, NULL},
12275   LOOKUP(34, CPU_unaligned_access),
12276   LOOKUP(36, FP_HP_extension),
12277   LOOKUP(38, ABI_FP_16bit_format),
12278   LOOKUP(42, MPextension_use),
12279   LOOKUP(44, DIV_use),
12280   {64, "nodefaults", 0, NULL},
12281   {65, "also_compatible_with", 0, NULL},
12282   LOOKUP(66, T2EE_use),
12283   {67, "conformance", 1, NULL},
12284   LOOKUP(68, Virtualization_use),
12285   LOOKUP(70, MPextension_use_legacy)
12286 };
12287 #undef LOOKUP
12288
12289 static unsigned char *
12290 display_arm_attribute (unsigned char * p,
12291                        const unsigned char * const end)
12292 {
12293   unsigned int tag;
12294   unsigned int len;
12295   unsigned int val;
12296   arm_attr_public_tag * attr;
12297   unsigned i;
12298   unsigned int type;
12299
12300   tag = read_uleb128 (p, &len, end);
12301   p += len;
12302   attr = NULL;
12303   for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
12304     {
12305       if (arm_attr_public_tags[i].tag == tag)
12306         {
12307           attr = &arm_attr_public_tags[i];
12308           break;
12309         }
12310     }
12311
12312   if (attr)
12313     {
12314       printf ("  Tag_%s: ", attr->name);
12315       switch (attr->type)
12316         {
12317         case 0:
12318           switch (tag)
12319             {
12320             case 7: /* Tag_CPU_arch_profile.  */
12321               val = read_uleb128 (p, &len, end);
12322               p += len;
12323               switch (val)
12324                 {
12325                 case 0: printf (_("None\n")); break;
12326                 case 'A': printf (_("Application\n")); break;
12327                 case 'R': printf (_("Realtime\n")); break;
12328                 case 'M': printf (_("Microcontroller\n")); break;
12329                 case 'S': printf (_("Application or Realtime\n")); break;
12330                 default: printf ("??? (%d)\n", val); break;
12331                 }
12332               break;
12333
12334             case 24: /* Tag_align_needed.  */
12335               val = read_uleb128 (p, &len, end);
12336               p += len;
12337               switch (val)
12338                 {
12339                 case 0: printf (_("None\n")); break;
12340                 case 1: printf (_("8-byte\n")); break;
12341                 case 2: printf (_("4-byte\n")); break;
12342                 case 3: printf ("??? 3\n"); break;
12343                 default:
12344                   if (val <= 12)
12345                     printf (_("8-byte and up to %d-byte extended\n"),
12346                             1 << val);
12347                   else
12348                     printf ("??? (%d)\n", val);
12349                   break;
12350                 }
12351               break;
12352
12353             case 25: /* Tag_align_preserved.  */
12354               val = read_uleb128 (p, &len, end);
12355               p += len;
12356               switch (val)
12357                 {
12358                 case 0: printf (_("None\n")); break;
12359                 case 1: printf (_("8-byte, except leaf SP\n")); break;
12360                 case 2: printf (_("8-byte\n")); break;
12361                 case 3: printf ("??? 3\n"); break;
12362                 default:
12363                   if (val <= 12)
12364                     printf (_("8-byte and up to %d-byte extended\n"),
12365                             1 << val);
12366                   else
12367                     printf ("??? (%d)\n", val);
12368                   break;
12369                 }
12370               break;
12371
12372             case 32: /* Tag_compatibility.  */
12373               {
12374                 val = read_uleb128 (p, &len, end);
12375                 p += len;
12376                 printf (_("flag = %d, vendor = "), val);
12377                 if (p < end - 1)
12378                   {
12379                     size_t maxlen = (end - p) - 1;
12380
12381                     print_symbol ((int) maxlen, (const char *) p);
12382                     p += strnlen ((char *) p, maxlen) + 1;
12383                   }
12384                 else
12385                   {
12386                     printf (_("<corrupt>"));
12387                     p = (unsigned char *) end;
12388                   }
12389                 putchar ('\n');
12390               }
12391               break;
12392
12393             case 64: /* Tag_nodefaults.  */
12394               /* PR 17531: file: 001-505008-0.01.  */
12395               if (p < end)
12396                 p++;
12397               printf (_("True\n"));
12398               break;
12399
12400             case 65: /* Tag_also_compatible_with.  */
12401               val = read_uleb128 (p, &len, end);
12402               p += len;
12403               if (val == 6 /* Tag_CPU_arch.  */)
12404                 {
12405                   val = read_uleb128 (p, &len, end);
12406                   p += len;
12407                   if ((unsigned int) val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
12408                     printf ("??? (%d)\n", val);
12409                   else
12410                     printf ("%s\n", arm_attr_tag_CPU_arch[val]);
12411                 }
12412               else
12413                 printf ("???\n");
12414               while (p < end && *(p++) != '\0' /* NUL terminator.  */)
12415                 ;
12416               break;
12417
12418             default:
12419               printf (_("<unknown: %d>\n"), tag);
12420               break;
12421             }
12422           return p;
12423
12424         case 1:
12425           return display_tag_value (-1, p, end);
12426         case 2:
12427           return display_tag_value (0, p, end);
12428
12429         default:
12430           assert (attr->type & 0x80);
12431           val = read_uleb128 (p, &len, end);
12432           p += len;
12433           type = attr->type & 0x7f;
12434           if (val >= type)
12435             printf ("??? (%d)\n", val);
12436           else
12437             printf ("%s\n", attr->table[val]);
12438           return p;
12439         }
12440     }
12441
12442   return display_tag_value (tag, p, end);
12443 }
12444
12445 static unsigned char *
12446 display_gnu_attribute (unsigned char * p,
12447                        unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const),
12448                        const unsigned char * const end)
12449 {
12450   int tag;
12451   unsigned int len;
12452   int val;
12453
12454   tag = read_uleb128 (p, &len, end);
12455   p += len;
12456
12457   /* Tag_compatibility is the only generic GNU attribute defined at
12458      present.  */
12459   if (tag == 32)
12460     {
12461       val = read_uleb128 (p, &len, end);
12462       p += len;
12463
12464       printf (_("flag = %d, vendor = "), val);
12465       if (p == end)
12466         {
12467           printf (_("<corrupt>\n"));
12468           warn (_("corrupt vendor attribute\n"));
12469         }
12470       else
12471         {
12472           if (p < end - 1)
12473             {
12474               size_t maxlen = (end - p) - 1;
12475
12476               print_symbol ((int) maxlen, (const char *) p);
12477               p += strnlen ((char *) p, maxlen) + 1;
12478             }
12479           else
12480             {
12481               printf (_("<corrupt>"));
12482               p = (unsigned char *) end;
12483             }
12484           putchar ('\n');
12485         }
12486       return p;
12487     }
12488
12489   if ((tag & 2) == 0 && display_proc_gnu_attribute)
12490     return display_proc_gnu_attribute (p, tag, end);
12491
12492   return display_tag_value (tag, p, end);
12493 }
12494
12495 static unsigned char *
12496 display_power_gnu_attribute (unsigned char * p,
12497                              int tag,
12498                              const unsigned char * const end)
12499 {
12500   unsigned int len;
12501   int val;
12502
12503   if (tag == Tag_GNU_Power_ABI_FP)
12504     {
12505       val = read_uleb128 (p, &len, end);
12506       p += len;
12507       printf ("  Tag_GNU_Power_ABI_FP: ");
12508
12509       switch (val)
12510         {
12511         case 0:
12512           printf (_("Hard or soft float\n"));
12513           break;
12514         case 1:
12515           printf (_("Hard float\n"));
12516           break;
12517         case 2:
12518           printf (_("Soft float\n"));
12519           break;
12520         case 3:
12521           printf (_("Single-precision hard float\n"));
12522           break;
12523         default:
12524           printf ("??? (%d)\n", val);
12525           break;
12526         }
12527       return p;
12528    }
12529
12530   if (tag == Tag_GNU_Power_ABI_Vector)
12531     {
12532       val = read_uleb128 (p, &len, end);
12533       p += len;
12534       printf ("  Tag_GNU_Power_ABI_Vector: ");
12535       switch (val)
12536         {
12537         case 0:
12538           printf (_("Any\n"));
12539           break;
12540         case 1:
12541           printf (_("Generic\n"));
12542           break;
12543         case 2:
12544           printf ("AltiVec\n");
12545           break;
12546         case 3:
12547           printf ("SPE\n");
12548           break;
12549         default:
12550           printf ("??? (%d)\n", val);
12551           break;
12552         }
12553       return p;
12554    }
12555
12556   if (tag == Tag_GNU_Power_ABI_Struct_Return)
12557     {
12558       if (p == end)
12559         {
12560           warn (_("corrupt Tag_GNU_Power_ABI_Struct_Return\n"));
12561           return p;
12562         }
12563
12564       val = read_uleb128 (p, &len, end);
12565       p += len;
12566       printf ("  Tag_GNU_Power_ABI_Struct_Return: ");
12567       switch (val)
12568        {
12569        case 0:
12570          printf (_("Any\n"));
12571          break;
12572        case 1:
12573          printf ("r3/r4\n");
12574          break;
12575        case 2:
12576          printf (_("Memory\n"));
12577          break;
12578        default:
12579          printf ("??? (%d)\n", val);
12580          break;
12581        }
12582       return p;
12583     }
12584
12585   return display_tag_value (tag & 1, p, end);
12586 }
12587
12588 static void
12589 display_sparc_hwcaps (int mask)
12590 {
12591   if (mask)
12592     {
12593       int first = 1;
12594
12595       if (mask & ELF_SPARC_HWCAP_MUL32)
12596         fputs ("mul32", stdout), first = 0;
12597       if (mask & ELF_SPARC_HWCAP_DIV32)
12598         printf ("%sdiv32", first ? "" : "|"), first = 0;
12599       if (mask & ELF_SPARC_HWCAP_FSMULD)
12600         printf ("%sfsmuld", first ? "" : "|"), first = 0;
12601       if (mask & ELF_SPARC_HWCAP_V8PLUS)
12602         printf ("%sv8plus", first ? "" : "|"), first = 0;
12603       if (mask & ELF_SPARC_HWCAP_POPC)
12604         printf ("%spopc", first ? "" : "|"), first = 0;
12605       if (mask & ELF_SPARC_HWCAP_VIS)
12606         printf ("%svis", first ? "" : "|"), first = 0;
12607       if (mask & ELF_SPARC_HWCAP_VIS2)
12608         printf ("%svis2", first ? "" : "|"), first = 0;
12609       if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
12610         printf ("%sASIBlkInit", first ? "" : "|"), first = 0;
12611       if (mask & ELF_SPARC_HWCAP_FMAF)
12612         printf ("%sfmaf", first ? "" : "|"), first = 0;
12613       if (mask & ELF_SPARC_HWCAP_VIS3)
12614         printf ("%svis3", first ? "" : "|"), first = 0;
12615       if (mask & ELF_SPARC_HWCAP_HPC)
12616         printf ("%shpc", first ? "" : "|"), first = 0;
12617       if (mask & ELF_SPARC_HWCAP_RANDOM)
12618         printf ("%srandom", first ? "" : "|"), first = 0;
12619       if (mask & ELF_SPARC_HWCAP_TRANS)
12620         printf ("%strans", first ? "" : "|"), first = 0;
12621       if (mask & ELF_SPARC_HWCAP_FJFMAU)
12622         printf ("%sfjfmau", first ? "" : "|"), first = 0;
12623       if (mask & ELF_SPARC_HWCAP_IMA)
12624         printf ("%sima", first ? "" : "|"), first = 0;
12625       if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
12626         printf ("%scspare", first ? "" : "|"), first = 0;
12627     }
12628   else
12629     fputc ('0', stdout);
12630   fputc ('\n', stdout);
12631 }
12632
12633 static void
12634 display_sparc_hwcaps2 (int mask)
12635 {
12636   if (mask)
12637     {
12638       int first = 1;
12639
12640       if (mask & ELF_SPARC_HWCAP2_FJATHPLUS)
12641         fputs ("fjathplus", stdout), first = 0;
12642       if (mask & ELF_SPARC_HWCAP2_VIS3B)
12643         printf ("%svis3b", first ? "" : "|"), first = 0;
12644       if (mask & ELF_SPARC_HWCAP2_ADP)
12645         printf ("%sadp", first ? "" : "|"), first = 0;
12646       if (mask & ELF_SPARC_HWCAP2_SPARC5)
12647         printf ("%ssparc5", first ? "" : "|"), first = 0;
12648       if (mask & ELF_SPARC_HWCAP2_MWAIT)
12649         printf ("%smwait", first ? "" : "|"), first = 0;
12650       if (mask & ELF_SPARC_HWCAP2_XMPMUL)
12651         printf ("%sxmpmul", first ? "" : "|"), first = 0;
12652       if (mask & ELF_SPARC_HWCAP2_XMONT)
12653         printf ("%sxmont2", first ? "" : "|"), first = 0;
12654       if (mask & ELF_SPARC_HWCAP2_NSEC)
12655         printf ("%snsec", first ? "" : "|"), first = 0;
12656       if (mask & ELF_SPARC_HWCAP2_FJATHHPC)
12657         printf ("%sfjathhpc", first ? "" : "|"), first = 0;
12658       if (mask & ELF_SPARC_HWCAP2_FJDES)
12659         printf ("%sfjdes", first ? "" : "|"), first = 0;
12660       if (mask & ELF_SPARC_HWCAP2_FJAES)
12661         printf ("%sfjaes", first ? "" : "|"), first = 0;
12662     }
12663   else
12664     fputc ('0', stdout);
12665   fputc ('\n', stdout);
12666 }
12667
12668 static unsigned char *
12669 display_sparc_gnu_attribute (unsigned char * p,
12670                              int tag,
12671                              const unsigned char * const end)
12672 {
12673   unsigned int len;
12674   int val;
12675
12676   if (tag == Tag_GNU_Sparc_HWCAPS)
12677     {
12678       val = read_uleb128 (p, &len, end);
12679       p += len;
12680       printf ("  Tag_GNU_Sparc_HWCAPS: ");
12681       display_sparc_hwcaps (val);
12682       return p;
12683     }
12684   if (tag == Tag_GNU_Sparc_HWCAPS2)
12685     {
12686       val = read_uleb128 (p, &len, end);
12687       p += len;
12688       printf ("  Tag_GNU_Sparc_HWCAPS2: ");
12689       display_sparc_hwcaps2 (val);
12690       return p;
12691     }
12692
12693   return display_tag_value (tag, p, end);
12694 }
12695
12696 static void
12697 print_mips_fp_abi_value (int val)
12698 {
12699   switch (val)
12700     {
12701     case Val_GNU_MIPS_ABI_FP_ANY:
12702       printf (_("Hard or soft float\n"));
12703       break;
12704     case Val_GNU_MIPS_ABI_FP_DOUBLE:
12705       printf (_("Hard float (double precision)\n"));
12706       break;
12707     case Val_GNU_MIPS_ABI_FP_SINGLE:
12708       printf (_("Hard float (single precision)\n"));
12709       break;
12710     case Val_GNU_MIPS_ABI_FP_SOFT:
12711       printf (_("Soft float\n"));
12712       break;
12713     case Val_GNU_MIPS_ABI_FP_OLD_64:
12714       printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
12715       break;
12716     case Val_GNU_MIPS_ABI_FP_XX:
12717       printf (_("Hard float (32-bit CPU, Any FPU)\n"));
12718       break;
12719     case Val_GNU_MIPS_ABI_FP_64:
12720       printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
12721       break;
12722     case Val_GNU_MIPS_ABI_FP_64A:
12723       printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
12724       break;
12725     default:
12726       printf ("??? (%d)\n", val);
12727       break;
12728     }
12729 }
12730
12731 static unsigned char *
12732 display_mips_gnu_attribute (unsigned char * p,
12733                             int tag,
12734                             const unsigned char * const end)
12735 {
12736   if (tag == Tag_GNU_MIPS_ABI_FP)
12737     {
12738       unsigned int len;
12739       int val;
12740
12741       val = read_uleb128 (p, &len, end);
12742       p += len;
12743       printf ("  Tag_GNU_MIPS_ABI_FP: ");
12744
12745       print_mips_fp_abi_value (val);
12746
12747       return p;
12748    }
12749
12750   if (tag == Tag_GNU_MIPS_ABI_MSA)
12751     {
12752       unsigned int len;
12753       int val;
12754
12755       val = read_uleb128 (p, &len, end);
12756       p += len;
12757       printf ("  Tag_GNU_MIPS_ABI_MSA: ");
12758
12759       switch (val)
12760         {
12761         case Val_GNU_MIPS_ABI_MSA_ANY:
12762           printf (_("Any MSA or not\n"));
12763           break;
12764         case Val_GNU_MIPS_ABI_MSA_128:
12765           printf (_("128-bit MSA\n"));
12766           break;
12767         default:
12768           printf ("??? (%d)\n", val);
12769           break;
12770         }
12771       return p;
12772     }
12773
12774   return display_tag_value (tag & 1, p, end);
12775 }
12776
12777 static unsigned char *
12778 display_tic6x_attribute (unsigned char * p,
12779                          const unsigned char * const end)
12780 {
12781   int tag;
12782   unsigned int len;
12783   int val;
12784
12785   tag = read_uleb128 (p, &len, end);
12786   p += len;
12787
12788   switch (tag)
12789     {
12790     case Tag_ISA:
12791       val = read_uleb128 (p, &len, end);
12792       p += len;
12793       printf ("  Tag_ISA: ");
12794
12795       switch (val)
12796         {
12797         case C6XABI_Tag_ISA_none:
12798           printf (_("None\n"));
12799           break;
12800         case C6XABI_Tag_ISA_C62X:
12801           printf ("C62x\n");
12802           break;
12803         case C6XABI_Tag_ISA_C67X:
12804           printf ("C67x\n");
12805           break;
12806         case C6XABI_Tag_ISA_C67XP:
12807           printf ("C67x+\n");
12808           break;
12809         case C6XABI_Tag_ISA_C64X:
12810           printf ("C64x\n");
12811           break;
12812         case C6XABI_Tag_ISA_C64XP:
12813           printf ("C64x+\n");
12814           break;
12815         case C6XABI_Tag_ISA_C674X:
12816           printf ("C674x\n");
12817           break;
12818         default:
12819           printf ("??? (%d)\n", val);
12820           break;
12821         }
12822       return p;
12823
12824     case Tag_ABI_wchar_t:
12825       val = read_uleb128 (p, &len, end);
12826       p += len;
12827       printf ("  Tag_ABI_wchar_t: ");
12828       switch (val)
12829         {
12830         case 0:
12831           printf (_("Not used\n"));
12832           break;
12833         case 1:
12834           printf (_("2 bytes\n"));
12835           break;
12836         case 2:
12837           printf (_("4 bytes\n"));
12838           break;
12839         default:
12840           printf ("??? (%d)\n", val);
12841           break;
12842         }
12843       return p;
12844
12845     case Tag_ABI_stack_align_needed:
12846       val = read_uleb128 (p, &len, end);
12847       p += len;
12848       printf ("  Tag_ABI_stack_align_needed: ");
12849       switch (val)
12850         {
12851         case 0:
12852           printf (_("8-byte\n"));
12853           break;
12854         case 1:
12855           printf (_("16-byte\n"));
12856           break;
12857         default:
12858           printf ("??? (%d)\n", val);
12859           break;
12860         }
12861       return p;
12862
12863     case Tag_ABI_stack_align_preserved:
12864       val = read_uleb128 (p, &len, end);
12865       p += len;
12866       printf ("  Tag_ABI_stack_align_preserved: ");
12867       switch (val)
12868         {
12869         case 0:
12870           printf (_("8-byte\n"));
12871           break;
12872         case 1:
12873           printf (_("16-byte\n"));
12874           break;
12875         default:
12876           printf ("??? (%d)\n", val);
12877           break;
12878         }
12879       return p;
12880
12881     case Tag_ABI_DSBT:
12882       val = read_uleb128 (p, &len, end);
12883       p += len;
12884       printf ("  Tag_ABI_DSBT: ");
12885       switch (val)
12886         {
12887         case 0:
12888           printf (_("DSBT addressing not used\n"));
12889           break;
12890         case 1:
12891           printf (_("DSBT addressing used\n"));
12892           break;
12893         default:
12894           printf ("??? (%d)\n", val);
12895           break;
12896         }
12897       return p;
12898
12899     case Tag_ABI_PID:
12900       val = read_uleb128 (p, &len, end);
12901       p += len;
12902       printf ("  Tag_ABI_PID: ");
12903       switch (val)
12904         {
12905         case 0:
12906           printf (_("Data addressing position-dependent\n"));
12907           break;
12908         case 1:
12909           printf (_("Data addressing position-independent, GOT near DP\n"));
12910           break;
12911         case 2:
12912           printf (_("Data addressing position-independent, GOT far from DP\n"));
12913           break;
12914         default:
12915           printf ("??? (%d)\n", val);
12916           break;
12917         }
12918       return p;
12919
12920     case Tag_ABI_PIC:
12921       val = read_uleb128 (p, &len, end);
12922       p += len;
12923       printf ("  Tag_ABI_PIC: ");
12924       switch (val)
12925         {
12926         case 0:
12927           printf (_("Code addressing position-dependent\n"));
12928           break;
12929         case 1:
12930           printf (_("Code addressing position-independent\n"));
12931           break;
12932         default:
12933           printf ("??? (%d)\n", val);
12934           break;
12935         }
12936       return p;
12937
12938     case Tag_ABI_array_object_alignment:
12939       val = read_uleb128 (p, &len, end);
12940       p += len;
12941       printf ("  Tag_ABI_array_object_alignment: ");
12942       switch (val)
12943         {
12944         case 0:
12945           printf (_("8-byte\n"));
12946           break;
12947         case 1:
12948           printf (_("4-byte\n"));
12949           break;
12950         case 2:
12951           printf (_("16-byte\n"));
12952           break;
12953         default:
12954           printf ("??? (%d)\n", val);
12955           break;
12956         }
12957       return p;
12958
12959     case Tag_ABI_array_object_align_expected:
12960       val = read_uleb128 (p, &len, end);
12961       p += len;
12962       printf ("  Tag_ABI_array_object_align_expected: ");
12963       switch (val)
12964         {
12965         case 0:
12966           printf (_("8-byte\n"));
12967           break;
12968         case 1:
12969           printf (_("4-byte\n"));
12970           break;
12971         case 2:
12972           printf (_("16-byte\n"));
12973           break;
12974         default:
12975           printf ("??? (%d)\n", val);
12976           break;
12977         }
12978       return p;
12979
12980     case Tag_ABI_compatibility:
12981       {
12982         val = read_uleb128 (p, &len, end);
12983         p += len;
12984         printf ("  Tag_ABI_compatibility: ");
12985         printf (_("flag = %d, vendor = "), val);
12986         if (p < end - 1)
12987           {
12988             size_t maxlen = (end - p) - 1;
12989
12990             print_symbol ((int) maxlen, (const char *) p);
12991             p += strnlen ((char *) p, maxlen) + 1;
12992           }
12993         else
12994           {
12995             printf (_("<corrupt>"));
12996             p = (unsigned char *) end;
12997           }
12998         putchar ('\n');
12999         return p;
13000       }
13001
13002     case Tag_ABI_conformance:
13003       {
13004         printf ("  Tag_ABI_conformance: \"");
13005         if (p < end - 1)
13006           {
13007             size_t maxlen = (end - p) - 1;
13008
13009             print_symbol ((int) maxlen, (const char *) p);
13010             p += strnlen ((char *) p, maxlen) + 1;
13011           }
13012         else
13013           {
13014             printf (_("<corrupt>"));
13015             p = (unsigned char *) end;
13016           }
13017         printf ("\"\n");
13018         return p;
13019       }
13020     }
13021
13022   return display_tag_value (tag, p, end);
13023 }
13024
13025 static void
13026 display_raw_attribute (unsigned char * p, unsigned char * end)
13027 {
13028   unsigned long addr = 0;
13029   size_t bytes = end - p;
13030
13031   assert (end > p);
13032   while (bytes)
13033     {
13034       int j;
13035       int k;
13036       int lbytes = (bytes > 16 ? 16 : bytes);
13037
13038       printf ("  0x%8.8lx ", addr);
13039
13040       for (j = 0; j < 16; j++)
13041         {
13042           if (j < lbytes)
13043             printf ("%2.2x", p[j]);
13044           else
13045             printf ("  ");
13046
13047           if ((j & 3) == 3)
13048             printf (" ");
13049         }
13050
13051       for (j = 0; j < lbytes; j++)
13052         {
13053           k = p[j];
13054           if (k >= ' ' && k < 0x7f)
13055             printf ("%c", k);
13056           else
13057             printf (".");
13058         }
13059
13060       putchar ('\n');
13061
13062       p  += lbytes;
13063       bytes -= lbytes;
13064       addr += lbytes;
13065     }
13066
13067   putchar ('\n');
13068 }
13069
13070 static unsigned char *
13071 display_msp430x_attribute (unsigned char * p,
13072                            const unsigned char * const end)
13073 {
13074   unsigned int len;
13075   int val;
13076   int tag;
13077
13078   tag = read_uleb128 (p, & len, end);
13079   p += len;
13080
13081   switch (tag)
13082     {
13083     case OFBA_MSPABI_Tag_ISA:
13084       val = read_uleb128 (p, &len, end);
13085       p += len;
13086       printf ("  Tag_ISA: ");
13087       switch (val)
13088         {
13089         case 0: printf (_("None\n")); break;
13090         case 1: printf (_("MSP430\n")); break;
13091         case 2: printf (_("MSP430X\n")); break;
13092         default: printf ("??? (%d)\n", val); break;
13093         }
13094       break;
13095
13096     case OFBA_MSPABI_Tag_Code_Model:
13097       val = read_uleb128 (p, &len, end);
13098       p += len;
13099       printf ("  Tag_Code_Model: ");
13100       switch (val)
13101         {
13102         case 0: printf (_("None\n")); break;
13103         case 1: printf (_("Small\n")); break;
13104         case 2: printf (_("Large\n")); break;
13105         default: printf ("??? (%d)\n", val); break;
13106         }
13107       break;
13108
13109     case OFBA_MSPABI_Tag_Data_Model:
13110       val = read_uleb128 (p, &len, end);
13111       p += len;
13112       printf ("  Tag_Data_Model: ");
13113       switch (val)
13114         {
13115         case 0: printf (_("None\n")); break;
13116         case 1: printf (_("Small\n")); break;
13117         case 2: printf (_("Large\n")); break;
13118         case 3: printf (_("Restricted Large\n")); break;
13119         default: printf ("??? (%d)\n", val); break;
13120         }
13121       break;
13122
13123     default:
13124       printf (_("  <unknown tag %d>: "), tag);
13125
13126       if (tag & 1)
13127         {
13128           putchar ('"');
13129           if (p < end - 1)
13130             {
13131               size_t maxlen = (end - p) - 1;
13132
13133               print_symbol ((int) maxlen, (const char *) p);
13134               p += strnlen ((char *) p, maxlen) + 1;
13135             }
13136           else
13137             {
13138               printf (_("<corrupt>"));
13139               p = (unsigned char *) end;
13140             }
13141           printf ("\"\n");
13142         }
13143       else
13144         {
13145           val = read_uleb128 (p, &len, end);
13146           p += len;
13147           printf ("%d (0x%x)\n", val, val);
13148         }
13149       break;
13150    }
13151
13152   assert (p <= end);
13153   return p;
13154 }
13155
13156 static int
13157 process_attributes (FILE * file,
13158                     const char * public_name,
13159                     unsigned int proc_type,
13160                     unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
13161                     unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const))
13162 {
13163   Elf_Internal_Shdr * sect;
13164   unsigned i;
13165
13166   /* Find the section header so that we get the size.  */
13167   for (i = 0, sect = section_headers;
13168        i < elf_header.e_shnum;
13169        i++, sect++)
13170     {
13171       unsigned char * contents;
13172       unsigned char * p;
13173
13174       if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
13175         continue;
13176
13177       contents = (unsigned char *) get_data (NULL, file, sect->sh_offset, 1,
13178                                              sect->sh_size, _("attributes"));
13179       if (contents == NULL)
13180         continue;
13181
13182       p = contents;
13183       if (*p == 'A')
13184         {
13185           bfd_vma section_len;
13186
13187           section_len = sect->sh_size - 1;
13188           p++;
13189
13190           while (section_len > 0)
13191             {
13192               bfd_vma attr_len;
13193               unsigned int namelen;
13194               bfd_boolean public_section;
13195               bfd_boolean gnu_section;
13196
13197               if (section_len <= 4)
13198                 {
13199                   error (_("Tag section ends prematurely\n"));
13200                   break;
13201                 }
13202               attr_len = byte_get (p, 4);
13203               p += 4;
13204
13205               if (attr_len > section_len)
13206                 {
13207                   error (_("Bad attribute length (%u > %u)\n"),
13208                           (unsigned) attr_len, (unsigned) section_len);
13209                   attr_len = section_len;
13210                 }
13211               /* PR 17531: file: 001-101425-0.004  */
13212               else if (attr_len < 5)
13213                 {
13214                   error (_("Attribute length of %u is too small\n"), (unsigned) attr_len);
13215                   break;
13216                 }
13217
13218               section_len -= attr_len;
13219               attr_len -= 4;
13220
13221               namelen = strnlen ((char *) p, attr_len) + 1;
13222               if (namelen == 0 || namelen >= attr_len)
13223                 {
13224                   error (_("Corrupt attribute section name\n"));
13225                   break;
13226                 }
13227
13228               printf (_("Attribute Section: "));
13229               print_symbol (INT_MAX, (const char *) p);
13230               putchar ('\n');
13231
13232               if (public_name && streq ((char *) p, public_name))
13233                 public_section = TRUE;
13234               else
13235                 public_section = FALSE;
13236
13237               if (streq ((char *) p, "gnu"))
13238                 gnu_section = TRUE;
13239               else
13240                 gnu_section = FALSE;
13241
13242               p += namelen;
13243               attr_len -= namelen;
13244
13245               while (attr_len > 0 && p < contents + sect->sh_size)
13246                 {
13247                   int tag;
13248                   int val;
13249                   bfd_vma size;
13250                   unsigned char * end;
13251
13252                   /* PR binutils/17531: Safe handling of corrupt files.  */
13253                   if (attr_len < 6)
13254                     {
13255                       error (_("Unused bytes at end of section\n"));
13256                       section_len = 0;
13257                       break;
13258                     }
13259
13260                   tag = *(p++);
13261                   size = byte_get (p, 4);
13262                   if (size > attr_len)
13263                     {
13264                       error (_("Bad subsection length (%u > %u)\n"),
13265                               (unsigned) size, (unsigned) attr_len);
13266                       size = attr_len;
13267                     }
13268                   /* PR binutils/17531: Safe handling of corrupt files.  */
13269                   if (size < 6)
13270                     {
13271                       error (_("Bad subsection length (%u < 6)\n"),
13272                               (unsigned) size);
13273                       section_len = 0;
13274                       break;
13275                     }
13276
13277                   attr_len -= size;
13278                   end = p + size - 1;
13279                   assert (end <= contents + sect->sh_size);
13280                   p += 4;
13281
13282                   switch (tag)
13283                     {
13284                     case 1:
13285                       printf (_("File Attributes\n"));
13286                       break;
13287                     case 2:
13288                       printf (_("Section Attributes:"));
13289                       goto do_numlist;
13290                     case 3:
13291                       printf (_("Symbol Attributes:"));
13292                     do_numlist:
13293                       for (;;)
13294                         {
13295                           unsigned int j;
13296
13297                           val = read_uleb128 (p, &j, end);
13298                           p += j;
13299                           if (val == 0)
13300                             break;
13301                           printf (" %d", val);
13302                         }
13303                       printf ("\n");
13304                       break;
13305                     default:
13306                       printf (_("Unknown tag: %d\n"), tag);
13307                       public_section = FALSE;
13308                       break;
13309                     }
13310
13311                   if (public_section && display_pub_attribute != NULL)
13312                     {
13313                       while (p < end)
13314                         p = display_pub_attribute (p, end);
13315                       assert (p <= end);
13316                     }
13317                   else if (gnu_section && display_proc_gnu_attribute != NULL)
13318                     {
13319                       while (p < end)
13320                         p = display_gnu_attribute (p,
13321                                                    display_proc_gnu_attribute,
13322                                                    end);
13323                       assert (p <= end);
13324                     }
13325                   else if (p < end)
13326                     {
13327                       printf (_("  Unknown attribute:\n"));
13328                       display_raw_attribute (p, end);
13329                       p = end;
13330                     }
13331                   else
13332                     attr_len = 0;
13333                 }
13334             }
13335         }
13336       else
13337         printf (_("Unknown format '%c' (%d)\n"), *p, *p);
13338
13339       free (contents);
13340     }
13341   return 1;
13342 }
13343
13344 static int
13345 process_arm_specific (FILE * file)
13346 {
13347   return process_attributes (file, "aeabi", SHT_ARM_ATTRIBUTES,
13348                              display_arm_attribute, NULL);
13349 }
13350
13351 static int
13352 process_power_specific (FILE * file)
13353 {
13354   return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
13355                              display_power_gnu_attribute);
13356 }
13357
13358 static int
13359 process_sparc_specific (FILE * file)
13360 {
13361   return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
13362                              display_sparc_gnu_attribute);
13363 }
13364
13365 static int
13366 process_tic6x_specific (FILE * file)
13367 {
13368   return process_attributes (file, "c6xabi", SHT_C6000_ATTRIBUTES,
13369                              display_tic6x_attribute, NULL);
13370 }
13371
13372 static int
13373 process_msp430x_specific (FILE * file)
13374 {
13375   return process_attributes (file, "mspabi", SHT_MSP430_ATTRIBUTES,
13376                              display_msp430x_attribute, NULL);
13377 }
13378
13379 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
13380    Print the Address, Access and Initial fields of an entry at VMA ADDR
13381    and return the VMA of the next entry.  */
13382
13383 static bfd_vma
13384 print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
13385 {
13386   printf ("  ");
13387   print_vma (addr, LONG_HEX);
13388   printf (" ");
13389   if (addr < pltgot + 0xfff0)
13390     printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
13391   else
13392     printf ("%10s", "");
13393   printf (" ");
13394   if (data == NULL)
13395     printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
13396   else
13397     {
13398       bfd_vma entry;
13399
13400       entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
13401       print_vma (entry, LONG_HEX);
13402     }
13403   return addr + (is_32bit_elf ? 4 : 8);
13404 }
13405
13406 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
13407    PLTGOT.  Print the Address and Initial fields of an entry at VMA
13408    ADDR and return the VMA of the next entry.  */
13409
13410 static bfd_vma
13411 print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
13412 {
13413   printf ("  ");
13414   print_vma (addr, LONG_HEX);
13415   printf (" ");
13416   if (data == NULL)
13417     printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
13418   else
13419     {
13420       bfd_vma entry;
13421
13422       entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
13423       print_vma (entry, LONG_HEX);
13424     }
13425   return addr + (is_32bit_elf ? 4 : 8);
13426 }
13427
13428 static void
13429 print_mips_ases (unsigned int mask)
13430 {
13431   if (mask & AFL_ASE_DSP)
13432     fputs ("\n\tDSP ASE", stdout);
13433   if (mask & AFL_ASE_DSPR2)
13434     fputs ("\n\tDSP R2 ASE", stdout);
13435   if (mask & AFL_ASE_EVA)
13436     fputs ("\n\tEnhanced VA Scheme", stdout);
13437   if (mask & AFL_ASE_MCU)
13438     fputs ("\n\tMCU (MicroController) ASE", stdout);
13439   if (mask & AFL_ASE_MDMX)
13440     fputs ("\n\tMDMX ASE", stdout);
13441   if (mask & AFL_ASE_MIPS3D)
13442     fputs ("\n\tMIPS-3D ASE", stdout);
13443   if (mask & AFL_ASE_MT)
13444     fputs ("\n\tMT ASE", stdout);
13445   if (mask & AFL_ASE_SMARTMIPS)
13446     fputs ("\n\tSmartMIPS ASE", stdout);
13447   if (mask & AFL_ASE_VIRT)
13448     fputs ("\n\tVZ ASE", stdout);
13449   if (mask & AFL_ASE_MSA)
13450     fputs ("\n\tMSA ASE", stdout);
13451   if (mask & AFL_ASE_MIPS16)
13452     fputs ("\n\tMIPS16 ASE", stdout);
13453   if (mask & AFL_ASE_MICROMIPS)
13454     fputs ("\n\tMICROMIPS ASE", stdout);
13455   if (mask & AFL_ASE_XPA)
13456     fputs ("\n\tXPA ASE", stdout);
13457   if (mask == 0)
13458     fprintf (stdout, "\n\t%s", _("None"));
13459   else if ((mask & ~AFL_ASE_MASK) != 0)
13460     fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
13461 }
13462
13463 static void
13464 print_mips_isa_ext (unsigned int isa_ext)
13465 {
13466   switch (isa_ext)
13467     {
13468     case 0:
13469       fputs (_("None"), stdout);
13470       break;
13471     case AFL_EXT_XLR:
13472       fputs ("RMI XLR", stdout);
13473       break;
13474     case AFL_EXT_OCTEON3:
13475       fputs ("Cavium Networks Octeon3", stdout);
13476       break;
13477     case AFL_EXT_OCTEON2:
13478       fputs ("Cavium Networks Octeon2", stdout);
13479       break;
13480     case AFL_EXT_OCTEONP:
13481       fputs ("Cavium Networks OcteonP", stdout);
13482       break;
13483     case AFL_EXT_LOONGSON_3A:
13484       fputs ("Loongson 3A", stdout);
13485       break;
13486     case AFL_EXT_OCTEON:
13487       fputs ("Cavium Networks Octeon", stdout);
13488       break;
13489     case AFL_EXT_5900:
13490       fputs ("Toshiba R5900", stdout);
13491       break;
13492     case AFL_EXT_4650:
13493       fputs ("MIPS R4650", stdout);
13494       break;
13495     case AFL_EXT_4010:
13496       fputs ("LSI R4010", stdout);
13497       break;
13498     case AFL_EXT_4100:
13499       fputs ("NEC VR4100", stdout);
13500       break;
13501     case AFL_EXT_3900:
13502       fputs ("Toshiba R3900", stdout);
13503       break;
13504     case AFL_EXT_10000:
13505       fputs ("MIPS R10000", stdout);
13506       break;
13507     case AFL_EXT_SB1:
13508       fputs ("Broadcom SB-1", stdout);
13509       break;
13510     case AFL_EXT_4111:
13511       fputs ("NEC VR4111/VR4181", stdout);
13512       break;
13513     case AFL_EXT_4120:
13514       fputs ("NEC VR4120", stdout);
13515       break;
13516     case AFL_EXT_5400:
13517       fputs ("NEC VR5400", stdout);
13518       break;
13519     case AFL_EXT_5500:
13520       fputs ("NEC VR5500", stdout);
13521       break;
13522     case AFL_EXT_LOONGSON_2E:
13523       fputs ("ST Microelectronics Loongson 2E", stdout);
13524       break;
13525     case AFL_EXT_LOONGSON_2F:
13526       fputs ("ST Microelectronics Loongson 2F", stdout);
13527       break;
13528     default:
13529       fprintf (stdout, "%s (%d)", _("Unknown"), isa_ext);
13530     }
13531 }
13532
13533 static int
13534 get_mips_reg_size (int reg_size)
13535 {
13536   return (reg_size == AFL_REG_NONE) ? 0
13537          : (reg_size == AFL_REG_32) ? 32
13538          : (reg_size == AFL_REG_64) ? 64
13539          : (reg_size == AFL_REG_128) ? 128
13540          : -1;
13541 }
13542
13543 static int
13544 process_mips_specific (FILE * file)
13545 {
13546   Elf_Internal_Dyn * entry;
13547   Elf_Internal_Shdr *sect = NULL;
13548   size_t liblist_offset = 0;
13549   size_t liblistno = 0;
13550   size_t conflictsno = 0;
13551   size_t options_offset = 0;
13552   size_t conflicts_offset = 0;
13553   size_t pltrelsz = 0;
13554   size_t pltrel = 0;
13555   bfd_vma pltgot = 0;
13556   bfd_vma mips_pltgot = 0;
13557   bfd_vma jmprel = 0;
13558   bfd_vma local_gotno = 0;
13559   bfd_vma gotsym = 0;
13560   bfd_vma symtabno = 0;
13561
13562   process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
13563                       display_mips_gnu_attribute);
13564
13565   sect = find_section (".MIPS.abiflags");
13566
13567   if (sect != NULL)
13568     {
13569       Elf_External_ABIFlags_v0 *abiflags_ext;
13570       Elf_Internal_ABIFlags_v0 abiflags_in;
13571
13572       if (sizeof (Elf_External_ABIFlags_v0) != sect->sh_size)
13573         fputs ("\nCorrupt ABI Flags section.\n", stdout);
13574       else
13575         {
13576           abiflags_ext = get_data (NULL, file, sect->sh_offset, 1,
13577                                    sect->sh_size, _("MIPS ABI Flags section"));
13578           if (abiflags_ext)
13579             {
13580               abiflags_in.version = BYTE_GET (abiflags_ext->version);
13581               abiflags_in.isa_level = BYTE_GET (abiflags_ext->isa_level);
13582               abiflags_in.isa_rev = BYTE_GET (abiflags_ext->isa_rev);
13583               abiflags_in.gpr_size = BYTE_GET (abiflags_ext->gpr_size);
13584               abiflags_in.cpr1_size = BYTE_GET (abiflags_ext->cpr1_size);
13585               abiflags_in.cpr2_size = BYTE_GET (abiflags_ext->cpr2_size);
13586               abiflags_in.fp_abi = BYTE_GET (abiflags_ext->fp_abi);
13587               abiflags_in.isa_ext = BYTE_GET (abiflags_ext->isa_ext);
13588               abiflags_in.ases = BYTE_GET (abiflags_ext->ases);
13589               abiflags_in.flags1 = BYTE_GET (abiflags_ext->flags1);
13590               abiflags_in.flags2 = BYTE_GET (abiflags_ext->flags2);
13591
13592               printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in.version);
13593               printf ("\nISA: MIPS%d", abiflags_in.isa_level);
13594               if (abiflags_in.isa_rev > 1)
13595                 printf ("r%d", abiflags_in.isa_rev);
13596               printf ("\nGPR size: %d",
13597                       get_mips_reg_size (abiflags_in.gpr_size));
13598               printf ("\nCPR1 size: %d",
13599                       get_mips_reg_size (abiflags_in.cpr1_size));
13600               printf ("\nCPR2 size: %d",
13601                       get_mips_reg_size (abiflags_in.cpr2_size));
13602               fputs ("\nFP ABI: ", stdout);
13603               print_mips_fp_abi_value (abiflags_in.fp_abi);
13604               fputs ("ISA Extension: ", stdout);
13605               print_mips_isa_ext (abiflags_in.isa_ext);
13606               fputs ("\nASEs:", stdout);
13607               print_mips_ases (abiflags_in.ases);
13608               printf ("\nFLAGS 1: %8.8lx", abiflags_in.flags1);
13609               printf ("\nFLAGS 2: %8.8lx", abiflags_in.flags2);
13610               fputc ('\n', stdout);
13611               free (abiflags_ext);
13612             }
13613         }
13614     }
13615
13616   /* We have a lot of special sections.  Thanks SGI!  */
13617   if (dynamic_section == NULL)
13618     /* No information available.  */
13619     return 0;
13620
13621   for (entry = dynamic_section;
13622        /* PR 17531 file: 012-50589-0.004.  */
13623        entry < dynamic_section + dynamic_nent && entry->d_tag != DT_NULL;
13624        ++entry)
13625     switch (entry->d_tag)
13626       {
13627       case DT_MIPS_LIBLIST:
13628         liblist_offset
13629           = offset_from_vma (file, entry->d_un.d_val,
13630                              liblistno * sizeof (Elf32_External_Lib));
13631         break;
13632       case DT_MIPS_LIBLISTNO:
13633         liblistno = entry->d_un.d_val;
13634         break;
13635       case DT_MIPS_OPTIONS:
13636         options_offset = offset_from_vma (file, entry->d_un.d_val, 0);
13637         break;
13638       case DT_MIPS_CONFLICT:
13639         conflicts_offset
13640           = offset_from_vma (file, entry->d_un.d_val,
13641                              conflictsno * sizeof (Elf32_External_Conflict));
13642         break;
13643       case DT_MIPS_CONFLICTNO:
13644         conflictsno = entry->d_un.d_val;
13645         break;
13646       case DT_PLTGOT:
13647         pltgot = entry->d_un.d_ptr;
13648         break;
13649       case DT_MIPS_LOCAL_GOTNO:
13650         local_gotno = entry->d_un.d_val;
13651         break;
13652       case DT_MIPS_GOTSYM:
13653         gotsym = entry->d_un.d_val;
13654         break;
13655       case DT_MIPS_SYMTABNO:
13656         symtabno = entry->d_un.d_val;
13657         break;
13658       case DT_MIPS_PLTGOT:
13659         mips_pltgot = entry->d_un.d_ptr;
13660         break;
13661       case DT_PLTREL:
13662         pltrel = entry->d_un.d_val;
13663         break;
13664       case DT_PLTRELSZ:
13665         pltrelsz = entry->d_un.d_val;
13666         break;
13667       case DT_JMPREL:
13668         jmprel = entry->d_un.d_ptr;
13669         break;
13670       default:
13671         break;
13672       }
13673
13674   if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
13675     {
13676       Elf32_External_Lib * elib;
13677       size_t cnt;
13678
13679       elib = (Elf32_External_Lib *) get_data (NULL, file, liblist_offset,
13680                                               liblistno,
13681                                               sizeof (Elf32_External_Lib),
13682                                               _("liblist section data"));
13683       if (elib)
13684         {
13685           printf (_("\nSection '.liblist' contains %lu entries:\n"),
13686                   (unsigned long) liblistno);
13687           fputs (_("     Library              Time Stamp          Checksum   Version Flags\n"),
13688                  stdout);
13689
13690           for (cnt = 0; cnt < liblistno; ++cnt)
13691             {
13692               Elf32_Lib liblist;
13693               time_t atime;
13694               char timebuf[20];
13695               struct tm * tmp;
13696
13697               liblist.l_name = BYTE_GET (elib[cnt].l_name);
13698               atime = BYTE_GET (elib[cnt].l_time_stamp);
13699               liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
13700               liblist.l_version = BYTE_GET (elib[cnt].l_version);
13701               liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
13702
13703               tmp = gmtime (&atime);
13704               snprintf (timebuf, sizeof (timebuf),
13705                         "%04u-%02u-%02uT%02u:%02u:%02u",
13706                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
13707                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
13708
13709               printf ("%3lu: ", (unsigned long) cnt);
13710               if (VALID_DYNAMIC_NAME (liblist.l_name))
13711                 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
13712               else
13713                 printf (_("<corrupt: %9ld>"), liblist.l_name);
13714               printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
13715                       liblist.l_version);
13716
13717               if (liblist.l_flags == 0)
13718                 puts (_(" NONE"));
13719               else
13720                 {
13721                   static const struct
13722                   {
13723                     const char * name;
13724                     int bit;
13725                   }
13726                   l_flags_vals[] =
13727                   {
13728                     { " EXACT_MATCH", LL_EXACT_MATCH },
13729                     { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
13730                     { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
13731                     { " EXPORTS", LL_EXPORTS },
13732                     { " DELAY_LOAD", LL_DELAY_LOAD },
13733                     { " DELTA", LL_DELTA }
13734                   };
13735                   int flags = liblist.l_flags;
13736                   size_t fcnt;
13737
13738                   for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
13739                     if ((flags & l_flags_vals[fcnt].bit) != 0)
13740                       {
13741                         fputs (l_flags_vals[fcnt].name, stdout);
13742                         flags ^= l_flags_vals[fcnt].bit;
13743                       }
13744                   if (flags != 0)
13745                     printf (" %#x", (unsigned int) flags);
13746
13747                   puts ("");
13748                 }
13749             }
13750
13751           free (elib);
13752         }
13753     }
13754
13755   if (options_offset != 0)
13756     {
13757       Elf_External_Options * eopt;
13758       Elf_Internal_Options * iopt;
13759       Elf_Internal_Options * option;
13760       size_t offset;
13761       int cnt;
13762       sect = section_headers;
13763
13764       /* Find the section header so that we get the size.  */
13765       sect = find_section_by_type (SHT_MIPS_OPTIONS);
13766       /* PR 17533 file: 012-277276-0.004.  */ 
13767       if (sect == NULL)
13768         {
13769           error (_("No MIPS_OPTIONS header found\n"));
13770           return 0;
13771         }
13772
13773       eopt = (Elf_External_Options *) get_data (NULL, file, options_offset, 1,
13774                                                 sect->sh_size, _("options"));
13775       if (eopt)
13776         {
13777           iopt = (Elf_Internal_Options *)
13778               cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
13779           if (iopt == NULL)
13780             {
13781               error (_("Out of memory allocatinf space for MIPS options\n"));
13782               return 0;
13783             }
13784
13785           offset = cnt = 0;
13786           option = iopt;
13787
13788           while (offset < sect->sh_size)
13789             {
13790               Elf_External_Options * eoption;
13791
13792               eoption = (Elf_External_Options *) ((char *) eopt + offset);
13793
13794               option->kind = BYTE_GET (eoption->kind);
13795               option->size = BYTE_GET (eoption->size);
13796               option->section = BYTE_GET (eoption->section);
13797               option->info = BYTE_GET (eoption->info);
13798
13799               offset += option->size;
13800
13801               ++option;
13802               ++cnt;
13803             }
13804
13805           printf (_("\nSection '%s' contains %d entries:\n"),
13806                   printable_section_name (sect), cnt);
13807
13808           option = iopt;
13809
13810           while (cnt-- > 0)
13811             {
13812               size_t len;
13813
13814               switch (option->kind)
13815                 {
13816                 case ODK_NULL:
13817                   /* This shouldn't happen.  */
13818                   printf (" NULL       %d %lx", option->section, option->info);
13819                   break;
13820                 case ODK_REGINFO:
13821                   printf (" REGINFO    ");
13822                   if (elf_header.e_machine == EM_MIPS)
13823                     {
13824                       /* 32bit form.  */
13825                       Elf32_External_RegInfo * ereg;
13826                       Elf32_RegInfo reginfo;
13827
13828                       ereg = (Elf32_External_RegInfo *) (option + 1);
13829                       reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
13830                       reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
13831                       reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
13832                       reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
13833                       reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
13834                       reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
13835
13836                       printf ("GPR %08lx  GP 0x%lx\n",
13837                               reginfo.ri_gprmask,
13838                               (unsigned long) reginfo.ri_gp_value);
13839                       printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
13840                               reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
13841                               reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
13842                     }
13843                   else
13844                     {
13845                       /* 64 bit form.  */
13846                       Elf64_External_RegInfo * ereg;
13847                       Elf64_Internal_RegInfo reginfo;
13848
13849                       ereg = (Elf64_External_RegInfo *) (option + 1);
13850                       reginfo.ri_gprmask    = BYTE_GET (ereg->ri_gprmask);
13851                       reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
13852                       reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
13853                       reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
13854                       reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
13855                       reginfo.ri_gp_value   = BYTE_GET (ereg->ri_gp_value);
13856
13857                       printf ("GPR %08lx  GP 0x",
13858                               reginfo.ri_gprmask);
13859                       printf_vma (reginfo.ri_gp_value);
13860                       printf ("\n");
13861
13862                       printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
13863                               reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
13864                               reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
13865                     }
13866                   ++option;
13867                   continue;
13868                 case ODK_EXCEPTIONS:
13869                   fputs (" EXCEPTIONS fpe_min(", stdout);
13870                   process_mips_fpe_exception (option->info & OEX_FPU_MIN);
13871                   fputs (") fpe_max(", stdout);
13872                   process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
13873                   fputs (")", stdout);
13874
13875                   if (option->info & OEX_PAGE0)
13876                     fputs (" PAGE0", stdout);
13877                   if (option->info & OEX_SMM)
13878                     fputs (" SMM", stdout);
13879                   if (option->info & OEX_FPDBUG)
13880                     fputs (" FPDBUG", stdout);
13881                   if (option->info & OEX_DISMISS)
13882                     fputs (" DISMISS", stdout);
13883                   break;
13884                 case ODK_PAD:
13885                   fputs (" PAD       ", stdout);
13886                   if (option->info & OPAD_PREFIX)
13887                     fputs (" PREFIX", stdout);
13888                   if (option->info & OPAD_POSTFIX)
13889                     fputs (" POSTFIX", stdout);
13890                   if (option->info & OPAD_SYMBOL)
13891                     fputs (" SYMBOL", stdout);
13892                   break;
13893                 case ODK_HWPATCH:
13894                   fputs (" HWPATCH   ", stdout);
13895                   if (option->info & OHW_R4KEOP)
13896                     fputs (" R4KEOP", stdout);
13897                   if (option->info & OHW_R8KPFETCH)
13898                     fputs (" R8KPFETCH", stdout);
13899                   if (option->info & OHW_R5KEOP)
13900                     fputs (" R5KEOP", stdout);
13901                   if (option->info & OHW_R5KCVTL)
13902                     fputs (" R5KCVTL", stdout);
13903                   break;
13904                 case ODK_FILL:
13905                   fputs (" FILL       ", stdout);
13906                   /* XXX Print content of info word?  */
13907                   break;
13908                 case ODK_TAGS:
13909                   fputs (" TAGS       ", stdout);
13910                   /* XXX Print content of info word?  */
13911                   break;
13912                 case ODK_HWAND:
13913                   fputs (" HWAND     ", stdout);
13914                   if (option->info & OHWA0_R4KEOP_CHECKED)
13915                     fputs (" R4KEOP_CHECKED", stdout);
13916                   if (option->info & OHWA0_R4KEOP_CLEAN)
13917                     fputs (" R4KEOP_CLEAN", stdout);
13918                   break;
13919                 case ODK_HWOR:
13920                   fputs (" HWOR      ", stdout);
13921                   if (option->info & OHWA0_R4KEOP_CHECKED)
13922                     fputs (" R4KEOP_CHECKED", stdout);
13923                   if (option->info & OHWA0_R4KEOP_CLEAN)
13924                     fputs (" R4KEOP_CLEAN", stdout);
13925                   break;
13926                 case ODK_GP_GROUP:
13927                   printf (" GP_GROUP  %#06lx  self-contained %#06lx",
13928                           option->info & OGP_GROUP,
13929                           (option->info & OGP_SELF) >> 16);
13930                   break;
13931                 case ODK_IDENT:
13932                   printf (" IDENT     %#06lx  self-contained %#06lx",
13933                           option->info & OGP_GROUP,
13934                           (option->info & OGP_SELF) >> 16);
13935                   break;
13936                 default:
13937                   /* This shouldn't happen.  */
13938                   printf (" %3d ???     %d %lx",
13939                           option->kind, option->section, option->info);
13940                   break;
13941                 }
13942
13943               len = sizeof (* eopt);
13944               while (len < option->size)
13945                 if (((char *) option)[len] >= ' '
13946                     && ((char *) option)[len] < 0x7f)
13947                   printf ("%c", ((char *) option)[len++]);
13948                 else
13949                   printf ("\\%03o", ((char *) option)[len++]);
13950
13951               fputs ("\n", stdout);
13952               ++option;
13953             }
13954
13955           free (eopt);
13956         }
13957     }
13958
13959   if (conflicts_offset != 0 && conflictsno != 0)
13960     {
13961       Elf32_Conflict * iconf;
13962       size_t cnt;
13963
13964       if (dynamic_symbols == NULL)
13965         {
13966           error (_("conflict list found without a dynamic symbol table\n"));
13967           return 0;
13968         }
13969
13970       iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
13971       if (iconf == NULL)
13972         {
13973           error (_("Out of memory allocating space for dynamic conflicts\n"));
13974           return 0;
13975         }
13976
13977       if (is_32bit_elf)
13978         {
13979           Elf32_External_Conflict * econf32;
13980
13981           econf32 = (Elf32_External_Conflict *)
13982               get_data (NULL, file, conflicts_offset, conflictsno,
13983                         sizeof (* econf32), _("conflict"));
13984           if (!econf32)
13985             return 0;
13986
13987           for (cnt = 0; cnt < conflictsno; ++cnt)
13988             iconf[cnt] = BYTE_GET (econf32[cnt]);
13989
13990           free (econf32);
13991         }
13992       else
13993         {
13994           Elf64_External_Conflict * econf64;
13995
13996           econf64 = (Elf64_External_Conflict *)
13997               get_data (NULL, file, conflicts_offset, conflictsno,
13998                         sizeof (* econf64), _("conflict"));
13999           if (!econf64)
14000             return 0;
14001
14002           for (cnt = 0; cnt < conflictsno; ++cnt)
14003             iconf[cnt] = BYTE_GET (econf64[cnt]);
14004
14005           free (econf64);
14006         }
14007
14008       printf (_("\nSection '.conflict' contains %lu entries:\n"),
14009               (unsigned long) conflictsno);
14010       puts (_("  Num:    Index       Value  Name"));
14011
14012       for (cnt = 0; cnt < conflictsno; ++cnt)
14013         {
14014           printf ("%5lu: %8lu  ", (unsigned long) cnt, iconf[cnt]);
14015
14016           if (iconf[cnt] >= num_dynamic_syms)
14017             printf (_("<corrupt symbol index>"));
14018           else
14019             {
14020               Elf_Internal_Sym * psym;
14021
14022               psym = & dynamic_symbols[iconf[cnt]];
14023               print_vma (psym->st_value, FULL_HEX);
14024               putchar (' ');
14025               if (VALID_DYNAMIC_NAME (psym->st_name))
14026                 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
14027               else
14028                 printf (_("<corrupt: %14ld>"), psym->st_name);
14029             }
14030           putchar ('\n');
14031         }
14032
14033       free (iconf);
14034     }
14035
14036   if (pltgot != 0 && local_gotno != 0)
14037     {
14038       bfd_vma ent, local_end, global_end;
14039       size_t i, offset;
14040       unsigned char * data;
14041       int addr_size;
14042
14043       ent = pltgot;
14044       addr_size = (is_32bit_elf ? 4 : 8);
14045       local_end = pltgot + local_gotno * addr_size;
14046
14047       /* PR binutils/17533 file: 012-111227-0.004  */
14048       if (symtabno < gotsym)
14049         {
14050           error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
14051                  (long) gotsym, (long) symtabno);
14052           return 0;
14053         }
14054  
14055       global_end = local_end + (symtabno - gotsym) * addr_size;
14056       assert (global_end >= local_end);
14057       offset = offset_from_vma (file, pltgot, global_end - pltgot);
14058       data = (unsigned char *) get_data (NULL, file, offset,
14059                                          global_end - pltgot, 1,
14060                                          _("Global Offset Table data"));
14061       if (data == NULL)
14062         return 0;
14063
14064       printf (_("\nPrimary GOT:\n"));
14065       printf (_(" Canonical gp value: "));
14066       print_vma (pltgot + 0x7ff0, LONG_HEX);
14067       printf ("\n\n");
14068
14069       printf (_(" Reserved entries:\n"));
14070       printf (_("  %*s %10s %*s Purpose\n"),
14071               addr_size * 2, _("Address"), _("Access"),
14072               addr_size * 2, _("Initial"));
14073       ent = print_mips_got_entry (data, pltgot, ent);
14074       printf (_(" Lazy resolver\n"));
14075       if (data
14076           && (byte_get (data + ent - pltgot, addr_size)
14077               >> (addr_size * 8 - 1)) != 0)
14078         {
14079           ent = print_mips_got_entry (data, pltgot, ent);
14080           printf (_(" Module pointer (GNU extension)\n"));
14081         }
14082       printf ("\n");
14083
14084       if (ent < local_end)
14085         {
14086           printf (_(" Local entries:\n"));
14087           printf ("  %*s %10s %*s\n",
14088                   addr_size * 2, _("Address"), _("Access"),
14089                   addr_size * 2, _("Initial"));
14090           while (ent < local_end)
14091             {
14092               ent = print_mips_got_entry (data, pltgot, ent);
14093               printf ("\n");
14094             }
14095           printf ("\n");
14096         }
14097
14098       if (gotsym < symtabno)
14099         {
14100           int sym_width;
14101
14102           printf (_(" Global entries:\n"));
14103           printf ("  %*s %10s %*s %*s %-7s %3s %s\n",
14104                   addr_size * 2, _("Address"),
14105                   _("Access"),
14106                   addr_size * 2, _("Initial"),
14107                   addr_size * 2, _("Sym.Val."),
14108                   _("Type"),
14109                   /* Note for translators: "Ndx" = abbreviated form of "Index".  */
14110                   _("Ndx"), _("Name"));
14111
14112           sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
14113
14114           for (i = gotsym; i < symtabno; i++)
14115             {
14116               ent = print_mips_got_entry (data, pltgot, ent);
14117               printf (" ");
14118
14119               if (dynamic_symbols == NULL)
14120                 printf (_("<no dynamic symbols>"));
14121               else if (i < num_dynamic_syms)
14122                 {
14123                   Elf_Internal_Sym * psym = dynamic_symbols + i;
14124
14125                   print_vma (psym->st_value, LONG_HEX);
14126                   printf (" %-7s %3s ",
14127                           get_symbol_type (ELF_ST_TYPE (psym->st_info)),
14128                           get_symbol_index_type (psym->st_shndx));
14129
14130                   if (VALID_DYNAMIC_NAME (psym->st_name))
14131                     print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
14132                   else
14133                     printf (_("<corrupt: %14ld>"), psym->st_name);
14134                 }
14135               else
14136                 printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
14137                         (unsigned long) i);
14138
14139               printf ("\n");
14140             }
14141           printf ("\n");
14142         }
14143
14144       if (data)
14145         free (data);
14146     }
14147
14148   if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
14149     {
14150       bfd_vma ent, end;
14151       size_t offset, rel_offset;
14152       unsigned long count, i;
14153       unsigned char * data;
14154       int addr_size, sym_width;
14155       Elf_Internal_Rela * rels;
14156
14157       rel_offset = offset_from_vma (file, jmprel, pltrelsz);
14158       if (pltrel == DT_RELA)
14159         {
14160           if (!slurp_rela_relocs (file, rel_offset, pltrelsz, &rels, &count))
14161             return 0;
14162         }
14163       else
14164         {
14165           if (!slurp_rel_relocs (file, rel_offset, pltrelsz, &rels, &count))
14166             return 0;
14167         }
14168
14169       ent = mips_pltgot;
14170       addr_size = (is_32bit_elf ? 4 : 8);
14171       end = mips_pltgot + (2 + count) * addr_size;
14172
14173       offset = offset_from_vma (file, mips_pltgot, end - mips_pltgot);
14174       data = (unsigned char *) get_data (NULL, file, offset, end - mips_pltgot,
14175                                          1, _("Procedure Linkage Table data"));
14176       if (data == NULL)
14177         return 0;
14178
14179       printf ("\nPLT GOT:\n\n");
14180       printf (_(" Reserved entries:\n"));
14181       printf (_("  %*s %*s Purpose\n"),
14182               addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
14183       ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
14184       printf (_(" PLT lazy resolver\n"));
14185       ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
14186       printf (_(" Module pointer\n"));
14187       printf ("\n");
14188
14189       printf (_(" Entries:\n"));
14190       printf ("  %*s %*s %*s %-7s %3s %s\n",
14191               addr_size * 2, _("Address"),
14192               addr_size * 2, _("Initial"),
14193               addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
14194       sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
14195       for (i = 0; i < count; i++)
14196         {
14197           unsigned long idx = get_reloc_symindex (rels[i].r_info);
14198
14199           ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
14200           printf (" ");
14201
14202           if (idx >= num_dynamic_syms)
14203             printf (_("<corrupt symbol index: %lu>"), idx);
14204           else
14205             {
14206               Elf_Internal_Sym * psym = dynamic_symbols + idx;
14207
14208               print_vma (psym->st_value, LONG_HEX);
14209               printf (" %-7s %3s ",
14210                       get_symbol_type (ELF_ST_TYPE (psym->st_info)),
14211                       get_symbol_index_type (psym->st_shndx));
14212               if (VALID_DYNAMIC_NAME (psym->st_name))
14213                 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
14214               else
14215                 printf (_("<corrupt: %14ld>"), psym->st_name);
14216             }
14217           printf ("\n");
14218         }
14219       printf ("\n");
14220
14221       if (data)
14222         free (data);
14223       free (rels);
14224     }
14225
14226   return 1;
14227 }
14228
14229 static int
14230 process_nds32_specific (FILE * file)
14231 {
14232   Elf_Internal_Shdr *sect = NULL;
14233
14234   sect = find_section (".nds32_e_flags");
14235   if (sect != NULL)
14236     {
14237       unsigned int *flag;
14238
14239       printf ("\nNDS32 elf flags section:\n");
14240       flag = get_data (NULL, file, sect->sh_offset, 1,
14241                        sect->sh_size, _("NDS32 elf flags section"));
14242
14243       switch ((*flag) & 0x3)
14244         {
14245         case 0:
14246           printf ("(VEC_SIZE):\tNo entry.\n");
14247           break;
14248         case 1:
14249           printf ("(VEC_SIZE):\t4 bytes\n");
14250           break;
14251         case 2:
14252           printf ("(VEC_SIZE):\t16 bytes\n");
14253           break;
14254         case 3:
14255           printf ("(VEC_SIZE):\treserved\n");
14256           break;
14257         }
14258     }
14259
14260   return TRUE;
14261 }
14262
14263 static int
14264 process_gnu_liblist (FILE * file)
14265 {
14266   Elf_Internal_Shdr * section;
14267   Elf_Internal_Shdr * string_sec;
14268   Elf32_External_Lib * elib;
14269   char * strtab;
14270   size_t strtab_size;
14271   size_t cnt;
14272   unsigned i;
14273
14274   if (! do_arch)
14275     return 0;
14276
14277   for (i = 0, section = section_headers;
14278        i < elf_header.e_shnum;
14279        i++, section++)
14280     {
14281       switch (section->sh_type)
14282         {
14283         case SHT_GNU_LIBLIST:
14284           if (section->sh_link >= elf_header.e_shnum)
14285             break;
14286
14287           elib = (Elf32_External_Lib *)
14288               get_data (NULL, file, section->sh_offset, 1, section->sh_size,
14289                         _("liblist section data"));
14290
14291           if (elib == NULL)
14292             break;
14293           string_sec = section_headers + section->sh_link;
14294
14295           strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
14296                                       string_sec->sh_size,
14297                                       _("liblist string table"));
14298           if (strtab == NULL
14299               || section->sh_entsize != sizeof (Elf32_External_Lib))
14300             {
14301               free (elib);
14302               free (strtab);
14303               break;
14304             }
14305           strtab_size = string_sec->sh_size;
14306
14307           printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
14308                   printable_section_name (section),
14309                   (unsigned long) (section->sh_size / sizeof (Elf32_External_Lib)));
14310
14311           puts (_("     Library              Time Stamp          Checksum   Version Flags"));
14312
14313           for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
14314                ++cnt)
14315             {
14316               Elf32_Lib liblist;
14317               time_t atime;
14318               char timebuf[20];
14319               struct tm * tmp;
14320
14321               liblist.l_name = BYTE_GET (elib[cnt].l_name);
14322               atime = BYTE_GET (elib[cnt].l_time_stamp);
14323               liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
14324               liblist.l_version = BYTE_GET (elib[cnt].l_version);
14325               liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
14326
14327               tmp = gmtime (&atime);
14328               snprintf (timebuf, sizeof (timebuf),
14329                         "%04u-%02u-%02uT%02u:%02u:%02u",
14330                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
14331                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
14332
14333               printf ("%3lu: ", (unsigned long) cnt);
14334               if (do_wide)
14335                 printf ("%-20s", liblist.l_name < strtab_size
14336                         ? strtab + liblist.l_name : _("<corrupt>"));
14337               else
14338                 printf ("%-20.20s", liblist.l_name < strtab_size
14339                         ? strtab + liblist.l_name : _("<corrupt>"));
14340               printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
14341                       liblist.l_version, liblist.l_flags);
14342             }
14343
14344           free (elib);
14345           free (strtab);
14346         }
14347     }
14348
14349   return 1;
14350 }
14351
14352 static const char *
14353 get_note_type (unsigned e_type)
14354 {
14355   static char buff[64];
14356
14357   if (elf_header.e_type == ET_CORE)
14358     switch (e_type)
14359       {
14360       case NT_AUXV:
14361         return _("NT_AUXV (auxiliary vector)");
14362       case NT_PRSTATUS:
14363         return _("NT_PRSTATUS (prstatus structure)");
14364       case NT_FPREGSET:
14365         return _("NT_FPREGSET (floating point registers)");
14366       case NT_PRPSINFO:
14367         return _("NT_PRPSINFO (prpsinfo structure)");
14368       case NT_TASKSTRUCT:
14369         return _("NT_TASKSTRUCT (task structure)");
14370       case NT_PRXFPREG:
14371         return _("NT_PRXFPREG (user_xfpregs structure)");
14372       case NT_PPC_VMX:
14373         return _("NT_PPC_VMX (ppc Altivec registers)");
14374       case NT_PPC_VSX:
14375         return _("NT_PPC_VSX (ppc VSX registers)");
14376       case NT_386_TLS:
14377         return _("NT_386_TLS (x86 TLS information)");
14378       case NT_386_IOPERM:
14379         return _("NT_386_IOPERM (x86 I/O permissions)");
14380       case NT_X86_XSTATE:
14381         return _("NT_X86_XSTATE (x86 XSAVE extended state)");
14382       case NT_S390_HIGH_GPRS:
14383         return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
14384       case NT_S390_TIMER:
14385         return _("NT_S390_TIMER (s390 timer register)");
14386       case NT_S390_TODCMP:
14387         return _("NT_S390_TODCMP (s390 TOD comparator register)");
14388       case NT_S390_TODPREG:
14389         return _("NT_S390_TODPREG (s390 TOD programmable register)");
14390       case NT_S390_CTRS:
14391         return _("NT_S390_CTRS (s390 control registers)");
14392       case NT_S390_PREFIX:
14393         return _("NT_S390_PREFIX (s390 prefix register)");
14394       case NT_S390_LAST_BREAK:
14395         return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
14396       case NT_S390_SYSTEM_CALL:
14397         return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
14398       case NT_S390_TDB:
14399         return _("NT_S390_TDB (s390 transaction diagnostic block)");
14400       case NT_ARM_VFP:
14401         return _("NT_ARM_VFP (arm VFP registers)");
14402       case NT_ARM_TLS:
14403         return _("NT_ARM_TLS (AArch TLS registers)");
14404       case NT_ARM_HW_BREAK:
14405         return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
14406       case NT_ARM_HW_WATCH:
14407         return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
14408       case NT_PSTATUS:
14409         return _("NT_PSTATUS (pstatus structure)");
14410       case NT_FPREGS:
14411         return _("NT_FPREGS (floating point registers)");
14412       case NT_PSINFO:
14413         return _("NT_PSINFO (psinfo structure)");
14414       case NT_LWPSTATUS:
14415         return _("NT_LWPSTATUS (lwpstatus_t structure)");
14416       case NT_LWPSINFO:
14417         return _("NT_LWPSINFO (lwpsinfo_t structure)");
14418       case NT_WIN32PSTATUS:
14419         return _("NT_WIN32PSTATUS (win32_pstatus structure)");
14420       case NT_SIGINFO:
14421         return _("NT_SIGINFO (siginfo_t data)");
14422       case NT_FILE:
14423         return _("NT_FILE (mapped files)");
14424       default:
14425         break;
14426       }
14427   else
14428     switch (e_type)
14429       {
14430       case NT_VERSION:
14431         return _("NT_VERSION (version)");
14432       case NT_ARCH:
14433         return _("NT_ARCH (architecture)");
14434       default:
14435         break;
14436       }
14437
14438   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
14439   return buff;
14440 }
14441
14442 static int
14443 print_core_note (Elf_Internal_Note *pnote)
14444 {
14445   unsigned int addr_size = is_32bit_elf ? 4 : 8;
14446   bfd_vma count, page_size;
14447   unsigned char *descdata, *filenames, *descend;
14448
14449   if (pnote->type != NT_FILE)
14450     return 1;
14451
14452 #ifndef BFD64
14453   if (!is_32bit_elf)
14454     {
14455       printf (_("    Cannot decode 64-bit note in 32-bit build\n"));
14456       /* Still "successful".  */
14457       return 1;
14458     }
14459 #endif
14460
14461   if (pnote->descsz < 2 * addr_size)
14462     {
14463       printf (_("    Malformed note - too short for header\n"));
14464       return 0;
14465     }
14466
14467   descdata = (unsigned char *) pnote->descdata;
14468   descend = descdata + pnote->descsz;
14469
14470   if (descdata[pnote->descsz - 1] != '\0')
14471     {
14472       printf (_("    Malformed note - does not end with \\0\n"));
14473       return 0;
14474     }
14475
14476   count = byte_get (descdata, addr_size);
14477   descdata += addr_size;
14478
14479   page_size = byte_get (descdata, addr_size);
14480   descdata += addr_size;
14481
14482   if (pnote->descsz < 2 * addr_size + count * 3 * addr_size)
14483     {
14484       printf (_("    Malformed note - too short for supplied file count\n"));
14485       return 0;
14486     }
14487
14488   printf (_("    Page size: "));
14489   print_vma (page_size, DEC);
14490   printf ("\n");
14491
14492   printf (_("    %*s%*s%*s\n"),
14493           (int) (2 + 2 * addr_size), _("Start"),
14494           (int) (4 + 2 * addr_size), _("End"),
14495           (int) (4 + 2 * addr_size), _("Page Offset"));
14496   filenames = descdata + count * 3 * addr_size;
14497   while (--count > 0)
14498     {
14499       bfd_vma start, end, file_ofs;
14500
14501       if (filenames == descend)
14502         {
14503           printf (_("    Malformed note - filenames end too early\n"));
14504           return 0;
14505         }
14506
14507       start = byte_get (descdata, addr_size);
14508       descdata += addr_size;
14509       end = byte_get (descdata, addr_size);
14510       descdata += addr_size;
14511       file_ofs = byte_get (descdata, addr_size);
14512       descdata += addr_size;
14513
14514       printf ("    ");
14515       print_vma (start, FULL_HEX);
14516       printf ("  ");
14517       print_vma (end, FULL_HEX);
14518       printf ("  ");
14519       print_vma (file_ofs, FULL_HEX);
14520       printf ("\n        %s\n", filenames);
14521
14522       filenames += 1 + strlen ((char *) filenames);
14523     }
14524
14525   return 1;
14526 }
14527
14528 static const char *
14529 get_gnu_elf_note_type (unsigned e_type)
14530 {
14531   static char buff[64];
14532
14533   switch (e_type)
14534     {
14535     case NT_GNU_ABI_TAG:
14536       return _("NT_GNU_ABI_TAG (ABI version tag)");
14537     case NT_GNU_HWCAP:
14538       return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
14539     case NT_GNU_BUILD_ID:
14540       return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
14541     case NT_GNU_GOLD_VERSION:
14542       return _("NT_GNU_GOLD_VERSION (gold version)");
14543     default:
14544       break;
14545     }
14546
14547   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
14548   return buff;
14549 }
14550
14551 static int
14552 print_gnu_note (Elf_Internal_Note *pnote)
14553 {
14554   switch (pnote->type)
14555     {
14556     case NT_GNU_BUILD_ID:
14557       {
14558         unsigned long i;
14559
14560         printf (_("    Build ID: "));
14561         for (i = 0; i < pnote->descsz; ++i)
14562           printf ("%02x", pnote->descdata[i] & 0xff);
14563         printf ("\n");
14564       }
14565       break;
14566
14567     case NT_GNU_ABI_TAG:
14568       {
14569         unsigned long os, major, minor, subminor;
14570         const char *osname;
14571
14572         /* PR 17531: file: 030-599401-0.004.  */
14573         if (pnote->descsz < 16)
14574           {
14575             printf (_("    <corrupt GNU_ABI_TAG>\n"));
14576             break;
14577           }
14578
14579         os = byte_get ((unsigned char *) pnote->descdata, 4);
14580         major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
14581         minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
14582         subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
14583
14584         switch (os)
14585           {
14586           case GNU_ABI_TAG_LINUX:
14587             osname = "Linux";
14588             break;
14589           case GNU_ABI_TAG_HURD:
14590             osname = "Hurd";
14591             break;
14592           case GNU_ABI_TAG_SOLARIS:
14593             osname = "Solaris";
14594             break;
14595           case GNU_ABI_TAG_FREEBSD:
14596             osname = "FreeBSD";
14597             break;
14598           case GNU_ABI_TAG_NETBSD:
14599             osname = "NetBSD";
14600             break;
14601           default:
14602             osname = "Unknown";
14603             break;
14604           }
14605
14606         printf (_("    OS: %s, ABI: %ld.%ld.%ld\n"), osname,
14607                 major, minor, subminor);
14608       }
14609       break;
14610
14611     case NT_GNU_GOLD_VERSION:
14612       {
14613         unsigned long i;
14614
14615         printf (_("    Version: "));
14616         for (i = 0; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
14617           printf ("%c", pnote->descdata[i]);
14618         printf ("\n");
14619       }
14620       break;
14621     }
14622
14623   return 1;
14624 }
14625
14626 static const char *
14627 get_netbsd_elfcore_note_type (unsigned e_type)
14628 {
14629   static char buff[64];
14630
14631   if (e_type == NT_NETBSDCORE_PROCINFO)
14632     {
14633       /* NetBSD core "procinfo" structure.  */
14634       return _("NetBSD procinfo structure");
14635     }
14636
14637   /* As of Jan 2002 there are no other machine-independent notes
14638      defined for NetBSD core files.  If the note type is less
14639      than the start of the machine-dependent note types, we don't
14640      understand it.  */
14641
14642   if (e_type < NT_NETBSDCORE_FIRSTMACH)
14643     {
14644       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
14645       return buff;
14646     }
14647
14648   switch (elf_header.e_machine)
14649     {
14650     /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
14651        and PT_GETFPREGS == mach+2.  */
14652
14653     case EM_OLD_ALPHA:
14654     case EM_ALPHA:
14655     case EM_SPARC:
14656     case EM_SPARC32PLUS:
14657     case EM_SPARCV9:
14658       switch (e_type)
14659         {
14660         case NT_NETBSDCORE_FIRSTMACH + 0:
14661           return _("PT_GETREGS (reg structure)");
14662         case NT_NETBSDCORE_FIRSTMACH + 2:
14663           return _("PT_GETFPREGS (fpreg structure)");
14664         default:
14665           break;
14666         }
14667       break;
14668
14669     /* On all other arch's, PT_GETREGS == mach+1 and
14670        PT_GETFPREGS == mach+3.  */
14671     default:
14672       switch (e_type)
14673         {
14674         case NT_NETBSDCORE_FIRSTMACH + 1:
14675           return _("PT_GETREGS (reg structure)");
14676         case NT_NETBSDCORE_FIRSTMACH + 3:
14677           return _("PT_GETFPREGS (fpreg structure)");
14678         default:
14679           break;
14680         }
14681     }
14682
14683   snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
14684             e_type - NT_NETBSDCORE_FIRSTMACH);
14685   return buff;
14686 }
14687
14688 static const char *
14689 get_stapsdt_note_type (unsigned e_type)
14690 {
14691   static char buff[64];
14692
14693   switch (e_type)
14694     {
14695     case NT_STAPSDT:
14696       return _("NT_STAPSDT (SystemTap probe descriptors)");
14697
14698     default:
14699       break;
14700     }
14701
14702   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
14703   return buff;
14704 }
14705
14706 static int
14707 print_stapsdt_note (Elf_Internal_Note *pnote)
14708 {
14709   int addr_size = is_32bit_elf ? 4 : 8;
14710   char *data = pnote->descdata;
14711   char *data_end = pnote->descdata + pnote->descsz;
14712   bfd_vma pc, base_addr, semaphore;
14713   char *provider, *probe, *arg_fmt;
14714
14715   pc = byte_get ((unsigned char *) data, addr_size);
14716   data += addr_size;
14717   base_addr = byte_get ((unsigned char *) data, addr_size);
14718   data += addr_size;
14719   semaphore = byte_get ((unsigned char *) data, addr_size);
14720   data += addr_size;
14721
14722   provider = data;
14723   data += strlen (data) + 1;
14724   probe = data;
14725   data += strlen (data) + 1;
14726   arg_fmt = data;
14727   data += strlen (data) + 1;
14728
14729   printf (_("    Provider: %s\n"), provider);
14730   printf (_("    Name: %s\n"), probe);
14731   printf (_("    Location: "));
14732   print_vma (pc, FULL_HEX);
14733   printf (_(", Base: "));
14734   print_vma (base_addr, FULL_HEX);
14735   printf (_(", Semaphore: "));
14736   print_vma (semaphore, FULL_HEX);
14737   printf ("\n");
14738   printf (_("    Arguments: %s\n"), arg_fmt);
14739
14740   return data == data_end;
14741 }
14742
14743 static const char *
14744 get_ia64_vms_note_type (unsigned e_type)
14745 {
14746   static char buff[64];
14747
14748   switch (e_type)
14749     {
14750     case NT_VMS_MHD:
14751       return _("NT_VMS_MHD (module header)");
14752     case NT_VMS_LNM:
14753       return _("NT_VMS_LNM (language name)");
14754     case NT_VMS_SRC:
14755       return _("NT_VMS_SRC (source files)");
14756     case NT_VMS_TITLE:
14757       return "NT_VMS_TITLE";
14758     case NT_VMS_EIDC:
14759       return _("NT_VMS_EIDC (consistency check)");
14760     case NT_VMS_FPMODE:
14761       return _("NT_VMS_FPMODE (FP mode)");
14762     case NT_VMS_LINKTIME:
14763       return "NT_VMS_LINKTIME";
14764     case NT_VMS_IMGNAM:
14765       return _("NT_VMS_IMGNAM (image name)");
14766     case NT_VMS_IMGID:
14767       return _("NT_VMS_IMGID (image id)");
14768     case NT_VMS_LINKID:
14769       return _("NT_VMS_LINKID (link id)");
14770     case NT_VMS_IMGBID:
14771       return _("NT_VMS_IMGBID (build id)");
14772     case NT_VMS_GSTNAM:
14773       return _("NT_VMS_GSTNAM (sym table name)");
14774     case NT_VMS_ORIG_DYN:
14775       return "NT_VMS_ORIG_DYN";
14776     case NT_VMS_PATCHTIME:
14777       return "NT_VMS_PATCHTIME";
14778     default:
14779       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
14780       return buff;
14781     }
14782 }
14783
14784 static int
14785 print_ia64_vms_note (Elf_Internal_Note * pnote)
14786 {
14787   switch (pnote->type)
14788     {
14789     case NT_VMS_MHD:
14790       if (pnote->descsz > 36)
14791         {
14792           size_t l = strlen (pnote->descdata + 34);
14793           printf (_("    Creation date  : %.17s\n"), pnote->descdata);
14794           printf (_("    Last patch date: %.17s\n"), pnote->descdata + 17);
14795           printf (_("    Module name    : %s\n"), pnote->descdata + 34);
14796           printf (_("    Module version : %s\n"), pnote->descdata + 34 + l + 1);
14797         }
14798       else
14799         printf (_("    Invalid size\n"));
14800       break;
14801     case NT_VMS_LNM:
14802       printf (_("   Language: %s\n"), pnote->descdata);
14803       break;
14804 #ifdef BFD64
14805     case NT_VMS_FPMODE:
14806       printf (_("   Floating Point mode: "));
14807       printf ("0x%016" BFD_VMA_FMT "x\n",
14808               (bfd_vma)byte_get ((unsigned char *)pnote->descdata, 8));
14809       break;
14810     case NT_VMS_LINKTIME:
14811       printf (_("   Link time: "));
14812       print_vms_time
14813         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
14814       printf ("\n");
14815       break;
14816     case NT_VMS_PATCHTIME:
14817       printf (_("   Patch time: "));
14818       print_vms_time
14819         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
14820       printf ("\n");
14821       break;
14822     case NT_VMS_ORIG_DYN:
14823       printf (_("   Major id: %u,  minor id: %u\n"),
14824               (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
14825               (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
14826       printf (_("   Last modified  : "));
14827       print_vms_time
14828         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
14829       printf (_("\n   Link flags  : "));
14830       printf ("0x%016" BFD_VMA_FMT "x\n",
14831               (bfd_vma)byte_get ((unsigned char *)pnote->descdata + 16, 8));
14832       printf (_("   Header flags: 0x%08x\n"),
14833               (unsigned)byte_get ((unsigned char *)pnote->descdata + 24, 4));
14834       printf (_("   Image id    : %s\n"), pnote->descdata + 32);
14835       break;
14836 #endif
14837     case NT_VMS_IMGNAM:
14838       printf (_("    Image name: %s\n"), pnote->descdata);
14839       break;
14840     case NT_VMS_GSTNAM:
14841       printf (_("    Global symbol table name: %s\n"), pnote->descdata);
14842       break;
14843     case NT_VMS_IMGID:
14844       printf (_("    Image id: %s\n"), pnote->descdata);
14845       break;
14846     case NT_VMS_LINKID:
14847       printf (_("    Linker id: %s\n"), pnote->descdata);
14848       break;
14849     default:
14850       break;
14851     }
14852   return 1;
14853 }
14854
14855 /* Note that by the ELF standard, the name field is already null byte
14856    terminated, and namesz includes the terminating null byte.
14857    I.E. the value of namesz for the name "FSF" is 4.
14858
14859    If the value of namesz is zero, there is no name present.  */
14860 static int
14861 process_note (Elf_Internal_Note * pnote)
14862 {
14863   const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
14864   const char * nt;
14865
14866   if (pnote->namesz == 0)
14867     /* If there is no note name, then use the default set of
14868        note type strings.  */
14869     nt = get_note_type (pnote->type);
14870
14871   else if (const_strneq (pnote->namedata, "GNU"))
14872     /* GNU-specific object file notes.  */
14873     nt = get_gnu_elf_note_type (pnote->type);
14874
14875   else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
14876     /* NetBSD-specific core file notes.  */
14877     nt = get_netbsd_elfcore_note_type (pnote->type);
14878
14879   else if (strneq (pnote->namedata, "SPU/", 4))
14880     {
14881       /* SPU-specific core file notes.  */
14882       nt = pnote->namedata + 4;
14883       name = "SPU";
14884     }
14885
14886   else if (const_strneq (pnote->namedata, "IPF/VMS"))
14887     /* VMS/ia64-specific file notes.  */
14888     nt = get_ia64_vms_note_type (pnote->type);
14889
14890   else if (const_strneq (pnote->namedata, "stapsdt"))
14891     nt = get_stapsdt_note_type (pnote->type);
14892
14893   else
14894     /* Don't recognize this note name; just use the default set of
14895        note type strings.  */
14896     nt = get_note_type (pnote->type);
14897
14898   printf ("  %-20s 0x%08lx\t%s\n", name, pnote->descsz, nt);
14899
14900   if (const_strneq (pnote->namedata, "IPF/VMS"))
14901     return print_ia64_vms_note (pnote);
14902   else if (const_strneq (pnote->namedata, "GNU"))
14903     return print_gnu_note (pnote);
14904   else if (const_strneq (pnote->namedata, "stapsdt"))
14905     return print_stapsdt_note (pnote);
14906   else if (const_strneq (pnote->namedata, "CORE"))
14907     return print_core_note (pnote);
14908   else
14909     return 1;
14910 }
14911
14912
14913 static int
14914 process_corefile_note_segment (FILE * file, bfd_vma offset, bfd_vma length)
14915 {
14916   Elf_External_Note * pnotes;
14917   Elf_External_Note * external;
14918   int res = 1;
14919
14920   if (length <= 0)
14921     return 0;
14922
14923   pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
14924                                            _("notes"));
14925   if (pnotes == NULL)
14926     return 0;
14927
14928   external = pnotes;
14929
14930   printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
14931           (unsigned long) offset, (unsigned long) length);
14932   printf (_("  %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
14933
14934   while ((char *) external < (char *) pnotes + length)
14935     {
14936       Elf_Internal_Note inote;
14937       size_t min_notesz;
14938       char *next;
14939       char * temp = NULL;
14940       size_t data_remaining = ((char *) pnotes + length) - (char *) external;
14941
14942       if (!is_ia64_vms ())
14943         {
14944           /* PR binutils/15191
14945              Make sure that there is enough data to read.  */
14946           min_notesz = offsetof (Elf_External_Note, name);
14947           if (data_remaining < min_notesz)
14948             {
14949               warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
14950                     (int) data_remaining);
14951               break;
14952             }
14953           inote.type     = BYTE_GET (external->type);
14954           inote.namesz   = BYTE_GET (external->namesz);
14955           inote.namedata = external->name;
14956           inote.descsz   = BYTE_GET (external->descsz);
14957           inote.descdata = inote.namedata + align_power (inote.namesz, 2);
14958           inote.descpos  = offset + (inote.descdata - (char *) pnotes);
14959           next = inote.descdata + align_power (inote.descsz, 2);
14960         }
14961       else
14962         {
14963           Elf64_External_VMS_Note *vms_external;
14964
14965           /* PR binutils/15191
14966              Make sure that there is enough data to read.  */
14967           min_notesz = offsetof (Elf64_External_VMS_Note, name);
14968           if (data_remaining < min_notesz)
14969             {
14970               warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
14971                     (int) data_remaining);
14972               break;
14973             }
14974
14975           vms_external = (Elf64_External_VMS_Note *) external;
14976           inote.type     = BYTE_GET (vms_external->type);
14977           inote.namesz   = BYTE_GET (vms_external->namesz);
14978           inote.namedata = vms_external->name;
14979           inote.descsz   = BYTE_GET (vms_external->descsz);
14980           inote.descdata = inote.namedata + align_power (inote.namesz, 3);
14981           inote.descpos  = offset + (inote.descdata - (char *) pnotes);
14982           next = inote.descdata + align_power (inote.descsz, 3);
14983         }
14984
14985       if (inote.descdata < (char *) external + min_notesz
14986           || next < (char *) external + min_notesz
14987           /* PR binutils/17531: file: id:000000,sig:11,src:006986,op:havoc,rep:4.  */
14988           || inote.namedata + inote.namesz < inote.namedata
14989           || inote.descdata + inote.descsz < inote.descdata
14990           || data_remaining < (size_t)(next - (char *) external))
14991         {
14992           warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
14993                 (unsigned long) ((char *) external - (char *) pnotes));
14994           warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx\n"),
14995                 inote.type, inote.namesz, inote.descsz);
14996           break;
14997         }
14998
14999       external = (Elf_External_Note *) next;
15000
15001       /* Verify that name is null terminated.  It appears that at least
15002          one version of Linux (RedHat 6.0) generates corefiles that don't
15003          comply with the ELF spec by failing to include the null byte in
15004          namesz.  */
15005       if (inote.namedata[inote.namesz - 1] != '\0')
15006         {
15007           temp = (char *) malloc (inote.namesz + 1);
15008           if (temp == NULL)
15009             {
15010               error (_("Out of memory allocating space for inote name\n"));
15011               res = 0;
15012               break;
15013             }
15014
15015           strncpy (temp, inote.namedata, inote.namesz);
15016           temp[inote.namesz] = 0;
15017
15018           /* warn (_("'%s' NOTE name not properly null terminated\n"), temp);  */
15019           inote.namedata = temp;
15020         }
15021
15022       res &= process_note (& inote);
15023
15024       if (temp != NULL)
15025         {
15026           free (temp);
15027           temp = NULL;
15028         }
15029     }
15030
15031   free (pnotes);
15032
15033   return res;
15034 }
15035
15036 static int
15037 process_corefile_note_segments (FILE * file)
15038 {
15039   Elf_Internal_Phdr * segment;
15040   unsigned int i;
15041   int res = 1;
15042
15043   if (! get_program_headers (file))
15044       return 0;
15045
15046   for (i = 0, segment = program_headers;
15047        i < elf_header.e_phnum;
15048        i++, segment++)
15049     {
15050       if (segment->p_type == PT_NOTE)
15051         res &= process_corefile_note_segment (file,
15052                                               (bfd_vma) segment->p_offset,
15053                                               (bfd_vma) segment->p_filesz);
15054     }
15055
15056   return res;
15057 }
15058
15059 static int
15060 process_note_sections (FILE * file)
15061 {
15062   Elf_Internal_Shdr * section;
15063   unsigned long i;
15064   int n = 0;
15065   int res = 1;
15066
15067   for (i = 0, section = section_headers;
15068        i < elf_header.e_shnum && section != NULL;
15069        i++, section++)
15070     if (section->sh_type == SHT_NOTE)
15071       {
15072         res &= process_corefile_note_segment (file,
15073                                               (bfd_vma) section->sh_offset,
15074                                               (bfd_vma) section->sh_size);
15075         n++;
15076       }
15077
15078   if (n == 0)
15079     /* Try processing NOTE segments instead.  */
15080     return process_corefile_note_segments (file);
15081
15082   return res;
15083 }
15084
15085 static int
15086 process_notes (FILE * file)
15087 {
15088   /* If we have not been asked to display the notes then do nothing.  */
15089   if (! do_notes)
15090     return 1;
15091
15092   if (elf_header.e_type != ET_CORE)
15093     return process_note_sections (file);
15094
15095   /* No program headers means no NOTE segment.  */
15096   if (elf_header.e_phnum > 0)
15097     return process_corefile_note_segments (file);
15098
15099   printf (_("No note segments present in the core file.\n"));
15100   return 1;
15101 }
15102
15103 static int
15104 process_arch_specific (FILE * file)
15105 {
15106   if (! do_arch)
15107     return 1;
15108
15109   switch (elf_header.e_machine)
15110     {
15111     case EM_ARM:
15112       return process_arm_specific (file);
15113     case EM_MIPS:
15114     case EM_MIPS_RS3_LE:
15115       return process_mips_specific (file);
15116       break;
15117     case EM_NDS32:
15118       return process_nds32_specific (file);
15119       break;
15120     case EM_PPC:
15121       return process_power_specific (file);
15122       break;
15123     case EM_SPARC:
15124     case EM_SPARC32PLUS:
15125     case EM_SPARCV9:
15126       return process_sparc_specific (file);
15127       break;
15128     case EM_TI_C6000:
15129       return process_tic6x_specific (file);
15130       break;
15131     case EM_MSP430:
15132       return process_msp430x_specific (file);
15133     default:
15134       break;
15135     }
15136   return 1;
15137 }
15138
15139 static int
15140 get_file_header (FILE * file)
15141 {
15142   /* Read in the identity array.  */
15143   if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
15144     return 0;
15145
15146   /* Determine how to read the rest of the header.  */
15147   switch (elf_header.e_ident[EI_DATA])
15148     {
15149     default: /* fall through */
15150     case ELFDATANONE: /* fall through */
15151     case ELFDATA2LSB:
15152       byte_get = byte_get_little_endian;
15153       byte_put = byte_put_little_endian;
15154       break;
15155     case ELFDATA2MSB:
15156       byte_get = byte_get_big_endian;
15157       byte_put = byte_put_big_endian;
15158       break;
15159     }
15160
15161   /* For now we only support 32 bit and 64 bit ELF files.  */
15162   is_32bit_elf = (elf_header.e_ident[EI_CLASS] != ELFCLASS64);
15163
15164   /* Read in the rest of the header.  */
15165   if (is_32bit_elf)
15166     {
15167       Elf32_External_Ehdr ehdr32;
15168
15169       if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
15170         return 0;
15171
15172       elf_header.e_type      = BYTE_GET (ehdr32.e_type);
15173       elf_header.e_machine   = BYTE_GET (ehdr32.e_machine);
15174       elf_header.e_version   = BYTE_GET (ehdr32.e_version);
15175       elf_header.e_entry     = BYTE_GET (ehdr32.e_entry);
15176       elf_header.e_phoff     = BYTE_GET (ehdr32.e_phoff);
15177       elf_header.e_shoff     = BYTE_GET (ehdr32.e_shoff);
15178       elf_header.e_flags     = BYTE_GET (ehdr32.e_flags);
15179       elf_header.e_ehsize    = BYTE_GET (ehdr32.e_ehsize);
15180       elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
15181       elf_header.e_phnum     = BYTE_GET (ehdr32.e_phnum);
15182       elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
15183       elf_header.e_shnum     = BYTE_GET (ehdr32.e_shnum);
15184       elf_header.e_shstrndx  = BYTE_GET (ehdr32.e_shstrndx);
15185     }
15186   else
15187     {
15188       Elf64_External_Ehdr ehdr64;
15189
15190       /* If we have been compiled with sizeof (bfd_vma) == 4, then
15191          we will not be able to cope with the 64bit data found in
15192          64 ELF files.  Detect this now and abort before we start
15193          overwriting things.  */
15194       if (sizeof (bfd_vma) < 8)
15195         {
15196           error (_("This instance of readelf has been built without support for a\n\
15197 64 bit data type and so it cannot read 64 bit ELF files.\n"));
15198           return 0;
15199         }
15200
15201       if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
15202         return 0;
15203
15204       elf_header.e_type      = BYTE_GET (ehdr64.e_type);
15205       elf_header.e_machine   = BYTE_GET (ehdr64.e_machine);
15206       elf_header.e_version   = BYTE_GET (ehdr64.e_version);
15207       elf_header.e_entry     = BYTE_GET (ehdr64.e_entry);
15208       elf_header.e_phoff     = BYTE_GET (ehdr64.e_phoff);
15209       elf_header.e_shoff     = BYTE_GET (ehdr64.e_shoff);
15210       elf_header.e_flags     = BYTE_GET (ehdr64.e_flags);
15211       elf_header.e_ehsize    = BYTE_GET (ehdr64.e_ehsize);
15212       elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
15213       elf_header.e_phnum     = BYTE_GET (ehdr64.e_phnum);
15214       elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
15215       elf_header.e_shnum     = BYTE_GET (ehdr64.e_shnum);
15216       elf_header.e_shstrndx  = BYTE_GET (ehdr64.e_shstrndx);
15217     }
15218
15219   if (elf_header.e_shoff)
15220     {
15221       /* There may be some extensions in the first section header.  Don't
15222          bomb if we can't read it.  */
15223       if (is_32bit_elf)
15224         get_32bit_section_headers (file, TRUE);
15225       else
15226         get_64bit_section_headers (file, TRUE);
15227     }
15228
15229   return 1;
15230 }
15231
15232 /* Process one ELF object file according to the command line options.
15233    This file may actually be stored in an archive.  The file is
15234    positioned at the start of the ELF object.  */
15235
15236 static int
15237 process_object (char * file_name, FILE * file)
15238 {
15239   unsigned int i;
15240
15241   if (! get_file_header (file))
15242     {
15243       error (_("%s: Failed to read file header\n"), file_name);
15244       return 1;
15245     }
15246
15247   /* Initialise per file variables.  */
15248   for (i = ARRAY_SIZE (version_info); i--;)
15249     version_info[i] = 0;
15250
15251   for (i = ARRAY_SIZE (dynamic_info); i--;)
15252     dynamic_info[i] = 0;
15253   dynamic_info_DT_GNU_HASH = 0;
15254
15255   /* Process the file.  */
15256   if (show_name)
15257     printf (_("\nFile: %s\n"), file_name);
15258
15259   /* Initialise the dump_sects array from the cmdline_dump_sects array.
15260      Note we do this even if cmdline_dump_sects is empty because we
15261      must make sure that the dump_sets array is zeroed out before each
15262      object file is processed.  */
15263   if (num_dump_sects > num_cmdline_dump_sects)
15264     memset (dump_sects, 0, num_dump_sects * sizeof (* dump_sects));
15265
15266   if (num_cmdline_dump_sects > 0)
15267     {
15268       if (num_dump_sects == 0)
15269         /* A sneaky way of allocating the dump_sects array.  */
15270         request_dump_bynumber (num_cmdline_dump_sects, 0);
15271
15272       assert (num_dump_sects >= num_cmdline_dump_sects);
15273       memcpy (dump_sects, cmdline_dump_sects,
15274               num_cmdline_dump_sects * sizeof (* dump_sects));
15275     }
15276
15277   if (! process_file_header ())
15278     return 1;
15279
15280   if (! process_section_headers (file))
15281     {
15282       /* Without loaded section headers we cannot process lots of
15283          things.  */
15284       do_unwind = do_version = do_dump = do_arch = 0;
15285
15286       if (! do_using_dynamic)
15287         do_syms = do_dyn_syms = do_reloc = 0;
15288     }
15289
15290   if (! process_section_groups (file))
15291     {
15292       /* Without loaded section groups we cannot process unwind.  */
15293       do_unwind = 0;
15294     }
15295
15296   if (process_program_headers (file))
15297     process_dynamic_section (file);
15298
15299   process_relocs (file);
15300
15301   process_unwind (file);
15302
15303   process_symbol_table (file);
15304
15305   process_syminfo (file);
15306
15307   process_version_sections (file);
15308
15309   process_section_contents (file);
15310
15311   process_notes (file);
15312
15313   process_gnu_liblist (file);
15314
15315   process_arch_specific (file);
15316
15317   if (program_headers)
15318     {
15319       free (program_headers);
15320       program_headers = NULL;
15321     }
15322
15323   if (section_headers)
15324     {
15325       free (section_headers);
15326       section_headers = NULL;
15327     }
15328
15329   if (string_table)
15330     {
15331       free (string_table);
15332       string_table = NULL;
15333       string_table_length = 0;
15334     }
15335
15336   if (dynamic_strings)
15337     {
15338       free (dynamic_strings);
15339       dynamic_strings = NULL;
15340       dynamic_strings_length = 0;
15341     }
15342
15343   if (dynamic_symbols)
15344     {
15345       free (dynamic_symbols);
15346       dynamic_symbols = NULL;
15347       num_dynamic_syms = 0;
15348     }
15349
15350   if (dynamic_syminfo)
15351     {
15352       free (dynamic_syminfo);
15353       dynamic_syminfo = NULL;
15354     }
15355
15356   if (dynamic_section)
15357     {
15358       free (dynamic_section);
15359       dynamic_section = NULL;
15360     }
15361
15362   if (section_headers_groups)
15363     {
15364       free (section_headers_groups);
15365       section_headers_groups = NULL;
15366     }
15367
15368   if (section_groups)
15369     {
15370       struct group_list * g;
15371       struct group_list * next;
15372
15373       for (i = 0; i < group_count; i++)
15374         {
15375           for (g = section_groups [i].root; g != NULL; g = next)
15376             {
15377               next = g->next;
15378               free (g);
15379             }
15380         }
15381
15382       free (section_groups);
15383       section_groups = NULL;
15384     }
15385
15386   free_debug_memory ();
15387
15388   return 0;
15389 }
15390
15391 /* Process an ELF archive.
15392    On entry the file is positioned just after the ARMAG string.  */
15393
15394 static int
15395 process_archive (char * file_name, FILE * file, bfd_boolean is_thin_archive)
15396 {
15397   struct archive_info arch;
15398   struct archive_info nested_arch;
15399   size_t got;
15400   int ret;
15401
15402   show_name = 1;
15403
15404   /* The ARCH structure is used to hold information about this archive.  */
15405   arch.file_name = NULL;
15406   arch.file = NULL;
15407   arch.index_array = NULL;
15408   arch.sym_table = NULL;
15409   arch.longnames = NULL;
15410
15411   /* The NESTED_ARCH structure is used as a single-item cache of information
15412      about a nested archive (when members of a thin archive reside within
15413      another regular archive file).  */
15414   nested_arch.file_name = NULL;
15415   nested_arch.file = NULL;
15416   nested_arch.index_array = NULL;
15417   nested_arch.sym_table = NULL;
15418   nested_arch.longnames = NULL;
15419
15420   if (setup_archive (&arch, file_name, file, is_thin_archive, do_archive_index) != 0)
15421     {
15422       ret = 1;
15423       goto out;
15424     }
15425
15426   if (do_archive_index)
15427     {
15428       if (arch.sym_table == NULL)
15429         error (_("%s: unable to dump the index as none was found\n"), file_name);
15430       else
15431         {
15432           unsigned long i, l;
15433           unsigned long current_pos;
15434
15435           printf (_("Index of archive %s: (%lu entries, 0x%lx bytes in the symbol table)\n"),
15436                   file_name, (unsigned long) arch.index_num, arch.sym_size);
15437           current_pos = ftell (file);
15438
15439           for (i = l = 0; i < arch.index_num; i++)
15440             {
15441               if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
15442                 {
15443                   char * member_name;
15444
15445                   member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
15446
15447                   if (member_name != NULL)
15448                     {
15449                       char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
15450
15451                       if (qualified_name != NULL)
15452                         {
15453                           printf (_("Contents of binary %s at offset "), qualified_name);
15454                           (void) print_vma (arch.index_array[i], PREFIX_HEX);
15455                           putchar ('\n');
15456                           free (qualified_name);
15457                         }
15458                     }
15459                 }
15460
15461               if (l >= arch.sym_size)
15462                 {
15463                   error (_("%s: end of the symbol table reached before the end of the index\n"),
15464                          file_name);
15465                   break;
15466                 }
15467               /* PR 17531: file: 0b6630b2.  */
15468               printf ("\t%.*s\n", (int) (arch.sym_size - l), arch.sym_table + l);
15469               l += strnlen (arch.sym_table + l, arch.sym_size - l) + 1;
15470             }
15471
15472           if (arch.uses_64bit_indicies)
15473             l = (l + 7) & ~ 7;
15474           else
15475             l += l & 1;
15476
15477           if (l < arch.sym_size)
15478             error (_("%s: %ld bytes remain in the symbol table, but without corresponding entries in the index table\n"),
15479                    file_name, arch.sym_size - l);
15480
15481           if (fseek (file, current_pos, SEEK_SET) != 0)
15482             {
15483               error (_("%s: failed to seek back to start of object files in the archive\n"), file_name);
15484               ret = 1;
15485               goto out;
15486             }
15487         }
15488
15489       if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
15490           && !do_segments && !do_header && !do_dump && !do_version
15491           && !do_histogram && !do_debugging && !do_arch && !do_notes
15492           && !do_section_groups && !do_dyn_syms)
15493         {
15494           ret = 0; /* Archive index only.  */
15495           goto out;
15496         }
15497     }
15498
15499   ret = 0;
15500
15501   while (1)
15502     {
15503       char * name;
15504       size_t namelen;
15505       char * qualified_name;
15506
15507       /* Read the next archive header.  */
15508       if (fseek (file, arch.next_arhdr_offset, SEEK_SET) != 0)
15509         {
15510           error (_("%s: failed to seek to next archive header\n"), file_name);
15511           return 1;
15512         }
15513       got = fread (&arch.arhdr, 1, sizeof arch.arhdr, file);
15514       if (got != sizeof arch.arhdr)
15515         {
15516           if (got == 0)
15517             break;
15518           error (_("%s: failed to read archive header\n"), file_name);
15519           ret = 1;
15520           break;
15521         }
15522       if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
15523         {
15524           error (_("%s: did not find a valid archive header\n"), arch.file_name);
15525           ret = 1;
15526           break;
15527         }
15528
15529       arch.next_arhdr_offset += sizeof arch.arhdr;
15530
15531       archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
15532       if (archive_file_size & 01)
15533         ++archive_file_size;
15534
15535       name = get_archive_member_name (&arch, &nested_arch);
15536       if (name == NULL)
15537         {
15538           error (_("%s: bad archive file name\n"), file_name);
15539           ret = 1;
15540           break;
15541         }
15542       namelen = strlen (name);
15543
15544       qualified_name = make_qualified_name (&arch, &nested_arch, name);
15545       if (qualified_name == NULL)
15546         {
15547           error (_("%s: bad archive file name\n"), file_name);
15548           ret = 1;
15549           break;
15550         }
15551
15552       if (is_thin_archive && arch.nested_member_origin == 0)
15553         {
15554           /* This is a proxy for an external member of a thin archive.  */
15555           FILE * member_file;
15556           char * member_file_name = adjust_relative_path (file_name, name, namelen);
15557           if (member_file_name == NULL)
15558             {
15559               ret = 1;
15560               break;
15561             }
15562
15563           member_file = fopen (member_file_name, "rb");
15564           if (member_file == NULL)
15565             {
15566               error (_("Input file '%s' is not readable.\n"), member_file_name);
15567               free (member_file_name);
15568               ret = 1;
15569               break;
15570             }
15571
15572           archive_file_offset = arch.nested_member_origin;
15573
15574           ret |= process_object (qualified_name, member_file);
15575
15576           fclose (member_file);
15577           free (member_file_name);
15578         }
15579       else if (is_thin_archive)
15580         {
15581           /* PR 15140: Allow for corrupt thin archives.  */
15582           if (nested_arch.file == NULL)
15583             {
15584               error (_("%s: contains corrupt thin archive: %s\n"),
15585                      file_name, name);
15586               ret = 1;
15587               break;
15588             }
15589
15590           /* This is a proxy for a member of a nested archive.  */
15591           archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
15592
15593           /* The nested archive file will have been opened and setup by
15594              get_archive_member_name.  */
15595           if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
15596             {
15597               error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
15598               ret = 1;
15599               break;
15600             }
15601
15602           ret |= process_object (qualified_name, nested_arch.file);
15603         }
15604       else
15605         {
15606           archive_file_offset = arch.next_arhdr_offset;
15607           arch.next_arhdr_offset += archive_file_size;
15608
15609           ret |= process_object (qualified_name, file);
15610         }
15611
15612       if (dump_sects != NULL)
15613         {
15614           free (dump_sects);
15615           dump_sects = NULL;
15616           num_dump_sects = 0;
15617         }
15618
15619       free (qualified_name);
15620     }
15621
15622  out:
15623   if (nested_arch.file != NULL)
15624     fclose (nested_arch.file);
15625   release_archive (&nested_arch);
15626   release_archive (&arch);
15627
15628   return ret;
15629 }
15630
15631 static int
15632 process_file (char * file_name)
15633 {
15634   FILE * file;
15635   struct stat statbuf;
15636   char armag[SARMAG];
15637   int ret;
15638
15639   if (stat (file_name, &statbuf) < 0)
15640     {
15641       if (errno == ENOENT)
15642         error (_("'%s': No such file\n"), file_name);
15643       else
15644         error (_("Could not locate '%s'.  System error message: %s\n"),
15645                file_name, strerror (errno));
15646       return 1;
15647     }
15648
15649   if (! S_ISREG (statbuf.st_mode))
15650     {
15651       error (_("'%s' is not an ordinary file\n"), file_name);
15652       return 1;
15653     }
15654
15655   file = fopen (file_name, "rb");
15656   if (file == NULL)
15657     {
15658       error (_("Input file '%s' is not readable.\n"), file_name);
15659       return 1;
15660     }
15661
15662   if (fread (armag, SARMAG, 1, file) != 1)
15663     {
15664       error (_("%s: Failed to read file's magic number\n"), file_name);
15665       fclose (file);
15666       return 1;
15667     }
15668
15669   current_file_size = (bfd_size_type) statbuf.st_size;
15670
15671   if (memcmp (armag, ARMAG, SARMAG) == 0)
15672     ret = process_archive (file_name, file, FALSE);
15673   else if (memcmp (armag, ARMAGT, SARMAG) == 0)
15674     ret = process_archive (file_name, file, TRUE);
15675   else
15676     {
15677       if (do_archive_index)
15678         error (_("File %s is not an archive so its index cannot be displayed.\n"),
15679                file_name);
15680
15681       rewind (file);
15682       archive_file_size = archive_file_offset = 0;
15683       ret = process_object (file_name, file);
15684     }
15685
15686   fclose (file);
15687
15688   current_file_size = 0;
15689   return ret;
15690 }
15691
15692 #ifdef SUPPORT_DISASSEMBLY
15693 /* Needed by the i386 disassembler.  For extra credit, someone could
15694    fix this so that we insert symbolic addresses here, esp for GOT/PLT
15695    symbols.  */
15696
15697 void
15698 print_address (unsigned int addr, FILE * outfile)
15699 {
15700   fprintf (outfile,"0x%8.8x", addr);
15701 }
15702
15703 /* Needed by the i386 disassembler.  */
15704 void
15705 db_task_printsym (unsigned int addr)
15706 {
15707   print_address (addr, stderr);
15708 }
15709 #endif
15710
15711 int
15712 main (int argc, char ** argv)
15713 {
15714   int err;
15715
15716 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
15717   setlocale (LC_MESSAGES, "");
15718 #endif
15719 #if defined (HAVE_SETLOCALE)
15720   setlocale (LC_CTYPE, "");
15721 #endif
15722   bindtextdomain (PACKAGE, LOCALEDIR);
15723   textdomain (PACKAGE);
15724
15725   expandargv (&argc, &argv);
15726
15727   parse_args (argc, argv);
15728
15729   if (num_dump_sects > 0)
15730     {
15731       /* Make a copy of the dump_sects array.  */
15732       cmdline_dump_sects = (dump_type *)
15733           malloc (num_dump_sects * sizeof (* dump_sects));
15734       if (cmdline_dump_sects == NULL)
15735         error (_("Out of memory allocating dump request table.\n"));
15736       else
15737         {
15738           memcpy (cmdline_dump_sects, dump_sects,
15739                   num_dump_sects * sizeof (* dump_sects));
15740           num_cmdline_dump_sects = num_dump_sects;
15741         }
15742     }
15743
15744   if (optind < (argc - 1))
15745     show_name = 1;
15746
15747   err = 0;
15748   while (optind < argc)
15749     err |= process_file (argv[optind++]);
15750
15751   if (dump_sects != NULL)
15752     free (dump_sects);
15753   if (cmdline_dump_sects != NULL)
15754     free (cmdline_dump_sects);
15755
15756   return err;
15757 }