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