target remote: Don't rely on immediate_quit (introduce quit handlers)
[external/binutils.git] / binutils / readelf.c
1 /* readelf.c -- display contents of an ELF format file
2    Copyright (C) 1998-2016 Free Software Foundation, Inc.
3
4    Originally developed by Eric Youngdale <eric@andante.jic.com>
5    Modifications by Nick Clifton <nickc@redhat.com>
6
7    This file is part of GNU Binutils.
8
9    This program is free software; you can redistribute it and/or modify
10    it under the terms of the GNU General Public License as published by
11    the Free Software Foundation; either version 3 of the License, or
12    (at your option) any later version.
13
14    This program is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17    GNU General Public License for more details.
18
19    You should have received a copy of the GNU General Public License
20    along with this program; if not, write to the Free Software
21    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
22    02110-1301, USA.  */
23 \f
24 /* The difference between readelf and objdump:
25
26   Both programs are capable of displaying the contents of ELF format files,
27   so why does the binutils project have two file dumpers ?
28
29   The reason is that objdump sees an ELF file through a BFD filter of the
30   world; if BFD has a bug where, say, it disagrees about a machine constant
31   in e_flags, then the odds are good that it will remain internally
32   consistent.  The linker sees it the BFD way, objdump sees it the BFD way,
33   GAS sees it the BFD way.  There was need for a tool to go find out what
34   the file actually says.
35
36   This is why the readelf program does not link against the BFD library - it
37   exists as an independent program to help verify the correct working of BFD.
38
39   There is also the case that readelf can provide more information about an
40   ELF file than is provided by objdump.  In particular it can display DWARF
41   debugging information which (at the moment) objdump cannot.  */
42 \f
43 #include "sysdep.h"
44 #include <assert.h>
45 #include <time.h>
46 #include <zlib.h>
47 #ifdef HAVE_WCHAR_H
48 #include <wchar.h>
49 #endif
50
51 #if __GNUC__ >= 2
52 /* Define BFD64 here, even if our default architecture is 32 bit ELF
53    as this will allow us to read in and parse 64bit and 32bit ELF files.
54    Only do this if we believe that the compiler can support a 64 bit
55    data type.  For now we only rely on GCC being able to do this.  */
56 #define BFD64
57 #endif
58
59 #include "bfd.h"
60 #include "bucomm.h"
61 #include "elfcomm.h"
62 #include "dwarf.h"
63
64 #include "elf/common.h"
65 #include "elf/external.h"
66 #include "elf/internal.h"
67
68
69 /* Included here, before RELOC_MACROS_GEN_FUNC is defined, so that
70    we can obtain the H8 reloc numbers.  We need these for the
71    get_reloc_size() function.  We include h8.h again after defining
72    RELOC_MACROS_GEN_FUNC so that we get the naming function as well.  */
73
74 #include "elf/h8.h"
75 #undef _ELF_H8_H
76
77 /* Undo the effects of #including reloc-macros.h.  */
78
79 #undef START_RELOC_NUMBERS
80 #undef RELOC_NUMBER
81 #undef FAKE_RELOC
82 #undef EMPTY_RELOC
83 #undef END_RELOC_NUMBERS
84 #undef _RELOC_MACROS_H
85
86 /* The following headers use the elf/reloc-macros.h file to
87    automatically generate relocation recognition functions
88    such as elf_mips_reloc_type()  */
89
90 #define RELOC_MACROS_GEN_FUNC
91
92 #include "elf/aarch64.h"
93 #include "elf/alpha.h"
94 #include "elf/arc.h"
95 #include "elf/arm.h"
96 #include "elf/avr.h"
97 #include "elf/bfin.h"
98 #include "elf/cr16.h"
99 #include "elf/cris.h"
100 #include "elf/crx.h"
101 #include "elf/d10v.h"
102 #include "elf/d30v.h"
103 #include "elf/dlx.h"
104 #include "elf/epiphany.h"
105 #include "elf/fr30.h"
106 #include "elf/frv.h"
107 #include "elf/ft32.h"
108 #include "elf/h8.h"
109 #include "elf/hppa.h"
110 #include "elf/i386.h"
111 #include "elf/i370.h"
112 #include "elf/i860.h"
113 #include "elf/i960.h"
114 #include "elf/ia64.h"
115 #include "elf/ip2k.h"
116 #include "elf/lm32.h"
117 #include "elf/iq2000.h"
118 #include "elf/m32c.h"
119 #include "elf/m32r.h"
120 #include "elf/m68k.h"
121 #include "elf/m68hc11.h"
122 #include "elf/mcore.h"
123 #include "elf/mep.h"
124 #include "elf/metag.h"
125 #include "elf/microblaze.h"
126 #include "elf/mips.h"
127 #include "elf/mmix.h"
128 #include "elf/mn10200.h"
129 #include "elf/mn10300.h"
130 #include "elf/moxie.h"
131 #include "elf/mt.h"
132 #include "elf/msp430.h"
133 #include "elf/nds32.h"
134 #include "elf/nios2.h"
135 #include "elf/or1k.h"
136 #include "elf/pj.h"
137 #include "elf/ppc.h"
138 #include "elf/ppc64.h"
139 #include "elf/rl78.h"
140 #include "elf/rx.h"
141 #include "elf/s390.h"
142 #include "elf/score.h"
143 #include "elf/sh.h"
144 #include "elf/sparc.h"
145 #include "elf/spu.h"
146 #include "elf/tic6x.h"
147 #include "elf/tilegx.h"
148 #include "elf/tilepro.h"
149 #include "elf/v850.h"
150 #include "elf/vax.h"
151 #include "elf/visium.h"
152 #include "elf/x86-64.h"
153 #include "elf/xc16x.h"
154 #include "elf/xgate.h"
155 #include "elf/xstormy16.h"
156 #include "elf/xtensa.h"
157
158 #include "getopt.h"
159 #include "libiberty.h"
160 #include "safe-ctype.h"
161 #include "filenames.h"
162
163 #ifndef offsetof
164 #define offsetof(TYPE, MEMBER) ((size_t) &(((TYPE *) 0)->MEMBER))
165 #endif
166
167 typedef struct elf_section_list
168 {
169   Elf_Internal_Shdr * hdr;
170   struct elf_section_list * next;
171 } elf_section_list;
172
173 char * program_name = "readelf";
174 static unsigned long archive_file_offset;
175 static unsigned long archive_file_size;
176 static bfd_size_type current_file_size;
177 static unsigned long dynamic_addr;
178 static bfd_size_type dynamic_size;
179 static size_t dynamic_nent;
180 static char * dynamic_strings;
181 static unsigned long dynamic_strings_length;
182 static char * string_table;
183 static unsigned long string_table_length;
184 static unsigned long num_dynamic_syms;
185 static Elf_Internal_Sym * dynamic_symbols;
186 static Elf_Internal_Syminfo * dynamic_syminfo;
187 static unsigned long dynamic_syminfo_offset;
188 static unsigned int dynamic_syminfo_nent;
189 static char program_interpreter[PATH_MAX];
190 static bfd_vma dynamic_info[DT_ENCODING];
191 static bfd_vma dynamic_info_DT_GNU_HASH;
192 static bfd_vma version_info[16];
193 static Elf_Internal_Ehdr elf_header;
194 static Elf_Internal_Shdr * section_headers;
195 static Elf_Internal_Phdr * program_headers;
196 static Elf_Internal_Dyn *  dynamic_section;
197 static elf_section_list * symtab_shndx_list;
198 static int show_name;
199 static int do_dynamic;
200 static int do_syms;
201 static int do_dyn_syms;
202 static int do_reloc;
203 static int do_sections;
204 static int do_section_groups;
205 static int do_section_details;
206 static int do_segments;
207 static int do_unwind;
208 static int do_using_dynamic;
209 static int do_header;
210 static int do_dump;
211 static int do_version;
212 static int do_histogram;
213 static int do_debugging;
214 static int do_arch;
215 static int do_notes;
216 static int do_archive_index;
217 static int is_32bit_elf;
218 static int decompress_dumps;
219
220 struct group_list
221 {
222   struct group_list * next;
223   unsigned int section_index;
224 };
225
226 struct group
227 {
228   struct group_list * root;
229   unsigned int group_index;
230 };
231
232 static size_t group_count;
233 static struct group * section_groups;
234 static struct group ** section_headers_groups;
235
236
237 /* Flag bits indicating particular types of dump.  */
238 #define HEX_DUMP        (1 << 0)        /* The -x command line switch.  */
239 #define DISASS_DUMP     (1 << 1)        /* The -i command line switch.  */
240 #define DEBUG_DUMP      (1 << 2)        /* The -w command line switch.  */
241 #define STRING_DUMP     (1 << 3)        /* The -p command line switch.  */
242 #define RELOC_DUMP      (1 << 4)        /* The -R command line switch.  */
243
244 typedef unsigned char dump_type;
245
246 /* A linked list of the section names for which dumps were requested.  */
247 struct dump_list_entry
248 {
249   char * name;
250   dump_type type;
251   struct dump_list_entry * next;
252 };
253 static struct dump_list_entry * dump_sects_byname;
254
255 /* A dynamic array of flags indicating for which sections a dump
256    has been requested via command line switches.  */
257 static dump_type *   cmdline_dump_sects = NULL;
258 static unsigned int  num_cmdline_dump_sects = 0;
259
260 /* A dynamic array of flags indicating for which sections a dump of
261    some kind has been requested.  It is reset on a per-object file
262    basis and then initialised from the cmdline_dump_sects array,
263    the results of interpreting the -w switch, and the
264    dump_sects_byname list.  */
265 static dump_type *   dump_sects = NULL;
266 static unsigned int  num_dump_sects = 0;
267
268
269 /* How to print a vma value.  */
270 typedef enum print_mode
271 {
272   HEX,
273   DEC,
274   DEC_5,
275   UNSIGNED,
276   PREFIX_HEX,
277   FULL_HEX,
278   LONG_HEX
279 }
280 print_mode;
281
282 /* Versioned symbol info.  */
283 enum versioned_symbol_info
284 {
285   symbol_undefined,
286   symbol_hidden,
287   symbol_public
288 };
289
290 static const char *get_symbol_version_string
291   (FILE *file, int is_dynsym, const char *strtab,
292    unsigned long int strtab_size, unsigned int si,
293    Elf_Internal_Sym *psym, enum versioned_symbol_info *sym_info,
294    unsigned short *vna_other);
295
296 #define UNKNOWN -1
297
298 #define SECTION_NAME(X)                                         \
299   ((X) == NULL ? _("<none>")                                    \
300    : string_table == NULL ? _("<no-name>")                      \
301    : ((X)->sh_name >= string_table_length ? _("<corrupt>")      \
302   : string_table + (X)->sh_name))
303
304 #define DT_VERSIONTAGIDX(tag)   (DT_VERNEEDNUM - (tag)) /* Reverse order!  */
305
306 #define GET_ELF_SYMBOLS(file, section, sym_count)                       \
307   (is_32bit_elf ? get_32bit_elf_symbols (file, section, sym_count)      \
308    : get_64bit_elf_symbols (file, section, sym_count))
309
310 #define VALID_DYNAMIC_NAME(offset)      ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
311 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
312    already been called and verified that the string exists.  */
313 #define GET_DYNAMIC_NAME(offset)        (dynamic_strings + offset)
314
315 #define REMOVE_ARCH_BITS(ADDR)                  \
316   do                                            \
317     {                                           \
318       if (elf_header.e_machine == EM_ARM)       \
319         (ADDR) &= ~1;                           \
320     }                                           \
321   while (0)
322 \f
323 /* Retrieve NMEMB structures, each SIZE bytes long from FILE starting at OFFSET +
324    the offset of the current archive member, if we are examining an archive.
325    Put the retrieved data into VAR, if it is not NULL.  Otherwise allocate a buffer
326    using malloc and fill that.  In either case return the pointer to the start of
327    the retrieved data or NULL if something went wrong.  If something does go wrong
328    and REASON is not NULL then emit an error message using REASON as part of the
329    context.  */
330
331 static void *
332 get_data (void * var, FILE * file, unsigned long offset, bfd_size_type size,
333           bfd_size_type nmemb, const char * reason)
334 {
335   void * mvar;
336   bfd_size_type amt = size * nmemb;
337
338   if (size == 0 || nmemb == 0)
339     return NULL;
340
341   /* If the size_t type is smaller than the bfd_size_type, eg because
342      you are building a 32-bit tool on a 64-bit host, then make sure
343      that when the sizes are cast to (size_t) no information is lost.  */
344   if (sizeof (size_t) < sizeof (bfd_size_type)
345       && (   (bfd_size_type) ((size_t) size) != size
346           || (bfd_size_type) ((size_t) nmemb) != nmemb))
347     {
348       if (reason)
349         error (_("Size truncation prevents reading 0x%" BFD_VMA_FMT "x"
350                  " elements of size 0x%" BFD_VMA_FMT "x for %s\n"),
351                nmemb, size, reason);
352       return NULL;
353     }
354
355   /* Check for size overflow.  */
356   if (amt < nmemb)
357     {
358       if (reason)
359         error (_("Size overflow prevents reading 0x%" BFD_VMA_FMT "x"
360                  " elements of size 0x%" BFD_VMA_FMT "x for %s\n"),
361                nmemb, size, reason);
362       return NULL;
363     }
364
365   /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
366      attempting to allocate memory when the read is bound to fail.  */
367   if (amt > current_file_size
368       || offset + archive_file_offset + amt > current_file_size)
369     {
370       if (reason)
371         error (_("Reading 0x%" BFD_VMA_FMT "x"
372                  " bytes extends past end of file for %s\n"),
373                amt, reason);
374       return NULL;
375     }
376
377   if (fseek (file, archive_file_offset + offset, SEEK_SET))
378     {
379       if (reason)
380         error (_("Unable to seek to 0x%lx for %s\n"),
381                archive_file_offset + offset, reason);
382       return NULL;
383     }
384
385   mvar = var;
386   if (mvar == NULL)
387     {
388       /* Check for overflow.  */
389       if (nmemb < (~(bfd_size_type) 0 - 1) / size)
390         /* + 1 so that we can '\0' terminate invalid string table sections.  */
391         mvar = malloc ((size_t) amt + 1);
392
393       if (mvar == NULL)
394         {
395           if (reason)
396             error (_("Out of memory allocating 0x%" BFD_VMA_FMT "x"
397                      " bytes for %s\n"),
398                    amt, reason);
399           return NULL;
400         }
401
402       ((char *) mvar)[amt] = '\0';
403     }
404
405   if (fread (mvar, (size_t) size, (size_t) nmemb, file) != nmemb)
406     {
407       if (reason)
408         error (_("Unable to read in 0x%" BFD_VMA_FMT "x bytes of %s\n"),
409                amt, reason);
410       if (mvar != var)
411         free (mvar);
412       return NULL;
413     }
414
415   return mvar;
416 }
417
418 /* Print a VMA value.  */
419
420 static int
421 print_vma (bfd_vma vma, print_mode mode)
422 {
423   int nc = 0;
424
425   switch (mode)
426     {
427     case FULL_HEX:
428       nc = printf ("0x");
429       /* Drop through.  */
430
431     case LONG_HEX:
432 #ifdef BFD64
433       if (is_32bit_elf)
434         return nc + printf ("%8.8" BFD_VMA_FMT "x", vma);
435 #endif
436       printf_vma (vma);
437       return nc + 16;
438
439     case DEC_5:
440       if (vma <= 99999)
441         return printf ("%5" BFD_VMA_FMT "d", vma);
442       /* Drop through.  */
443
444     case PREFIX_HEX:
445       nc = printf ("0x");
446       /* Drop through.  */
447
448     case HEX:
449       return nc + printf ("%" BFD_VMA_FMT "x", vma);
450
451     case DEC:
452       return printf ("%" BFD_VMA_FMT "d", vma);
453
454     case UNSIGNED:
455       return printf ("%" BFD_VMA_FMT "u", vma);
456     }
457   return 0;
458 }
459
460 /* Display a symbol on stdout.  Handles the display of control characters and
461    multibye characters (assuming the host environment supports them).
462
463    Display at most abs(WIDTH) characters, truncating as necessary, unless do_wide is true.
464
465    If WIDTH is negative then ensure that the output is at least (- WIDTH) characters,
466    padding as necessary.
467
468    Returns the number of emitted characters.  */
469
470 static unsigned int
471 print_symbol (int width, const char *symbol)
472 {
473   bfd_boolean extra_padding = FALSE;
474   int num_printed = 0;
475 #ifdef HAVE_MBSTATE_T
476   mbstate_t state;
477 #endif
478   int width_remaining;
479
480   if (width < 0)
481     {
482       /* Keep the width positive.  This also helps.  */
483       width = - width;
484       extra_padding = TRUE;
485     }
486   assert (width != 0);
487
488   if (do_wide)
489     /* Set the remaining width to a very large value.
490        This simplifies the code below.  */
491     width_remaining = INT_MAX;
492   else
493     width_remaining = width;
494
495 #ifdef HAVE_MBSTATE_T
496   /* Initialise the multibyte conversion state.  */
497   memset (& state, 0, sizeof (state));
498 #endif
499
500   while (width_remaining)
501     {
502       size_t  n;
503       const char c = *symbol++;
504
505       if (c == 0)
506         break;
507
508       /* Do not print control characters directly as they can affect terminal
509          settings.  Such characters usually appear in the names generated
510          by the assembler for local labels.  */
511       if (ISCNTRL (c))
512         {
513           if (width_remaining < 2)
514             break;
515
516           printf ("^%c", c + 0x40);
517           width_remaining -= 2;
518           num_printed += 2;
519         }
520       else if (ISPRINT (c))
521         {
522           putchar (c);
523           width_remaining --;
524           num_printed ++;
525         }
526       else
527         {
528 #ifdef HAVE_MBSTATE_T
529           wchar_t w;
530 #endif
531           /* Let printf do the hard work of displaying multibyte characters.  */
532           printf ("%.1s", symbol - 1);
533           width_remaining --;
534           num_printed ++;
535
536 #ifdef HAVE_MBSTATE_T
537           /* Try to find out how many bytes made up the character that was
538              just printed.  Advance the symbol pointer past the bytes that
539              were displayed.  */
540           n = mbrtowc (& w, symbol - 1, MB_CUR_MAX, & state);
541 #else
542           n = 1;
543 #endif
544           if (n != (size_t) -1 && n != (size_t) -2 && n > 0)
545             symbol += (n - 1);
546         }
547     }
548
549   if (extra_padding && num_printed < width)
550     {
551       /* Fill in the remaining spaces.  */
552       printf ("%-*s", width - num_printed, " ");
553       num_printed = width;
554     }
555
556   return num_printed;
557 }
558
559 /* Returns a pointer to a static buffer containing a  printable version of
560    the given section's name.  Like print_symbol, except that it does not try
561    to print multibyte characters, it just interprets them as hex values.  */
562
563 static const char *
564 printable_section_name (const Elf_Internal_Shdr * sec)
565 {
566 #define MAX_PRINT_SEC_NAME_LEN 128
567   static char  sec_name_buf [MAX_PRINT_SEC_NAME_LEN + 1];
568   const char * name = SECTION_NAME (sec);
569   char *       buf = sec_name_buf;
570   char         c;
571   unsigned int remaining = MAX_PRINT_SEC_NAME_LEN;
572
573   while ((c = * name ++) != 0)
574     {
575       if (ISCNTRL (c))
576         {
577           if (remaining < 2)
578             break;
579
580           * buf ++ = '^';
581           * buf ++ = c + 0x40;
582           remaining -= 2;
583         }
584       else if (ISPRINT (c))
585         {
586           * buf ++ = c;
587           remaining -= 1;
588         }
589       else
590         {
591           static char hex[17] = "0123456789ABCDEF";
592
593           if (remaining < 4)
594             break;
595           * buf ++ = '<';
596           * buf ++ = hex[(c & 0xf0) >> 4];
597           * buf ++ = hex[c & 0x0f];
598           * buf ++ = '>';
599           remaining -= 4;
600         }
601
602       if (remaining == 0)
603         break;
604     }
605
606   * buf = 0;
607   return sec_name_buf;
608 }
609
610 static const char *
611 printable_section_name_from_index (unsigned long ndx)
612 {
613   if (ndx >= elf_header.e_shnum)
614     return _("<corrupt>");
615
616   return printable_section_name (section_headers + ndx);
617 }
618
619 /* Return a pointer to section NAME, or NULL if no such section exists.  */
620
621 static Elf_Internal_Shdr *
622 find_section (const char * name)
623 {
624   unsigned int i;
625
626   for (i = 0; i < elf_header.e_shnum; i++)
627     if (streq (SECTION_NAME (section_headers + i), name))
628       return section_headers + i;
629
630   return NULL;
631 }
632
633 /* Return a pointer to a section containing ADDR, or NULL if no such
634    section exists.  */
635
636 static Elf_Internal_Shdr *
637 find_section_by_address (bfd_vma addr)
638 {
639   unsigned int i;
640
641   for (i = 0; i < elf_header.e_shnum; i++)
642     {
643       Elf_Internal_Shdr *sec = section_headers + i;
644       if (addr >= sec->sh_addr && addr < sec->sh_addr + sec->sh_size)
645         return sec;
646     }
647
648   return NULL;
649 }
650
651 static Elf_Internal_Shdr *
652 find_section_by_type (unsigned int type)
653 {
654   unsigned int i;
655
656   for (i = 0; i < elf_header.e_shnum; i++)
657     {
658       Elf_Internal_Shdr *sec = section_headers + i;
659       if (sec->sh_type == type)
660         return sec;
661     }
662
663   return NULL;
664 }
665
666 /* Return a pointer to section NAME, or NULL if no such section exists,
667    restricted to the list of sections given in SET.  */
668
669 static Elf_Internal_Shdr *
670 find_section_in_set (const char * name, unsigned int * set)
671 {
672   unsigned int i;
673
674   if (set != NULL)
675     {
676       while ((i = *set++) > 0)
677         if (streq (SECTION_NAME (section_headers + i), name))
678           return section_headers + i;
679     }
680
681   return find_section (name);
682 }
683
684 /* Read an unsigned LEB128 encoded value from p.  Set *PLEN to the number of
685    bytes read.  */
686
687 static inline unsigned long
688 read_uleb128 (unsigned char *data,
689               unsigned int *length_return,
690               const unsigned char * const end)
691 {
692   return read_leb128 (data, length_return, FALSE, end);
693 }
694
695 /* Return true if the current file is for IA-64 machine and OpenVMS ABI.
696    This OS has so many departures from the ELF standard that we test it at
697    many places.  */
698
699 static inline int
700 is_ia64_vms (void)
701 {
702   return elf_header.e_machine == EM_IA_64
703     && elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS;
704 }
705
706 /* Guess the relocation size commonly used by the specific machines.  */
707
708 static int
709 guess_is_rela (unsigned int e_machine)
710 {
711   switch (e_machine)
712     {
713       /* Targets that use REL relocations.  */
714     case EM_386:
715     case EM_IAMCU:
716     case EM_960:
717     case EM_ARM:
718     case EM_D10V:
719     case EM_CYGNUS_D10V:
720     case EM_DLX:
721     case EM_MIPS:
722     case EM_MIPS_RS3_LE:
723     case EM_CYGNUS_M32R:
724     case EM_SCORE:
725     case EM_XGATE:
726       return FALSE;
727
728       /* Targets that use RELA relocations.  */
729     case EM_68K:
730     case EM_860:
731     case EM_AARCH64:
732     case EM_ADAPTEVA_EPIPHANY:
733     case EM_ALPHA:
734     case EM_ALTERA_NIOS2:
735     case EM_ARC:
736     case EM_ARC_COMPACT:
737     case EM_ARC_COMPACT2:
738     case EM_AVR:
739     case EM_AVR_OLD:
740     case EM_BLACKFIN:
741     case EM_CR16:
742     case EM_CRIS:
743     case EM_CRX:
744     case EM_D30V:
745     case EM_CYGNUS_D30V:
746     case EM_FR30:
747     case EM_FT32:
748     case EM_CYGNUS_FR30:
749     case EM_CYGNUS_FRV:
750     case EM_H8S:
751     case EM_H8_300:
752     case EM_H8_300H:
753     case EM_IA_64:
754     case EM_IP2K:
755     case EM_IP2K_OLD:
756     case EM_IQ2000:
757     case EM_LATTICEMICO32:
758     case EM_M32C_OLD:
759     case EM_M32C:
760     case EM_M32R:
761     case EM_MCORE:
762     case EM_CYGNUS_MEP:
763     case EM_METAG:
764     case EM_MMIX:
765     case EM_MN10200:
766     case EM_CYGNUS_MN10200:
767     case EM_MN10300:
768     case EM_CYGNUS_MN10300:
769     case EM_MOXIE:
770     case EM_MSP430:
771     case EM_MSP430_OLD:
772     case EM_MT:
773     case EM_NDS32:
774     case EM_NIOS32:
775     case EM_OR1K:
776     case EM_PPC64:
777     case EM_PPC:
778     case EM_RL78:
779     case EM_RX:
780     case EM_S390:
781     case EM_S390_OLD:
782     case EM_SH:
783     case EM_SPARC:
784     case EM_SPARC32PLUS:
785     case EM_SPARCV9:
786     case EM_SPU:
787     case EM_TI_C6000:
788     case EM_TILEGX:
789     case EM_TILEPRO:
790     case EM_V800:
791     case EM_V850:
792     case EM_CYGNUS_V850:
793     case EM_VAX:
794     case EM_VISIUM:
795     case EM_X86_64:
796     case EM_L1OM:
797     case EM_K1OM:
798     case EM_XSTORMY16:
799     case EM_XTENSA:
800     case EM_XTENSA_OLD:
801     case EM_MICROBLAZE:
802     case EM_MICROBLAZE_OLD:
803       return TRUE;
804
805     case EM_68HC05:
806     case EM_68HC08:
807     case EM_68HC11:
808     case EM_68HC16:
809     case EM_FX66:
810     case EM_ME16:
811     case EM_MMA:
812     case EM_NCPU:
813     case EM_NDR1:
814     case EM_PCP:
815     case EM_ST100:
816     case EM_ST19:
817     case EM_ST7:
818     case EM_ST9PLUS:
819     case EM_STARCORE:
820     case EM_SVX:
821     case EM_TINYJ:
822     default:
823       warn (_("Don't know about relocations on this machine architecture\n"));
824       return FALSE;
825     }
826 }
827
828 static int
829 slurp_rela_relocs (FILE * file,
830                    unsigned long rel_offset,
831                    unsigned long rel_size,
832                    Elf_Internal_Rela ** relasp,
833                    unsigned long * nrelasp)
834 {
835   Elf_Internal_Rela * relas;
836   size_t nrelas;
837   unsigned int i;
838
839   if (is_32bit_elf)
840     {
841       Elf32_External_Rela * erelas;
842
843       erelas = (Elf32_External_Rela *) get_data (NULL, file, rel_offset, 1,
844                                                  rel_size, _("32-bit relocation data"));
845       if (!erelas)
846         return 0;
847
848       nrelas = rel_size / sizeof (Elf32_External_Rela);
849
850       relas = (Elf_Internal_Rela *) cmalloc (nrelas,
851                                              sizeof (Elf_Internal_Rela));
852
853       if (relas == NULL)
854         {
855           free (erelas);
856           error (_("out of memory parsing relocs\n"));
857           return 0;
858         }
859
860       for (i = 0; i < nrelas; i++)
861         {
862           relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
863           relas[i].r_info   = BYTE_GET (erelas[i].r_info);
864           relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
865         }
866
867       free (erelas);
868     }
869   else
870     {
871       Elf64_External_Rela * erelas;
872
873       erelas = (Elf64_External_Rela *) get_data (NULL, file, rel_offset, 1,
874                                                  rel_size, _("64-bit relocation data"));
875       if (!erelas)
876         return 0;
877
878       nrelas = rel_size / sizeof (Elf64_External_Rela);
879
880       relas = (Elf_Internal_Rela *) cmalloc (nrelas,
881                                              sizeof (Elf_Internal_Rela));
882
883       if (relas == NULL)
884         {
885           free (erelas);
886           error (_("out of memory parsing relocs\n"));
887           return 0;
888         }
889
890       for (i = 0; i < nrelas; i++)
891         {
892           relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
893           relas[i].r_info   = BYTE_GET (erelas[i].r_info);
894           relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
895
896           /* The #ifdef BFD64 below is to prevent a compile time
897              warning.  We know that if we do not have a 64 bit data
898              type that we will never execute this code anyway.  */
899 #ifdef BFD64
900           if (elf_header.e_machine == EM_MIPS
901               && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
902             {
903               /* In little-endian objects, r_info isn't really a
904                  64-bit little-endian value: it has a 32-bit
905                  little-endian symbol index followed by four
906                  individual byte fields.  Reorder INFO
907                  accordingly.  */
908               bfd_vma inf = relas[i].r_info;
909               inf = (((inf & 0xffffffff) << 32)
910                       | ((inf >> 56) & 0xff)
911                       | ((inf >> 40) & 0xff00)
912                       | ((inf >> 24) & 0xff0000)
913                       | ((inf >> 8) & 0xff000000));
914               relas[i].r_info = inf;
915             }
916 #endif /* BFD64 */
917         }
918
919       free (erelas);
920     }
921   *relasp = relas;
922   *nrelasp = nrelas;
923   return 1;
924 }
925
926 static int
927 slurp_rel_relocs (FILE * file,
928                   unsigned long rel_offset,
929                   unsigned long rel_size,
930                   Elf_Internal_Rela ** relsp,
931                   unsigned long * nrelsp)
932 {
933   Elf_Internal_Rela * rels;
934   size_t nrels;
935   unsigned int i;
936
937   if (is_32bit_elf)
938     {
939       Elf32_External_Rel * erels;
940
941       erels = (Elf32_External_Rel *) get_data (NULL, file, rel_offset, 1,
942                                                rel_size, _("32-bit relocation data"));
943       if (!erels)
944         return 0;
945
946       nrels = rel_size / sizeof (Elf32_External_Rel);
947
948       rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
949
950       if (rels == NULL)
951         {
952           free (erels);
953           error (_("out of memory parsing relocs\n"));
954           return 0;
955         }
956
957       for (i = 0; i < nrels; i++)
958         {
959           rels[i].r_offset = BYTE_GET (erels[i].r_offset);
960           rels[i].r_info   = BYTE_GET (erels[i].r_info);
961           rels[i].r_addend = 0;
962         }
963
964       free (erels);
965     }
966   else
967     {
968       Elf64_External_Rel * erels;
969
970       erels = (Elf64_External_Rel *) get_data (NULL, file, rel_offset, 1,
971                                                rel_size, _("64-bit relocation data"));
972       if (!erels)
973         return 0;
974
975       nrels = rel_size / sizeof (Elf64_External_Rel);
976
977       rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
978
979       if (rels == NULL)
980         {
981           free (erels);
982           error (_("out of memory parsing relocs\n"));
983           return 0;
984         }
985
986       for (i = 0; i < nrels; i++)
987         {
988           rels[i].r_offset = BYTE_GET (erels[i].r_offset);
989           rels[i].r_info   = BYTE_GET (erels[i].r_info);
990           rels[i].r_addend = 0;
991
992           /* The #ifdef BFD64 below is to prevent a compile time
993              warning.  We know that if we do not have a 64 bit data
994              type that we will never execute this code anyway.  */
995 #ifdef BFD64
996           if (elf_header.e_machine == EM_MIPS
997               && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
998             {
999               /* In little-endian objects, r_info isn't really a
1000                  64-bit little-endian value: it has a 32-bit
1001                  little-endian symbol index followed by four
1002                  individual byte fields.  Reorder INFO
1003                  accordingly.  */
1004               bfd_vma inf = rels[i].r_info;
1005               inf = (((inf & 0xffffffff) << 32)
1006                      | ((inf >> 56) & 0xff)
1007                      | ((inf >> 40) & 0xff00)
1008                      | ((inf >> 24) & 0xff0000)
1009                      | ((inf >> 8) & 0xff000000));
1010               rels[i].r_info = inf;
1011             }
1012 #endif /* BFD64 */
1013         }
1014
1015       free (erels);
1016     }
1017   *relsp = rels;
1018   *nrelsp = nrels;
1019   return 1;
1020 }
1021
1022 /* Returns the reloc type extracted from the reloc info field.  */
1023
1024 static unsigned int
1025 get_reloc_type (bfd_vma reloc_info)
1026 {
1027   if (is_32bit_elf)
1028     return ELF32_R_TYPE (reloc_info);
1029
1030   switch (elf_header.e_machine)
1031     {
1032     case EM_MIPS:
1033       /* Note: We assume that reloc_info has already been adjusted for us.  */
1034       return ELF64_MIPS_R_TYPE (reloc_info);
1035
1036     case EM_SPARCV9:
1037       return ELF64_R_TYPE_ID (reloc_info);
1038
1039     default:
1040       return ELF64_R_TYPE (reloc_info);
1041     }
1042 }
1043
1044 /* Return the symbol index extracted from the reloc info field.  */
1045
1046 static bfd_vma
1047 get_reloc_symindex (bfd_vma reloc_info)
1048 {
1049   return is_32bit_elf ? ELF32_R_SYM (reloc_info) : ELF64_R_SYM (reloc_info);
1050 }
1051
1052 static inline bfd_boolean
1053 uses_msp430x_relocs (void)
1054 {
1055   return
1056     elf_header.e_machine == EM_MSP430 /* Paranoia.  */
1057     /* GCC uses osabi == ELFOSBI_STANDALONE.  */
1058     && (((elf_header.e_flags & EF_MSP430_MACH) == E_MSP430_MACH_MSP430X)
1059         /* TI compiler uses ELFOSABI_NONE.  */
1060         || (elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE));
1061 }
1062
1063 /* Display the contents of the relocation data found at the specified
1064    offset.  */
1065
1066 static void
1067 dump_relocations (FILE * file,
1068                   unsigned long rel_offset,
1069                   unsigned long rel_size,
1070                   Elf_Internal_Sym * symtab,
1071                   unsigned long nsyms,
1072                   char * strtab,
1073                   unsigned long strtablen,
1074                   int is_rela,
1075                   int is_dynsym)
1076 {
1077   unsigned int i;
1078   Elf_Internal_Rela * rels;
1079
1080   if (is_rela == UNKNOWN)
1081     is_rela = guess_is_rela (elf_header.e_machine);
1082
1083   if (is_rela)
1084     {
1085       if (!slurp_rela_relocs (file, rel_offset, rel_size, &rels, &rel_size))
1086         return;
1087     }
1088   else
1089     {
1090       if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
1091         return;
1092     }
1093
1094   if (is_32bit_elf)
1095     {
1096       if (is_rela)
1097         {
1098           if (do_wide)
1099             printf (_(" Offset     Info    Type                Sym. Value  Symbol's Name + Addend\n"));
1100           else
1101             printf (_(" Offset     Info    Type            Sym.Value  Sym. Name + Addend\n"));
1102         }
1103       else
1104         {
1105           if (do_wide)
1106             printf (_(" Offset     Info    Type                Sym. Value  Symbol's Name\n"));
1107           else
1108             printf (_(" Offset     Info    Type            Sym.Value  Sym. Name\n"));
1109         }
1110     }
1111   else
1112     {
1113       if (is_rela)
1114         {
1115           if (do_wide)
1116             printf (_("    Offset             Info             Type               Symbol's Value  Symbol's Name + Addend\n"));
1117           else
1118             printf (_("  Offset          Info           Type           Sym. Value    Sym. Name + Addend\n"));
1119         }
1120       else
1121         {
1122           if (do_wide)
1123             printf (_("    Offset             Info             Type               Symbol's Value  Symbol's Name\n"));
1124           else
1125             printf (_("  Offset          Info           Type           Sym. Value    Sym. Name\n"));
1126         }
1127     }
1128
1129   for (i = 0; i < rel_size; i++)
1130     {
1131       const char * rtype;
1132       bfd_vma offset;
1133       bfd_vma inf;
1134       bfd_vma symtab_index;
1135       bfd_vma type;
1136
1137       offset = rels[i].r_offset;
1138       inf    = rels[i].r_info;
1139
1140       type = get_reloc_type (inf);
1141       symtab_index = get_reloc_symindex  (inf);
1142
1143       if (is_32bit_elf)
1144         {
1145           printf ("%8.8lx  %8.8lx ",
1146                   (unsigned long) offset & 0xffffffff,
1147                   (unsigned long) inf & 0xffffffff);
1148         }
1149       else
1150         {
1151 #if BFD_HOST_64BIT_LONG
1152           printf (do_wide
1153                   ? "%16.16lx  %16.16lx "
1154                   : "%12.12lx  %12.12lx ",
1155                   offset, inf);
1156 #elif BFD_HOST_64BIT_LONG_LONG
1157 #ifndef __MSVCRT__
1158           printf (do_wide
1159                   ? "%16.16llx  %16.16llx "
1160                   : "%12.12llx  %12.12llx ",
1161                   offset, inf);
1162 #else
1163           printf (do_wide
1164                   ? "%16.16I64x  %16.16I64x "
1165                   : "%12.12I64x  %12.12I64x ",
1166                   offset, inf);
1167 #endif
1168 #else
1169           printf (do_wide
1170                   ? "%8.8lx%8.8lx  %8.8lx%8.8lx "
1171                   : "%4.4lx%8.8lx  %4.4lx%8.8lx ",
1172                   _bfd_int64_high (offset),
1173                   _bfd_int64_low (offset),
1174                   _bfd_int64_high (inf),
1175                   _bfd_int64_low (inf));
1176 #endif
1177         }
1178
1179       switch (elf_header.e_machine)
1180         {
1181         default:
1182           rtype = NULL;
1183           break;
1184
1185         case EM_AARCH64:
1186           rtype = elf_aarch64_reloc_type (type);
1187           break;
1188
1189         case EM_M32R:
1190         case EM_CYGNUS_M32R:
1191           rtype = elf_m32r_reloc_type (type);
1192           break;
1193
1194         case EM_386:
1195         case EM_IAMCU:
1196           rtype = elf_i386_reloc_type (type);
1197           break;
1198
1199         case EM_68HC11:
1200         case EM_68HC12:
1201           rtype = elf_m68hc11_reloc_type (type);
1202           break;
1203
1204         case EM_68K:
1205           rtype = elf_m68k_reloc_type (type);
1206           break;
1207
1208         case EM_960:
1209           rtype = elf_i960_reloc_type (type);
1210           break;
1211
1212         case EM_AVR:
1213         case EM_AVR_OLD:
1214           rtype = elf_avr_reloc_type (type);
1215           break;
1216
1217         case EM_OLD_SPARCV9:
1218         case EM_SPARC32PLUS:
1219         case EM_SPARCV9:
1220         case EM_SPARC:
1221           rtype = elf_sparc_reloc_type (type);
1222           break;
1223
1224         case EM_SPU:
1225           rtype = elf_spu_reloc_type (type);
1226           break;
1227
1228         case EM_V800:
1229           rtype = v800_reloc_type (type);
1230           break;
1231         case EM_V850:
1232         case EM_CYGNUS_V850:
1233           rtype = v850_reloc_type (type);
1234           break;
1235
1236         case EM_D10V:
1237         case EM_CYGNUS_D10V:
1238           rtype = elf_d10v_reloc_type (type);
1239           break;
1240
1241         case EM_D30V:
1242         case EM_CYGNUS_D30V:
1243           rtype = elf_d30v_reloc_type (type);
1244           break;
1245
1246         case EM_DLX:
1247           rtype = elf_dlx_reloc_type (type);
1248           break;
1249
1250         case EM_SH:
1251           rtype = elf_sh_reloc_type (type);
1252           break;
1253
1254         case EM_MN10300:
1255         case EM_CYGNUS_MN10300:
1256           rtype = elf_mn10300_reloc_type (type);
1257           break;
1258
1259         case EM_MN10200:
1260         case EM_CYGNUS_MN10200:
1261           rtype = elf_mn10200_reloc_type (type);
1262           break;
1263
1264         case EM_FR30:
1265         case EM_CYGNUS_FR30:
1266           rtype = elf_fr30_reloc_type (type);
1267           break;
1268
1269         case EM_CYGNUS_FRV:
1270           rtype = elf_frv_reloc_type (type);
1271           break;
1272
1273         case EM_FT32:
1274           rtype = elf_ft32_reloc_type (type);
1275           break;
1276
1277         case EM_MCORE:
1278           rtype = elf_mcore_reloc_type (type);
1279           break;
1280
1281         case EM_MMIX:
1282           rtype = elf_mmix_reloc_type (type);
1283           break;
1284
1285         case EM_MOXIE:
1286           rtype = elf_moxie_reloc_type (type);
1287           break;
1288
1289         case EM_MSP430:
1290           if (uses_msp430x_relocs ())
1291             {
1292               rtype = elf_msp430x_reloc_type (type);
1293               break;
1294             }
1295         case EM_MSP430_OLD:
1296           rtype = elf_msp430_reloc_type (type);
1297           break;
1298
1299         case EM_NDS32:
1300           rtype = elf_nds32_reloc_type (type);
1301           break;
1302
1303         case EM_PPC:
1304           rtype = elf_ppc_reloc_type (type);
1305           break;
1306
1307         case EM_PPC64:
1308           rtype = elf_ppc64_reloc_type (type);
1309           break;
1310
1311         case EM_MIPS:
1312         case EM_MIPS_RS3_LE:
1313           rtype = elf_mips_reloc_type (type);
1314           break;
1315
1316         case EM_ALPHA:
1317           rtype = elf_alpha_reloc_type (type);
1318           break;
1319
1320         case EM_ARM:
1321           rtype = elf_arm_reloc_type (type);
1322           break;
1323
1324         case EM_ARC:
1325         case EM_ARC_COMPACT:
1326         case EM_ARC_COMPACT2:
1327           rtype = elf_arc_reloc_type (type);
1328           break;
1329
1330         case EM_PARISC:
1331           rtype = elf_hppa_reloc_type (type);
1332           break;
1333
1334         case EM_H8_300:
1335         case EM_H8_300H:
1336         case EM_H8S:
1337           rtype = elf_h8_reloc_type (type);
1338           break;
1339
1340         case EM_OR1K:
1341           rtype = elf_or1k_reloc_type (type);
1342           break;
1343
1344         case EM_PJ:
1345         case EM_PJ_OLD:
1346           rtype = elf_pj_reloc_type (type);
1347           break;
1348         case EM_IA_64:
1349           rtype = elf_ia64_reloc_type (type);
1350           break;
1351
1352         case EM_CRIS:
1353           rtype = elf_cris_reloc_type (type);
1354           break;
1355
1356         case EM_860:
1357           rtype = elf_i860_reloc_type (type);
1358           break;
1359
1360         case EM_X86_64:
1361         case EM_L1OM:
1362         case EM_K1OM:
1363           rtype = elf_x86_64_reloc_type (type);
1364           break;
1365
1366         case EM_S370:
1367           rtype = i370_reloc_type (type);
1368           break;
1369
1370         case EM_S390_OLD:
1371         case EM_S390:
1372           rtype = elf_s390_reloc_type (type);
1373           break;
1374
1375         case EM_SCORE:
1376           rtype = elf_score_reloc_type (type);
1377           break;
1378
1379         case EM_XSTORMY16:
1380           rtype = elf_xstormy16_reloc_type (type);
1381           break;
1382
1383         case EM_CRX:
1384           rtype = elf_crx_reloc_type (type);
1385           break;
1386
1387         case EM_VAX:
1388           rtype = elf_vax_reloc_type (type);
1389           break;
1390
1391         case EM_VISIUM:
1392           rtype = elf_visium_reloc_type (type);
1393           break;
1394
1395         case EM_ADAPTEVA_EPIPHANY:
1396           rtype = elf_epiphany_reloc_type (type);
1397           break;
1398
1399         case EM_IP2K:
1400         case EM_IP2K_OLD:
1401           rtype = elf_ip2k_reloc_type (type);
1402           break;
1403
1404         case EM_IQ2000:
1405           rtype = elf_iq2000_reloc_type (type);
1406           break;
1407
1408         case EM_XTENSA_OLD:
1409         case EM_XTENSA:
1410           rtype = elf_xtensa_reloc_type (type);
1411           break;
1412
1413         case EM_LATTICEMICO32:
1414           rtype = elf_lm32_reloc_type (type);
1415           break;
1416
1417         case EM_M32C_OLD:
1418         case EM_M32C:
1419           rtype = elf_m32c_reloc_type (type);
1420           break;
1421
1422         case EM_MT:
1423           rtype = elf_mt_reloc_type (type);
1424           break;
1425
1426         case EM_BLACKFIN:
1427           rtype = elf_bfin_reloc_type (type);
1428           break;
1429
1430         case EM_CYGNUS_MEP:
1431           rtype = elf_mep_reloc_type (type);
1432           break;
1433
1434         case EM_CR16:
1435           rtype = elf_cr16_reloc_type (type);
1436           break;
1437
1438         case EM_MICROBLAZE:
1439         case EM_MICROBLAZE_OLD:
1440           rtype = elf_microblaze_reloc_type (type);
1441           break;
1442
1443         case EM_RL78:
1444           rtype = elf_rl78_reloc_type (type);
1445           break;
1446
1447         case EM_RX:
1448           rtype = elf_rx_reloc_type (type);
1449           break;
1450
1451         case EM_METAG:
1452           rtype = elf_metag_reloc_type (type);
1453           break;
1454
1455         case EM_XC16X:
1456         case EM_C166:
1457           rtype = elf_xc16x_reloc_type (type);
1458           break;
1459
1460         case EM_TI_C6000:
1461           rtype = elf_tic6x_reloc_type (type);
1462           break;
1463
1464         case EM_TILEGX:
1465           rtype = elf_tilegx_reloc_type (type);
1466           break;
1467
1468         case EM_TILEPRO:
1469           rtype = elf_tilepro_reloc_type (type);
1470           break;
1471
1472         case EM_XGATE:
1473           rtype = elf_xgate_reloc_type (type);
1474           break;
1475
1476         case EM_ALTERA_NIOS2:
1477           rtype = elf_nios2_reloc_type (type);
1478           break;
1479         }
1480
1481       if (rtype == NULL)
1482         printf (_("unrecognized: %-7lx"), (unsigned long) type & 0xffffffff);
1483       else
1484         printf (do_wide ? "%-22.22s" : "%-17.17s", rtype);
1485
1486       if (elf_header.e_machine == EM_ALPHA
1487           && rtype != NULL
1488           && streq (rtype, "R_ALPHA_LITUSE")
1489           && is_rela)
1490         {
1491           switch (rels[i].r_addend)
1492             {
1493             case LITUSE_ALPHA_ADDR:   rtype = "ADDR";   break;
1494             case LITUSE_ALPHA_BASE:   rtype = "BASE";   break;
1495             case LITUSE_ALPHA_BYTOFF: rtype = "BYTOFF"; break;
1496             case LITUSE_ALPHA_JSR:    rtype = "JSR";    break;
1497             case LITUSE_ALPHA_TLSGD:  rtype = "TLSGD";  break;
1498             case LITUSE_ALPHA_TLSLDM: rtype = "TLSLDM"; break;
1499             case LITUSE_ALPHA_JSRDIRECT: rtype = "JSRDIRECT"; break;
1500             default: rtype = NULL;
1501             }
1502           if (rtype)
1503             printf (" (%s)", rtype);
1504           else
1505             {
1506               putchar (' ');
1507               printf (_("<unknown addend: %lx>"),
1508                       (unsigned long) rels[i].r_addend);
1509             }
1510         }
1511       else if (symtab_index)
1512         {
1513           if (symtab == NULL || symtab_index >= nsyms)
1514             printf (_(" bad symbol index: %08lx"), (unsigned long) symtab_index);
1515           else
1516             {
1517               Elf_Internal_Sym * psym;
1518               const char * version_string;
1519               enum versioned_symbol_info sym_info;
1520               unsigned short vna_other;
1521
1522               psym = symtab + symtab_index;
1523
1524               version_string
1525                 = get_symbol_version_string (file, is_dynsym,
1526                                              strtab, strtablen,
1527                                              symtab_index,
1528                                              psym,
1529                                              &sym_info,
1530                                              &vna_other);
1531
1532               printf (" ");
1533
1534               if (ELF_ST_TYPE (psym->st_info) == STT_GNU_IFUNC)
1535                 {
1536                   const char * name;
1537                   unsigned int len;
1538                   unsigned int width = is_32bit_elf ? 8 : 14;
1539
1540                   /* Relocations against GNU_IFUNC symbols do not use the value
1541                      of the symbol as the address to relocate against.  Instead
1542                      they invoke the function named by the symbol and use its
1543                      result as the address for relocation.
1544
1545                      To indicate this to the user, do not display the value of
1546                      the symbol in the "Symbols's Value" field.  Instead show
1547                      its name followed by () as a hint that the symbol is
1548                      invoked.  */
1549
1550                   if (strtab == NULL
1551                       || psym->st_name == 0
1552                       || psym->st_name >= strtablen)
1553                     name = "??";
1554                   else
1555                     name = strtab + psym->st_name;
1556
1557                   len = print_symbol (width, name);
1558                   if (version_string)
1559                     printf (sym_info == symbol_public ? "@@%s" : "@%s",
1560                             version_string);
1561                   printf ("()%-*s", len <= width ? (width + 1) - len : 1, " ");
1562                 }
1563               else
1564                 {
1565                   print_vma (psym->st_value, LONG_HEX);
1566
1567                   printf (is_32bit_elf ? "   " : " ");
1568                 }
1569
1570               if (psym->st_name == 0)
1571                 {
1572                   const char * sec_name = "<null>";
1573                   char name_buf[40];
1574
1575                   if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1576                     {
1577                       if (psym->st_shndx < elf_header.e_shnum)
1578                         sec_name = SECTION_NAME (section_headers + psym->st_shndx);
1579                       else if (psym->st_shndx == SHN_ABS)
1580                         sec_name = "ABS";
1581                       else if (psym->st_shndx == SHN_COMMON)
1582                         sec_name = "COMMON";
1583                       else if ((elf_header.e_machine == EM_MIPS
1584                                 && psym->st_shndx == SHN_MIPS_SCOMMON)
1585                                || (elf_header.e_machine == EM_TI_C6000
1586                                    && psym->st_shndx == SHN_TIC6X_SCOMMON))
1587                         sec_name = "SCOMMON";
1588                       else if (elf_header.e_machine == EM_MIPS
1589                                && psym->st_shndx == SHN_MIPS_SUNDEFINED)
1590                         sec_name = "SUNDEF";
1591                       else if ((elf_header.e_machine == EM_X86_64
1592                                 || elf_header.e_machine == EM_L1OM
1593                                 || elf_header.e_machine == EM_K1OM)
1594                                && psym->st_shndx == SHN_X86_64_LCOMMON)
1595                         sec_name = "LARGE_COMMON";
1596                       else if (elf_header.e_machine == EM_IA_64
1597                                && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
1598                                && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1599                         sec_name = "ANSI_COM";
1600                       else if (is_ia64_vms ()
1601                                && psym->st_shndx == SHN_IA_64_VMS_SYMVEC)
1602                         sec_name = "VMS_SYMVEC";
1603                       else
1604                         {
1605                           sprintf (name_buf, "<section 0x%x>",
1606                                    (unsigned int) psym->st_shndx);
1607                           sec_name = name_buf;
1608                         }
1609                     }
1610                   print_symbol (22, sec_name);
1611                 }
1612               else if (strtab == NULL)
1613                 printf (_("<string table index: %3ld>"), psym->st_name);
1614               else if (psym->st_name >= strtablen)
1615                 printf (_("<corrupt string table index: %3ld>"), psym->st_name);
1616               else
1617                 {
1618                   print_symbol (22, strtab + psym->st_name);
1619                   if (version_string)
1620                     printf (sym_info == symbol_public ? "@@%s" : "@%s",
1621                             version_string);
1622                 }
1623
1624               if (is_rela)
1625                 {
1626                   bfd_vma off = rels[i].r_addend;
1627
1628                   if ((bfd_signed_vma) off < 0)
1629                     printf (" - %" BFD_VMA_FMT "x", - off);
1630                   else
1631                     printf (" + %" BFD_VMA_FMT "x", off);
1632                 }
1633             }
1634         }
1635       else if (is_rela)
1636         {
1637           bfd_vma off = rels[i].r_addend;
1638
1639           printf ("%*c", is_32bit_elf ? 12 : 20, ' ');
1640           if ((bfd_signed_vma) off < 0)
1641             printf ("-%" BFD_VMA_FMT "x", - off);
1642           else
1643             printf ("%" BFD_VMA_FMT "x", off);
1644         }
1645
1646       if (elf_header.e_machine == EM_SPARCV9
1647           && rtype != NULL
1648           && streq (rtype, "R_SPARC_OLO10"))
1649         printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf));
1650
1651       putchar ('\n');
1652
1653 #ifdef BFD64
1654       if (! is_32bit_elf && elf_header.e_machine == EM_MIPS)
1655         {
1656           bfd_vma type2 = ELF64_MIPS_R_TYPE2 (inf);
1657           bfd_vma type3 = ELF64_MIPS_R_TYPE3 (inf);
1658           const char * rtype2 = elf_mips_reloc_type (type2);
1659           const char * rtype3 = elf_mips_reloc_type (type3);
1660
1661           printf ("                    Type2: ");
1662
1663           if (rtype2 == NULL)
1664             printf (_("unrecognized: %-7lx"),
1665                     (unsigned long) type2 & 0xffffffff);
1666           else
1667             printf ("%-17.17s", rtype2);
1668
1669           printf ("\n                    Type3: ");
1670
1671           if (rtype3 == NULL)
1672             printf (_("unrecognized: %-7lx"),
1673                     (unsigned long) type3 & 0xffffffff);
1674           else
1675             printf ("%-17.17s", rtype3);
1676
1677           putchar ('\n');
1678         }
1679 #endif /* BFD64 */
1680     }
1681
1682   free (rels);
1683 }
1684
1685 static const char *
1686 get_mips_dynamic_type (unsigned long type)
1687 {
1688   switch (type)
1689     {
1690     case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1691     case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1692     case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1693     case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1694     case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1695     case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1696     case DT_MIPS_MSYM: return "MIPS_MSYM";
1697     case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1698     case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1699     case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1700     case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1701     case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1702     case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1703     case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1704     case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1705     case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1706     case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1707     case DT_MIPS_RLD_MAP_REL: return "MIPS_RLD_MAP_REL";
1708     case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1709     case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1710     case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1711     case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1712     case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1713     case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1714     case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1715     case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1716     case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1717     case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1718     case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1719     case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1720     case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1721     case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1722     case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1723     case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1724     case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1725     case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1726     case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1727     case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1728     case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1729     case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1730     case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1731     case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1732     case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1733     case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1734     case DT_MIPS_PLTGOT: return "MIPS_PLTGOT";
1735     case DT_MIPS_RWPLT: return "MIPS_RWPLT";
1736     default:
1737       return NULL;
1738     }
1739 }
1740
1741 static const char *
1742 get_sparc64_dynamic_type (unsigned long type)
1743 {
1744   switch (type)
1745     {
1746     case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1747     default:
1748       return NULL;
1749     }
1750 }
1751
1752 static const char *
1753 get_ppc_dynamic_type (unsigned long type)
1754 {
1755   switch (type)
1756     {
1757     case DT_PPC_GOT:    return "PPC_GOT";
1758     case DT_PPC_OPT:    return "PPC_OPT";
1759     default:
1760       return NULL;
1761     }
1762 }
1763
1764 static const char *
1765 get_ppc64_dynamic_type (unsigned long type)
1766 {
1767   switch (type)
1768     {
1769     case DT_PPC64_GLINK:  return "PPC64_GLINK";
1770     case DT_PPC64_OPD:    return "PPC64_OPD";
1771     case DT_PPC64_OPDSZ:  return "PPC64_OPDSZ";
1772     case DT_PPC64_OPT:    return "PPC64_OPT";
1773     default:
1774       return NULL;
1775     }
1776 }
1777
1778 static const char *
1779 get_parisc_dynamic_type (unsigned long type)
1780 {
1781   switch (type)
1782     {
1783     case DT_HP_LOAD_MAP:        return "HP_LOAD_MAP";
1784     case DT_HP_DLD_FLAGS:       return "HP_DLD_FLAGS";
1785     case DT_HP_DLD_HOOK:        return "HP_DLD_HOOK";
1786     case DT_HP_UX10_INIT:       return "HP_UX10_INIT";
1787     case DT_HP_UX10_INITSZ:     return "HP_UX10_INITSZ";
1788     case DT_HP_PREINIT:         return "HP_PREINIT";
1789     case DT_HP_PREINITSZ:       return "HP_PREINITSZ";
1790     case DT_HP_NEEDED:          return "HP_NEEDED";
1791     case DT_HP_TIME_STAMP:      return "HP_TIME_STAMP";
1792     case DT_HP_CHECKSUM:        return "HP_CHECKSUM";
1793     case DT_HP_GST_SIZE:        return "HP_GST_SIZE";
1794     case DT_HP_GST_VERSION:     return "HP_GST_VERSION";
1795     case DT_HP_GST_HASHVAL:     return "HP_GST_HASHVAL";
1796     case DT_HP_EPLTREL:         return "HP_GST_EPLTREL";
1797     case DT_HP_EPLTRELSZ:       return "HP_GST_EPLTRELSZ";
1798     case DT_HP_FILTERED:        return "HP_FILTERED";
1799     case DT_HP_FILTER_TLS:      return "HP_FILTER_TLS";
1800     case DT_HP_COMPAT_FILTERED: return "HP_COMPAT_FILTERED";
1801     case DT_HP_LAZYLOAD:        return "HP_LAZYLOAD";
1802     case DT_HP_BIND_NOW_COUNT:  return "HP_BIND_NOW_COUNT";
1803     case DT_PLT:                return "PLT";
1804     case DT_PLT_SIZE:           return "PLT_SIZE";
1805     case DT_DLT:                return "DLT";
1806     case DT_DLT_SIZE:           return "DLT_SIZE";
1807     default:
1808       return NULL;
1809     }
1810 }
1811
1812 static const char *
1813 get_ia64_dynamic_type (unsigned long type)
1814 {
1815   switch (type)
1816     {
1817     case DT_IA_64_PLT_RESERVE:         return "IA_64_PLT_RESERVE";
1818     case DT_IA_64_VMS_SUBTYPE:         return "VMS_SUBTYPE";
1819     case DT_IA_64_VMS_IMGIOCNT:        return "VMS_IMGIOCNT";
1820     case DT_IA_64_VMS_LNKFLAGS:        return "VMS_LNKFLAGS";
1821     case DT_IA_64_VMS_VIR_MEM_BLK_SIZ: return "VMS_VIR_MEM_BLK_SIZ";
1822     case DT_IA_64_VMS_IDENT:           return "VMS_IDENT";
1823     case DT_IA_64_VMS_NEEDED_IDENT:    return "VMS_NEEDED_IDENT";
1824     case DT_IA_64_VMS_IMG_RELA_CNT:    return "VMS_IMG_RELA_CNT";
1825     case DT_IA_64_VMS_SEG_RELA_CNT:    return "VMS_SEG_RELA_CNT";
1826     case DT_IA_64_VMS_FIXUP_RELA_CNT:  return "VMS_FIXUP_RELA_CNT";
1827     case DT_IA_64_VMS_FIXUP_NEEDED:    return "VMS_FIXUP_NEEDED";
1828     case DT_IA_64_VMS_SYMVEC_CNT:      return "VMS_SYMVEC_CNT";
1829     case DT_IA_64_VMS_XLATED:          return "VMS_XLATED";
1830     case DT_IA_64_VMS_STACKSIZE:       return "VMS_STACKSIZE";
1831     case DT_IA_64_VMS_UNWINDSZ:        return "VMS_UNWINDSZ";
1832     case DT_IA_64_VMS_UNWIND_CODSEG:   return "VMS_UNWIND_CODSEG";
1833     case DT_IA_64_VMS_UNWIND_INFOSEG:  return "VMS_UNWIND_INFOSEG";
1834     case DT_IA_64_VMS_LINKTIME:        return "VMS_LINKTIME";
1835     case DT_IA_64_VMS_SEG_NO:          return "VMS_SEG_NO";
1836     case DT_IA_64_VMS_SYMVEC_OFFSET:   return "VMS_SYMVEC_OFFSET";
1837     case DT_IA_64_VMS_SYMVEC_SEG:      return "VMS_SYMVEC_SEG";
1838     case DT_IA_64_VMS_UNWIND_OFFSET:   return "VMS_UNWIND_OFFSET";
1839     case DT_IA_64_VMS_UNWIND_SEG:      return "VMS_UNWIND_SEG";
1840     case DT_IA_64_VMS_STRTAB_OFFSET:   return "VMS_STRTAB_OFFSET";
1841     case DT_IA_64_VMS_SYSVER_OFFSET:   return "VMS_SYSVER_OFFSET";
1842     case DT_IA_64_VMS_IMG_RELA_OFF:    return "VMS_IMG_RELA_OFF";
1843     case DT_IA_64_VMS_SEG_RELA_OFF:    return "VMS_SEG_RELA_OFF";
1844     case DT_IA_64_VMS_FIXUP_RELA_OFF:  return "VMS_FIXUP_RELA_OFF";
1845     case DT_IA_64_VMS_PLTGOT_OFFSET:   return "VMS_PLTGOT_OFFSET";
1846     case DT_IA_64_VMS_PLTGOT_SEG:      return "VMS_PLTGOT_SEG";
1847     case DT_IA_64_VMS_FPMODE:          return "VMS_FPMODE";
1848     default:
1849       return NULL;
1850     }
1851 }
1852
1853 static const char *
1854 get_alpha_dynamic_type (unsigned long type)
1855 {
1856   switch (type)
1857     {
1858     case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
1859     default:
1860       return NULL;
1861     }
1862 }
1863
1864 static const char *
1865 get_score_dynamic_type (unsigned long type)
1866 {
1867   switch (type)
1868     {
1869     case DT_SCORE_BASE_ADDRESS: return "SCORE_BASE_ADDRESS";
1870     case DT_SCORE_LOCAL_GOTNO:  return "SCORE_LOCAL_GOTNO";
1871     case DT_SCORE_SYMTABNO:     return "SCORE_SYMTABNO";
1872     case DT_SCORE_GOTSYM:       return "SCORE_GOTSYM";
1873     case DT_SCORE_UNREFEXTNO:   return "SCORE_UNREFEXTNO";
1874     case DT_SCORE_HIPAGENO:     return "SCORE_HIPAGENO";
1875     default:
1876       return NULL;
1877     }
1878 }
1879
1880 static const char *
1881 get_tic6x_dynamic_type (unsigned long type)
1882 {
1883   switch (type)
1884     {
1885     case DT_C6000_GSYM_OFFSET: return "C6000_GSYM_OFFSET";
1886     case DT_C6000_GSTR_OFFSET: return "C6000_GSTR_OFFSET";
1887     case DT_C6000_DSBT_BASE:   return "C6000_DSBT_BASE";
1888     case DT_C6000_DSBT_SIZE:   return "C6000_DSBT_SIZE";
1889     case DT_C6000_PREEMPTMAP:  return "C6000_PREEMPTMAP";
1890     case DT_C6000_DSBT_INDEX:  return "C6000_DSBT_INDEX";
1891     default:
1892       return NULL;
1893     }
1894 }
1895
1896 static const char *
1897 get_nios2_dynamic_type (unsigned long type)
1898 {
1899   switch (type)
1900     {
1901     case DT_NIOS2_GP: return "NIOS2_GP";
1902     default:
1903       return NULL;
1904     }
1905 }
1906
1907 static const char *
1908 get_dynamic_type (unsigned long type)
1909 {
1910   static char buff[64];
1911
1912   switch (type)
1913     {
1914     case DT_NULL:       return "NULL";
1915     case DT_NEEDED:     return "NEEDED";
1916     case DT_PLTRELSZ:   return "PLTRELSZ";
1917     case DT_PLTGOT:     return "PLTGOT";
1918     case DT_HASH:       return "HASH";
1919     case DT_STRTAB:     return "STRTAB";
1920     case DT_SYMTAB:     return "SYMTAB";
1921     case DT_RELA:       return "RELA";
1922     case DT_RELASZ:     return "RELASZ";
1923     case DT_RELAENT:    return "RELAENT";
1924     case DT_STRSZ:      return "STRSZ";
1925     case DT_SYMENT:     return "SYMENT";
1926     case DT_INIT:       return "INIT";
1927     case DT_FINI:       return "FINI";
1928     case DT_SONAME:     return "SONAME";
1929     case DT_RPATH:      return "RPATH";
1930     case DT_SYMBOLIC:   return "SYMBOLIC";
1931     case DT_REL:        return "REL";
1932     case DT_RELSZ:      return "RELSZ";
1933     case DT_RELENT:     return "RELENT";
1934     case DT_PLTREL:     return "PLTREL";
1935     case DT_DEBUG:      return "DEBUG";
1936     case DT_TEXTREL:    return "TEXTREL";
1937     case DT_JMPREL:     return "JMPREL";
1938     case DT_BIND_NOW:   return "BIND_NOW";
1939     case DT_INIT_ARRAY: return "INIT_ARRAY";
1940     case DT_FINI_ARRAY: return "FINI_ARRAY";
1941     case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
1942     case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
1943     case DT_RUNPATH:    return "RUNPATH";
1944     case DT_FLAGS:      return "FLAGS";
1945
1946     case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1947     case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
1948
1949     case DT_CHECKSUM:   return "CHECKSUM";
1950     case DT_PLTPADSZ:   return "PLTPADSZ";
1951     case DT_MOVEENT:    return "MOVEENT";
1952     case DT_MOVESZ:     return "MOVESZ";
1953     case DT_FEATURE:    return "FEATURE";
1954     case DT_POSFLAG_1:  return "POSFLAG_1";
1955     case DT_SYMINSZ:    return "SYMINSZ";
1956     case DT_SYMINENT:   return "SYMINENT"; /* aka VALRNGHI */
1957
1958     case DT_ADDRRNGLO:  return "ADDRRNGLO";
1959     case DT_CONFIG:     return "CONFIG";
1960     case DT_DEPAUDIT:   return "DEPAUDIT";
1961     case DT_AUDIT:      return "AUDIT";
1962     case DT_PLTPAD:     return "PLTPAD";
1963     case DT_MOVETAB:    return "MOVETAB";
1964     case DT_SYMINFO:    return "SYMINFO"; /* aka ADDRRNGHI */
1965
1966     case DT_VERSYM:     return "VERSYM";
1967
1968     case DT_TLSDESC_GOT: return "TLSDESC_GOT";
1969     case DT_TLSDESC_PLT: return "TLSDESC_PLT";
1970     case DT_RELACOUNT:  return "RELACOUNT";
1971     case DT_RELCOUNT:   return "RELCOUNT";
1972     case DT_FLAGS_1:    return "FLAGS_1";
1973     case DT_VERDEF:     return "VERDEF";
1974     case DT_VERDEFNUM:  return "VERDEFNUM";
1975     case DT_VERNEED:    return "VERNEED";
1976     case DT_VERNEEDNUM: return "VERNEEDNUM";
1977
1978     case DT_AUXILIARY:  return "AUXILIARY";
1979     case DT_USED:       return "USED";
1980     case DT_FILTER:     return "FILTER";
1981
1982     case DT_GNU_PRELINKED: return "GNU_PRELINKED";
1983     case DT_GNU_CONFLICT: return "GNU_CONFLICT";
1984     case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
1985     case DT_GNU_LIBLIST: return "GNU_LIBLIST";
1986     case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
1987     case DT_GNU_HASH:   return "GNU_HASH";
1988
1989     default:
1990       if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
1991         {
1992           const char * result;
1993
1994           switch (elf_header.e_machine)
1995             {
1996             case EM_MIPS:
1997             case EM_MIPS_RS3_LE:
1998               result = get_mips_dynamic_type (type);
1999               break;
2000             case EM_SPARCV9:
2001               result = get_sparc64_dynamic_type (type);
2002               break;
2003             case EM_PPC:
2004               result = get_ppc_dynamic_type (type);
2005               break;
2006             case EM_PPC64:
2007               result = get_ppc64_dynamic_type (type);
2008               break;
2009             case EM_IA_64:
2010               result = get_ia64_dynamic_type (type);
2011               break;
2012             case EM_ALPHA:
2013               result = get_alpha_dynamic_type (type);
2014               break;
2015             case EM_SCORE:
2016               result = get_score_dynamic_type (type);
2017               break;
2018             case EM_TI_C6000:
2019               result = get_tic6x_dynamic_type (type);
2020               break;
2021             case EM_ALTERA_NIOS2:
2022               result = get_nios2_dynamic_type (type);
2023               break;
2024             default:
2025               result = NULL;
2026               break;
2027             }
2028
2029           if (result != NULL)
2030             return result;
2031
2032           snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
2033         }
2034       else if (((type >= DT_LOOS) && (type <= DT_HIOS))
2035                || (elf_header.e_machine == EM_PARISC
2036                    && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
2037         {
2038           const char * result;
2039
2040           switch (elf_header.e_machine)
2041             {
2042             case EM_PARISC:
2043               result = get_parisc_dynamic_type (type);
2044               break;
2045             case EM_IA_64:
2046               result = get_ia64_dynamic_type (type);
2047               break;
2048             default:
2049               result = NULL;
2050               break;
2051             }
2052
2053           if (result != NULL)
2054             return result;
2055
2056           snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
2057                     type);
2058         }
2059       else
2060         snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
2061
2062       return buff;
2063     }
2064 }
2065
2066 static char *
2067 get_file_type (unsigned e_type)
2068 {
2069   static char buff[32];
2070
2071   switch (e_type)
2072     {
2073     case ET_NONE:       return _("NONE (None)");
2074     case ET_REL:        return _("REL (Relocatable file)");
2075     case ET_EXEC:       return _("EXEC (Executable file)");
2076     case ET_DYN:        return _("DYN (Shared object file)");
2077     case ET_CORE:       return _("CORE (Core file)");
2078
2079     default:
2080       if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
2081         snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
2082       else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
2083         snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
2084       else
2085         snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
2086       return buff;
2087     }
2088 }
2089
2090 static char *
2091 get_machine_name (unsigned e_machine)
2092 {
2093   static char buff[64]; /* XXX */
2094
2095   switch (e_machine)
2096     {
2097     case EM_NONE:               return _("None");
2098     case EM_AARCH64:            return "AArch64";
2099     case EM_M32:                return "WE32100";
2100     case EM_SPARC:              return "Sparc";
2101     case EM_SPU:                return "SPU";
2102     case EM_386:                return "Intel 80386";
2103     case EM_68K:                return "MC68000";
2104     case EM_88K:                return "MC88000";
2105     case EM_IAMCU:              return "Intel MCU";
2106     case EM_860:                return "Intel 80860";
2107     case EM_MIPS:               return "MIPS R3000";
2108     case EM_S370:               return "IBM System/370";
2109     case EM_MIPS_RS3_LE:        return "MIPS R4000 big-endian";
2110     case EM_OLD_SPARCV9:        return "Sparc v9 (old)";
2111     case EM_PARISC:             return "HPPA";
2112     case EM_PPC_OLD:            return "Power PC (old)";
2113     case EM_SPARC32PLUS:        return "Sparc v8+" ;
2114     case EM_960:                return "Intel 90860";
2115     case EM_PPC:                return "PowerPC";
2116     case EM_PPC64:              return "PowerPC64";
2117     case EM_FR20:               return "Fujitsu FR20";
2118     case EM_FT32:               return "FTDI FT32";
2119     case EM_RH32:               return "TRW RH32";
2120     case EM_MCORE:              return "MCORE";
2121     case EM_ARM:                return "ARM";
2122     case EM_OLD_ALPHA:          return "Digital Alpha (old)";
2123     case EM_SH:                 return "Renesas / SuperH SH";
2124     case EM_SPARCV9:            return "Sparc v9";
2125     case EM_TRICORE:            return "Siemens Tricore";
2126     case EM_ARC:                return "ARC";
2127     case EM_ARC_COMPACT:        return "ARCompact";
2128     case EM_ARC_COMPACT2:       return "ARCv2";
2129     case EM_H8_300:             return "Renesas H8/300";
2130     case EM_H8_300H:            return "Renesas H8/300H";
2131     case EM_H8S:                return "Renesas H8S";
2132     case EM_H8_500:             return "Renesas H8/500";
2133     case EM_IA_64:              return "Intel IA-64";
2134     case EM_MIPS_X:             return "Stanford MIPS-X";
2135     case EM_COLDFIRE:           return "Motorola Coldfire";
2136     case EM_ALPHA:              return "Alpha";
2137     case EM_CYGNUS_D10V:
2138     case EM_D10V:               return "d10v";
2139     case EM_CYGNUS_D30V:
2140     case EM_D30V:               return "d30v";
2141     case EM_CYGNUS_M32R:
2142     case EM_M32R:               return "Renesas M32R (formerly Mitsubishi M32r)";
2143     case EM_CYGNUS_V850:
2144     case EM_V800:               return "Renesas V850 (using RH850 ABI)";
2145     case EM_V850:               return "Renesas V850";
2146     case EM_CYGNUS_MN10300:
2147     case EM_MN10300:            return "mn10300";
2148     case EM_CYGNUS_MN10200:
2149     case EM_MN10200:            return "mn10200";
2150     case EM_MOXIE:              return "Moxie";
2151     case EM_CYGNUS_FR30:
2152     case EM_FR30:               return "Fujitsu FR30";
2153     case EM_CYGNUS_FRV:         return "Fujitsu FR-V";
2154     case EM_PJ_OLD:
2155     case EM_PJ:                 return "picoJava";
2156     case EM_MMA:                return "Fujitsu Multimedia Accelerator";
2157     case EM_PCP:                return "Siemens PCP";
2158     case EM_NCPU:               return "Sony nCPU embedded RISC processor";
2159     case EM_NDR1:               return "Denso NDR1 microprocesspr";
2160     case EM_STARCORE:           return "Motorola Star*Core processor";
2161     case EM_ME16:               return "Toyota ME16 processor";
2162     case EM_ST100:              return "STMicroelectronics ST100 processor";
2163     case EM_TINYJ:              return "Advanced Logic Corp. TinyJ embedded processor";
2164     case EM_PDSP:               return "Sony DSP processor";
2165     case EM_PDP10:              return "Digital Equipment Corp. PDP-10";
2166     case EM_PDP11:              return "Digital Equipment Corp. PDP-11";
2167     case EM_FX66:               return "Siemens FX66 microcontroller";
2168     case EM_ST9PLUS:            return "STMicroelectronics ST9+ 8/16 bit microcontroller";
2169     case EM_ST7:                return "STMicroelectronics ST7 8-bit microcontroller";
2170     case EM_68HC16:             return "Motorola MC68HC16 Microcontroller";
2171     case EM_68HC12:             return "Motorola MC68HC12 Microcontroller";
2172     case EM_68HC11:             return "Motorola MC68HC11 Microcontroller";
2173     case EM_68HC08:             return "Motorola MC68HC08 Microcontroller";
2174     case EM_68HC05:             return "Motorola MC68HC05 Microcontroller";
2175     case EM_SVX:                return "Silicon Graphics SVx";
2176     case EM_ST19:               return "STMicroelectronics ST19 8-bit microcontroller";
2177     case EM_VAX:                return "Digital VAX";
2178     case EM_VISIUM:             return "CDS VISIUMcore processor";
2179     case EM_AVR_OLD:
2180     case EM_AVR:                return "Atmel AVR 8-bit microcontroller";
2181     case EM_CRIS:               return "Axis Communications 32-bit embedded processor";
2182     case EM_JAVELIN:            return "Infineon Technologies 32-bit embedded cpu";
2183     case EM_FIREPATH:           return "Element 14 64-bit DSP processor";
2184     case EM_ZSP:                return "LSI Logic's 16-bit DSP processor";
2185     case EM_MMIX:               return "Donald Knuth's educational 64-bit processor";
2186     case EM_HUANY:              return "Harvard Universitys's machine-independent object format";
2187     case EM_PRISM:              return "Vitesse Prism";
2188     case EM_X86_64:             return "Advanced Micro Devices X86-64";
2189     case EM_L1OM:               return "Intel L1OM";
2190     case EM_K1OM:               return "Intel K1OM";
2191     case EM_S390_OLD:
2192     case EM_S390:               return "IBM S/390";
2193     case EM_SCORE:              return "SUNPLUS S+Core";
2194     case EM_XSTORMY16:          return "Sanyo XStormy16 CPU core";
2195     case EM_OR1K:               return "OpenRISC 1000";
2196     case EM_CRX:                return "National Semiconductor CRX microprocessor";
2197     case EM_ADAPTEVA_EPIPHANY:  return "Adapteva EPIPHANY";
2198     case EM_DLX:                return "OpenDLX";
2199     case EM_IP2K_OLD:
2200     case EM_IP2K:               return "Ubicom IP2xxx 8-bit microcontrollers";
2201     case EM_IQ2000:             return "Vitesse IQ2000";
2202     case EM_XTENSA_OLD:
2203     case EM_XTENSA:             return "Tensilica Xtensa Processor";
2204     case EM_VIDEOCORE:          return "Alphamosaic VideoCore processor";
2205     case EM_TMM_GPP:            return "Thompson Multimedia General Purpose Processor";
2206     case EM_NS32K:              return "National Semiconductor 32000 series";
2207     case EM_TPC:                return "Tenor Network TPC processor";
2208     case EM_ST200:              return "STMicroelectronics ST200 microcontroller";
2209     case EM_MAX:                return "MAX Processor";
2210     case EM_CR:                 return "National Semiconductor CompactRISC";
2211     case EM_F2MC16:             return "Fujitsu F2MC16";
2212     case EM_MSP430:             return "Texas Instruments msp430 microcontroller";
2213     case EM_LATTICEMICO32:      return "Lattice Mico32";
2214     case EM_M32C_OLD:
2215     case EM_M32C:               return "Renesas M32c";
2216     case EM_MT:                 return "Morpho Techologies MT processor";
2217     case EM_BLACKFIN:           return "Analog Devices Blackfin";
2218     case EM_SE_C33:             return "S1C33 Family of Seiko Epson processors";
2219     case EM_SEP:                return "Sharp embedded microprocessor";
2220     case EM_ARCA:               return "Arca RISC microprocessor";
2221     case EM_UNICORE:            return "Unicore";
2222     case EM_EXCESS:             return "eXcess 16/32/64-bit configurable embedded CPU";
2223     case EM_DXP:                return "Icera Semiconductor Inc. Deep Execution Processor";
2224     case EM_NIOS32:             return "Altera Nios";
2225     case EM_ALTERA_NIOS2:       return "Altera Nios II";
2226     case EM_C166:
2227     case EM_XC16X:              return "Infineon Technologies xc16x";
2228     case EM_M16C:               return "Renesas M16C series microprocessors";
2229     case EM_DSPIC30F:           return "Microchip Technology dsPIC30F Digital Signal Controller";
2230     case EM_CE:                 return "Freescale Communication Engine RISC core";
2231     case EM_TSK3000:            return "Altium TSK3000 core";
2232     case EM_RS08:               return "Freescale RS08 embedded processor";
2233     case EM_ECOG2:              return "Cyan Technology eCOG2 microprocessor";
2234     case EM_DSP24:              return "New Japan Radio (NJR) 24-bit DSP Processor";
2235     case EM_VIDEOCORE3:         return "Broadcom VideoCore III processor";
2236     case EM_SE_C17:             return "Seiko Epson C17 family";
2237     case EM_TI_C6000:           return "Texas Instruments TMS320C6000 DSP family";
2238     case EM_TI_C2000:           return "Texas Instruments TMS320C2000 DSP family";
2239     case EM_TI_C5500:           return "Texas Instruments TMS320C55x DSP family";
2240     case EM_MMDSP_PLUS:         return "STMicroelectronics 64bit VLIW Data Signal Processor";
2241     case EM_CYPRESS_M8C:        return "Cypress M8C microprocessor";
2242     case EM_R32C:               return "Renesas R32C series microprocessors";
2243     case EM_TRIMEDIA:           return "NXP Semiconductors TriMedia architecture family";
2244     case EM_QDSP6:              return "QUALCOMM DSP6 Processor";
2245     case EM_8051:               return "Intel 8051 and variants";
2246     case EM_STXP7X:             return "STMicroelectronics STxP7x family";
2247     case EM_NDS32:              return "Andes Technology compact code size embedded RISC processor family";
2248     case EM_ECOG1X:             return "Cyan Technology eCOG1X family";
2249     case EM_MAXQ30:             return "Dallas Semiconductor MAXQ30 Core microcontrollers";
2250     case EM_XIMO16:             return "New Japan Radio (NJR) 16-bit DSP Processor";
2251     case EM_MANIK:              return "M2000 Reconfigurable RISC Microprocessor";
2252     case EM_CRAYNV2:            return "Cray Inc. NV2 vector architecture";
2253     case EM_CYGNUS_MEP:         return "Toshiba MeP Media Engine";
2254     case EM_CR16:
2255     case EM_MICROBLAZE:
2256     case EM_MICROBLAZE_OLD:     return "Xilinx MicroBlaze";
2257     case EM_RL78:               return "Renesas RL78";
2258     case EM_RX:                 return "Renesas RX";
2259     case EM_METAG:              return "Imagination Technologies Meta processor architecture";
2260     case EM_MCST_ELBRUS:        return "MCST Elbrus general purpose hardware architecture";
2261     case EM_ECOG16:             return "Cyan Technology eCOG16 family";
2262     case EM_ETPU:               return "Freescale Extended Time Processing Unit";
2263     case EM_SLE9X:              return "Infineon Technologies SLE9X core";
2264     case EM_AVR32:              return "Atmel Corporation 32-bit microprocessor family";
2265     case EM_STM8:               return "STMicroeletronics STM8 8-bit microcontroller";
2266     case EM_TILE64:             return "Tilera TILE64 multicore architecture family";
2267     case EM_TILEPRO:            return "Tilera TILEPro multicore architecture family";
2268     case EM_TILEGX:             return "Tilera TILE-Gx multicore architecture family";
2269     case EM_CUDA:               return "NVIDIA CUDA architecture";
2270     case EM_XGATE:              return "Motorola XGATE embedded processor";
2271     default:
2272       snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
2273       return buff;
2274     }
2275 }
2276
2277 static void
2278 decode_ARC_machine_flags (unsigned e_flags, unsigned e_machine, char buf[])
2279 {
2280   /* ARC has two machine types EM_ARC_COMPACT and EM_ARC_COMPACT2.  Some
2281      other compilers don't a specific architecture type in the e_flags, and
2282      instead use EM_ARC_COMPACT for old ARC600, ARC601, and ARC700
2283      architectures, and switch to EM_ARC_COMPACT2 for newer ARCEM and ARCHS
2284      architectures.
2285
2286      Th GNU tools follows this use of EM_ARC_COMPACT and EM_ARC_COMPACT2,
2287      but also sets a specific architecture type in the e_flags field.
2288
2289      However, when decoding the flags we don't worry if we see an
2290      unexpected pairing, for example EM_ARC_COMPACT machine type, with
2291      ARCEM architecture type.  */
2292
2293   switch (e_flags & EF_ARC_MACH_MSK)
2294     {
2295       /* We only expect these to occur for EM_ARC_COMPACT2.  */
2296     case EF_ARC_CPU_ARCV2EM:
2297       strcat (buf, ", ARC EM");
2298       break;
2299     case EF_ARC_CPU_ARCV2HS:
2300       strcat (buf, ", ARC HS");
2301       break;
2302
2303       /* We only expect these to occur for EM_ARC_COMPACT.  */
2304     case E_ARC_MACH_ARC600:
2305       strcat (buf, ", ARC600");
2306       break;
2307     case E_ARC_MACH_ARC601:
2308       strcat (buf, ", ARC601");
2309       break;
2310     case E_ARC_MACH_ARC700:
2311       strcat (buf, ", ARC700");
2312       break;
2313     case E_ARC_MACH_NPS400:
2314       strcat (buf, ", NPS400");
2315       break;
2316
2317       /* The only times we should end up here are (a) A corrupt ELF, (b) A
2318          new ELF with new architecture being read by an old version of
2319          readelf, or (c) An ELF built with non-GNU compiler that does not
2320          set the architecture in the e_flags.  */
2321     default:
2322       if (e_machine == EM_ARC_COMPACT)
2323         strcat (buf, ", Unknown ARCompact");
2324       else
2325         strcat (buf, ", Unknown ARC");
2326       break;
2327     }
2328
2329   switch (e_flags & EF_ARC_OSABI_MSK)
2330     {
2331     case E_ARC_OSABI_ORIG:
2332       strcat (buf, ", (ABI:legacy)");
2333       break;
2334     case E_ARC_OSABI_V2:
2335       strcat (buf, ", (ABI:v2)");
2336       break;
2337       /* Only upstream 3.9+ kernels will support ARCv2 ISA.  */
2338     case E_ARC_OSABI_V3:
2339       strcat (buf, ", v3 no-legacy-syscalls ABI");
2340       break;
2341     default:
2342       strcat (buf, ", unrecognised ARC OSABI flag");
2343       break;
2344     }
2345 }
2346
2347 static void
2348 decode_ARM_machine_flags (unsigned e_flags, char buf[])
2349 {
2350   unsigned eabi;
2351   int unknown = 0;
2352
2353   eabi = EF_ARM_EABI_VERSION (e_flags);
2354   e_flags &= ~ EF_ARM_EABIMASK;
2355
2356   /* Handle "generic" ARM flags.  */
2357   if (e_flags & EF_ARM_RELEXEC)
2358     {
2359       strcat (buf, ", relocatable executable");
2360       e_flags &= ~ EF_ARM_RELEXEC;
2361     }
2362
2363   /* Now handle EABI specific flags.  */
2364   switch (eabi)
2365     {
2366     default:
2367       strcat (buf, ", <unrecognized EABI>");
2368       if (e_flags)
2369         unknown = 1;
2370       break;
2371
2372     case EF_ARM_EABI_VER1:
2373       strcat (buf, ", Version1 EABI");
2374       while (e_flags)
2375         {
2376           unsigned flag;
2377
2378           /* Process flags one bit at a time.  */
2379           flag = e_flags & - e_flags;
2380           e_flags &= ~ flag;
2381
2382           switch (flag)
2383             {
2384             case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK.  */
2385               strcat (buf, ", sorted symbol tables");
2386               break;
2387
2388             default:
2389               unknown = 1;
2390               break;
2391             }
2392         }
2393       break;
2394
2395     case EF_ARM_EABI_VER2:
2396       strcat (buf, ", Version2 EABI");
2397       while (e_flags)
2398         {
2399           unsigned flag;
2400
2401           /* Process flags one bit at a time.  */
2402           flag = e_flags & - e_flags;
2403           e_flags &= ~ flag;
2404
2405           switch (flag)
2406             {
2407             case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK.  */
2408               strcat (buf, ", sorted symbol tables");
2409               break;
2410
2411             case EF_ARM_DYNSYMSUSESEGIDX:
2412               strcat (buf, ", dynamic symbols use segment index");
2413               break;
2414
2415             case EF_ARM_MAPSYMSFIRST:
2416               strcat (buf, ", mapping symbols precede others");
2417               break;
2418
2419             default:
2420               unknown = 1;
2421               break;
2422             }
2423         }
2424       break;
2425
2426     case EF_ARM_EABI_VER3:
2427       strcat (buf, ", Version3 EABI");
2428       break;
2429
2430     case EF_ARM_EABI_VER4:
2431       strcat (buf, ", Version4 EABI");
2432       while (e_flags)
2433         {
2434           unsigned flag;
2435
2436           /* Process flags one bit at a time.  */
2437           flag = e_flags & - e_flags;
2438           e_flags &= ~ flag;
2439
2440           switch (flag)
2441             {
2442             case EF_ARM_BE8:
2443               strcat (buf, ", BE8");
2444               break;
2445
2446             case EF_ARM_LE8:
2447               strcat (buf, ", LE8");
2448               break;
2449
2450             default:
2451               unknown = 1;
2452               break;
2453             }
2454       break;
2455         }
2456       break;
2457
2458     case EF_ARM_EABI_VER5:
2459       strcat (buf, ", Version5 EABI");
2460       while (e_flags)
2461         {
2462           unsigned flag;
2463
2464           /* Process flags one bit at a time.  */
2465           flag = e_flags & - e_flags;
2466           e_flags &= ~ flag;
2467
2468           switch (flag)
2469             {
2470             case EF_ARM_BE8:
2471               strcat (buf, ", BE8");
2472               break;
2473
2474             case EF_ARM_LE8:
2475               strcat (buf, ", LE8");
2476               break;
2477
2478             case EF_ARM_ABI_FLOAT_SOFT: /* Conflicts with EF_ARM_SOFT_FLOAT.  */
2479               strcat (buf, ", soft-float ABI");
2480               break;
2481
2482             case EF_ARM_ABI_FLOAT_HARD: /* Conflicts with EF_ARM_VFP_FLOAT.  */
2483               strcat (buf, ", hard-float ABI");
2484               break;
2485
2486             default:
2487               unknown = 1;
2488               break;
2489             }
2490         }
2491       break;
2492
2493     case EF_ARM_EABI_UNKNOWN:
2494       strcat (buf, ", GNU EABI");
2495       while (e_flags)
2496         {
2497           unsigned flag;
2498
2499           /* Process flags one bit at a time.  */
2500           flag = e_flags & - e_flags;
2501           e_flags &= ~ flag;
2502
2503           switch (flag)
2504             {
2505             case EF_ARM_INTERWORK:
2506               strcat (buf, ", interworking enabled");
2507               break;
2508
2509             case EF_ARM_APCS_26:
2510               strcat (buf, ", uses APCS/26");
2511               break;
2512
2513             case EF_ARM_APCS_FLOAT:
2514               strcat (buf, ", uses APCS/float");
2515               break;
2516
2517             case EF_ARM_PIC:
2518               strcat (buf, ", position independent");
2519               break;
2520
2521             case EF_ARM_ALIGN8:
2522               strcat (buf, ", 8 bit structure alignment");
2523               break;
2524
2525             case EF_ARM_NEW_ABI:
2526               strcat (buf, ", uses new ABI");
2527               break;
2528
2529             case EF_ARM_OLD_ABI:
2530               strcat (buf, ", uses old ABI");
2531               break;
2532
2533             case EF_ARM_SOFT_FLOAT:
2534               strcat (buf, ", software FP");
2535               break;
2536
2537             case EF_ARM_VFP_FLOAT:
2538               strcat (buf, ", VFP");
2539               break;
2540
2541             case EF_ARM_MAVERICK_FLOAT:
2542               strcat (buf, ", Maverick FP");
2543               break;
2544
2545             default:
2546               unknown = 1;
2547               break;
2548             }
2549         }
2550     }
2551
2552   if (unknown)
2553     strcat (buf,_(", <unknown>"));
2554 }
2555
2556 static void
2557 decode_AVR_machine_flags (unsigned e_flags, char buf[], size_t size)
2558 {
2559   --size; /* Leave space for null terminator.  */
2560
2561   switch (e_flags & EF_AVR_MACH)
2562     {
2563     case E_AVR_MACH_AVR1:
2564       strncat (buf, ", avr:1", size);
2565       break;
2566     case E_AVR_MACH_AVR2:
2567       strncat (buf, ", avr:2", size);
2568       break;
2569     case E_AVR_MACH_AVR25:
2570       strncat (buf, ", avr:25", size);
2571       break;
2572     case E_AVR_MACH_AVR3:
2573       strncat (buf, ", avr:3", size);
2574       break;
2575     case E_AVR_MACH_AVR31:
2576       strncat (buf, ", avr:31", size);
2577       break;
2578     case E_AVR_MACH_AVR35:
2579       strncat (buf, ", avr:35", size);
2580       break;
2581     case E_AVR_MACH_AVR4:
2582       strncat (buf, ", avr:4", size);
2583       break;
2584     case E_AVR_MACH_AVR5:
2585       strncat (buf, ", avr:5", size);
2586       break;
2587     case E_AVR_MACH_AVR51:
2588       strncat (buf, ", avr:51", size);
2589       break;
2590     case E_AVR_MACH_AVR6:
2591       strncat (buf, ", avr:6", size);
2592       break;
2593     case E_AVR_MACH_AVRTINY:
2594       strncat (buf, ", avr:100", size);
2595       break;
2596     case E_AVR_MACH_XMEGA1:
2597       strncat (buf, ", avr:101", size);
2598       break;
2599     case E_AVR_MACH_XMEGA2:
2600       strncat (buf, ", avr:102", size);
2601       break;
2602     case E_AVR_MACH_XMEGA3:
2603       strncat (buf, ", avr:103", size);
2604       break;
2605     case E_AVR_MACH_XMEGA4:
2606       strncat (buf, ", avr:104", size);
2607       break;
2608     case E_AVR_MACH_XMEGA5:
2609       strncat (buf, ", avr:105", size);
2610       break;
2611     case E_AVR_MACH_XMEGA6:
2612       strncat (buf, ", avr:106", size);
2613       break;
2614     case E_AVR_MACH_XMEGA7:
2615       strncat (buf, ", avr:107", size);
2616       break;
2617     default:
2618       strncat (buf, ", avr:<unknown>", size);
2619       break;
2620     }
2621
2622   size -= strlen (buf);
2623   if (e_flags & EF_AVR_LINKRELAX_PREPARED)
2624     strncat (buf, ", link-relax", size);
2625 }
2626
2627 static void
2628 decode_NDS32_machine_flags (unsigned e_flags, char buf[], size_t size)
2629 {
2630   unsigned abi;
2631   unsigned arch;
2632   unsigned config;
2633   unsigned version;
2634   int has_fpu = 0;
2635   int r = 0;
2636
2637   static const char *ABI_STRINGS[] =
2638   {
2639     "ABI v0", /* use r5 as return register; only used in N1213HC */
2640     "ABI v1", /* use r0 as return register */
2641     "ABI v2", /* use r0 as return register and don't reserve 24 bytes for arguments */
2642     "ABI v2fp", /* for FPU */
2643     "AABI",
2644     "ABI2 FP+"
2645   };
2646   static const char *VER_STRINGS[] =
2647   {
2648     "Andes ELF V1.3 or older",
2649     "Andes ELF V1.3.1",
2650     "Andes ELF V1.4"
2651   };
2652   static const char *ARCH_STRINGS[] =
2653   {
2654     "",
2655     "Andes Star v1.0",
2656     "Andes Star v2.0",
2657     "Andes Star v3.0",
2658     "Andes Star v3.0m"
2659   };
2660
2661   abi = EF_NDS_ABI & e_flags;
2662   arch = EF_NDS_ARCH & e_flags;
2663   config = EF_NDS_INST & e_flags;
2664   version = EF_NDS32_ELF_VERSION & e_flags;
2665
2666   memset (buf, 0, size);
2667
2668   switch (abi)
2669     {
2670     case E_NDS_ABI_V0:
2671     case E_NDS_ABI_V1:
2672     case E_NDS_ABI_V2:
2673     case E_NDS_ABI_V2FP:
2674     case E_NDS_ABI_AABI:
2675     case E_NDS_ABI_V2FP_PLUS:
2676       /* In case there are holes in the array.  */
2677       r += snprintf (buf + r, size - r, ", %s", ABI_STRINGS[abi >> EF_NDS_ABI_SHIFT]);
2678       break;
2679
2680     default:
2681       r += snprintf (buf + r, size - r, ", <unrecognized ABI>");
2682       break;
2683     }
2684
2685   switch (version)
2686     {
2687     case E_NDS32_ELF_VER_1_2:
2688     case E_NDS32_ELF_VER_1_3:
2689     case E_NDS32_ELF_VER_1_4:
2690       r += snprintf (buf + r, size - r, ", %s", VER_STRINGS[version >> EF_NDS32_ELF_VERSION_SHIFT]);
2691       break;
2692
2693     default:
2694       r += snprintf (buf + r, size - r, ", <unrecognized ELF version number>");
2695       break;
2696     }
2697
2698   if (E_NDS_ABI_V0 == abi)
2699     {
2700       /* OLD ABI; only used in N1213HC, has performance extension 1.  */
2701       r += snprintf (buf + r, size - r, ", Andes Star v1.0, N1213HC, MAC, PERF1");
2702       if (arch == E_NDS_ARCH_STAR_V1_0)
2703         r += snprintf (buf + r, size -r, ", 16b"); /* has 16-bit instructions */
2704       return;
2705     }
2706
2707   switch (arch)
2708     {
2709     case E_NDS_ARCH_STAR_V1_0:
2710     case E_NDS_ARCH_STAR_V2_0:
2711     case E_NDS_ARCH_STAR_V3_0:
2712     case E_NDS_ARCH_STAR_V3_M:
2713       r += snprintf (buf + r, size - r, ", %s", ARCH_STRINGS[arch >> EF_NDS_ARCH_SHIFT]);
2714       break;
2715
2716     default:
2717       r += snprintf (buf + r, size - r, ", <unrecognized architecture>");
2718       /* ARCH version determines how the e_flags are interpreted.
2719          If it is unknown, we cannot proceed.  */
2720       return;
2721     }
2722
2723   /* Newer ABI; Now handle architecture specific flags.  */
2724   if (arch == E_NDS_ARCH_STAR_V1_0)
2725     {
2726       if (config & E_NDS32_HAS_MFUSR_PC_INST)
2727         r += snprintf (buf + r, size -r, ", MFUSR_PC");
2728
2729       if (!(config & E_NDS32_HAS_NO_MAC_INST))
2730         r += snprintf (buf + r, size -r, ", MAC");
2731
2732       if (config & E_NDS32_HAS_DIV_INST)
2733         r += snprintf (buf + r, size -r, ", DIV");
2734
2735       if (config & E_NDS32_HAS_16BIT_INST)
2736         r += snprintf (buf + r, size -r, ", 16b");
2737     }
2738   else
2739     {
2740       if (config & E_NDS32_HAS_MFUSR_PC_INST)
2741         {
2742           if (version <= E_NDS32_ELF_VER_1_3)
2743             r += snprintf (buf + r, size -r, ", [B8]");
2744           else
2745             r += snprintf (buf + r, size -r, ", EX9");
2746         }
2747
2748       if (config & E_NDS32_HAS_MAC_DX_INST)
2749         r += snprintf (buf + r, size -r, ", MAC_DX");
2750
2751       if (config & E_NDS32_HAS_DIV_DX_INST)
2752         r += snprintf (buf + r, size -r, ", DIV_DX");
2753
2754       if (config & E_NDS32_HAS_16BIT_INST)
2755         {
2756           if (version <= E_NDS32_ELF_VER_1_3)
2757             r += snprintf (buf + r, size -r, ", 16b");
2758           else
2759             r += snprintf (buf + r, size -r, ", IFC");
2760         }
2761     }
2762
2763   if (config & E_NDS32_HAS_EXT_INST)
2764     r += snprintf (buf + r, size -r, ", PERF1");
2765
2766   if (config & E_NDS32_HAS_EXT2_INST)
2767     r += snprintf (buf + r, size -r, ", PERF2");
2768
2769   if (config & E_NDS32_HAS_FPU_INST)
2770     {
2771       has_fpu = 1;
2772       r += snprintf (buf + r, size -r, ", FPU_SP");
2773     }
2774
2775   if (config & E_NDS32_HAS_FPU_DP_INST)
2776     {
2777       has_fpu = 1;
2778       r += snprintf (buf + r, size -r, ", FPU_DP");
2779     }
2780
2781   if (config & E_NDS32_HAS_FPU_MAC_INST)
2782     {
2783       has_fpu = 1;
2784       r += snprintf (buf + r, size -r, ", FPU_MAC");
2785     }
2786
2787   if (has_fpu)
2788     {
2789       switch ((config & E_NDS32_FPU_REG_CONF) >> E_NDS32_FPU_REG_CONF_SHIFT)
2790         {
2791         case E_NDS32_FPU_REG_8SP_4DP:
2792           r += snprintf (buf + r, size -r, ", FPU_REG:8/4");
2793           break;
2794         case E_NDS32_FPU_REG_16SP_8DP:
2795           r += snprintf (buf + r, size -r, ", FPU_REG:16/8");
2796           break;
2797         case E_NDS32_FPU_REG_32SP_16DP:
2798           r += snprintf (buf + r, size -r, ", FPU_REG:32/16");
2799           break;
2800         case E_NDS32_FPU_REG_32SP_32DP:
2801           r += snprintf (buf + r, size -r, ", FPU_REG:32/32");
2802           break;
2803         }
2804     }
2805
2806   if (config & E_NDS32_HAS_AUDIO_INST)
2807     r += snprintf (buf + r, size -r, ", AUDIO");
2808
2809   if (config & E_NDS32_HAS_STRING_INST)
2810     r += snprintf (buf + r, size -r, ", STR");
2811
2812   if (config & E_NDS32_HAS_REDUCED_REGS)
2813     r += snprintf (buf + r, size -r, ", 16REG");
2814
2815   if (config & E_NDS32_HAS_VIDEO_INST)
2816     {
2817       if (version <= E_NDS32_ELF_VER_1_3)
2818         r += snprintf (buf + r, size -r, ", VIDEO");
2819       else
2820         r += snprintf (buf + r, size -r, ", SATURATION");
2821     }
2822
2823   if (config & E_NDS32_HAS_ENCRIPT_INST)
2824     r += snprintf (buf + r, size -r, ", ENCRP");
2825
2826   if (config & E_NDS32_HAS_L2C_INST)
2827     r += snprintf (buf + r, size -r, ", L2C");
2828 }
2829
2830 static char *
2831 get_machine_flags (unsigned e_flags, unsigned e_machine)
2832 {
2833   static char buf[1024];
2834
2835   buf[0] = '\0';
2836
2837   if (e_flags)
2838     {
2839       switch (e_machine)
2840         {
2841         default:
2842           break;
2843
2844         case EM_ARC_COMPACT2:
2845         case EM_ARC_COMPACT:
2846           decode_ARC_machine_flags (e_flags, e_machine, buf);
2847           break;
2848
2849         case EM_ARM:
2850           decode_ARM_machine_flags (e_flags, buf);
2851           break;
2852
2853         case EM_AVR:
2854           decode_AVR_machine_flags (e_flags, buf, sizeof buf);
2855           break;
2856
2857         case EM_BLACKFIN:
2858           if (e_flags & EF_BFIN_PIC)
2859             strcat (buf, ", PIC");
2860
2861           if (e_flags & EF_BFIN_FDPIC)
2862             strcat (buf, ", FDPIC");
2863
2864           if (e_flags & EF_BFIN_CODE_IN_L1)
2865             strcat (buf, ", code in L1");
2866
2867           if (e_flags & EF_BFIN_DATA_IN_L1)
2868             strcat (buf, ", data in L1");
2869
2870           break;
2871
2872         case EM_CYGNUS_FRV:
2873           switch (e_flags & EF_FRV_CPU_MASK)
2874             {
2875             case EF_FRV_CPU_GENERIC:
2876               break;
2877
2878             default:
2879               strcat (buf, ", fr???");
2880               break;
2881
2882             case EF_FRV_CPU_FR300:
2883               strcat (buf, ", fr300");
2884               break;
2885
2886             case EF_FRV_CPU_FR400:
2887               strcat (buf, ", fr400");
2888               break;
2889             case EF_FRV_CPU_FR405:
2890               strcat (buf, ", fr405");
2891               break;
2892
2893             case EF_FRV_CPU_FR450:
2894               strcat (buf, ", fr450");
2895               break;
2896
2897             case EF_FRV_CPU_FR500:
2898               strcat (buf, ", fr500");
2899               break;
2900             case EF_FRV_CPU_FR550:
2901               strcat (buf, ", fr550");
2902               break;
2903
2904             case EF_FRV_CPU_SIMPLE:
2905               strcat (buf, ", simple");
2906               break;
2907             case EF_FRV_CPU_TOMCAT:
2908               strcat (buf, ", tomcat");
2909               break;
2910             }
2911           break;
2912
2913         case EM_68K:
2914           if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
2915             strcat (buf, ", m68000");
2916           else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
2917             strcat (buf, ", cpu32");
2918           else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
2919             strcat (buf, ", fido_a");
2920           else
2921             {
2922               char const * isa = _("unknown");
2923               char const * mac = _("unknown mac");
2924               char const * additional = NULL;
2925
2926               switch (e_flags & EF_M68K_CF_ISA_MASK)
2927                 {
2928                 case EF_M68K_CF_ISA_A_NODIV:
2929                   isa = "A";
2930                   additional = ", nodiv";
2931                   break;
2932                 case EF_M68K_CF_ISA_A:
2933                   isa = "A";
2934                   break;
2935                 case EF_M68K_CF_ISA_A_PLUS:
2936                   isa = "A+";
2937                   break;
2938                 case EF_M68K_CF_ISA_B_NOUSP:
2939                   isa = "B";
2940                   additional = ", nousp";
2941                   break;
2942                 case EF_M68K_CF_ISA_B:
2943                   isa = "B";
2944                   break;
2945                 case EF_M68K_CF_ISA_C:
2946                   isa = "C";
2947                   break;
2948                 case EF_M68K_CF_ISA_C_NODIV:
2949                   isa = "C";
2950                   additional = ", nodiv";
2951                   break;
2952                 }
2953               strcat (buf, ", cf, isa ");
2954               strcat (buf, isa);
2955               if (additional)
2956                 strcat (buf, additional);
2957               if (e_flags & EF_M68K_CF_FLOAT)
2958                 strcat (buf, ", float");
2959               switch (e_flags & EF_M68K_CF_MAC_MASK)
2960                 {
2961                 case 0:
2962                   mac = NULL;
2963                   break;
2964                 case EF_M68K_CF_MAC:
2965                   mac = "mac";
2966                   break;
2967                 case EF_M68K_CF_EMAC:
2968                   mac = "emac";
2969                   break;
2970                 case EF_M68K_CF_EMAC_B:
2971                   mac = "emac_b";
2972                   break;
2973                 }
2974               if (mac)
2975                 {
2976                   strcat (buf, ", ");
2977                   strcat (buf, mac);
2978                 }
2979             }
2980           break;
2981
2982         case EM_CYGNUS_MEP:
2983           switch (e_flags & EF_MEP_CPU_MASK)
2984             {
2985             case EF_MEP_CPU_MEP: strcat (buf, ", generic MeP"); break;
2986             case EF_MEP_CPU_C2: strcat (buf, ", MeP C2"); break;
2987             case EF_MEP_CPU_C3: strcat (buf, ", MeP C3"); break;
2988             case EF_MEP_CPU_C4: strcat (buf, ", MeP C4"); break;
2989             case EF_MEP_CPU_C5: strcat (buf, ", MeP C5"); break;
2990             case EF_MEP_CPU_H1: strcat (buf, ", MeP H1"); break;
2991             default: strcat (buf, _(", <unknown MeP cpu type>")); break;
2992             }
2993
2994           switch (e_flags & EF_MEP_COP_MASK)
2995             {
2996             case EF_MEP_COP_NONE: break;
2997             case EF_MEP_COP_AVC: strcat (buf, ", AVC coprocessor"); break;
2998             case EF_MEP_COP_AVC2: strcat (buf, ", AVC2 coprocessor"); break;
2999             case EF_MEP_COP_FMAX: strcat (buf, ", FMAX coprocessor"); break;
3000             case EF_MEP_COP_IVC2: strcat (buf, ", IVC2 coprocessor"); break;
3001             default: strcat (buf, _("<unknown MeP copro type>")); break;
3002             }
3003
3004           if (e_flags & EF_MEP_LIBRARY)
3005             strcat (buf, ", Built for Library");
3006
3007           if (e_flags & EF_MEP_INDEX_MASK)
3008             sprintf (buf + strlen (buf), ", Configuration Index: %#x",
3009                      e_flags & EF_MEP_INDEX_MASK);
3010
3011           if (e_flags & ~ EF_MEP_ALL_FLAGS)
3012             sprintf (buf + strlen (buf), _(", unknown flags bits: %#x"),
3013                      e_flags & ~ EF_MEP_ALL_FLAGS);
3014           break;
3015
3016         case EM_PPC:
3017           if (e_flags & EF_PPC_EMB)
3018             strcat (buf, ", emb");
3019
3020           if (e_flags & EF_PPC_RELOCATABLE)
3021             strcat (buf, _(", relocatable"));
3022
3023           if (e_flags & EF_PPC_RELOCATABLE_LIB)
3024             strcat (buf, _(", relocatable-lib"));
3025           break;
3026
3027         case EM_PPC64:
3028           if (e_flags & EF_PPC64_ABI)
3029             {
3030               char abi[] = ", abiv0";
3031
3032               abi[6] += e_flags & EF_PPC64_ABI;
3033               strcat (buf, abi);
3034             }
3035           break;
3036
3037         case EM_V800:
3038           if ((e_flags & EF_RH850_ABI) == EF_RH850_ABI)
3039             strcat (buf, ", RH850 ABI");
3040
3041           if (e_flags & EF_V800_850E3)
3042             strcat (buf, ", V3 architecture");
3043
3044           if ((e_flags & (EF_RH850_FPU_DOUBLE | EF_RH850_FPU_SINGLE)) == 0)
3045             strcat (buf, ", FPU not used");
3046
3047           if ((e_flags & (EF_RH850_REGMODE22 | EF_RH850_REGMODE32)) == 0)
3048             strcat (buf, ", regmode: COMMON");
3049
3050           if ((e_flags & (EF_RH850_GP_FIX | EF_RH850_GP_NOFIX)) == 0)
3051             strcat (buf, ", r4 not used");
3052
3053           if ((e_flags & (EF_RH850_EP_FIX | EF_RH850_EP_NOFIX)) == 0)
3054             strcat (buf, ", r30 not used");
3055
3056           if ((e_flags & (EF_RH850_TP_FIX | EF_RH850_TP_NOFIX)) == 0)
3057             strcat (buf, ", r5 not used");
3058
3059           if ((e_flags & (EF_RH850_REG2_RESERVE | EF_RH850_REG2_NORESERVE)) == 0)
3060             strcat (buf, ", r2 not used");
3061
3062           for (e_flags &= 0xFFFF; e_flags; e_flags &= ~ (e_flags & - e_flags))
3063             {
3064               switch (e_flags & - e_flags)
3065                 {
3066                 case EF_RH850_FPU_DOUBLE: strcat (buf, ", double precision FPU"); break;
3067                 case EF_RH850_FPU_SINGLE: strcat (buf, ", single precision FPU"); break;
3068                 case EF_RH850_REGMODE22: strcat (buf, ", regmode:22"); break;
3069                 case EF_RH850_REGMODE32: strcat (buf, ", regmode:23"); break;
3070                 case EF_RH850_GP_FIX: strcat (buf, ", r4 fixed"); break;
3071                 case EF_RH850_GP_NOFIX: strcat (buf, ", r4 free"); break;
3072                 case EF_RH850_EP_FIX: strcat (buf, ", r30 fixed"); break;
3073                 case EF_RH850_EP_NOFIX: strcat (buf, ", r30 free"); break;
3074                 case EF_RH850_TP_FIX: strcat (buf, ", r5 fixed"); break;
3075                 case EF_RH850_TP_NOFIX: strcat (buf, ", r5 free"); break;
3076                 case EF_RH850_REG2_RESERVE: strcat (buf, ", r2 fixed"); break;
3077                 case EF_RH850_REG2_NORESERVE: strcat (buf, ", r2 free"); break;
3078                 default: break;
3079                 }
3080             }
3081           break;
3082
3083         case EM_V850:
3084         case EM_CYGNUS_V850:
3085           switch (e_flags & EF_V850_ARCH)
3086             {
3087             case E_V850E3V5_ARCH:
3088               strcat (buf, ", v850e3v5");
3089               break;
3090             case E_V850E2V3_ARCH:
3091               strcat (buf, ", v850e2v3");
3092               break;
3093             case E_V850E2_ARCH:
3094               strcat (buf, ", v850e2");
3095               break;
3096             case E_V850E1_ARCH:
3097               strcat (buf, ", v850e1");
3098               break;
3099             case E_V850E_ARCH:
3100               strcat (buf, ", v850e");
3101               break;
3102             case E_V850_ARCH:
3103               strcat (buf, ", v850");
3104               break;
3105             default:
3106               strcat (buf, _(", unknown v850 architecture variant"));
3107               break;
3108             }
3109           break;
3110
3111         case EM_M32R:
3112         case EM_CYGNUS_M32R:
3113           if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
3114             strcat (buf, ", m32r");
3115           break;
3116
3117         case EM_MIPS:
3118         case EM_MIPS_RS3_LE:
3119           if (e_flags & EF_MIPS_NOREORDER)
3120             strcat (buf, ", noreorder");
3121
3122           if (e_flags & EF_MIPS_PIC)
3123             strcat (buf, ", pic");
3124
3125           if (e_flags & EF_MIPS_CPIC)
3126             strcat (buf, ", cpic");
3127
3128           if (e_flags & EF_MIPS_UCODE)
3129             strcat (buf, ", ugen_reserved");
3130
3131           if (e_flags & EF_MIPS_ABI2)
3132             strcat (buf, ", abi2");
3133
3134           if (e_flags & EF_MIPS_OPTIONS_FIRST)
3135             strcat (buf, ", odk first");
3136
3137           if (e_flags & EF_MIPS_32BITMODE)
3138             strcat (buf, ", 32bitmode");
3139
3140           if (e_flags & EF_MIPS_NAN2008)
3141             strcat (buf, ", nan2008");
3142
3143           if (e_flags & EF_MIPS_FP64)
3144             strcat (buf, ", fp64");
3145
3146           switch ((e_flags & EF_MIPS_MACH))
3147             {
3148             case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
3149             case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
3150             case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
3151             case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
3152             case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
3153             case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
3154             case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
3155             case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
3156             case E_MIPS_MACH_SB1:  strcat (buf, ", sb1");  break;
3157             case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
3158             case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break;
3159             case E_MIPS_MACH_LS2F: strcat (buf, ", loongson-2f"); break;
3160             case E_MIPS_MACH_LS3A: strcat (buf, ", loongson-3a"); break;
3161             case E_MIPS_MACH_OCTEON: strcat (buf, ", octeon"); break;
3162             case E_MIPS_MACH_OCTEON2: strcat (buf, ", octeon2"); break;
3163             case E_MIPS_MACH_OCTEON3: strcat (buf, ", octeon3"); break;
3164             case E_MIPS_MACH_XLR:  strcat (buf, ", xlr"); break;
3165             case 0:
3166             /* We simply ignore the field in this case to avoid confusion:
3167                MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
3168                extension.  */
3169               break;
3170             default: strcat (buf, _(", unknown CPU")); break;
3171             }
3172
3173           switch ((e_flags & EF_MIPS_ABI))
3174             {
3175             case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
3176             case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
3177             case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
3178             case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
3179             case 0:
3180             /* We simply ignore the field in this case to avoid confusion:
3181                MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
3182                This means it is likely to be an o32 file, but not for
3183                sure.  */
3184               break;
3185             default: strcat (buf, _(", unknown ABI")); break;
3186             }
3187
3188           if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
3189             strcat (buf, ", mdmx");
3190
3191           if (e_flags & EF_MIPS_ARCH_ASE_M16)
3192             strcat (buf, ", mips16");
3193
3194           if (e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
3195             strcat (buf, ", micromips");
3196
3197           switch ((e_flags & EF_MIPS_ARCH))
3198             {
3199             case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
3200             case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
3201             case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
3202             case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
3203             case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
3204             case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
3205             case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
3206             case E_MIPS_ARCH_32R6: strcat (buf, ", mips32r6"); break;
3207             case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
3208             case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
3209             case E_MIPS_ARCH_64R6: strcat (buf, ", mips64r6"); break;
3210             default: strcat (buf, _(", unknown ISA")); break;
3211             }
3212           break;
3213
3214         case EM_NDS32:
3215           decode_NDS32_machine_flags (e_flags, buf, sizeof buf);
3216           break;
3217
3218         case EM_SH:
3219           switch ((e_flags & EF_SH_MACH_MASK))
3220             {
3221             case EF_SH1: strcat (buf, ", sh1"); break;
3222             case EF_SH2: strcat (buf, ", sh2"); break;
3223             case EF_SH3: strcat (buf, ", sh3"); break;
3224             case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
3225             case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
3226             case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
3227             case EF_SH3E: strcat (buf, ", sh3e"); break;
3228             case EF_SH4: strcat (buf, ", sh4"); break;
3229             case EF_SH5: strcat (buf, ", sh5"); break;
3230             case EF_SH2E: strcat (buf, ", sh2e"); break;
3231             case EF_SH4A: strcat (buf, ", sh4a"); break;
3232             case EF_SH2A: strcat (buf, ", sh2a"); break;
3233             case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
3234             case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
3235             case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
3236             case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
3237             case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
3238             case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
3239             case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
3240             case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
3241             case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
3242             default: strcat (buf, _(", unknown ISA")); break;
3243             }
3244
3245           if (e_flags & EF_SH_PIC)
3246             strcat (buf, ", pic");
3247
3248           if (e_flags & EF_SH_FDPIC)
3249             strcat (buf, ", fdpic");
3250           break;
3251
3252         case EM_OR1K:
3253           if (e_flags & EF_OR1K_NODELAY)
3254             strcat (buf, ", no delay");
3255           break;
3256
3257         case EM_SPARCV9:
3258           if (e_flags & EF_SPARC_32PLUS)
3259             strcat (buf, ", v8+");
3260
3261           if (e_flags & EF_SPARC_SUN_US1)
3262             strcat (buf, ", ultrasparcI");
3263
3264           if (e_flags & EF_SPARC_SUN_US3)
3265             strcat (buf, ", ultrasparcIII");
3266
3267           if (e_flags & EF_SPARC_HAL_R1)
3268             strcat (buf, ", halr1");
3269
3270           if (e_flags & EF_SPARC_LEDATA)
3271             strcat (buf, ", ledata");
3272
3273           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
3274             strcat (buf, ", tso");
3275
3276           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
3277             strcat (buf, ", pso");
3278
3279           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
3280             strcat (buf, ", rmo");
3281           break;
3282
3283         case EM_PARISC:
3284           switch (e_flags & EF_PARISC_ARCH)
3285             {
3286             case EFA_PARISC_1_0:
3287               strcpy (buf, ", PA-RISC 1.0");
3288               break;
3289             case EFA_PARISC_1_1:
3290               strcpy (buf, ", PA-RISC 1.1");
3291               break;
3292             case EFA_PARISC_2_0:
3293               strcpy (buf, ", PA-RISC 2.0");
3294               break;
3295             default:
3296               break;
3297             }
3298           if (e_flags & EF_PARISC_TRAPNIL)
3299             strcat (buf, ", trapnil");
3300           if (e_flags & EF_PARISC_EXT)
3301             strcat (buf, ", ext");
3302           if (e_flags & EF_PARISC_LSB)
3303             strcat (buf, ", lsb");
3304           if (e_flags & EF_PARISC_WIDE)
3305             strcat (buf, ", wide");
3306           if (e_flags & EF_PARISC_NO_KABP)
3307             strcat (buf, ", no kabp");
3308           if (e_flags & EF_PARISC_LAZYSWAP)
3309             strcat (buf, ", lazyswap");
3310           break;
3311
3312         case EM_PJ:
3313         case EM_PJ_OLD:
3314           if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
3315             strcat (buf, ", new calling convention");
3316
3317           if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
3318             strcat (buf, ", gnu calling convention");
3319           break;
3320
3321         case EM_IA_64:
3322           if ((e_flags & EF_IA_64_ABI64))
3323             strcat (buf, ", 64-bit");
3324           else
3325             strcat (buf, ", 32-bit");
3326           if ((e_flags & EF_IA_64_REDUCEDFP))
3327             strcat (buf, ", reduced fp model");
3328           if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
3329             strcat (buf, ", no function descriptors, constant gp");
3330           else if ((e_flags & EF_IA_64_CONS_GP))
3331             strcat (buf, ", constant gp");
3332           if ((e_flags & EF_IA_64_ABSOLUTE))
3333             strcat (buf, ", absolute");
3334           if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
3335             {
3336               if ((e_flags & EF_IA_64_VMS_LINKAGES))
3337                 strcat (buf, ", vms_linkages");
3338               switch ((e_flags & EF_IA_64_VMS_COMCOD))
3339                 {
3340                 case EF_IA_64_VMS_COMCOD_SUCCESS:
3341                   break;
3342                 case EF_IA_64_VMS_COMCOD_WARNING:
3343                   strcat (buf, ", warning");
3344                   break;
3345                 case EF_IA_64_VMS_COMCOD_ERROR:
3346                   strcat (buf, ", error");
3347                   break;
3348                 case EF_IA_64_VMS_COMCOD_ABORT:
3349                   strcat (buf, ", abort");
3350                   break;
3351                 default:
3352                   warn (_("Unrecognised IA64 VMS Command Code: %x\n"),
3353                         e_flags & EF_IA_64_VMS_COMCOD);
3354                   strcat (buf, ", <unknown>");
3355                 }
3356             }
3357           break;
3358
3359         case EM_VAX:
3360           if ((e_flags & EF_VAX_NONPIC))
3361             strcat (buf, ", non-PIC");
3362           if ((e_flags & EF_VAX_DFLOAT))
3363             strcat (buf, ", D-Float");
3364           if ((e_flags & EF_VAX_GFLOAT))
3365             strcat (buf, ", G-Float");
3366           break;
3367
3368         case EM_VISIUM:
3369           if (e_flags & EF_VISIUM_ARCH_MCM)
3370             strcat (buf, ", mcm");
3371           else if (e_flags & EF_VISIUM_ARCH_MCM24)
3372             strcat (buf, ", mcm24");
3373           if (e_flags & EF_VISIUM_ARCH_GR6)
3374             strcat (buf, ", gr6");
3375           break;
3376
3377         case EM_RL78:
3378           switch (e_flags & E_FLAG_RL78_CPU_MASK)
3379             {
3380             case E_FLAG_RL78_ANY_CPU: break;
3381             case E_FLAG_RL78_G10: strcat (buf, ", G10"); break;
3382             case E_FLAG_RL78_G13: strcat (buf, ", G13"); break;
3383             case E_FLAG_RL78_G14: strcat (buf, ", G14"); break;
3384             }
3385           if (e_flags & E_FLAG_RL78_64BIT_DOUBLES)
3386             strcat (buf, ", 64-bit doubles");
3387           break;
3388
3389         case EM_RX:
3390           if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
3391             strcat (buf, ", 64-bit doubles");
3392           if (e_flags & E_FLAG_RX_DSP)
3393             strcat (buf, ", dsp");
3394           if (e_flags & E_FLAG_RX_PID)
3395             strcat (buf, ", pid");
3396           if (e_flags & E_FLAG_RX_ABI)
3397             strcat (buf, ", RX ABI");
3398           if (e_flags & E_FLAG_RX_SINSNS_SET)
3399             strcat (buf, e_flags & E_FLAG_RX_SINSNS_YES
3400                     ? ", uses String instructions" : ", bans String instructions");
3401           if (e_flags & E_FLAG_RX_V2)
3402             strcat (buf, ", V2");
3403           break;
3404
3405         case EM_S390:
3406           if (e_flags & EF_S390_HIGH_GPRS)
3407             strcat (buf, ", highgprs");
3408           break;
3409
3410         case EM_TI_C6000:
3411           if ((e_flags & EF_C6000_REL))
3412             strcat (buf, ", relocatable module");
3413           break;
3414
3415         case EM_MSP430:
3416           strcat (buf, _(": architecture variant: "));
3417           switch (e_flags & EF_MSP430_MACH)
3418             {
3419             case E_MSP430_MACH_MSP430x11: strcat (buf, "MSP430x11"); break;
3420             case E_MSP430_MACH_MSP430x11x1 : strcat (buf, "MSP430x11x1 "); break;
3421             case E_MSP430_MACH_MSP430x12: strcat (buf, "MSP430x12"); break;
3422             case E_MSP430_MACH_MSP430x13: strcat (buf, "MSP430x13"); break;
3423             case E_MSP430_MACH_MSP430x14: strcat (buf, "MSP430x14"); break;
3424             case E_MSP430_MACH_MSP430x15: strcat (buf, "MSP430x15"); break;
3425             case E_MSP430_MACH_MSP430x16: strcat (buf, "MSP430x16"); break;
3426             case E_MSP430_MACH_MSP430x31: strcat (buf, "MSP430x31"); break;
3427             case E_MSP430_MACH_MSP430x32: strcat (buf, "MSP430x32"); break;
3428             case E_MSP430_MACH_MSP430x33: strcat (buf, "MSP430x33"); break;
3429             case E_MSP430_MACH_MSP430x41: strcat (buf, "MSP430x41"); break;
3430             case E_MSP430_MACH_MSP430x42: strcat (buf, "MSP430x42"); break;
3431             case E_MSP430_MACH_MSP430x43: strcat (buf, "MSP430x43"); break;
3432             case E_MSP430_MACH_MSP430x44: strcat (buf, "MSP430x44"); break;
3433             case E_MSP430_MACH_MSP430X  : strcat (buf, "MSP430X"); break;
3434             default:
3435               strcat (buf, _(": unknown")); break;
3436             }
3437
3438           if (e_flags & ~ EF_MSP430_MACH)
3439             strcat (buf, _(": unknown extra flag bits also present"));
3440         }
3441     }
3442
3443   return buf;
3444 }
3445
3446 static const char *
3447 get_osabi_name (unsigned int osabi)
3448 {
3449   static char buff[32];
3450
3451   switch (osabi)
3452     {
3453     case ELFOSABI_NONE:         return "UNIX - System V";
3454     case ELFOSABI_HPUX:         return "UNIX - HP-UX";
3455     case ELFOSABI_NETBSD:       return "UNIX - NetBSD";
3456     case ELFOSABI_GNU:          return "UNIX - GNU";
3457     case ELFOSABI_SOLARIS:      return "UNIX - Solaris";
3458     case ELFOSABI_AIX:          return "UNIX - AIX";
3459     case ELFOSABI_IRIX:         return "UNIX - IRIX";
3460     case ELFOSABI_FREEBSD:      return "UNIX - FreeBSD";
3461     case ELFOSABI_TRU64:        return "UNIX - TRU64";
3462     case ELFOSABI_MODESTO:      return "Novell - Modesto";
3463     case ELFOSABI_OPENBSD:      return "UNIX - OpenBSD";
3464     case ELFOSABI_OPENVMS:      return "VMS - OpenVMS";
3465     case ELFOSABI_NSK:          return "HP - Non-Stop Kernel";
3466     case ELFOSABI_AROS:         return "AROS";
3467     case ELFOSABI_FENIXOS:      return "FenixOS";
3468     default:
3469       if (osabi >= 64)
3470         switch (elf_header.e_machine)
3471           {
3472           case EM_ARM:
3473             switch (osabi)
3474               {
3475               case ELFOSABI_ARM:        return "ARM";
3476               default:
3477                 break;
3478               }
3479             break;
3480
3481           case EM_MSP430:
3482           case EM_MSP430_OLD:
3483           case EM_VISIUM:
3484             switch (osabi)
3485               {
3486               case ELFOSABI_STANDALONE: return _("Standalone App");
3487               default:
3488                 break;
3489               }
3490             break;
3491
3492           case EM_TI_C6000:
3493             switch (osabi)
3494               {
3495               case ELFOSABI_C6000_ELFABI:       return _("Bare-metal C6000");
3496               case ELFOSABI_C6000_LINUX:        return "Linux C6000";
3497               default:
3498                 break;
3499               }
3500             break;
3501
3502           default:
3503             break;
3504           }
3505       snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
3506       return buff;
3507     }
3508 }
3509
3510 static const char *
3511 get_aarch64_segment_type (unsigned long type)
3512 {
3513   switch (type)
3514     {
3515     case PT_AARCH64_ARCHEXT:
3516       return "AARCH64_ARCHEXT";
3517     default:
3518       break;
3519     }
3520
3521   return NULL;
3522 }
3523
3524 static const char *
3525 get_arm_segment_type (unsigned long type)
3526 {
3527   switch (type)
3528     {
3529     case PT_ARM_EXIDX:
3530       return "EXIDX";
3531     default:
3532       break;
3533     }
3534
3535   return NULL;
3536 }
3537
3538 static const char *
3539 get_mips_segment_type (unsigned long type)
3540 {
3541   switch (type)
3542     {
3543     case PT_MIPS_REGINFO:
3544       return "REGINFO";
3545     case PT_MIPS_RTPROC:
3546       return "RTPROC";
3547     case PT_MIPS_OPTIONS:
3548       return "OPTIONS";
3549     case PT_MIPS_ABIFLAGS:
3550       return "ABIFLAGS";
3551     default:
3552       break;
3553     }
3554
3555   return NULL;
3556 }
3557
3558 static const char *
3559 get_parisc_segment_type (unsigned long type)
3560 {
3561   switch (type)
3562     {
3563     case PT_HP_TLS:             return "HP_TLS";
3564     case PT_HP_CORE_NONE:       return "HP_CORE_NONE";
3565     case PT_HP_CORE_VERSION:    return "HP_CORE_VERSION";
3566     case PT_HP_CORE_KERNEL:     return "HP_CORE_KERNEL";
3567     case PT_HP_CORE_COMM:       return "HP_CORE_COMM";
3568     case PT_HP_CORE_PROC:       return "HP_CORE_PROC";
3569     case PT_HP_CORE_LOADABLE:   return "HP_CORE_LOADABLE";
3570     case PT_HP_CORE_STACK:      return "HP_CORE_STACK";
3571     case PT_HP_CORE_SHM:        return "HP_CORE_SHM";
3572     case PT_HP_CORE_MMF:        return "HP_CORE_MMF";
3573     case PT_HP_PARALLEL:        return "HP_PARALLEL";
3574     case PT_HP_FASTBIND:        return "HP_FASTBIND";
3575     case PT_HP_OPT_ANNOT:       return "HP_OPT_ANNOT";
3576     case PT_HP_HSL_ANNOT:       return "HP_HSL_ANNOT";
3577     case PT_HP_STACK:           return "HP_STACK";
3578     case PT_HP_CORE_UTSNAME:    return "HP_CORE_UTSNAME";
3579     case PT_PARISC_ARCHEXT:     return "PARISC_ARCHEXT";
3580     case PT_PARISC_UNWIND:      return "PARISC_UNWIND";
3581     case PT_PARISC_WEAKORDER:   return "PARISC_WEAKORDER";
3582     default:
3583       break;
3584     }
3585
3586   return NULL;
3587 }
3588
3589 static const char *
3590 get_ia64_segment_type (unsigned long type)
3591 {
3592   switch (type)
3593     {
3594     case PT_IA_64_ARCHEXT:      return "IA_64_ARCHEXT";
3595     case PT_IA_64_UNWIND:       return "IA_64_UNWIND";
3596     case PT_HP_TLS:             return "HP_TLS";
3597     case PT_IA_64_HP_OPT_ANOT:  return "HP_OPT_ANNOT";
3598     case PT_IA_64_HP_HSL_ANOT:  return "HP_HSL_ANNOT";
3599     case PT_IA_64_HP_STACK:     return "HP_STACK";
3600     default:
3601       break;
3602     }
3603
3604   return NULL;
3605 }
3606
3607 static const char *
3608 get_tic6x_segment_type (unsigned long type)
3609 {
3610   switch (type)
3611     {
3612     case PT_C6000_PHATTR:       return "C6000_PHATTR";
3613     default:
3614       break;
3615     }
3616
3617   return NULL;
3618 }
3619
3620 static const char *
3621 get_segment_type (unsigned long p_type)
3622 {
3623   static char buff[32];
3624
3625   switch (p_type)
3626     {
3627     case PT_NULL:       return "NULL";
3628     case PT_LOAD:       return "LOAD";
3629     case PT_DYNAMIC:    return "DYNAMIC";
3630     case PT_INTERP:     return "INTERP";
3631     case PT_NOTE:       return "NOTE";
3632     case PT_SHLIB:      return "SHLIB";
3633     case PT_PHDR:       return "PHDR";
3634     case PT_TLS:        return "TLS";
3635
3636     case PT_GNU_EH_FRAME:
3637                         return "GNU_EH_FRAME";
3638     case PT_GNU_STACK:  return "GNU_STACK";
3639     case PT_GNU_RELRO:  return "GNU_RELRO";
3640
3641     default:
3642       if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
3643         {
3644           const char * result;
3645
3646           switch (elf_header.e_machine)
3647             {
3648             case EM_AARCH64:
3649               result = get_aarch64_segment_type (p_type);
3650               break;
3651             case EM_ARM:
3652               result = get_arm_segment_type (p_type);
3653               break;
3654             case EM_MIPS:
3655             case EM_MIPS_RS3_LE:
3656               result = get_mips_segment_type (p_type);
3657               break;
3658             case EM_PARISC:
3659               result = get_parisc_segment_type (p_type);
3660               break;
3661             case EM_IA_64:
3662               result = get_ia64_segment_type (p_type);
3663               break;
3664             case EM_TI_C6000:
3665               result = get_tic6x_segment_type (p_type);
3666               break;
3667             default:
3668               result = NULL;
3669               break;
3670             }
3671
3672           if (result != NULL)
3673             return result;
3674
3675           sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
3676         }
3677       else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
3678         {
3679           const char * result;
3680
3681           switch (elf_header.e_machine)
3682             {
3683             case EM_PARISC:
3684               result = get_parisc_segment_type (p_type);
3685               break;
3686             case EM_IA_64:
3687               result = get_ia64_segment_type (p_type);
3688               break;
3689             default:
3690               result = NULL;
3691               break;
3692             }
3693
3694           if (result != NULL)
3695             return result;
3696
3697           sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
3698         }
3699       else
3700         snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
3701
3702       return buff;
3703     }
3704 }
3705
3706 static const char *
3707 get_mips_section_type_name (unsigned int sh_type)
3708 {
3709   switch (sh_type)
3710     {
3711     case SHT_MIPS_LIBLIST:       return "MIPS_LIBLIST";
3712     case SHT_MIPS_MSYM:          return "MIPS_MSYM";
3713     case SHT_MIPS_CONFLICT:      return "MIPS_CONFLICT";
3714     case SHT_MIPS_GPTAB:         return "MIPS_GPTAB";
3715     case SHT_MIPS_UCODE:         return "MIPS_UCODE";
3716     case SHT_MIPS_DEBUG:         return "MIPS_DEBUG";
3717     case SHT_MIPS_REGINFO:       return "MIPS_REGINFO";
3718     case SHT_MIPS_PACKAGE:       return "MIPS_PACKAGE";
3719     case SHT_MIPS_PACKSYM:       return "MIPS_PACKSYM";
3720     case SHT_MIPS_RELD:          return "MIPS_RELD";
3721     case SHT_MIPS_IFACE:         return "MIPS_IFACE";
3722     case SHT_MIPS_CONTENT:       return "MIPS_CONTENT";
3723     case SHT_MIPS_OPTIONS:       return "MIPS_OPTIONS";
3724     case SHT_MIPS_SHDR:          return "MIPS_SHDR";
3725     case SHT_MIPS_FDESC:         return "MIPS_FDESC";
3726     case SHT_MIPS_EXTSYM:        return "MIPS_EXTSYM";
3727     case SHT_MIPS_DENSE:         return "MIPS_DENSE";
3728     case SHT_MIPS_PDESC:         return "MIPS_PDESC";
3729     case SHT_MIPS_LOCSYM:        return "MIPS_LOCSYM";
3730     case SHT_MIPS_AUXSYM:        return "MIPS_AUXSYM";
3731     case SHT_MIPS_OPTSYM:        return "MIPS_OPTSYM";
3732     case SHT_MIPS_LOCSTR:        return "MIPS_LOCSTR";
3733     case SHT_MIPS_LINE:          return "MIPS_LINE";
3734     case SHT_MIPS_RFDESC:        return "MIPS_RFDESC";
3735     case SHT_MIPS_DELTASYM:      return "MIPS_DELTASYM";
3736     case SHT_MIPS_DELTAINST:     return "MIPS_DELTAINST";
3737     case SHT_MIPS_DELTACLASS:    return "MIPS_DELTACLASS";
3738     case SHT_MIPS_DWARF:         return "MIPS_DWARF";
3739     case SHT_MIPS_DELTADECL:     return "MIPS_DELTADECL";
3740     case SHT_MIPS_SYMBOL_LIB:    return "MIPS_SYMBOL_LIB";
3741     case SHT_MIPS_EVENTS:        return "MIPS_EVENTS";
3742     case SHT_MIPS_TRANSLATE:     return "MIPS_TRANSLATE";
3743     case SHT_MIPS_PIXIE:         return "MIPS_PIXIE";
3744     case SHT_MIPS_XLATE:         return "MIPS_XLATE";
3745     case SHT_MIPS_XLATE_DEBUG:   return "MIPS_XLATE_DEBUG";
3746     case SHT_MIPS_WHIRL:         return "MIPS_WHIRL";
3747     case SHT_MIPS_EH_REGION:     return "MIPS_EH_REGION";
3748     case SHT_MIPS_XLATE_OLD:     return "MIPS_XLATE_OLD";
3749     case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
3750     case SHT_MIPS_ABIFLAGS:      return "MIPS_ABIFLAGS";
3751     default:
3752       break;
3753     }
3754   return NULL;
3755 }
3756
3757 static const char *
3758 get_parisc_section_type_name (unsigned int sh_type)
3759 {
3760   switch (sh_type)
3761     {
3762     case SHT_PARISC_EXT:        return "PARISC_EXT";
3763     case SHT_PARISC_UNWIND:     return "PARISC_UNWIND";
3764     case SHT_PARISC_DOC:        return "PARISC_DOC";
3765     case SHT_PARISC_ANNOT:      return "PARISC_ANNOT";
3766     case SHT_PARISC_SYMEXTN:    return "PARISC_SYMEXTN";
3767     case SHT_PARISC_STUBS:      return "PARISC_STUBS";
3768     case SHT_PARISC_DLKM:       return "PARISC_DLKM";
3769     default:
3770       break;
3771     }
3772   return NULL;
3773 }
3774
3775 static const char *
3776 get_ia64_section_type_name (unsigned int sh_type)
3777 {
3778   /* If the top 8 bits are 0x78 the next 8 are the os/abi ID.  */
3779   if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
3780     return get_osabi_name ((sh_type & 0x00FF0000) >> 16);
3781
3782   switch (sh_type)
3783     {
3784     case SHT_IA_64_EXT:                return "IA_64_EXT";
3785     case SHT_IA_64_UNWIND:             return "IA_64_UNWIND";
3786     case SHT_IA_64_PRIORITY_INIT:      return "IA_64_PRIORITY_INIT";
3787     case SHT_IA_64_VMS_TRACE:          return "VMS_TRACE";
3788     case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
3789     case SHT_IA_64_VMS_DEBUG:          return "VMS_DEBUG";
3790     case SHT_IA_64_VMS_DEBUG_STR:      return "VMS_DEBUG_STR";
3791     case SHT_IA_64_VMS_LINKAGES:       return "VMS_LINKAGES";
3792     case SHT_IA_64_VMS_SYMBOL_VECTOR:  return "VMS_SYMBOL_VECTOR";
3793     case SHT_IA_64_VMS_FIXUP:          return "VMS_FIXUP";
3794     default:
3795       break;
3796     }
3797   return NULL;
3798 }
3799
3800 static const char *
3801 get_x86_64_section_type_name (unsigned int sh_type)
3802 {
3803   switch (sh_type)
3804     {
3805     case SHT_X86_64_UNWIND:     return "X86_64_UNWIND";
3806     default:
3807       break;
3808     }
3809   return NULL;
3810 }
3811
3812 static const char *
3813 get_aarch64_section_type_name (unsigned int sh_type)
3814 {
3815   switch (sh_type)
3816     {
3817     case SHT_AARCH64_ATTRIBUTES:
3818       return "AARCH64_ATTRIBUTES";
3819     default:
3820       break;
3821     }
3822   return NULL;
3823 }
3824
3825 static const char *
3826 get_arm_section_type_name (unsigned int sh_type)
3827 {
3828   switch (sh_type)
3829     {
3830     case SHT_ARM_EXIDX:           return "ARM_EXIDX";
3831     case SHT_ARM_PREEMPTMAP:      return "ARM_PREEMPTMAP";
3832     case SHT_ARM_ATTRIBUTES:      return "ARM_ATTRIBUTES";
3833     case SHT_ARM_DEBUGOVERLAY:    return "ARM_DEBUGOVERLAY";
3834     case SHT_ARM_OVERLAYSECTION:  return "ARM_OVERLAYSECTION";
3835     default:
3836       break;
3837     }
3838   return NULL;
3839 }
3840
3841 static const char *
3842 get_tic6x_section_type_name (unsigned int sh_type)
3843 {
3844   switch (sh_type)
3845     {
3846     case SHT_C6000_UNWIND:
3847       return "C6000_UNWIND";
3848     case SHT_C6000_PREEMPTMAP:
3849       return "C6000_PREEMPTMAP";
3850     case SHT_C6000_ATTRIBUTES:
3851       return "C6000_ATTRIBUTES";
3852     case SHT_TI_ICODE:
3853       return "TI_ICODE";
3854     case SHT_TI_XREF:
3855       return "TI_XREF";
3856     case SHT_TI_HANDLER:
3857       return "TI_HANDLER";
3858     case SHT_TI_INITINFO:
3859       return "TI_INITINFO";
3860     case SHT_TI_PHATTRS:
3861       return "TI_PHATTRS";
3862     default:
3863       break;
3864     }
3865   return NULL;
3866 }
3867
3868 static const char *
3869 get_msp430x_section_type_name (unsigned int sh_type)
3870 {
3871   switch (sh_type)
3872     {
3873     case SHT_MSP430_SEC_FLAGS:   return "MSP430_SEC_FLAGS";
3874     case SHT_MSP430_SYM_ALIASES: return "MSP430_SYM_ALIASES";
3875     case SHT_MSP430_ATTRIBUTES:  return "MSP430_ATTRIBUTES";
3876     default: return NULL;
3877     }
3878 }
3879
3880 static const char *
3881 get_v850_section_type_name (unsigned int sh_type)
3882 {
3883   switch (sh_type)
3884     {
3885     case SHT_V850_SCOMMON: return "V850 Small Common";
3886     case SHT_V850_TCOMMON: return "V850 Tiny Common";
3887     case SHT_V850_ZCOMMON: return "V850 Zero Common";
3888     case SHT_RENESAS_IOP:  return "RENESAS IOP";
3889     case SHT_RENESAS_INFO: return "RENESAS INFO";
3890     default: return NULL;
3891     }
3892 }
3893
3894 static const char *
3895 get_section_type_name (unsigned int sh_type)
3896 {
3897   static char buff[32];
3898   const char * result;
3899
3900   switch (sh_type)
3901     {
3902     case SHT_NULL:              return "NULL";
3903     case SHT_PROGBITS:          return "PROGBITS";
3904     case SHT_SYMTAB:            return "SYMTAB";
3905     case SHT_STRTAB:            return "STRTAB";
3906     case SHT_RELA:              return "RELA";
3907     case SHT_HASH:              return "HASH";
3908     case SHT_DYNAMIC:           return "DYNAMIC";
3909     case SHT_NOTE:              return "NOTE";
3910     case SHT_NOBITS:            return "NOBITS";
3911     case SHT_REL:               return "REL";
3912     case SHT_SHLIB:             return "SHLIB";
3913     case SHT_DYNSYM:            return "DYNSYM";
3914     case SHT_INIT_ARRAY:        return "INIT_ARRAY";
3915     case SHT_FINI_ARRAY:        return "FINI_ARRAY";
3916     case SHT_PREINIT_ARRAY:     return "PREINIT_ARRAY";
3917     case SHT_GNU_HASH:          return "GNU_HASH";
3918     case SHT_GROUP:             return "GROUP";
3919     case SHT_SYMTAB_SHNDX:      return "SYMTAB SECTION INDICIES";
3920     case SHT_GNU_verdef:        return "VERDEF";
3921     case SHT_GNU_verneed:       return "VERNEED";
3922     case SHT_GNU_versym:        return "VERSYM";
3923     case 0x6ffffff0:            return "VERSYM";
3924     case 0x6ffffffc:            return "VERDEF";
3925     case 0x7ffffffd:            return "AUXILIARY";
3926     case 0x7fffffff:            return "FILTER";
3927     case SHT_GNU_LIBLIST:       return "GNU_LIBLIST";
3928
3929     default:
3930       if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
3931         {
3932           switch (elf_header.e_machine)
3933             {
3934             case EM_MIPS:
3935             case EM_MIPS_RS3_LE:
3936               result = get_mips_section_type_name (sh_type);
3937               break;
3938             case EM_PARISC:
3939               result = get_parisc_section_type_name (sh_type);
3940               break;
3941             case EM_IA_64:
3942               result = get_ia64_section_type_name (sh_type);
3943               break;
3944             case EM_X86_64:
3945             case EM_L1OM:
3946             case EM_K1OM:
3947               result = get_x86_64_section_type_name (sh_type);
3948               break;
3949             case EM_AARCH64:
3950               result = get_aarch64_section_type_name (sh_type);
3951               break;
3952             case EM_ARM:
3953               result = get_arm_section_type_name (sh_type);
3954               break;
3955             case EM_TI_C6000:
3956               result = get_tic6x_section_type_name (sh_type);
3957               break;
3958             case EM_MSP430:
3959               result = get_msp430x_section_type_name (sh_type);
3960               break;
3961             case EM_V800:
3962             case EM_V850:
3963             case EM_CYGNUS_V850:
3964               result = get_v850_section_type_name (sh_type);
3965               break;
3966             default:
3967               result = NULL;
3968               break;
3969             }
3970
3971           if (result != NULL)
3972             return result;
3973
3974           sprintf (buff, "LOPROC+%#x", sh_type - SHT_LOPROC);
3975         }
3976       else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
3977         {
3978           switch (elf_header.e_machine)
3979             {
3980             case EM_IA_64:
3981               result = get_ia64_section_type_name (sh_type);
3982               break;
3983             default:
3984               result = NULL;
3985               break;
3986             }
3987
3988           if (result != NULL)
3989             return result;
3990
3991           sprintf (buff, "LOOS+%#x", sh_type - SHT_LOOS);
3992         }
3993       else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
3994         {
3995           switch (elf_header.e_machine)
3996             {
3997             case EM_V800:
3998             case EM_V850:
3999             case EM_CYGNUS_V850:
4000               result = get_v850_section_type_name (sh_type);
4001               break;
4002             default:
4003               result = NULL;
4004               break;
4005             }
4006
4007           if (result != NULL)
4008             return result;
4009
4010           sprintf (buff, "LOUSER+%#x", sh_type - SHT_LOUSER);
4011         }
4012       else
4013         /* This message is probably going to be displayed in a 15
4014            character wide field, so put the hex value first.  */
4015         snprintf (buff, sizeof (buff), _("%08x: <unknown>"), sh_type);
4016
4017       return buff;
4018     }
4019 }
4020
4021 #define OPTION_DEBUG_DUMP       512
4022 #define OPTION_DYN_SYMS         513
4023 #define OPTION_DWARF_DEPTH      514
4024 #define OPTION_DWARF_START      515
4025 #define OPTION_DWARF_CHECK      516
4026
4027 static struct option options[] =
4028 {
4029   {"all",              no_argument, 0, 'a'},
4030   {"file-header",      no_argument, 0, 'h'},
4031   {"program-headers",  no_argument, 0, 'l'},
4032   {"headers",          no_argument, 0, 'e'},
4033   {"histogram",        no_argument, 0, 'I'},
4034   {"segments",         no_argument, 0, 'l'},
4035   {"sections",         no_argument, 0, 'S'},
4036   {"section-headers",  no_argument, 0, 'S'},
4037   {"section-groups",   no_argument, 0, 'g'},
4038   {"section-details",  no_argument, 0, 't'},
4039   {"full-section-name",no_argument, 0, 'N'},
4040   {"symbols",          no_argument, 0, 's'},
4041   {"syms",             no_argument, 0, 's'},
4042   {"dyn-syms",         no_argument, 0, OPTION_DYN_SYMS},
4043   {"relocs",           no_argument, 0, 'r'},
4044   {"notes",            no_argument, 0, 'n'},
4045   {"dynamic",          no_argument, 0, 'd'},
4046   {"arch-specific",    no_argument, 0, 'A'},
4047   {"version-info",     no_argument, 0, 'V'},
4048   {"use-dynamic",      no_argument, 0, 'D'},
4049   {"unwind",           no_argument, 0, 'u'},
4050   {"archive-index",    no_argument, 0, 'c'},
4051   {"hex-dump",         required_argument, 0, 'x'},
4052   {"relocated-dump",   required_argument, 0, 'R'},
4053   {"string-dump",      required_argument, 0, 'p'},
4054   {"decompress",       no_argument, 0, 'z'},
4055 #ifdef SUPPORT_DISASSEMBLY
4056   {"instruction-dump", required_argument, 0, 'i'},
4057 #endif
4058   {"debug-dump",       optional_argument, 0, OPTION_DEBUG_DUMP},
4059
4060   {"dwarf-depth",      required_argument, 0, OPTION_DWARF_DEPTH},
4061   {"dwarf-start",      required_argument, 0, OPTION_DWARF_START},
4062   {"dwarf-check",      no_argument, 0, OPTION_DWARF_CHECK},
4063
4064   {"version",          no_argument, 0, 'v'},
4065   {"wide",             no_argument, 0, 'W'},
4066   {"help",             no_argument, 0, 'H'},
4067   {0,                  no_argument, 0, 0}
4068 };
4069
4070 static void
4071 usage (FILE * stream)
4072 {
4073   fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
4074   fprintf (stream, _(" Display information about the contents of ELF format files\n"));
4075   fprintf (stream, _(" Options are:\n\
4076   -a --all               Equivalent to: -h -l -S -s -r -d -V -A -I\n\
4077   -h --file-header       Display the ELF file header\n\
4078   -l --program-headers   Display the program headers\n\
4079      --segments          An alias for --program-headers\n\
4080   -S --section-headers   Display the sections' header\n\
4081      --sections          An alias for --section-headers\n\
4082   -g --section-groups    Display the section groups\n\
4083   -t --section-details   Display the section details\n\
4084   -e --headers           Equivalent to: -h -l -S\n\
4085   -s --syms              Display the symbol table\n\
4086      --symbols           An alias for --syms\n\
4087   --dyn-syms             Display the dynamic symbol table\n\
4088   -n --notes             Display the core notes (if present)\n\
4089   -r --relocs            Display the relocations (if present)\n\
4090   -u --unwind            Display the unwind info (if present)\n\
4091   -d --dynamic           Display the dynamic section (if present)\n\
4092   -V --version-info      Display the version sections (if present)\n\
4093   -A --arch-specific     Display architecture specific information (if any)\n\
4094   -c --archive-index     Display the symbol/file index in an archive\n\
4095   -D --use-dynamic       Use the dynamic section info when displaying symbols\n\
4096   -x --hex-dump=<number|name>\n\
4097                          Dump the contents of section <number|name> as bytes\n\
4098   -p --string-dump=<number|name>\n\
4099                          Dump the contents of section <number|name> as strings\n\
4100   -R --relocated-dump=<number|name>\n\
4101                          Dump the contents of section <number|name> as relocated bytes\n\
4102   -z --decompress        Decompress section before dumping it\n\
4103   -w[lLiaprmfFsoRt] or\n\
4104   --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
4105                =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
4106                =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
4107                =addr,=cu_index]\n\
4108                          Display the contents of DWARF2 debug sections\n"));
4109   fprintf (stream, _("\
4110   --dwarf-depth=N        Do not display DIEs at depth N or greater\n\
4111   --dwarf-start=N        Display DIEs starting with N, at the same depth\n\
4112                          or deeper\n"));
4113 #ifdef SUPPORT_DISASSEMBLY
4114   fprintf (stream, _("\
4115   -i --instruction-dump=<number|name>\n\
4116                          Disassemble the contents of section <number|name>\n"));
4117 #endif
4118   fprintf (stream, _("\
4119   -I --histogram         Display histogram of bucket list lengths\n\
4120   -W --wide              Allow output width to exceed 80 characters\n\
4121   @<file>                Read options from <file>\n\
4122   -H --help              Display this information\n\
4123   -v --version           Display the version number of readelf\n"));
4124
4125   if (REPORT_BUGS_TO[0] && stream == stdout)
4126     fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
4127
4128   exit (stream == stdout ? 0 : 1);
4129 }
4130
4131 /* Record the fact that the user wants the contents of section number
4132    SECTION to be displayed using the method(s) encoded as flags bits
4133    in TYPE.  Note, TYPE can be zero if we are creating the array for
4134    the first time.  */
4135
4136 static void
4137 request_dump_bynumber (unsigned int section, dump_type type)
4138 {
4139   if (section >= num_dump_sects)
4140     {
4141       dump_type * new_dump_sects;
4142
4143       new_dump_sects = (dump_type *) calloc (section + 1,
4144                                              sizeof (* dump_sects));
4145
4146       if (new_dump_sects == NULL)
4147         error (_("Out of memory allocating dump request table.\n"));
4148       else
4149         {
4150           /* Copy current flag settings.  */
4151           memcpy (new_dump_sects, dump_sects, num_dump_sects * sizeof (* dump_sects));
4152
4153           free (dump_sects);
4154
4155           dump_sects = new_dump_sects;
4156           num_dump_sects = section + 1;
4157         }
4158     }
4159
4160   if (dump_sects)
4161     dump_sects[section] |= type;
4162
4163   return;
4164 }
4165
4166 /* Request a dump by section name.  */
4167
4168 static void
4169 request_dump_byname (const char * section, dump_type type)
4170 {
4171   struct dump_list_entry * new_request;
4172
4173   new_request = (struct dump_list_entry *)
4174       malloc (sizeof (struct dump_list_entry));
4175   if (!new_request)
4176     error (_("Out of memory allocating dump request table.\n"));
4177
4178   new_request->name = strdup (section);
4179   if (!new_request->name)
4180     error (_("Out of memory allocating dump request table.\n"));
4181
4182   new_request->type = type;
4183
4184   new_request->next = dump_sects_byname;
4185   dump_sects_byname = new_request;
4186 }
4187
4188 static inline void
4189 request_dump (dump_type type)
4190 {
4191   int section;
4192   char * cp;
4193
4194   do_dump++;
4195   section = strtoul (optarg, & cp, 0);
4196
4197   if (! *cp && section >= 0)
4198     request_dump_bynumber (section, type);
4199   else
4200     request_dump_byname (optarg, type);
4201 }
4202
4203
4204 static void
4205 parse_args (int argc, char ** argv)
4206 {
4207   int c;
4208
4209   if (argc < 2)
4210     usage (stderr);
4211
4212   while ((c = getopt_long
4213           (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:z", options, NULL)) != EOF)
4214     {
4215       switch (c)
4216         {
4217         case 0:
4218           /* Long options.  */
4219           break;
4220         case 'H':
4221           usage (stdout);
4222           break;
4223
4224         case 'a':
4225           do_syms++;
4226           do_reloc++;
4227           do_unwind++;
4228           do_dynamic++;
4229           do_header++;
4230           do_sections++;
4231           do_section_groups++;
4232           do_segments++;
4233           do_version++;
4234           do_histogram++;
4235           do_arch++;
4236           do_notes++;
4237           break;
4238         case 'g':
4239           do_section_groups++;
4240           break;
4241         case 't':
4242         case 'N':
4243           do_sections++;
4244           do_section_details++;
4245           break;
4246         case 'e':
4247           do_header++;
4248           do_sections++;
4249           do_segments++;
4250           break;
4251         case 'A':
4252           do_arch++;
4253           break;
4254         case 'D':
4255           do_using_dynamic++;
4256           break;
4257         case 'r':
4258           do_reloc++;
4259           break;
4260         case 'u':
4261           do_unwind++;
4262           break;
4263         case 'h':
4264           do_header++;
4265           break;
4266         case 'l':
4267           do_segments++;
4268           break;
4269         case 's':
4270           do_syms++;
4271           break;
4272         case 'S':
4273           do_sections++;
4274           break;
4275         case 'd':
4276           do_dynamic++;
4277           break;
4278         case 'I':
4279           do_histogram++;
4280           break;
4281         case 'n':
4282           do_notes++;
4283           break;
4284         case 'c':
4285           do_archive_index++;
4286           break;
4287         case 'x':
4288           request_dump (HEX_DUMP);
4289           break;
4290         case 'p':
4291           request_dump (STRING_DUMP);
4292           break;
4293         case 'R':
4294           request_dump (RELOC_DUMP);
4295           break;
4296         case 'z':
4297           decompress_dumps++;
4298           break;
4299         case 'w':
4300           do_dump++;
4301           if (optarg == 0)
4302             {
4303               do_debugging = 1;
4304               dwarf_select_sections_all ();
4305             }
4306           else
4307             {
4308               do_debugging = 0;
4309               dwarf_select_sections_by_letters (optarg);
4310             }
4311           break;
4312         case OPTION_DEBUG_DUMP:
4313           do_dump++;
4314           if (optarg == 0)
4315             do_debugging = 1;
4316           else
4317             {
4318               do_debugging = 0;
4319               dwarf_select_sections_by_names (optarg);
4320             }
4321           break;
4322         case OPTION_DWARF_DEPTH:
4323           {
4324             char *cp;
4325
4326             dwarf_cutoff_level = strtoul (optarg, & cp, 0);
4327           }
4328           break;
4329         case OPTION_DWARF_START:
4330           {
4331             char *cp;
4332
4333             dwarf_start_die = strtoul (optarg, & cp, 0);
4334           }
4335           break;
4336         case OPTION_DWARF_CHECK:
4337           dwarf_check = 1;
4338           break;
4339         case OPTION_DYN_SYMS:
4340           do_dyn_syms++;
4341           break;
4342 #ifdef SUPPORT_DISASSEMBLY
4343         case 'i':
4344           request_dump (DISASS_DUMP);
4345           break;
4346 #endif
4347         case 'v':
4348           print_version (program_name);
4349           break;
4350         case 'V':
4351           do_version++;
4352           break;
4353         case 'W':
4354           do_wide++;
4355           break;
4356         default:
4357           /* xgettext:c-format */
4358           error (_("Invalid option '-%c'\n"), c);
4359           /* Drop through.  */
4360         case '?':
4361           usage (stderr);
4362         }
4363     }
4364
4365   if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
4366       && !do_segments && !do_header && !do_dump && !do_version
4367       && !do_histogram && !do_debugging && !do_arch && !do_notes
4368       && !do_section_groups && !do_archive_index
4369       && !do_dyn_syms)
4370     usage (stderr);
4371 }
4372
4373 static const char *
4374 get_elf_class (unsigned int elf_class)
4375 {
4376   static char buff[32];
4377
4378   switch (elf_class)
4379     {
4380     case ELFCLASSNONE: return _("none");
4381     case ELFCLASS32:   return "ELF32";
4382     case ELFCLASS64:   return "ELF64";
4383     default:
4384       snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
4385       return buff;
4386     }
4387 }
4388
4389 static const char *
4390 get_data_encoding (unsigned int encoding)
4391 {
4392   static char buff[32];
4393
4394   switch (encoding)
4395     {
4396     case ELFDATANONE: return _("none");
4397     case ELFDATA2LSB: return _("2's complement, little endian");
4398     case ELFDATA2MSB: return _("2's complement, big endian");
4399     default:
4400       snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
4401       return buff;
4402     }
4403 }
4404
4405 /* Decode the data held in 'elf_header'.  */
4406
4407 static int
4408 process_file_header (void)
4409 {
4410   if (   elf_header.e_ident[EI_MAG0] != ELFMAG0
4411       || elf_header.e_ident[EI_MAG1] != ELFMAG1
4412       || elf_header.e_ident[EI_MAG2] != ELFMAG2
4413       || elf_header.e_ident[EI_MAG3] != ELFMAG3)
4414     {
4415       error
4416         (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
4417       return 0;
4418     }
4419
4420   init_dwarf_regnames (elf_header.e_machine);
4421
4422   if (do_header)
4423     {
4424       int i;
4425
4426       printf (_("ELF Header:\n"));
4427       printf (_("  Magic:   "));
4428       for (i = 0; i < EI_NIDENT; i++)
4429         printf ("%2.2x ", elf_header.e_ident[i]);
4430       printf ("\n");
4431       printf (_("  Class:                             %s\n"),
4432               get_elf_class (elf_header.e_ident[EI_CLASS]));
4433       printf (_("  Data:                              %s\n"),
4434               get_data_encoding (elf_header.e_ident[EI_DATA]));
4435       printf (_("  Version:                           %d %s\n"),
4436               elf_header.e_ident[EI_VERSION],
4437               (elf_header.e_ident[EI_VERSION] == EV_CURRENT
4438                ? "(current)"
4439                : (elf_header.e_ident[EI_VERSION] != EV_NONE
4440                   ? _("<unknown: %lx>")
4441                   : "")));
4442       printf (_("  OS/ABI:                            %s\n"),
4443               get_osabi_name (elf_header.e_ident[EI_OSABI]));
4444       printf (_("  ABI Version:                       %d\n"),
4445               elf_header.e_ident[EI_ABIVERSION]);
4446       printf (_("  Type:                              %s\n"),
4447               get_file_type (elf_header.e_type));
4448       printf (_("  Machine:                           %s\n"),
4449               get_machine_name (elf_header.e_machine));
4450       printf (_("  Version:                           0x%lx\n"),
4451               (unsigned long) elf_header.e_version);
4452
4453       printf (_("  Entry point address:               "));
4454       print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4455       printf (_("\n  Start of program headers:          "));
4456       print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4457       printf (_(" (bytes into file)\n  Start of section headers:          "));
4458       print_vma ((bfd_vma) elf_header.e_shoff, DEC);
4459       printf (_(" (bytes into file)\n"));
4460
4461       printf (_("  Flags:                             0x%lx%s\n"),
4462               (unsigned long) elf_header.e_flags,
4463               get_machine_flags (elf_header.e_flags, elf_header.e_machine));
4464       printf (_("  Size of this header:               %ld (bytes)\n"),
4465               (long) elf_header.e_ehsize);
4466       printf (_("  Size of program headers:           %ld (bytes)\n"),
4467               (long) elf_header.e_phentsize);
4468       printf (_("  Number of program headers:         %ld"),
4469               (long) elf_header.e_phnum);
4470       if (section_headers != NULL
4471           && elf_header.e_phnum == PN_XNUM
4472           && section_headers[0].sh_info != 0)
4473         printf (" (%ld)", (long) section_headers[0].sh_info);
4474       putc ('\n', stdout);
4475       printf (_("  Size of section headers:           %ld (bytes)\n"),
4476               (long) elf_header.e_shentsize);
4477       printf (_("  Number of section headers:         %ld"),
4478               (long) elf_header.e_shnum);
4479       if (section_headers != NULL && elf_header.e_shnum == SHN_UNDEF)
4480         printf (" (%ld)", (long) section_headers[0].sh_size);
4481       putc ('\n', stdout);
4482       printf (_("  Section header string table index: %ld"),
4483               (long) elf_header.e_shstrndx);
4484       if (section_headers != NULL
4485           && elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
4486         printf (" (%u)", section_headers[0].sh_link);
4487       else if (elf_header.e_shstrndx != SHN_UNDEF
4488                && elf_header.e_shstrndx >= elf_header.e_shnum)
4489         printf (_(" <corrupt: out of range>"));
4490       putc ('\n', stdout);
4491     }
4492
4493   if (section_headers != NULL)
4494     {
4495       if (elf_header.e_phnum == PN_XNUM
4496           && section_headers[0].sh_info != 0)
4497         elf_header.e_phnum = section_headers[0].sh_info;
4498       if (elf_header.e_shnum == SHN_UNDEF)
4499         elf_header.e_shnum = section_headers[0].sh_size;
4500       if (elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
4501         elf_header.e_shstrndx = section_headers[0].sh_link;
4502       else if (elf_header.e_shstrndx >= elf_header.e_shnum)
4503         elf_header.e_shstrndx = SHN_UNDEF;
4504       free (section_headers);
4505       section_headers = NULL;
4506     }
4507
4508   return 1;
4509 }
4510
4511 static bfd_boolean
4512 get_32bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
4513 {
4514   Elf32_External_Phdr * phdrs;
4515   Elf32_External_Phdr * external;
4516   Elf_Internal_Phdr *   internal;
4517   unsigned int i;
4518   unsigned int size = elf_header.e_phentsize;
4519   unsigned int num  = elf_header.e_phnum;
4520
4521   /* PR binutils/17531: Cope with unexpected section header sizes.  */
4522   if (size == 0 || num == 0)
4523     return FALSE;
4524   if (size < sizeof * phdrs)
4525     {
4526       error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4527       return FALSE;
4528     }
4529   if (size > sizeof * phdrs)
4530     warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4531
4532   phdrs = (Elf32_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
4533                                             size, num, _("program headers"));
4534   if (phdrs == NULL)
4535     return FALSE;
4536
4537   for (i = 0, internal = pheaders, external = phdrs;
4538        i < elf_header.e_phnum;
4539        i++, internal++, external++)
4540     {
4541       internal->p_type   = BYTE_GET (external->p_type);
4542       internal->p_offset = BYTE_GET (external->p_offset);
4543       internal->p_vaddr  = BYTE_GET (external->p_vaddr);
4544       internal->p_paddr  = BYTE_GET (external->p_paddr);
4545       internal->p_filesz = BYTE_GET (external->p_filesz);
4546       internal->p_memsz  = BYTE_GET (external->p_memsz);
4547       internal->p_flags  = BYTE_GET (external->p_flags);
4548       internal->p_align  = BYTE_GET (external->p_align);
4549     }
4550
4551   free (phdrs);
4552   return TRUE;
4553 }
4554
4555 static bfd_boolean
4556 get_64bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
4557 {
4558   Elf64_External_Phdr * phdrs;
4559   Elf64_External_Phdr * external;
4560   Elf_Internal_Phdr *   internal;
4561   unsigned int i;
4562   unsigned int size = elf_header.e_phentsize;
4563   unsigned int num  = elf_header.e_phnum;
4564
4565   /* PR binutils/17531: Cope with unexpected section header sizes.  */
4566   if (size == 0 || num == 0)
4567     return FALSE;
4568   if (size < sizeof * phdrs)
4569     {
4570       error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4571       return FALSE;
4572     }
4573   if (size > sizeof * phdrs)
4574     warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4575
4576   phdrs = (Elf64_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
4577                                             size, num, _("program headers"));
4578   if (!phdrs)
4579     return FALSE;
4580
4581   for (i = 0, internal = pheaders, external = phdrs;
4582        i < elf_header.e_phnum;
4583        i++, internal++, external++)
4584     {
4585       internal->p_type   = BYTE_GET (external->p_type);
4586       internal->p_flags  = BYTE_GET (external->p_flags);
4587       internal->p_offset = BYTE_GET (external->p_offset);
4588       internal->p_vaddr  = BYTE_GET (external->p_vaddr);
4589       internal->p_paddr  = BYTE_GET (external->p_paddr);
4590       internal->p_filesz = BYTE_GET (external->p_filesz);
4591       internal->p_memsz  = BYTE_GET (external->p_memsz);
4592       internal->p_align  = BYTE_GET (external->p_align);
4593     }
4594
4595   free (phdrs);
4596   return TRUE;
4597 }
4598
4599 /* Returns 1 if the program headers were read into `program_headers'.  */
4600
4601 static int
4602 get_program_headers (FILE * file)
4603 {
4604   Elf_Internal_Phdr * phdrs;
4605
4606   /* Check cache of prior read.  */
4607   if (program_headers != NULL)
4608     return 1;
4609
4610   phdrs = (Elf_Internal_Phdr *) cmalloc (elf_header.e_phnum,
4611                                          sizeof (Elf_Internal_Phdr));
4612
4613   if (phdrs == NULL)
4614     {
4615       error (_("Out of memory reading %u program headers\n"),
4616              elf_header.e_phnum);
4617       return 0;
4618     }
4619
4620   if (is_32bit_elf
4621       ? get_32bit_program_headers (file, phdrs)
4622       : get_64bit_program_headers (file, phdrs))
4623     {
4624       program_headers = phdrs;
4625       return 1;
4626     }
4627
4628   free (phdrs);
4629   return 0;
4630 }
4631
4632 /* Returns 1 if the program headers were loaded.  */
4633
4634 static int
4635 process_program_headers (FILE * file)
4636 {
4637   Elf_Internal_Phdr * segment;
4638   unsigned int i;
4639
4640   if (elf_header.e_phnum == 0)
4641     {
4642       /* PR binutils/12467.  */
4643       if (elf_header.e_phoff != 0)
4644         warn (_("possibly corrupt ELF header - it has a non-zero program"
4645                 " header offset, but no program headers\n"));
4646       else if (do_segments)
4647         printf (_("\nThere are no program headers in this file.\n"));
4648       return 0;
4649     }
4650
4651   if (do_segments && !do_header)
4652     {
4653       printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
4654       printf (_("Entry point "));
4655       print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4656       printf (_("\nThere are %d program headers, starting at offset "),
4657               elf_header.e_phnum);
4658       print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4659       printf ("\n");
4660     }
4661
4662   if (! get_program_headers (file))
4663       return 0;
4664
4665   if (do_segments)
4666     {
4667       if (elf_header.e_phnum > 1)
4668         printf (_("\nProgram Headers:\n"));
4669       else
4670         printf (_("\nProgram Headers:\n"));
4671
4672       if (is_32bit_elf)
4673         printf
4674           (_("  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align\n"));
4675       else if (do_wide)
4676         printf
4677           (_("  Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align\n"));
4678       else
4679         {
4680           printf
4681             (_("  Type           Offset             VirtAddr           PhysAddr\n"));
4682           printf
4683             (_("                 FileSiz            MemSiz              Flags  Align\n"));
4684         }
4685     }
4686
4687   dynamic_addr = 0;
4688   dynamic_size = 0;
4689
4690   for (i = 0, segment = program_headers;
4691        i < elf_header.e_phnum;
4692        i++, segment++)
4693     {
4694       if (do_segments)
4695         {
4696           printf ("  %-14.14s ", get_segment_type (segment->p_type));
4697
4698           if (is_32bit_elf)
4699             {
4700               printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4701               printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
4702               printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
4703               printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
4704               printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
4705               printf ("%c%c%c ",
4706                       (segment->p_flags & PF_R ? 'R' : ' '),
4707                       (segment->p_flags & PF_W ? 'W' : ' '),
4708                       (segment->p_flags & PF_X ? 'E' : ' '));
4709               printf ("%#lx", (unsigned long) segment->p_align);
4710             }
4711           else if (do_wide)
4712             {
4713               if ((unsigned long) segment->p_offset == segment->p_offset)
4714                 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4715               else
4716                 {
4717                   print_vma (segment->p_offset, FULL_HEX);
4718                   putchar (' ');
4719                 }
4720
4721               print_vma (segment->p_vaddr, FULL_HEX);
4722               putchar (' ');
4723               print_vma (segment->p_paddr, FULL_HEX);
4724               putchar (' ');
4725
4726               if ((unsigned long) segment->p_filesz == segment->p_filesz)
4727                 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
4728               else
4729                 {
4730                   print_vma (segment->p_filesz, FULL_HEX);
4731                   putchar (' ');
4732                 }
4733
4734               if ((unsigned long) segment->p_memsz == segment->p_memsz)
4735                 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
4736               else
4737                 {
4738                   print_vma (segment->p_memsz, FULL_HEX);
4739                 }
4740
4741               printf (" %c%c%c ",
4742                       (segment->p_flags & PF_R ? 'R' : ' '),
4743                       (segment->p_flags & PF_W ? 'W' : ' '),
4744                       (segment->p_flags & PF_X ? 'E' : ' '));
4745
4746               if ((unsigned long) segment->p_align == segment->p_align)
4747                 printf ("%#lx", (unsigned long) segment->p_align);
4748               else
4749                 {
4750                   print_vma (segment->p_align, PREFIX_HEX);
4751                 }
4752             }
4753           else
4754             {
4755               print_vma (segment->p_offset, FULL_HEX);
4756               putchar (' ');
4757               print_vma (segment->p_vaddr, FULL_HEX);
4758               putchar (' ');
4759               print_vma (segment->p_paddr, FULL_HEX);
4760               printf ("\n                 ");
4761               print_vma (segment->p_filesz, FULL_HEX);
4762               putchar (' ');
4763               print_vma (segment->p_memsz, FULL_HEX);
4764               printf ("  %c%c%c    ",
4765                       (segment->p_flags & PF_R ? 'R' : ' '),
4766                       (segment->p_flags & PF_W ? 'W' : ' '),
4767                       (segment->p_flags & PF_X ? 'E' : ' '));
4768               print_vma (segment->p_align, HEX);
4769             }
4770         }
4771
4772       if (do_segments)
4773         putc ('\n', stdout);
4774
4775       switch (segment->p_type)
4776         {
4777         case PT_DYNAMIC:
4778           if (dynamic_addr)
4779             error (_("more than one dynamic segment\n"));
4780
4781           /* By default, assume that the .dynamic section is the first
4782              section in the DYNAMIC segment.  */
4783           dynamic_addr = segment->p_offset;
4784           dynamic_size = segment->p_filesz;
4785           /* PR binutils/17512: Avoid corrupt dynamic section info in the segment.  */
4786           if (dynamic_addr + dynamic_size >= current_file_size)
4787             {
4788               error (_("the dynamic segment offset + size exceeds the size of the file\n"));
4789               dynamic_addr = dynamic_size = 0;
4790             }
4791
4792           /* Try to locate the .dynamic section. If there is
4793              a section header table, we can easily locate it.  */
4794           if (section_headers != NULL)
4795             {
4796               Elf_Internal_Shdr * sec;
4797
4798               sec = find_section (".dynamic");
4799               if (sec == NULL || sec->sh_size == 0)
4800                 {
4801                   /* A corresponding .dynamic section is expected, but on
4802                      IA-64/OpenVMS it is OK for it to be missing.  */
4803                   if (!is_ia64_vms ())
4804                     error (_("no .dynamic section in the dynamic segment\n"));
4805                   break;
4806                 }
4807
4808               if (sec->sh_type == SHT_NOBITS)
4809                 {
4810                   dynamic_size = 0;
4811                   break;
4812                 }
4813
4814               dynamic_addr = sec->sh_offset;
4815               dynamic_size = sec->sh_size;
4816
4817               if (dynamic_addr < segment->p_offset
4818                   || dynamic_addr > segment->p_offset + segment->p_filesz)
4819                 warn (_("the .dynamic section is not contained"
4820                         " within the dynamic segment\n"));
4821               else if (dynamic_addr > segment->p_offset)
4822                 warn (_("the .dynamic section is not the first section"
4823                         " in the dynamic segment.\n"));
4824             }
4825           break;
4826
4827         case PT_INTERP:
4828           if (fseek (file, archive_file_offset + (long) segment->p_offset,
4829                      SEEK_SET))
4830             error (_("Unable to find program interpreter name\n"));
4831           else
4832             {
4833               char fmt [32];
4834               int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX - 1);
4835
4836               if (ret >= (int) sizeof (fmt) || ret < 0)
4837                 error (_("Internal error: failed to create format string to display program interpreter\n"));
4838
4839               program_interpreter[0] = 0;
4840               if (fscanf (file, fmt, program_interpreter) <= 0)
4841                 error (_("Unable to read program interpreter name\n"));
4842
4843               if (do_segments)
4844                 printf (_("      [Requesting program interpreter: %s]\n"),
4845                     program_interpreter);
4846             }
4847           break;
4848         }
4849     }
4850
4851   if (do_segments && section_headers != NULL && string_table != NULL)
4852     {
4853       printf (_("\n Section to Segment mapping:\n"));
4854       printf (_("  Segment Sections...\n"));
4855
4856       for (i = 0; i < elf_header.e_phnum; i++)
4857         {
4858           unsigned int j;
4859           Elf_Internal_Shdr * section;
4860
4861           segment = program_headers + i;
4862           section = section_headers + 1;
4863
4864           printf ("   %2.2d     ", i);
4865
4866           for (j = 1; j < elf_header.e_shnum; j++, section++)
4867             {
4868               if (!ELF_TBSS_SPECIAL (section, segment)
4869                   && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
4870                 printf ("%s ", printable_section_name (section));
4871             }
4872
4873           putc ('\n',stdout);
4874         }
4875     }
4876
4877   return 1;
4878 }
4879
4880
4881 /* Find the file offset corresponding to VMA by using the program headers.  */
4882
4883 static long
4884 offset_from_vma (FILE * file, bfd_vma vma, bfd_size_type size)
4885 {
4886   Elf_Internal_Phdr * seg;
4887
4888   if (! get_program_headers (file))
4889     {
4890       warn (_("Cannot interpret virtual addresses without program headers.\n"));
4891       return (long) vma;
4892     }
4893
4894   for (seg = program_headers;
4895        seg < program_headers + elf_header.e_phnum;
4896        ++seg)
4897     {
4898       if (seg->p_type != PT_LOAD)
4899         continue;
4900
4901       if (vma >= (seg->p_vaddr & -seg->p_align)
4902           && vma + size <= seg->p_vaddr + seg->p_filesz)
4903         return vma - seg->p_vaddr + seg->p_offset;
4904     }
4905
4906   warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
4907         (unsigned long) vma);
4908   return (long) vma;
4909 }
4910
4911
4912 /* Allocate memory and load the sections headers into the global pointer
4913    SECTION_HEADERS.  If PROBE is true, this is just a probe and we do not
4914    generate any error messages if the load fails.  */
4915
4916 static bfd_boolean
4917 get_32bit_section_headers (FILE * file, bfd_boolean probe)
4918 {
4919   Elf32_External_Shdr * shdrs;
4920   Elf_Internal_Shdr *   internal;
4921   unsigned int i;
4922   unsigned int size = elf_header.e_shentsize;
4923   unsigned int num = probe ? 1 : elf_header.e_shnum;
4924
4925   /* PR binutils/17531: Cope with unexpected section header sizes.  */
4926   if (size == 0 || num == 0)
4927     return FALSE;
4928   if (size < sizeof * shdrs)
4929     {
4930       if (! probe)
4931         error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
4932       return FALSE;
4933     }
4934   if (!probe && size > sizeof * shdrs)
4935     warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
4936
4937   shdrs = (Elf32_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
4938                                             size, num,
4939                                             probe ? NULL : _("section headers"));
4940   if (shdrs == NULL)
4941     return FALSE;
4942
4943   if (section_headers != NULL)
4944     free (section_headers);
4945   section_headers = (Elf_Internal_Shdr *) cmalloc (num,
4946                                                    sizeof (Elf_Internal_Shdr));
4947   if (section_headers == NULL)
4948     {
4949       if (!probe)
4950         error (_("Out of memory reading %u section headers\n"), num);
4951       return FALSE;
4952     }
4953
4954   for (i = 0, internal = section_headers;
4955        i < num;
4956        i++, internal++)
4957     {
4958       internal->sh_name      = BYTE_GET (shdrs[i].sh_name);
4959       internal->sh_type      = BYTE_GET (shdrs[i].sh_type);
4960       internal->sh_flags     = BYTE_GET (shdrs[i].sh_flags);
4961       internal->sh_addr      = BYTE_GET (shdrs[i].sh_addr);
4962       internal->sh_offset    = BYTE_GET (shdrs[i].sh_offset);
4963       internal->sh_size      = BYTE_GET (shdrs[i].sh_size);
4964       internal->sh_link      = BYTE_GET (shdrs[i].sh_link);
4965       internal->sh_info      = BYTE_GET (shdrs[i].sh_info);
4966       internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
4967       internal->sh_entsize   = BYTE_GET (shdrs[i].sh_entsize);
4968     }
4969
4970   free (shdrs);
4971   return TRUE;
4972 }
4973
4974 static bfd_boolean
4975 get_64bit_section_headers (FILE * file, bfd_boolean probe)
4976 {
4977   Elf64_External_Shdr * shdrs;
4978   Elf_Internal_Shdr *   internal;
4979   unsigned int i;
4980   unsigned int size = elf_header.e_shentsize;
4981   unsigned int num = probe ? 1 : elf_header.e_shnum;
4982
4983   /* PR binutils/17531: Cope with unexpected section header sizes.  */
4984   if (size == 0 || num == 0)
4985     return FALSE;
4986   if (size < sizeof * shdrs)
4987     {
4988       if (! probe)
4989         error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
4990       return FALSE;
4991     }
4992   if (! probe && size > sizeof * shdrs)
4993     warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
4994
4995   shdrs = (Elf64_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
4996                                             size, num,
4997                                             probe ? NULL : _("section headers"));
4998   if (shdrs == NULL)
4999     return FALSE;
5000
5001   if (section_headers != NULL)
5002     free (section_headers);
5003   section_headers = (Elf_Internal_Shdr *) cmalloc (num,
5004                                                    sizeof (Elf_Internal_Shdr));
5005   if (section_headers == NULL)
5006     {
5007       if (! probe)
5008         error (_("Out of memory reading %u section headers\n"), num);
5009       return FALSE;
5010     }
5011
5012   for (i = 0, internal = section_headers;
5013        i < num;
5014        i++, internal++)
5015     {
5016       internal->sh_name      = BYTE_GET (shdrs[i].sh_name);
5017       internal->sh_type      = BYTE_GET (shdrs[i].sh_type);
5018       internal->sh_flags     = BYTE_GET (shdrs[i].sh_flags);
5019       internal->sh_addr      = BYTE_GET (shdrs[i].sh_addr);
5020       internal->sh_size      = BYTE_GET (shdrs[i].sh_size);
5021       internal->sh_entsize   = BYTE_GET (shdrs[i].sh_entsize);
5022       internal->sh_link      = BYTE_GET (shdrs[i].sh_link);
5023       internal->sh_info      = BYTE_GET (shdrs[i].sh_info);
5024       internal->sh_offset    = BYTE_GET (shdrs[i].sh_offset);
5025       internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5026     }
5027
5028   free (shdrs);
5029   return TRUE;
5030 }
5031
5032 static Elf_Internal_Sym *
5033 get_32bit_elf_symbols (FILE * file,
5034                        Elf_Internal_Shdr * section,
5035                        unsigned long * num_syms_return)
5036 {
5037   unsigned long number = 0;
5038   Elf32_External_Sym * esyms = NULL;
5039   Elf_External_Sym_Shndx * shndx = NULL;
5040   Elf_Internal_Sym * isyms = NULL;
5041   Elf_Internal_Sym * psym;
5042   unsigned int j;
5043
5044   if (section->sh_size == 0)
5045     {
5046       if (num_syms_return != NULL)
5047         * num_syms_return = 0;
5048       return NULL;
5049     }
5050
5051   /* Run some sanity checks first.  */
5052   if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5053     {
5054       error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5055              printable_section_name (section), (unsigned long) section->sh_entsize);
5056       goto exit_point;
5057     }
5058
5059   if (section->sh_size > current_file_size)
5060     {
5061       error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5062              printable_section_name (section), (unsigned long) section->sh_size);
5063       goto exit_point;
5064     }
5065
5066   number = section->sh_size / section->sh_entsize;
5067
5068   if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
5069     {
5070       error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5071              (unsigned long) section->sh_size,
5072              printable_section_name (section),
5073              (unsigned long) section->sh_entsize);
5074       goto exit_point;
5075     }
5076
5077   esyms = (Elf32_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
5078                                            section->sh_size, _("symbols"));
5079   if (esyms == NULL)
5080     goto exit_point;
5081
5082   {
5083     elf_section_list * entry;
5084
5085     shndx = NULL;
5086     for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5087       if (entry->hdr->sh_link == (unsigned long) (section - section_headers))
5088         {
5089           shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
5090                                                        entry->hdr->sh_offset,
5091                                                        1, entry->hdr->sh_size,
5092                                                        _("symbol table section indicies"));
5093           if (shndx == NULL)
5094             goto exit_point;
5095           /* PR17531: file: heap-buffer-overflow */
5096           else if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5097             {
5098               error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5099                      printable_section_name (entry->hdr),
5100                      (unsigned long) entry->hdr->sh_size,
5101                      (unsigned long) section->sh_size);
5102               goto exit_point;
5103             }
5104         }
5105   }
5106
5107   isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5108
5109   if (isyms == NULL)
5110     {
5111       error (_("Out of memory reading %lu symbols\n"),
5112              (unsigned long) number);
5113       goto exit_point;
5114     }
5115
5116   for (j = 0, psym = isyms; j < number; j++, psym++)
5117     {
5118       psym->st_name  = BYTE_GET (esyms[j].st_name);
5119       psym->st_value = BYTE_GET (esyms[j].st_value);
5120       psym->st_size  = BYTE_GET (esyms[j].st_size);
5121       psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5122       if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5123         psym->st_shndx
5124           = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5125       else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5126         psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5127       psym->st_info  = BYTE_GET (esyms[j].st_info);
5128       psym->st_other = BYTE_GET (esyms[j].st_other);
5129     }
5130
5131  exit_point:
5132   if (shndx != NULL)
5133     free (shndx);
5134   if (esyms != NULL)
5135     free (esyms);
5136
5137   if (num_syms_return != NULL)
5138     * num_syms_return = isyms == NULL ? 0 : number;
5139
5140   return isyms;
5141 }
5142
5143 static Elf_Internal_Sym *
5144 get_64bit_elf_symbols (FILE * file,
5145                        Elf_Internal_Shdr * section,
5146                        unsigned long * num_syms_return)
5147 {
5148   unsigned long number = 0;
5149   Elf64_External_Sym * esyms = NULL;
5150   Elf_External_Sym_Shndx * shndx = NULL;
5151   Elf_Internal_Sym * isyms = NULL;
5152   Elf_Internal_Sym * psym;
5153   unsigned int j;
5154
5155   if (section->sh_size == 0)
5156     {
5157       if (num_syms_return != NULL)
5158         * num_syms_return = 0;
5159       return NULL;
5160     }
5161
5162   /* Run some sanity checks first.  */
5163   if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5164     {
5165       error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5166              printable_section_name (section),
5167              (unsigned long) section->sh_entsize);
5168       goto exit_point;
5169     }
5170
5171   if (section->sh_size > current_file_size)
5172     {
5173       error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5174              printable_section_name (section),
5175              (unsigned long) section->sh_size);
5176       goto exit_point;
5177     }
5178
5179   number = section->sh_size / section->sh_entsize;
5180
5181   if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
5182     {
5183       error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5184              (unsigned long) section->sh_size,
5185              printable_section_name (section),
5186              (unsigned long) section->sh_entsize);
5187       goto exit_point;
5188     }
5189
5190   esyms = (Elf64_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
5191                                            section->sh_size, _("symbols"));
5192   if (!esyms)
5193     goto exit_point;
5194
5195   {
5196     elf_section_list * entry;
5197
5198     shndx = NULL;
5199     for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5200       if (entry->hdr->sh_link == (unsigned long) (section - section_headers))
5201         {
5202           shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
5203                                                        entry->hdr->sh_offset,
5204                                                        1, entry->hdr->sh_size,
5205                                                        _("symbol table section indicies"));
5206           if (shndx == NULL)
5207             goto exit_point;
5208           /* PR17531: file: heap-buffer-overflow */
5209           else if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5210             {
5211               error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5212                      printable_section_name (entry->hdr),
5213                      (unsigned long) entry->hdr->sh_size,
5214                      (unsigned long) section->sh_size);
5215               goto exit_point;
5216             }
5217         }
5218   }
5219
5220   isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5221
5222   if (isyms == NULL)
5223     {
5224       error (_("Out of memory reading %lu symbols\n"),
5225              (unsigned long) number);
5226       goto exit_point;
5227     }
5228
5229   for (j = 0, psym = isyms; j < number; j++, psym++)
5230     {
5231       psym->st_name  = BYTE_GET (esyms[j].st_name);
5232       psym->st_info  = BYTE_GET (esyms[j].st_info);
5233       psym->st_other = BYTE_GET (esyms[j].st_other);
5234       psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5235
5236       if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5237         psym->st_shndx
5238           = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5239       else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5240         psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5241
5242       psym->st_value = BYTE_GET (esyms[j].st_value);
5243       psym->st_size  = BYTE_GET (esyms[j].st_size);
5244     }
5245
5246  exit_point:
5247   if (shndx != NULL)
5248     free (shndx);
5249   if (esyms != NULL)
5250     free (esyms);
5251
5252   if (num_syms_return != NULL)
5253     * num_syms_return = isyms == NULL ? 0 : number;
5254
5255   return isyms;
5256 }
5257
5258 static const char *
5259 get_elf_section_flags (bfd_vma sh_flags)
5260 {
5261   static char buff[1024];
5262   char * p = buff;
5263   int field_size = is_32bit_elf ? 8 : 16;
5264   int sindex;
5265   int size = sizeof (buff) - (field_size + 4 + 1);
5266   bfd_vma os_flags = 0;
5267   bfd_vma proc_flags = 0;
5268   bfd_vma unknown_flags = 0;
5269   static const struct
5270     {
5271       const char * str;
5272       int len;
5273     }
5274   flags [] =
5275     {
5276       /*  0 */ { STRING_COMMA_LEN ("WRITE") },
5277       /*  1 */ { STRING_COMMA_LEN ("ALLOC") },
5278       /*  2 */ { STRING_COMMA_LEN ("EXEC") },
5279       /*  3 */ { STRING_COMMA_LEN ("MERGE") },
5280       /*  4 */ { STRING_COMMA_LEN ("STRINGS") },
5281       /*  5 */ { STRING_COMMA_LEN ("INFO LINK") },
5282       /*  6 */ { STRING_COMMA_LEN ("LINK ORDER") },
5283       /*  7 */ { STRING_COMMA_LEN ("OS NONCONF") },
5284       /*  8 */ { STRING_COMMA_LEN ("GROUP") },
5285       /*  9 */ { STRING_COMMA_LEN ("TLS") },
5286       /* IA-64 specific.  */
5287       /* 10 */ { STRING_COMMA_LEN ("SHORT") },
5288       /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
5289       /* IA-64 OpenVMS specific.  */
5290       /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
5291       /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
5292       /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
5293       /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
5294       /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
5295       /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
5296       /* Generic.  */
5297       /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
5298       /* SPARC specific.  */
5299       /* 19 */ { STRING_COMMA_LEN ("ORDERED") },
5300       /* 20 */ { STRING_COMMA_LEN ("COMPRESSED") },
5301       /* ARM specific.  */
5302       /* 21 */ { STRING_COMMA_LEN ("ENTRYSECT") },
5303       /* 22 */ { STRING_COMMA_LEN ("ARM_NOREAD") },
5304       /* 23 */ { STRING_COMMA_LEN ("COMDEF") }
5305     };
5306
5307   if (do_section_details)
5308     {
5309       sprintf (buff, "[%*.*lx]: ",
5310                field_size, field_size, (unsigned long) sh_flags);
5311       p += field_size + 4;
5312     }
5313
5314   while (sh_flags)
5315     {
5316       bfd_vma flag;
5317
5318       flag = sh_flags & - sh_flags;
5319       sh_flags &= ~ flag;
5320
5321       if (do_section_details)
5322         {
5323           switch (flag)
5324             {
5325             case SHF_WRITE:             sindex = 0; break;
5326             case SHF_ALLOC:             sindex = 1; break;
5327             case SHF_EXECINSTR:         sindex = 2; break;
5328             case SHF_MERGE:             sindex = 3; break;
5329             case SHF_STRINGS:           sindex = 4; break;
5330             case SHF_INFO_LINK:         sindex = 5; break;
5331             case SHF_LINK_ORDER:        sindex = 6; break;
5332             case SHF_OS_NONCONFORMING:  sindex = 7; break;
5333             case SHF_GROUP:             sindex = 8; break;
5334             case SHF_TLS:               sindex = 9; break;
5335             case SHF_EXCLUDE:           sindex = 18; break;
5336             case SHF_COMPRESSED:        sindex = 20; break;
5337
5338             default:
5339               sindex = -1;
5340               switch (elf_header.e_machine)
5341                 {
5342                 case EM_IA_64:
5343                   if (flag == SHF_IA_64_SHORT)
5344                     sindex = 10;
5345                   else if (flag == SHF_IA_64_NORECOV)
5346                     sindex = 11;
5347 #ifdef BFD64
5348                   else if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
5349                     switch (flag)
5350                       {
5351                       case SHF_IA_64_VMS_GLOBAL:      sindex = 12; break;
5352                       case SHF_IA_64_VMS_OVERLAID:    sindex = 13; break;
5353                       case SHF_IA_64_VMS_SHARED:      sindex = 14; break;
5354                       case SHF_IA_64_VMS_VECTOR:      sindex = 15; break;
5355                       case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
5356                       case SHF_IA_64_VMS_PROTECTED:   sindex = 17; break;
5357                       default:                        break;
5358                       }
5359 #endif
5360                   break;
5361
5362                 case EM_386:
5363                 case EM_IAMCU:
5364                 case EM_X86_64:
5365                 case EM_L1OM:
5366                 case EM_K1OM:
5367                 case EM_OLD_SPARCV9:
5368                 case EM_SPARC32PLUS:
5369                 case EM_SPARCV9:
5370                 case EM_SPARC:
5371                   if (flag == SHF_ORDERED)
5372                     sindex = 19;
5373                   break;
5374
5375                 case EM_ARM:
5376                   switch (flag)
5377                     {
5378                     case SHF_ENTRYSECT: sindex = 21; break;
5379                     case SHF_ARM_NOREAD: sindex = 22; break;
5380                     case SHF_COMDEF: sindex = 23; break;
5381                     default: break;
5382                     }
5383                   break;
5384
5385                 default:
5386                   break;
5387                 }
5388             }
5389
5390           if (sindex != -1)
5391             {
5392               if (p != buff + field_size + 4)
5393                 {
5394                   if (size < (10 + 2))
5395                     {
5396                       warn (_("Internal error: not enough buffer room for section flag info"));
5397                       return _("<unknown>");
5398                     }
5399                   size -= 2;
5400                   *p++ = ',';
5401                   *p++ = ' ';
5402                 }
5403
5404               size -= flags [sindex].len;
5405               p = stpcpy (p, flags [sindex].str);
5406             }
5407           else if (flag & SHF_MASKOS)
5408             os_flags |= flag;
5409           else if (flag & SHF_MASKPROC)
5410             proc_flags |= flag;
5411           else
5412             unknown_flags |= flag;
5413         }
5414       else
5415         {
5416           switch (flag)
5417             {
5418             case SHF_WRITE:             *p = 'W'; break;
5419             case SHF_ALLOC:             *p = 'A'; break;
5420             case SHF_EXECINSTR:         *p = 'X'; break;
5421             case SHF_MERGE:             *p = 'M'; break;
5422             case SHF_STRINGS:           *p = 'S'; break;
5423             case SHF_INFO_LINK:         *p = 'I'; break;
5424             case SHF_LINK_ORDER:        *p = 'L'; break;
5425             case SHF_OS_NONCONFORMING:  *p = 'O'; break;
5426             case SHF_GROUP:             *p = 'G'; break;
5427             case SHF_TLS:               *p = 'T'; break;
5428             case SHF_EXCLUDE:           *p = 'E'; break;
5429             case SHF_COMPRESSED:        *p = 'C'; break;
5430
5431             default:
5432               if ((elf_header.e_machine == EM_X86_64
5433                    || elf_header.e_machine == EM_L1OM
5434                    || elf_header.e_machine == EM_K1OM)
5435                   && flag == SHF_X86_64_LARGE)
5436                 *p = 'l';
5437               else if (elf_header.e_machine == EM_ARM
5438                        && flag == SHF_ARM_NOREAD)
5439                   *p = 'y';
5440               else if (flag & SHF_MASKOS)
5441                 {
5442                   *p = 'o';
5443                   sh_flags &= ~ SHF_MASKOS;
5444                 }
5445               else if (flag & SHF_MASKPROC)
5446                 {
5447                   *p = 'p';
5448                   sh_flags &= ~ SHF_MASKPROC;
5449                 }
5450               else
5451                 *p = 'x';
5452               break;
5453             }
5454           p++;
5455         }
5456     }
5457
5458   if (do_section_details)
5459     {
5460       if (os_flags)
5461         {
5462           size -= 5 + field_size;
5463           if (p != buff + field_size + 4)
5464             {
5465               if (size < (2 + 1))
5466                 {
5467                   warn (_("Internal error: not enough buffer room for section flag info"));
5468                   return _("<unknown>");
5469                 }
5470               size -= 2;
5471               *p++ = ',';
5472               *p++ = ' ';
5473             }
5474           sprintf (p, "OS (%*.*lx)", field_size, field_size,
5475                    (unsigned long) os_flags);
5476           p += 5 + field_size;
5477         }
5478       if (proc_flags)
5479         {
5480           size -= 7 + field_size;
5481           if (p != buff + field_size + 4)
5482             {
5483               if (size < (2 + 1))
5484                 {
5485                   warn (_("Internal error: not enough buffer room for section flag info"));
5486                   return _("<unknown>");
5487                 }
5488               size -= 2;
5489               *p++ = ',';
5490               *p++ = ' ';
5491             }
5492           sprintf (p, "PROC (%*.*lx)", field_size, field_size,
5493                    (unsigned long) proc_flags);
5494           p += 7 + field_size;
5495         }
5496       if (unknown_flags)
5497         {
5498           size -= 10 + field_size;
5499           if (p != buff + field_size + 4)
5500             {
5501               if (size < (2 + 1))
5502                 {
5503                   warn (_("Internal error: not enough buffer room for section flag info"));
5504                   return _("<unknown>");
5505                 }
5506               size -= 2;
5507               *p++ = ',';
5508               *p++ = ' ';
5509             }
5510           sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
5511                    (unsigned long) unknown_flags);
5512           p += 10 + field_size;
5513         }
5514     }
5515
5516   *p = '\0';
5517   return buff;
5518 }
5519
5520 static unsigned int
5521 get_compression_header (Elf_Internal_Chdr *chdr, unsigned char *buf)
5522 {
5523   if (is_32bit_elf)
5524     {
5525       Elf32_External_Chdr *echdr = (Elf32_External_Chdr *) buf;
5526       chdr->ch_type = BYTE_GET (echdr->ch_type);
5527       chdr->ch_size = BYTE_GET (echdr->ch_size);
5528       chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5529       return sizeof (*echdr);
5530     }
5531   else
5532     {
5533       Elf64_External_Chdr *echdr = (Elf64_External_Chdr *) buf;
5534       chdr->ch_type = BYTE_GET (echdr->ch_type);
5535       chdr->ch_size = BYTE_GET (echdr->ch_size);
5536       chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5537       return sizeof (*echdr);
5538     }
5539 }
5540
5541 static int
5542 process_section_headers (FILE * file)
5543 {
5544   Elf_Internal_Shdr * section;
5545   unsigned int i;
5546
5547   section_headers = NULL;
5548
5549   if (elf_header.e_shnum == 0)
5550     {
5551       /* PR binutils/12467.  */
5552       if (elf_header.e_shoff != 0)
5553         warn (_("possibly corrupt ELF file header - it has a non-zero"
5554                 " section header offset, but no section headers\n"));
5555       else if (do_sections)
5556         printf (_("\nThere are no sections in this file.\n"));
5557
5558       return 1;
5559     }
5560
5561   if (do_sections && !do_header)
5562     printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
5563             elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
5564
5565   if (is_32bit_elf)
5566     {
5567       if (! get_32bit_section_headers (file, FALSE))
5568         return 0;
5569     }
5570   else if (! get_64bit_section_headers (file, FALSE))
5571     return 0;
5572
5573   /* Read in the string table, so that we have names to display.  */
5574   if (elf_header.e_shstrndx != SHN_UNDEF
5575        && elf_header.e_shstrndx < elf_header.e_shnum)
5576     {
5577       section = section_headers + elf_header.e_shstrndx;
5578
5579       if (section->sh_size != 0)
5580         {
5581           string_table = (char *) get_data (NULL, file, section->sh_offset,
5582                                             1, section->sh_size,
5583                                             _("string table"));
5584
5585           string_table_length = string_table != NULL ? section->sh_size : 0;
5586         }
5587     }
5588
5589   /* Scan the sections for the dynamic symbol table
5590      and dynamic string table and debug sections.  */
5591   dynamic_symbols = NULL;
5592   dynamic_strings = NULL;
5593   dynamic_syminfo = NULL;
5594   symtab_shndx_list = NULL;
5595
5596   eh_addr_size = is_32bit_elf ? 4 : 8;
5597   switch (elf_header.e_machine)
5598     {
5599     case EM_MIPS:
5600     case EM_MIPS_RS3_LE:
5601       /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
5602          FDE addresses.  However, the ABI also has a semi-official ILP32
5603          variant for which the normal FDE address size rules apply.
5604
5605          GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
5606          section, where XX is the size of longs in bits.  Unfortunately,
5607          earlier compilers provided no way of distinguishing ILP32 objects
5608          from LP64 objects, so if there's any doubt, we should assume that
5609          the official LP64 form is being used.  */
5610       if ((elf_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
5611           && find_section (".gcc_compiled_long32") == NULL)
5612         eh_addr_size = 8;
5613       break;
5614
5615     case EM_H8_300:
5616     case EM_H8_300H:
5617       switch (elf_header.e_flags & EF_H8_MACH)
5618         {
5619         case E_H8_MACH_H8300:
5620         case E_H8_MACH_H8300HN:
5621         case E_H8_MACH_H8300SN:
5622         case E_H8_MACH_H8300SXN:
5623           eh_addr_size = 2;
5624           break;
5625         case E_H8_MACH_H8300H:
5626         case E_H8_MACH_H8300S:
5627         case E_H8_MACH_H8300SX:
5628           eh_addr_size = 4;
5629           break;
5630         }
5631       break;
5632
5633     case EM_M32C_OLD:
5634     case EM_M32C:
5635       switch (elf_header.e_flags & EF_M32C_CPU_MASK)
5636         {
5637         case EF_M32C_CPU_M16C:
5638           eh_addr_size = 2;
5639           break;
5640         }
5641       break;
5642     }
5643
5644 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64)                \
5645   do                                                                    \
5646     {                                                                   \
5647       bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64;  \
5648       if (section->sh_entsize != expected_entsize)                      \
5649         {                                                               \
5650           char buf[40];                                                 \
5651           sprintf_vma (buf, section->sh_entsize);                       \
5652           /* Note: coded this way so that there is a single string for  \
5653              translation.  */ \
5654           error (_("Section %d has invalid sh_entsize of %s\n"), i, buf); \
5655           error (_("(Using the expected size of %u for the rest of this dump)\n"), \
5656                    (unsigned) expected_entsize);                        \
5657           section->sh_entsize = expected_entsize;                       \
5658         }                                                               \
5659     }                                                                   \
5660   while (0)
5661
5662 #define CHECK_ENTSIZE(section, i, type)                                 \
5663   CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type),         \
5664                         sizeof (Elf64_External_##type))
5665
5666   for (i = 0, section = section_headers;
5667        i < elf_header.e_shnum;
5668        i++, section++)
5669     {
5670       char * name = SECTION_NAME (section);
5671
5672       if (section->sh_type == SHT_DYNSYM)
5673         {
5674           if (dynamic_symbols != NULL)
5675             {
5676               error (_("File contains multiple dynamic symbol tables\n"));
5677               continue;
5678             }
5679
5680           CHECK_ENTSIZE (section, i, Sym);
5681           dynamic_symbols = GET_ELF_SYMBOLS (file, section, & num_dynamic_syms);
5682         }
5683       else if (section->sh_type == SHT_STRTAB
5684                && streq (name, ".dynstr"))
5685         {
5686           if (dynamic_strings != NULL)
5687             {
5688               error (_("File contains multiple dynamic string tables\n"));
5689               continue;
5690             }
5691
5692           dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
5693                                                1, section->sh_size,
5694                                                _("dynamic strings"));
5695           dynamic_strings_length = dynamic_strings == NULL ? 0 : section->sh_size;
5696         }
5697       else if (section->sh_type == SHT_SYMTAB_SHNDX)
5698         {
5699           elf_section_list * entry = xmalloc (sizeof * entry);
5700           entry->hdr = section;
5701           entry->next = symtab_shndx_list;
5702           symtab_shndx_list = entry;
5703         }
5704       else if (section->sh_type == SHT_SYMTAB)
5705         CHECK_ENTSIZE (section, i, Sym);
5706       else if (section->sh_type == SHT_GROUP)
5707         CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
5708       else if (section->sh_type == SHT_REL)
5709         CHECK_ENTSIZE (section, i, Rel);
5710       else if (section->sh_type == SHT_RELA)
5711         CHECK_ENTSIZE (section, i, Rela);
5712       else if ((do_debugging || do_debug_info || do_debug_abbrevs
5713                 || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
5714                 || do_debug_aranges || do_debug_frames || do_debug_macinfo
5715                 || do_debug_str || do_debug_loc || do_debug_ranges
5716                 || do_debug_addr || do_debug_cu_index)
5717                && (const_strneq (name, ".debug_")
5718                    || const_strneq (name, ".zdebug_")))
5719         {
5720           if (name[1] == 'z')
5721             name += sizeof (".zdebug_") - 1;
5722           else
5723             name += sizeof (".debug_") - 1;
5724
5725           if (do_debugging
5726               || (do_debug_info     && const_strneq (name, "info"))
5727               || (do_debug_info     && const_strneq (name, "types"))
5728               || (do_debug_abbrevs  && const_strneq (name, "abbrev"))
5729               || (do_debug_lines    && strcmp (name, "line") == 0)
5730               || (do_debug_lines    && const_strneq (name, "line."))
5731               || (do_debug_pubnames && const_strneq (name, "pubnames"))
5732               || (do_debug_pubtypes && const_strneq (name, "pubtypes"))
5733               || (do_debug_pubnames && const_strneq (name, "gnu_pubnames"))
5734               || (do_debug_pubtypes && const_strneq (name, "gnu_pubtypes"))
5735               || (do_debug_aranges  && const_strneq (name, "aranges"))
5736               || (do_debug_ranges   && const_strneq (name, "ranges"))
5737               || (do_debug_frames   && const_strneq (name, "frame"))
5738               || (do_debug_macinfo  && const_strneq (name, "macinfo"))
5739               || (do_debug_macinfo  && const_strneq (name, "macro"))
5740               || (do_debug_str      && const_strneq (name, "str"))
5741               || (do_debug_loc      && const_strneq (name, "loc"))
5742               || (do_debug_addr     && const_strneq (name, "addr"))
5743               || (do_debug_cu_index && const_strneq (name, "cu_index"))
5744               || (do_debug_cu_index && const_strneq (name, "tu_index"))
5745               )
5746             request_dump_bynumber (i, DEBUG_DUMP);
5747         }
5748       /* Linkonce section to be combined with .debug_info at link time.  */
5749       else if ((do_debugging || do_debug_info)
5750                && const_strneq (name, ".gnu.linkonce.wi."))
5751         request_dump_bynumber (i, DEBUG_DUMP);
5752       else if (do_debug_frames && streq (name, ".eh_frame"))
5753         request_dump_bynumber (i, DEBUG_DUMP);
5754       else if (do_gdb_index && streq (name, ".gdb_index"))
5755         request_dump_bynumber (i, DEBUG_DUMP);
5756       /* Trace sections for Itanium VMS.  */
5757       else if ((do_debugging || do_trace_info || do_trace_abbrevs
5758                 || do_trace_aranges)
5759                && const_strneq (name, ".trace_"))
5760         {
5761           name += sizeof (".trace_") - 1;
5762
5763           if (do_debugging
5764               || (do_trace_info     && streq (name, "info"))
5765               || (do_trace_abbrevs  && streq (name, "abbrev"))
5766               || (do_trace_aranges  && streq (name, "aranges"))
5767               )
5768             request_dump_bynumber (i, DEBUG_DUMP);
5769         }
5770     }
5771
5772   if (! do_sections)
5773     return 1;
5774
5775   if (elf_header.e_shnum > 1)
5776     printf (_("\nSection Headers:\n"));
5777   else
5778     printf (_("\nSection Header:\n"));
5779
5780   if (is_32bit_elf)
5781     {
5782       if (do_section_details)
5783         {
5784           printf (_("  [Nr] Name\n"));
5785           printf (_("       Type            Addr     Off    Size   ES   Lk Inf Al\n"));
5786         }
5787       else
5788         printf
5789           (_("  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al\n"));
5790     }
5791   else if (do_wide)
5792     {
5793       if (do_section_details)
5794         {
5795           printf (_("  [Nr] Name\n"));
5796           printf (_("       Type            Address          Off    Size   ES   Lk Inf Al\n"));
5797         }
5798       else
5799         printf
5800           (_("  [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al\n"));
5801     }
5802   else
5803     {
5804       if (do_section_details)
5805         {
5806           printf (_("  [Nr] Name\n"));
5807           printf (_("       Type              Address          Offset            Link\n"));
5808           printf (_("       Size              EntSize          Info              Align\n"));
5809         }
5810       else
5811         {
5812           printf (_("  [Nr] Name              Type             Address           Offset\n"));
5813           printf (_("       Size              EntSize          Flags  Link  Info  Align\n"));
5814         }
5815     }
5816
5817   if (do_section_details)
5818     printf (_("       Flags\n"));
5819
5820   for (i = 0, section = section_headers;
5821        i < elf_header.e_shnum;
5822        i++, section++)
5823     {
5824       printf ("  [%2u] ", i);
5825       if (do_section_details)
5826         printf ("%s\n      ", printable_section_name (section));
5827       else
5828         print_symbol (-17, SECTION_NAME (section));
5829
5830       printf (do_wide ? " %-15s " : " %-15.15s ",
5831               get_section_type_name (section->sh_type));
5832
5833       if (is_32bit_elf)
5834         {
5835           const char * link_too_big = NULL;
5836
5837           print_vma (section->sh_addr, LONG_HEX);
5838
5839           printf ( " %6.6lx %6.6lx %2.2lx",
5840                    (unsigned long) section->sh_offset,
5841                    (unsigned long) section->sh_size,
5842                    (unsigned long) section->sh_entsize);
5843
5844           if (do_section_details)
5845             fputs ("  ", stdout);
5846           else
5847             printf (" %3s ", get_elf_section_flags (section->sh_flags));
5848
5849           if (section->sh_link >= elf_header.e_shnum)
5850             {
5851               link_too_big = "";
5852               /* The sh_link value is out of range.  Normally this indicates
5853                  an error but it can have special values in Solaris binaries.  */
5854               switch (elf_header.e_machine)
5855                 {
5856                 case EM_386:
5857                 case EM_IAMCU:
5858                 case EM_X86_64:
5859                 case EM_L1OM:
5860                 case EM_K1OM:
5861                 case EM_OLD_SPARCV9:
5862                 case EM_SPARC32PLUS:
5863                 case EM_SPARCV9:
5864                 case EM_SPARC:
5865                   if (section->sh_link == (SHN_BEFORE & 0xffff))
5866                     link_too_big = "BEFORE";
5867                   else if (section->sh_link == (SHN_AFTER & 0xffff))
5868                     link_too_big = "AFTER";
5869                   break;
5870                 default:
5871                   break;
5872                 }
5873             }
5874
5875           if (do_section_details)
5876             {
5877               if (link_too_big != NULL && * link_too_big)
5878                 printf ("<%s> ", link_too_big);
5879               else
5880                 printf ("%2u ", section->sh_link);
5881               printf ("%3u %2lu\n", section->sh_info,
5882                       (unsigned long) section->sh_addralign);
5883             }
5884           else
5885             printf ("%2u %3u %2lu\n",
5886                     section->sh_link,
5887                     section->sh_info,
5888                     (unsigned long) section->sh_addralign);
5889
5890           if (link_too_big && ! * link_too_big)
5891             warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
5892                   i, section->sh_link);
5893         }
5894       else if (do_wide)
5895         {
5896           print_vma (section->sh_addr, LONG_HEX);
5897
5898           if ((long) section->sh_offset == section->sh_offset)
5899             printf (" %6.6lx", (unsigned long) section->sh_offset);
5900           else
5901             {
5902               putchar (' ');
5903               print_vma (section->sh_offset, LONG_HEX);
5904             }
5905
5906           if ((unsigned long) section->sh_size == section->sh_size)
5907             printf (" %6.6lx", (unsigned long) section->sh_size);
5908           else
5909             {
5910               putchar (' ');
5911               print_vma (section->sh_size, LONG_HEX);
5912             }
5913
5914           if ((unsigned long) section->sh_entsize == section->sh_entsize)
5915             printf (" %2.2lx", (unsigned long) section->sh_entsize);
5916           else
5917             {
5918               putchar (' ');
5919               print_vma (section->sh_entsize, LONG_HEX);
5920             }
5921
5922           if (do_section_details)
5923             fputs ("  ", stdout);
5924           else
5925             printf (" %3s ", get_elf_section_flags (section->sh_flags));
5926
5927           printf ("%2u %3u ", section->sh_link, section->sh_info);
5928
5929           if ((unsigned long) section->sh_addralign == section->sh_addralign)
5930             printf ("%2lu\n", (unsigned long) section->sh_addralign);
5931           else
5932             {
5933               print_vma (section->sh_addralign, DEC);
5934               putchar ('\n');
5935             }
5936         }
5937       else if (do_section_details)
5938         {
5939           printf ("       %-15.15s  ",
5940                   get_section_type_name (section->sh_type));
5941           print_vma (section->sh_addr, LONG_HEX);
5942           if ((long) section->sh_offset == section->sh_offset)
5943             printf ("  %16.16lx", (unsigned long) section->sh_offset);
5944           else
5945             {
5946               printf ("  ");
5947               print_vma (section->sh_offset, LONG_HEX);
5948             }
5949           printf ("  %u\n       ", section->sh_link);
5950           print_vma (section->sh_size, LONG_HEX);
5951           putchar (' ');
5952           print_vma (section->sh_entsize, LONG_HEX);
5953
5954           printf ("  %-16u  %lu\n",
5955                   section->sh_info,
5956                   (unsigned long) section->sh_addralign);
5957         }
5958       else
5959         {
5960           putchar (' ');
5961           print_vma (section->sh_addr, LONG_HEX);
5962           if ((long) section->sh_offset == section->sh_offset)
5963             printf ("  %8.8lx", (unsigned long) section->sh_offset);
5964           else
5965             {
5966               printf ("  ");
5967               print_vma (section->sh_offset, LONG_HEX);
5968             }
5969           printf ("\n       ");
5970           print_vma (section->sh_size, LONG_HEX);
5971           printf ("  ");
5972           print_vma (section->sh_entsize, LONG_HEX);
5973
5974           printf (" %3s ", get_elf_section_flags (section->sh_flags));
5975
5976           printf ("     %2u   %3u     %lu\n",
5977                   section->sh_link,
5978                   section->sh_info,
5979                   (unsigned long) section->sh_addralign);
5980         }
5981
5982       if (do_section_details)
5983         {
5984           printf ("       %s\n", get_elf_section_flags (section->sh_flags));
5985           if ((section->sh_flags & SHF_COMPRESSED) != 0)
5986             {
5987               /* Minimum section size is 12 bytes for 32-bit compression
5988                  header + 12 bytes for compressed data header.  */
5989               unsigned char buf[24];
5990               assert (sizeof (buf) >= sizeof (Elf64_External_Chdr));
5991               if (get_data (&buf, (FILE *) file, section->sh_offset, 1,
5992                             sizeof (buf), _("compression header")))
5993                 {
5994                   Elf_Internal_Chdr chdr;
5995                   get_compression_header (&chdr, buf);
5996                   if (chdr.ch_type == ELFCOMPRESS_ZLIB)
5997                     printf ("       ZLIB, ");
5998                   else
5999                     printf (_("       [<unknown>: 0x%x], "),
6000                             chdr.ch_type);
6001                   print_vma (chdr.ch_size, LONG_HEX);
6002                   printf (", %lu\n", (unsigned long) chdr.ch_addralign);
6003                 }
6004             }
6005         }
6006     }
6007
6008   if (!do_section_details)
6009     {
6010       /* The ordering of the letters shown here matches the ordering of the
6011          corresponding SHF_xxx values, and hence the order in which these
6012          letters will be displayed to the user.  */
6013       printf (_("Key to Flags:\n\
6014   W (write), A (alloc), X (execute), M (merge), S (strings), I (info),\n\
6015   L (link order), O (extra OS processing required), G (group), T (TLS),\n\
6016   C (compressed), x (unknown), o (OS specific), E (exclude),\n"));
6017       if (elf_header.e_machine == EM_X86_64
6018           || elf_header.e_machine == EM_L1OM
6019           || elf_header.e_machine == EM_K1OM)
6020         printf (_("l (large), "));
6021       else if (elf_header.e_machine == EM_ARM)
6022         printf (_("y (noread), "));
6023       printf ("p (processor specific)\n");
6024     }
6025
6026   return 1;
6027 }
6028
6029 static const char *
6030 get_group_flags (unsigned int flags)
6031 {
6032   static char buff[32];
6033   switch (flags)
6034     {
6035     case 0:
6036       return "";
6037
6038     case GRP_COMDAT:
6039       return "COMDAT ";
6040
6041    default:
6042       snprintf (buff, sizeof (buff), _("[<unknown>: 0x%x] "), flags);
6043       break;
6044     }
6045   return buff;
6046 }
6047
6048 static int
6049 process_section_groups (FILE * file)
6050 {
6051   Elf_Internal_Shdr * section;
6052   unsigned int i;
6053   struct group * group;
6054   Elf_Internal_Shdr * symtab_sec;
6055   Elf_Internal_Shdr * strtab_sec;
6056   Elf_Internal_Sym * symtab;
6057   unsigned long num_syms;
6058   char * strtab;
6059   size_t strtab_size;
6060
6061   /* Don't process section groups unless needed.  */
6062   if (!do_unwind && !do_section_groups)
6063     return 1;
6064
6065   if (elf_header.e_shnum == 0)
6066     {
6067       if (do_section_groups)
6068         printf (_("\nThere are no sections to group in this file.\n"));
6069
6070       return 1;
6071     }
6072
6073   if (section_headers == NULL)
6074     {
6075       error (_("Section headers are not available!\n"));
6076       /* PR 13622: This can happen with a corrupt ELF header.  */
6077       return 0;
6078     }
6079
6080   section_headers_groups = (struct group **) calloc (elf_header.e_shnum,
6081                                                      sizeof (struct group *));
6082
6083   if (section_headers_groups == NULL)
6084     {
6085       error (_("Out of memory reading %u section group headers\n"),
6086              elf_header.e_shnum);
6087       return 0;
6088     }
6089
6090   /* Scan the sections for the group section.  */
6091   group_count = 0;
6092   for (i = 0, section = section_headers;
6093        i < elf_header.e_shnum;
6094        i++, section++)
6095     if (section->sh_type == SHT_GROUP)
6096       group_count++;
6097
6098   if (group_count == 0)
6099     {
6100       if (do_section_groups)
6101         printf (_("\nThere are no section groups in this file.\n"));
6102
6103       return 1;
6104     }
6105
6106   section_groups = (struct group *) calloc (group_count, sizeof (struct group));
6107
6108   if (section_groups == NULL)
6109     {
6110       error (_("Out of memory reading %lu groups\n"),
6111              (unsigned long) group_count);
6112       return 0;
6113     }
6114
6115   symtab_sec = NULL;
6116   strtab_sec = NULL;
6117   symtab = NULL;
6118   num_syms = 0;
6119   strtab = NULL;
6120   strtab_size = 0;
6121   for (i = 0, section = section_headers, group = section_groups;
6122        i < elf_header.e_shnum;
6123        i++, section++)
6124     {
6125       if (section->sh_type == SHT_GROUP)
6126         {
6127           const char * name = printable_section_name (section);
6128           const char * group_name;
6129           unsigned char * start;
6130           unsigned char * indices;
6131           unsigned int entry, j, size;
6132           Elf_Internal_Shdr * sec;
6133           Elf_Internal_Sym * sym;
6134
6135           /* Get the symbol table.  */
6136           if (section->sh_link >= elf_header.e_shnum
6137               || ((sec = section_headers + section->sh_link)->sh_type
6138                   != SHT_SYMTAB))
6139             {
6140               error (_("Bad sh_link in group section `%s'\n"), name);
6141               continue;
6142             }
6143
6144           if (symtab_sec != sec)
6145             {
6146               symtab_sec = sec;
6147               if (symtab)
6148                 free (symtab);
6149               symtab = GET_ELF_SYMBOLS (file, symtab_sec, & num_syms);
6150             }
6151
6152           if (symtab == NULL)
6153             {
6154               error (_("Corrupt header in group section `%s'\n"), name);
6155               continue;
6156             }
6157
6158           if (section->sh_info >= num_syms)
6159             {
6160               error (_("Bad sh_info in group section `%s'\n"), name);
6161               continue;
6162             }
6163
6164           sym = symtab + section->sh_info;
6165
6166           if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
6167             {
6168               if (sym->st_shndx == 0
6169                   || sym->st_shndx >= elf_header.e_shnum)
6170                 {
6171                   error (_("Bad sh_info in group section `%s'\n"), name);
6172                   continue;
6173                 }
6174
6175               group_name = SECTION_NAME (section_headers + sym->st_shndx);
6176               strtab_sec = NULL;
6177               if (strtab)
6178                 free (strtab);
6179               strtab = NULL;
6180               strtab_size = 0;
6181             }
6182           else
6183             {
6184               /* Get the string table.  */
6185               if (symtab_sec->sh_link >= elf_header.e_shnum)
6186                 {
6187                   strtab_sec = NULL;
6188                   if (strtab)
6189                     free (strtab);
6190                   strtab = NULL;
6191                   strtab_size = 0;
6192                 }
6193               else if (strtab_sec
6194                        != (sec = section_headers + symtab_sec->sh_link))
6195                 {
6196                   strtab_sec = sec;
6197                   if (strtab)
6198                     free (strtab);
6199
6200                   strtab = (char *) get_data (NULL, file, strtab_sec->sh_offset,
6201                                               1, strtab_sec->sh_size,
6202                                               _("string table"));
6203                   strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
6204                 }
6205               group_name = sym->st_name < strtab_size
6206                 ? strtab + sym->st_name : _("<corrupt>");
6207             }
6208
6209           /* PR 17531: file: loop.  */
6210           if (section->sh_entsize > section->sh_size)
6211             {
6212               error (_("Section %s has sh_entsize (0x%lx) which is larger than its size (0x%lx)\n"),
6213                      printable_section_name (section),
6214                      (unsigned long) section->sh_entsize,
6215                      (unsigned long) section->sh_size);
6216               break;
6217             }
6218
6219           start = (unsigned char *) get_data (NULL, file, section->sh_offset,
6220                                               1, section->sh_size,
6221                                               _("section data"));
6222           if (start == NULL)
6223             continue;
6224
6225           indices = start;
6226           size = (section->sh_size / section->sh_entsize) - 1;
6227           entry = byte_get (indices, 4);
6228           indices += 4;
6229
6230           if (do_section_groups)
6231             {
6232               printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
6233                       get_group_flags (entry), i, name, group_name, size);
6234
6235               printf (_("   [Index]    Name\n"));
6236             }
6237
6238           group->group_index = i;
6239
6240           for (j = 0; j < size; j++)
6241             {
6242               struct group_list * g;
6243
6244               entry = byte_get (indices, 4);
6245               indices += 4;
6246
6247               if (entry >= elf_header.e_shnum)
6248                 {
6249                   static unsigned num_group_errors = 0;
6250
6251                   if (num_group_errors ++ < 10)
6252                     {
6253                       error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
6254                              entry, i, elf_header.e_shnum - 1);
6255                       if (num_group_errors == 10)
6256                         warn (_("Futher error messages about overlarge group section indicies suppressed\n"));
6257                     }
6258                   continue;
6259                 }
6260
6261               if (section_headers_groups [entry] != NULL)
6262                 {
6263                   if (entry)
6264                     {
6265                       static unsigned num_errs = 0;
6266
6267                       if (num_errs ++ < 10)
6268                         {
6269                           error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
6270                                  entry, i,
6271                                  section_headers_groups [entry]->group_index);
6272                           if (num_errs == 10)
6273                             warn (_("Further error messages about already contained group sections suppressed\n"));
6274                         }
6275                       continue;
6276                     }
6277                   else
6278                     {
6279                       /* Intel C/C++ compiler may put section 0 in a
6280                          section group. We just warn it the first time
6281                          and ignore it afterwards.  */
6282                       static int warned = 0;
6283                       if (!warned)
6284                         {
6285                           error (_("section 0 in group section [%5u]\n"),
6286                                  section_headers_groups [entry]->group_index);
6287                           warned++;
6288                         }
6289                     }
6290                 }
6291
6292               section_headers_groups [entry] = group;
6293
6294               if (do_section_groups)
6295                 {
6296                   sec = section_headers + entry;
6297                   printf ("   [%5u]   %s\n", entry, printable_section_name (sec));
6298                 }
6299
6300               g = (struct group_list *) xmalloc (sizeof (struct group_list));
6301               g->section_index = entry;
6302               g->next = group->root;
6303               group->root = g;
6304             }
6305
6306           if (start)
6307             free (start);
6308
6309           group++;
6310         }
6311     }
6312
6313   if (symtab)
6314     free (symtab);
6315   if (strtab)
6316     free (strtab);
6317   return 1;
6318 }
6319
6320 /* Data used to display dynamic fixups.  */
6321
6322 struct ia64_vms_dynfixup
6323 {
6324   bfd_vma needed_ident;         /* Library ident number.  */
6325   bfd_vma needed;               /* Index in the dstrtab of the library name.  */
6326   bfd_vma fixup_needed;         /* Index of the library.  */
6327   bfd_vma fixup_rela_cnt;       /* Number of fixups.  */
6328   bfd_vma fixup_rela_off;       /* Fixups offset in the dynamic segment.  */
6329 };
6330
6331 /* Data used to display dynamic relocations.  */
6332
6333 struct ia64_vms_dynimgrela
6334 {
6335   bfd_vma img_rela_cnt;         /* Number of relocations.  */
6336   bfd_vma img_rela_off;         /* Reloc offset in the dynamic segment.  */
6337 };
6338
6339 /* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
6340    library).  */
6341
6342 static void
6343 dump_ia64_vms_dynamic_fixups (FILE *file, struct ia64_vms_dynfixup *fixup,
6344                               const char *strtab, unsigned int strtab_sz)
6345 {
6346   Elf64_External_VMS_IMAGE_FIXUP *imfs;
6347   long i;
6348   const char *lib_name;
6349
6350   imfs = get_data (NULL, file, dynamic_addr + fixup->fixup_rela_off,
6351                    1, fixup->fixup_rela_cnt * sizeof (*imfs),
6352                    _("dynamic section image fixups"));
6353   if (!imfs)
6354     return;
6355
6356   if (fixup->needed < strtab_sz)
6357     lib_name = strtab + fixup->needed;
6358   else
6359     {
6360       warn ("corrupt library name index of 0x%lx found in dynamic entry",
6361             (unsigned long) fixup->needed);
6362       lib_name = "???";
6363     }
6364   printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
6365           (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
6366   printf
6367     (_("Seg Offset           Type                             SymVec DataType\n"));
6368
6369   for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
6370     {
6371       unsigned int type;
6372       const char *rtype;
6373
6374       printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
6375       printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
6376       type = BYTE_GET (imfs [i].type);
6377       rtype = elf_ia64_reloc_type (type);
6378       if (rtype == NULL)
6379         printf (" 0x%08x                       ", type);
6380       else
6381         printf (" %-32s ", rtype);
6382       printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
6383       printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
6384     }
6385
6386   free (imfs);
6387 }
6388
6389 /* Display IA-64 OpenVMS dynamic relocations (used to relocate an image).  */
6390
6391 static void
6392 dump_ia64_vms_dynamic_relocs (FILE *file, struct ia64_vms_dynimgrela *imgrela)
6393 {
6394   Elf64_External_VMS_IMAGE_RELA *imrs;
6395   long i;
6396
6397   imrs = get_data (NULL, file, dynamic_addr + imgrela->img_rela_off,
6398                    1, imgrela->img_rela_cnt * sizeof (*imrs),
6399                    _("dynamic section image relocations"));
6400   if (!imrs)
6401     return;
6402
6403   printf (_("\nImage relocs\n"));
6404   printf
6405     (_("Seg Offset   Type                            Addend            Seg Sym Off\n"));
6406
6407   for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
6408     {
6409       unsigned int type;
6410       const char *rtype;
6411
6412       printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
6413       printf ("%08" BFD_VMA_FMT "x ",
6414               (bfd_vma) BYTE_GET (imrs [i].rela_offset));
6415       type = BYTE_GET (imrs [i].type);
6416       rtype = elf_ia64_reloc_type (type);
6417       if (rtype == NULL)
6418         printf ("0x%08x                      ", type);
6419       else
6420         printf ("%-31s ", rtype);
6421       print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
6422       printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
6423       printf ("%08" BFD_VMA_FMT "x\n",
6424               (bfd_vma) BYTE_GET (imrs [i].sym_offset));
6425     }
6426
6427   free (imrs);
6428 }
6429
6430 /* Display IA-64 OpenVMS dynamic relocations and fixups.  */
6431
6432 static int
6433 process_ia64_vms_dynamic_relocs (FILE *file)
6434 {
6435   struct ia64_vms_dynfixup fixup;
6436   struct ia64_vms_dynimgrela imgrela;
6437   Elf_Internal_Dyn *entry;
6438   int res = 0;
6439   bfd_vma strtab_off = 0;
6440   bfd_vma strtab_sz = 0;
6441   char *strtab = NULL;
6442
6443   memset (&fixup, 0, sizeof (fixup));
6444   memset (&imgrela, 0, sizeof (imgrela));
6445
6446   /* Note: the order of the entries is specified by the OpenVMS specs.  */
6447   for (entry = dynamic_section;
6448        entry < dynamic_section + dynamic_nent;
6449        entry++)
6450     {
6451       switch (entry->d_tag)
6452         {
6453         case DT_IA_64_VMS_STRTAB_OFFSET:
6454           strtab_off = entry->d_un.d_val;
6455           break;
6456         case DT_STRSZ:
6457           strtab_sz = entry->d_un.d_val;
6458           if (strtab == NULL)
6459             strtab = get_data (NULL, file, dynamic_addr + strtab_off,
6460                                1, strtab_sz, _("dynamic string section"));
6461           break;
6462
6463         case DT_IA_64_VMS_NEEDED_IDENT:
6464           fixup.needed_ident = entry->d_un.d_val;
6465           break;
6466         case DT_NEEDED:
6467           fixup.needed = entry->d_un.d_val;
6468           break;
6469         case DT_IA_64_VMS_FIXUP_NEEDED:
6470           fixup.fixup_needed = entry->d_un.d_val;
6471           break;
6472         case DT_IA_64_VMS_FIXUP_RELA_CNT:
6473           fixup.fixup_rela_cnt = entry->d_un.d_val;
6474           break;
6475         case DT_IA_64_VMS_FIXUP_RELA_OFF:
6476           fixup.fixup_rela_off = entry->d_un.d_val;
6477           res++;
6478           dump_ia64_vms_dynamic_fixups (file, &fixup, strtab, strtab_sz);
6479           break;
6480
6481         case DT_IA_64_VMS_IMG_RELA_CNT:
6482           imgrela.img_rela_cnt = entry->d_un.d_val;
6483           break;
6484         case DT_IA_64_VMS_IMG_RELA_OFF:
6485           imgrela.img_rela_off = entry->d_un.d_val;
6486           res++;
6487           dump_ia64_vms_dynamic_relocs (file, &imgrela);
6488           break;
6489
6490         default:
6491           break;
6492         }
6493     }
6494
6495   if (strtab != NULL)
6496     free (strtab);
6497
6498   return res;
6499 }
6500
6501 static struct
6502 {
6503   const char * name;
6504   int reloc;
6505   int size;
6506   int rela;
6507 } dynamic_relocations [] =
6508 {
6509     { "REL", DT_REL, DT_RELSZ, FALSE },
6510     { "RELA", DT_RELA, DT_RELASZ, TRUE },
6511     { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
6512 };
6513
6514 /* Process the reloc section.  */
6515
6516 static int
6517 process_relocs (FILE * file)
6518 {
6519   unsigned long rel_size;
6520   unsigned long rel_offset;
6521
6522
6523   if (!do_reloc)
6524     return 1;
6525
6526   if (do_using_dynamic)
6527     {
6528       int is_rela;
6529       const char * name;
6530       int has_dynamic_reloc;
6531       unsigned int i;
6532
6533       has_dynamic_reloc = 0;
6534
6535       for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
6536         {
6537           is_rela = dynamic_relocations [i].rela;
6538           name = dynamic_relocations [i].name;
6539           rel_size = dynamic_info [dynamic_relocations [i].size];
6540           rel_offset = dynamic_info [dynamic_relocations [i].reloc];
6541
6542           has_dynamic_reloc |= rel_size;
6543
6544           if (is_rela == UNKNOWN)
6545             {
6546               if (dynamic_relocations [i].reloc == DT_JMPREL)
6547                 switch (dynamic_info[DT_PLTREL])
6548                   {
6549                   case DT_REL:
6550                     is_rela = FALSE;
6551                     break;
6552                   case DT_RELA:
6553                     is_rela = TRUE;
6554                     break;
6555                   }
6556             }
6557
6558           if (rel_size)
6559             {
6560               printf
6561                 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
6562                  name, rel_offset, rel_size);
6563
6564               dump_relocations (file,
6565                                 offset_from_vma (file, rel_offset, rel_size),
6566                                 rel_size,
6567                                 dynamic_symbols, num_dynamic_syms,
6568                                 dynamic_strings, dynamic_strings_length,
6569                                 is_rela, 1);
6570             }
6571         }
6572
6573       if (is_ia64_vms ())
6574         has_dynamic_reloc |= process_ia64_vms_dynamic_relocs (file);
6575
6576       if (! has_dynamic_reloc)
6577         printf (_("\nThere are no dynamic relocations in this file.\n"));
6578     }
6579   else
6580     {
6581       Elf_Internal_Shdr * section;
6582       unsigned long i;
6583       int found = 0;
6584
6585       for (i = 0, section = section_headers;
6586            i < elf_header.e_shnum;
6587            i++, section++)
6588         {
6589           if (   section->sh_type != SHT_RELA
6590               && section->sh_type != SHT_REL)
6591             continue;
6592
6593           rel_offset = section->sh_offset;
6594           rel_size   = section->sh_size;
6595
6596           if (rel_size)
6597             {
6598               Elf_Internal_Shdr * strsec;
6599               int is_rela;
6600
6601               printf (_("\nRelocation section "));
6602
6603               if (string_table == NULL)
6604                 printf ("%d", section->sh_name);
6605               else
6606                 printf ("'%s'", printable_section_name (section));
6607
6608               printf (_(" at offset 0x%lx contains %lu entries:\n"),
6609                  rel_offset, (unsigned long) (rel_size / section->sh_entsize));
6610
6611               is_rela = section->sh_type == SHT_RELA;
6612
6613               if (section->sh_link != 0
6614                   && section->sh_link < elf_header.e_shnum)
6615                 {
6616                   Elf_Internal_Shdr * symsec;
6617                   Elf_Internal_Sym *  symtab;
6618                   unsigned long nsyms;
6619                   unsigned long strtablen = 0;
6620                   char * strtab = NULL;
6621
6622                   symsec = section_headers + section->sh_link;
6623                   if (symsec->sh_type != SHT_SYMTAB
6624                       && symsec->sh_type != SHT_DYNSYM)
6625                     continue;
6626
6627                   symtab = GET_ELF_SYMBOLS (file, symsec, & nsyms);
6628
6629                   if (symtab == NULL)
6630                     continue;
6631
6632                   if (symsec->sh_link != 0
6633                       && symsec->sh_link < elf_header.e_shnum)
6634                     {
6635                       strsec = section_headers + symsec->sh_link;
6636
6637                       strtab = (char *) get_data (NULL, file, strsec->sh_offset,
6638                                                   1, strsec->sh_size,
6639                                                   _("string table"));
6640                       strtablen = strtab == NULL ? 0 : strsec->sh_size;
6641                     }
6642
6643                   dump_relocations (file, rel_offset, rel_size,
6644                                     symtab, nsyms, strtab, strtablen,
6645                                     is_rela,
6646                                     symsec->sh_type == SHT_DYNSYM);
6647                   if (strtab)
6648                     free (strtab);
6649                   free (symtab);
6650                 }
6651               else
6652                 dump_relocations (file, rel_offset, rel_size,
6653                                   NULL, 0, NULL, 0, is_rela, 0);
6654
6655               found = 1;
6656             }
6657         }
6658
6659       if (! found)
6660         printf (_("\nThere are no relocations in this file.\n"));
6661     }
6662
6663   return 1;
6664 }
6665
6666 /* An absolute address consists of a section and an offset.  If the
6667    section is NULL, the offset itself is the address, otherwise, the
6668    address equals to LOAD_ADDRESS(section) + offset.  */
6669
6670 struct absaddr
6671 {
6672   unsigned short section;
6673   bfd_vma offset;
6674 };
6675
6676 #define ABSADDR(a) \
6677   ((a).section \
6678    ? section_headers [(a).section].sh_addr + (a).offset \
6679    : (a).offset)
6680
6681 /* Find the nearest symbol at or below ADDR.  Returns the symbol
6682    name, if found, and the offset from the symbol to ADDR.  */
6683
6684 static void
6685 find_symbol_for_address (Elf_Internal_Sym * symtab,
6686                          unsigned long      nsyms,
6687                          const char *       strtab,
6688                          unsigned long      strtab_size,
6689                          struct absaddr     addr,
6690                          const char **      symname,
6691                          bfd_vma *          offset)
6692 {
6693   bfd_vma dist = 0x100000;
6694   Elf_Internal_Sym * sym;
6695   Elf_Internal_Sym * beg;
6696   Elf_Internal_Sym * end;
6697   Elf_Internal_Sym * best = NULL;
6698
6699   REMOVE_ARCH_BITS (addr.offset);
6700   beg = symtab;
6701   end = symtab + nsyms;
6702
6703   while (beg < end)
6704     {
6705       bfd_vma value;
6706
6707       sym = beg + (end - beg) / 2;
6708
6709       value = sym->st_value;
6710       REMOVE_ARCH_BITS (value);
6711
6712       if (sym->st_name != 0
6713           && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
6714           && addr.offset >= value
6715           && addr.offset - value < dist)
6716         {
6717           best = sym;
6718           dist = addr.offset - value;
6719           if (!dist)
6720             break;
6721         }
6722
6723       if (addr.offset < value)
6724         end = sym;
6725       else
6726         beg = sym + 1;
6727     }
6728
6729   if (best)
6730     {
6731       *symname = (best->st_name >= strtab_size
6732                   ? _("<corrupt>") : strtab + best->st_name);
6733       *offset = dist;
6734       return;
6735     }
6736
6737   *symname = NULL;
6738   *offset = addr.offset;
6739 }
6740
6741 static int
6742 symcmp (const void *p, const void *q)
6743 {
6744   Elf_Internal_Sym *sp = (Elf_Internal_Sym *) p;
6745   Elf_Internal_Sym *sq = (Elf_Internal_Sym *) q;
6746
6747   return sp->st_value > sq->st_value ? 1 : (sp->st_value < sq->st_value ? -1 : 0);
6748 }
6749
6750 /* Process the unwind section.  */
6751
6752 #include "unwind-ia64.h"
6753
6754 struct ia64_unw_table_entry
6755 {
6756   struct absaddr start;
6757   struct absaddr end;
6758   struct absaddr info;
6759 };
6760
6761 struct ia64_unw_aux_info
6762 {
6763   struct ia64_unw_table_entry *table;   /* Unwind table.  */
6764   unsigned long table_len;              /* Length of unwind table.  */
6765   unsigned char * info;                 /* Unwind info.  */
6766   unsigned long info_size;              /* Size of unwind info.  */
6767   bfd_vma info_addr;                    /* Starting address of unwind info.  */
6768   bfd_vma seg_base;                     /* Starting address of segment.  */
6769   Elf_Internal_Sym * symtab;            /* The symbol table.  */
6770   unsigned long nsyms;                  /* Number of symbols.  */
6771   Elf_Internal_Sym * funtab;            /* Sorted table of STT_FUNC symbols.  */
6772   unsigned long nfuns;                  /* Number of entries in funtab.  */
6773   char * strtab;                        /* The string table.  */
6774   unsigned long strtab_size;            /* Size of string table.  */
6775 };
6776
6777 static void
6778 dump_ia64_unwind (struct ia64_unw_aux_info * aux)
6779 {
6780   struct ia64_unw_table_entry * tp;
6781   unsigned long j, nfuns;
6782   int in_body;
6783
6784   aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
6785   for (nfuns = 0, j = 0; j < aux->nsyms; j++)
6786     if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
6787       aux->funtab[nfuns++] = aux->symtab[j];
6788   aux->nfuns = nfuns;
6789   qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
6790
6791   for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
6792     {
6793       bfd_vma stamp;
6794       bfd_vma offset;
6795       const unsigned char * dp;
6796       const unsigned char * head;
6797       const unsigned char * end;
6798       const char * procname;
6799
6800       find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
6801                                aux->strtab_size, tp->start, &procname, &offset);
6802
6803       fputs ("\n<", stdout);
6804
6805       if (procname)
6806         {
6807           fputs (procname, stdout);
6808
6809           if (offset)
6810             printf ("+%lx", (unsigned long) offset);
6811         }
6812
6813       fputs (">: [", stdout);
6814       print_vma (tp->start.offset, PREFIX_HEX);
6815       fputc ('-', stdout);
6816       print_vma (tp->end.offset, PREFIX_HEX);
6817       printf ("], info at +0x%lx\n",
6818               (unsigned long) (tp->info.offset - aux->seg_base));
6819
6820       /* PR 17531: file: 86232b32.  */
6821       if (aux->info == NULL)
6822         continue;
6823
6824       /* PR 17531: file: 0997b4d1.  */
6825       if ((ABSADDR (tp->info) - aux->info_addr) >= aux->info_size)
6826         {
6827           warn (_("Invalid offset %lx in table entry %ld\n"),
6828                 (long) tp->info.offset, (long) (tp - aux->table));
6829           continue;
6830         }
6831
6832       head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
6833       stamp = byte_get ((unsigned char *) head, sizeof (stamp));
6834
6835       printf ("  v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
6836               (unsigned) UNW_VER (stamp),
6837               (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
6838               UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
6839               UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
6840               (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
6841
6842       if (UNW_VER (stamp) != 1)
6843         {
6844           printf (_("\tUnknown version.\n"));
6845           continue;
6846         }
6847
6848       in_body = 0;
6849       end = head + 8 + eh_addr_size * UNW_LENGTH (stamp);
6850       /* PR 17531: file: 16ceda89.  */
6851       if (end > aux->info + aux->info_size)
6852         end = aux->info + aux->info_size;
6853       for (dp = head + 8; dp < end;)
6854         dp = unw_decode (dp, in_body, & in_body, end);
6855     }
6856
6857   free (aux->funtab);
6858 }
6859
6860 static bfd_boolean
6861 slurp_ia64_unwind_table (FILE * file,
6862                          struct ia64_unw_aux_info * aux,
6863                          Elf_Internal_Shdr * sec)
6864 {
6865   unsigned long size, nrelas, i;
6866   Elf_Internal_Phdr * seg;
6867   struct ia64_unw_table_entry * tep;
6868   Elf_Internal_Shdr * relsec;
6869   Elf_Internal_Rela * rela;
6870   Elf_Internal_Rela * rp;
6871   unsigned char * table;
6872   unsigned char * tp;
6873   Elf_Internal_Sym * sym;
6874   const char * relname;
6875
6876   aux->table_len = 0;
6877
6878   /* First, find the starting address of the segment that includes
6879      this section: */
6880
6881   if (elf_header.e_phnum)
6882     {
6883       if (! get_program_headers (file))
6884           return FALSE;
6885
6886       for (seg = program_headers;
6887            seg < program_headers + elf_header.e_phnum;
6888            ++seg)
6889         {
6890           if (seg->p_type != PT_LOAD)
6891             continue;
6892
6893           if (sec->sh_addr >= seg->p_vaddr
6894               && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
6895             {
6896               aux->seg_base = seg->p_vaddr;
6897               break;
6898             }
6899         }
6900     }
6901
6902   /* Second, build the unwind table from the contents of the unwind section:  */
6903   size = sec->sh_size;
6904   table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
6905                                       _("unwind table"));
6906   if (!table)
6907     return FALSE;
6908
6909   aux->table_len = size / (3 * eh_addr_size);
6910   aux->table = (struct ia64_unw_table_entry *)
6911     xcmalloc (aux->table_len, sizeof (aux->table[0]));
6912   tep = aux->table;
6913
6914   for (tp = table; tp <= table + size - (3 * eh_addr_size); ++tep)
6915     {
6916       tep->start.section = SHN_UNDEF;
6917       tep->end.section   = SHN_UNDEF;
6918       tep->info.section  = SHN_UNDEF;
6919       tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
6920       tep->end.offset   = byte_get (tp, eh_addr_size); tp += eh_addr_size;
6921       tep->info.offset  = byte_get (tp, eh_addr_size); tp += eh_addr_size;
6922       tep->start.offset += aux->seg_base;
6923       tep->end.offset   += aux->seg_base;
6924       tep->info.offset  += aux->seg_base;
6925     }
6926   free (table);
6927
6928   /* Third, apply any relocations to the unwind table:  */
6929   for (relsec = section_headers;
6930        relsec < section_headers + elf_header.e_shnum;
6931        ++relsec)
6932     {
6933       if (relsec->sh_type != SHT_RELA
6934           || relsec->sh_info >= elf_header.e_shnum
6935           || section_headers + relsec->sh_info != sec)
6936         continue;
6937
6938       if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
6939                               & rela, & nrelas))
6940         {
6941           free (aux->table);
6942           aux->table = NULL;
6943           aux->table_len = 0;
6944           return FALSE;
6945         }
6946
6947       for (rp = rela; rp < rela + nrelas; ++rp)
6948         {
6949           relname = elf_ia64_reloc_type (get_reloc_type (rp->r_info));
6950           sym = aux->symtab + get_reloc_symindex (rp->r_info);
6951
6952           /* PR 17531: file: 9fa67536.  */
6953           if (relname == NULL)
6954             {
6955               warn (_("Skipping unknown relocation type: %u\n"), get_reloc_type (rp->r_info));
6956               continue;
6957             }
6958
6959           if (! const_strneq (relname, "R_IA64_SEGREL"))
6960             {
6961               warn (_("Skipping unexpected relocation type: %s\n"), relname);
6962               continue;
6963             }
6964
6965           i = rp->r_offset / (3 * eh_addr_size);
6966
6967           /* PR 17531: file: 5bc8d9bf.  */
6968           if (i >= aux->table_len)
6969             {
6970               warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
6971               continue;
6972             }
6973
6974           switch (rp->r_offset / eh_addr_size % 3)
6975             {
6976             case 0:
6977               aux->table[i].start.section = sym->st_shndx;
6978               aux->table[i].start.offset  = rp->r_addend + sym->st_value;
6979               break;
6980             case 1:
6981               aux->table[i].end.section   = sym->st_shndx;
6982               aux->table[i].end.offset    = rp->r_addend + sym->st_value;
6983               break;
6984             case 2:
6985               aux->table[i].info.section  = sym->st_shndx;
6986               aux->table[i].info.offset   = rp->r_addend + sym->st_value;
6987               break;
6988             default:
6989               break;
6990             }
6991         }
6992
6993       free (rela);
6994     }
6995
6996   return TRUE;
6997 }
6998
6999 static void
7000 ia64_process_unwind (FILE * file)
7001 {
7002   Elf_Internal_Shdr * sec;
7003   Elf_Internal_Shdr * unwsec = NULL;
7004   Elf_Internal_Shdr * strsec;
7005   unsigned long i, unwcount = 0, unwstart = 0;
7006   struct ia64_unw_aux_info aux;
7007
7008   memset (& aux, 0, sizeof (aux));
7009
7010   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7011     {
7012       if (sec->sh_type == SHT_SYMTAB
7013           && sec->sh_link < elf_header.e_shnum)
7014         {
7015           aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
7016
7017           strsec = section_headers + sec->sh_link;
7018           if (aux.strtab != NULL)
7019             {
7020               error (_("Multiple auxillary string tables encountered\n"));
7021               free (aux.strtab);
7022             }
7023           aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
7024                                           1, strsec->sh_size,
7025                                           _("string table"));
7026           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7027         }
7028       else if (sec->sh_type == SHT_IA_64_UNWIND)
7029         unwcount++;
7030     }
7031
7032   if (!unwcount)
7033     printf (_("\nThere are no unwind sections in this file.\n"));
7034
7035   while (unwcount-- > 0)
7036     {
7037       char * suffix;
7038       size_t len, len2;
7039
7040       for (i = unwstart, sec = section_headers + unwstart, unwsec = NULL;
7041            i < elf_header.e_shnum; ++i, ++sec)
7042         if (sec->sh_type == SHT_IA_64_UNWIND)
7043           {
7044             unwsec = sec;
7045             break;
7046           }
7047       /* We have already counted the number of SHT_IA64_UNWIND
7048          sections so the loop above should never fail.  */
7049       assert (unwsec != NULL);
7050
7051       unwstart = i + 1;
7052       len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
7053
7054       if ((unwsec->sh_flags & SHF_GROUP) != 0)
7055         {
7056           /* We need to find which section group it is in.  */
7057           struct group_list * g;
7058
7059           if (section_headers_groups == NULL
7060               || section_headers_groups [i] == NULL)
7061             i = elf_header.e_shnum;
7062           else
7063             {
7064               g = section_headers_groups [i]->root;
7065
7066               for (; g != NULL; g = g->next)
7067                 {
7068                   sec = section_headers + g->section_index;
7069
7070                   if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
7071                     break;
7072                 }
7073
7074               if (g == NULL)
7075                 i = elf_header.e_shnum;
7076             }
7077         }
7078       else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
7079         {
7080           /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO.  */
7081           len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
7082           suffix = SECTION_NAME (unwsec) + len;
7083           for (i = 0, sec = section_headers; i < elf_header.e_shnum;
7084                ++i, ++sec)
7085             if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
7086                 && streq (SECTION_NAME (sec) + len2, suffix))
7087               break;
7088         }
7089       else
7090         {
7091           /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
7092              .IA_64.unwind or BAR -> .IA_64.unwind_info.  */
7093           len = sizeof (ELF_STRING_ia64_unwind) - 1;
7094           len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
7095           suffix = "";
7096           if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
7097             suffix = SECTION_NAME (unwsec) + len;
7098           for (i = 0, sec = section_headers; i < elf_header.e_shnum;
7099                ++i, ++sec)
7100             if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
7101                 && streq (SECTION_NAME (sec) + len2, suffix))
7102               break;
7103         }
7104
7105       if (i == elf_header.e_shnum)
7106         {
7107           printf (_("\nCould not find unwind info section for "));
7108
7109           if (string_table == NULL)
7110             printf ("%d", unwsec->sh_name);
7111           else
7112             printf ("'%s'", printable_section_name (unwsec));
7113         }
7114       else
7115         {
7116           aux.info_addr = sec->sh_addr;
7117           aux.info = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1,
7118                                                  sec->sh_size,
7119                                                  _("unwind info"));
7120           aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
7121
7122           printf (_("\nUnwind section "));
7123
7124           if (string_table == NULL)
7125             printf ("%d", unwsec->sh_name);
7126           else
7127             printf ("'%s'", printable_section_name (unwsec));
7128
7129           printf (_(" at offset 0x%lx contains %lu entries:\n"),
7130                   (unsigned long) unwsec->sh_offset,
7131                   (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
7132
7133           if (slurp_ia64_unwind_table (file, & aux, unwsec)
7134               && aux.table_len > 0)
7135             dump_ia64_unwind (& aux);
7136
7137           if (aux.table)
7138             free ((char *) aux.table);
7139           if (aux.info)
7140             free ((char *) aux.info);
7141           aux.table = NULL;
7142           aux.info = NULL;
7143         }
7144     }
7145
7146   if (aux.symtab)
7147     free (aux.symtab);
7148   if (aux.strtab)
7149     free ((char *) aux.strtab);
7150 }
7151
7152 struct hppa_unw_table_entry
7153   {
7154     struct absaddr start;
7155     struct absaddr end;
7156     unsigned int Cannot_unwind:1;               /* 0 */
7157     unsigned int Millicode:1;                   /* 1 */
7158     unsigned int Millicode_save_sr0:1;          /* 2 */
7159     unsigned int Region_description:2;          /* 3..4 */
7160     unsigned int reserved1:1;                   /* 5 */
7161     unsigned int Entry_SR:1;                    /* 6 */
7162     unsigned int Entry_FR:4;     /* number saved */     /* 7..10 */
7163     unsigned int Entry_GR:5;     /* number saved */     /* 11..15 */
7164     unsigned int Args_stored:1;                 /* 16 */
7165     unsigned int Variable_Frame:1;              /* 17 */
7166     unsigned int Separate_Package_Body:1;       /* 18 */
7167     unsigned int Frame_Extension_Millicode:1;   /* 19 */
7168     unsigned int Stack_Overflow_Check:1;        /* 20 */
7169     unsigned int Two_Instruction_SP_Increment:1;/* 21 */
7170     unsigned int Ada_Region:1;                  /* 22 */
7171     unsigned int cxx_info:1;                    /* 23 */
7172     unsigned int cxx_try_catch:1;               /* 24 */
7173     unsigned int sched_entry_seq:1;             /* 25 */
7174     unsigned int reserved2:1;                   /* 26 */
7175     unsigned int Save_SP:1;                     /* 27 */
7176     unsigned int Save_RP:1;                     /* 28 */
7177     unsigned int Save_MRP_in_frame:1;           /* 29 */
7178     unsigned int extn_ptr_defined:1;            /* 30 */
7179     unsigned int Cleanup_defined:1;             /* 31 */
7180
7181     unsigned int MPE_XL_interrupt_marker:1;     /* 0 */
7182     unsigned int HP_UX_interrupt_marker:1;      /* 1 */
7183     unsigned int Large_frame:1;                 /* 2 */
7184     unsigned int Pseudo_SP_Set:1;               /* 3 */
7185     unsigned int reserved4:1;                   /* 4 */
7186     unsigned int Total_frame_size:27;           /* 5..31 */
7187   };
7188
7189 struct hppa_unw_aux_info
7190 {
7191   struct hppa_unw_table_entry * table;  /* Unwind table.  */
7192   unsigned long table_len;              /* Length of unwind table.  */
7193   bfd_vma seg_base;                     /* Starting address of segment.  */
7194   Elf_Internal_Sym * symtab;            /* The symbol table.  */
7195   unsigned long nsyms;                  /* Number of symbols.  */
7196   Elf_Internal_Sym * funtab;            /* Sorted table of STT_FUNC symbols.  */
7197   unsigned long nfuns;                  /* Number of entries in funtab.  */
7198   char * strtab;                        /* The string table.  */
7199   unsigned long strtab_size;            /* Size of string table.  */
7200 };
7201
7202 static void
7203 dump_hppa_unwind (struct hppa_unw_aux_info * aux)
7204 {
7205   struct hppa_unw_table_entry * tp;
7206   unsigned long j, nfuns;
7207
7208   aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7209   for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7210     if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7211       aux->funtab[nfuns++] = aux->symtab[j];
7212   aux->nfuns = nfuns;
7213   qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7214
7215   for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7216     {
7217       bfd_vma offset;
7218       const char * procname;
7219
7220       find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
7221                                aux->strtab_size, tp->start, &procname,
7222                                &offset);
7223
7224       fputs ("\n<", stdout);
7225
7226       if (procname)
7227         {
7228           fputs (procname, stdout);
7229
7230           if (offset)
7231             printf ("+%lx", (unsigned long) offset);
7232         }
7233
7234       fputs (">: [", stdout);
7235       print_vma (tp->start.offset, PREFIX_HEX);
7236       fputc ('-', stdout);
7237       print_vma (tp->end.offset, PREFIX_HEX);
7238       printf ("]\n\t");
7239
7240 #define PF(_m) if (tp->_m) printf (#_m " ");
7241 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
7242       PF(Cannot_unwind);
7243       PF(Millicode);
7244       PF(Millicode_save_sr0);
7245       /* PV(Region_description);  */
7246       PF(Entry_SR);
7247       PV(Entry_FR);
7248       PV(Entry_GR);
7249       PF(Args_stored);
7250       PF(Variable_Frame);
7251       PF(Separate_Package_Body);
7252       PF(Frame_Extension_Millicode);
7253       PF(Stack_Overflow_Check);
7254       PF(Two_Instruction_SP_Increment);
7255       PF(Ada_Region);
7256       PF(cxx_info);
7257       PF(cxx_try_catch);
7258       PF(sched_entry_seq);
7259       PF(Save_SP);
7260       PF(Save_RP);
7261       PF(Save_MRP_in_frame);
7262       PF(extn_ptr_defined);
7263       PF(Cleanup_defined);
7264       PF(MPE_XL_interrupt_marker);
7265       PF(HP_UX_interrupt_marker);
7266       PF(Large_frame);
7267       PF(Pseudo_SP_Set);
7268       PV(Total_frame_size);
7269 #undef PF
7270 #undef PV
7271     }
7272
7273   printf ("\n");
7274
7275   free (aux->funtab);
7276 }
7277
7278 static int
7279 slurp_hppa_unwind_table (FILE * file,
7280                          struct hppa_unw_aux_info * aux,
7281                          Elf_Internal_Shdr * sec)
7282 {
7283   unsigned long size, unw_ent_size, nentries, nrelas, i;
7284   Elf_Internal_Phdr * seg;
7285   struct hppa_unw_table_entry * tep;
7286   Elf_Internal_Shdr * relsec;
7287   Elf_Internal_Rela * rela;
7288   Elf_Internal_Rela * rp;
7289   unsigned char * table;
7290   unsigned char * tp;
7291   Elf_Internal_Sym * sym;
7292   const char * relname;
7293
7294   /* First, find the starting address of the segment that includes
7295      this section.  */
7296
7297   if (elf_header.e_phnum)
7298     {
7299       if (! get_program_headers (file))
7300         return 0;
7301
7302       for (seg = program_headers;
7303            seg < program_headers + elf_header.e_phnum;
7304            ++seg)
7305         {
7306           if (seg->p_type != PT_LOAD)
7307             continue;
7308
7309           if (sec->sh_addr >= seg->p_vaddr
7310               && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7311             {
7312               aux->seg_base = seg->p_vaddr;
7313               break;
7314             }
7315         }
7316     }
7317
7318   /* Second, build the unwind table from the contents of the unwind
7319      section.  */
7320   size = sec->sh_size;
7321   table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
7322                                       _("unwind table"));
7323   if (!table)
7324     return 0;
7325
7326   unw_ent_size = 16;
7327   nentries = size / unw_ent_size;
7328   size = unw_ent_size * nentries;
7329
7330   tep = aux->table = (struct hppa_unw_table_entry *)
7331       xcmalloc (nentries, sizeof (aux->table[0]));
7332
7333   for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
7334     {
7335       unsigned int tmp1, tmp2;
7336
7337       tep->start.section = SHN_UNDEF;
7338       tep->end.section   = SHN_UNDEF;
7339
7340       tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
7341       tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
7342       tmp1 = byte_get ((unsigned char *) tp + 8, 4);
7343       tmp2 = byte_get ((unsigned char *) tp + 12, 4);
7344
7345       tep->start.offset += aux->seg_base;
7346       tep->end.offset   += aux->seg_base;
7347
7348       tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
7349       tep->Millicode = (tmp1 >> 30) & 0x1;
7350       tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
7351       tep->Region_description = (tmp1 >> 27) & 0x3;
7352       tep->reserved1 = (tmp1 >> 26) & 0x1;
7353       tep->Entry_SR = (tmp1 >> 25) & 0x1;
7354       tep->Entry_FR = (tmp1 >> 21) & 0xf;
7355       tep->Entry_GR = (tmp1 >> 16) & 0x1f;
7356       tep->Args_stored = (tmp1 >> 15) & 0x1;
7357       tep->Variable_Frame = (tmp1 >> 14) & 0x1;
7358       tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
7359       tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
7360       tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
7361       tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
7362       tep->Ada_Region = (tmp1 >> 9) & 0x1;
7363       tep->cxx_info = (tmp1 >> 8) & 0x1;
7364       tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
7365       tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
7366       tep->reserved2 = (tmp1 >> 5) & 0x1;
7367       tep->Save_SP = (tmp1 >> 4) & 0x1;
7368       tep->Save_RP = (tmp1 >> 3) & 0x1;
7369       tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
7370       tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
7371       tep->Cleanup_defined = tmp1 & 0x1;
7372
7373       tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
7374       tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
7375       tep->Large_frame = (tmp2 >> 29) & 0x1;
7376       tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
7377       tep->reserved4 = (tmp2 >> 27) & 0x1;
7378       tep->Total_frame_size = tmp2 & 0x7ffffff;
7379     }
7380   free (table);
7381
7382   /* Third, apply any relocations to the unwind table.  */
7383   for (relsec = section_headers;
7384        relsec < section_headers + elf_header.e_shnum;
7385        ++relsec)
7386     {
7387       if (relsec->sh_type != SHT_RELA
7388           || relsec->sh_info >= elf_header.e_shnum
7389           || section_headers + relsec->sh_info != sec)
7390         continue;
7391
7392       if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7393                               & rela, & nrelas))
7394         return 0;
7395
7396       for (rp = rela; rp < rela + nrelas; ++rp)
7397         {
7398           relname = elf_hppa_reloc_type (get_reloc_type (rp->r_info));
7399           sym = aux->symtab + get_reloc_symindex (rp->r_info);
7400
7401           /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64.  */
7402           if (! const_strneq (relname, "R_PARISC_SEGREL"))
7403             {
7404               warn (_("Skipping unexpected relocation type %s\n"), relname);
7405               continue;
7406             }
7407
7408           i = rp->r_offset / unw_ent_size;
7409
7410           switch ((rp->r_offset % unw_ent_size) / eh_addr_size)
7411             {
7412             case 0:
7413               aux->table[i].start.section = sym->st_shndx;
7414               aux->table[i].start.offset  = sym->st_value + rp->r_addend;
7415               break;
7416             case 1:
7417               aux->table[i].end.section   = sym->st_shndx;
7418               aux->table[i].end.offset    = sym->st_value + rp->r_addend;
7419               break;
7420             default:
7421               break;
7422             }
7423         }
7424
7425       free (rela);
7426     }
7427
7428   aux->table_len = nentries;
7429
7430   return 1;
7431 }
7432
7433 static void
7434 hppa_process_unwind (FILE * file)
7435 {
7436   struct hppa_unw_aux_info aux;
7437   Elf_Internal_Shdr * unwsec = NULL;
7438   Elf_Internal_Shdr * strsec;
7439   Elf_Internal_Shdr * sec;
7440   unsigned long i;
7441
7442   if (string_table == NULL)
7443     return;
7444
7445   memset (& aux, 0, sizeof (aux));
7446
7447   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7448     {
7449       if (sec->sh_type == SHT_SYMTAB
7450           && sec->sh_link < elf_header.e_shnum)
7451         {
7452           aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
7453
7454           strsec = section_headers + sec->sh_link;
7455           if (aux.strtab != NULL)
7456             {
7457               error (_("Multiple auxillary string tables encountered\n"));
7458               free (aux.strtab);
7459             }
7460           aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
7461                                           1, strsec->sh_size,
7462                                           _("string table"));
7463           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7464         }
7465       else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
7466         unwsec = sec;
7467     }
7468
7469   if (!unwsec)
7470     printf (_("\nThere are no unwind sections in this file.\n"));
7471
7472   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7473     {
7474       if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
7475         {
7476           printf (_("\nUnwind section '%s' at offset 0x%lx contains %lu entries:\n"),
7477                   printable_section_name (sec),
7478                   (unsigned long) sec->sh_offset,
7479                   (unsigned long) (sec->sh_size / (2 * eh_addr_size + 8)));
7480
7481           slurp_hppa_unwind_table (file, &aux, sec);
7482           if (aux.table_len > 0)
7483             dump_hppa_unwind (&aux);
7484
7485           if (aux.table)
7486             free ((char *) aux.table);
7487           aux.table = NULL;
7488         }
7489     }
7490
7491   if (aux.symtab)
7492     free (aux.symtab);
7493   if (aux.strtab)
7494     free ((char *) aux.strtab);
7495 }
7496
7497 struct arm_section
7498 {
7499   unsigned char *      data;            /* The unwind data.  */
7500   Elf_Internal_Shdr *  sec;             /* The cached unwind section header.  */
7501   Elf_Internal_Rela *  rela;            /* The cached relocations for this section.  */
7502   unsigned long        nrelas;          /* The number of relocations.  */
7503   unsigned int         rel_type;        /* REL or RELA ?  */
7504   Elf_Internal_Rela *  next_rela;       /* Cyclic pointer to the next reloc to process.  */
7505 };
7506
7507 struct arm_unw_aux_info
7508 {
7509   FILE *              file;             /* The file containing the unwind sections.  */
7510   Elf_Internal_Sym *  symtab;           /* The file's symbol table.  */
7511   unsigned long       nsyms;            /* Number of symbols.  */
7512   Elf_Internal_Sym *  funtab;           /* Sorted table of STT_FUNC symbols.  */
7513   unsigned long       nfuns;            /* Number of these symbols.  */
7514   char *              strtab;           /* The file's string table.  */
7515   unsigned long       strtab_size;      /* Size of string table.  */
7516 };
7517
7518 static const char *
7519 arm_print_vma_and_name (struct arm_unw_aux_info *aux,
7520                         bfd_vma fn, struct absaddr addr)
7521 {
7522   const char *procname;
7523   bfd_vma sym_offset;
7524
7525   if (addr.section == SHN_UNDEF)
7526     addr.offset = fn;
7527
7528   find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
7529                            aux->strtab_size, addr, &procname,
7530                            &sym_offset);
7531
7532   print_vma (fn, PREFIX_HEX);
7533
7534   if (procname)
7535     {
7536       fputs (" <", stdout);
7537       fputs (procname, stdout);
7538
7539       if (sym_offset)
7540         printf ("+0x%lx", (unsigned long) sym_offset);
7541       fputc ('>', stdout);
7542     }
7543
7544   return procname;
7545 }
7546
7547 static void
7548 arm_free_section (struct arm_section *arm_sec)
7549 {
7550   if (arm_sec->data != NULL)
7551     free (arm_sec->data);
7552
7553   if (arm_sec->rela != NULL)
7554     free (arm_sec->rela);
7555 }
7556
7557 /* 1) If SEC does not match the one cached in ARM_SEC, then free the current
7558       cached section and install SEC instead.
7559    2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
7560       and return its valued in * WORDP, relocating if necessary.
7561    3) Update the NEXT_RELA field in ARM_SEC and store the section index and
7562       relocation's offset in ADDR.
7563    4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
7564       into the string table of the symbol associated with the reloc.  If no
7565       reloc was applied store -1 there.
7566    5) Return TRUE upon success, FALSE otherwise.  */
7567
7568 static bfd_boolean
7569 get_unwind_section_word (struct arm_unw_aux_info *  aux,
7570                          struct arm_section *       arm_sec,
7571                          Elf_Internal_Shdr *        sec,
7572                          bfd_vma                    word_offset,
7573                          unsigned int *             wordp,
7574                          struct absaddr *           addr,
7575                          bfd_vma *                  sym_name)
7576 {
7577   Elf_Internal_Rela *rp;
7578   Elf_Internal_Sym *sym;
7579   const char * relname;
7580   unsigned int word;
7581   bfd_boolean wrapped;
7582
7583   if (sec == NULL || arm_sec == NULL)
7584     return FALSE;
7585
7586   addr->section = SHN_UNDEF;
7587   addr->offset = 0;
7588
7589   if (sym_name != NULL)
7590     *sym_name = (bfd_vma) -1;
7591
7592   /* If necessary, update the section cache.  */
7593   if (sec != arm_sec->sec)
7594     {
7595       Elf_Internal_Shdr *relsec;
7596
7597       arm_free_section (arm_sec);
7598
7599       arm_sec->sec = sec;
7600       arm_sec->data = get_data (NULL, aux->file, sec->sh_offset, 1,
7601                                 sec->sh_size, _("unwind data"));
7602       arm_sec->rela = NULL;
7603       arm_sec->nrelas = 0;
7604
7605       for (relsec = section_headers;
7606            relsec < section_headers + elf_header.e_shnum;
7607            ++relsec)
7608         {
7609           if (relsec->sh_info >= elf_header.e_shnum
7610               || section_headers + relsec->sh_info != sec
7611               /* PR 15745: Check the section type as well.  */
7612               || (relsec->sh_type != SHT_REL
7613                   && relsec->sh_type != SHT_RELA))
7614             continue;
7615
7616           arm_sec->rel_type = relsec->sh_type;
7617           if (relsec->sh_type == SHT_REL)
7618             {
7619               if (!slurp_rel_relocs (aux->file, relsec->sh_offset,
7620                                      relsec->sh_size,
7621                                      & arm_sec->rela, & arm_sec->nrelas))
7622                 return FALSE;
7623             }
7624           else /* relsec->sh_type == SHT_RELA */
7625             {
7626               if (!slurp_rela_relocs (aux->file, relsec->sh_offset,
7627                                       relsec->sh_size,
7628                                       & arm_sec->rela, & arm_sec->nrelas))
7629                 return FALSE;
7630             }
7631           break;
7632         }
7633
7634       arm_sec->next_rela = arm_sec->rela;
7635     }
7636
7637   /* If there is no unwind data we can do nothing.  */
7638   if (arm_sec->data == NULL)
7639     return FALSE;
7640
7641   /* If the offset is invalid then fail.  */
7642   if (word_offset > (sec->sh_size - 4)
7643       /* PR 18879 */
7644       || (sec->sh_size < 5 && word_offset >= sec->sh_size)
7645       || ((bfd_signed_vma) word_offset) < 0)
7646     return FALSE;
7647
7648   /* Get the word at the required offset.  */
7649   word = byte_get (arm_sec->data + word_offset, 4);
7650
7651   /* PR 17531: file: id:000001,src:001266+003044,op:splice,rep:128.  */
7652   if (arm_sec->rela == NULL)
7653     {
7654       * wordp = word;
7655       return TRUE;
7656     }
7657
7658   /* Look through the relocs to find the one that applies to the provided offset.  */
7659   wrapped = FALSE;
7660   for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
7661     {
7662       bfd_vma prelval, offset;
7663
7664       if (rp->r_offset > word_offset && !wrapped)
7665         {
7666           rp = arm_sec->rela;
7667           wrapped = TRUE;
7668         }
7669       if (rp->r_offset > word_offset)
7670         break;
7671
7672       if (rp->r_offset & 3)
7673         {
7674           warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
7675                 (unsigned long) rp->r_offset);
7676           continue;
7677         }
7678
7679       if (rp->r_offset < word_offset)
7680         continue;
7681
7682       /* PR 17531: file: 027-161405-0.004  */
7683       if (aux->symtab == NULL)
7684         continue;
7685
7686       if (arm_sec->rel_type == SHT_REL)
7687         {
7688           offset = word & 0x7fffffff;
7689           if (offset & 0x40000000)
7690             offset |= ~ (bfd_vma) 0x7fffffff;
7691         }
7692       else if (arm_sec->rel_type == SHT_RELA)
7693         offset = rp->r_addend;
7694       else
7695         {
7696           error (_("Unknown section relocation type %d encountered\n"),
7697                  arm_sec->rel_type);
7698           break;
7699         }
7700
7701       /* PR 17531 file: 027-1241568-0.004.  */
7702       if (ELF32_R_SYM (rp->r_info) >= aux->nsyms)
7703         {
7704           error (_("Bad symbol index in unwind relocation (%lu > %lu)\n"),
7705                  (unsigned long) ELF32_R_SYM (rp->r_info), aux->nsyms);
7706           break;
7707         }
7708
7709       sym = aux->symtab + ELF32_R_SYM (rp->r_info);
7710       offset += sym->st_value;
7711       prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
7712
7713       /* Check that we are processing the expected reloc type.  */
7714       if (elf_header.e_machine == EM_ARM)
7715         {
7716           relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
7717           if (relname == NULL)
7718             {
7719               warn (_("Skipping unknown ARM relocation type: %d\n"),
7720                     (int) ELF32_R_TYPE (rp->r_info));
7721               continue;
7722             }
7723
7724           if (streq (relname, "R_ARM_NONE"))
7725               continue;
7726
7727           if (! streq (relname, "R_ARM_PREL31"))
7728             {
7729               warn (_("Skipping unexpected ARM relocation type %s\n"), relname);
7730               continue;
7731             }
7732         }
7733       else if (elf_header.e_machine == EM_TI_C6000)
7734         {
7735           relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
7736           if (relname == NULL)
7737             {
7738               warn (_("Skipping unknown C6000 relocation type: %d\n"),
7739                     (int) ELF32_R_TYPE (rp->r_info));
7740               continue;
7741             }
7742
7743           if (streq (relname, "R_C6000_NONE"))
7744             continue;
7745
7746           if (! streq (relname, "R_C6000_PREL31"))
7747             {
7748               warn (_("Skipping unexpected C6000 relocation type %s\n"), relname);
7749               continue;
7750             }
7751
7752           prelval >>= 1;
7753         }
7754       else
7755         {
7756           /* This function currently only supports ARM and TI unwinders.  */
7757           warn (_("Only TI and ARM unwinders are currently supported\n"));
7758           break;
7759         }
7760
7761       word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
7762       addr->section = sym->st_shndx;
7763       addr->offset = offset;
7764
7765       if (sym_name)
7766         * sym_name = sym->st_name;
7767       break;
7768     }
7769
7770   *wordp = word;
7771   arm_sec->next_rela = rp;
7772
7773   return TRUE;
7774 }
7775
7776 static const char *tic6x_unwind_regnames[16] =
7777 {
7778   "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
7779   "A14", "A13", "A12", "A11", "A10",
7780   "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
7781 };
7782
7783 static void
7784 decode_tic6x_unwind_regmask (unsigned int mask)
7785 {
7786   int i;
7787
7788   for (i = 12; mask; mask >>= 1, i--)
7789     {
7790       if (mask & 1)
7791         {
7792           fputs (tic6x_unwind_regnames[i], stdout);
7793           if (mask > 1)
7794             fputs (", ", stdout);
7795         }
7796     }
7797 }
7798
7799 #define ADVANCE                                                 \
7800   if (remaining == 0 && more_words)                             \
7801     {                                                           \
7802       data_offset += 4;                                         \
7803       if (! get_unwind_section_word (aux, data_arm_sec, data_sec,       \
7804                                      data_offset, & word, & addr, NULL))        \
7805         return;                                                 \
7806       remaining = 4;                                            \
7807       more_words--;                                             \
7808     }                                                           \
7809
7810 #define GET_OP(OP)                      \
7811   ADVANCE;                              \
7812   if (remaining)                        \
7813     {                                   \
7814       remaining--;                      \
7815       (OP) = word >> 24;                \
7816       word <<= 8;                       \
7817     }                                   \
7818   else                                  \
7819     {                                   \
7820       printf (_("[Truncated opcode]\n"));       \
7821       return;                           \
7822     }                                   \
7823   printf ("0x%02x ", OP)
7824
7825 static void
7826 decode_arm_unwind_bytecode (struct arm_unw_aux_info *  aux,
7827                             unsigned int               word,
7828                             unsigned int               remaining,
7829                             unsigned int               more_words,
7830                             bfd_vma                    data_offset,
7831                             Elf_Internal_Shdr *        data_sec,
7832                             struct arm_section *       data_arm_sec)
7833 {
7834   struct absaddr addr;
7835
7836   /* Decode the unwinding instructions.  */
7837   while (1)
7838     {
7839       unsigned int op, op2;
7840
7841       ADVANCE;
7842       if (remaining == 0)
7843         break;
7844       remaining--;
7845       op = word >> 24;
7846       word <<= 8;
7847
7848       printf ("  0x%02x ", op);
7849
7850       if ((op & 0xc0) == 0x00)
7851         {
7852           int offset = ((op & 0x3f) << 2) + 4;
7853
7854           printf ("     vsp = vsp + %d", offset);
7855         }
7856       else if ((op & 0xc0) == 0x40)
7857         {
7858           int offset = ((op & 0x3f) << 2) + 4;
7859
7860           printf ("     vsp = vsp - %d", offset);
7861         }
7862       else if ((op & 0xf0) == 0x80)
7863         {
7864           GET_OP (op2);
7865           if (op == 0x80 && op2 == 0)
7866             printf (_("Refuse to unwind"));
7867           else
7868             {
7869               unsigned int mask = ((op & 0x0f) << 8) | op2;
7870               int first = 1;
7871               int i;
7872
7873               printf ("pop {");
7874               for (i = 0; i < 12; i++)
7875                 if (mask & (1 << i))
7876                   {
7877                     if (first)
7878                       first = 0;
7879                     else
7880                       printf (", ");
7881                     printf ("r%d", 4 + i);
7882                   }
7883               printf ("}");
7884             }
7885         }
7886       else if ((op & 0xf0) == 0x90)
7887         {
7888           if (op == 0x9d || op == 0x9f)
7889             printf (_("     [Reserved]"));
7890           else
7891             printf ("     vsp = r%d", op & 0x0f);
7892         }
7893       else if ((op & 0xf0) == 0xa0)
7894         {
7895           int end = 4 + (op & 0x07);
7896           int first = 1;
7897           int i;
7898
7899           printf ("     pop {");
7900           for (i = 4; i <= end; i++)
7901             {
7902               if (first)
7903                 first = 0;
7904               else
7905                 printf (", ");
7906               printf ("r%d", i);
7907             }
7908           if (op & 0x08)
7909             {
7910               if (!first)
7911                 printf (", ");
7912               printf ("r14");
7913             }
7914           printf ("}");
7915         }
7916       else if (op == 0xb0)
7917         printf (_("     finish"));
7918       else if (op == 0xb1)
7919         {
7920           GET_OP (op2);
7921           if (op2 == 0 || (op2 & 0xf0) != 0)
7922             printf (_("[Spare]"));
7923           else
7924             {
7925               unsigned int mask = op2 & 0x0f;
7926               int first = 1;
7927               int i;
7928
7929               printf ("pop {");
7930               for (i = 0; i < 12; i++)
7931                 if (mask & (1 << i))
7932                   {
7933                     if (first)
7934                       first = 0;
7935                     else
7936                       printf (", ");
7937                     printf ("r%d", i);
7938                   }
7939               printf ("}");
7940             }
7941         }
7942       else if (op == 0xb2)
7943         {
7944           unsigned char buf[9];
7945           unsigned int i, len;
7946           unsigned long offset;
7947
7948           for (i = 0; i < sizeof (buf); i++)
7949             {
7950               GET_OP (buf[i]);
7951               if ((buf[i] & 0x80) == 0)
7952                 break;
7953             }
7954           if (i == sizeof (buf))
7955             printf (_("corrupt change to vsp"));
7956           else
7957             {
7958               offset = read_uleb128 (buf, &len, buf + i + 1);
7959               assert (len == i + 1);
7960               offset = offset * 4 + 0x204;
7961               printf ("vsp = vsp + %ld", offset);
7962             }
7963         }
7964       else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
7965         {
7966           unsigned int first, last;
7967
7968           GET_OP (op2);
7969           first = op2 >> 4;
7970           last = op2 & 0x0f;
7971           if (op == 0xc8)
7972             first = first + 16;
7973           printf ("pop {D%d", first);
7974           if (last)
7975             printf ("-D%d", first + last);
7976           printf ("}");
7977         }
7978       else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
7979         {
7980           unsigned int count = op & 0x07;
7981
7982           printf ("pop {D8");
7983           if (count)
7984             printf ("-D%d", 8 + count);
7985           printf ("}");
7986         }
7987       else if (op >= 0xc0 && op <= 0xc5)
7988         {
7989           unsigned int count = op & 0x07;
7990
7991           printf ("     pop {wR10");
7992           if (count)
7993             printf ("-wR%d", 10 + count);
7994           printf ("}");
7995         }
7996       else if (op == 0xc6)
7997         {
7998           unsigned int first, last;
7999
8000           GET_OP (op2);
8001           first = op2 >> 4;
8002           last = op2 & 0x0f;
8003           printf ("pop {wR%d", first);
8004           if (last)
8005             printf ("-wR%d", first + last);
8006           printf ("}");
8007         }
8008       else if (op == 0xc7)
8009         {
8010           GET_OP (op2);
8011           if (op2 == 0 || (op2 & 0xf0) != 0)
8012             printf (_("[Spare]"));
8013           else
8014             {
8015               unsigned int mask = op2 & 0x0f;
8016               int first = 1;
8017               int i;
8018
8019               printf ("pop {");
8020               for (i = 0; i < 4; i++)
8021                 if (mask & (1 << i))
8022                   {
8023                     if (first)
8024                       first = 0;
8025                     else
8026                       printf (", ");
8027                     printf ("wCGR%d", i);
8028                   }
8029               printf ("}");
8030             }
8031         }
8032       else
8033         printf (_("     [unsupported opcode]"));
8034       printf ("\n");
8035     }
8036 }
8037
8038 static void
8039 decode_tic6x_unwind_bytecode (struct arm_unw_aux_info *  aux,
8040                               unsigned int               word,
8041                               unsigned int               remaining,
8042                               unsigned int               more_words,
8043                               bfd_vma                    data_offset,
8044                               Elf_Internal_Shdr *        data_sec,
8045                               struct arm_section *       data_arm_sec)
8046 {
8047   struct absaddr addr;
8048
8049   /* Decode the unwinding instructions.  */
8050   while (1)
8051     {
8052       unsigned int op, op2;
8053
8054       ADVANCE;
8055       if (remaining == 0)
8056         break;
8057       remaining--;
8058       op = word >> 24;
8059       word <<= 8;
8060
8061       printf ("  0x%02x ", op);
8062
8063       if ((op & 0xc0) == 0x00)
8064         {
8065           int offset = ((op & 0x3f) << 3) + 8;
8066           printf ("     sp = sp + %d", offset);
8067         }
8068       else if ((op & 0xc0) == 0x80)
8069         {
8070           GET_OP (op2);
8071           if (op == 0x80 && op2 == 0)
8072             printf (_("Refuse to unwind"));
8073           else
8074             {
8075               unsigned int mask = ((op & 0x1f) << 8) | op2;
8076               if (op & 0x20)
8077                 printf ("pop compact {");
8078               else
8079                 printf ("pop {");
8080
8081               decode_tic6x_unwind_regmask (mask);
8082               printf("}");
8083             }
8084         }
8085       else if ((op & 0xf0) == 0xc0)
8086         {
8087           unsigned int reg;
8088           unsigned int nregs;
8089           unsigned int i;
8090           const char *name;
8091           struct
8092           {
8093               unsigned int offset;
8094               unsigned int reg;
8095           } regpos[16];
8096
8097           /* Scan entire instruction first so that GET_OP output is not
8098              interleaved with disassembly.  */
8099           nregs = 0;
8100           for (i = 0; nregs < (op & 0xf); i++)
8101             {
8102               GET_OP (op2);
8103               reg = op2 >> 4;
8104               if (reg != 0xf)
8105                 {
8106                   regpos[nregs].offset = i * 2;
8107                   regpos[nregs].reg = reg;
8108                   nregs++;
8109                 }
8110
8111               reg = op2 & 0xf;
8112               if (reg != 0xf)
8113                 {
8114                   regpos[nregs].offset = i * 2 + 1;
8115                   regpos[nregs].reg = reg;
8116                   nregs++;
8117                 }
8118             }
8119
8120           printf (_("pop frame {"));
8121           reg = nregs - 1;
8122           for (i = i * 2; i > 0; i--)
8123             {
8124               if (regpos[reg].offset == i - 1)
8125                 {
8126                   name = tic6x_unwind_regnames[regpos[reg].reg];
8127                   if (reg > 0)
8128                     reg--;
8129                 }
8130               else
8131                 name = _("[pad]");
8132
8133               fputs (name, stdout);
8134               if (i > 1)
8135                 printf (", ");
8136             }
8137
8138           printf ("}");
8139         }
8140       else if (op == 0xd0)
8141         printf ("     MOV FP, SP");
8142       else if (op == 0xd1)
8143         printf ("     __c6xabi_pop_rts");
8144       else if (op == 0xd2)
8145         {
8146           unsigned char buf[9];
8147           unsigned int i, len;
8148           unsigned long offset;
8149
8150           for (i = 0; i < sizeof (buf); i++)
8151             {
8152               GET_OP (buf[i]);
8153               if ((buf[i] & 0x80) == 0)
8154                 break;
8155             }
8156           /* PR 17531: file: id:000001,src:001906+004739,op:splice,rep:2.  */
8157           if (i == sizeof (buf))
8158             {
8159               printf ("<corrupt sp adjust>\n");
8160               warn (_("Corrupt stack pointer adjustment detected\n"));
8161               return;
8162             }
8163
8164           offset = read_uleb128 (buf, &len, buf + i + 1);
8165           assert (len == i + 1);
8166           offset = offset * 8 + 0x408;
8167           printf (_("sp = sp + %ld"), offset);
8168         }
8169       else if ((op & 0xf0) == 0xe0)
8170         {
8171           if ((op & 0x0f) == 7)
8172             printf ("     RETURN");
8173           else
8174             printf ("     MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
8175         }
8176       else
8177         {
8178           printf (_("     [unsupported opcode]"));
8179         }
8180       putchar ('\n');
8181     }
8182 }
8183
8184 static bfd_vma
8185 arm_expand_prel31 (bfd_vma word, bfd_vma where)
8186 {
8187   bfd_vma offset;
8188
8189   offset = word & 0x7fffffff;
8190   if (offset & 0x40000000)
8191     offset |= ~ (bfd_vma) 0x7fffffff;
8192
8193   if (elf_header.e_machine == EM_TI_C6000)
8194     offset <<= 1;
8195
8196   return offset + where;
8197 }
8198
8199 static void
8200 decode_arm_unwind (struct arm_unw_aux_info *  aux,
8201                    unsigned int               word,
8202                    unsigned int               remaining,
8203                    bfd_vma                    data_offset,
8204                    Elf_Internal_Shdr *        data_sec,
8205                    struct arm_section *       data_arm_sec)
8206 {
8207   int per_index;
8208   unsigned int more_words = 0;
8209   struct absaddr addr;
8210   bfd_vma sym_name = (bfd_vma) -1;
8211
8212   if (remaining == 0)
8213     {
8214       /* Fetch the first word.
8215          Note - when decoding an object file the address extracted
8216          here will always be 0.  So we also pass in the sym_name
8217          parameter so that we can find the symbol associated with
8218          the personality routine.  */
8219       if (! get_unwind_section_word (aux, data_arm_sec, data_sec, data_offset,
8220                                      & word, & addr, & sym_name))
8221         return;
8222
8223       remaining = 4;
8224     }
8225
8226   if ((word & 0x80000000) == 0)
8227     {
8228       /* Expand prel31 for personality routine.  */
8229       bfd_vma fn;
8230       const char *procname;
8231
8232       fn = arm_expand_prel31 (word, data_sec->sh_addr + data_offset);
8233       printf (_("  Personality routine: "));
8234       if (fn == 0
8235           && addr.section == SHN_UNDEF && addr.offset == 0
8236           && sym_name != (bfd_vma) -1 && sym_name < aux->strtab_size)
8237         {
8238           procname = aux->strtab + sym_name;
8239           print_vma (fn, PREFIX_HEX);
8240           if (procname)
8241             {
8242               fputs (" <", stdout);
8243               fputs (procname, stdout);
8244               fputc ('>', stdout);
8245             }
8246         }
8247       else
8248         procname = arm_print_vma_and_name (aux, fn, addr);
8249       fputc ('\n', stdout);
8250
8251       /* The GCC personality routines use the standard compact
8252          encoding, starting with one byte giving the number of
8253          words.  */
8254       if (procname != NULL
8255           && (const_strneq (procname, "__gcc_personality_v0")
8256               || const_strneq (procname, "__gxx_personality_v0")
8257               || const_strneq (procname, "__gcj_personality_v0")
8258               || const_strneq (procname, "__gnu_objc_personality_v0")))
8259         {
8260           remaining = 0;
8261           more_words = 1;
8262           ADVANCE;
8263           if (!remaining)
8264             {
8265               printf (_("  [Truncated data]\n"));
8266               return;
8267             }
8268           more_words = word >> 24;
8269           word <<= 8;
8270           remaining--;
8271           per_index = -1;
8272         }
8273       else
8274         return;
8275     }
8276   else
8277     {
8278       /* ARM EHABI Section 6.3:
8279
8280          An exception-handling table entry for the compact model looks like:
8281
8282            31 30-28 27-24 23-0
8283            -- ----- ----- ----
8284             1   0   index Data for personalityRoutine[index]    */
8285
8286       if (elf_header.e_machine == EM_ARM
8287           && (word & 0x70000000))
8288         warn (_("Corrupt ARM compact model table entry: %x \n"), word);
8289
8290       per_index = (word >> 24) & 0x7f;
8291       printf (_("  Compact model index: %d\n"), per_index);
8292       if (per_index == 0)
8293         {
8294           more_words = 0;
8295           word <<= 8;
8296           remaining--;
8297         }
8298       else if (per_index < 3)
8299         {
8300           more_words = (word >> 16) & 0xff;
8301           word <<= 16;
8302           remaining -= 2;
8303         }
8304     }
8305
8306   switch (elf_header.e_machine)
8307     {
8308     case EM_ARM:
8309       if (per_index < 3)
8310         {
8311           decode_arm_unwind_bytecode (aux, word, remaining, more_words,
8312                                       data_offset, data_sec, data_arm_sec);
8313         }
8314       else
8315         {
8316           warn (_("Unknown ARM compact model index encountered\n"));
8317           printf (_("  [reserved]\n"));
8318         }
8319       break;
8320
8321     case EM_TI_C6000:
8322       if (per_index < 3)
8323         {
8324           decode_tic6x_unwind_bytecode (aux, word, remaining, more_words,
8325                                         data_offset, data_sec, data_arm_sec);
8326         }
8327       else if (per_index < 5)
8328         {
8329           if (((word >> 17) & 0x7f) == 0x7f)
8330             printf (_("  Restore stack from frame pointer\n"));
8331           else
8332             printf (_("  Stack increment %d\n"), (word >> 14) & 0x1fc);
8333           printf (_("  Registers restored: "));
8334           if (per_index == 4)
8335             printf (" (compact) ");
8336           decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
8337           putchar ('\n');
8338           printf (_("  Return register: %s\n"),
8339                   tic6x_unwind_regnames[word & 0xf]);
8340         }
8341       else
8342         printf (_("  [reserved (%d)]\n"), per_index);
8343       break;
8344
8345     default:
8346       error (_("Unsupported architecture type %d encountered when decoding unwind table\n"),
8347              elf_header.e_machine);
8348     }
8349
8350   /* Decode the descriptors.  Not implemented.  */
8351 }
8352
8353 static void
8354 dump_arm_unwind (struct arm_unw_aux_info *aux, Elf_Internal_Shdr *exidx_sec)
8355 {
8356   struct arm_section exidx_arm_sec, extab_arm_sec;
8357   unsigned int i, exidx_len;
8358   unsigned long j, nfuns;
8359
8360   memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
8361   memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
8362   exidx_len = exidx_sec->sh_size / 8;
8363
8364   aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
8365   for (nfuns = 0, j = 0; j < aux->nsyms; j++)
8366     if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
8367       aux->funtab[nfuns++] = aux->symtab[j];
8368   aux->nfuns = nfuns;
8369   qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
8370
8371   for (i = 0; i < exidx_len; i++)
8372     {
8373       unsigned int exidx_fn, exidx_entry;
8374       struct absaddr fn_addr, entry_addr;
8375       bfd_vma fn;
8376
8377       fputc ('\n', stdout);
8378
8379       if (! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
8380                                      8 * i, & exidx_fn, & fn_addr, NULL)
8381           || ! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
8382                                         8 * i + 4, & exidx_entry, & entry_addr, NULL))
8383         {
8384           free (aux->funtab);
8385           arm_free_section (& exidx_arm_sec);
8386           arm_free_section (& extab_arm_sec);
8387           return;
8388         }
8389
8390       /* ARM EHABI, Section 5:
8391          An index table entry consists of 2 words.
8392          The first word contains a prel31 offset to the start of a function, with bit 31 clear.  */
8393       if (exidx_fn & 0x80000000)
8394         warn (_("corrupt index table entry: %x\n"), exidx_fn);
8395
8396       fn = arm_expand_prel31 (exidx_fn, exidx_sec->sh_addr + 8 * i);
8397
8398       arm_print_vma_and_name (aux, fn, fn_addr);
8399       fputs (": ", stdout);
8400
8401       if (exidx_entry == 1)
8402         {
8403           print_vma (exidx_entry, PREFIX_HEX);
8404           fputs (" [cantunwind]\n", stdout);
8405         }
8406       else if (exidx_entry & 0x80000000)
8407         {
8408           print_vma (exidx_entry, PREFIX_HEX);
8409           fputc ('\n', stdout);
8410           decode_arm_unwind (aux, exidx_entry, 4, 0, NULL, NULL);
8411         }
8412       else
8413         {
8414           bfd_vma table, table_offset = 0;
8415           Elf_Internal_Shdr *table_sec;
8416
8417           fputs ("@", stdout);
8418           table = arm_expand_prel31 (exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
8419           print_vma (table, PREFIX_HEX);
8420           printf ("\n");
8421
8422           /* Locate the matching .ARM.extab.  */
8423           if (entry_addr.section != SHN_UNDEF
8424               && entry_addr.section < elf_header.e_shnum)
8425             {
8426               table_sec = section_headers + entry_addr.section;
8427               table_offset = entry_addr.offset;
8428               /* PR 18879 */
8429               if (table_offset > table_sec->sh_size
8430                   || ((bfd_signed_vma) table_offset) < 0)
8431                 {
8432                   warn (_("Unwind entry contains corrupt offset (0x%lx) into section %s\n"),
8433                         (unsigned long) table_offset,
8434                         printable_section_name (table_sec));
8435                   continue;
8436                 }
8437             }
8438           else
8439             {
8440               table_sec = find_section_by_address (table);
8441               if (table_sec != NULL)
8442                 table_offset = table - table_sec->sh_addr;
8443             }
8444           if (table_sec == NULL)
8445             {
8446               warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
8447                     (unsigned long) table);
8448               continue;
8449             }
8450           decode_arm_unwind (aux, 0, 0, table_offset, table_sec,
8451                              &extab_arm_sec);
8452         }
8453     }
8454
8455   printf ("\n");
8456
8457   free (aux->funtab);
8458   arm_free_section (&exidx_arm_sec);
8459   arm_free_section (&extab_arm_sec);
8460 }
8461
8462 /* Used for both ARM and C6X unwinding tables.  */
8463
8464 static void
8465 arm_process_unwind (FILE *file)
8466 {
8467   struct arm_unw_aux_info aux;
8468   Elf_Internal_Shdr *unwsec = NULL;
8469   Elf_Internal_Shdr *strsec;
8470   Elf_Internal_Shdr *sec;
8471   unsigned long i;
8472   unsigned int sec_type;
8473
8474   switch (elf_header.e_machine)
8475     {
8476     case EM_ARM:
8477       sec_type = SHT_ARM_EXIDX;
8478       break;
8479
8480     case EM_TI_C6000:
8481       sec_type = SHT_C6000_UNWIND;
8482       break;
8483
8484     default:
8485       error (_("Unsupported architecture type %d encountered when processing unwind table\n"),
8486              elf_header.e_machine);
8487       return;
8488     }
8489
8490   if (string_table == NULL)
8491     return;
8492
8493   memset (& aux, 0, sizeof (aux));
8494   aux.file = file;
8495
8496   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
8497     {
8498       if (sec->sh_type == SHT_SYMTAB && sec->sh_link < elf_header.e_shnum)
8499         {
8500           aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
8501
8502           strsec = section_headers + sec->sh_link;
8503
8504           /* PR binutils/17531 file: 011-12666-0.004.  */
8505           if (aux.strtab != NULL)
8506             {
8507               error (_("Multiple string tables found in file.\n"));
8508               free (aux.strtab);
8509             }
8510           aux.strtab = get_data (NULL, file, strsec->sh_offset,
8511                                  1, strsec->sh_size, _("string table"));
8512           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
8513         }
8514       else if (sec->sh_type == sec_type)
8515         unwsec = sec;
8516     }
8517
8518   if (unwsec == NULL)
8519     printf (_("\nThere are no unwind sections in this file.\n"));
8520   else
8521     for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
8522       {
8523         if (sec->sh_type == sec_type)
8524           {
8525             printf (_("\nUnwind table index '%s' at offset 0x%lx contains %lu entries:\n"),
8526                     printable_section_name (sec),
8527                     (unsigned long) sec->sh_offset,
8528                     (unsigned long) (sec->sh_size / (2 * eh_addr_size)));
8529
8530             dump_arm_unwind (&aux, sec);
8531           }
8532       }
8533
8534   if (aux.symtab)
8535     free (aux.symtab);
8536   if (aux.strtab)
8537     free ((char *) aux.strtab);
8538 }
8539
8540 static void
8541 process_unwind (FILE * file)
8542 {
8543   struct unwind_handler
8544   {
8545     int machtype;
8546     void (* handler)(FILE *);
8547   } handlers[] =
8548   {
8549     { EM_ARM, arm_process_unwind },
8550     { EM_IA_64, ia64_process_unwind },
8551     { EM_PARISC, hppa_process_unwind },
8552     { EM_TI_C6000, arm_process_unwind },
8553     { 0, 0 }
8554   };
8555   int i;
8556
8557   if (!do_unwind)
8558     return;
8559
8560   for (i = 0; handlers[i].handler != NULL; i++)
8561     if (elf_header.e_machine == handlers[i].machtype)
8562       {
8563         handlers[i].handler (file);
8564         return;
8565       }
8566
8567   printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
8568           get_machine_name (elf_header.e_machine));
8569 }
8570
8571 static void
8572 dynamic_section_mips_val (Elf_Internal_Dyn * entry)
8573 {
8574   switch (entry->d_tag)
8575     {
8576     case DT_MIPS_FLAGS:
8577       if (entry->d_un.d_val == 0)
8578         printf (_("NONE"));
8579       else
8580         {
8581           static const char * opts[] =
8582           {
8583             "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
8584             "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
8585             "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
8586             "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
8587             "RLD_ORDER_SAFE"
8588           };
8589           unsigned int cnt;
8590           int first = 1;
8591
8592           for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
8593             if (entry->d_un.d_val & (1 << cnt))
8594               {
8595                 printf ("%s%s", first ? "" : " ", opts[cnt]);
8596                 first = 0;
8597               }
8598         }
8599       break;
8600
8601     case DT_MIPS_IVERSION:
8602       if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
8603         printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry->d_un.d_val));
8604       else
8605         {
8606           char buf[40];
8607           sprintf_vma (buf, entry->d_un.d_ptr);
8608           /* Note: coded this way so that there is a single string for translation.  */
8609           printf (_("<corrupt: %s>"), buf);
8610         }
8611       break;
8612
8613     case DT_MIPS_TIME_STAMP:
8614       {
8615         char timebuf[20];
8616         struct tm * tmp;
8617         time_t atime = entry->d_un.d_val;
8618
8619         tmp = gmtime (&atime);
8620         /* PR 17531: file: 6accc532.  */
8621         if (tmp == NULL)
8622           snprintf (timebuf, sizeof (timebuf), _("<corrupt>"));
8623         else
8624           snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
8625                     tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
8626                     tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
8627         printf (_("Time Stamp: %s"), timebuf);
8628       }
8629       break;
8630
8631     case DT_MIPS_RLD_VERSION:
8632     case DT_MIPS_LOCAL_GOTNO:
8633     case DT_MIPS_CONFLICTNO:
8634     case DT_MIPS_LIBLISTNO:
8635     case DT_MIPS_SYMTABNO:
8636     case DT_MIPS_UNREFEXTNO:
8637     case DT_MIPS_HIPAGENO:
8638     case DT_MIPS_DELTA_CLASS_NO:
8639     case DT_MIPS_DELTA_INSTANCE_NO:
8640     case DT_MIPS_DELTA_RELOC_NO:
8641     case DT_MIPS_DELTA_SYM_NO:
8642     case DT_MIPS_DELTA_CLASSSYM_NO:
8643     case DT_MIPS_COMPACT_SIZE:
8644       print_vma (entry->d_un.d_ptr, DEC);
8645       break;
8646
8647     default:
8648       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8649     }
8650     putchar ('\n');
8651 }
8652
8653 static void
8654 dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
8655 {
8656   switch (entry->d_tag)
8657     {
8658     case DT_HP_DLD_FLAGS:
8659       {
8660         static struct
8661         {
8662           long int bit;
8663           const char * str;
8664         }
8665         flags[] =
8666         {
8667           { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
8668           { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
8669           { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
8670           { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
8671           { DT_HP_BIND_NOW, "HP_BIND_NOW" },
8672           { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
8673           { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
8674           { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
8675           { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
8676           { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
8677           { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
8678           { DT_HP_GST, "HP_GST" },
8679           { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
8680           { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
8681           { DT_HP_NODELETE, "HP_NODELETE" },
8682           { DT_HP_GROUP, "HP_GROUP" },
8683           { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
8684         };
8685         int first = 1;
8686         size_t cnt;
8687         bfd_vma val = entry->d_un.d_val;
8688
8689         for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
8690           if (val & flags[cnt].bit)
8691             {
8692               if (! first)
8693                 putchar (' ');
8694               fputs (flags[cnt].str, stdout);
8695               first = 0;
8696               val ^= flags[cnt].bit;
8697             }
8698
8699         if (val != 0 || first)
8700           {
8701             if (! first)
8702               putchar (' ');
8703             print_vma (val, HEX);
8704           }
8705       }
8706       break;
8707
8708     default:
8709       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8710       break;
8711     }
8712   putchar ('\n');
8713 }
8714
8715 #ifdef BFD64
8716
8717 /* VMS vs Unix time offset and factor.  */
8718
8719 #define VMS_EPOCH_OFFSET 35067168000000000LL
8720 #define VMS_GRANULARITY_FACTOR 10000000
8721
8722 /* Display a VMS time in a human readable format.  */
8723
8724 static void
8725 print_vms_time (bfd_int64_t vmstime)
8726 {
8727   struct tm *tm;
8728   time_t unxtime;
8729
8730   unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
8731   tm = gmtime (&unxtime);
8732   printf ("%04u-%02u-%02uT%02u:%02u:%02u",
8733           tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
8734           tm->tm_hour, tm->tm_min, tm->tm_sec);
8735 }
8736 #endif /* BFD64 */
8737
8738 static void
8739 dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
8740 {
8741   switch (entry->d_tag)
8742     {
8743     case DT_IA_64_PLT_RESERVE:
8744       /* First 3 slots reserved.  */
8745       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8746       printf (" -- ");
8747       print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
8748       break;
8749
8750     case DT_IA_64_VMS_LINKTIME:
8751 #ifdef BFD64
8752       print_vms_time (entry->d_un.d_val);
8753 #endif
8754       break;
8755
8756     case DT_IA_64_VMS_LNKFLAGS:
8757       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8758       if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
8759         printf (" CALL_DEBUG");
8760       if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
8761         printf (" NOP0BUFS");
8762       if (entry->d_un.d_val & VMS_LF_P0IMAGE)
8763         printf (" P0IMAGE");
8764       if (entry->d_un.d_val & VMS_LF_MKTHREADS)
8765         printf (" MKTHREADS");
8766       if (entry->d_un.d_val & VMS_LF_UPCALLS)
8767         printf (" UPCALLS");
8768       if (entry->d_un.d_val & VMS_LF_IMGSTA)
8769         printf (" IMGSTA");
8770       if (entry->d_un.d_val & VMS_LF_INITIALIZE)
8771         printf (" INITIALIZE");
8772       if (entry->d_un.d_val & VMS_LF_MAIN)
8773         printf (" MAIN");
8774       if (entry->d_un.d_val & VMS_LF_EXE_INIT)
8775         printf (" EXE_INIT");
8776       if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
8777         printf (" TBK_IN_IMG");
8778       if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
8779         printf (" DBG_IN_IMG");
8780       if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
8781         printf (" TBK_IN_DSF");
8782       if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
8783         printf (" DBG_IN_DSF");
8784       if (entry->d_un.d_val & VMS_LF_SIGNATURES)
8785         printf (" SIGNATURES");
8786       if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
8787         printf (" REL_SEG_OFF");
8788       break;
8789
8790     default:
8791       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8792       break;
8793     }
8794   putchar ('\n');
8795 }
8796
8797 static int
8798 get_32bit_dynamic_section (FILE * file)
8799 {
8800   Elf32_External_Dyn * edyn;
8801   Elf32_External_Dyn * ext;
8802   Elf_Internal_Dyn * entry;
8803
8804   edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
8805                                           dynamic_size, _("dynamic section"));
8806   if (!edyn)
8807     return 0;
8808
8809   /* SGI's ELF has more than one section in the DYNAMIC segment, and we
8810      might not have the luxury of section headers.  Look for the DT_NULL
8811      terminator to determine the number of entries.  */
8812   for (ext = edyn, dynamic_nent = 0;
8813        (char *) (ext + 1) <= (char *) edyn + dynamic_size;
8814        ext++)
8815     {
8816       dynamic_nent++;
8817       if (BYTE_GET (ext->d_tag) == DT_NULL)
8818         break;
8819     }
8820
8821   dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
8822                                                   sizeof (* entry));
8823   if (dynamic_section == NULL)
8824     {
8825       error (_("Out of memory allocating space for %lu dynamic entries\n"),
8826              (unsigned long) dynamic_nent);
8827       free (edyn);
8828       return 0;
8829     }
8830
8831   for (ext = edyn, entry = dynamic_section;
8832        entry < dynamic_section + dynamic_nent;
8833        ext++, entry++)
8834     {
8835       entry->d_tag      = BYTE_GET (ext->d_tag);
8836       entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
8837     }
8838
8839   free (edyn);
8840
8841   return 1;
8842 }
8843
8844 static int
8845 get_64bit_dynamic_section (FILE * file)
8846 {
8847   Elf64_External_Dyn * edyn;
8848   Elf64_External_Dyn * ext;
8849   Elf_Internal_Dyn * entry;
8850
8851   /* Read in the data.  */
8852   edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
8853                                           dynamic_size, _("dynamic section"));
8854   if (!edyn)
8855     return 0;
8856
8857   /* SGI's ELF has more than one section in the DYNAMIC segment, and we
8858      might not have the luxury of section headers.  Look for the DT_NULL
8859      terminator to determine the number of entries.  */
8860   for (ext = edyn, dynamic_nent = 0;
8861        /* PR 17533 file: 033-67080-0.004 - do not read past end of buffer.  */
8862        (char *) (ext + 1) <= (char *) edyn + dynamic_size;
8863        ext++)
8864     {
8865       dynamic_nent++;
8866       if (BYTE_GET (ext->d_tag) == DT_NULL)
8867         break;
8868     }
8869
8870   dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
8871                                                   sizeof (* entry));
8872   if (dynamic_section == NULL)
8873     {
8874       error (_("Out of memory allocating space for %lu dynamic entries\n"),
8875              (unsigned long) dynamic_nent);
8876       free (edyn);
8877       return 0;
8878     }
8879
8880   /* Convert from external to internal formats.  */
8881   for (ext = edyn, entry = dynamic_section;
8882        entry < dynamic_section + dynamic_nent;
8883        ext++, entry++)
8884     {
8885       entry->d_tag      = BYTE_GET (ext->d_tag);
8886       entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
8887     }
8888
8889   free (edyn);
8890
8891   return 1;
8892 }
8893
8894 static void
8895 print_dynamic_flags (bfd_vma flags)
8896 {
8897   int first = 1;
8898
8899   while (flags)
8900     {
8901       bfd_vma flag;
8902
8903       flag = flags & - flags;
8904       flags &= ~ flag;
8905
8906       if (first)
8907         first = 0;
8908       else
8909         putc (' ', stdout);
8910
8911       switch (flag)
8912         {
8913         case DF_ORIGIN:         fputs ("ORIGIN", stdout); break;
8914         case DF_SYMBOLIC:       fputs ("SYMBOLIC", stdout); break;
8915         case DF_TEXTREL:        fputs ("TEXTREL", stdout); break;
8916         case DF_BIND_NOW:       fputs ("BIND_NOW", stdout); break;
8917         case DF_STATIC_TLS:     fputs ("STATIC_TLS", stdout); break;
8918         default:                fputs (_("unknown"), stdout); break;
8919         }
8920     }
8921   puts ("");
8922 }
8923
8924 /* Parse and display the contents of the dynamic section.  */
8925
8926 static int
8927 process_dynamic_section (FILE * file)
8928 {
8929   Elf_Internal_Dyn * entry;
8930
8931   if (dynamic_size == 0)
8932     {
8933       if (do_dynamic)
8934         printf (_("\nThere is no dynamic section in this file.\n"));
8935
8936       return 1;
8937     }
8938
8939   if (is_32bit_elf)
8940     {
8941       if (! get_32bit_dynamic_section (file))
8942         return 0;
8943     }
8944   else if (! get_64bit_dynamic_section (file))
8945     return 0;
8946
8947   /* Find the appropriate symbol table.  */
8948   if (dynamic_symbols == NULL)
8949     {
8950       for (entry = dynamic_section;
8951            entry < dynamic_section + dynamic_nent;
8952            ++entry)
8953         {
8954           Elf_Internal_Shdr section;
8955
8956           if (entry->d_tag != DT_SYMTAB)
8957             continue;
8958
8959           dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
8960
8961           /* Since we do not know how big the symbol table is,
8962              we default to reading in the entire file (!) and
8963              processing that.  This is overkill, I know, but it
8964              should work.  */
8965           section.sh_offset = offset_from_vma (file, entry->d_un.d_val, 0);
8966
8967           if (archive_file_offset != 0)
8968             section.sh_size = archive_file_size - section.sh_offset;
8969           else
8970             {
8971               if (fseek (file, 0, SEEK_END))
8972                 error (_("Unable to seek to end of file!\n"));
8973
8974               section.sh_size = ftell (file) - section.sh_offset;
8975             }
8976
8977           if (is_32bit_elf)
8978             section.sh_entsize = sizeof (Elf32_External_Sym);
8979           else
8980             section.sh_entsize = sizeof (Elf64_External_Sym);
8981           section.sh_name = string_table_length;
8982
8983           dynamic_symbols = GET_ELF_SYMBOLS (file, &section, & num_dynamic_syms);
8984           if (num_dynamic_syms < 1)
8985             {
8986               error (_("Unable to determine the number of symbols to load\n"));
8987               continue;
8988             }
8989         }
8990     }
8991
8992   /* Similarly find a string table.  */
8993   if (dynamic_strings == NULL)
8994     {
8995       for (entry = dynamic_section;
8996            entry < dynamic_section + dynamic_nent;
8997            ++entry)
8998         {
8999           unsigned long offset;
9000           long str_tab_len;
9001
9002           if (entry->d_tag != DT_STRTAB)
9003             continue;
9004
9005           dynamic_info[DT_STRTAB] = entry->d_un.d_val;
9006
9007           /* Since we do not know how big the string table is,
9008              we default to reading in the entire file (!) and
9009              processing that.  This is overkill, I know, but it
9010              should work.  */
9011
9012           offset = offset_from_vma (file, entry->d_un.d_val, 0);
9013
9014           if (archive_file_offset != 0)
9015             str_tab_len = archive_file_size - offset;
9016           else
9017             {
9018               if (fseek (file, 0, SEEK_END))
9019                 error (_("Unable to seek to end of file\n"));
9020               str_tab_len = ftell (file) - offset;
9021             }
9022
9023           if (str_tab_len < 1)
9024             {
9025               error
9026                 (_("Unable to determine the length of the dynamic string table\n"));
9027               continue;
9028             }
9029
9030           dynamic_strings = (char *) get_data (NULL, file, offset, 1,
9031                                                str_tab_len,
9032                                                _("dynamic string table"));
9033           dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
9034           break;
9035         }
9036     }
9037
9038   /* And find the syminfo section if available.  */
9039   if (dynamic_syminfo == NULL)
9040     {
9041       unsigned long syminsz = 0;
9042
9043       for (entry = dynamic_section;
9044            entry < dynamic_section + dynamic_nent;
9045            ++entry)
9046         {
9047           if (entry->d_tag == DT_SYMINENT)
9048             {
9049               /* Note: these braces are necessary to avoid a syntax
9050                  error from the SunOS4 C compiler.  */
9051               /* PR binutils/17531: A corrupt file can trigger this test.
9052                  So do not use an assert, instead generate an error message.  */
9053               if (sizeof (Elf_External_Syminfo) != entry->d_un.d_val)
9054                 error (_("Bad value (%d) for SYMINENT entry\n"),
9055                        (int) entry->d_un.d_val);
9056             }
9057           else if (entry->d_tag == DT_SYMINSZ)
9058             syminsz = entry->d_un.d_val;
9059           else if (entry->d_tag == DT_SYMINFO)
9060             dynamic_syminfo_offset = offset_from_vma (file, entry->d_un.d_val,
9061                                                       syminsz);
9062         }
9063
9064       if (dynamic_syminfo_offset != 0 && syminsz != 0)
9065         {
9066           Elf_External_Syminfo * extsyminfo;
9067           Elf_External_Syminfo * extsym;
9068           Elf_Internal_Syminfo * syminfo;
9069
9070           /* There is a syminfo section.  Read the data.  */
9071           extsyminfo = (Elf_External_Syminfo *)
9072               get_data (NULL, file, dynamic_syminfo_offset, 1, syminsz,
9073                         _("symbol information"));
9074           if (!extsyminfo)
9075             return 0;
9076
9077           dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
9078           if (dynamic_syminfo == NULL)
9079             {
9080               error (_("Out of memory allocating %lu byte for dynamic symbol info\n"),
9081                      (unsigned long) syminsz);
9082               return 0;
9083             }
9084
9085           dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
9086           for (syminfo = dynamic_syminfo, extsym = extsyminfo;
9087                syminfo < dynamic_syminfo + dynamic_syminfo_nent;
9088                ++syminfo, ++extsym)
9089             {
9090               syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
9091               syminfo->si_flags = BYTE_GET (extsym->si_flags);
9092             }
9093
9094           free (extsyminfo);
9095         }
9096     }
9097
9098   if (do_dynamic && dynamic_addr)
9099     printf (_("\nDynamic section at offset 0x%lx contains %lu entries:\n"),
9100             dynamic_addr, (unsigned long) dynamic_nent);
9101   if (do_dynamic)
9102     printf (_("  Tag        Type                         Name/Value\n"));
9103
9104   for (entry = dynamic_section;
9105        entry < dynamic_section + dynamic_nent;
9106        entry++)
9107     {
9108       if (do_dynamic)
9109         {
9110           const char * dtype;
9111
9112           putchar (' ');
9113           print_vma (entry->d_tag, FULL_HEX);
9114           dtype = get_dynamic_type (entry->d_tag);
9115           printf (" (%s)%*s", dtype,
9116                   ((is_32bit_elf ? 27 : 19)
9117                    - (int) strlen (dtype)),
9118                   " ");
9119         }
9120
9121       switch (entry->d_tag)
9122         {
9123         case DT_FLAGS:
9124           if (do_dynamic)
9125             print_dynamic_flags (entry->d_un.d_val);
9126           break;
9127
9128         case DT_AUXILIARY:
9129         case DT_FILTER:
9130         case DT_CONFIG:
9131         case DT_DEPAUDIT:
9132         case DT_AUDIT:
9133           if (do_dynamic)
9134             {
9135               switch (entry->d_tag)
9136                 {
9137                 case DT_AUXILIARY:
9138                   printf (_("Auxiliary library"));
9139                   break;
9140
9141                 case DT_FILTER:
9142                   printf (_("Filter library"));
9143                   break;
9144
9145                 case DT_CONFIG:
9146                   printf (_("Configuration file"));
9147                   break;
9148
9149                 case DT_DEPAUDIT:
9150                   printf (_("Dependency audit library"));
9151                   break;
9152
9153                 case DT_AUDIT:
9154                   printf (_("Audit library"));
9155                   break;
9156                 }
9157
9158               if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9159                 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
9160               else
9161                 {
9162                   printf (": ");
9163                   print_vma (entry->d_un.d_val, PREFIX_HEX);
9164                   putchar ('\n');
9165                 }
9166             }
9167           break;
9168
9169         case DT_FEATURE:
9170           if (do_dynamic)
9171             {
9172               printf (_("Flags:"));
9173
9174               if (entry->d_un.d_val == 0)
9175                 printf (_(" None\n"));
9176               else
9177                 {
9178                   unsigned long int val = entry->d_un.d_val;
9179
9180                   if (val & DTF_1_PARINIT)
9181                     {
9182                       printf (" PARINIT");
9183                       val ^= DTF_1_PARINIT;
9184                     }
9185                   if (val & DTF_1_CONFEXP)
9186                     {
9187                       printf (" CONFEXP");
9188                       val ^= DTF_1_CONFEXP;
9189                     }
9190                   if (val != 0)
9191                     printf (" %lx", val);
9192                   puts ("");
9193                 }
9194             }
9195           break;
9196
9197         case DT_POSFLAG_1:
9198           if (do_dynamic)
9199             {
9200               printf (_("Flags:"));
9201
9202               if (entry->d_un.d_val == 0)
9203                 printf (_(" None\n"));
9204               else
9205                 {
9206                   unsigned long int val = entry->d_un.d_val;
9207
9208                   if (val & DF_P1_LAZYLOAD)
9209                     {
9210                       printf (" LAZYLOAD");
9211                       val ^= DF_P1_LAZYLOAD;
9212                     }
9213                   if (val & DF_P1_GROUPPERM)
9214                     {
9215                       printf (" GROUPPERM");
9216                       val ^= DF_P1_GROUPPERM;
9217                     }
9218                   if (val != 0)
9219                     printf (" %lx", val);
9220                   puts ("");
9221                 }
9222             }
9223           break;
9224
9225         case DT_FLAGS_1:
9226           if (do_dynamic)
9227             {
9228               printf (_("Flags:"));
9229               if (entry->d_un.d_val == 0)
9230                 printf (_(" None\n"));
9231               else
9232                 {
9233                   unsigned long int val = entry->d_un.d_val;
9234
9235                   if (val & DF_1_NOW)
9236                     {
9237                       printf (" NOW");
9238                       val ^= DF_1_NOW;
9239                     }
9240                   if (val & DF_1_GLOBAL)
9241                     {
9242                       printf (" GLOBAL");
9243                       val ^= DF_1_GLOBAL;
9244                     }
9245                   if (val & DF_1_GROUP)
9246                     {
9247                       printf (" GROUP");
9248                       val ^= DF_1_GROUP;
9249                     }
9250                   if (val & DF_1_NODELETE)
9251                     {
9252                       printf (" NODELETE");
9253                       val ^= DF_1_NODELETE;
9254                     }
9255                   if (val & DF_1_LOADFLTR)
9256                     {
9257                       printf (" LOADFLTR");
9258                       val ^= DF_1_LOADFLTR;
9259                     }
9260                   if (val & DF_1_INITFIRST)
9261                     {
9262                       printf (" INITFIRST");
9263                       val ^= DF_1_INITFIRST;
9264                     }
9265                   if (val & DF_1_NOOPEN)
9266                     {
9267                       printf (" NOOPEN");
9268                       val ^= DF_1_NOOPEN;
9269                     }
9270                   if (val & DF_1_ORIGIN)
9271                     {
9272                       printf (" ORIGIN");
9273                       val ^= DF_1_ORIGIN;
9274                     }
9275                   if (val & DF_1_DIRECT)
9276                     {
9277                       printf (" DIRECT");
9278                       val ^= DF_1_DIRECT;
9279                     }
9280                   if (val & DF_1_TRANS)
9281                     {
9282                       printf (" TRANS");
9283                       val ^= DF_1_TRANS;
9284                     }
9285                   if (val & DF_1_INTERPOSE)
9286                     {
9287                       printf (" INTERPOSE");
9288                       val ^= DF_1_INTERPOSE;
9289                     }
9290                   if (val & DF_1_NODEFLIB)
9291                     {
9292                       printf (" NODEFLIB");
9293                       val ^= DF_1_NODEFLIB;
9294                     }
9295                   if (val & DF_1_NODUMP)
9296                     {
9297                       printf (" NODUMP");
9298                       val ^= DF_1_NODUMP;
9299                     }
9300                   if (val & DF_1_CONFALT)
9301                     {
9302                       printf (" CONFALT");
9303                       val ^= DF_1_CONFALT;
9304                     }
9305                   if (val & DF_1_ENDFILTEE)
9306                     {
9307                       printf (" ENDFILTEE");
9308                       val ^= DF_1_ENDFILTEE;
9309                     }
9310                   if (val & DF_1_DISPRELDNE)
9311                     {
9312                       printf (" DISPRELDNE");
9313                       val ^= DF_1_DISPRELDNE;
9314                     }
9315                   if (val & DF_1_DISPRELPND)
9316                     {
9317                       printf (" DISPRELPND");
9318                       val ^= DF_1_DISPRELPND;
9319                     }
9320                   if (val & DF_1_NODIRECT)
9321                     {
9322                       printf (" NODIRECT");
9323                       val ^= DF_1_NODIRECT;
9324                     }
9325                   if (val & DF_1_IGNMULDEF)
9326                     {
9327                       printf (" IGNMULDEF");
9328                       val ^= DF_1_IGNMULDEF;
9329                     }
9330                   if (val & DF_1_NOKSYMS)
9331                     {
9332                       printf (" NOKSYMS");
9333                       val ^= DF_1_NOKSYMS;
9334                     }
9335                   if (val & DF_1_NOHDR)
9336                     {
9337                       printf (" NOHDR");
9338                       val ^= DF_1_NOHDR;
9339                     }
9340                   if (val & DF_1_EDITED)
9341                     {
9342                       printf (" EDITED");
9343                       val ^= DF_1_EDITED;
9344                     }
9345                   if (val & DF_1_NORELOC)
9346                     {
9347                       printf (" NORELOC");
9348                       val ^= DF_1_NORELOC;
9349                     }
9350                   if (val & DF_1_SYMINTPOSE)
9351                     {
9352                       printf (" SYMINTPOSE");
9353                       val ^= DF_1_SYMINTPOSE;
9354                     }
9355                   if (val & DF_1_GLOBAUDIT)
9356                     {
9357                       printf (" GLOBAUDIT");
9358                       val ^= DF_1_GLOBAUDIT;
9359                     }
9360                   if (val & DF_1_SINGLETON)
9361                     {
9362                       printf (" SINGLETON");
9363                       val ^= DF_1_SINGLETON;
9364                     }
9365                   if (val & DF_1_STUB)
9366                     {
9367                       printf (" STUB");
9368                       val ^= DF_1_STUB;
9369                     }
9370                   if (val & DF_1_PIE)
9371                     {
9372                       printf (" PIE");
9373                       val ^= DF_1_PIE;
9374                     }
9375                   if (val != 0)
9376                     printf (" %lx", val);
9377                   puts ("");
9378                 }
9379             }
9380           break;
9381
9382         case DT_PLTREL:
9383           dynamic_info[entry->d_tag] = entry->d_un.d_val;
9384           if (do_dynamic)
9385             puts (get_dynamic_type (entry->d_un.d_val));
9386           break;
9387
9388         case DT_NULL    :
9389         case DT_NEEDED  :
9390         case DT_PLTGOT  :
9391         case DT_HASH    :
9392         case DT_STRTAB  :
9393         case DT_SYMTAB  :
9394         case DT_RELA    :
9395         case DT_INIT    :
9396         case DT_FINI    :
9397         case DT_SONAME  :
9398         case DT_RPATH   :
9399         case DT_SYMBOLIC:
9400         case DT_REL     :
9401         case DT_DEBUG   :
9402         case DT_TEXTREL :
9403         case DT_JMPREL  :
9404         case DT_RUNPATH :
9405           dynamic_info[entry->d_tag] = entry->d_un.d_val;
9406
9407           if (do_dynamic)
9408             {
9409               char * name;
9410
9411               if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9412                 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
9413               else
9414                 name = NULL;
9415
9416               if (name)
9417                 {
9418                   switch (entry->d_tag)
9419                     {
9420                     case DT_NEEDED:
9421                       printf (_("Shared library: [%s]"), name);
9422
9423                       if (streq (name, program_interpreter))
9424                         printf (_(" program interpreter"));
9425                       break;
9426
9427                     case DT_SONAME:
9428                       printf (_("Library soname: [%s]"), name);
9429                       break;
9430
9431                     case DT_RPATH:
9432                       printf (_("Library rpath: [%s]"), name);
9433                       break;
9434
9435                     case DT_RUNPATH:
9436                       printf (_("Library runpath: [%s]"), name);
9437                       break;
9438
9439                     default:
9440                       print_vma (entry->d_un.d_val, PREFIX_HEX);
9441                       break;
9442                     }
9443                 }
9444               else
9445                 print_vma (entry->d_un.d_val, PREFIX_HEX);
9446
9447               putchar ('\n');
9448             }
9449           break;
9450
9451         case DT_PLTRELSZ:
9452         case DT_RELASZ  :
9453         case DT_STRSZ   :
9454         case DT_RELSZ   :
9455         case DT_RELAENT :
9456         case DT_SYMENT  :
9457         case DT_RELENT  :
9458           dynamic_info[entry->d_tag] = entry->d_un.d_val;
9459         case DT_PLTPADSZ:
9460         case DT_MOVEENT :
9461         case DT_MOVESZ  :
9462         case DT_INIT_ARRAYSZ:
9463         case DT_FINI_ARRAYSZ:
9464         case DT_GNU_CONFLICTSZ:
9465         case DT_GNU_LIBLISTSZ:
9466           if (do_dynamic)
9467             {
9468               print_vma (entry->d_un.d_val, UNSIGNED);
9469               printf (_(" (bytes)\n"));
9470             }
9471           break;
9472
9473         case DT_VERDEFNUM:
9474         case DT_VERNEEDNUM:
9475         case DT_RELACOUNT:
9476         case DT_RELCOUNT:
9477           if (do_dynamic)
9478             {
9479               print_vma (entry->d_un.d_val, UNSIGNED);
9480               putchar ('\n');
9481             }
9482           break;
9483
9484         case DT_SYMINSZ:
9485         case DT_SYMINENT:
9486         case DT_SYMINFO:
9487         case DT_USED:
9488         case DT_INIT_ARRAY:
9489         case DT_FINI_ARRAY:
9490           if (do_dynamic)
9491             {
9492               if (entry->d_tag == DT_USED
9493                   && VALID_DYNAMIC_NAME (entry->d_un.d_val))
9494                 {
9495                   char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
9496
9497                   if (*name)
9498                     {
9499                       printf (_("Not needed object: [%s]\n"), name);
9500                       break;
9501                     }
9502                 }
9503
9504               print_vma (entry->d_un.d_val, PREFIX_HEX);
9505               putchar ('\n');
9506             }
9507           break;
9508
9509         case DT_BIND_NOW:
9510           /* The value of this entry is ignored.  */
9511           if (do_dynamic)
9512             putchar ('\n');
9513           break;
9514
9515         case DT_GNU_PRELINKED:
9516           if (do_dynamic)
9517             {
9518               struct tm * tmp;
9519               time_t atime = entry->d_un.d_val;
9520
9521               tmp = gmtime (&atime);
9522               /* PR 17533 file: 041-1244816-0.004.  */
9523               if (tmp == NULL)
9524                 printf (_("<corrupt time val: %lx"),
9525                         (unsigned long) atime);
9526               else
9527                 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
9528                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9529                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
9530
9531             }
9532           break;
9533
9534         case DT_GNU_HASH:
9535           dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
9536           if (do_dynamic)
9537             {
9538               print_vma (entry->d_un.d_val, PREFIX_HEX);
9539               putchar ('\n');
9540             }
9541           break;
9542
9543         default:
9544           if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
9545             version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
9546               entry->d_un.d_val;
9547
9548           if (do_dynamic)
9549             {
9550               switch (elf_header.e_machine)
9551                 {
9552                 case EM_MIPS:
9553                 case EM_MIPS_RS3_LE:
9554                   dynamic_section_mips_val (entry);
9555                   break;
9556                 case EM_PARISC:
9557                   dynamic_section_parisc_val (entry);
9558                   break;
9559                 case EM_IA_64:
9560                   dynamic_section_ia64_val (entry);
9561                   break;
9562                 default:
9563                   print_vma (entry->d_un.d_val, PREFIX_HEX);
9564                   putchar ('\n');
9565                 }
9566             }
9567           break;
9568         }
9569     }
9570
9571   return 1;
9572 }
9573
9574 static char *
9575 get_ver_flags (unsigned int flags)
9576 {
9577   static char buff[32];
9578
9579   buff[0] = 0;
9580
9581   if (flags == 0)
9582     return _("none");
9583
9584   if (flags & VER_FLG_BASE)
9585     strcat (buff, "BASE ");
9586
9587   if (flags & VER_FLG_WEAK)
9588     {
9589       if (flags & VER_FLG_BASE)
9590         strcat (buff, "| ");
9591
9592       strcat (buff, "WEAK ");
9593     }
9594
9595   if (flags & VER_FLG_INFO)
9596     {
9597       if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
9598         strcat (buff, "| ");
9599
9600       strcat (buff, "INFO ");
9601     }
9602
9603   if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
9604     strcat (buff, _("| <unknown>"));
9605
9606   return buff;
9607 }
9608
9609 /* Display the contents of the version sections.  */
9610
9611 static int
9612 process_version_sections (FILE * file)
9613 {
9614   Elf_Internal_Shdr * section;
9615   unsigned i;
9616   int found = 0;
9617
9618   if (! do_version)
9619     return 1;
9620
9621   for (i = 0, section = section_headers;
9622        i < elf_header.e_shnum;
9623        i++, section++)
9624     {
9625       switch (section->sh_type)
9626         {
9627         case SHT_GNU_verdef:
9628           {
9629             Elf_External_Verdef * edefs;
9630             unsigned int idx;
9631             unsigned int cnt;
9632             char * endbuf;
9633
9634             found = 1;
9635
9636             printf (_("\nVersion definition section '%s' contains %u entries:\n"),
9637                     printable_section_name (section),
9638                     section->sh_info);
9639
9640             printf (_("  Addr: 0x"));
9641             printf_vma (section->sh_addr);
9642             printf (_("  Offset: %#08lx  Link: %u (%s)"),
9643                     (unsigned long) section->sh_offset, section->sh_link,
9644                     printable_section_name_from_index (section->sh_link));
9645
9646             edefs = (Elf_External_Verdef *)
9647                 get_data (NULL, file, section->sh_offset, 1,section->sh_size,
9648                           _("version definition section"));
9649             if (!edefs)
9650               break;
9651             endbuf = (char *) edefs + section->sh_size;
9652
9653             for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
9654               {
9655                 char * vstart;
9656                 Elf_External_Verdef * edef;
9657                 Elf_Internal_Verdef ent;
9658                 Elf_External_Verdaux * eaux;
9659                 Elf_Internal_Verdaux aux;
9660                 int j;
9661                 int isum;
9662
9663                 /* Check for very large indicies.  */
9664                 if (idx > (size_t) (endbuf - (char *) edefs))
9665                   break;
9666
9667                 vstart = ((char *) edefs) + idx;
9668                 if (vstart + sizeof (*edef) > endbuf)
9669                   break;
9670
9671                 edef = (Elf_External_Verdef *) vstart;
9672
9673                 ent.vd_version = BYTE_GET (edef->vd_version);
9674                 ent.vd_flags   = BYTE_GET (edef->vd_flags);
9675                 ent.vd_ndx     = BYTE_GET (edef->vd_ndx);
9676                 ent.vd_cnt     = BYTE_GET (edef->vd_cnt);
9677                 ent.vd_hash    = BYTE_GET (edef->vd_hash);
9678                 ent.vd_aux     = BYTE_GET (edef->vd_aux);
9679                 ent.vd_next    = BYTE_GET (edef->vd_next);
9680
9681                 printf (_("  %#06x: Rev: %d  Flags: %s"),
9682                         idx, ent.vd_version, get_ver_flags (ent.vd_flags));
9683
9684                 printf (_("  Index: %d  Cnt: %d  "),
9685                         ent.vd_ndx, ent.vd_cnt);
9686
9687                 /* Check for overflow.  */
9688                 if (ent.vd_aux > (size_t) (endbuf - vstart))
9689                   break;
9690
9691                 vstart += ent.vd_aux;
9692
9693                 eaux = (Elf_External_Verdaux *) vstart;
9694
9695                 aux.vda_name = BYTE_GET (eaux->vda_name);
9696                 aux.vda_next = BYTE_GET (eaux->vda_next);
9697
9698                 if (VALID_DYNAMIC_NAME (aux.vda_name))
9699                   printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
9700                 else
9701                   printf (_("Name index: %ld\n"), aux.vda_name);
9702
9703                 isum = idx + ent.vd_aux;
9704
9705                 for (j = 1; j < ent.vd_cnt; j++)
9706                   {
9707                     /* Check for overflow.  */
9708                     if (aux.vda_next > (size_t) (endbuf - vstart))
9709                       break;
9710
9711                     isum   += aux.vda_next;
9712                     vstart += aux.vda_next;
9713
9714                     eaux = (Elf_External_Verdaux *) vstart;
9715                     if (vstart + sizeof (*eaux) > endbuf)
9716                       break;
9717
9718                     aux.vda_name = BYTE_GET (eaux->vda_name);
9719                     aux.vda_next = BYTE_GET (eaux->vda_next);
9720
9721                     if (VALID_DYNAMIC_NAME (aux.vda_name))
9722                       printf (_("  %#06x: Parent %d: %s\n"),
9723                               isum, j, GET_DYNAMIC_NAME (aux.vda_name));
9724                     else
9725                       printf (_("  %#06x: Parent %d, name index: %ld\n"),
9726                               isum, j, aux.vda_name);
9727                   }
9728
9729                 if (j < ent.vd_cnt)
9730                   printf (_("  Version def aux past end of section\n"));
9731
9732                 /* PR 17531: file: id:000001,src:000172+005151,op:splice,rep:2.  */
9733                 if (idx + ent.vd_next <= idx)
9734                   break;
9735
9736                 idx += ent.vd_next;
9737               }
9738
9739             if (cnt < section->sh_info)
9740               printf (_("  Version definition past end of section\n"));
9741
9742             free (edefs);
9743           }
9744           break;
9745
9746         case SHT_GNU_verneed:
9747           {
9748             Elf_External_Verneed * eneed;
9749             unsigned int idx;
9750             unsigned int cnt;
9751             char * endbuf;
9752
9753             found = 1;
9754
9755             printf (_("\nVersion needs section '%s' contains %u entries:\n"),
9756                     printable_section_name (section), section->sh_info);
9757
9758             printf (_(" Addr: 0x"));
9759             printf_vma (section->sh_addr);
9760             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
9761                     (unsigned long) section->sh_offset, section->sh_link,
9762                     printable_section_name_from_index (section->sh_link));
9763
9764             eneed = (Elf_External_Verneed *) get_data (NULL, file,
9765                                                        section->sh_offset, 1,
9766                                                        section->sh_size,
9767                                                        _("Version Needs section"));
9768             if (!eneed)
9769               break;
9770             endbuf = (char *) eneed + section->sh_size;
9771
9772             for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
9773               {
9774                 Elf_External_Verneed * entry;
9775                 Elf_Internal_Verneed ent;
9776                 int j;
9777                 int isum;
9778                 char * vstart;
9779
9780                 if (idx > (size_t) (endbuf - (char *) eneed))
9781                   break;
9782
9783                 vstart = ((char *) eneed) + idx;
9784                 if (vstart + sizeof (*entry) > endbuf)
9785                   break;
9786
9787                 entry = (Elf_External_Verneed *) vstart;
9788
9789                 ent.vn_version = BYTE_GET (entry->vn_version);
9790                 ent.vn_cnt     = BYTE_GET (entry->vn_cnt);
9791                 ent.vn_file    = BYTE_GET (entry->vn_file);
9792                 ent.vn_aux     = BYTE_GET (entry->vn_aux);
9793                 ent.vn_next    = BYTE_GET (entry->vn_next);
9794
9795                 printf (_("  %#06x: Version: %d"), idx, ent.vn_version);
9796
9797                 if (VALID_DYNAMIC_NAME (ent.vn_file))
9798                   printf (_("  File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
9799                 else
9800                   printf (_("  File: %lx"), ent.vn_file);
9801
9802                 printf (_("  Cnt: %d\n"), ent.vn_cnt);
9803
9804                 /* Check for overflow.  */
9805                 if (ent.vn_aux > (size_t) (endbuf - vstart))
9806                   break;
9807                 vstart += ent.vn_aux;
9808
9809                 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
9810                   {
9811                     Elf_External_Vernaux * eaux;
9812                     Elf_Internal_Vernaux aux;
9813
9814                     if (vstart + sizeof (*eaux) > endbuf)
9815                       break;
9816                     eaux = (Elf_External_Vernaux *) vstart;
9817
9818                     aux.vna_hash  = BYTE_GET (eaux->vna_hash);
9819                     aux.vna_flags = BYTE_GET (eaux->vna_flags);
9820                     aux.vna_other = BYTE_GET (eaux->vna_other);
9821                     aux.vna_name  = BYTE_GET (eaux->vna_name);
9822                     aux.vna_next  = BYTE_GET (eaux->vna_next);
9823
9824                     if (VALID_DYNAMIC_NAME (aux.vna_name))
9825                       printf (_("  %#06x:   Name: %s"),
9826                               isum, GET_DYNAMIC_NAME (aux.vna_name));
9827                     else
9828                       printf (_("  %#06x:   Name index: %lx"),
9829                               isum, aux.vna_name);
9830
9831                     printf (_("  Flags: %s  Version: %d\n"),
9832                             get_ver_flags (aux.vna_flags), aux.vna_other);
9833
9834                     /* Check for overflow.  */
9835                     if (aux.vna_next > (size_t) (endbuf - vstart)
9836                         || (aux.vna_next == 0 && j < ent.vn_cnt - 1))
9837                       {
9838                         warn (_("Invalid vna_next field of %lx\n"),
9839                               aux.vna_next);
9840                         j = ent.vn_cnt;
9841                         break;
9842                       }
9843                     isum   += aux.vna_next;
9844                     vstart += aux.vna_next;
9845                   }
9846
9847                 if (j < ent.vn_cnt)
9848                   warn (_("Missing Version Needs auxillary information\n"));
9849
9850                 if (ent.vn_next == 0 && cnt < section->sh_info - 1)
9851                   {
9852                     warn (_("Corrupt Version Needs structure - offset to next structure is zero with entries still left to be processed\n"));
9853                     cnt = section->sh_info;
9854                     break;
9855                   }
9856                 idx += ent.vn_next;
9857               }
9858
9859             if (cnt < section->sh_info)
9860               warn (_("Missing Version Needs information\n"));
9861
9862             free (eneed);
9863           }
9864           break;
9865
9866         case SHT_GNU_versym:
9867           {
9868             Elf_Internal_Shdr * link_section;
9869             size_t total;
9870             unsigned int cnt;
9871             unsigned char * edata;
9872             unsigned short * data;
9873             char * strtab;
9874             Elf_Internal_Sym * symbols;
9875             Elf_Internal_Shdr * string_sec;
9876             unsigned long num_syms;
9877             long off;
9878
9879             if (section->sh_link >= elf_header.e_shnum)
9880               break;
9881
9882             link_section = section_headers + section->sh_link;
9883             total = section->sh_size / sizeof (Elf_External_Versym);
9884
9885             if (link_section->sh_link >= elf_header.e_shnum)
9886               break;
9887
9888             found = 1;
9889
9890             symbols = GET_ELF_SYMBOLS (file, link_section, & num_syms);
9891             if (symbols == NULL)
9892               break;
9893
9894             string_sec = section_headers + link_section->sh_link;
9895
9896             strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
9897                                         string_sec->sh_size,
9898                                         _("version string table"));
9899             if (!strtab)
9900               {
9901                 free (symbols);
9902                 break;
9903               }
9904
9905             printf (_("\nVersion symbols section '%s' contains %lu entries:\n"),
9906                     printable_section_name (section), (unsigned long) total);
9907
9908             printf (_(" Addr: "));
9909             printf_vma (section->sh_addr);
9910             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
9911                     (unsigned long) section->sh_offset, section->sh_link,
9912                     printable_section_name (link_section));
9913
9914             off = offset_from_vma (file,
9915                                    version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
9916                                    total * sizeof (short));
9917             edata = (unsigned char *) get_data (NULL, file, off, total,
9918                                                 sizeof (short),
9919                                                 _("version symbol data"));
9920             if (!edata)
9921               {
9922                 free (strtab);
9923                 free (symbols);
9924                 break;
9925               }
9926
9927             data = (short unsigned int *) cmalloc (total, sizeof (short));
9928
9929             for (cnt = total; cnt --;)
9930               data[cnt] = byte_get (edata + cnt * sizeof (short),
9931                                     sizeof (short));
9932
9933             free (edata);
9934
9935             for (cnt = 0; cnt < total; cnt += 4)
9936               {
9937                 int j, nn;
9938                 char *name;
9939                 char *invalid = _("*invalid*");
9940
9941                 printf ("  %03x:", cnt);
9942
9943                 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
9944                   switch (data[cnt + j])
9945                     {
9946                     case 0:
9947                       fputs (_("   0 (*local*)    "), stdout);
9948                       break;
9949
9950                     case 1:
9951                       fputs (_("   1 (*global*)   "), stdout);
9952                       break;
9953
9954                     default:
9955                       nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
9956                                    data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
9957
9958                       /* If this index value is greater than the size of the symbols
9959                          array, break to avoid an out-of-bounds read.  */
9960                       if ((unsigned long)(cnt + j) >= num_syms)
9961                         {
9962                           warn (_("invalid index into symbol array\n"));
9963                           break;
9964                         }
9965
9966                       name = NULL;
9967                       if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
9968                         {
9969                           Elf_Internal_Verneed ivn;
9970                           unsigned long offset;
9971
9972                           offset = offset_from_vma
9973                             (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
9974                              sizeof (Elf_External_Verneed));
9975
9976                           do
9977                             {
9978                               Elf_Internal_Vernaux ivna;
9979                               Elf_External_Verneed evn;
9980                               Elf_External_Vernaux evna;
9981                               unsigned long a_off;
9982
9983                               if (get_data (&evn, file, offset, sizeof (evn), 1,
9984                                             _("version need")) == NULL)
9985                                 break;
9986
9987                               ivn.vn_aux  = BYTE_GET (evn.vn_aux);
9988                               ivn.vn_next = BYTE_GET (evn.vn_next);
9989
9990                               a_off = offset + ivn.vn_aux;
9991
9992                               do
9993                                 {
9994                                   if (get_data (&evna, file, a_off, sizeof (evna),
9995                                                 1, _("version need aux (2)")) == NULL)
9996                                     {
9997                                       ivna.vna_next  = 0;
9998                                       ivna.vna_other = 0;
9999                                     }
10000                                   else
10001                                     {
10002                                       ivna.vna_next  = BYTE_GET (evna.vna_next);
10003                                       ivna.vna_other = BYTE_GET (evna.vna_other);
10004                                     }
10005
10006                                   a_off += ivna.vna_next;
10007                                 }
10008                               while (ivna.vna_other != data[cnt + j]
10009                                      && ivna.vna_next != 0);
10010
10011                               if (ivna.vna_other == data[cnt + j])
10012                                 {
10013                                   ivna.vna_name = BYTE_GET (evna.vna_name);
10014
10015                                   if (ivna.vna_name >= string_sec->sh_size)
10016                                     name = invalid;
10017                                   else
10018                                     name = strtab + ivna.vna_name;
10019                                   break;
10020                                 }
10021
10022                               offset += ivn.vn_next;
10023                             }
10024                           while (ivn.vn_next);
10025                         }
10026
10027                       if (data[cnt + j] != 0x8001
10028                           && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10029                         {
10030                           Elf_Internal_Verdef ivd;
10031                           Elf_External_Verdef evd;
10032                           unsigned long offset;
10033
10034                           offset = offset_from_vma
10035                             (file, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10036                              sizeof evd);
10037
10038                           do
10039                             {
10040                               if (get_data (&evd, file, offset, sizeof (evd), 1,
10041                                             _("version def")) == NULL)
10042                                 {
10043                                   ivd.vd_next = 0;
10044                                   /* PR 17531: file: 046-1082287-0.004.  */
10045                                   ivd.vd_ndx  = (data[cnt + j] & VERSYM_VERSION) + 1;
10046                                   break;
10047                                 }
10048                               else
10049                                 {
10050                                   ivd.vd_next = BYTE_GET (evd.vd_next);
10051                                   ivd.vd_ndx  = BYTE_GET (evd.vd_ndx);
10052                                 }
10053
10054                               offset += ivd.vd_next;
10055                             }
10056                           while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
10057                                  && ivd.vd_next != 0);
10058
10059                           if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
10060                             {
10061                               Elf_External_Verdaux evda;
10062                               Elf_Internal_Verdaux ivda;
10063
10064                               ivd.vd_aux = BYTE_GET (evd.vd_aux);
10065
10066                               if (get_data (&evda, file,
10067                                             offset - ivd.vd_next + ivd.vd_aux,
10068                                             sizeof (evda), 1,
10069                                             _("version def aux")) == NULL)
10070                                 break;
10071
10072                               ivda.vda_name = BYTE_GET (evda.vda_name);
10073
10074                               if (ivda.vda_name >= string_sec->sh_size)
10075                                 name = invalid;
10076                               else if (name != NULL && name != invalid)
10077                                 name = _("*both*");
10078                               else
10079                                 name = strtab + ivda.vda_name;
10080                             }
10081                         }
10082                       if (name != NULL)
10083                         nn += printf ("(%s%-*s",
10084                                       name,
10085                                       12 - (int) strlen (name),
10086                                       ")");
10087
10088                       if (nn < 18)
10089                         printf ("%*c", 18 - nn, ' ');
10090                     }
10091
10092                 putchar ('\n');
10093               }
10094
10095             free (data);
10096             free (strtab);
10097             free (symbols);
10098           }
10099           break;
10100
10101         default:
10102           break;
10103         }
10104     }
10105
10106   if (! found)
10107     printf (_("\nNo version information found in this file.\n"));
10108
10109   return 1;
10110 }
10111
10112 static const char *
10113 get_symbol_binding (unsigned int binding)
10114 {
10115   static char buff[32];
10116
10117   switch (binding)
10118     {
10119     case STB_LOCAL:     return "LOCAL";
10120     case STB_GLOBAL:    return "GLOBAL";
10121     case STB_WEAK:      return "WEAK";
10122     default:
10123       if (binding >= STB_LOPROC && binding <= STB_HIPROC)
10124         snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
10125                   binding);
10126       else if (binding >= STB_LOOS && binding <= STB_HIOS)
10127         {
10128           if (binding == STB_GNU_UNIQUE
10129               && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
10130                   /* GNU is still using the default value 0.  */
10131                   || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10132             return "UNIQUE";
10133           snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
10134         }
10135       else
10136         snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
10137       return buff;
10138     }
10139 }
10140
10141 static const char *
10142 get_symbol_type (unsigned int type)
10143 {
10144   static char buff[32];
10145
10146   switch (type)
10147     {
10148     case STT_NOTYPE:    return "NOTYPE";
10149     case STT_OBJECT:    return "OBJECT";
10150     case STT_FUNC:      return "FUNC";
10151     case STT_SECTION:   return "SECTION";
10152     case STT_FILE:      return "FILE";
10153     case STT_COMMON:    return "COMMON";
10154     case STT_TLS:       return "TLS";
10155     case STT_RELC:      return "RELC";
10156     case STT_SRELC:     return "SRELC";
10157     default:
10158       if (type >= STT_LOPROC && type <= STT_HIPROC)
10159         {
10160           if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
10161             return "THUMB_FUNC";
10162
10163           if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
10164             return "REGISTER";
10165
10166           if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
10167             return "PARISC_MILLI";
10168
10169           snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
10170         }
10171       else if (type >= STT_LOOS && type <= STT_HIOS)
10172         {
10173           if (elf_header.e_machine == EM_PARISC)
10174             {
10175               if (type == STT_HP_OPAQUE)
10176                 return "HP_OPAQUE";
10177               if (type == STT_HP_STUB)
10178                 return "HP_STUB";
10179             }
10180
10181           if (type == STT_GNU_IFUNC
10182               && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
10183                   || elf_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD
10184                   /* GNU is still using the default value 0.  */
10185                   || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10186             return "IFUNC";
10187
10188           snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
10189         }
10190       else
10191         snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
10192       return buff;
10193     }
10194 }
10195
10196 static const char *
10197 get_symbol_visibility (unsigned int visibility)
10198 {
10199   switch (visibility)
10200     {
10201     case STV_DEFAULT:   return "DEFAULT";
10202     case STV_INTERNAL:  return "INTERNAL";
10203     case STV_HIDDEN:    return "HIDDEN";
10204     case STV_PROTECTED: return "PROTECTED";
10205     default:
10206       error (_("Unrecognized visibility value: %u"), visibility);
10207       return _("<unknown>");
10208     }
10209 }
10210
10211 static const char *
10212 get_mips_symbol_other (unsigned int other)
10213 {
10214   switch (other)
10215     {
10216     case STO_OPTIONAL:
10217       return "OPTIONAL";
10218     case STO_MIPS_PLT:
10219       return "MIPS PLT";
10220     case STO_MIPS_PIC:
10221       return "MIPS PIC";
10222     case STO_MICROMIPS:
10223       return "MICROMIPS";
10224     case STO_MICROMIPS | STO_MIPS_PIC:
10225       return "MICROMIPS, MIPS PIC";
10226     case STO_MIPS16:
10227       return "MIPS16";
10228     default:
10229       return NULL;
10230     }
10231 }
10232
10233 static const char *
10234 get_ia64_symbol_other (unsigned int other)
10235 {
10236   if (is_ia64_vms ())
10237     {
10238       static char res[32];
10239
10240       res[0] = 0;
10241
10242       /* Function types is for images and .STB files only.  */
10243       switch (elf_header.e_type)
10244         {
10245         case ET_DYN:
10246         case ET_EXEC:
10247           switch (VMS_ST_FUNC_TYPE (other))
10248             {
10249             case VMS_SFT_CODE_ADDR:
10250               strcat (res, " CA");
10251               break;
10252             case VMS_SFT_SYMV_IDX:
10253               strcat (res, " VEC");
10254               break;
10255             case VMS_SFT_FD:
10256               strcat (res, " FD");
10257               break;
10258             case VMS_SFT_RESERVE:
10259               strcat (res, " RSV");
10260               break;
10261             default:
10262               warn (_("Unrecognized IA64 VMS ST Function type: %d\n"),
10263                     VMS_ST_FUNC_TYPE (other));
10264               strcat (res, " <unknown>");
10265               break;
10266             }
10267           break;
10268         default:
10269           break;
10270         }
10271       switch (VMS_ST_LINKAGE (other))
10272         {
10273         case VMS_STL_IGNORE:
10274           strcat (res, " IGN");
10275           break;
10276         case VMS_STL_RESERVE:
10277           strcat (res, " RSV");
10278           break;
10279         case VMS_STL_STD:
10280           strcat (res, " STD");
10281           break;
10282         case VMS_STL_LNK:
10283           strcat (res, " LNK");
10284           break;
10285         default:
10286           warn (_("Unrecognized IA64 VMS ST Linkage: %d\n"),
10287                 VMS_ST_LINKAGE (other));
10288           strcat (res, " <unknown>");
10289           break;
10290         }
10291
10292       if (res[0] != 0)
10293         return res + 1;
10294       else
10295         return res;
10296     }
10297   return NULL;
10298 }
10299
10300 static const char *
10301 get_ppc64_symbol_other (unsigned int other)
10302 {
10303   if (PPC64_LOCAL_ENTRY_OFFSET (other) != 0)
10304     {
10305       static char buf[32];
10306       snprintf (buf, sizeof buf, _("<localentry>: %d"),
10307                 PPC64_LOCAL_ENTRY_OFFSET (other));
10308       return buf;
10309     }
10310   return NULL;
10311 }
10312
10313 static const char *
10314 get_symbol_other (unsigned int other)
10315 {
10316   const char * result = NULL;
10317   static char buff [32];
10318
10319   if (other == 0)
10320     return "";
10321
10322   switch (elf_header.e_machine)
10323     {
10324     case EM_MIPS:
10325       result = get_mips_symbol_other (other);
10326       break;
10327     case EM_IA_64:
10328       result = get_ia64_symbol_other (other);
10329       break;
10330     case EM_PPC64:
10331       result = get_ppc64_symbol_other (other);
10332       break;
10333     default:
10334       break;
10335     }
10336
10337   if (result)
10338     return result;
10339
10340   snprintf (buff, sizeof buff, _("<other>: %x"), other);
10341   return buff;
10342 }
10343
10344 static const char *
10345 get_symbol_index_type (unsigned int type)
10346 {
10347   static char buff[32];
10348
10349   switch (type)
10350     {
10351     case SHN_UNDEF:     return "UND";
10352     case SHN_ABS:       return "ABS";
10353     case SHN_COMMON:    return "COM";
10354     default:
10355       if (type == SHN_IA_64_ANSI_COMMON
10356           && elf_header.e_machine == EM_IA_64
10357           && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
10358         return "ANSI_COM";
10359       else if ((elf_header.e_machine == EM_X86_64
10360                 || elf_header.e_machine == EM_L1OM
10361                 || elf_header.e_machine == EM_K1OM)
10362                && type == SHN_X86_64_LCOMMON)
10363         return "LARGE_COM";
10364       else if ((type == SHN_MIPS_SCOMMON
10365                 && elf_header.e_machine == EM_MIPS)
10366                || (type == SHN_TIC6X_SCOMMON
10367                    && elf_header.e_machine == EM_TI_C6000))
10368         return "SCOM";
10369       else if (type == SHN_MIPS_SUNDEFINED
10370                && elf_header.e_machine == EM_MIPS)
10371         return "SUND";
10372       else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
10373         sprintf (buff, "PRC[0x%04x]", type & 0xffff);
10374       else if (type >= SHN_LOOS && type <= SHN_HIOS)
10375         sprintf (buff, "OS [0x%04x]", type & 0xffff);
10376       else if (type >= SHN_LORESERVE)
10377         sprintf (buff, "RSV[0x%04x]", type & 0xffff);
10378       else if (type >= elf_header.e_shnum)
10379         sprintf (buff, _("bad section index[%3d]"), type);
10380       else
10381         sprintf (buff, "%3d", type);
10382       break;
10383     }
10384
10385   return buff;
10386 }
10387
10388 static bfd_vma *
10389 get_dynamic_data (FILE * file, bfd_size_type number, unsigned int ent_size)
10390 {
10391   unsigned char * e_data;
10392   bfd_vma * i_data;
10393
10394   /* If the size_t type is smaller than the bfd_size_type, eg because
10395      you are building a 32-bit tool on a 64-bit host, then make sure
10396      that when (number) is cast to (size_t) no information is lost.  */
10397   if (sizeof (size_t) < sizeof (bfd_size_type)
10398       && (bfd_size_type) ((size_t) number) != number)
10399     {
10400       error (_("Size truncation prevents reading %" BFD_VMA_FMT "u"
10401                " elements of size %u\n"),
10402              number, ent_size);
10403       return NULL;
10404     }
10405
10406   /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
10407      attempting to allocate memory when the read is bound to fail.  */
10408   if (ent_size * number > current_file_size)
10409     {
10410       error (_("Invalid number of dynamic entries: %" BFD_VMA_FMT "u\n"),
10411              number);
10412       return NULL;
10413     }
10414
10415   e_data = (unsigned char *) cmalloc ((size_t) number, ent_size);
10416   if (e_data == NULL)
10417     {
10418       error (_("Out of memory reading %" BFD_VMA_FMT "u dynamic entries\n"),
10419              number);
10420       return NULL;
10421     }
10422
10423   if (fread (e_data, ent_size, (size_t) number, file) != number)
10424     {
10425       error (_("Unable to read in %" BFD_VMA_FMT "u bytes of dynamic data\n"),
10426              number * ent_size);
10427       free (e_data);
10428       return NULL;
10429     }
10430
10431   i_data = (bfd_vma *) cmalloc ((size_t) number, sizeof (*i_data));
10432   if (i_data == NULL)
10433     {
10434       error (_("Out of memory allocating space for %" BFD_VMA_FMT "u"
10435                " dynamic entries\n"),
10436              number);
10437       free (e_data);
10438       return NULL;
10439     }
10440
10441   while (number--)
10442     i_data[number] = byte_get (e_data + number * ent_size, ent_size);
10443
10444   free (e_data);
10445
10446   return i_data;
10447 }
10448
10449 static void
10450 print_dynamic_symbol (bfd_vma si, unsigned long hn)
10451 {
10452   Elf_Internal_Sym * psym;
10453   int n;
10454
10455   n = print_vma (si, DEC_5);
10456   if (n < 5)
10457     fputs (&"     "[n], stdout);
10458   printf (" %3lu: ", hn);
10459
10460   if (dynamic_symbols == NULL || si >= num_dynamic_syms)
10461     {
10462       printf (_("<No info available for dynamic symbol number %lu>\n"),
10463               (unsigned long) si);
10464       return;
10465     }
10466
10467   psym = dynamic_symbols + si;
10468   print_vma (psym->st_value, LONG_HEX);
10469   putchar (' ');
10470   print_vma (psym->st_size, DEC_5);
10471
10472   printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
10473   printf (" %-6s",  get_symbol_binding (ELF_ST_BIND (psym->st_info)));
10474   printf (" %-7s",  get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
10475   /* Check to see if any other bits in the st_other field are set.
10476      Note - displaying this information disrupts the layout of the
10477      table being generated, but for the moment this case is very
10478      rare.  */
10479   if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
10480     printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
10481   printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
10482   if (VALID_DYNAMIC_NAME (psym->st_name))
10483     print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
10484   else
10485     printf (_(" <corrupt: %14ld>"), psym->st_name);
10486   putchar ('\n');
10487 }
10488
10489 static const char *
10490 get_symbol_version_string (FILE *file, int is_dynsym,
10491                            const char *strtab,
10492                            unsigned long int strtab_size,
10493                            unsigned int si, Elf_Internal_Sym *psym,
10494                            enum versioned_symbol_info *sym_info,
10495                            unsigned short *vna_other)
10496 {
10497   unsigned char data[2];
10498   unsigned short vers_data;
10499   unsigned long offset;
10500
10501   if (!is_dynsym
10502       || version_info[DT_VERSIONTAGIDX (DT_VERSYM)] == 0)
10503     return NULL;
10504
10505   offset = offset_from_vma (file, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10506                             sizeof data + si * sizeof (vers_data));
10507
10508   if (get_data (&data, file, offset + si * sizeof (vers_data),
10509                 sizeof (data), 1, _("version data")) == NULL)
10510     return NULL;
10511
10512   vers_data = byte_get (data, 2);
10513
10514   if ((vers_data & VERSYM_HIDDEN) == 0 && vers_data <= 1)
10515     return NULL;
10516
10517   /* Usually we'd only see verdef for defined symbols, and verneed for
10518      undefined symbols.  However, symbols defined by the linker in
10519      .dynbss for variables copied from a shared library in order to
10520      avoid text relocations are defined yet have verneed.  We could
10521      use a heuristic to detect the special case, for example, check
10522      for verneed first on symbols defined in SHT_NOBITS sections, but
10523      it is simpler and more reliable to just look for both verdef and
10524      verneed.  .dynbss might not be mapped to a SHT_NOBITS section.  */
10525
10526   if (psym->st_shndx != SHN_UNDEF
10527       && vers_data != 0x8001
10528       && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10529     {
10530       Elf_Internal_Verdef ivd;
10531       Elf_Internal_Verdaux ivda;
10532       Elf_External_Verdaux evda;
10533       unsigned long off;
10534
10535       off = offset_from_vma (file,
10536                              version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10537                              sizeof (Elf_External_Verdef));
10538
10539       do
10540         {
10541           Elf_External_Verdef evd;
10542
10543           if (get_data (&evd, file, off, sizeof (evd), 1,
10544                         _("version def")) == NULL)
10545             {
10546               ivd.vd_ndx = 0;
10547               ivd.vd_aux = 0;
10548               ivd.vd_next = 0;
10549             }
10550           else
10551             {
10552               ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
10553               ivd.vd_aux = BYTE_GET (evd.vd_aux);
10554               ivd.vd_next = BYTE_GET (evd.vd_next);
10555             }
10556
10557           off += ivd.vd_next;
10558         }
10559       while (ivd.vd_ndx != (vers_data & VERSYM_VERSION) && ivd.vd_next != 0);
10560
10561       if (ivd.vd_ndx == (vers_data & VERSYM_VERSION))
10562         {
10563           off -= ivd.vd_next;
10564           off += ivd.vd_aux;
10565
10566           if (get_data (&evda, file, off, sizeof (evda), 1,
10567                         _("version def aux")) != NULL)
10568             {
10569               ivda.vda_name = BYTE_GET (evda.vda_name);
10570
10571               if (psym->st_name != ivda.vda_name)
10572                 {
10573                   *sym_info = ((vers_data & VERSYM_HIDDEN) != 0
10574                                ? symbol_hidden : symbol_public);
10575                   return (ivda.vda_name < strtab_size
10576                           ? strtab + ivda.vda_name : _("<corrupt>"));
10577                 }
10578             }
10579         }
10580     }
10581
10582   if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
10583     {
10584       Elf_External_Verneed evn;
10585       Elf_Internal_Verneed ivn;
10586       Elf_Internal_Vernaux ivna;
10587
10588       offset = offset_from_vma (file,
10589                                 version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10590                                 sizeof evn);
10591       do
10592         {
10593           unsigned long vna_off;
10594
10595           if (get_data (&evn, file, offset, sizeof (evn), 1,
10596                         _("version need")) == NULL)
10597             {
10598               ivna.vna_next = 0;
10599               ivna.vna_other = 0;
10600               ivna.vna_name = 0;
10601               break;
10602             }
10603
10604           ivn.vn_aux  = BYTE_GET (evn.vn_aux);
10605           ivn.vn_next = BYTE_GET (evn.vn_next);
10606
10607           vna_off = offset + ivn.vn_aux;
10608
10609           do
10610             {
10611               Elf_External_Vernaux evna;
10612
10613               if (get_data (&evna, file, vna_off, sizeof (evna), 1,
10614                             _("version need aux (3)")) == NULL)
10615                 {
10616                   ivna.vna_next = 0;
10617                   ivna.vna_other = 0;
10618                   ivna.vna_name = 0;
10619                 }
10620               else
10621                 {
10622                   ivna.vna_other = BYTE_GET (evna.vna_other);
10623                   ivna.vna_next  = BYTE_GET (evna.vna_next);
10624                   ivna.vna_name  = BYTE_GET (evna.vna_name);
10625                 }
10626
10627               vna_off += ivna.vna_next;
10628             }
10629           while (ivna.vna_other != vers_data && ivna.vna_next != 0);
10630
10631           if (ivna.vna_other == vers_data)
10632             break;
10633
10634           offset += ivn.vn_next;
10635         }
10636       while (ivn.vn_next != 0);
10637
10638       if (ivna.vna_other == vers_data)
10639         {
10640           *sym_info = symbol_undefined;
10641           *vna_other = ivna.vna_other;
10642           return (ivna.vna_name < strtab_size
10643                   ? strtab + ivna.vna_name : _("<corrupt>"));
10644         }
10645     }
10646   return NULL;
10647 }
10648
10649 /* Dump the symbol table.  */
10650 static int
10651 process_symbol_table (FILE * file)
10652 {
10653   Elf_Internal_Shdr * section;
10654   bfd_size_type nbuckets = 0;
10655   bfd_size_type nchains = 0;
10656   bfd_vma * buckets = NULL;
10657   bfd_vma * chains = NULL;
10658   bfd_vma ngnubuckets = 0;
10659   bfd_vma * gnubuckets = NULL;
10660   bfd_vma * gnuchains = NULL;
10661   bfd_vma gnusymidx = 0;
10662   bfd_size_type ngnuchains = 0;
10663
10664   if (!do_syms && !do_dyn_syms && !do_histogram)
10665     return 1;
10666
10667   if (dynamic_info[DT_HASH]
10668       && (do_histogram
10669           || (do_using_dynamic
10670               && !do_dyn_syms
10671               && dynamic_strings != NULL)))
10672     {
10673       unsigned char nb[8];
10674       unsigned char nc[8];
10675       unsigned int hash_ent_size = 4;
10676
10677       if ((elf_header.e_machine == EM_ALPHA
10678            || elf_header.e_machine == EM_S390
10679            || elf_header.e_machine == EM_S390_OLD)
10680           && elf_header.e_ident[EI_CLASS] == ELFCLASS64)
10681         hash_ent_size = 8;
10682
10683       if (fseek (file,
10684                  (archive_file_offset
10685                   + offset_from_vma (file, dynamic_info[DT_HASH],
10686                                      sizeof nb + sizeof nc)),
10687                  SEEK_SET))
10688         {
10689           error (_("Unable to seek to start of dynamic information\n"));
10690           goto no_hash;
10691         }
10692
10693       if (fread (nb, hash_ent_size, 1, file) != 1)
10694         {
10695           error (_("Failed to read in number of buckets\n"));
10696           goto no_hash;
10697         }
10698
10699       if (fread (nc, hash_ent_size, 1, file) != 1)
10700         {
10701           error (_("Failed to read in number of chains\n"));
10702           goto no_hash;
10703         }
10704
10705       nbuckets = byte_get (nb, hash_ent_size);
10706       nchains  = byte_get (nc, hash_ent_size);
10707
10708       buckets = get_dynamic_data (file, nbuckets, hash_ent_size);
10709       chains  = get_dynamic_data (file, nchains, hash_ent_size);
10710
10711     no_hash:
10712       if (buckets == NULL || chains == NULL)
10713         {
10714           if (do_using_dynamic)
10715             return 0;
10716           free (buckets);
10717           free (chains);
10718           buckets = NULL;
10719           chains = NULL;
10720           nbuckets = 0;
10721           nchains = 0;
10722         }
10723     }
10724
10725   if (dynamic_info_DT_GNU_HASH
10726       && (do_histogram
10727           || (do_using_dynamic
10728               && !do_dyn_syms
10729               && dynamic_strings != NULL)))
10730     {
10731       unsigned char nb[16];
10732       bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
10733       bfd_vma buckets_vma;
10734
10735       if (fseek (file,
10736                  (archive_file_offset
10737                   + offset_from_vma (file, dynamic_info_DT_GNU_HASH,
10738                                      sizeof nb)),
10739                  SEEK_SET))
10740         {
10741           error (_("Unable to seek to start of dynamic information\n"));
10742           goto no_gnu_hash;
10743         }
10744
10745       if (fread (nb, 16, 1, file) != 1)
10746         {
10747           error (_("Failed to read in number of buckets\n"));
10748           goto no_gnu_hash;
10749         }
10750
10751       ngnubuckets = byte_get (nb, 4);
10752       gnusymidx = byte_get (nb + 4, 4);
10753       bitmaskwords = byte_get (nb + 8, 4);
10754       buckets_vma = dynamic_info_DT_GNU_HASH + 16;
10755       if (is_32bit_elf)
10756         buckets_vma += bitmaskwords * 4;
10757       else
10758         buckets_vma += bitmaskwords * 8;
10759
10760       if (fseek (file,
10761                  (archive_file_offset
10762                   + offset_from_vma (file, buckets_vma, 4)),
10763                  SEEK_SET))
10764         {
10765           error (_("Unable to seek to start of dynamic information\n"));
10766           goto no_gnu_hash;
10767         }
10768
10769       gnubuckets = get_dynamic_data (file, ngnubuckets, 4);
10770
10771       if (gnubuckets == NULL)
10772         goto no_gnu_hash;
10773
10774       for (i = 0; i < ngnubuckets; i++)
10775         if (gnubuckets[i] != 0)
10776           {
10777             if (gnubuckets[i] < gnusymidx)
10778               return 0;
10779
10780             if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
10781               maxchain = gnubuckets[i];
10782           }
10783
10784       if (maxchain == 0xffffffff)
10785         goto no_gnu_hash;
10786
10787       maxchain -= gnusymidx;
10788
10789       if (fseek (file,
10790                  (archive_file_offset
10791                   + offset_from_vma (file, buckets_vma
10792                                            + 4 * (ngnubuckets + maxchain), 4)),
10793                  SEEK_SET))
10794         {
10795           error (_("Unable to seek to start of dynamic information\n"));
10796           goto no_gnu_hash;
10797         }
10798
10799       do
10800         {
10801           if (fread (nb, 4, 1, file) != 1)
10802             {
10803               error (_("Failed to determine last chain length\n"));
10804               goto no_gnu_hash;
10805             }
10806
10807           if (maxchain + 1 == 0)
10808             goto no_gnu_hash;
10809
10810           ++maxchain;
10811         }
10812       while ((byte_get (nb, 4) & 1) == 0);
10813
10814       if (fseek (file,
10815                  (archive_file_offset
10816                   + offset_from_vma (file, buckets_vma + 4 * ngnubuckets, 4)),
10817                  SEEK_SET))
10818         {
10819           error (_("Unable to seek to start of dynamic information\n"));
10820           goto no_gnu_hash;
10821         }
10822
10823       gnuchains = get_dynamic_data (file, maxchain, 4);
10824       ngnuchains = maxchain;
10825
10826     no_gnu_hash:
10827       if (gnuchains == NULL)
10828         {
10829           free (gnubuckets);
10830           gnubuckets = NULL;
10831           ngnubuckets = 0;
10832           if (do_using_dynamic)
10833             return 0;
10834         }
10835     }
10836
10837   if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
10838       && do_syms
10839       && do_using_dynamic
10840       && dynamic_strings != NULL
10841       && dynamic_symbols != NULL)
10842     {
10843       unsigned long hn;
10844
10845       if (dynamic_info[DT_HASH])
10846         {
10847           bfd_vma si;
10848
10849           printf (_("\nSymbol table for image:\n"));
10850           if (is_32bit_elf)
10851             printf (_("  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"));
10852           else
10853             printf (_("  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"));
10854
10855           for (hn = 0; hn < nbuckets; hn++)
10856             {
10857               if (! buckets[hn])
10858                 continue;
10859
10860               for (si = buckets[hn]; si < nchains && si > 0; si = chains[si])
10861                 print_dynamic_symbol (si, hn);
10862             }
10863         }
10864
10865       if (dynamic_info_DT_GNU_HASH)
10866         {
10867           printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
10868           if (is_32bit_elf)
10869             printf (_("  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"));
10870           else
10871             printf (_("  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"));
10872
10873           for (hn = 0; hn < ngnubuckets; ++hn)
10874             if (gnubuckets[hn] != 0)
10875               {
10876                 bfd_vma si = gnubuckets[hn];
10877                 bfd_vma off = si - gnusymidx;
10878
10879                 do
10880                   {
10881                     print_dynamic_symbol (si, hn);
10882                     si++;
10883                   }
10884                 while (off < ngnuchains && (gnuchains[off++] & 1) == 0);
10885               }
10886         }
10887     }
10888   else if ((do_dyn_syms || (do_syms && !do_using_dynamic))
10889            && section_headers != NULL)
10890     {
10891       unsigned int i;
10892
10893       for (i = 0, section = section_headers;
10894            i < elf_header.e_shnum;
10895            i++, section++)
10896         {
10897           unsigned int si;
10898           char * strtab = NULL;
10899           unsigned long int strtab_size = 0;
10900           Elf_Internal_Sym * symtab;
10901           Elf_Internal_Sym * psym;
10902           unsigned long num_syms;
10903
10904           if ((section->sh_type != SHT_SYMTAB
10905                && section->sh_type != SHT_DYNSYM)
10906               || (!do_syms
10907                   && section->sh_type == SHT_SYMTAB))
10908             continue;
10909
10910           if (section->sh_entsize == 0)
10911             {
10912               printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
10913                       printable_section_name (section));
10914               continue;
10915             }
10916
10917           printf (_("\nSymbol table '%s' contains %lu entries:\n"),
10918                   printable_section_name (section),
10919                   (unsigned long) (section->sh_size / section->sh_entsize));
10920
10921           if (is_32bit_elf)
10922             printf (_("   Num:    Value  Size Type    Bind   Vis      Ndx Name\n"));
10923           else
10924             printf (_("   Num:    Value          Size Type    Bind   Vis      Ndx Name\n"));
10925
10926           symtab = GET_ELF_SYMBOLS (file, section, & num_syms);
10927           if (symtab == NULL)
10928             continue;
10929
10930           if (section->sh_link == elf_header.e_shstrndx)
10931             {
10932               strtab = string_table;
10933               strtab_size = string_table_length;
10934             }
10935           else if (section->sh_link < elf_header.e_shnum)
10936             {
10937               Elf_Internal_Shdr * string_sec;
10938
10939               string_sec = section_headers + section->sh_link;
10940
10941               strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
10942                                           1, string_sec->sh_size,
10943                                           _("string table"));
10944               strtab_size = strtab != NULL ? string_sec->sh_size : 0;
10945             }
10946
10947           for (si = 0, psym = symtab; si < num_syms; si++, psym++)
10948             {
10949               const char *version_string;
10950               enum versioned_symbol_info sym_info;
10951               unsigned short vna_other;
10952
10953               printf ("%6d: ", si);
10954               print_vma (psym->st_value, LONG_HEX);
10955               putchar (' ');
10956               print_vma (psym->st_size, DEC_5);
10957               printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
10958               printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
10959               printf (" %-7s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
10960               /* Check to see if any other bits in the st_other field are set.
10961                  Note - displaying this information disrupts the layout of the
10962                  table being generated, but for the moment this case is very rare.  */
10963               if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
10964                 printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
10965               printf (" %4s ", get_symbol_index_type (psym->st_shndx));
10966               print_symbol (25, psym->st_name < strtab_size
10967                             ? strtab + psym->st_name : _("<corrupt>"));
10968
10969               version_string
10970                 = get_symbol_version_string (file,
10971                                              section->sh_type == SHT_DYNSYM,
10972                                              strtab, strtab_size, si,
10973                                              psym, &sym_info, &vna_other);
10974               if (version_string)
10975                 {
10976                   if (sym_info == symbol_undefined)
10977                     printf ("@%s (%d)", version_string, vna_other);
10978                   else
10979                     printf (sym_info == symbol_hidden ? "@%s" : "@@%s",
10980                             version_string);
10981                 }
10982
10983               putchar ('\n');
10984             }
10985
10986           free (symtab);
10987           if (strtab != string_table)
10988             free (strtab);
10989         }
10990     }
10991   else if (do_syms)
10992     printf
10993       (_("\nDynamic symbol information is not available for displaying symbols.\n"));
10994
10995   if (do_histogram && buckets != NULL)
10996     {
10997       unsigned long * lengths;
10998       unsigned long * counts;
10999       unsigned long hn;
11000       bfd_vma si;
11001       unsigned long maxlength = 0;
11002       unsigned long nzero_counts = 0;
11003       unsigned long nsyms = 0;
11004       unsigned long chained;
11005
11006       printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
11007               (unsigned long) nbuckets);
11008
11009       lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
11010       if (lengths == NULL)
11011         {
11012           error (_("Out of memory allocating space for histogram buckets\n"));
11013           return 0;
11014         }
11015
11016       printf (_(" Length  Number     %% of total  Coverage\n"));
11017       for (hn = 0; hn < nbuckets; ++hn)
11018         {
11019           for (si = buckets[hn], chained = 0;
11020                si > 0 && si < nchains && si < nbuckets && chained <= nchains;
11021                si = chains[si], ++chained)
11022             {
11023               ++nsyms;
11024               if (maxlength < ++lengths[hn])
11025                 ++maxlength;
11026             }
11027
11028             /* PR binutils/17531: A corrupt binary could contain broken
11029                histogram data.  Do not go into an infinite loop trying
11030                to process it.  */
11031             if (chained > nchains)
11032               {
11033                 error (_("histogram chain is corrupt\n"));
11034                 break;
11035               }
11036         }
11037
11038       counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
11039       if (counts == NULL)
11040         {
11041           free (lengths);
11042           error (_("Out of memory allocating space for histogram counts\n"));
11043           return 0;
11044         }
11045
11046       for (hn = 0; hn < nbuckets; ++hn)
11047         ++counts[lengths[hn]];
11048
11049       if (nbuckets > 0)
11050         {
11051           unsigned long i;
11052           printf ("      0  %-10lu (%5.1f%%)\n",
11053                   counts[0], (counts[0] * 100.0) / nbuckets);
11054           for (i = 1; i <= maxlength; ++i)
11055             {
11056               nzero_counts += counts[i] * i;
11057               printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
11058                       i, counts[i], (counts[i] * 100.0) / nbuckets,
11059                       (nzero_counts * 100.0) / nsyms);
11060             }
11061         }
11062
11063       free (counts);
11064       free (lengths);
11065     }
11066
11067   if (buckets != NULL)
11068     {
11069       free (buckets);
11070       free (chains);
11071     }
11072
11073   if (do_histogram && gnubuckets != NULL)
11074     {
11075       unsigned long * lengths;
11076       unsigned long * counts;
11077       unsigned long hn;
11078       unsigned long maxlength = 0;
11079       unsigned long nzero_counts = 0;
11080       unsigned long nsyms = 0;
11081
11082       printf (_("\nHistogram for `.gnu.hash' bucket list length (total of %lu buckets):\n"),
11083               (unsigned long) ngnubuckets);
11084
11085       lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
11086       if (lengths == NULL)
11087         {
11088           error (_("Out of memory allocating space for gnu histogram buckets\n"));
11089           return 0;
11090         }
11091
11092       printf (_(" Length  Number     %% of total  Coverage\n"));
11093
11094       for (hn = 0; hn < ngnubuckets; ++hn)
11095         if (gnubuckets[hn] != 0)
11096           {
11097             bfd_vma off, length = 1;
11098
11099             for (off = gnubuckets[hn] - gnusymidx;
11100                  /* PR 17531 file: 010-77222-0.004.  */
11101                  off < ngnuchains && (gnuchains[off] & 1) == 0;
11102                  ++off)
11103               ++length;
11104             lengths[hn] = length;
11105             if (length > maxlength)
11106               maxlength = length;
11107             nsyms += length;
11108           }
11109
11110       counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
11111       if (counts == NULL)
11112         {
11113           free (lengths);
11114           error (_("Out of memory allocating space for gnu histogram counts\n"));
11115           return 0;
11116         }
11117
11118       for (hn = 0; hn < ngnubuckets; ++hn)
11119         ++counts[lengths[hn]];
11120
11121       if (ngnubuckets > 0)
11122         {
11123           unsigned long j;
11124           printf ("      0  %-10lu (%5.1f%%)\n",
11125                   counts[0], (counts[0] * 100.0) / ngnubuckets);
11126           for (j = 1; j <= maxlength; ++j)
11127             {
11128               nzero_counts += counts[j] * j;
11129               printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
11130                       j, counts[j], (counts[j] * 100.0) / ngnubuckets,
11131                       (nzero_counts * 100.0) / nsyms);
11132             }
11133         }
11134
11135       free (counts);
11136       free (lengths);
11137       free (gnubuckets);
11138       free (gnuchains);
11139     }
11140
11141   return 1;
11142 }
11143
11144 static int
11145 process_syminfo (FILE * file ATTRIBUTE_UNUSED)
11146 {
11147   unsigned int i;
11148
11149   if (dynamic_syminfo == NULL
11150       || !do_dynamic)
11151     /* No syminfo, this is ok.  */
11152     return 1;
11153
11154   /* There better should be a dynamic symbol section.  */
11155   if (dynamic_symbols == NULL || dynamic_strings == NULL)
11156     return 0;
11157
11158   if (dynamic_addr)
11159     printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
11160             dynamic_syminfo_offset, dynamic_syminfo_nent);
11161
11162   printf (_(" Num: Name                           BoundTo     Flags\n"));
11163   for (i = 0; i < dynamic_syminfo_nent; ++i)
11164     {
11165       unsigned short int flags = dynamic_syminfo[i].si_flags;
11166
11167       printf ("%4d: ", i);
11168       if (i >= num_dynamic_syms)
11169         printf (_("<corrupt index>"));
11170       else if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
11171         print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
11172       else
11173         printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
11174       putchar (' ');
11175
11176       switch (dynamic_syminfo[i].si_boundto)
11177         {
11178         case SYMINFO_BT_SELF:
11179           fputs ("SELF       ", stdout);
11180           break;
11181         case SYMINFO_BT_PARENT:
11182           fputs ("PARENT     ", stdout);
11183           break;
11184         default:
11185           if (dynamic_syminfo[i].si_boundto > 0
11186               && dynamic_syminfo[i].si_boundto < dynamic_nent
11187               && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
11188             {
11189               print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
11190               putchar (' ' );
11191             }
11192           else
11193             printf ("%-10d ", dynamic_syminfo[i].si_boundto);
11194           break;
11195         }
11196
11197       if (flags & SYMINFO_FLG_DIRECT)
11198         printf (" DIRECT");
11199       if (flags & SYMINFO_FLG_PASSTHRU)
11200         printf (" PASSTHRU");
11201       if (flags & SYMINFO_FLG_COPY)
11202         printf (" COPY");
11203       if (flags & SYMINFO_FLG_LAZYLOAD)
11204         printf (" LAZYLOAD");
11205
11206       puts ("");
11207     }
11208
11209   return 1;
11210 }
11211
11212 /* Check to see if the given reloc needs to be handled in a target specific
11213    manner.  If so then process the reloc and return TRUE otherwise return
11214    FALSE.  */
11215
11216 static bfd_boolean
11217 target_specific_reloc_handling (Elf_Internal_Rela * reloc,
11218                                 unsigned char *     start,
11219                                 Elf_Internal_Sym *  symtab)
11220 {
11221   unsigned int reloc_type = get_reloc_type (reloc->r_info);
11222
11223   switch (elf_header.e_machine)
11224     {
11225     case EM_MSP430:
11226     case EM_MSP430_OLD:
11227       {
11228         static Elf_Internal_Sym * saved_sym = NULL;
11229
11230         switch (reloc_type)
11231           {
11232           case 10: /* R_MSP430_SYM_DIFF */
11233             if (uses_msp430x_relocs ())
11234               break;
11235           case 21: /* R_MSP430X_SYM_DIFF */
11236             saved_sym = symtab + get_reloc_symindex (reloc->r_info);
11237             return TRUE;
11238
11239           case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
11240           case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
11241             goto handle_sym_diff;
11242
11243           case 5: /* R_MSP430_16_BYTE */
11244           case 9: /* R_MSP430_8 */
11245             if (uses_msp430x_relocs ())
11246               break;
11247             goto handle_sym_diff;
11248
11249           case 2: /* R_MSP430_ABS16 */
11250           case 15: /* R_MSP430X_ABS16 */
11251             if (! uses_msp430x_relocs ())
11252               break;
11253             goto handle_sym_diff;
11254
11255           handle_sym_diff:
11256             if (saved_sym != NULL)
11257               {
11258                 bfd_vma value;
11259
11260                 value = reloc->r_addend
11261                   + (symtab[get_reloc_symindex (reloc->r_info)].st_value
11262                      - saved_sym->st_value);
11263
11264                 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
11265
11266                 saved_sym = NULL;
11267                 return TRUE;
11268               }
11269             break;
11270
11271           default:
11272             if (saved_sym != NULL)
11273               error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc\n"));
11274             break;
11275           }
11276         break;
11277       }
11278
11279     case EM_MN10300:
11280     case EM_CYGNUS_MN10300:
11281       {
11282         static Elf_Internal_Sym * saved_sym = NULL;
11283
11284         switch (reloc_type)
11285           {
11286           case 34: /* R_MN10300_ALIGN */
11287             return TRUE;
11288           case 33: /* R_MN10300_SYM_DIFF */
11289             saved_sym = symtab + get_reloc_symindex (reloc->r_info);
11290             return TRUE;
11291           case 1: /* R_MN10300_32 */
11292           case 2: /* R_MN10300_16 */
11293             if (saved_sym != NULL)
11294               {
11295                 bfd_vma value;
11296
11297                 value = reloc->r_addend
11298                   + (symtab[get_reloc_symindex (reloc->r_info)].st_value
11299                      - saved_sym->st_value);
11300
11301                 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
11302
11303                 saved_sym = NULL;
11304                 return TRUE;
11305               }
11306             break;
11307           default:
11308             if (saved_sym != NULL)
11309               error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc\n"));
11310             break;
11311           }
11312         break;
11313       }
11314
11315     case EM_RL78:
11316       {
11317         static bfd_vma saved_sym1 = 0;
11318         static bfd_vma saved_sym2 = 0;
11319         static bfd_vma value;
11320
11321         switch (reloc_type)
11322           {
11323           case 0x80: /* R_RL78_SYM.  */
11324             saved_sym1 = saved_sym2;
11325             saved_sym2 = symtab[get_reloc_symindex (reloc->r_info)].st_value;
11326             saved_sym2 += reloc->r_addend;
11327             return TRUE;
11328
11329           case 0x83: /* R_RL78_OPsub.  */
11330             value = saved_sym1 - saved_sym2;
11331             saved_sym2 = saved_sym1 = 0;
11332             return TRUE;
11333             break;
11334
11335           case 0x41: /* R_RL78_ABS32.  */
11336             byte_put (start + reloc->r_offset, value, 4);
11337             value = 0;
11338             return TRUE;
11339
11340           case 0x43: /* R_RL78_ABS16.  */
11341             byte_put (start + reloc->r_offset, value, 2);
11342             value = 0;
11343             return TRUE;
11344
11345           default:
11346             break;
11347           }
11348         break;
11349       }
11350     }
11351
11352   return FALSE;
11353 }
11354
11355 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
11356    DWARF debug sections.  This is a target specific test.  Note - we do not
11357    go through the whole including-target-headers-multiple-times route, (as
11358    we have already done with <elf/h8.h>) because this would become very
11359    messy and even then this function would have to contain target specific
11360    information (the names of the relocs instead of their numeric values).
11361    FIXME: This is not the correct way to solve this problem.  The proper way
11362    is to have target specific reloc sizing and typing functions created by
11363    the reloc-macros.h header, in the same way that it already creates the
11364    reloc naming functions.  */
11365
11366 static bfd_boolean
11367 is_32bit_abs_reloc (unsigned int reloc_type)
11368 {
11369   switch (elf_header.e_machine)
11370     {
11371     case EM_386:
11372     case EM_IAMCU:
11373       return reloc_type == 1; /* R_386_32.  */
11374     case EM_68K:
11375       return reloc_type == 1; /* R_68K_32.  */
11376     case EM_860:
11377       return reloc_type == 1; /* R_860_32.  */
11378     case EM_960:
11379       return reloc_type == 2; /* R_960_32.  */
11380     case EM_AARCH64:
11381       return reloc_type == 258; /* R_AARCH64_ABS32 */
11382     case EM_ALPHA:
11383       return reloc_type == 1; /* R_ALPHA_REFLONG.  */
11384     case EM_ARC:
11385       return reloc_type == 1; /* R_ARC_32.  */
11386     case EM_ARC_COMPACT:
11387     case EM_ARC_COMPACT2:
11388       return reloc_type == 4; /* R_ARC_32.  */
11389     case EM_ARM:
11390       return reloc_type == 2; /* R_ARM_ABS32 */
11391     case EM_AVR_OLD:
11392     case EM_AVR:
11393       return reloc_type == 1;
11394     case EM_ADAPTEVA_EPIPHANY:
11395       return reloc_type == 3;
11396     case EM_BLACKFIN:
11397       return reloc_type == 0x12; /* R_byte4_data.  */
11398     case EM_CRIS:
11399       return reloc_type == 3; /* R_CRIS_32.  */
11400     case EM_CR16:
11401       return reloc_type == 3; /* R_CR16_NUM32.  */
11402     case EM_CRX:
11403       return reloc_type == 15; /* R_CRX_NUM32.  */
11404     case EM_CYGNUS_FRV:
11405       return reloc_type == 1;
11406     case EM_CYGNUS_D10V:
11407     case EM_D10V:
11408       return reloc_type == 6; /* R_D10V_32.  */
11409     case EM_CYGNUS_D30V:
11410     case EM_D30V:
11411       return reloc_type == 12; /* R_D30V_32_NORMAL.  */
11412     case EM_DLX:
11413       return reloc_type == 3; /* R_DLX_RELOC_32.  */
11414     case EM_CYGNUS_FR30:
11415     case EM_FR30:
11416       return reloc_type == 3; /* R_FR30_32.  */
11417     case EM_FT32:
11418       return reloc_type == 1; /* R_FT32_32.  */
11419     case EM_H8S:
11420     case EM_H8_300:
11421     case EM_H8_300H:
11422       return reloc_type == 1; /* R_H8_DIR32.  */
11423     case EM_IA_64:
11424       return reloc_type == 0x65 /* R_IA64_SECREL32LSB.  */
11425         || reloc_type == 0x25;  /* R_IA64_DIR32LSB.  */
11426     case EM_IP2K_OLD:
11427     case EM_IP2K:
11428       return reloc_type == 2; /* R_IP2K_32.  */
11429     case EM_IQ2000:
11430       return reloc_type == 2; /* R_IQ2000_32.  */
11431     case EM_LATTICEMICO32:
11432       return reloc_type == 3; /* R_LM32_32.  */
11433     case EM_M32C_OLD:
11434     case EM_M32C:
11435       return reloc_type == 3; /* R_M32C_32.  */
11436     case EM_M32R:
11437       return reloc_type == 34; /* R_M32R_32_RELA.  */
11438     case EM_68HC11:
11439     case EM_68HC12:
11440       return reloc_type == 6; /* R_M68HC11_32.  */
11441     case EM_MCORE:
11442       return reloc_type == 1; /* R_MCORE_ADDR32.  */
11443     case EM_CYGNUS_MEP:
11444       return reloc_type == 4; /* R_MEP_32.  */
11445     case EM_METAG:
11446       return reloc_type == 2; /* R_METAG_ADDR32.  */
11447     case EM_MICROBLAZE:
11448       return reloc_type == 1; /* R_MICROBLAZE_32.  */
11449     case EM_MIPS:
11450       return reloc_type == 2; /* R_MIPS_32.  */
11451     case EM_MMIX:
11452       return reloc_type == 4; /* R_MMIX_32.  */
11453     case EM_CYGNUS_MN10200:
11454     case EM_MN10200:
11455       return reloc_type == 1; /* R_MN10200_32.  */
11456     case EM_CYGNUS_MN10300:
11457     case EM_MN10300:
11458       return reloc_type == 1; /* R_MN10300_32.  */
11459     case EM_MOXIE:
11460       return reloc_type == 1; /* R_MOXIE_32.  */
11461     case EM_MSP430_OLD:
11462     case EM_MSP430:
11463       return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32.  */
11464     case EM_MT:
11465       return reloc_type == 2; /* R_MT_32.  */
11466     case EM_NDS32:
11467       return reloc_type == 20; /* R_NDS32_RELA.  */
11468     case EM_ALTERA_NIOS2:
11469       return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32.  */
11470     case EM_NIOS32:
11471       return reloc_type == 1; /* R_NIOS_32.  */
11472     case EM_OR1K:
11473       return reloc_type == 1; /* R_OR1K_32.  */
11474     case EM_PARISC:
11475       return (reloc_type == 1 /* R_PARISC_DIR32.  */
11476               || reloc_type == 41); /* R_PARISC_SECREL32.  */
11477     case EM_PJ:
11478     case EM_PJ_OLD:
11479       return reloc_type == 1; /* R_PJ_DATA_DIR32.  */
11480     case EM_PPC64:
11481       return reloc_type == 1; /* R_PPC64_ADDR32.  */
11482     case EM_PPC:
11483       return reloc_type == 1; /* R_PPC_ADDR32.  */
11484     case EM_RL78:
11485       return reloc_type == 1; /* R_RL78_DIR32.  */
11486     case EM_RX:
11487       return reloc_type == 1; /* R_RX_DIR32.  */
11488     case EM_S370:
11489       return reloc_type == 1; /* R_I370_ADDR31.  */
11490     case EM_S390_OLD:
11491     case EM_S390:
11492       return reloc_type == 4; /* R_S390_32.  */
11493     case EM_SCORE:
11494       return reloc_type == 8; /* R_SCORE_ABS32.  */
11495     case EM_SH:
11496       return reloc_type == 1; /* R_SH_DIR32.  */
11497     case EM_SPARC32PLUS:
11498     case EM_SPARCV9:
11499     case EM_SPARC:
11500       return reloc_type == 3 /* R_SPARC_32.  */
11501         || reloc_type == 23; /* R_SPARC_UA32.  */
11502     case EM_SPU:
11503       return reloc_type == 6; /* R_SPU_ADDR32 */
11504     case EM_TI_C6000:
11505       return reloc_type == 1; /* R_C6000_ABS32.  */
11506     case EM_TILEGX:
11507       return reloc_type == 2; /* R_TILEGX_32.  */
11508     case EM_TILEPRO:
11509       return reloc_type == 1; /* R_TILEPRO_32.  */
11510     case EM_CYGNUS_V850:
11511     case EM_V850:
11512       return reloc_type == 6; /* R_V850_ABS32.  */
11513     case EM_V800:
11514       return reloc_type == 0x33; /* R_V810_WORD.  */
11515     case EM_VAX:
11516       return reloc_type == 1; /* R_VAX_32.  */
11517     case EM_VISIUM:
11518       return reloc_type == 3;  /* R_VISIUM_32. */
11519     case EM_X86_64:
11520     case EM_L1OM:
11521     case EM_K1OM:
11522       return reloc_type == 10; /* R_X86_64_32.  */
11523     case EM_XC16X:
11524     case EM_C166:
11525       return reloc_type == 3; /* R_XC16C_ABS_32.  */
11526     case EM_XGATE:
11527       return reloc_type == 4; /* R_XGATE_32.  */
11528     case EM_XSTORMY16:
11529       return reloc_type == 1; /* R_XSTROMY16_32.  */
11530     case EM_XTENSA_OLD:
11531     case EM_XTENSA:
11532       return reloc_type == 1; /* R_XTENSA_32.  */
11533     default:
11534       {
11535         static unsigned int prev_warn = 0;
11536
11537         /* Avoid repeating the same warning multiple times.  */
11538         if (prev_warn != elf_header.e_machine)
11539           error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
11540                  elf_header.e_machine);
11541         prev_warn = elf_header.e_machine;
11542         return FALSE;
11543       }
11544     }
11545 }
11546
11547 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11548    a 32-bit pc-relative RELA relocation used in DWARF debug sections.  */
11549
11550 static bfd_boolean
11551 is_32bit_pcrel_reloc (unsigned int reloc_type)
11552 {
11553   switch (elf_header.e_machine)
11554     {
11555     case EM_386:
11556     case EM_IAMCU:
11557       return reloc_type == 2;  /* R_386_PC32.  */
11558     case EM_68K:
11559       return reloc_type == 4;  /* R_68K_PC32.  */
11560     case EM_AARCH64:
11561       return reloc_type == 261; /* R_AARCH64_PREL32 */
11562     case EM_ADAPTEVA_EPIPHANY:
11563       return reloc_type == 6;
11564     case EM_ALPHA:
11565       return reloc_type == 10; /* R_ALPHA_SREL32.  */
11566     case EM_ARC_COMPACT:
11567     case EM_ARC_COMPACT2:
11568       return reloc_type == 49; /* R_ARC_32_PCREL.  */
11569     case EM_ARM:
11570       return reloc_type == 3;  /* R_ARM_REL32 */
11571     case EM_MICROBLAZE:
11572       return reloc_type == 2;  /* R_MICROBLAZE_32_PCREL.  */
11573     case EM_OR1K:
11574       return reloc_type == 9; /* R_OR1K_32_PCREL.  */
11575     case EM_PARISC:
11576       return reloc_type == 9;  /* R_PARISC_PCREL32.  */
11577     case EM_PPC:
11578       return reloc_type == 26; /* R_PPC_REL32.  */
11579     case EM_PPC64:
11580       return reloc_type == 26; /* R_PPC64_REL32.  */
11581     case EM_S390_OLD:
11582     case EM_S390:
11583       return reloc_type == 5;  /* R_390_PC32.  */
11584     case EM_SH:
11585       return reloc_type == 2;  /* R_SH_REL32.  */
11586     case EM_SPARC32PLUS:
11587     case EM_SPARCV9:
11588     case EM_SPARC:
11589       return reloc_type == 6;  /* R_SPARC_DISP32.  */
11590     case EM_SPU:
11591       return reloc_type == 13; /* R_SPU_REL32.  */
11592     case EM_TILEGX:
11593       return reloc_type == 6; /* R_TILEGX_32_PCREL.  */
11594     case EM_TILEPRO:
11595       return reloc_type == 4; /* R_TILEPRO_32_PCREL.  */
11596     case EM_VISIUM:
11597       return reloc_type == 6;  /* R_VISIUM_32_PCREL */
11598     case EM_X86_64:
11599     case EM_L1OM:
11600     case EM_K1OM:
11601       return reloc_type == 2;  /* R_X86_64_PC32.  */
11602     case EM_XTENSA_OLD:
11603     case EM_XTENSA:
11604       return reloc_type == 14; /* R_XTENSA_32_PCREL.  */
11605     default:
11606       /* Do not abort or issue an error message here.  Not all targets use
11607          pc-relative 32-bit relocs in their DWARF debug information and we
11608          have already tested for target coverage in is_32bit_abs_reloc.  A
11609          more helpful warning message will be generated by apply_relocations
11610          anyway, so just return.  */
11611       return FALSE;
11612     }
11613 }
11614
11615 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11616    a 64-bit absolute RELA relocation used in DWARF debug sections.  */
11617
11618 static bfd_boolean
11619 is_64bit_abs_reloc (unsigned int reloc_type)
11620 {
11621   switch (elf_header.e_machine)
11622     {
11623     case EM_AARCH64:
11624       return reloc_type == 257; /* R_AARCH64_ABS64.  */
11625     case EM_ALPHA:
11626       return reloc_type == 2; /* R_ALPHA_REFQUAD.  */
11627     case EM_IA_64:
11628       return reloc_type == 0x27; /* R_IA64_DIR64LSB.  */
11629     case EM_PARISC:
11630       return reloc_type == 80; /* R_PARISC_DIR64.  */
11631     case EM_PPC64:
11632       return reloc_type == 38; /* R_PPC64_ADDR64.  */
11633     case EM_SPARC32PLUS:
11634     case EM_SPARCV9:
11635     case EM_SPARC:
11636       return reloc_type == 54; /* R_SPARC_UA64.  */
11637     case EM_X86_64:
11638     case EM_L1OM:
11639     case EM_K1OM:
11640       return reloc_type == 1; /* R_X86_64_64.  */
11641     case EM_S390_OLD:
11642     case EM_S390:
11643       return reloc_type == 22;  /* R_S390_64.  */
11644     case EM_TILEGX:
11645       return reloc_type == 1; /* R_TILEGX_64.  */
11646     case EM_MIPS:
11647       return reloc_type == 18;  /* R_MIPS_64.  */
11648     default:
11649       return FALSE;
11650     }
11651 }
11652
11653 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
11654    a 64-bit pc-relative RELA relocation used in DWARF debug sections.  */
11655
11656 static bfd_boolean
11657 is_64bit_pcrel_reloc (unsigned int reloc_type)
11658 {
11659   switch (elf_header.e_machine)
11660     {
11661     case EM_AARCH64:
11662       return reloc_type == 260; /* R_AARCH64_PREL64.  */
11663     case EM_ALPHA:
11664       return reloc_type == 11; /* R_ALPHA_SREL64.  */
11665     case EM_IA_64:
11666       return reloc_type == 0x4f; /* R_IA64_PCREL64LSB.  */
11667     case EM_PARISC:
11668       return reloc_type == 72; /* R_PARISC_PCREL64.  */
11669     case EM_PPC64:
11670       return reloc_type == 44; /* R_PPC64_REL64.  */
11671     case EM_SPARC32PLUS:
11672     case EM_SPARCV9:
11673     case EM_SPARC:
11674       return reloc_type == 46; /* R_SPARC_DISP64.  */
11675     case EM_X86_64:
11676     case EM_L1OM:
11677     case EM_K1OM:
11678       return reloc_type == 24; /* R_X86_64_PC64.  */
11679     case EM_S390_OLD:
11680     case EM_S390:
11681       return reloc_type == 23;  /* R_S390_PC64.  */
11682     case EM_TILEGX:
11683       return reloc_type == 5;  /* R_TILEGX_64_PCREL.  */
11684     default:
11685       return FALSE;
11686     }
11687 }
11688
11689 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11690    a 24-bit absolute RELA relocation used in DWARF debug sections.  */
11691
11692 static bfd_boolean
11693 is_24bit_abs_reloc (unsigned int reloc_type)
11694 {
11695   switch (elf_header.e_machine)
11696     {
11697     case EM_CYGNUS_MN10200:
11698     case EM_MN10200:
11699       return reloc_type == 4; /* R_MN10200_24.  */
11700     default:
11701       return FALSE;
11702     }
11703 }
11704
11705 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11706    a 16-bit absolute RELA relocation used in DWARF debug sections.  */
11707
11708 static bfd_boolean
11709 is_16bit_abs_reloc (unsigned int reloc_type)
11710 {
11711   switch (elf_header.e_machine)
11712     {
11713     case EM_ARC:
11714     case EM_ARC_COMPACT:
11715     case EM_ARC_COMPACT2:
11716       return reloc_type == 2; /* R_ARC_16.  */
11717     case EM_AVR_OLD:
11718     case EM_AVR:
11719       return reloc_type == 4; /* R_AVR_16.  */
11720     case EM_ADAPTEVA_EPIPHANY:
11721       return reloc_type == 5;
11722     case EM_CYGNUS_D10V:
11723     case EM_D10V:
11724       return reloc_type == 3; /* R_D10V_16.  */
11725     case EM_H8S:
11726     case EM_H8_300:
11727     case EM_H8_300H:
11728       return reloc_type == R_H8_DIR16;
11729     case EM_IP2K_OLD:
11730     case EM_IP2K:
11731       return reloc_type == 1; /* R_IP2K_16.  */
11732     case EM_M32C_OLD:
11733     case EM_M32C:
11734       return reloc_type == 1; /* R_M32C_16 */
11735     case EM_MSP430:
11736       if (uses_msp430x_relocs ())
11737         return reloc_type == 2; /* R_MSP430_ABS16.  */
11738     case EM_MSP430_OLD:
11739       return reloc_type == 5; /* R_MSP430_16_BYTE.  */
11740     case EM_NDS32:
11741       return reloc_type == 19; /* R_NDS32_RELA.  */
11742     case EM_ALTERA_NIOS2:
11743       return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16.  */
11744     case EM_NIOS32:
11745       return reloc_type == 9; /* R_NIOS_16.  */
11746     case EM_OR1K:
11747       return reloc_type == 2; /* R_OR1K_16.  */
11748     case EM_TI_C6000:
11749       return reloc_type == 2; /* R_C6000_ABS16.  */
11750     case EM_XC16X:
11751     case EM_C166:
11752       return reloc_type == 2; /* R_XC16C_ABS_16.  */
11753     case EM_CYGNUS_MN10200:
11754     case EM_MN10200:
11755       return reloc_type == 2; /* R_MN10200_16.  */
11756     case EM_CYGNUS_MN10300:
11757     case EM_MN10300:
11758       return reloc_type == 2; /* R_MN10300_16.  */
11759     case EM_VISIUM:
11760       return reloc_type == 2; /* R_VISIUM_16. */
11761     case EM_XGATE:
11762       return reloc_type == 3; /* R_XGATE_16.  */
11763     default:
11764       return FALSE;
11765     }
11766 }
11767
11768 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
11769    relocation entries (possibly formerly used for SHT_GROUP sections).  */
11770
11771 static bfd_boolean
11772 is_none_reloc (unsigned int reloc_type)
11773 {
11774   switch (elf_header.e_machine)
11775     {
11776     case EM_68K:     /* R_68K_NONE.  */
11777     case EM_386:     /* R_386_NONE.  */
11778     case EM_SPARC32PLUS:
11779     case EM_SPARCV9:
11780     case EM_SPARC:   /* R_SPARC_NONE.  */
11781     case EM_MIPS:    /* R_MIPS_NONE.  */
11782     case EM_PARISC:  /* R_PARISC_NONE.  */
11783     case EM_ALPHA:   /* R_ALPHA_NONE.  */
11784     case EM_ADAPTEVA_EPIPHANY:
11785     case EM_PPC:     /* R_PPC_NONE.  */
11786     case EM_PPC64:   /* R_PPC64_NONE.  */
11787     case EM_ARC:     /* R_ARC_NONE.  */
11788     case EM_ARC_COMPACT: /* R_ARC_NONE.  */
11789     case EM_ARC_COMPACT2: /* R_ARC_NONE.  */
11790     case EM_ARM:     /* R_ARM_NONE.  */
11791     case EM_IA_64:   /* R_IA64_NONE.  */
11792     case EM_SH:      /* R_SH_NONE.  */
11793     case EM_S390_OLD:
11794     case EM_S390:    /* R_390_NONE.  */
11795     case EM_CRIS:    /* R_CRIS_NONE.  */
11796     case EM_X86_64:  /* R_X86_64_NONE.  */
11797     case EM_L1OM:    /* R_X86_64_NONE.  */
11798     case EM_K1OM:    /* R_X86_64_NONE.  */
11799     case EM_MN10300: /* R_MN10300_NONE.  */
11800     case EM_FT32:    /* R_FT32_NONE.  */
11801     case EM_MOXIE:   /* R_MOXIE_NONE.  */
11802     case EM_M32R:    /* R_M32R_NONE.  */
11803     case EM_TI_C6000:/* R_C6000_NONE.  */
11804     case EM_TILEGX:  /* R_TILEGX_NONE.  */
11805     case EM_TILEPRO: /* R_TILEPRO_NONE.  */
11806     case EM_XC16X:
11807     case EM_C166:    /* R_XC16X_NONE.  */
11808     case EM_ALTERA_NIOS2: /* R_NIOS2_NONE.  */
11809     case EM_NIOS32:  /* R_NIOS_NONE.  */
11810     case EM_OR1K:    /* R_OR1K_NONE. */
11811       return reloc_type == 0;
11812     case EM_AARCH64:
11813       return reloc_type == 0 || reloc_type == 256;
11814     case EM_NDS32:
11815       return (reloc_type == 0       /* R_XTENSA_NONE.  */
11816               || reloc_type == 204  /* R_NDS32_DIFF8.  */
11817               || reloc_type == 205  /* R_NDS32_DIFF16.  */
11818               || reloc_type == 206  /* R_NDS32_DIFF32.  */
11819               || reloc_type == 207  /* R_NDS32_ULEB128.  */);
11820     case EM_XTENSA_OLD:
11821     case EM_XTENSA:
11822       return (reloc_type == 0      /* R_XTENSA_NONE.  */
11823               || reloc_type == 17  /* R_XTENSA_DIFF8.  */
11824               || reloc_type == 18  /* R_XTENSA_DIFF16.  */
11825               || reloc_type == 19  /* R_XTENSA_DIFF32.  */);
11826     case EM_METAG:
11827       return reloc_type == 3; /* R_METAG_NONE.  */
11828     }
11829   return FALSE;
11830 }
11831
11832 /* Returns TRUE if there is a relocation against
11833    section NAME at OFFSET bytes.  */
11834
11835 bfd_boolean
11836 reloc_at (struct dwarf_section * dsec, dwarf_vma offset)
11837 {
11838   Elf_Internal_Rela * relocs;
11839   Elf_Internal_Rela * rp;
11840
11841   if (dsec == NULL || dsec->reloc_info == NULL)
11842     return FALSE;
11843
11844   relocs = (Elf_Internal_Rela *) dsec->reloc_info;
11845
11846   for (rp = relocs; rp < relocs + dsec->num_relocs; ++rp)
11847     if (rp->r_offset == offset)
11848       return TRUE;
11849
11850    return FALSE;
11851 }
11852
11853 /* Apply relocations to a section.
11854    Note: So far support has been added only for those relocations
11855    which can be found in debug sections.
11856    If RELOCS_RETURN is non-NULL then returns in it a pointer to the
11857    loaded relocs.  It is then the caller's responsibility to free them.
11858    FIXME: Add support for more relocations ?  */
11859
11860 static void
11861 apply_relocations (void *                     file,
11862                    const Elf_Internal_Shdr *  section,
11863                    unsigned char *            start,
11864                    bfd_size_type              size,
11865                    void **                     relocs_return,
11866                    unsigned long *            num_relocs_return)
11867 {
11868   Elf_Internal_Shdr * relsec;
11869   unsigned char * end = start + size;
11870
11871   if (relocs_return != NULL)
11872     {
11873       * (Elf_Internal_Rela **) relocs_return = NULL;
11874       * num_relocs_return = 0;
11875     }
11876
11877   if (elf_header.e_type != ET_REL)
11878     return;
11879
11880   /* Find the reloc section associated with the section.  */
11881   for (relsec = section_headers;
11882        relsec < section_headers + elf_header.e_shnum;
11883        ++relsec)
11884     {
11885       bfd_boolean is_rela;
11886       unsigned long num_relocs;
11887       Elf_Internal_Rela * relocs;
11888       Elf_Internal_Rela * rp;
11889       Elf_Internal_Shdr * symsec;
11890       Elf_Internal_Sym * symtab;
11891       unsigned long num_syms;
11892       Elf_Internal_Sym * sym;
11893
11894       if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
11895           || relsec->sh_info >= elf_header.e_shnum
11896           || section_headers + relsec->sh_info != section
11897           || relsec->sh_size == 0
11898           || relsec->sh_link >= elf_header.e_shnum)
11899         continue;
11900
11901       is_rela = relsec->sh_type == SHT_RELA;
11902
11903       if (is_rela)
11904         {
11905           if (!slurp_rela_relocs ((FILE *) file, relsec->sh_offset,
11906                                   relsec->sh_size, & relocs, & num_relocs))
11907             return;
11908         }
11909       else
11910         {
11911           if (!slurp_rel_relocs ((FILE *) file, relsec->sh_offset,
11912                                  relsec->sh_size, & relocs, & num_relocs))
11913             return;
11914         }
11915
11916       /* SH uses RELA but uses in place value instead of the addend field.  */
11917       if (elf_header.e_machine == EM_SH)
11918         is_rela = FALSE;
11919
11920       symsec = section_headers + relsec->sh_link;
11921       symtab = GET_ELF_SYMBOLS ((FILE *) file, symsec, & num_syms);
11922
11923       for (rp = relocs; rp < relocs + num_relocs; ++rp)
11924         {
11925           bfd_vma         addend;
11926           unsigned int    reloc_type;
11927           unsigned int    reloc_size;
11928           unsigned char * rloc;
11929           unsigned long   sym_index;
11930
11931           reloc_type = get_reloc_type (rp->r_info);
11932
11933           if (target_specific_reloc_handling (rp, start, symtab))
11934             continue;
11935           else if (is_none_reloc (reloc_type))
11936             continue;
11937           else if (is_32bit_abs_reloc (reloc_type)
11938                    || is_32bit_pcrel_reloc (reloc_type))
11939             reloc_size = 4;
11940           else if (is_64bit_abs_reloc (reloc_type)
11941                    || is_64bit_pcrel_reloc (reloc_type))
11942             reloc_size = 8;
11943           else if (is_24bit_abs_reloc (reloc_type))
11944             reloc_size = 3;
11945           else if (is_16bit_abs_reloc (reloc_type))
11946             reloc_size = 2;
11947           else
11948             {
11949               static unsigned int prev_reloc = 0;
11950               if (reloc_type != prev_reloc)
11951                 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
11952                       reloc_type, printable_section_name (section));
11953               prev_reloc = reloc_type;
11954               continue;
11955             }
11956
11957           rloc = start + rp->r_offset;
11958           if ((rloc + reloc_size) > end || (rloc < start))
11959             {
11960               warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
11961                     (unsigned long) rp->r_offset,
11962                     printable_section_name (section));
11963               continue;
11964             }
11965
11966           sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
11967           if (sym_index >= num_syms)
11968             {
11969               warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
11970                     sym_index, printable_section_name (section));
11971               continue;
11972             }
11973           sym = symtab + sym_index;
11974
11975           /* If the reloc has a symbol associated with it,
11976              make sure that it is of an appropriate type.
11977
11978              Relocations against symbols without type can happen.
11979              Gcc -feliminate-dwarf2-dups may generate symbols
11980              without type for debug info.
11981
11982              Icc generates relocations against function symbols
11983              instead of local labels.
11984
11985              Relocations against object symbols can happen, eg when
11986              referencing a global array.  For an example of this see
11987              the _clz.o binary in libgcc.a.  */
11988           if (sym != symtab
11989               && ELF_ST_TYPE (sym->st_info) != STT_COMMON
11990               && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
11991             {
11992               warn (_("skipping unexpected symbol type %s in %ld'th relocation in section %s\n"),
11993                     get_symbol_type (ELF_ST_TYPE (sym->st_info)),
11994                     (long int)(rp - relocs),
11995                     printable_section_name (relsec));
11996               continue;
11997             }
11998
11999           addend = 0;
12000           if (is_rela)
12001             addend += rp->r_addend;
12002           /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
12003              partial_inplace.  */
12004           if (!is_rela
12005               || (elf_header.e_machine == EM_XTENSA
12006                   && reloc_type == 1)
12007               || ((elf_header.e_machine == EM_PJ
12008                    || elf_header.e_machine == EM_PJ_OLD)
12009                   && reloc_type == 1)
12010               || ((elf_header.e_machine == EM_D30V
12011                    || elf_header.e_machine == EM_CYGNUS_D30V)
12012                   && reloc_type == 12))
12013             addend += byte_get (rloc, reloc_size);
12014
12015           if (is_32bit_pcrel_reloc (reloc_type)
12016               || is_64bit_pcrel_reloc (reloc_type))
12017             {
12018               /* On HPPA, all pc-relative relocations are biased by 8.  */
12019               if (elf_header.e_machine == EM_PARISC)
12020                 addend -= 8;
12021               byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
12022                         reloc_size);
12023             }
12024           else
12025             byte_put (rloc, addend + sym->st_value, reloc_size);
12026         }
12027
12028       free (symtab);
12029
12030       if (relocs_return)
12031         {
12032           * (Elf_Internal_Rela **) relocs_return = relocs;
12033           * num_relocs_return = num_relocs;
12034         }
12035       else
12036         free (relocs);
12037
12038       break;
12039     }
12040 }
12041
12042 #ifdef SUPPORT_DISASSEMBLY
12043 static int
12044 disassemble_section (Elf_Internal_Shdr * section, FILE * file)
12045 {
12046   printf (_("\nAssembly dump of section %s\n"), printable_section_name (section));
12047
12048   /* FIXME: XXX -- to be done --- XXX */
12049
12050   return 1;
12051 }
12052 #endif
12053
12054 /* Reads in the contents of SECTION from FILE, returning a pointer
12055    to a malloc'ed buffer or NULL if something went wrong.  */
12056
12057 static char *
12058 get_section_contents (Elf_Internal_Shdr * section, FILE * file)
12059 {
12060   bfd_size_type num_bytes;
12061
12062   num_bytes = section->sh_size;
12063
12064   if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
12065     {
12066       printf (_("\nSection '%s' has no data to dump.\n"),
12067               printable_section_name (section));
12068       return NULL;
12069     }
12070
12071   return  (char *) get_data (NULL, file, section->sh_offset, 1, num_bytes,
12072                              _("section contents"));
12073 }
12074
12075 /* Uncompresses a section that was compressed using zlib, in place.  */
12076
12077 static bfd_boolean
12078 uncompress_section_contents (unsigned char **buffer,
12079                              dwarf_size_type uncompressed_size,
12080                              dwarf_size_type *size)
12081 {
12082   dwarf_size_type compressed_size = *size;
12083   unsigned char * compressed_buffer = *buffer;
12084   unsigned char * uncompressed_buffer;
12085   z_stream strm;
12086   int rc;
12087
12088   /* It is possible the section consists of several compressed
12089      buffers concatenated together, so we uncompress in a loop.  */
12090   /* PR 18313: The state field in the z_stream structure is supposed
12091      to be invisible to the user (ie us), but some compilers will
12092      still complain about it being used without initialisation.  So
12093      we first zero the entire z_stream structure and then set the fields
12094      that we need.  */
12095   memset (& strm, 0, sizeof strm);
12096   strm.avail_in = compressed_size;
12097   strm.next_in = (Bytef *) compressed_buffer;
12098   strm.avail_out = uncompressed_size;
12099   uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
12100
12101   rc = inflateInit (& strm);
12102   while (strm.avail_in > 0)
12103     {
12104       if (rc != Z_OK)
12105         goto fail;
12106       strm.next_out = ((Bytef *) uncompressed_buffer
12107                        + (uncompressed_size - strm.avail_out));
12108       rc = inflate (&strm, Z_FINISH);
12109       if (rc != Z_STREAM_END)
12110         goto fail;
12111       rc = inflateReset (& strm);
12112     }
12113   rc = inflateEnd (& strm);
12114   if (rc != Z_OK
12115       || strm.avail_out != 0)
12116     goto fail;
12117
12118   *buffer = uncompressed_buffer;
12119   *size = uncompressed_size;
12120   return TRUE;
12121
12122  fail:
12123   free (uncompressed_buffer);
12124   /* Indicate decompression failure.  */
12125   *buffer = NULL;
12126   return FALSE;
12127 }
12128
12129 static void
12130 dump_section_as_strings (Elf_Internal_Shdr * section, FILE * file)
12131 {
12132   Elf_Internal_Shdr *  relsec;
12133   bfd_size_type        num_bytes;
12134   unsigned char *      data;
12135   unsigned char *      end;
12136   unsigned char *      real_start;
12137   unsigned char *      start;
12138   bfd_boolean          some_strings_shown;
12139
12140   real_start = start = (unsigned char *) get_section_contents (section,
12141                                                                file);
12142   if (start == NULL)
12143     return;
12144   num_bytes = section->sh_size;
12145
12146   printf (_("\nString dump of section '%s':\n"), printable_section_name (section));
12147
12148   if (decompress_dumps)
12149     {
12150       dwarf_size_type new_size = num_bytes;
12151       dwarf_size_type uncompressed_size = 0;
12152
12153       if ((section->sh_flags & SHF_COMPRESSED) != 0)
12154         {
12155           Elf_Internal_Chdr chdr;
12156           unsigned int compression_header_size
12157             = get_compression_header (& chdr, (unsigned char *) start);
12158
12159           if (chdr.ch_type != ELFCOMPRESS_ZLIB)
12160             {
12161               warn (_("section '%s' has unsupported compress type: %d\n"),
12162                     printable_section_name (section), chdr.ch_type);
12163               return;
12164             }
12165           else if (chdr.ch_addralign != section->sh_addralign)
12166             {
12167               warn (_("compressed section '%s' is corrupted\n"),
12168                     printable_section_name (section));
12169               return;
12170             }
12171           uncompressed_size = chdr.ch_size;
12172           start += compression_header_size;
12173           new_size -= compression_header_size;
12174         }
12175       else if (new_size > 12 && streq ((char *) start, "ZLIB"))
12176         {
12177           /* Read the zlib header.  In this case, it should be "ZLIB"
12178              followed by the uncompressed section size, 8 bytes in
12179              big-endian order.  */
12180           uncompressed_size = start[4]; uncompressed_size <<= 8;
12181           uncompressed_size += start[5]; uncompressed_size <<= 8;
12182           uncompressed_size += start[6]; uncompressed_size <<= 8;
12183           uncompressed_size += start[7]; uncompressed_size <<= 8;
12184           uncompressed_size += start[8]; uncompressed_size <<= 8;
12185           uncompressed_size += start[9]; uncompressed_size <<= 8;
12186           uncompressed_size += start[10]; uncompressed_size <<= 8;
12187           uncompressed_size += start[11];
12188           start += 12;
12189           new_size -= 12;
12190         }
12191
12192       if (uncompressed_size
12193           && uncompress_section_contents (& start,
12194                                           uncompressed_size, & new_size))
12195         num_bytes = new_size;
12196     }
12197
12198   /* If the section being dumped has relocations against it the user might
12199      be expecting these relocations to have been applied.  Check for this
12200      case and issue a warning message in order to avoid confusion.
12201      FIXME: Maybe we ought to have an option that dumps a section with
12202      relocs applied ?  */
12203   for (relsec = section_headers;
12204        relsec < section_headers + elf_header.e_shnum;
12205        ++relsec)
12206     {
12207       if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12208           || relsec->sh_info >= elf_header.e_shnum
12209           || section_headers + relsec->sh_info != section
12210           || relsec->sh_size == 0
12211           || relsec->sh_link >= elf_header.e_shnum)
12212         continue;
12213
12214       printf (_("  Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
12215       break;
12216     }
12217
12218   data = start;
12219   end  = start + num_bytes;
12220   some_strings_shown = FALSE;
12221
12222   while (data < end)
12223     {
12224       while (!ISPRINT (* data))
12225         if (++ data >= end)
12226           break;
12227
12228       if (data < end)
12229         {
12230           size_t maxlen = end - data;
12231
12232 #ifndef __MSVCRT__
12233           /* PR 11128: Use two separate invocations in order to work
12234              around bugs in the Solaris 8 implementation of printf.  */
12235           printf ("  [%6tx]  ", data - start);
12236 #else
12237           printf ("  [%6Ix]  ", (size_t) (data - start));
12238 #endif
12239           if (maxlen > 0)
12240             {
12241               print_symbol ((int) maxlen, (const char *) data);
12242               putchar ('\n');
12243               data += strnlen ((const char *) data, maxlen);
12244             }
12245           else
12246             {
12247               printf (_("<corrupt>\n"));
12248               data = end;
12249             }
12250           some_strings_shown = TRUE;
12251         }
12252     }
12253
12254   if (! some_strings_shown)
12255     printf (_("  No strings found in this section."));
12256
12257   free (real_start);
12258
12259   putchar ('\n');
12260 }
12261
12262 static void
12263 dump_section_as_bytes (Elf_Internal_Shdr * section,
12264                        FILE * file,
12265                        bfd_boolean relocate)
12266 {
12267   Elf_Internal_Shdr * relsec;
12268   bfd_size_type       bytes;
12269   bfd_size_type       section_size;
12270   bfd_vma             addr;
12271   unsigned char *     data;
12272   unsigned char *     real_start;
12273   unsigned char *     start;
12274
12275   real_start = start = (unsigned char *) get_section_contents (section, file);
12276   if (start == NULL)
12277     return;
12278   section_size = section->sh_size;
12279
12280   printf (_("\nHex dump of section '%s':\n"), printable_section_name (section));
12281
12282   if (decompress_dumps)
12283     {
12284       dwarf_size_type new_size = section_size;
12285       dwarf_size_type uncompressed_size = 0;
12286
12287       if ((section->sh_flags & SHF_COMPRESSED) != 0)
12288         {
12289           Elf_Internal_Chdr chdr;
12290           unsigned int compression_header_size
12291             = get_compression_header (& chdr, start);
12292
12293           if (chdr.ch_type != ELFCOMPRESS_ZLIB)
12294             {
12295               warn (_("section '%s' has unsupported compress type: %d\n"),
12296                     printable_section_name (section), chdr.ch_type);
12297               return;
12298             }
12299           else if (chdr.ch_addralign != section->sh_addralign)
12300             {
12301               warn (_("compressed section '%s' is corrupted\n"),
12302                     printable_section_name (section));
12303               return;
12304             }
12305           uncompressed_size = chdr.ch_size;
12306           start += compression_header_size;
12307           new_size -= compression_header_size;
12308         }
12309       else if (new_size > 12 && streq ((char *) start, "ZLIB"))
12310         {
12311           /* Read the zlib header.  In this case, it should be "ZLIB"
12312              followed by the uncompressed section size, 8 bytes in
12313              big-endian order.  */
12314           uncompressed_size = start[4]; uncompressed_size <<= 8;
12315           uncompressed_size += start[5]; uncompressed_size <<= 8;
12316           uncompressed_size += start[6]; uncompressed_size <<= 8;
12317           uncompressed_size += start[7]; uncompressed_size <<= 8;
12318           uncompressed_size += start[8]; uncompressed_size <<= 8;
12319           uncompressed_size += start[9]; uncompressed_size <<= 8;
12320           uncompressed_size += start[10]; uncompressed_size <<= 8;
12321           uncompressed_size += start[11];
12322           start += 12;
12323           new_size -= 12;
12324         }
12325
12326       if (uncompressed_size
12327           && uncompress_section_contents (& start, uncompressed_size,
12328                                           & new_size))
12329         section_size = new_size;
12330     }
12331
12332   if (relocate)
12333     {
12334       apply_relocations (file, section, start, section_size, NULL, NULL);
12335     }
12336   else
12337     {
12338       /* If the section being dumped has relocations against it the user might
12339          be expecting these relocations to have been applied.  Check for this
12340          case and issue a warning message in order to avoid confusion.
12341          FIXME: Maybe we ought to have an option that dumps a section with
12342          relocs applied ?  */
12343       for (relsec = section_headers;
12344            relsec < section_headers + elf_header.e_shnum;
12345            ++relsec)
12346         {
12347           if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12348               || relsec->sh_info >= elf_header.e_shnum
12349               || section_headers + relsec->sh_info != section
12350               || relsec->sh_size == 0
12351               || relsec->sh_link >= elf_header.e_shnum)
12352             continue;
12353
12354           printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
12355           break;
12356         }
12357     }
12358
12359   addr = section->sh_addr;
12360   bytes = section_size;
12361   data = start;
12362
12363   while (bytes)
12364     {
12365       int j;
12366       int k;
12367       int lbytes;
12368
12369       lbytes = (bytes > 16 ? 16 : bytes);
12370
12371       printf ("  0x%8.8lx ", (unsigned long) addr);
12372
12373       for (j = 0; j < 16; j++)
12374         {
12375           if (j < lbytes)
12376             printf ("%2.2x", data[j]);
12377           else
12378             printf ("  ");
12379
12380           if ((j & 3) == 3)
12381             printf (" ");
12382         }
12383
12384       for (j = 0; j < lbytes; j++)
12385         {
12386           k = data[j];
12387           if (k >= ' ' && k < 0x7f)
12388             printf ("%c", k);
12389           else
12390             printf (".");
12391         }
12392
12393       putchar ('\n');
12394
12395       data  += lbytes;
12396       addr  += lbytes;
12397       bytes -= lbytes;
12398     }
12399
12400   free (real_start);
12401
12402   putchar ('\n');
12403 }
12404
12405 static int
12406 load_specific_debug_section (enum dwarf_section_display_enum debug,
12407                              const Elf_Internal_Shdr * sec, void * file)
12408 {
12409   struct dwarf_section * section = &debug_displays [debug].section;
12410   char buf [64];
12411
12412   /* If it is already loaded, do nothing.  */
12413   if (section->start != NULL)
12414     return 1;
12415
12416   snprintf (buf, sizeof (buf), _("%s section data"), section->name);
12417   section->address = sec->sh_addr;
12418   section->user_data = NULL;
12419   section->start = (unsigned char *) get_data (NULL, (FILE *) file,
12420                                                sec->sh_offset, 1,
12421                                                sec->sh_size, buf);
12422   if (section->start == NULL)
12423     section->size = 0;
12424   else
12425     {
12426       unsigned char *start = section->start;
12427       dwarf_size_type size = sec->sh_size;
12428       dwarf_size_type uncompressed_size = 0;
12429
12430       if ((sec->sh_flags & SHF_COMPRESSED) != 0)
12431         {
12432           Elf_Internal_Chdr chdr;
12433           unsigned int compression_header_size
12434             = get_compression_header (&chdr, start);
12435           if (chdr.ch_type != ELFCOMPRESS_ZLIB)
12436             {
12437               warn (_("section '%s' has unsupported compress type: %d\n"),
12438                     section->name, chdr.ch_type);
12439               return 0;
12440             }
12441           else if (chdr.ch_addralign != sec->sh_addralign)
12442             {
12443               warn (_("compressed section '%s' is corrupted\n"),
12444                     section->name);
12445               return 0;
12446             }
12447           uncompressed_size = chdr.ch_size;
12448           start += compression_header_size;
12449           size -= compression_header_size;
12450         }
12451       else if (size > 12 && streq ((char *) start, "ZLIB"))
12452         {
12453           /* Read the zlib header.  In this case, it should be "ZLIB"
12454              followed by the uncompressed section size, 8 bytes in
12455              big-endian order.  */
12456           uncompressed_size = start[4]; uncompressed_size <<= 8;
12457           uncompressed_size += start[5]; uncompressed_size <<= 8;
12458           uncompressed_size += start[6]; uncompressed_size <<= 8;
12459           uncompressed_size += start[7]; uncompressed_size <<= 8;
12460           uncompressed_size += start[8]; uncompressed_size <<= 8;
12461           uncompressed_size += start[9]; uncompressed_size <<= 8;
12462           uncompressed_size += start[10]; uncompressed_size <<= 8;
12463           uncompressed_size += start[11];
12464           start += 12;
12465           size -= 12;
12466         }
12467
12468       if (uncompressed_size
12469           && uncompress_section_contents (&start, uncompressed_size,
12470                                           &size))
12471         {
12472           /* Free the compressed buffer, update the section buffer
12473              and the section size if uncompress is successful.  */
12474           free (section->start);
12475           section->start = start;
12476         }
12477       section->size = size;
12478     }
12479
12480   if (section->start == NULL)
12481     return 0;
12482
12483   if (debug_displays [debug].relocate)
12484     apply_relocations ((FILE *) file, sec, section->start, section->size,
12485                        & section->reloc_info, & section->num_relocs);
12486   else
12487     {
12488       section->reloc_info = NULL;
12489       section->num_relocs = 0;
12490     }
12491
12492   return 1;
12493 }
12494
12495 /* If this is not NULL, load_debug_section will only look for sections
12496    within the list of sections given here.  */
12497 unsigned int *section_subset = NULL;
12498
12499 int
12500 load_debug_section (enum dwarf_section_display_enum debug, void * file)
12501 {
12502   struct dwarf_section * section = &debug_displays [debug].section;
12503   Elf_Internal_Shdr * sec;
12504
12505   /* Locate the debug section.  */
12506   sec = find_section_in_set (section->uncompressed_name, section_subset);
12507   if (sec != NULL)
12508     section->name = section->uncompressed_name;
12509   else
12510     {
12511       sec = find_section_in_set (section->compressed_name, section_subset);
12512       if (sec != NULL)
12513         section->name = section->compressed_name;
12514     }
12515   if (sec == NULL)
12516     return 0;
12517
12518   /* If we're loading from a subset of sections, and we've loaded
12519      a section matching this name before, it's likely that it's a
12520      different one.  */
12521   if (section_subset != NULL)
12522     free_debug_section (debug);
12523
12524   return load_specific_debug_section (debug, sec, (FILE *) file);
12525 }
12526
12527 void
12528 free_debug_section (enum dwarf_section_display_enum debug)
12529 {
12530   struct dwarf_section * section = &debug_displays [debug].section;
12531
12532   if (section->start == NULL)
12533     return;
12534
12535   free ((char *) section->start);
12536   section->start = NULL;
12537   section->address = 0;
12538   section->size = 0;
12539 }
12540
12541 static int
12542 display_debug_section (int shndx, Elf_Internal_Shdr * section, FILE * file)
12543 {
12544   char * name = SECTION_NAME (section);
12545   const char * print_name = printable_section_name (section);
12546   bfd_size_type length;
12547   int result = 1;
12548   int i;
12549
12550   length = section->sh_size;
12551   if (length == 0)
12552     {
12553       printf (_("\nSection '%s' has no debugging data.\n"), print_name);
12554       return 0;
12555     }
12556   if (section->sh_type == SHT_NOBITS)
12557     {
12558       /* There is no point in dumping the contents of a debugging section
12559          which has the NOBITS type - the bits in the file will be random.
12560          This can happen when a file containing a .eh_frame section is
12561          stripped with the --only-keep-debug command line option.  */
12562       printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"),
12563               print_name);
12564       return 0;
12565     }
12566
12567   if (const_strneq (name, ".gnu.linkonce.wi."))
12568     name = ".debug_info";
12569
12570   /* See if we know how to display the contents of this section.  */
12571   for (i = 0; i < max; i++)
12572     if (streq (debug_displays[i].section.uncompressed_name, name)
12573         || (i == line && const_strneq (name, ".debug_line."))
12574         || streq (debug_displays[i].section.compressed_name, name))
12575       {
12576         struct dwarf_section * sec = &debug_displays [i].section;
12577         int secondary = (section != find_section (name));
12578
12579         if (secondary)
12580           free_debug_section ((enum dwarf_section_display_enum) i);
12581
12582         if (i == line && const_strneq (name, ".debug_line."))
12583           sec->name = name;
12584         else if (streq (sec->uncompressed_name, name))
12585           sec->name = sec->uncompressed_name;
12586         else
12587           sec->name = sec->compressed_name;
12588         if (load_specific_debug_section ((enum dwarf_section_display_enum) i,
12589                                          section, file))
12590           {
12591             /* If this debug section is part of a CU/TU set in a .dwp file,
12592                restrict load_debug_section to the sections in that set.  */
12593             section_subset = find_cu_tu_set (file, shndx);
12594
12595             result &= debug_displays[i].display (sec, file);
12596
12597             section_subset = NULL;
12598
12599             if (secondary || (i != info && i != abbrev))
12600               free_debug_section ((enum dwarf_section_display_enum) i);
12601           }
12602
12603         break;
12604       }
12605
12606   if (i == max)
12607     {
12608       printf (_("Unrecognized debug section: %s\n"), print_name);
12609       result = 0;
12610     }
12611
12612   return result;
12613 }
12614
12615 /* Set DUMP_SECTS for all sections where dumps were requested
12616    based on section name.  */
12617
12618 static void
12619 initialise_dumps_byname (void)
12620 {
12621   struct dump_list_entry * cur;
12622
12623   for (cur = dump_sects_byname; cur; cur = cur->next)
12624     {
12625       unsigned int i;
12626       int any;
12627
12628       for (i = 0, any = 0; i < elf_header.e_shnum; i++)
12629         if (streq (SECTION_NAME (section_headers + i), cur->name))
12630           {
12631             request_dump_bynumber (i, cur->type);
12632             any = 1;
12633           }
12634
12635       if (!any)
12636         warn (_("Section '%s' was not dumped because it does not exist!\n"),
12637               cur->name);
12638     }
12639 }
12640
12641 static void
12642 process_section_contents (FILE * file)
12643 {
12644   Elf_Internal_Shdr * section;
12645   unsigned int i;
12646
12647   if (! do_dump)
12648     return;
12649
12650   initialise_dumps_byname ();
12651
12652   for (i = 0, section = section_headers;
12653        i < elf_header.e_shnum && i < num_dump_sects;
12654        i++, section++)
12655     {
12656 #ifdef SUPPORT_DISASSEMBLY
12657       if (dump_sects[i] & DISASS_DUMP)
12658         disassemble_section (section, file);
12659 #endif
12660       if (dump_sects[i] & HEX_DUMP)
12661         dump_section_as_bytes (section, file, FALSE);
12662
12663       if (dump_sects[i] & RELOC_DUMP)
12664         dump_section_as_bytes (section, file, TRUE);
12665
12666       if (dump_sects[i] & STRING_DUMP)
12667         dump_section_as_strings (section, file);
12668
12669       if (dump_sects[i] & DEBUG_DUMP)
12670         display_debug_section (i, section, file);
12671     }
12672
12673   /* Check to see if the user requested a
12674      dump of a section that does not exist.  */
12675   while (i++ < num_dump_sects)
12676     if (dump_sects[i])
12677       warn (_("Section %d was not dumped because it does not exist!\n"), i);
12678 }
12679
12680 static void
12681 process_mips_fpe_exception (int mask)
12682 {
12683   if (mask)
12684     {
12685       int first = 1;
12686       if (mask & OEX_FPU_INEX)
12687         fputs ("INEX", stdout), first = 0;
12688       if (mask & OEX_FPU_UFLO)
12689         printf ("%sUFLO", first ? "" : "|"), first = 0;
12690       if (mask & OEX_FPU_OFLO)
12691         printf ("%sOFLO", first ? "" : "|"), first = 0;
12692       if (mask & OEX_FPU_DIV0)
12693         printf ("%sDIV0", first ? "" : "|"), first = 0;
12694       if (mask & OEX_FPU_INVAL)
12695         printf ("%sINVAL", first ? "" : "|");
12696     }
12697   else
12698     fputs ("0", stdout);
12699 }
12700
12701 /* Display's the value of TAG at location P.  If TAG is
12702    greater than 0 it is assumed to be an unknown tag, and
12703    a message is printed to this effect.  Otherwise it is
12704    assumed that a message has already been printed.
12705
12706    If the bottom bit of TAG is set it assumed to have a
12707    string value, otherwise it is assumed to have an integer
12708    value.
12709
12710    Returns an updated P pointing to the first unread byte
12711    beyond the end of TAG's value.
12712
12713    Reads at or beyond END will not be made.  */
12714
12715 static unsigned char *
12716 display_tag_value (int tag,
12717                    unsigned char * p,
12718                    const unsigned char * const end)
12719 {
12720   unsigned long val;
12721
12722   if (tag > 0)
12723     printf ("  Tag_unknown_%d: ", tag);
12724
12725   if (p >= end)
12726     {
12727       warn (_("<corrupt tag>\n"));
12728     }
12729   else if (tag & 1)
12730     {
12731       /* PR 17531 file: 027-19978-0.004.  */
12732       size_t maxlen = (end - p) - 1;
12733
12734       putchar ('"');
12735       if (maxlen > 0)
12736         {
12737           print_symbol ((int) maxlen, (const char *) p);
12738           p += strnlen ((char *) p, maxlen) + 1;
12739         }
12740       else
12741         {
12742           printf (_("<corrupt string tag>"));
12743           p = (unsigned char *) end;
12744         }
12745       printf ("\"\n");
12746     }
12747   else
12748     {
12749       unsigned int len;
12750
12751       val = read_uleb128 (p, &len, end);
12752       p += len;
12753       printf ("%ld (0x%lx)\n", val, val);
12754     }
12755
12756   assert (p <= end);
12757   return p;
12758 }
12759
12760 /* ARM EABI attributes section.  */
12761 typedef struct
12762 {
12763   unsigned int tag;
12764   const char * name;
12765   /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup.  */
12766   unsigned int type;
12767   const char ** table;
12768 } arm_attr_public_tag;
12769
12770 static const char * arm_attr_tag_CPU_arch[] =
12771   {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
12772    "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8", "", "v8-M.baseline",
12773    "v8-M.mainline"};
12774 static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
12775 static const char * arm_attr_tag_THUMB_ISA_use[] =
12776   {"No", "Thumb-1", "Thumb-2", "Yes"};
12777 static const char * arm_attr_tag_FP_arch[] =
12778   {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
12779    "FP for ARMv8", "FPv5/FP-D16 for ARMv8"};
12780 static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
12781 static const char * arm_attr_tag_Advanced_SIMD_arch[] =
12782   {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8",
12783    "NEON for ARMv8.1"};
12784 static const char * arm_attr_tag_PCS_config[] =
12785   {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
12786    "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
12787 static const char * arm_attr_tag_ABI_PCS_R9_use[] =
12788   {"V6", "SB", "TLS", "Unused"};
12789 static const char * arm_attr_tag_ABI_PCS_RW_data[] =
12790   {"Absolute", "PC-relative", "SB-relative", "None"};
12791 static const char * arm_attr_tag_ABI_PCS_RO_data[] =
12792   {"Absolute", "PC-relative", "None"};
12793 static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
12794   {"None", "direct", "GOT-indirect"};
12795 static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
12796   {"None", "??? 1", "2", "??? 3", "4"};
12797 static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
12798 static const char * arm_attr_tag_ABI_FP_denormal[] =
12799   {"Unused", "Needed", "Sign only"};
12800 static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
12801 static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
12802 static const char * arm_attr_tag_ABI_FP_number_model[] =
12803   {"Unused", "Finite", "RTABI", "IEEE 754"};
12804 static const char * arm_attr_tag_ABI_enum_size[] =
12805   {"Unused", "small", "int", "forced to int"};
12806 static const char * arm_attr_tag_ABI_HardFP_use[] =
12807   {"As Tag_FP_arch", "SP only", "Reserved", "Deprecated"};
12808 static const char * arm_attr_tag_ABI_VFP_args[] =
12809   {"AAPCS", "VFP registers", "custom", "compatible"};
12810 static const char * arm_attr_tag_ABI_WMMX_args[] =
12811   {"AAPCS", "WMMX registers", "custom"};
12812 static const char * arm_attr_tag_ABI_optimization_goals[] =
12813   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
12814     "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
12815 static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
12816   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
12817     "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
12818 static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
12819 static const char * arm_attr_tag_FP_HP_extension[] =
12820   {"Not Allowed", "Allowed"};
12821 static const char * arm_attr_tag_ABI_FP_16bit_format[] =
12822   {"None", "IEEE 754", "Alternative Format"};
12823 static const char * arm_attr_tag_MPextension_use[] =
12824   {"Not Allowed", "Allowed"};
12825 static const char * arm_attr_tag_DIV_use[] =
12826   {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
12827     "Allowed in v7-A with integer division extension"};
12828 static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
12829 static const char * arm_attr_tag_Virtualization_use[] =
12830   {"Not Allowed", "TrustZone", "Virtualization Extensions",
12831     "TrustZone and Virtualization Extensions"};
12832 static const char * arm_attr_tag_MPextension_use_legacy[] =
12833   {"Not Allowed", "Allowed"};
12834
12835 #define LOOKUP(id, name) \
12836   {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
12837 static arm_attr_public_tag arm_attr_public_tags[] =
12838 {
12839   {4, "CPU_raw_name", 1, NULL},
12840   {5, "CPU_name", 1, NULL},
12841   LOOKUP(6, CPU_arch),
12842   {7, "CPU_arch_profile", 0, NULL},
12843   LOOKUP(8, ARM_ISA_use),
12844   LOOKUP(9, THUMB_ISA_use),
12845   LOOKUP(10, FP_arch),
12846   LOOKUP(11, WMMX_arch),
12847   LOOKUP(12, Advanced_SIMD_arch),
12848   LOOKUP(13, PCS_config),
12849   LOOKUP(14, ABI_PCS_R9_use),
12850   LOOKUP(15, ABI_PCS_RW_data),
12851   LOOKUP(16, ABI_PCS_RO_data),
12852   LOOKUP(17, ABI_PCS_GOT_use),
12853   LOOKUP(18, ABI_PCS_wchar_t),
12854   LOOKUP(19, ABI_FP_rounding),
12855   LOOKUP(20, ABI_FP_denormal),
12856   LOOKUP(21, ABI_FP_exceptions),
12857   LOOKUP(22, ABI_FP_user_exceptions),
12858   LOOKUP(23, ABI_FP_number_model),
12859   {24, "ABI_align_needed", 0, NULL},
12860   {25, "ABI_align_preserved", 0, NULL},
12861   LOOKUP(26, ABI_enum_size),
12862   LOOKUP(27, ABI_HardFP_use),
12863   LOOKUP(28, ABI_VFP_args),
12864   LOOKUP(29, ABI_WMMX_args),
12865   LOOKUP(30, ABI_optimization_goals),
12866   LOOKUP(31, ABI_FP_optimization_goals),
12867   {32, "compatibility", 0, NULL},
12868   LOOKUP(34, CPU_unaligned_access),
12869   LOOKUP(36, FP_HP_extension),
12870   LOOKUP(38, ABI_FP_16bit_format),
12871   LOOKUP(42, MPextension_use),
12872   LOOKUP(44, DIV_use),
12873   {64, "nodefaults", 0, NULL},
12874   {65, "also_compatible_with", 0, NULL},
12875   LOOKUP(66, T2EE_use),
12876   {67, "conformance", 1, NULL},
12877   LOOKUP(68, Virtualization_use),
12878   LOOKUP(70, MPextension_use_legacy)
12879 };
12880 #undef LOOKUP
12881
12882 static unsigned char *
12883 display_arm_attribute (unsigned char * p,
12884                        const unsigned char * const end)
12885 {
12886   unsigned int tag;
12887   unsigned int len;
12888   unsigned int val;
12889   arm_attr_public_tag * attr;
12890   unsigned i;
12891   unsigned int type;
12892
12893   tag = read_uleb128 (p, &len, end);
12894   p += len;
12895   attr = NULL;
12896   for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
12897     {
12898       if (arm_attr_public_tags[i].tag == tag)
12899         {
12900           attr = &arm_attr_public_tags[i];
12901           break;
12902         }
12903     }
12904
12905   if (attr)
12906     {
12907       printf ("  Tag_%s: ", attr->name);
12908       switch (attr->type)
12909         {
12910         case 0:
12911           switch (tag)
12912             {
12913             case 7: /* Tag_CPU_arch_profile.  */
12914               val = read_uleb128 (p, &len, end);
12915               p += len;
12916               switch (val)
12917                 {
12918                 case 0: printf (_("None\n")); break;
12919                 case 'A': printf (_("Application\n")); break;
12920                 case 'R': printf (_("Realtime\n")); break;
12921                 case 'M': printf (_("Microcontroller\n")); break;
12922                 case 'S': printf (_("Application or Realtime\n")); break;
12923                 default: printf ("??? (%d)\n", val); break;
12924                 }
12925               break;
12926
12927             case 24: /* Tag_align_needed.  */
12928               val = read_uleb128 (p, &len, end);
12929               p += len;
12930               switch (val)
12931                 {
12932                 case 0: printf (_("None\n")); break;
12933                 case 1: printf (_("8-byte\n")); break;
12934                 case 2: printf (_("4-byte\n")); break;
12935                 case 3: printf ("??? 3\n"); break;
12936                 default:
12937                   if (val <= 12)
12938                     printf (_("8-byte and up to %d-byte extended\n"),
12939                             1 << val);
12940                   else
12941                     printf ("??? (%d)\n", val);
12942                   break;
12943                 }
12944               break;
12945
12946             case 25: /* Tag_align_preserved.  */
12947               val = read_uleb128 (p, &len, end);
12948               p += len;
12949               switch (val)
12950                 {
12951                 case 0: printf (_("None\n")); break;
12952                 case 1: printf (_("8-byte, except leaf SP\n")); break;
12953                 case 2: printf (_("8-byte\n")); break;
12954                 case 3: printf ("??? 3\n"); break;
12955                 default:
12956                   if (val <= 12)
12957                     printf (_("8-byte and up to %d-byte extended\n"),
12958                             1 << val);
12959                   else
12960                     printf ("??? (%d)\n", val);
12961                   break;
12962                 }
12963               break;
12964
12965             case 32: /* Tag_compatibility.  */
12966               {
12967                 val = read_uleb128 (p, &len, end);
12968                 p += len;
12969                 printf (_("flag = %d, vendor = "), val);
12970                 if (p < end - 1)
12971                   {
12972                     size_t maxlen = (end - p) - 1;
12973
12974                     print_symbol ((int) maxlen, (const char *) p);
12975                     p += strnlen ((char *) p, maxlen) + 1;
12976                   }
12977                 else
12978                   {
12979                     printf (_("<corrupt>"));
12980                     p = (unsigned char *) end;
12981                   }
12982                 putchar ('\n');
12983               }
12984               break;
12985
12986             case 64: /* Tag_nodefaults.  */
12987               /* PR 17531: file: 001-505008-0.01.  */
12988               if (p < end)
12989                 p++;
12990               printf (_("True\n"));
12991               break;
12992
12993             case 65: /* Tag_also_compatible_with.  */
12994               val = read_uleb128 (p, &len, end);
12995               p += len;
12996               if (val == 6 /* Tag_CPU_arch.  */)
12997                 {
12998                   val = read_uleb128 (p, &len, end);
12999                   p += len;
13000                   if ((unsigned int) val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
13001                     printf ("??? (%d)\n", val);
13002                   else
13003                     printf ("%s\n", arm_attr_tag_CPU_arch[val]);
13004                 }
13005               else
13006                 printf ("???\n");
13007               while (p < end && *(p++) != '\0' /* NUL terminator.  */)
13008                 ;
13009               break;
13010
13011             default:
13012               printf (_("<unknown: %d>\n"), tag);
13013               break;
13014             }
13015           return p;
13016
13017         case 1:
13018           return display_tag_value (-1, p, end);
13019         case 2:
13020           return display_tag_value (0, p, end);
13021
13022         default:
13023           assert (attr->type & 0x80);
13024           val = read_uleb128 (p, &len, end);
13025           p += len;
13026           type = attr->type & 0x7f;
13027           if (val >= type)
13028             printf ("??? (%d)\n", val);
13029           else
13030             printf ("%s\n", attr->table[val]);
13031           return p;
13032         }
13033     }
13034
13035   return display_tag_value (tag, p, end);
13036 }
13037
13038 static unsigned char *
13039 display_gnu_attribute (unsigned char * p,
13040                        unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const),
13041                        const unsigned char * const end)
13042 {
13043   int tag;
13044   unsigned int len;
13045   int val;
13046
13047   tag = read_uleb128 (p, &len, end);
13048   p += len;
13049
13050   /* Tag_compatibility is the only generic GNU attribute defined at
13051      present.  */
13052   if (tag == 32)
13053     {
13054       val = read_uleb128 (p, &len, end);
13055       p += len;
13056
13057       printf (_("flag = %d, vendor = "), val);
13058       if (p == end)
13059         {
13060           printf (_("<corrupt>\n"));
13061           warn (_("corrupt vendor attribute\n"));
13062         }
13063       else
13064         {
13065           if (p < end - 1)
13066             {
13067               size_t maxlen = (end - p) - 1;
13068
13069               print_symbol ((int) maxlen, (const char *) p);
13070               p += strnlen ((char *) p, maxlen) + 1;
13071             }
13072           else
13073             {
13074               printf (_("<corrupt>"));
13075               p = (unsigned char *) end;
13076             }
13077           putchar ('\n');
13078         }
13079       return p;
13080     }
13081
13082   if ((tag & 2) == 0 && display_proc_gnu_attribute)
13083     return display_proc_gnu_attribute (p, tag, end);
13084
13085   return display_tag_value (tag, p, end);
13086 }
13087
13088 static unsigned char *
13089 display_power_gnu_attribute (unsigned char * p,
13090                              int tag,
13091                              const unsigned char * const end)
13092 {
13093   unsigned int len;
13094   int val;
13095
13096   if (tag == Tag_GNU_Power_ABI_FP)
13097     {
13098       val = read_uleb128 (p, &len, end);
13099       p += len;
13100       printf ("  Tag_GNU_Power_ABI_FP: ");
13101
13102       switch (val)
13103         {
13104         case 0:
13105           printf (_("Hard or soft float\n"));
13106           break;
13107         case 1:
13108           printf (_("Hard float\n"));
13109           break;
13110         case 2:
13111           printf (_("Soft float\n"));
13112           break;
13113         case 3:
13114           printf (_("Single-precision hard float\n"));
13115           break;
13116         default:
13117           printf ("??? (%d)\n", val);
13118           break;
13119         }
13120       return p;
13121    }
13122
13123   if (tag == Tag_GNU_Power_ABI_Vector)
13124     {
13125       val = read_uleb128 (p, &len, end);
13126       p += len;
13127       printf ("  Tag_GNU_Power_ABI_Vector: ");
13128       switch (val)
13129         {
13130         case 0:
13131           printf (_("Any\n"));
13132           break;
13133         case 1:
13134           printf (_("Generic\n"));
13135           break;
13136         case 2:
13137           printf ("AltiVec\n");
13138           break;
13139         case 3:
13140           printf ("SPE\n");
13141           break;
13142         default:
13143           printf ("??? (%d)\n", val);
13144           break;
13145         }
13146       return p;
13147    }
13148
13149   if (tag == Tag_GNU_Power_ABI_Struct_Return)
13150     {
13151       if (p == end)
13152         {
13153           warn (_("corrupt Tag_GNU_Power_ABI_Struct_Return\n"));
13154           return p;
13155         }
13156
13157       val = read_uleb128 (p, &len, end);
13158       p += len;
13159       printf ("  Tag_GNU_Power_ABI_Struct_Return: ");
13160       switch (val)
13161        {
13162        case 0:
13163          printf (_("Any\n"));
13164          break;
13165        case 1:
13166          printf ("r3/r4\n");
13167          break;
13168        case 2:
13169          printf (_("Memory\n"));
13170          break;
13171        default:
13172          printf ("??? (%d)\n", val);
13173          break;
13174        }
13175       return p;
13176     }
13177
13178   return display_tag_value (tag & 1, p, end);
13179 }
13180
13181 static unsigned char *
13182 display_s390_gnu_attribute (unsigned char * p,
13183                             int tag,
13184                             const unsigned char * const end)
13185 {
13186   unsigned int len;
13187   int val;
13188
13189   if (tag == Tag_GNU_S390_ABI_Vector)
13190     {
13191       val = read_uleb128 (p, &len, end);
13192       p += len;
13193       printf ("  Tag_GNU_S390_ABI_Vector: ");
13194
13195       switch (val)
13196         {
13197         case 0:
13198           printf (_("any\n"));
13199           break;
13200         case 1:
13201           printf (_("software\n"));
13202           break;
13203         case 2:
13204           printf (_("hardware\n"));
13205           break;
13206         default:
13207           printf ("??? (%d)\n", val);
13208           break;
13209         }
13210       return p;
13211    }
13212
13213   return display_tag_value (tag & 1, p, end);
13214 }
13215
13216 static void
13217 display_sparc_hwcaps (int mask)
13218 {
13219   if (mask)
13220     {
13221       int first = 1;
13222
13223       if (mask & ELF_SPARC_HWCAP_MUL32)
13224         fputs ("mul32", stdout), first = 0;
13225       if (mask & ELF_SPARC_HWCAP_DIV32)
13226         printf ("%sdiv32", first ? "" : "|"), first = 0;
13227       if (mask & ELF_SPARC_HWCAP_FSMULD)
13228         printf ("%sfsmuld", first ? "" : "|"), first = 0;
13229       if (mask & ELF_SPARC_HWCAP_V8PLUS)
13230         printf ("%sv8plus", first ? "" : "|"), first = 0;
13231       if (mask & ELF_SPARC_HWCAP_POPC)
13232         printf ("%spopc", first ? "" : "|"), first = 0;
13233       if (mask & ELF_SPARC_HWCAP_VIS)
13234         printf ("%svis", first ? "" : "|"), first = 0;
13235       if (mask & ELF_SPARC_HWCAP_VIS2)
13236         printf ("%svis2", first ? "" : "|"), first = 0;
13237       if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
13238         printf ("%sASIBlkInit", first ? "" : "|"), first = 0;
13239       if (mask & ELF_SPARC_HWCAP_FMAF)
13240         printf ("%sfmaf", first ? "" : "|"), first = 0;
13241       if (mask & ELF_SPARC_HWCAP_VIS3)
13242         printf ("%svis3", first ? "" : "|"), first = 0;
13243       if (mask & ELF_SPARC_HWCAP_HPC)
13244         printf ("%shpc", first ? "" : "|"), first = 0;
13245       if (mask & ELF_SPARC_HWCAP_RANDOM)
13246         printf ("%srandom", first ? "" : "|"), first = 0;
13247       if (mask & ELF_SPARC_HWCAP_TRANS)
13248         printf ("%strans", first ? "" : "|"), first = 0;
13249       if (mask & ELF_SPARC_HWCAP_FJFMAU)
13250         printf ("%sfjfmau", first ? "" : "|"), first = 0;
13251       if (mask & ELF_SPARC_HWCAP_IMA)
13252         printf ("%sima", first ? "" : "|"), first = 0;
13253       if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
13254         printf ("%scspare", first ? "" : "|"), first = 0;
13255     }
13256   else
13257     fputc ('0', stdout);
13258   fputc ('\n', stdout);
13259 }
13260
13261 static void
13262 display_sparc_hwcaps2 (int mask)
13263 {
13264   if (mask)
13265     {
13266       int first = 1;
13267
13268       if (mask & ELF_SPARC_HWCAP2_FJATHPLUS)
13269         fputs ("fjathplus", stdout), first = 0;
13270       if (mask & ELF_SPARC_HWCAP2_VIS3B)
13271         printf ("%svis3b", first ? "" : "|"), first = 0;
13272       if (mask & ELF_SPARC_HWCAP2_ADP)
13273         printf ("%sadp", first ? "" : "|"), first = 0;
13274       if (mask & ELF_SPARC_HWCAP2_SPARC5)
13275         printf ("%ssparc5", first ? "" : "|"), first = 0;
13276       if (mask & ELF_SPARC_HWCAP2_MWAIT)
13277         printf ("%smwait", first ? "" : "|"), first = 0;
13278       if (mask & ELF_SPARC_HWCAP2_XMPMUL)
13279         printf ("%sxmpmul", first ? "" : "|"), first = 0;
13280       if (mask & ELF_SPARC_HWCAP2_XMONT)
13281         printf ("%sxmont2", first ? "" : "|"), first = 0;
13282       if (mask & ELF_SPARC_HWCAP2_NSEC)
13283         printf ("%snsec", first ? "" : "|"), first = 0;
13284       if (mask & ELF_SPARC_HWCAP2_FJATHHPC)
13285         printf ("%sfjathhpc", first ? "" : "|"), first = 0;
13286       if (mask & ELF_SPARC_HWCAP2_FJDES)
13287         printf ("%sfjdes", first ? "" : "|"), first = 0;
13288       if (mask & ELF_SPARC_HWCAP2_FJAES)
13289         printf ("%sfjaes", first ? "" : "|"), first = 0;
13290     }
13291   else
13292     fputc ('0', stdout);
13293   fputc ('\n', stdout);
13294 }
13295
13296 static unsigned char *
13297 display_sparc_gnu_attribute (unsigned char * p,
13298                              int tag,
13299                              const unsigned char * const end)
13300 {
13301   unsigned int len;
13302   int val;
13303
13304   if (tag == Tag_GNU_Sparc_HWCAPS)
13305     {
13306       val = read_uleb128 (p, &len, end);
13307       p += len;
13308       printf ("  Tag_GNU_Sparc_HWCAPS: ");
13309       display_sparc_hwcaps (val);
13310       return p;
13311     }
13312   if (tag == Tag_GNU_Sparc_HWCAPS2)
13313     {
13314       val = read_uleb128 (p, &len, end);
13315       p += len;
13316       printf ("  Tag_GNU_Sparc_HWCAPS2: ");
13317       display_sparc_hwcaps2 (val);
13318       return p;
13319     }
13320
13321   return display_tag_value (tag, p, end);
13322 }
13323
13324 static void
13325 print_mips_fp_abi_value (int val)
13326 {
13327   switch (val)
13328     {
13329     case Val_GNU_MIPS_ABI_FP_ANY:
13330       printf (_("Hard or soft float\n"));
13331       break;
13332     case Val_GNU_MIPS_ABI_FP_DOUBLE:
13333       printf (_("Hard float (double precision)\n"));
13334       break;
13335     case Val_GNU_MIPS_ABI_FP_SINGLE:
13336       printf (_("Hard float (single precision)\n"));
13337       break;
13338     case Val_GNU_MIPS_ABI_FP_SOFT:
13339       printf (_("Soft float\n"));
13340       break;
13341     case Val_GNU_MIPS_ABI_FP_OLD_64:
13342       printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
13343       break;
13344     case Val_GNU_MIPS_ABI_FP_XX:
13345       printf (_("Hard float (32-bit CPU, Any FPU)\n"));
13346       break;
13347     case Val_GNU_MIPS_ABI_FP_64:
13348       printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
13349       break;
13350     case Val_GNU_MIPS_ABI_FP_64A:
13351       printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
13352       break;
13353     case Val_GNU_MIPS_ABI_FP_NAN2008:
13354       printf (_("NaN 2008 compatibility\n"));
13355       break;
13356     default:
13357       printf ("??? (%d)\n", val);
13358       break;
13359     }
13360 }
13361
13362 static unsigned char *
13363 display_mips_gnu_attribute (unsigned char * p,
13364                             int tag,
13365                             const unsigned char * const end)
13366 {
13367   if (tag == Tag_GNU_MIPS_ABI_FP)
13368     {
13369       unsigned int len;
13370       int val;
13371
13372       val = read_uleb128 (p, &len, end);
13373       p += len;
13374       printf ("  Tag_GNU_MIPS_ABI_FP: ");
13375
13376       print_mips_fp_abi_value (val);
13377
13378       return p;
13379    }
13380
13381   if (tag == Tag_GNU_MIPS_ABI_MSA)
13382     {
13383       unsigned int len;
13384       int val;
13385
13386       val = read_uleb128 (p, &len, end);
13387       p += len;
13388       printf ("  Tag_GNU_MIPS_ABI_MSA: ");
13389
13390       switch (val)
13391         {
13392         case Val_GNU_MIPS_ABI_MSA_ANY:
13393           printf (_("Any MSA or not\n"));
13394           break;
13395         case Val_GNU_MIPS_ABI_MSA_128:
13396           printf (_("128-bit MSA\n"));
13397           break;
13398         default:
13399           printf ("??? (%d)\n", val);
13400           break;
13401         }
13402       return p;
13403     }
13404
13405   return display_tag_value (tag & 1, p, end);
13406 }
13407
13408 static unsigned char *
13409 display_tic6x_attribute (unsigned char * p,
13410                          const unsigned char * const end)
13411 {
13412   int tag;
13413   unsigned int len;
13414   int val;
13415
13416   tag = read_uleb128 (p, &len, end);
13417   p += len;
13418
13419   switch (tag)
13420     {
13421     case Tag_ISA:
13422       val = read_uleb128 (p, &len, end);
13423       p += len;
13424       printf ("  Tag_ISA: ");
13425
13426       switch (val)
13427         {
13428         case C6XABI_Tag_ISA_none:
13429           printf (_("None\n"));
13430           break;
13431         case C6XABI_Tag_ISA_C62X:
13432           printf ("C62x\n");
13433           break;
13434         case C6XABI_Tag_ISA_C67X:
13435           printf ("C67x\n");
13436           break;
13437         case C6XABI_Tag_ISA_C67XP:
13438           printf ("C67x+\n");
13439           break;
13440         case C6XABI_Tag_ISA_C64X:
13441           printf ("C64x\n");
13442           break;
13443         case C6XABI_Tag_ISA_C64XP:
13444           printf ("C64x+\n");
13445           break;
13446         case C6XABI_Tag_ISA_C674X:
13447           printf ("C674x\n");
13448           break;
13449         default:
13450           printf ("??? (%d)\n", val);
13451           break;
13452         }
13453       return p;
13454
13455     case Tag_ABI_wchar_t:
13456       val = read_uleb128 (p, &len, end);
13457       p += len;
13458       printf ("  Tag_ABI_wchar_t: ");
13459       switch (val)
13460         {
13461         case 0:
13462           printf (_("Not used\n"));
13463           break;
13464         case 1:
13465           printf (_("2 bytes\n"));
13466           break;
13467         case 2:
13468           printf (_("4 bytes\n"));
13469           break;
13470         default:
13471           printf ("??? (%d)\n", val);
13472           break;
13473         }
13474       return p;
13475
13476     case Tag_ABI_stack_align_needed:
13477       val = read_uleb128 (p, &len, end);
13478       p += len;
13479       printf ("  Tag_ABI_stack_align_needed: ");
13480       switch (val)
13481         {
13482         case 0:
13483           printf (_("8-byte\n"));
13484           break;
13485         case 1:
13486           printf (_("16-byte\n"));
13487           break;
13488         default:
13489           printf ("??? (%d)\n", val);
13490           break;
13491         }
13492       return p;
13493
13494     case Tag_ABI_stack_align_preserved:
13495       val = read_uleb128 (p, &len, end);
13496       p += len;
13497       printf ("  Tag_ABI_stack_align_preserved: ");
13498       switch (val)
13499         {
13500         case 0:
13501           printf (_("8-byte\n"));
13502           break;
13503         case 1:
13504           printf (_("16-byte\n"));
13505           break;
13506         default:
13507           printf ("??? (%d)\n", val);
13508           break;
13509         }
13510       return p;
13511
13512     case Tag_ABI_DSBT:
13513       val = read_uleb128 (p, &len, end);
13514       p += len;
13515       printf ("  Tag_ABI_DSBT: ");
13516       switch (val)
13517         {
13518         case 0:
13519           printf (_("DSBT addressing not used\n"));
13520           break;
13521         case 1:
13522           printf (_("DSBT addressing used\n"));
13523           break;
13524         default:
13525           printf ("??? (%d)\n", val);
13526           break;
13527         }
13528       return p;
13529
13530     case Tag_ABI_PID:
13531       val = read_uleb128 (p, &len, end);
13532       p += len;
13533       printf ("  Tag_ABI_PID: ");
13534       switch (val)
13535         {
13536         case 0:
13537           printf (_("Data addressing position-dependent\n"));
13538           break;
13539         case 1:
13540           printf (_("Data addressing position-independent, GOT near DP\n"));
13541           break;
13542         case 2:
13543           printf (_("Data addressing position-independent, GOT far from DP\n"));
13544           break;
13545         default:
13546           printf ("??? (%d)\n", val);
13547           break;
13548         }
13549       return p;
13550
13551     case Tag_ABI_PIC:
13552       val = read_uleb128 (p, &len, end);
13553       p += len;
13554       printf ("  Tag_ABI_PIC: ");
13555       switch (val)
13556         {
13557         case 0:
13558           printf (_("Code addressing position-dependent\n"));
13559           break;
13560         case 1:
13561           printf (_("Code addressing position-independent\n"));
13562           break;
13563         default:
13564           printf ("??? (%d)\n", val);
13565           break;
13566         }
13567       return p;
13568
13569     case Tag_ABI_array_object_alignment:
13570       val = read_uleb128 (p, &len, end);
13571       p += len;
13572       printf ("  Tag_ABI_array_object_alignment: ");
13573       switch (val)
13574         {
13575         case 0:
13576           printf (_("8-byte\n"));
13577           break;
13578         case 1:
13579           printf (_("4-byte\n"));
13580           break;
13581         case 2:
13582           printf (_("16-byte\n"));
13583           break;
13584         default:
13585           printf ("??? (%d)\n", val);
13586           break;
13587         }
13588       return p;
13589
13590     case Tag_ABI_array_object_align_expected:
13591       val = read_uleb128 (p, &len, end);
13592       p += len;
13593       printf ("  Tag_ABI_array_object_align_expected: ");
13594       switch (val)
13595         {
13596         case 0:
13597           printf (_("8-byte\n"));
13598           break;
13599         case 1:
13600           printf (_("4-byte\n"));
13601           break;
13602         case 2:
13603           printf (_("16-byte\n"));
13604           break;
13605         default:
13606           printf ("??? (%d)\n", val);
13607           break;
13608         }
13609       return p;
13610
13611     case Tag_ABI_compatibility:
13612       {
13613         val = read_uleb128 (p, &len, end);
13614         p += len;
13615         printf ("  Tag_ABI_compatibility: ");
13616         printf (_("flag = %d, vendor = "), val);
13617         if (p < end - 1)
13618           {
13619             size_t maxlen = (end - p) - 1;
13620
13621             print_symbol ((int) maxlen, (const char *) p);
13622             p += strnlen ((char *) p, maxlen) + 1;
13623           }
13624         else
13625           {
13626             printf (_("<corrupt>"));
13627             p = (unsigned char *) end;
13628           }
13629         putchar ('\n');
13630         return p;
13631       }
13632
13633     case Tag_ABI_conformance:
13634       {
13635         printf ("  Tag_ABI_conformance: \"");
13636         if (p < end - 1)
13637           {
13638             size_t maxlen = (end - p) - 1;
13639
13640             print_symbol ((int) maxlen, (const char *) p);
13641             p += strnlen ((char *) p, maxlen) + 1;
13642           }
13643         else
13644           {
13645             printf (_("<corrupt>"));
13646             p = (unsigned char *) end;
13647           }
13648         printf ("\"\n");
13649         return p;
13650       }
13651     }
13652
13653   return display_tag_value (tag, p, end);
13654 }
13655
13656 static void
13657 display_raw_attribute (unsigned char * p, unsigned char * end)
13658 {
13659   unsigned long addr = 0;
13660   size_t bytes = end - p;
13661
13662   assert (end > p);
13663   while (bytes)
13664     {
13665       int j;
13666       int k;
13667       int lbytes = (bytes > 16 ? 16 : bytes);
13668
13669       printf ("  0x%8.8lx ", addr);
13670
13671       for (j = 0; j < 16; j++)
13672         {
13673           if (j < lbytes)
13674             printf ("%2.2x", p[j]);
13675           else
13676             printf ("  ");
13677
13678           if ((j & 3) == 3)
13679             printf (" ");
13680         }
13681
13682       for (j = 0; j < lbytes; j++)
13683         {
13684           k = p[j];
13685           if (k >= ' ' && k < 0x7f)
13686             printf ("%c", k);
13687           else
13688             printf (".");
13689         }
13690
13691       putchar ('\n');
13692
13693       p  += lbytes;
13694       bytes -= lbytes;
13695       addr += lbytes;
13696     }
13697
13698   putchar ('\n');
13699 }
13700
13701 static unsigned char *
13702 display_msp430x_attribute (unsigned char * p,
13703                            const unsigned char * const end)
13704 {
13705   unsigned int len;
13706   int val;
13707   int tag;
13708
13709   tag = read_uleb128 (p, & len, end);
13710   p += len;
13711
13712   switch (tag)
13713     {
13714     case OFBA_MSPABI_Tag_ISA:
13715       val = read_uleb128 (p, &len, end);
13716       p += len;
13717       printf ("  Tag_ISA: ");
13718       switch (val)
13719         {
13720         case 0: printf (_("None\n")); break;
13721         case 1: printf (_("MSP430\n")); break;
13722         case 2: printf (_("MSP430X\n")); break;
13723         default: printf ("??? (%d)\n", val); break;
13724         }
13725       break;
13726
13727     case OFBA_MSPABI_Tag_Code_Model:
13728       val = read_uleb128 (p, &len, end);
13729       p += len;
13730       printf ("  Tag_Code_Model: ");
13731       switch (val)
13732         {
13733         case 0: printf (_("None\n")); break;
13734         case 1: printf (_("Small\n")); break;
13735         case 2: printf (_("Large\n")); break;
13736         default: printf ("??? (%d)\n", val); break;
13737         }
13738       break;
13739
13740     case OFBA_MSPABI_Tag_Data_Model:
13741       val = read_uleb128 (p, &len, end);
13742       p += len;
13743       printf ("  Tag_Data_Model: ");
13744       switch (val)
13745         {
13746         case 0: printf (_("None\n")); break;
13747         case 1: printf (_("Small\n")); break;
13748         case 2: printf (_("Large\n")); break;
13749         case 3: printf (_("Restricted Large\n")); break;
13750         default: printf ("??? (%d)\n", val); break;
13751         }
13752       break;
13753
13754     default:
13755       printf (_("  <unknown tag %d>: "), tag);
13756
13757       if (tag & 1)
13758         {
13759           putchar ('"');
13760           if (p < end - 1)
13761             {
13762               size_t maxlen = (end - p) - 1;
13763
13764               print_symbol ((int) maxlen, (const char *) p);
13765               p += strnlen ((char *) p, maxlen) + 1;
13766             }
13767           else
13768             {
13769               printf (_("<corrupt>"));
13770               p = (unsigned char *) end;
13771             }
13772           printf ("\"\n");
13773         }
13774       else
13775         {
13776           val = read_uleb128 (p, &len, end);
13777           p += len;
13778           printf ("%d (0x%x)\n", val, val);
13779         }
13780       break;
13781    }
13782
13783   assert (p <= end);
13784   return p;
13785 }
13786
13787 static int
13788 process_attributes (FILE * file,
13789                     const char * public_name,
13790                     unsigned int proc_type,
13791                     unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
13792                     unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const))
13793 {
13794   Elf_Internal_Shdr * sect;
13795   unsigned i;
13796
13797   /* Find the section header so that we get the size.  */
13798   for (i = 0, sect = section_headers;
13799        i < elf_header.e_shnum;
13800        i++, sect++)
13801     {
13802       unsigned char * contents;
13803       unsigned char * p;
13804
13805       if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
13806         continue;
13807
13808       contents = (unsigned char *) get_data (NULL, file, sect->sh_offset, 1,
13809                                              sect->sh_size, _("attributes"));
13810       if (contents == NULL)
13811         continue;
13812
13813       p = contents;
13814       if (*p == 'A')
13815         {
13816           bfd_vma section_len;
13817
13818           section_len = sect->sh_size - 1;
13819           p++;
13820
13821           while (section_len > 0)
13822             {
13823               bfd_vma attr_len;
13824               unsigned int namelen;
13825               bfd_boolean public_section;
13826               bfd_boolean gnu_section;
13827
13828               if (section_len <= 4)
13829                 {
13830                   error (_("Tag section ends prematurely\n"));
13831                   break;
13832                 }
13833               attr_len = byte_get (p, 4);
13834               p += 4;
13835
13836               if (attr_len > section_len)
13837                 {
13838                   error (_("Bad attribute length (%u > %u)\n"),
13839                           (unsigned) attr_len, (unsigned) section_len);
13840                   attr_len = section_len;
13841                 }
13842               /* PR 17531: file: 001-101425-0.004  */
13843               else if (attr_len < 5)
13844                 {
13845                   error (_("Attribute length of %u is too small\n"), (unsigned) attr_len);
13846                   break;
13847                 }
13848
13849               section_len -= attr_len;
13850               attr_len -= 4;
13851
13852               namelen = strnlen ((char *) p, attr_len) + 1;
13853               if (namelen == 0 || namelen >= attr_len)
13854                 {
13855                   error (_("Corrupt attribute section name\n"));
13856                   break;
13857                 }
13858
13859               printf (_("Attribute Section: "));
13860               print_symbol (INT_MAX, (const char *) p);
13861               putchar ('\n');
13862
13863               if (public_name && streq ((char *) p, public_name))
13864                 public_section = TRUE;
13865               else
13866                 public_section = FALSE;
13867
13868               if (streq ((char *) p, "gnu"))
13869                 gnu_section = TRUE;
13870               else
13871                 gnu_section = FALSE;
13872
13873               p += namelen;
13874               attr_len -= namelen;
13875
13876               while (attr_len > 0 && p < contents + sect->sh_size)
13877                 {
13878                   int tag;
13879                   int val;
13880                   bfd_vma size;
13881                   unsigned char * end;
13882
13883                   /* PR binutils/17531: Safe handling of corrupt files.  */
13884                   if (attr_len < 6)
13885                     {
13886                       error (_("Unused bytes at end of section\n"));
13887                       section_len = 0;
13888                       break;
13889                     }
13890
13891                   tag = *(p++);
13892                   size = byte_get (p, 4);
13893                   if (size > attr_len)
13894                     {
13895                       error (_("Bad subsection length (%u > %u)\n"),
13896                               (unsigned) size, (unsigned) attr_len);
13897                       size = attr_len;
13898                     }
13899                   /* PR binutils/17531: Safe handling of corrupt files.  */
13900                   if (size < 6)
13901                     {
13902                       error (_("Bad subsection length (%u < 6)\n"),
13903                               (unsigned) size);
13904                       section_len = 0;
13905                       break;
13906                     }
13907
13908                   attr_len -= size;
13909                   end = p + size - 1;
13910                   assert (end <= contents + sect->sh_size);
13911                   p += 4;
13912
13913                   switch (tag)
13914                     {
13915                     case 1:
13916                       printf (_("File Attributes\n"));
13917                       break;
13918                     case 2:
13919                       printf (_("Section Attributes:"));
13920                       goto do_numlist;
13921                     case 3:
13922                       printf (_("Symbol Attributes:"));
13923                     do_numlist:
13924                       for (;;)
13925                         {
13926                           unsigned int j;
13927
13928                           val = read_uleb128 (p, &j, end);
13929                           p += j;
13930                           if (val == 0)
13931                             break;
13932                           printf (" %d", val);
13933                         }
13934                       printf ("\n");
13935                       break;
13936                     default:
13937                       printf (_("Unknown tag: %d\n"), tag);
13938                       public_section = FALSE;
13939                       break;
13940                     }
13941
13942                   if (public_section && display_pub_attribute != NULL)
13943                     {
13944                       while (p < end)
13945                         p = display_pub_attribute (p, end);
13946                       assert (p <= end);
13947                     }
13948                   else if (gnu_section && display_proc_gnu_attribute != NULL)
13949                     {
13950                       while (p < end)
13951                         p = display_gnu_attribute (p,
13952                                                    display_proc_gnu_attribute,
13953                                                    end);
13954                       assert (p <= end);
13955                     }
13956                   else if (p < end)
13957                     {
13958                       printf (_("  Unknown attribute:\n"));
13959                       display_raw_attribute (p, end);
13960                       p = end;
13961                     }
13962                   else
13963                     attr_len = 0;
13964                 }
13965             }
13966         }
13967       else
13968         printf (_("Unknown format '%c' (%d)\n"), *p, *p);
13969
13970       free (contents);
13971     }
13972   return 1;
13973 }
13974
13975 static int
13976 process_arm_specific (FILE * file)
13977 {
13978   return process_attributes (file, "aeabi", SHT_ARM_ATTRIBUTES,
13979                              display_arm_attribute, NULL);
13980 }
13981
13982 static int
13983 process_power_specific (FILE * file)
13984 {
13985   return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
13986                              display_power_gnu_attribute);
13987 }
13988
13989 static int
13990 process_s390_specific (FILE * file)
13991 {
13992   return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
13993                              display_s390_gnu_attribute);
13994 }
13995
13996 static int
13997 process_sparc_specific (FILE * file)
13998 {
13999   return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14000                              display_sparc_gnu_attribute);
14001 }
14002
14003 static int
14004 process_tic6x_specific (FILE * file)
14005 {
14006   return process_attributes (file, "c6xabi", SHT_C6000_ATTRIBUTES,
14007                              display_tic6x_attribute, NULL);
14008 }
14009
14010 static int
14011 process_msp430x_specific (FILE * file)
14012 {
14013   return process_attributes (file, "mspabi", SHT_MSP430_ATTRIBUTES,
14014                              display_msp430x_attribute, NULL);
14015 }
14016
14017 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
14018    Print the Address, Access and Initial fields of an entry at VMA ADDR
14019    and return the VMA of the next entry, or -1 if there was a problem.
14020    Does not read from DATA_END or beyond.  */
14021
14022 static bfd_vma
14023 print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr,
14024                       unsigned char * data_end)
14025 {
14026   printf ("  ");
14027   print_vma (addr, LONG_HEX);
14028   printf (" ");
14029   if (addr < pltgot + 0xfff0)
14030     printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
14031   else
14032     printf ("%10s", "");
14033   printf (" ");
14034   if (data == NULL)
14035     printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
14036   else
14037     {
14038       bfd_vma entry;
14039       unsigned char * from = data + addr - pltgot;
14040
14041       if (from + (is_32bit_elf ? 4 : 8) > data_end)
14042         {
14043           warn (_("MIPS GOT entry extends beyond the end of available data\n"));
14044           printf ("%*s", is_32bit_elf ? 8 : 16, _("<corrupt>"));
14045           return (bfd_vma) -1;
14046         }
14047       else
14048         {
14049           entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
14050           print_vma (entry, LONG_HEX);
14051         }
14052     }
14053   return addr + (is_32bit_elf ? 4 : 8);
14054 }
14055
14056 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
14057    PLTGOT.  Print the Address and Initial fields of an entry at VMA
14058    ADDR and return the VMA of the next entry.  */
14059
14060 static bfd_vma
14061 print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
14062 {
14063   printf ("  ");
14064   print_vma (addr, LONG_HEX);
14065   printf (" ");
14066   if (data == NULL)
14067     printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
14068   else
14069     {
14070       bfd_vma entry;
14071
14072       entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
14073       print_vma (entry, LONG_HEX);
14074     }
14075   return addr + (is_32bit_elf ? 4 : 8);
14076 }
14077
14078 static void
14079 print_mips_ases (unsigned int mask)
14080 {
14081   if (mask & AFL_ASE_DSP)
14082     fputs ("\n\tDSP ASE", stdout);
14083   if (mask & AFL_ASE_DSPR2)
14084     fputs ("\n\tDSP R2 ASE", stdout);
14085   if (mask & AFL_ASE_EVA)
14086     fputs ("\n\tEnhanced VA Scheme", stdout);
14087   if (mask & AFL_ASE_MCU)
14088     fputs ("\n\tMCU (MicroController) ASE", stdout);
14089   if (mask & AFL_ASE_MDMX)
14090     fputs ("\n\tMDMX ASE", stdout);
14091   if (mask & AFL_ASE_MIPS3D)
14092     fputs ("\n\tMIPS-3D ASE", stdout);
14093   if (mask & AFL_ASE_MT)
14094     fputs ("\n\tMT ASE", stdout);
14095   if (mask & AFL_ASE_SMARTMIPS)
14096     fputs ("\n\tSmartMIPS ASE", stdout);
14097   if (mask & AFL_ASE_VIRT)
14098     fputs ("\n\tVZ ASE", stdout);
14099   if (mask & AFL_ASE_MSA)
14100     fputs ("\n\tMSA ASE", stdout);
14101   if (mask & AFL_ASE_MIPS16)
14102     fputs ("\n\tMIPS16 ASE", stdout);
14103   if (mask & AFL_ASE_MICROMIPS)
14104     fputs ("\n\tMICROMIPS ASE", stdout);
14105   if (mask & AFL_ASE_XPA)
14106     fputs ("\n\tXPA ASE", stdout);
14107   if (mask == 0)
14108     fprintf (stdout, "\n\t%s", _("None"));
14109   else if ((mask & ~AFL_ASE_MASK) != 0)
14110     fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
14111 }
14112
14113 static void
14114 print_mips_isa_ext (unsigned int isa_ext)
14115 {
14116   switch (isa_ext)
14117     {
14118     case 0:
14119       fputs (_("None"), stdout);
14120       break;
14121     case AFL_EXT_XLR:
14122       fputs ("RMI XLR", stdout);
14123       break;
14124     case AFL_EXT_OCTEON3:
14125       fputs ("Cavium Networks Octeon3", stdout);
14126       break;
14127     case AFL_EXT_OCTEON2:
14128       fputs ("Cavium Networks Octeon2", stdout);
14129       break;
14130     case AFL_EXT_OCTEONP:
14131       fputs ("Cavium Networks OcteonP", stdout);
14132       break;
14133     case AFL_EXT_LOONGSON_3A:
14134       fputs ("Loongson 3A", stdout);
14135       break;
14136     case AFL_EXT_OCTEON:
14137       fputs ("Cavium Networks Octeon", stdout);
14138       break;
14139     case AFL_EXT_5900:
14140       fputs ("Toshiba R5900", stdout);
14141       break;
14142     case AFL_EXT_4650:
14143       fputs ("MIPS R4650", stdout);
14144       break;
14145     case AFL_EXT_4010:
14146       fputs ("LSI R4010", stdout);
14147       break;
14148     case AFL_EXT_4100:
14149       fputs ("NEC VR4100", stdout);
14150       break;
14151     case AFL_EXT_3900:
14152       fputs ("Toshiba R3900", stdout);
14153       break;
14154     case AFL_EXT_10000:
14155       fputs ("MIPS R10000", stdout);
14156       break;
14157     case AFL_EXT_SB1:
14158       fputs ("Broadcom SB-1", stdout);
14159       break;
14160     case AFL_EXT_4111:
14161       fputs ("NEC VR4111/VR4181", stdout);
14162       break;
14163     case AFL_EXT_4120:
14164       fputs ("NEC VR4120", stdout);
14165       break;
14166     case AFL_EXT_5400:
14167       fputs ("NEC VR5400", stdout);
14168       break;
14169     case AFL_EXT_5500:
14170       fputs ("NEC VR5500", stdout);
14171       break;
14172     case AFL_EXT_LOONGSON_2E:
14173       fputs ("ST Microelectronics Loongson 2E", stdout);
14174       break;
14175     case AFL_EXT_LOONGSON_2F:
14176       fputs ("ST Microelectronics Loongson 2F", stdout);
14177       break;
14178     default:
14179       fprintf (stdout, "%s (%d)", _("Unknown"), isa_ext);
14180     }
14181 }
14182
14183 static int
14184 get_mips_reg_size (int reg_size)
14185 {
14186   return (reg_size == AFL_REG_NONE) ? 0
14187          : (reg_size == AFL_REG_32) ? 32
14188          : (reg_size == AFL_REG_64) ? 64
14189          : (reg_size == AFL_REG_128) ? 128
14190          : -1;
14191 }
14192
14193 static int
14194 process_mips_specific (FILE * file)
14195 {
14196   Elf_Internal_Dyn * entry;
14197   Elf_Internal_Shdr *sect = NULL;
14198   size_t liblist_offset = 0;
14199   size_t liblistno = 0;
14200   size_t conflictsno = 0;
14201   size_t options_offset = 0;
14202   size_t conflicts_offset = 0;
14203   size_t pltrelsz = 0;
14204   size_t pltrel = 0;
14205   bfd_vma pltgot = 0;
14206   bfd_vma mips_pltgot = 0;
14207   bfd_vma jmprel = 0;
14208   bfd_vma local_gotno = 0;
14209   bfd_vma gotsym = 0;
14210   bfd_vma symtabno = 0;
14211
14212   process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14213                       display_mips_gnu_attribute);
14214
14215   sect = find_section (".MIPS.abiflags");
14216
14217   if (sect != NULL)
14218     {
14219       Elf_External_ABIFlags_v0 *abiflags_ext;
14220       Elf_Internal_ABIFlags_v0 abiflags_in;
14221
14222       if (sizeof (Elf_External_ABIFlags_v0) != sect->sh_size)
14223         fputs ("\nCorrupt ABI Flags section.\n", stdout);
14224       else
14225         {
14226           abiflags_ext = get_data (NULL, file, sect->sh_offset, 1,
14227                                    sect->sh_size, _("MIPS ABI Flags section"));
14228           if (abiflags_ext)
14229             {
14230               abiflags_in.version = BYTE_GET (abiflags_ext->version);
14231               abiflags_in.isa_level = BYTE_GET (abiflags_ext->isa_level);
14232               abiflags_in.isa_rev = BYTE_GET (abiflags_ext->isa_rev);
14233               abiflags_in.gpr_size = BYTE_GET (abiflags_ext->gpr_size);
14234               abiflags_in.cpr1_size = BYTE_GET (abiflags_ext->cpr1_size);
14235               abiflags_in.cpr2_size = BYTE_GET (abiflags_ext->cpr2_size);
14236               abiflags_in.fp_abi = BYTE_GET (abiflags_ext->fp_abi);
14237               abiflags_in.isa_ext = BYTE_GET (abiflags_ext->isa_ext);
14238               abiflags_in.ases = BYTE_GET (abiflags_ext->ases);
14239               abiflags_in.flags1 = BYTE_GET (abiflags_ext->flags1);
14240               abiflags_in.flags2 = BYTE_GET (abiflags_ext->flags2);
14241
14242               printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in.version);
14243               printf ("\nISA: MIPS%d", abiflags_in.isa_level);
14244               if (abiflags_in.isa_rev > 1)
14245                 printf ("r%d", abiflags_in.isa_rev);
14246               printf ("\nGPR size: %d",
14247                       get_mips_reg_size (abiflags_in.gpr_size));
14248               printf ("\nCPR1 size: %d",
14249                       get_mips_reg_size (abiflags_in.cpr1_size));
14250               printf ("\nCPR2 size: %d",
14251                       get_mips_reg_size (abiflags_in.cpr2_size));
14252               fputs ("\nFP ABI: ", stdout);
14253               print_mips_fp_abi_value (abiflags_in.fp_abi);
14254               fputs ("ISA Extension: ", stdout);
14255               print_mips_isa_ext (abiflags_in.isa_ext);
14256               fputs ("\nASEs:", stdout);
14257               print_mips_ases (abiflags_in.ases);
14258               printf ("\nFLAGS 1: %8.8lx", abiflags_in.flags1);
14259               printf ("\nFLAGS 2: %8.8lx", abiflags_in.flags2);
14260               fputc ('\n', stdout);
14261               free (abiflags_ext);
14262             }
14263         }
14264     }
14265
14266   /* We have a lot of special sections.  Thanks SGI!  */
14267   if (dynamic_section == NULL)
14268     /* No information available.  */
14269     return 0;
14270
14271   for (entry = dynamic_section;
14272        /* PR 17531 file: 012-50589-0.004.  */
14273        entry < dynamic_section + dynamic_nent && entry->d_tag != DT_NULL;
14274        ++entry)
14275     switch (entry->d_tag)
14276       {
14277       case DT_MIPS_LIBLIST:
14278         liblist_offset
14279           = offset_from_vma (file, entry->d_un.d_val,
14280                              liblistno * sizeof (Elf32_External_Lib));
14281         break;
14282       case DT_MIPS_LIBLISTNO:
14283         liblistno = entry->d_un.d_val;
14284         break;
14285       case DT_MIPS_OPTIONS:
14286         options_offset = offset_from_vma (file, entry->d_un.d_val, 0);
14287         break;
14288       case DT_MIPS_CONFLICT:
14289         conflicts_offset
14290           = offset_from_vma (file, entry->d_un.d_val,
14291                              conflictsno * sizeof (Elf32_External_Conflict));
14292         break;
14293       case DT_MIPS_CONFLICTNO:
14294         conflictsno = entry->d_un.d_val;
14295         break;
14296       case DT_PLTGOT:
14297         pltgot = entry->d_un.d_ptr;
14298         break;
14299       case DT_MIPS_LOCAL_GOTNO:
14300         local_gotno = entry->d_un.d_val;
14301         break;
14302       case DT_MIPS_GOTSYM:
14303         gotsym = entry->d_un.d_val;
14304         break;
14305       case DT_MIPS_SYMTABNO:
14306         symtabno = entry->d_un.d_val;
14307         break;
14308       case DT_MIPS_PLTGOT:
14309         mips_pltgot = entry->d_un.d_ptr;
14310         break;
14311       case DT_PLTREL:
14312         pltrel = entry->d_un.d_val;
14313         break;
14314       case DT_PLTRELSZ:
14315         pltrelsz = entry->d_un.d_val;
14316         break;
14317       case DT_JMPREL:
14318         jmprel = entry->d_un.d_ptr;
14319         break;
14320       default:
14321         break;
14322       }
14323
14324   if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
14325     {
14326       Elf32_External_Lib * elib;
14327       size_t cnt;
14328
14329       elib = (Elf32_External_Lib *) get_data (NULL, file, liblist_offset,
14330                                               liblistno,
14331                                               sizeof (Elf32_External_Lib),
14332                                               _("liblist section data"));
14333       if (elib)
14334         {
14335           printf (_("\nSection '.liblist' contains %lu entries:\n"),
14336                   (unsigned long) liblistno);
14337           fputs (_("     Library              Time Stamp          Checksum   Version Flags\n"),
14338                  stdout);
14339
14340           for (cnt = 0; cnt < liblistno; ++cnt)
14341             {
14342               Elf32_Lib liblist;
14343               time_t atime;
14344               char timebuf[20];
14345               struct tm * tmp;
14346
14347               liblist.l_name = BYTE_GET (elib[cnt].l_name);
14348               atime = BYTE_GET (elib[cnt].l_time_stamp);
14349               liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
14350               liblist.l_version = BYTE_GET (elib[cnt].l_version);
14351               liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
14352
14353               tmp = gmtime (&atime);
14354               snprintf (timebuf, sizeof (timebuf),
14355                         "%04u-%02u-%02uT%02u:%02u:%02u",
14356                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
14357                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
14358
14359               printf ("%3lu: ", (unsigned long) cnt);
14360               if (VALID_DYNAMIC_NAME (liblist.l_name))
14361                 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
14362               else
14363                 printf (_("<corrupt: %9ld>"), liblist.l_name);
14364               printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
14365                       liblist.l_version);
14366
14367               if (liblist.l_flags == 0)
14368                 puts (_(" NONE"));
14369               else
14370                 {
14371                   static const struct
14372                   {
14373                     const char * name;
14374                     int bit;
14375                   }
14376                   l_flags_vals[] =
14377                   {
14378                     { " EXACT_MATCH", LL_EXACT_MATCH },
14379                     { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
14380                     { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
14381                     { " EXPORTS", LL_EXPORTS },
14382                     { " DELAY_LOAD", LL_DELAY_LOAD },
14383                     { " DELTA", LL_DELTA }
14384                   };
14385                   int flags = liblist.l_flags;
14386                   size_t fcnt;
14387
14388                   for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
14389                     if ((flags & l_flags_vals[fcnt].bit) != 0)
14390                       {
14391                         fputs (l_flags_vals[fcnt].name, stdout);
14392                         flags ^= l_flags_vals[fcnt].bit;
14393                       }
14394                   if (flags != 0)
14395                     printf (" %#x", (unsigned int) flags);
14396
14397                   puts ("");
14398                 }
14399             }
14400
14401           free (elib);
14402         }
14403     }
14404
14405   if (options_offset != 0)
14406     {
14407       Elf_External_Options * eopt;
14408       Elf_Internal_Options * iopt;
14409       Elf_Internal_Options * option;
14410       size_t offset;
14411       int cnt;
14412       sect = section_headers;
14413
14414       /* Find the section header so that we get the size.  */
14415       sect = find_section_by_type (SHT_MIPS_OPTIONS);
14416       /* PR 17533 file: 012-277276-0.004.  */
14417       if (sect == NULL)
14418         {
14419           error (_("No MIPS_OPTIONS header found\n"));
14420           return 0;
14421         }
14422
14423       eopt = (Elf_External_Options *) get_data (NULL, file, options_offset, 1,
14424                                                 sect->sh_size, _("options"));
14425       if (eopt)
14426         {
14427           iopt = (Elf_Internal_Options *)
14428               cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
14429           if (iopt == NULL)
14430             {
14431               error (_("Out of memory allocatinf space for MIPS options\n"));
14432               return 0;
14433             }
14434
14435           offset = cnt = 0;
14436           option = iopt;
14437
14438           while (offset <= sect->sh_size - sizeof (* eopt))
14439             {
14440               Elf_External_Options * eoption;
14441
14442               eoption = (Elf_External_Options *) ((char *) eopt + offset);
14443
14444               option->kind = BYTE_GET (eoption->kind);
14445               option->size = BYTE_GET (eoption->size);
14446               option->section = BYTE_GET (eoption->section);
14447               option->info = BYTE_GET (eoption->info);
14448
14449               /* PR 17531: file: ffa0fa3b.  */
14450               if (option->size < sizeof (* eopt)
14451                   || offset + option->size > sect->sh_size)
14452                 {
14453                   error (_("Invalid size (%u) for MIPS option\n"), option->size);
14454                   return 0;
14455                 }
14456               offset += option->size;
14457
14458               ++option;
14459               ++cnt;
14460             }
14461
14462           printf (_("\nSection '%s' contains %d entries:\n"),
14463                   printable_section_name (sect), cnt);
14464
14465           option = iopt;
14466           offset = 0;
14467
14468           while (cnt-- > 0)
14469             {
14470               size_t len;
14471
14472               switch (option->kind)
14473                 {
14474                 case ODK_NULL:
14475                   /* This shouldn't happen.  */
14476                   printf (" NULL       %d %lx", option->section, option->info);
14477                   break;
14478                 case ODK_REGINFO:
14479                   printf (" REGINFO    ");
14480                   if (elf_header.e_machine == EM_MIPS)
14481                     {
14482                       /* 32bit form.  */
14483                       Elf32_External_RegInfo * ereg;
14484                       Elf32_RegInfo reginfo;
14485
14486                       ereg = (Elf32_External_RegInfo *) (option + 1);
14487                       reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
14488                       reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
14489                       reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
14490                       reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
14491                       reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
14492                       reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
14493
14494                       printf ("GPR %08lx  GP 0x%lx\n",
14495                               reginfo.ri_gprmask,
14496                               (unsigned long) reginfo.ri_gp_value);
14497                       printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
14498                               reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
14499                               reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
14500                     }
14501                   else
14502                     {
14503                       /* 64 bit form.  */
14504                       Elf64_External_RegInfo * ereg;
14505                       Elf64_Internal_RegInfo reginfo;
14506
14507                       ereg = (Elf64_External_RegInfo *) (option + 1);
14508                       reginfo.ri_gprmask    = BYTE_GET (ereg->ri_gprmask);
14509                       reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
14510                       reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
14511                       reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
14512                       reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
14513                       reginfo.ri_gp_value   = BYTE_GET (ereg->ri_gp_value);
14514
14515                       printf ("GPR %08lx  GP 0x",
14516                               reginfo.ri_gprmask);
14517                       printf_vma (reginfo.ri_gp_value);
14518                       printf ("\n");
14519
14520                       printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
14521                               reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
14522                               reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
14523                     }
14524                   ++option;
14525                   continue;
14526                 case ODK_EXCEPTIONS:
14527                   fputs (" EXCEPTIONS fpe_min(", stdout);
14528                   process_mips_fpe_exception (option->info & OEX_FPU_MIN);
14529                   fputs (") fpe_max(", stdout);
14530                   process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
14531                   fputs (")", stdout);
14532
14533                   if (option->info & OEX_PAGE0)
14534                     fputs (" PAGE0", stdout);
14535                   if (option->info & OEX_SMM)
14536                     fputs (" SMM", stdout);
14537                   if (option->info & OEX_FPDBUG)
14538                     fputs (" FPDBUG", stdout);
14539                   if (option->info & OEX_DISMISS)
14540                     fputs (" DISMISS", stdout);
14541                   break;
14542                 case ODK_PAD:
14543                   fputs (" PAD       ", stdout);
14544                   if (option->info & OPAD_PREFIX)
14545                     fputs (" PREFIX", stdout);
14546                   if (option->info & OPAD_POSTFIX)
14547                     fputs (" POSTFIX", stdout);
14548                   if (option->info & OPAD_SYMBOL)
14549                     fputs (" SYMBOL", stdout);
14550                   break;
14551                 case ODK_HWPATCH:
14552                   fputs (" HWPATCH   ", stdout);
14553                   if (option->info & OHW_R4KEOP)
14554                     fputs (" R4KEOP", stdout);
14555                   if (option->info & OHW_R8KPFETCH)
14556                     fputs (" R8KPFETCH", stdout);
14557                   if (option->info & OHW_R5KEOP)
14558                     fputs (" R5KEOP", stdout);
14559                   if (option->info & OHW_R5KCVTL)
14560                     fputs (" R5KCVTL", stdout);
14561                   break;
14562                 case ODK_FILL:
14563                   fputs (" FILL       ", stdout);
14564                   /* XXX Print content of info word?  */
14565                   break;
14566                 case ODK_TAGS:
14567                   fputs (" TAGS       ", stdout);
14568                   /* XXX Print content of info word?  */
14569                   break;
14570                 case ODK_HWAND:
14571                   fputs (" HWAND     ", stdout);
14572                   if (option->info & OHWA0_R4KEOP_CHECKED)
14573                     fputs (" R4KEOP_CHECKED", stdout);
14574                   if (option->info & OHWA0_R4KEOP_CLEAN)
14575                     fputs (" R4KEOP_CLEAN", stdout);
14576                   break;
14577                 case ODK_HWOR:
14578                   fputs (" HWOR      ", stdout);
14579                   if (option->info & OHWA0_R4KEOP_CHECKED)
14580                     fputs (" R4KEOP_CHECKED", stdout);
14581                   if (option->info & OHWA0_R4KEOP_CLEAN)
14582                     fputs (" R4KEOP_CLEAN", stdout);
14583                   break;
14584                 case ODK_GP_GROUP:
14585                   printf (" GP_GROUP  %#06lx  self-contained %#06lx",
14586                           option->info & OGP_GROUP,
14587                           (option->info & OGP_SELF) >> 16);
14588                   break;
14589                 case ODK_IDENT:
14590                   printf (" IDENT     %#06lx  self-contained %#06lx",
14591                           option->info & OGP_GROUP,
14592                           (option->info & OGP_SELF) >> 16);
14593                   break;
14594                 default:
14595                   /* This shouldn't happen.  */
14596                   printf (" %3d ???     %d %lx",
14597                           option->kind, option->section, option->info);
14598                   break;
14599                 }
14600
14601               len = sizeof (* eopt);
14602               while (len < option->size)
14603                 {
14604                   unsigned char datum = * ((unsigned char *) eopt + offset + len);
14605
14606                   if (ISPRINT (datum))
14607                     printf ("%c", datum);
14608                   else
14609                     printf ("\\%03o", datum);
14610                   len ++;
14611                 }
14612               fputs ("\n", stdout);
14613
14614               offset += option->size;
14615               ++option;
14616             }
14617
14618           free (eopt);
14619         }
14620     }
14621
14622   if (conflicts_offset != 0 && conflictsno != 0)
14623     {
14624       Elf32_Conflict * iconf;
14625       size_t cnt;
14626
14627       if (dynamic_symbols == NULL)
14628         {
14629           error (_("conflict list found without a dynamic symbol table\n"));
14630           return 0;
14631         }
14632
14633       iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
14634       if (iconf == NULL)
14635         {
14636           error (_("Out of memory allocating space for dynamic conflicts\n"));
14637           return 0;
14638         }
14639
14640       if (is_32bit_elf)
14641         {
14642           Elf32_External_Conflict * econf32;
14643
14644           econf32 = (Elf32_External_Conflict *)
14645               get_data (NULL, file, conflicts_offset, conflictsno,
14646                         sizeof (* econf32), _("conflict"));
14647           if (!econf32)
14648             return 0;
14649
14650           for (cnt = 0; cnt < conflictsno; ++cnt)
14651             iconf[cnt] = BYTE_GET (econf32[cnt]);
14652
14653           free (econf32);
14654         }
14655       else
14656         {
14657           Elf64_External_Conflict * econf64;
14658
14659           econf64 = (Elf64_External_Conflict *)
14660               get_data (NULL, file, conflicts_offset, conflictsno,
14661                         sizeof (* econf64), _("conflict"));
14662           if (!econf64)
14663             return 0;
14664
14665           for (cnt = 0; cnt < conflictsno; ++cnt)
14666             iconf[cnt] = BYTE_GET (econf64[cnt]);
14667
14668           free (econf64);
14669         }
14670
14671       printf (_("\nSection '.conflict' contains %lu entries:\n"),
14672               (unsigned long) conflictsno);
14673       puts (_("  Num:    Index       Value  Name"));
14674
14675       for (cnt = 0; cnt < conflictsno; ++cnt)
14676         {
14677           printf ("%5lu: %8lu  ", (unsigned long) cnt, iconf[cnt]);
14678
14679           if (iconf[cnt] >= num_dynamic_syms)
14680             printf (_("<corrupt symbol index>"));
14681           else
14682             {
14683               Elf_Internal_Sym * psym;
14684
14685               psym = & dynamic_symbols[iconf[cnt]];
14686               print_vma (psym->st_value, FULL_HEX);
14687               putchar (' ');
14688               if (VALID_DYNAMIC_NAME (psym->st_name))
14689                 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
14690               else
14691                 printf (_("<corrupt: %14ld>"), psym->st_name);
14692             }
14693           putchar ('\n');
14694         }
14695
14696       free (iconf);
14697     }
14698
14699   if (pltgot != 0 && local_gotno != 0)
14700     {
14701       bfd_vma ent, local_end, global_end;
14702       size_t i, offset;
14703       unsigned char * data;
14704       unsigned char * data_end;
14705       int addr_size;
14706
14707       ent = pltgot;
14708       addr_size = (is_32bit_elf ? 4 : 8);
14709       local_end = pltgot + local_gotno * addr_size;
14710
14711       /* PR binutils/17533 file: 012-111227-0.004  */
14712       if (symtabno < gotsym)
14713         {
14714           error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
14715                  (unsigned long) gotsym, (unsigned long) symtabno);
14716           return 0;
14717         }
14718
14719       global_end = local_end + (symtabno - gotsym) * addr_size;
14720       /* PR 17531: file: 54c91a34.  */
14721       if (global_end < local_end)
14722         {
14723           error (_("Too many GOT symbols: %lu\n"), (unsigned long) symtabno);
14724           return 0;
14725         }
14726
14727       offset = offset_from_vma (file, pltgot, global_end - pltgot);
14728       data = (unsigned char *) get_data (NULL, file, offset,
14729                                          global_end - pltgot, 1,
14730                                          _("Global Offset Table data"));
14731       if (data == NULL)
14732         return 0;
14733       data_end = data + (global_end - pltgot);
14734
14735       printf (_("\nPrimary GOT:\n"));
14736       printf (_(" Canonical gp value: "));
14737       print_vma (pltgot + 0x7ff0, LONG_HEX);
14738       printf ("\n\n");
14739
14740       printf (_(" Reserved entries:\n"));
14741       printf (_("  %*s %10s %*s Purpose\n"),
14742               addr_size * 2, _("Address"), _("Access"),
14743               addr_size * 2, _("Initial"));
14744       ent = print_mips_got_entry (data, pltgot, ent, data_end);
14745       printf (_(" Lazy resolver\n"));
14746       if (ent == (bfd_vma) -1)
14747         goto got_print_fail;
14748       if (data
14749           && (byte_get (data + ent - pltgot, addr_size)
14750               >> (addr_size * 8 - 1)) != 0)
14751         {
14752           ent = print_mips_got_entry (data, pltgot, ent, data_end);
14753           printf (_(" Module pointer (GNU extension)\n"));
14754           if (ent == (bfd_vma) -1)
14755             goto got_print_fail;
14756         }
14757       printf ("\n");
14758
14759       if (ent < local_end)
14760         {
14761           printf (_(" Local entries:\n"));
14762           printf ("  %*s %10s %*s\n",
14763                   addr_size * 2, _("Address"), _("Access"),
14764                   addr_size * 2, _("Initial"));
14765           while (ent < local_end)
14766             {
14767               ent = print_mips_got_entry (data, pltgot, ent, data_end);
14768               printf ("\n");
14769               if (ent == (bfd_vma) -1)
14770                 goto got_print_fail;
14771             }
14772           printf ("\n");
14773         }
14774
14775       if (gotsym < symtabno)
14776         {
14777           int sym_width;
14778
14779           printf (_(" Global entries:\n"));
14780           printf ("  %*s %10s %*s %*s %-7s %3s %s\n",
14781                   addr_size * 2, _("Address"),
14782                   _("Access"),
14783                   addr_size * 2, _("Initial"),
14784                   addr_size * 2, _("Sym.Val."),
14785                   _("Type"),
14786                   /* Note for translators: "Ndx" = abbreviated form of "Index".  */
14787                   _("Ndx"), _("Name"));
14788
14789           sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
14790
14791           for (i = gotsym; i < symtabno; i++)
14792             {
14793               ent = print_mips_got_entry (data, pltgot, ent, data_end);
14794               printf (" ");
14795
14796               if (dynamic_symbols == NULL)
14797                 printf (_("<no dynamic symbols>"));
14798               else if (i < num_dynamic_syms)
14799                 {
14800                   Elf_Internal_Sym * psym = dynamic_symbols + i;
14801
14802                   print_vma (psym->st_value, LONG_HEX);
14803                   printf (" %-7s %3s ",
14804                           get_symbol_type (ELF_ST_TYPE (psym->st_info)),
14805                           get_symbol_index_type (psym->st_shndx));
14806
14807                   if (VALID_DYNAMIC_NAME (psym->st_name))
14808                     print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
14809                   else
14810                     printf (_("<corrupt: %14ld>"), psym->st_name);
14811                 }
14812               else
14813                 printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
14814                         (unsigned long) i);
14815
14816               printf ("\n");
14817               if (ent == (bfd_vma) -1)
14818                 break;
14819             }
14820           printf ("\n");
14821         }
14822
14823     got_print_fail:
14824       if (data)
14825         free (data);
14826     }
14827
14828   if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
14829     {
14830       bfd_vma ent, end;
14831       size_t offset, rel_offset;
14832       unsigned long count, i;
14833       unsigned char * data;
14834       int addr_size, sym_width;
14835       Elf_Internal_Rela * rels;
14836
14837       rel_offset = offset_from_vma (file, jmprel, pltrelsz);
14838       if (pltrel == DT_RELA)
14839         {
14840           if (!slurp_rela_relocs (file, rel_offset, pltrelsz, &rels, &count))
14841             return 0;
14842         }
14843       else
14844         {
14845           if (!slurp_rel_relocs (file, rel_offset, pltrelsz, &rels, &count))
14846             return 0;
14847         }
14848
14849       ent = mips_pltgot;
14850       addr_size = (is_32bit_elf ? 4 : 8);
14851       end = mips_pltgot + (2 + count) * addr_size;
14852
14853       offset = offset_from_vma (file, mips_pltgot, end - mips_pltgot);
14854       data = (unsigned char *) get_data (NULL, file, offset, end - mips_pltgot,
14855                                          1, _("Procedure Linkage Table data"));
14856       if (data == NULL)
14857         return 0;
14858
14859       printf ("\nPLT GOT:\n\n");
14860       printf (_(" Reserved entries:\n"));
14861       printf (_("  %*s %*s Purpose\n"),
14862               addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
14863       ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
14864       printf (_(" PLT lazy resolver\n"));
14865       ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
14866       printf (_(" Module pointer\n"));
14867       printf ("\n");
14868
14869       printf (_(" Entries:\n"));
14870       printf ("  %*s %*s %*s %-7s %3s %s\n",
14871               addr_size * 2, _("Address"),
14872               addr_size * 2, _("Initial"),
14873               addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
14874       sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
14875       for (i = 0; i < count; i++)
14876         {
14877           unsigned long idx = get_reloc_symindex (rels[i].r_info);
14878
14879           ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
14880           printf (" ");
14881
14882           if (idx >= num_dynamic_syms)
14883             printf (_("<corrupt symbol index: %lu>"), idx);
14884           else
14885             {
14886               Elf_Internal_Sym * psym = dynamic_symbols + idx;
14887
14888               print_vma (psym->st_value, LONG_HEX);
14889               printf (" %-7s %3s ",
14890                       get_symbol_type (ELF_ST_TYPE (psym->st_info)),
14891                       get_symbol_index_type (psym->st_shndx));
14892               if (VALID_DYNAMIC_NAME (psym->st_name))
14893                 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
14894               else
14895                 printf (_("<corrupt: %14ld>"), psym->st_name);
14896             }
14897           printf ("\n");
14898         }
14899       printf ("\n");
14900
14901       if (data)
14902         free (data);
14903       free (rels);
14904     }
14905
14906   return 1;
14907 }
14908
14909 static int
14910 process_nds32_specific (FILE * file)
14911 {
14912   Elf_Internal_Shdr *sect = NULL;
14913
14914   sect = find_section (".nds32_e_flags");
14915   if (sect != NULL)
14916     {
14917       unsigned int *flag;
14918
14919       printf ("\nNDS32 elf flags section:\n");
14920       flag = get_data (NULL, file, sect->sh_offset, 1,
14921                        sect->sh_size, _("NDS32 elf flags section"));
14922
14923       switch ((*flag) & 0x3)
14924         {
14925         case 0:
14926           printf ("(VEC_SIZE):\tNo entry.\n");
14927           break;
14928         case 1:
14929           printf ("(VEC_SIZE):\t4 bytes\n");
14930           break;
14931         case 2:
14932           printf ("(VEC_SIZE):\t16 bytes\n");
14933           break;
14934         case 3:
14935           printf ("(VEC_SIZE):\treserved\n");
14936           break;
14937         }
14938     }
14939
14940   return TRUE;
14941 }
14942
14943 static int
14944 process_gnu_liblist (FILE * file)
14945 {
14946   Elf_Internal_Shdr * section;
14947   Elf_Internal_Shdr * string_sec;
14948   Elf32_External_Lib * elib;
14949   char * strtab;
14950   size_t strtab_size;
14951   size_t cnt;
14952   unsigned i;
14953
14954   if (! do_arch)
14955     return 0;
14956
14957   for (i = 0, section = section_headers;
14958        i < elf_header.e_shnum;
14959        i++, section++)
14960     {
14961       switch (section->sh_type)
14962         {
14963         case SHT_GNU_LIBLIST:
14964           if (section->sh_link >= elf_header.e_shnum)
14965             break;
14966
14967           elib = (Elf32_External_Lib *)
14968               get_data (NULL, file, section->sh_offset, 1, section->sh_size,
14969                         _("liblist section data"));
14970
14971           if (elib == NULL)
14972             break;
14973           string_sec = section_headers + section->sh_link;
14974
14975           strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
14976                                       string_sec->sh_size,
14977                                       _("liblist string table"));
14978           if (strtab == NULL
14979               || section->sh_entsize != sizeof (Elf32_External_Lib))
14980             {
14981               free (elib);
14982               free (strtab);
14983               break;
14984             }
14985           strtab_size = string_sec->sh_size;
14986
14987           printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
14988                   printable_section_name (section),
14989                   (unsigned long) (section->sh_size / sizeof (Elf32_External_Lib)));
14990
14991           puts (_("     Library              Time Stamp          Checksum   Version Flags"));
14992
14993           for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
14994                ++cnt)
14995             {
14996               Elf32_Lib liblist;
14997               time_t atime;
14998               char timebuf[20];
14999               struct tm * tmp;
15000
15001               liblist.l_name = BYTE_GET (elib[cnt].l_name);
15002               atime = BYTE_GET (elib[cnt].l_time_stamp);
15003               liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
15004               liblist.l_version = BYTE_GET (elib[cnt].l_version);
15005               liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
15006
15007               tmp = gmtime (&atime);
15008               snprintf (timebuf, sizeof (timebuf),
15009                         "%04u-%02u-%02uT%02u:%02u:%02u",
15010                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
15011                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
15012
15013               printf ("%3lu: ", (unsigned long) cnt);
15014               if (do_wide)
15015                 printf ("%-20s", liblist.l_name < strtab_size
15016                         ? strtab + liblist.l_name : _("<corrupt>"));
15017               else
15018                 printf ("%-20.20s", liblist.l_name < strtab_size
15019                         ? strtab + liblist.l_name : _("<corrupt>"));
15020               printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
15021                       liblist.l_version, liblist.l_flags);
15022             }
15023
15024           free (elib);
15025           free (strtab);
15026         }
15027     }
15028
15029   return 1;
15030 }
15031
15032 static const char *
15033 get_note_type (unsigned e_type)
15034 {
15035   static char buff[64];
15036
15037   if (elf_header.e_type == ET_CORE)
15038     switch (e_type)
15039       {
15040       case NT_AUXV:
15041         return _("NT_AUXV (auxiliary vector)");
15042       case NT_PRSTATUS:
15043         return _("NT_PRSTATUS (prstatus structure)");
15044       case NT_FPREGSET:
15045         return _("NT_FPREGSET (floating point registers)");
15046       case NT_PRPSINFO:
15047         return _("NT_PRPSINFO (prpsinfo structure)");
15048       case NT_TASKSTRUCT:
15049         return _("NT_TASKSTRUCT (task structure)");
15050       case NT_PRXFPREG:
15051         return _("NT_PRXFPREG (user_xfpregs structure)");
15052       case NT_PPC_VMX:
15053         return _("NT_PPC_VMX (ppc Altivec registers)");
15054       case NT_PPC_VSX:
15055         return _("NT_PPC_VSX (ppc VSX registers)");
15056       case NT_386_TLS:
15057         return _("NT_386_TLS (x86 TLS information)");
15058       case NT_386_IOPERM:
15059         return _("NT_386_IOPERM (x86 I/O permissions)");
15060       case NT_X86_XSTATE:
15061         return _("NT_X86_XSTATE (x86 XSAVE extended state)");
15062       case NT_S390_HIGH_GPRS:
15063         return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
15064       case NT_S390_TIMER:
15065         return _("NT_S390_TIMER (s390 timer register)");
15066       case NT_S390_TODCMP:
15067         return _("NT_S390_TODCMP (s390 TOD comparator register)");
15068       case NT_S390_TODPREG:
15069         return _("NT_S390_TODPREG (s390 TOD programmable register)");
15070       case NT_S390_CTRS:
15071         return _("NT_S390_CTRS (s390 control registers)");
15072       case NT_S390_PREFIX:
15073         return _("NT_S390_PREFIX (s390 prefix register)");
15074       case NT_S390_LAST_BREAK:
15075         return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
15076       case NT_S390_SYSTEM_CALL:
15077         return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
15078       case NT_S390_TDB:
15079         return _("NT_S390_TDB (s390 transaction diagnostic block)");
15080       case NT_S390_VXRS_LOW:
15081         return _("NT_S390_VXRS_LOW (s390 vector registers 0-15 upper half)");
15082       case NT_S390_VXRS_HIGH:
15083         return _("NT_S390_VXRS_HIGH (s390 vector registers 16-31)");
15084       case NT_ARM_VFP:
15085         return _("NT_ARM_VFP (arm VFP registers)");
15086       case NT_ARM_TLS:
15087         return _("NT_ARM_TLS (AArch TLS registers)");
15088       case NT_ARM_HW_BREAK:
15089         return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
15090       case NT_ARM_HW_WATCH:
15091         return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
15092       case NT_PSTATUS:
15093         return _("NT_PSTATUS (pstatus structure)");
15094       case NT_FPREGS:
15095         return _("NT_FPREGS (floating point registers)");
15096       case NT_PSINFO:
15097         return _("NT_PSINFO (psinfo structure)");
15098       case NT_LWPSTATUS:
15099         return _("NT_LWPSTATUS (lwpstatus_t structure)");
15100       case NT_LWPSINFO:
15101         return _("NT_LWPSINFO (lwpsinfo_t structure)");
15102       case NT_WIN32PSTATUS:
15103         return _("NT_WIN32PSTATUS (win32_pstatus structure)");
15104       case NT_SIGINFO:
15105         return _("NT_SIGINFO (siginfo_t data)");
15106       case NT_FILE:
15107         return _("NT_FILE (mapped files)");
15108       default:
15109         break;
15110       }
15111   else
15112     switch (e_type)
15113       {
15114       case NT_VERSION:
15115         return _("NT_VERSION (version)");
15116       case NT_ARCH:
15117         return _("NT_ARCH (architecture)");
15118       default:
15119         break;
15120       }
15121
15122   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15123   return buff;
15124 }
15125
15126 static int
15127 print_core_note (Elf_Internal_Note *pnote)
15128 {
15129   unsigned int addr_size = is_32bit_elf ? 4 : 8;
15130   bfd_vma count, page_size;
15131   unsigned char *descdata, *filenames, *descend;
15132
15133   if (pnote->type != NT_FILE)
15134     return 1;
15135
15136 #ifndef BFD64
15137   if (!is_32bit_elf)
15138     {
15139       printf (_("    Cannot decode 64-bit note in 32-bit build\n"));
15140       /* Still "successful".  */
15141       return 1;
15142     }
15143 #endif
15144
15145   if (pnote->descsz < 2 * addr_size)
15146     {
15147       printf (_("    Malformed note - too short for header\n"));
15148       return 0;
15149     }
15150
15151   descdata = (unsigned char *) pnote->descdata;
15152   descend = descdata + pnote->descsz;
15153
15154   if (descdata[pnote->descsz - 1] != '\0')
15155     {
15156       printf (_("    Malformed note - does not end with \\0\n"));
15157       return 0;
15158     }
15159
15160   count = byte_get (descdata, addr_size);
15161   descdata += addr_size;
15162
15163   page_size = byte_get (descdata, addr_size);
15164   descdata += addr_size;
15165
15166   if (pnote->descsz < 2 * addr_size + count * 3 * addr_size)
15167     {
15168       printf (_("    Malformed note - too short for supplied file count\n"));
15169       return 0;
15170     }
15171
15172   printf (_("    Page size: "));
15173   print_vma (page_size, DEC);
15174   printf ("\n");
15175
15176   printf (_("    %*s%*s%*s\n"),
15177           (int) (2 + 2 * addr_size), _("Start"),
15178           (int) (4 + 2 * addr_size), _("End"),
15179           (int) (4 + 2 * addr_size), _("Page Offset"));
15180   filenames = descdata + count * 3 * addr_size;
15181   while (count-- > 0)
15182     {
15183       bfd_vma start, end, file_ofs;
15184
15185       if (filenames == descend)
15186         {
15187           printf (_("    Malformed note - filenames end too early\n"));
15188           return 0;
15189         }
15190
15191       start = byte_get (descdata, addr_size);
15192       descdata += addr_size;
15193       end = byte_get (descdata, addr_size);
15194       descdata += addr_size;
15195       file_ofs = byte_get (descdata, addr_size);
15196       descdata += addr_size;
15197
15198       printf ("    ");
15199       print_vma (start, FULL_HEX);
15200       printf ("  ");
15201       print_vma (end, FULL_HEX);
15202       printf ("  ");
15203       print_vma (file_ofs, FULL_HEX);
15204       printf ("\n        %s\n", filenames);
15205
15206       filenames += 1 + strlen ((char *) filenames);
15207     }
15208
15209   return 1;
15210 }
15211
15212 static const char *
15213 get_gnu_elf_note_type (unsigned e_type)
15214 {
15215   static char buff[64];
15216
15217   switch (e_type)
15218     {
15219     case NT_GNU_ABI_TAG:
15220       return _("NT_GNU_ABI_TAG (ABI version tag)");
15221     case NT_GNU_HWCAP:
15222       return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
15223     case NT_GNU_BUILD_ID:
15224       return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
15225     case NT_GNU_GOLD_VERSION:
15226       return _("NT_GNU_GOLD_VERSION (gold version)");
15227     default:
15228       break;
15229     }
15230
15231   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15232   return buff;
15233 }
15234
15235 static int
15236 print_gnu_note (Elf_Internal_Note *pnote)
15237 {
15238   switch (pnote->type)
15239     {
15240     case NT_GNU_BUILD_ID:
15241       {
15242         unsigned long i;
15243
15244         printf (_("    Build ID: "));
15245         for (i = 0; i < pnote->descsz; ++i)
15246           printf ("%02x", pnote->descdata[i] & 0xff);
15247         printf ("\n");
15248       }
15249       break;
15250
15251     case NT_GNU_ABI_TAG:
15252       {
15253         unsigned long os, major, minor, subminor;
15254         const char *osname;
15255
15256         /* PR 17531: file: 030-599401-0.004.  */
15257         if (pnote->descsz < 16)
15258           {
15259             printf (_("    <corrupt GNU_ABI_TAG>\n"));
15260             break;
15261           }
15262
15263         os = byte_get ((unsigned char *) pnote->descdata, 4);
15264         major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
15265         minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
15266         subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
15267
15268         switch (os)
15269           {
15270           case GNU_ABI_TAG_LINUX:
15271             osname = "Linux";
15272             break;
15273           case GNU_ABI_TAG_HURD:
15274             osname = "Hurd";
15275             break;
15276           case GNU_ABI_TAG_SOLARIS:
15277             osname = "Solaris";
15278             break;
15279           case GNU_ABI_TAG_FREEBSD:
15280             osname = "FreeBSD";
15281             break;
15282           case GNU_ABI_TAG_NETBSD:
15283             osname = "NetBSD";
15284             break;
15285           case GNU_ABI_TAG_SYLLABLE:
15286             osname = "Syllable";
15287             break;
15288           case GNU_ABI_TAG_NACL:
15289             osname = "NaCl";
15290             break;
15291           default:
15292             osname = "Unknown";
15293             break;
15294           }
15295
15296         printf (_("    OS: %s, ABI: %ld.%ld.%ld\n"), osname,
15297                 major, minor, subminor);
15298       }
15299       break;
15300
15301     case NT_GNU_GOLD_VERSION:
15302       {
15303         unsigned long i;
15304
15305         printf (_("    Version: "));
15306         for (i = 0; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
15307           printf ("%c", pnote->descdata[i]);
15308         printf ("\n");
15309       }
15310       break;
15311     }
15312
15313   return 1;
15314 }
15315
15316 static const char *
15317 get_v850_elf_note_type (enum v850_notes n_type)
15318 {
15319   static char buff[64];
15320
15321   switch (n_type)
15322     {
15323     case V850_NOTE_ALIGNMENT:  return _("Alignment of 8-byte objects");
15324     case V850_NOTE_DATA_SIZE:  return _("Sizeof double and long double");
15325     case V850_NOTE_FPU_INFO:   return _("Type of FPU support needed");
15326     case V850_NOTE_SIMD_INFO:  return _("Use of SIMD instructions");
15327     case V850_NOTE_CACHE_INFO: return _("Use of cache");
15328     case V850_NOTE_MMU_INFO:   return _("Use of MMU");
15329     default:
15330       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), n_type);
15331       return buff;
15332     }
15333 }
15334
15335 static int
15336 print_v850_note (Elf_Internal_Note * pnote)
15337 {
15338   unsigned int val;
15339
15340   if (pnote->descsz != 4)
15341     return 0;
15342   val = byte_get ((unsigned char *) pnote->descdata, pnote->descsz);
15343
15344   if (val == 0)
15345     {
15346       printf (_("not set\n"));
15347       return 1;
15348     }
15349
15350   switch (pnote->type)
15351     {
15352     case V850_NOTE_ALIGNMENT:
15353       switch (val)
15354         {
15355         case EF_RH850_DATA_ALIGN4: printf (_("4-byte\n")); return 1;
15356         case EF_RH850_DATA_ALIGN8: printf (_("8-byte\n")); return 1;
15357         }
15358       break;
15359
15360     case V850_NOTE_DATA_SIZE:
15361       switch (val)
15362         {
15363         case EF_RH850_DOUBLE32: printf (_("4-bytes\n")); return 1;
15364         case EF_RH850_DOUBLE64: printf (_("8-bytes\n")); return 1;
15365         }
15366       break;
15367
15368     case V850_NOTE_FPU_INFO:
15369       switch (val)
15370         {
15371         case EF_RH850_FPU20: printf (_("FPU-2.0\n")); return 1;
15372         case EF_RH850_FPU30: printf (_("FPU-3.0\n")); return 1;
15373         }
15374       break;
15375
15376     case V850_NOTE_MMU_INFO:
15377     case V850_NOTE_CACHE_INFO:
15378     case V850_NOTE_SIMD_INFO:
15379       if (val == EF_RH850_SIMD)
15380         {
15381           printf (_("yes\n"));
15382           return 1;
15383         }
15384       break;
15385
15386     default:
15387       /* An 'unknown note type' message will already have been displayed.  */
15388       break;
15389     }
15390
15391   printf (_("unknown value: %x\n"), val);
15392   return 0;
15393 }
15394
15395 static int 
15396 process_netbsd_elf_note (Elf_Internal_Note * pnote)
15397 {
15398   unsigned int version;
15399
15400   switch (pnote->type)
15401     {
15402     case NT_NETBSD_IDENT:
15403       version = byte_get ((unsigned char *) pnote->descdata, sizeof (version));
15404       if ((version / 10000) % 100)
15405         printf ("  NetBSD\t\t0x%08lx\tIDENT %u (%u.%u%s%c)\n", pnote->descsz,
15406                 version, version / 100000000, (version / 1000000) % 100,
15407                 (version / 10000) % 100 > 26 ? "Z" : "",
15408                 'A' + (version / 10000) % 26); 
15409       else
15410         printf ("  NetBSD\t\t0x%08lx\tIDENT %u (%u.%u.%u)\n", pnote->descsz,
15411                 version, version / 100000000, (version / 1000000) % 100,
15412                 (version / 100) % 100); 
15413       return 1;
15414
15415     case NT_NETBSD_MARCH:
15416       printf ("  NetBSD\t0x%08lx\tMARCH <%s>\n", pnote->descsz,
15417               pnote->descdata);
15418       return 1;
15419
15420     default:
15421       break;
15422     }
15423
15424   printf ("  NetBSD\t0x%08lx\tUnknown note type: (0x%08lx)\n", pnote->descsz,
15425           pnote->type);
15426   return 1;
15427 }
15428
15429 static const char *
15430 get_freebsd_elfcore_note_type (unsigned e_type)
15431 {
15432   switch (e_type)
15433     {
15434     case NT_FREEBSD_THRMISC:
15435       return _("NT_THRMISC (thrmisc structure)");
15436     case NT_FREEBSD_PROCSTAT_PROC:
15437       return _("NT_PROCSTAT_PROC (proc data)");
15438     case NT_FREEBSD_PROCSTAT_FILES:
15439       return _("NT_PROCSTAT_FILES (files data)");
15440     case NT_FREEBSD_PROCSTAT_VMMAP:
15441       return _("NT_PROCSTAT_VMMAP (vmmap data)");
15442     case NT_FREEBSD_PROCSTAT_GROUPS:
15443       return _("NT_PROCSTAT_GROUPS (groups data)");
15444     case NT_FREEBSD_PROCSTAT_UMASK:
15445       return _("NT_PROCSTAT_UMASK (umask data)");
15446     case NT_FREEBSD_PROCSTAT_RLIMIT:
15447       return _("NT_PROCSTAT_RLIMIT (rlimit data)");
15448     case NT_FREEBSD_PROCSTAT_OSREL:
15449       return _("NT_PROCSTAT_OSREL (osreldate data)");
15450     case NT_FREEBSD_PROCSTAT_PSSTRINGS:
15451       return _("NT_PROCSTAT_PSSTRINGS (ps_strings data)");
15452     case NT_FREEBSD_PROCSTAT_AUXV:
15453       return _("NT_PROCSTAT_AUXV (auxv data)");
15454     }
15455   return get_note_type (e_type);
15456 }
15457
15458 static const char *
15459 get_netbsd_elfcore_note_type (unsigned e_type)
15460 {
15461   static char buff[64];
15462
15463   if (e_type == NT_NETBSDCORE_PROCINFO)
15464     {
15465       /* NetBSD core "procinfo" structure.  */
15466       return _("NetBSD procinfo structure");
15467     }
15468
15469   /* As of Jan 2002 there are no other machine-independent notes
15470      defined for NetBSD core files.  If the note type is less
15471      than the start of the machine-dependent note types, we don't
15472      understand it.  */
15473
15474   if (e_type < NT_NETBSDCORE_FIRSTMACH)
15475     {
15476       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15477       return buff;
15478     }
15479
15480   switch (elf_header.e_machine)
15481     {
15482     /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
15483        and PT_GETFPREGS == mach+2.  */
15484
15485     case EM_OLD_ALPHA:
15486     case EM_ALPHA:
15487     case EM_SPARC:
15488     case EM_SPARC32PLUS:
15489     case EM_SPARCV9:
15490       switch (e_type)
15491         {
15492         case NT_NETBSDCORE_FIRSTMACH + 0:
15493           return _("PT_GETREGS (reg structure)");
15494         case NT_NETBSDCORE_FIRSTMACH + 2:
15495           return _("PT_GETFPREGS (fpreg structure)");
15496         default:
15497           break;
15498         }
15499       break;
15500
15501     /* On all other arch's, PT_GETREGS == mach+1 and
15502        PT_GETFPREGS == mach+3.  */
15503     default:
15504       switch (e_type)
15505         {
15506         case NT_NETBSDCORE_FIRSTMACH + 1:
15507           return _("PT_GETREGS (reg structure)");
15508         case NT_NETBSDCORE_FIRSTMACH + 3:
15509           return _("PT_GETFPREGS (fpreg structure)");
15510         default:
15511           break;
15512         }
15513     }
15514
15515   snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
15516             e_type - NT_NETBSDCORE_FIRSTMACH);
15517   return buff;
15518 }
15519
15520 static const char *
15521 get_stapsdt_note_type (unsigned e_type)
15522 {
15523   static char buff[64];
15524
15525   switch (e_type)
15526     {
15527     case NT_STAPSDT:
15528       return _("NT_STAPSDT (SystemTap probe descriptors)");
15529
15530     default:
15531       break;
15532     }
15533
15534   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15535   return buff;
15536 }
15537
15538 static int
15539 print_stapsdt_note (Elf_Internal_Note *pnote)
15540 {
15541   int addr_size = is_32bit_elf ? 4 : 8;
15542   char *data = pnote->descdata;
15543   char *data_end = pnote->descdata + pnote->descsz;
15544   bfd_vma pc, base_addr, semaphore;
15545   char *provider, *probe, *arg_fmt;
15546
15547   pc = byte_get ((unsigned char *) data, addr_size);
15548   data += addr_size;
15549   base_addr = byte_get ((unsigned char *) data, addr_size);
15550   data += addr_size;
15551   semaphore = byte_get ((unsigned char *) data, addr_size);
15552   data += addr_size;
15553
15554   provider = data;
15555   data += strlen (data) + 1;
15556   probe = data;
15557   data += strlen (data) + 1;
15558   arg_fmt = data;
15559   data += strlen (data) + 1;
15560
15561   printf (_("    Provider: %s\n"), provider);
15562   printf (_("    Name: %s\n"), probe);
15563   printf (_("    Location: "));
15564   print_vma (pc, FULL_HEX);
15565   printf (_(", Base: "));
15566   print_vma (base_addr, FULL_HEX);
15567   printf (_(", Semaphore: "));
15568   print_vma (semaphore, FULL_HEX);
15569   printf ("\n");
15570   printf (_("    Arguments: %s\n"), arg_fmt);
15571
15572   return data == data_end;
15573 }
15574
15575 static const char *
15576 get_ia64_vms_note_type (unsigned e_type)
15577 {
15578   static char buff[64];
15579
15580   switch (e_type)
15581     {
15582     case NT_VMS_MHD:
15583       return _("NT_VMS_MHD (module header)");
15584     case NT_VMS_LNM:
15585       return _("NT_VMS_LNM (language name)");
15586     case NT_VMS_SRC:
15587       return _("NT_VMS_SRC (source files)");
15588     case NT_VMS_TITLE:
15589       return "NT_VMS_TITLE";
15590     case NT_VMS_EIDC:
15591       return _("NT_VMS_EIDC (consistency check)");
15592     case NT_VMS_FPMODE:
15593       return _("NT_VMS_FPMODE (FP mode)");
15594     case NT_VMS_LINKTIME:
15595       return "NT_VMS_LINKTIME";
15596     case NT_VMS_IMGNAM:
15597       return _("NT_VMS_IMGNAM (image name)");
15598     case NT_VMS_IMGID:
15599       return _("NT_VMS_IMGID (image id)");
15600     case NT_VMS_LINKID:
15601       return _("NT_VMS_LINKID (link id)");
15602     case NT_VMS_IMGBID:
15603       return _("NT_VMS_IMGBID (build id)");
15604     case NT_VMS_GSTNAM:
15605       return _("NT_VMS_GSTNAM (sym table name)");
15606     case NT_VMS_ORIG_DYN:
15607       return "NT_VMS_ORIG_DYN";
15608     case NT_VMS_PATCHTIME:
15609       return "NT_VMS_PATCHTIME";
15610     default:
15611       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15612       return buff;
15613     }
15614 }
15615
15616 static int
15617 print_ia64_vms_note (Elf_Internal_Note * pnote)
15618 {
15619   switch (pnote->type)
15620     {
15621     case NT_VMS_MHD:
15622       if (pnote->descsz > 36)
15623         {
15624           size_t l = strlen (pnote->descdata + 34);
15625           printf (_("    Creation date  : %.17s\n"), pnote->descdata);
15626           printf (_("    Last patch date: %.17s\n"), pnote->descdata + 17);
15627           printf (_("    Module name    : %s\n"), pnote->descdata + 34);
15628           printf (_("    Module version : %s\n"), pnote->descdata + 34 + l + 1);
15629         }
15630       else
15631         printf (_("    Invalid size\n"));
15632       break;
15633     case NT_VMS_LNM:
15634       printf (_("   Language: %s\n"), pnote->descdata);
15635       break;
15636 #ifdef BFD64
15637     case NT_VMS_FPMODE:
15638       printf (_("   Floating Point mode: "));
15639       printf ("0x%016" BFD_VMA_FMT "x\n",
15640               (bfd_vma) byte_get ((unsigned char *)pnote->descdata, 8));
15641       break;
15642     case NT_VMS_LINKTIME:
15643       printf (_("   Link time: "));
15644       print_vms_time
15645         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
15646       printf ("\n");
15647       break;
15648     case NT_VMS_PATCHTIME:
15649       printf (_("   Patch time: "));
15650       print_vms_time
15651         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
15652       printf ("\n");
15653       break;
15654     case NT_VMS_ORIG_DYN:
15655       printf (_("   Major id: %u,  minor id: %u\n"),
15656               (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
15657               (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
15658       printf (_("   Last modified  : "));
15659       print_vms_time
15660         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
15661       printf (_("\n   Link flags  : "));
15662       printf ("0x%016" BFD_VMA_FMT "x\n",
15663               (bfd_vma) byte_get ((unsigned char *)pnote->descdata + 16, 8));
15664       printf (_("   Header flags: 0x%08x\n"),
15665               (unsigned) byte_get ((unsigned char *)pnote->descdata + 24, 4));
15666       printf (_("   Image id    : %s\n"), pnote->descdata + 32);
15667       break;
15668 #endif
15669     case NT_VMS_IMGNAM:
15670       printf (_("    Image name: %s\n"), pnote->descdata);
15671       break;
15672     case NT_VMS_GSTNAM:
15673       printf (_("    Global symbol table name: %s\n"), pnote->descdata);
15674       break;
15675     case NT_VMS_IMGID:
15676       printf (_("    Image id: %s\n"), pnote->descdata);
15677       break;
15678     case NT_VMS_LINKID:
15679       printf (_("    Linker id: %s\n"), pnote->descdata);
15680       break;
15681     default:
15682       break;
15683     }
15684   return 1;
15685 }
15686
15687 /* Note that by the ELF standard, the name field is already null byte
15688    terminated, and namesz includes the terminating null byte.
15689    I.E. the value of namesz for the name "FSF" is 4.
15690
15691    If the value of namesz is zero, there is no name present.  */
15692 static int
15693 process_note (Elf_Internal_Note * pnote)
15694 {
15695   const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
15696   const char * nt;
15697
15698   if (pnote->namesz == 0)
15699     /* If there is no note name, then use the default set of
15700        note type strings.  */
15701     nt = get_note_type (pnote->type);
15702
15703   else if (const_strneq (pnote->namedata, "GNU"))
15704     /* GNU-specific object file notes.  */
15705     nt = get_gnu_elf_note_type (pnote->type);
15706
15707   else if (const_strneq (pnote->namedata, "FreeBSD"))
15708     /* FreeBSD-specific core file notes.  */
15709     nt = get_freebsd_elfcore_note_type (pnote->type);
15710
15711   else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
15712     /* NetBSD-specific core file notes.  */
15713     nt = get_netbsd_elfcore_note_type (pnote->type);
15714
15715   else if (const_strneq (pnote->namedata, "NetBSD"))
15716     /* NetBSD-specific core file notes.  */
15717     return process_netbsd_elf_note (pnote);
15718
15719   else if (strneq (pnote->namedata, "SPU/", 4))
15720     {
15721       /* SPU-specific core file notes.  */
15722       nt = pnote->namedata + 4;
15723       name = "SPU";
15724     }
15725
15726   else if (const_strneq (pnote->namedata, "IPF/VMS"))
15727     /* VMS/ia64-specific file notes.  */
15728     nt = get_ia64_vms_note_type (pnote->type);
15729
15730   else if (const_strneq (pnote->namedata, "stapsdt"))
15731     nt = get_stapsdt_note_type (pnote->type);
15732
15733   else
15734     /* Don't recognize this note name; just use the default set of
15735        note type strings.  */
15736     nt = get_note_type (pnote->type);
15737
15738   printf ("  %-20s 0x%08lx\t%s\n", name, pnote->descsz, nt);
15739
15740   if (const_strneq (pnote->namedata, "IPF/VMS"))
15741     return print_ia64_vms_note (pnote);
15742   else if (const_strneq (pnote->namedata, "GNU"))
15743     return print_gnu_note (pnote);
15744   else if (const_strneq (pnote->namedata, "stapsdt"))
15745     return print_stapsdt_note (pnote);
15746   else if (const_strneq (pnote->namedata, "CORE"))
15747     return print_core_note (pnote);
15748   else
15749     return 1;
15750 }
15751
15752
15753 static int
15754 process_corefile_note_segment (FILE * file, bfd_vma offset, bfd_vma length)
15755 {
15756   Elf_External_Note * pnotes;
15757   Elf_External_Note * external;
15758   char * end;
15759   int res = 1;
15760
15761   if (length <= 0)
15762     return 0;
15763
15764   pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
15765                                            _("notes"));
15766   if (pnotes == NULL)
15767     return 0;
15768
15769   external = pnotes;
15770
15771   printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
15772           (unsigned long) offset, (unsigned long) length);
15773   printf (_("  %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
15774
15775   end = (char *) pnotes + length;
15776   while ((char *) external < end)
15777     {
15778       Elf_Internal_Note inote;
15779       size_t min_notesz;
15780       char *next;
15781       char * temp = NULL;
15782       size_t data_remaining = end - (char *) external;
15783
15784       if (!is_ia64_vms ())
15785         {
15786           /* PR binutils/15191
15787              Make sure that there is enough data to read.  */
15788           min_notesz = offsetof (Elf_External_Note, name);
15789           if (data_remaining < min_notesz)
15790             {
15791               warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
15792                     (int) data_remaining);
15793               break;
15794             }
15795           inote.type     = BYTE_GET (external->type);
15796           inote.namesz   = BYTE_GET (external->namesz);
15797           inote.namedata = external->name;
15798           inote.descsz   = BYTE_GET (external->descsz);
15799           inote.descdata = inote.namedata + align_power (inote.namesz, 2);
15800           /* PR 17531: file: 3443835e.  */
15801           if (inote.descdata < (char *) pnotes || inote.descdata > end)
15802             {
15803               warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
15804               inote.descdata = inote.namedata;
15805               inote.namesz   = 0;
15806             }
15807
15808           inote.descpos  = offset + (inote.descdata - (char *) pnotes);
15809           next = inote.descdata + align_power (inote.descsz, 2);
15810         }
15811       else
15812         {
15813           Elf64_External_VMS_Note *vms_external;
15814
15815           /* PR binutils/15191
15816              Make sure that there is enough data to read.  */
15817           min_notesz = offsetof (Elf64_External_VMS_Note, name);
15818           if (data_remaining < min_notesz)
15819             {
15820               warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
15821                     (int) data_remaining);
15822               break;
15823             }
15824
15825           vms_external = (Elf64_External_VMS_Note *) external;
15826           inote.type     = BYTE_GET (vms_external->type);
15827           inote.namesz   = BYTE_GET (vms_external->namesz);
15828           inote.namedata = vms_external->name;
15829           inote.descsz   = BYTE_GET (vms_external->descsz);
15830           inote.descdata = inote.namedata + align_power (inote.namesz, 3);
15831           inote.descpos  = offset + (inote.descdata - (char *) pnotes);
15832           next = inote.descdata + align_power (inote.descsz, 3);
15833         }
15834
15835       if (inote.descdata < (char *) external + min_notesz
15836           || next < (char *) external + min_notesz
15837           /* PR binutils/17531: file: id:000000,sig:11,src:006986,op:havoc,rep:4.  */
15838           || inote.namedata + inote.namesz < inote.namedata
15839           || inote.descdata + inote.descsz < inote.descdata
15840           || data_remaining < (size_t)(next - (char *) external))
15841         {
15842           warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
15843                 (unsigned long) ((char *) external - (char *) pnotes));
15844           warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx\n"),
15845                 inote.type, inote.namesz, inote.descsz);
15846           break;
15847         }
15848
15849       external = (Elf_External_Note *) next;
15850
15851       /* Verify that name is null terminated.  It appears that at least
15852          one version of Linux (RedHat 6.0) generates corefiles that don't
15853          comply with the ELF spec by failing to include the null byte in
15854          namesz.  */
15855       if (inote.namedata[inote.namesz - 1] != '\0')
15856         {
15857           temp = (char *) malloc (inote.namesz + 1);
15858           if (temp == NULL)
15859             {
15860               error (_("Out of memory allocating space for inote name\n"));
15861               res = 0;
15862               break;
15863             }
15864
15865           strncpy (temp, inote.namedata, inote.namesz);
15866           temp[inote.namesz] = 0;
15867
15868           /* warn (_("'%s' NOTE name not properly null terminated\n"), temp);  */
15869           inote.namedata = temp;
15870         }
15871
15872       res &= process_note (& inote);
15873
15874       if (temp != NULL)
15875         {
15876           free (temp);
15877           temp = NULL;
15878         }
15879     }
15880
15881   free (pnotes);
15882
15883   return res;
15884 }
15885
15886 static int
15887 process_corefile_note_segments (FILE * file)
15888 {
15889   Elf_Internal_Phdr * segment;
15890   unsigned int i;
15891   int res = 1;
15892
15893   if (! get_program_headers (file))
15894       return 0;
15895
15896   for (i = 0, segment = program_headers;
15897        i < elf_header.e_phnum;
15898        i++, segment++)
15899     {
15900       if (segment->p_type == PT_NOTE)
15901         res &= process_corefile_note_segment (file,
15902                                               (bfd_vma) segment->p_offset,
15903                                               (bfd_vma) segment->p_filesz);
15904     }
15905
15906   return res;
15907 }
15908
15909 static int
15910 process_v850_notes (FILE * file, bfd_vma offset, bfd_vma length)
15911 {
15912   Elf_External_Note * pnotes;
15913   Elf_External_Note * external;
15914   char * end;
15915   int res = 1;
15916
15917   if (length <= 0)
15918     return 0;
15919
15920   pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
15921                                            _("v850 notes"));
15922   if (pnotes == NULL)
15923     return 0;
15924
15925   external = pnotes;
15926   end = (char*) pnotes + length;
15927
15928   printf (_("\nDisplaying contents of Renesas V850 notes section at offset 0x%lx with length 0x%lx:\n"),
15929           (unsigned long) offset, (unsigned long) length);
15930
15931   while ((char *) external + sizeof (Elf_External_Note) < end)
15932     {
15933       Elf_External_Note * next;
15934       Elf_Internal_Note inote;
15935
15936       inote.type     = BYTE_GET (external->type);
15937       inote.namesz   = BYTE_GET (external->namesz);
15938       inote.namedata = external->name;
15939       inote.descsz   = BYTE_GET (external->descsz);
15940       inote.descdata = inote.namedata + align_power (inote.namesz, 2);
15941       inote.descpos  = offset + (inote.descdata - (char *) pnotes);
15942
15943       if (inote.descdata < (char *) pnotes || inote.descdata >= end)
15944         {
15945           warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
15946           inote.descdata = inote.namedata;
15947           inote.namesz   = 0;
15948         }
15949
15950       next = (Elf_External_Note *) (inote.descdata + align_power (inote.descsz, 2));
15951
15952       if (   ((char *) next > end)
15953           || ((char *) next <  (char *) pnotes))
15954         {
15955           warn (_("corrupt descsz found in note at offset 0x%lx\n"),
15956                 (unsigned long) ((char *) external - (char *) pnotes));
15957           warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
15958                 inote.type, inote.namesz, inote.descsz);
15959           break;
15960         }
15961
15962       external = next;
15963
15964       /* Prevent out-of-bounds indexing.  */
15965       if (   inote.namedata + inote.namesz > end
15966           || inote.namedata + inote.namesz < inote.namedata)
15967         {
15968           warn (_("corrupt namesz found in note at offset 0x%lx\n"),
15969                 (unsigned long) ((char *) external - (char *) pnotes));
15970           warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
15971                 inote.type, inote.namesz, inote.descsz);
15972           break;
15973         }
15974
15975       printf ("  %s: ", get_v850_elf_note_type (inote.type));
15976
15977       if (! print_v850_note (& inote))
15978         {
15979           res = 0;
15980           printf ("<corrupt sizes: namesz: %lx, descsz: %lx>\n",
15981                   inote.namesz, inote.descsz);
15982         }
15983     }
15984
15985   free (pnotes);
15986
15987   return res;
15988 }
15989
15990 static int
15991 process_note_sections (FILE * file)
15992 {
15993   Elf_Internal_Shdr * section;
15994   unsigned long i;
15995   int n = 0;
15996   int res = 1;
15997
15998   for (i = 0, section = section_headers;
15999        i < elf_header.e_shnum && section != NULL;
16000        i++, section++)
16001     {
16002       if (section->sh_type == SHT_NOTE)
16003         {
16004           res &= process_corefile_note_segment (file,
16005                                                 (bfd_vma) section->sh_offset,
16006                                                 (bfd_vma) section->sh_size);
16007           n++;
16008         }
16009
16010       if ((   elf_header.e_machine == EM_V800
16011            || elf_header.e_machine == EM_V850
16012            || elf_header.e_machine == EM_CYGNUS_V850)
16013           && section->sh_type == SHT_RENESAS_INFO)
16014         {
16015           res &= process_v850_notes (file,
16016                                      (bfd_vma) section->sh_offset,
16017                                      (bfd_vma) section->sh_size);
16018           n++;
16019         }
16020     }
16021
16022   if (n == 0)
16023     /* Try processing NOTE segments instead.  */
16024     return process_corefile_note_segments (file);
16025
16026   return res;
16027 }
16028
16029 static int
16030 process_notes (FILE * file)
16031 {
16032   /* If we have not been asked to display the notes then do nothing.  */
16033   if (! do_notes)
16034     return 1;
16035
16036   if (elf_header.e_type != ET_CORE)
16037     return process_note_sections (file);
16038
16039   /* No program headers means no NOTE segment.  */
16040   if (elf_header.e_phnum > 0)
16041     return process_corefile_note_segments (file);
16042
16043   printf (_("No note segments present in the core file.\n"));
16044   return 1;
16045 }
16046
16047 static int
16048 process_arch_specific (FILE * file)
16049 {
16050   if (! do_arch)
16051     return 1;
16052
16053   switch (elf_header.e_machine)
16054     {
16055     case EM_ARM:
16056       return process_arm_specific (file);
16057     case EM_MIPS:
16058     case EM_MIPS_RS3_LE:
16059       return process_mips_specific (file);
16060       break;
16061     case EM_NDS32:
16062       return process_nds32_specific (file);
16063       break;
16064     case EM_PPC:
16065       return process_power_specific (file);
16066       break;
16067     case EM_S390:
16068     case EM_S390_OLD:
16069       return process_s390_specific (file);
16070       break;
16071     case EM_SPARC:
16072     case EM_SPARC32PLUS:
16073     case EM_SPARCV9:
16074       return process_sparc_specific (file);
16075       break;
16076     case EM_TI_C6000:
16077       return process_tic6x_specific (file);
16078       break;
16079     case EM_MSP430:
16080       return process_msp430x_specific (file);
16081     default:
16082       break;
16083     }
16084   return 1;
16085 }
16086
16087 static int
16088 get_file_header (FILE * file)
16089 {
16090   /* Read in the identity array.  */
16091   if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
16092     return 0;
16093
16094   /* Determine how to read the rest of the header.  */
16095   switch (elf_header.e_ident[EI_DATA])
16096     {
16097     default: /* fall through */
16098     case ELFDATANONE: /* fall through */
16099     case ELFDATA2LSB:
16100       byte_get = byte_get_little_endian;
16101       byte_put = byte_put_little_endian;
16102       break;
16103     case ELFDATA2MSB:
16104       byte_get = byte_get_big_endian;
16105       byte_put = byte_put_big_endian;
16106       break;
16107     }
16108
16109   /* For now we only support 32 bit and 64 bit ELF files.  */
16110   is_32bit_elf = (elf_header.e_ident[EI_CLASS] != ELFCLASS64);
16111
16112   /* Read in the rest of the header.  */
16113   if (is_32bit_elf)
16114     {
16115       Elf32_External_Ehdr ehdr32;
16116
16117       if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
16118         return 0;
16119
16120       elf_header.e_type      = BYTE_GET (ehdr32.e_type);
16121       elf_header.e_machine   = BYTE_GET (ehdr32.e_machine);
16122       elf_header.e_version   = BYTE_GET (ehdr32.e_version);
16123       elf_header.e_entry     = BYTE_GET (ehdr32.e_entry);
16124       elf_header.e_phoff     = BYTE_GET (ehdr32.e_phoff);
16125       elf_header.e_shoff     = BYTE_GET (ehdr32.e_shoff);
16126       elf_header.e_flags     = BYTE_GET (ehdr32.e_flags);
16127       elf_header.e_ehsize    = BYTE_GET (ehdr32.e_ehsize);
16128       elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
16129       elf_header.e_phnum     = BYTE_GET (ehdr32.e_phnum);
16130       elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
16131       elf_header.e_shnum     = BYTE_GET (ehdr32.e_shnum);
16132       elf_header.e_shstrndx  = BYTE_GET (ehdr32.e_shstrndx);
16133     }
16134   else
16135     {
16136       Elf64_External_Ehdr ehdr64;
16137
16138       /* If we have been compiled with sizeof (bfd_vma) == 4, then
16139          we will not be able to cope with the 64bit data found in
16140          64 ELF files.  Detect this now and abort before we start
16141          overwriting things.  */
16142       if (sizeof (bfd_vma) < 8)
16143         {
16144           error (_("This instance of readelf has been built without support for a\n\
16145 64 bit data type and so it cannot read 64 bit ELF files.\n"));
16146           return 0;
16147         }
16148
16149       if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
16150         return 0;
16151
16152       elf_header.e_type      = BYTE_GET (ehdr64.e_type);
16153       elf_header.e_machine   = BYTE_GET (ehdr64.e_machine);
16154       elf_header.e_version   = BYTE_GET (ehdr64.e_version);
16155       elf_header.e_entry     = BYTE_GET (ehdr64.e_entry);
16156       elf_header.e_phoff     = BYTE_GET (ehdr64.e_phoff);
16157       elf_header.e_shoff     = BYTE_GET (ehdr64.e_shoff);
16158       elf_header.e_flags     = BYTE_GET (ehdr64.e_flags);
16159       elf_header.e_ehsize    = BYTE_GET (ehdr64.e_ehsize);
16160       elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
16161       elf_header.e_phnum     = BYTE_GET (ehdr64.e_phnum);
16162       elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
16163       elf_header.e_shnum     = BYTE_GET (ehdr64.e_shnum);
16164       elf_header.e_shstrndx  = BYTE_GET (ehdr64.e_shstrndx);
16165     }
16166
16167   if (elf_header.e_shoff)
16168     {
16169       /* There may be some extensions in the first section header.  Don't
16170          bomb if we can't read it.  */
16171       if (is_32bit_elf)
16172         get_32bit_section_headers (file, TRUE);
16173       else
16174         get_64bit_section_headers (file, TRUE);
16175     }
16176
16177   return 1;
16178 }
16179
16180 /* Process one ELF object file according to the command line options.
16181    This file may actually be stored in an archive.  The file is
16182    positioned at the start of the ELF object.  */
16183
16184 static int
16185 process_object (char * file_name, FILE * file)
16186 {
16187   unsigned int i;
16188
16189   if (! get_file_header (file))
16190     {
16191       error (_("%s: Failed to read file header\n"), file_name);
16192       return 1;
16193     }
16194
16195   /* Initialise per file variables.  */
16196   for (i = ARRAY_SIZE (version_info); i--;)
16197     version_info[i] = 0;
16198
16199   for (i = ARRAY_SIZE (dynamic_info); i--;)
16200     dynamic_info[i] = 0;
16201   dynamic_info_DT_GNU_HASH = 0;
16202
16203   /* Process the file.  */
16204   if (show_name)
16205     printf (_("\nFile: %s\n"), file_name);
16206
16207   /* Initialise the dump_sects array from the cmdline_dump_sects array.
16208      Note we do this even if cmdline_dump_sects is empty because we
16209      must make sure that the dump_sets array is zeroed out before each
16210      object file is processed.  */
16211   if (num_dump_sects > num_cmdline_dump_sects)
16212     memset (dump_sects, 0, num_dump_sects * sizeof (* dump_sects));
16213
16214   if (num_cmdline_dump_sects > 0)
16215     {
16216       if (num_dump_sects == 0)
16217         /* A sneaky way of allocating the dump_sects array.  */
16218         request_dump_bynumber (num_cmdline_dump_sects, 0);
16219
16220       assert (num_dump_sects >= num_cmdline_dump_sects);
16221       memcpy (dump_sects, cmdline_dump_sects,
16222               num_cmdline_dump_sects * sizeof (* dump_sects));
16223     }
16224
16225   if (! process_file_header ())
16226     return 1;
16227
16228   if (! process_section_headers (file))
16229     {
16230       /* Without loaded section headers we cannot process lots of
16231          things.  */
16232       do_unwind = do_version = do_dump = do_arch = 0;
16233
16234       if (! do_using_dynamic)
16235         do_syms = do_dyn_syms = do_reloc = 0;
16236     }
16237
16238   if (! process_section_groups (file))
16239     {
16240       /* Without loaded section groups we cannot process unwind.  */
16241       do_unwind = 0;
16242     }
16243
16244   if (process_program_headers (file))
16245     process_dynamic_section (file);
16246
16247   process_relocs (file);
16248
16249   process_unwind (file);
16250
16251   process_symbol_table (file);
16252
16253   process_syminfo (file);
16254
16255   process_version_sections (file);
16256
16257   process_section_contents (file);
16258
16259   process_notes (file);
16260
16261   process_gnu_liblist (file);
16262
16263   process_arch_specific (file);
16264
16265   if (program_headers)
16266     {
16267       free (program_headers);
16268       program_headers = NULL;
16269     }
16270
16271   if (section_headers)
16272     {
16273       free (section_headers);
16274       section_headers = NULL;
16275     }
16276
16277   if (string_table)
16278     {
16279       free (string_table);
16280       string_table = NULL;
16281       string_table_length = 0;
16282     }
16283
16284   if (dynamic_strings)
16285     {
16286       free (dynamic_strings);
16287       dynamic_strings = NULL;
16288       dynamic_strings_length = 0;
16289     }
16290
16291   if (dynamic_symbols)
16292     {
16293       free (dynamic_symbols);
16294       dynamic_symbols = NULL;
16295       num_dynamic_syms = 0;
16296     }
16297
16298   if (dynamic_syminfo)
16299     {
16300       free (dynamic_syminfo);
16301       dynamic_syminfo = NULL;
16302     }
16303
16304   if (dynamic_section)
16305     {
16306       free (dynamic_section);
16307       dynamic_section = NULL;
16308     }
16309
16310   if (section_headers_groups)
16311     {
16312       free (section_headers_groups);
16313       section_headers_groups = NULL;
16314     }
16315
16316   if (section_groups)
16317     {
16318       struct group_list * g;
16319       struct group_list * next;
16320
16321       for (i = 0; i < group_count; i++)
16322         {
16323           for (g = section_groups [i].root; g != NULL; g = next)
16324             {
16325               next = g->next;
16326               free (g);
16327             }
16328         }
16329
16330       free (section_groups);
16331       section_groups = NULL;
16332     }
16333
16334   free_debug_memory ();
16335
16336   return 0;
16337 }
16338
16339 /* Process an ELF archive.
16340    On entry the file is positioned just after the ARMAG string.  */
16341
16342 static int
16343 process_archive (char * file_name, FILE * file, bfd_boolean is_thin_archive)
16344 {
16345   struct archive_info arch;
16346   struct archive_info nested_arch;
16347   size_t got;
16348   int ret;
16349
16350   show_name = 1;
16351
16352   /* The ARCH structure is used to hold information about this archive.  */
16353   arch.file_name = NULL;
16354   arch.file = NULL;
16355   arch.index_array = NULL;
16356   arch.sym_table = NULL;
16357   arch.longnames = NULL;
16358
16359   /* The NESTED_ARCH structure is used as a single-item cache of information
16360      about a nested archive (when members of a thin archive reside within
16361      another regular archive file).  */
16362   nested_arch.file_name = NULL;
16363   nested_arch.file = NULL;
16364   nested_arch.index_array = NULL;
16365   nested_arch.sym_table = NULL;
16366   nested_arch.longnames = NULL;
16367
16368   if (setup_archive (&arch, file_name, file, is_thin_archive, do_archive_index) != 0)
16369     {
16370       ret = 1;
16371       goto out;
16372     }
16373
16374   if (do_archive_index)
16375     {
16376       if (arch.sym_table == NULL)
16377         error (_("%s: unable to dump the index as none was found\n"), file_name);
16378       else
16379         {
16380           unsigned long i, l;
16381           unsigned long current_pos;
16382
16383           printf (_("Index of archive %s: (%lu entries, 0x%lx bytes in the symbol table)\n"),
16384                   file_name, (unsigned long) arch.index_num, arch.sym_size);
16385           current_pos = ftell (file);
16386
16387           for (i = l = 0; i < arch.index_num; i++)
16388             {
16389               if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
16390                 {
16391                   char * member_name;
16392
16393                   member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
16394
16395                   if (member_name != NULL)
16396                     {
16397                       char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
16398
16399                       if (qualified_name != NULL)
16400                         {
16401                           printf (_("Contents of binary %s at offset "), qualified_name);
16402                           (void) print_vma (arch.index_array[i], PREFIX_HEX);
16403                           putchar ('\n');
16404                           free (qualified_name);
16405                         }
16406                     }
16407                 }
16408
16409               if (l >= arch.sym_size)
16410                 {
16411                   error (_("%s: end of the symbol table reached before the end of the index\n"),
16412                          file_name);
16413                   break;
16414                 }
16415               /* PR 17531: file: 0b6630b2.  */
16416               printf ("\t%.*s\n", (int) (arch.sym_size - l), arch.sym_table + l);
16417               l += strnlen (arch.sym_table + l, arch.sym_size - l) + 1;
16418             }
16419
16420           if (arch.uses_64bit_indicies)
16421             l = (l + 7) & ~ 7;
16422           else
16423             l += l & 1;
16424
16425           if (l < arch.sym_size)
16426             error (_("%s: %ld bytes remain in the symbol table, but without corresponding entries in the index table\n"),
16427                    file_name, arch.sym_size - l);
16428
16429           if (fseek (file, current_pos, SEEK_SET) != 0)
16430             {
16431               error (_("%s: failed to seek back to start of object files in the archive\n"), file_name);
16432               ret = 1;
16433               goto out;
16434             }
16435         }
16436
16437       if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
16438           && !do_segments && !do_header && !do_dump && !do_version
16439           && !do_histogram && !do_debugging && !do_arch && !do_notes
16440           && !do_section_groups && !do_dyn_syms)
16441         {
16442           ret = 0; /* Archive index only.  */
16443           goto out;
16444         }
16445     }
16446
16447   ret = 0;
16448
16449   while (1)
16450     {
16451       char * name;
16452       size_t namelen;
16453       char * qualified_name;
16454
16455       /* Read the next archive header.  */
16456       if (fseek (file, arch.next_arhdr_offset, SEEK_SET) != 0)
16457         {
16458           error (_("%s: failed to seek to next archive header\n"), file_name);
16459           return 1;
16460         }
16461       got = fread (&arch.arhdr, 1, sizeof arch.arhdr, file);
16462       if (got != sizeof arch.arhdr)
16463         {
16464           if (got == 0)
16465             break;
16466           error (_("%s: failed to read archive header\n"), file_name);
16467           ret = 1;
16468           break;
16469         }
16470       if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
16471         {
16472           error (_("%s: did not find a valid archive header\n"), arch.file_name);
16473           ret = 1;
16474           break;
16475         }
16476
16477       arch.next_arhdr_offset += sizeof arch.arhdr;
16478
16479       archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
16480       if (archive_file_size & 01)
16481         ++archive_file_size;
16482
16483       name = get_archive_member_name (&arch, &nested_arch);
16484       if (name == NULL)
16485         {
16486           error (_("%s: bad archive file name\n"), file_name);
16487           ret = 1;
16488           break;
16489         }
16490       namelen = strlen (name);
16491
16492       qualified_name = make_qualified_name (&arch, &nested_arch, name);
16493       if (qualified_name == NULL)
16494         {
16495           error (_("%s: bad archive file name\n"), file_name);
16496           ret = 1;
16497           break;
16498         }
16499
16500       if (is_thin_archive && arch.nested_member_origin == 0)
16501         {
16502           /* This is a proxy for an external member of a thin archive.  */
16503           FILE * member_file;
16504           char * member_file_name = adjust_relative_path (file_name, name, namelen);
16505           if (member_file_name == NULL)
16506             {
16507               ret = 1;
16508               break;
16509             }
16510
16511           member_file = fopen (member_file_name, "rb");
16512           if (member_file == NULL)
16513             {
16514               error (_("Input file '%s' is not readable.\n"), member_file_name);
16515               free (member_file_name);
16516               ret = 1;
16517               break;
16518             }
16519
16520           archive_file_offset = arch.nested_member_origin;
16521
16522           ret |= process_object (qualified_name, member_file);
16523
16524           fclose (member_file);
16525           free (member_file_name);
16526         }
16527       else if (is_thin_archive)
16528         {
16529           /* PR 15140: Allow for corrupt thin archives.  */
16530           if (nested_arch.file == NULL)
16531             {
16532               error (_("%s: contains corrupt thin archive: %s\n"),
16533                      file_name, name);
16534               ret = 1;
16535               break;
16536             }
16537
16538           /* This is a proxy for a member of a nested archive.  */
16539           archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
16540
16541           /* The nested archive file will have been opened and setup by
16542              get_archive_member_name.  */
16543           if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
16544             {
16545               error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
16546               ret = 1;
16547               break;
16548             }
16549
16550           ret |= process_object (qualified_name, nested_arch.file);
16551         }
16552       else
16553         {
16554           archive_file_offset = arch.next_arhdr_offset;
16555           arch.next_arhdr_offset += archive_file_size;
16556
16557           ret |= process_object (qualified_name, file);
16558         }
16559
16560       if (dump_sects != NULL)
16561         {
16562           free (dump_sects);
16563           dump_sects = NULL;
16564           num_dump_sects = 0;
16565         }
16566
16567       free (qualified_name);
16568     }
16569
16570  out:
16571   if (nested_arch.file != NULL)
16572     fclose (nested_arch.file);
16573   release_archive (&nested_arch);
16574   release_archive (&arch);
16575
16576   return ret;
16577 }
16578
16579 static int
16580 process_file (char * file_name)
16581 {
16582   FILE * file;
16583   struct stat statbuf;
16584   char armag[SARMAG];
16585   int ret;
16586
16587   if (stat (file_name, &statbuf) < 0)
16588     {
16589       if (errno == ENOENT)
16590         error (_("'%s': No such file\n"), file_name);
16591       else
16592         error (_("Could not locate '%s'.  System error message: %s\n"),
16593                file_name, strerror (errno));
16594       return 1;
16595     }
16596
16597   if (! S_ISREG (statbuf.st_mode))
16598     {
16599       error (_("'%s' is not an ordinary file\n"), file_name);
16600       return 1;
16601     }
16602
16603   file = fopen (file_name, "rb");
16604   if (file == NULL)
16605     {
16606       error (_("Input file '%s' is not readable.\n"), file_name);
16607       return 1;
16608     }
16609
16610   if (fread (armag, SARMAG, 1, file) != 1)
16611     {
16612       error (_("%s: Failed to read file's magic number\n"), file_name);
16613       fclose (file);
16614       return 1;
16615     }
16616
16617   current_file_size = (bfd_size_type) statbuf.st_size;
16618
16619   if (memcmp (armag, ARMAG, SARMAG) == 0)
16620     ret = process_archive (file_name, file, FALSE);
16621   else if (memcmp (armag, ARMAGT, SARMAG) == 0)
16622     ret = process_archive (file_name, file, TRUE);
16623   else
16624     {
16625       if (do_archive_index)
16626         error (_("File %s is not an archive so its index cannot be displayed.\n"),
16627                file_name);
16628
16629       rewind (file);
16630       archive_file_size = archive_file_offset = 0;
16631       ret = process_object (file_name, file);
16632     }
16633
16634   fclose (file);
16635
16636   current_file_size = 0;
16637   return ret;
16638 }
16639
16640 #ifdef SUPPORT_DISASSEMBLY
16641 /* Needed by the i386 disassembler.  For extra credit, someone could
16642    fix this so that we insert symbolic addresses here, esp for GOT/PLT
16643    symbols.  */
16644
16645 void
16646 print_address (unsigned int addr, FILE * outfile)
16647 {
16648   fprintf (outfile,"0x%8.8x", addr);
16649 }
16650
16651 /* Needed by the i386 disassembler.  */
16652 void
16653 db_task_printsym (unsigned int addr)
16654 {
16655   print_address (addr, stderr);
16656 }
16657 #endif
16658
16659 int
16660 main (int argc, char ** argv)
16661 {
16662   int err;
16663
16664 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
16665   setlocale (LC_MESSAGES, "");
16666 #endif
16667 #if defined (HAVE_SETLOCALE)
16668   setlocale (LC_CTYPE, "");
16669 #endif
16670   bindtextdomain (PACKAGE, LOCALEDIR);
16671   textdomain (PACKAGE);
16672
16673   expandargv (&argc, &argv);
16674
16675   parse_args (argc, argv);
16676
16677   if (num_dump_sects > 0)
16678     {
16679       /* Make a copy of the dump_sects array.  */
16680       cmdline_dump_sects = (dump_type *)
16681           malloc (num_dump_sects * sizeof (* dump_sects));
16682       if (cmdline_dump_sects == NULL)
16683         error (_("Out of memory allocating dump request table.\n"));
16684       else
16685         {
16686           memcpy (cmdline_dump_sects, dump_sects,
16687                   num_dump_sects * sizeof (* dump_sects));
16688           num_cmdline_dump_sects = num_dump_sects;
16689         }
16690     }
16691
16692   if (optind < (argc - 1))
16693     show_name = 1;
16694   else if (optind >= argc)
16695     {
16696       warn (_("Nothing to do.\n"));
16697       usage (stderr);
16698     }
16699
16700   err = 0;
16701   while (optind < argc)
16702     err |= process_file (argv[optind++]);
16703
16704   if (dump_sects != NULL)
16705     free (dump_sects);
16706   if (cmdline_dump_sects != NULL)
16707     free (cmdline_dump_sects);
16708
16709   return err;
16710 }