Fix invalid memory access displayiing contents of sections.
[external/binutils.git] / binutils / readelf.c
1 /* readelf.c -- display contents of an ELF format file
2    Copyright (C) 1998-2017 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/riscv.h"
128 #include "elf/mmix.h"
129 #include "elf/mn10200.h"
130 #include "elf/mn10300.h"
131 #include "elf/moxie.h"
132 #include "elf/mt.h"
133 #include "elf/msp430.h"
134 #include "elf/nds32.h"
135 #include "elf/nios2.h"
136 #include "elf/or1k.h"
137 #include "elf/pj.h"
138 #include "elf/ppc.h"
139 #include "elf/ppc64.h"
140 #include "elf/pru.h"
141 #include "elf/rl78.h"
142 #include "elf/rx.h"
143 #include "elf/s390.h"
144 #include "elf/score.h"
145 #include "elf/sh.h"
146 #include "elf/sparc.h"
147 #include "elf/spu.h"
148 #include "elf/tic6x.h"
149 #include "elf/tilegx.h"
150 #include "elf/tilepro.h"
151 #include "elf/v850.h"
152 #include "elf/vax.h"
153 #include "elf/visium.h"
154 #include "elf/x86-64.h"
155 #include "elf/xc16x.h"
156 #include "elf/xgate.h"
157 #include "elf/xstormy16.h"
158 #include "elf/xtensa.h"
159
160 #include "getopt.h"
161 #include "libiberty.h"
162 #include "safe-ctype.h"
163 #include "filenames.h"
164
165 #ifndef offsetof
166 #define offsetof(TYPE, MEMBER) ((size_t) &(((TYPE *) 0)->MEMBER))
167 #endif
168
169 typedef struct elf_section_list
170 {
171   Elf_Internal_Shdr * hdr;
172   struct elf_section_list * next;
173 } elf_section_list;
174
175 char * program_name = "readelf";
176 static unsigned long archive_file_offset;
177 static unsigned long archive_file_size;
178 static bfd_size_type current_file_size;
179 static unsigned long dynamic_addr;
180 static bfd_size_type dynamic_size;
181 static size_t dynamic_nent;
182 static char * dynamic_strings;
183 static unsigned long dynamic_strings_length;
184 static char * string_table;
185 static unsigned long string_table_length;
186 static unsigned long num_dynamic_syms;
187 static Elf_Internal_Sym * dynamic_symbols;
188 static Elf_Internal_Syminfo * dynamic_syminfo;
189 static unsigned long dynamic_syminfo_offset;
190 static unsigned int dynamic_syminfo_nent;
191 static char program_interpreter[PATH_MAX];
192 static bfd_vma dynamic_info[DT_ENCODING];
193 static bfd_vma dynamic_info_DT_GNU_HASH;
194 static bfd_vma version_info[16];
195 static Elf_Internal_Ehdr elf_header;
196 static Elf_Internal_Shdr * section_headers;
197 static Elf_Internal_Phdr * program_headers;
198 static Elf_Internal_Dyn *  dynamic_section;
199 static elf_section_list * symtab_shndx_list;
200 static int show_name;
201 static int do_dynamic;
202 static int do_syms;
203 static int do_dyn_syms;
204 static int do_reloc;
205 static int do_sections;
206 static int do_section_groups;
207 static int do_section_details;
208 static int do_segments;
209 static int do_unwind;
210 static int do_using_dynamic;
211 static int do_header;
212 static int do_dump;
213 static int do_version;
214 static int do_histogram;
215 static int do_debugging;
216 static int do_arch;
217 static int do_notes;
218 static int do_archive_index;
219 static int is_32bit_elf;
220 static int decompress_dumps;
221
222 struct group_list
223 {
224   struct group_list * next;
225   unsigned int section_index;
226 };
227
228 struct group
229 {
230   struct group_list * root;
231   unsigned int group_index;
232 };
233
234 static size_t group_count;
235 static struct group * section_groups;
236 static struct group ** section_headers_groups;
237
238
239 /* Flag bits indicating particular types of dump.  */
240 #define HEX_DUMP        (1 << 0)        /* The -x command line switch.  */
241 #define DISASS_DUMP     (1 << 1)        /* The -i command line switch.  */
242 #define DEBUG_DUMP      (1 << 2)        /* The -w command line switch.  */
243 #define STRING_DUMP     (1 << 3)        /* The -p command line switch.  */
244 #define RELOC_DUMP      (1 << 4)        /* The -R command line switch.  */
245
246 typedef unsigned char dump_type;
247
248 /* A linked list of the section names for which dumps were requested.  */
249 struct dump_list_entry
250 {
251   char * name;
252   dump_type type;
253   struct dump_list_entry * next;
254 };
255 static struct dump_list_entry * dump_sects_byname;
256
257 /* A dynamic array of flags indicating for which sections a dump
258    has been requested via command line switches.  */
259 static dump_type *   cmdline_dump_sects = NULL;
260 static unsigned int  num_cmdline_dump_sects = 0;
261
262 /* A dynamic array of flags indicating for which sections a dump of
263    some kind has been requested.  It is reset on a per-object file
264    basis and then initialised from the cmdline_dump_sects array,
265    the results of interpreting the -w switch, and the
266    dump_sects_byname list.  */
267 static dump_type *   dump_sects = NULL;
268 static unsigned int  num_dump_sects = 0;
269
270
271 /* How to print a vma value.  */
272 typedef enum print_mode
273 {
274   HEX,
275   DEC,
276   DEC_5,
277   UNSIGNED,
278   PREFIX_HEX,
279   FULL_HEX,
280   LONG_HEX
281 }
282 print_mode;
283
284 /* Versioned symbol info.  */
285 enum versioned_symbol_info
286 {
287   symbol_undefined,
288   symbol_hidden,
289   symbol_public
290 };
291
292 static const char *get_symbol_version_string
293   (FILE *file, int is_dynsym, const char *strtab,
294    unsigned long int strtab_size, unsigned int si,
295    Elf_Internal_Sym *psym, enum versioned_symbol_info *sym_info,
296    unsigned short *vna_other);
297
298 #define UNKNOWN -1
299
300 #define SECTION_NAME(X)                                         \
301   ((X) == NULL ? _("<none>")                                    \
302    : string_table == NULL ? _("<no-name>")                      \
303    : ((X)->sh_name >= string_table_length ? _("<corrupt>")      \
304   : string_table + (X)->sh_name))
305
306 #define DT_VERSIONTAGIDX(tag)   (DT_VERNEEDNUM - (tag)) /* Reverse order!  */
307
308 #define GET_ELF_SYMBOLS(file, section, sym_count)                       \
309   (is_32bit_elf ? get_32bit_elf_symbols (file, section, sym_count)      \
310    : get_64bit_elf_symbols (file, section, sym_count))
311
312 #define VALID_DYNAMIC_NAME(offset)      ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
313 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
314    already been called and verified that the string exists.  */
315 #define GET_DYNAMIC_NAME(offset)        (dynamic_strings + offset)
316
317 #define REMOVE_ARCH_BITS(ADDR)                  \
318   do                                            \
319     {                                           \
320       if (elf_header.e_machine == EM_ARM)       \
321         (ADDR) &= ~1;                           \
322     }                                           \
323   while (0)
324 \f
325 /* Retrieve NMEMB structures, each SIZE bytes long from FILE starting at OFFSET +
326    the offset of the current archive member, if we are examining an archive.
327    Put the retrieved data into VAR, if it is not NULL.  Otherwise allocate a buffer
328    using malloc and fill that.  In either case return the pointer to the start of
329    the retrieved data or NULL if something went wrong.  If something does go wrong
330    and REASON is not NULL then emit an error message using REASON as part of the
331    context.  */
332
333 static void *
334 get_data (void * var, FILE * file, unsigned long offset, bfd_size_type size,
335           bfd_size_type nmemb, const char * reason)
336 {
337   void * mvar;
338   bfd_size_type amt = size * nmemb;
339
340   if (size == 0 || nmemb == 0)
341     return NULL;
342
343   /* If the size_t type is smaller than the bfd_size_type, eg because
344      you are building a 32-bit tool on a 64-bit host, then make sure
345      that when the sizes are cast to (size_t) no information is lost.  */
346   if (sizeof (size_t) < sizeof (bfd_size_type)
347       && (   (bfd_size_type) ((size_t) size) != size
348           || (bfd_size_type) ((size_t) nmemb) != nmemb))
349     {
350       if (reason)
351         error (_("Size truncation prevents reading 0x%" BFD_VMA_FMT "x"
352                  " elements of size 0x%" BFD_VMA_FMT "x for %s\n"),
353                nmemb, size, reason);
354       return NULL;
355     }
356
357   /* Check for size overflow.  */
358   if (amt < nmemb)
359     {
360       if (reason)
361         error (_("Size overflow prevents reading 0x%" BFD_VMA_FMT "x"
362                  " elements of size 0x%" BFD_VMA_FMT "x for %s\n"),
363                nmemb, size, reason);
364       return NULL;
365     }
366
367   /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
368      attempting to allocate memory when the read is bound to fail.  */
369   if (amt > current_file_size
370       || offset + archive_file_offset + amt > current_file_size)
371     {
372       if (reason)
373         error (_("Reading 0x%" BFD_VMA_FMT "x"
374                  " bytes extends past end of file for %s\n"),
375                amt, reason);
376       return NULL;
377     }
378
379   if (fseek (file, archive_file_offset + offset, SEEK_SET))
380     {
381       if (reason)
382         error (_("Unable to seek to 0x%lx for %s\n"),
383                archive_file_offset + offset, reason);
384       return NULL;
385     }
386
387   mvar = var;
388   if (mvar == NULL)
389     {
390       /* Check for overflow.  */
391       if (nmemb < (~(bfd_size_type) 0 - 1) / size)
392         /* + 1 so that we can '\0' terminate invalid string table sections.  */
393         mvar = malloc ((size_t) amt + 1);
394
395       if (mvar == NULL)
396         {
397           if (reason)
398             error (_("Out of memory allocating 0x%" BFD_VMA_FMT "x"
399                      " bytes for %s\n"),
400                    amt, reason);
401           return NULL;
402         }
403
404       ((char *) mvar)[amt] = '\0';
405     }
406
407   if (fread (mvar, (size_t) size, (size_t) nmemb, file) != nmemb)
408     {
409       if (reason)
410         error (_("Unable to read in 0x%" BFD_VMA_FMT "x bytes of %s\n"),
411                amt, reason);
412       if (mvar != var)
413         free (mvar);
414       return NULL;
415     }
416
417   return mvar;
418 }
419
420 /* Print a VMA value.  */
421
422 static int
423 print_vma (bfd_vma vma, print_mode mode)
424 {
425   int nc = 0;
426
427   switch (mode)
428     {
429     case FULL_HEX:
430       nc = printf ("0x");
431       /* Fall through.  */
432
433     case LONG_HEX:
434 #ifdef BFD64
435       if (is_32bit_elf)
436         return nc + printf ("%8.8" BFD_VMA_FMT "x", vma);
437 #endif
438       printf_vma (vma);
439       return nc + 16;
440
441     case DEC_5:
442       if (vma <= 99999)
443         return printf ("%5" BFD_VMA_FMT "d", vma);
444       /* Fall through.  */
445
446     case PREFIX_HEX:
447       nc = printf ("0x");
448       /* Fall through.  */
449
450     case HEX:
451       return nc + printf ("%" BFD_VMA_FMT "x", vma);
452
453     case DEC:
454       return printf ("%" BFD_VMA_FMT "d", vma);
455
456     case UNSIGNED:
457       return printf ("%" BFD_VMA_FMT "u", vma);
458     }
459   return 0;
460 }
461
462 /* Display a symbol on stdout.  Handles the display of control characters and
463    multibye characters (assuming the host environment supports them).
464
465    Display at most abs(WIDTH) characters, truncating as necessary, unless do_wide is true.
466
467    If WIDTH is negative then ensure that the output is at least (- WIDTH) characters,
468    padding as necessary.
469
470    Returns the number of emitted characters.  */
471
472 static unsigned int
473 print_symbol (int width, const char *symbol)
474 {
475   bfd_boolean extra_padding = FALSE;
476   int num_printed = 0;
477 #ifdef HAVE_MBSTATE_T
478   mbstate_t state;
479 #endif
480   int width_remaining;
481
482   if (width < 0)
483     {
484       /* Keep the width positive.  This also helps.  */
485       width = - width;
486       extra_padding = TRUE;
487     }
488   assert (width != 0);
489
490   if (do_wide)
491     /* Set the remaining width to a very large value.
492        This simplifies the code below.  */
493     width_remaining = INT_MAX;
494   else
495     width_remaining = width;
496
497 #ifdef HAVE_MBSTATE_T
498   /* Initialise the multibyte conversion state.  */
499   memset (& state, 0, sizeof (state));
500 #endif
501
502   while (width_remaining)
503     {
504       size_t  n;
505       const char c = *symbol++;
506
507       if (c == 0)
508         break;
509
510       /* Do not print control characters directly as they can affect terminal
511          settings.  Such characters usually appear in the names generated
512          by the assembler for local labels.  */
513       if (ISCNTRL (c))
514         {
515           if (width_remaining < 2)
516             break;
517
518           printf ("^%c", c + 0x40);
519           width_remaining -= 2;
520           num_printed += 2;
521         }
522       else if (ISPRINT (c))
523         {
524           putchar (c);
525           width_remaining --;
526           num_printed ++;
527         }
528       else
529         {
530 #ifdef HAVE_MBSTATE_T
531           wchar_t w;
532 #endif
533           /* Let printf do the hard work of displaying multibyte characters.  */
534           printf ("%.1s", symbol - 1);
535           width_remaining --;
536           num_printed ++;
537
538 #ifdef HAVE_MBSTATE_T
539           /* Try to find out how many bytes made up the character that was
540              just printed.  Advance the symbol pointer past the bytes that
541              were displayed.  */
542           n = mbrtowc (& w, symbol - 1, MB_CUR_MAX, & state);
543 #else
544           n = 1;
545 #endif
546           if (n != (size_t) -1 && n != (size_t) -2 && n > 0)
547             symbol += (n - 1);
548         }
549     }
550
551   if (extra_padding && num_printed < width)
552     {
553       /* Fill in the remaining spaces.  */
554       printf ("%-*s", width - num_printed, " ");
555       num_printed = width;
556     }
557
558   return num_printed;
559 }
560
561 /* Returns a pointer to a static buffer containing a printable version of
562    the given section's name.  Like print_symbol, except that it does not try
563    to print multibyte characters, it just interprets them as hex values.  */
564
565 static const char *
566 printable_section_name (const Elf_Internal_Shdr * sec)
567 {
568 #define MAX_PRINT_SEC_NAME_LEN 128
569   static char  sec_name_buf [MAX_PRINT_SEC_NAME_LEN + 1];
570   const char * name = SECTION_NAME (sec);
571   char *       buf = sec_name_buf;
572   char         c;
573   unsigned int remaining = MAX_PRINT_SEC_NAME_LEN;
574
575   while ((c = * name ++) != 0)
576     {
577       if (ISCNTRL (c))
578         {
579           if (remaining < 2)
580             break;
581
582           * buf ++ = '^';
583           * buf ++ = c + 0x40;
584           remaining -= 2;
585         }
586       else if (ISPRINT (c))
587         {
588           * buf ++ = c;
589           remaining -= 1;
590         }
591       else
592         {
593           static char hex[17] = "0123456789ABCDEF";
594
595           if (remaining < 4)
596             break;
597           * buf ++ = '<';
598           * buf ++ = hex[(c & 0xf0) >> 4];
599           * buf ++ = hex[c & 0x0f];
600           * buf ++ = '>';
601           remaining -= 4;
602         }
603
604       if (remaining == 0)
605         break;
606     }
607
608   * buf = 0;
609   return sec_name_buf;
610 }
611
612 static const char *
613 printable_section_name_from_index (unsigned long ndx)
614 {
615   if (ndx >= elf_header.e_shnum)
616     return _("<corrupt>");
617
618   return printable_section_name (section_headers + ndx);
619 }
620
621 /* Return a pointer to section NAME, or NULL if no such section exists.  */
622
623 static Elf_Internal_Shdr *
624 find_section (const char * name)
625 {
626   unsigned int i;
627
628   for (i = 0; i < elf_header.e_shnum; i++)
629     if (streq (SECTION_NAME (section_headers + i), name))
630       return section_headers + i;
631
632   return NULL;
633 }
634
635 /* Return a pointer to a section containing ADDR, or NULL if no such
636    section exists.  */
637
638 static Elf_Internal_Shdr *
639 find_section_by_address (bfd_vma addr)
640 {
641   unsigned int i;
642
643   for (i = 0; i < elf_header.e_shnum; i++)
644     {
645       Elf_Internal_Shdr *sec = section_headers + i;
646       if (addr >= sec->sh_addr && addr < sec->sh_addr + sec->sh_size)
647         return sec;
648     }
649
650   return NULL;
651 }
652
653 static Elf_Internal_Shdr *
654 find_section_by_type (unsigned int type)
655 {
656   unsigned int i;
657
658   for (i = 0; i < elf_header.e_shnum; i++)
659     {
660       Elf_Internal_Shdr *sec = section_headers + i;
661       if (sec->sh_type == type)
662         return sec;
663     }
664
665   return NULL;
666 }
667
668 /* Return a pointer to section NAME, or NULL if no such section exists,
669    restricted to the list of sections given in SET.  */
670
671 static Elf_Internal_Shdr *
672 find_section_in_set (const char * name, unsigned int * set)
673 {
674   unsigned int i;
675
676   if (set != NULL)
677     {
678       while ((i = *set++) > 0)
679         if (streq (SECTION_NAME (section_headers + i), name))
680           return section_headers + i;
681     }
682
683   return find_section (name);
684 }
685
686 /* Read an unsigned LEB128 encoded value from p.  Set *PLEN to the number of
687    bytes read.  */
688
689 static inline unsigned long
690 read_uleb128 (unsigned char *data,
691               unsigned int *length_return,
692               const unsigned char * const end)
693 {
694   return read_leb128 (data, length_return, FALSE, end);
695 }
696
697 /* Return true if the current file is for IA-64 machine and OpenVMS ABI.
698    This OS has so many departures from the ELF standard that we test it at
699    many places.  */
700
701 static inline int
702 is_ia64_vms (void)
703 {
704   return elf_header.e_machine == EM_IA_64
705     && elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS;
706 }
707
708 /* Guess the relocation size commonly used by the specific machines.  */
709
710 static int
711 guess_is_rela (unsigned int e_machine)
712 {
713   switch (e_machine)
714     {
715       /* Targets that use REL relocations.  */
716     case EM_386:
717     case EM_IAMCU:
718     case EM_960:
719     case EM_ARM:
720     case EM_D10V:
721     case EM_CYGNUS_D10V:
722     case EM_DLX:
723     case EM_MIPS:
724     case EM_MIPS_RS3_LE:
725     case EM_CYGNUS_M32R:
726     case EM_SCORE:
727     case EM_XGATE:
728       return FALSE;
729
730       /* Targets that use RELA relocations.  */
731     case EM_68K:
732     case EM_860:
733     case EM_AARCH64:
734     case EM_ADAPTEVA_EPIPHANY:
735     case EM_ALPHA:
736     case EM_ALTERA_NIOS2:
737     case EM_ARC:
738     case EM_ARC_COMPACT:
739     case EM_ARC_COMPACT2:
740     case EM_AVR:
741     case EM_AVR_OLD:
742     case EM_BLACKFIN:
743     case EM_CR16:
744     case EM_CRIS:
745     case EM_CRX:
746     case EM_D30V:
747     case EM_CYGNUS_D30V:
748     case EM_FR30:
749     case EM_FT32:
750     case EM_CYGNUS_FR30:
751     case EM_CYGNUS_FRV:
752     case EM_H8S:
753     case EM_H8_300:
754     case EM_H8_300H:
755     case EM_IA_64:
756     case EM_IP2K:
757     case EM_IP2K_OLD:
758     case EM_IQ2000:
759     case EM_LATTICEMICO32:
760     case EM_M32C_OLD:
761     case EM_M32C:
762     case EM_M32R:
763     case EM_MCORE:
764     case EM_CYGNUS_MEP:
765     case EM_METAG:
766     case EM_MMIX:
767     case EM_MN10200:
768     case EM_CYGNUS_MN10200:
769     case EM_MN10300:
770     case EM_CYGNUS_MN10300:
771     case EM_MOXIE:
772     case EM_MSP430:
773     case EM_MSP430_OLD:
774     case EM_MT:
775     case EM_NDS32:
776     case EM_NIOS32:
777     case EM_OR1K:
778     case EM_PPC64:
779     case EM_PPC:
780     case EM_TI_PRU:
781     case EM_RISCV:
782     case EM_RL78:
783     case EM_RX:
784     case EM_S390:
785     case EM_S390_OLD:
786     case EM_SH:
787     case EM_SPARC:
788     case EM_SPARC32PLUS:
789     case EM_SPARCV9:
790     case EM_SPU:
791     case EM_TI_C6000:
792     case EM_TILEGX:
793     case EM_TILEPRO:
794     case EM_V800:
795     case EM_V850:
796     case EM_CYGNUS_V850:
797     case EM_VAX:
798     case EM_VISIUM:
799     case EM_X86_64:
800     case EM_L1OM:
801     case EM_K1OM:
802     case EM_XSTORMY16:
803     case EM_XTENSA:
804     case EM_XTENSA_OLD:
805     case EM_MICROBLAZE:
806     case EM_MICROBLAZE_OLD:
807       return TRUE;
808
809     case EM_68HC05:
810     case EM_68HC08:
811     case EM_68HC11:
812     case EM_68HC16:
813     case EM_FX66:
814     case EM_ME16:
815     case EM_MMA:
816     case EM_NCPU:
817     case EM_NDR1:
818     case EM_PCP:
819     case EM_ST100:
820     case EM_ST19:
821     case EM_ST7:
822     case EM_ST9PLUS:
823     case EM_STARCORE:
824     case EM_SVX:
825     case EM_TINYJ:
826     default:
827       warn (_("Don't know about relocations on this machine architecture\n"));
828       return FALSE;
829     }
830 }
831
832 static int
833 slurp_rela_relocs (FILE * file,
834                    unsigned long rel_offset,
835                    unsigned long rel_size,
836                    Elf_Internal_Rela ** relasp,
837                    unsigned long * nrelasp)
838 {
839   Elf_Internal_Rela * relas;
840   size_t nrelas;
841   unsigned int i;
842
843   if (is_32bit_elf)
844     {
845       Elf32_External_Rela * erelas;
846
847       erelas = (Elf32_External_Rela *) get_data (NULL, file, rel_offset, 1,
848                                                  rel_size, _("32-bit relocation data"));
849       if (!erelas)
850         return 0;
851
852       nrelas = rel_size / sizeof (Elf32_External_Rela);
853
854       relas = (Elf_Internal_Rela *) cmalloc (nrelas,
855                                              sizeof (Elf_Internal_Rela));
856
857       if (relas == NULL)
858         {
859           free (erelas);
860           error (_("out of memory parsing relocs\n"));
861           return 0;
862         }
863
864       for (i = 0; i < nrelas; i++)
865         {
866           relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
867           relas[i].r_info   = BYTE_GET (erelas[i].r_info);
868           relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
869         }
870
871       free (erelas);
872     }
873   else
874     {
875       Elf64_External_Rela * erelas;
876
877       erelas = (Elf64_External_Rela *) get_data (NULL, file, rel_offset, 1,
878                                                  rel_size, _("64-bit relocation data"));
879       if (!erelas)
880         return 0;
881
882       nrelas = rel_size / sizeof (Elf64_External_Rela);
883
884       relas = (Elf_Internal_Rela *) cmalloc (nrelas,
885                                              sizeof (Elf_Internal_Rela));
886
887       if (relas == NULL)
888         {
889           free (erelas);
890           error (_("out of memory parsing relocs\n"));
891           return 0;
892         }
893
894       for (i = 0; i < nrelas; i++)
895         {
896           relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
897           relas[i].r_info   = BYTE_GET (erelas[i].r_info);
898           relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
899
900           /* The #ifdef BFD64 below is to prevent a compile time
901              warning.  We know that if we do not have a 64 bit data
902              type that we will never execute this code anyway.  */
903 #ifdef BFD64
904           if (elf_header.e_machine == EM_MIPS
905               && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
906             {
907               /* In little-endian objects, r_info isn't really a
908                  64-bit little-endian value: it has a 32-bit
909                  little-endian symbol index followed by four
910                  individual byte fields.  Reorder INFO
911                  accordingly.  */
912               bfd_vma inf = relas[i].r_info;
913               inf = (((inf & 0xffffffff) << 32)
914                       | ((inf >> 56) & 0xff)
915                       | ((inf >> 40) & 0xff00)
916                       | ((inf >> 24) & 0xff0000)
917                       | ((inf >> 8) & 0xff000000));
918               relas[i].r_info = inf;
919             }
920 #endif /* BFD64 */
921         }
922
923       free (erelas);
924     }
925   *relasp = relas;
926   *nrelasp = nrelas;
927   return 1;
928 }
929
930 static int
931 slurp_rel_relocs (FILE * file,
932                   unsigned long rel_offset,
933                   unsigned long rel_size,
934                   Elf_Internal_Rela ** relsp,
935                   unsigned long * nrelsp)
936 {
937   Elf_Internal_Rela * rels;
938   size_t nrels;
939   unsigned int i;
940
941   if (is_32bit_elf)
942     {
943       Elf32_External_Rel * erels;
944
945       erels = (Elf32_External_Rel *) get_data (NULL, file, rel_offset, 1,
946                                                rel_size, _("32-bit relocation data"));
947       if (!erels)
948         return 0;
949
950       nrels = rel_size / sizeof (Elf32_External_Rel);
951
952       rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
953
954       if (rels == NULL)
955         {
956           free (erels);
957           error (_("out of memory parsing relocs\n"));
958           return 0;
959         }
960
961       for (i = 0; i < nrels; i++)
962         {
963           rels[i].r_offset = BYTE_GET (erels[i].r_offset);
964           rels[i].r_info   = BYTE_GET (erels[i].r_info);
965           rels[i].r_addend = 0;
966         }
967
968       free (erels);
969     }
970   else
971     {
972       Elf64_External_Rel * erels;
973
974       erels = (Elf64_External_Rel *) get_data (NULL, file, rel_offset, 1,
975                                                rel_size, _("64-bit relocation data"));
976       if (!erels)
977         return 0;
978
979       nrels = rel_size / sizeof (Elf64_External_Rel);
980
981       rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
982
983       if (rels == NULL)
984         {
985           free (erels);
986           error (_("out of memory parsing relocs\n"));
987           return 0;
988         }
989
990       for (i = 0; i < nrels; i++)
991         {
992           rels[i].r_offset = BYTE_GET (erels[i].r_offset);
993           rels[i].r_info   = BYTE_GET (erels[i].r_info);
994           rels[i].r_addend = 0;
995
996           /* The #ifdef BFD64 below is to prevent a compile time
997              warning.  We know that if we do not have a 64 bit data
998              type that we will never execute this code anyway.  */
999 #ifdef BFD64
1000           if (elf_header.e_machine == EM_MIPS
1001               && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
1002             {
1003               /* In little-endian objects, r_info isn't really a
1004                  64-bit little-endian value: it has a 32-bit
1005                  little-endian symbol index followed by four
1006                  individual byte fields.  Reorder INFO
1007                  accordingly.  */
1008               bfd_vma inf = rels[i].r_info;
1009               inf = (((inf & 0xffffffff) << 32)
1010                      | ((inf >> 56) & 0xff)
1011                      | ((inf >> 40) & 0xff00)
1012                      | ((inf >> 24) & 0xff0000)
1013                      | ((inf >> 8) & 0xff000000));
1014               rels[i].r_info = inf;
1015             }
1016 #endif /* BFD64 */
1017         }
1018
1019       free (erels);
1020     }
1021   *relsp = rels;
1022   *nrelsp = nrels;
1023   return 1;
1024 }
1025
1026 /* Returns the reloc type extracted from the reloc info field.  */
1027
1028 static unsigned int
1029 get_reloc_type (bfd_vma reloc_info)
1030 {
1031   if (is_32bit_elf)
1032     return ELF32_R_TYPE (reloc_info);
1033
1034   switch (elf_header.e_machine)
1035     {
1036     case EM_MIPS:
1037       /* Note: We assume that reloc_info has already been adjusted for us.  */
1038       return ELF64_MIPS_R_TYPE (reloc_info);
1039
1040     case EM_SPARCV9:
1041       return ELF64_R_TYPE_ID (reloc_info);
1042
1043     default:
1044       return ELF64_R_TYPE (reloc_info);
1045     }
1046 }
1047
1048 /* Return the symbol index extracted from the reloc info field.  */
1049
1050 static bfd_vma
1051 get_reloc_symindex (bfd_vma reloc_info)
1052 {
1053   return is_32bit_elf ? ELF32_R_SYM (reloc_info) : ELF64_R_SYM (reloc_info);
1054 }
1055
1056 static inline bfd_boolean
1057 uses_msp430x_relocs (void)
1058 {
1059   return
1060     elf_header.e_machine == EM_MSP430 /* Paranoia.  */
1061     /* GCC uses osabi == ELFOSBI_STANDALONE.  */
1062     && (((elf_header.e_flags & EF_MSP430_MACH) == E_MSP430_MACH_MSP430X)
1063         /* TI compiler uses ELFOSABI_NONE.  */
1064         || (elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE));
1065 }
1066
1067 /* Display the contents of the relocation data found at the specified
1068    offset.  */
1069
1070 static void
1071 dump_relocations (FILE * file,
1072                   unsigned long rel_offset,
1073                   unsigned long rel_size,
1074                   Elf_Internal_Sym * symtab,
1075                   unsigned long nsyms,
1076                   char * strtab,
1077                   unsigned long strtablen,
1078                   int is_rela,
1079                   int is_dynsym)
1080 {
1081   unsigned int i;
1082   Elf_Internal_Rela * rels;
1083
1084   if (is_rela == UNKNOWN)
1085     is_rela = guess_is_rela (elf_header.e_machine);
1086
1087   if (is_rela)
1088     {
1089       if (!slurp_rela_relocs (file, rel_offset, rel_size, &rels, &rel_size))
1090         return;
1091     }
1092   else
1093     {
1094       if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
1095         return;
1096     }
1097
1098   if (is_32bit_elf)
1099     {
1100       if (is_rela)
1101         {
1102           if (do_wide)
1103             printf (_(" Offset     Info    Type                Sym. Value  Symbol's Name + Addend\n"));
1104           else
1105             printf (_(" Offset     Info    Type            Sym.Value  Sym. Name + Addend\n"));
1106         }
1107       else
1108         {
1109           if (do_wide)
1110             printf (_(" Offset     Info    Type                Sym. Value  Symbol's Name\n"));
1111           else
1112             printf (_(" Offset     Info    Type            Sym.Value  Sym. Name\n"));
1113         }
1114     }
1115   else
1116     {
1117       if (is_rela)
1118         {
1119           if (do_wide)
1120             printf (_("    Offset             Info             Type               Symbol's Value  Symbol's Name + Addend\n"));
1121           else
1122             printf (_("  Offset          Info           Type           Sym. Value    Sym. Name + Addend\n"));
1123         }
1124       else
1125         {
1126           if (do_wide)
1127             printf (_("    Offset             Info             Type               Symbol's Value  Symbol's Name\n"));
1128           else
1129             printf (_("  Offset          Info           Type           Sym. Value    Sym. Name\n"));
1130         }
1131     }
1132
1133   for (i = 0; i < rel_size; i++)
1134     {
1135       const char * rtype;
1136       bfd_vma offset;
1137       bfd_vma inf;
1138       bfd_vma symtab_index;
1139       bfd_vma type;
1140
1141       offset = rels[i].r_offset;
1142       inf    = rels[i].r_info;
1143
1144       type = get_reloc_type (inf);
1145       symtab_index = get_reloc_symindex  (inf);
1146
1147       if (is_32bit_elf)
1148         {
1149           printf ("%8.8lx  %8.8lx ",
1150                   (unsigned long) offset & 0xffffffff,
1151                   (unsigned long) inf & 0xffffffff);
1152         }
1153       else
1154         {
1155 #if BFD_HOST_64BIT_LONG
1156           printf (do_wide
1157                   ? "%16.16lx  %16.16lx "
1158                   : "%12.12lx  %12.12lx ",
1159                   offset, inf);
1160 #elif BFD_HOST_64BIT_LONG_LONG
1161 #ifndef __MSVCRT__
1162           printf (do_wide
1163                   ? "%16.16llx  %16.16llx "
1164                   : "%12.12llx  %12.12llx ",
1165                   offset, inf);
1166 #else
1167           printf (do_wide
1168                   ? "%16.16I64x  %16.16I64x "
1169                   : "%12.12I64x  %12.12I64x ",
1170                   offset, inf);
1171 #endif
1172 #else
1173           printf (do_wide
1174                   ? "%8.8lx%8.8lx  %8.8lx%8.8lx "
1175                   : "%4.4lx%8.8lx  %4.4lx%8.8lx ",
1176                   _bfd_int64_high (offset),
1177                   _bfd_int64_low (offset),
1178                   _bfd_int64_high (inf),
1179                   _bfd_int64_low (inf));
1180 #endif
1181         }
1182
1183       switch (elf_header.e_machine)
1184         {
1185         default:
1186           rtype = NULL;
1187           break;
1188
1189         case EM_AARCH64:
1190           rtype = elf_aarch64_reloc_type (type);
1191           break;
1192
1193         case EM_M32R:
1194         case EM_CYGNUS_M32R:
1195           rtype = elf_m32r_reloc_type (type);
1196           break;
1197
1198         case EM_386:
1199         case EM_IAMCU:
1200           rtype = elf_i386_reloc_type (type);
1201           break;
1202
1203         case EM_68HC11:
1204         case EM_68HC12:
1205           rtype = elf_m68hc11_reloc_type (type);
1206           break;
1207
1208         case EM_68K:
1209           rtype = elf_m68k_reloc_type (type);
1210           break;
1211
1212         case EM_960:
1213           rtype = elf_i960_reloc_type (type);
1214           break;
1215
1216         case EM_AVR:
1217         case EM_AVR_OLD:
1218           rtype = elf_avr_reloc_type (type);
1219           break;
1220
1221         case EM_OLD_SPARCV9:
1222         case EM_SPARC32PLUS:
1223         case EM_SPARCV9:
1224         case EM_SPARC:
1225           rtype = elf_sparc_reloc_type (type);
1226           break;
1227
1228         case EM_SPU:
1229           rtype = elf_spu_reloc_type (type);
1230           break;
1231
1232         case EM_V800:
1233           rtype = v800_reloc_type (type);
1234           break;
1235         case EM_V850:
1236         case EM_CYGNUS_V850:
1237           rtype = v850_reloc_type (type);
1238           break;
1239
1240         case EM_D10V:
1241         case EM_CYGNUS_D10V:
1242           rtype = elf_d10v_reloc_type (type);
1243           break;
1244
1245         case EM_D30V:
1246         case EM_CYGNUS_D30V:
1247           rtype = elf_d30v_reloc_type (type);
1248           break;
1249
1250         case EM_DLX:
1251           rtype = elf_dlx_reloc_type (type);
1252           break;
1253
1254         case EM_SH:
1255           rtype = elf_sh_reloc_type (type);
1256           break;
1257
1258         case EM_MN10300:
1259         case EM_CYGNUS_MN10300:
1260           rtype = elf_mn10300_reloc_type (type);
1261           break;
1262
1263         case EM_MN10200:
1264         case EM_CYGNUS_MN10200:
1265           rtype = elf_mn10200_reloc_type (type);
1266           break;
1267
1268         case EM_FR30:
1269         case EM_CYGNUS_FR30:
1270           rtype = elf_fr30_reloc_type (type);
1271           break;
1272
1273         case EM_CYGNUS_FRV:
1274           rtype = elf_frv_reloc_type (type);
1275           break;
1276
1277         case EM_FT32:
1278           rtype = elf_ft32_reloc_type (type);
1279           break;
1280
1281         case EM_MCORE:
1282           rtype = elf_mcore_reloc_type (type);
1283           break;
1284
1285         case EM_MMIX:
1286           rtype = elf_mmix_reloc_type (type);
1287           break;
1288
1289         case EM_MOXIE:
1290           rtype = elf_moxie_reloc_type (type);
1291           break;
1292
1293         case EM_MSP430:
1294           if (uses_msp430x_relocs ())
1295             {
1296               rtype = elf_msp430x_reloc_type (type);
1297               break;
1298             }
1299           /* Fall through.  */
1300         case EM_MSP430_OLD:
1301           rtype = elf_msp430_reloc_type (type);
1302           break;
1303
1304         case EM_NDS32:
1305           rtype = elf_nds32_reloc_type (type);
1306           break;
1307
1308         case EM_PPC:
1309           rtype = elf_ppc_reloc_type (type);
1310           break;
1311
1312         case EM_PPC64:
1313           rtype = elf_ppc64_reloc_type (type);
1314           break;
1315
1316         case EM_MIPS:
1317         case EM_MIPS_RS3_LE:
1318           rtype = elf_mips_reloc_type (type);
1319           break;
1320
1321         case EM_RISCV:
1322           rtype = elf_riscv_reloc_type (type);
1323           break;
1324
1325         case EM_ALPHA:
1326           rtype = elf_alpha_reloc_type (type);
1327           break;
1328
1329         case EM_ARM:
1330           rtype = elf_arm_reloc_type (type);
1331           break;
1332
1333         case EM_ARC:
1334         case EM_ARC_COMPACT:
1335         case EM_ARC_COMPACT2:
1336           rtype = elf_arc_reloc_type (type);
1337           break;
1338
1339         case EM_PARISC:
1340           rtype = elf_hppa_reloc_type (type);
1341           break;
1342
1343         case EM_H8_300:
1344         case EM_H8_300H:
1345         case EM_H8S:
1346           rtype = elf_h8_reloc_type (type);
1347           break;
1348
1349         case EM_OR1K:
1350           rtype = elf_or1k_reloc_type (type);
1351           break;
1352
1353         case EM_PJ:
1354         case EM_PJ_OLD:
1355           rtype = elf_pj_reloc_type (type);
1356           break;
1357         case EM_IA_64:
1358           rtype = elf_ia64_reloc_type (type);
1359           break;
1360
1361         case EM_CRIS:
1362           rtype = elf_cris_reloc_type (type);
1363           break;
1364
1365         case EM_860:
1366           rtype = elf_i860_reloc_type (type);
1367           break;
1368
1369         case EM_X86_64:
1370         case EM_L1OM:
1371         case EM_K1OM:
1372           rtype = elf_x86_64_reloc_type (type);
1373           break;
1374
1375         case EM_S370:
1376           rtype = i370_reloc_type (type);
1377           break;
1378
1379         case EM_S390_OLD:
1380         case EM_S390:
1381           rtype = elf_s390_reloc_type (type);
1382           break;
1383
1384         case EM_SCORE:
1385           rtype = elf_score_reloc_type (type);
1386           break;
1387
1388         case EM_XSTORMY16:
1389           rtype = elf_xstormy16_reloc_type (type);
1390           break;
1391
1392         case EM_CRX:
1393           rtype = elf_crx_reloc_type (type);
1394           break;
1395
1396         case EM_VAX:
1397           rtype = elf_vax_reloc_type (type);
1398           break;
1399
1400         case EM_VISIUM:
1401           rtype = elf_visium_reloc_type (type);
1402           break;
1403
1404         case EM_ADAPTEVA_EPIPHANY:
1405           rtype = elf_epiphany_reloc_type (type);
1406           break;
1407
1408         case EM_IP2K:
1409         case EM_IP2K_OLD:
1410           rtype = elf_ip2k_reloc_type (type);
1411           break;
1412
1413         case EM_IQ2000:
1414           rtype = elf_iq2000_reloc_type (type);
1415           break;
1416
1417         case EM_XTENSA_OLD:
1418         case EM_XTENSA:
1419           rtype = elf_xtensa_reloc_type (type);
1420           break;
1421
1422         case EM_LATTICEMICO32:
1423           rtype = elf_lm32_reloc_type (type);
1424           break;
1425
1426         case EM_M32C_OLD:
1427         case EM_M32C:
1428           rtype = elf_m32c_reloc_type (type);
1429           break;
1430
1431         case EM_MT:
1432           rtype = elf_mt_reloc_type (type);
1433           break;
1434
1435         case EM_BLACKFIN:
1436           rtype = elf_bfin_reloc_type (type);
1437           break;
1438
1439         case EM_CYGNUS_MEP:
1440           rtype = elf_mep_reloc_type (type);
1441           break;
1442
1443         case EM_CR16:
1444           rtype = elf_cr16_reloc_type (type);
1445           break;
1446
1447         case EM_MICROBLAZE:
1448         case EM_MICROBLAZE_OLD:
1449           rtype = elf_microblaze_reloc_type (type);
1450           break;
1451
1452         case EM_RL78:
1453           rtype = elf_rl78_reloc_type (type);
1454           break;
1455
1456         case EM_RX:
1457           rtype = elf_rx_reloc_type (type);
1458           break;
1459
1460         case EM_METAG:
1461           rtype = elf_metag_reloc_type (type);
1462           break;
1463
1464         case EM_XC16X:
1465         case EM_C166:
1466           rtype = elf_xc16x_reloc_type (type);
1467           break;
1468
1469         case EM_TI_C6000:
1470           rtype = elf_tic6x_reloc_type (type);
1471           break;
1472
1473         case EM_TILEGX:
1474           rtype = elf_tilegx_reloc_type (type);
1475           break;
1476
1477         case EM_TILEPRO:
1478           rtype = elf_tilepro_reloc_type (type);
1479           break;
1480
1481         case EM_XGATE:
1482           rtype = elf_xgate_reloc_type (type);
1483           break;
1484
1485         case EM_ALTERA_NIOS2:
1486           rtype = elf_nios2_reloc_type (type);
1487           break;
1488
1489         case EM_TI_PRU:
1490           rtype = elf_pru_reloc_type (type);
1491           break;
1492         }
1493
1494       if (rtype == NULL)
1495         printf (_("unrecognized: %-7lx"), (unsigned long) type & 0xffffffff);
1496       else
1497         printf (do_wide ? "%-22.22s" : "%-17.17s", rtype);
1498
1499       if (elf_header.e_machine == EM_ALPHA
1500           && rtype != NULL
1501           && streq (rtype, "R_ALPHA_LITUSE")
1502           && is_rela)
1503         {
1504           switch (rels[i].r_addend)
1505             {
1506             case LITUSE_ALPHA_ADDR:   rtype = "ADDR";   break;
1507             case LITUSE_ALPHA_BASE:   rtype = "BASE";   break;
1508             case LITUSE_ALPHA_BYTOFF: rtype = "BYTOFF"; break;
1509             case LITUSE_ALPHA_JSR:    rtype = "JSR";    break;
1510             case LITUSE_ALPHA_TLSGD:  rtype = "TLSGD";  break;
1511             case LITUSE_ALPHA_TLSLDM: rtype = "TLSLDM"; break;
1512             case LITUSE_ALPHA_JSRDIRECT: rtype = "JSRDIRECT"; break;
1513             default: rtype = NULL;
1514             }
1515           if (rtype)
1516             printf (" (%s)", rtype);
1517           else
1518             {
1519               putchar (' ');
1520               printf (_("<unknown addend: %lx>"),
1521                       (unsigned long) rels[i].r_addend);
1522             }
1523         }
1524       else if (symtab_index)
1525         {
1526           if (symtab == NULL || symtab_index >= nsyms)
1527             printf (_(" bad symbol index: %08lx"), (unsigned long) symtab_index);
1528           else
1529             {
1530               Elf_Internal_Sym * psym;
1531               const char * version_string;
1532               enum versioned_symbol_info sym_info;
1533               unsigned short vna_other;
1534
1535               psym = symtab + symtab_index;
1536
1537               version_string
1538                 = get_symbol_version_string (file, is_dynsym,
1539                                              strtab, strtablen,
1540                                              symtab_index,
1541                                              psym,
1542                                              &sym_info,
1543                                              &vna_other);
1544
1545               printf (" ");
1546
1547               if (ELF_ST_TYPE (psym->st_info) == STT_GNU_IFUNC)
1548                 {
1549                   const char * name;
1550                   unsigned int len;
1551                   unsigned int width = is_32bit_elf ? 8 : 14;
1552
1553                   /* Relocations against GNU_IFUNC symbols do not use the value
1554                      of the symbol as the address to relocate against.  Instead
1555                      they invoke the function named by the symbol and use its
1556                      result as the address for relocation.
1557
1558                      To indicate this to the user, do not display the value of
1559                      the symbol in the "Symbols's Value" field.  Instead show
1560                      its name followed by () as a hint that the symbol is
1561                      invoked.  */
1562
1563                   if (strtab == NULL
1564                       || psym->st_name == 0
1565                       || psym->st_name >= strtablen)
1566                     name = "??";
1567                   else
1568                     name = strtab + psym->st_name;
1569
1570                   len = print_symbol (width, name);
1571                   if (version_string)
1572                     printf (sym_info == symbol_public ? "@@%s" : "@%s",
1573                             version_string);
1574                   printf ("()%-*s", len <= width ? (width + 1) - len : 1, " ");
1575                 }
1576               else
1577                 {
1578                   print_vma (psym->st_value, LONG_HEX);
1579
1580                   printf (is_32bit_elf ? "   " : " ");
1581                 }
1582
1583               if (psym->st_name == 0)
1584                 {
1585                   const char * sec_name = "<null>";
1586                   char name_buf[40];
1587
1588                   if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1589                     {
1590                       if (psym->st_shndx < elf_header.e_shnum)
1591                         sec_name = SECTION_NAME (section_headers + psym->st_shndx);
1592                       else if (psym->st_shndx == SHN_ABS)
1593                         sec_name = "ABS";
1594                       else if (psym->st_shndx == SHN_COMMON)
1595                         sec_name = "COMMON";
1596                       else if ((elf_header.e_machine == EM_MIPS
1597                                 && psym->st_shndx == SHN_MIPS_SCOMMON)
1598                                || (elf_header.e_machine == EM_TI_C6000
1599                                    && psym->st_shndx == SHN_TIC6X_SCOMMON))
1600                         sec_name = "SCOMMON";
1601                       else if (elf_header.e_machine == EM_MIPS
1602                                && psym->st_shndx == SHN_MIPS_SUNDEFINED)
1603                         sec_name = "SUNDEF";
1604                       else if ((elf_header.e_machine == EM_X86_64
1605                                 || elf_header.e_machine == EM_L1OM
1606                                 || elf_header.e_machine == EM_K1OM)
1607                                && psym->st_shndx == SHN_X86_64_LCOMMON)
1608                         sec_name = "LARGE_COMMON";
1609                       else if (elf_header.e_machine == EM_IA_64
1610                                && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
1611                                && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1612                         sec_name = "ANSI_COM";
1613                       else if (is_ia64_vms ()
1614                                && psym->st_shndx == SHN_IA_64_VMS_SYMVEC)
1615                         sec_name = "VMS_SYMVEC";
1616                       else
1617                         {
1618                           sprintf (name_buf, "<section 0x%x>",
1619                                    (unsigned int) psym->st_shndx);
1620                           sec_name = name_buf;
1621                         }
1622                     }
1623                   print_symbol (22, sec_name);
1624                 }
1625               else if (strtab == NULL)
1626                 printf (_("<string table index: %3ld>"), psym->st_name);
1627               else if (psym->st_name >= strtablen)
1628                 printf (_("<corrupt string table index: %3ld>"), psym->st_name);
1629               else
1630                 {
1631                   print_symbol (22, strtab + psym->st_name);
1632                   if (version_string)
1633                     printf (sym_info == symbol_public ? "@@%s" : "@%s",
1634                             version_string);
1635                 }
1636
1637               if (is_rela)
1638                 {
1639                   bfd_vma off = rels[i].r_addend;
1640
1641                   if ((bfd_signed_vma) off < 0)
1642                     printf (" - %" BFD_VMA_FMT "x", - off);
1643                   else
1644                     printf (" + %" BFD_VMA_FMT "x", off);
1645                 }
1646             }
1647         }
1648       else if (is_rela)
1649         {
1650           bfd_vma off = rels[i].r_addend;
1651
1652           printf ("%*c", is_32bit_elf ? 12 : 20, ' ');
1653           if ((bfd_signed_vma) off < 0)
1654             printf ("-%" BFD_VMA_FMT "x", - off);
1655           else
1656             printf ("%" BFD_VMA_FMT "x", off);
1657         }
1658
1659       if (elf_header.e_machine == EM_SPARCV9
1660           && rtype != NULL
1661           && streq (rtype, "R_SPARC_OLO10"))
1662         printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf));
1663
1664       putchar ('\n');
1665
1666 #ifdef BFD64
1667       if (! is_32bit_elf && elf_header.e_machine == EM_MIPS)
1668         {
1669           bfd_vma type2 = ELF64_MIPS_R_TYPE2 (inf);
1670           bfd_vma type3 = ELF64_MIPS_R_TYPE3 (inf);
1671           const char * rtype2 = elf_mips_reloc_type (type2);
1672           const char * rtype3 = elf_mips_reloc_type (type3);
1673
1674           printf ("                    Type2: ");
1675
1676           if (rtype2 == NULL)
1677             printf (_("unrecognized: %-7lx"),
1678                     (unsigned long) type2 & 0xffffffff);
1679           else
1680             printf ("%-17.17s", rtype2);
1681
1682           printf ("\n                    Type3: ");
1683
1684           if (rtype3 == NULL)
1685             printf (_("unrecognized: %-7lx"),
1686                     (unsigned long) type3 & 0xffffffff);
1687           else
1688             printf ("%-17.17s", rtype3);
1689
1690           putchar ('\n');
1691         }
1692 #endif /* BFD64 */
1693     }
1694
1695   free (rels);
1696 }
1697
1698 static const char *
1699 get_mips_dynamic_type (unsigned long type)
1700 {
1701   switch (type)
1702     {
1703     case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1704     case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1705     case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1706     case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1707     case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1708     case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1709     case DT_MIPS_MSYM: return "MIPS_MSYM";
1710     case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1711     case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1712     case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1713     case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1714     case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1715     case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1716     case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1717     case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1718     case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1719     case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1720     case DT_MIPS_RLD_MAP_REL: return "MIPS_RLD_MAP_REL";
1721     case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1722     case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1723     case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1724     case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1725     case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1726     case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1727     case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1728     case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1729     case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1730     case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1731     case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1732     case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1733     case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1734     case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1735     case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1736     case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1737     case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1738     case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1739     case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1740     case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1741     case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1742     case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1743     case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1744     case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1745     case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1746     case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1747     case DT_MIPS_PLTGOT: return "MIPS_PLTGOT";
1748     case DT_MIPS_RWPLT: return "MIPS_RWPLT";
1749     default:
1750       return NULL;
1751     }
1752 }
1753
1754 static const char *
1755 get_sparc64_dynamic_type (unsigned long type)
1756 {
1757   switch (type)
1758     {
1759     case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1760     default:
1761       return NULL;
1762     }
1763 }
1764
1765 static const char *
1766 get_ppc_dynamic_type (unsigned long type)
1767 {
1768   switch (type)
1769     {
1770     case DT_PPC_GOT:    return "PPC_GOT";
1771     case DT_PPC_OPT:    return "PPC_OPT";
1772     default:
1773       return NULL;
1774     }
1775 }
1776
1777 static const char *
1778 get_ppc64_dynamic_type (unsigned long type)
1779 {
1780   switch (type)
1781     {
1782     case DT_PPC64_GLINK:  return "PPC64_GLINK";
1783     case DT_PPC64_OPD:    return "PPC64_OPD";
1784     case DT_PPC64_OPDSZ:  return "PPC64_OPDSZ";
1785     case DT_PPC64_OPT:    return "PPC64_OPT";
1786     default:
1787       return NULL;
1788     }
1789 }
1790
1791 static const char *
1792 get_parisc_dynamic_type (unsigned long type)
1793 {
1794   switch (type)
1795     {
1796     case DT_HP_LOAD_MAP:        return "HP_LOAD_MAP";
1797     case DT_HP_DLD_FLAGS:       return "HP_DLD_FLAGS";
1798     case DT_HP_DLD_HOOK:        return "HP_DLD_HOOK";
1799     case DT_HP_UX10_INIT:       return "HP_UX10_INIT";
1800     case DT_HP_UX10_INITSZ:     return "HP_UX10_INITSZ";
1801     case DT_HP_PREINIT:         return "HP_PREINIT";
1802     case DT_HP_PREINITSZ:       return "HP_PREINITSZ";
1803     case DT_HP_NEEDED:          return "HP_NEEDED";
1804     case DT_HP_TIME_STAMP:      return "HP_TIME_STAMP";
1805     case DT_HP_CHECKSUM:        return "HP_CHECKSUM";
1806     case DT_HP_GST_SIZE:        return "HP_GST_SIZE";
1807     case DT_HP_GST_VERSION:     return "HP_GST_VERSION";
1808     case DT_HP_GST_HASHVAL:     return "HP_GST_HASHVAL";
1809     case DT_HP_EPLTREL:         return "HP_GST_EPLTREL";
1810     case DT_HP_EPLTRELSZ:       return "HP_GST_EPLTRELSZ";
1811     case DT_HP_FILTERED:        return "HP_FILTERED";
1812     case DT_HP_FILTER_TLS:      return "HP_FILTER_TLS";
1813     case DT_HP_COMPAT_FILTERED: return "HP_COMPAT_FILTERED";
1814     case DT_HP_LAZYLOAD:        return "HP_LAZYLOAD";
1815     case DT_HP_BIND_NOW_COUNT:  return "HP_BIND_NOW_COUNT";
1816     case DT_PLT:                return "PLT";
1817     case DT_PLT_SIZE:           return "PLT_SIZE";
1818     case DT_DLT:                return "DLT";
1819     case DT_DLT_SIZE:           return "DLT_SIZE";
1820     default:
1821       return NULL;
1822     }
1823 }
1824
1825 static const char *
1826 get_ia64_dynamic_type (unsigned long type)
1827 {
1828   switch (type)
1829     {
1830     case DT_IA_64_PLT_RESERVE:         return "IA_64_PLT_RESERVE";
1831     case DT_IA_64_VMS_SUBTYPE:         return "VMS_SUBTYPE";
1832     case DT_IA_64_VMS_IMGIOCNT:        return "VMS_IMGIOCNT";
1833     case DT_IA_64_VMS_LNKFLAGS:        return "VMS_LNKFLAGS";
1834     case DT_IA_64_VMS_VIR_MEM_BLK_SIZ: return "VMS_VIR_MEM_BLK_SIZ";
1835     case DT_IA_64_VMS_IDENT:           return "VMS_IDENT";
1836     case DT_IA_64_VMS_NEEDED_IDENT:    return "VMS_NEEDED_IDENT";
1837     case DT_IA_64_VMS_IMG_RELA_CNT:    return "VMS_IMG_RELA_CNT";
1838     case DT_IA_64_VMS_SEG_RELA_CNT:    return "VMS_SEG_RELA_CNT";
1839     case DT_IA_64_VMS_FIXUP_RELA_CNT:  return "VMS_FIXUP_RELA_CNT";
1840     case DT_IA_64_VMS_FIXUP_NEEDED:    return "VMS_FIXUP_NEEDED";
1841     case DT_IA_64_VMS_SYMVEC_CNT:      return "VMS_SYMVEC_CNT";
1842     case DT_IA_64_VMS_XLATED:          return "VMS_XLATED";
1843     case DT_IA_64_VMS_STACKSIZE:       return "VMS_STACKSIZE";
1844     case DT_IA_64_VMS_UNWINDSZ:        return "VMS_UNWINDSZ";
1845     case DT_IA_64_VMS_UNWIND_CODSEG:   return "VMS_UNWIND_CODSEG";
1846     case DT_IA_64_VMS_UNWIND_INFOSEG:  return "VMS_UNWIND_INFOSEG";
1847     case DT_IA_64_VMS_LINKTIME:        return "VMS_LINKTIME";
1848     case DT_IA_64_VMS_SEG_NO:          return "VMS_SEG_NO";
1849     case DT_IA_64_VMS_SYMVEC_OFFSET:   return "VMS_SYMVEC_OFFSET";
1850     case DT_IA_64_VMS_SYMVEC_SEG:      return "VMS_SYMVEC_SEG";
1851     case DT_IA_64_VMS_UNWIND_OFFSET:   return "VMS_UNWIND_OFFSET";
1852     case DT_IA_64_VMS_UNWIND_SEG:      return "VMS_UNWIND_SEG";
1853     case DT_IA_64_VMS_STRTAB_OFFSET:   return "VMS_STRTAB_OFFSET";
1854     case DT_IA_64_VMS_SYSVER_OFFSET:   return "VMS_SYSVER_OFFSET";
1855     case DT_IA_64_VMS_IMG_RELA_OFF:    return "VMS_IMG_RELA_OFF";
1856     case DT_IA_64_VMS_SEG_RELA_OFF:    return "VMS_SEG_RELA_OFF";
1857     case DT_IA_64_VMS_FIXUP_RELA_OFF:  return "VMS_FIXUP_RELA_OFF";
1858     case DT_IA_64_VMS_PLTGOT_OFFSET:   return "VMS_PLTGOT_OFFSET";
1859     case DT_IA_64_VMS_PLTGOT_SEG:      return "VMS_PLTGOT_SEG";
1860     case DT_IA_64_VMS_FPMODE:          return "VMS_FPMODE";
1861     default:
1862       return NULL;
1863     }
1864 }
1865
1866 static const char *
1867 get_solaris_section_type (unsigned long type)
1868 {
1869   switch (type)
1870     {
1871     case 0x6fffffee: return "SUNW_ancillary";
1872     case 0x6fffffef: return "SUNW_capchain";
1873     case 0x6ffffff0: return "SUNW_capinfo";
1874     case 0x6ffffff1: return "SUNW_symsort";
1875     case 0x6ffffff2: return "SUNW_tlssort";
1876     case 0x6ffffff3: return "SUNW_LDYNSYM";
1877     case 0x6ffffff4: return "SUNW_dof";
1878     case 0x6ffffff5: return "SUNW_cap";
1879     case 0x6ffffff6: return "SUNW_SIGNATURE";
1880     case 0x6ffffff7: return "SUNW_ANNOTATE";
1881     case 0x6ffffff8: return "SUNW_DEBUGSTR";
1882     case 0x6ffffff9: return "SUNW_DEBUG";
1883     case 0x6ffffffa: return "SUNW_move";
1884     case 0x6ffffffb: return "SUNW_COMDAT";
1885     case 0x6ffffffc: return "SUNW_syminfo";
1886     case 0x6ffffffd: return "SUNW_verdef";
1887     case 0x6ffffffe: return "SUNW_verneed";
1888     case 0x6fffffff: return "SUNW_versym";
1889     case 0x70000000: return "SPARC_GOTDATA";
1890     default: return NULL;
1891     }
1892 }
1893
1894 static const char *
1895 get_alpha_dynamic_type (unsigned long type)
1896 {
1897   switch (type)
1898     {
1899     case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
1900     default:
1901       return NULL;
1902     }
1903 }
1904
1905 static const char *
1906 get_score_dynamic_type (unsigned long type)
1907 {
1908   switch (type)
1909     {
1910     case DT_SCORE_BASE_ADDRESS: return "SCORE_BASE_ADDRESS";
1911     case DT_SCORE_LOCAL_GOTNO:  return "SCORE_LOCAL_GOTNO";
1912     case DT_SCORE_SYMTABNO:     return "SCORE_SYMTABNO";
1913     case DT_SCORE_GOTSYM:       return "SCORE_GOTSYM";
1914     case DT_SCORE_UNREFEXTNO:   return "SCORE_UNREFEXTNO";
1915     case DT_SCORE_HIPAGENO:     return "SCORE_HIPAGENO";
1916     default:
1917       return NULL;
1918     }
1919 }
1920
1921 static const char *
1922 get_tic6x_dynamic_type (unsigned long type)
1923 {
1924   switch (type)
1925     {
1926     case DT_C6000_GSYM_OFFSET: return "C6000_GSYM_OFFSET";
1927     case DT_C6000_GSTR_OFFSET: return "C6000_GSTR_OFFSET";
1928     case DT_C6000_DSBT_BASE:   return "C6000_DSBT_BASE";
1929     case DT_C6000_DSBT_SIZE:   return "C6000_DSBT_SIZE";
1930     case DT_C6000_PREEMPTMAP:  return "C6000_PREEMPTMAP";
1931     case DT_C6000_DSBT_INDEX:  return "C6000_DSBT_INDEX";
1932     default:
1933       return NULL;
1934     }
1935 }
1936
1937 static const char *
1938 get_nios2_dynamic_type (unsigned long type)
1939 {
1940   switch (type)
1941     {
1942     case DT_NIOS2_GP: return "NIOS2_GP";
1943     default:
1944       return NULL;
1945     }
1946 }
1947
1948 static const char *
1949 get_solaris_dynamic_type (unsigned long type)
1950 {
1951   switch (type)
1952     {
1953     case 0x6000000d: return "SUNW_AUXILIARY";
1954     case 0x6000000e: return "SUNW_RTLDINF";
1955     case 0x6000000f: return "SUNW_FILTER";
1956     case 0x60000010: return "SUNW_CAP";
1957     case 0x60000011: return "SUNW_SYMTAB";
1958     case 0x60000012: return "SUNW_SYMSZ";
1959     case 0x60000013: return "SUNW_SORTENT";
1960     case 0x60000014: return "SUNW_SYMSORT";
1961     case 0x60000015: return "SUNW_SYMSORTSZ";
1962     case 0x60000016: return "SUNW_TLSSORT";
1963     case 0x60000017: return "SUNW_TLSSORTSZ";
1964     case 0x60000018: return "SUNW_CAPINFO";
1965     case 0x60000019: return "SUNW_STRPAD";
1966     case 0x6000001a: return "SUNW_CAPCHAIN";
1967     case 0x6000001b: return "SUNW_LDMACH";
1968     case 0x6000001d: return "SUNW_CAPCHAINENT";
1969     case 0x6000001f: return "SUNW_CAPCHAINSZ";
1970     case 0x60000021: return "SUNW_PARENT";
1971     case 0x60000023: return "SUNW_ASLR";
1972     case 0x60000025: return "SUNW_RELAX";
1973     case 0x60000029: return "SUNW_NXHEAP";
1974     case 0x6000002b: return "SUNW_NXSTACK";
1975
1976     case 0x70000001: return "SPARC_REGISTER";
1977     case 0x7ffffffd: return "AUXILIARY";
1978     case 0x7ffffffe: return "USED";
1979     case 0x7fffffff: return "FILTER";
1980
1981     default: return NULL;
1982     }
1983 }
1984
1985 static const char *
1986 get_dynamic_type (unsigned long type)
1987 {
1988   static char buff[64];
1989
1990   switch (type)
1991     {
1992     case DT_NULL:       return "NULL";
1993     case DT_NEEDED:     return "NEEDED";
1994     case DT_PLTRELSZ:   return "PLTRELSZ";
1995     case DT_PLTGOT:     return "PLTGOT";
1996     case DT_HASH:       return "HASH";
1997     case DT_STRTAB:     return "STRTAB";
1998     case DT_SYMTAB:     return "SYMTAB";
1999     case DT_RELA:       return "RELA";
2000     case DT_RELASZ:     return "RELASZ";
2001     case DT_RELAENT:    return "RELAENT";
2002     case DT_STRSZ:      return "STRSZ";
2003     case DT_SYMENT:     return "SYMENT";
2004     case DT_INIT:       return "INIT";
2005     case DT_FINI:       return "FINI";
2006     case DT_SONAME:     return "SONAME";
2007     case DT_RPATH:      return "RPATH";
2008     case DT_SYMBOLIC:   return "SYMBOLIC";
2009     case DT_REL:        return "REL";
2010     case DT_RELSZ:      return "RELSZ";
2011     case DT_RELENT:     return "RELENT";
2012     case DT_PLTREL:     return "PLTREL";
2013     case DT_DEBUG:      return "DEBUG";
2014     case DT_TEXTREL:    return "TEXTREL";
2015     case DT_JMPREL:     return "JMPREL";
2016     case DT_BIND_NOW:   return "BIND_NOW";
2017     case DT_INIT_ARRAY: return "INIT_ARRAY";
2018     case DT_FINI_ARRAY: return "FINI_ARRAY";
2019     case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
2020     case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
2021     case DT_RUNPATH:    return "RUNPATH";
2022     case DT_FLAGS:      return "FLAGS";
2023
2024     case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
2025     case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
2026     case DT_SYMTAB_SHNDX: return "SYMTAB_SHNDX";
2027
2028     case DT_CHECKSUM:   return "CHECKSUM";
2029     case DT_PLTPADSZ:   return "PLTPADSZ";
2030     case DT_MOVEENT:    return "MOVEENT";
2031     case DT_MOVESZ:     return "MOVESZ";
2032     case DT_FEATURE:    return "FEATURE";
2033     case DT_POSFLAG_1:  return "POSFLAG_1";
2034     case DT_SYMINSZ:    return "SYMINSZ";
2035     case DT_SYMINENT:   return "SYMINENT"; /* aka VALRNGHI */
2036
2037     case DT_ADDRRNGLO:  return "ADDRRNGLO";
2038     case DT_CONFIG:     return "CONFIG";
2039     case DT_DEPAUDIT:   return "DEPAUDIT";
2040     case DT_AUDIT:      return "AUDIT";
2041     case DT_PLTPAD:     return "PLTPAD";
2042     case DT_MOVETAB:    return "MOVETAB";
2043     case DT_SYMINFO:    return "SYMINFO"; /* aka ADDRRNGHI */
2044
2045     case DT_VERSYM:     return "VERSYM";
2046
2047     case DT_TLSDESC_GOT: return "TLSDESC_GOT";
2048     case DT_TLSDESC_PLT: return "TLSDESC_PLT";
2049     case DT_RELACOUNT:  return "RELACOUNT";
2050     case DT_RELCOUNT:   return "RELCOUNT";
2051     case DT_FLAGS_1:    return "FLAGS_1";
2052     case DT_VERDEF:     return "VERDEF";
2053     case DT_VERDEFNUM:  return "VERDEFNUM";
2054     case DT_VERNEED:    return "VERNEED";
2055     case DT_VERNEEDNUM: return "VERNEEDNUM";
2056
2057     case DT_AUXILIARY:  return "AUXILIARY";
2058     case DT_USED:       return "USED";
2059     case DT_FILTER:     return "FILTER";
2060
2061     case DT_GNU_PRELINKED: return "GNU_PRELINKED";
2062     case DT_GNU_CONFLICT: return "GNU_CONFLICT";
2063     case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
2064     case DT_GNU_LIBLIST: return "GNU_LIBLIST";
2065     case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
2066     case DT_GNU_HASH:   return "GNU_HASH";
2067
2068     default:
2069       if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
2070         {
2071           const char * result;
2072
2073           switch (elf_header.e_machine)
2074             {
2075             case EM_MIPS:
2076             case EM_MIPS_RS3_LE:
2077               result = get_mips_dynamic_type (type);
2078               break;
2079             case EM_SPARCV9:
2080               result = get_sparc64_dynamic_type (type);
2081               break;
2082             case EM_PPC:
2083               result = get_ppc_dynamic_type (type);
2084               break;
2085             case EM_PPC64:
2086               result = get_ppc64_dynamic_type (type);
2087               break;
2088             case EM_IA_64:
2089               result = get_ia64_dynamic_type (type);
2090               break;
2091             case EM_ALPHA:
2092               result = get_alpha_dynamic_type (type);
2093               break;
2094             case EM_SCORE:
2095               result = get_score_dynamic_type (type);
2096               break;
2097             case EM_TI_C6000:
2098               result = get_tic6x_dynamic_type (type);
2099               break;
2100             case EM_ALTERA_NIOS2:
2101               result = get_nios2_dynamic_type (type);
2102               break;
2103             default:
2104               if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
2105                 result = get_solaris_dynamic_type (type);
2106               else
2107                 result = NULL;
2108               break;
2109             }
2110
2111           if (result != NULL)
2112             return result;
2113
2114           snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
2115         }
2116       else if (((type >= DT_LOOS) && (type <= DT_HIOS))
2117                || (elf_header.e_machine == EM_PARISC
2118                    && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
2119         {
2120           const char * result;
2121
2122           switch (elf_header.e_machine)
2123             {
2124             case EM_PARISC:
2125               result = get_parisc_dynamic_type (type);
2126               break;
2127             case EM_IA_64:
2128               result = get_ia64_dynamic_type (type);
2129               break;
2130             default:
2131               if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
2132                 result = get_solaris_dynamic_type (type);
2133               else
2134                 result = NULL;
2135               break;
2136             }
2137
2138           if (result != NULL)
2139             return result;
2140
2141           snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
2142                     type);
2143         }
2144       else
2145         snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
2146
2147       return buff;
2148     }
2149 }
2150
2151 static char *
2152 get_file_type (unsigned e_type)
2153 {
2154   static char buff[32];
2155
2156   switch (e_type)
2157     {
2158     case ET_NONE:       return _("NONE (None)");
2159     case ET_REL:        return _("REL (Relocatable file)");
2160     case ET_EXEC:       return _("EXEC (Executable file)");
2161     case ET_DYN:        return _("DYN (Shared object file)");
2162     case ET_CORE:       return _("CORE (Core file)");
2163
2164     default:
2165       if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
2166         snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
2167       else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
2168         snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
2169       else
2170         snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
2171       return buff;
2172     }
2173 }
2174
2175 static char *
2176 get_machine_name (unsigned e_machine)
2177 {
2178   static char buff[64]; /* XXX */
2179
2180   switch (e_machine)
2181     {
2182     case EM_NONE:               return _("None");
2183     case EM_AARCH64:            return "AArch64";
2184     case EM_M32:                return "WE32100";
2185     case EM_SPARC:              return "Sparc";
2186     case EM_SPU:                return "SPU";
2187     case EM_386:                return "Intel 80386";
2188     case EM_68K:                return "MC68000";
2189     case EM_88K:                return "MC88000";
2190     case EM_IAMCU:              return "Intel MCU";
2191     case EM_860:                return "Intel 80860";
2192     case EM_MIPS:               return "MIPS R3000";
2193     case EM_S370:               return "IBM System/370";
2194     case EM_MIPS_RS3_LE:        return "MIPS R4000 big-endian";
2195     case EM_OLD_SPARCV9:        return "Sparc v9 (old)";
2196     case EM_PARISC:             return "HPPA";
2197     case EM_PPC_OLD:            return "Power PC (old)";
2198     case EM_SPARC32PLUS:        return "Sparc v8+" ;
2199     case EM_960:                return "Intel 90860";
2200     case EM_PPC:                return "PowerPC";
2201     case EM_PPC64:              return "PowerPC64";
2202     case EM_FR20:               return "Fujitsu FR20";
2203     case EM_FT32:               return "FTDI FT32";
2204     case EM_RH32:               return "TRW RH32";
2205     case EM_MCORE:              return "MCORE";
2206     case EM_ARM:                return "ARM";
2207     case EM_OLD_ALPHA:          return "Digital Alpha (old)";
2208     case EM_SH:                 return "Renesas / SuperH SH";
2209     case EM_SPARCV9:            return "Sparc v9";
2210     case EM_TRICORE:            return "Siemens Tricore";
2211     case EM_ARC:                return "ARC";
2212     case EM_ARC_COMPACT:        return "ARCompact";
2213     case EM_ARC_COMPACT2:       return "ARCv2";
2214     case EM_H8_300:             return "Renesas H8/300";
2215     case EM_H8_300H:            return "Renesas H8/300H";
2216     case EM_H8S:                return "Renesas H8S";
2217     case EM_H8_500:             return "Renesas H8/500";
2218     case EM_IA_64:              return "Intel IA-64";
2219     case EM_MIPS_X:             return "Stanford MIPS-X";
2220     case EM_COLDFIRE:           return "Motorola Coldfire";
2221     case EM_ALPHA:              return "Alpha";
2222     case EM_CYGNUS_D10V:
2223     case EM_D10V:               return "d10v";
2224     case EM_CYGNUS_D30V:
2225     case EM_D30V:               return "d30v";
2226     case EM_CYGNUS_M32R:
2227     case EM_M32R:               return "Renesas M32R (formerly Mitsubishi M32r)";
2228     case EM_CYGNUS_V850:
2229     case EM_V800:               return "Renesas V850 (using RH850 ABI)";
2230     case EM_V850:               return "Renesas V850";
2231     case EM_CYGNUS_MN10300:
2232     case EM_MN10300:            return "mn10300";
2233     case EM_CYGNUS_MN10200:
2234     case EM_MN10200:            return "mn10200";
2235     case EM_MOXIE:              return "Moxie";
2236     case EM_CYGNUS_FR30:
2237     case EM_FR30:               return "Fujitsu FR30";
2238     case EM_CYGNUS_FRV:         return "Fujitsu FR-V";
2239     case EM_PJ_OLD:
2240     case EM_PJ:                 return "picoJava";
2241     case EM_MMA:                return "Fujitsu Multimedia Accelerator";
2242     case EM_PCP:                return "Siemens PCP";
2243     case EM_NCPU:               return "Sony nCPU embedded RISC processor";
2244     case EM_NDR1:               return "Denso NDR1 microprocesspr";
2245     case EM_STARCORE:           return "Motorola Star*Core processor";
2246     case EM_ME16:               return "Toyota ME16 processor";
2247     case EM_ST100:              return "STMicroelectronics ST100 processor";
2248     case EM_TINYJ:              return "Advanced Logic Corp. TinyJ embedded processor";
2249     case EM_PDSP:               return "Sony DSP processor";
2250     case EM_PDP10:              return "Digital Equipment Corp. PDP-10";
2251     case EM_PDP11:              return "Digital Equipment Corp. PDP-11";
2252     case EM_FX66:               return "Siemens FX66 microcontroller";
2253     case EM_ST9PLUS:            return "STMicroelectronics ST9+ 8/16 bit microcontroller";
2254     case EM_ST7:                return "STMicroelectronics ST7 8-bit microcontroller";
2255     case EM_68HC16:             return "Motorola MC68HC16 Microcontroller";
2256     case EM_68HC12:             return "Motorola MC68HC12 Microcontroller";
2257     case EM_68HC11:             return "Motorola MC68HC11 Microcontroller";
2258     case EM_68HC08:             return "Motorola MC68HC08 Microcontroller";
2259     case EM_68HC05:             return "Motorola MC68HC05 Microcontroller";
2260     case EM_SVX:                return "Silicon Graphics SVx";
2261     case EM_ST19:               return "STMicroelectronics ST19 8-bit microcontroller";
2262     case EM_VAX:                return "Digital VAX";
2263     case EM_VISIUM:             return "CDS VISIUMcore processor";
2264     case EM_AVR_OLD:
2265     case EM_AVR:                return "Atmel AVR 8-bit microcontroller";
2266     case EM_CRIS:               return "Axis Communications 32-bit embedded processor";
2267     case EM_JAVELIN:            return "Infineon Technologies 32-bit embedded cpu";
2268     case EM_FIREPATH:           return "Element 14 64-bit DSP processor";
2269     case EM_ZSP:                return "LSI Logic's 16-bit DSP processor";
2270     case EM_MMIX:               return "Donald Knuth's educational 64-bit processor";
2271     case EM_HUANY:              return "Harvard Universitys's machine-independent object format";
2272     case EM_PRISM:              return "Vitesse Prism";
2273     case EM_X86_64:             return "Advanced Micro Devices X86-64";
2274     case EM_L1OM:               return "Intel L1OM";
2275     case EM_K1OM:               return "Intel K1OM";
2276     case EM_S390_OLD:
2277     case EM_S390:               return "IBM S/390";
2278     case EM_SCORE:              return "SUNPLUS S+Core";
2279     case EM_XSTORMY16:          return "Sanyo XStormy16 CPU core";
2280     case EM_OR1K:               return "OpenRISC 1000";
2281     case EM_CRX:                return "National Semiconductor CRX microprocessor";
2282     case EM_ADAPTEVA_EPIPHANY:  return "Adapteva EPIPHANY";
2283     case EM_DLX:                return "OpenDLX";
2284     case EM_IP2K_OLD:
2285     case EM_IP2K:               return "Ubicom IP2xxx 8-bit microcontrollers";
2286     case EM_IQ2000:             return "Vitesse IQ2000";
2287     case EM_XTENSA_OLD:
2288     case EM_XTENSA:             return "Tensilica Xtensa Processor";
2289     case EM_VIDEOCORE:          return "Alphamosaic VideoCore processor";
2290     case EM_TMM_GPP:            return "Thompson Multimedia General Purpose Processor";
2291     case EM_NS32K:              return "National Semiconductor 32000 series";
2292     case EM_TPC:                return "Tenor Network TPC processor";
2293     case EM_ST200:              return "STMicroelectronics ST200 microcontroller";
2294     case EM_MAX:                return "MAX Processor";
2295     case EM_CR:                 return "National Semiconductor CompactRISC";
2296     case EM_F2MC16:             return "Fujitsu F2MC16";
2297     case EM_MSP430:             return "Texas Instruments msp430 microcontroller";
2298     case EM_LATTICEMICO32:      return "Lattice Mico32";
2299     case EM_M32C_OLD:
2300     case EM_M32C:               return "Renesas M32c";
2301     case EM_MT:                 return "Morpho Techologies MT processor";
2302     case EM_BLACKFIN:           return "Analog Devices Blackfin";
2303     case EM_SE_C33:             return "S1C33 Family of Seiko Epson processors";
2304     case EM_SEP:                return "Sharp embedded microprocessor";
2305     case EM_ARCA:               return "Arca RISC microprocessor";
2306     case EM_UNICORE:            return "Unicore";
2307     case EM_EXCESS:             return "eXcess 16/32/64-bit configurable embedded CPU";
2308     case EM_DXP:                return "Icera Semiconductor Inc. Deep Execution Processor";
2309     case EM_NIOS32:             return "Altera Nios";
2310     case EM_ALTERA_NIOS2:       return "Altera Nios II";
2311     case EM_C166:
2312     case EM_XC16X:              return "Infineon Technologies xc16x";
2313     case EM_M16C:               return "Renesas M16C series microprocessors";
2314     case EM_DSPIC30F:           return "Microchip Technology dsPIC30F Digital Signal Controller";
2315     case EM_CE:                 return "Freescale Communication Engine RISC core";
2316     case EM_TSK3000:            return "Altium TSK3000 core";
2317     case EM_RS08:               return "Freescale RS08 embedded processor";
2318     case EM_ECOG2:              return "Cyan Technology eCOG2 microprocessor";
2319     case EM_DSP24:              return "New Japan Radio (NJR) 24-bit DSP Processor";
2320     case EM_VIDEOCORE3:         return "Broadcom VideoCore III processor";
2321     case EM_SE_C17:             return "Seiko Epson C17 family";
2322     case EM_TI_C6000:           return "Texas Instruments TMS320C6000 DSP family";
2323     case EM_TI_C2000:           return "Texas Instruments TMS320C2000 DSP family";
2324     case EM_TI_C5500:           return "Texas Instruments TMS320C55x DSP family";
2325     case EM_MMDSP_PLUS:         return "STMicroelectronics 64bit VLIW Data Signal Processor";
2326     case EM_CYPRESS_M8C:        return "Cypress M8C microprocessor";
2327     case EM_R32C:               return "Renesas R32C series microprocessors";
2328     case EM_TRIMEDIA:           return "NXP Semiconductors TriMedia architecture family";
2329     case EM_QDSP6:              return "QUALCOMM DSP6 Processor";
2330     case EM_8051:               return "Intel 8051 and variants";
2331     case EM_STXP7X:             return "STMicroelectronics STxP7x family";
2332     case EM_NDS32:              return "Andes Technology compact code size embedded RISC processor family";
2333     case EM_ECOG1X:             return "Cyan Technology eCOG1X family";
2334     case EM_MAXQ30:             return "Dallas Semiconductor MAXQ30 Core microcontrollers";
2335     case EM_XIMO16:             return "New Japan Radio (NJR) 16-bit DSP Processor";
2336     case EM_MANIK:              return "M2000 Reconfigurable RISC Microprocessor";
2337     case EM_CRAYNV2:            return "Cray Inc. NV2 vector architecture";
2338     case EM_CYGNUS_MEP:         return "Toshiba MeP Media Engine";
2339     case EM_CR16:
2340     case EM_MICROBLAZE:
2341     case EM_MICROBLAZE_OLD:     return "Xilinx MicroBlaze";
2342     case EM_RISCV:              return "RISC-V";
2343     case EM_RL78:               return "Renesas RL78";
2344     case EM_RX:                 return "Renesas RX";
2345     case EM_METAG:              return "Imagination Technologies Meta processor architecture";
2346     case EM_MCST_ELBRUS:        return "MCST Elbrus general purpose hardware architecture";
2347     case EM_ECOG16:             return "Cyan Technology eCOG16 family";
2348     case EM_ETPU:               return "Freescale Extended Time Processing Unit";
2349     case EM_SLE9X:              return "Infineon Technologies SLE9X core";
2350     case EM_AVR32:              return "Atmel Corporation 32-bit microprocessor family";
2351     case EM_STM8:               return "STMicroeletronics STM8 8-bit microcontroller";
2352     case EM_TILE64:             return "Tilera TILE64 multicore architecture family";
2353     case EM_TILEPRO:            return "Tilera TILEPro multicore architecture family";
2354     case EM_TILEGX:             return "Tilera TILE-Gx multicore architecture family";
2355     case EM_CUDA:               return "NVIDIA CUDA architecture";
2356     case EM_XGATE:              return "Motorola XGATE embedded processor";
2357     case EM_CLOUDSHIELD:        return "CloudShield architecture family";
2358     case EM_COREA_1ST:          return "KIPO-KAIST Core-A 1st generation processor family";
2359     case EM_COREA_2ND:          return "KIPO-KAIST Core-A 2nd generation processor family";
2360     case EM_OPEN8:              return "Open8 8-bit RISC soft processor core";
2361     case EM_VIDEOCORE5:         return "Broadcom VideoCore V processor";
2362     case EM_56800EX:            return "Freescale 56800EX Digital Signal Controller (DSC)";
2363     case EM_BA1:                return "Beyond BA1 CPU architecture";
2364     case EM_BA2:                return "Beyond BA2 CPU architecture";
2365     case EM_XCORE:              return "XMOS xCORE processor family";
2366     case EM_MCHP_PIC:           return "Microchip 8-bit PIC(r) family";
2367     case EM_KM32:               return "KM211 KM32 32-bit processor";
2368     case EM_KMX32:              return "KM211 KMX32 32-bit processor";
2369     case EM_KMX16:              return "KM211 KMX16 16-bit processor";
2370     case EM_KMX8:               return "KM211 KMX8 8-bit processor";
2371     case EM_KVARC:              return "KM211 KVARC processor";
2372     case EM_CDP:                return "Paneve CDP architecture family";
2373     case EM_COGE:               return "Cognitive Smart Memory Processor";
2374     case EM_COOL:               return "Bluechip Systems CoolEngine";
2375     case EM_NORC:               return "Nanoradio Optimized RISC";
2376     case EM_CSR_KALIMBA:        return "CSR Kalimba architecture family";
2377     case EM_Z80:                return "Zilog Z80";
2378     case EM_AMDGPU:             return "AMD GPU architecture";
2379     case EM_TI_PRU:             return "TI PRU I/O processor";
2380     default:
2381       snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
2382       return buff;
2383     }
2384 }
2385
2386 static void
2387 decode_ARC_machine_flags (unsigned e_flags, unsigned e_machine, char buf[])
2388 {
2389   /* ARC has two machine types EM_ARC_COMPACT and EM_ARC_COMPACT2.  Some
2390      other compilers don't a specific architecture type in the e_flags, and
2391      instead use EM_ARC_COMPACT for old ARC600, ARC601, and ARC700
2392      architectures, and switch to EM_ARC_COMPACT2 for newer ARCEM and ARCHS
2393      architectures.
2394
2395      Th GNU tools follows this use of EM_ARC_COMPACT and EM_ARC_COMPACT2,
2396      but also sets a specific architecture type in the e_flags field.
2397
2398      However, when decoding the flags we don't worry if we see an
2399      unexpected pairing, for example EM_ARC_COMPACT machine type, with
2400      ARCEM architecture type.  */
2401
2402   switch (e_flags & EF_ARC_MACH_MSK)
2403     {
2404       /* We only expect these to occur for EM_ARC_COMPACT2.  */
2405     case EF_ARC_CPU_ARCV2EM:
2406       strcat (buf, ", ARC EM");
2407       break;
2408     case EF_ARC_CPU_ARCV2HS:
2409       strcat (buf, ", ARC HS");
2410       break;
2411
2412       /* We only expect these to occur for EM_ARC_COMPACT.  */
2413     case E_ARC_MACH_ARC600:
2414       strcat (buf, ", ARC600");
2415       break;
2416     case E_ARC_MACH_ARC601:
2417       strcat (buf, ", ARC601");
2418       break;
2419     case E_ARC_MACH_ARC700:
2420       strcat (buf, ", ARC700");
2421       break;
2422
2423       /* The only times we should end up here are (a) A corrupt ELF, (b) A
2424          new ELF with new architecture being read by an old version of
2425          readelf, or (c) An ELF built with non-GNU compiler that does not
2426          set the architecture in the e_flags.  */
2427     default:
2428       if (e_machine == EM_ARC_COMPACT)
2429         strcat (buf, ", Unknown ARCompact");
2430       else
2431         strcat (buf, ", Unknown ARC");
2432       break;
2433     }
2434
2435   switch (e_flags & EF_ARC_OSABI_MSK)
2436     {
2437     case E_ARC_OSABI_ORIG:
2438       strcat (buf, ", (ABI:legacy)");
2439       break;
2440     case E_ARC_OSABI_V2:
2441       strcat (buf, ", (ABI:v2)");
2442       break;
2443       /* Only upstream 3.9+ kernels will support ARCv2 ISA.  */
2444     case E_ARC_OSABI_V3:
2445       strcat (buf, ", v3 no-legacy-syscalls ABI");
2446       break;
2447     default:
2448       strcat (buf, ", unrecognised ARC OSABI flag");
2449       break;
2450     }
2451 }
2452
2453 static void
2454 decode_ARM_machine_flags (unsigned e_flags, char buf[])
2455 {
2456   unsigned eabi;
2457   int unknown = 0;
2458
2459   eabi = EF_ARM_EABI_VERSION (e_flags);
2460   e_flags &= ~ EF_ARM_EABIMASK;
2461
2462   /* Handle "generic" ARM flags.  */
2463   if (e_flags & EF_ARM_RELEXEC)
2464     {
2465       strcat (buf, ", relocatable executable");
2466       e_flags &= ~ EF_ARM_RELEXEC;
2467     }
2468
2469   /* Now handle EABI specific flags.  */
2470   switch (eabi)
2471     {
2472     default:
2473       strcat (buf, ", <unrecognized EABI>");
2474       if (e_flags)
2475         unknown = 1;
2476       break;
2477
2478     case EF_ARM_EABI_VER1:
2479       strcat (buf, ", Version1 EABI");
2480       while (e_flags)
2481         {
2482           unsigned flag;
2483
2484           /* Process flags one bit at a time.  */
2485           flag = e_flags & - e_flags;
2486           e_flags &= ~ flag;
2487
2488           switch (flag)
2489             {
2490             case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK.  */
2491               strcat (buf, ", sorted symbol tables");
2492               break;
2493
2494             default:
2495               unknown = 1;
2496               break;
2497             }
2498         }
2499       break;
2500
2501     case EF_ARM_EABI_VER2:
2502       strcat (buf, ", Version2 EABI");
2503       while (e_flags)
2504         {
2505           unsigned flag;
2506
2507           /* Process flags one bit at a time.  */
2508           flag = e_flags & - e_flags;
2509           e_flags &= ~ flag;
2510
2511           switch (flag)
2512             {
2513             case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK.  */
2514               strcat (buf, ", sorted symbol tables");
2515               break;
2516
2517             case EF_ARM_DYNSYMSUSESEGIDX:
2518               strcat (buf, ", dynamic symbols use segment index");
2519               break;
2520
2521             case EF_ARM_MAPSYMSFIRST:
2522               strcat (buf, ", mapping symbols precede others");
2523               break;
2524
2525             default:
2526               unknown = 1;
2527               break;
2528             }
2529         }
2530       break;
2531
2532     case EF_ARM_EABI_VER3:
2533       strcat (buf, ", Version3 EABI");
2534       break;
2535
2536     case EF_ARM_EABI_VER4:
2537       strcat (buf, ", Version4 EABI");
2538       while (e_flags)
2539         {
2540           unsigned flag;
2541
2542           /* Process flags one bit at a time.  */
2543           flag = e_flags & - e_flags;
2544           e_flags &= ~ flag;
2545
2546           switch (flag)
2547             {
2548             case EF_ARM_BE8:
2549               strcat (buf, ", BE8");
2550               break;
2551
2552             case EF_ARM_LE8:
2553               strcat (buf, ", LE8");
2554               break;
2555
2556             default:
2557               unknown = 1;
2558               break;
2559             }
2560       break;
2561         }
2562       break;
2563
2564     case EF_ARM_EABI_VER5:
2565       strcat (buf, ", Version5 EABI");
2566       while (e_flags)
2567         {
2568           unsigned flag;
2569
2570           /* Process flags one bit at a time.  */
2571           flag = e_flags & - e_flags;
2572           e_flags &= ~ flag;
2573
2574           switch (flag)
2575             {
2576             case EF_ARM_BE8:
2577               strcat (buf, ", BE8");
2578               break;
2579
2580             case EF_ARM_LE8:
2581               strcat (buf, ", LE8");
2582               break;
2583
2584             case EF_ARM_ABI_FLOAT_SOFT: /* Conflicts with EF_ARM_SOFT_FLOAT.  */
2585               strcat (buf, ", soft-float ABI");
2586               break;
2587
2588             case EF_ARM_ABI_FLOAT_HARD: /* Conflicts with EF_ARM_VFP_FLOAT.  */
2589               strcat (buf, ", hard-float ABI");
2590               break;
2591
2592             default:
2593               unknown = 1;
2594               break;
2595             }
2596         }
2597       break;
2598
2599     case EF_ARM_EABI_UNKNOWN:
2600       strcat (buf, ", GNU EABI");
2601       while (e_flags)
2602         {
2603           unsigned flag;
2604
2605           /* Process flags one bit at a time.  */
2606           flag = e_flags & - e_flags;
2607           e_flags &= ~ flag;
2608
2609           switch (flag)
2610             {
2611             case EF_ARM_INTERWORK:
2612               strcat (buf, ", interworking enabled");
2613               break;
2614
2615             case EF_ARM_APCS_26:
2616               strcat (buf, ", uses APCS/26");
2617               break;
2618
2619             case EF_ARM_APCS_FLOAT:
2620               strcat (buf, ", uses APCS/float");
2621               break;
2622
2623             case EF_ARM_PIC:
2624               strcat (buf, ", position independent");
2625               break;
2626
2627             case EF_ARM_ALIGN8:
2628               strcat (buf, ", 8 bit structure alignment");
2629               break;
2630
2631             case EF_ARM_NEW_ABI:
2632               strcat (buf, ", uses new ABI");
2633               break;
2634
2635             case EF_ARM_OLD_ABI:
2636               strcat (buf, ", uses old ABI");
2637               break;
2638
2639             case EF_ARM_SOFT_FLOAT:
2640               strcat (buf, ", software FP");
2641               break;
2642
2643             case EF_ARM_VFP_FLOAT:
2644               strcat (buf, ", VFP");
2645               break;
2646
2647             case EF_ARM_MAVERICK_FLOAT:
2648               strcat (buf, ", Maverick FP");
2649               break;
2650
2651             default:
2652               unknown = 1;
2653               break;
2654             }
2655         }
2656     }
2657
2658   if (unknown)
2659     strcat (buf,_(", <unknown>"));
2660 }
2661
2662 static void
2663 decode_AVR_machine_flags (unsigned e_flags, char buf[], size_t size)
2664 {
2665   --size; /* Leave space for null terminator.  */
2666
2667   switch (e_flags & EF_AVR_MACH)
2668     {
2669     case E_AVR_MACH_AVR1:
2670       strncat (buf, ", avr:1", size);
2671       break;
2672     case E_AVR_MACH_AVR2:
2673       strncat (buf, ", avr:2", size);
2674       break;
2675     case E_AVR_MACH_AVR25:
2676       strncat (buf, ", avr:25", size);
2677       break;
2678     case E_AVR_MACH_AVR3:
2679       strncat (buf, ", avr:3", size);
2680       break;
2681     case E_AVR_MACH_AVR31:
2682       strncat (buf, ", avr:31", size);
2683       break;
2684     case E_AVR_MACH_AVR35:
2685       strncat (buf, ", avr:35", size);
2686       break;
2687     case E_AVR_MACH_AVR4:
2688       strncat (buf, ", avr:4", size);
2689       break;
2690     case E_AVR_MACH_AVR5:
2691       strncat (buf, ", avr:5", size);
2692       break;
2693     case E_AVR_MACH_AVR51:
2694       strncat (buf, ", avr:51", size);
2695       break;
2696     case E_AVR_MACH_AVR6:
2697       strncat (buf, ", avr:6", size);
2698       break;
2699     case E_AVR_MACH_AVRTINY:
2700       strncat (buf, ", avr:100", size);
2701       break;
2702     case E_AVR_MACH_XMEGA1:
2703       strncat (buf, ", avr:101", size);
2704       break;
2705     case E_AVR_MACH_XMEGA2:
2706       strncat (buf, ", avr:102", size);
2707       break;
2708     case E_AVR_MACH_XMEGA3:
2709       strncat (buf, ", avr:103", size);
2710       break;
2711     case E_AVR_MACH_XMEGA4:
2712       strncat (buf, ", avr:104", size);
2713       break;
2714     case E_AVR_MACH_XMEGA5:
2715       strncat (buf, ", avr:105", size);
2716       break;
2717     case E_AVR_MACH_XMEGA6:
2718       strncat (buf, ", avr:106", size);
2719       break;
2720     case E_AVR_MACH_XMEGA7:
2721       strncat (buf, ", avr:107", size);
2722       break;
2723     default:
2724       strncat (buf, ", avr:<unknown>", size);
2725       break;
2726     }
2727
2728   size -= strlen (buf);
2729   if (e_flags & EF_AVR_LINKRELAX_PREPARED)
2730     strncat (buf, ", link-relax", size);
2731 }
2732
2733 static void
2734 decode_NDS32_machine_flags (unsigned e_flags, char buf[], size_t size)
2735 {
2736   unsigned abi;
2737   unsigned arch;
2738   unsigned config;
2739   unsigned version;
2740   int has_fpu = 0;
2741   int r = 0;
2742
2743   static const char *ABI_STRINGS[] =
2744   {
2745     "ABI v0", /* use r5 as return register; only used in N1213HC */
2746     "ABI v1", /* use r0 as return register */
2747     "ABI v2", /* use r0 as return register and don't reserve 24 bytes for arguments */
2748     "ABI v2fp", /* for FPU */
2749     "AABI",
2750     "ABI2 FP+"
2751   };
2752   static const char *VER_STRINGS[] =
2753   {
2754     "Andes ELF V1.3 or older",
2755     "Andes ELF V1.3.1",
2756     "Andes ELF V1.4"
2757   };
2758   static const char *ARCH_STRINGS[] =
2759   {
2760     "",
2761     "Andes Star v1.0",
2762     "Andes Star v2.0",
2763     "Andes Star v3.0",
2764     "Andes Star v3.0m"
2765   };
2766
2767   abi = EF_NDS_ABI & e_flags;
2768   arch = EF_NDS_ARCH & e_flags;
2769   config = EF_NDS_INST & e_flags;
2770   version = EF_NDS32_ELF_VERSION & e_flags;
2771
2772   memset (buf, 0, size);
2773
2774   switch (abi)
2775     {
2776     case E_NDS_ABI_V0:
2777     case E_NDS_ABI_V1:
2778     case E_NDS_ABI_V2:
2779     case E_NDS_ABI_V2FP:
2780     case E_NDS_ABI_AABI:
2781     case E_NDS_ABI_V2FP_PLUS:
2782       /* In case there are holes in the array.  */
2783       r += snprintf (buf + r, size - r, ", %s", ABI_STRINGS[abi >> EF_NDS_ABI_SHIFT]);
2784       break;
2785
2786     default:
2787       r += snprintf (buf + r, size - r, ", <unrecognized ABI>");
2788       break;
2789     }
2790
2791   switch (version)
2792     {
2793     case E_NDS32_ELF_VER_1_2:
2794     case E_NDS32_ELF_VER_1_3:
2795     case E_NDS32_ELF_VER_1_4:
2796       r += snprintf (buf + r, size - r, ", %s", VER_STRINGS[version >> EF_NDS32_ELF_VERSION_SHIFT]);
2797       break;
2798
2799     default:
2800       r += snprintf (buf + r, size - r, ", <unrecognized ELF version number>");
2801       break;
2802     }
2803
2804   if (E_NDS_ABI_V0 == abi)
2805     {
2806       /* OLD ABI; only used in N1213HC, has performance extension 1.  */
2807       r += snprintf (buf + r, size - r, ", Andes Star v1.0, N1213HC, MAC, PERF1");
2808       if (arch == E_NDS_ARCH_STAR_V1_0)
2809         r += snprintf (buf + r, size -r, ", 16b"); /* has 16-bit instructions */
2810       return;
2811     }
2812
2813   switch (arch)
2814     {
2815     case E_NDS_ARCH_STAR_V1_0:
2816     case E_NDS_ARCH_STAR_V2_0:
2817     case E_NDS_ARCH_STAR_V3_0:
2818     case E_NDS_ARCH_STAR_V3_M:
2819       r += snprintf (buf + r, size - r, ", %s", ARCH_STRINGS[arch >> EF_NDS_ARCH_SHIFT]);
2820       break;
2821
2822     default:
2823       r += snprintf (buf + r, size - r, ", <unrecognized architecture>");
2824       /* ARCH version determines how the e_flags are interpreted.
2825          If it is unknown, we cannot proceed.  */
2826       return;
2827     }
2828
2829   /* Newer ABI; Now handle architecture specific flags.  */
2830   if (arch == E_NDS_ARCH_STAR_V1_0)
2831     {
2832       if (config & E_NDS32_HAS_MFUSR_PC_INST)
2833         r += snprintf (buf + r, size -r, ", MFUSR_PC");
2834
2835       if (!(config & E_NDS32_HAS_NO_MAC_INST))
2836         r += snprintf (buf + r, size -r, ", MAC");
2837
2838       if (config & E_NDS32_HAS_DIV_INST)
2839         r += snprintf (buf + r, size -r, ", DIV");
2840
2841       if (config & E_NDS32_HAS_16BIT_INST)
2842         r += snprintf (buf + r, size -r, ", 16b");
2843     }
2844   else
2845     {
2846       if (config & E_NDS32_HAS_MFUSR_PC_INST)
2847         {
2848           if (version <= E_NDS32_ELF_VER_1_3)
2849             r += snprintf (buf + r, size -r, ", [B8]");
2850           else
2851             r += snprintf (buf + r, size -r, ", EX9");
2852         }
2853
2854       if (config & E_NDS32_HAS_MAC_DX_INST)
2855         r += snprintf (buf + r, size -r, ", MAC_DX");
2856
2857       if (config & E_NDS32_HAS_DIV_DX_INST)
2858         r += snprintf (buf + r, size -r, ", DIV_DX");
2859
2860       if (config & E_NDS32_HAS_16BIT_INST)
2861         {
2862           if (version <= E_NDS32_ELF_VER_1_3)
2863             r += snprintf (buf + r, size -r, ", 16b");
2864           else
2865             r += snprintf (buf + r, size -r, ", IFC");
2866         }
2867     }
2868
2869   if (config & E_NDS32_HAS_EXT_INST)
2870     r += snprintf (buf + r, size -r, ", PERF1");
2871
2872   if (config & E_NDS32_HAS_EXT2_INST)
2873     r += snprintf (buf + r, size -r, ", PERF2");
2874
2875   if (config & E_NDS32_HAS_FPU_INST)
2876     {
2877       has_fpu = 1;
2878       r += snprintf (buf + r, size -r, ", FPU_SP");
2879     }
2880
2881   if (config & E_NDS32_HAS_FPU_DP_INST)
2882     {
2883       has_fpu = 1;
2884       r += snprintf (buf + r, size -r, ", FPU_DP");
2885     }
2886
2887   if (config & E_NDS32_HAS_FPU_MAC_INST)
2888     {
2889       has_fpu = 1;
2890       r += snprintf (buf + r, size -r, ", FPU_MAC");
2891     }
2892
2893   if (has_fpu)
2894     {
2895       switch ((config & E_NDS32_FPU_REG_CONF) >> E_NDS32_FPU_REG_CONF_SHIFT)
2896         {
2897         case E_NDS32_FPU_REG_8SP_4DP:
2898           r += snprintf (buf + r, size -r, ", FPU_REG:8/4");
2899           break;
2900         case E_NDS32_FPU_REG_16SP_8DP:
2901           r += snprintf (buf + r, size -r, ", FPU_REG:16/8");
2902           break;
2903         case E_NDS32_FPU_REG_32SP_16DP:
2904           r += snprintf (buf + r, size -r, ", FPU_REG:32/16");
2905           break;
2906         case E_NDS32_FPU_REG_32SP_32DP:
2907           r += snprintf (buf + r, size -r, ", FPU_REG:32/32");
2908           break;
2909         }
2910     }
2911
2912   if (config & E_NDS32_HAS_AUDIO_INST)
2913     r += snprintf (buf + r, size -r, ", AUDIO");
2914
2915   if (config & E_NDS32_HAS_STRING_INST)
2916     r += snprintf (buf + r, size -r, ", STR");
2917
2918   if (config & E_NDS32_HAS_REDUCED_REGS)
2919     r += snprintf (buf + r, size -r, ", 16REG");
2920
2921   if (config & E_NDS32_HAS_VIDEO_INST)
2922     {
2923       if (version <= E_NDS32_ELF_VER_1_3)
2924         r += snprintf (buf + r, size -r, ", VIDEO");
2925       else
2926         r += snprintf (buf + r, size -r, ", SATURATION");
2927     }
2928
2929   if (config & E_NDS32_HAS_ENCRIPT_INST)
2930     r += snprintf (buf + r, size -r, ", ENCRP");
2931
2932   if (config & E_NDS32_HAS_L2C_INST)
2933     r += snprintf (buf + r, size -r, ", L2C");
2934 }
2935
2936 static char *
2937 get_machine_flags (unsigned e_flags, unsigned e_machine)
2938 {
2939   static char buf[1024];
2940
2941   buf[0] = '\0';
2942
2943   if (e_flags)
2944     {
2945       switch (e_machine)
2946         {
2947         default:
2948           break;
2949
2950         case EM_ARC_COMPACT2:
2951         case EM_ARC_COMPACT:
2952           decode_ARC_machine_flags (e_flags, e_machine, buf);
2953           break;
2954
2955         case EM_ARM:
2956           decode_ARM_machine_flags (e_flags, buf);
2957           break;
2958
2959         case EM_AVR:
2960           decode_AVR_machine_flags (e_flags, buf, sizeof buf);
2961           break;
2962
2963         case EM_BLACKFIN:
2964           if (e_flags & EF_BFIN_PIC)
2965             strcat (buf, ", PIC");
2966
2967           if (e_flags & EF_BFIN_FDPIC)
2968             strcat (buf, ", FDPIC");
2969
2970           if (e_flags & EF_BFIN_CODE_IN_L1)
2971             strcat (buf, ", code in L1");
2972
2973           if (e_flags & EF_BFIN_DATA_IN_L1)
2974             strcat (buf, ", data in L1");
2975
2976           break;
2977
2978         case EM_CYGNUS_FRV:
2979           switch (e_flags & EF_FRV_CPU_MASK)
2980             {
2981             case EF_FRV_CPU_GENERIC:
2982               break;
2983
2984             default:
2985               strcat (buf, ", fr???");
2986               break;
2987
2988             case EF_FRV_CPU_FR300:
2989               strcat (buf, ", fr300");
2990               break;
2991
2992             case EF_FRV_CPU_FR400:
2993               strcat (buf, ", fr400");
2994               break;
2995             case EF_FRV_CPU_FR405:
2996               strcat (buf, ", fr405");
2997               break;
2998
2999             case EF_FRV_CPU_FR450:
3000               strcat (buf, ", fr450");
3001               break;
3002
3003             case EF_FRV_CPU_FR500:
3004               strcat (buf, ", fr500");
3005               break;
3006             case EF_FRV_CPU_FR550:
3007               strcat (buf, ", fr550");
3008               break;
3009
3010             case EF_FRV_CPU_SIMPLE:
3011               strcat (buf, ", simple");
3012               break;
3013             case EF_FRV_CPU_TOMCAT:
3014               strcat (buf, ", tomcat");
3015               break;
3016             }
3017           break;
3018
3019         case EM_68K:
3020           if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
3021             strcat (buf, ", m68000");
3022           else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
3023             strcat (buf, ", cpu32");
3024           else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
3025             strcat (buf, ", fido_a");
3026           else
3027             {
3028               char const * isa = _("unknown");
3029               char const * mac = _("unknown mac");
3030               char const * additional = NULL;
3031
3032               switch (e_flags & EF_M68K_CF_ISA_MASK)
3033                 {
3034                 case EF_M68K_CF_ISA_A_NODIV:
3035                   isa = "A";
3036                   additional = ", nodiv";
3037                   break;
3038                 case EF_M68K_CF_ISA_A:
3039                   isa = "A";
3040                   break;
3041                 case EF_M68K_CF_ISA_A_PLUS:
3042                   isa = "A+";
3043                   break;
3044                 case EF_M68K_CF_ISA_B_NOUSP:
3045                   isa = "B";
3046                   additional = ", nousp";
3047                   break;
3048                 case EF_M68K_CF_ISA_B:
3049                   isa = "B";
3050                   break;
3051                 case EF_M68K_CF_ISA_C:
3052                   isa = "C";
3053                   break;
3054                 case EF_M68K_CF_ISA_C_NODIV:
3055                   isa = "C";
3056                   additional = ", nodiv";
3057                   break;
3058                 }
3059               strcat (buf, ", cf, isa ");
3060               strcat (buf, isa);
3061               if (additional)
3062                 strcat (buf, additional);
3063               if (e_flags & EF_M68K_CF_FLOAT)
3064                 strcat (buf, ", float");
3065               switch (e_flags & EF_M68K_CF_MAC_MASK)
3066                 {
3067                 case 0:
3068                   mac = NULL;
3069                   break;
3070                 case EF_M68K_CF_MAC:
3071                   mac = "mac";
3072                   break;
3073                 case EF_M68K_CF_EMAC:
3074                   mac = "emac";
3075                   break;
3076                 case EF_M68K_CF_EMAC_B:
3077                   mac = "emac_b";
3078                   break;
3079                 }
3080               if (mac)
3081                 {
3082                   strcat (buf, ", ");
3083                   strcat (buf, mac);
3084                 }
3085             }
3086           break;
3087
3088         case EM_CYGNUS_MEP:
3089           switch (e_flags & EF_MEP_CPU_MASK)
3090             {
3091             case EF_MEP_CPU_MEP: strcat (buf, ", generic MeP"); break;
3092             case EF_MEP_CPU_C2: strcat (buf, ", MeP C2"); break;
3093             case EF_MEP_CPU_C3: strcat (buf, ", MeP C3"); break;
3094             case EF_MEP_CPU_C4: strcat (buf, ", MeP C4"); break;
3095             case EF_MEP_CPU_C5: strcat (buf, ", MeP C5"); break;
3096             case EF_MEP_CPU_H1: strcat (buf, ", MeP H1"); break;
3097             default: strcat (buf, _(", <unknown MeP cpu type>")); break;
3098             }
3099
3100           switch (e_flags & EF_MEP_COP_MASK)
3101             {
3102             case EF_MEP_COP_NONE: break;
3103             case EF_MEP_COP_AVC: strcat (buf, ", AVC coprocessor"); break;
3104             case EF_MEP_COP_AVC2: strcat (buf, ", AVC2 coprocessor"); break;
3105             case EF_MEP_COP_FMAX: strcat (buf, ", FMAX coprocessor"); break;
3106             case EF_MEP_COP_IVC2: strcat (buf, ", IVC2 coprocessor"); break;
3107             default: strcat (buf, _("<unknown MeP copro type>")); break;
3108             }
3109
3110           if (e_flags & EF_MEP_LIBRARY)
3111             strcat (buf, ", Built for Library");
3112
3113           if (e_flags & EF_MEP_INDEX_MASK)
3114             sprintf (buf + strlen (buf), ", Configuration Index: %#x",
3115                      e_flags & EF_MEP_INDEX_MASK);
3116
3117           if (e_flags & ~ EF_MEP_ALL_FLAGS)
3118             sprintf (buf + strlen (buf), _(", unknown flags bits: %#x"),
3119                      e_flags & ~ EF_MEP_ALL_FLAGS);
3120           break;
3121
3122         case EM_PPC:
3123           if (e_flags & EF_PPC_EMB)
3124             strcat (buf, ", emb");
3125
3126           if (e_flags & EF_PPC_RELOCATABLE)
3127             strcat (buf, _(", relocatable"));
3128
3129           if (e_flags & EF_PPC_RELOCATABLE_LIB)
3130             strcat (buf, _(", relocatable-lib"));
3131           break;
3132
3133         case EM_PPC64:
3134           if (e_flags & EF_PPC64_ABI)
3135             {
3136               char abi[] = ", abiv0";
3137
3138               abi[6] += e_flags & EF_PPC64_ABI;
3139               strcat (buf, abi);
3140             }
3141           break;
3142
3143         case EM_V800:
3144           if ((e_flags & EF_RH850_ABI) == EF_RH850_ABI)
3145             strcat (buf, ", RH850 ABI");
3146
3147           if (e_flags & EF_V800_850E3)
3148             strcat (buf, ", V3 architecture");
3149
3150           if ((e_flags & (EF_RH850_FPU_DOUBLE | EF_RH850_FPU_SINGLE)) == 0)
3151             strcat (buf, ", FPU not used");
3152
3153           if ((e_flags & (EF_RH850_REGMODE22 | EF_RH850_REGMODE32)) == 0)
3154             strcat (buf, ", regmode: COMMON");
3155
3156           if ((e_flags & (EF_RH850_GP_FIX | EF_RH850_GP_NOFIX)) == 0)
3157             strcat (buf, ", r4 not used");
3158
3159           if ((e_flags & (EF_RH850_EP_FIX | EF_RH850_EP_NOFIX)) == 0)
3160             strcat (buf, ", r30 not used");
3161
3162           if ((e_flags & (EF_RH850_TP_FIX | EF_RH850_TP_NOFIX)) == 0)
3163             strcat (buf, ", r5 not used");
3164
3165           if ((e_flags & (EF_RH850_REG2_RESERVE | EF_RH850_REG2_NORESERVE)) == 0)
3166             strcat (buf, ", r2 not used");
3167
3168           for (e_flags &= 0xFFFF; e_flags; e_flags &= ~ (e_flags & - e_flags))
3169             {
3170               switch (e_flags & - e_flags)
3171                 {
3172                 case EF_RH850_FPU_DOUBLE: strcat (buf, ", double precision FPU"); break;
3173                 case EF_RH850_FPU_SINGLE: strcat (buf, ", single precision FPU"); break;
3174                 case EF_RH850_REGMODE22: strcat (buf, ", regmode:22"); break;
3175                 case EF_RH850_REGMODE32: strcat (buf, ", regmode:23"); break;
3176                 case EF_RH850_GP_FIX: strcat (buf, ", r4 fixed"); break;
3177                 case EF_RH850_GP_NOFIX: strcat (buf, ", r4 free"); break;
3178                 case EF_RH850_EP_FIX: strcat (buf, ", r30 fixed"); break;
3179                 case EF_RH850_EP_NOFIX: strcat (buf, ", r30 free"); break;
3180                 case EF_RH850_TP_FIX: strcat (buf, ", r5 fixed"); break;
3181                 case EF_RH850_TP_NOFIX: strcat (buf, ", r5 free"); break;
3182                 case EF_RH850_REG2_RESERVE: strcat (buf, ", r2 fixed"); break;
3183                 case EF_RH850_REG2_NORESERVE: strcat (buf, ", r2 free"); break;
3184                 default: break;
3185                 }
3186             }
3187           break;
3188
3189         case EM_V850:
3190         case EM_CYGNUS_V850:
3191           switch (e_flags & EF_V850_ARCH)
3192             {
3193             case E_V850E3V5_ARCH:
3194               strcat (buf, ", v850e3v5");
3195               break;
3196             case E_V850E2V3_ARCH:
3197               strcat (buf, ", v850e2v3");
3198               break;
3199             case E_V850E2_ARCH:
3200               strcat (buf, ", v850e2");
3201               break;
3202             case E_V850E1_ARCH:
3203               strcat (buf, ", v850e1");
3204               break;
3205             case E_V850E_ARCH:
3206               strcat (buf, ", v850e");
3207               break;
3208             case E_V850_ARCH:
3209               strcat (buf, ", v850");
3210               break;
3211             default:
3212               strcat (buf, _(", unknown v850 architecture variant"));
3213               break;
3214             }
3215           break;
3216
3217         case EM_M32R:
3218         case EM_CYGNUS_M32R:
3219           if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
3220             strcat (buf, ", m32r");
3221           break;
3222
3223         case EM_MIPS:
3224         case EM_MIPS_RS3_LE:
3225           if (e_flags & EF_MIPS_NOREORDER)
3226             strcat (buf, ", noreorder");
3227
3228           if (e_flags & EF_MIPS_PIC)
3229             strcat (buf, ", pic");
3230
3231           if (e_flags & EF_MIPS_CPIC)
3232             strcat (buf, ", cpic");
3233
3234           if (e_flags & EF_MIPS_UCODE)
3235             strcat (buf, ", ugen_reserved");
3236
3237           if (e_flags & EF_MIPS_ABI2)
3238             strcat (buf, ", abi2");
3239
3240           if (e_flags & EF_MIPS_OPTIONS_FIRST)
3241             strcat (buf, ", odk first");
3242
3243           if (e_flags & EF_MIPS_32BITMODE)
3244             strcat (buf, ", 32bitmode");
3245
3246           if (e_flags & EF_MIPS_NAN2008)
3247             strcat (buf, ", nan2008");
3248
3249           if (e_flags & EF_MIPS_FP64)
3250             strcat (buf, ", fp64");
3251
3252           switch ((e_flags & EF_MIPS_MACH))
3253             {
3254             case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
3255             case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
3256             case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
3257             case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
3258             case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
3259             case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
3260             case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
3261             case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
3262             case E_MIPS_MACH_SB1:  strcat (buf, ", sb1");  break;
3263             case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
3264             case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break;
3265             case E_MIPS_MACH_LS2F: strcat (buf, ", loongson-2f"); break;
3266             case E_MIPS_MACH_LS3A: strcat (buf, ", loongson-3a"); break;
3267             case E_MIPS_MACH_OCTEON: strcat (buf, ", octeon"); break;
3268             case E_MIPS_MACH_OCTEON2: strcat (buf, ", octeon2"); break;
3269             case E_MIPS_MACH_OCTEON3: strcat (buf, ", octeon3"); break;
3270             case E_MIPS_MACH_XLR:  strcat (buf, ", xlr"); break;
3271             case 0:
3272             /* We simply ignore the field in this case to avoid confusion:
3273                MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
3274                extension.  */
3275               break;
3276             default: strcat (buf, _(", unknown CPU")); break;
3277             }
3278
3279           switch ((e_flags & EF_MIPS_ABI))
3280             {
3281             case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
3282             case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
3283             case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
3284             case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
3285             case 0:
3286             /* We simply ignore the field in this case to avoid confusion:
3287                MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
3288                This means it is likely to be an o32 file, but not for
3289                sure.  */
3290               break;
3291             default: strcat (buf, _(", unknown ABI")); break;
3292             }
3293
3294           if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
3295             strcat (buf, ", mdmx");
3296
3297           if (e_flags & EF_MIPS_ARCH_ASE_M16)
3298             strcat (buf, ", mips16");
3299
3300           if (e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
3301             strcat (buf, ", micromips");
3302
3303           switch ((e_flags & EF_MIPS_ARCH))
3304             {
3305             case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
3306             case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
3307             case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
3308             case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
3309             case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
3310             case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
3311             case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
3312             case E_MIPS_ARCH_32R6: strcat (buf, ", mips32r6"); break;
3313             case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
3314             case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
3315             case E_MIPS_ARCH_64R6: strcat (buf, ", mips64r6"); break;
3316             default: strcat (buf, _(", unknown ISA")); break;
3317             }
3318           break;
3319
3320         case EM_NDS32:
3321           decode_NDS32_machine_flags (e_flags, buf, sizeof buf);
3322           break;
3323
3324         case EM_RISCV:
3325           if (e_flags & EF_RISCV_RVC)
3326             strcat (buf, ", RVC");
3327
3328           switch (e_flags & EF_RISCV_FLOAT_ABI)
3329             {
3330             case EF_RISCV_FLOAT_ABI_SOFT:
3331               strcat (buf, ", soft-float ABI");
3332               break;
3333
3334             case EF_RISCV_FLOAT_ABI_SINGLE:
3335               strcat (buf, ", single-float ABI");
3336               break;
3337
3338             case EF_RISCV_FLOAT_ABI_DOUBLE:
3339               strcat (buf, ", double-float ABI");
3340               break;
3341
3342             case EF_RISCV_FLOAT_ABI_QUAD:
3343               strcat (buf, ", quad-float ABI");
3344               break;
3345             }
3346           break;
3347
3348         case EM_SH:
3349           switch ((e_flags & EF_SH_MACH_MASK))
3350             {
3351             case EF_SH1: strcat (buf, ", sh1"); break;
3352             case EF_SH2: strcat (buf, ", sh2"); break;
3353             case EF_SH3: strcat (buf, ", sh3"); break;
3354             case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
3355             case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
3356             case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
3357             case EF_SH3E: strcat (buf, ", sh3e"); break;
3358             case EF_SH4: strcat (buf, ", sh4"); break;
3359             case EF_SH5: strcat (buf, ", sh5"); break;
3360             case EF_SH2E: strcat (buf, ", sh2e"); break;
3361             case EF_SH4A: strcat (buf, ", sh4a"); break;
3362             case EF_SH2A: strcat (buf, ", sh2a"); break;
3363             case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
3364             case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
3365             case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
3366             case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
3367             case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
3368             case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
3369             case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
3370             case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
3371             case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
3372             default: strcat (buf, _(", unknown ISA")); break;
3373             }
3374
3375           if (e_flags & EF_SH_PIC)
3376             strcat (buf, ", pic");
3377
3378           if (e_flags & EF_SH_FDPIC)
3379             strcat (buf, ", fdpic");
3380           break;
3381
3382         case EM_OR1K:
3383           if (e_flags & EF_OR1K_NODELAY)
3384             strcat (buf, ", no delay");
3385           break;
3386
3387         case EM_SPARCV9:
3388           if (e_flags & EF_SPARC_32PLUS)
3389             strcat (buf, ", v8+");
3390
3391           if (e_flags & EF_SPARC_SUN_US1)
3392             strcat (buf, ", ultrasparcI");
3393
3394           if (e_flags & EF_SPARC_SUN_US3)
3395             strcat (buf, ", ultrasparcIII");
3396
3397           if (e_flags & EF_SPARC_HAL_R1)
3398             strcat (buf, ", halr1");
3399
3400           if (e_flags & EF_SPARC_LEDATA)
3401             strcat (buf, ", ledata");
3402
3403           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
3404             strcat (buf, ", tso");
3405
3406           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
3407             strcat (buf, ", pso");
3408
3409           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
3410             strcat (buf, ", rmo");
3411           break;
3412
3413         case EM_PARISC:
3414           switch (e_flags & EF_PARISC_ARCH)
3415             {
3416             case EFA_PARISC_1_0:
3417               strcpy (buf, ", PA-RISC 1.0");
3418               break;
3419             case EFA_PARISC_1_1:
3420               strcpy (buf, ", PA-RISC 1.1");
3421               break;
3422             case EFA_PARISC_2_0:
3423               strcpy (buf, ", PA-RISC 2.0");
3424               break;
3425             default:
3426               break;
3427             }
3428           if (e_flags & EF_PARISC_TRAPNIL)
3429             strcat (buf, ", trapnil");
3430           if (e_flags & EF_PARISC_EXT)
3431             strcat (buf, ", ext");
3432           if (e_flags & EF_PARISC_LSB)
3433             strcat (buf, ", lsb");
3434           if (e_flags & EF_PARISC_WIDE)
3435             strcat (buf, ", wide");
3436           if (e_flags & EF_PARISC_NO_KABP)
3437             strcat (buf, ", no kabp");
3438           if (e_flags & EF_PARISC_LAZYSWAP)
3439             strcat (buf, ", lazyswap");
3440           break;
3441
3442         case EM_PJ:
3443         case EM_PJ_OLD:
3444           if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
3445             strcat (buf, ", new calling convention");
3446
3447           if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
3448             strcat (buf, ", gnu calling convention");
3449           break;
3450
3451         case EM_IA_64:
3452           if ((e_flags & EF_IA_64_ABI64))
3453             strcat (buf, ", 64-bit");
3454           else
3455             strcat (buf, ", 32-bit");
3456           if ((e_flags & EF_IA_64_REDUCEDFP))
3457             strcat (buf, ", reduced fp model");
3458           if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
3459             strcat (buf, ", no function descriptors, constant gp");
3460           else if ((e_flags & EF_IA_64_CONS_GP))
3461             strcat (buf, ", constant gp");
3462           if ((e_flags & EF_IA_64_ABSOLUTE))
3463             strcat (buf, ", absolute");
3464           if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
3465             {
3466               if ((e_flags & EF_IA_64_VMS_LINKAGES))
3467                 strcat (buf, ", vms_linkages");
3468               switch ((e_flags & EF_IA_64_VMS_COMCOD))
3469                 {
3470                 case EF_IA_64_VMS_COMCOD_SUCCESS:
3471                   break;
3472                 case EF_IA_64_VMS_COMCOD_WARNING:
3473                   strcat (buf, ", warning");
3474                   break;
3475                 case EF_IA_64_VMS_COMCOD_ERROR:
3476                   strcat (buf, ", error");
3477                   break;
3478                 case EF_IA_64_VMS_COMCOD_ABORT:
3479                   strcat (buf, ", abort");
3480                   break;
3481                 default:
3482                   warn (_("Unrecognised IA64 VMS Command Code: %x\n"),
3483                         e_flags & EF_IA_64_VMS_COMCOD);
3484                   strcat (buf, ", <unknown>");
3485                 }
3486             }
3487           break;
3488
3489         case EM_VAX:
3490           if ((e_flags & EF_VAX_NONPIC))
3491             strcat (buf, ", non-PIC");
3492           if ((e_flags & EF_VAX_DFLOAT))
3493             strcat (buf, ", D-Float");
3494           if ((e_flags & EF_VAX_GFLOAT))
3495             strcat (buf, ", G-Float");
3496           break;
3497
3498         case EM_VISIUM:
3499           if (e_flags & EF_VISIUM_ARCH_MCM)
3500             strcat (buf, ", mcm");
3501           else if (e_flags & EF_VISIUM_ARCH_MCM24)
3502             strcat (buf, ", mcm24");
3503           if (e_flags & EF_VISIUM_ARCH_GR6)
3504             strcat (buf, ", gr6");
3505           break;
3506
3507         case EM_RL78:
3508           switch (e_flags & E_FLAG_RL78_CPU_MASK)
3509             {
3510             case E_FLAG_RL78_ANY_CPU: break;
3511             case E_FLAG_RL78_G10: strcat (buf, ", G10"); break;
3512             case E_FLAG_RL78_G13: strcat (buf, ", G13"); break;
3513             case E_FLAG_RL78_G14: strcat (buf, ", G14"); break;
3514             }
3515           if (e_flags & E_FLAG_RL78_64BIT_DOUBLES)
3516             strcat (buf, ", 64-bit doubles");
3517           break;
3518
3519         case EM_RX:
3520           if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
3521             strcat (buf, ", 64-bit doubles");
3522           if (e_flags & E_FLAG_RX_DSP)
3523             strcat (buf, ", dsp");
3524           if (e_flags & E_FLAG_RX_PID)
3525             strcat (buf, ", pid");
3526           if (e_flags & E_FLAG_RX_ABI)
3527             strcat (buf, ", RX ABI");
3528           if (e_flags & E_FLAG_RX_SINSNS_SET)
3529             strcat (buf, e_flags & E_FLAG_RX_SINSNS_YES
3530                     ? ", uses String instructions" : ", bans String instructions");
3531           if (e_flags & E_FLAG_RX_V2)
3532             strcat (buf, ", V2");
3533           break;
3534
3535         case EM_S390:
3536           if (e_flags & EF_S390_HIGH_GPRS)
3537             strcat (buf, ", highgprs");
3538           break;
3539
3540         case EM_TI_C6000:
3541           if ((e_flags & EF_C6000_REL))
3542             strcat (buf, ", relocatable module");
3543           break;
3544
3545         case EM_MSP430:
3546           strcat (buf, _(": architecture variant: "));
3547           switch (e_flags & EF_MSP430_MACH)
3548             {
3549             case E_MSP430_MACH_MSP430x11: strcat (buf, "MSP430x11"); break;
3550             case E_MSP430_MACH_MSP430x11x1 : strcat (buf, "MSP430x11x1 "); break;
3551             case E_MSP430_MACH_MSP430x12: strcat (buf, "MSP430x12"); break;
3552             case E_MSP430_MACH_MSP430x13: strcat (buf, "MSP430x13"); break;
3553             case E_MSP430_MACH_MSP430x14: strcat (buf, "MSP430x14"); break;
3554             case E_MSP430_MACH_MSP430x15: strcat (buf, "MSP430x15"); break;
3555             case E_MSP430_MACH_MSP430x16: strcat (buf, "MSP430x16"); break;
3556             case E_MSP430_MACH_MSP430x31: strcat (buf, "MSP430x31"); break;
3557             case E_MSP430_MACH_MSP430x32: strcat (buf, "MSP430x32"); break;
3558             case E_MSP430_MACH_MSP430x33: strcat (buf, "MSP430x33"); break;
3559             case E_MSP430_MACH_MSP430x41: strcat (buf, "MSP430x41"); break;
3560             case E_MSP430_MACH_MSP430x42: strcat (buf, "MSP430x42"); break;
3561             case E_MSP430_MACH_MSP430x43: strcat (buf, "MSP430x43"); break;
3562             case E_MSP430_MACH_MSP430x44: strcat (buf, "MSP430x44"); break;
3563             case E_MSP430_MACH_MSP430X  : strcat (buf, "MSP430X"); break;
3564             default:
3565               strcat (buf, _(": unknown")); break;
3566             }
3567
3568           if (e_flags & ~ EF_MSP430_MACH)
3569             strcat (buf, _(": unknown extra flag bits also present"));
3570         }
3571     }
3572
3573   return buf;
3574 }
3575
3576 static const char *
3577 get_osabi_name (unsigned int osabi)
3578 {
3579   static char buff[32];
3580
3581   switch (osabi)
3582     {
3583     case ELFOSABI_NONE:         return "UNIX - System V";
3584     case ELFOSABI_HPUX:         return "UNIX - HP-UX";
3585     case ELFOSABI_NETBSD:       return "UNIX - NetBSD";
3586     case ELFOSABI_GNU:          return "UNIX - GNU";
3587     case ELFOSABI_SOLARIS:      return "UNIX - Solaris";
3588     case ELFOSABI_AIX:          return "UNIX - AIX";
3589     case ELFOSABI_IRIX:         return "UNIX - IRIX";
3590     case ELFOSABI_FREEBSD:      return "UNIX - FreeBSD";
3591     case ELFOSABI_TRU64:        return "UNIX - TRU64";
3592     case ELFOSABI_MODESTO:      return "Novell - Modesto";
3593     case ELFOSABI_OPENBSD:      return "UNIX - OpenBSD";
3594     case ELFOSABI_OPENVMS:      return "VMS - OpenVMS";
3595     case ELFOSABI_NSK:          return "HP - Non-Stop Kernel";
3596     case ELFOSABI_AROS:         return "AROS";
3597     case ELFOSABI_FENIXOS:      return "FenixOS";
3598     case ELFOSABI_CLOUDABI:     return "Nuxi CloudABI";
3599     case ELFOSABI_OPENVOS:      return "Stratus Technologies OpenVOS";
3600     default:
3601       if (osabi >= 64)
3602         switch (elf_header.e_machine)
3603           {
3604           case EM_ARM:
3605             switch (osabi)
3606               {
3607               case ELFOSABI_ARM:        return "ARM";
3608               default:
3609                 break;
3610               }
3611             break;
3612
3613           case EM_MSP430:
3614           case EM_MSP430_OLD:
3615           case EM_VISIUM:
3616             switch (osabi)
3617               {
3618               case ELFOSABI_STANDALONE: return _("Standalone App");
3619               default:
3620                 break;
3621               }
3622             break;
3623
3624           case EM_TI_C6000:
3625             switch (osabi)
3626               {
3627               case ELFOSABI_C6000_ELFABI:       return _("Bare-metal C6000");
3628               case ELFOSABI_C6000_LINUX:        return "Linux C6000";
3629               default:
3630                 break;
3631               }
3632             break;
3633
3634           default:
3635             break;
3636           }
3637       snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
3638       return buff;
3639     }
3640 }
3641
3642 static const char *
3643 get_aarch64_segment_type (unsigned long type)
3644 {
3645   switch (type)
3646     {
3647     case PT_AARCH64_ARCHEXT:
3648       return "AARCH64_ARCHEXT";
3649     default:
3650       break;
3651     }
3652
3653   return NULL;
3654 }
3655
3656 static const char *
3657 get_arm_segment_type (unsigned long type)
3658 {
3659   switch (type)
3660     {
3661     case PT_ARM_EXIDX:
3662       return "EXIDX";
3663     default:
3664       break;
3665     }
3666
3667   return NULL;
3668 }
3669
3670 static const char *
3671 get_mips_segment_type (unsigned long type)
3672 {
3673   switch (type)
3674     {
3675     case PT_MIPS_REGINFO:
3676       return "REGINFO";
3677     case PT_MIPS_RTPROC:
3678       return "RTPROC";
3679     case PT_MIPS_OPTIONS:
3680       return "OPTIONS";
3681     case PT_MIPS_ABIFLAGS:
3682       return "ABIFLAGS";
3683     default:
3684       break;
3685     }
3686
3687   return NULL;
3688 }
3689
3690 static const char *
3691 get_parisc_segment_type (unsigned long type)
3692 {
3693   switch (type)
3694     {
3695     case PT_HP_TLS:             return "HP_TLS";
3696     case PT_HP_CORE_NONE:       return "HP_CORE_NONE";
3697     case PT_HP_CORE_VERSION:    return "HP_CORE_VERSION";
3698     case PT_HP_CORE_KERNEL:     return "HP_CORE_KERNEL";
3699     case PT_HP_CORE_COMM:       return "HP_CORE_COMM";
3700     case PT_HP_CORE_PROC:       return "HP_CORE_PROC";
3701     case PT_HP_CORE_LOADABLE:   return "HP_CORE_LOADABLE";
3702     case PT_HP_CORE_STACK:      return "HP_CORE_STACK";
3703     case PT_HP_CORE_SHM:        return "HP_CORE_SHM";
3704     case PT_HP_CORE_MMF:        return "HP_CORE_MMF";
3705     case PT_HP_PARALLEL:        return "HP_PARALLEL";
3706     case PT_HP_FASTBIND:        return "HP_FASTBIND";
3707     case PT_HP_OPT_ANNOT:       return "HP_OPT_ANNOT";
3708     case PT_HP_HSL_ANNOT:       return "HP_HSL_ANNOT";
3709     case PT_HP_STACK:           return "HP_STACK";
3710     case PT_HP_CORE_UTSNAME:    return "HP_CORE_UTSNAME";
3711     case PT_PARISC_ARCHEXT:     return "PARISC_ARCHEXT";
3712     case PT_PARISC_UNWIND:      return "PARISC_UNWIND";
3713     case PT_PARISC_WEAKORDER:   return "PARISC_WEAKORDER";
3714     default:
3715       break;
3716     }
3717
3718   return NULL;
3719 }
3720
3721 static const char *
3722 get_ia64_segment_type (unsigned long type)
3723 {
3724   switch (type)
3725     {
3726     case PT_IA_64_ARCHEXT:      return "IA_64_ARCHEXT";
3727     case PT_IA_64_UNWIND:       return "IA_64_UNWIND";
3728     case PT_HP_TLS:             return "HP_TLS";
3729     case PT_IA_64_HP_OPT_ANOT:  return "HP_OPT_ANNOT";
3730     case PT_IA_64_HP_HSL_ANOT:  return "HP_HSL_ANNOT";
3731     case PT_IA_64_HP_STACK:     return "HP_STACK";
3732     default:
3733       break;
3734     }
3735
3736   return NULL;
3737 }
3738
3739 static const char *
3740 get_tic6x_segment_type (unsigned long type)
3741 {
3742   switch (type)
3743     {
3744     case PT_C6000_PHATTR:       return "C6000_PHATTR";
3745     default:
3746       break;
3747     }
3748
3749   return NULL;
3750 }
3751
3752 static const char *
3753 get_solaris_segment_type (unsigned long type)
3754 {
3755   switch (type)
3756     {
3757     case 0x6464e550: return "PT_SUNW_UNWIND";
3758     case 0x6474e550: return "PT_SUNW_EH_FRAME";
3759     case 0x6ffffff7: return "PT_LOSUNW";
3760     case 0x6ffffffa: return "PT_SUNWBSS";
3761     case 0x6ffffffb: return "PT_SUNWSTACK";
3762     case 0x6ffffffc: return "PT_SUNWDTRACE";
3763     case 0x6ffffffd: return "PT_SUNWCAP";
3764     case 0x6fffffff: return "PT_HISUNW";
3765     default: return NULL;
3766     }
3767 }
3768
3769 static const char *
3770 get_segment_type (unsigned long p_type)
3771 {
3772   static char buff[32];
3773
3774   switch (p_type)
3775     {
3776     case PT_NULL:       return "NULL";
3777     case PT_LOAD:       return "LOAD";
3778     case PT_DYNAMIC:    return "DYNAMIC";
3779     case PT_INTERP:     return "INTERP";
3780     case PT_NOTE:       return "NOTE";
3781     case PT_SHLIB:      return "SHLIB";
3782     case PT_PHDR:       return "PHDR";
3783     case PT_TLS:        return "TLS";
3784
3785     case PT_GNU_EH_FRAME:
3786                         return "GNU_EH_FRAME";
3787     case PT_GNU_STACK:  return "GNU_STACK";
3788     case PT_GNU_RELRO:  return "GNU_RELRO";
3789
3790     default:
3791       if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
3792         {
3793           const char * result;
3794
3795           switch (elf_header.e_machine)
3796             {
3797             case EM_AARCH64:
3798               result = get_aarch64_segment_type (p_type);
3799               break;
3800             case EM_ARM:
3801               result = get_arm_segment_type (p_type);
3802               break;
3803             case EM_MIPS:
3804             case EM_MIPS_RS3_LE:
3805               result = get_mips_segment_type (p_type);
3806               break;
3807             case EM_PARISC:
3808               result = get_parisc_segment_type (p_type);
3809               break;
3810             case EM_IA_64:
3811               result = get_ia64_segment_type (p_type);
3812               break;
3813             case EM_TI_C6000:
3814               result = get_tic6x_segment_type (p_type);
3815               break;
3816             default:
3817               result = NULL;
3818               break;
3819             }
3820
3821           if (result != NULL)
3822             return result;
3823
3824           sprintf (buff, "LOPROC+%#lx", p_type - PT_LOPROC);
3825         }
3826       else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
3827         {
3828           const char * result;
3829
3830           switch (elf_header.e_machine)
3831             {
3832             case EM_PARISC:
3833               result = get_parisc_segment_type (p_type);
3834               break;
3835             case EM_IA_64:
3836               result = get_ia64_segment_type (p_type);
3837               break;
3838             default:
3839               if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
3840                 result = get_solaris_segment_type (p_type);
3841               else
3842                 result = NULL;
3843               break;
3844             }
3845
3846           if (result != NULL)
3847             return result;
3848
3849           sprintf (buff, "LOOS+%#lx", p_type - PT_LOOS);
3850         }
3851       else
3852         snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
3853
3854       return buff;
3855     }
3856 }
3857
3858 static const char *
3859 get_mips_section_type_name (unsigned int sh_type)
3860 {
3861   switch (sh_type)
3862     {
3863     case SHT_MIPS_LIBLIST:       return "MIPS_LIBLIST";
3864     case SHT_MIPS_MSYM:          return "MIPS_MSYM";
3865     case SHT_MIPS_CONFLICT:      return "MIPS_CONFLICT";
3866     case SHT_MIPS_GPTAB:         return "MIPS_GPTAB";
3867     case SHT_MIPS_UCODE:         return "MIPS_UCODE";
3868     case SHT_MIPS_DEBUG:         return "MIPS_DEBUG";
3869     case SHT_MIPS_REGINFO:       return "MIPS_REGINFO";
3870     case SHT_MIPS_PACKAGE:       return "MIPS_PACKAGE";
3871     case SHT_MIPS_PACKSYM:       return "MIPS_PACKSYM";
3872     case SHT_MIPS_RELD:          return "MIPS_RELD";
3873     case SHT_MIPS_IFACE:         return "MIPS_IFACE";
3874     case SHT_MIPS_CONTENT:       return "MIPS_CONTENT";
3875     case SHT_MIPS_OPTIONS:       return "MIPS_OPTIONS";
3876     case SHT_MIPS_SHDR:          return "MIPS_SHDR";
3877     case SHT_MIPS_FDESC:         return "MIPS_FDESC";
3878     case SHT_MIPS_EXTSYM:        return "MIPS_EXTSYM";
3879     case SHT_MIPS_DENSE:         return "MIPS_DENSE";
3880     case SHT_MIPS_PDESC:         return "MIPS_PDESC";
3881     case SHT_MIPS_LOCSYM:        return "MIPS_LOCSYM";
3882     case SHT_MIPS_AUXSYM:        return "MIPS_AUXSYM";
3883     case SHT_MIPS_OPTSYM:        return "MIPS_OPTSYM";
3884     case SHT_MIPS_LOCSTR:        return "MIPS_LOCSTR";
3885     case SHT_MIPS_LINE:          return "MIPS_LINE";
3886     case SHT_MIPS_RFDESC:        return "MIPS_RFDESC";
3887     case SHT_MIPS_DELTASYM:      return "MIPS_DELTASYM";
3888     case SHT_MIPS_DELTAINST:     return "MIPS_DELTAINST";
3889     case SHT_MIPS_DELTACLASS:    return "MIPS_DELTACLASS";
3890     case SHT_MIPS_DWARF:         return "MIPS_DWARF";
3891     case SHT_MIPS_DELTADECL:     return "MIPS_DELTADECL";
3892     case SHT_MIPS_SYMBOL_LIB:    return "MIPS_SYMBOL_LIB";
3893     case SHT_MIPS_EVENTS:        return "MIPS_EVENTS";
3894     case SHT_MIPS_TRANSLATE:     return "MIPS_TRANSLATE";
3895     case SHT_MIPS_PIXIE:         return "MIPS_PIXIE";
3896     case SHT_MIPS_XLATE:         return "MIPS_XLATE";
3897     case SHT_MIPS_XLATE_DEBUG:   return "MIPS_XLATE_DEBUG";
3898     case SHT_MIPS_WHIRL:         return "MIPS_WHIRL";
3899     case SHT_MIPS_EH_REGION:     return "MIPS_EH_REGION";
3900     case SHT_MIPS_XLATE_OLD:     return "MIPS_XLATE_OLD";
3901     case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
3902     case SHT_MIPS_ABIFLAGS:      return "MIPS_ABIFLAGS";
3903     default:
3904       break;
3905     }
3906   return NULL;
3907 }
3908
3909 static const char *
3910 get_parisc_section_type_name (unsigned int sh_type)
3911 {
3912   switch (sh_type)
3913     {
3914     case SHT_PARISC_EXT:        return "PARISC_EXT";
3915     case SHT_PARISC_UNWIND:     return "PARISC_UNWIND";
3916     case SHT_PARISC_DOC:        return "PARISC_DOC";
3917     case SHT_PARISC_ANNOT:      return "PARISC_ANNOT";
3918     case SHT_PARISC_SYMEXTN:    return "PARISC_SYMEXTN";
3919     case SHT_PARISC_STUBS:      return "PARISC_STUBS";
3920     case SHT_PARISC_DLKM:       return "PARISC_DLKM";
3921     default:
3922       break;
3923     }
3924   return NULL;
3925 }
3926
3927 static const char *
3928 get_ia64_section_type_name (unsigned int sh_type)
3929 {
3930   /* If the top 8 bits are 0x78 the next 8 are the os/abi ID.  */
3931   if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
3932     return get_osabi_name ((sh_type & 0x00FF0000) >> 16);
3933
3934   switch (sh_type)
3935     {
3936     case SHT_IA_64_EXT:                return "IA_64_EXT";
3937     case SHT_IA_64_UNWIND:             return "IA_64_UNWIND";
3938     case SHT_IA_64_PRIORITY_INIT:      return "IA_64_PRIORITY_INIT";
3939     case SHT_IA_64_VMS_TRACE:          return "VMS_TRACE";
3940     case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
3941     case SHT_IA_64_VMS_DEBUG:          return "VMS_DEBUG";
3942     case SHT_IA_64_VMS_DEBUG_STR:      return "VMS_DEBUG_STR";
3943     case SHT_IA_64_VMS_LINKAGES:       return "VMS_LINKAGES";
3944     case SHT_IA_64_VMS_SYMBOL_VECTOR:  return "VMS_SYMBOL_VECTOR";
3945     case SHT_IA_64_VMS_FIXUP:          return "VMS_FIXUP";
3946     default:
3947       break;
3948     }
3949   return NULL;
3950 }
3951
3952 static const char *
3953 get_x86_64_section_type_name (unsigned int sh_type)
3954 {
3955   switch (sh_type)
3956     {
3957     case SHT_X86_64_UNWIND:     return "X86_64_UNWIND";
3958     default:
3959       break;
3960     }
3961   return NULL;
3962 }
3963
3964 static const char *
3965 get_aarch64_section_type_name (unsigned int sh_type)
3966 {
3967   switch (sh_type)
3968     {
3969     case SHT_AARCH64_ATTRIBUTES:
3970       return "AARCH64_ATTRIBUTES";
3971     default:
3972       break;
3973     }
3974   return NULL;
3975 }
3976
3977 static const char *
3978 get_arm_section_type_name (unsigned int sh_type)
3979 {
3980   switch (sh_type)
3981     {
3982     case SHT_ARM_EXIDX:           return "ARM_EXIDX";
3983     case SHT_ARM_PREEMPTMAP:      return "ARM_PREEMPTMAP";
3984     case SHT_ARM_ATTRIBUTES:      return "ARM_ATTRIBUTES";
3985     case SHT_ARM_DEBUGOVERLAY:    return "ARM_DEBUGOVERLAY";
3986     case SHT_ARM_OVERLAYSECTION:  return "ARM_OVERLAYSECTION";
3987     default:
3988       break;
3989     }
3990   return NULL;
3991 }
3992
3993 static const char *
3994 get_tic6x_section_type_name (unsigned int sh_type)
3995 {
3996   switch (sh_type)
3997     {
3998     case SHT_C6000_UNWIND:
3999       return "C6000_UNWIND";
4000     case SHT_C6000_PREEMPTMAP:
4001       return "C6000_PREEMPTMAP";
4002     case SHT_C6000_ATTRIBUTES:
4003       return "C6000_ATTRIBUTES";
4004     case SHT_TI_ICODE:
4005       return "TI_ICODE";
4006     case SHT_TI_XREF:
4007       return "TI_XREF";
4008     case SHT_TI_HANDLER:
4009       return "TI_HANDLER";
4010     case SHT_TI_INITINFO:
4011       return "TI_INITINFO";
4012     case SHT_TI_PHATTRS:
4013       return "TI_PHATTRS";
4014     default:
4015       break;
4016     }
4017   return NULL;
4018 }
4019
4020 static const char *
4021 get_msp430x_section_type_name (unsigned int sh_type)
4022 {
4023   switch (sh_type)
4024     {
4025     case SHT_MSP430_SEC_FLAGS:   return "MSP430_SEC_FLAGS";
4026     case SHT_MSP430_SYM_ALIASES: return "MSP430_SYM_ALIASES";
4027     case SHT_MSP430_ATTRIBUTES:  return "MSP430_ATTRIBUTES";
4028     default: return NULL;
4029     }
4030 }
4031
4032 static const char *
4033 get_v850_section_type_name (unsigned int sh_type)
4034 {
4035   switch (sh_type)
4036     {
4037     case SHT_V850_SCOMMON: return "V850 Small Common";
4038     case SHT_V850_TCOMMON: return "V850 Tiny Common";
4039     case SHT_V850_ZCOMMON: return "V850 Zero Common";
4040     case SHT_RENESAS_IOP:  return "RENESAS IOP";
4041     case SHT_RENESAS_INFO: return "RENESAS INFO";
4042     default: return NULL;
4043     }
4044 }
4045
4046 static const char *
4047 get_section_type_name (unsigned int sh_type)
4048 {
4049   static char buff[32];
4050   const char * result;
4051
4052   switch (sh_type)
4053     {
4054     case SHT_NULL:              return "NULL";
4055     case SHT_PROGBITS:          return "PROGBITS";
4056     case SHT_SYMTAB:            return "SYMTAB";
4057     case SHT_STRTAB:            return "STRTAB";
4058     case SHT_RELA:              return "RELA";
4059     case SHT_HASH:              return "HASH";
4060     case SHT_DYNAMIC:           return "DYNAMIC";
4061     case SHT_NOTE:              return "NOTE";
4062     case SHT_NOBITS:            return "NOBITS";
4063     case SHT_REL:               return "REL";
4064     case SHT_SHLIB:             return "SHLIB";
4065     case SHT_DYNSYM:            return "DYNSYM";
4066     case SHT_INIT_ARRAY:        return "INIT_ARRAY";
4067     case SHT_FINI_ARRAY:        return "FINI_ARRAY";
4068     case SHT_PREINIT_ARRAY:     return "PREINIT_ARRAY";
4069     case SHT_GNU_HASH:          return "GNU_HASH";
4070     case SHT_GROUP:             return "GROUP";
4071     case SHT_SYMTAB_SHNDX:      return "SYMTAB SECTION INDICIES";
4072     case SHT_GNU_verdef:        return "VERDEF";
4073     case SHT_GNU_verneed:       return "VERNEED";
4074     case SHT_GNU_versym:        return "VERSYM";
4075     case 0x6ffffff0:            return "VERSYM";
4076     case 0x6ffffffc:            return "VERDEF";
4077     case 0x7ffffffd:            return "AUXILIARY";
4078     case 0x7fffffff:            return "FILTER";
4079     case SHT_GNU_LIBLIST:       return "GNU_LIBLIST";
4080
4081     default:
4082       if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
4083         {
4084           switch (elf_header.e_machine)
4085             {
4086             case EM_MIPS:
4087             case EM_MIPS_RS3_LE:
4088               result = get_mips_section_type_name (sh_type);
4089               break;
4090             case EM_PARISC:
4091               result = get_parisc_section_type_name (sh_type);
4092               break;
4093             case EM_IA_64:
4094               result = get_ia64_section_type_name (sh_type);
4095               break;
4096             case EM_X86_64:
4097             case EM_L1OM:
4098             case EM_K1OM:
4099               result = get_x86_64_section_type_name (sh_type);
4100               break;
4101             case EM_AARCH64:
4102               result = get_aarch64_section_type_name (sh_type);
4103               break;
4104             case EM_ARM:
4105               result = get_arm_section_type_name (sh_type);
4106               break;
4107             case EM_TI_C6000:
4108               result = get_tic6x_section_type_name (sh_type);
4109               break;
4110             case EM_MSP430:
4111               result = get_msp430x_section_type_name (sh_type);
4112               break;
4113             case EM_V800:
4114             case EM_V850:
4115             case EM_CYGNUS_V850:
4116               result = get_v850_section_type_name (sh_type);
4117               break;
4118             default:
4119               result = NULL;
4120               break;
4121             }
4122
4123           if (result != NULL)
4124             return result;
4125
4126           sprintf (buff, "LOPROC+%#x", sh_type - SHT_LOPROC);
4127         }
4128       else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
4129         {
4130           switch (elf_header.e_machine)
4131             {
4132             case EM_IA_64:
4133               result = get_ia64_section_type_name (sh_type);
4134               break;
4135             default:
4136               if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
4137                 result = get_solaris_section_type (sh_type);
4138               else
4139                 result = NULL;
4140               break;
4141             }
4142
4143           if (result != NULL)
4144             return result;
4145
4146           sprintf (buff, "LOOS+%#x", sh_type - SHT_LOOS);
4147         }
4148       else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
4149         {
4150           switch (elf_header.e_machine)
4151             {
4152             case EM_V800:
4153             case EM_V850:
4154             case EM_CYGNUS_V850:
4155               result = get_v850_section_type_name (sh_type);
4156               break;
4157             default:
4158               result = NULL;
4159               break;
4160             }
4161
4162           if (result != NULL)
4163             return result;
4164
4165           sprintf (buff, "LOUSER+%#x", sh_type - SHT_LOUSER);
4166         }
4167       else
4168         /* This message is probably going to be displayed in a 15
4169            character wide field, so put the hex value first.  */
4170         snprintf (buff, sizeof (buff), _("%08x: <unknown>"), sh_type);
4171
4172       return buff;
4173     }
4174 }
4175
4176 #define OPTION_DEBUG_DUMP       512
4177 #define OPTION_DYN_SYMS         513
4178 #define OPTION_DWARF_DEPTH      514
4179 #define OPTION_DWARF_START      515
4180 #define OPTION_DWARF_CHECK      516
4181
4182 static struct option options[] =
4183 {
4184   {"all",              no_argument, 0, 'a'},
4185   {"file-header",      no_argument, 0, 'h'},
4186   {"program-headers",  no_argument, 0, 'l'},
4187   {"headers",          no_argument, 0, 'e'},
4188   {"histogram",        no_argument, 0, 'I'},
4189   {"segments",         no_argument, 0, 'l'},
4190   {"sections",         no_argument, 0, 'S'},
4191   {"section-headers",  no_argument, 0, 'S'},
4192   {"section-groups",   no_argument, 0, 'g'},
4193   {"section-details",  no_argument, 0, 't'},
4194   {"full-section-name",no_argument, 0, 'N'},
4195   {"symbols",          no_argument, 0, 's'},
4196   {"syms",             no_argument, 0, 's'},
4197   {"dyn-syms",         no_argument, 0, OPTION_DYN_SYMS},
4198   {"relocs",           no_argument, 0, 'r'},
4199   {"notes",            no_argument, 0, 'n'},
4200   {"dynamic",          no_argument, 0, 'd'},
4201   {"arch-specific",    no_argument, 0, 'A'},
4202   {"version-info",     no_argument, 0, 'V'},
4203   {"use-dynamic",      no_argument, 0, 'D'},
4204   {"unwind",           no_argument, 0, 'u'},
4205   {"archive-index",    no_argument, 0, 'c'},
4206   {"hex-dump",         required_argument, 0, 'x'},
4207   {"relocated-dump",   required_argument, 0, 'R'},
4208   {"string-dump",      required_argument, 0, 'p'},
4209   {"decompress",       no_argument, 0, 'z'},
4210 #ifdef SUPPORT_DISASSEMBLY
4211   {"instruction-dump", required_argument, 0, 'i'},
4212 #endif
4213   {"debug-dump",       optional_argument, 0, OPTION_DEBUG_DUMP},
4214
4215   {"dwarf-depth",      required_argument, 0, OPTION_DWARF_DEPTH},
4216   {"dwarf-start",      required_argument, 0, OPTION_DWARF_START},
4217   {"dwarf-check",      no_argument, 0, OPTION_DWARF_CHECK},
4218
4219   {"version",          no_argument, 0, 'v'},
4220   {"wide",             no_argument, 0, 'W'},
4221   {"help",             no_argument, 0, 'H'},
4222   {0,                  no_argument, 0, 0}
4223 };
4224
4225 static void
4226 usage (FILE * stream)
4227 {
4228   fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
4229   fprintf (stream, _(" Display information about the contents of ELF format files\n"));
4230   fprintf (stream, _(" Options are:\n\
4231   -a --all               Equivalent to: -h -l -S -s -r -d -V -A -I\n\
4232   -h --file-header       Display the ELF file header\n\
4233   -l --program-headers   Display the program headers\n\
4234      --segments          An alias for --program-headers\n\
4235   -S --section-headers   Display the sections' header\n\
4236      --sections          An alias for --section-headers\n\
4237   -g --section-groups    Display the section groups\n\
4238   -t --section-details   Display the section details\n\
4239   -e --headers           Equivalent to: -h -l -S\n\
4240   -s --syms              Display the symbol table\n\
4241      --symbols           An alias for --syms\n\
4242   --dyn-syms             Display the dynamic symbol table\n\
4243   -n --notes             Display the core notes (if present)\n\
4244   -r --relocs            Display the relocations (if present)\n\
4245   -u --unwind            Display the unwind info (if present)\n\
4246   -d --dynamic           Display the dynamic section (if present)\n\
4247   -V --version-info      Display the version sections (if present)\n\
4248   -A --arch-specific     Display architecture specific information (if any)\n\
4249   -c --archive-index     Display the symbol/file index in an archive\n\
4250   -D --use-dynamic       Use the dynamic section info when displaying symbols\n\
4251   -x --hex-dump=<number|name>\n\
4252                          Dump the contents of section <number|name> as bytes\n\
4253   -p --string-dump=<number|name>\n\
4254                          Dump the contents of section <number|name> as strings\n\
4255   -R --relocated-dump=<number|name>\n\
4256                          Dump the contents of section <number|name> as relocated bytes\n\
4257   -z --decompress        Decompress section before dumping it\n\
4258   -w[lLiaprmfFsoRt] or\n\
4259   --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
4260                =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
4261                =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
4262                =addr,=cu_index]\n\
4263                          Display the contents of DWARF2 debug sections\n"));
4264   fprintf (stream, _("\
4265   --dwarf-depth=N        Do not display DIEs at depth N or greater\n\
4266   --dwarf-start=N        Display DIEs starting with N, at the same depth\n\
4267                          or deeper\n"));
4268 #ifdef SUPPORT_DISASSEMBLY
4269   fprintf (stream, _("\
4270   -i --instruction-dump=<number|name>\n\
4271                          Disassemble the contents of section <number|name>\n"));
4272 #endif
4273   fprintf (stream, _("\
4274   -I --histogram         Display histogram of bucket list lengths\n\
4275   -W --wide              Allow output width to exceed 80 characters\n\
4276   @<file>                Read options from <file>\n\
4277   -H --help              Display this information\n\
4278   -v --version           Display the version number of readelf\n"));
4279
4280   if (REPORT_BUGS_TO[0] && stream == stdout)
4281     fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
4282
4283   exit (stream == stdout ? 0 : 1);
4284 }
4285
4286 /* Record the fact that the user wants the contents of section number
4287    SECTION to be displayed using the method(s) encoded as flags bits
4288    in TYPE.  Note, TYPE can be zero if we are creating the array for
4289    the first time.  */
4290
4291 static void
4292 request_dump_bynumber (unsigned int section, dump_type type)
4293 {
4294   if (section >= num_dump_sects)
4295     {
4296       dump_type * new_dump_sects;
4297
4298       new_dump_sects = (dump_type *) calloc (section + 1,
4299                                              sizeof (* dump_sects));
4300
4301       if (new_dump_sects == NULL)
4302         error (_("Out of memory allocating dump request table.\n"));
4303       else
4304         {
4305           if (dump_sects)
4306             {
4307               /* Copy current flag settings.  */
4308               memcpy (new_dump_sects, dump_sects, num_dump_sects * sizeof (* dump_sects));
4309
4310               free (dump_sects);
4311             }
4312
4313           dump_sects = new_dump_sects;
4314           num_dump_sects = section + 1;
4315         }
4316     }
4317
4318   if (dump_sects)
4319     dump_sects[section] |= type;
4320
4321   return;
4322 }
4323
4324 /* Request a dump by section name.  */
4325
4326 static void
4327 request_dump_byname (const char * section, dump_type type)
4328 {
4329   struct dump_list_entry * new_request;
4330
4331   new_request = (struct dump_list_entry *)
4332       malloc (sizeof (struct dump_list_entry));
4333   if (!new_request)
4334     error (_("Out of memory allocating dump request table.\n"));
4335
4336   new_request->name = strdup (section);
4337   if (!new_request->name)
4338     error (_("Out of memory allocating dump request table.\n"));
4339
4340   new_request->type = type;
4341
4342   new_request->next = dump_sects_byname;
4343   dump_sects_byname = new_request;
4344 }
4345
4346 static inline void
4347 request_dump (dump_type type)
4348 {
4349   int section;
4350   char * cp;
4351
4352   do_dump++;
4353   section = strtoul (optarg, & cp, 0);
4354
4355   if (! *cp && section >= 0)
4356     request_dump_bynumber (section, type);
4357   else
4358     request_dump_byname (optarg, type);
4359 }
4360
4361
4362 static void
4363 parse_args (int argc, char ** argv)
4364 {
4365   int c;
4366
4367   if (argc < 2)
4368     usage (stderr);
4369
4370   while ((c = getopt_long
4371           (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:z", options, NULL)) != EOF)
4372     {
4373       switch (c)
4374         {
4375         case 0:
4376           /* Long options.  */
4377           break;
4378         case 'H':
4379           usage (stdout);
4380           break;
4381
4382         case 'a':
4383           do_syms++;
4384           do_reloc++;
4385           do_unwind++;
4386           do_dynamic++;
4387           do_header++;
4388           do_sections++;
4389           do_section_groups++;
4390           do_segments++;
4391           do_version++;
4392           do_histogram++;
4393           do_arch++;
4394           do_notes++;
4395           break;
4396         case 'g':
4397           do_section_groups++;
4398           break;
4399         case 't':
4400         case 'N':
4401           do_sections++;
4402           do_section_details++;
4403           break;
4404         case 'e':
4405           do_header++;
4406           do_sections++;
4407           do_segments++;
4408           break;
4409         case 'A':
4410           do_arch++;
4411           break;
4412         case 'D':
4413           do_using_dynamic++;
4414           break;
4415         case 'r':
4416           do_reloc++;
4417           break;
4418         case 'u':
4419           do_unwind++;
4420           break;
4421         case 'h':
4422           do_header++;
4423           break;
4424         case 'l':
4425           do_segments++;
4426           break;
4427         case 's':
4428           do_syms++;
4429           break;
4430         case 'S':
4431           do_sections++;
4432           break;
4433         case 'd':
4434           do_dynamic++;
4435           break;
4436         case 'I':
4437           do_histogram++;
4438           break;
4439         case 'n':
4440           do_notes++;
4441           break;
4442         case 'c':
4443           do_archive_index++;
4444           break;
4445         case 'x':
4446           request_dump (HEX_DUMP);
4447           break;
4448         case 'p':
4449           request_dump (STRING_DUMP);
4450           break;
4451         case 'R':
4452           request_dump (RELOC_DUMP);
4453           break;
4454         case 'z':
4455           decompress_dumps++;
4456           break;
4457         case 'w':
4458           do_dump++;
4459           if (optarg == 0)
4460             {
4461               do_debugging = 1;
4462               dwarf_select_sections_all ();
4463             }
4464           else
4465             {
4466               do_debugging = 0;
4467               dwarf_select_sections_by_letters (optarg);
4468             }
4469           break;
4470         case OPTION_DEBUG_DUMP:
4471           do_dump++;
4472           if (optarg == 0)
4473             do_debugging = 1;
4474           else
4475             {
4476               do_debugging = 0;
4477               dwarf_select_sections_by_names (optarg);
4478             }
4479           break;
4480         case OPTION_DWARF_DEPTH:
4481           {
4482             char *cp;
4483
4484             dwarf_cutoff_level = strtoul (optarg, & cp, 0);
4485           }
4486           break;
4487         case OPTION_DWARF_START:
4488           {
4489             char *cp;
4490
4491             dwarf_start_die = strtoul (optarg, & cp, 0);
4492           }
4493           break;
4494         case OPTION_DWARF_CHECK:
4495           dwarf_check = 1;
4496           break;
4497         case OPTION_DYN_SYMS:
4498           do_dyn_syms++;
4499           break;
4500 #ifdef SUPPORT_DISASSEMBLY
4501         case 'i':
4502           request_dump (DISASS_DUMP);
4503           break;
4504 #endif
4505         case 'v':
4506           print_version (program_name);
4507           break;
4508         case 'V':
4509           do_version++;
4510           break;
4511         case 'W':
4512           do_wide++;
4513           break;
4514         default:
4515           /* xgettext:c-format */
4516           error (_("Invalid option '-%c'\n"), c);
4517           /* Fall through.  */
4518         case '?':
4519           usage (stderr);
4520         }
4521     }
4522
4523   if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
4524       && !do_segments && !do_header && !do_dump && !do_version
4525       && !do_histogram && !do_debugging && !do_arch && !do_notes
4526       && !do_section_groups && !do_archive_index
4527       && !do_dyn_syms)
4528     usage (stderr);
4529 }
4530
4531 static const char *
4532 get_elf_class (unsigned int elf_class)
4533 {
4534   static char buff[32];
4535
4536   switch (elf_class)
4537     {
4538     case ELFCLASSNONE: return _("none");
4539     case ELFCLASS32:   return "ELF32";
4540     case ELFCLASS64:   return "ELF64";
4541     default:
4542       snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
4543       return buff;
4544     }
4545 }
4546
4547 static const char *
4548 get_data_encoding (unsigned int encoding)
4549 {
4550   static char buff[32];
4551
4552   switch (encoding)
4553     {
4554     case ELFDATANONE: return _("none");
4555     case ELFDATA2LSB: return _("2's complement, little endian");
4556     case ELFDATA2MSB: return _("2's complement, big endian");
4557     default:
4558       snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
4559       return buff;
4560     }
4561 }
4562
4563 /* Decode the data held in 'elf_header'.  */
4564
4565 static int
4566 process_file_header (void)
4567 {
4568   if (   elf_header.e_ident[EI_MAG0] != ELFMAG0
4569       || elf_header.e_ident[EI_MAG1] != ELFMAG1
4570       || elf_header.e_ident[EI_MAG2] != ELFMAG2
4571       || elf_header.e_ident[EI_MAG3] != ELFMAG3)
4572     {
4573       error
4574         (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
4575       return 0;
4576     }
4577
4578   init_dwarf_regnames (elf_header.e_machine);
4579
4580   if (do_header)
4581     {
4582       int i;
4583
4584       printf (_("ELF Header:\n"));
4585       printf (_("  Magic:   "));
4586       for (i = 0; i < EI_NIDENT; i++)
4587         printf ("%2.2x ", elf_header.e_ident[i]);
4588       printf ("\n");
4589       printf (_("  Class:                             %s\n"),
4590               get_elf_class (elf_header.e_ident[EI_CLASS]));
4591       printf (_("  Data:                              %s\n"),
4592               get_data_encoding (elf_header.e_ident[EI_DATA]));
4593       printf (_("  Version:                           %d %s\n"),
4594               elf_header.e_ident[EI_VERSION],
4595               (elf_header.e_ident[EI_VERSION] == EV_CURRENT
4596                ? "(current)"
4597                : (elf_header.e_ident[EI_VERSION] != EV_NONE
4598                   ? _("<unknown: %lx>")
4599                   : "")));
4600       printf (_("  OS/ABI:                            %s\n"),
4601               get_osabi_name (elf_header.e_ident[EI_OSABI]));
4602       printf (_("  ABI Version:                       %d\n"),
4603               elf_header.e_ident[EI_ABIVERSION]);
4604       printf (_("  Type:                              %s\n"),
4605               get_file_type (elf_header.e_type));
4606       printf (_("  Machine:                           %s\n"),
4607               get_machine_name (elf_header.e_machine));
4608       printf (_("  Version:                           0x%lx\n"),
4609               (unsigned long) elf_header.e_version);
4610
4611       printf (_("  Entry point address:               "));
4612       print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4613       printf (_("\n  Start of program headers:          "));
4614       print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4615       printf (_(" (bytes into file)\n  Start of section headers:          "));
4616       print_vma ((bfd_vma) elf_header.e_shoff, DEC);
4617       printf (_(" (bytes into file)\n"));
4618
4619       printf (_("  Flags:                             0x%lx%s\n"),
4620               (unsigned long) elf_header.e_flags,
4621               get_machine_flags (elf_header.e_flags, elf_header.e_machine));
4622       printf (_("  Size of this header:               %ld (bytes)\n"),
4623               (long) elf_header.e_ehsize);
4624       printf (_("  Size of program headers:           %ld (bytes)\n"),
4625               (long) elf_header.e_phentsize);
4626       printf (_("  Number of program headers:         %ld"),
4627               (long) elf_header.e_phnum);
4628       if (section_headers != NULL
4629           && elf_header.e_phnum == PN_XNUM
4630           && section_headers[0].sh_info != 0)
4631         printf (" (%ld)", (long) section_headers[0].sh_info);
4632       putc ('\n', stdout);
4633       printf (_("  Size of section headers:           %ld (bytes)\n"),
4634               (long) elf_header.e_shentsize);
4635       printf (_("  Number of section headers:         %ld"),
4636               (long) elf_header.e_shnum);
4637       if (section_headers != NULL && elf_header.e_shnum == SHN_UNDEF)
4638         printf (" (%ld)", (long) section_headers[0].sh_size);
4639       putc ('\n', stdout);
4640       printf (_("  Section header string table index: %ld"),
4641               (long) elf_header.e_shstrndx);
4642       if (section_headers != NULL
4643           && elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
4644         printf (" (%u)", section_headers[0].sh_link);
4645       else if (elf_header.e_shstrndx != SHN_UNDEF
4646                && elf_header.e_shstrndx >= elf_header.e_shnum)
4647         printf (_(" <corrupt: out of range>"));
4648       putc ('\n', stdout);
4649     }
4650
4651   if (section_headers != NULL)
4652     {
4653       if (elf_header.e_phnum == PN_XNUM
4654           && section_headers[0].sh_info != 0)
4655         elf_header.e_phnum = section_headers[0].sh_info;
4656       if (elf_header.e_shnum == SHN_UNDEF)
4657         elf_header.e_shnum = section_headers[0].sh_size;
4658       if (elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
4659         elf_header.e_shstrndx = section_headers[0].sh_link;
4660       else if (elf_header.e_shstrndx >= elf_header.e_shnum)
4661         elf_header.e_shstrndx = SHN_UNDEF;
4662       free (section_headers);
4663       section_headers = NULL;
4664     }
4665
4666   return 1;
4667 }
4668
4669 static bfd_boolean
4670 get_32bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
4671 {
4672   Elf32_External_Phdr * phdrs;
4673   Elf32_External_Phdr * external;
4674   Elf_Internal_Phdr *   internal;
4675   unsigned int i;
4676   unsigned int size = elf_header.e_phentsize;
4677   unsigned int num  = elf_header.e_phnum;
4678
4679   /* PR binutils/17531: Cope with unexpected section header sizes.  */
4680   if (size == 0 || num == 0)
4681     return FALSE;
4682   if (size < sizeof * phdrs)
4683     {
4684       error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4685       return FALSE;
4686     }
4687   if (size > sizeof * phdrs)
4688     warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4689
4690   phdrs = (Elf32_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
4691                                             size, num, _("program headers"));
4692   if (phdrs == NULL)
4693     return FALSE;
4694
4695   for (i = 0, internal = pheaders, external = phdrs;
4696        i < elf_header.e_phnum;
4697        i++, internal++, external++)
4698     {
4699       internal->p_type   = BYTE_GET (external->p_type);
4700       internal->p_offset = BYTE_GET (external->p_offset);
4701       internal->p_vaddr  = BYTE_GET (external->p_vaddr);
4702       internal->p_paddr  = BYTE_GET (external->p_paddr);
4703       internal->p_filesz = BYTE_GET (external->p_filesz);
4704       internal->p_memsz  = BYTE_GET (external->p_memsz);
4705       internal->p_flags  = BYTE_GET (external->p_flags);
4706       internal->p_align  = BYTE_GET (external->p_align);
4707     }
4708
4709   free (phdrs);
4710   return TRUE;
4711 }
4712
4713 static bfd_boolean
4714 get_64bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
4715 {
4716   Elf64_External_Phdr * phdrs;
4717   Elf64_External_Phdr * external;
4718   Elf_Internal_Phdr *   internal;
4719   unsigned int i;
4720   unsigned int size = elf_header.e_phentsize;
4721   unsigned int num  = elf_header.e_phnum;
4722
4723   /* PR binutils/17531: Cope with unexpected section header sizes.  */
4724   if (size == 0 || num == 0)
4725     return FALSE;
4726   if (size < sizeof * phdrs)
4727     {
4728       error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4729       return FALSE;
4730     }
4731   if (size > sizeof * phdrs)
4732     warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4733
4734   phdrs = (Elf64_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
4735                                             size, num, _("program headers"));
4736   if (!phdrs)
4737     return FALSE;
4738
4739   for (i = 0, internal = pheaders, external = phdrs;
4740        i < elf_header.e_phnum;
4741        i++, internal++, external++)
4742     {
4743       internal->p_type   = BYTE_GET (external->p_type);
4744       internal->p_flags  = BYTE_GET (external->p_flags);
4745       internal->p_offset = BYTE_GET (external->p_offset);
4746       internal->p_vaddr  = BYTE_GET (external->p_vaddr);
4747       internal->p_paddr  = BYTE_GET (external->p_paddr);
4748       internal->p_filesz = BYTE_GET (external->p_filesz);
4749       internal->p_memsz  = BYTE_GET (external->p_memsz);
4750       internal->p_align  = BYTE_GET (external->p_align);
4751     }
4752
4753   free (phdrs);
4754   return TRUE;
4755 }
4756
4757 /* Returns 1 if the program headers were read into `program_headers'.  */
4758
4759 static int
4760 get_program_headers (FILE * file)
4761 {
4762   Elf_Internal_Phdr * phdrs;
4763
4764   /* Check cache of prior read.  */
4765   if (program_headers != NULL)
4766     return 1;
4767
4768   phdrs = (Elf_Internal_Phdr *) cmalloc (elf_header.e_phnum,
4769                                          sizeof (Elf_Internal_Phdr));
4770
4771   if (phdrs == NULL)
4772     {
4773       error (_("Out of memory reading %u program headers\n"),
4774              elf_header.e_phnum);
4775       return 0;
4776     }
4777
4778   if (is_32bit_elf
4779       ? get_32bit_program_headers (file, phdrs)
4780       : get_64bit_program_headers (file, phdrs))
4781     {
4782       program_headers = phdrs;
4783       return 1;
4784     }
4785
4786   free (phdrs);
4787   return 0;
4788 }
4789
4790 /* Returns 1 if the program headers were loaded.  */
4791
4792 static int
4793 process_program_headers (FILE * file)
4794 {
4795   Elf_Internal_Phdr * segment;
4796   unsigned int i;
4797   Elf_Internal_Phdr * previous_load = NULL;
4798
4799   if (elf_header.e_phnum == 0)
4800     {
4801       /* PR binutils/12467.  */
4802       if (elf_header.e_phoff != 0)
4803         warn (_("possibly corrupt ELF header - it has a non-zero program"
4804                 " header offset, but no program headers\n"));
4805       else if (do_segments)
4806         printf (_("\nThere are no program headers in this file.\n"));
4807       return 0;
4808     }
4809
4810   if (do_segments && !do_header)
4811     {
4812       printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
4813       printf (_("Entry point "));
4814       print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4815       printf (_("\nThere are %d program headers, starting at offset "),
4816               elf_header.e_phnum);
4817       print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4818       printf ("\n");
4819     }
4820
4821   if (! get_program_headers (file))
4822       return 0;
4823
4824   if (do_segments)
4825     {
4826       if (elf_header.e_phnum > 1)
4827         printf (_("\nProgram Headers:\n"));
4828       else
4829         printf (_("\nProgram Headers:\n"));
4830
4831       if (is_32bit_elf)
4832         printf
4833           (_("  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align\n"));
4834       else if (do_wide)
4835         printf
4836           (_("  Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align\n"));
4837       else
4838         {
4839           printf
4840             (_("  Type           Offset             VirtAddr           PhysAddr\n"));
4841           printf
4842             (_("                 FileSiz            MemSiz              Flags  Align\n"));
4843         }
4844     }
4845
4846   dynamic_addr = 0;
4847   dynamic_size = 0;
4848
4849   for (i = 0, segment = program_headers;
4850        i < elf_header.e_phnum;
4851        i++, segment++)
4852     {
4853       if (do_segments)
4854         {
4855           printf ("  %-14.14s ", get_segment_type (segment->p_type));
4856
4857           if (is_32bit_elf)
4858             {
4859               printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4860               printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
4861               printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
4862               printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
4863               printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
4864               printf ("%c%c%c ",
4865                       (segment->p_flags & PF_R ? 'R' : ' '),
4866                       (segment->p_flags & PF_W ? 'W' : ' '),
4867                       (segment->p_flags & PF_X ? 'E' : ' '));
4868               printf ("%#lx", (unsigned long) segment->p_align);
4869             }
4870           else if (do_wide)
4871             {
4872               if ((unsigned long) segment->p_offset == segment->p_offset)
4873                 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4874               else
4875                 {
4876                   print_vma (segment->p_offset, FULL_HEX);
4877                   putchar (' ');
4878                 }
4879
4880               print_vma (segment->p_vaddr, FULL_HEX);
4881               putchar (' ');
4882               print_vma (segment->p_paddr, FULL_HEX);
4883               putchar (' ');
4884
4885               if ((unsigned long) segment->p_filesz == segment->p_filesz)
4886                 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
4887               else
4888                 {
4889                   print_vma (segment->p_filesz, FULL_HEX);
4890                   putchar (' ');
4891                 }
4892
4893               if ((unsigned long) segment->p_memsz == segment->p_memsz)
4894                 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
4895               else
4896                 {
4897                   print_vma (segment->p_memsz, FULL_HEX);
4898                 }
4899
4900               printf (" %c%c%c ",
4901                       (segment->p_flags & PF_R ? 'R' : ' '),
4902                       (segment->p_flags & PF_W ? 'W' : ' '),
4903                       (segment->p_flags & PF_X ? 'E' : ' '));
4904
4905               if ((unsigned long) segment->p_align == segment->p_align)
4906                 printf ("%#lx", (unsigned long) segment->p_align);
4907               else
4908                 {
4909                   print_vma (segment->p_align, PREFIX_HEX);
4910                 }
4911             }
4912           else
4913             {
4914               print_vma (segment->p_offset, FULL_HEX);
4915               putchar (' ');
4916               print_vma (segment->p_vaddr, FULL_HEX);
4917               putchar (' ');
4918               print_vma (segment->p_paddr, FULL_HEX);
4919               printf ("\n                 ");
4920               print_vma (segment->p_filesz, FULL_HEX);
4921               putchar (' ');
4922               print_vma (segment->p_memsz, FULL_HEX);
4923               printf ("  %c%c%c    ",
4924                       (segment->p_flags & PF_R ? 'R' : ' '),
4925                       (segment->p_flags & PF_W ? 'W' : ' '),
4926                       (segment->p_flags & PF_X ? 'E' : ' '));
4927               print_vma (segment->p_align, PREFIX_HEX);
4928             }
4929
4930           putc ('\n', stdout);
4931         }
4932
4933       switch (segment->p_type)
4934         {
4935         case PT_LOAD:
4936 #if 0 /* Do not warn about out of order PT_LOAD segments.  Although officially
4937          required by the ELF standard, several programs, including the Linux
4938          kernel, make use of non-ordered segments.  */
4939           if (previous_load
4940               && previous_load->p_vaddr > segment->p_vaddr)
4941             error (_("LOAD segments must be sorted in order of increasing VirtAddr\n"));
4942 #endif
4943           if (segment->p_memsz < segment->p_filesz)
4944             error (_("the segment's file size is larger than its memory size\n"));
4945           previous_load = segment;
4946           break;
4947
4948         case PT_PHDR:
4949           /* PR 20815 - Verify that the program header is loaded into memory.  */
4950           if (i > 0 && previous_load != NULL)
4951             error (_("the PHDR segment must occur before any LOAD segment\n"));
4952           if (elf_header.e_machine != EM_PARISC)
4953             {
4954               unsigned int j;
4955
4956               for (j = 1; j < elf_header.e_phnum; j++)
4957                 if (program_headers[j].p_vaddr <= segment->p_vaddr
4958                     && (program_headers[j].p_vaddr + program_headers[j].p_memsz)
4959                     >= (segment->p_vaddr + segment->p_filesz))
4960                   break;
4961               if (j == elf_header.e_phnum)
4962                 error (_("the PHDR segment is not covered by a LOAD segment\n"));
4963             }
4964           break;
4965
4966         case PT_DYNAMIC:
4967           if (dynamic_addr)
4968             error (_("more than one dynamic segment\n"));
4969
4970           /* By default, assume that the .dynamic section is the first
4971              section in the DYNAMIC segment.  */
4972           dynamic_addr = segment->p_offset;
4973           dynamic_size = segment->p_filesz;
4974           /* PR binutils/17512: Avoid corrupt dynamic section info in the segment.  */
4975           if (dynamic_addr + dynamic_size >= current_file_size)
4976             {
4977               error (_("the dynamic segment offset + size exceeds the size of the file\n"));
4978               dynamic_addr = dynamic_size = 0;
4979             }
4980
4981           /* Try to locate the .dynamic section. If there is
4982              a section header table, we can easily locate it.  */
4983           if (section_headers != NULL)
4984             {
4985               Elf_Internal_Shdr * sec;
4986
4987               sec = find_section (".dynamic");
4988               if (sec == NULL || sec->sh_size == 0)
4989                 {
4990                   /* A corresponding .dynamic section is expected, but on
4991                      IA-64/OpenVMS it is OK for it to be missing.  */
4992                   if (!is_ia64_vms ())
4993                     error (_("no .dynamic section in the dynamic segment\n"));
4994                   break;
4995                 }
4996
4997               if (sec->sh_type == SHT_NOBITS)
4998                 {
4999                   dynamic_size = 0;
5000                   break;
5001                 }
5002
5003               dynamic_addr = sec->sh_offset;
5004               dynamic_size = sec->sh_size;
5005
5006               if (dynamic_addr < segment->p_offset
5007                   || dynamic_addr > segment->p_offset + segment->p_filesz)
5008                 warn (_("the .dynamic section is not contained"
5009                         " within the dynamic segment\n"));
5010               else if (dynamic_addr > segment->p_offset)
5011                 warn (_("the .dynamic section is not the first section"
5012                         " in the dynamic segment.\n"));
5013             }
5014           break;
5015
5016         case PT_INTERP:
5017           if (fseek (file, archive_file_offset + (long) segment->p_offset,
5018                      SEEK_SET))
5019             error (_("Unable to find program interpreter name\n"));
5020           else
5021             {
5022               char fmt [32];
5023               int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX - 1);
5024
5025               if (ret >= (int) sizeof (fmt) || ret < 0)
5026                 error (_("Internal error: failed to create format string to display program interpreter\n"));
5027
5028               program_interpreter[0] = 0;
5029               if (fscanf (file, fmt, program_interpreter) <= 0)
5030                 error (_("Unable to read program interpreter name\n"));
5031
5032               if (do_segments)
5033                 printf (_("      [Requesting program interpreter: %s]\n"),
5034                     program_interpreter);
5035             }
5036           break;
5037         }
5038     }
5039
5040   if (do_segments && section_headers != NULL && string_table != NULL)
5041     {
5042       printf (_("\n Section to Segment mapping:\n"));
5043       printf (_("  Segment Sections...\n"));
5044
5045       for (i = 0; i < elf_header.e_phnum; i++)
5046         {
5047           unsigned int j;
5048           Elf_Internal_Shdr * section;
5049
5050           segment = program_headers + i;
5051           section = section_headers + 1;
5052
5053           printf ("   %2.2d     ", i);
5054
5055           for (j = 1; j < elf_header.e_shnum; j++, section++)
5056             {
5057               if (!ELF_TBSS_SPECIAL (section, segment)
5058                   && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
5059                 printf ("%s ", printable_section_name (section));
5060             }
5061
5062           putc ('\n',stdout);
5063         }
5064     }
5065
5066   return 1;
5067 }
5068
5069
5070 /* Find the file offset corresponding to VMA by using the program headers.  */
5071
5072 static long
5073 offset_from_vma (FILE * file, bfd_vma vma, bfd_size_type size)
5074 {
5075   Elf_Internal_Phdr * seg;
5076
5077   if (! get_program_headers (file))
5078     {
5079       warn (_("Cannot interpret virtual addresses without program headers.\n"));
5080       return (long) vma;
5081     }
5082
5083   for (seg = program_headers;
5084        seg < program_headers + elf_header.e_phnum;
5085        ++seg)
5086     {
5087       if (seg->p_type != PT_LOAD)
5088         continue;
5089
5090       if (vma >= (seg->p_vaddr & -seg->p_align)
5091           && vma + size <= seg->p_vaddr + seg->p_filesz)
5092         return vma - seg->p_vaddr + seg->p_offset;
5093     }
5094
5095   warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
5096         (unsigned long) vma);
5097   return (long) vma;
5098 }
5099
5100
5101 /* Allocate memory and load the sections headers into the global pointer
5102    SECTION_HEADERS.  If PROBE is true, this is just a probe and we do not
5103    generate any error messages if the load fails.  */
5104
5105 static bfd_boolean
5106 get_32bit_section_headers (FILE * file, bfd_boolean probe)
5107 {
5108   Elf32_External_Shdr * shdrs;
5109   Elf_Internal_Shdr *   internal;
5110   unsigned int i;
5111   unsigned int size = elf_header.e_shentsize;
5112   unsigned int num = probe ? 1 : elf_header.e_shnum;
5113
5114   /* PR binutils/17531: Cope with unexpected section header sizes.  */
5115   if (size == 0 || num == 0)
5116     return FALSE;
5117   if (size < sizeof * shdrs)
5118     {
5119       if (! probe)
5120         error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5121       return FALSE;
5122     }
5123   if (!probe && size > sizeof * shdrs)
5124     warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
5125
5126   shdrs = (Elf32_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
5127                                             size, num,
5128                                             probe ? NULL : _("section headers"));
5129   if (shdrs == NULL)
5130     return FALSE;
5131
5132   if (section_headers != NULL)
5133     free (section_headers);
5134   section_headers = (Elf_Internal_Shdr *) cmalloc (num,
5135                                                    sizeof (Elf_Internal_Shdr));
5136   if (section_headers == NULL)
5137     {
5138       if (!probe)
5139         error (_("Out of memory reading %u section headers\n"), num);
5140       return FALSE;
5141     }
5142
5143   for (i = 0, internal = section_headers;
5144        i < num;
5145        i++, internal++)
5146     {
5147       internal->sh_name      = BYTE_GET (shdrs[i].sh_name);
5148       internal->sh_type      = BYTE_GET (shdrs[i].sh_type);
5149       internal->sh_flags     = BYTE_GET (shdrs[i].sh_flags);
5150       internal->sh_addr      = BYTE_GET (shdrs[i].sh_addr);
5151       internal->sh_offset    = BYTE_GET (shdrs[i].sh_offset);
5152       internal->sh_size      = BYTE_GET (shdrs[i].sh_size);
5153       internal->sh_link      = BYTE_GET (shdrs[i].sh_link);
5154       internal->sh_info      = BYTE_GET (shdrs[i].sh_info);
5155       internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5156       internal->sh_entsize   = BYTE_GET (shdrs[i].sh_entsize);
5157       if (!probe && internal->sh_link > num)
5158         warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5159       if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5160         warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
5161     }
5162
5163   free (shdrs);
5164   return TRUE;
5165 }
5166
5167 static bfd_boolean
5168 get_64bit_section_headers (FILE * file, bfd_boolean probe)
5169 {
5170   Elf64_External_Shdr * shdrs;
5171   Elf_Internal_Shdr *   internal;
5172   unsigned int i;
5173   unsigned int size = elf_header.e_shentsize;
5174   unsigned int num = probe ? 1 : elf_header.e_shnum;
5175
5176   /* PR binutils/17531: Cope with unexpected section header sizes.  */
5177   if (size == 0 || num == 0)
5178     return FALSE;
5179   if (size < sizeof * shdrs)
5180     {
5181       if (! probe)
5182         error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5183       return FALSE;
5184     }
5185   if (! probe && size > sizeof * shdrs)
5186     warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
5187
5188   shdrs = (Elf64_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
5189                                             size, num,
5190                                             probe ? NULL : _("section headers"));
5191   if (shdrs == NULL)
5192     return FALSE;
5193
5194   if (section_headers != NULL)
5195     free (section_headers);
5196   section_headers = (Elf_Internal_Shdr *) cmalloc (num,
5197                                                    sizeof (Elf_Internal_Shdr));
5198   if (section_headers == NULL)
5199     {
5200       if (! probe)
5201         error (_("Out of memory reading %u section headers\n"), num);
5202       return FALSE;
5203     }
5204
5205   for (i = 0, internal = section_headers;
5206        i < num;
5207        i++, internal++)
5208     {
5209       internal->sh_name      = BYTE_GET (shdrs[i].sh_name);
5210       internal->sh_type      = BYTE_GET (shdrs[i].sh_type);
5211       internal->sh_flags     = BYTE_GET (shdrs[i].sh_flags);
5212       internal->sh_addr      = BYTE_GET (shdrs[i].sh_addr);
5213       internal->sh_size      = BYTE_GET (shdrs[i].sh_size);
5214       internal->sh_entsize   = BYTE_GET (shdrs[i].sh_entsize);
5215       internal->sh_link      = BYTE_GET (shdrs[i].sh_link);
5216       internal->sh_info      = BYTE_GET (shdrs[i].sh_info);
5217       internal->sh_offset    = BYTE_GET (shdrs[i].sh_offset);
5218       internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5219       if (!probe && internal->sh_link > num)
5220         warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5221       if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5222         warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
5223     }
5224
5225   free (shdrs);
5226   return TRUE;
5227 }
5228
5229 static Elf_Internal_Sym *
5230 get_32bit_elf_symbols (FILE * file,
5231                        Elf_Internal_Shdr * section,
5232                        unsigned long * num_syms_return)
5233 {
5234   unsigned long number = 0;
5235   Elf32_External_Sym * esyms = NULL;
5236   Elf_External_Sym_Shndx * shndx = NULL;
5237   Elf_Internal_Sym * isyms = NULL;
5238   Elf_Internal_Sym * psym;
5239   unsigned int j;
5240
5241   if (section->sh_size == 0)
5242     {
5243       if (num_syms_return != NULL)
5244         * num_syms_return = 0;
5245       return NULL;
5246     }
5247
5248   /* Run some sanity checks first.  */
5249   if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5250     {
5251       error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5252              printable_section_name (section), (unsigned long) section->sh_entsize);
5253       goto exit_point;
5254     }
5255
5256   if (section->sh_size > current_file_size)
5257     {
5258       error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5259              printable_section_name (section), (unsigned long) section->sh_size);
5260       goto exit_point;
5261     }
5262
5263   number = section->sh_size / section->sh_entsize;
5264
5265   if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
5266     {
5267       error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5268              (unsigned long) section->sh_size,
5269              printable_section_name (section),
5270              (unsigned long) section->sh_entsize);
5271       goto exit_point;
5272     }
5273
5274   esyms = (Elf32_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
5275                                            section->sh_size, _("symbols"));
5276   if (esyms == NULL)
5277     goto exit_point;
5278
5279   {
5280     elf_section_list * entry;
5281
5282     shndx = NULL;
5283     for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5284       if (entry->hdr->sh_link == (unsigned long) (section - section_headers))
5285         {
5286           shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
5287                                                        entry->hdr->sh_offset,
5288                                                        1, entry->hdr->sh_size,
5289                                                        _("symbol table section indicies"));
5290           if (shndx == NULL)
5291             goto exit_point;
5292           /* PR17531: file: heap-buffer-overflow */
5293           else if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5294             {
5295               error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5296                      printable_section_name (entry->hdr),
5297                      (unsigned long) entry->hdr->sh_size,
5298                      (unsigned long) section->sh_size);
5299               goto exit_point;
5300             }
5301         }
5302   }
5303
5304   isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5305
5306   if (isyms == NULL)
5307     {
5308       error (_("Out of memory reading %lu symbols\n"),
5309              (unsigned long) number);
5310       goto exit_point;
5311     }
5312
5313   for (j = 0, psym = isyms; j < number; j++, psym++)
5314     {
5315       psym->st_name  = BYTE_GET (esyms[j].st_name);
5316       psym->st_value = BYTE_GET (esyms[j].st_value);
5317       psym->st_size  = BYTE_GET (esyms[j].st_size);
5318       psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5319       if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5320         psym->st_shndx
5321           = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5322       else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5323         psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5324       psym->st_info  = BYTE_GET (esyms[j].st_info);
5325       psym->st_other = BYTE_GET (esyms[j].st_other);
5326     }
5327
5328  exit_point:
5329   if (shndx != NULL)
5330     free (shndx);
5331   if (esyms != NULL)
5332     free (esyms);
5333
5334   if (num_syms_return != NULL)
5335     * num_syms_return = isyms == NULL ? 0 : number;
5336
5337   return isyms;
5338 }
5339
5340 static Elf_Internal_Sym *
5341 get_64bit_elf_symbols (FILE * file,
5342                        Elf_Internal_Shdr * section,
5343                        unsigned long * num_syms_return)
5344 {
5345   unsigned long number = 0;
5346   Elf64_External_Sym * esyms = NULL;
5347   Elf_External_Sym_Shndx * shndx = NULL;
5348   Elf_Internal_Sym * isyms = NULL;
5349   Elf_Internal_Sym * psym;
5350   unsigned int j;
5351
5352   if (section->sh_size == 0)
5353     {
5354       if (num_syms_return != NULL)
5355         * num_syms_return = 0;
5356       return NULL;
5357     }
5358
5359   /* Run some sanity checks first.  */
5360   if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5361     {
5362       error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5363              printable_section_name (section),
5364              (unsigned long) section->sh_entsize);
5365       goto exit_point;
5366     }
5367
5368   if (section->sh_size > current_file_size)
5369     {
5370       error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5371              printable_section_name (section),
5372              (unsigned long) section->sh_size);
5373       goto exit_point;
5374     }
5375
5376   number = section->sh_size / section->sh_entsize;
5377
5378   if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
5379     {
5380       error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5381              (unsigned long) section->sh_size,
5382              printable_section_name (section),
5383              (unsigned long) section->sh_entsize);
5384       goto exit_point;
5385     }
5386
5387   esyms = (Elf64_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
5388                                            section->sh_size, _("symbols"));
5389   if (!esyms)
5390     goto exit_point;
5391
5392   {
5393     elf_section_list * entry;
5394
5395     shndx = NULL;
5396     for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5397       if (entry->hdr->sh_link == (unsigned long) (section - section_headers))
5398         {
5399           shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
5400                                                        entry->hdr->sh_offset,
5401                                                        1, entry->hdr->sh_size,
5402                                                        _("symbol table section indicies"));
5403           if (shndx == NULL)
5404             goto exit_point;
5405           /* PR17531: file: heap-buffer-overflow */
5406           else if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5407             {
5408               error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5409                      printable_section_name (entry->hdr),
5410                      (unsigned long) entry->hdr->sh_size,
5411                      (unsigned long) section->sh_size);
5412               goto exit_point;
5413             }
5414         }
5415   }
5416
5417   isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5418
5419   if (isyms == NULL)
5420     {
5421       error (_("Out of memory reading %lu symbols\n"),
5422              (unsigned long) number);
5423       goto exit_point;
5424     }
5425
5426   for (j = 0, psym = isyms; j < number; j++, psym++)
5427     {
5428       psym->st_name  = BYTE_GET (esyms[j].st_name);
5429       psym->st_info  = BYTE_GET (esyms[j].st_info);
5430       psym->st_other = BYTE_GET (esyms[j].st_other);
5431       psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5432
5433       if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5434         psym->st_shndx
5435           = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5436       else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5437         psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5438
5439       psym->st_value = BYTE_GET (esyms[j].st_value);
5440       psym->st_size  = BYTE_GET (esyms[j].st_size);
5441     }
5442
5443  exit_point:
5444   if (shndx != NULL)
5445     free (shndx);
5446   if (esyms != NULL)
5447     free (esyms);
5448
5449   if (num_syms_return != NULL)
5450     * num_syms_return = isyms == NULL ? 0 : number;
5451
5452   return isyms;
5453 }
5454
5455 static const char *
5456 get_elf_section_flags (bfd_vma sh_flags)
5457 {
5458   static char buff[1024];
5459   char * p = buff;
5460   int field_size = is_32bit_elf ? 8 : 16;
5461   int sindex;
5462   int size = sizeof (buff) - (field_size + 4 + 1);
5463   bfd_vma os_flags = 0;
5464   bfd_vma proc_flags = 0;
5465   bfd_vma unknown_flags = 0;
5466   static const struct
5467     {
5468       const char * str;
5469       int len;
5470     }
5471   flags [] =
5472     {
5473       /*  0 */ { STRING_COMMA_LEN ("WRITE") },
5474       /*  1 */ { STRING_COMMA_LEN ("ALLOC") },
5475       /*  2 */ { STRING_COMMA_LEN ("EXEC") },
5476       /*  3 */ { STRING_COMMA_LEN ("MERGE") },
5477       /*  4 */ { STRING_COMMA_LEN ("STRINGS") },
5478       /*  5 */ { STRING_COMMA_LEN ("INFO LINK") },
5479       /*  6 */ { STRING_COMMA_LEN ("LINK ORDER") },
5480       /*  7 */ { STRING_COMMA_LEN ("OS NONCONF") },
5481       /*  8 */ { STRING_COMMA_LEN ("GROUP") },
5482       /*  9 */ { STRING_COMMA_LEN ("TLS") },
5483       /* IA-64 specific.  */
5484       /* 10 */ { STRING_COMMA_LEN ("SHORT") },
5485       /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
5486       /* IA-64 OpenVMS specific.  */
5487       /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
5488       /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
5489       /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
5490       /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
5491       /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
5492       /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
5493       /* Generic.  */
5494       /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
5495       /* SPARC specific.  */
5496       /* 19 */ { STRING_COMMA_LEN ("ORDERED") },
5497       /* 20 */ { STRING_COMMA_LEN ("COMPRESSED") },
5498       /* ARM specific.  */
5499       /* 21 */ { STRING_COMMA_LEN ("ENTRYSECT") },
5500       /* 22 */ { STRING_COMMA_LEN ("ARM_PURECODE") },
5501       /* 23 */ { STRING_COMMA_LEN ("COMDEF") }
5502     };
5503
5504   if (do_section_details)
5505     {
5506       sprintf (buff, "[%*.*lx]: ",
5507                field_size, field_size, (unsigned long) sh_flags);
5508       p += field_size + 4;
5509     }
5510
5511   while (sh_flags)
5512     {
5513       bfd_vma flag;
5514
5515       flag = sh_flags & - sh_flags;
5516       sh_flags &= ~ flag;
5517
5518       if (do_section_details)
5519         {
5520           switch (flag)
5521             {
5522             case SHF_WRITE:             sindex = 0; break;
5523             case SHF_ALLOC:             sindex = 1; break;
5524             case SHF_EXECINSTR:         sindex = 2; break;
5525             case SHF_MERGE:             sindex = 3; break;
5526             case SHF_STRINGS:           sindex = 4; break;
5527             case SHF_INFO_LINK:         sindex = 5; break;
5528             case SHF_LINK_ORDER:        sindex = 6; break;
5529             case SHF_OS_NONCONFORMING:  sindex = 7; break;
5530             case SHF_GROUP:             sindex = 8; break;
5531             case SHF_TLS:               sindex = 9; break;
5532             case SHF_EXCLUDE:           sindex = 18; break;
5533             case SHF_COMPRESSED:        sindex = 20; break;
5534
5535             default:
5536               sindex = -1;
5537               switch (elf_header.e_machine)
5538                 {
5539                 case EM_IA_64:
5540                   if (flag == SHF_IA_64_SHORT)
5541                     sindex = 10;
5542                   else if (flag == SHF_IA_64_NORECOV)
5543                     sindex = 11;
5544 #ifdef BFD64
5545                   else if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
5546                     switch (flag)
5547                       {
5548                       case SHF_IA_64_VMS_GLOBAL:      sindex = 12; break;
5549                       case SHF_IA_64_VMS_OVERLAID:    sindex = 13; break;
5550                       case SHF_IA_64_VMS_SHARED:      sindex = 14; break;
5551                       case SHF_IA_64_VMS_VECTOR:      sindex = 15; break;
5552                       case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
5553                       case SHF_IA_64_VMS_PROTECTED:   sindex = 17; break;
5554                       default:                        break;
5555                       }
5556 #endif
5557                   break;
5558
5559                 case EM_386:
5560                 case EM_IAMCU:
5561                 case EM_X86_64:
5562                 case EM_L1OM:
5563                 case EM_K1OM:
5564                 case EM_OLD_SPARCV9:
5565                 case EM_SPARC32PLUS:
5566                 case EM_SPARCV9:
5567                 case EM_SPARC:
5568                   if (flag == SHF_ORDERED)
5569                     sindex = 19;
5570                   break;
5571
5572                 case EM_ARM:
5573                   switch (flag)
5574                     {
5575                     case SHF_ENTRYSECT: sindex = 21; break;
5576                     case SHF_ARM_PURECODE: sindex = 22; break;
5577                     case SHF_COMDEF: sindex = 23; break;
5578                     default: break;
5579                     }
5580                   break;
5581
5582                 default:
5583                   break;
5584                 }
5585             }
5586
5587           if (sindex != -1)
5588             {
5589               if (p != buff + field_size + 4)
5590                 {
5591                   if (size < (10 + 2))
5592                     {
5593                       warn (_("Internal error: not enough buffer room for section flag info"));
5594                       return _("<unknown>");
5595                     }
5596                   size -= 2;
5597                   *p++ = ',';
5598                   *p++ = ' ';
5599                 }
5600
5601               size -= flags [sindex].len;
5602               p = stpcpy (p, flags [sindex].str);
5603             }
5604           else if (flag & SHF_MASKOS)
5605             os_flags |= flag;
5606           else if (flag & SHF_MASKPROC)
5607             proc_flags |= flag;
5608           else
5609             unknown_flags |= flag;
5610         }
5611       else
5612         {
5613           switch (flag)
5614             {
5615             case SHF_WRITE:             *p = 'W'; break;
5616             case SHF_ALLOC:             *p = 'A'; break;
5617             case SHF_EXECINSTR:         *p = 'X'; break;
5618             case SHF_MERGE:             *p = 'M'; break;
5619             case SHF_STRINGS:           *p = 'S'; break;
5620             case SHF_INFO_LINK:         *p = 'I'; break;
5621             case SHF_LINK_ORDER:        *p = 'L'; break;
5622             case SHF_OS_NONCONFORMING:  *p = 'O'; break;
5623             case SHF_GROUP:             *p = 'G'; break;
5624             case SHF_TLS:               *p = 'T'; break;
5625             case SHF_EXCLUDE:           *p = 'E'; break;
5626             case SHF_COMPRESSED:        *p = 'C'; break;
5627
5628             default:
5629               if ((elf_header.e_machine == EM_X86_64
5630                    || elf_header.e_machine == EM_L1OM
5631                    || elf_header.e_machine == EM_K1OM)
5632                   && flag == SHF_X86_64_LARGE)
5633                 *p = 'l';
5634               else if (elf_header.e_machine == EM_ARM
5635                        && flag == SHF_ARM_PURECODE)
5636                   *p = 'y';
5637               else if (flag & SHF_MASKOS)
5638                 {
5639                   *p = 'o';
5640                   sh_flags &= ~ SHF_MASKOS;
5641                 }
5642               else if (flag & SHF_MASKPROC)
5643                 {
5644                   *p = 'p';
5645                   sh_flags &= ~ SHF_MASKPROC;
5646                 }
5647               else
5648                 *p = 'x';
5649               break;
5650             }
5651           p++;
5652         }
5653     }
5654
5655   if (do_section_details)
5656     {
5657       if (os_flags)
5658         {
5659           size -= 5 + field_size;
5660           if (p != buff + field_size + 4)
5661             {
5662               if (size < (2 + 1))
5663                 {
5664                   warn (_("Internal error: not enough buffer room for section flag info"));
5665                   return _("<unknown>");
5666                 }
5667               size -= 2;
5668               *p++ = ',';
5669               *p++ = ' ';
5670             }
5671           sprintf (p, "OS (%*.*lx)", field_size, field_size,
5672                    (unsigned long) os_flags);
5673           p += 5 + field_size;
5674         }
5675       if (proc_flags)
5676         {
5677           size -= 7 + field_size;
5678           if (p != buff + field_size + 4)
5679             {
5680               if (size < (2 + 1))
5681                 {
5682                   warn (_("Internal error: not enough buffer room for section flag info"));
5683                   return _("<unknown>");
5684                 }
5685               size -= 2;
5686               *p++ = ',';
5687               *p++ = ' ';
5688             }
5689           sprintf (p, "PROC (%*.*lx)", field_size, field_size,
5690                    (unsigned long) proc_flags);
5691           p += 7 + field_size;
5692         }
5693       if (unknown_flags)
5694         {
5695           size -= 10 + field_size;
5696           if (p != buff + field_size + 4)
5697             {
5698               if (size < (2 + 1))
5699                 {
5700                   warn (_("Internal error: not enough buffer room for section flag info"));
5701                   return _("<unknown>");
5702                 }
5703               size -= 2;
5704               *p++ = ',';
5705               *p++ = ' ';
5706             }
5707           sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
5708                    (unsigned long) unknown_flags);
5709           p += 10 + field_size;
5710         }
5711     }
5712
5713   *p = '\0';
5714   return buff;
5715 }
5716
5717 static unsigned int
5718 get_compression_header (Elf_Internal_Chdr *chdr, unsigned char *buf, bfd_size_type size)
5719 {
5720   if (is_32bit_elf)
5721     {
5722       Elf32_External_Chdr *echdr = (Elf32_External_Chdr *) buf;
5723
5724       if (size < sizeof (* echdr))
5725         {
5726           error (_("Compressed section is too small even for a compression header\n"));
5727           return 0;
5728         }
5729
5730       chdr->ch_type = BYTE_GET (echdr->ch_type);
5731       chdr->ch_size = BYTE_GET (echdr->ch_size);
5732       chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5733       return sizeof (*echdr);
5734     }
5735   else
5736     {
5737       Elf64_External_Chdr *echdr = (Elf64_External_Chdr *) buf;
5738
5739       if (size < sizeof (* echdr))
5740         {
5741           error (_("Compressed section is too small even for a compression header\n"));
5742           return 0;
5743         }
5744
5745       chdr->ch_type = BYTE_GET (echdr->ch_type);
5746       chdr->ch_size = BYTE_GET (echdr->ch_size);
5747       chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5748       return sizeof (*echdr);
5749     }
5750 }
5751
5752 static int
5753 process_section_headers (FILE * file)
5754 {
5755   Elf_Internal_Shdr * section;
5756   unsigned int i;
5757
5758   section_headers = NULL;
5759
5760   if (elf_header.e_shnum == 0)
5761     {
5762       /* PR binutils/12467.  */
5763       if (elf_header.e_shoff != 0)
5764         warn (_("possibly corrupt ELF file header - it has a non-zero"
5765                 " section header offset, but no section headers\n"));
5766       else if (do_sections)
5767         printf (_("\nThere are no sections in this file.\n"));
5768
5769       return 1;
5770     }
5771
5772   if (do_sections && !do_header)
5773     printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
5774             elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
5775
5776   if (is_32bit_elf)
5777     {
5778       if (! get_32bit_section_headers (file, FALSE))
5779         return 0;
5780     }
5781   else if (! get_64bit_section_headers (file, FALSE))
5782     return 0;
5783
5784   /* Read in the string table, so that we have names to display.  */
5785   if (elf_header.e_shstrndx != SHN_UNDEF
5786        && elf_header.e_shstrndx < elf_header.e_shnum)
5787     {
5788       section = section_headers + elf_header.e_shstrndx;
5789
5790       if (section->sh_size != 0)
5791         {
5792           string_table = (char *) get_data (NULL, file, section->sh_offset,
5793                                             1, section->sh_size,
5794                                             _("string table"));
5795
5796           string_table_length = string_table != NULL ? section->sh_size : 0;
5797         }
5798     }
5799
5800   /* Scan the sections for the dynamic symbol table
5801      and dynamic string table and debug sections.  */
5802   dynamic_symbols = NULL;
5803   dynamic_strings = NULL;
5804   dynamic_syminfo = NULL;
5805   symtab_shndx_list = NULL;
5806
5807   eh_addr_size = is_32bit_elf ? 4 : 8;
5808   switch (elf_header.e_machine)
5809     {
5810     case EM_MIPS:
5811     case EM_MIPS_RS3_LE:
5812       /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
5813          FDE addresses.  However, the ABI also has a semi-official ILP32
5814          variant for which the normal FDE address size rules apply.
5815
5816          GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
5817          section, where XX is the size of longs in bits.  Unfortunately,
5818          earlier compilers provided no way of distinguishing ILP32 objects
5819          from LP64 objects, so if there's any doubt, we should assume that
5820          the official LP64 form is being used.  */
5821       if ((elf_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
5822           && find_section (".gcc_compiled_long32") == NULL)
5823         eh_addr_size = 8;
5824       break;
5825
5826     case EM_H8_300:
5827     case EM_H8_300H:
5828       switch (elf_header.e_flags & EF_H8_MACH)
5829         {
5830         case E_H8_MACH_H8300:
5831         case E_H8_MACH_H8300HN:
5832         case E_H8_MACH_H8300SN:
5833         case E_H8_MACH_H8300SXN:
5834           eh_addr_size = 2;
5835           break;
5836         case E_H8_MACH_H8300H:
5837         case E_H8_MACH_H8300S:
5838         case E_H8_MACH_H8300SX:
5839           eh_addr_size = 4;
5840           break;
5841         }
5842       break;
5843
5844     case EM_M32C_OLD:
5845     case EM_M32C:
5846       switch (elf_header.e_flags & EF_M32C_CPU_MASK)
5847         {
5848         case EF_M32C_CPU_M16C:
5849           eh_addr_size = 2;
5850           break;
5851         }
5852       break;
5853     }
5854
5855 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64)                \
5856   do                                                                    \
5857     {                                                                   \
5858       bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64;  \
5859       if (section->sh_entsize != expected_entsize)                      \
5860         {                                                               \
5861           char buf[40];                                                 \
5862           sprintf_vma (buf, section->sh_entsize);                       \
5863           /* Note: coded this way so that there is a single string for  \
5864              translation.  */ \
5865           error (_("Section %d has invalid sh_entsize of %s\n"), i, buf); \
5866           error (_("(Using the expected size of %u for the rest of this dump)\n"), \
5867                    (unsigned) expected_entsize);                        \
5868           section->sh_entsize = expected_entsize;                       \
5869         }                                                               \
5870     }                                                                   \
5871   while (0)
5872
5873 #define CHECK_ENTSIZE(section, i, type)                                 \
5874   CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type),         \
5875                         sizeof (Elf64_External_##type))
5876
5877   for (i = 0, section = section_headers;
5878        i < elf_header.e_shnum;
5879        i++, section++)
5880     {
5881       char * name = SECTION_NAME (section);
5882
5883       if (section->sh_type == SHT_DYNSYM)
5884         {
5885           if (dynamic_symbols != NULL)
5886             {
5887               error (_("File contains multiple dynamic symbol tables\n"));
5888               continue;
5889             }
5890
5891           CHECK_ENTSIZE (section, i, Sym);
5892           dynamic_symbols = GET_ELF_SYMBOLS (file, section, & num_dynamic_syms);
5893         }
5894       else if (section->sh_type == SHT_STRTAB
5895                && streq (name, ".dynstr"))
5896         {
5897           if (dynamic_strings != NULL)
5898             {
5899               error (_("File contains multiple dynamic string tables\n"));
5900               continue;
5901             }
5902
5903           dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
5904                                                1, section->sh_size,
5905                                                _("dynamic strings"));
5906           dynamic_strings_length = dynamic_strings == NULL ? 0 : section->sh_size;
5907         }
5908       else if (section->sh_type == SHT_SYMTAB_SHNDX)
5909         {
5910           elf_section_list * entry = xmalloc (sizeof * entry);
5911           entry->hdr = section;
5912           entry->next = symtab_shndx_list;
5913           symtab_shndx_list = entry;
5914         }
5915       else if (section->sh_type == SHT_SYMTAB)
5916         CHECK_ENTSIZE (section, i, Sym);
5917       else if (section->sh_type == SHT_GROUP)
5918         CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
5919       else if (section->sh_type == SHT_REL)
5920         CHECK_ENTSIZE (section, i, Rel);
5921       else if (section->sh_type == SHT_RELA)
5922         CHECK_ENTSIZE (section, i, Rela);
5923       else if ((do_debugging || do_debug_info || do_debug_abbrevs
5924                 || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
5925                 || do_debug_aranges || do_debug_frames || do_debug_macinfo
5926                 || do_debug_str || do_debug_loc || do_debug_ranges
5927                 || do_debug_addr || do_debug_cu_index)
5928                && (const_strneq (name, ".debug_")
5929                    || const_strneq (name, ".zdebug_")))
5930         {
5931           if (name[1] == 'z')
5932             name += sizeof (".zdebug_") - 1;
5933           else
5934             name += sizeof (".debug_") - 1;
5935
5936           if (do_debugging
5937               || (do_debug_info     && const_strneq (name, "info"))
5938               || (do_debug_info     && const_strneq (name, "types"))
5939               || (do_debug_abbrevs  && const_strneq (name, "abbrev"))
5940               || (do_debug_lines    && strcmp (name, "line") == 0)
5941               || (do_debug_lines    && const_strneq (name, "line."))
5942               || (do_debug_pubnames && const_strneq (name, "pubnames"))
5943               || (do_debug_pubtypes && const_strneq (name, "pubtypes"))
5944               || (do_debug_pubnames && const_strneq (name, "gnu_pubnames"))
5945               || (do_debug_pubtypes && const_strneq (name, "gnu_pubtypes"))
5946               || (do_debug_aranges  && const_strneq (name, "aranges"))
5947               || (do_debug_ranges   && const_strneq (name, "ranges"))
5948               || (do_debug_frames   && const_strneq (name, "frame"))
5949               || (do_debug_macinfo  && const_strneq (name, "macinfo"))
5950               || (do_debug_macinfo  && const_strneq (name, "macro"))
5951               || (do_debug_str      && const_strneq (name, "str"))
5952               || (do_debug_loc      && const_strneq (name, "loc"))
5953               || (do_debug_addr     && const_strneq (name, "addr"))
5954               || (do_debug_cu_index && const_strneq (name, "cu_index"))
5955               || (do_debug_cu_index && const_strneq (name, "tu_index"))
5956               )
5957             request_dump_bynumber (i, DEBUG_DUMP);
5958         }
5959       /* Linkonce section to be combined with .debug_info at link time.  */
5960       else if ((do_debugging || do_debug_info)
5961                && const_strneq (name, ".gnu.linkonce.wi."))
5962         request_dump_bynumber (i, DEBUG_DUMP);
5963       else if (do_debug_frames && streq (name, ".eh_frame"))
5964         request_dump_bynumber (i, DEBUG_DUMP);
5965       else if (do_gdb_index && streq (name, ".gdb_index"))
5966         request_dump_bynumber (i, DEBUG_DUMP);
5967       /* Trace sections for Itanium VMS.  */
5968       else if ((do_debugging || do_trace_info || do_trace_abbrevs
5969                 || do_trace_aranges)
5970                && const_strneq (name, ".trace_"))
5971         {
5972           name += sizeof (".trace_") - 1;
5973
5974           if (do_debugging
5975               || (do_trace_info     && streq (name, "info"))
5976               || (do_trace_abbrevs  && streq (name, "abbrev"))
5977               || (do_trace_aranges  && streq (name, "aranges"))
5978               )
5979             request_dump_bynumber (i, DEBUG_DUMP);
5980         }
5981     }
5982
5983   if (! do_sections)
5984     return 1;
5985
5986   if (elf_header.e_shnum > 1)
5987     printf (_("\nSection Headers:\n"));
5988   else
5989     printf (_("\nSection Header:\n"));
5990
5991   if (is_32bit_elf)
5992     {
5993       if (do_section_details)
5994         {
5995           printf (_("  [Nr] Name\n"));
5996           printf (_("       Type            Addr     Off    Size   ES   Lk Inf Al\n"));
5997         }
5998       else
5999         printf
6000           (_("  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al\n"));
6001     }
6002   else if (do_wide)
6003     {
6004       if (do_section_details)
6005         {
6006           printf (_("  [Nr] Name\n"));
6007           printf (_("       Type            Address          Off    Size   ES   Lk Inf Al\n"));
6008         }
6009       else
6010         printf
6011           (_("  [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al\n"));
6012     }
6013   else
6014     {
6015       if (do_section_details)
6016         {
6017           printf (_("  [Nr] Name\n"));
6018           printf (_("       Type              Address          Offset            Link\n"));
6019           printf (_("       Size              EntSize          Info              Align\n"));
6020         }
6021       else
6022         {
6023           printf (_("  [Nr] Name              Type             Address           Offset\n"));
6024           printf (_("       Size              EntSize          Flags  Link  Info  Align\n"));
6025         }
6026     }
6027
6028   if (do_section_details)
6029     printf (_("       Flags\n"));
6030
6031   for (i = 0, section = section_headers;
6032        i < elf_header.e_shnum;
6033        i++, section++)
6034     {
6035       /* Run some sanity checks on the section header.  */
6036
6037       /* Check the sh_link field.  */
6038       switch (section->sh_type)
6039         {
6040         case SHT_SYMTAB_SHNDX:
6041         case SHT_GROUP:
6042         case SHT_HASH:
6043         case SHT_GNU_HASH:
6044         case SHT_GNU_versym:
6045         case SHT_REL:
6046         case SHT_RELA:
6047           if (section->sh_link < 1
6048               || section->sh_link >= elf_header.e_shnum
6049               || (section_headers[section->sh_link].sh_type != SHT_SYMTAB
6050                   && section_headers[section->sh_link].sh_type != SHT_DYNSYM))
6051             warn (_("[%2u]: Link field (%u) should index a symtab section.\n"),
6052                   i, section->sh_link);
6053           break;
6054
6055         case SHT_DYNAMIC:
6056         case SHT_SYMTAB:
6057         case SHT_DYNSYM:
6058         case SHT_GNU_verneed:
6059         case SHT_GNU_verdef:
6060         case SHT_GNU_LIBLIST:
6061           if (section->sh_link < 1
6062               || section->sh_link >= elf_header.e_shnum
6063               || section_headers[section->sh_link].sh_type != SHT_STRTAB)
6064             warn (_("[%2u]: Link field (%u) should index a string section.\n"),
6065                   i, section->sh_link);
6066           break;
6067
6068         case SHT_INIT_ARRAY:
6069         case SHT_FINI_ARRAY:
6070         case SHT_PREINIT_ARRAY:
6071           if (section->sh_type < SHT_LOOS && section->sh_link != 0)
6072             warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
6073                   i, section->sh_link);
6074           break;
6075
6076         default:
6077           /* FIXME: Add support for target specific section types.  */
6078 #if 0     /* Currently we do not check other section types as there are too
6079              many special cases.  Stab sections for example have a type
6080              of SHT_PROGBITS but an sh_link field that links to the .stabstr
6081              section.  */
6082           if (section->sh_type < SHT_LOOS && section->sh_link != 0)
6083             warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
6084                   i, section->sh_link);
6085 #endif
6086           break;
6087         }
6088
6089       /* Check the sh_info field.  */
6090       switch (section->sh_type)
6091         {
6092         case SHT_REL:
6093         case SHT_RELA:
6094           if (section->sh_info < 1
6095               || section->sh_info >= elf_header.e_shnum
6096               || (section_headers[section->sh_info].sh_type != SHT_PROGBITS
6097                   && section_headers[section->sh_info].sh_type != SHT_NOBITS
6098                   && section_headers[section->sh_info].sh_type != SHT_NOTE
6099                   && section_headers[section->sh_info].sh_type != SHT_INIT_ARRAY
6100                   /* FIXME: Are other section types valid ?  */
6101                   && section_headers[section->sh_info].sh_type < SHT_LOOS))
6102             {
6103               if (section->sh_info == 0
6104                   && (streq (SECTION_NAME (section), ".rel.dyn")
6105                       || streq (SECTION_NAME (section), ".rela.dyn")))
6106                 /* The .rel.dyn and .rela.dyn sections have an sh_info field
6107                    of zero.  The relocations in these sections may apply
6108                    to many different sections.  */
6109                    ;
6110               else
6111                 warn (_("[%2u]: Info field (%u) should index a relocatable section.\n"),
6112                       i, section->sh_info);
6113             }
6114           break;
6115
6116         case SHT_DYNAMIC:
6117         case SHT_HASH:
6118         case SHT_SYMTAB_SHNDX:
6119         case SHT_INIT_ARRAY:
6120         case SHT_FINI_ARRAY:
6121         case SHT_PREINIT_ARRAY:
6122           if (section->sh_info != 0)
6123             warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6124                   i, section->sh_info);
6125           break;
6126
6127         case SHT_GROUP:
6128         case SHT_SYMTAB:
6129         case SHT_DYNSYM:
6130           /* A symbol index - we assume that it is valid.  */
6131           break;
6132
6133         default:
6134           /* FIXME: Add support for target specific section types.  */
6135           if (section->sh_type == SHT_NOBITS)
6136             /* NOBITS section headers with non-zero sh_info fields can be
6137                created when a binary is stripped of everything but its debug
6138                information.  The stripped sections have their headers
6139                preserved but their types set to SHT_NOBITS.  So do not check
6140                this type of section.  */
6141             ;
6142           else if (section->sh_flags & SHF_INFO_LINK)
6143             {
6144               if (section->sh_info < 1 || section->sh_info >= elf_header.e_shnum)
6145                 warn (_("[%2u]: Expected link to another section in info field"), i);
6146             }
6147           else if (section->sh_type < SHT_LOOS && section->sh_info != 0)
6148             warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6149                   i, section->sh_info);
6150           break;
6151         }
6152
6153       printf ("  [%2u] ", i);
6154       if (do_section_details)
6155         printf ("%s\n      ", printable_section_name (section));
6156       else
6157         print_symbol (-17, SECTION_NAME (section));
6158
6159       printf (do_wide ? " %-15s " : " %-15.15s ",
6160               get_section_type_name (section->sh_type));
6161
6162       if (is_32bit_elf)
6163         {
6164           const char * link_too_big = NULL;
6165
6166           print_vma (section->sh_addr, LONG_HEX);
6167
6168           printf ( " %6.6lx %6.6lx %2.2lx",
6169                    (unsigned long) section->sh_offset,
6170                    (unsigned long) section->sh_size,
6171                    (unsigned long) section->sh_entsize);
6172
6173           if (do_section_details)
6174             fputs ("  ", stdout);
6175           else
6176             printf (" %3s ", get_elf_section_flags (section->sh_flags));
6177
6178           if (section->sh_link >= elf_header.e_shnum)
6179             {
6180               link_too_big = "";
6181               /* The sh_link value is out of range.  Normally this indicates
6182                  an error but it can have special values in Solaris binaries.  */
6183               switch (elf_header.e_machine)
6184                 {
6185                 case EM_386:
6186                 case EM_IAMCU:
6187                 case EM_X86_64:
6188                 case EM_L1OM:
6189                 case EM_K1OM:
6190                 case EM_OLD_SPARCV9:
6191                 case EM_SPARC32PLUS:
6192                 case EM_SPARCV9:
6193                 case EM_SPARC:
6194                   if (section->sh_link == (SHN_BEFORE & 0xffff))
6195                     link_too_big = "BEFORE";
6196                   else if (section->sh_link == (SHN_AFTER & 0xffff))
6197                     link_too_big = "AFTER";
6198                   break;
6199                 default:
6200                   break;
6201                 }
6202             }
6203
6204           if (do_section_details)
6205             {
6206               if (link_too_big != NULL && * link_too_big)
6207                 printf ("<%s> ", link_too_big);
6208               else
6209                 printf ("%2u ", section->sh_link);
6210               printf ("%3u %2lu\n", section->sh_info,
6211                       (unsigned long) section->sh_addralign);
6212             }
6213           else
6214             printf ("%2u %3u %2lu\n",
6215                     section->sh_link,
6216                     section->sh_info,
6217                     (unsigned long) section->sh_addralign);
6218
6219           if (link_too_big && ! * link_too_big)
6220             warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
6221                   i, section->sh_link);
6222         }
6223       else if (do_wide)
6224         {
6225           print_vma (section->sh_addr, LONG_HEX);
6226
6227           if ((long) section->sh_offset == section->sh_offset)
6228             printf (" %6.6lx", (unsigned long) section->sh_offset);
6229           else
6230             {
6231               putchar (' ');
6232               print_vma (section->sh_offset, LONG_HEX);
6233             }
6234
6235           if ((unsigned long) section->sh_size == section->sh_size)
6236             printf (" %6.6lx", (unsigned long) section->sh_size);
6237           else
6238             {
6239               putchar (' ');
6240               print_vma (section->sh_size, LONG_HEX);
6241             }
6242
6243           if ((unsigned long) section->sh_entsize == section->sh_entsize)
6244             printf (" %2.2lx", (unsigned long) section->sh_entsize);
6245           else
6246             {
6247               putchar (' ');
6248               print_vma (section->sh_entsize, LONG_HEX);
6249             }
6250
6251           if (do_section_details)
6252             fputs ("  ", stdout);
6253           else
6254             printf (" %3s ", get_elf_section_flags (section->sh_flags));
6255
6256           printf ("%2u %3u ", section->sh_link, section->sh_info);
6257
6258           if ((unsigned long) section->sh_addralign == section->sh_addralign)
6259             printf ("%2lu\n", (unsigned long) section->sh_addralign);
6260           else
6261             {
6262               print_vma (section->sh_addralign, DEC);
6263               putchar ('\n');
6264             }
6265         }
6266       else if (do_section_details)
6267         {
6268           printf ("       %-15.15s  ",
6269                   get_section_type_name (section->sh_type));
6270           print_vma (section->sh_addr, LONG_HEX);
6271           if ((long) section->sh_offset == section->sh_offset)
6272             printf ("  %16.16lx", (unsigned long) section->sh_offset);
6273           else
6274             {
6275               printf ("  ");
6276               print_vma (section->sh_offset, LONG_HEX);
6277             }
6278           printf ("  %u\n       ", section->sh_link);
6279           print_vma (section->sh_size, LONG_HEX);
6280           putchar (' ');
6281           print_vma (section->sh_entsize, LONG_HEX);
6282
6283           printf ("  %-16u  %lu\n",
6284                   section->sh_info,
6285                   (unsigned long) section->sh_addralign);
6286         }
6287       else
6288         {
6289           putchar (' ');
6290           print_vma (section->sh_addr, LONG_HEX);
6291           if ((long) section->sh_offset == section->sh_offset)
6292             printf ("  %8.8lx", (unsigned long) section->sh_offset);
6293           else
6294             {
6295               printf ("  ");
6296               print_vma (section->sh_offset, LONG_HEX);
6297             }
6298           printf ("\n       ");
6299           print_vma (section->sh_size, LONG_HEX);
6300           printf ("  ");
6301           print_vma (section->sh_entsize, LONG_HEX);
6302
6303           printf (" %3s ", get_elf_section_flags (section->sh_flags));
6304
6305           printf ("     %2u   %3u     %lu\n",
6306                   section->sh_link,
6307                   section->sh_info,
6308                   (unsigned long) section->sh_addralign);
6309         }
6310
6311       if (do_section_details)
6312         {
6313           printf ("       %s\n", get_elf_section_flags (section->sh_flags));
6314           if ((section->sh_flags & SHF_COMPRESSED) != 0)
6315             {
6316               /* Minimum section size is 12 bytes for 32-bit compression
6317                  header + 12 bytes for compressed data header.  */
6318               unsigned char buf[24];
6319
6320               assert (sizeof (buf) >= sizeof (Elf64_External_Chdr));
6321               if (get_data (&buf, (FILE *) file, section->sh_offset, 1,
6322                             sizeof (buf), _("compression header")))
6323                 {
6324                   Elf_Internal_Chdr chdr;
6325
6326                   (void) get_compression_header (&chdr, buf, sizeof (buf));
6327
6328                   if (chdr.ch_type == ELFCOMPRESS_ZLIB)
6329                     printf ("       ZLIB, ");
6330                   else
6331                     printf (_("       [<unknown>: 0x%x], "),
6332                             chdr.ch_type);
6333                   print_vma (chdr.ch_size, LONG_HEX);
6334                   printf (", %lu\n", (unsigned long) chdr.ch_addralign);
6335                 }
6336             }
6337         }
6338     }
6339
6340   if (!do_section_details)
6341     {
6342       /* The ordering of the letters shown here matches the ordering of the
6343          corresponding SHF_xxx values, and hence the order in which these
6344          letters will be displayed to the user.  */
6345       printf (_("Key to Flags:\n\
6346   W (write), A (alloc), X (execute), M (merge), S (strings), I (info),\n\
6347   L (link order), O (extra OS processing required), G (group), T (TLS),\n\
6348   C (compressed), x (unknown), o (OS specific), E (exclude),\n  "));
6349       if (elf_header.e_machine == EM_X86_64
6350           || elf_header.e_machine == EM_L1OM
6351           || elf_header.e_machine == EM_K1OM)
6352         printf (_("l (large), "));
6353       else if (elf_header.e_machine == EM_ARM)
6354         printf (_("y (purecode), "));
6355       printf ("p (processor specific)\n");
6356     }
6357
6358   return 1;
6359 }
6360
6361 static const char *
6362 get_group_flags (unsigned int flags)
6363 {
6364   static char buff[128];
6365
6366   if (flags == 0)
6367     return "";
6368   else if (flags == GRP_COMDAT)
6369     return "COMDAT ";
6370
6371   snprintf (buff, 14, _("[0x%x: "), flags);
6372
6373   flags &= ~ GRP_COMDAT;
6374   if (flags & GRP_MASKOS)
6375     {
6376       strcat (buff, "<OS specific>");
6377       flags &= ~ GRP_MASKOS;
6378     }
6379
6380   if (flags & GRP_MASKPROC)
6381     {
6382       strcat (buff, "<PROC specific>");
6383       flags &= ~ GRP_MASKPROC;
6384     }
6385
6386   if (flags)
6387     strcat (buff, "<unknown>");
6388
6389   strcat (buff, "]");
6390   return buff;
6391 }
6392
6393 static int
6394 process_section_groups (FILE * file)
6395 {
6396   Elf_Internal_Shdr * section;
6397   unsigned int i;
6398   struct group * group;
6399   Elf_Internal_Shdr * symtab_sec;
6400   Elf_Internal_Shdr * strtab_sec;
6401   Elf_Internal_Sym * symtab;
6402   unsigned long num_syms;
6403   char * strtab;
6404   size_t strtab_size;
6405
6406   /* Don't process section groups unless needed.  */
6407   if (!do_unwind && !do_section_groups)
6408     return 1;
6409
6410   if (elf_header.e_shnum == 0)
6411     {
6412       if (do_section_groups)
6413         printf (_("\nThere are no sections to group in this file.\n"));
6414
6415       return 1;
6416     }
6417
6418   if (section_headers == NULL)
6419     {
6420       error (_("Section headers are not available!\n"));
6421       /* PR 13622: This can happen with a corrupt ELF header.  */
6422       return 0;
6423     }
6424
6425   section_headers_groups = (struct group **) calloc (elf_header.e_shnum,
6426                                                      sizeof (struct group *));
6427
6428   if (section_headers_groups == NULL)
6429     {
6430       error (_("Out of memory reading %u section group headers\n"),
6431              elf_header.e_shnum);
6432       return 0;
6433     }
6434
6435   /* Scan the sections for the group section.  */
6436   group_count = 0;
6437   for (i = 0, section = section_headers;
6438        i < elf_header.e_shnum;
6439        i++, section++)
6440     if (section->sh_type == SHT_GROUP)
6441       group_count++;
6442
6443   if (group_count == 0)
6444     {
6445       if (do_section_groups)
6446         printf (_("\nThere are no section groups in this file.\n"));
6447
6448       return 1;
6449     }
6450
6451   section_groups = (struct group *) calloc (group_count, sizeof (struct group));
6452
6453   if (section_groups == NULL)
6454     {
6455       error (_("Out of memory reading %lu groups\n"),
6456              (unsigned long) group_count);
6457       return 0;
6458     }
6459
6460   symtab_sec = NULL;
6461   strtab_sec = NULL;
6462   symtab = NULL;
6463   num_syms = 0;
6464   strtab = NULL;
6465   strtab_size = 0;
6466   for (i = 0, section = section_headers, group = section_groups;
6467        i < elf_header.e_shnum;
6468        i++, section++)
6469     {
6470       if (section->sh_type == SHT_GROUP)
6471         {
6472           const char * name = printable_section_name (section);
6473           const char * group_name;
6474           unsigned char * start;
6475           unsigned char * indices;
6476           unsigned int entry, j, size;
6477           Elf_Internal_Shdr * sec;
6478           Elf_Internal_Sym * sym;
6479
6480           /* Get the symbol table.  */
6481           if (section->sh_link >= elf_header.e_shnum
6482               || ((sec = section_headers + section->sh_link)->sh_type
6483                   != SHT_SYMTAB))
6484             {
6485               error (_("Bad sh_link in group section `%s'\n"), name);
6486               continue;
6487             }
6488
6489           if (symtab_sec != sec)
6490             {
6491               symtab_sec = sec;
6492               if (symtab)
6493                 free (symtab);
6494               symtab = GET_ELF_SYMBOLS (file, symtab_sec, & num_syms);
6495             }
6496
6497           if (symtab == NULL)
6498             {
6499               error (_("Corrupt header in group section `%s'\n"), name);
6500               continue;
6501             }
6502
6503           if (section->sh_info >= num_syms)
6504             {
6505               error (_("Bad sh_info in group section `%s'\n"), name);
6506               continue;
6507             }
6508
6509           sym = symtab + section->sh_info;
6510
6511           if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
6512             {
6513               if (sym->st_shndx == 0
6514                   || sym->st_shndx >= elf_header.e_shnum)
6515                 {
6516                   error (_("Bad sh_info in group section `%s'\n"), name);
6517                   continue;
6518                 }
6519
6520               group_name = SECTION_NAME (section_headers + sym->st_shndx);
6521               strtab_sec = NULL;
6522               if (strtab)
6523                 free (strtab);
6524               strtab = NULL;
6525               strtab_size = 0;
6526             }
6527           else
6528             {
6529               /* Get the string table.  */
6530               if (symtab_sec->sh_link >= elf_header.e_shnum)
6531                 {
6532                   strtab_sec = NULL;
6533                   if (strtab)
6534                     free (strtab);
6535                   strtab = NULL;
6536                   strtab_size = 0;
6537                 }
6538               else if (strtab_sec
6539                        != (sec = section_headers + symtab_sec->sh_link))
6540                 {
6541                   strtab_sec = sec;
6542                   if (strtab)
6543                     free (strtab);
6544
6545                   strtab = (char *) get_data (NULL, file, strtab_sec->sh_offset,
6546                                               1, strtab_sec->sh_size,
6547                                               _("string table"));
6548                   strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
6549                 }
6550               group_name = sym->st_name < strtab_size
6551                 ? strtab + sym->st_name : _("<corrupt>");
6552             }
6553
6554           /* PR 17531: file: loop.  */
6555           if (section->sh_entsize > section->sh_size)
6556             {
6557               error (_("Section %s has sh_entsize (0x%lx) which is larger than its size (0x%lx)\n"),
6558                      printable_section_name (section),
6559                      (unsigned long) section->sh_entsize,
6560                      (unsigned long) section->sh_size);
6561               break;
6562             }
6563
6564           start = (unsigned char *) get_data (NULL, file, section->sh_offset,
6565                                               1, section->sh_size,
6566                                               _("section data"));
6567           if (start == NULL)
6568             continue;
6569
6570           indices = start;
6571           size = (section->sh_size / section->sh_entsize) - 1;
6572           entry = byte_get (indices, 4);
6573           indices += 4;
6574
6575           if (do_section_groups)
6576             {
6577               printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
6578                       get_group_flags (entry), i, name, group_name, size);
6579
6580               printf (_("   [Index]    Name\n"));
6581             }
6582
6583           group->group_index = i;
6584
6585           for (j = 0; j < size; j++)
6586             {
6587               struct group_list * g;
6588
6589               entry = byte_get (indices, 4);
6590               indices += 4;
6591
6592               if (entry >= elf_header.e_shnum)
6593                 {
6594                   static unsigned num_group_errors = 0;
6595
6596                   if (num_group_errors ++ < 10)
6597                     {
6598                       error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
6599                              entry, i, elf_header.e_shnum - 1);
6600                       if (num_group_errors == 10)
6601                         warn (_("Futher error messages about overlarge group section indicies suppressed\n"));
6602                     }
6603                   continue;
6604                 }
6605
6606               if (section_headers_groups [entry] != NULL)
6607                 {
6608                   if (entry)
6609                     {
6610                       static unsigned num_errs = 0;
6611
6612                       if (num_errs ++ < 10)
6613                         {
6614                           error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
6615                                  entry, i,
6616                                  section_headers_groups [entry]->group_index);
6617                           if (num_errs == 10)
6618                             warn (_("Further error messages about already contained group sections suppressed\n"));
6619                         }
6620                       continue;
6621                     }
6622                   else
6623                     {
6624                       /* Intel C/C++ compiler may put section 0 in a
6625                          section group. We just warn it the first time
6626                          and ignore it afterwards.  */
6627                       static int warned = 0;
6628                       if (!warned)
6629                         {
6630                           error (_("section 0 in group section [%5u]\n"),
6631                                  section_headers_groups [entry]->group_index);
6632                           warned++;
6633                         }
6634                     }
6635                 }
6636
6637               section_headers_groups [entry] = group;
6638
6639               if (do_section_groups)
6640                 {
6641                   sec = section_headers + entry;
6642                   printf ("   [%5u]   %s\n", entry, printable_section_name (sec));
6643                 }
6644
6645               g = (struct group_list *) xmalloc (sizeof (struct group_list));
6646               g->section_index = entry;
6647               g->next = group->root;
6648               group->root = g;
6649             }
6650
6651           if (start)
6652             free (start);
6653
6654           group++;
6655         }
6656     }
6657
6658   if (symtab)
6659     free (symtab);
6660   if (strtab)
6661     free (strtab);
6662   return 1;
6663 }
6664
6665 /* Data used to display dynamic fixups.  */
6666
6667 struct ia64_vms_dynfixup
6668 {
6669   bfd_vma needed_ident;         /* Library ident number.  */
6670   bfd_vma needed;               /* Index in the dstrtab of the library name.  */
6671   bfd_vma fixup_needed;         /* Index of the library.  */
6672   bfd_vma fixup_rela_cnt;       /* Number of fixups.  */
6673   bfd_vma fixup_rela_off;       /* Fixups offset in the dynamic segment.  */
6674 };
6675
6676 /* Data used to display dynamic relocations.  */
6677
6678 struct ia64_vms_dynimgrela
6679 {
6680   bfd_vma img_rela_cnt;         /* Number of relocations.  */
6681   bfd_vma img_rela_off;         /* Reloc offset in the dynamic segment.  */
6682 };
6683
6684 /* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
6685    library).  */
6686
6687 static void
6688 dump_ia64_vms_dynamic_fixups (FILE *file, struct ia64_vms_dynfixup *fixup,
6689                               const char *strtab, unsigned int strtab_sz)
6690 {
6691   Elf64_External_VMS_IMAGE_FIXUP *imfs;
6692   long i;
6693   const char *lib_name;
6694
6695   imfs = get_data (NULL, file, dynamic_addr + fixup->fixup_rela_off,
6696                    1, fixup->fixup_rela_cnt * sizeof (*imfs),
6697                    _("dynamic section image fixups"));
6698   if (!imfs)
6699     return;
6700
6701   if (fixup->needed < strtab_sz)
6702     lib_name = strtab + fixup->needed;
6703   else
6704     {
6705       warn ("corrupt library name index of 0x%lx found in dynamic entry",
6706             (unsigned long) fixup->needed);
6707       lib_name = "???";
6708     }
6709   printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
6710           (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
6711   printf
6712     (_("Seg Offset           Type                             SymVec DataType\n"));
6713
6714   for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
6715     {
6716       unsigned int type;
6717       const char *rtype;
6718
6719       printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
6720       printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
6721       type = BYTE_GET (imfs [i].type);
6722       rtype = elf_ia64_reloc_type (type);
6723       if (rtype == NULL)
6724         printf (" 0x%08x                       ", type);
6725       else
6726         printf (" %-32s ", rtype);
6727       printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
6728       printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
6729     }
6730
6731   free (imfs);
6732 }
6733
6734 /* Display IA-64 OpenVMS dynamic relocations (used to relocate an image).  */
6735
6736 static void
6737 dump_ia64_vms_dynamic_relocs (FILE *file, struct ia64_vms_dynimgrela *imgrela)
6738 {
6739   Elf64_External_VMS_IMAGE_RELA *imrs;
6740   long i;
6741
6742   imrs = get_data (NULL, file, dynamic_addr + imgrela->img_rela_off,
6743                    1, imgrela->img_rela_cnt * sizeof (*imrs),
6744                    _("dynamic section image relocations"));
6745   if (!imrs)
6746     return;
6747
6748   printf (_("\nImage relocs\n"));
6749   printf
6750     (_("Seg Offset   Type                            Addend            Seg Sym Off\n"));
6751
6752   for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
6753     {
6754       unsigned int type;
6755       const char *rtype;
6756
6757       printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
6758       printf ("%08" BFD_VMA_FMT "x ",
6759               (bfd_vma) BYTE_GET (imrs [i].rela_offset));
6760       type = BYTE_GET (imrs [i].type);
6761       rtype = elf_ia64_reloc_type (type);
6762       if (rtype == NULL)
6763         printf ("0x%08x                      ", type);
6764       else
6765         printf ("%-31s ", rtype);
6766       print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
6767       printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
6768       printf ("%08" BFD_VMA_FMT "x\n",
6769               (bfd_vma) BYTE_GET (imrs [i].sym_offset));
6770     }
6771
6772   free (imrs);
6773 }
6774
6775 /* Display IA-64 OpenVMS dynamic relocations and fixups.  */
6776
6777 static int
6778 process_ia64_vms_dynamic_relocs (FILE *file)
6779 {
6780   struct ia64_vms_dynfixup fixup;
6781   struct ia64_vms_dynimgrela imgrela;
6782   Elf_Internal_Dyn *entry;
6783   int res = 0;
6784   bfd_vma strtab_off = 0;
6785   bfd_vma strtab_sz = 0;
6786   char *strtab = NULL;
6787
6788   memset (&fixup, 0, sizeof (fixup));
6789   memset (&imgrela, 0, sizeof (imgrela));
6790
6791   /* Note: the order of the entries is specified by the OpenVMS specs.  */
6792   for (entry = dynamic_section;
6793        entry < dynamic_section + dynamic_nent;
6794        entry++)
6795     {
6796       switch (entry->d_tag)
6797         {
6798         case DT_IA_64_VMS_STRTAB_OFFSET:
6799           strtab_off = entry->d_un.d_val;
6800           break;
6801         case DT_STRSZ:
6802           strtab_sz = entry->d_un.d_val;
6803           if (strtab == NULL)
6804             strtab = get_data (NULL, file, dynamic_addr + strtab_off,
6805                                1, strtab_sz, _("dynamic string section"));
6806           break;
6807
6808         case DT_IA_64_VMS_NEEDED_IDENT:
6809           fixup.needed_ident = entry->d_un.d_val;
6810           break;
6811         case DT_NEEDED:
6812           fixup.needed = entry->d_un.d_val;
6813           break;
6814         case DT_IA_64_VMS_FIXUP_NEEDED:
6815           fixup.fixup_needed = entry->d_un.d_val;
6816           break;
6817         case DT_IA_64_VMS_FIXUP_RELA_CNT:
6818           fixup.fixup_rela_cnt = entry->d_un.d_val;
6819           break;
6820         case DT_IA_64_VMS_FIXUP_RELA_OFF:
6821           fixup.fixup_rela_off = entry->d_un.d_val;
6822           res++;
6823           dump_ia64_vms_dynamic_fixups (file, &fixup, strtab, strtab_sz);
6824           break;
6825
6826         case DT_IA_64_VMS_IMG_RELA_CNT:
6827           imgrela.img_rela_cnt = entry->d_un.d_val;
6828           break;
6829         case DT_IA_64_VMS_IMG_RELA_OFF:
6830           imgrela.img_rela_off = entry->d_un.d_val;
6831           res++;
6832           dump_ia64_vms_dynamic_relocs (file, &imgrela);
6833           break;
6834
6835         default:
6836           break;
6837         }
6838     }
6839
6840   if (strtab != NULL)
6841     free (strtab);
6842
6843   return res;
6844 }
6845
6846 static struct
6847 {
6848   const char * name;
6849   int reloc;
6850   int size;
6851   int rela;
6852 } dynamic_relocations [] =
6853 {
6854     { "REL", DT_REL, DT_RELSZ, FALSE },
6855     { "RELA", DT_RELA, DT_RELASZ, TRUE },
6856     { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
6857 };
6858
6859 /* Process the reloc section.  */
6860
6861 static int
6862 process_relocs (FILE * file)
6863 {
6864   unsigned long rel_size;
6865   unsigned long rel_offset;
6866
6867
6868   if (!do_reloc)
6869     return 1;
6870
6871   if (do_using_dynamic)
6872     {
6873       int is_rela;
6874       const char * name;
6875       int has_dynamic_reloc;
6876       unsigned int i;
6877
6878       has_dynamic_reloc = 0;
6879
6880       for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
6881         {
6882           is_rela = dynamic_relocations [i].rela;
6883           name = dynamic_relocations [i].name;
6884           rel_size = dynamic_info [dynamic_relocations [i].size];
6885           rel_offset = dynamic_info [dynamic_relocations [i].reloc];
6886
6887           has_dynamic_reloc |= rel_size;
6888
6889           if (is_rela == UNKNOWN)
6890             {
6891               if (dynamic_relocations [i].reloc == DT_JMPREL)
6892                 switch (dynamic_info[DT_PLTREL])
6893                   {
6894                   case DT_REL:
6895                     is_rela = FALSE;
6896                     break;
6897                   case DT_RELA:
6898                     is_rela = TRUE;
6899                     break;
6900                   }
6901             }
6902
6903           if (rel_size)
6904             {
6905               printf
6906                 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
6907                  name, rel_offset, rel_size);
6908
6909               dump_relocations (file,
6910                                 offset_from_vma (file, rel_offset, rel_size),
6911                                 rel_size,
6912                                 dynamic_symbols, num_dynamic_syms,
6913                                 dynamic_strings, dynamic_strings_length,
6914                                 is_rela, 1);
6915             }
6916         }
6917
6918       if (is_ia64_vms ())
6919         has_dynamic_reloc |= process_ia64_vms_dynamic_relocs (file);
6920
6921       if (! has_dynamic_reloc)
6922         printf (_("\nThere are no dynamic relocations in this file.\n"));
6923     }
6924   else
6925     {
6926       Elf_Internal_Shdr * section;
6927       unsigned long i;
6928       int found = 0;
6929
6930       for (i = 0, section = section_headers;
6931            i < elf_header.e_shnum;
6932            i++, section++)
6933         {
6934           if (   section->sh_type != SHT_RELA
6935               && section->sh_type != SHT_REL)
6936             continue;
6937
6938           rel_offset = section->sh_offset;
6939           rel_size   = section->sh_size;
6940
6941           if (rel_size)
6942             {
6943               Elf_Internal_Shdr * strsec;
6944               int is_rela;
6945
6946               printf (_("\nRelocation section "));
6947
6948               if (string_table == NULL)
6949                 printf ("%d", section->sh_name);
6950               else
6951                 printf ("'%s'", printable_section_name (section));
6952
6953               printf (_(" at offset 0x%lx contains %lu entries:\n"),
6954                  rel_offset, (unsigned long) (rel_size / section->sh_entsize));
6955
6956               is_rela = section->sh_type == SHT_RELA;
6957
6958               if (section->sh_link != 0
6959                   && section->sh_link < elf_header.e_shnum)
6960                 {
6961                   Elf_Internal_Shdr * symsec;
6962                   Elf_Internal_Sym *  symtab;
6963                   unsigned long nsyms;
6964                   unsigned long strtablen = 0;
6965                   char * strtab = NULL;
6966
6967                   symsec = section_headers + section->sh_link;
6968                   if (symsec->sh_type != SHT_SYMTAB
6969                       && symsec->sh_type != SHT_DYNSYM)
6970                     continue;
6971
6972                   symtab = GET_ELF_SYMBOLS (file, symsec, & nsyms);
6973
6974                   if (symtab == NULL)
6975                     continue;
6976
6977                   if (symsec->sh_link != 0
6978                       && symsec->sh_link < elf_header.e_shnum)
6979                     {
6980                       strsec = section_headers + symsec->sh_link;
6981
6982                       strtab = (char *) get_data (NULL, file, strsec->sh_offset,
6983                                                   1, strsec->sh_size,
6984                                                   _("string table"));
6985                       strtablen = strtab == NULL ? 0 : strsec->sh_size;
6986                     }
6987
6988                   dump_relocations (file, rel_offset, rel_size,
6989                                     symtab, nsyms, strtab, strtablen,
6990                                     is_rela,
6991                                     symsec->sh_type == SHT_DYNSYM);
6992                   if (strtab)
6993                     free (strtab);
6994                   free (symtab);
6995                 }
6996               else
6997                 dump_relocations (file, rel_offset, rel_size,
6998                                   NULL, 0, NULL, 0, is_rela, 0);
6999
7000               found = 1;
7001             }
7002         }
7003
7004       if (! found)
7005         printf (_("\nThere are no relocations in this file.\n"));
7006     }
7007
7008   return 1;
7009 }
7010
7011 /* An absolute address consists of a section and an offset.  If the
7012    section is NULL, the offset itself is the address, otherwise, the
7013    address equals to LOAD_ADDRESS(section) + offset.  */
7014
7015 struct absaddr
7016 {
7017   unsigned short section;
7018   bfd_vma offset;
7019 };
7020
7021 #define ABSADDR(a) \
7022   ((a).section \
7023    ? section_headers [(a).section].sh_addr + (a).offset \
7024    : (a).offset)
7025
7026 /* Find the nearest symbol at or below ADDR.  Returns the symbol
7027    name, if found, and the offset from the symbol to ADDR.  */
7028
7029 static void
7030 find_symbol_for_address (Elf_Internal_Sym * symtab,
7031                          unsigned long      nsyms,
7032                          const char *       strtab,
7033                          unsigned long      strtab_size,
7034                          struct absaddr     addr,
7035                          const char **      symname,
7036                          bfd_vma *          offset)
7037 {
7038   bfd_vma dist = 0x100000;
7039   Elf_Internal_Sym * sym;
7040   Elf_Internal_Sym * beg;
7041   Elf_Internal_Sym * end;
7042   Elf_Internal_Sym * best = NULL;
7043
7044   REMOVE_ARCH_BITS (addr.offset);
7045   beg = symtab;
7046   end = symtab + nsyms;
7047
7048   while (beg < end)
7049     {
7050       bfd_vma value;
7051
7052       sym = beg + (end - beg) / 2;
7053
7054       value = sym->st_value;
7055       REMOVE_ARCH_BITS (value);
7056
7057       if (sym->st_name != 0
7058           && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
7059           && addr.offset >= value
7060           && addr.offset - value < dist)
7061         {
7062           best = sym;
7063           dist = addr.offset - value;
7064           if (!dist)
7065             break;
7066         }
7067
7068       if (addr.offset < value)
7069         end = sym;
7070       else
7071         beg = sym + 1;
7072     }
7073
7074   if (best)
7075     {
7076       *symname = (best->st_name >= strtab_size
7077                   ? _("<corrupt>") : strtab + best->st_name);
7078       *offset = dist;
7079       return;
7080     }
7081
7082   *symname = NULL;
7083   *offset = addr.offset;
7084 }
7085
7086 static int
7087 symcmp (const void *p, const void *q)
7088 {
7089   Elf_Internal_Sym *sp = (Elf_Internal_Sym *) p;
7090   Elf_Internal_Sym *sq = (Elf_Internal_Sym *) q;
7091
7092   return sp->st_value > sq->st_value ? 1 : (sp->st_value < sq->st_value ? -1 : 0);
7093 }
7094
7095 /* Process the unwind section.  */
7096
7097 #include "unwind-ia64.h"
7098
7099 struct ia64_unw_table_entry
7100 {
7101   struct absaddr start;
7102   struct absaddr end;
7103   struct absaddr info;
7104 };
7105
7106 struct ia64_unw_aux_info
7107 {
7108   struct ia64_unw_table_entry *table;   /* Unwind table.  */
7109   unsigned long table_len;              /* Length of unwind table.  */
7110   unsigned char * info;                 /* Unwind info.  */
7111   unsigned long info_size;              /* Size of unwind info.  */
7112   bfd_vma info_addr;                    /* Starting address of unwind info.  */
7113   bfd_vma seg_base;                     /* Starting address of segment.  */
7114   Elf_Internal_Sym * symtab;            /* The symbol table.  */
7115   unsigned long nsyms;                  /* Number of symbols.  */
7116   Elf_Internal_Sym * funtab;            /* Sorted table of STT_FUNC symbols.  */
7117   unsigned long nfuns;                  /* Number of entries in funtab.  */
7118   char * strtab;                        /* The string table.  */
7119   unsigned long strtab_size;            /* Size of string table.  */
7120 };
7121
7122 static void
7123 dump_ia64_unwind (struct ia64_unw_aux_info * aux)
7124 {
7125   struct ia64_unw_table_entry * tp;
7126   unsigned long j, nfuns;
7127   int in_body;
7128
7129   aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7130   for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7131     if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7132       aux->funtab[nfuns++] = aux->symtab[j];
7133   aux->nfuns = nfuns;
7134   qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7135
7136   for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7137     {
7138       bfd_vma stamp;
7139       bfd_vma offset;
7140       const unsigned char * dp;
7141       const unsigned char * head;
7142       const unsigned char * end;
7143       const char * procname;
7144
7145       find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
7146                                aux->strtab_size, tp->start, &procname, &offset);
7147
7148       fputs ("\n<", stdout);
7149
7150       if (procname)
7151         {
7152           fputs (procname, stdout);
7153
7154           if (offset)
7155             printf ("+%lx", (unsigned long) offset);
7156         }
7157
7158       fputs (">: [", stdout);
7159       print_vma (tp->start.offset, PREFIX_HEX);
7160       fputc ('-', stdout);
7161       print_vma (tp->end.offset, PREFIX_HEX);
7162       printf ("], info at +0x%lx\n",
7163               (unsigned long) (tp->info.offset - aux->seg_base));
7164
7165       /* PR 17531: file: 86232b32.  */
7166       if (aux->info == NULL)
7167         continue;
7168
7169       /* PR 17531: file: 0997b4d1.  */
7170       if ((ABSADDR (tp->info) - aux->info_addr) >= aux->info_size)
7171         {
7172           warn (_("Invalid offset %lx in table entry %ld\n"),
7173                 (long) tp->info.offset, (long) (tp - aux->table));
7174           continue;
7175         }
7176
7177       head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
7178       stamp = byte_get ((unsigned char *) head, sizeof (stamp));
7179
7180       printf ("  v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
7181               (unsigned) UNW_VER (stamp),
7182               (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
7183               UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
7184               UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
7185               (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
7186
7187       if (UNW_VER (stamp) != 1)
7188         {
7189           printf (_("\tUnknown version.\n"));
7190           continue;
7191         }
7192
7193       in_body = 0;
7194       end = head + 8 + eh_addr_size * UNW_LENGTH (stamp);
7195       /* PR 17531: file: 16ceda89.  */
7196       if (end > aux->info + aux->info_size)
7197         end = aux->info + aux->info_size;
7198       for (dp = head + 8; dp < end;)
7199         dp = unw_decode (dp, in_body, & in_body, end);
7200     }
7201
7202   free (aux->funtab);
7203 }
7204
7205 static bfd_boolean
7206 slurp_ia64_unwind_table (FILE * file,
7207                          struct ia64_unw_aux_info * aux,
7208                          Elf_Internal_Shdr * sec)
7209 {
7210   unsigned long size, nrelas, i;
7211   Elf_Internal_Phdr * seg;
7212   struct ia64_unw_table_entry * tep;
7213   Elf_Internal_Shdr * relsec;
7214   Elf_Internal_Rela * rela;
7215   Elf_Internal_Rela * rp;
7216   unsigned char * table;
7217   unsigned char * tp;
7218   Elf_Internal_Sym * sym;
7219   const char * relname;
7220
7221   aux->table_len = 0;
7222
7223   /* First, find the starting address of the segment that includes
7224      this section: */
7225
7226   if (elf_header.e_phnum)
7227     {
7228       if (! get_program_headers (file))
7229           return FALSE;
7230
7231       for (seg = program_headers;
7232            seg < program_headers + elf_header.e_phnum;
7233            ++seg)
7234         {
7235           if (seg->p_type != PT_LOAD)
7236             continue;
7237
7238           if (sec->sh_addr >= seg->p_vaddr
7239               && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7240             {
7241               aux->seg_base = seg->p_vaddr;
7242               break;
7243             }
7244         }
7245     }
7246
7247   /* Second, build the unwind table from the contents of the unwind section:  */
7248   size = sec->sh_size;
7249   table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
7250                                       _("unwind table"));
7251   if (!table)
7252     return FALSE;
7253
7254   aux->table_len = size / (3 * eh_addr_size);
7255   aux->table = (struct ia64_unw_table_entry *)
7256     xcmalloc (aux->table_len, sizeof (aux->table[0]));
7257   tep = aux->table;
7258
7259   for (tp = table; tp <= table + size - (3 * eh_addr_size); ++tep)
7260     {
7261       tep->start.section = SHN_UNDEF;
7262       tep->end.section   = SHN_UNDEF;
7263       tep->info.section  = SHN_UNDEF;
7264       tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7265       tep->end.offset   = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7266       tep->info.offset  = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7267       tep->start.offset += aux->seg_base;
7268       tep->end.offset   += aux->seg_base;
7269       tep->info.offset  += aux->seg_base;
7270     }
7271   free (table);
7272
7273   /* Third, apply any relocations to the unwind table:  */
7274   for (relsec = section_headers;
7275        relsec < section_headers + elf_header.e_shnum;
7276        ++relsec)
7277     {
7278       if (relsec->sh_type != SHT_RELA
7279           || relsec->sh_info >= elf_header.e_shnum
7280           || section_headers + relsec->sh_info != sec)
7281         continue;
7282
7283       if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7284                               & rela, & nrelas))
7285         {
7286           free (aux->table);
7287           aux->table = NULL;
7288           aux->table_len = 0;
7289           return FALSE;
7290         }
7291
7292       for (rp = rela; rp < rela + nrelas; ++rp)
7293         {
7294           relname = elf_ia64_reloc_type (get_reloc_type (rp->r_info));
7295           sym = aux->symtab + get_reloc_symindex (rp->r_info);
7296
7297           /* PR 17531: file: 9fa67536.  */
7298           if (relname == NULL)
7299             {
7300               warn (_("Skipping unknown relocation type: %u\n"), get_reloc_type (rp->r_info));
7301               continue;
7302             }
7303
7304           if (! const_strneq (relname, "R_IA64_SEGREL"))
7305             {
7306               warn (_("Skipping unexpected relocation type: %s\n"), relname);
7307               continue;
7308             }
7309
7310           i = rp->r_offset / (3 * eh_addr_size);
7311
7312           /* PR 17531: file: 5bc8d9bf.  */
7313           if (i >= aux->table_len)
7314             {
7315               warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
7316               continue;
7317             }
7318
7319           switch (rp->r_offset / eh_addr_size % 3)
7320             {
7321             case 0:
7322               aux->table[i].start.section = sym->st_shndx;
7323               aux->table[i].start.offset  = rp->r_addend + sym->st_value;
7324               break;
7325             case 1:
7326               aux->table[i].end.section   = sym->st_shndx;
7327               aux->table[i].end.offset    = rp->r_addend + sym->st_value;
7328               break;
7329             case 2:
7330               aux->table[i].info.section  = sym->st_shndx;
7331               aux->table[i].info.offset   = rp->r_addend + sym->st_value;
7332               break;
7333             default:
7334               break;
7335             }
7336         }
7337
7338       free (rela);
7339     }
7340
7341   return TRUE;
7342 }
7343
7344 static void
7345 ia64_process_unwind (FILE * file)
7346 {
7347   Elf_Internal_Shdr * sec;
7348   Elf_Internal_Shdr * unwsec = NULL;
7349   Elf_Internal_Shdr * strsec;
7350   unsigned long i, unwcount = 0, unwstart = 0;
7351   struct ia64_unw_aux_info aux;
7352
7353   memset (& aux, 0, sizeof (aux));
7354
7355   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7356     {
7357       if (sec->sh_type == SHT_SYMTAB
7358           && sec->sh_link < elf_header.e_shnum)
7359         {
7360           aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
7361
7362           strsec = section_headers + sec->sh_link;
7363           if (aux.strtab != NULL)
7364             {
7365               error (_("Multiple auxillary string tables encountered\n"));
7366               free (aux.strtab);
7367             }
7368           aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
7369                                           1, strsec->sh_size,
7370                                           _("string table"));
7371           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7372         }
7373       else if (sec->sh_type == SHT_IA_64_UNWIND)
7374         unwcount++;
7375     }
7376
7377   if (!unwcount)
7378     printf (_("\nThere are no unwind sections in this file.\n"));
7379
7380   while (unwcount-- > 0)
7381     {
7382       char * suffix;
7383       size_t len, len2;
7384
7385       for (i = unwstart, sec = section_headers + unwstart, unwsec = NULL;
7386            i < elf_header.e_shnum; ++i, ++sec)
7387         if (sec->sh_type == SHT_IA_64_UNWIND)
7388           {
7389             unwsec = sec;
7390             break;
7391           }
7392       /* We have already counted the number of SHT_IA64_UNWIND
7393          sections so the loop above should never fail.  */
7394       assert (unwsec != NULL);
7395
7396       unwstart = i + 1;
7397       len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
7398
7399       if ((unwsec->sh_flags & SHF_GROUP) != 0)
7400         {
7401           /* We need to find which section group it is in.  */
7402           struct group_list * g;
7403
7404           if (section_headers_groups == NULL
7405               || section_headers_groups [i] == NULL)
7406             i = elf_header.e_shnum;
7407           else
7408             {
7409               g = section_headers_groups [i]->root;
7410
7411               for (; g != NULL; g = g->next)
7412                 {
7413                   sec = section_headers + g->section_index;
7414
7415                   if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
7416                     break;
7417                 }
7418
7419               if (g == NULL)
7420                 i = elf_header.e_shnum;
7421             }
7422         }
7423       else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
7424         {
7425           /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO.  */
7426           len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
7427           suffix = SECTION_NAME (unwsec) + len;
7428           for (i = 0, sec = section_headers; i < elf_header.e_shnum;
7429                ++i, ++sec)
7430             if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
7431                 && streq (SECTION_NAME (sec) + len2, suffix))
7432               break;
7433         }
7434       else
7435         {
7436           /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
7437              .IA_64.unwind or BAR -> .IA_64.unwind_info.  */
7438           len = sizeof (ELF_STRING_ia64_unwind) - 1;
7439           len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
7440           suffix = "";
7441           if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
7442             suffix = SECTION_NAME (unwsec) + len;
7443           for (i = 0, sec = section_headers; i < elf_header.e_shnum;
7444                ++i, ++sec)
7445             if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
7446                 && streq (SECTION_NAME (sec) + len2, suffix))
7447               break;
7448         }
7449
7450       if (i == elf_header.e_shnum)
7451         {
7452           printf (_("\nCould not find unwind info section for "));
7453
7454           if (string_table == NULL)
7455             printf ("%d", unwsec->sh_name);
7456           else
7457             printf ("'%s'", printable_section_name (unwsec));
7458         }
7459       else
7460         {
7461           aux.info_addr = sec->sh_addr;
7462           aux.info = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1,
7463                                                  sec->sh_size,
7464                                                  _("unwind info"));
7465           aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
7466
7467           printf (_("\nUnwind section "));
7468
7469           if (string_table == NULL)
7470             printf ("%d", unwsec->sh_name);
7471           else
7472             printf ("'%s'", printable_section_name (unwsec));
7473
7474           printf (_(" at offset 0x%lx contains %lu entries:\n"),
7475                   (unsigned long) unwsec->sh_offset,
7476                   (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
7477
7478           if (slurp_ia64_unwind_table (file, & aux, unwsec)
7479               && aux.table_len > 0)
7480             dump_ia64_unwind (& aux);
7481
7482           if (aux.table)
7483             free ((char *) aux.table);
7484           if (aux.info)
7485             free ((char *) aux.info);
7486           aux.table = NULL;
7487           aux.info = 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 hppa_unw_table_entry
7498   {
7499     struct absaddr start;
7500     struct absaddr end;
7501     unsigned int Cannot_unwind:1;               /* 0 */
7502     unsigned int Millicode:1;                   /* 1 */
7503     unsigned int Millicode_save_sr0:1;          /* 2 */
7504     unsigned int Region_description:2;          /* 3..4 */
7505     unsigned int reserved1:1;                   /* 5 */
7506     unsigned int Entry_SR:1;                    /* 6 */
7507     unsigned int Entry_FR:4;     /* number saved */     /* 7..10 */
7508     unsigned int Entry_GR:5;     /* number saved */     /* 11..15 */
7509     unsigned int Args_stored:1;                 /* 16 */
7510     unsigned int Variable_Frame:1;              /* 17 */
7511     unsigned int Separate_Package_Body:1;       /* 18 */
7512     unsigned int Frame_Extension_Millicode:1;   /* 19 */
7513     unsigned int Stack_Overflow_Check:1;        /* 20 */
7514     unsigned int Two_Instruction_SP_Increment:1;/* 21 */
7515     unsigned int Ada_Region:1;                  /* 22 */
7516     unsigned int cxx_info:1;                    /* 23 */
7517     unsigned int cxx_try_catch:1;               /* 24 */
7518     unsigned int sched_entry_seq:1;             /* 25 */
7519     unsigned int reserved2:1;                   /* 26 */
7520     unsigned int Save_SP:1;                     /* 27 */
7521     unsigned int Save_RP:1;                     /* 28 */
7522     unsigned int Save_MRP_in_frame:1;           /* 29 */
7523     unsigned int extn_ptr_defined:1;            /* 30 */
7524     unsigned int Cleanup_defined:1;             /* 31 */
7525
7526     unsigned int MPE_XL_interrupt_marker:1;     /* 0 */
7527     unsigned int HP_UX_interrupt_marker:1;      /* 1 */
7528     unsigned int Large_frame:1;                 /* 2 */
7529     unsigned int Pseudo_SP_Set:1;               /* 3 */
7530     unsigned int reserved4:1;                   /* 4 */
7531     unsigned int Total_frame_size:27;           /* 5..31 */
7532   };
7533
7534 struct hppa_unw_aux_info
7535 {
7536   struct hppa_unw_table_entry * table;  /* Unwind table.  */
7537   unsigned long table_len;              /* Length of unwind table.  */
7538   bfd_vma seg_base;                     /* Starting address of segment.  */
7539   Elf_Internal_Sym * symtab;            /* The symbol table.  */
7540   unsigned long nsyms;                  /* Number of symbols.  */
7541   Elf_Internal_Sym * funtab;            /* Sorted table of STT_FUNC symbols.  */
7542   unsigned long nfuns;                  /* Number of entries in funtab.  */
7543   char * strtab;                        /* The string table.  */
7544   unsigned long strtab_size;            /* Size of string table.  */
7545 };
7546
7547 static void
7548 dump_hppa_unwind (struct hppa_unw_aux_info * aux)
7549 {
7550   struct hppa_unw_table_entry * tp;
7551   unsigned long j, nfuns;
7552
7553   aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7554   for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7555     if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7556       aux->funtab[nfuns++] = aux->symtab[j];
7557   aux->nfuns = nfuns;
7558   qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7559
7560   for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7561     {
7562       bfd_vma offset;
7563       const char * procname;
7564
7565       find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
7566                                aux->strtab_size, tp->start, &procname,
7567                                &offset);
7568
7569       fputs ("\n<", stdout);
7570
7571       if (procname)
7572         {
7573           fputs (procname, stdout);
7574
7575           if (offset)
7576             printf ("+%lx", (unsigned long) offset);
7577         }
7578
7579       fputs (">: [", stdout);
7580       print_vma (tp->start.offset, PREFIX_HEX);
7581       fputc ('-', stdout);
7582       print_vma (tp->end.offset, PREFIX_HEX);
7583       printf ("]\n\t");
7584
7585 #define PF(_m) if (tp->_m) printf (#_m " ");
7586 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
7587       PF(Cannot_unwind);
7588       PF(Millicode);
7589       PF(Millicode_save_sr0);
7590       /* PV(Region_description);  */
7591       PF(Entry_SR);
7592       PV(Entry_FR);
7593       PV(Entry_GR);
7594       PF(Args_stored);
7595       PF(Variable_Frame);
7596       PF(Separate_Package_Body);
7597       PF(Frame_Extension_Millicode);
7598       PF(Stack_Overflow_Check);
7599       PF(Two_Instruction_SP_Increment);
7600       PF(Ada_Region);
7601       PF(cxx_info);
7602       PF(cxx_try_catch);
7603       PF(sched_entry_seq);
7604       PF(Save_SP);
7605       PF(Save_RP);
7606       PF(Save_MRP_in_frame);
7607       PF(extn_ptr_defined);
7608       PF(Cleanup_defined);
7609       PF(MPE_XL_interrupt_marker);
7610       PF(HP_UX_interrupt_marker);
7611       PF(Large_frame);
7612       PF(Pseudo_SP_Set);
7613       PV(Total_frame_size);
7614 #undef PF
7615 #undef PV
7616     }
7617
7618   printf ("\n");
7619
7620   free (aux->funtab);
7621 }
7622
7623 static int
7624 slurp_hppa_unwind_table (FILE * file,
7625                          struct hppa_unw_aux_info * aux,
7626                          Elf_Internal_Shdr * sec)
7627 {
7628   unsigned long size, unw_ent_size, nentries, nrelas, i;
7629   Elf_Internal_Phdr * seg;
7630   struct hppa_unw_table_entry * tep;
7631   Elf_Internal_Shdr * relsec;
7632   Elf_Internal_Rela * rela;
7633   Elf_Internal_Rela * rp;
7634   unsigned char * table;
7635   unsigned char * tp;
7636   Elf_Internal_Sym * sym;
7637   const char * relname;
7638
7639   /* First, find the starting address of the segment that includes
7640      this section.  */
7641
7642   if (elf_header.e_phnum)
7643     {
7644       if (! get_program_headers (file))
7645         return 0;
7646
7647       for (seg = program_headers;
7648            seg < program_headers + elf_header.e_phnum;
7649            ++seg)
7650         {
7651           if (seg->p_type != PT_LOAD)
7652             continue;
7653
7654           if (sec->sh_addr >= seg->p_vaddr
7655               && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7656             {
7657               aux->seg_base = seg->p_vaddr;
7658               break;
7659             }
7660         }
7661     }
7662
7663   /* Second, build the unwind table from the contents of the unwind
7664      section.  */
7665   size = sec->sh_size;
7666   table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
7667                                       _("unwind table"));
7668   if (!table)
7669     return 0;
7670
7671   unw_ent_size = 16;
7672   nentries = size / unw_ent_size;
7673   size = unw_ent_size * nentries;
7674
7675   tep = aux->table = (struct hppa_unw_table_entry *)
7676       xcmalloc (nentries, sizeof (aux->table[0]));
7677
7678   for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
7679     {
7680       unsigned int tmp1, tmp2;
7681
7682       tep->start.section = SHN_UNDEF;
7683       tep->end.section   = SHN_UNDEF;
7684
7685       tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
7686       tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
7687       tmp1 = byte_get ((unsigned char *) tp + 8, 4);
7688       tmp2 = byte_get ((unsigned char *) tp + 12, 4);
7689
7690       tep->start.offset += aux->seg_base;
7691       tep->end.offset   += aux->seg_base;
7692
7693       tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
7694       tep->Millicode = (tmp1 >> 30) & 0x1;
7695       tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
7696       tep->Region_description = (tmp1 >> 27) & 0x3;
7697       tep->reserved1 = (tmp1 >> 26) & 0x1;
7698       tep->Entry_SR = (tmp1 >> 25) & 0x1;
7699       tep->Entry_FR = (tmp1 >> 21) & 0xf;
7700       tep->Entry_GR = (tmp1 >> 16) & 0x1f;
7701       tep->Args_stored = (tmp1 >> 15) & 0x1;
7702       tep->Variable_Frame = (tmp1 >> 14) & 0x1;
7703       tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
7704       tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
7705       tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
7706       tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
7707       tep->Ada_Region = (tmp1 >> 9) & 0x1;
7708       tep->cxx_info = (tmp1 >> 8) & 0x1;
7709       tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
7710       tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
7711       tep->reserved2 = (tmp1 >> 5) & 0x1;
7712       tep->Save_SP = (tmp1 >> 4) & 0x1;
7713       tep->Save_RP = (tmp1 >> 3) & 0x1;
7714       tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
7715       tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
7716       tep->Cleanup_defined = tmp1 & 0x1;
7717
7718       tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
7719       tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
7720       tep->Large_frame = (tmp2 >> 29) & 0x1;
7721       tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
7722       tep->reserved4 = (tmp2 >> 27) & 0x1;
7723       tep->Total_frame_size = tmp2 & 0x7ffffff;
7724     }
7725   free (table);
7726
7727   /* Third, apply any relocations to the unwind table.  */
7728   for (relsec = section_headers;
7729        relsec < section_headers + elf_header.e_shnum;
7730        ++relsec)
7731     {
7732       if (relsec->sh_type != SHT_RELA
7733           || relsec->sh_info >= elf_header.e_shnum
7734           || section_headers + relsec->sh_info != sec)
7735         continue;
7736
7737       if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7738                               & rela, & nrelas))
7739         return 0;
7740
7741       for (rp = rela; rp < rela + nrelas; ++rp)
7742         {
7743           relname = elf_hppa_reloc_type (get_reloc_type (rp->r_info));
7744           sym = aux->symtab + get_reloc_symindex (rp->r_info);
7745
7746           /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64.  */
7747           if (! const_strneq (relname, "R_PARISC_SEGREL"))
7748             {
7749               warn (_("Skipping unexpected relocation type %s\n"), relname);
7750               continue;
7751             }
7752
7753           i = rp->r_offset / unw_ent_size;
7754
7755           switch ((rp->r_offset % unw_ent_size) / eh_addr_size)
7756             {
7757             case 0:
7758               aux->table[i].start.section = sym->st_shndx;
7759               aux->table[i].start.offset  = sym->st_value + rp->r_addend;
7760               break;
7761             case 1:
7762               aux->table[i].end.section   = sym->st_shndx;
7763               aux->table[i].end.offset    = sym->st_value + rp->r_addend;
7764               break;
7765             default:
7766               break;
7767             }
7768         }
7769
7770       free (rela);
7771     }
7772
7773   aux->table_len = nentries;
7774
7775   return 1;
7776 }
7777
7778 static void
7779 hppa_process_unwind (FILE * file)
7780 {
7781   struct hppa_unw_aux_info aux;
7782   Elf_Internal_Shdr * unwsec = NULL;
7783   Elf_Internal_Shdr * strsec;
7784   Elf_Internal_Shdr * sec;
7785   unsigned long i;
7786
7787   if (string_table == NULL)
7788     return;
7789
7790   memset (& aux, 0, sizeof (aux));
7791
7792   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7793     {
7794       if (sec->sh_type == SHT_SYMTAB
7795           && sec->sh_link < elf_header.e_shnum)
7796         {
7797           aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
7798
7799           strsec = section_headers + sec->sh_link;
7800           if (aux.strtab != NULL)
7801             {
7802               error (_("Multiple auxillary string tables encountered\n"));
7803               free (aux.strtab);
7804             }
7805           aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
7806                                           1, strsec->sh_size,
7807                                           _("string table"));
7808           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7809         }
7810       else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
7811         unwsec = sec;
7812     }
7813
7814   if (!unwsec)
7815     printf (_("\nThere are no unwind sections in this file.\n"));
7816
7817   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7818     {
7819       if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
7820         {
7821           printf (_("\nUnwind section '%s' at offset 0x%lx contains %lu entries:\n"),
7822                   printable_section_name (sec),
7823                   (unsigned long) sec->sh_offset,
7824                   (unsigned long) (sec->sh_size / (2 * eh_addr_size + 8)));
7825
7826           slurp_hppa_unwind_table (file, &aux, sec);
7827           if (aux.table_len > 0)
7828             dump_hppa_unwind (&aux);
7829
7830           if (aux.table)
7831             free ((char *) aux.table);
7832           aux.table = NULL;
7833         }
7834     }
7835
7836   if (aux.symtab)
7837     free (aux.symtab);
7838   if (aux.strtab)
7839     free ((char *) aux.strtab);
7840 }
7841
7842 struct arm_section
7843 {
7844   unsigned char *      data;            /* The unwind data.  */
7845   Elf_Internal_Shdr *  sec;             /* The cached unwind section header.  */
7846   Elf_Internal_Rela *  rela;            /* The cached relocations for this section.  */
7847   unsigned long        nrelas;          /* The number of relocations.  */
7848   unsigned int         rel_type;        /* REL or RELA ?  */
7849   Elf_Internal_Rela *  next_rela;       /* Cyclic pointer to the next reloc to process.  */
7850 };
7851
7852 struct arm_unw_aux_info
7853 {
7854   FILE *              file;             /* The file containing the unwind sections.  */
7855   Elf_Internal_Sym *  symtab;           /* The file's symbol table.  */
7856   unsigned long       nsyms;            /* Number of symbols.  */
7857   Elf_Internal_Sym *  funtab;           /* Sorted table of STT_FUNC symbols.  */
7858   unsigned long       nfuns;            /* Number of these symbols.  */
7859   char *              strtab;           /* The file's string table.  */
7860   unsigned long       strtab_size;      /* Size of string table.  */
7861 };
7862
7863 static const char *
7864 arm_print_vma_and_name (struct arm_unw_aux_info *aux,
7865                         bfd_vma fn, struct absaddr addr)
7866 {
7867   const char *procname;
7868   bfd_vma sym_offset;
7869
7870   if (addr.section == SHN_UNDEF)
7871     addr.offset = fn;
7872
7873   find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
7874                            aux->strtab_size, addr, &procname,
7875                            &sym_offset);
7876
7877   print_vma (fn, PREFIX_HEX);
7878
7879   if (procname)
7880     {
7881       fputs (" <", stdout);
7882       fputs (procname, stdout);
7883
7884       if (sym_offset)
7885         printf ("+0x%lx", (unsigned long) sym_offset);
7886       fputc ('>', stdout);
7887     }
7888
7889   return procname;
7890 }
7891
7892 static void
7893 arm_free_section (struct arm_section *arm_sec)
7894 {
7895   if (arm_sec->data != NULL)
7896     free (arm_sec->data);
7897
7898   if (arm_sec->rela != NULL)
7899     free (arm_sec->rela);
7900 }
7901
7902 /* 1) If SEC does not match the one cached in ARM_SEC, then free the current
7903       cached section and install SEC instead.
7904    2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
7905       and return its valued in * WORDP, relocating if necessary.
7906    3) Update the NEXT_RELA field in ARM_SEC and store the section index and
7907       relocation's offset in ADDR.
7908    4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
7909       into the string table of the symbol associated with the reloc.  If no
7910       reloc was applied store -1 there.
7911    5) Return TRUE upon success, FALSE otherwise.  */
7912
7913 static bfd_boolean
7914 get_unwind_section_word (struct arm_unw_aux_info *  aux,
7915                          struct arm_section *       arm_sec,
7916                          Elf_Internal_Shdr *        sec,
7917                          bfd_vma                    word_offset,
7918                          unsigned int *             wordp,
7919                          struct absaddr *           addr,
7920                          bfd_vma *                  sym_name)
7921 {
7922   Elf_Internal_Rela *rp;
7923   Elf_Internal_Sym *sym;
7924   const char * relname;
7925   unsigned int word;
7926   bfd_boolean wrapped;
7927
7928   if (sec == NULL || arm_sec == NULL)
7929     return FALSE;
7930
7931   addr->section = SHN_UNDEF;
7932   addr->offset = 0;
7933
7934   if (sym_name != NULL)
7935     *sym_name = (bfd_vma) -1;
7936
7937   /* If necessary, update the section cache.  */
7938   if (sec != arm_sec->sec)
7939     {
7940       Elf_Internal_Shdr *relsec;
7941
7942       arm_free_section (arm_sec);
7943
7944       arm_sec->sec = sec;
7945       arm_sec->data = get_data (NULL, aux->file, sec->sh_offset, 1,
7946                                 sec->sh_size, _("unwind data"));
7947       arm_sec->rela = NULL;
7948       arm_sec->nrelas = 0;
7949
7950       for (relsec = section_headers;
7951            relsec < section_headers + elf_header.e_shnum;
7952            ++relsec)
7953         {
7954           if (relsec->sh_info >= elf_header.e_shnum
7955               || section_headers + relsec->sh_info != sec
7956               /* PR 15745: Check the section type as well.  */
7957               || (relsec->sh_type != SHT_REL
7958                   && relsec->sh_type != SHT_RELA))
7959             continue;
7960
7961           arm_sec->rel_type = relsec->sh_type;
7962           if (relsec->sh_type == SHT_REL)
7963             {
7964               if (!slurp_rel_relocs (aux->file, relsec->sh_offset,
7965                                      relsec->sh_size,
7966                                      & arm_sec->rela, & arm_sec->nrelas))
7967                 return FALSE;
7968             }
7969           else /* relsec->sh_type == SHT_RELA */
7970             {
7971               if (!slurp_rela_relocs (aux->file, relsec->sh_offset,
7972                                       relsec->sh_size,
7973                                       & arm_sec->rela, & arm_sec->nrelas))
7974                 return FALSE;
7975             }
7976           break;
7977         }
7978
7979       arm_sec->next_rela = arm_sec->rela;
7980     }
7981
7982   /* If there is no unwind data we can do nothing.  */
7983   if (arm_sec->data == NULL)
7984     return FALSE;
7985
7986   /* If the offset is invalid then fail.  */
7987   if (word_offset > (sec->sh_size - 4)
7988       /* PR 18879 */
7989       || (sec->sh_size < 5 && word_offset >= sec->sh_size)
7990       || ((bfd_signed_vma) word_offset) < 0)
7991     return FALSE;
7992
7993   /* Get the word at the required offset.  */
7994   word = byte_get (arm_sec->data + word_offset, 4);
7995
7996   /* PR 17531: file: id:000001,src:001266+003044,op:splice,rep:128.  */
7997   if (arm_sec->rela == NULL)
7998     {
7999       * wordp = word;
8000       return TRUE;
8001     }
8002
8003   /* Look through the relocs to find the one that applies to the provided offset.  */
8004   wrapped = FALSE;
8005   for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
8006     {
8007       bfd_vma prelval, offset;
8008
8009       if (rp->r_offset > word_offset && !wrapped)
8010         {
8011           rp = arm_sec->rela;
8012           wrapped = TRUE;
8013         }
8014       if (rp->r_offset > word_offset)
8015         break;
8016
8017       if (rp->r_offset & 3)
8018         {
8019           warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
8020                 (unsigned long) rp->r_offset);
8021           continue;
8022         }
8023
8024       if (rp->r_offset < word_offset)
8025         continue;
8026
8027       /* PR 17531: file: 027-161405-0.004  */
8028       if (aux->symtab == NULL)
8029         continue;
8030
8031       if (arm_sec->rel_type == SHT_REL)
8032         {
8033           offset = word & 0x7fffffff;
8034           if (offset & 0x40000000)
8035             offset |= ~ (bfd_vma) 0x7fffffff;
8036         }
8037       else if (arm_sec->rel_type == SHT_RELA)
8038         offset = rp->r_addend;
8039       else
8040         {
8041           error (_("Unknown section relocation type %d encountered\n"),
8042                  arm_sec->rel_type);
8043           break;
8044         }
8045
8046       /* PR 17531 file: 027-1241568-0.004.  */
8047       if (ELF32_R_SYM (rp->r_info) >= aux->nsyms)
8048         {
8049           error (_("Bad symbol index in unwind relocation (%lu > %lu)\n"),
8050                  (unsigned long) ELF32_R_SYM (rp->r_info), aux->nsyms);
8051           break;
8052         }
8053
8054       sym = aux->symtab + ELF32_R_SYM (rp->r_info);
8055       offset += sym->st_value;
8056       prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
8057
8058       /* Check that we are processing the expected reloc type.  */
8059       if (elf_header.e_machine == EM_ARM)
8060         {
8061           relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
8062           if (relname == NULL)
8063             {
8064               warn (_("Skipping unknown ARM relocation type: %d\n"),
8065                     (int) ELF32_R_TYPE (rp->r_info));
8066               continue;
8067             }
8068
8069           if (streq (relname, "R_ARM_NONE"))
8070               continue;
8071
8072           if (! streq (relname, "R_ARM_PREL31"))
8073             {
8074               warn (_("Skipping unexpected ARM relocation type %s\n"), relname);
8075               continue;
8076             }
8077         }
8078       else if (elf_header.e_machine == EM_TI_C6000)
8079         {
8080           relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
8081           if (relname == NULL)
8082             {
8083               warn (_("Skipping unknown C6000 relocation type: %d\n"),
8084                     (int) ELF32_R_TYPE (rp->r_info));
8085               continue;
8086             }
8087
8088           if (streq (relname, "R_C6000_NONE"))
8089             continue;
8090
8091           if (! streq (relname, "R_C6000_PREL31"))
8092             {
8093               warn (_("Skipping unexpected C6000 relocation type %s\n"), relname);
8094               continue;
8095             }
8096
8097           prelval >>= 1;
8098         }
8099       else
8100         {
8101           /* This function currently only supports ARM and TI unwinders.  */
8102           warn (_("Only TI and ARM unwinders are currently supported\n"));
8103           break;
8104         }
8105
8106       word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
8107       addr->section = sym->st_shndx;
8108       addr->offset = offset;
8109
8110       if (sym_name)
8111         * sym_name = sym->st_name;
8112       break;
8113     }
8114
8115   *wordp = word;
8116   arm_sec->next_rela = rp;
8117
8118   return TRUE;
8119 }
8120
8121 static const char *tic6x_unwind_regnames[16] =
8122 {
8123   "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
8124   "A14", "A13", "A12", "A11", "A10",
8125   "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
8126 };
8127
8128 static void
8129 decode_tic6x_unwind_regmask (unsigned int mask)
8130 {
8131   int i;
8132
8133   for (i = 12; mask; mask >>= 1, i--)
8134     {
8135       if (mask & 1)
8136         {
8137           fputs (tic6x_unwind_regnames[i], stdout);
8138           if (mask > 1)
8139             fputs (", ", stdout);
8140         }
8141     }
8142 }
8143
8144 #define ADVANCE                                                 \
8145   if (remaining == 0 && more_words)                             \
8146     {                                                           \
8147       data_offset += 4;                                         \
8148       if (! get_unwind_section_word (aux, data_arm_sec, data_sec,       \
8149                                      data_offset, & word, & addr, NULL))        \
8150         return;                                                 \
8151       remaining = 4;                                            \
8152       more_words--;                                             \
8153     }                                                           \
8154
8155 #define GET_OP(OP)                      \
8156   ADVANCE;                              \
8157   if (remaining)                        \
8158     {                                   \
8159       remaining--;                      \
8160       (OP) = word >> 24;                \
8161       word <<= 8;                       \
8162     }                                   \
8163   else                                  \
8164     {                                   \
8165       printf (_("[Truncated opcode]\n"));       \
8166       return;                           \
8167     }                                   \
8168   printf ("0x%02x ", OP)
8169
8170 static void
8171 decode_arm_unwind_bytecode (struct arm_unw_aux_info *  aux,
8172                             unsigned int               word,
8173                             unsigned int               remaining,
8174                             unsigned int               more_words,
8175                             bfd_vma                    data_offset,
8176                             Elf_Internal_Shdr *        data_sec,
8177                             struct arm_section *       data_arm_sec)
8178 {
8179   struct absaddr addr;
8180
8181   /* Decode the unwinding instructions.  */
8182   while (1)
8183     {
8184       unsigned int op, op2;
8185
8186       ADVANCE;
8187       if (remaining == 0)
8188         break;
8189       remaining--;
8190       op = word >> 24;
8191       word <<= 8;
8192
8193       printf ("  0x%02x ", op);
8194
8195       if ((op & 0xc0) == 0x00)
8196         {
8197           int offset = ((op & 0x3f) << 2) + 4;
8198
8199           printf ("     vsp = vsp + %d", offset);
8200         }
8201       else if ((op & 0xc0) == 0x40)
8202         {
8203           int offset = ((op & 0x3f) << 2) + 4;
8204
8205           printf ("     vsp = vsp - %d", offset);
8206         }
8207       else if ((op & 0xf0) == 0x80)
8208         {
8209           GET_OP (op2);
8210           if (op == 0x80 && op2 == 0)
8211             printf (_("Refuse to unwind"));
8212           else
8213             {
8214               unsigned int mask = ((op & 0x0f) << 8) | op2;
8215               int first = 1;
8216               int i;
8217
8218               printf ("pop {");
8219               for (i = 0; i < 12; i++)
8220                 if (mask & (1 << i))
8221                   {
8222                     if (first)
8223                       first = 0;
8224                     else
8225                       printf (", ");
8226                     printf ("r%d", 4 + i);
8227                   }
8228               printf ("}");
8229             }
8230         }
8231       else if ((op & 0xf0) == 0x90)
8232         {
8233           if (op == 0x9d || op == 0x9f)
8234             printf (_("     [Reserved]"));
8235           else
8236             printf ("     vsp = r%d", op & 0x0f);
8237         }
8238       else if ((op & 0xf0) == 0xa0)
8239         {
8240           int end = 4 + (op & 0x07);
8241           int first = 1;
8242           int i;
8243
8244           printf ("     pop {");
8245           for (i = 4; i <= end; i++)
8246             {
8247               if (first)
8248                 first = 0;
8249               else
8250                 printf (", ");
8251               printf ("r%d", i);
8252             }
8253           if (op & 0x08)
8254             {
8255               if (!first)
8256                 printf (", ");
8257               printf ("r14");
8258             }
8259           printf ("}");
8260         }
8261       else if (op == 0xb0)
8262         printf (_("     finish"));
8263       else if (op == 0xb1)
8264         {
8265           GET_OP (op2);
8266           if (op2 == 0 || (op2 & 0xf0) != 0)
8267             printf (_("[Spare]"));
8268           else
8269             {
8270               unsigned int mask = op2 & 0x0f;
8271               int first = 1;
8272               int i;
8273
8274               printf ("pop {");
8275               for (i = 0; i < 12; i++)
8276                 if (mask & (1 << i))
8277                   {
8278                     if (first)
8279                       first = 0;
8280                     else
8281                       printf (", ");
8282                     printf ("r%d", i);
8283                   }
8284               printf ("}");
8285             }
8286         }
8287       else if (op == 0xb2)
8288         {
8289           unsigned char buf[9];
8290           unsigned int i, len;
8291           unsigned long offset;
8292
8293           for (i = 0; i < sizeof (buf); i++)
8294             {
8295               GET_OP (buf[i]);
8296               if ((buf[i] & 0x80) == 0)
8297                 break;
8298             }
8299           if (i == sizeof (buf))
8300             printf (_("corrupt change to vsp"));
8301           else
8302             {
8303               offset = read_uleb128 (buf, &len, buf + i + 1);
8304               assert (len == i + 1);
8305               offset = offset * 4 + 0x204;
8306               printf ("vsp = vsp + %ld", offset);
8307             }
8308         }
8309       else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
8310         {
8311           unsigned int first, last;
8312
8313           GET_OP (op2);
8314           first = op2 >> 4;
8315           last = op2 & 0x0f;
8316           if (op == 0xc8)
8317             first = first + 16;
8318           printf ("pop {D%d", first);
8319           if (last)
8320             printf ("-D%d", first + last);
8321           printf ("}");
8322         }
8323       else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
8324         {
8325           unsigned int count = op & 0x07;
8326
8327           printf ("pop {D8");
8328           if (count)
8329             printf ("-D%d", 8 + count);
8330           printf ("}");
8331         }
8332       else if (op >= 0xc0 && op <= 0xc5)
8333         {
8334           unsigned int count = op & 0x07;
8335
8336           printf ("     pop {wR10");
8337           if (count)
8338             printf ("-wR%d", 10 + count);
8339           printf ("}");
8340         }
8341       else if (op == 0xc6)
8342         {
8343           unsigned int first, last;
8344
8345           GET_OP (op2);
8346           first = op2 >> 4;
8347           last = op2 & 0x0f;
8348           printf ("pop {wR%d", first);
8349           if (last)
8350             printf ("-wR%d", first + last);
8351           printf ("}");
8352         }
8353       else if (op == 0xc7)
8354         {
8355           GET_OP (op2);
8356           if (op2 == 0 || (op2 & 0xf0) != 0)
8357             printf (_("[Spare]"));
8358           else
8359             {
8360               unsigned int mask = op2 & 0x0f;
8361               int first = 1;
8362               int i;
8363
8364               printf ("pop {");
8365               for (i = 0; i < 4; i++)
8366                 if (mask & (1 << i))
8367                   {
8368                     if (first)
8369                       first = 0;
8370                     else
8371                       printf (", ");
8372                     printf ("wCGR%d", i);
8373                   }
8374               printf ("}");
8375             }
8376         }
8377       else
8378         printf (_("     [unsupported opcode]"));
8379       printf ("\n");
8380     }
8381 }
8382
8383 static void
8384 decode_tic6x_unwind_bytecode (struct arm_unw_aux_info *  aux,
8385                               unsigned int               word,
8386                               unsigned int               remaining,
8387                               unsigned int               more_words,
8388                               bfd_vma                    data_offset,
8389                               Elf_Internal_Shdr *        data_sec,
8390                               struct arm_section *       data_arm_sec)
8391 {
8392   struct absaddr addr;
8393
8394   /* Decode the unwinding instructions.  */
8395   while (1)
8396     {
8397       unsigned int op, op2;
8398
8399       ADVANCE;
8400       if (remaining == 0)
8401         break;
8402       remaining--;
8403       op = word >> 24;
8404       word <<= 8;
8405
8406       printf ("  0x%02x ", op);
8407
8408       if ((op & 0xc0) == 0x00)
8409         {
8410           int offset = ((op & 0x3f) << 3) + 8;
8411           printf ("     sp = sp + %d", offset);
8412         }
8413       else if ((op & 0xc0) == 0x80)
8414         {
8415           GET_OP (op2);
8416           if (op == 0x80 && op2 == 0)
8417             printf (_("Refuse to unwind"));
8418           else
8419             {
8420               unsigned int mask = ((op & 0x1f) << 8) | op2;
8421               if (op & 0x20)
8422                 printf ("pop compact {");
8423               else
8424                 printf ("pop {");
8425
8426               decode_tic6x_unwind_regmask (mask);
8427               printf("}");
8428             }
8429         }
8430       else if ((op & 0xf0) == 0xc0)
8431         {
8432           unsigned int reg;
8433           unsigned int nregs;
8434           unsigned int i;
8435           const char *name;
8436           struct
8437           {
8438               unsigned int offset;
8439               unsigned int reg;
8440           } regpos[16];
8441
8442           /* Scan entire instruction first so that GET_OP output is not
8443              interleaved with disassembly.  */
8444           nregs = 0;
8445           for (i = 0; nregs < (op & 0xf); i++)
8446             {
8447               GET_OP (op2);
8448               reg = op2 >> 4;
8449               if (reg != 0xf)
8450                 {
8451                   regpos[nregs].offset = i * 2;
8452                   regpos[nregs].reg = reg;
8453                   nregs++;
8454                 }
8455
8456               reg = op2 & 0xf;
8457               if (reg != 0xf)
8458                 {
8459                   regpos[nregs].offset = i * 2 + 1;
8460                   regpos[nregs].reg = reg;
8461                   nregs++;
8462                 }
8463             }
8464
8465           printf (_("pop frame {"));
8466           reg = nregs - 1;
8467           for (i = i * 2; i > 0; i--)
8468             {
8469               if (regpos[reg].offset == i - 1)
8470                 {
8471                   name = tic6x_unwind_regnames[regpos[reg].reg];
8472                   if (reg > 0)
8473                     reg--;
8474                 }
8475               else
8476                 name = _("[pad]");
8477
8478               fputs (name, stdout);
8479               if (i > 1)
8480                 printf (", ");
8481             }
8482
8483           printf ("}");
8484         }
8485       else if (op == 0xd0)
8486         printf ("     MOV FP, SP");
8487       else if (op == 0xd1)
8488         printf ("     __c6xabi_pop_rts");
8489       else if (op == 0xd2)
8490         {
8491           unsigned char buf[9];
8492           unsigned int i, len;
8493           unsigned long offset;
8494
8495           for (i = 0; i < sizeof (buf); i++)
8496             {
8497               GET_OP (buf[i]);
8498               if ((buf[i] & 0x80) == 0)
8499                 break;
8500             }
8501           /* PR 17531: file: id:000001,src:001906+004739,op:splice,rep:2.  */
8502           if (i == sizeof (buf))
8503             {
8504               printf ("<corrupt sp adjust>\n");
8505               warn (_("Corrupt stack pointer adjustment detected\n"));
8506               return;
8507             }
8508
8509           offset = read_uleb128 (buf, &len, buf + i + 1);
8510           assert (len == i + 1);
8511           offset = offset * 8 + 0x408;
8512           printf (_("sp = sp + %ld"), offset);
8513         }
8514       else if ((op & 0xf0) == 0xe0)
8515         {
8516           if ((op & 0x0f) == 7)
8517             printf ("     RETURN");
8518           else
8519             printf ("     MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
8520         }
8521       else
8522         {
8523           printf (_("     [unsupported opcode]"));
8524         }
8525       putchar ('\n');
8526     }
8527 }
8528
8529 static bfd_vma
8530 arm_expand_prel31 (bfd_vma word, bfd_vma where)
8531 {
8532   bfd_vma offset;
8533
8534   offset = word & 0x7fffffff;
8535   if (offset & 0x40000000)
8536     offset |= ~ (bfd_vma) 0x7fffffff;
8537
8538   if (elf_header.e_machine == EM_TI_C6000)
8539     offset <<= 1;
8540
8541   return offset + where;
8542 }
8543
8544 static void
8545 decode_arm_unwind (struct arm_unw_aux_info *  aux,
8546                    unsigned int               word,
8547                    unsigned int               remaining,
8548                    bfd_vma                    data_offset,
8549                    Elf_Internal_Shdr *        data_sec,
8550                    struct arm_section *       data_arm_sec)
8551 {
8552   int per_index;
8553   unsigned int more_words = 0;
8554   struct absaddr addr;
8555   bfd_vma sym_name = (bfd_vma) -1;
8556
8557   if (remaining == 0)
8558     {
8559       /* Fetch the first word.
8560          Note - when decoding an object file the address extracted
8561          here will always be 0.  So we also pass in the sym_name
8562          parameter so that we can find the symbol associated with
8563          the personality routine.  */
8564       if (! get_unwind_section_word (aux, data_arm_sec, data_sec, data_offset,
8565                                      & word, & addr, & sym_name))
8566         return;
8567
8568       remaining = 4;
8569     }
8570
8571   if ((word & 0x80000000) == 0)
8572     {
8573       /* Expand prel31 for personality routine.  */
8574       bfd_vma fn;
8575       const char *procname;
8576
8577       fn = arm_expand_prel31 (word, data_sec->sh_addr + data_offset);
8578       printf (_("  Personality routine: "));
8579       if (fn == 0
8580           && addr.section == SHN_UNDEF && addr.offset == 0
8581           && sym_name != (bfd_vma) -1 && sym_name < aux->strtab_size)
8582         {
8583           procname = aux->strtab + sym_name;
8584           print_vma (fn, PREFIX_HEX);
8585           if (procname)
8586             {
8587               fputs (" <", stdout);
8588               fputs (procname, stdout);
8589               fputc ('>', stdout);
8590             }
8591         }
8592       else
8593         procname = arm_print_vma_and_name (aux, fn, addr);
8594       fputc ('\n', stdout);
8595
8596       /* The GCC personality routines use the standard compact
8597          encoding, starting with one byte giving the number of
8598          words.  */
8599       if (procname != NULL
8600           && (const_strneq (procname, "__gcc_personality_v0")
8601               || const_strneq (procname, "__gxx_personality_v0")
8602               || const_strneq (procname, "__gcj_personality_v0")
8603               || const_strneq (procname, "__gnu_objc_personality_v0")))
8604         {
8605           remaining = 0;
8606           more_words = 1;
8607           ADVANCE;
8608           if (!remaining)
8609             {
8610               printf (_("  [Truncated data]\n"));
8611               return;
8612             }
8613           more_words = word >> 24;
8614           word <<= 8;
8615           remaining--;
8616           per_index = -1;
8617         }
8618       else
8619         return;
8620     }
8621   else
8622     {
8623       /* ARM EHABI Section 6.3:
8624
8625          An exception-handling table entry for the compact model looks like:
8626
8627            31 30-28 27-24 23-0
8628            -- ----- ----- ----
8629             1   0   index Data for personalityRoutine[index]    */
8630
8631       if (elf_header.e_machine == EM_ARM
8632           && (word & 0x70000000))
8633         warn (_("Corrupt ARM compact model table entry: %x \n"), word);
8634
8635       per_index = (word >> 24) & 0x7f;
8636       printf (_("  Compact model index: %d\n"), per_index);
8637       if (per_index == 0)
8638         {
8639           more_words = 0;
8640           word <<= 8;
8641           remaining--;
8642         }
8643       else if (per_index < 3)
8644         {
8645           more_words = (word >> 16) & 0xff;
8646           word <<= 16;
8647           remaining -= 2;
8648         }
8649     }
8650
8651   switch (elf_header.e_machine)
8652     {
8653     case EM_ARM:
8654       if (per_index < 3)
8655         {
8656           decode_arm_unwind_bytecode (aux, word, remaining, more_words,
8657                                       data_offset, data_sec, data_arm_sec);
8658         }
8659       else
8660         {
8661           warn (_("Unknown ARM compact model index encountered\n"));
8662           printf (_("  [reserved]\n"));
8663         }
8664       break;
8665
8666     case EM_TI_C6000:
8667       if (per_index < 3)
8668         {
8669           decode_tic6x_unwind_bytecode (aux, word, remaining, more_words,
8670                                         data_offset, data_sec, data_arm_sec);
8671         }
8672       else if (per_index < 5)
8673         {
8674           if (((word >> 17) & 0x7f) == 0x7f)
8675             printf (_("  Restore stack from frame pointer\n"));
8676           else
8677             printf (_("  Stack increment %d\n"), (word >> 14) & 0x1fc);
8678           printf (_("  Registers restored: "));
8679           if (per_index == 4)
8680             printf (" (compact) ");
8681           decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
8682           putchar ('\n');
8683           printf (_("  Return register: %s\n"),
8684                   tic6x_unwind_regnames[word & 0xf]);
8685         }
8686       else
8687         printf (_("  [reserved (%d)]\n"), per_index);
8688       break;
8689
8690     default:
8691       error (_("Unsupported architecture type %d encountered when decoding unwind table\n"),
8692              elf_header.e_machine);
8693     }
8694
8695   /* Decode the descriptors.  Not implemented.  */
8696 }
8697
8698 static void
8699 dump_arm_unwind (struct arm_unw_aux_info *aux, Elf_Internal_Shdr *exidx_sec)
8700 {
8701   struct arm_section exidx_arm_sec, extab_arm_sec;
8702   unsigned int i, exidx_len;
8703   unsigned long j, nfuns;
8704
8705   memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
8706   memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
8707   exidx_len = exidx_sec->sh_size / 8;
8708
8709   aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
8710   for (nfuns = 0, j = 0; j < aux->nsyms; j++)
8711     if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
8712       aux->funtab[nfuns++] = aux->symtab[j];
8713   aux->nfuns = nfuns;
8714   qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
8715
8716   for (i = 0; i < exidx_len; i++)
8717     {
8718       unsigned int exidx_fn, exidx_entry;
8719       struct absaddr fn_addr, entry_addr;
8720       bfd_vma fn;
8721
8722       fputc ('\n', stdout);
8723
8724       if (! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
8725                                      8 * i, & exidx_fn, & fn_addr, NULL)
8726           || ! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
8727                                         8 * i + 4, & exidx_entry, & entry_addr, NULL))
8728         {
8729           free (aux->funtab);
8730           arm_free_section (& exidx_arm_sec);
8731           arm_free_section (& extab_arm_sec);
8732           return;
8733         }
8734
8735       /* ARM EHABI, Section 5:
8736          An index table entry consists of 2 words.
8737          The first word contains a prel31 offset to the start of a function, with bit 31 clear.  */
8738       if (exidx_fn & 0x80000000)
8739         warn (_("corrupt index table entry: %x\n"), exidx_fn);
8740
8741       fn = arm_expand_prel31 (exidx_fn, exidx_sec->sh_addr + 8 * i);
8742
8743       arm_print_vma_and_name (aux, fn, fn_addr);
8744       fputs (": ", stdout);
8745
8746       if (exidx_entry == 1)
8747         {
8748           print_vma (exidx_entry, PREFIX_HEX);
8749           fputs (" [cantunwind]\n", stdout);
8750         }
8751       else if (exidx_entry & 0x80000000)
8752         {
8753           print_vma (exidx_entry, PREFIX_HEX);
8754           fputc ('\n', stdout);
8755           decode_arm_unwind (aux, exidx_entry, 4, 0, NULL, NULL);
8756         }
8757       else
8758         {
8759           bfd_vma table, table_offset = 0;
8760           Elf_Internal_Shdr *table_sec;
8761
8762           fputs ("@", stdout);
8763           table = arm_expand_prel31 (exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
8764           print_vma (table, PREFIX_HEX);
8765           printf ("\n");
8766
8767           /* Locate the matching .ARM.extab.  */
8768           if (entry_addr.section != SHN_UNDEF
8769               && entry_addr.section < elf_header.e_shnum)
8770             {
8771               table_sec = section_headers + entry_addr.section;
8772               table_offset = entry_addr.offset;
8773               /* PR 18879 */
8774               if (table_offset > table_sec->sh_size
8775                   || ((bfd_signed_vma) table_offset) < 0)
8776                 {
8777                   warn (_("Unwind entry contains corrupt offset (0x%lx) into section %s\n"),
8778                         (unsigned long) table_offset,
8779                         printable_section_name (table_sec));
8780                   continue;
8781                 }
8782             }
8783           else
8784             {
8785               table_sec = find_section_by_address (table);
8786               if (table_sec != NULL)
8787                 table_offset = table - table_sec->sh_addr;
8788             }
8789           if (table_sec == NULL)
8790             {
8791               warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
8792                     (unsigned long) table);
8793               continue;
8794             }
8795           decode_arm_unwind (aux, 0, 0, table_offset, table_sec,
8796                              &extab_arm_sec);
8797         }
8798     }
8799
8800   printf ("\n");
8801
8802   free (aux->funtab);
8803   arm_free_section (&exidx_arm_sec);
8804   arm_free_section (&extab_arm_sec);
8805 }
8806
8807 /* Used for both ARM and C6X unwinding tables.  */
8808
8809 static void
8810 arm_process_unwind (FILE *file)
8811 {
8812   struct arm_unw_aux_info aux;
8813   Elf_Internal_Shdr *unwsec = NULL;
8814   Elf_Internal_Shdr *strsec;
8815   Elf_Internal_Shdr *sec;
8816   unsigned long i;
8817   unsigned int sec_type;
8818
8819   switch (elf_header.e_machine)
8820     {
8821     case EM_ARM:
8822       sec_type = SHT_ARM_EXIDX;
8823       break;
8824
8825     case EM_TI_C6000:
8826       sec_type = SHT_C6000_UNWIND;
8827       break;
8828
8829     default:
8830       error (_("Unsupported architecture type %d encountered when processing unwind table\n"),
8831              elf_header.e_machine);
8832       return;
8833     }
8834
8835   if (string_table == NULL)
8836     return;
8837
8838   memset (& aux, 0, sizeof (aux));
8839   aux.file = file;
8840
8841   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
8842     {
8843       if (sec->sh_type == SHT_SYMTAB && sec->sh_link < elf_header.e_shnum)
8844         {
8845           aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
8846
8847           strsec = section_headers + sec->sh_link;
8848
8849           /* PR binutils/17531 file: 011-12666-0.004.  */
8850           if (aux.strtab != NULL)
8851             {
8852               error (_("Multiple string tables found in file.\n"));
8853               free (aux.strtab);
8854             }
8855           aux.strtab = get_data (NULL, file, strsec->sh_offset,
8856                                  1, strsec->sh_size, _("string table"));
8857           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
8858         }
8859       else if (sec->sh_type == sec_type)
8860         unwsec = sec;
8861     }
8862
8863   if (unwsec == NULL)
8864     printf (_("\nThere are no unwind sections in this file.\n"));
8865   else
8866     for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
8867       {
8868         if (sec->sh_type == sec_type)
8869           {
8870             printf (_("\nUnwind table index '%s' at offset 0x%lx contains %lu entries:\n"),
8871                     printable_section_name (sec),
8872                     (unsigned long) sec->sh_offset,
8873                     (unsigned long) (sec->sh_size / (2 * eh_addr_size)));
8874
8875             dump_arm_unwind (&aux, sec);
8876           }
8877       }
8878
8879   if (aux.symtab)
8880     free (aux.symtab);
8881   if (aux.strtab)
8882     free ((char *) aux.strtab);
8883 }
8884
8885 static void
8886 process_unwind (FILE * file)
8887 {
8888   struct unwind_handler
8889   {
8890     int machtype;
8891     void (* handler)(FILE *);
8892   } handlers[] =
8893   {
8894     { EM_ARM, arm_process_unwind },
8895     { EM_IA_64, ia64_process_unwind },
8896     { EM_PARISC, hppa_process_unwind },
8897     { EM_TI_C6000, arm_process_unwind },
8898     { 0, 0 }
8899   };
8900   int i;
8901
8902   if (!do_unwind)
8903     return;
8904
8905   for (i = 0; handlers[i].handler != NULL; i++)
8906     if (elf_header.e_machine == handlers[i].machtype)
8907       {
8908         handlers[i].handler (file);
8909         return;
8910       }
8911
8912   printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
8913           get_machine_name (elf_header.e_machine));
8914 }
8915
8916 static void
8917 dynamic_section_mips_val (Elf_Internal_Dyn * entry)
8918 {
8919   switch (entry->d_tag)
8920     {
8921     case DT_MIPS_FLAGS:
8922       if (entry->d_un.d_val == 0)
8923         printf (_("NONE"));
8924       else
8925         {
8926           static const char * opts[] =
8927           {
8928             "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
8929             "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
8930             "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
8931             "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
8932             "RLD_ORDER_SAFE"
8933           };
8934           unsigned int cnt;
8935           int first = 1;
8936
8937           for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
8938             if (entry->d_un.d_val & (1 << cnt))
8939               {
8940                 printf ("%s%s", first ? "" : " ", opts[cnt]);
8941                 first = 0;
8942               }
8943         }
8944       break;
8945
8946     case DT_MIPS_IVERSION:
8947       if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
8948         printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry->d_un.d_val));
8949       else
8950         {
8951           char buf[40];
8952           sprintf_vma (buf, entry->d_un.d_ptr);
8953           /* Note: coded this way so that there is a single string for translation.  */
8954           printf (_("<corrupt: %s>"), buf);
8955         }
8956       break;
8957
8958     case DT_MIPS_TIME_STAMP:
8959       {
8960         char timebuf[128];
8961         struct tm * tmp;
8962         time_t atime = entry->d_un.d_val;
8963
8964         tmp = gmtime (&atime);
8965         /* PR 17531: file: 6accc532.  */
8966         if (tmp == NULL)
8967           snprintf (timebuf, sizeof (timebuf), _("<corrupt>"));
8968         else
8969           snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
8970                     tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
8971                     tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
8972         printf (_("Time Stamp: %s"), timebuf);
8973       }
8974       break;
8975
8976     case DT_MIPS_RLD_VERSION:
8977     case DT_MIPS_LOCAL_GOTNO:
8978     case DT_MIPS_CONFLICTNO:
8979     case DT_MIPS_LIBLISTNO:
8980     case DT_MIPS_SYMTABNO:
8981     case DT_MIPS_UNREFEXTNO:
8982     case DT_MIPS_HIPAGENO:
8983     case DT_MIPS_DELTA_CLASS_NO:
8984     case DT_MIPS_DELTA_INSTANCE_NO:
8985     case DT_MIPS_DELTA_RELOC_NO:
8986     case DT_MIPS_DELTA_SYM_NO:
8987     case DT_MIPS_DELTA_CLASSSYM_NO:
8988     case DT_MIPS_COMPACT_SIZE:
8989       print_vma (entry->d_un.d_val, DEC);
8990       break;
8991
8992     default:
8993       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8994     }
8995     putchar ('\n');
8996 }
8997
8998 static void
8999 dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
9000 {
9001   switch (entry->d_tag)
9002     {
9003     case DT_HP_DLD_FLAGS:
9004       {
9005         static struct
9006         {
9007           long int bit;
9008           const char * str;
9009         }
9010         flags[] =
9011         {
9012           { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
9013           { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
9014           { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
9015           { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
9016           { DT_HP_BIND_NOW, "HP_BIND_NOW" },
9017           { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
9018           { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
9019           { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
9020           { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
9021           { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
9022           { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
9023           { DT_HP_GST, "HP_GST" },
9024           { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
9025           { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
9026           { DT_HP_NODELETE, "HP_NODELETE" },
9027           { DT_HP_GROUP, "HP_GROUP" },
9028           { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
9029         };
9030         int first = 1;
9031         size_t cnt;
9032         bfd_vma val = entry->d_un.d_val;
9033
9034         for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
9035           if (val & flags[cnt].bit)
9036             {
9037               if (! first)
9038                 putchar (' ');
9039               fputs (flags[cnt].str, stdout);
9040               first = 0;
9041               val ^= flags[cnt].bit;
9042             }
9043
9044         if (val != 0 || first)
9045           {
9046             if (! first)
9047               putchar (' ');
9048             print_vma (val, HEX);
9049           }
9050       }
9051       break;
9052
9053     default:
9054       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9055       break;
9056     }
9057   putchar ('\n');
9058 }
9059
9060 #ifdef BFD64
9061
9062 /* VMS vs Unix time offset and factor.  */
9063
9064 #define VMS_EPOCH_OFFSET 35067168000000000LL
9065 #define VMS_GRANULARITY_FACTOR 10000000
9066
9067 /* Display a VMS time in a human readable format.  */
9068
9069 static void
9070 print_vms_time (bfd_int64_t vmstime)
9071 {
9072   struct tm *tm;
9073   time_t unxtime;
9074
9075   unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
9076   tm = gmtime (&unxtime);
9077   printf ("%04u-%02u-%02uT%02u:%02u:%02u",
9078           tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
9079           tm->tm_hour, tm->tm_min, tm->tm_sec);
9080 }
9081 #endif /* BFD64 */
9082
9083 static void
9084 dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
9085 {
9086   switch (entry->d_tag)
9087     {
9088     case DT_IA_64_PLT_RESERVE:
9089       /* First 3 slots reserved.  */
9090       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9091       printf (" -- ");
9092       print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
9093       break;
9094
9095     case DT_IA_64_VMS_LINKTIME:
9096 #ifdef BFD64
9097       print_vms_time (entry->d_un.d_val);
9098 #endif
9099       break;
9100
9101     case DT_IA_64_VMS_LNKFLAGS:
9102       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9103       if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
9104         printf (" CALL_DEBUG");
9105       if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
9106         printf (" NOP0BUFS");
9107       if (entry->d_un.d_val & VMS_LF_P0IMAGE)
9108         printf (" P0IMAGE");
9109       if (entry->d_un.d_val & VMS_LF_MKTHREADS)
9110         printf (" MKTHREADS");
9111       if (entry->d_un.d_val & VMS_LF_UPCALLS)
9112         printf (" UPCALLS");
9113       if (entry->d_un.d_val & VMS_LF_IMGSTA)
9114         printf (" IMGSTA");
9115       if (entry->d_un.d_val & VMS_LF_INITIALIZE)
9116         printf (" INITIALIZE");
9117       if (entry->d_un.d_val & VMS_LF_MAIN)
9118         printf (" MAIN");
9119       if (entry->d_un.d_val & VMS_LF_EXE_INIT)
9120         printf (" EXE_INIT");
9121       if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
9122         printf (" TBK_IN_IMG");
9123       if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
9124         printf (" DBG_IN_IMG");
9125       if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
9126         printf (" TBK_IN_DSF");
9127       if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
9128         printf (" DBG_IN_DSF");
9129       if (entry->d_un.d_val & VMS_LF_SIGNATURES)
9130         printf (" SIGNATURES");
9131       if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
9132         printf (" REL_SEG_OFF");
9133       break;
9134
9135     default:
9136       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9137       break;
9138     }
9139   putchar ('\n');
9140 }
9141
9142 static int
9143 get_32bit_dynamic_section (FILE * file)
9144 {
9145   Elf32_External_Dyn * edyn;
9146   Elf32_External_Dyn * ext;
9147   Elf_Internal_Dyn * entry;
9148
9149   edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
9150                                           dynamic_size, _("dynamic section"));
9151   if (!edyn)
9152     return 0;
9153
9154   /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9155      might not have the luxury of section headers.  Look for the DT_NULL
9156      terminator to determine the number of entries.  */
9157   for (ext = edyn, dynamic_nent = 0;
9158        (char *) (ext + 1) <= (char *) edyn + dynamic_size;
9159        ext++)
9160     {
9161       dynamic_nent++;
9162       if (BYTE_GET (ext->d_tag) == DT_NULL)
9163         break;
9164     }
9165
9166   dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9167                                                   sizeof (* entry));
9168   if (dynamic_section == NULL)
9169     {
9170       error (_("Out of memory allocating space for %lu dynamic entries\n"),
9171              (unsigned long) dynamic_nent);
9172       free (edyn);
9173       return 0;
9174     }
9175
9176   for (ext = edyn, entry = dynamic_section;
9177        entry < dynamic_section + dynamic_nent;
9178        ext++, entry++)
9179     {
9180       entry->d_tag      = BYTE_GET (ext->d_tag);
9181       entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
9182     }
9183
9184   free (edyn);
9185
9186   return 1;
9187 }
9188
9189 static int
9190 get_64bit_dynamic_section (FILE * file)
9191 {
9192   Elf64_External_Dyn * edyn;
9193   Elf64_External_Dyn * ext;
9194   Elf_Internal_Dyn * entry;
9195
9196   /* Read in the data.  */
9197   edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
9198                                           dynamic_size, _("dynamic section"));
9199   if (!edyn)
9200     return 0;
9201
9202   /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9203      might not have the luxury of section headers.  Look for the DT_NULL
9204      terminator to determine the number of entries.  */
9205   for (ext = edyn, dynamic_nent = 0;
9206        /* PR 17533 file: 033-67080-0.004 - do not read past end of buffer.  */
9207        (char *) (ext + 1) <= (char *) edyn + dynamic_size;
9208        ext++)
9209     {
9210       dynamic_nent++;
9211       if (BYTE_GET (ext->d_tag) == DT_NULL)
9212         break;
9213     }
9214
9215   dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9216                                                   sizeof (* entry));
9217   if (dynamic_section == NULL)
9218     {
9219       error (_("Out of memory allocating space for %lu dynamic entries\n"),
9220              (unsigned long) dynamic_nent);
9221       free (edyn);
9222       return 0;
9223     }
9224
9225   /* Convert from external to internal formats.  */
9226   for (ext = edyn, entry = dynamic_section;
9227        entry < dynamic_section + dynamic_nent;
9228        ext++, entry++)
9229     {
9230       entry->d_tag      = BYTE_GET (ext->d_tag);
9231       entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
9232     }
9233
9234   free (edyn);
9235
9236   return 1;
9237 }
9238
9239 static void
9240 print_dynamic_flags (bfd_vma flags)
9241 {
9242   int first = 1;
9243
9244   while (flags)
9245     {
9246       bfd_vma flag;
9247
9248       flag = flags & - flags;
9249       flags &= ~ flag;
9250
9251       if (first)
9252         first = 0;
9253       else
9254         putc (' ', stdout);
9255
9256       switch (flag)
9257         {
9258         case DF_ORIGIN:         fputs ("ORIGIN", stdout); break;
9259         case DF_SYMBOLIC:       fputs ("SYMBOLIC", stdout); break;
9260         case DF_TEXTREL:        fputs ("TEXTREL", stdout); break;
9261         case DF_BIND_NOW:       fputs ("BIND_NOW", stdout); break;
9262         case DF_STATIC_TLS:     fputs ("STATIC_TLS", stdout); break;
9263         default:                fputs (_("unknown"), stdout); break;
9264         }
9265     }
9266   puts ("");
9267 }
9268
9269 /* Parse and display the contents of the dynamic section.  */
9270
9271 static int
9272 process_dynamic_section (FILE * file)
9273 {
9274   Elf_Internal_Dyn * entry;
9275
9276   if (dynamic_size == 0)
9277     {
9278       if (do_dynamic)
9279         printf (_("\nThere is no dynamic section in this file.\n"));
9280
9281       return 1;
9282     }
9283
9284   if (is_32bit_elf)
9285     {
9286       if (! get_32bit_dynamic_section (file))
9287         return 0;
9288     }
9289   else if (! get_64bit_dynamic_section (file))
9290     return 0;
9291
9292   /* Find the appropriate symbol table.  */
9293   if (dynamic_symbols == NULL)
9294     {
9295       for (entry = dynamic_section;
9296            entry < dynamic_section + dynamic_nent;
9297            ++entry)
9298         {
9299           Elf_Internal_Shdr section;
9300
9301           if (entry->d_tag != DT_SYMTAB)
9302             continue;
9303
9304           dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
9305
9306           /* Since we do not know how big the symbol table is,
9307              we default to reading in the entire file (!) and
9308              processing that.  This is overkill, I know, but it
9309              should work.  */
9310           section.sh_offset = offset_from_vma (file, entry->d_un.d_val, 0);
9311
9312           if (archive_file_offset != 0)
9313             section.sh_size = archive_file_size - section.sh_offset;
9314           else
9315             {
9316               if (fseek (file, 0, SEEK_END))
9317                 error (_("Unable to seek to end of file!\n"));
9318
9319               section.sh_size = ftell (file) - section.sh_offset;
9320             }
9321
9322           if (is_32bit_elf)
9323             section.sh_entsize = sizeof (Elf32_External_Sym);
9324           else
9325             section.sh_entsize = sizeof (Elf64_External_Sym);
9326           section.sh_name = string_table_length;
9327
9328           dynamic_symbols = GET_ELF_SYMBOLS (file, &section, & num_dynamic_syms);
9329           if (num_dynamic_syms < 1)
9330             {
9331               error (_("Unable to determine the number of symbols to load\n"));
9332               continue;
9333             }
9334         }
9335     }
9336
9337   /* Similarly find a string table.  */
9338   if (dynamic_strings == NULL)
9339     {
9340       for (entry = dynamic_section;
9341            entry < dynamic_section + dynamic_nent;
9342            ++entry)
9343         {
9344           unsigned long offset;
9345           long str_tab_len;
9346
9347           if (entry->d_tag != DT_STRTAB)
9348             continue;
9349
9350           dynamic_info[DT_STRTAB] = entry->d_un.d_val;
9351
9352           /* Since we do not know how big the string table is,
9353              we default to reading in the entire file (!) and
9354              processing that.  This is overkill, I know, but it
9355              should work.  */
9356
9357           offset = offset_from_vma (file, entry->d_un.d_val, 0);
9358
9359           if (archive_file_offset != 0)
9360             str_tab_len = archive_file_size - offset;
9361           else
9362             {
9363               if (fseek (file, 0, SEEK_END))
9364                 error (_("Unable to seek to end of file\n"));
9365               str_tab_len = ftell (file) - offset;
9366             }
9367
9368           if (str_tab_len < 1)
9369             {
9370               error
9371                 (_("Unable to determine the length of the dynamic string table\n"));
9372               continue;
9373             }
9374
9375           dynamic_strings = (char *) get_data (NULL, file, offset, 1,
9376                                                str_tab_len,
9377                                                _("dynamic string table"));
9378           dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
9379           break;
9380         }
9381     }
9382
9383   /* And find the syminfo section if available.  */
9384   if (dynamic_syminfo == NULL)
9385     {
9386       unsigned long syminsz = 0;
9387
9388       for (entry = dynamic_section;
9389            entry < dynamic_section + dynamic_nent;
9390            ++entry)
9391         {
9392           if (entry->d_tag == DT_SYMINENT)
9393             {
9394               /* Note: these braces are necessary to avoid a syntax
9395                  error from the SunOS4 C compiler.  */
9396               /* PR binutils/17531: A corrupt file can trigger this test.
9397                  So do not use an assert, instead generate an error message.  */
9398               if (sizeof (Elf_External_Syminfo) != entry->d_un.d_val)
9399                 error (_("Bad value (%d) for SYMINENT entry\n"),
9400                        (int) entry->d_un.d_val);
9401             }
9402           else if (entry->d_tag == DT_SYMINSZ)
9403             syminsz = entry->d_un.d_val;
9404           else if (entry->d_tag == DT_SYMINFO)
9405             dynamic_syminfo_offset = offset_from_vma (file, entry->d_un.d_val,
9406                                                       syminsz);
9407         }
9408
9409       if (dynamic_syminfo_offset != 0 && syminsz != 0)
9410         {
9411           Elf_External_Syminfo * extsyminfo;
9412           Elf_External_Syminfo * extsym;
9413           Elf_Internal_Syminfo * syminfo;
9414
9415           /* There is a syminfo section.  Read the data.  */
9416           extsyminfo = (Elf_External_Syminfo *)
9417               get_data (NULL, file, dynamic_syminfo_offset, 1, syminsz,
9418                         _("symbol information"));
9419           if (!extsyminfo)
9420             return 0;
9421
9422           dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
9423           if (dynamic_syminfo == NULL)
9424             {
9425               error (_("Out of memory allocating %lu byte for dynamic symbol info\n"),
9426                      (unsigned long) syminsz);
9427               return 0;
9428             }
9429
9430           dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
9431           for (syminfo = dynamic_syminfo, extsym = extsyminfo;
9432                syminfo < dynamic_syminfo + dynamic_syminfo_nent;
9433                ++syminfo, ++extsym)
9434             {
9435               syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
9436               syminfo->si_flags = BYTE_GET (extsym->si_flags);
9437             }
9438
9439           free (extsyminfo);
9440         }
9441     }
9442
9443   if (do_dynamic && dynamic_addr)
9444     printf (_("\nDynamic section at offset 0x%lx contains %lu entries:\n"),
9445             dynamic_addr, (unsigned long) dynamic_nent);
9446   if (do_dynamic)
9447     printf (_("  Tag        Type                         Name/Value\n"));
9448
9449   for (entry = dynamic_section;
9450        entry < dynamic_section + dynamic_nent;
9451        entry++)
9452     {
9453       if (do_dynamic)
9454         {
9455           const char * dtype;
9456
9457           putchar (' ');
9458           print_vma (entry->d_tag, FULL_HEX);
9459           dtype = get_dynamic_type (entry->d_tag);
9460           printf (" (%s)%*s", dtype,
9461                   ((is_32bit_elf ? 27 : 19)
9462                    - (int) strlen (dtype)),
9463                   " ");
9464         }
9465
9466       switch (entry->d_tag)
9467         {
9468         case DT_FLAGS:
9469           if (do_dynamic)
9470             print_dynamic_flags (entry->d_un.d_val);
9471           break;
9472
9473         case DT_AUXILIARY:
9474         case DT_FILTER:
9475         case DT_CONFIG:
9476         case DT_DEPAUDIT:
9477         case DT_AUDIT:
9478           if (do_dynamic)
9479             {
9480               switch (entry->d_tag)
9481                 {
9482                 case DT_AUXILIARY:
9483                   printf (_("Auxiliary library"));
9484                   break;
9485
9486                 case DT_FILTER:
9487                   printf (_("Filter library"));
9488                   break;
9489
9490                 case DT_CONFIG:
9491                   printf (_("Configuration file"));
9492                   break;
9493
9494                 case DT_DEPAUDIT:
9495                   printf (_("Dependency audit library"));
9496                   break;
9497
9498                 case DT_AUDIT:
9499                   printf (_("Audit library"));
9500                   break;
9501                 }
9502
9503               if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9504                 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
9505               else
9506                 {
9507                   printf (": ");
9508                   print_vma (entry->d_un.d_val, PREFIX_HEX);
9509                   putchar ('\n');
9510                 }
9511             }
9512           break;
9513
9514         case DT_FEATURE:
9515           if (do_dynamic)
9516             {
9517               printf (_("Flags:"));
9518
9519               if (entry->d_un.d_val == 0)
9520                 printf (_(" None\n"));
9521               else
9522                 {
9523                   unsigned long int val = entry->d_un.d_val;
9524
9525                   if (val & DTF_1_PARINIT)
9526                     {
9527                       printf (" PARINIT");
9528                       val ^= DTF_1_PARINIT;
9529                     }
9530                   if (val & DTF_1_CONFEXP)
9531                     {
9532                       printf (" CONFEXP");
9533                       val ^= DTF_1_CONFEXP;
9534                     }
9535                   if (val != 0)
9536                     printf (" %lx", val);
9537                   puts ("");
9538                 }
9539             }
9540           break;
9541
9542         case DT_POSFLAG_1:
9543           if (do_dynamic)
9544             {
9545               printf (_("Flags:"));
9546
9547               if (entry->d_un.d_val == 0)
9548                 printf (_(" None\n"));
9549               else
9550                 {
9551                   unsigned long int val = entry->d_un.d_val;
9552
9553                   if (val & DF_P1_LAZYLOAD)
9554                     {
9555                       printf (" LAZYLOAD");
9556                       val ^= DF_P1_LAZYLOAD;
9557                     }
9558                   if (val & DF_P1_GROUPPERM)
9559                     {
9560                       printf (" GROUPPERM");
9561                       val ^= DF_P1_GROUPPERM;
9562                     }
9563                   if (val != 0)
9564                     printf (" %lx", val);
9565                   puts ("");
9566                 }
9567             }
9568           break;
9569
9570         case DT_FLAGS_1:
9571           if (do_dynamic)
9572             {
9573               printf (_("Flags:"));
9574               if (entry->d_un.d_val == 0)
9575                 printf (_(" None\n"));
9576               else
9577                 {
9578                   unsigned long int val = entry->d_un.d_val;
9579
9580                   if (val & DF_1_NOW)
9581                     {
9582                       printf (" NOW");
9583                       val ^= DF_1_NOW;
9584                     }
9585                   if (val & DF_1_GLOBAL)
9586                     {
9587                       printf (" GLOBAL");
9588                       val ^= DF_1_GLOBAL;
9589                     }
9590                   if (val & DF_1_GROUP)
9591                     {
9592                       printf (" GROUP");
9593                       val ^= DF_1_GROUP;
9594                     }
9595                   if (val & DF_1_NODELETE)
9596                     {
9597                       printf (" NODELETE");
9598                       val ^= DF_1_NODELETE;
9599                     }
9600                   if (val & DF_1_LOADFLTR)
9601                     {
9602                       printf (" LOADFLTR");
9603                       val ^= DF_1_LOADFLTR;
9604                     }
9605                   if (val & DF_1_INITFIRST)
9606                     {
9607                       printf (" INITFIRST");
9608                       val ^= DF_1_INITFIRST;
9609                     }
9610                   if (val & DF_1_NOOPEN)
9611                     {
9612                       printf (" NOOPEN");
9613                       val ^= DF_1_NOOPEN;
9614                     }
9615                   if (val & DF_1_ORIGIN)
9616                     {
9617                       printf (" ORIGIN");
9618                       val ^= DF_1_ORIGIN;
9619                     }
9620                   if (val & DF_1_DIRECT)
9621                     {
9622                       printf (" DIRECT");
9623                       val ^= DF_1_DIRECT;
9624                     }
9625                   if (val & DF_1_TRANS)
9626                     {
9627                       printf (" TRANS");
9628                       val ^= DF_1_TRANS;
9629                     }
9630                   if (val & DF_1_INTERPOSE)
9631                     {
9632                       printf (" INTERPOSE");
9633                       val ^= DF_1_INTERPOSE;
9634                     }
9635                   if (val & DF_1_NODEFLIB)
9636                     {
9637                       printf (" NODEFLIB");
9638                       val ^= DF_1_NODEFLIB;
9639                     }
9640                   if (val & DF_1_NODUMP)
9641                     {
9642                       printf (" NODUMP");
9643                       val ^= DF_1_NODUMP;
9644                     }
9645                   if (val & DF_1_CONFALT)
9646                     {
9647                       printf (" CONFALT");
9648                       val ^= DF_1_CONFALT;
9649                     }
9650                   if (val & DF_1_ENDFILTEE)
9651                     {
9652                       printf (" ENDFILTEE");
9653                       val ^= DF_1_ENDFILTEE;
9654                     }
9655                   if (val & DF_1_DISPRELDNE)
9656                     {
9657                       printf (" DISPRELDNE");
9658                       val ^= DF_1_DISPRELDNE;
9659                     }
9660                   if (val & DF_1_DISPRELPND)
9661                     {
9662                       printf (" DISPRELPND");
9663                       val ^= DF_1_DISPRELPND;
9664                     }
9665                   if (val & DF_1_NODIRECT)
9666                     {
9667                       printf (" NODIRECT");
9668                       val ^= DF_1_NODIRECT;
9669                     }
9670                   if (val & DF_1_IGNMULDEF)
9671                     {
9672                       printf (" IGNMULDEF");
9673                       val ^= DF_1_IGNMULDEF;
9674                     }
9675                   if (val & DF_1_NOKSYMS)
9676                     {
9677                       printf (" NOKSYMS");
9678                       val ^= DF_1_NOKSYMS;
9679                     }
9680                   if (val & DF_1_NOHDR)
9681                     {
9682                       printf (" NOHDR");
9683                       val ^= DF_1_NOHDR;
9684                     }
9685                   if (val & DF_1_EDITED)
9686                     {
9687                       printf (" EDITED");
9688                       val ^= DF_1_EDITED;
9689                     }
9690                   if (val & DF_1_NORELOC)
9691                     {
9692                       printf (" NORELOC");
9693                       val ^= DF_1_NORELOC;
9694                     }
9695                   if (val & DF_1_SYMINTPOSE)
9696                     {
9697                       printf (" SYMINTPOSE");
9698                       val ^= DF_1_SYMINTPOSE;
9699                     }
9700                   if (val & DF_1_GLOBAUDIT)
9701                     {
9702                       printf (" GLOBAUDIT");
9703                       val ^= DF_1_GLOBAUDIT;
9704                     }
9705                   if (val & DF_1_SINGLETON)
9706                     {
9707                       printf (" SINGLETON");
9708                       val ^= DF_1_SINGLETON;
9709                     }
9710                   if (val & DF_1_STUB)
9711                     {
9712                       printf (" STUB");
9713                       val ^= DF_1_STUB;
9714                     }
9715                   if (val & DF_1_PIE)
9716                     {
9717                       printf (" PIE");
9718                       val ^= DF_1_PIE;
9719                     }
9720                   if (val != 0)
9721                     printf (" %lx", val);
9722                   puts ("");
9723                 }
9724             }
9725           break;
9726
9727         case DT_PLTREL:
9728           dynamic_info[entry->d_tag] = entry->d_un.d_val;
9729           if (do_dynamic)
9730             puts (get_dynamic_type (entry->d_un.d_val));
9731           break;
9732
9733         case DT_NULL    :
9734         case DT_NEEDED  :
9735         case DT_PLTGOT  :
9736         case DT_HASH    :
9737         case DT_STRTAB  :
9738         case DT_SYMTAB  :
9739         case DT_RELA    :
9740         case DT_INIT    :
9741         case DT_FINI    :
9742         case DT_SONAME  :
9743         case DT_RPATH   :
9744         case DT_SYMBOLIC:
9745         case DT_REL     :
9746         case DT_DEBUG   :
9747         case DT_TEXTREL :
9748         case DT_JMPREL  :
9749         case DT_RUNPATH :
9750           dynamic_info[entry->d_tag] = entry->d_un.d_val;
9751
9752           if (do_dynamic)
9753             {
9754               char * name;
9755
9756               if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9757                 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
9758               else
9759                 name = NULL;
9760
9761               if (name)
9762                 {
9763                   switch (entry->d_tag)
9764                     {
9765                     case DT_NEEDED:
9766                       printf (_("Shared library: [%s]"), name);
9767
9768                       if (streq (name, program_interpreter))
9769                         printf (_(" program interpreter"));
9770                       break;
9771
9772                     case DT_SONAME:
9773                       printf (_("Library soname: [%s]"), name);
9774                       break;
9775
9776                     case DT_RPATH:
9777                       printf (_("Library rpath: [%s]"), name);
9778                       break;
9779
9780                     case DT_RUNPATH:
9781                       printf (_("Library runpath: [%s]"), name);
9782                       break;
9783
9784                     default:
9785                       print_vma (entry->d_un.d_val, PREFIX_HEX);
9786                       break;
9787                     }
9788                 }
9789               else
9790                 print_vma (entry->d_un.d_val, PREFIX_HEX);
9791
9792               putchar ('\n');
9793             }
9794           break;
9795
9796         case DT_PLTRELSZ:
9797         case DT_RELASZ  :
9798         case DT_STRSZ   :
9799         case DT_RELSZ   :
9800         case DT_RELAENT :
9801         case DT_SYMENT  :
9802         case DT_RELENT  :
9803           dynamic_info[entry->d_tag] = entry->d_un.d_val;
9804           /* Fall through.  */
9805         case DT_PLTPADSZ:
9806         case DT_MOVEENT :
9807         case DT_MOVESZ  :
9808         case DT_INIT_ARRAYSZ:
9809         case DT_FINI_ARRAYSZ:
9810         case DT_GNU_CONFLICTSZ:
9811         case DT_GNU_LIBLISTSZ:
9812           if (do_dynamic)
9813             {
9814               print_vma (entry->d_un.d_val, UNSIGNED);
9815               printf (_(" (bytes)\n"));
9816             }
9817           break;
9818
9819         case DT_VERDEFNUM:
9820         case DT_VERNEEDNUM:
9821         case DT_RELACOUNT:
9822         case DT_RELCOUNT:
9823           if (do_dynamic)
9824             {
9825               print_vma (entry->d_un.d_val, UNSIGNED);
9826               putchar ('\n');
9827             }
9828           break;
9829
9830         case DT_SYMINSZ:
9831         case DT_SYMINENT:
9832         case DT_SYMINFO:
9833         case DT_USED:
9834         case DT_INIT_ARRAY:
9835         case DT_FINI_ARRAY:
9836           if (do_dynamic)
9837             {
9838               if (entry->d_tag == DT_USED
9839                   && VALID_DYNAMIC_NAME (entry->d_un.d_val))
9840                 {
9841                   char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
9842
9843                   if (*name)
9844                     {
9845                       printf (_("Not needed object: [%s]\n"), name);
9846                       break;
9847                     }
9848                 }
9849
9850               print_vma (entry->d_un.d_val, PREFIX_HEX);
9851               putchar ('\n');
9852             }
9853           break;
9854
9855         case DT_BIND_NOW:
9856           /* The value of this entry is ignored.  */
9857           if (do_dynamic)
9858             putchar ('\n');
9859           break;
9860
9861         case DT_GNU_PRELINKED:
9862           if (do_dynamic)
9863             {
9864               struct tm * tmp;
9865               time_t atime = entry->d_un.d_val;
9866
9867               tmp = gmtime (&atime);
9868               /* PR 17533 file: 041-1244816-0.004.  */
9869               if (tmp == NULL)
9870                 printf (_("<corrupt time val: %lx"),
9871                         (unsigned long) atime);
9872               else
9873                 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
9874                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9875                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
9876
9877             }
9878           break;
9879
9880         case DT_GNU_HASH:
9881           dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
9882           if (do_dynamic)
9883             {
9884               print_vma (entry->d_un.d_val, PREFIX_HEX);
9885               putchar ('\n');
9886             }
9887           break;
9888
9889         default:
9890           if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
9891             version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
9892               entry->d_un.d_val;
9893
9894           if (do_dynamic)
9895             {
9896               switch (elf_header.e_machine)
9897                 {
9898                 case EM_MIPS:
9899                 case EM_MIPS_RS3_LE:
9900                   dynamic_section_mips_val (entry);
9901                   break;
9902                 case EM_PARISC:
9903                   dynamic_section_parisc_val (entry);
9904                   break;
9905                 case EM_IA_64:
9906                   dynamic_section_ia64_val (entry);
9907                   break;
9908                 default:
9909                   print_vma (entry->d_un.d_val, PREFIX_HEX);
9910                   putchar ('\n');
9911                 }
9912             }
9913           break;
9914         }
9915     }
9916
9917   return 1;
9918 }
9919
9920 static char *
9921 get_ver_flags (unsigned int flags)
9922 {
9923   static char buff[32];
9924
9925   buff[0] = 0;
9926
9927   if (flags == 0)
9928     return _("none");
9929
9930   if (flags & VER_FLG_BASE)
9931     strcat (buff, "BASE ");
9932
9933   if (flags & VER_FLG_WEAK)
9934     {
9935       if (flags & VER_FLG_BASE)
9936         strcat (buff, "| ");
9937
9938       strcat (buff, "WEAK ");
9939     }
9940
9941   if (flags & VER_FLG_INFO)
9942     {
9943       if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
9944         strcat (buff, "| ");
9945
9946       strcat (buff, "INFO ");
9947     }
9948
9949   if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
9950     strcat (buff, _("| <unknown>"));
9951
9952   return buff;
9953 }
9954
9955 /* Display the contents of the version sections.  */
9956
9957 static int
9958 process_version_sections (FILE * file)
9959 {
9960   Elf_Internal_Shdr * section;
9961   unsigned i;
9962   int found = 0;
9963
9964   if (! do_version)
9965     return 1;
9966
9967   for (i = 0, section = section_headers;
9968        i < elf_header.e_shnum;
9969        i++, section++)
9970     {
9971       switch (section->sh_type)
9972         {
9973         case SHT_GNU_verdef:
9974           {
9975             Elf_External_Verdef * edefs;
9976             unsigned int idx;
9977             unsigned int cnt;
9978             char * endbuf;
9979
9980             found = 1;
9981
9982             printf (_("\nVersion definition section '%s' contains %u entries:\n"),
9983                     printable_section_name (section),
9984                     section->sh_info);
9985
9986             printf (_("  Addr: 0x"));
9987             printf_vma (section->sh_addr);
9988             printf (_("  Offset: %#08lx  Link: %u (%s)"),
9989                     (unsigned long) section->sh_offset, section->sh_link,
9990                     printable_section_name_from_index (section->sh_link));
9991
9992             edefs = (Elf_External_Verdef *)
9993                 get_data (NULL, file, section->sh_offset, 1,section->sh_size,
9994                           _("version definition section"));
9995             if (!edefs)
9996               break;
9997             endbuf = (char *) edefs + section->sh_size;
9998
9999             for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
10000               {
10001                 char * vstart;
10002                 Elf_External_Verdef * edef;
10003                 Elf_Internal_Verdef ent;
10004                 Elf_External_Verdaux * eaux;
10005                 Elf_Internal_Verdaux aux;
10006                 int j;
10007                 int isum;
10008
10009                 /* Check for very large indices.  */
10010                 if (idx > (size_t) (endbuf - (char *) edefs))
10011                   break;
10012
10013                 vstart = ((char *) edefs) + idx;
10014                 if (vstart + sizeof (*edef) > endbuf)
10015                   break;
10016
10017                 edef = (Elf_External_Verdef *) vstart;
10018
10019                 ent.vd_version = BYTE_GET (edef->vd_version);
10020                 ent.vd_flags   = BYTE_GET (edef->vd_flags);
10021                 ent.vd_ndx     = BYTE_GET (edef->vd_ndx);
10022                 ent.vd_cnt     = BYTE_GET (edef->vd_cnt);
10023                 ent.vd_hash    = BYTE_GET (edef->vd_hash);
10024                 ent.vd_aux     = BYTE_GET (edef->vd_aux);
10025                 ent.vd_next    = BYTE_GET (edef->vd_next);
10026
10027                 printf (_("  %#06x: Rev: %d  Flags: %s"),
10028                         idx, ent.vd_version, get_ver_flags (ent.vd_flags));
10029
10030                 printf (_("  Index: %d  Cnt: %d  "),
10031                         ent.vd_ndx, ent.vd_cnt);
10032
10033                 /* Check for overflow.  */
10034                 if (ent.vd_aux + sizeof (* eaux) > (size_t) (endbuf - vstart))
10035                   break;
10036
10037                 vstart += ent.vd_aux;
10038
10039                 eaux = (Elf_External_Verdaux *) vstart;
10040
10041                 aux.vda_name = BYTE_GET (eaux->vda_name);
10042                 aux.vda_next = BYTE_GET (eaux->vda_next);
10043
10044                 if (VALID_DYNAMIC_NAME (aux.vda_name))
10045                   printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
10046                 else
10047                   printf (_("Name index: %ld\n"), aux.vda_name);
10048
10049                 isum = idx + ent.vd_aux;
10050
10051                 for (j = 1; j < ent.vd_cnt; j++)
10052                   {
10053                     /* Check for overflow.  */
10054                     if (aux.vda_next > (size_t) (endbuf - vstart))
10055                       break;
10056
10057                     isum   += aux.vda_next;
10058                     vstart += aux.vda_next;
10059
10060                     eaux = (Elf_External_Verdaux *) vstart;
10061                     if (vstart + sizeof (*eaux) > endbuf)
10062                       break;
10063
10064                     aux.vda_name = BYTE_GET (eaux->vda_name);
10065                     aux.vda_next = BYTE_GET (eaux->vda_next);
10066
10067                     if (VALID_DYNAMIC_NAME (aux.vda_name))
10068                       printf (_("  %#06x: Parent %d: %s\n"),
10069                               isum, j, GET_DYNAMIC_NAME (aux.vda_name));
10070                     else
10071                       printf (_("  %#06x: Parent %d, name index: %ld\n"),
10072                               isum, j, aux.vda_name);
10073                   }
10074
10075                 if (j < ent.vd_cnt)
10076                   printf (_("  Version def aux past end of section\n"));
10077
10078                 /* PR 17531: file: id:000001,src:000172+005151,op:splice,rep:2.  */
10079                 if (idx + ent.vd_next <= idx)
10080                   break;
10081
10082                 idx += ent.vd_next;
10083               }
10084
10085             if (cnt < section->sh_info)
10086               printf (_("  Version definition past end of section\n"));
10087
10088             free (edefs);
10089           }
10090           break;
10091
10092         case SHT_GNU_verneed:
10093           {
10094             Elf_External_Verneed * eneed;
10095             unsigned int idx;
10096             unsigned int cnt;
10097             char * endbuf;
10098
10099             found = 1;
10100
10101             printf (_("\nVersion needs section '%s' contains %u entries:\n"),
10102                     printable_section_name (section), section->sh_info);
10103
10104             printf (_(" Addr: 0x"));
10105             printf_vma (section->sh_addr);
10106             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
10107                     (unsigned long) section->sh_offset, section->sh_link,
10108                     printable_section_name_from_index (section->sh_link));
10109
10110             eneed = (Elf_External_Verneed *) get_data (NULL, file,
10111                                                        section->sh_offset, 1,
10112                                                        section->sh_size,
10113                                                        _("Version Needs section"));
10114             if (!eneed)
10115               break;
10116             endbuf = (char *) eneed + section->sh_size;
10117
10118             for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
10119               {
10120                 Elf_External_Verneed * entry;
10121                 Elf_Internal_Verneed ent;
10122                 int j;
10123                 int isum;
10124                 char * vstart;
10125
10126                 if (idx > (size_t) (endbuf - (char *) eneed))
10127                   break;
10128
10129                 vstart = ((char *) eneed) + idx;
10130                 if (vstart + sizeof (*entry) > endbuf)
10131                   break;
10132
10133                 entry = (Elf_External_Verneed *) vstart;
10134
10135                 ent.vn_version = BYTE_GET (entry->vn_version);
10136                 ent.vn_cnt     = BYTE_GET (entry->vn_cnt);
10137                 ent.vn_file    = BYTE_GET (entry->vn_file);
10138                 ent.vn_aux     = BYTE_GET (entry->vn_aux);
10139                 ent.vn_next    = BYTE_GET (entry->vn_next);
10140
10141                 printf (_("  %#06x: Version: %d"), idx, ent.vn_version);
10142
10143                 if (VALID_DYNAMIC_NAME (ent.vn_file))
10144                   printf (_("  File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
10145                 else
10146                   printf (_("  File: %lx"), ent.vn_file);
10147
10148                 printf (_("  Cnt: %d\n"), ent.vn_cnt);
10149
10150                 /* Check for overflow.  */
10151                 if (ent.vn_aux > (size_t) (endbuf - vstart))
10152                   break;
10153                 vstart += ent.vn_aux;
10154
10155                 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
10156                   {
10157                     Elf_External_Vernaux * eaux;
10158                     Elf_Internal_Vernaux aux;
10159
10160                     if (vstart + sizeof (*eaux) > endbuf)
10161                       break;
10162                     eaux = (Elf_External_Vernaux *) vstart;
10163
10164                     aux.vna_hash  = BYTE_GET (eaux->vna_hash);
10165                     aux.vna_flags = BYTE_GET (eaux->vna_flags);
10166                     aux.vna_other = BYTE_GET (eaux->vna_other);
10167                     aux.vna_name  = BYTE_GET (eaux->vna_name);
10168                     aux.vna_next  = BYTE_GET (eaux->vna_next);
10169
10170                     if (VALID_DYNAMIC_NAME (aux.vna_name))
10171                       printf (_("  %#06x:   Name: %s"),
10172                               isum, GET_DYNAMIC_NAME (aux.vna_name));
10173                     else
10174                       printf (_("  %#06x:   Name index: %lx"),
10175                               isum, aux.vna_name);
10176
10177                     printf (_("  Flags: %s  Version: %d\n"),
10178                             get_ver_flags (aux.vna_flags), aux.vna_other);
10179
10180                     /* Check for overflow.  */
10181                     if (aux.vna_next > (size_t) (endbuf - vstart)
10182                         || (aux.vna_next == 0 && j < ent.vn_cnt - 1))
10183                       {
10184                         warn (_("Invalid vna_next field of %lx\n"),
10185                               aux.vna_next);
10186                         j = ent.vn_cnt;
10187                         break;
10188                       }
10189                     isum   += aux.vna_next;
10190                     vstart += aux.vna_next;
10191                   }
10192
10193                 if (j < ent.vn_cnt)
10194                   warn (_("Missing Version Needs auxillary information\n"));
10195
10196                 if (ent.vn_next == 0 && cnt < section->sh_info - 1)
10197                   {
10198                     warn (_("Corrupt Version Needs structure - offset to next structure is zero with entries still left to be processed\n"));
10199                     cnt = section->sh_info;
10200                     break;
10201                   }
10202                 idx += ent.vn_next;
10203               }
10204
10205             if (cnt < section->sh_info)
10206               warn (_("Missing Version Needs information\n"));
10207
10208             free (eneed);
10209           }
10210           break;
10211
10212         case SHT_GNU_versym:
10213           {
10214             Elf_Internal_Shdr * link_section;
10215             size_t total;
10216             unsigned int cnt;
10217             unsigned char * edata;
10218             unsigned short * data;
10219             char * strtab;
10220             Elf_Internal_Sym * symbols;
10221             Elf_Internal_Shdr * string_sec;
10222             unsigned long num_syms;
10223             long off;
10224
10225             if (section->sh_link >= elf_header.e_shnum)
10226               break;
10227
10228             link_section = section_headers + section->sh_link;
10229             total = section->sh_size / sizeof (Elf_External_Versym);
10230
10231             if (link_section->sh_link >= elf_header.e_shnum)
10232               break;
10233
10234             found = 1;
10235
10236             symbols = GET_ELF_SYMBOLS (file, link_section, & num_syms);
10237             if (symbols == NULL)
10238               break;
10239
10240             string_sec = section_headers + link_section->sh_link;
10241
10242             strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
10243                                         string_sec->sh_size,
10244                                         _("version string table"));
10245             if (!strtab)
10246               {
10247                 free (symbols);
10248                 break;
10249               }
10250
10251             printf (_("\nVersion symbols section '%s' contains %lu entries:\n"),
10252                     printable_section_name (section), (unsigned long) total);
10253
10254             printf (_(" Addr: "));
10255             printf_vma (section->sh_addr);
10256             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
10257                     (unsigned long) section->sh_offset, section->sh_link,
10258                     printable_section_name (link_section));
10259
10260             off = offset_from_vma (file,
10261                                    version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10262                                    total * sizeof (short));
10263             edata = (unsigned char *) get_data (NULL, file, off, total,
10264                                                 sizeof (short),
10265                                                 _("version symbol data"));
10266             if (!edata)
10267               {
10268                 free (strtab);
10269                 free (symbols);
10270                 break;
10271               }
10272
10273             data = (short unsigned int *) cmalloc (total, sizeof (short));
10274
10275             for (cnt = total; cnt --;)
10276               data[cnt] = byte_get (edata + cnt * sizeof (short),
10277                                     sizeof (short));
10278
10279             free (edata);
10280
10281             for (cnt = 0; cnt < total; cnt += 4)
10282               {
10283                 int j, nn;
10284                 char *name;
10285                 char *invalid = _("*invalid*");
10286
10287                 printf ("  %03x:", cnt);
10288
10289                 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
10290                   switch (data[cnt + j])
10291                     {
10292                     case 0:
10293                       fputs (_("   0 (*local*)    "), stdout);
10294                       break;
10295
10296                     case 1:
10297                       fputs (_("   1 (*global*)   "), stdout);
10298                       break;
10299
10300                     default:
10301                       nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
10302                                    data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
10303
10304                       /* If this index value is greater than the size of the symbols
10305                          array, break to avoid an out-of-bounds read.  */
10306                       if ((unsigned long)(cnt + j) >= num_syms)
10307                         {
10308                           warn (_("invalid index into symbol array\n"));
10309                           break;
10310                         }
10311
10312                       name = NULL;
10313                       if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
10314                         {
10315                           Elf_Internal_Verneed ivn;
10316                           unsigned long offset;
10317
10318                           offset = offset_from_vma
10319                             (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10320                              sizeof (Elf_External_Verneed));
10321
10322                           do
10323                             {
10324                               Elf_Internal_Vernaux ivna;
10325                               Elf_External_Verneed evn;
10326                               Elf_External_Vernaux evna;
10327                               unsigned long a_off;
10328
10329                               if (get_data (&evn, file, offset, sizeof (evn), 1,
10330                                             _("version need")) == NULL)
10331                                 break;
10332
10333                               ivn.vn_aux  = BYTE_GET (evn.vn_aux);
10334                               ivn.vn_next = BYTE_GET (evn.vn_next);
10335
10336                               a_off = offset + ivn.vn_aux;
10337
10338                               do
10339                                 {
10340                                   if (get_data (&evna, file, a_off, sizeof (evna),
10341                                                 1, _("version need aux (2)")) == NULL)
10342                                     {
10343                                       ivna.vna_next  = 0;
10344                                       ivna.vna_other = 0;
10345                                     }
10346                                   else
10347                                     {
10348                                       ivna.vna_next  = BYTE_GET (evna.vna_next);
10349                                       ivna.vna_other = BYTE_GET (evna.vna_other);
10350                                     }
10351
10352                                   a_off += ivna.vna_next;
10353                                 }
10354                               while (ivna.vna_other != data[cnt + j]
10355                                      && ivna.vna_next != 0);
10356
10357                               if (ivna.vna_other == data[cnt + j])
10358                                 {
10359                                   ivna.vna_name = BYTE_GET (evna.vna_name);
10360
10361                                   if (ivna.vna_name >= string_sec->sh_size)
10362                                     name = invalid;
10363                                   else
10364                                     name = strtab + ivna.vna_name;
10365                                   break;
10366                                 }
10367
10368                               offset += ivn.vn_next;
10369                             }
10370                           while (ivn.vn_next);
10371                         }
10372
10373                       if (data[cnt + j] != 0x8001
10374                           && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10375                         {
10376                           Elf_Internal_Verdef ivd;
10377                           Elf_External_Verdef evd;
10378                           unsigned long offset;
10379
10380                           offset = offset_from_vma
10381                             (file, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10382                              sizeof evd);
10383
10384                           do
10385                             {
10386                               if (get_data (&evd, file, offset, sizeof (evd), 1,
10387                                             _("version def")) == NULL)
10388                                 {
10389                                   ivd.vd_next = 0;
10390                                   /* PR 17531: file: 046-1082287-0.004.  */
10391                                   ivd.vd_ndx  = (data[cnt + j] & VERSYM_VERSION) + 1;
10392                                   break;
10393                                 }
10394                               else
10395                                 {
10396                                   ivd.vd_next = BYTE_GET (evd.vd_next);
10397                                   ivd.vd_ndx  = BYTE_GET (evd.vd_ndx);
10398                                 }
10399
10400                               offset += ivd.vd_next;
10401                             }
10402                           while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
10403                                  && ivd.vd_next != 0);
10404
10405                           if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
10406                             {
10407                               Elf_External_Verdaux evda;
10408                               Elf_Internal_Verdaux ivda;
10409
10410                               ivd.vd_aux = BYTE_GET (evd.vd_aux);
10411
10412                               if (get_data (&evda, file,
10413                                             offset - ivd.vd_next + ivd.vd_aux,
10414                                             sizeof (evda), 1,
10415                                             _("version def aux")) == NULL)
10416                                 break;
10417
10418                               ivda.vda_name = BYTE_GET (evda.vda_name);
10419
10420                               if (ivda.vda_name >= string_sec->sh_size)
10421                                 name = invalid;
10422                               else if (name != NULL && name != invalid)
10423                                 name = _("*both*");
10424                               else
10425                                 name = strtab + ivda.vda_name;
10426                             }
10427                         }
10428                       if (name != NULL)
10429                         nn += printf ("(%s%-*s",
10430                                       name,
10431                                       12 - (int) strlen (name),
10432                                       ")");
10433
10434                       if (nn < 18)
10435                         printf ("%*c", 18 - nn, ' ');
10436                     }
10437
10438                 putchar ('\n');
10439               }
10440
10441             free (data);
10442             free (strtab);
10443             free (symbols);
10444           }
10445           break;
10446
10447         default:
10448           break;
10449         }
10450     }
10451
10452   if (! found)
10453     printf (_("\nNo version information found in this file.\n"));
10454
10455   return 1;
10456 }
10457
10458 static const char *
10459 get_symbol_binding (unsigned int binding)
10460 {
10461   static char buff[32];
10462
10463   switch (binding)
10464     {
10465     case STB_LOCAL:     return "LOCAL";
10466     case STB_GLOBAL:    return "GLOBAL";
10467     case STB_WEAK:      return "WEAK";
10468     default:
10469       if (binding >= STB_LOPROC && binding <= STB_HIPROC)
10470         snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
10471                   binding);
10472       else if (binding >= STB_LOOS && binding <= STB_HIOS)
10473         {
10474           if (binding == STB_GNU_UNIQUE
10475               && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
10476                   /* GNU is still using the default value 0.  */
10477                   || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10478             return "UNIQUE";
10479           snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
10480         }
10481       else
10482         snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
10483       return buff;
10484     }
10485 }
10486
10487 static const char *
10488 get_symbol_type (unsigned int type)
10489 {
10490   static char buff[32];
10491
10492   switch (type)
10493     {
10494     case STT_NOTYPE:    return "NOTYPE";
10495     case STT_OBJECT:    return "OBJECT";
10496     case STT_FUNC:      return "FUNC";
10497     case STT_SECTION:   return "SECTION";
10498     case STT_FILE:      return "FILE";
10499     case STT_COMMON:    return "COMMON";
10500     case STT_TLS:       return "TLS";
10501     case STT_RELC:      return "RELC";
10502     case STT_SRELC:     return "SRELC";
10503     default:
10504       if (type >= STT_LOPROC && type <= STT_HIPROC)
10505         {
10506           if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
10507             return "THUMB_FUNC";
10508
10509           if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
10510             return "REGISTER";
10511
10512           if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
10513             return "PARISC_MILLI";
10514
10515           snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
10516         }
10517       else if (type >= STT_LOOS && type <= STT_HIOS)
10518         {
10519           if (elf_header.e_machine == EM_PARISC)
10520             {
10521               if (type == STT_HP_OPAQUE)
10522                 return "HP_OPAQUE";
10523               if (type == STT_HP_STUB)
10524                 return "HP_STUB";
10525             }
10526
10527           if (type == STT_GNU_IFUNC
10528               && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
10529                   || elf_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD
10530                   /* GNU is still using the default value 0.  */
10531                   || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10532             return "IFUNC";
10533
10534           snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
10535         }
10536       else
10537         snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
10538       return buff;
10539     }
10540 }
10541
10542 static const char *
10543 get_symbol_visibility (unsigned int visibility)
10544 {
10545   switch (visibility)
10546     {
10547     case STV_DEFAULT:   return "DEFAULT";
10548     case STV_INTERNAL:  return "INTERNAL";
10549     case STV_HIDDEN:    return "HIDDEN";
10550     case STV_PROTECTED: return "PROTECTED";
10551     default:
10552       error (_("Unrecognized visibility value: %u"), visibility);
10553       return _("<unknown>");
10554     }
10555 }
10556
10557 static const char *
10558 get_solaris_symbol_visibility (unsigned int visibility)
10559 {
10560   switch (visibility)
10561     {
10562     case 4: return "EXPORTED";
10563     case 5: return "SINGLETON";
10564     case 6: return "ELIMINATE";
10565     default: return get_symbol_visibility (visibility);
10566     }
10567 }
10568
10569 static const char *
10570 get_mips_symbol_other (unsigned int other)
10571 {
10572   switch (other)
10573     {
10574     case STO_OPTIONAL:
10575       return "OPTIONAL";
10576     case STO_MIPS_PLT:
10577       return "MIPS PLT";
10578     case STO_MIPS_PIC:
10579       return "MIPS PIC";
10580     case STO_MICROMIPS:
10581       return "MICROMIPS";
10582     case STO_MICROMIPS | STO_MIPS_PIC:
10583       return "MICROMIPS, MIPS PIC";
10584     case STO_MIPS16:
10585       return "MIPS16";
10586     default:
10587       return NULL;
10588     }
10589 }
10590
10591 static const char *
10592 get_ia64_symbol_other (unsigned int other)
10593 {
10594   if (is_ia64_vms ())
10595     {
10596       static char res[32];
10597
10598       res[0] = 0;
10599
10600       /* Function types is for images and .STB files only.  */
10601       switch (elf_header.e_type)
10602         {
10603         case ET_DYN:
10604         case ET_EXEC:
10605           switch (VMS_ST_FUNC_TYPE (other))
10606             {
10607             case VMS_SFT_CODE_ADDR:
10608               strcat (res, " CA");
10609               break;
10610             case VMS_SFT_SYMV_IDX:
10611               strcat (res, " VEC");
10612               break;
10613             case VMS_SFT_FD:
10614               strcat (res, " FD");
10615               break;
10616             case VMS_SFT_RESERVE:
10617               strcat (res, " RSV");
10618               break;
10619             default:
10620               warn (_("Unrecognized IA64 VMS ST Function type: %d\n"),
10621                     VMS_ST_FUNC_TYPE (other));
10622               strcat (res, " <unknown>");
10623               break;
10624             }
10625           break;
10626         default:
10627           break;
10628         }
10629       switch (VMS_ST_LINKAGE (other))
10630         {
10631         case VMS_STL_IGNORE:
10632           strcat (res, " IGN");
10633           break;
10634         case VMS_STL_RESERVE:
10635           strcat (res, " RSV");
10636           break;
10637         case VMS_STL_STD:
10638           strcat (res, " STD");
10639           break;
10640         case VMS_STL_LNK:
10641           strcat (res, " LNK");
10642           break;
10643         default:
10644           warn (_("Unrecognized IA64 VMS ST Linkage: %d\n"),
10645                 VMS_ST_LINKAGE (other));
10646           strcat (res, " <unknown>");
10647           break;
10648         }
10649
10650       if (res[0] != 0)
10651         return res + 1;
10652       else
10653         return res;
10654     }
10655   return NULL;
10656 }
10657
10658 static const char *
10659 get_ppc64_symbol_other (unsigned int other)
10660 {
10661   if (PPC64_LOCAL_ENTRY_OFFSET (other) != 0)
10662     {
10663       static char buf[32];
10664       snprintf (buf, sizeof buf, _("<localentry>: %d"),
10665                 PPC64_LOCAL_ENTRY_OFFSET (other));
10666       return buf;
10667     }
10668   return NULL;
10669 }
10670
10671 static const char *
10672 get_symbol_other (unsigned int other)
10673 {
10674   const char * result = NULL;
10675   static char buff [32];
10676
10677   if (other == 0)
10678     return "";
10679
10680   switch (elf_header.e_machine)
10681     {
10682     case EM_MIPS:
10683       result = get_mips_symbol_other (other);
10684       break;
10685     case EM_IA_64:
10686       result = get_ia64_symbol_other (other);
10687       break;
10688     case EM_PPC64:
10689       result = get_ppc64_symbol_other (other);
10690       break;
10691     default:
10692       result = NULL;
10693       break;
10694     }
10695
10696   if (result)
10697     return result;
10698
10699   snprintf (buff, sizeof buff, _("<other>: %x"), other);
10700   return buff;
10701 }
10702
10703 static const char *
10704 get_symbol_index_type (unsigned int type)
10705 {
10706   static char buff[32];
10707
10708   switch (type)
10709     {
10710     case SHN_UNDEF:     return "UND";
10711     case SHN_ABS:       return "ABS";
10712     case SHN_COMMON:    return "COM";
10713     default:
10714       if (type == SHN_IA_64_ANSI_COMMON
10715           && elf_header.e_machine == EM_IA_64
10716           && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
10717         return "ANSI_COM";
10718       else if ((elf_header.e_machine == EM_X86_64
10719                 || elf_header.e_machine == EM_L1OM
10720                 || elf_header.e_machine == EM_K1OM)
10721                && type == SHN_X86_64_LCOMMON)
10722         return "LARGE_COM";
10723       else if ((type == SHN_MIPS_SCOMMON
10724                 && elf_header.e_machine == EM_MIPS)
10725                || (type == SHN_TIC6X_SCOMMON
10726                    && elf_header.e_machine == EM_TI_C6000))
10727         return "SCOM";
10728       else if (type == SHN_MIPS_SUNDEFINED
10729                && elf_header.e_machine == EM_MIPS)
10730         return "SUND";
10731       else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
10732         sprintf (buff, "PRC[0x%04x]", type & 0xffff);
10733       else if (type >= SHN_LOOS && type <= SHN_HIOS)
10734         sprintf (buff, "OS [0x%04x]", type & 0xffff);
10735       else if (type >= SHN_LORESERVE)
10736         sprintf (buff, "RSV[0x%04x]", type & 0xffff);
10737       else if (type >= elf_header.e_shnum)
10738         sprintf (buff, _("bad section index[%3d]"), type);
10739       else
10740         sprintf (buff, "%3d", type);
10741       break;
10742     }
10743
10744   return buff;
10745 }
10746
10747 static bfd_vma *
10748 get_dynamic_data (FILE * file, bfd_size_type number, unsigned int ent_size)
10749 {
10750   unsigned char * e_data;
10751   bfd_vma * i_data;
10752
10753   /* If the size_t type is smaller than the bfd_size_type, eg because
10754      you are building a 32-bit tool on a 64-bit host, then make sure
10755      that when (number) is cast to (size_t) no information is lost.  */
10756   if (sizeof (size_t) < sizeof (bfd_size_type)
10757       && (bfd_size_type) ((size_t) number) != number)
10758     {
10759       error (_("Size truncation prevents reading %" BFD_VMA_FMT "u"
10760                " elements of size %u\n"),
10761              number, ent_size);
10762       return NULL;
10763     }
10764
10765   /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
10766      attempting to allocate memory when the read is bound to fail.  */
10767   if (ent_size * number > current_file_size)
10768     {
10769       error (_("Invalid number of dynamic entries: %" BFD_VMA_FMT "u\n"),
10770              number);
10771       return NULL;
10772     }
10773
10774   e_data = (unsigned char *) cmalloc ((size_t) number, ent_size);
10775   if (e_data == NULL)
10776     {
10777       error (_("Out of memory reading %" BFD_VMA_FMT "u dynamic entries\n"),
10778              number);
10779       return NULL;
10780     }
10781
10782   if (fread (e_data, ent_size, (size_t) number, file) != number)
10783     {
10784       error (_("Unable to read in %" BFD_VMA_FMT "u bytes of dynamic data\n"),
10785              number * ent_size);
10786       free (e_data);
10787       return NULL;
10788     }
10789
10790   i_data = (bfd_vma *) cmalloc ((size_t) number, sizeof (*i_data));
10791   if (i_data == NULL)
10792     {
10793       error (_("Out of memory allocating space for %" BFD_VMA_FMT "u"
10794                " dynamic entries\n"),
10795              number);
10796       free (e_data);
10797       return NULL;
10798     }
10799
10800   while (number--)
10801     i_data[number] = byte_get (e_data + number * ent_size, ent_size);
10802
10803   free (e_data);
10804
10805   return i_data;
10806 }
10807
10808 static void
10809 print_dynamic_symbol (bfd_vma si, unsigned long hn)
10810 {
10811   Elf_Internal_Sym * psym;
10812   int n;
10813
10814   n = print_vma (si, DEC_5);
10815   if (n < 5)
10816     fputs (&"     "[n], stdout);
10817   printf (" %3lu: ", hn);
10818
10819   if (dynamic_symbols == NULL || si >= num_dynamic_syms)
10820     {
10821       printf (_("<No info available for dynamic symbol number %lu>\n"),
10822               (unsigned long) si);
10823       return;
10824     }
10825
10826   psym = dynamic_symbols + si;
10827   print_vma (psym->st_value, LONG_HEX);
10828   putchar (' ');
10829   print_vma (psym->st_size, DEC_5);
10830
10831   printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
10832   printf (" %-6s",  get_symbol_binding (ELF_ST_BIND (psym->st_info)));
10833
10834   if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
10835     printf (" %-7s",  get_solaris_symbol_visibility (psym->st_other));
10836   else
10837     {
10838       unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
10839
10840       printf (" %-7s",  get_symbol_visibility (vis));
10841       /* Check to see if any other bits in the st_other field are set.
10842          Note - displaying this information disrupts the layout of the
10843          table being generated, but for the moment this case is very
10844          rare.  */
10845       if (psym->st_other ^ vis)
10846         printf (" [%s] ", get_symbol_other (psym->st_other ^ vis));
10847     }
10848
10849   printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
10850   if (VALID_DYNAMIC_NAME (psym->st_name))
10851     print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
10852   else
10853     printf (_(" <corrupt: %14ld>"), psym->st_name);
10854   putchar ('\n');
10855 }
10856
10857 static const char *
10858 get_symbol_version_string (FILE *                       file,
10859                            bfd_boolean                  is_dynsym,
10860                            const char *                 strtab,
10861                            unsigned long int            strtab_size,
10862                            unsigned int                 si,
10863                            Elf_Internal_Sym *           psym,
10864                            enum versioned_symbol_info * sym_info,
10865                            unsigned short *             vna_other)
10866 {
10867   unsigned char data[2];
10868   unsigned short vers_data;
10869   unsigned long offset;
10870
10871   if (!is_dynsym
10872       || version_info[DT_VERSIONTAGIDX (DT_VERSYM)] == 0)
10873     return NULL;
10874
10875   offset = offset_from_vma (file, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10876                             sizeof data + si * sizeof (vers_data));
10877
10878   if (get_data (&data, file, offset + si * sizeof (vers_data),
10879                 sizeof (data), 1, _("version data")) == NULL)
10880     return NULL;
10881
10882   vers_data = byte_get (data, 2);
10883
10884   if ((vers_data & VERSYM_HIDDEN) == 0 && vers_data <= 1)
10885     return NULL;
10886
10887   /* Usually we'd only see verdef for defined symbols, and verneed for
10888      undefined symbols.  However, symbols defined by the linker in
10889      .dynbss for variables copied from a shared library in order to
10890      avoid text relocations are defined yet have verneed.  We could
10891      use a heuristic to detect the special case, for example, check
10892      for verneed first on symbols defined in SHT_NOBITS sections, but
10893      it is simpler and more reliable to just look for both verdef and
10894      verneed.  .dynbss might not be mapped to a SHT_NOBITS section.  */
10895
10896   if (psym->st_shndx != SHN_UNDEF
10897       && vers_data != 0x8001
10898       && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10899     {
10900       Elf_Internal_Verdef ivd;
10901       Elf_Internal_Verdaux ivda;
10902       Elf_External_Verdaux evda;
10903       unsigned long off;
10904
10905       off = offset_from_vma (file,
10906                              version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10907                              sizeof (Elf_External_Verdef));
10908
10909       do
10910         {
10911           Elf_External_Verdef evd;
10912
10913           if (get_data (&evd, file, off, sizeof (evd), 1,
10914                         _("version def")) == NULL)
10915             {
10916               ivd.vd_ndx = 0;
10917               ivd.vd_aux = 0;
10918               ivd.vd_next = 0;
10919             }
10920           else
10921             {
10922               ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
10923               ivd.vd_aux = BYTE_GET (evd.vd_aux);
10924               ivd.vd_next = BYTE_GET (evd.vd_next);
10925             }
10926
10927           off += ivd.vd_next;
10928         }
10929       while (ivd.vd_ndx != (vers_data & VERSYM_VERSION) && ivd.vd_next != 0);
10930
10931       if (ivd.vd_ndx == (vers_data & VERSYM_VERSION))
10932         {
10933           off -= ivd.vd_next;
10934           off += ivd.vd_aux;
10935
10936           if (get_data (&evda, file, off, sizeof (evda), 1,
10937                         _("version def aux")) != NULL)
10938             {
10939               ivda.vda_name = BYTE_GET (evda.vda_name);
10940
10941               if (psym->st_name != ivda.vda_name)
10942                 {
10943                   *sym_info = ((vers_data & VERSYM_HIDDEN) != 0
10944                                ? symbol_hidden : symbol_public);
10945                   return (ivda.vda_name < strtab_size
10946                           ? strtab + ivda.vda_name : _("<corrupt>"));
10947                 }
10948             }
10949         }
10950     }
10951
10952   if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
10953     {
10954       Elf_External_Verneed evn;
10955       Elf_Internal_Verneed ivn;
10956       Elf_Internal_Vernaux ivna;
10957
10958       offset = offset_from_vma (file,
10959                                 version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10960                                 sizeof evn);
10961       do
10962         {
10963           unsigned long vna_off;
10964
10965           if (get_data (&evn, file, offset, sizeof (evn), 1,
10966                         _("version need")) == NULL)
10967             {
10968               ivna.vna_next = 0;
10969               ivna.vna_other = 0;
10970               ivna.vna_name = 0;
10971               break;
10972             }
10973
10974           ivn.vn_aux  = BYTE_GET (evn.vn_aux);
10975           ivn.vn_next = BYTE_GET (evn.vn_next);
10976
10977           vna_off = offset + ivn.vn_aux;
10978
10979           do
10980             {
10981               Elf_External_Vernaux evna;
10982
10983               if (get_data (&evna, file, vna_off, sizeof (evna), 1,
10984                             _("version need aux (3)")) == NULL)
10985                 {
10986                   ivna.vna_next = 0;
10987                   ivna.vna_other = 0;
10988                   ivna.vna_name = 0;
10989                 }
10990               else
10991                 {
10992                   ivna.vna_other = BYTE_GET (evna.vna_other);
10993                   ivna.vna_next  = BYTE_GET (evna.vna_next);
10994                   ivna.vna_name  = BYTE_GET (evna.vna_name);
10995                 }
10996
10997               vna_off += ivna.vna_next;
10998             }
10999           while (ivna.vna_other != vers_data && ivna.vna_next != 0);
11000
11001           if (ivna.vna_other == vers_data)
11002             break;
11003
11004           offset += ivn.vn_next;
11005         }
11006       while (ivn.vn_next != 0);
11007
11008       if (ivna.vna_other == vers_data)
11009         {
11010           *sym_info = symbol_undefined;
11011           *vna_other = ivna.vna_other;
11012           return (ivna.vna_name < strtab_size
11013                   ? strtab + ivna.vna_name : _("<corrupt>"));
11014         }
11015     }
11016   return NULL;
11017 }
11018
11019 /* Dump the symbol table.  */
11020 static int
11021 process_symbol_table (FILE * file)
11022 {
11023   Elf_Internal_Shdr * section;
11024   bfd_size_type nbuckets = 0;
11025   bfd_size_type nchains = 0;
11026   bfd_vma * buckets = NULL;
11027   bfd_vma * chains = NULL;
11028   bfd_vma ngnubuckets = 0;
11029   bfd_vma * gnubuckets = NULL;
11030   bfd_vma * gnuchains = NULL;
11031   bfd_vma gnusymidx = 0;
11032   bfd_size_type ngnuchains = 0;
11033
11034   if (!do_syms && !do_dyn_syms && !do_histogram)
11035     return 1;
11036
11037   if (dynamic_info[DT_HASH]
11038       && (do_histogram
11039           || (do_using_dynamic
11040               && !do_dyn_syms
11041               && dynamic_strings != NULL)))
11042     {
11043       unsigned char nb[8];
11044       unsigned char nc[8];
11045       unsigned int hash_ent_size = 4;
11046
11047       if ((elf_header.e_machine == EM_ALPHA
11048            || elf_header.e_machine == EM_S390
11049            || elf_header.e_machine == EM_S390_OLD)
11050           && elf_header.e_ident[EI_CLASS] == ELFCLASS64)
11051         hash_ent_size = 8;
11052
11053       if (fseek (file,
11054                  (archive_file_offset
11055                   + offset_from_vma (file, dynamic_info[DT_HASH],
11056                                      sizeof nb + sizeof nc)),
11057                  SEEK_SET))
11058         {
11059           error (_("Unable to seek to start of dynamic information\n"));
11060           goto no_hash;
11061         }
11062
11063       if (fread (nb, hash_ent_size, 1, file) != 1)
11064         {
11065           error (_("Failed to read in number of buckets\n"));
11066           goto no_hash;
11067         }
11068
11069       if (fread (nc, hash_ent_size, 1, file) != 1)
11070         {
11071           error (_("Failed to read in number of chains\n"));
11072           goto no_hash;
11073         }
11074
11075       nbuckets = byte_get (nb, hash_ent_size);
11076       nchains  = byte_get (nc, hash_ent_size);
11077
11078       buckets = get_dynamic_data (file, nbuckets, hash_ent_size);
11079       chains  = get_dynamic_data (file, nchains, hash_ent_size);
11080
11081     no_hash:
11082       if (buckets == NULL || chains == NULL)
11083         {
11084           if (do_using_dynamic)
11085             return 0;
11086           free (buckets);
11087           free (chains);
11088           buckets = NULL;
11089           chains = NULL;
11090           nbuckets = 0;
11091           nchains = 0;
11092         }
11093     }
11094
11095   if (dynamic_info_DT_GNU_HASH
11096       && (do_histogram
11097           || (do_using_dynamic
11098               && !do_dyn_syms
11099               && dynamic_strings != NULL)))
11100     {
11101       unsigned char nb[16];
11102       bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
11103       bfd_vma buckets_vma;
11104
11105       if (fseek (file,
11106                  (archive_file_offset
11107                   + offset_from_vma (file, dynamic_info_DT_GNU_HASH,
11108                                      sizeof nb)),
11109                  SEEK_SET))
11110         {
11111           error (_("Unable to seek to start of dynamic information\n"));
11112           goto no_gnu_hash;
11113         }
11114
11115       if (fread (nb, 16, 1, file) != 1)
11116         {
11117           error (_("Failed to read in number of buckets\n"));
11118           goto no_gnu_hash;
11119         }
11120
11121       ngnubuckets = byte_get (nb, 4);
11122       gnusymidx = byte_get (nb + 4, 4);
11123       bitmaskwords = byte_get (nb + 8, 4);
11124       buckets_vma = dynamic_info_DT_GNU_HASH + 16;
11125       if (is_32bit_elf)
11126         buckets_vma += bitmaskwords * 4;
11127       else
11128         buckets_vma += bitmaskwords * 8;
11129
11130       if (fseek (file,
11131                  (archive_file_offset
11132                   + offset_from_vma (file, buckets_vma, 4)),
11133                  SEEK_SET))
11134         {
11135           error (_("Unable to seek to start of dynamic information\n"));
11136           goto no_gnu_hash;
11137         }
11138
11139       gnubuckets = get_dynamic_data (file, ngnubuckets, 4);
11140
11141       if (gnubuckets == NULL)
11142         goto no_gnu_hash;
11143
11144       for (i = 0; i < ngnubuckets; i++)
11145         if (gnubuckets[i] != 0)
11146           {
11147             if (gnubuckets[i] < gnusymidx)
11148               return 0;
11149
11150             if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
11151               maxchain = gnubuckets[i];
11152           }
11153
11154       if (maxchain == 0xffffffff)
11155         goto no_gnu_hash;
11156
11157       maxchain -= gnusymidx;
11158
11159       if (fseek (file,
11160                  (archive_file_offset
11161                   + offset_from_vma (file, buckets_vma
11162                                            + 4 * (ngnubuckets + maxchain), 4)),
11163                  SEEK_SET))
11164         {
11165           error (_("Unable to seek to start of dynamic information\n"));
11166           goto no_gnu_hash;
11167         }
11168
11169       do
11170         {
11171           if (fread (nb, 4, 1, file) != 1)
11172             {
11173               error (_("Failed to determine last chain length\n"));
11174               goto no_gnu_hash;
11175             }
11176
11177           if (maxchain + 1 == 0)
11178             goto no_gnu_hash;
11179
11180           ++maxchain;
11181         }
11182       while ((byte_get (nb, 4) & 1) == 0);
11183
11184       if (fseek (file,
11185                  (archive_file_offset
11186                   + offset_from_vma (file, buckets_vma + 4 * ngnubuckets, 4)),
11187                  SEEK_SET))
11188         {
11189           error (_("Unable to seek to start of dynamic information\n"));
11190           goto no_gnu_hash;
11191         }
11192
11193       gnuchains = get_dynamic_data (file, maxchain, 4);
11194       ngnuchains = maxchain;
11195
11196     no_gnu_hash:
11197       if (gnuchains == NULL)
11198         {
11199           free (gnubuckets);
11200           gnubuckets = NULL;
11201           ngnubuckets = 0;
11202           if (do_using_dynamic)
11203             return 0;
11204         }
11205     }
11206
11207   if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
11208       && do_syms
11209       && do_using_dynamic
11210       && dynamic_strings != NULL
11211       && dynamic_symbols != NULL)
11212     {
11213       unsigned long hn;
11214
11215       if (dynamic_info[DT_HASH])
11216         {
11217           bfd_vma si;
11218
11219           printf (_("\nSymbol table for image:\n"));
11220           if (is_32bit_elf)
11221             printf (_("  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"));
11222           else
11223             printf (_("  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"));
11224
11225           for (hn = 0; hn < nbuckets; hn++)
11226             {
11227               if (! buckets[hn])
11228                 continue;
11229
11230               for (si = buckets[hn]; si < nchains && si > 0; si = chains[si])
11231                 print_dynamic_symbol (si, hn);
11232             }
11233         }
11234
11235       if (dynamic_info_DT_GNU_HASH)
11236         {
11237           printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
11238           if (is_32bit_elf)
11239             printf (_("  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"));
11240           else
11241             printf (_("  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"));
11242
11243           for (hn = 0; hn < ngnubuckets; ++hn)
11244             if (gnubuckets[hn] != 0)
11245               {
11246                 bfd_vma si = gnubuckets[hn];
11247                 bfd_vma off = si - gnusymidx;
11248
11249                 do
11250                   {
11251                     print_dynamic_symbol (si, hn);
11252                     si++;
11253                   }
11254                 while (off < ngnuchains && (gnuchains[off++] & 1) == 0);
11255               }
11256         }
11257     }
11258   else if ((do_dyn_syms || (do_syms && !do_using_dynamic))
11259            && section_headers != NULL)
11260     {
11261       unsigned int i;
11262
11263       for (i = 0, section = section_headers;
11264            i < elf_header.e_shnum;
11265            i++, section++)
11266         {
11267           unsigned int si;
11268           char * strtab = NULL;
11269           unsigned long int strtab_size = 0;
11270           Elf_Internal_Sym * symtab;
11271           Elf_Internal_Sym * psym;
11272           unsigned long num_syms;
11273
11274           if ((section->sh_type != SHT_SYMTAB
11275                && section->sh_type != SHT_DYNSYM)
11276               || (!do_syms
11277                   && section->sh_type == SHT_SYMTAB))
11278             continue;
11279
11280           if (section->sh_entsize == 0)
11281             {
11282               printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
11283                       printable_section_name (section));
11284               continue;
11285             }
11286
11287           printf (_("\nSymbol table '%s' contains %lu entries:\n"),
11288                   printable_section_name (section),
11289                   (unsigned long) (section->sh_size / section->sh_entsize));
11290
11291           if (is_32bit_elf)
11292             printf (_("   Num:    Value  Size Type    Bind   Vis      Ndx Name\n"));
11293           else
11294             printf (_("   Num:    Value          Size Type    Bind   Vis      Ndx Name\n"));
11295
11296           symtab = GET_ELF_SYMBOLS (file, section, & num_syms);
11297           if (symtab == NULL)
11298             continue;
11299
11300           if (section->sh_link == elf_header.e_shstrndx)
11301             {
11302               strtab = string_table;
11303               strtab_size = string_table_length;
11304             }
11305           else if (section->sh_link < elf_header.e_shnum)
11306             {
11307               Elf_Internal_Shdr * string_sec;
11308
11309               string_sec = section_headers + section->sh_link;
11310
11311               strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
11312                                           1, string_sec->sh_size,
11313                                           _("string table"));
11314               strtab_size = strtab != NULL ? string_sec->sh_size : 0;
11315             }
11316
11317           for (si = 0, psym = symtab; si < num_syms; si++, psym++)
11318             {
11319               const char *version_string;
11320               enum versioned_symbol_info sym_info;
11321               unsigned short vna_other;
11322
11323               printf ("%6d: ", si);
11324               print_vma (psym->st_value, LONG_HEX);
11325               putchar (' ');
11326               print_vma (psym->st_size, DEC_5);
11327               printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
11328               printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
11329               if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
11330                 printf (" %-7s",  get_solaris_symbol_visibility (psym->st_other));
11331               else
11332                 {
11333                   unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
11334
11335                   printf (" %-7s", get_symbol_visibility (vis));
11336                   /* Check to see if any other bits in the st_other field are set.
11337                      Note - displaying this information disrupts the layout of the
11338                      table being generated, but for the moment this case is very rare.  */
11339                   if (psym->st_other ^ vis)
11340                     printf (" [%s] ", get_symbol_other (psym->st_other ^ vis));
11341                 }
11342               printf (" %4s ", get_symbol_index_type (psym->st_shndx));
11343               print_symbol (25, psym->st_name < strtab_size
11344                             ? strtab + psym->st_name : _("<corrupt>"));
11345
11346               version_string
11347                 = get_symbol_version_string (file,
11348                                              section->sh_type == SHT_DYNSYM,
11349                                              strtab, strtab_size, si,
11350                                              psym, &sym_info, &vna_other);
11351               if (version_string)
11352                 {
11353                   if (sym_info == symbol_undefined)
11354                     printf ("@%s (%d)", version_string, vna_other);
11355                   else
11356                     printf (sym_info == symbol_hidden ? "@%s" : "@@%s",
11357                             version_string);
11358                 }
11359
11360               putchar ('\n');
11361
11362               if (ELF_ST_BIND (psym->st_info) == STB_LOCAL
11363                   && si >= section->sh_info
11364                   /* Irix 5 and 6 MIPS binaries are known to ignore this requirement.  */
11365                   && elf_header.e_machine != EM_MIPS
11366                   /* Solaris binaries have been found to violate this requirement as
11367                      well.  Not sure if this is a bug or an ABI requirement.  */
11368                   && elf_header.e_ident[EI_OSABI] != ELFOSABI_SOLARIS)
11369                 warn (_("local symbol %u found at index >= %s's sh_info value of %u\n"),
11370                       si, printable_section_name (section), section->sh_info);
11371             }
11372
11373           free (symtab);
11374           if (strtab != string_table)
11375             free (strtab);
11376         }
11377     }
11378   else if (do_syms)
11379     printf
11380       (_("\nDynamic symbol information is not available for displaying symbols.\n"));
11381
11382   if (do_histogram && buckets != NULL)
11383     {
11384       unsigned long * lengths;
11385       unsigned long * counts;
11386       unsigned long hn;
11387       bfd_vma si;
11388       unsigned long maxlength = 0;
11389       unsigned long nzero_counts = 0;
11390       unsigned long nsyms = 0;
11391       unsigned long chained;
11392
11393       printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
11394               (unsigned long) nbuckets);
11395
11396       lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
11397       if (lengths == NULL)
11398         {
11399           error (_("Out of memory allocating space for histogram buckets\n"));
11400           return 0;
11401         }
11402
11403       printf (_(" Length  Number     %% of total  Coverage\n"));
11404       for (hn = 0; hn < nbuckets; ++hn)
11405         {
11406           for (si = buckets[hn], chained = 0;
11407                si > 0 && si < nchains && si < nbuckets && chained <= nchains;
11408                si = chains[si], ++chained)
11409             {
11410               ++nsyms;
11411               if (maxlength < ++lengths[hn])
11412                 ++maxlength;
11413             }
11414
11415             /* PR binutils/17531: A corrupt binary could contain broken
11416                histogram data.  Do not go into an infinite loop trying
11417                to process it.  */
11418             if (chained > nchains)
11419               {
11420                 error (_("histogram chain is corrupt\n"));
11421                 break;
11422               }
11423         }
11424
11425       counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
11426       if (counts == NULL)
11427         {
11428           free (lengths);
11429           error (_("Out of memory allocating space for histogram counts\n"));
11430           return 0;
11431         }
11432
11433       for (hn = 0; hn < nbuckets; ++hn)
11434         ++counts[lengths[hn]];
11435
11436       if (nbuckets > 0)
11437         {
11438           unsigned long i;
11439           printf ("      0  %-10lu (%5.1f%%)\n",
11440                   counts[0], (counts[0] * 100.0) / nbuckets);
11441           for (i = 1; i <= maxlength; ++i)
11442             {
11443               nzero_counts += counts[i] * i;
11444               printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
11445                       i, counts[i], (counts[i] * 100.0) / nbuckets,
11446                       (nzero_counts * 100.0) / nsyms);
11447             }
11448         }
11449
11450       free (counts);
11451       free (lengths);
11452     }
11453
11454   if (buckets != NULL)
11455     {
11456       free (buckets);
11457       free (chains);
11458     }
11459
11460   if (do_histogram && gnubuckets != NULL)
11461     {
11462       unsigned long * lengths;
11463       unsigned long * counts;
11464       unsigned long hn;
11465       unsigned long maxlength = 0;
11466       unsigned long nzero_counts = 0;
11467       unsigned long nsyms = 0;
11468
11469       printf (_("\nHistogram for `.gnu.hash' bucket list length (total of %lu buckets):\n"),
11470               (unsigned long) ngnubuckets);
11471
11472       lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
11473       if (lengths == NULL)
11474         {
11475           error (_("Out of memory allocating space for gnu histogram buckets\n"));
11476           return 0;
11477         }
11478
11479       printf (_(" Length  Number     %% of total  Coverage\n"));
11480
11481       for (hn = 0; hn < ngnubuckets; ++hn)
11482         if (gnubuckets[hn] != 0)
11483           {
11484             bfd_vma off, length = 1;
11485
11486             for (off = gnubuckets[hn] - gnusymidx;
11487                  /* PR 17531 file: 010-77222-0.004.  */
11488                  off < ngnuchains && (gnuchains[off] & 1) == 0;
11489                  ++off)
11490               ++length;
11491             lengths[hn] = length;
11492             if (length > maxlength)
11493               maxlength = length;
11494             nsyms += length;
11495           }
11496
11497       counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
11498       if (counts == NULL)
11499         {
11500           free (lengths);
11501           error (_("Out of memory allocating space for gnu histogram counts\n"));
11502           return 0;
11503         }
11504
11505       for (hn = 0; hn < ngnubuckets; ++hn)
11506         ++counts[lengths[hn]];
11507
11508       if (ngnubuckets > 0)
11509         {
11510           unsigned long j;
11511           printf ("      0  %-10lu (%5.1f%%)\n",
11512                   counts[0], (counts[0] * 100.0) / ngnubuckets);
11513           for (j = 1; j <= maxlength; ++j)
11514             {
11515               nzero_counts += counts[j] * j;
11516               printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
11517                       j, counts[j], (counts[j] * 100.0) / ngnubuckets,
11518                       (nzero_counts * 100.0) / nsyms);
11519             }
11520         }
11521
11522       free (counts);
11523       free (lengths);
11524       free (gnubuckets);
11525       free (gnuchains);
11526     }
11527
11528   return 1;
11529 }
11530
11531 static int
11532 process_syminfo (FILE * file ATTRIBUTE_UNUSED)
11533 {
11534   unsigned int i;
11535
11536   if (dynamic_syminfo == NULL
11537       || !do_dynamic)
11538     /* No syminfo, this is ok.  */
11539     return 1;
11540
11541   /* There better should be a dynamic symbol section.  */
11542   if (dynamic_symbols == NULL || dynamic_strings == NULL)
11543     return 0;
11544
11545   if (dynamic_addr)
11546     printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
11547             dynamic_syminfo_offset, dynamic_syminfo_nent);
11548
11549   printf (_(" Num: Name                           BoundTo     Flags\n"));
11550   for (i = 0; i < dynamic_syminfo_nent; ++i)
11551     {
11552       unsigned short int flags = dynamic_syminfo[i].si_flags;
11553
11554       printf ("%4d: ", i);
11555       if (i >= num_dynamic_syms)
11556         printf (_("<corrupt index>"));
11557       else if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
11558         print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
11559       else
11560         printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
11561       putchar (' ');
11562
11563       switch (dynamic_syminfo[i].si_boundto)
11564         {
11565         case SYMINFO_BT_SELF:
11566           fputs ("SELF       ", stdout);
11567           break;
11568         case SYMINFO_BT_PARENT:
11569           fputs ("PARENT     ", stdout);
11570           break;
11571         default:
11572           if (dynamic_syminfo[i].si_boundto > 0
11573               && dynamic_syminfo[i].si_boundto < dynamic_nent
11574               && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
11575             {
11576               print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
11577               putchar (' ' );
11578             }
11579           else
11580             printf ("%-10d ", dynamic_syminfo[i].si_boundto);
11581           break;
11582         }
11583
11584       if (flags & SYMINFO_FLG_DIRECT)
11585         printf (" DIRECT");
11586       if (flags & SYMINFO_FLG_PASSTHRU)
11587         printf (" PASSTHRU");
11588       if (flags & SYMINFO_FLG_COPY)
11589         printf (" COPY");
11590       if (flags & SYMINFO_FLG_LAZYLOAD)
11591         printf (" LAZYLOAD");
11592
11593       puts ("");
11594     }
11595
11596   return 1;
11597 }
11598
11599 #define IN_RANGE(START,END,ADDR,OFF)            \
11600   (((ADDR) >= (START)) && ((ADDR) + (OFF) < (END)))
11601
11602 /* Check to see if the given reloc needs to be handled in a target specific
11603    manner.  If so then process the reloc and return TRUE otherwise return
11604    FALSE.
11605
11606    If called with reloc == NULL, then this is a signal that reloc processing
11607    for the current section has finished, and any saved state should be
11608    discarded.  */
11609
11610 static bfd_boolean
11611 target_specific_reloc_handling (Elf_Internal_Rela * reloc,
11612                                 unsigned char *     start,
11613                                 unsigned char *     end,
11614                                 Elf_Internal_Sym *  symtab,
11615                                 unsigned long       num_syms)
11616 {
11617   unsigned int reloc_type = 0;
11618   unsigned long sym_index = 0;
11619
11620   if (reloc)
11621     {
11622       reloc_type = get_reloc_type (reloc->r_info);
11623       sym_index = get_reloc_symindex (reloc->r_info);
11624     }
11625
11626   switch (elf_header.e_machine)
11627     {
11628     case EM_MSP430:
11629     case EM_MSP430_OLD:
11630       {
11631         static Elf_Internal_Sym * saved_sym = NULL;
11632
11633         if (reloc == NULL)
11634           {
11635             saved_sym = NULL;
11636             return TRUE;
11637           }
11638
11639         switch (reloc_type)
11640           {
11641           case 10: /* R_MSP430_SYM_DIFF */
11642             if (uses_msp430x_relocs ())
11643               break;
11644             /* Fall through.  */
11645           case 21: /* R_MSP430X_SYM_DIFF */
11646             /* PR 21139.  */
11647             if (sym_index >= num_syms)
11648               error (_("MSP430 SYM_DIFF reloc contains invalid symbol index %lu\n"),
11649                      sym_index);
11650             else
11651               saved_sym = symtab + sym_index;
11652             return TRUE;
11653
11654           case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
11655           case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
11656             goto handle_sym_diff;
11657
11658           case 5: /* R_MSP430_16_BYTE */
11659           case 9: /* R_MSP430_8 */
11660             if (uses_msp430x_relocs ())
11661               break;
11662             goto handle_sym_diff;
11663
11664           case 2: /* R_MSP430_ABS16 */
11665           case 15: /* R_MSP430X_ABS16 */
11666             if (! uses_msp430x_relocs ())
11667               break;
11668             goto handle_sym_diff;
11669
11670           handle_sym_diff:
11671             if (saved_sym != NULL)
11672               {
11673                 int reloc_size = reloc_type == 1 ? 4 : 2;
11674                 bfd_vma value;
11675
11676                 if (sym_index >= num_syms)
11677                   error (_("MSP430 reloc contains invalid symbol index %lu\n"),
11678                          sym_index);
11679                 else
11680                   {
11681                     value = reloc->r_addend + (symtab[sym_index].st_value
11682                                                - saved_sym->st_value);
11683
11684                     if (IN_RANGE (start, end, start + reloc->r_offset, reloc_size))
11685                       byte_put (start + reloc->r_offset, value, reloc_size);
11686                     else
11687                       /* PR 21137 */
11688                       error (_("MSP430 sym diff reloc contains invalid offset: 0x%lx\n"),
11689                              (long) reloc->r_offset);
11690                   }
11691
11692                 saved_sym = NULL;
11693                 return TRUE;
11694               }
11695             break;
11696
11697           default:
11698             if (saved_sym != NULL)
11699               error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc\n"));
11700             break;
11701           }
11702         break;
11703       }
11704
11705     case EM_MN10300:
11706     case EM_CYGNUS_MN10300:
11707       {
11708         static Elf_Internal_Sym * saved_sym = NULL;
11709
11710         if (reloc == NULL)
11711           {
11712             saved_sym = NULL;
11713             return TRUE;
11714           }
11715
11716         switch (reloc_type)
11717           {
11718           case 34: /* R_MN10300_ALIGN */
11719             return TRUE;
11720           case 33: /* R_MN10300_SYM_DIFF */
11721             if (sym_index >= num_syms)
11722               error (_("MN10300_SYM_DIFF reloc contains invalid symbol index %lu\n"),
11723                      sym_index);
11724             else
11725               saved_sym = symtab + sym_index;
11726             return TRUE;
11727
11728           case 1: /* R_MN10300_32 */
11729           case 2: /* R_MN10300_16 */
11730             if (saved_sym != NULL)
11731               {
11732                 int reloc_size = reloc_type == 1 ? 4 : 2;
11733                 bfd_vma value;
11734
11735                 if (sym_index >= num_syms)
11736                   error (_("MN10300 reloc contains invalid symbol index %lu\n"),
11737                          sym_index);
11738                 else
11739                   {
11740                     value = reloc->r_addend + (symtab[sym_index].st_value
11741                                                - saved_sym->st_value);
11742
11743                     if (IN_RANGE (start, end, start + reloc->r_offset, reloc_size))
11744                       byte_put (start + reloc->r_offset, value, reloc_size);
11745                     else
11746                       error (_("MN10300 sym diff reloc contains invalid offset: 0x%lx\n"),
11747                              (long) reloc->r_offset);
11748                   }
11749
11750                 saved_sym = NULL;
11751                 return TRUE;
11752               }
11753             break;
11754           default:
11755             if (saved_sym != NULL)
11756               error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc\n"));
11757             break;
11758           }
11759         break;
11760       }
11761
11762     case EM_RL78:
11763       {
11764         static bfd_vma saved_sym1 = 0;
11765         static bfd_vma saved_sym2 = 0;
11766         static bfd_vma value;
11767
11768         if (reloc == NULL)
11769           {
11770             saved_sym1 = saved_sym2 = 0;
11771             return TRUE;
11772           }
11773
11774         switch (reloc_type)
11775           {
11776           case 0x80: /* R_RL78_SYM.  */
11777             saved_sym1 = saved_sym2;
11778             if (sym_index >= num_syms)
11779               error (_("RL78_SYM reloc contains invalid symbol index %lu\n"),
11780                      sym_index);
11781             else
11782               {
11783                 saved_sym2 = symtab[sym_index].st_value;
11784                 saved_sym2 += reloc->r_addend;
11785               }
11786             return TRUE;
11787
11788           case 0x83: /* R_RL78_OPsub.  */
11789             value = saved_sym1 - saved_sym2;
11790             saved_sym2 = saved_sym1 = 0;
11791             return TRUE;
11792             break;
11793
11794           case 0x41: /* R_RL78_ABS32.  */
11795             if (IN_RANGE (start, end, start + reloc->r_offset, 4))
11796               byte_put (start + reloc->r_offset, value, 4);
11797             else
11798               error (_("RL78 sym diff reloc contains invalid offset: 0x%lx\n"),
11799                      (long) reloc->r_offset);
11800             value = 0;
11801             return TRUE;
11802
11803           case 0x43: /* R_RL78_ABS16.  */
11804             if (IN_RANGE (start, end, start + reloc->r_offset, 2))
11805               byte_put (start + reloc->r_offset, value, 2);
11806             else
11807               error (_("RL78 sym diff reloc contains invalid offset: 0x%lx\n"),
11808                      (long) reloc->r_offset);
11809             value = 0;
11810             return TRUE;
11811
11812           default:
11813             break;
11814           }
11815         break;
11816       }
11817     }
11818
11819   return FALSE;
11820 }
11821
11822 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
11823    DWARF debug sections.  This is a target specific test.  Note - we do not
11824    go through the whole including-target-headers-multiple-times route, (as
11825    we have already done with <elf/h8.h>) because this would become very
11826    messy and even then this function would have to contain target specific
11827    information (the names of the relocs instead of their numeric values).
11828    FIXME: This is not the correct way to solve this problem.  The proper way
11829    is to have target specific reloc sizing and typing functions created by
11830    the reloc-macros.h header, in the same way that it already creates the
11831    reloc naming functions.  */
11832
11833 static bfd_boolean
11834 is_32bit_abs_reloc (unsigned int reloc_type)
11835 {
11836   /* Please keep this table alpha-sorted for ease of visual lookup.  */
11837   switch (elf_header.e_machine)
11838     {
11839     case EM_386:
11840     case EM_IAMCU:
11841       return reloc_type == 1; /* R_386_32.  */
11842     case EM_68K:
11843       return reloc_type == 1; /* R_68K_32.  */
11844     case EM_860:
11845       return reloc_type == 1; /* R_860_32.  */
11846     case EM_960:
11847       return reloc_type == 2; /* R_960_32.  */
11848     case EM_AARCH64:
11849       return (reloc_type == 258
11850               || reloc_type == 1); /* R_AARCH64_ABS32 || R_AARCH64_P32_ABS32 */
11851     case EM_ADAPTEVA_EPIPHANY:
11852       return reloc_type == 3;
11853     case EM_ALPHA:
11854       return reloc_type == 1; /* R_ALPHA_REFLONG.  */
11855     case EM_ARC:
11856       return reloc_type == 1; /* R_ARC_32.  */
11857     case EM_ARC_COMPACT:
11858     case EM_ARC_COMPACT2:
11859       return reloc_type == 4; /* R_ARC_32.  */
11860     case EM_ARM:
11861       return reloc_type == 2; /* R_ARM_ABS32 */
11862     case EM_AVR_OLD:
11863     case EM_AVR:
11864       return reloc_type == 1;
11865     case EM_BLACKFIN:
11866       return reloc_type == 0x12; /* R_byte4_data.  */
11867     case EM_CRIS:
11868       return reloc_type == 3; /* R_CRIS_32.  */
11869     case EM_CR16:
11870       return reloc_type == 3; /* R_CR16_NUM32.  */
11871     case EM_CRX:
11872       return reloc_type == 15; /* R_CRX_NUM32.  */
11873     case EM_CYGNUS_FRV:
11874       return reloc_type == 1;
11875     case EM_CYGNUS_D10V:
11876     case EM_D10V:
11877       return reloc_type == 6; /* R_D10V_32.  */
11878     case EM_CYGNUS_D30V:
11879     case EM_D30V:
11880       return reloc_type == 12; /* R_D30V_32_NORMAL.  */
11881     case EM_DLX:
11882       return reloc_type == 3; /* R_DLX_RELOC_32.  */
11883     case EM_CYGNUS_FR30:
11884     case EM_FR30:
11885       return reloc_type == 3; /* R_FR30_32.  */
11886     case EM_FT32:
11887       return reloc_type == 1; /* R_FT32_32.  */
11888     case EM_H8S:
11889     case EM_H8_300:
11890     case EM_H8_300H:
11891       return reloc_type == 1; /* R_H8_DIR32.  */
11892     case EM_IA_64:
11893       return reloc_type == 0x65 /* R_IA64_SECREL32LSB.  */
11894         || reloc_type == 0x25;  /* R_IA64_DIR32LSB.  */
11895     case EM_IP2K_OLD:
11896     case EM_IP2K:
11897       return reloc_type == 2; /* R_IP2K_32.  */
11898     case EM_IQ2000:
11899       return reloc_type == 2; /* R_IQ2000_32.  */
11900     case EM_LATTICEMICO32:
11901       return reloc_type == 3; /* R_LM32_32.  */
11902     case EM_M32C_OLD:
11903     case EM_M32C:
11904       return reloc_type == 3; /* R_M32C_32.  */
11905     case EM_M32R:
11906       return reloc_type == 34; /* R_M32R_32_RELA.  */
11907     case EM_68HC11:
11908     case EM_68HC12:
11909       return reloc_type == 6; /* R_M68HC11_32.  */
11910     case EM_MCORE:
11911       return reloc_type == 1; /* R_MCORE_ADDR32.  */
11912     case EM_CYGNUS_MEP:
11913       return reloc_type == 4; /* R_MEP_32.  */
11914     case EM_METAG:
11915       return reloc_type == 2; /* R_METAG_ADDR32.  */
11916     case EM_MICROBLAZE:
11917       return reloc_type == 1; /* R_MICROBLAZE_32.  */
11918     case EM_MIPS:
11919       return reloc_type == 2; /* R_MIPS_32.  */
11920     case EM_MMIX:
11921       return reloc_type == 4; /* R_MMIX_32.  */
11922     case EM_CYGNUS_MN10200:
11923     case EM_MN10200:
11924       return reloc_type == 1; /* R_MN10200_32.  */
11925     case EM_CYGNUS_MN10300:
11926     case EM_MN10300:
11927       return reloc_type == 1; /* R_MN10300_32.  */
11928     case EM_MOXIE:
11929       return reloc_type == 1; /* R_MOXIE_32.  */
11930     case EM_MSP430_OLD:
11931     case EM_MSP430:
11932       return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32.  */
11933     case EM_MT:
11934       return reloc_type == 2; /* R_MT_32.  */
11935     case EM_NDS32:
11936       return reloc_type == 20; /* R_NDS32_RELA.  */
11937     case EM_ALTERA_NIOS2:
11938       return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32.  */
11939     case EM_NIOS32:
11940       return reloc_type == 1; /* R_NIOS_32.  */
11941     case EM_OR1K:
11942       return reloc_type == 1; /* R_OR1K_32.  */
11943     case EM_PARISC:
11944       return (reloc_type == 1 /* R_PARISC_DIR32.  */
11945               || reloc_type == 41); /* R_PARISC_SECREL32.  */
11946     case EM_PJ:
11947     case EM_PJ_OLD:
11948       return reloc_type == 1; /* R_PJ_DATA_DIR32.  */
11949     case EM_PPC64:
11950       return reloc_type == 1; /* R_PPC64_ADDR32.  */
11951     case EM_PPC:
11952       return reloc_type == 1; /* R_PPC_ADDR32.  */
11953     case EM_TI_PRU:
11954       return reloc_type == 11; /* R_PRU_BFD_RELOC_32.  */
11955     case EM_RISCV:
11956       return reloc_type == 1; /* R_RISCV_32.  */
11957     case EM_RL78:
11958       return reloc_type == 1; /* R_RL78_DIR32.  */
11959     case EM_RX:
11960       return reloc_type == 1; /* R_RX_DIR32.  */
11961     case EM_S370:
11962       return reloc_type == 1; /* R_I370_ADDR31.  */
11963     case EM_S390_OLD:
11964     case EM_S390:
11965       return reloc_type == 4; /* R_S390_32.  */
11966     case EM_SCORE:
11967       return reloc_type == 8; /* R_SCORE_ABS32.  */
11968     case EM_SH:
11969       return reloc_type == 1; /* R_SH_DIR32.  */
11970     case EM_SPARC32PLUS:
11971     case EM_SPARCV9:
11972     case EM_SPARC:
11973       return reloc_type == 3 /* R_SPARC_32.  */
11974         || reloc_type == 23; /* R_SPARC_UA32.  */
11975     case EM_SPU:
11976       return reloc_type == 6; /* R_SPU_ADDR32 */
11977     case EM_TI_C6000:
11978       return reloc_type == 1; /* R_C6000_ABS32.  */
11979     case EM_TILEGX:
11980       return reloc_type == 2; /* R_TILEGX_32.  */
11981     case EM_TILEPRO:
11982       return reloc_type == 1; /* R_TILEPRO_32.  */
11983     case EM_CYGNUS_V850:
11984     case EM_V850:
11985       return reloc_type == 6; /* R_V850_ABS32.  */
11986     case EM_V800:
11987       return reloc_type == 0x33; /* R_V810_WORD.  */
11988     case EM_VAX:
11989       return reloc_type == 1; /* R_VAX_32.  */
11990     case EM_VISIUM:
11991       return reloc_type == 3;  /* R_VISIUM_32. */
11992     case EM_X86_64:
11993     case EM_L1OM:
11994     case EM_K1OM:
11995       return reloc_type == 10; /* R_X86_64_32.  */
11996     case EM_XC16X:
11997     case EM_C166:
11998       return reloc_type == 3; /* R_XC16C_ABS_32.  */
11999     case EM_XGATE:
12000       return reloc_type == 4; /* R_XGATE_32.  */
12001     case EM_XSTORMY16:
12002       return reloc_type == 1; /* R_XSTROMY16_32.  */
12003     case EM_XTENSA_OLD:
12004     case EM_XTENSA:
12005       return reloc_type == 1; /* R_XTENSA_32.  */
12006     default:
12007       {
12008         static unsigned int prev_warn = 0;
12009
12010         /* Avoid repeating the same warning multiple times.  */
12011         if (prev_warn != elf_header.e_machine)
12012           error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
12013                  elf_header.e_machine);
12014         prev_warn = elf_header.e_machine;
12015         return FALSE;
12016       }
12017     }
12018 }
12019
12020 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12021    a 32-bit pc-relative RELA relocation used in DWARF debug sections.  */
12022
12023 static bfd_boolean
12024 is_32bit_pcrel_reloc (unsigned int reloc_type)
12025 {
12026   switch (elf_header.e_machine)
12027   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12028     {
12029     case EM_386:
12030     case EM_IAMCU:
12031       return reloc_type == 2;  /* R_386_PC32.  */
12032     case EM_68K:
12033       return reloc_type == 4;  /* R_68K_PC32.  */
12034     case EM_AARCH64:
12035       return reloc_type == 261; /* R_AARCH64_PREL32 */
12036     case EM_ADAPTEVA_EPIPHANY:
12037       return reloc_type == 6;
12038     case EM_ALPHA:
12039       return reloc_type == 10; /* R_ALPHA_SREL32.  */
12040     case EM_ARC_COMPACT:
12041     case EM_ARC_COMPACT2:
12042       return reloc_type == 49; /* R_ARC_32_PCREL.  */
12043     case EM_ARM:
12044       return reloc_type == 3;  /* R_ARM_REL32 */
12045     case EM_AVR_OLD:
12046     case EM_AVR:
12047       return reloc_type == 36; /* R_AVR_32_PCREL.  */
12048     case EM_MICROBLAZE:
12049       return reloc_type == 2;  /* R_MICROBLAZE_32_PCREL.  */
12050     case EM_OR1K:
12051       return reloc_type == 9; /* R_OR1K_32_PCREL.  */
12052     case EM_PARISC:
12053       return reloc_type == 9;  /* R_PARISC_PCREL32.  */
12054     case EM_PPC:
12055       return reloc_type == 26; /* R_PPC_REL32.  */
12056     case EM_PPC64:
12057       return reloc_type == 26; /* R_PPC64_REL32.  */
12058     case EM_S390_OLD:
12059     case EM_S390:
12060       return reloc_type == 5;  /* R_390_PC32.  */
12061     case EM_SH:
12062       return reloc_type == 2;  /* R_SH_REL32.  */
12063     case EM_SPARC32PLUS:
12064     case EM_SPARCV9:
12065     case EM_SPARC:
12066       return reloc_type == 6;  /* R_SPARC_DISP32.  */
12067     case EM_SPU:
12068       return reloc_type == 13; /* R_SPU_REL32.  */
12069     case EM_TILEGX:
12070       return reloc_type == 6; /* R_TILEGX_32_PCREL.  */
12071     case EM_TILEPRO:
12072       return reloc_type == 4; /* R_TILEPRO_32_PCREL.  */
12073     case EM_VISIUM:
12074       return reloc_type == 6;  /* R_VISIUM_32_PCREL */
12075     case EM_X86_64:
12076     case EM_L1OM:
12077     case EM_K1OM:
12078       return reloc_type == 2;  /* R_X86_64_PC32.  */
12079     case EM_XTENSA_OLD:
12080     case EM_XTENSA:
12081       return reloc_type == 14; /* R_XTENSA_32_PCREL.  */
12082     default:
12083       /* Do not abort or issue an error message here.  Not all targets use
12084          pc-relative 32-bit relocs in their DWARF debug information and we
12085          have already tested for target coverage in is_32bit_abs_reloc.  A
12086          more helpful warning message will be generated by apply_relocations
12087          anyway, so just return.  */
12088       return FALSE;
12089     }
12090 }
12091
12092 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12093    a 64-bit absolute RELA relocation used in DWARF debug sections.  */
12094
12095 static bfd_boolean
12096 is_64bit_abs_reloc (unsigned int reloc_type)
12097 {
12098   switch (elf_header.e_machine)
12099     {
12100     case EM_AARCH64:
12101       return reloc_type == 257; /* R_AARCH64_ABS64.  */
12102     case EM_ALPHA:
12103       return reloc_type == 2; /* R_ALPHA_REFQUAD.  */
12104     case EM_IA_64:
12105       return reloc_type == 0x27; /* R_IA64_DIR64LSB.  */
12106     case EM_PARISC:
12107       return reloc_type == 80; /* R_PARISC_DIR64.  */
12108     case EM_PPC64:
12109       return reloc_type == 38; /* R_PPC64_ADDR64.  */
12110     case EM_RISCV:
12111       return reloc_type == 2; /* R_RISCV_64.  */
12112     case EM_SPARC32PLUS:
12113     case EM_SPARCV9:
12114     case EM_SPARC:
12115       return reloc_type == 54; /* R_SPARC_UA64.  */
12116     case EM_X86_64:
12117     case EM_L1OM:
12118     case EM_K1OM:
12119       return reloc_type == 1; /* R_X86_64_64.  */
12120     case EM_S390_OLD:
12121     case EM_S390:
12122       return reloc_type == 22;  /* R_S390_64.  */
12123     case EM_TILEGX:
12124       return reloc_type == 1; /* R_TILEGX_64.  */
12125     case EM_MIPS:
12126       return reloc_type == 18;  /* R_MIPS_64.  */
12127     default:
12128       return FALSE;
12129     }
12130 }
12131
12132 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
12133    a 64-bit pc-relative RELA relocation used in DWARF debug sections.  */
12134
12135 static bfd_boolean
12136 is_64bit_pcrel_reloc (unsigned int reloc_type)
12137 {
12138   switch (elf_header.e_machine)
12139     {
12140     case EM_AARCH64:
12141       return reloc_type == 260; /* R_AARCH64_PREL64.  */
12142     case EM_ALPHA:
12143       return reloc_type == 11; /* R_ALPHA_SREL64.  */
12144     case EM_IA_64:
12145       return reloc_type == 0x4f; /* R_IA64_PCREL64LSB.  */
12146     case EM_PARISC:
12147       return reloc_type == 72; /* R_PARISC_PCREL64.  */
12148     case EM_PPC64:
12149       return reloc_type == 44; /* R_PPC64_REL64.  */
12150     case EM_SPARC32PLUS:
12151     case EM_SPARCV9:
12152     case EM_SPARC:
12153       return reloc_type == 46; /* R_SPARC_DISP64.  */
12154     case EM_X86_64:
12155     case EM_L1OM:
12156     case EM_K1OM:
12157       return reloc_type == 24; /* R_X86_64_PC64.  */
12158     case EM_S390_OLD:
12159     case EM_S390:
12160       return reloc_type == 23;  /* R_S390_PC64.  */
12161     case EM_TILEGX:
12162       return reloc_type == 5;  /* R_TILEGX_64_PCREL.  */
12163     default:
12164       return FALSE;
12165     }
12166 }
12167
12168 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12169    a 24-bit absolute RELA relocation used in DWARF debug sections.  */
12170
12171 static bfd_boolean
12172 is_24bit_abs_reloc (unsigned int reloc_type)
12173 {
12174   switch (elf_header.e_machine)
12175     {
12176     case EM_CYGNUS_MN10200:
12177     case EM_MN10200:
12178       return reloc_type == 4; /* R_MN10200_24.  */
12179     case EM_FT32:
12180       return reloc_type == 5; /* R_FT32_20.  */
12181     default:
12182       return FALSE;
12183     }
12184 }
12185
12186 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12187    a 16-bit absolute RELA relocation used in DWARF debug sections.  */
12188
12189 static bfd_boolean
12190 is_16bit_abs_reloc (unsigned int reloc_type)
12191 {
12192   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12193   switch (elf_header.e_machine)
12194     {
12195     case EM_ARC:
12196     case EM_ARC_COMPACT:
12197     case EM_ARC_COMPACT2:
12198       return reloc_type == 2; /* R_ARC_16.  */
12199     case EM_ADAPTEVA_EPIPHANY:
12200       return reloc_type == 5;
12201     case EM_AVR_OLD:
12202     case EM_AVR:
12203       return reloc_type == 4; /* R_AVR_16.  */
12204     case EM_CYGNUS_D10V:
12205     case EM_D10V:
12206       return reloc_type == 3; /* R_D10V_16.  */
12207     case EM_H8S:
12208     case EM_H8_300:
12209     case EM_H8_300H:
12210       return reloc_type == R_H8_DIR16;
12211     case EM_IP2K_OLD:
12212     case EM_IP2K:
12213       return reloc_type == 1; /* R_IP2K_16.  */
12214     case EM_M32C_OLD:
12215     case EM_M32C:
12216       return reloc_type == 1; /* R_M32C_16 */
12217     case EM_CYGNUS_MN10200:
12218     case EM_MN10200:
12219       return reloc_type == 2; /* R_MN10200_16.  */
12220     case EM_CYGNUS_MN10300:
12221     case EM_MN10300:
12222       return reloc_type == 2; /* R_MN10300_16.  */
12223     case EM_MSP430:
12224       if (uses_msp430x_relocs ())
12225         return reloc_type == 2; /* R_MSP430_ABS16.  */
12226       /* Fall through.  */
12227     case EM_MSP430_OLD:
12228       return reloc_type == 5; /* R_MSP430_16_BYTE.  */
12229     case EM_NDS32:
12230       return reloc_type == 19; /* R_NDS32_RELA.  */
12231     case EM_ALTERA_NIOS2:
12232       return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16.  */
12233     case EM_NIOS32:
12234       return reloc_type == 9; /* R_NIOS_16.  */
12235     case EM_OR1K:
12236       return reloc_type == 2; /* R_OR1K_16.  */
12237     case EM_TI_PRU:
12238       return reloc_type == 8; /* R_PRU_BFD_RELOC_16.  */
12239     case EM_TI_C6000:
12240       return reloc_type == 2; /* R_C6000_ABS16.  */
12241     case EM_VISIUM:
12242       return reloc_type == 2; /* R_VISIUM_16. */
12243     case EM_XC16X:
12244     case EM_C166:
12245       return reloc_type == 2; /* R_XC16C_ABS_16.  */
12246     case EM_XGATE:
12247       return reloc_type == 3; /* R_XGATE_16.  */
12248     default:
12249       return FALSE;
12250     }
12251 }
12252
12253 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
12254    relocation entries (possibly formerly used for SHT_GROUP sections).  */
12255
12256 static bfd_boolean
12257 is_none_reloc (unsigned int reloc_type)
12258 {
12259   switch (elf_header.e_machine)
12260     {
12261     case EM_386:     /* R_386_NONE.  */
12262     case EM_68K:     /* R_68K_NONE.  */
12263     case EM_ADAPTEVA_EPIPHANY:
12264     case EM_ALPHA:   /* R_ALPHA_NONE.  */
12265     case EM_ALTERA_NIOS2: /* R_NIOS2_NONE.  */
12266     case EM_ARC:     /* R_ARC_NONE.  */
12267     case EM_ARC_COMPACT2: /* R_ARC_NONE.  */
12268     case EM_ARC_COMPACT: /* R_ARC_NONE.  */
12269     case EM_ARM:     /* R_ARM_NONE.  */
12270     case EM_C166:    /* R_XC16X_NONE.  */
12271     case EM_CRIS:    /* R_CRIS_NONE.  */
12272     case EM_FT32:    /* R_FT32_NONE.  */
12273     case EM_IA_64:   /* R_IA64_NONE.  */
12274     case EM_K1OM:    /* R_X86_64_NONE.  */
12275     case EM_L1OM:    /* R_X86_64_NONE.  */
12276     case EM_M32R:    /* R_M32R_NONE.  */
12277     case EM_MIPS:    /* R_MIPS_NONE.  */
12278     case EM_MN10300: /* R_MN10300_NONE.  */
12279     case EM_MOXIE:   /* R_MOXIE_NONE.  */
12280     case EM_NIOS32:  /* R_NIOS_NONE.  */
12281     case EM_OR1K:    /* R_OR1K_NONE. */
12282     case EM_PARISC:  /* R_PARISC_NONE.  */
12283     case EM_PPC64:   /* R_PPC64_NONE.  */
12284     case EM_PPC:     /* R_PPC_NONE.  */
12285     case EM_RISCV:   /* R_RISCV_NONE.  */
12286     case EM_S390:    /* R_390_NONE.  */
12287     case EM_S390_OLD:
12288     case EM_SH:      /* R_SH_NONE.  */
12289     case EM_SPARC32PLUS:
12290     case EM_SPARC:   /* R_SPARC_NONE.  */
12291     case EM_SPARCV9:
12292     case EM_TILEGX:  /* R_TILEGX_NONE.  */
12293     case EM_TILEPRO: /* R_TILEPRO_NONE.  */
12294     case EM_TI_C6000:/* R_C6000_NONE.  */
12295     case EM_X86_64:  /* R_X86_64_NONE.  */
12296     case EM_XC16X:
12297       return reloc_type == 0;
12298
12299     case EM_AARCH64:
12300       return reloc_type == 0 || reloc_type == 256;
12301     case EM_AVR_OLD:
12302     case EM_AVR:
12303       return (reloc_type == 0 /* R_AVR_NONE.  */
12304               || reloc_type == 30 /* R_AVR_DIFF8.  */
12305               || reloc_type == 31 /* R_AVR_DIFF16.  */
12306               || reloc_type == 32 /* R_AVR_DIFF32.  */);
12307     case EM_METAG:
12308       return reloc_type == 3; /* R_METAG_NONE.  */
12309     case EM_NDS32:
12310       return (reloc_type == 0       /* R_XTENSA_NONE.  */
12311               || reloc_type == 204  /* R_NDS32_DIFF8.  */
12312               || reloc_type == 205  /* R_NDS32_DIFF16.  */
12313               || reloc_type == 206  /* R_NDS32_DIFF32.  */
12314               || reloc_type == 207  /* R_NDS32_ULEB128.  */);
12315     case EM_TI_PRU:
12316       return (reloc_type == 0       /* R_PRU_NONE.  */
12317               || reloc_type == 65   /* R_PRU_DIFF8.  */
12318               || reloc_type == 66   /* R_PRU_DIFF16.  */
12319               || reloc_type == 67   /* R_PRU_DIFF32.  */);
12320     case EM_XTENSA_OLD:
12321     case EM_XTENSA:
12322       return (reloc_type == 0      /* R_XTENSA_NONE.  */
12323               || reloc_type == 17  /* R_XTENSA_DIFF8.  */
12324               || reloc_type == 18  /* R_XTENSA_DIFF16.  */
12325               || reloc_type == 19  /* R_XTENSA_DIFF32.  */);
12326     }
12327   return FALSE;
12328 }
12329
12330 /* Returns TRUE if there is a relocation against
12331    section NAME at OFFSET bytes.  */
12332
12333 bfd_boolean
12334 reloc_at (struct dwarf_section * dsec, dwarf_vma offset)
12335 {
12336   Elf_Internal_Rela * relocs;
12337   Elf_Internal_Rela * rp;
12338
12339   if (dsec == NULL || dsec->reloc_info == NULL)
12340     return FALSE;
12341
12342   relocs = (Elf_Internal_Rela *) dsec->reloc_info;
12343
12344   for (rp = relocs; rp < relocs + dsec->num_relocs; ++rp)
12345     if (rp->r_offset == offset)
12346       return TRUE;
12347
12348    return FALSE;
12349 }
12350
12351 /* Apply relocations to a section.
12352    Note: So far support has been added only for those relocations
12353    which can be found in debug sections.
12354    If RELOCS_RETURN is non-NULL then returns in it a pointer to the
12355    loaded relocs.  It is then the caller's responsibility to free them.
12356    FIXME: Add support for more relocations ?  */
12357
12358 static void
12359 apply_relocations (void *                     file,
12360                    const Elf_Internal_Shdr *  section,
12361                    unsigned char *            start,
12362                    bfd_size_type              size,
12363                    void **                    relocs_return,
12364                    unsigned long *            num_relocs_return)
12365 {
12366   Elf_Internal_Shdr * relsec;
12367   unsigned char * end = start + size;
12368
12369   if (relocs_return != NULL)
12370     {
12371       * (Elf_Internal_Rela **) relocs_return = NULL;
12372       * num_relocs_return = 0;
12373     }
12374
12375   if (elf_header.e_type != ET_REL)
12376     return;
12377
12378   /* Find the reloc section associated with the section.  */
12379   for (relsec = section_headers;
12380        relsec < section_headers + elf_header.e_shnum;
12381        ++relsec)
12382     {
12383       bfd_boolean is_rela;
12384       unsigned long num_relocs;
12385       Elf_Internal_Rela * relocs;
12386       Elf_Internal_Rela * rp;
12387       Elf_Internal_Shdr * symsec;
12388       Elf_Internal_Sym * symtab;
12389       unsigned long num_syms;
12390       Elf_Internal_Sym * sym;
12391
12392       if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12393           || relsec->sh_info >= elf_header.e_shnum
12394           || section_headers + relsec->sh_info != section
12395           || relsec->sh_size == 0
12396           || relsec->sh_link >= elf_header.e_shnum)
12397         continue;
12398
12399       is_rela = relsec->sh_type == SHT_RELA;
12400
12401       if (is_rela)
12402         {
12403           if (!slurp_rela_relocs ((FILE *) file, relsec->sh_offset,
12404                                   relsec->sh_size, & relocs, & num_relocs))
12405             return;
12406         }
12407       else
12408         {
12409           if (!slurp_rel_relocs ((FILE *) file, relsec->sh_offset,
12410                                  relsec->sh_size, & relocs, & num_relocs))
12411             return;
12412         }
12413
12414       /* SH uses RELA but uses in place value instead of the addend field.  */
12415       if (elf_header.e_machine == EM_SH)
12416         is_rela = FALSE;
12417
12418       symsec = section_headers + relsec->sh_link;
12419       if (symsec->sh_type != SHT_SYMTAB
12420           && symsec->sh_type != SHT_DYNSYM)
12421         return;
12422       symtab = GET_ELF_SYMBOLS ((FILE *) file, symsec, & num_syms);
12423
12424       for (rp = relocs; rp < relocs + num_relocs; ++rp)
12425         {
12426           bfd_vma         addend;
12427           unsigned int    reloc_type;
12428           unsigned int    reloc_size;
12429           unsigned char * rloc;
12430           unsigned long   sym_index;
12431
12432           reloc_type = get_reloc_type (rp->r_info);
12433
12434           if (target_specific_reloc_handling (rp, start, end, symtab, num_syms))
12435             continue;
12436           else if (is_none_reloc (reloc_type))
12437             continue;
12438           else if (is_32bit_abs_reloc (reloc_type)
12439                    || is_32bit_pcrel_reloc (reloc_type))
12440             reloc_size = 4;
12441           else if (is_64bit_abs_reloc (reloc_type)
12442                    || is_64bit_pcrel_reloc (reloc_type))
12443             reloc_size = 8;
12444           else if (is_24bit_abs_reloc (reloc_type))
12445             reloc_size = 3;
12446           else if (is_16bit_abs_reloc (reloc_type))
12447             reloc_size = 2;
12448           else
12449             {
12450               static unsigned int prev_reloc = 0;
12451               if (reloc_type != prev_reloc)
12452                 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
12453                       reloc_type, printable_section_name (section));
12454               prev_reloc = reloc_type;
12455               continue;
12456             }
12457
12458           rloc = start + rp->r_offset;
12459           if ((rloc + reloc_size) > end || (rloc < start))
12460             {
12461               warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
12462                     (unsigned long) rp->r_offset,
12463                     printable_section_name (section));
12464               continue;
12465             }
12466
12467           sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
12468           if (sym_index >= num_syms)
12469             {
12470               warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
12471                     sym_index, printable_section_name (section));
12472               continue;
12473             }
12474           sym = symtab + sym_index;
12475
12476           /* If the reloc has a symbol associated with it,
12477              make sure that it is of an appropriate type.
12478
12479              Relocations against symbols without type can happen.
12480              Gcc -feliminate-dwarf2-dups may generate symbols
12481              without type for debug info.
12482
12483              Icc generates relocations against function symbols
12484              instead of local labels.
12485
12486              Relocations against object symbols can happen, eg when
12487              referencing a global array.  For an example of this see
12488              the _clz.o binary in libgcc.a.  */
12489           if (sym != symtab
12490               && ELF_ST_TYPE (sym->st_info) != STT_COMMON
12491               && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
12492             {
12493               warn (_("skipping unexpected symbol type %s in %ld'th relocation in section %s\n"),
12494                     get_symbol_type (ELF_ST_TYPE (sym->st_info)),
12495                     (long int)(rp - relocs),
12496                     printable_section_name (relsec));
12497               continue;
12498             }
12499
12500           addend = 0;
12501           if (is_rela)
12502             addend += rp->r_addend;
12503           /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
12504              partial_inplace.  */
12505           if (!is_rela
12506               || (elf_header.e_machine == EM_XTENSA
12507                   && reloc_type == 1)
12508               || ((elf_header.e_machine == EM_PJ
12509                    || elf_header.e_machine == EM_PJ_OLD)
12510                   && reloc_type == 1)
12511               || ((elf_header.e_machine == EM_D30V
12512                    || elf_header.e_machine == EM_CYGNUS_D30V)
12513                   && reloc_type == 12))
12514             addend += byte_get (rloc, reloc_size);
12515
12516           if (is_32bit_pcrel_reloc (reloc_type)
12517               || is_64bit_pcrel_reloc (reloc_type))
12518             {
12519               /* On HPPA, all pc-relative relocations are biased by 8.  */
12520               if (elf_header.e_machine == EM_PARISC)
12521                 addend -= 8;
12522               byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
12523                         reloc_size);
12524             }
12525           else
12526             byte_put (rloc, addend + sym->st_value, reloc_size);
12527         }
12528
12529       free (symtab);
12530       /* Let the target specific reloc processing code know that
12531          we have finished with these relocs.  */
12532       target_specific_reloc_handling (NULL, NULL, NULL, NULL, 0);
12533
12534       if (relocs_return)
12535         {
12536           * (Elf_Internal_Rela **) relocs_return = relocs;
12537           * num_relocs_return = num_relocs;
12538         }
12539       else
12540         free (relocs);
12541
12542       break;
12543     }
12544 }
12545
12546 #ifdef SUPPORT_DISASSEMBLY
12547 static int
12548 disassemble_section (Elf_Internal_Shdr * section, FILE * file)
12549 {
12550   printf (_("\nAssembly dump of section %s\n"), printable_section_name (section));
12551
12552   /* FIXME: XXX -- to be done --- XXX */
12553
12554   return 1;
12555 }
12556 #endif
12557
12558 /* Reads in the contents of SECTION from FILE, returning a pointer
12559    to a malloc'ed buffer or NULL if something went wrong.  */
12560
12561 static char *
12562 get_section_contents (Elf_Internal_Shdr * section, FILE * file)
12563 {
12564   bfd_size_type num_bytes;
12565
12566   num_bytes = section->sh_size;
12567
12568   if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
12569     {
12570       printf (_("\nSection '%s' has no data to dump.\n"),
12571               printable_section_name (section));
12572       return NULL;
12573     }
12574
12575   return  (char *) get_data (NULL, file, section->sh_offset, 1, num_bytes,
12576                              _("section contents"));
12577 }
12578
12579 /* Uncompresses a section that was compressed using zlib, in place.  */
12580
12581 static bfd_boolean
12582 uncompress_section_contents (unsigned char **buffer,
12583                              dwarf_size_type uncompressed_size,
12584                              dwarf_size_type *size)
12585 {
12586   dwarf_size_type compressed_size = *size;
12587   unsigned char * compressed_buffer = *buffer;
12588   unsigned char * uncompressed_buffer;
12589   z_stream strm;
12590   int rc;
12591
12592   /* It is possible the section consists of several compressed
12593      buffers concatenated together, so we uncompress in a loop.  */
12594   /* PR 18313: The state field in the z_stream structure is supposed
12595      to be invisible to the user (ie us), but some compilers will
12596      still complain about it being used without initialisation.  So
12597      we first zero the entire z_stream structure and then set the fields
12598      that we need.  */
12599   memset (& strm, 0, sizeof strm);
12600   strm.avail_in = compressed_size;
12601   strm.next_in = (Bytef *) compressed_buffer;
12602   strm.avail_out = uncompressed_size;
12603   uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
12604
12605   rc = inflateInit (& strm);
12606   while (strm.avail_in > 0)
12607     {
12608       if (rc != Z_OK)
12609         goto fail;
12610       strm.next_out = ((Bytef *) uncompressed_buffer
12611                        + (uncompressed_size - strm.avail_out));
12612       rc = inflate (&strm, Z_FINISH);
12613       if (rc != Z_STREAM_END)
12614         goto fail;
12615       rc = inflateReset (& strm);
12616     }
12617   rc = inflateEnd (& strm);
12618   if (rc != Z_OK
12619       || strm.avail_out != 0)
12620     goto fail;
12621
12622   *buffer = uncompressed_buffer;
12623   *size = uncompressed_size;
12624   return TRUE;
12625
12626  fail:
12627   free (uncompressed_buffer);
12628   /* Indicate decompression failure.  */
12629   *buffer = NULL;
12630   return FALSE;
12631 }
12632
12633 static void
12634 dump_section_as_strings (Elf_Internal_Shdr * section, FILE * file)
12635 {
12636   Elf_Internal_Shdr *  relsec;
12637   bfd_size_type        num_bytes;
12638   unsigned char *      data;
12639   unsigned char *      end;
12640   unsigned char *      real_start;
12641   unsigned char *      start;
12642   bfd_boolean          some_strings_shown;
12643
12644   real_start = start = (unsigned char *) get_section_contents (section,
12645                                                                file);
12646   if (start == NULL)
12647     return;
12648   num_bytes = section->sh_size;
12649
12650   printf (_("\nString dump of section '%s':\n"), printable_section_name (section));
12651
12652   if (decompress_dumps)
12653     {
12654       dwarf_size_type new_size = num_bytes;
12655       dwarf_size_type uncompressed_size = 0;
12656
12657       if ((section->sh_flags & SHF_COMPRESSED) != 0)
12658         {
12659           Elf_Internal_Chdr chdr;
12660           unsigned int compression_header_size
12661             = get_compression_header (& chdr, (unsigned char *) start,
12662                                       num_bytes);
12663
12664           if (chdr.ch_type != ELFCOMPRESS_ZLIB)
12665             {
12666               warn (_("section '%s' has unsupported compress type: %d\n"),
12667                     printable_section_name (section), chdr.ch_type);
12668               return;
12669             }
12670           else if (chdr.ch_addralign != section->sh_addralign)
12671             {
12672               warn (_("compressed section '%s' is corrupted\n"),
12673                     printable_section_name (section));
12674               return;
12675             }
12676           uncompressed_size = chdr.ch_size;
12677           start += compression_header_size;
12678           new_size -= compression_header_size;
12679         }
12680       else if (new_size > 12 && streq ((char *) start, "ZLIB"))
12681         {
12682           /* Read the zlib header.  In this case, it should be "ZLIB"
12683              followed by the uncompressed section size, 8 bytes in
12684              big-endian order.  */
12685           uncompressed_size = start[4]; uncompressed_size <<= 8;
12686           uncompressed_size += start[5]; uncompressed_size <<= 8;
12687           uncompressed_size += start[6]; uncompressed_size <<= 8;
12688           uncompressed_size += start[7]; uncompressed_size <<= 8;
12689           uncompressed_size += start[8]; uncompressed_size <<= 8;
12690           uncompressed_size += start[9]; uncompressed_size <<= 8;
12691           uncompressed_size += start[10]; uncompressed_size <<= 8;
12692           uncompressed_size += start[11];
12693           start += 12;
12694           new_size -= 12;
12695         }
12696
12697       if (uncompressed_size)
12698         {
12699           if (uncompress_section_contents (& start,
12700                                            uncompressed_size, & new_size))
12701             num_bytes = new_size;
12702           else
12703             {
12704               error (_("Unable to decompress section %s\n"),
12705                      printable_section_name (section));
12706               return;
12707             }
12708         }
12709       else
12710         start = real_start;
12711     }
12712
12713   /* If the section being dumped has relocations against it the user might
12714      be expecting these relocations to have been applied.  Check for this
12715      case and issue a warning message in order to avoid confusion.
12716      FIXME: Maybe we ought to have an option that dumps a section with
12717      relocs applied ?  */
12718   for (relsec = section_headers;
12719        relsec < section_headers + elf_header.e_shnum;
12720        ++relsec)
12721     {
12722       if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12723           || relsec->sh_info >= elf_header.e_shnum
12724           || section_headers + relsec->sh_info != section
12725           || relsec->sh_size == 0
12726           || relsec->sh_link >= elf_header.e_shnum)
12727         continue;
12728
12729       printf (_("  Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
12730       break;
12731     }
12732
12733   data = start;
12734   end  = start + num_bytes;
12735   some_strings_shown = FALSE;
12736
12737   while (data < end)
12738     {
12739       while (!ISPRINT (* data))
12740         if (++ data >= end)
12741           break;
12742
12743       if (data < end)
12744         {
12745           size_t maxlen = end - data;
12746
12747 #ifndef __MSVCRT__
12748           /* PR 11128: Use two separate invocations in order to work
12749              around bugs in the Solaris 8 implementation of printf.  */
12750           printf ("  [%6tx]  ", data - start);
12751 #else
12752           printf ("  [%6Ix]  ", (size_t) (data - start));
12753 #endif
12754           if (maxlen > 0)
12755             {
12756               print_symbol ((int) maxlen, (const char *) data);
12757               putchar ('\n');
12758               data += strnlen ((const char *) data, maxlen);
12759             }
12760           else
12761             {
12762               printf (_("<corrupt>\n"));
12763               data = end;
12764             }
12765           some_strings_shown = TRUE;
12766         }
12767     }
12768
12769   if (! some_strings_shown)
12770     printf (_("  No strings found in this section."));
12771
12772   free (real_start);
12773
12774   putchar ('\n');
12775 }
12776
12777 static void
12778 dump_section_as_bytes (Elf_Internal_Shdr * section,
12779                        FILE * file,
12780                        bfd_boolean relocate)
12781 {
12782   Elf_Internal_Shdr * relsec;
12783   bfd_size_type       bytes;
12784   bfd_size_type       section_size;
12785   bfd_vma             addr;
12786   unsigned char *     data;
12787   unsigned char *     real_start;
12788   unsigned char *     start;
12789
12790   real_start = start = (unsigned char *) get_section_contents (section, file);
12791   if (start == NULL)
12792     return;
12793   section_size = section->sh_size;
12794
12795   printf (_("\nHex dump of section '%s':\n"), printable_section_name (section));
12796
12797   if (decompress_dumps)
12798     {
12799       dwarf_size_type new_size = section_size;
12800       dwarf_size_type uncompressed_size = 0;
12801
12802       if ((section->sh_flags & SHF_COMPRESSED) != 0)
12803         {
12804           Elf_Internal_Chdr chdr;
12805           unsigned int compression_header_size
12806             = get_compression_header (& chdr, start, section_size);
12807
12808           if (chdr.ch_type != ELFCOMPRESS_ZLIB)
12809             {
12810               warn (_("section '%s' has unsupported compress type: %d\n"),
12811                     printable_section_name (section), chdr.ch_type);
12812               return;
12813             }
12814           else if (chdr.ch_addralign != section->sh_addralign)
12815             {
12816               warn (_("compressed section '%s' is corrupted\n"),
12817                     printable_section_name (section));
12818               return;
12819             }
12820           uncompressed_size = chdr.ch_size;
12821           start += compression_header_size;
12822           new_size -= compression_header_size;
12823         }
12824       else if (new_size > 12 && streq ((char *) start, "ZLIB"))
12825         {
12826           /* Read the zlib header.  In this case, it should be "ZLIB"
12827              followed by the uncompressed section size, 8 bytes in
12828              big-endian order.  */
12829           uncompressed_size = start[4]; uncompressed_size <<= 8;
12830           uncompressed_size += start[5]; uncompressed_size <<= 8;
12831           uncompressed_size += start[6]; uncompressed_size <<= 8;
12832           uncompressed_size += start[7]; uncompressed_size <<= 8;
12833           uncompressed_size += start[8]; uncompressed_size <<= 8;
12834           uncompressed_size += start[9]; uncompressed_size <<= 8;
12835           uncompressed_size += start[10]; uncompressed_size <<= 8;
12836           uncompressed_size += start[11];
12837           start += 12;
12838           new_size -= 12;
12839         }
12840
12841       if (uncompressed_size)
12842         {
12843           if (uncompress_section_contents (& start, uncompressed_size,
12844                                            & new_size))
12845             {
12846               section_size = new_size;
12847             }
12848           else
12849             {
12850               error (_("Unable to decompress section %s\n"),
12851                      printable_section_name (section));
12852               /* FIXME: Print the section anyway ?  */
12853               return;
12854             }
12855         }
12856       else
12857         start = real_start;
12858     }
12859
12860   if (relocate)
12861     {
12862       apply_relocations (file, section, start, section_size, NULL, NULL);
12863     }
12864   else
12865     {
12866       /* If the section being dumped has relocations against it the user might
12867          be expecting these relocations to have been applied.  Check for this
12868          case and issue a warning message in order to avoid confusion.
12869          FIXME: Maybe we ought to have an option that dumps a section with
12870          relocs applied ?  */
12871       for (relsec = section_headers;
12872            relsec < section_headers + elf_header.e_shnum;
12873            ++relsec)
12874         {
12875           if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12876               || relsec->sh_info >= elf_header.e_shnum
12877               || section_headers + relsec->sh_info != section
12878               || relsec->sh_size == 0
12879               || relsec->sh_link >= elf_header.e_shnum)
12880             continue;
12881
12882           printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
12883           break;
12884         }
12885     }
12886
12887   addr = section->sh_addr;
12888   bytes = section_size;
12889   data = start;
12890
12891   while (bytes)
12892     {
12893       int j;
12894       int k;
12895       int lbytes;
12896
12897       lbytes = (bytes > 16 ? 16 : bytes);
12898
12899       printf ("  0x%8.8lx ", (unsigned long) addr);
12900
12901       for (j = 0; j < 16; j++)
12902         {
12903           if (j < lbytes)
12904             printf ("%2.2x", data[j]);
12905           else
12906             printf ("  ");
12907
12908           if ((j & 3) == 3)
12909             printf (" ");
12910         }
12911
12912       for (j = 0; j < lbytes; j++)
12913         {
12914           k = data[j];
12915           if (k >= ' ' && k < 0x7f)
12916             printf ("%c", k);
12917           else
12918             printf (".");
12919         }
12920
12921       putchar ('\n');
12922
12923       data  += lbytes;
12924       addr  += lbytes;
12925       bytes -= lbytes;
12926     }
12927
12928   free (real_start);
12929
12930   putchar ('\n');
12931 }
12932
12933 static int
12934 load_specific_debug_section (enum dwarf_section_display_enum debug,
12935                              const Elf_Internal_Shdr * sec, void * file)
12936 {
12937   struct dwarf_section * section = &debug_displays [debug].section;
12938   char buf [64];
12939
12940   /* If it is already loaded, do nothing.  */
12941   if (section->start != NULL)
12942     return 1;
12943
12944   snprintf (buf, sizeof (buf), _("%s section data"), section->name);
12945   section->address = sec->sh_addr;
12946   section->user_data = NULL;
12947   section->start = (unsigned char *) get_data (NULL, (FILE *) file,
12948                                                sec->sh_offset, 1,
12949                                                sec->sh_size, buf);
12950   if (section->start == NULL)
12951     section->size = 0;
12952   else
12953     {
12954       unsigned char *start = section->start;
12955       dwarf_size_type size = sec->sh_size;
12956       dwarf_size_type uncompressed_size = 0;
12957
12958       if ((sec->sh_flags & SHF_COMPRESSED) != 0)
12959         {
12960           Elf_Internal_Chdr chdr;
12961           unsigned int compression_header_size;
12962
12963           if (size < (is_32bit_elf
12964                       ? sizeof (Elf32_External_Chdr)
12965                       : sizeof (Elf64_External_Chdr)))
12966             {
12967               warn (_("compressed section %s is too small to contain a compression header"),
12968                     section->name);
12969               return 0;
12970             }
12971
12972           compression_header_size = get_compression_header (&chdr, start, size);
12973
12974           if (chdr.ch_type != ELFCOMPRESS_ZLIB)
12975             {
12976               warn (_("section '%s' has unsupported compress type: %d\n"),
12977                     section->name, chdr.ch_type);
12978               return 0;
12979             }
12980           else if (chdr.ch_addralign != sec->sh_addralign)
12981             {
12982               warn (_("compressed section '%s' is corrupted\n"),
12983                     section->name);
12984               return 0;
12985             }
12986           uncompressed_size = chdr.ch_size;
12987           start += compression_header_size;
12988           size -= compression_header_size;
12989         }
12990       else if (size > 12 && streq ((char *) start, "ZLIB"))
12991         {
12992           /* Read the zlib header.  In this case, it should be "ZLIB"
12993              followed by the uncompressed section size, 8 bytes in
12994              big-endian order.  */
12995           uncompressed_size = start[4]; uncompressed_size <<= 8;
12996           uncompressed_size += start[5]; uncompressed_size <<= 8;
12997           uncompressed_size += start[6]; uncompressed_size <<= 8;
12998           uncompressed_size += start[7]; uncompressed_size <<= 8;
12999           uncompressed_size += start[8]; uncompressed_size <<= 8;
13000           uncompressed_size += start[9]; uncompressed_size <<= 8;
13001           uncompressed_size += start[10]; uncompressed_size <<= 8;
13002           uncompressed_size += start[11];
13003           start += 12;
13004           size -= 12;
13005         }
13006
13007       if (uncompressed_size)
13008         {
13009           if (uncompress_section_contents (&start, uncompressed_size,
13010                                            &size))
13011             {
13012               /* Free the compressed buffer, update the section buffer
13013                  and the section size if uncompress is successful.  */
13014               free (section->start);
13015               section->start = start;
13016             }
13017           else
13018             {
13019               error (_("Unable to decompress section %s\n"),
13020                      printable_section_name (sec));
13021               return 0;
13022             }
13023         }
13024
13025       section->size = size;
13026     }
13027
13028   if (section->start == NULL)
13029     return 0;
13030
13031   if (debug_displays [debug].relocate)
13032     apply_relocations ((FILE *) file, sec, section->start, section->size,
13033                        & section->reloc_info, & section->num_relocs);
13034   else
13035     {
13036       section->reloc_info = NULL;
13037       section->num_relocs = 0;
13038     }
13039
13040   return 1;
13041 }
13042
13043 /* If this is not NULL, load_debug_section will only look for sections
13044    within the list of sections given here.  */
13045 unsigned int *section_subset = NULL;
13046
13047 int
13048 load_debug_section (enum dwarf_section_display_enum debug, void * file)
13049 {
13050   struct dwarf_section * section = &debug_displays [debug].section;
13051   Elf_Internal_Shdr * sec;
13052
13053   /* Locate the debug section.  */
13054   sec = find_section_in_set (section->uncompressed_name, section_subset);
13055   if (sec != NULL)
13056     section->name = section->uncompressed_name;
13057   else
13058     {
13059       sec = find_section_in_set (section->compressed_name, section_subset);
13060       if (sec != NULL)
13061         section->name = section->compressed_name;
13062     }
13063   if (sec == NULL)
13064     return 0;
13065
13066   /* If we're loading from a subset of sections, and we've loaded
13067      a section matching this name before, it's likely that it's a
13068      different one.  */
13069   if (section_subset != NULL)
13070     free_debug_section (debug);
13071
13072   return load_specific_debug_section (debug, sec, (FILE *) file);
13073 }
13074
13075 void
13076 free_debug_section (enum dwarf_section_display_enum debug)
13077 {
13078   struct dwarf_section * section = &debug_displays [debug].section;
13079
13080   if (section->start == NULL)
13081     return;
13082
13083   free ((char *) section->start);
13084   section->start = NULL;
13085   section->address = 0;
13086   section->size = 0;
13087 }
13088
13089 static int
13090 display_debug_section (int shndx, Elf_Internal_Shdr * section, FILE * file)
13091 {
13092   char * name = SECTION_NAME (section);
13093   const char * print_name = printable_section_name (section);
13094   bfd_size_type length;
13095   int result = 1;
13096   int i;
13097
13098   length = section->sh_size;
13099   if (length == 0)
13100     {
13101       printf (_("\nSection '%s' has no debugging data.\n"), print_name);
13102       return 0;
13103     }
13104   if (section->sh_type == SHT_NOBITS)
13105     {
13106       /* There is no point in dumping the contents of a debugging section
13107          which has the NOBITS type - the bits in the file will be random.
13108          This can happen when a file containing a .eh_frame section is
13109          stripped with the --only-keep-debug command line option.  */
13110       printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"),
13111               print_name);
13112       return 0;
13113     }
13114
13115   if (const_strneq (name, ".gnu.linkonce.wi."))
13116     name = ".debug_info";
13117
13118   /* See if we know how to display the contents of this section.  */
13119   for (i = 0; i < max; i++)
13120     if (streq (debug_displays[i].section.uncompressed_name, name)
13121         || (i == line && const_strneq (name, ".debug_line."))
13122         || streq (debug_displays[i].section.compressed_name, name))
13123       {
13124         struct dwarf_section * sec = &debug_displays [i].section;
13125         int secondary = (section != find_section (name));
13126
13127         if (secondary)
13128           free_debug_section ((enum dwarf_section_display_enum) i);
13129
13130         if (i == line && const_strneq (name, ".debug_line."))
13131           sec->name = name;
13132         else if (streq (sec->uncompressed_name, name))
13133           sec->name = sec->uncompressed_name;
13134         else
13135           sec->name = sec->compressed_name;
13136         if (load_specific_debug_section ((enum dwarf_section_display_enum) i,
13137                                          section, file))
13138           {
13139             /* If this debug section is part of a CU/TU set in a .dwp file,
13140                restrict load_debug_section to the sections in that set.  */
13141             section_subset = find_cu_tu_set (file, shndx);
13142
13143             result &= debug_displays[i].display (sec, file);
13144
13145             section_subset = NULL;
13146
13147             if (secondary || (i != info && i != abbrev))
13148               free_debug_section ((enum dwarf_section_display_enum) i);
13149           }
13150
13151         break;
13152       }
13153
13154   if (i == max)
13155     {
13156       printf (_("Unrecognized debug section: %s\n"), print_name);
13157       result = 0;
13158     }
13159
13160   return result;
13161 }
13162
13163 /* Set DUMP_SECTS for all sections where dumps were requested
13164    based on section name.  */
13165
13166 static void
13167 initialise_dumps_byname (void)
13168 {
13169   struct dump_list_entry * cur;
13170
13171   for (cur = dump_sects_byname; cur; cur = cur->next)
13172     {
13173       unsigned int i;
13174       int any;
13175
13176       for (i = 0, any = 0; i < elf_header.e_shnum; i++)
13177         if (streq (SECTION_NAME (section_headers + i), cur->name))
13178           {
13179             request_dump_bynumber (i, cur->type);
13180             any = 1;
13181           }
13182
13183       if (!any)
13184         warn (_("Section '%s' was not dumped because it does not exist!\n"),
13185               cur->name);
13186     }
13187 }
13188
13189 static void
13190 process_section_contents (FILE * file)
13191 {
13192   Elf_Internal_Shdr * section;
13193   unsigned int i;
13194
13195   if (! do_dump)
13196     return;
13197
13198   initialise_dumps_byname ();
13199
13200   for (i = 0, section = section_headers;
13201        i < elf_header.e_shnum && i < num_dump_sects;
13202        i++, section++)
13203     {
13204 #ifdef SUPPORT_DISASSEMBLY
13205       if (dump_sects[i] & DISASS_DUMP)
13206         disassemble_section (section, file);
13207 #endif
13208       if (dump_sects[i] & HEX_DUMP)
13209         dump_section_as_bytes (section, file, FALSE);
13210
13211       if (dump_sects[i] & RELOC_DUMP)
13212         dump_section_as_bytes (section, file, TRUE);
13213
13214       if (dump_sects[i] & STRING_DUMP)
13215         dump_section_as_strings (section, file);
13216
13217       if (dump_sects[i] & DEBUG_DUMP)
13218         display_debug_section (i, section, file);
13219     }
13220
13221   /* Check to see if the user requested a
13222      dump of a section that does not exist.  */
13223   while (i < num_dump_sects)
13224     {
13225       if (dump_sects[i])
13226         warn (_("Section %d was not dumped because it does not exist!\n"), i);
13227       i++;
13228     }
13229 }
13230
13231 static void
13232 process_mips_fpe_exception (int mask)
13233 {
13234   if (mask)
13235     {
13236       int first = 1;
13237       if (mask & OEX_FPU_INEX)
13238         fputs ("INEX", stdout), first = 0;
13239       if (mask & OEX_FPU_UFLO)
13240         printf ("%sUFLO", first ? "" : "|"), first = 0;
13241       if (mask & OEX_FPU_OFLO)
13242         printf ("%sOFLO", first ? "" : "|"), first = 0;
13243       if (mask & OEX_FPU_DIV0)
13244         printf ("%sDIV0", first ? "" : "|"), first = 0;
13245       if (mask & OEX_FPU_INVAL)
13246         printf ("%sINVAL", first ? "" : "|");
13247     }
13248   else
13249     fputs ("0", stdout);
13250 }
13251
13252 /* Display's the value of TAG at location P.  If TAG is
13253    greater than 0 it is assumed to be an unknown tag, and
13254    a message is printed to this effect.  Otherwise it is
13255    assumed that a message has already been printed.
13256
13257    If the bottom bit of TAG is set it assumed to have a
13258    string value, otherwise it is assumed to have an integer
13259    value.
13260
13261    Returns an updated P pointing to the first unread byte
13262    beyond the end of TAG's value.
13263
13264    Reads at or beyond END will not be made.  */
13265
13266 static unsigned char *
13267 display_tag_value (int tag,
13268                    unsigned char * p,
13269                    const unsigned char * const end)
13270 {
13271   unsigned long val;
13272
13273   if (tag > 0)
13274     printf ("  Tag_unknown_%d: ", tag);
13275
13276   if (p >= end)
13277     {
13278       warn (_("<corrupt tag>\n"));
13279     }
13280   else if (tag & 1)
13281     {
13282       /* PR 17531 file: 027-19978-0.004.  */
13283       size_t maxlen = (end - p) - 1;
13284
13285       putchar ('"');
13286       if (maxlen > 0)
13287         {
13288           print_symbol ((int) maxlen, (const char *) p);
13289           p += strnlen ((char *) p, maxlen) + 1;
13290         }
13291       else
13292         {
13293           printf (_("<corrupt string tag>"));
13294           p = (unsigned char *) end;
13295         }
13296       printf ("\"\n");
13297     }
13298   else
13299     {
13300       unsigned int len;
13301
13302       val = read_uleb128 (p, &len, end);
13303       p += len;
13304       printf ("%ld (0x%lx)\n", val, val);
13305     }
13306
13307   assert (p <= end);
13308   return p;
13309 }
13310
13311 /* ARM EABI attributes section.  */
13312 typedef struct
13313 {
13314   unsigned int tag;
13315   const char * name;
13316   /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup.  */
13317   unsigned int type;
13318   const char ** table;
13319 } arm_attr_public_tag;
13320
13321 static const char * arm_attr_tag_CPU_arch[] =
13322   {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
13323    "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8", "", "v8-M.baseline",
13324    "v8-M.mainline"};
13325 static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
13326 static const char * arm_attr_tag_THUMB_ISA_use[] =
13327   {"No", "Thumb-1", "Thumb-2", "Yes"};
13328 static const char * arm_attr_tag_FP_arch[] =
13329   {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
13330    "FP for ARMv8", "FPv5/FP-D16 for ARMv8"};
13331 static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
13332 static const char * arm_attr_tag_Advanced_SIMD_arch[] =
13333   {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8",
13334    "NEON for ARMv8.1"};
13335 static const char * arm_attr_tag_PCS_config[] =
13336   {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
13337    "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
13338 static const char * arm_attr_tag_ABI_PCS_R9_use[] =
13339   {"V6", "SB", "TLS", "Unused"};
13340 static const char * arm_attr_tag_ABI_PCS_RW_data[] =
13341   {"Absolute", "PC-relative", "SB-relative", "None"};
13342 static const char * arm_attr_tag_ABI_PCS_RO_data[] =
13343   {"Absolute", "PC-relative", "None"};
13344 static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
13345   {"None", "direct", "GOT-indirect"};
13346 static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
13347   {"None", "??? 1", "2", "??? 3", "4"};
13348 static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
13349 static const char * arm_attr_tag_ABI_FP_denormal[] =
13350   {"Unused", "Needed", "Sign only"};
13351 static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
13352 static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
13353 static const char * arm_attr_tag_ABI_FP_number_model[] =
13354   {"Unused", "Finite", "RTABI", "IEEE 754"};
13355 static const char * arm_attr_tag_ABI_enum_size[] =
13356   {"Unused", "small", "int", "forced to int"};
13357 static const char * arm_attr_tag_ABI_HardFP_use[] =
13358   {"As Tag_FP_arch", "SP only", "Reserved", "Deprecated"};
13359 static const char * arm_attr_tag_ABI_VFP_args[] =
13360   {"AAPCS", "VFP registers", "custom", "compatible"};
13361 static const char * arm_attr_tag_ABI_WMMX_args[] =
13362   {"AAPCS", "WMMX registers", "custom"};
13363 static const char * arm_attr_tag_ABI_optimization_goals[] =
13364   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
13365     "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
13366 static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
13367   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
13368     "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
13369 static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
13370 static const char * arm_attr_tag_FP_HP_extension[] =
13371   {"Not Allowed", "Allowed"};
13372 static const char * arm_attr_tag_ABI_FP_16bit_format[] =
13373   {"None", "IEEE 754", "Alternative Format"};
13374 static const char * arm_attr_tag_DSP_extension[] =
13375   {"Follow architecture", "Allowed"};
13376 static const char * arm_attr_tag_MPextension_use[] =
13377   {"Not Allowed", "Allowed"};
13378 static const char * arm_attr_tag_DIV_use[] =
13379   {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
13380     "Allowed in v7-A with integer division extension"};
13381 static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
13382 static const char * arm_attr_tag_Virtualization_use[] =
13383   {"Not Allowed", "TrustZone", "Virtualization Extensions",
13384     "TrustZone and Virtualization Extensions"};
13385 static const char * arm_attr_tag_MPextension_use_legacy[] =
13386   {"Not Allowed", "Allowed"};
13387
13388 #define LOOKUP(id, name) \
13389   {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
13390 static arm_attr_public_tag arm_attr_public_tags[] =
13391 {
13392   {4, "CPU_raw_name", 1, NULL},
13393   {5, "CPU_name", 1, NULL},
13394   LOOKUP(6, CPU_arch),
13395   {7, "CPU_arch_profile", 0, NULL},
13396   LOOKUP(8, ARM_ISA_use),
13397   LOOKUP(9, THUMB_ISA_use),
13398   LOOKUP(10, FP_arch),
13399   LOOKUP(11, WMMX_arch),
13400   LOOKUP(12, Advanced_SIMD_arch),
13401   LOOKUP(13, PCS_config),
13402   LOOKUP(14, ABI_PCS_R9_use),
13403   LOOKUP(15, ABI_PCS_RW_data),
13404   LOOKUP(16, ABI_PCS_RO_data),
13405   LOOKUP(17, ABI_PCS_GOT_use),
13406   LOOKUP(18, ABI_PCS_wchar_t),
13407   LOOKUP(19, ABI_FP_rounding),
13408   LOOKUP(20, ABI_FP_denormal),
13409   LOOKUP(21, ABI_FP_exceptions),
13410   LOOKUP(22, ABI_FP_user_exceptions),
13411   LOOKUP(23, ABI_FP_number_model),
13412   {24, "ABI_align_needed", 0, NULL},
13413   {25, "ABI_align_preserved", 0, NULL},
13414   LOOKUP(26, ABI_enum_size),
13415   LOOKUP(27, ABI_HardFP_use),
13416   LOOKUP(28, ABI_VFP_args),
13417   LOOKUP(29, ABI_WMMX_args),
13418   LOOKUP(30, ABI_optimization_goals),
13419   LOOKUP(31, ABI_FP_optimization_goals),
13420   {32, "compatibility", 0, NULL},
13421   LOOKUP(34, CPU_unaligned_access),
13422   LOOKUP(36, FP_HP_extension),
13423   LOOKUP(38, ABI_FP_16bit_format),
13424   LOOKUP(42, MPextension_use),
13425   LOOKUP(44, DIV_use),
13426   LOOKUP(46, DSP_extension),
13427   {64, "nodefaults", 0, NULL},
13428   {65, "also_compatible_with", 0, NULL},
13429   LOOKUP(66, T2EE_use),
13430   {67, "conformance", 1, NULL},
13431   LOOKUP(68, Virtualization_use),
13432   LOOKUP(70, MPextension_use_legacy)
13433 };
13434 #undef LOOKUP
13435
13436 static unsigned char *
13437 display_arm_attribute (unsigned char * p,
13438                        const unsigned char * const end)
13439 {
13440   unsigned int tag;
13441   unsigned int len;
13442   unsigned int val;
13443   arm_attr_public_tag * attr;
13444   unsigned i;
13445   unsigned int type;
13446
13447   tag = read_uleb128 (p, &len, end);
13448   p += len;
13449   attr = NULL;
13450   for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
13451     {
13452       if (arm_attr_public_tags[i].tag == tag)
13453         {
13454           attr = &arm_attr_public_tags[i];
13455           break;
13456         }
13457     }
13458
13459   if (attr)
13460     {
13461       printf ("  Tag_%s: ", attr->name);
13462       switch (attr->type)
13463         {
13464         case 0:
13465           switch (tag)
13466             {
13467             case 7: /* Tag_CPU_arch_profile.  */
13468               val = read_uleb128 (p, &len, end);
13469               p += len;
13470               switch (val)
13471                 {
13472                 case 0: printf (_("None\n")); break;
13473                 case 'A': printf (_("Application\n")); break;
13474                 case 'R': printf (_("Realtime\n")); break;
13475                 case 'M': printf (_("Microcontroller\n")); break;
13476                 case 'S': printf (_("Application or Realtime\n")); break;
13477                 default: printf ("??? (%d)\n", val); break;
13478                 }
13479               break;
13480
13481             case 24: /* Tag_align_needed.  */
13482               val = read_uleb128 (p, &len, end);
13483               p += len;
13484               switch (val)
13485                 {
13486                 case 0: printf (_("None\n")); break;
13487                 case 1: printf (_("8-byte\n")); break;
13488                 case 2: printf (_("4-byte\n")); break;
13489                 case 3: printf ("??? 3\n"); break;
13490                 default:
13491                   if (val <= 12)
13492                     printf (_("8-byte and up to %d-byte extended\n"),
13493                             1 << val);
13494                   else
13495                     printf ("??? (%d)\n", val);
13496                   break;
13497                 }
13498               break;
13499
13500             case 25: /* Tag_align_preserved.  */
13501               val = read_uleb128 (p, &len, end);
13502               p += len;
13503               switch (val)
13504                 {
13505                 case 0: printf (_("None\n")); break;
13506                 case 1: printf (_("8-byte, except leaf SP\n")); break;
13507                 case 2: printf (_("8-byte\n")); break;
13508                 case 3: printf ("??? 3\n"); break;
13509                 default:
13510                   if (val <= 12)
13511                     printf (_("8-byte and up to %d-byte extended\n"),
13512                             1 << val);
13513                   else
13514                     printf ("??? (%d)\n", val);
13515                   break;
13516                 }
13517               break;
13518
13519             case 32: /* Tag_compatibility.  */
13520               {
13521                 val = read_uleb128 (p, &len, end);
13522                 p += len;
13523                 printf (_("flag = %d, vendor = "), val);
13524                 if (p < end - 1)
13525                   {
13526                     size_t maxlen = (end - p) - 1;
13527
13528                     print_symbol ((int) maxlen, (const char *) p);
13529                     p += strnlen ((char *) p, maxlen) + 1;
13530                   }
13531                 else
13532                   {
13533                     printf (_("<corrupt>"));
13534                     p = (unsigned char *) end;
13535                   }
13536                 putchar ('\n');
13537               }
13538               break;
13539
13540             case 64: /* Tag_nodefaults.  */
13541               /* PR 17531: file: 001-505008-0.01.  */
13542               if (p < end)
13543                 p++;
13544               printf (_("True\n"));
13545               break;
13546
13547             case 65: /* Tag_also_compatible_with.  */
13548               val = read_uleb128 (p, &len, end);
13549               p += len;
13550               if (val == 6 /* Tag_CPU_arch.  */)
13551                 {
13552                   val = read_uleb128 (p, &len, end);
13553                   p += len;
13554                   if ((unsigned int) val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
13555                     printf ("??? (%d)\n", val);
13556                   else
13557                     printf ("%s\n", arm_attr_tag_CPU_arch[val]);
13558                 }
13559               else
13560                 printf ("???\n");
13561               while (p < end && *(p++) != '\0' /* NUL terminator.  */)
13562                 ;
13563               break;
13564
13565             default:
13566               printf (_("<unknown: %d>\n"), tag);
13567               break;
13568             }
13569           return p;
13570
13571         case 1:
13572           return display_tag_value (-1, p, end);
13573         case 2:
13574           return display_tag_value (0, p, end);
13575
13576         default:
13577           assert (attr->type & 0x80);
13578           val = read_uleb128 (p, &len, end);
13579           p += len;
13580           type = attr->type & 0x7f;
13581           if (val >= type)
13582             printf ("??? (%d)\n", val);
13583           else
13584             printf ("%s\n", attr->table[val]);
13585           return p;
13586         }
13587     }
13588
13589   return display_tag_value (tag, p, end);
13590 }
13591
13592 static unsigned char *
13593 display_gnu_attribute (unsigned char * p,
13594                        unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const),
13595                        const unsigned char * const end)
13596 {
13597   int tag;
13598   unsigned int len;
13599   int val;
13600
13601   tag = read_uleb128 (p, &len, end);
13602   p += len;
13603
13604   /* Tag_compatibility is the only generic GNU attribute defined at
13605      present.  */
13606   if (tag == 32)
13607     {
13608       val = read_uleb128 (p, &len, end);
13609       p += len;
13610
13611       printf (_("flag = %d, vendor = "), val);
13612       if (p == end)
13613         {
13614           printf (_("<corrupt>\n"));
13615           warn (_("corrupt vendor attribute\n"));
13616         }
13617       else
13618         {
13619           if (p < end - 1)
13620             {
13621               size_t maxlen = (end - p) - 1;
13622
13623               print_symbol ((int) maxlen, (const char *) p);
13624               p += strnlen ((char *) p, maxlen) + 1;
13625             }
13626           else
13627             {
13628               printf (_("<corrupt>"));
13629               p = (unsigned char *) end;
13630             }
13631           putchar ('\n');
13632         }
13633       return p;
13634     }
13635
13636   if ((tag & 2) == 0 && display_proc_gnu_attribute)
13637     return display_proc_gnu_attribute (p, tag, end);
13638
13639   return display_tag_value (tag, p, end);
13640 }
13641
13642 static unsigned char *
13643 display_power_gnu_attribute (unsigned char * p,
13644                              int tag,
13645                              const unsigned char * const end)
13646 {
13647   unsigned int len;
13648   unsigned int val;
13649
13650   if (tag == Tag_GNU_Power_ABI_FP)
13651     {
13652       val = read_uleb128 (p, &len, end);
13653       p += len;
13654       printf ("  Tag_GNU_Power_ABI_FP: ");
13655       if (len == 0)
13656         {
13657           printf (_("<corrupt>\n"));
13658           return p;
13659         }
13660
13661       if (val > 15)
13662         printf ("(%#x), ", val);
13663
13664       switch (val & 3)
13665         {
13666         case 0:
13667           printf (_("unspecified hard/soft float, "));
13668           break;
13669         case 1:
13670           printf (_("hard float, "));
13671           break;
13672         case 2:
13673           printf (_("soft float, "));
13674           break;
13675         case 3:
13676           printf (_("single-precision hard float, "));
13677           break;
13678         }
13679
13680       switch (val & 0xC)
13681         {
13682         case 0:
13683           printf (_("unspecified long double\n"));
13684           break;
13685         case 4:
13686           printf (_("128-bit IBM long double\n"));
13687           break;
13688         case 8:
13689           printf (_("64-bit long double\n"));
13690           break;
13691         case 12:
13692           printf (_("128-bit IEEE long double\n"));
13693           break;
13694         }
13695       return p;
13696     }
13697
13698   if (tag == Tag_GNU_Power_ABI_Vector)
13699     {
13700       val = read_uleb128 (p, &len, end);
13701       p += len;
13702       printf ("  Tag_GNU_Power_ABI_Vector: ");
13703       if (len == 0)
13704         {
13705           printf (_("<corrupt>\n"));
13706           return p;
13707         }
13708
13709       if (val > 3)
13710         printf ("(%#x), ", val);
13711
13712       switch (val & 3)
13713         {
13714         case 0:
13715           printf (_("unspecified\n"));
13716           break;
13717         case 1:
13718           printf (_("generic\n"));
13719           break;
13720         case 2:
13721           printf ("AltiVec\n");
13722           break;
13723         case 3:
13724           printf ("SPE\n");
13725           break;
13726         }
13727       return p;
13728     }
13729
13730   if (tag == Tag_GNU_Power_ABI_Struct_Return)
13731     {
13732       val = read_uleb128 (p, &len, end);
13733       p += len;
13734       printf ("  Tag_GNU_Power_ABI_Struct_Return: ");
13735       if (len == 0)
13736         {
13737           printf (_("<corrupt>\n"));
13738           return p;
13739         }
13740
13741       if (val > 2)
13742         printf ("(%#x), ", val);
13743
13744       switch (val & 3)
13745         {
13746         case 0:
13747           printf (_("unspecified\n"));
13748           break;
13749         case 1:
13750           printf ("r3/r4\n");
13751           break;
13752         case 2:
13753           printf (_("memory\n"));
13754           break;
13755         case 3:
13756           printf ("???\n");
13757           break;
13758         }
13759       return p;
13760     }
13761
13762   return display_tag_value (tag & 1, p, end);
13763 }
13764
13765 static unsigned char *
13766 display_s390_gnu_attribute (unsigned char * p,
13767                             int tag,
13768                             const unsigned char * const end)
13769 {
13770   unsigned int len;
13771   int val;
13772
13773   if (tag == Tag_GNU_S390_ABI_Vector)
13774     {
13775       val = read_uleb128 (p, &len, end);
13776       p += len;
13777       printf ("  Tag_GNU_S390_ABI_Vector: ");
13778
13779       switch (val)
13780         {
13781         case 0:
13782           printf (_("any\n"));
13783           break;
13784         case 1:
13785           printf (_("software\n"));
13786           break;
13787         case 2:
13788           printf (_("hardware\n"));
13789           break;
13790         default:
13791           printf ("??? (%d)\n", val);
13792           break;
13793         }
13794       return p;
13795    }
13796
13797   return display_tag_value (tag & 1, p, end);
13798 }
13799
13800 static void
13801 display_sparc_hwcaps (int mask)
13802 {
13803   if (mask)
13804     {
13805       int first = 1;
13806
13807       if (mask & ELF_SPARC_HWCAP_MUL32)
13808         fputs ("mul32", stdout), first = 0;
13809       if (mask & ELF_SPARC_HWCAP_DIV32)
13810         printf ("%sdiv32", first ? "" : "|"), first = 0;
13811       if (mask & ELF_SPARC_HWCAP_FSMULD)
13812         printf ("%sfsmuld", first ? "" : "|"), first = 0;
13813       if (mask & ELF_SPARC_HWCAP_V8PLUS)
13814         printf ("%sv8plus", first ? "" : "|"), first = 0;
13815       if (mask & ELF_SPARC_HWCAP_POPC)
13816         printf ("%spopc", first ? "" : "|"), first = 0;
13817       if (mask & ELF_SPARC_HWCAP_VIS)
13818         printf ("%svis", first ? "" : "|"), first = 0;
13819       if (mask & ELF_SPARC_HWCAP_VIS2)
13820         printf ("%svis2", first ? "" : "|"), first = 0;
13821       if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
13822         printf ("%sASIBlkInit", first ? "" : "|"), first = 0;
13823       if (mask & ELF_SPARC_HWCAP_FMAF)
13824         printf ("%sfmaf", first ? "" : "|"), first = 0;
13825       if (mask & ELF_SPARC_HWCAP_VIS3)
13826         printf ("%svis3", first ? "" : "|"), first = 0;
13827       if (mask & ELF_SPARC_HWCAP_HPC)
13828         printf ("%shpc", first ? "" : "|"), first = 0;
13829       if (mask & ELF_SPARC_HWCAP_RANDOM)
13830         printf ("%srandom", first ? "" : "|"), first = 0;
13831       if (mask & ELF_SPARC_HWCAP_TRANS)
13832         printf ("%strans", first ? "" : "|"), first = 0;
13833       if (mask & ELF_SPARC_HWCAP_FJFMAU)
13834         printf ("%sfjfmau", first ? "" : "|"), first = 0;
13835       if (mask & ELF_SPARC_HWCAP_IMA)
13836         printf ("%sima", first ? "" : "|"), first = 0;
13837       if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
13838         printf ("%scspare", first ? "" : "|"), first = 0;
13839     }
13840   else
13841     fputc ('0', stdout);
13842   fputc ('\n', stdout);
13843 }
13844
13845 static void
13846 display_sparc_hwcaps2 (int mask)
13847 {
13848   if (mask)
13849     {
13850       int first = 1;
13851
13852       if (mask & ELF_SPARC_HWCAP2_FJATHPLUS)
13853         fputs ("fjathplus", stdout), first = 0;
13854       if (mask & ELF_SPARC_HWCAP2_VIS3B)
13855         printf ("%svis3b", first ? "" : "|"), first = 0;
13856       if (mask & ELF_SPARC_HWCAP2_ADP)
13857         printf ("%sadp", first ? "" : "|"), first = 0;
13858       if (mask & ELF_SPARC_HWCAP2_SPARC5)
13859         printf ("%ssparc5", first ? "" : "|"), first = 0;
13860       if (mask & ELF_SPARC_HWCAP2_MWAIT)
13861         printf ("%smwait", first ? "" : "|"), first = 0;
13862       if (mask & ELF_SPARC_HWCAP2_XMPMUL)
13863         printf ("%sxmpmul", first ? "" : "|"), first = 0;
13864       if (mask & ELF_SPARC_HWCAP2_XMONT)
13865         printf ("%sxmont2", first ? "" : "|"), first = 0;
13866       if (mask & ELF_SPARC_HWCAP2_NSEC)
13867         printf ("%snsec", first ? "" : "|"), first = 0;
13868       if (mask & ELF_SPARC_HWCAP2_FJATHHPC)
13869         printf ("%sfjathhpc", first ? "" : "|"), first = 0;
13870       if (mask & ELF_SPARC_HWCAP2_FJDES)
13871         printf ("%sfjdes", first ? "" : "|"), first = 0;
13872       if (mask & ELF_SPARC_HWCAP2_FJAES)
13873         printf ("%sfjaes", first ? "" : "|"), first = 0;
13874     }
13875   else
13876     fputc ('0', stdout);
13877   fputc ('\n', stdout);
13878 }
13879
13880 static unsigned char *
13881 display_sparc_gnu_attribute (unsigned char * p,
13882                              int tag,
13883                              const unsigned char * const end)
13884 {
13885   unsigned int len;
13886   int val;
13887
13888   if (tag == Tag_GNU_Sparc_HWCAPS)
13889     {
13890       val = read_uleb128 (p, &len, end);
13891       p += len;
13892       printf ("  Tag_GNU_Sparc_HWCAPS: ");
13893       display_sparc_hwcaps (val);
13894       return p;
13895     }
13896   if (tag == Tag_GNU_Sparc_HWCAPS2)
13897     {
13898       val = read_uleb128 (p, &len, end);
13899       p += len;
13900       printf ("  Tag_GNU_Sparc_HWCAPS2: ");
13901       display_sparc_hwcaps2 (val);
13902       return p;
13903     }
13904
13905   return display_tag_value (tag, p, end);
13906 }
13907
13908 static void
13909 print_mips_fp_abi_value (int val)
13910 {
13911   switch (val)
13912     {
13913     case Val_GNU_MIPS_ABI_FP_ANY:
13914       printf (_("Hard or soft float\n"));
13915       break;
13916     case Val_GNU_MIPS_ABI_FP_DOUBLE:
13917       printf (_("Hard float (double precision)\n"));
13918       break;
13919     case Val_GNU_MIPS_ABI_FP_SINGLE:
13920       printf (_("Hard float (single precision)\n"));
13921       break;
13922     case Val_GNU_MIPS_ABI_FP_SOFT:
13923       printf (_("Soft float\n"));
13924       break;
13925     case Val_GNU_MIPS_ABI_FP_OLD_64:
13926       printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
13927       break;
13928     case Val_GNU_MIPS_ABI_FP_XX:
13929       printf (_("Hard float (32-bit CPU, Any FPU)\n"));
13930       break;
13931     case Val_GNU_MIPS_ABI_FP_64:
13932       printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
13933       break;
13934     case Val_GNU_MIPS_ABI_FP_64A:
13935       printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
13936       break;
13937     case Val_GNU_MIPS_ABI_FP_NAN2008:
13938       printf (_("NaN 2008 compatibility\n"));
13939       break;
13940     default:
13941       printf ("??? (%d)\n", val);
13942       break;
13943     }
13944 }
13945
13946 static unsigned char *
13947 display_mips_gnu_attribute (unsigned char * p,
13948                             int tag,
13949                             const unsigned char * const end)
13950 {
13951   if (tag == Tag_GNU_MIPS_ABI_FP)
13952     {
13953       unsigned int len;
13954       int val;
13955
13956       val = read_uleb128 (p, &len, end);
13957       p += len;
13958       printf ("  Tag_GNU_MIPS_ABI_FP: ");
13959
13960       print_mips_fp_abi_value (val);
13961
13962       return p;
13963    }
13964
13965   if (tag == Tag_GNU_MIPS_ABI_MSA)
13966     {
13967       unsigned int len;
13968       int val;
13969
13970       val = read_uleb128 (p, &len, end);
13971       p += len;
13972       printf ("  Tag_GNU_MIPS_ABI_MSA: ");
13973
13974       switch (val)
13975         {
13976         case Val_GNU_MIPS_ABI_MSA_ANY:
13977           printf (_("Any MSA or not\n"));
13978           break;
13979         case Val_GNU_MIPS_ABI_MSA_128:
13980           printf (_("128-bit MSA\n"));
13981           break;
13982         default:
13983           printf ("??? (%d)\n", val);
13984           break;
13985         }
13986       return p;
13987     }
13988
13989   return display_tag_value (tag & 1, p, end);
13990 }
13991
13992 static unsigned char *
13993 display_tic6x_attribute (unsigned char * p,
13994                          const unsigned char * const end)
13995 {
13996   int tag;
13997   unsigned int len;
13998   int val;
13999
14000   tag = read_uleb128 (p, &len, end);
14001   p += len;
14002
14003   switch (tag)
14004     {
14005     case Tag_ISA:
14006       val = read_uleb128 (p, &len, end);
14007       p += len;
14008       printf ("  Tag_ISA: ");
14009
14010       switch (val)
14011         {
14012         case C6XABI_Tag_ISA_none:
14013           printf (_("None\n"));
14014           break;
14015         case C6XABI_Tag_ISA_C62X:
14016           printf ("C62x\n");
14017           break;
14018         case C6XABI_Tag_ISA_C67X:
14019           printf ("C67x\n");
14020           break;
14021         case C6XABI_Tag_ISA_C67XP:
14022           printf ("C67x+\n");
14023           break;
14024         case C6XABI_Tag_ISA_C64X:
14025           printf ("C64x\n");
14026           break;
14027         case C6XABI_Tag_ISA_C64XP:
14028           printf ("C64x+\n");
14029           break;
14030         case C6XABI_Tag_ISA_C674X:
14031           printf ("C674x\n");
14032           break;
14033         default:
14034           printf ("??? (%d)\n", val);
14035           break;
14036         }
14037       return p;
14038
14039     case Tag_ABI_wchar_t:
14040       val = read_uleb128 (p, &len, end);
14041       p += len;
14042       printf ("  Tag_ABI_wchar_t: ");
14043       switch (val)
14044         {
14045         case 0:
14046           printf (_("Not used\n"));
14047           break;
14048         case 1:
14049           printf (_("2 bytes\n"));
14050           break;
14051         case 2:
14052           printf (_("4 bytes\n"));
14053           break;
14054         default:
14055           printf ("??? (%d)\n", val);
14056           break;
14057         }
14058       return p;
14059
14060     case Tag_ABI_stack_align_needed:
14061       val = read_uleb128 (p, &len, end);
14062       p += len;
14063       printf ("  Tag_ABI_stack_align_needed: ");
14064       switch (val)
14065         {
14066         case 0:
14067           printf (_("8-byte\n"));
14068           break;
14069         case 1:
14070           printf (_("16-byte\n"));
14071           break;
14072         default:
14073           printf ("??? (%d)\n", val);
14074           break;
14075         }
14076       return p;
14077
14078     case Tag_ABI_stack_align_preserved:
14079       val = read_uleb128 (p, &len, end);
14080       p += len;
14081       printf ("  Tag_ABI_stack_align_preserved: ");
14082       switch (val)
14083         {
14084         case 0:
14085           printf (_("8-byte\n"));
14086           break;
14087         case 1:
14088           printf (_("16-byte\n"));
14089           break;
14090         default:
14091           printf ("??? (%d)\n", val);
14092           break;
14093         }
14094       return p;
14095
14096     case Tag_ABI_DSBT:
14097       val = read_uleb128 (p, &len, end);
14098       p += len;
14099       printf ("  Tag_ABI_DSBT: ");
14100       switch (val)
14101         {
14102         case 0:
14103           printf (_("DSBT addressing not used\n"));
14104           break;
14105         case 1:
14106           printf (_("DSBT addressing used\n"));
14107           break;
14108         default:
14109           printf ("??? (%d)\n", val);
14110           break;
14111         }
14112       return p;
14113
14114     case Tag_ABI_PID:
14115       val = read_uleb128 (p, &len, end);
14116       p += len;
14117       printf ("  Tag_ABI_PID: ");
14118       switch (val)
14119         {
14120         case 0:
14121           printf (_("Data addressing position-dependent\n"));
14122           break;
14123         case 1:
14124           printf (_("Data addressing position-independent, GOT near DP\n"));
14125           break;
14126         case 2:
14127           printf (_("Data addressing position-independent, GOT far from DP\n"));
14128           break;
14129         default:
14130           printf ("??? (%d)\n", val);
14131           break;
14132         }
14133       return p;
14134
14135     case Tag_ABI_PIC:
14136       val = read_uleb128 (p, &len, end);
14137       p += len;
14138       printf ("  Tag_ABI_PIC: ");
14139       switch (val)
14140         {
14141         case 0:
14142           printf (_("Code addressing position-dependent\n"));
14143           break;
14144         case 1:
14145           printf (_("Code addressing position-independent\n"));
14146           break;
14147         default:
14148           printf ("??? (%d)\n", val);
14149           break;
14150         }
14151       return p;
14152
14153     case Tag_ABI_array_object_alignment:
14154       val = read_uleb128 (p, &len, end);
14155       p += len;
14156       printf ("  Tag_ABI_array_object_alignment: ");
14157       switch (val)
14158         {
14159         case 0:
14160           printf (_("8-byte\n"));
14161           break;
14162         case 1:
14163           printf (_("4-byte\n"));
14164           break;
14165         case 2:
14166           printf (_("16-byte\n"));
14167           break;
14168         default:
14169           printf ("??? (%d)\n", val);
14170           break;
14171         }
14172       return p;
14173
14174     case Tag_ABI_array_object_align_expected:
14175       val = read_uleb128 (p, &len, end);
14176       p += len;
14177       printf ("  Tag_ABI_array_object_align_expected: ");
14178       switch (val)
14179         {
14180         case 0:
14181           printf (_("8-byte\n"));
14182           break;
14183         case 1:
14184           printf (_("4-byte\n"));
14185           break;
14186         case 2:
14187           printf (_("16-byte\n"));
14188           break;
14189         default:
14190           printf ("??? (%d)\n", val);
14191           break;
14192         }
14193       return p;
14194
14195     case Tag_ABI_compatibility:
14196       {
14197         val = read_uleb128 (p, &len, end);
14198         p += len;
14199         printf ("  Tag_ABI_compatibility: ");
14200         printf (_("flag = %d, vendor = "), val);
14201         if (p < end - 1)
14202           {
14203             size_t maxlen = (end - p) - 1;
14204
14205             print_symbol ((int) maxlen, (const char *) p);
14206             p += strnlen ((char *) p, maxlen) + 1;
14207           }
14208         else
14209           {
14210             printf (_("<corrupt>"));
14211             p = (unsigned char *) end;
14212           }
14213         putchar ('\n');
14214         return p;
14215       }
14216
14217     case Tag_ABI_conformance:
14218       {
14219         printf ("  Tag_ABI_conformance: \"");
14220         if (p < end - 1)
14221           {
14222             size_t maxlen = (end - p) - 1;
14223
14224             print_symbol ((int) maxlen, (const char *) p);
14225             p += strnlen ((char *) p, maxlen) + 1;
14226           }
14227         else
14228           {
14229             printf (_("<corrupt>"));
14230             p = (unsigned char *) end;
14231           }
14232         printf ("\"\n");
14233         return p;
14234       }
14235     }
14236
14237   return display_tag_value (tag, p, end);
14238 }
14239
14240 static void
14241 display_raw_attribute (unsigned char * p, unsigned char * end)
14242 {
14243   unsigned long addr = 0;
14244   size_t bytes = end - p;
14245
14246   assert (end > p);
14247   while (bytes)
14248     {
14249       int j;
14250       int k;
14251       int lbytes = (bytes > 16 ? 16 : bytes);
14252
14253       printf ("  0x%8.8lx ", addr);
14254
14255       for (j = 0; j < 16; j++)
14256         {
14257           if (j < lbytes)
14258             printf ("%2.2x", p[j]);
14259           else
14260             printf ("  ");
14261
14262           if ((j & 3) == 3)
14263             printf (" ");
14264         }
14265
14266       for (j = 0; j < lbytes; j++)
14267         {
14268           k = p[j];
14269           if (k >= ' ' && k < 0x7f)
14270             printf ("%c", k);
14271           else
14272             printf (".");
14273         }
14274
14275       putchar ('\n');
14276
14277       p  += lbytes;
14278       bytes -= lbytes;
14279       addr += lbytes;
14280     }
14281
14282   putchar ('\n');
14283 }
14284
14285 static unsigned char *
14286 display_msp430x_attribute (unsigned char * p,
14287                            const unsigned char * const end)
14288 {
14289   unsigned int len;
14290   int val;
14291   int tag;
14292
14293   tag = read_uleb128 (p, & len, end);
14294   p += len;
14295
14296   switch (tag)
14297     {
14298     case OFBA_MSPABI_Tag_ISA:
14299       val = read_uleb128 (p, &len, end);
14300       p += len;
14301       printf ("  Tag_ISA: ");
14302       switch (val)
14303         {
14304         case 0: printf (_("None\n")); break;
14305         case 1: printf (_("MSP430\n")); break;
14306         case 2: printf (_("MSP430X\n")); break;
14307         default: printf ("??? (%d)\n", val); break;
14308         }
14309       break;
14310
14311     case OFBA_MSPABI_Tag_Code_Model:
14312       val = read_uleb128 (p, &len, end);
14313       p += len;
14314       printf ("  Tag_Code_Model: ");
14315       switch (val)
14316         {
14317         case 0: printf (_("None\n")); break;
14318         case 1: printf (_("Small\n")); break;
14319         case 2: printf (_("Large\n")); break;
14320         default: printf ("??? (%d)\n", val); break;
14321         }
14322       break;
14323
14324     case OFBA_MSPABI_Tag_Data_Model:
14325       val = read_uleb128 (p, &len, end);
14326       p += len;
14327       printf ("  Tag_Data_Model: ");
14328       switch (val)
14329         {
14330         case 0: printf (_("None\n")); break;
14331         case 1: printf (_("Small\n")); break;
14332         case 2: printf (_("Large\n")); break;
14333         case 3: printf (_("Restricted Large\n")); break;
14334         default: printf ("??? (%d)\n", val); break;
14335         }
14336       break;
14337
14338     default:
14339       printf (_("  <unknown tag %d>: "), tag);
14340
14341       if (tag & 1)
14342         {
14343           putchar ('"');
14344           if (p < end - 1)
14345             {
14346               size_t maxlen = (end - p) - 1;
14347
14348               print_symbol ((int) maxlen, (const char *) p);
14349               p += strnlen ((char *) p, maxlen) + 1;
14350             }
14351           else
14352             {
14353               printf (_("<corrupt>"));
14354               p = (unsigned char *) end;
14355             }
14356           printf ("\"\n");
14357         }
14358       else
14359         {
14360           val = read_uleb128 (p, &len, end);
14361           p += len;
14362           printf ("%d (0x%x)\n", val, val);
14363         }
14364       break;
14365    }
14366
14367   assert (p <= end);
14368   return p;
14369 }
14370
14371 static int
14372 process_attributes (FILE * file,
14373                     const char * public_name,
14374                     unsigned int proc_type,
14375                     unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
14376                     unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const))
14377 {
14378   Elf_Internal_Shdr * sect;
14379   unsigned i;
14380
14381   /* Find the section header so that we get the size.  */
14382   for (i = 0, sect = section_headers;
14383        i < elf_header.e_shnum;
14384        i++, sect++)
14385     {
14386       unsigned char * contents;
14387       unsigned char * p;
14388
14389       if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
14390         continue;
14391
14392       contents = (unsigned char *) get_data (NULL, file, sect->sh_offset, 1,
14393                                              sect->sh_size, _("attributes"));
14394       if (contents == NULL)
14395         continue;
14396
14397       p = contents;
14398       if (*p == 'A')
14399         {
14400           bfd_vma section_len;
14401
14402           section_len = sect->sh_size - 1;
14403           p++;
14404
14405           while (section_len > 0)
14406             {
14407               bfd_vma attr_len;
14408               unsigned int namelen;
14409               bfd_boolean public_section;
14410               bfd_boolean gnu_section;
14411
14412               if (section_len <= 4)
14413                 {
14414                   error (_("Tag section ends prematurely\n"));
14415                   break;
14416                 }
14417               attr_len = byte_get (p, 4);
14418               p += 4;
14419
14420               if (attr_len > section_len)
14421                 {
14422                   error (_("Bad attribute length (%u > %u)\n"),
14423                           (unsigned) attr_len, (unsigned) section_len);
14424                   attr_len = section_len;
14425                 }
14426               /* PR 17531: file: 001-101425-0.004  */
14427               else if (attr_len < 5)
14428                 {
14429                   error (_("Attribute length of %u is too small\n"), (unsigned) attr_len);
14430                   break;
14431                 }
14432
14433               section_len -= attr_len;
14434               attr_len -= 4;
14435
14436               namelen = strnlen ((char *) p, attr_len) + 1;
14437               if (namelen == 0 || namelen >= attr_len)
14438                 {
14439                   error (_("Corrupt attribute section name\n"));
14440                   break;
14441                 }
14442
14443               printf (_("Attribute Section: "));
14444               print_symbol (INT_MAX, (const char *) p);
14445               putchar ('\n');
14446
14447               if (public_name && streq ((char *) p, public_name))
14448                 public_section = TRUE;
14449               else
14450                 public_section = FALSE;
14451
14452               if (streq ((char *) p, "gnu"))
14453                 gnu_section = TRUE;
14454               else
14455                 gnu_section = FALSE;
14456
14457               p += namelen;
14458               attr_len -= namelen;
14459
14460               while (attr_len > 0 && p < contents + sect->sh_size)
14461                 {
14462                   int tag;
14463                   int val;
14464                   bfd_vma size;
14465                   unsigned char * end;
14466
14467                   /* PR binutils/17531: Safe handling of corrupt files.  */
14468                   if (attr_len < 6)
14469                     {
14470                       error (_("Unused bytes at end of section\n"));
14471                       section_len = 0;
14472                       break;
14473                     }
14474
14475                   tag = *(p++);
14476                   size = byte_get (p, 4);
14477                   if (size > attr_len)
14478                     {
14479                       error (_("Bad subsection length (%u > %u)\n"),
14480                               (unsigned) size, (unsigned) attr_len);
14481                       size = attr_len;
14482                     }
14483                   /* PR binutils/17531: Safe handling of corrupt files.  */
14484                   if (size < 6)
14485                     {
14486                       error (_("Bad subsection length (%u < 6)\n"),
14487                               (unsigned) size);
14488                       section_len = 0;
14489                       break;
14490                     }
14491
14492                   attr_len -= size;
14493                   end = p + size - 1;
14494                   assert (end <= contents + sect->sh_size);
14495                   p += 4;
14496
14497                   switch (tag)
14498                     {
14499                     case 1:
14500                       printf (_("File Attributes\n"));
14501                       break;
14502                     case 2:
14503                       printf (_("Section Attributes:"));
14504                       goto do_numlist;
14505                     case 3:
14506                       printf (_("Symbol Attributes:"));
14507                       /* Fall through.  */
14508                     do_numlist:
14509                       for (;;)
14510                         {
14511                           unsigned int j;
14512
14513                           val = read_uleb128 (p, &j, end);
14514                           p += j;
14515                           if (val == 0)
14516                             break;
14517                           printf (" %d", val);
14518                         }
14519                       printf ("\n");
14520                       break;
14521                     default:
14522                       printf (_("Unknown tag: %d\n"), tag);
14523                       public_section = FALSE;
14524                       break;
14525                     }
14526
14527                   if (public_section && display_pub_attribute != NULL)
14528                     {
14529                       while (p < end)
14530                         p = display_pub_attribute (p, end);
14531                       assert (p <= end);
14532                     }
14533                   else if (gnu_section && display_proc_gnu_attribute != NULL)
14534                     {
14535                       while (p < end)
14536                         p = display_gnu_attribute (p,
14537                                                    display_proc_gnu_attribute,
14538                                                    end);
14539                       assert (p <= end);
14540                     }
14541                   else if (p < end)
14542                     {
14543                       printf (_("  Unknown attribute:\n"));
14544                       display_raw_attribute (p, end);
14545                       p = end;
14546                     }
14547                   else
14548                     attr_len = 0;
14549                 }
14550             }
14551         }
14552       else
14553         printf (_("Unknown format '%c' (%d)\n"), *p, *p);
14554
14555       free (contents);
14556     }
14557   return 1;
14558 }
14559
14560 static int
14561 process_arm_specific (FILE * file)
14562 {
14563   return process_attributes (file, "aeabi", SHT_ARM_ATTRIBUTES,
14564                              display_arm_attribute, NULL);
14565 }
14566
14567 static int
14568 process_power_specific (FILE * file)
14569 {
14570   return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14571                              display_power_gnu_attribute);
14572 }
14573
14574 static int
14575 process_s390_specific (FILE * file)
14576 {
14577   return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14578                              display_s390_gnu_attribute);
14579 }
14580
14581 static int
14582 process_sparc_specific (FILE * file)
14583 {
14584   return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14585                              display_sparc_gnu_attribute);
14586 }
14587
14588 static int
14589 process_tic6x_specific (FILE * file)
14590 {
14591   return process_attributes (file, "c6xabi", SHT_C6000_ATTRIBUTES,
14592                              display_tic6x_attribute, NULL);
14593 }
14594
14595 static int
14596 process_msp430x_specific (FILE * file)
14597 {
14598   return process_attributes (file, "mspabi", SHT_MSP430_ATTRIBUTES,
14599                              display_msp430x_attribute, NULL);
14600 }
14601
14602 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
14603    Print the Address, Access and Initial fields of an entry at VMA ADDR
14604    and return the VMA of the next entry, or -1 if there was a problem.
14605    Does not read from DATA_END or beyond.  */
14606
14607 static bfd_vma
14608 print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr,
14609                       unsigned char * data_end)
14610 {
14611   printf ("  ");
14612   print_vma (addr, LONG_HEX);
14613   printf (" ");
14614   if (addr < pltgot + 0xfff0)
14615     printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
14616   else
14617     printf ("%10s", "");
14618   printf (" ");
14619   if (data == NULL)
14620     printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
14621   else
14622     {
14623       bfd_vma entry;
14624       unsigned char * from = data + addr - pltgot;
14625
14626       if (from + (is_32bit_elf ? 4 : 8) > data_end)
14627         {
14628           warn (_("MIPS GOT entry extends beyond the end of available data\n"));
14629           printf ("%*s", is_32bit_elf ? 8 : 16, _("<corrupt>"));
14630           return (bfd_vma) -1;
14631         }
14632       else
14633         {
14634           entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
14635           print_vma (entry, LONG_HEX);
14636         }
14637     }
14638   return addr + (is_32bit_elf ? 4 : 8);
14639 }
14640
14641 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
14642    PLTGOT.  Print the Address and Initial fields of an entry at VMA
14643    ADDR and return the VMA of the next entry.  */
14644
14645 static bfd_vma
14646 print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
14647 {
14648   printf ("  ");
14649   print_vma (addr, LONG_HEX);
14650   printf (" ");
14651   if (data == NULL)
14652     printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
14653   else
14654     {
14655       bfd_vma entry;
14656
14657       entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
14658       print_vma (entry, LONG_HEX);
14659     }
14660   return addr + (is_32bit_elf ? 4 : 8);
14661 }
14662
14663 static void
14664 print_mips_ases (unsigned int mask)
14665 {
14666   if (mask & AFL_ASE_DSP)
14667     fputs ("\n\tDSP ASE", stdout);
14668   if (mask & AFL_ASE_DSPR2)
14669     fputs ("\n\tDSP R2 ASE", stdout);
14670   if (mask & AFL_ASE_DSPR3)
14671     fputs ("\n\tDSP R3 ASE", stdout);
14672   if (mask & AFL_ASE_EVA)
14673     fputs ("\n\tEnhanced VA Scheme", stdout);
14674   if (mask & AFL_ASE_MCU)
14675     fputs ("\n\tMCU (MicroController) ASE", stdout);
14676   if (mask & AFL_ASE_MDMX)
14677     fputs ("\n\tMDMX ASE", stdout);
14678   if (mask & AFL_ASE_MIPS3D)
14679     fputs ("\n\tMIPS-3D ASE", stdout);
14680   if (mask & AFL_ASE_MT)
14681     fputs ("\n\tMT ASE", stdout);
14682   if (mask & AFL_ASE_SMARTMIPS)
14683     fputs ("\n\tSmartMIPS ASE", stdout);
14684   if (mask & AFL_ASE_VIRT)
14685     fputs ("\n\tVZ ASE", stdout);
14686   if (mask & AFL_ASE_MSA)
14687     fputs ("\n\tMSA ASE", stdout);
14688   if (mask & AFL_ASE_MIPS16)
14689     fputs ("\n\tMIPS16 ASE", stdout);
14690   if (mask & AFL_ASE_MICROMIPS)
14691     fputs ("\n\tMICROMIPS ASE", stdout);
14692   if (mask & AFL_ASE_XPA)
14693     fputs ("\n\tXPA ASE", stdout);
14694   if (mask == 0)
14695     fprintf (stdout, "\n\t%s", _("None"));
14696   else if ((mask & ~AFL_ASE_MASK) != 0)
14697     fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
14698 }
14699
14700 static void
14701 print_mips_isa_ext (unsigned int isa_ext)
14702 {
14703   switch (isa_ext)
14704     {
14705     case 0:
14706       fputs (_("None"), stdout);
14707       break;
14708     case AFL_EXT_XLR:
14709       fputs ("RMI XLR", stdout);
14710       break;
14711     case AFL_EXT_OCTEON3:
14712       fputs ("Cavium Networks Octeon3", stdout);
14713       break;
14714     case AFL_EXT_OCTEON2:
14715       fputs ("Cavium Networks Octeon2", stdout);
14716       break;
14717     case AFL_EXT_OCTEONP:
14718       fputs ("Cavium Networks OcteonP", stdout);
14719       break;
14720     case AFL_EXT_LOONGSON_3A:
14721       fputs ("Loongson 3A", stdout);
14722       break;
14723     case AFL_EXT_OCTEON:
14724       fputs ("Cavium Networks Octeon", stdout);
14725       break;
14726     case AFL_EXT_5900:
14727       fputs ("Toshiba R5900", stdout);
14728       break;
14729     case AFL_EXT_4650:
14730       fputs ("MIPS R4650", stdout);
14731       break;
14732     case AFL_EXT_4010:
14733       fputs ("LSI R4010", stdout);
14734       break;
14735     case AFL_EXT_4100:
14736       fputs ("NEC VR4100", stdout);
14737       break;
14738     case AFL_EXT_3900:
14739       fputs ("Toshiba R3900", stdout);
14740       break;
14741     case AFL_EXT_10000:
14742       fputs ("MIPS R10000", stdout);
14743       break;
14744     case AFL_EXT_SB1:
14745       fputs ("Broadcom SB-1", stdout);
14746       break;
14747     case AFL_EXT_4111:
14748       fputs ("NEC VR4111/VR4181", stdout);
14749       break;
14750     case AFL_EXT_4120:
14751       fputs ("NEC VR4120", stdout);
14752       break;
14753     case AFL_EXT_5400:
14754       fputs ("NEC VR5400", stdout);
14755       break;
14756     case AFL_EXT_5500:
14757       fputs ("NEC VR5500", stdout);
14758       break;
14759     case AFL_EXT_LOONGSON_2E:
14760       fputs ("ST Microelectronics Loongson 2E", stdout);
14761       break;
14762     case AFL_EXT_LOONGSON_2F:
14763       fputs ("ST Microelectronics Loongson 2F", stdout);
14764       break;
14765     default:
14766       fprintf (stdout, "%s (%d)", _("Unknown"), isa_ext);
14767     }
14768 }
14769
14770 static int
14771 get_mips_reg_size (int reg_size)
14772 {
14773   return (reg_size == AFL_REG_NONE) ? 0
14774          : (reg_size == AFL_REG_32) ? 32
14775          : (reg_size == AFL_REG_64) ? 64
14776          : (reg_size == AFL_REG_128) ? 128
14777          : -1;
14778 }
14779
14780 static int
14781 process_mips_specific (FILE * file)
14782 {
14783   Elf_Internal_Dyn * entry;
14784   Elf_Internal_Shdr *sect = NULL;
14785   size_t liblist_offset = 0;
14786   size_t liblistno = 0;
14787   size_t conflictsno = 0;
14788   size_t options_offset = 0;
14789   size_t conflicts_offset = 0;
14790   size_t pltrelsz = 0;
14791   size_t pltrel = 0;
14792   bfd_vma pltgot = 0;
14793   bfd_vma mips_pltgot = 0;
14794   bfd_vma jmprel = 0;
14795   bfd_vma local_gotno = 0;
14796   bfd_vma gotsym = 0;
14797   bfd_vma symtabno = 0;
14798
14799   process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14800                       display_mips_gnu_attribute);
14801
14802   sect = find_section (".MIPS.abiflags");
14803
14804   if (sect != NULL)
14805     {
14806       Elf_External_ABIFlags_v0 *abiflags_ext;
14807       Elf_Internal_ABIFlags_v0 abiflags_in;
14808
14809       if (sizeof (Elf_External_ABIFlags_v0) != sect->sh_size)
14810         fputs ("\nCorrupt ABI Flags section.\n", stdout);
14811       else
14812         {
14813           abiflags_ext = get_data (NULL, file, sect->sh_offset, 1,
14814                                    sect->sh_size, _("MIPS ABI Flags section"));
14815           if (abiflags_ext)
14816             {
14817               abiflags_in.version = BYTE_GET (abiflags_ext->version);
14818               abiflags_in.isa_level = BYTE_GET (abiflags_ext->isa_level);
14819               abiflags_in.isa_rev = BYTE_GET (abiflags_ext->isa_rev);
14820               abiflags_in.gpr_size = BYTE_GET (abiflags_ext->gpr_size);
14821               abiflags_in.cpr1_size = BYTE_GET (abiflags_ext->cpr1_size);
14822               abiflags_in.cpr2_size = BYTE_GET (abiflags_ext->cpr2_size);
14823               abiflags_in.fp_abi = BYTE_GET (abiflags_ext->fp_abi);
14824               abiflags_in.isa_ext = BYTE_GET (abiflags_ext->isa_ext);
14825               abiflags_in.ases = BYTE_GET (abiflags_ext->ases);
14826               abiflags_in.flags1 = BYTE_GET (abiflags_ext->flags1);
14827               abiflags_in.flags2 = BYTE_GET (abiflags_ext->flags2);
14828
14829               printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in.version);
14830               printf ("\nISA: MIPS%d", abiflags_in.isa_level);
14831               if (abiflags_in.isa_rev > 1)
14832                 printf ("r%d", abiflags_in.isa_rev);
14833               printf ("\nGPR size: %d",
14834                       get_mips_reg_size (abiflags_in.gpr_size));
14835               printf ("\nCPR1 size: %d",
14836                       get_mips_reg_size (abiflags_in.cpr1_size));
14837               printf ("\nCPR2 size: %d",
14838                       get_mips_reg_size (abiflags_in.cpr2_size));
14839               fputs ("\nFP ABI: ", stdout);
14840               print_mips_fp_abi_value (abiflags_in.fp_abi);
14841               fputs ("ISA Extension: ", stdout);
14842               print_mips_isa_ext (abiflags_in.isa_ext);
14843               fputs ("\nASEs:", stdout);
14844               print_mips_ases (abiflags_in.ases);
14845               printf ("\nFLAGS 1: %8.8lx", abiflags_in.flags1);
14846               printf ("\nFLAGS 2: %8.8lx", abiflags_in.flags2);
14847               fputc ('\n', stdout);
14848               free (abiflags_ext);
14849             }
14850         }
14851     }
14852
14853   /* We have a lot of special sections.  Thanks SGI!  */
14854   if (dynamic_section == NULL)
14855     /* No information available.  */
14856     return 0;
14857
14858   for (entry = dynamic_section;
14859        /* PR 17531 file: 012-50589-0.004.  */
14860        entry < dynamic_section + dynamic_nent && entry->d_tag != DT_NULL;
14861        ++entry)
14862     switch (entry->d_tag)
14863       {
14864       case DT_MIPS_LIBLIST:
14865         liblist_offset
14866           = offset_from_vma (file, entry->d_un.d_val,
14867                              liblistno * sizeof (Elf32_External_Lib));
14868         break;
14869       case DT_MIPS_LIBLISTNO:
14870         liblistno = entry->d_un.d_val;
14871         break;
14872       case DT_MIPS_OPTIONS:
14873         options_offset = offset_from_vma (file, entry->d_un.d_val, 0);
14874         break;
14875       case DT_MIPS_CONFLICT:
14876         conflicts_offset
14877           = offset_from_vma (file, entry->d_un.d_val,
14878                              conflictsno * sizeof (Elf32_External_Conflict));
14879         break;
14880       case DT_MIPS_CONFLICTNO:
14881         conflictsno = entry->d_un.d_val;
14882         break;
14883       case DT_PLTGOT:
14884         pltgot = entry->d_un.d_ptr;
14885         break;
14886       case DT_MIPS_LOCAL_GOTNO:
14887         local_gotno = entry->d_un.d_val;
14888         break;
14889       case DT_MIPS_GOTSYM:
14890         gotsym = entry->d_un.d_val;
14891         break;
14892       case DT_MIPS_SYMTABNO:
14893         symtabno = entry->d_un.d_val;
14894         break;
14895       case DT_MIPS_PLTGOT:
14896         mips_pltgot = entry->d_un.d_ptr;
14897         break;
14898       case DT_PLTREL:
14899         pltrel = entry->d_un.d_val;
14900         break;
14901       case DT_PLTRELSZ:
14902         pltrelsz = entry->d_un.d_val;
14903         break;
14904       case DT_JMPREL:
14905         jmprel = entry->d_un.d_ptr;
14906         break;
14907       default:
14908         break;
14909       }
14910
14911   if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
14912     {
14913       Elf32_External_Lib * elib;
14914       size_t cnt;
14915
14916       elib = (Elf32_External_Lib *) get_data (NULL, file, liblist_offset,
14917                                               liblistno,
14918                                               sizeof (Elf32_External_Lib),
14919                                               _("liblist section data"));
14920       if (elib)
14921         {
14922           printf (_("\nSection '.liblist' contains %lu entries:\n"),
14923                   (unsigned long) liblistno);
14924           fputs (_("     Library              Time Stamp          Checksum   Version Flags\n"),
14925                  stdout);
14926
14927           for (cnt = 0; cnt < liblistno; ++cnt)
14928             {
14929               Elf32_Lib liblist;
14930               time_t atime;
14931               char timebuf[128];
14932               struct tm * tmp;
14933
14934               liblist.l_name = BYTE_GET (elib[cnt].l_name);
14935               atime = BYTE_GET (elib[cnt].l_time_stamp);
14936               liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
14937               liblist.l_version = BYTE_GET (elib[cnt].l_version);
14938               liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
14939
14940               tmp = gmtime (&atime);
14941               snprintf (timebuf, sizeof (timebuf),
14942                         "%04u-%02u-%02uT%02u:%02u:%02u",
14943                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
14944                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
14945
14946               printf ("%3lu: ", (unsigned long) cnt);
14947               if (VALID_DYNAMIC_NAME (liblist.l_name))
14948                 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
14949               else
14950                 printf (_("<corrupt: %9ld>"), liblist.l_name);
14951               printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
14952                       liblist.l_version);
14953
14954               if (liblist.l_flags == 0)
14955                 puts (_(" NONE"));
14956               else
14957                 {
14958                   static const struct
14959                   {
14960                     const char * name;
14961                     int bit;
14962                   }
14963                   l_flags_vals[] =
14964                   {
14965                     { " EXACT_MATCH", LL_EXACT_MATCH },
14966                     { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
14967                     { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
14968                     { " EXPORTS", LL_EXPORTS },
14969                     { " DELAY_LOAD", LL_DELAY_LOAD },
14970                     { " DELTA", LL_DELTA }
14971                   };
14972                   int flags = liblist.l_flags;
14973                   size_t fcnt;
14974
14975                   for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
14976                     if ((flags & l_flags_vals[fcnt].bit) != 0)
14977                       {
14978                         fputs (l_flags_vals[fcnt].name, stdout);
14979                         flags ^= l_flags_vals[fcnt].bit;
14980                       }
14981                   if (flags != 0)
14982                     printf (" %#x", (unsigned int) flags);
14983
14984                   puts ("");
14985                 }
14986             }
14987
14988           free (elib);
14989         }
14990     }
14991
14992   if (options_offset != 0)
14993     {
14994       Elf_External_Options * eopt;
14995       Elf_Internal_Options * iopt;
14996       Elf_Internal_Options * option;
14997       size_t offset;
14998       int cnt;
14999       sect = section_headers;
15000
15001       /* Find the section header so that we get the size.  */
15002       sect = find_section_by_type (SHT_MIPS_OPTIONS);
15003       /* PR 17533 file: 012-277276-0.004.  */
15004       if (sect == NULL)
15005         {
15006           error (_("No MIPS_OPTIONS header found\n"));
15007           return 0;
15008         }
15009
15010       eopt = (Elf_External_Options *) get_data (NULL, file, options_offset, 1,
15011                                                 sect->sh_size, _("options"));
15012       if (eopt)
15013         {
15014           iopt = (Elf_Internal_Options *)
15015               cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
15016           if (iopt == NULL)
15017             {
15018               error (_("Out of memory allocating space for MIPS options\n"));
15019               return 0;
15020             }
15021
15022           offset = cnt = 0;
15023           option = iopt;
15024
15025           while (offset <= sect->sh_size - sizeof (* eopt))
15026             {
15027               Elf_External_Options * eoption;
15028
15029               eoption = (Elf_External_Options *) ((char *) eopt + offset);
15030
15031               option->kind = BYTE_GET (eoption->kind);
15032               option->size = BYTE_GET (eoption->size);
15033               option->section = BYTE_GET (eoption->section);
15034               option->info = BYTE_GET (eoption->info);
15035
15036               /* PR 17531: file: ffa0fa3b.  */
15037               if (option->size < sizeof (* eopt)
15038                   || offset + option->size > sect->sh_size)
15039                 {
15040                   error (_("Invalid size (%u) for MIPS option\n"), option->size);
15041                   return 0;
15042                 }
15043               offset += option->size;
15044
15045               ++option;
15046               ++cnt;
15047             }
15048
15049           printf (_("\nSection '%s' contains %d entries:\n"),
15050                   printable_section_name (sect), cnt);
15051
15052           option = iopt;
15053           offset = 0;
15054
15055           while (cnt-- > 0)
15056             {
15057               size_t len;
15058
15059               switch (option->kind)
15060                 {
15061                 case ODK_NULL:
15062                   /* This shouldn't happen.  */
15063                   printf (" NULL       %d %lx", option->section, option->info);
15064                   break;
15065                 case ODK_REGINFO:
15066                   printf (" REGINFO    ");
15067                   if (elf_header.e_machine == EM_MIPS)
15068                     {
15069                       /* 32bit form.  */
15070                       Elf32_External_RegInfo * ereg;
15071                       Elf32_RegInfo reginfo;
15072
15073                       ereg = (Elf32_External_RegInfo *) (option + 1);
15074                       reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
15075                       reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
15076                       reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
15077                       reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
15078                       reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
15079                       reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
15080
15081                       printf ("GPR %08lx  GP 0x%lx\n",
15082                               reginfo.ri_gprmask,
15083                               (unsigned long) reginfo.ri_gp_value);
15084                       printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
15085                               reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
15086                               reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
15087                     }
15088                   else
15089                     {
15090                       /* 64 bit form.  */
15091                       Elf64_External_RegInfo * ereg;
15092                       Elf64_Internal_RegInfo reginfo;
15093
15094                       ereg = (Elf64_External_RegInfo *) (option + 1);
15095                       reginfo.ri_gprmask    = BYTE_GET (ereg->ri_gprmask);
15096                       reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
15097                       reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
15098                       reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
15099                       reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
15100                       reginfo.ri_gp_value   = BYTE_GET (ereg->ri_gp_value);
15101
15102                       printf ("GPR %08lx  GP 0x",
15103                               reginfo.ri_gprmask);
15104                       printf_vma (reginfo.ri_gp_value);
15105                       printf ("\n");
15106
15107                       printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
15108                               reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
15109                               reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
15110                     }
15111                   ++option;
15112                   continue;
15113                 case ODK_EXCEPTIONS:
15114                   fputs (" EXCEPTIONS fpe_min(", stdout);
15115                   process_mips_fpe_exception (option->info & OEX_FPU_MIN);
15116                   fputs (") fpe_max(", stdout);
15117                   process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
15118                   fputs (")", stdout);
15119
15120                   if (option->info & OEX_PAGE0)
15121                     fputs (" PAGE0", stdout);
15122                   if (option->info & OEX_SMM)
15123                     fputs (" SMM", stdout);
15124                   if (option->info & OEX_FPDBUG)
15125                     fputs (" FPDBUG", stdout);
15126                   if (option->info & OEX_DISMISS)
15127                     fputs (" DISMISS", stdout);
15128                   break;
15129                 case ODK_PAD:
15130                   fputs (" PAD       ", stdout);
15131                   if (option->info & OPAD_PREFIX)
15132                     fputs (" PREFIX", stdout);
15133                   if (option->info & OPAD_POSTFIX)
15134                     fputs (" POSTFIX", stdout);
15135                   if (option->info & OPAD_SYMBOL)
15136                     fputs (" SYMBOL", stdout);
15137                   break;
15138                 case ODK_HWPATCH:
15139                   fputs (" HWPATCH   ", stdout);
15140                   if (option->info & OHW_R4KEOP)
15141                     fputs (" R4KEOP", stdout);
15142                   if (option->info & OHW_R8KPFETCH)
15143                     fputs (" R8KPFETCH", stdout);
15144                   if (option->info & OHW_R5KEOP)
15145                     fputs (" R5KEOP", stdout);
15146                   if (option->info & OHW_R5KCVTL)
15147                     fputs (" R5KCVTL", stdout);
15148                   break;
15149                 case ODK_FILL:
15150                   fputs (" FILL       ", stdout);
15151                   /* XXX Print content of info word?  */
15152                   break;
15153                 case ODK_TAGS:
15154                   fputs (" TAGS       ", stdout);
15155                   /* XXX Print content of info word?  */
15156                   break;
15157                 case ODK_HWAND:
15158                   fputs (" HWAND     ", stdout);
15159                   if (option->info & OHWA0_R4KEOP_CHECKED)
15160                     fputs (" R4KEOP_CHECKED", stdout);
15161                   if (option->info & OHWA0_R4KEOP_CLEAN)
15162                     fputs (" R4KEOP_CLEAN", stdout);
15163                   break;
15164                 case ODK_HWOR:
15165                   fputs (" HWOR      ", stdout);
15166                   if (option->info & OHWA0_R4KEOP_CHECKED)
15167                     fputs (" R4KEOP_CHECKED", stdout);
15168                   if (option->info & OHWA0_R4KEOP_CLEAN)
15169                     fputs (" R4KEOP_CLEAN", stdout);
15170                   break;
15171                 case ODK_GP_GROUP:
15172                   printf (" GP_GROUP  %#06lx  self-contained %#06lx",
15173                           option->info & OGP_GROUP,
15174                           (option->info & OGP_SELF) >> 16);
15175                   break;
15176                 case ODK_IDENT:
15177                   printf (" IDENT     %#06lx  self-contained %#06lx",
15178                           option->info & OGP_GROUP,
15179                           (option->info & OGP_SELF) >> 16);
15180                   break;
15181                 default:
15182                   /* This shouldn't happen.  */
15183                   printf (" %3d ???     %d %lx",
15184                           option->kind, option->section, option->info);
15185                   break;
15186                 }
15187
15188               len = sizeof (* eopt);
15189               while (len < option->size)
15190                 {
15191                   unsigned char datum = * ((unsigned char *) eopt + offset + len);
15192
15193                   if (ISPRINT (datum))
15194                     printf ("%c", datum);
15195                   else
15196                     printf ("\\%03o", datum);
15197                   len ++;
15198                 }
15199               fputs ("\n", stdout);
15200
15201               offset += option->size;
15202               ++option;
15203             }
15204
15205           free (eopt);
15206         }
15207     }
15208
15209   if (conflicts_offset != 0 && conflictsno != 0)
15210     {
15211       Elf32_Conflict * iconf;
15212       size_t cnt;
15213
15214       if (dynamic_symbols == NULL)
15215         {
15216           error (_("conflict list found without a dynamic symbol table\n"));
15217           return 0;
15218         }
15219
15220       iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
15221       if (iconf == NULL)
15222         {
15223           error (_("Out of memory allocating space for dynamic conflicts\n"));
15224           return 0;
15225         }
15226
15227       if (is_32bit_elf)
15228         {
15229           Elf32_External_Conflict * econf32;
15230
15231           econf32 = (Elf32_External_Conflict *)
15232               get_data (NULL, file, conflicts_offset, conflictsno,
15233                         sizeof (* econf32), _("conflict"));
15234           if (!econf32)
15235             return 0;
15236
15237           for (cnt = 0; cnt < conflictsno; ++cnt)
15238             iconf[cnt] = BYTE_GET (econf32[cnt]);
15239
15240           free (econf32);
15241         }
15242       else
15243         {
15244           Elf64_External_Conflict * econf64;
15245
15246           econf64 = (Elf64_External_Conflict *)
15247               get_data (NULL, file, conflicts_offset, conflictsno,
15248                         sizeof (* econf64), _("conflict"));
15249           if (!econf64)
15250             return 0;
15251
15252           for (cnt = 0; cnt < conflictsno; ++cnt)
15253             iconf[cnt] = BYTE_GET (econf64[cnt]);
15254
15255           free (econf64);
15256         }
15257
15258       printf (_("\nSection '.conflict' contains %lu entries:\n"),
15259               (unsigned long) conflictsno);
15260       puts (_("  Num:    Index       Value  Name"));
15261
15262       for (cnt = 0; cnt < conflictsno; ++cnt)
15263         {
15264           printf ("%5lu: %8lu  ", (unsigned long) cnt, iconf[cnt]);
15265
15266           if (iconf[cnt] >= num_dynamic_syms)
15267             printf (_("<corrupt symbol index>"));
15268           else
15269             {
15270               Elf_Internal_Sym * psym;
15271
15272               psym = & dynamic_symbols[iconf[cnt]];
15273               print_vma (psym->st_value, FULL_HEX);
15274               putchar (' ');
15275               if (VALID_DYNAMIC_NAME (psym->st_name))
15276                 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
15277               else
15278                 printf (_("<corrupt: %14ld>"), psym->st_name);
15279             }
15280           putchar ('\n');
15281         }
15282
15283       free (iconf);
15284     }
15285
15286   if (pltgot != 0 && local_gotno != 0)
15287     {
15288       bfd_vma ent, local_end, global_end;
15289       size_t i, offset;
15290       unsigned char * data;
15291       unsigned char * data_end;
15292       int addr_size;
15293
15294       ent = pltgot;
15295       addr_size = (is_32bit_elf ? 4 : 8);
15296       local_end = pltgot + local_gotno * addr_size;
15297
15298       /* PR binutils/17533 file: 012-111227-0.004  */
15299       if (symtabno < gotsym)
15300         {
15301           error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
15302                  (unsigned long) gotsym, (unsigned long) symtabno);
15303           return 0;
15304         }
15305
15306       global_end = local_end + (symtabno - gotsym) * addr_size;
15307       /* PR 17531: file: 54c91a34.  */
15308       if (global_end < local_end)
15309         {
15310           error (_("Too many GOT symbols: %lu\n"), (unsigned long) symtabno);
15311           return 0;
15312         }
15313
15314       offset = offset_from_vma (file, pltgot, global_end - pltgot);
15315       data = (unsigned char *) get_data (NULL, file, offset,
15316                                          global_end - pltgot, 1,
15317                                          _("Global Offset Table data"));
15318       if (data == NULL)
15319         return 0;
15320       data_end = data + (global_end - pltgot);
15321
15322       printf (_("\nPrimary GOT:\n"));
15323       printf (_(" Canonical gp value: "));
15324       print_vma (pltgot + 0x7ff0, LONG_HEX);
15325       printf ("\n\n");
15326
15327       printf (_(" Reserved entries:\n"));
15328       printf (_("  %*s %10s %*s Purpose\n"),
15329               addr_size * 2, _("Address"), _("Access"),
15330               addr_size * 2, _("Initial"));
15331       ent = print_mips_got_entry (data, pltgot, ent, data_end);
15332       printf (_(" Lazy resolver\n"));
15333       if (ent == (bfd_vma) -1)
15334         goto got_print_fail;
15335       if (data
15336           && (byte_get (data + ent - pltgot, addr_size)
15337               >> (addr_size * 8 - 1)) != 0)
15338         {
15339           ent = print_mips_got_entry (data, pltgot, ent, data_end);
15340           printf (_(" Module pointer (GNU extension)\n"));
15341           if (ent == (bfd_vma) -1)
15342             goto got_print_fail;
15343         }
15344       printf ("\n");
15345
15346       if (ent < local_end)
15347         {
15348           printf (_(" Local entries:\n"));
15349           printf ("  %*s %10s %*s\n",
15350                   addr_size * 2, _("Address"), _("Access"),
15351                   addr_size * 2, _("Initial"));
15352           while (ent < local_end)
15353             {
15354               ent = print_mips_got_entry (data, pltgot, ent, data_end);
15355               printf ("\n");
15356               if (ent == (bfd_vma) -1)
15357                 goto got_print_fail;
15358             }
15359           printf ("\n");
15360         }
15361
15362       if (gotsym < symtabno)
15363         {
15364           int sym_width;
15365
15366           printf (_(" Global entries:\n"));
15367           printf ("  %*s %10s %*s %*s %-7s %3s %s\n",
15368                   addr_size * 2, _("Address"),
15369                   _("Access"),
15370                   addr_size * 2, _("Initial"),
15371                   addr_size * 2, _("Sym.Val."),
15372                   _("Type"),
15373                   /* Note for translators: "Ndx" = abbreviated form of "Index".  */
15374                   _("Ndx"), _("Name"));
15375
15376           sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
15377
15378           for (i = gotsym; i < symtabno; i++)
15379             {
15380               ent = print_mips_got_entry (data, pltgot, ent, data_end);
15381               printf (" ");
15382
15383               if (dynamic_symbols == NULL)
15384                 printf (_("<no dynamic symbols>"));
15385               else if (i < num_dynamic_syms)
15386                 {
15387                   Elf_Internal_Sym * psym = dynamic_symbols + i;
15388
15389                   print_vma (psym->st_value, LONG_HEX);
15390                   printf (" %-7s %3s ",
15391                           get_symbol_type (ELF_ST_TYPE (psym->st_info)),
15392                           get_symbol_index_type (psym->st_shndx));
15393
15394                   if (VALID_DYNAMIC_NAME (psym->st_name))
15395                     print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
15396                   else
15397                     printf (_("<corrupt: %14ld>"), psym->st_name);
15398                 }
15399               else
15400                 printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
15401                         (unsigned long) i);
15402
15403               printf ("\n");
15404               if (ent == (bfd_vma) -1)
15405                 break;
15406             }
15407           printf ("\n");
15408         }
15409
15410     got_print_fail:
15411       if (data)
15412         free (data);
15413     }
15414
15415   if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
15416     {
15417       bfd_vma ent, end;
15418       size_t offset, rel_offset;
15419       unsigned long count, i;
15420       unsigned char * data;
15421       int addr_size, sym_width;
15422       Elf_Internal_Rela * rels;
15423
15424       rel_offset = offset_from_vma (file, jmprel, pltrelsz);
15425       if (pltrel == DT_RELA)
15426         {
15427           if (!slurp_rela_relocs (file, rel_offset, pltrelsz, &rels, &count))
15428             return 0;
15429         }
15430       else
15431         {
15432           if (!slurp_rel_relocs (file, rel_offset, pltrelsz, &rels, &count))
15433             return 0;
15434         }
15435
15436       ent = mips_pltgot;
15437       addr_size = (is_32bit_elf ? 4 : 8);
15438       end = mips_pltgot + (2 + count) * addr_size;
15439
15440       offset = offset_from_vma (file, mips_pltgot, end - mips_pltgot);
15441       data = (unsigned char *) get_data (NULL, file, offset, end - mips_pltgot,
15442                                          1, _("Procedure Linkage Table data"));
15443       if (data == NULL)
15444         return 0;
15445
15446       printf ("\nPLT GOT:\n\n");
15447       printf (_(" Reserved entries:\n"));
15448       printf (_("  %*s %*s Purpose\n"),
15449               addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
15450       ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
15451       printf (_(" PLT lazy resolver\n"));
15452       ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
15453       printf (_(" Module pointer\n"));
15454       printf ("\n");
15455
15456       printf (_(" Entries:\n"));
15457       printf ("  %*s %*s %*s %-7s %3s %s\n",
15458               addr_size * 2, _("Address"),
15459               addr_size * 2, _("Initial"),
15460               addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
15461       sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
15462       for (i = 0; i < count; i++)
15463         {
15464           unsigned long idx = get_reloc_symindex (rels[i].r_info);
15465
15466           ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
15467           printf (" ");
15468
15469           if (idx >= num_dynamic_syms)
15470             printf (_("<corrupt symbol index: %lu>"), idx);
15471           else
15472             {
15473               Elf_Internal_Sym * psym = dynamic_symbols + idx;
15474
15475               print_vma (psym->st_value, LONG_HEX);
15476               printf (" %-7s %3s ",
15477                       get_symbol_type (ELF_ST_TYPE (psym->st_info)),
15478                       get_symbol_index_type (psym->st_shndx));
15479               if (VALID_DYNAMIC_NAME (psym->st_name))
15480                 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
15481               else
15482                 printf (_("<corrupt: %14ld>"), psym->st_name);
15483             }
15484           printf ("\n");
15485         }
15486       printf ("\n");
15487
15488       if (data)
15489         free (data);
15490       free (rels);
15491     }
15492
15493   return 1;
15494 }
15495
15496 static int
15497 process_nds32_specific (FILE * file)
15498 {
15499   Elf_Internal_Shdr *sect = NULL;
15500
15501   sect = find_section (".nds32_e_flags");
15502   if (sect != NULL)
15503     {
15504       unsigned int *flag;
15505
15506       printf ("\nNDS32 elf flags section:\n");
15507       flag = get_data (NULL, file, sect->sh_offset, 1,
15508                        sect->sh_size, _("NDS32 elf flags section"));
15509
15510       switch ((*flag) & 0x3)
15511         {
15512         case 0:
15513           printf ("(VEC_SIZE):\tNo entry.\n");
15514           break;
15515         case 1:
15516           printf ("(VEC_SIZE):\t4 bytes\n");
15517           break;
15518         case 2:
15519           printf ("(VEC_SIZE):\t16 bytes\n");
15520           break;
15521         case 3:
15522           printf ("(VEC_SIZE):\treserved\n");
15523           break;
15524         }
15525     }
15526
15527   return TRUE;
15528 }
15529
15530 static int
15531 process_gnu_liblist (FILE * file)
15532 {
15533   Elf_Internal_Shdr * section;
15534   Elf_Internal_Shdr * string_sec;
15535   Elf32_External_Lib * elib;
15536   char * strtab;
15537   size_t strtab_size;
15538   size_t cnt;
15539   unsigned i;
15540
15541   if (! do_arch)
15542     return 0;
15543
15544   for (i = 0, section = section_headers;
15545        i < elf_header.e_shnum;
15546        i++, section++)
15547     {
15548       switch (section->sh_type)
15549         {
15550         case SHT_GNU_LIBLIST:
15551           if (section->sh_link >= elf_header.e_shnum)
15552             break;
15553
15554           elib = (Elf32_External_Lib *)
15555               get_data (NULL, file, section->sh_offset, 1, section->sh_size,
15556                         _("liblist section data"));
15557
15558           if (elib == NULL)
15559             break;
15560           string_sec = section_headers + section->sh_link;
15561
15562           strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
15563                                       string_sec->sh_size,
15564                                       _("liblist string table"));
15565           if (strtab == NULL
15566               || section->sh_entsize != sizeof (Elf32_External_Lib))
15567             {
15568               free (elib);
15569               free (strtab);
15570               break;
15571             }
15572           strtab_size = string_sec->sh_size;
15573
15574           printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
15575                   printable_section_name (section),
15576                   (unsigned long) (section->sh_size / sizeof (Elf32_External_Lib)));
15577
15578           puts (_("     Library              Time Stamp          Checksum   Version Flags"));
15579
15580           for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
15581                ++cnt)
15582             {
15583               Elf32_Lib liblist;
15584               time_t atime;
15585               char timebuf[128];
15586               struct tm * tmp;
15587
15588               liblist.l_name = BYTE_GET (elib[cnt].l_name);
15589               atime = BYTE_GET (elib[cnt].l_time_stamp);
15590               liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
15591               liblist.l_version = BYTE_GET (elib[cnt].l_version);
15592               liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
15593
15594               tmp = gmtime (&atime);
15595               snprintf (timebuf, sizeof (timebuf),
15596                         "%04u-%02u-%02uT%02u:%02u:%02u",
15597                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
15598                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
15599
15600               printf ("%3lu: ", (unsigned long) cnt);
15601               if (do_wide)
15602                 printf ("%-20s", liblist.l_name < strtab_size
15603                         ? strtab + liblist.l_name : _("<corrupt>"));
15604               else
15605                 printf ("%-20.20s", liblist.l_name < strtab_size
15606                         ? strtab + liblist.l_name : _("<corrupt>"));
15607               printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
15608                       liblist.l_version, liblist.l_flags);
15609             }
15610
15611           free (elib);
15612           free (strtab);
15613         }
15614     }
15615
15616   return 1;
15617 }
15618
15619 static const char *
15620 get_note_type (unsigned e_type)
15621 {
15622   static char buff[64];
15623
15624   if (elf_header.e_type == ET_CORE)
15625     switch (e_type)
15626       {
15627       case NT_AUXV:
15628         return _("NT_AUXV (auxiliary vector)");
15629       case NT_PRSTATUS:
15630         return _("NT_PRSTATUS (prstatus structure)");
15631       case NT_FPREGSET:
15632         return _("NT_FPREGSET (floating point registers)");
15633       case NT_PRPSINFO:
15634         return _("NT_PRPSINFO (prpsinfo structure)");
15635       case NT_TASKSTRUCT:
15636         return _("NT_TASKSTRUCT (task structure)");
15637       case NT_PRXFPREG:
15638         return _("NT_PRXFPREG (user_xfpregs structure)");
15639       case NT_PPC_VMX:
15640         return _("NT_PPC_VMX (ppc Altivec registers)");
15641       case NT_PPC_VSX:
15642         return _("NT_PPC_VSX (ppc VSX registers)");
15643       case NT_386_TLS:
15644         return _("NT_386_TLS (x86 TLS information)");
15645       case NT_386_IOPERM:
15646         return _("NT_386_IOPERM (x86 I/O permissions)");
15647       case NT_X86_XSTATE:
15648         return _("NT_X86_XSTATE (x86 XSAVE extended state)");
15649       case NT_S390_HIGH_GPRS:
15650         return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
15651       case NT_S390_TIMER:
15652         return _("NT_S390_TIMER (s390 timer register)");
15653       case NT_S390_TODCMP:
15654         return _("NT_S390_TODCMP (s390 TOD comparator register)");
15655       case NT_S390_TODPREG:
15656         return _("NT_S390_TODPREG (s390 TOD programmable register)");
15657       case NT_S390_CTRS:
15658         return _("NT_S390_CTRS (s390 control registers)");
15659       case NT_S390_PREFIX:
15660         return _("NT_S390_PREFIX (s390 prefix register)");
15661       case NT_S390_LAST_BREAK:
15662         return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
15663       case NT_S390_SYSTEM_CALL:
15664         return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
15665       case NT_S390_TDB:
15666         return _("NT_S390_TDB (s390 transaction diagnostic block)");
15667       case NT_S390_VXRS_LOW:
15668         return _("NT_S390_VXRS_LOW (s390 vector registers 0-15 upper half)");
15669       case NT_S390_VXRS_HIGH:
15670         return _("NT_S390_VXRS_HIGH (s390 vector registers 16-31)");
15671       case NT_ARM_VFP:
15672         return _("NT_ARM_VFP (arm VFP registers)");
15673       case NT_ARM_TLS:
15674         return _("NT_ARM_TLS (AArch TLS registers)");
15675       case NT_ARM_HW_BREAK:
15676         return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
15677       case NT_ARM_HW_WATCH:
15678         return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
15679       case NT_PSTATUS:
15680         return _("NT_PSTATUS (pstatus structure)");
15681       case NT_FPREGS:
15682         return _("NT_FPREGS (floating point registers)");
15683       case NT_PSINFO:
15684         return _("NT_PSINFO (psinfo structure)");
15685       case NT_LWPSTATUS:
15686         return _("NT_LWPSTATUS (lwpstatus_t structure)");
15687       case NT_LWPSINFO:
15688         return _("NT_LWPSINFO (lwpsinfo_t structure)");
15689       case NT_WIN32PSTATUS:
15690         return _("NT_WIN32PSTATUS (win32_pstatus structure)");
15691       case NT_SIGINFO:
15692         return _("NT_SIGINFO (siginfo_t data)");
15693       case NT_FILE:
15694         return _("NT_FILE (mapped files)");
15695       default:
15696         break;
15697       }
15698   else
15699     switch (e_type)
15700       {
15701       case NT_VERSION:
15702         return _("NT_VERSION (version)");
15703       case NT_ARCH:
15704         return _("NT_ARCH (architecture)");
15705       default:
15706         break;
15707       }
15708
15709   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15710   return buff;
15711 }
15712
15713 static int
15714 print_core_note (Elf_Internal_Note *pnote)
15715 {
15716   unsigned int addr_size = is_32bit_elf ? 4 : 8;
15717   bfd_vma count, page_size;
15718   unsigned char *descdata, *filenames, *descend;
15719
15720   if (pnote->type != NT_FILE)
15721     return 1;
15722
15723 #ifndef BFD64
15724   if (!is_32bit_elf)
15725     {
15726       printf (_("    Cannot decode 64-bit note in 32-bit build\n"));
15727       /* Still "successful".  */
15728       return 1;
15729     }
15730 #endif
15731
15732   if (pnote->descsz < 2 * addr_size)
15733     {
15734       printf (_("    Malformed note - too short for header\n"));
15735       return 0;
15736     }
15737
15738   descdata = (unsigned char *) pnote->descdata;
15739   descend = descdata + pnote->descsz;
15740
15741   if (descdata[pnote->descsz - 1] != '\0')
15742     {
15743       printf (_("    Malformed note - does not end with \\0\n"));
15744       return 0;
15745     }
15746
15747   count = byte_get (descdata, addr_size);
15748   descdata += addr_size;
15749
15750   page_size = byte_get (descdata, addr_size);
15751   descdata += addr_size;
15752
15753   if (pnote->descsz < 2 * addr_size + count * 3 * addr_size)
15754     {
15755       printf (_("    Malformed note - too short for supplied file count\n"));
15756       return 0;
15757     }
15758
15759   printf (_("    Page size: "));
15760   print_vma (page_size, DEC);
15761   printf ("\n");
15762
15763   printf (_("    %*s%*s%*s\n"),
15764           (int) (2 + 2 * addr_size), _("Start"),
15765           (int) (4 + 2 * addr_size), _("End"),
15766           (int) (4 + 2 * addr_size), _("Page Offset"));
15767   filenames = descdata + count * 3 * addr_size;
15768   while (count-- > 0)
15769     {
15770       bfd_vma start, end, file_ofs;
15771
15772       if (filenames == descend)
15773         {
15774           printf (_("    Malformed note - filenames end too early\n"));
15775           return 0;
15776         }
15777
15778       start = byte_get (descdata, addr_size);
15779       descdata += addr_size;
15780       end = byte_get (descdata, addr_size);
15781       descdata += addr_size;
15782       file_ofs = byte_get (descdata, addr_size);
15783       descdata += addr_size;
15784
15785       printf ("    ");
15786       print_vma (start, FULL_HEX);
15787       printf ("  ");
15788       print_vma (end, FULL_HEX);
15789       printf ("  ");
15790       print_vma (file_ofs, FULL_HEX);
15791       printf ("\n        %s\n", filenames);
15792
15793       filenames += 1 + strlen ((char *) filenames);
15794     }
15795
15796   return 1;
15797 }
15798
15799 static const char *
15800 get_gnu_elf_note_type (unsigned e_type)
15801 {
15802   /* NB/ Keep this switch statement in sync with print_gnu_note ().  */
15803   switch (e_type)
15804     {
15805     case NT_GNU_ABI_TAG:
15806       return _("NT_GNU_ABI_TAG (ABI version tag)");
15807     case NT_GNU_HWCAP:
15808       return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
15809     case NT_GNU_BUILD_ID:
15810       return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
15811     case NT_GNU_GOLD_VERSION:
15812       return _("NT_GNU_GOLD_VERSION (gold version)");
15813     default:
15814       {
15815         static char buff[64];
15816
15817         snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15818         return buff;
15819       }
15820     }
15821 }
15822
15823 static int
15824 print_gnu_note (Elf_Internal_Note *pnote)
15825 {
15826   /* NB/ Keep this switch statement in sync with get_gnu_elf_note_type ().  */
15827   switch (pnote->type)
15828     {
15829     case NT_GNU_BUILD_ID:
15830       {
15831         unsigned long i;
15832
15833         printf (_("    Build ID: "));
15834         for (i = 0; i < pnote->descsz; ++i)
15835           printf ("%02x", pnote->descdata[i] & 0xff);
15836         printf ("\n");
15837       }
15838       break;
15839
15840     case NT_GNU_ABI_TAG:
15841       {
15842         unsigned long os, major, minor, subminor;
15843         const char *osname;
15844
15845         /* PR 17531: file: 030-599401-0.004.  */
15846         if (pnote->descsz < 16)
15847           {
15848             printf (_("    <corrupt GNU_ABI_TAG>\n"));
15849             break;
15850           }
15851
15852         os = byte_get ((unsigned char *) pnote->descdata, 4);
15853         major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
15854         minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
15855         subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
15856
15857         switch (os)
15858           {
15859           case GNU_ABI_TAG_LINUX:
15860             osname = "Linux";
15861             break;
15862           case GNU_ABI_TAG_HURD:
15863             osname = "Hurd";
15864             break;
15865           case GNU_ABI_TAG_SOLARIS:
15866             osname = "Solaris";
15867             break;
15868           case GNU_ABI_TAG_FREEBSD:
15869             osname = "FreeBSD";
15870             break;
15871           case GNU_ABI_TAG_NETBSD:
15872             osname = "NetBSD";
15873             break;
15874           case GNU_ABI_TAG_SYLLABLE:
15875             osname = "Syllable";
15876             break;
15877           case GNU_ABI_TAG_NACL:
15878             osname = "NaCl";
15879             break;
15880           default:
15881             osname = "Unknown";
15882             break;
15883           }
15884
15885         printf (_("    OS: %s, ABI: %ld.%ld.%ld\n"), osname,
15886                 major, minor, subminor);
15887       }
15888       break;
15889
15890     case NT_GNU_GOLD_VERSION:
15891       {
15892         unsigned long i;
15893
15894         printf (_("    Version: "));
15895         for (i = 0; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
15896           printf ("%c", pnote->descdata[i]);
15897         printf ("\n");
15898       }
15899       break;
15900
15901     case NT_GNU_HWCAP:
15902       {
15903         unsigned long num_entries, mask;
15904
15905         /* Hardware capabilities information.  Word 0 is the number of entries.
15906            Word 1 is a bitmask of enabled entries.  The rest of the descriptor
15907            is a series of entries, where each entry is a single byte followed
15908            by a nul terminated string.  The byte gives the bit number to test
15909            if enabled in the bitmask.  */
15910         printf (_("      Hardware Capabilities: "));
15911         if (pnote->descsz < 8)
15912           {
15913             printf (_("<corrupt GNU_HWCAP>\n"));
15914             break;
15915           }
15916         num_entries = byte_get ((unsigned char *) pnote->descdata, 4);
15917         mask = byte_get ((unsigned char *) pnote->descdata + 4, 4);
15918         printf (_("num entries: %ld, enabled mask: %lx\n"), num_entries, mask);
15919         /* FIXME: Add code to display the entries... */
15920       }
15921       break;
15922
15923     default:
15924       /* Handle unrecognised types.  An error message should have already been
15925          created by get_gnu_elf_note_type(), so all that we need to do is to
15926          display the data.  */
15927       {
15928         unsigned long i;
15929
15930         printf (_("    Description data: "));
15931         for (i = 0; i < pnote->descsz; ++i)
15932           printf ("%02x ", pnote->descdata[i] & 0xff);
15933         printf ("\n");
15934       }
15935       break;
15936     }
15937
15938   return 1;
15939 }
15940
15941 static const char *
15942 get_v850_elf_note_type (enum v850_notes n_type)
15943 {
15944   static char buff[64];
15945
15946   switch (n_type)
15947     {
15948     case V850_NOTE_ALIGNMENT:  return _("Alignment of 8-byte objects");
15949     case V850_NOTE_DATA_SIZE:  return _("Sizeof double and long double");
15950     case V850_NOTE_FPU_INFO:   return _("Type of FPU support needed");
15951     case V850_NOTE_SIMD_INFO:  return _("Use of SIMD instructions");
15952     case V850_NOTE_CACHE_INFO: return _("Use of cache");
15953     case V850_NOTE_MMU_INFO:   return _("Use of MMU");
15954     default:
15955       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), n_type);
15956       return buff;
15957     }
15958 }
15959
15960 static int
15961 print_v850_note (Elf_Internal_Note * pnote)
15962 {
15963   unsigned int val;
15964
15965   if (pnote->descsz != 4)
15966     return 0;
15967   val = byte_get ((unsigned char *) pnote->descdata, pnote->descsz);
15968
15969   if (val == 0)
15970     {
15971       printf (_("not set\n"));
15972       return 1;
15973     }
15974
15975   switch (pnote->type)
15976     {
15977     case V850_NOTE_ALIGNMENT:
15978       switch (val)
15979         {
15980         case EF_RH850_DATA_ALIGN4: printf (_("4-byte\n")); return 1;
15981         case EF_RH850_DATA_ALIGN8: printf (_("8-byte\n")); return 1;
15982         }
15983       break;
15984
15985     case V850_NOTE_DATA_SIZE:
15986       switch (val)
15987         {
15988         case EF_RH850_DOUBLE32: printf (_("4-bytes\n")); return 1;
15989         case EF_RH850_DOUBLE64: printf (_("8-bytes\n")); return 1;
15990         }
15991       break;
15992
15993     case V850_NOTE_FPU_INFO:
15994       switch (val)
15995         {
15996         case EF_RH850_FPU20: printf (_("FPU-2.0\n")); return 1;
15997         case EF_RH850_FPU30: printf (_("FPU-3.0\n")); return 1;
15998         }
15999       break;
16000
16001     case V850_NOTE_MMU_INFO:
16002     case V850_NOTE_CACHE_INFO:
16003     case V850_NOTE_SIMD_INFO:
16004       if (val == EF_RH850_SIMD)
16005         {
16006           printf (_("yes\n"));
16007           return 1;
16008         }
16009       break;
16010
16011     default:
16012       /* An 'unknown note type' message will already have been displayed.  */
16013       break;
16014     }
16015
16016   printf (_("unknown value: %x\n"), val);
16017   return 0;
16018 }
16019
16020 static int
16021 process_netbsd_elf_note (Elf_Internal_Note * pnote)
16022 {
16023   unsigned int version;
16024
16025   switch (pnote->type)
16026     {
16027     case NT_NETBSD_IDENT:
16028       version = byte_get ((unsigned char *) pnote->descdata, sizeof (version));
16029       if ((version / 10000) % 100)
16030         printf ("  NetBSD\t\t0x%08lx\tIDENT %u (%u.%u%s%c)\n", pnote->descsz,
16031                 version, version / 100000000, (version / 1000000) % 100,
16032                 (version / 10000) % 100 > 26 ? "Z" : "",
16033                 'A' + (version / 10000) % 26);
16034       else
16035         printf ("  NetBSD\t\t0x%08lx\tIDENT %u (%u.%u.%u)\n", pnote->descsz,
16036                 version, version / 100000000, (version / 1000000) % 100,
16037                 (version / 100) % 100);
16038       return 1;
16039
16040     case NT_NETBSD_MARCH:
16041       printf ("  NetBSD\t0x%08lx\tMARCH <%s>\n", pnote->descsz,
16042               pnote->descdata);
16043       return 1;
16044
16045     default:
16046       break;
16047     }
16048
16049   printf ("  NetBSD\t0x%08lx\tUnknown note type: (0x%08lx)\n", pnote->descsz,
16050           pnote->type);
16051   return 1;
16052 }
16053
16054 static const char *
16055 get_freebsd_elfcore_note_type (unsigned e_type)
16056 {
16057   switch (e_type)
16058     {
16059     case NT_FREEBSD_THRMISC:
16060       return _("NT_THRMISC (thrmisc structure)");
16061     case NT_FREEBSD_PROCSTAT_PROC:
16062       return _("NT_PROCSTAT_PROC (proc data)");
16063     case NT_FREEBSD_PROCSTAT_FILES:
16064       return _("NT_PROCSTAT_FILES (files data)");
16065     case NT_FREEBSD_PROCSTAT_VMMAP:
16066       return _("NT_PROCSTAT_VMMAP (vmmap data)");
16067     case NT_FREEBSD_PROCSTAT_GROUPS:
16068       return _("NT_PROCSTAT_GROUPS (groups data)");
16069     case NT_FREEBSD_PROCSTAT_UMASK:
16070       return _("NT_PROCSTAT_UMASK (umask data)");
16071     case NT_FREEBSD_PROCSTAT_RLIMIT:
16072       return _("NT_PROCSTAT_RLIMIT (rlimit data)");
16073     case NT_FREEBSD_PROCSTAT_OSREL:
16074       return _("NT_PROCSTAT_OSREL (osreldate data)");
16075     case NT_FREEBSD_PROCSTAT_PSSTRINGS:
16076       return _("NT_PROCSTAT_PSSTRINGS (ps_strings data)");
16077     case NT_FREEBSD_PROCSTAT_AUXV:
16078       return _("NT_PROCSTAT_AUXV (auxv data)");
16079     }
16080   return get_note_type (e_type);
16081 }
16082
16083 static const char *
16084 get_netbsd_elfcore_note_type (unsigned e_type)
16085 {
16086   static char buff[64];
16087
16088   if (e_type == NT_NETBSDCORE_PROCINFO)
16089     {
16090       /* NetBSD core "procinfo" structure.  */
16091       return _("NetBSD procinfo structure");
16092     }
16093
16094   /* As of Jan 2002 there are no other machine-independent notes
16095      defined for NetBSD core files.  If the note type is less
16096      than the start of the machine-dependent note types, we don't
16097      understand it.  */
16098
16099   if (e_type < NT_NETBSDCORE_FIRSTMACH)
16100     {
16101       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
16102       return buff;
16103     }
16104
16105   switch (elf_header.e_machine)
16106     {
16107     /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
16108        and PT_GETFPREGS == mach+2.  */
16109
16110     case EM_OLD_ALPHA:
16111     case EM_ALPHA:
16112     case EM_SPARC:
16113     case EM_SPARC32PLUS:
16114     case EM_SPARCV9:
16115       switch (e_type)
16116         {
16117         case NT_NETBSDCORE_FIRSTMACH + 0:
16118           return _("PT_GETREGS (reg structure)");
16119         case NT_NETBSDCORE_FIRSTMACH + 2:
16120           return _("PT_GETFPREGS (fpreg structure)");
16121         default:
16122           break;
16123         }
16124       break;
16125
16126     /* On all other arch's, PT_GETREGS == mach+1 and
16127        PT_GETFPREGS == mach+3.  */
16128     default:
16129       switch (e_type)
16130         {
16131         case NT_NETBSDCORE_FIRSTMACH + 1:
16132           return _("PT_GETREGS (reg structure)");
16133         case NT_NETBSDCORE_FIRSTMACH + 3:
16134           return _("PT_GETFPREGS (fpreg structure)");
16135         default:
16136           break;
16137         }
16138     }
16139
16140   snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
16141             e_type - NT_NETBSDCORE_FIRSTMACH);
16142   return buff;
16143 }
16144
16145 static const char *
16146 get_stapsdt_note_type (unsigned e_type)
16147 {
16148   static char buff[64];
16149
16150   switch (e_type)
16151     {
16152     case NT_STAPSDT:
16153       return _("NT_STAPSDT (SystemTap probe descriptors)");
16154
16155     default:
16156       break;
16157     }
16158
16159   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
16160   return buff;
16161 }
16162
16163 static int
16164 print_stapsdt_note (Elf_Internal_Note *pnote)
16165 {
16166   int addr_size = is_32bit_elf ? 4 : 8;
16167   char *data = pnote->descdata;
16168   char *data_end = pnote->descdata + pnote->descsz;
16169   bfd_vma pc, base_addr, semaphore;
16170   char *provider, *probe, *arg_fmt;
16171
16172   pc = byte_get ((unsigned char *) data, addr_size);
16173   data += addr_size;
16174   base_addr = byte_get ((unsigned char *) data, addr_size);
16175   data += addr_size;
16176   semaphore = byte_get ((unsigned char *) data, addr_size);
16177   data += addr_size;
16178
16179   provider = data;
16180   data += strlen (data) + 1;
16181   probe = data;
16182   data += strlen (data) + 1;
16183   arg_fmt = data;
16184   data += strlen (data) + 1;
16185
16186   printf (_("    Provider: %s\n"), provider);
16187   printf (_("    Name: %s\n"), probe);
16188   printf (_("    Location: "));
16189   print_vma (pc, FULL_HEX);
16190   printf (_(", Base: "));
16191   print_vma (base_addr, FULL_HEX);
16192   printf (_(", Semaphore: "));
16193   print_vma (semaphore, FULL_HEX);
16194   printf ("\n");
16195   printf (_("    Arguments: %s\n"), arg_fmt);
16196
16197   return data == data_end;
16198 }
16199
16200 static const char *
16201 get_ia64_vms_note_type (unsigned e_type)
16202 {
16203   static char buff[64];
16204
16205   switch (e_type)
16206     {
16207     case NT_VMS_MHD:
16208       return _("NT_VMS_MHD (module header)");
16209     case NT_VMS_LNM:
16210       return _("NT_VMS_LNM (language name)");
16211     case NT_VMS_SRC:
16212       return _("NT_VMS_SRC (source files)");
16213     case NT_VMS_TITLE:
16214       return "NT_VMS_TITLE";
16215     case NT_VMS_EIDC:
16216       return _("NT_VMS_EIDC (consistency check)");
16217     case NT_VMS_FPMODE:
16218       return _("NT_VMS_FPMODE (FP mode)");
16219     case NT_VMS_LINKTIME:
16220       return "NT_VMS_LINKTIME";
16221     case NT_VMS_IMGNAM:
16222       return _("NT_VMS_IMGNAM (image name)");
16223     case NT_VMS_IMGID:
16224       return _("NT_VMS_IMGID (image id)");
16225     case NT_VMS_LINKID:
16226       return _("NT_VMS_LINKID (link id)");
16227     case NT_VMS_IMGBID:
16228       return _("NT_VMS_IMGBID (build id)");
16229     case NT_VMS_GSTNAM:
16230       return _("NT_VMS_GSTNAM (sym table name)");
16231     case NT_VMS_ORIG_DYN:
16232       return "NT_VMS_ORIG_DYN";
16233     case NT_VMS_PATCHTIME:
16234       return "NT_VMS_PATCHTIME";
16235     default:
16236       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
16237       return buff;
16238     }
16239 }
16240
16241 static int
16242 print_ia64_vms_note (Elf_Internal_Note * pnote)
16243 {
16244   switch (pnote->type)
16245     {
16246     case NT_VMS_MHD:
16247       if (pnote->descsz > 36)
16248         {
16249           size_t l = strlen (pnote->descdata + 34);
16250           printf (_("    Creation date  : %.17s\n"), pnote->descdata);
16251           printf (_("    Last patch date: %.17s\n"), pnote->descdata + 17);
16252           printf (_("    Module name    : %s\n"), pnote->descdata + 34);
16253           printf (_("    Module version : %s\n"), pnote->descdata + 34 + l + 1);
16254         }
16255       else
16256         printf (_("    Invalid size\n"));
16257       break;
16258     case NT_VMS_LNM:
16259       printf (_("   Language: %s\n"), pnote->descdata);
16260       break;
16261 #ifdef BFD64
16262     case NT_VMS_FPMODE:
16263       printf (_("   Floating Point mode: "));
16264       printf ("0x%016" BFD_VMA_FMT "x\n",
16265               (bfd_vma) byte_get ((unsigned char *)pnote->descdata, 8));
16266       break;
16267     case NT_VMS_LINKTIME:
16268       printf (_("   Link time: "));
16269       print_vms_time
16270         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
16271       printf ("\n");
16272       break;
16273     case NT_VMS_PATCHTIME:
16274       printf (_("   Patch time: "));
16275       print_vms_time
16276         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
16277       printf ("\n");
16278       break;
16279     case NT_VMS_ORIG_DYN:
16280       printf (_("   Major id: %u,  minor id: %u\n"),
16281               (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
16282               (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
16283       printf (_("   Last modified  : "));
16284       print_vms_time
16285         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
16286       printf (_("\n   Link flags  : "));
16287       printf ("0x%016" BFD_VMA_FMT "x\n",
16288               (bfd_vma) byte_get ((unsigned char *)pnote->descdata + 16, 8));
16289       printf (_("   Header flags: 0x%08x\n"),
16290               (unsigned) byte_get ((unsigned char *)pnote->descdata + 24, 4));
16291       printf (_("   Image id    : %s\n"), pnote->descdata + 32);
16292       break;
16293 #endif
16294     case NT_VMS_IMGNAM:
16295       printf (_("    Image name: %s\n"), pnote->descdata);
16296       break;
16297     case NT_VMS_GSTNAM:
16298       printf (_("    Global symbol table name: %s\n"), pnote->descdata);
16299       break;
16300     case NT_VMS_IMGID:
16301       printf (_("    Image id: %s\n"), pnote->descdata);
16302       break;
16303     case NT_VMS_LINKID:
16304       printf (_("    Linker id: %s\n"), pnote->descdata);
16305       break;
16306     default:
16307       break;
16308     }
16309   return 1;
16310 }
16311
16312 /* Note that by the ELF standard, the name field is already null byte
16313    terminated, and namesz includes the terminating null byte.
16314    I.E. the value of namesz for the name "FSF" is 4.
16315
16316    If the value of namesz is zero, there is no name present.  */
16317 static int
16318 process_note (Elf_Internal_Note * pnote,
16319               FILE * file ATTRIBUTE_UNUSED,
16320               Elf_Internal_Shdr * section ATTRIBUTE_UNUSED)
16321 {
16322   const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
16323   const char * nt;
16324
16325   if (pnote->namesz == 0)
16326     /* If there is no note name, then use the default set of
16327        note type strings.  */
16328     nt = get_note_type (pnote->type);
16329
16330   else if (const_strneq (pnote->namedata, "GNU"))
16331     /* GNU-specific object file notes.  */
16332     nt = get_gnu_elf_note_type (pnote->type);
16333
16334   else if (const_strneq (pnote->namedata, "FreeBSD"))
16335     /* FreeBSD-specific core file notes.  */
16336     nt = get_freebsd_elfcore_note_type (pnote->type);
16337
16338   else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
16339     /* NetBSD-specific core file notes.  */
16340     nt = get_netbsd_elfcore_note_type (pnote->type);
16341
16342   else if (const_strneq (pnote->namedata, "NetBSD"))
16343     /* NetBSD-specific core file notes.  */
16344     return process_netbsd_elf_note (pnote);
16345
16346   else if (strneq (pnote->namedata, "SPU/", 4))
16347     {
16348       /* SPU-specific core file notes.  */
16349       nt = pnote->namedata + 4;
16350       name = "SPU";
16351     }
16352
16353   else if (const_strneq (pnote->namedata, "IPF/VMS"))
16354     /* VMS/ia64-specific file notes.  */
16355     nt = get_ia64_vms_note_type (pnote->type);
16356
16357   else if (const_strneq (pnote->namedata, "stapsdt"))
16358     nt = get_stapsdt_note_type (pnote->type);
16359
16360   else
16361     /* Don't recognize this note name; just use the default set of
16362        note type strings.  */
16363     nt = get_note_type (pnote->type);
16364
16365   printf ("  ");
16366   print_symbol (-20, name);
16367   printf (" 0x%08lx\t%s\n", pnote->descsz, nt);
16368
16369   if (const_strneq (pnote->namedata, "IPF/VMS"))
16370     return print_ia64_vms_note (pnote);
16371   else if (const_strneq (pnote->namedata, "GNU"))
16372     return print_gnu_note (pnote);
16373   else if (const_strneq (pnote->namedata, "stapsdt"))
16374     return print_stapsdt_note (pnote);
16375   else if (const_strneq (pnote->namedata, "CORE"))
16376     return print_core_note (pnote);
16377
16378   else if (pnote->descsz)
16379     {
16380       unsigned long i;
16381
16382       printf (_("   description data: "));
16383       for (i = 0; i < pnote->descsz; i++)
16384         printf ("%02x ", pnote->descdata[i]);
16385       printf ("\n");
16386     }
16387
16388   return 1;
16389 }
16390
16391 static int
16392 process_notes_at (FILE *              file,
16393                   Elf_Internal_Shdr * section,
16394                   bfd_vma             offset,
16395                   bfd_vma             length)
16396 {
16397   Elf_External_Note * pnotes;
16398   Elf_External_Note * external;
16399   char * end;
16400   int res = 1;
16401
16402   if (length <= 0)
16403     return 0;
16404
16405   if (section)
16406     {
16407       pnotes = (Elf_External_Note *) get_section_contents (section, file);
16408       if (pnotes)
16409         apply_relocations (file, section, (unsigned char *) pnotes, length, NULL, NULL);
16410     }
16411   else
16412     pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
16413                                              _("notes"));
16414   if (pnotes == NULL)
16415     return 0;
16416
16417   external = pnotes;
16418
16419   if (section)
16420     printf (_("\nDisplaying notes found in: %s\n"), printable_section_name (section));
16421   else
16422     printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
16423             (unsigned long) offset, (unsigned long) length);
16424
16425   printf (_("  %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
16426
16427   end = (char *) pnotes + length;
16428   while ((char *) external < end)
16429     {
16430       Elf_Internal_Note inote;
16431       size_t min_notesz;
16432       char *next;
16433       char * temp = NULL;
16434       size_t data_remaining = end - (char *) external;
16435
16436       if (!is_ia64_vms ())
16437         {
16438           /* PR binutils/15191
16439              Make sure that there is enough data to read.  */
16440           min_notesz = offsetof (Elf_External_Note, name);
16441           if (data_remaining < min_notesz)
16442             {
16443               warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
16444                     (int) data_remaining);
16445               break;
16446             }
16447           inote.type     = BYTE_GET (external->type);
16448           inote.namesz   = BYTE_GET (external->namesz);
16449           inote.namedata = external->name;
16450           inote.descsz   = BYTE_GET (external->descsz);
16451           inote.descdata = inote.namedata + align_power (inote.namesz, 2);
16452           /* PR 17531: file: 3443835e.  */
16453           if (inote.descdata < (char *) pnotes || inote.descdata > end)
16454             {
16455               warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
16456               inote.descdata = inote.namedata;
16457               inote.namesz   = 0;
16458             }
16459
16460           inote.descpos  = offset + (inote.descdata - (char *) pnotes);
16461           next = inote.descdata + align_power (inote.descsz, 2);
16462         }
16463       else
16464         {
16465           Elf64_External_VMS_Note *vms_external;
16466
16467           /* PR binutils/15191
16468              Make sure that there is enough data to read.  */
16469           min_notesz = offsetof (Elf64_External_VMS_Note, name);
16470           if (data_remaining < min_notesz)
16471             {
16472               warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
16473                     (int) data_remaining);
16474               break;
16475             }
16476
16477           vms_external = (Elf64_External_VMS_Note *) external;
16478           inote.type     = BYTE_GET (vms_external->type);
16479           inote.namesz   = BYTE_GET (vms_external->namesz);
16480           inote.namedata = vms_external->name;
16481           inote.descsz   = BYTE_GET (vms_external->descsz);
16482           inote.descdata = inote.namedata + align_power (inote.namesz, 3);
16483           inote.descpos  = offset + (inote.descdata - (char *) pnotes);
16484           next = inote.descdata + align_power (inote.descsz, 3);
16485         }
16486
16487       if (inote.descdata < (char *) external + min_notesz
16488           || next < (char *) external + min_notesz
16489           /* PR binutils/17531: file: id:000000,sig:11,src:006986,op:havoc,rep:4.  */
16490           || inote.namedata + inote.namesz < inote.namedata
16491           || inote.descdata + inote.descsz < inote.descdata
16492           || data_remaining < (size_t)(next - (char *) external))
16493         {
16494           warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
16495                 (unsigned long) ((char *) external - (char *) pnotes));
16496           warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx\n"),
16497                 inote.type, inote.namesz, inote.descsz);
16498           break;
16499         }
16500
16501       external = (Elf_External_Note *) next;
16502
16503       /* Verify that name is null terminated.  It appears that at least
16504          one version of Linux (RedHat 6.0) generates corefiles that don't
16505          comply with the ELF spec by failing to include the null byte in
16506          namesz.  */
16507       if (inote.namedata[inote.namesz - 1] != '\0')
16508         {
16509           temp = (char *) malloc (inote.namesz + 1);
16510           if (temp == NULL)
16511             {
16512               error (_("Out of memory allocating space for inote name\n"));
16513               res = 0;
16514               break;
16515             }
16516
16517           strncpy (temp, inote.namedata, inote.namesz);
16518           temp[inote.namesz] = 0;
16519
16520           /* warn (_("'%s' NOTE name not properly null terminated\n"), temp);  */
16521           inote.namedata = temp;
16522         }
16523
16524       res &= process_note (& inote, file, section);
16525
16526       if (temp != NULL)
16527         {
16528           free (temp);
16529           temp = NULL;
16530         }
16531     }
16532
16533   free (pnotes);
16534
16535   return res;
16536 }
16537
16538 static int
16539 process_corefile_note_segments (FILE * file)
16540 {
16541   Elf_Internal_Phdr * segment;
16542   unsigned int i;
16543   int res = 1;
16544
16545   if (! get_program_headers (file))
16546       return 0;
16547
16548   for (i = 0, segment = program_headers;
16549        i < elf_header.e_phnum;
16550        i++, segment++)
16551     {
16552       if (segment->p_type == PT_NOTE)
16553         res &= process_notes_at (file, NULL,
16554                                  (bfd_vma) segment->p_offset,
16555                                  (bfd_vma) segment->p_filesz);
16556     }
16557
16558   return res;
16559 }
16560
16561 static int
16562 process_v850_notes (FILE * file, bfd_vma offset, bfd_vma length)
16563 {
16564   Elf_External_Note * pnotes;
16565   Elf_External_Note * external;
16566   char * end;
16567   int res = 1;
16568
16569   if (length <= 0)
16570     return 0;
16571
16572   pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
16573                                            _("v850 notes"));
16574   if (pnotes == NULL)
16575     return 0;
16576
16577   external = pnotes;
16578   end = (char*) pnotes + length;
16579
16580   printf (_("\nDisplaying contents of Renesas V850 notes section at offset 0x%lx with length 0x%lx:\n"),
16581           (unsigned long) offset, (unsigned long) length);
16582
16583   while ((char *) external + sizeof (Elf_External_Note) < end)
16584     {
16585       Elf_External_Note * next;
16586       Elf_Internal_Note inote;
16587
16588       inote.type     = BYTE_GET (external->type);
16589       inote.namesz   = BYTE_GET (external->namesz);
16590       inote.namedata = external->name;
16591       inote.descsz   = BYTE_GET (external->descsz);
16592       inote.descdata = inote.namedata + align_power (inote.namesz, 2);
16593       inote.descpos  = offset + (inote.descdata - (char *) pnotes);
16594
16595       if (inote.descdata < (char *) pnotes || inote.descdata >= end)
16596         {
16597           warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
16598           inote.descdata = inote.namedata;
16599           inote.namesz   = 0;
16600         }
16601
16602       next = (Elf_External_Note *) (inote.descdata + align_power (inote.descsz, 2));
16603
16604       if (   ((char *) next > end)
16605           || ((char *) next <  (char *) pnotes))
16606         {
16607           warn (_("corrupt descsz found in note at offset 0x%lx\n"),
16608                 (unsigned long) ((char *) external - (char *) pnotes));
16609           warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
16610                 inote.type, inote.namesz, inote.descsz);
16611           break;
16612         }
16613
16614       external = next;
16615
16616       /* Prevent out-of-bounds indexing.  */
16617       if (   inote.namedata + inote.namesz > end
16618           || inote.namedata + inote.namesz < inote.namedata)
16619         {
16620           warn (_("corrupt namesz found in note at offset 0x%lx\n"),
16621                 (unsigned long) ((char *) external - (char *) pnotes));
16622           warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
16623                 inote.type, inote.namesz, inote.descsz);
16624           break;
16625         }
16626
16627       printf ("  %s: ", get_v850_elf_note_type (inote.type));
16628
16629       if (! print_v850_note (& inote))
16630         {
16631           res = 0;
16632           printf ("<corrupt sizes: namesz: %lx, descsz: %lx>\n",
16633                   inote.namesz, inote.descsz);
16634         }
16635     }
16636
16637   free (pnotes);
16638
16639   return res;
16640 }
16641
16642 static int
16643 process_note_sections (FILE * file)
16644 {
16645   Elf_Internal_Shdr * section;
16646   unsigned long i;
16647   int n = 0;
16648   int res = 1;
16649
16650   for (i = 0, section = section_headers;
16651        i < elf_header.e_shnum && section != NULL;
16652        i++, section++)
16653     {
16654       if (section->sh_type == SHT_NOTE)
16655         {
16656           res &= process_notes_at (file, section,
16657                                    (bfd_vma) section->sh_offset,
16658                                    (bfd_vma) section->sh_size);
16659           n++;
16660         }
16661
16662       if ((   elf_header.e_machine == EM_V800
16663            || elf_header.e_machine == EM_V850
16664            || elf_header.e_machine == EM_CYGNUS_V850)
16665           && section->sh_type == SHT_RENESAS_INFO)
16666         {
16667           res &= process_v850_notes (file,
16668                                      (bfd_vma) section->sh_offset,
16669                                      (bfd_vma) section->sh_size);
16670           n++;
16671         }
16672     }
16673
16674   if (n == 0)
16675     /* Try processing NOTE segments instead.  */
16676     return process_corefile_note_segments (file);
16677
16678   return res;
16679 }
16680
16681 static int
16682 process_notes (FILE * file)
16683 {
16684   /* If we have not been asked to display the notes then do nothing.  */
16685   if (! do_notes)
16686     return 1;
16687
16688   if (elf_header.e_type != ET_CORE)
16689     return process_note_sections (file);
16690
16691   /* No program headers means no NOTE segment.  */
16692   if (elf_header.e_phnum > 0)
16693     return process_corefile_note_segments (file);
16694
16695   printf (_("No note segments present in the core file.\n"));
16696   return 1;
16697 }
16698
16699 static int
16700 process_arch_specific (FILE * file)
16701 {
16702   if (! do_arch)
16703     return 1;
16704
16705   switch (elf_header.e_machine)
16706     {
16707     case EM_ARM:
16708       return process_arm_specific (file);
16709     case EM_MIPS:
16710     case EM_MIPS_RS3_LE:
16711       return process_mips_specific (file);
16712       break;
16713     case EM_NDS32:
16714       return process_nds32_specific (file);
16715       break;
16716     case EM_PPC:
16717     case EM_PPC64:
16718       return process_power_specific (file);
16719       break;
16720     case EM_S390:
16721     case EM_S390_OLD:
16722       return process_s390_specific (file);
16723       break;
16724     case EM_SPARC:
16725     case EM_SPARC32PLUS:
16726     case EM_SPARCV9:
16727       return process_sparc_specific (file);
16728       break;
16729     case EM_TI_C6000:
16730       return process_tic6x_specific (file);
16731       break;
16732     case EM_MSP430:
16733       return process_msp430x_specific (file);
16734     default:
16735       break;
16736     }
16737   return 1;
16738 }
16739
16740 static int
16741 get_file_header (FILE * file)
16742 {
16743   /* Read in the identity array.  */
16744   if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
16745     return 0;
16746
16747   /* Determine how to read the rest of the header.  */
16748   switch (elf_header.e_ident[EI_DATA])
16749     {
16750     default:
16751     case ELFDATANONE:
16752     case ELFDATA2LSB:
16753       byte_get = byte_get_little_endian;
16754       byte_put = byte_put_little_endian;
16755       break;
16756     case ELFDATA2MSB:
16757       byte_get = byte_get_big_endian;
16758       byte_put = byte_put_big_endian;
16759       break;
16760     }
16761
16762   /* For now we only support 32 bit and 64 bit ELF files.  */
16763   is_32bit_elf = (elf_header.e_ident[EI_CLASS] != ELFCLASS64);
16764
16765   /* Read in the rest of the header.  */
16766   if (is_32bit_elf)
16767     {
16768       Elf32_External_Ehdr ehdr32;
16769
16770       if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
16771         return 0;
16772
16773       elf_header.e_type      = BYTE_GET (ehdr32.e_type);
16774       elf_header.e_machine   = BYTE_GET (ehdr32.e_machine);
16775       elf_header.e_version   = BYTE_GET (ehdr32.e_version);
16776       elf_header.e_entry     = BYTE_GET (ehdr32.e_entry);
16777       elf_header.e_phoff     = BYTE_GET (ehdr32.e_phoff);
16778       elf_header.e_shoff     = BYTE_GET (ehdr32.e_shoff);
16779       elf_header.e_flags     = BYTE_GET (ehdr32.e_flags);
16780       elf_header.e_ehsize    = BYTE_GET (ehdr32.e_ehsize);
16781       elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
16782       elf_header.e_phnum     = BYTE_GET (ehdr32.e_phnum);
16783       elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
16784       elf_header.e_shnum     = BYTE_GET (ehdr32.e_shnum);
16785       elf_header.e_shstrndx  = BYTE_GET (ehdr32.e_shstrndx);
16786     }
16787   else
16788     {
16789       Elf64_External_Ehdr ehdr64;
16790
16791       /* If we have been compiled with sizeof (bfd_vma) == 4, then
16792          we will not be able to cope with the 64bit data found in
16793          64 ELF files.  Detect this now and abort before we start
16794          overwriting things.  */
16795       if (sizeof (bfd_vma) < 8)
16796         {
16797           error (_("This instance of readelf has been built without support for a\n\
16798 64 bit data type and so it cannot read 64 bit ELF files.\n"));
16799           return 0;
16800         }
16801
16802       if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
16803         return 0;
16804
16805       elf_header.e_type      = BYTE_GET (ehdr64.e_type);
16806       elf_header.e_machine   = BYTE_GET (ehdr64.e_machine);
16807       elf_header.e_version   = BYTE_GET (ehdr64.e_version);
16808       elf_header.e_entry     = BYTE_GET (ehdr64.e_entry);
16809       elf_header.e_phoff     = BYTE_GET (ehdr64.e_phoff);
16810       elf_header.e_shoff     = BYTE_GET (ehdr64.e_shoff);
16811       elf_header.e_flags     = BYTE_GET (ehdr64.e_flags);
16812       elf_header.e_ehsize    = BYTE_GET (ehdr64.e_ehsize);
16813       elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
16814       elf_header.e_phnum     = BYTE_GET (ehdr64.e_phnum);
16815       elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
16816       elf_header.e_shnum     = BYTE_GET (ehdr64.e_shnum);
16817       elf_header.e_shstrndx  = BYTE_GET (ehdr64.e_shstrndx);
16818     }
16819
16820   if (elf_header.e_shoff)
16821     {
16822       /* There may be some extensions in the first section header.  Don't
16823          bomb if we can't read it.  */
16824       if (is_32bit_elf)
16825         get_32bit_section_headers (file, TRUE);
16826       else
16827         get_64bit_section_headers (file, TRUE);
16828     }
16829
16830   return 1;
16831 }
16832
16833 /* Process one ELF object file according to the command line options.
16834    This file may actually be stored in an archive.  The file is
16835    positioned at the start of the ELF object.  */
16836
16837 static int
16838 process_object (char * file_name, FILE * file)
16839 {
16840   unsigned int i;
16841
16842   if (! get_file_header (file))
16843     {
16844       error (_("%s: Failed to read file header\n"), file_name);
16845       return 1;
16846     }
16847
16848   /* Initialise per file variables.  */
16849   for (i = ARRAY_SIZE (version_info); i--;)
16850     version_info[i] = 0;
16851
16852   for (i = ARRAY_SIZE (dynamic_info); i--;)
16853     dynamic_info[i] = 0;
16854   dynamic_info_DT_GNU_HASH = 0;
16855
16856   /* Process the file.  */
16857   if (show_name)
16858     printf (_("\nFile: %s\n"), file_name);
16859
16860   /* Initialise the dump_sects array from the cmdline_dump_sects array.
16861      Note we do this even if cmdline_dump_sects is empty because we
16862      must make sure that the dump_sets array is zeroed out before each
16863      object file is processed.  */
16864   if (num_dump_sects > num_cmdline_dump_sects)
16865     memset (dump_sects, 0, num_dump_sects * sizeof (* dump_sects));
16866
16867   if (num_cmdline_dump_sects > 0)
16868     {
16869       if (num_dump_sects == 0)
16870         /* A sneaky way of allocating the dump_sects array.  */
16871         request_dump_bynumber (num_cmdline_dump_sects, 0);
16872
16873       assert (num_dump_sects >= num_cmdline_dump_sects);
16874       memcpy (dump_sects, cmdline_dump_sects,
16875               num_cmdline_dump_sects * sizeof (* dump_sects));
16876     }
16877
16878   if (! process_file_header ())
16879     return 1;
16880
16881   if (! process_section_headers (file))
16882     {
16883       /* Without loaded section headers we cannot process lots of
16884          things.  */
16885       do_unwind = do_version = do_dump = do_arch = 0;
16886
16887       if (! do_using_dynamic)
16888         do_syms = do_dyn_syms = do_reloc = 0;
16889     }
16890
16891   if (! process_section_groups (file))
16892     {
16893       /* Without loaded section groups we cannot process unwind.  */
16894       do_unwind = 0;
16895     }
16896
16897   if (process_program_headers (file))
16898     process_dynamic_section (file);
16899
16900   process_relocs (file);
16901
16902   process_unwind (file);
16903
16904   process_symbol_table (file);
16905
16906   process_syminfo (file);
16907
16908   process_version_sections (file);
16909
16910   process_section_contents (file);
16911
16912   process_notes (file);
16913
16914   process_gnu_liblist (file);
16915
16916   process_arch_specific (file);
16917
16918   if (program_headers)
16919     {
16920       free (program_headers);
16921       program_headers = NULL;
16922     }
16923
16924   if (section_headers)
16925     {
16926       free (section_headers);
16927       section_headers = NULL;
16928     }
16929
16930   if (string_table)
16931     {
16932       free (string_table);
16933       string_table = NULL;
16934       string_table_length = 0;
16935     }
16936
16937   if (dynamic_strings)
16938     {
16939       free (dynamic_strings);
16940       dynamic_strings = NULL;
16941       dynamic_strings_length = 0;
16942     }
16943
16944   if (dynamic_symbols)
16945     {
16946       free (dynamic_symbols);
16947       dynamic_symbols = NULL;
16948       num_dynamic_syms = 0;
16949     }
16950
16951   if (dynamic_syminfo)
16952     {
16953       free (dynamic_syminfo);
16954       dynamic_syminfo = NULL;
16955     }
16956
16957   if (dynamic_section)
16958     {
16959       free (dynamic_section);
16960       dynamic_section = NULL;
16961     }
16962
16963   if (section_headers_groups)
16964     {
16965       free (section_headers_groups);
16966       section_headers_groups = NULL;
16967     }
16968
16969   if (section_groups)
16970     {
16971       struct group_list * g;
16972       struct group_list * next;
16973
16974       for (i = 0; i < group_count; i++)
16975         {
16976           for (g = section_groups [i].root; g != NULL; g = next)
16977             {
16978               next = g->next;
16979               free (g);
16980             }
16981         }
16982
16983       free (section_groups);
16984       section_groups = NULL;
16985     }
16986
16987   free_debug_memory ();
16988
16989   return 0;
16990 }
16991
16992 /* Process an ELF archive.
16993    On entry the file is positioned just after the ARMAG string.  */
16994
16995 static int
16996 process_archive (char * file_name, FILE * file, bfd_boolean is_thin_archive)
16997 {
16998   struct archive_info arch;
16999   struct archive_info nested_arch;
17000   size_t got;
17001   int ret;
17002
17003   show_name = 1;
17004
17005   /* The ARCH structure is used to hold information about this archive.  */
17006   arch.file_name = NULL;
17007   arch.file = NULL;
17008   arch.index_array = NULL;
17009   arch.sym_table = NULL;
17010   arch.longnames = NULL;
17011
17012   /* The NESTED_ARCH structure is used as a single-item cache of information
17013      about a nested archive (when members of a thin archive reside within
17014      another regular archive file).  */
17015   nested_arch.file_name = NULL;
17016   nested_arch.file = NULL;
17017   nested_arch.index_array = NULL;
17018   nested_arch.sym_table = NULL;
17019   nested_arch.longnames = NULL;
17020
17021   if (setup_archive (&arch, file_name, file, is_thin_archive, do_archive_index) != 0)
17022     {
17023       ret = 1;
17024       goto out;
17025     }
17026
17027   if (do_archive_index)
17028     {
17029       if (arch.sym_table == NULL)
17030         error (_("%s: unable to dump the index as none was found\n"), file_name);
17031       else
17032         {
17033           unsigned long i, l;
17034           unsigned long current_pos;
17035
17036           printf (_("Index of archive %s: (%lu entries, 0x%lx bytes in the symbol table)\n"),
17037                   file_name, (unsigned long) arch.index_num, arch.sym_size);
17038           current_pos = ftell (file);
17039
17040           for (i = l = 0; i < arch.index_num; i++)
17041             {
17042               if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
17043                 {
17044                   char * member_name;
17045
17046                   member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
17047
17048                   if (member_name != NULL)
17049                     {
17050                       char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
17051
17052                       if (qualified_name != NULL)
17053                         {
17054                           printf (_("Contents of binary %s at offset "), qualified_name);
17055                           (void) print_vma (arch.index_array[i], PREFIX_HEX);
17056                           putchar ('\n');
17057                           free (qualified_name);
17058                         }
17059                     }
17060                 }
17061
17062               if (l >= arch.sym_size)
17063                 {
17064                   error (_("%s: end of the symbol table reached before the end of the index\n"),
17065                          file_name);
17066                   break;
17067                 }
17068               /* PR 17531: file: 0b6630b2.  */
17069               printf ("\t%.*s\n", (int) (arch.sym_size - l), arch.sym_table + l);
17070               l += strnlen (arch.sym_table + l, arch.sym_size - l) + 1;
17071             }
17072
17073           if (arch.uses_64bit_indicies)
17074             l = (l + 7) & ~ 7;
17075           else
17076             l += l & 1;
17077
17078           if (l < arch.sym_size)
17079             error (_("%s: %ld bytes remain in the symbol table, but without corresponding entries in the index table\n"),
17080                    file_name, arch.sym_size - l);
17081
17082           if (fseek (file, current_pos, SEEK_SET) != 0)
17083             {
17084               error (_("%s: failed to seek back to start of object files in the archive\n"), file_name);
17085               ret = 1;
17086               goto out;
17087             }
17088         }
17089
17090       if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
17091           && !do_segments && !do_header && !do_dump && !do_version
17092           && !do_histogram && !do_debugging && !do_arch && !do_notes
17093           && !do_section_groups && !do_dyn_syms)
17094         {
17095           ret = 0; /* Archive index only.  */
17096           goto out;
17097         }
17098     }
17099
17100   ret = 0;
17101
17102   while (1)
17103     {
17104       char * name;
17105       size_t namelen;
17106       char * qualified_name;
17107
17108       /* Read the next archive header.  */
17109       if (fseek (file, arch.next_arhdr_offset, SEEK_SET) != 0)
17110         {
17111           error (_("%s: failed to seek to next archive header\n"), file_name);
17112           return 1;
17113         }
17114       got = fread (&arch.arhdr, 1, sizeof arch.arhdr, file);
17115       if (got != sizeof arch.arhdr)
17116         {
17117           if (got == 0)
17118             break;
17119           error (_("%s: failed to read archive header\n"), file_name);
17120           ret = 1;
17121           break;
17122         }
17123       if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
17124         {
17125           error (_("%s: did not find a valid archive header\n"), arch.file_name);
17126           ret = 1;
17127           break;
17128         }
17129
17130       arch.next_arhdr_offset += sizeof arch.arhdr;
17131
17132       archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
17133       if (archive_file_size & 01)
17134         ++archive_file_size;
17135
17136       name = get_archive_member_name (&arch, &nested_arch);
17137       if (name == NULL)
17138         {
17139           error (_("%s: bad archive file name\n"), file_name);
17140           ret = 1;
17141           break;
17142         }
17143       namelen = strlen (name);
17144
17145       qualified_name = make_qualified_name (&arch, &nested_arch, name);
17146       if (qualified_name == NULL)
17147         {
17148           error (_("%s: bad archive file name\n"), file_name);
17149           ret = 1;
17150           break;
17151         }
17152
17153       if (is_thin_archive && arch.nested_member_origin == 0)
17154         {
17155           /* This is a proxy for an external member of a thin archive.  */
17156           FILE * member_file;
17157           char * member_file_name = adjust_relative_path (file_name, name, namelen);
17158           if (member_file_name == NULL)
17159             {
17160               ret = 1;
17161               break;
17162             }
17163
17164           member_file = fopen (member_file_name, "rb");
17165           if (member_file == NULL)
17166             {
17167               error (_("Input file '%s' is not readable.\n"), member_file_name);
17168               free (member_file_name);
17169               ret = 1;
17170               break;
17171             }
17172
17173           archive_file_offset = arch.nested_member_origin;
17174
17175           ret |= process_object (qualified_name, member_file);
17176
17177           fclose (member_file);
17178           free (member_file_name);
17179         }
17180       else if (is_thin_archive)
17181         {
17182           /* PR 15140: Allow for corrupt thin archives.  */
17183           if (nested_arch.file == NULL)
17184             {
17185               error (_("%s: contains corrupt thin archive: %s\n"),
17186                      file_name, name);
17187               ret = 1;
17188               break;
17189             }
17190
17191           /* This is a proxy for a member of a nested archive.  */
17192           archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
17193
17194           /* The nested archive file will have been opened and setup by
17195              get_archive_member_name.  */
17196           if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
17197             {
17198               error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
17199               ret = 1;
17200               break;
17201             }
17202
17203           ret |= process_object (qualified_name, nested_arch.file);
17204         }
17205       else
17206         {
17207           archive_file_offset = arch.next_arhdr_offset;
17208           arch.next_arhdr_offset += archive_file_size;
17209
17210           ret |= process_object (qualified_name, file);
17211         }
17212
17213       if (dump_sects != NULL)
17214         {
17215           free (dump_sects);
17216           dump_sects = NULL;
17217           num_dump_sects = 0;
17218         }
17219
17220       free (qualified_name);
17221     }
17222
17223  out:
17224   if (nested_arch.file != NULL)
17225     fclose (nested_arch.file);
17226   release_archive (&nested_arch);
17227   release_archive (&arch);
17228
17229   return ret;
17230 }
17231
17232 static int
17233 process_file (char * file_name)
17234 {
17235   FILE * file;
17236   struct stat statbuf;
17237   char armag[SARMAG];
17238   int ret;
17239
17240   if (stat (file_name, &statbuf) < 0)
17241     {
17242       if (errno == ENOENT)
17243         error (_("'%s': No such file\n"), file_name);
17244       else
17245         error (_("Could not locate '%s'.  System error message: %s\n"),
17246                file_name, strerror (errno));
17247       return 1;
17248     }
17249
17250   if (! S_ISREG (statbuf.st_mode))
17251     {
17252       error (_("'%s' is not an ordinary file\n"), file_name);
17253       return 1;
17254     }
17255
17256   file = fopen (file_name, "rb");
17257   if (file == NULL)
17258     {
17259       error (_("Input file '%s' is not readable.\n"), file_name);
17260       return 1;
17261     }
17262
17263   if (fread (armag, SARMAG, 1, file) != 1)
17264     {
17265       error (_("%s: Failed to read file's magic number\n"), file_name);
17266       fclose (file);
17267       return 1;
17268     }
17269
17270   current_file_size = (bfd_size_type) statbuf.st_size;
17271
17272   if (memcmp (armag, ARMAG, SARMAG) == 0)
17273     ret = process_archive (file_name, file, FALSE);
17274   else if (memcmp (armag, ARMAGT, SARMAG) == 0)
17275     ret = process_archive (file_name, file, TRUE);
17276   else
17277     {
17278       if (do_archive_index)
17279         error (_("File %s is not an archive so its index cannot be displayed.\n"),
17280                file_name);
17281
17282       rewind (file);
17283       archive_file_size = archive_file_offset = 0;
17284       ret = process_object (file_name, file);
17285     }
17286
17287   fclose (file);
17288
17289   current_file_size = 0;
17290   return ret;
17291 }
17292
17293 #ifdef SUPPORT_DISASSEMBLY
17294 /* Needed by the i386 disassembler.  For extra credit, someone could
17295    fix this so that we insert symbolic addresses here, esp for GOT/PLT
17296    symbols.  */
17297
17298 void
17299 print_address (unsigned int addr, FILE * outfile)
17300 {
17301   fprintf (outfile,"0x%8.8x", addr);
17302 }
17303
17304 /* Needed by the i386 disassembler.  */
17305 void
17306 db_task_printsym (unsigned int addr)
17307 {
17308   print_address (addr, stderr);
17309 }
17310 #endif
17311
17312 int
17313 main (int argc, char ** argv)
17314 {
17315   int err;
17316
17317 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
17318   setlocale (LC_MESSAGES, "");
17319 #endif
17320 #if defined (HAVE_SETLOCALE)
17321   setlocale (LC_CTYPE, "");
17322 #endif
17323   bindtextdomain (PACKAGE, LOCALEDIR);
17324   textdomain (PACKAGE);
17325
17326   expandargv (&argc, &argv);
17327
17328   parse_args (argc, argv);
17329
17330   if (num_dump_sects > 0)
17331     {
17332       /* Make a copy of the dump_sects array.  */
17333       cmdline_dump_sects = (dump_type *)
17334           malloc (num_dump_sects * sizeof (* dump_sects));
17335       if (cmdline_dump_sects == NULL)
17336         error (_("Out of memory allocating dump request table.\n"));
17337       else
17338         {
17339           memcpy (cmdline_dump_sects, dump_sects,
17340                   num_dump_sects * sizeof (* dump_sects));
17341           num_cmdline_dump_sects = num_dump_sects;
17342         }
17343     }
17344
17345   if (optind < (argc - 1))
17346     show_name = 1;
17347   else if (optind >= argc)
17348     {
17349       warn (_("Nothing to do.\n"));
17350       usage (stderr);
17351     }
17352
17353   err = 0;
17354   while (optind < argc)
17355     err |= process_file (argv[optind++]);
17356
17357   if (dump_sects != NULL)
17358     free (dump_sects);
17359   if (cmdline_dump_sects != NULL)
17360     free (cmdline_dump_sects);
17361
17362   return err;
17363 }