Fix memort access problems exposed by fuzzed binaries.
[external/binutils.git] / binutils / readelf.c
1 /* readelf.c -- display contents of an ELF format file
2    Copyright (C) 1998-2014 Free Software Foundation, Inc.
3
4    Originally developed by Eric Youngdale <eric@andante.jic.com>
5    Modifications by Nick Clifton <nickc@redhat.com>
6
7    This file is part of GNU Binutils.
8
9    This program is free software; you can redistribute it and/or modify
10    it under the terms of the GNU General Public License as published by
11    the Free Software Foundation; either version 3 of the License, or
12    (at your option) any later version.
13
14    This program is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17    GNU General Public License for more details.
18
19    You should have received a copy of the GNU General Public License
20    along with this program; if not, write to the Free Software
21    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
22    02110-1301, USA.  */
23 \f
24 /* The difference between readelf and objdump:
25
26   Both programs are capable of displaying the contents of ELF format files,
27   so why does the binutils project have two file dumpers ?
28
29   The reason is that objdump sees an ELF file through a BFD filter of the
30   world; if BFD has a bug where, say, it disagrees about a machine constant
31   in e_flags, then the odds are good that it will remain internally
32   consistent.  The linker sees it the BFD way, objdump sees it the BFD way,
33   GAS sees it the BFD way.  There was need for a tool to go find out what
34   the file actually says.
35
36   This is why the readelf program does not link against the BFD library - it
37   exists as an independent program to help verify the correct working of BFD.
38
39   There is also the case that readelf can provide more information about an
40   ELF file than is provided by objdump.  In particular it can display DWARF
41   debugging information which (at the moment) objdump cannot.  */
42 \f
43 #include "sysdep.h"
44 #include <assert.h>
45 #include <time.h>
46 #ifdef HAVE_ZLIB_H
47 #include <zlib.h>
48 #endif
49 #ifdef HAVE_WCHAR_H
50 #include <wchar.h>
51 #endif
52
53 #if __GNUC__ >= 2
54 /* Define BFD64 here, even if our default architecture is 32 bit ELF
55    as this will allow us to read in and parse 64bit and 32bit ELF files.
56    Only do this if we believe that the compiler can support a 64 bit
57    data type.  For now we only rely on GCC being able to do this.  */
58 #define BFD64
59 #endif
60
61 #include "bfd.h"
62 #include "bucomm.h"
63 #include "elfcomm.h"
64 #include "dwarf.h"
65
66 #include "elf/common.h"
67 #include "elf/external.h"
68 #include "elf/internal.h"
69
70
71 /* Included here, before RELOC_MACROS_GEN_FUNC is defined, so that
72    we can obtain the H8 reloc numbers.  We need these for the
73    get_reloc_size() function.  We include h8.h again after defining
74    RELOC_MACROS_GEN_FUNC so that we get the naming function as well.  */
75
76 #include "elf/h8.h"
77 #undef _ELF_H8_H
78
79 /* Undo the effects of #including reloc-macros.h.  */
80
81 #undef START_RELOC_NUMBERS
82 #undef RELOC_NUMBER
83 #undef FAKE_RELOC
84 #undef EMPTY_RELOC
85 #undef END_RELOC_NUMBERS
86 #undef _RELOC_MACROS_H
87
88 /* The following headers use the elf/reloc-macros.h file to
89    automatically generate relocation recognition functions
90    such as elf_mips_reloc_type()  */
91
92 #define RELOC_MACROS_GEN_FUNC
93
94 #include "elf/aarch64.h"
95 #include "elf/alpha.h"
96 #include "elf/arc.h"
97 #include "elf/arm.h"
98 #include "elf/avr.h"
99 #include "elf/bfin.h"
100 #include "elf/cr16.h"
101 #include "elf/cris.h"
102 #include "elf/crx.h"
103 #include "elf/d10v.h"
104 #include "elf/d30v.h"
105 #include "elf/dlx.h"
106 #include "elf/epiphany.h"
107 #include "elf/fr30.h"
108 #include "elf/frv.h"
109 #include "elf/h8.h"
110 #include "elf/hppa.h"
111 #include "elf/i386.h"
112 #include "elf/i370.h"
113 #include "elf/i860.h"
114 #include "elf/i960.h"
115 #include "elf/ia64.h"
116 #include "elf/ip2k.h"
117 #include "elf/lm32.h"
118 #include "elf/iq2000.h"
119 #include "elf/m32c.h"
120 #include "elf/m32r.h"
121 #include "elf/m68k.h"
122 #include "elf/m68hc11.h"
123 #include "elf/mcore.h"
124 #include "elf/mep.h"
125 #include "elf/metag.h"
126 #include "elf/microblaze.h"
127 #include "elf/mips.h"
128 #include "elf/mmix.h"
129 #include "elf/mn10200.h"
130 #include "elf/mn10300.h"
131 #include "elf/moxie.h"
132 #include "elf/mt.h"
133 #include "elf/msp430.h"
134 #include "elf/nds32.h"
135 #include "elf/nios2.h"
136 #include "elf/or1k.h"
137 #include "elf/pj.h"
138 #include "elf/ppc.h"
139 #include "elf/ppc64.h"
140 #include "elf/rl78.h"
141 #include "elf/rx.h"
142 #include "elf/s390.h"
143 #include "elf/score.h"
144 #include "elf/sh.h"
145 #include "elf/sparc.h"
146 #include "elf/spu.h"
147 #include "elf/tic6x.h"
148 #include "elf/tilegx.h"
149 #include "elf/tilepro.h"
150 #include "elf/v850.h"
151 #include "elf/vax.h"
152 #include "elf/x86-64.h"
153 #include "elf/xc16x.h"
154 #include "elf/xgate.h"
155 #include "elf/xstormy16.h"
156 #include "elf/xtensa.h"
157
158 #include "getopt.h"
159 #include "libiberty.h"
160 #include "safe-ctype.h"
161 #include "filenames.h"
162
163 #ifndef offsetof
164 #define offsetof(TYPE, MEMBER) ((size_t) &(((TYPE *) 0)->MEMBER))
165 #endif
166
167 char * program_name = "readelf";
168 static long archive_file_offset;
169 static unsigned long archive_file_size;
170 static bfd_size_type current_file_size;
171 static unsigned long dynamic_addr;
172 static bfd_size_type dynamic_size;
173 static size_t dynamic_nent;
174 static char * dynamic_strings;
175 static unsigned long dynamic_strings_length;
176 static char * string_table;
177 static unsigned long string_table_length;
178 static unsigned long num_dynamic_syms;
179 static Elf_Internal_Sym * dynamic_symbols;
180 static Elf_Internal_Syminfo * dynamic_syminfo;
181 static unsigned long dynamic_syminfo_offset;
182 static unsigned int dynamic_syminfo_nent;
183 static char program_interpreter[PATH_MAX];
184 static bfd_vma dynamic_info[DT_ENCODING];
185 static bfd_vma dynamic_info_DT_GNU_HASH;
186 static bfd_vma version_info[16];
187 static Elf_Internal_Ehdr elf_header;
188 static Elf_Internal_Shdr * section_headers;
189 static Elf_Internal_Phdr * program_headers;
190 static Elf_Internal_Dyn *  dynamic_section;
191 static Elf_Internal_Shdr * symtab_shndx_hdr;
192 static int show_name;
193 static int do_dynamic;
194 static int do_syms;
195 static int do_dyn_syms;
196 static int do_reloc;
197 static int do_sections;
198 static int do_section_groups;
199 static int do_section_details;
200 static int do_segments;
201 static int do_unwind;
202 static int do_using_dynamic;
203 static int do_header;
204 static int do_dump;
205 static int do_version;
206 static int do_histogram;
207 static int do_debugging;
208 static int do_arch;
209 static int do_notes;
210 static int do_archive_index;
211 static int is_32bit_elf;
212
213 struct group_list
214 {
215   struct group_list * next;
216   unsigned int section_index;
217 };
218
219 struct group
220 {
221   struct group_list * root;
222   unsigned int group_index;
223 };
224
225 static size_t group_count;
226 static struct group * section_groups;
227 static struct group ** section_headers_groups;
228
229
230 /* Flag bits indicating particular types of dump.  */
231 #define HEX_DUMP        (1 << 0)        /* The -x command line switch.  */
232 #define DISASS_DUMP     (1 << 1)        /* The -i command line switch.  */
233 #define DEBUG_DUMP      (1 << 2)        /* The -w command line switch.  */
234 #define STRING_DUMP     (1 << 3)        /* The -p command line switch.  */
235 #define RELOC_DUMP      (1 << 4)        /* The -R command line switch.  */
236
237 typedef unsigned char dump_type;
238
239 /* A linked list of the section names for which dumps were requested.  */
240 struct dump_list_entry
241 {
242   char * name;
243   dump_type type;
244   struct dump_list_entry * next;
245 };
246 static struct dump_list_entry * dump_sects_byname;
247
248 /* A dynamic array of flags indicating for which sections a dump
249    has been requested via command line switches.  */
250 static dump_type *   cmdline_dump_sects = NULL;
251 static unsigned int  num_cmdline_dump_sects = 0;
252
253 /* A dynamic array of flags indicating for which sections a dump of
254    some kind has been requested.  It is reset on a per-object file
255    basis and then initialised from the cmdline_dump_sects array,
256    the results of interpreting the -w switch, and the
257    dump_sects_byname list.  */
258 static dump_type *   dump_sects = NULL;
259 static unsigned int  num_dump_sects = 0;
260
261
262 /* How to print a vma value.  */
263 typedef enum print_mode
264 {
265   HEX,
266   DEC,
267   DEC_5,
268   UNSIGNED,
269   PREFIX_HEX,
270   FULL_HEX,
271   LONG_HEX
272 }
273 print_mode;
274
275 #define UNKNOWN -1
276
277 #define SECTION_NAME(X)                                         \
278   ((X) == NULL ? _("<none>")                                    \
279    : string_table == NULL ? _("<no-name>")                      \
280    : ((X)->sh_name >= string_table_length ? _("<corrupt>")      \
281   : string_table + (X)->sh_name))
282
283 #define DT_VERSIONTAGIDX(tag)   (DT_VERNEEDNUM - (tag)) /* Reverse order!  */
284
285 #define GET_ELF_SYMBOLS(file, section, sym_count)                       \
286   (is_32bit_elf ? get_32bit_elf_symbols (file, section, sym_count)      \
287    : get_64bit_elf_symbols (file, section, sym_count))
288
289 #define VALID_DYNAMIC_NAME(offset)      ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
290 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
291    already been called and verified that the string exists.  */
292 #define GET_DYNAMIC_NAME(offset)        (dynamic_strings + offset)
293
294 #define REMOVE_ARCH_BITS(ADDR)                  \
295   do                                            \
296     {                                           \
297       if (elf_header.e_machine == EM_ARM)       \
298         (ADDR) &= ~1;                           \
299     }                                           \
300   while (0)
301 \f
302 /* Retrieve NMEMB structures, each SIZE bytes long from FILE starting at OFFSET.
303    Put the retrieved data into VAR, if it is not NULL.  Otherwise allocate a buffer
304    using malloc and fill that.  In either case return the pointer to the start of
305    the retrieved data or NULL if something went wrong.  If something does go wrong
306    emit an error message using REASON as part of the context.  */
307
308 static void *
309 get_data (void * var, FILE * file, long offset, size_t size, size_t nmemb,
310           const char * reason)
311 {
312   void * mvar;
313
314   if (size == 0 || nmemb == 0)
315     return NULL;
316
317   if (fseek (file, archive_file_offset + offset, SEEK_SET))
318     {
319       if (reason)
320         error (_("Unable to seek to 0x%lx for %s\n"),
321                (unsigned long) archive_file_offset + offset, reason);
322       return NULL;
323     }
324
325   /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
326      attempting to allocate memory when the read is bound to fail.  */
327   if (offset + archive_file_offset + size * nmemb > current_file_size)
328     {
329       if (reason)
330         error (_("Reading 0x%lx bytes extends past end of file for %s\n"),
331                (unsigned long) (size * nmemb), reason);
332       return NULL;
333     }
334
335   mvar = var;
336   if (mvar == NULL)
337     {
338       /* Check for overflow.  */
339       if (nmemb < (~(size_t) 0 - 1) / size)
340         /* + 1 so that we can '\0' terminate invalid string table sections.  */
341         mvar = malloc (size * nmemb + 1);
342
343       if (mvar == NULL)
344         {
345           if (reason)
346             error (_("Out of memory allocating 0x%lx bytes for %s\n"),
347                    (unsigned long)(size * nmemb), reason);
348           return NULL;
349         }
350
351       ((char *) mvar)[size * nmemb] = '\0';
352     }
353
354   if (fread (mvar, size, nmemb, file) != nmemb)
355     {
356       if (reason)
357         error (_("Unable to read in 0x%lx bytes of %s\n"),
358                (unsigned long)(size * nmemb), reason);
359       if (mvar != var)
360         free (mvar);
361       return NULL;
362     }
363
364   return mvar;
365 }
366
367 /* Print a VMA value.  */
368
369 static int
370 print_vma (bfd_vma vma, print_mode mode)
371 {
372   int nc = 0;
373
374   switch (mode)
375     {
376     case FULL_HEX:
377       nc = printf ("0x");
378       /* Drop through.  */
379
380     case LONG_HEX:
381 #ifdef BFD64
382       if (is_32bit_elf)
383         return nc + printf ("%8.8" BFD_VMA_FMT "x", vma);
384 #endif
385       printf_vma (vma);
386       return nc + 16;
387
388     case DEC_5:
389       if (vma <= 99999)
390         return printf ("%5" BFD_VMA_FMT "d", vma);
391       /* Drop through.  */
392
393     case PREFIX_HEX:
394       nc = printf ("0x");
395       /* Drop through.  */
396
397     case HEX:
398       return nc + printf ("%" BFD_VMA_FMT "x", vma);
399
400     case DEC:
401       return printf ("%" BFD_VMA_FMT "d", vma);
402
403     case UNSIGNED:
404       return printf ("%" BFD_VMA_FMT "u", vma);
405     }
406   return 0;
407 }
408
409 /* Display a symbol on stdout.  Handles the display of control characters and
410    multibye characters (assuming the host environment supports them).
411
412    Display at most abs(WIDTH) characters, truncating as necessary, unless do_wide is true.
413
414    If WIDTH is negative then ensure that the output is at least (- WIDTH) characters,
415    padding as necessary.
416
417    Returns the number of emitted characters.  */
418
419 static unsigned int
420 print_symbol (int width, const char *symbol)
421 {
422   bfd_boolean extra_padding = FALSE;
423   int num_printed = 0;
424 #ifdef HAVE_MBSTATE_T
425   mbstate_t state;
426 #endif
427   int width_remaining;
428
429   if (width < 0)
430     {
431       /* Keep the width positive.  This also helps.  */
432       width = - width;
433       extra_padding = TRUE;
434     }
435   assert (width != 0);
436
437   if (do_wide)
438     /* Set the remaining width to a very large value.
439        This simplifies the code below.  */
440     width_remaining = INT_MAX;
441   else
442     width_remaining = width;
443
444 #ifdef HAVE_MBSTATE_T
445   /* Initialise the multibyte conversion state.  */
446   memset (& state, 0, sizeof (state));
447 #endif
448
449   while (width_remaining)
450     {
451       size_t  n;
452       const char c = *symbol++;
453
454       if (c == 0)
455         break;
456
457       /* Do not print control characters directly as they can affect terminal
458          settings.  Such characters usually appear in the names generated
459          by the assembler for local labels.  */
460       if (ISCNTRL (c))
461         {
462           if (width_remaining < 2)
463             break;
464
465           printf ("^%c", c + 0x40);
466           width_remaining -= 2;
467           num_printed += 2;
468         }
469       else if (ISPRINT (c))
470         {
471           putchar (c);
472           width_remaining --;
473           num_printed ++;
474         }
475       else
476         {
477 #ifdef HAVE_MBSTATE_T
478           wchar_t w;
479 #endif
480           /* Let printf do the hard work of displaying multibyte characters.  */
481           printf ("%.1s", symbol - 1);
482           width_remaining --;
483           num_printed ++;
484
485 #ifdef HAVE_MBSTATE_T
486           /* Try to find out how many bytes made up the character that was
487              just printed.  Advance the symbol pointer past the bytes that
488              were displayed.  */
489           n = mbrtowc (& w, symbol - 1, MB_CUR_MAX, & state);
490 #else
491           n = 1;
492 #endif
493           if (n != (size_t) -1 && n != (size_t) -2 && n > 0)
494             symbol += (n - 1);
495         }
496     }
497
498   if (extra_padding && num_printed < width)
499     {
500       /* Fill in the remaining spaces.  */
501       printf ("%-*s", width - num_printed, " ");
502       num_printed = width;
503     }
504
505   return num_printed;
506 }
507
508 /* Returns a pointer to a static buffer containing a  printable version of
509    the given section's name.  Like print_symbol, except that it does not try
510    to print multibyte characters, it just interprets them as hex values.  */
511
512 static const char *
513 printable_section_name (Elf_Internal_Shdr * sec)
514 {
515 #define MAX_PRINT_SEC_NAME_LEN 128
516   static char  sec_name_buf [MAX_PRINT_SEC_NAME_LEN + 1];
517   const char * name = SECTION_NAME (sec);
518   char *       buf = sec_name_buf;
519   char         c;
520   unsigned int remaining = MAX_PRINT_SEC_NAME_LEN;
521
522   while ((c = * name ++) != 0)
523     {
524       if (ISCNTRL (c))
525         {
526           if (remaining < 2)
527             break;
528           
529           * buf ++ = '^';
530           * buf ++ = c + 0x40;
531           remaining -= 2;
532         }
533       else if (ISPRINT (c))
534         {
535           * buf ++ = c;
536           remaining -= 1;
537         }
538       else
539         {
540           static char hex[17] = "0123456789ABCDEF";
541
542           if (remaining < 4)
543             break;
544           * buf ++ = '<';
545           * buf ++ = hex[(c & 0xf0) >> 4];
546           * buf ++ = hex[c & 0x0f];
547           * buf ++ = '>';
548           remaining -= 4;
549         }
550
551       if (remaining == 0)
552         break;
553     }
554
555   * buf = 0;
556   return sec_name_buf;
557 }
558
559 static const char *
560 printable_section_name_from_index (unsigned long ndx)
561 {
562   if (ndx >= elf_header.e_shnum)
563     return _("<corrupt>");
564
565   return printable_section_name (section_headers + ndx);
566 }
567
568 /* Return a pointer to section NAME, or NULL if no such section exists.  */
569
570 static Elf_Internal_Shdr *
571 find_section (const char * name)
572 {
573   unsigned int i;
574
575   for (i = 0; i < elf_header.e_shnum; i++)
576     if (streq (SECTION_NAME (section_headers + i), name))
577       return section_headers + i;
578
579   return NULL;
580 }
581
582 /* Return a pointer to a section containing ADDR, or NULL if no such
583    section exists.  */
584
585 static Elf_Internal_Shdr *
586 find_section_by_address (bfd_vma addr)
587 {
588   unsigned int i;
589
590   for (i = 0; i < elf_header.e_shnum; i++)
591     {
592       Elf_Internal_Shdr *sec = section_headers + i;
593       if (addr >= sec->sh_addr && addr < sec->sh_addr + sec->sh_size)
594         return sec;
595     }
596
597   return NULL;
598 }
599
600 static Elf_Internal_Shdr *
601 find_section_by_type (unsigned int type)
602 {
603   unsigned int i;
604
605   for (i = 0; i < elf_header.e_shnum; i++)
606     {
607       Elf_Internal_Shdr *sec = section_headers + i;
608       if (sec->sh_type == type)
609         return sec;
610     }
611
612   return NULL;
613 }
614
615 /* Return a pointer to section NAME, or NULL if no such section exists,
616    restricted to the list of sections given in SET.  */
617
618 static Elf_Internal_Shdr *
619 find_section_in_set (const char * name, unsigned int * set)
620 {
621   unsigned int i;
622
623   if (set != NULL)
624     {
625       while ((i = *set++) > 0)
626         if (streq (SECTION_NAME (section_headers + i), name))
627           return section_headers + i;
628     }
629
630   return find_section (name);
631 }
632
633 /* Read an unsigned LEB128 encoded value from p.  Set *PLEN to the number of
634    bytes read.  */
635
636 static inline unsigned long
637 read_uleb128 (unsigned char *data,
638               unsigned int *length_return,
639               const unsigned char * const end)
640 {
641   return read_leb128 (data, length_return, FALSE, end);
642 }
643
644 /* Return true if the current file is for IA-64 machine and OpenVMS ABI.
645    This OS has so many departures from the ELF standard that we test it at
646    many places.  */
647
648 static inline int
649 is_ia64_vms (void)
650 {
651   return elf_header.e_machine == EM_IA_64
652     && elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS;
653 }
654
655 /* Guess the relocation size commonly used by the specific machines.  */
656
657 static int
658 guess_is_rela (unsigned int e_machine)
659 {
660   switch (e_machine)
661     {
662       /* Targets that use REL relocations.  */
663     case EM_386:
664     case EM_486:
665     case EM_960:
666     case EM_ARM:
667     case EM_D10V:
668     case EM_CYGNUS_D10V:
669     case EM_DLX:
670     case EM_MIPS:
671     case EM_MIPS_RS3_LE:
672     case EM_CYGNUS_M32R:
673     case EM_SCORE:
674     case EM_XGATE:
675       return FALSE;
676
677       /* Targets that use RELA relocations.  */
678     case EM_68K:
679     case EM_860:
680     case EM_AARCH64:
681     case EM_ADAPTEVA_EPIPHANY:
682     case EM_ALPHA:
683     case EM_ALTERA_NIOS2:
684     case EM_AVR:
685     case EM_AVR_OLD:
686     case EM_BLACKFIN:
687     case EM_CR16:
688     case EM_CRIS:
689     case EM_CRX:
690     case EM_D30V:
691     case EM_CYGNUS_D30V:
692     case EM_FR30:
693     case EM_CYGNUS_FR30:
694     case EM_CYGNUS_FRV:
695     case EM_H8S:
696     case EM_H8_300:
697     case EM_H8_300H:
698     case EM_IA_64:
699     case EM_IP2K:
700     case EM_IP2K_OLD:
701     case EM_IQ2000:
702     case EM_LATTICEMICO32:
703     case EM_M32C_OLD:
704     case EM_M32C:
705     case EM_M32R:
706     case EM_MCORE:
707     case EM_CYGNUS_MEP:
708     case EM_METAG:
709     case EM_MMIX:
710     case EM_MN10200:
711     case EM_CYGNUS_MN10200:
712     case EM_MN10300:
713     case EM_CYGNUS_MN10300:
714     case EM_MOXIE:
715     case EM_MSP430:
716     case EM_MSP430_OLD:
717     case EM_MT:
718     case EM_NDS32:
719     case EM_NIOS32:
720     case EM_OR1K:
721     case EM_PPC64:
722     case EM_PPC:
723     case EM_RL78:
724     case EM_RX:
725     case EM_S390:
726     case EM_S390_OLD:
727     case EM_SH:
728     case EM_SPARC:
729     case EM_SPARC32PLUS:
730     case EM_SPARCV9:
731     case EM_SPU:
732     case EM_TI_C6000:
733     case EM_TILEGX:
734     case EM_TILEPRO:
735     case EM_V800:
736     case EM_V850:
737     case EM_CYGNUS_V850:
738     case EM_VAX:
739     case EM_X86_64:
740     case EM_L1OM:
741     case EM_K1OM:
742     case EM_XSTORMY16:
743     case EM_XTENSA:
744     case EM_XTENSA_OLD:
745     case EM_MICROBLAZE:
746     case EM_MICROBLAZE_OLD:
747       return TRUE;
748
749     case EM_68HC05:
750     case EM_68HC08:
751     case EM_68HC11:
752     case EM_68HC16:
753     case EM_FX66:
754     case EM_ME16:
755     case EM_MMA:
756     case EM_NCPU:
757     case EM_NDR1:
758     case EM_PCP:
759     case EM_ST100:
760     case EM_ST19:
761     case EM_ST7:
762     case EM_ST9PLUS:
763     case EM_STARCORE:
764     case EM_SVX:
765     case EM_TINYJ:
766     default:
767       warn (_("Don't know about relocations on this machine architecture\n"));
768       return FALSE;
769     }
770 }
771
772 static int
773 slurp_rela_relocs (FILE * file,
774                    unsigned long rel_offset,
775                    unsigned long rel_size,
776                    Elf_Internal_Rela ** relasp,
777                    unsigned long * nrelasp)
778 {
779   Elf_Internal_Rela * relas;
780   size_t nrelas;
781   unsigned int i;
782
783   if (is_32bit_elf)
784     {
785       Elf32_External_Rela * erelas;
786
787       erelas = (Elf32_External_Rela *) get_data (NULL, file, rel_offset, 1,
788                                                  rel_size, _("32-bit relocation data"));
789       if (!erelas)
790         return 0;
791
792       nrelas = rel_size / sizeof (Elf32_External_Rela);
793
794       relas = (Elf_Internal_Rela *) cmalloc (nrelas,
795                                              sizeof (Elf_Internal_Rela));
796
797       if (relas == NULL)
798         {
799           free (erelas);
800           error (_("out of memory parsing relocs\n"));
801           return 0;
802         }
803
804       for (i = 0; i < nrelas; i++)
805         {
806           relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
807           relas[i].r_info   = BYTE_GET (erelas[i].r_info);
808           relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
809         }
810
811       free (erelas);
812     }
813   else
814     {
815       Elf64_External_Rela * erelas;
816
817       erelas = (Elf64_External_Rela *) get_data (NULL, file, rel_offset, 1,
818                                                  rel_size, _("64-bit relocation data"));
819       if (!erelas)
820         return 0;
821
822       nrelas = rel_size / sizeof (Elf64_External_Rela);
823
824       relas = (Elf_Internal_Rela *) cmalloc (nrelas,
825                                              sizeof (Elf_Internal_Rela));
826
827       if (relas == NULL)
828         {
829           free (erelas);
830           error (_("out of memory parsing relocs\n"));
831           return 0;
832         }
833
834       for (i = 0; i < nrelas; i++)
835         {
836           relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
837           relas[i].r_info   = BYTE_GET (erelas[i].r_info);
838           relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
839
840           /* The #ifdef BFD64 below is to prevent a compile time
841              warning.  We know that if we do not have a 64 bit data
842              type that we will never execute this code anyway.  */
843 #ifdef BFD64
844           if (elf_header.e_machine == EM_MIPS
845               && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
846             {
847               /* In little-endian objects, r_info isn't really a
848                  64-bit little-endian value: it has a 32-bit
849                  little-endian symbol index followed by four
850                  individual byte fields.  Reorder INFO
851                  accordingly.  */
852               bfd_vma inf = relas[i].r_info;
853               inf = (((inf & 0xffffffff) << 32)
854                       | ((inf >> 56) & 0xff)
855                       | ((inf >> 40) & 0xff00)
856                       | ((inf >> 24) & 0xff0000)
857                       | ((inf >> 8) & 0xff000000));
858               relas[i].r_info = inf;
859             }
860 #endif /* BFD64 */
861         }
862
863       free (erelas);
864     }
865   *relasp = relas;
866   *nrelasp = nrelas;
867   return 1;
868 }
869
870 static int
871 slurp_rel_relocs (FILE * file,
872                   unsigned long rel_offset,
873                   unsigned long rel_size,
874                   Elf_Internal_Rela ** relsp,
875                   unsigned long * nrelsp)
876 {
877   Elf_Internal_Rela * rels;
878   size_t nrels;
879   unsigned int i;
880
881   if (is_32bit_elf)
882     {
883       Elf32_External_Rel * erels;
884
885       erels = (Elf32_External_Rel *) get_data (NULL, file, rel_offset, 1,
886                                                rel_size, _("32-bit relocation data"));
887       if (!erels)
888         return 0;
889
890       nrels = rel_size / sizeof (Elf32_External_Rel);
891
892       rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
893
894       if (rels == NULL)
895         {
896           free (erels);
897           error (_("out of memory parsing relocs\n"));
898           return 0;
899         }
900
901       for (i = 0; i < nrels; i++)
902         {
903           rels[i].r_offset = BYTE_GET (erels[i].r_offset);
904           rels[i].r_info   = BYTE_GET (erels[i].r_info);
905           rels[i].r_addend = 0;
906         }
907
908       free (erels);
909     }
910   else
911     {
912       Elf64_External_Rel * erels;
913
914       erels = (Elf64_External_Rel *) get_data (NULL, file, rel_offset, 1,
915                                                rel_size, _("64-bit relocation data"));
916       if (!erels)
917         return 0;
918
919       nrels = rel_size / sizeof (Elf64_External_Rel);
920
921       rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
922
923       if (rels == NULL)
924         {
925           free (erels);
926           error (_("out of memory parsing relocs\n"));
927           return 0;
928         }
929
930       for (i = 0; i < nrels; i++)
931         {
932           rels[i].r_offset = BYTE_GET (erels[i].r_offset);
933           rels[i].r_info   = BYTE_GET (erels[i].r_info);
934           rels[i].r_addend = 0;
935
936           /* The #ifdef BFD64 below is to prevent a compile time
937              warning.  We know that if we do not have a 64 bit data
938              type that we will never execute this code anyway.  */
939 #ifdef BFD64
940           if (elf_header.e_machine == EM_MIPS
941               && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
942             {
943               /* In little-endian objects, r_info isn't really a
944                  64-bit little-endian value: it has a 32-bit
945                  little-endian symbol index followed by four
946                  individual byte fields.  Reorder INFO
947                  accordingly.  */
948               bfd_vma inf = rels[i].r_info;
949               inf = (((inf & 0xffffffff) << 32)
950                      | ((inf >> 56) & 0xff)
951                      | ((inf >> 40) & 0xff00)
952                      | ((inf >> 24) & 0xff0000)
953                      | ((inf >> 8) & 0xff000000));
954               rels[i].r_info = inf;
955             }
956 #endif /* BFD64 */
957         }
958
959       free (erels);
960     }
961   *relsp = rels;
962   *nrelsp = nrels;
963   return 1;
964 }
965
966 /* Returns the reloc type extracted from the reloc info field.  */
967
968 static unsigned int
969 get_reloc_type (bfd_vma reloc_info)
970 {
971   if (is_32bit_elf)
972     return ELF32_R_TYPE (reloc_info);
973
974   switch (elf_header.e_machine)
975     {
976     case EM_MIPS:
977       /* Note: We assume that reloc_info has already been adjusted for us.  */
978       return ELF64_MIPS_R_TYPE (reloc_info);
979
980     case EM_SPARCV9:
981       return ELF64_R_TYPE_ID (reloc_info);
982
983     default:
984       return ELF64_R_TYPE (reloc_info);
985     }
986 }
987
988 /* Return the symbol index extracted from the reloc info field.  */
989
990 static bfd_vma
991 get_reloc_symindex (bfd_vma reloc_info)
992 {
993   return is_32bit_elf ? ELF32_R_SYM (reloc_info) : ELF64_R_SYM (reloc_info);
994 }
995
996 static inline bfd_boolean
997 uses_msp430x_relocs (void)
998 {
999   return
1000     elf_header.e_machine == EM_MSP430 /* Paranoia.  */
1001     /* GCC uses osabi == ELFOSBI_STANDALONE.  */
1002     && (((elf_header.e_flags & EF_MSP430_MACH) == E_MSP430_MACH_MSP430X)
1003         /* TI compiler uses ELFOSABI_NONE.  */
1004         || (elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE));
1005 }
1006
1007 /* Display the contents of the relocation data found at the specified
1008    offset.  */
1009
1010 static void
1011 dump_relocations (FILE * file,
1012                   unsigned long rel_offset,
1013                   unsigned long rel_size,
1014                   Elf_Internal_Sym * symtab,
1015                   unsigned long nsyms,
1016                   char * strtab,
1017                   unsigned long strtablen,
1018                   int is_rela)
1019 {
1020   unsigned int i;
1021   Elf_Internal_Rela * rels;
1022
1023   if (is_rela == UNKNOWN)
1024     is_rela = guess_is_rela (elf_header.e_machine);
1025
1026   if (is_rela)
1027     {
1028       if (!slurp_rela_relocs (file, rel_offset, rel_size, &rels, &rel_size))
1029         return;
1030     }
1031   else
1032     {
1033       if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
1034         return;
1035     }
1036
1037   if (is_32bit_elf)
1038     {
1039       if (is_rela)
1040         {
1041           if (do_wide)
1042             printf (_(" Offset     Info    Type                Sym. Value  Symbol's Name + Addend\n"));
1043           else
1044             printf (_(" Offset     Info    Type            Sym.Value  Sym. Name + Addend\n"));
1045         }
1046       else
1047         {
1048           if (do_wide)
1049             printf (_(" Offset     Info    Type                Sym. Value  Symbol's Name\n"));
1050           else
1051             printf (_(" Offset     Info    Type            Sym.Value  Sym. Name\n"));
1052         }
1053     }
1054   else
1055     {
1056       if (is_rela)
1057         {
1058           if (do_wide)
1059             printf (_("    Offset             Info             Type               Symbol's Value  Symbol's Name + Addend\n"));
1060           else
1061             printf (_("  Offset          Info           Type           Sym. Value    Sym. Name + Addend\n"));
1062         }
1063       else
1064         {
1065           if (do_wide)
1066             printf (_("    Offset             Info             Type               Symbol's Value  Symbol's Name\n"));
1067           else
1068             printf (_("  Offset          Info           Type           Sym. Value    Sym. Name\n"));
1069         }
1070     }
1071
1072   for (i = 0; i < rel_size; i++)
1073     {
1074       const char * rtype;
1075       bfd_vma offset;
1076       bfd_vma inf;
1077       bfd_vma symtab_index;
1078       bfd_vma type;
1079
1080       offset = rels[i].r_offset;
1081       inf    = rels[i].r_info;
1082
1083       type = get_reloc_type (inf);
1084       symtab_index = get_reloc_symindex  (inf);
1085
1086       if (is_32bit_elf)
1087         {
1088           printf ("%8.8lx  %8.8lx ",
1089                   (unsigned long) offset & 0xffffffff,
1090                   (unsigned long) inf & 0xffffffff);
1091         }
1092       else
1093         {
1094 #if BFD_HOST_64BIT_LONG
1095           printf (do_wide
1096                   ? "%16.16lx  %16.16lx "
1097                   : "%12.12lx  %12.12lx ",
1098                   offset, inf);
1099 #elif BFD_HOST_64BIT_LONG_LONG
1100 #ifndef __MSVCRT__
1101           printf (do_wide
1102                   ? "%16.16llx  %16.16llx "
1103                   : "%12.12llx  %12.12llx ",
1104                   offset, inf);
1105 #else
1106           printf (do_wide
1107                   ? "%16.16I64x  %16.16I64x "
1108                   : "%12.12I64x  %12.12I64x ",
1109                   offset, inf);
1110 #endif
1111 #else
1112           printf (do_wide
1113                   ? "%8.8lx%8.8lx  %8.8lx%8.8lx "
1114                   : "%4.4lx%8.8lx  %4.4lx%8.8lx ",
1115                   _bfd_int64_high (offset),
1116                   _bfd_int64_low (offset),
1117                   _bfd_int64_high (inf),
1118                   _bfd_int64_low (inf));
1119 #endif
1120         }
1121
1122       switch (elf_header.e_machine)
1123         {
1124         default:
1125           rtype = NULL;
1126           break;
1127
1128         case EM_AARCH64:
1129           rtype = elf_aarch64_reloc_type (type);
1130           break;
1131
1132         case EM_M32R:
1133         case EM_CYGNUS_M32R:
1134           rtype = elf_m32r_reloc_type (type);
1135           break;
1136
1137         case EM_386:
1138         case EM_486:
1139           rtype = elf_i386_reloc_type (type);
1140           break;
1141
1142         case EM_68HC11:
1143         case EM_68HC12:
1144           rtype = elf_m68hc11_reloc_type (type);
1145           break;
1146
1147         case EM_68K:
1148           rtype = elf_m68k_reloc_type (type);
1149           break;
1150
1151         case EM_960:
1152           rtype = elf_i960_reloc_type (type);
1153           break;
1154
1155         case EM_AVR:
1156         case EM_AVR_OLD:
1157           rtype = elf_avr_reloc_type (type);
1158           break;
1159
1160         case EM_OLD_SPARCV9:
1161         case EM_SPARC32PLUS:
1162         case EM_SPARCV9:
1163         case EM_SPARC:
1164           rtype = elf_sparc_reloc_type (type);
1165           break;
1166
1167         case EM_SPU:
1168           rtype = elf_spu_reloc_type (type);
1169           break;
1170
1171         case EM_V800:
1172           rtype = v800_reloc_type (type);
1173           break;
1174         case EM_V850:
1175         case EM_CYGNUS_V850:
1176           rtype = v850_reloc_type (type);
1177           break;
1178
1179         case EM_D10V:
1180         case EM_CYGNUS_D10V:
1181           rtype = elf_d10v_reloc_type (type);
1182           break;
1183
1184         case EM_D30V:
1185         case EM_CYGNUS_D30V:
1186           rtype = elf_d30v_reloc_type (type);
1187           break;
1188
1189         case EM_DLX:
1190           rtype = elf_dlx_reloc_type (type);
1191           break;
1192
1193         case EM_SH:
1194           rtype = elf_sh_reloc_type (type);
1195           break;
1196
1197         case EM_MN10300:
1198         case EM_CYGNUS_MN10300:
1199           rtype = elf_mn10300_reloc_type (type);
1200           break;
1201
1202         case EM_MN10200:
1203         case EM_CYGNUS_MN10200:
1204           rtype = elf_mn10200_reloc_type (type);
1205           break;
1206
1207         case EM_FR30:
1208         case EM_CYGNUS_FR30:
1209           rtype = elf_fr30_reloc_type (type);
1210           break;
1211
1212         case EM_CYGNUS_FRV:
1213           rtype = elf_frv_reloc_type (type);
1214           break;
1215
1216         case EM_MCORE:
1217           rtype = elf_mcore_reloc_type (type);
1218           break;
1219
1220         case EM_MMIX:
1221           rtype = elf_mmix_reloc_type (type);
1222           break;
1223
1224         case EM_MOXIE:
1225           rtype = elf_moxie_reloc_type (type);
1226           break;
1227
1228         case EM_MSP430:
1229           if (uses_msp430x_relocs ())
1230             {
1231               rtype = elf_msp430x_reloc_type (type);
1232               break;
1233             }
1234         case EM_MSP430_OLD:
1235           rtype = elf_msp430_reloc_type (type);
1236           break;
1237
1238         case EM_NDS32:
1239           rtype = elf_nds32_reloc_type (type);
1240           break;
1241
1242         case EM_PPC:
1243           rtype = elf_ppc_reloc_type (type);
1244           break;
1245
1246         case EM_PPC64:
1247           rtype = elf_ppc64_reloc_type (type);
1248           break;
1249
1250         case EM_MIPS:
1251         case EM_MIPS_RS3_LE:
1252           rtype = elf_mips_reloc_type (type);
1253           break;
1254
1255         case EM_ALPHA:
1256           rtype = elf_alpha_reloc_type (type);
1257           break;
1258
1259         case EM_ARM:
1260           rtype = elf_arm_reloc_type (type);
1261           break;
1262
1263         case EM_ARC:
1264           rtype = elf_arc_reloc_type (type);
1265           break;
1266
1267         case EM_PARISC:
1268           rtype = elf_hppa_reloc_type (type);
1269           break;
1270
1271         case EM_H8_300:
1272         case EM_H8_300H:
1273         case EM_H8S:
1274           rtype = elf_h8_reloc_type (type);
1275           break;
1276
1277         case EM_OR1K:
1278           rtype = elf_or1k_reloc_type (type);
1279           break;
1280
1281         case EM_PJ:
1282         case EM_PJ_OLD:
1283           rtype = elf_pj_reloc_type (type);
1284           break;
1285         case EM_IA_64:
1286           rtype = elf_ia64_reloc_type (type);
1287           break;
1288
1289         case EM_CRIS:
1290           rtype = elf_cris_reloc_type (type);
1291           break;
1292
1293         case EM_860:
1294           rtype = elf_i860_reloc_type (type);
1295           break;
1296
1297         case EM_X86_64:
1298         case EM_L1OM:
1299         case EM_K1OM:
1300           rtype = elf_x86_64_reloc_type (type);
1301           break;
1302
1303         case EM_S370:
1304           rtype = i370_reloc_type (type);
1305           break;
1306
1307         case EM_S390_OLD:
1308         case EM_S390:
1309           rtype = elf_s390_reloc_type (type);
1310           break;
1311
1312         case EM_SCORE:
1313           rtype = elf_score_reloc_type (type);
1314           break;
1315
1316         case EM_XSTORMY16:
1317           rtype = elf_xstormy16_reloc_type (type);
1318           break;
1319
1320         case EM_CRX:
1321           rtype = elf_crx_reloc_type (type);
1322           break;
1323
1324         case EM_VAX:
1325           rtype = elf_vax_reloc_type (type);
1326           break;
1327
1328         case EM_ADAPTEVA_EPIPHANY:
1329           rtype = elf_epiphany_reloc_type (type);
1330           break;
1331
1332         case EM_IP2K:
1333         case EM_IP2K_OLD:
1334           rtype = elf_ip2k_reloc_type (type);
1335           break;
1336
1337         case EM_IQ2000:
1338           rtype = elf_iq2000_reloc_type (type);
1339           break;
1340
1341         case EM_XTENSA_OLD:
1342         case EM_XTENSA:
1343           rtype = elf_xtensa_reloc_type (type);
1344           break;
1345
1346         case EM_LATTICEMICO32:
1347           rtype = elf_lm32_reloc_type (type);
1348           break;
1349
1350         case EM_M32C_OLD:
1351         case EM_M32C:
1352           rtype = elf_m32c_reloc_type (type);
1353           break;
1354
1355         case EM_MT:
1356           rtype = elf_mt_reloc_type (type);
1357           break;
1358
1359         case EM_BLACKFIN:
1360           rtype = elf_bfin_reloc_type (type);
1361           break;
1362
1363         case EM_CYGNUS_MEP:
1364           rtype = elf_mep_reloc_type (type);
1365           break;
1366
1367         case EM_CR16:
1368           rtype = elf_cr16_reloc_type (type);
1369           break;
1370
1371         case EM_MICROBLAZE:
1372         case EM_MICROBLAZE_OLD:
1373           rtype = elf_microblaze_reloc_type (type);
1374           break;
1375
1376         case EM_RL78:
1377           rtype = elf_rl78_reloc_type (type);
1378           break;
1379
1380         case EM_RX:
1381           rtype = elf_rx_reloc_type (type);
1382           break;
1383
1384         case EM_METAG:
1385           rtype = elf_metag_reloc_type (type);
1386           break;
1387
1388         case EM_XC16X:
1389         case EM_C166:
1390           rtype = elf_xc16x_reloc_type (type);
1391           break;
1392
1393         case EM_TI_C6000:
1394           rtype = elf_tic6x_reloc_type (type);
1395           break;
1396
1397         case EM_TILEGX:
1398           rtype = elf_tilegx_reloc_type (type);
1399           break;
1400
1401         case EM_TILEPRO:
1402           rtype = elf_tilepro_reloc_type (type);
1403           break;
1404
1405         case EM_XGATE:
1406           rtype = elf_xgate_reloc_type (type);
1407           break;
1408
1409         case EM_ALTERA_NIOS2:
1410           rtype = elf_nios2_reloc_type (type);
1411           break;
1412         }
1413
1414       if (rtype == NULL)
1415         printf (_("unrecognized: %-7lx"), (unsigned long) type & 0xffffffff);
1416       else
1417         printf (do_wide ? "%-22.22s" : "%-17.17s", rtype);
1418
1419       if (elf_header.e_machine == EM_ALPHA
1420           && rtype != NULL
1421           && streq (rtype, "R_ALPHA_LITUSE")
1422           && is_rela)
1423         {
1424           switch (rels[i].r_addend)
1425             {
1426             case LITUSE_ALPHA_ADDR:   rtype = "ADDR";   break;
1427             case LITUSE_ALPHA_BASE:   rtype = "BASE";   break;
1428             case LITUSE_ALPHA_BYTOFF: rtype = "BYTOFF"; break;
1429             case LITUSE_ALPHA_JSR:    rtype = "JSR";    break;
1430             case LITUSE_ALPHA_TLSGD:  rtype = "TLSGD";  break;
1431             case LITUSE_ALPHA_TLSLDM: rtype = "TLSLDM"; break;
1432             case LITUSE_ALPHA_JSRDIRECT: rtype = "JSRDIRECT"; break;
1433             default: rtype = NULL;
1434             }
1435           if (rtype)
1436             printf (" (%s)", rtype);
1437           else
1438             {
1439               putchar (' ');
1440               printf (_("<unknown addend: %lx>"),
1441                       (unsigned long) rels[i].r_addend);
1442             }
1443         }
1444       else if (symtab_index)
1445         {
1446           if (symtab == NULL || symtab_index >= nsyms)
1447             printf (_(" bad symbol index: %08lx"), (unsigned long) symtab_index);
1448           else
1449             {
1450               Elf_Internal_Sym * psym;
1451
1452               psym = symtab + symtab_index;
1453
1454               printf (" ");
1455
1456               if (ELF_ST_TYPE (psym->st_info) == STT_GNU_IFUNC)
1457                 {
1458                   const char * name;
1459                   unsigned int len;
1460                   unsigned int width = is_32bit_elf ? 8 : 14;
1461
1462                   /* Relocations against GNU_IFUNC symbols do not use the value
1463                      of the symbol as the address to relocate against.  Instead
1464                      they invoke the function named by the symbol and use its
1465                      result as the address for relocation.
1466
1467                      To indicate this to the user, do not display the value of
1468                      the symbol in the "Symbols's Value" field.  Instead show
1469                      its name followed by () as a hint that the symbol is
1470                      invoked.  */
1471
1472                   if (strtab == NULL
1473                       || psym->st_name == 0
1474                       || psym->st_name >= strtablen)
1475                     name = "??";
1476                   else
1477                     name = strtab + psym->st_name;
1478
1479                   len = print_symbol (width, name);
1480                   printf ("()%-*s", len <= width ? (width + 1) - len : 1, " ");
1481                 }
1482               else
1483                 {
1484                   print_vma (psym->st_value, LONG_HEX);
1485
1486                   printf (is_32bit_elf ? "   " : " ");
1487                 }
1488
1489               if (psym->st_name == 0)
1490                 {
1491                   const char * sec_name = "<null>";
1492                   char name_buf[40];
1493
1494                   if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1495                     {
1496                       if (psym->st_shndx < elf_header.e_shnum)
1497                         sec_name = SECTION_NAME (section_headers + psym->st_shndx);
1498                       else if (psym->st_shndx == SHN_ABS)
1499                         sec_name = "ABS";
1500                       else if (psym->st_shndx == SHN_COMMON)
1501                         sec_name = "COMMON";
1502                       else if ((elf_header.e_machine == EM_MIPS
1503                                 && psym->st_shndx == SHN_MIPS_SCOMMON)
1504                                || (elf_header.e_machine == EM_TI_C6000
1505                                    && psym->st_shndx == SHN_TIC6X_SCOMMON))
1506                         sec_name = "SCOMMON";
1507                       else if (elf_header.e_machine == EM_MIPS
1508                                && psym->st_shndx == SHN_MIPS_SUNDEFINED)
1509                         sec_name = "SUNDEF";
1510                       else if ((elf_header.e_machine == EM_X86_64
1511                                 || elf_header.e_machine == EM_L1OM
1512                                 || elf_header.e_machine == EM_K1OM)
1513                                && psym->st_shndx == SHN_X86_64_LCOMMON)
1514                         sec_name = "LARGE_COMMON";
1515                       else if (elf_header.e_machine == EM_IA_64
1516                                && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
1517                                && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1518                         sec_name = "ANSI_COM";
1519                       else if (is_ia64_vms ()
1520                                && psym->st_shndx == SHN_IA_64_VMS_SYMVEC)
1521                         sec_name = "VMS_SYMVEC";
1522                       else
1523                         {
1524                           sprintf (name_buf, "<section 0x%x>",
1525                                    (unsigned int) psym->st_shndx);
1526                           sec_name = name_buf;
1527                         }
1528                     }
1529                   print_symbol (22, sec_name);
1530                 }
1531               else if (strtab == NULL)
1532                 printf (_("<string table index: %3ld>"), psym->st_name);
1533               else if (psym->st_name >= strtablen)
1534                 printf (_("<corrupt string table index: %3ld>"), psym->st_name);
1535               else
1536                 print_symbol (22, strtab + psym->st_name);
1537
1538               if (is_rela)
1539                 {
1540                   bfd_signed_vma off = rels[i].r_addend;
1541
1542                   if (off < 0)
1543                     printf (" - %" BFD_VMA_FMT "x", - off);
1544                   else
1545                     printf (" + %" BFD_VMA_FMT "x", off);
1546                 }
1547             }
1548         }
1549       else if (is_rela)
1550         {
1551           bfd_signed_vma off = rels[i].r_addend;
1552
1553           printf ("%*c", is_32bit_elf ? 12 : 20, ' ');
1554           if (off < 0)
1555             printf ("-%" BFD_VMA_FMT "x", - off);
1556           else
1557             printf ("%" BFD_VMA_FMT "x", off);
1558         }
1559
1560       if (elf_header.e_machine == EM_SPARCV9
1561           && rtype != NULL
1562           && streq (rtype, "R_SPARC_OLO10"))
1563         printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf));
1564
1565       putchar ('\n');
1566
1567 #ifdef BFD64
1568       if (! is_32bit_elf && elf_header.e_machine == EM_MIPS)
1569         {
1570           bfd_vma type2 = ELF64_MIPS_R_TYPE2 (inf);
1571           bfd_vma type3 = ELF64_MIPS_R_TYPE3 (inf);
1572           const char * rtype2 = elf_mips_reloc_type (type2);
1573           const char * rtype3 = elf_mips_reloc_type (type3);
1574
1575           printf ("                    Type2: ");
1576
1577           if (rtype2 == NULL)
1578             printf (_("unrecognized: %-7lx"),
1579                     (unsigned long) type2 & 0xffffffff);
1580           else
1581             printf ("%-17.17s", rtype2);
1582
1583           printf ("\n                    Type3: ");
1584
1585           if (rtype3 == NULL)
1586             printf (_("unrecognized: %-7lx"),
1587                     (unsigned long) type3 & 0xffffffff);
1588           else
1589             printf ("%-17.17s", rtype3);
1590
1591           putchar ('\n');
1592         }
1593 #endif /* BFD64 */
1594     }
1595
1596   free (rels);
1597 }
1598
1599 static const char *
1600 get_mips_dynamic_type (unsigned long type)
1601 {
1602   switch (type)
1603     {
1604     case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1605     case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1606     case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1607     case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1608     case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1609     case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1610     case DT_MIPS_MSYM: return "MIPS_MSYM";
1611     case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1612     case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1613     case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1614     case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1615     case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1616     case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1617     case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1618     case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1619     case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1620     case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1621     case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1622     case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1623     case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1624     case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1625     case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1626     case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1627     case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1628     case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1629     case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1630     case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1631     case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1632     case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1633     case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1634     case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1635     case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1636     case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1637     case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1638     case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1639     case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1640     case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1641     case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1642     case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1643     case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1644     case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1645     case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1646     case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1647     case DT_MIPS_PLTGOT: return "MIPS_PLTGOT";
1648     case DT_MIPS_RWPLT: return "MIPS_RWPLT";
1649     default:
1650       return NULL;
1651     }
1652 }
1653
1654 static const char *
1655 get_sparc64_dynamic_type (unsigned long type)
1656 {
1657   switch (type)
1658     {
1659     case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1660     default:
1661       return NULL;
1662     }
1663 }
1664
1665 static const char *
1666 get_ppc_dynamic_type (unsigned long type)
1667 {
1668   switch (type)
1669     {
1670     case DT_PPC_GOT:    return "PPC_GOT";
1671     case DT_PPC_OPT:    return "PPC_OPT";
1672     default:
1673       return NULL;
1674     }
1675 }
1676
1677 static const char *
1678 get_ppc64_dynamic_type (unsigned long type)
1679 {
1680   switch (type)
1681     {
1682     case DT_PPC64_GLINK:  return "PPC64_GLINK";
1683     case DT_PPC64_OPD:    return "PPC64_OPD";
1684     case DT_PPC64_OPDSZ:  return "PPC64_OPDSZ";
1685     case DT_PPC64_OPT:    return "PPC64_OPT";
1686     default:
1687       return NULL;
1688     }
1689 }
1690
1691 static const char *
1692 get_parisc_dynamic_type (unsigned long type)
1693 {
1694   switch (type)
1695     {
1696     case DT_HP_LOAD_MAP:        return "HP_LOAD_MAP";
1697     case DT_HP_DLD_FLAGS:       return "HP_DLD_FLAGS";
1698     case DT_HP_DLD_HOOK:        return "HP_DLD_HOOK";
1699     case DT_HP_UX10_INIT:       return "HP_UX10_INIT";
1700     case DT_HP_UX10_INITSZ:     return "HP_UX10_INITSZ";
1701     case DT_HP_PREINIT:         return "HP_PREINIT";
1702     case DT_HP_PREINITSZ:       return "HP_PREINITSZ";
1703     case DT_HP_NEEDED:          return "HP_NEEDED";
1704     case DT_HP_TIME_STAMP:      return "HP_TIME_STAMP";
1705     case DT_HP_CHECKSUM:        return "HP_CHECKSUM";
1706     case DT_HP_GST_SIZE:        return "HP_GST_SIZE";
1707     case DT_HP_GST_VERSION:     return "HP_GST_VERSION";
1708     case DT_HP_GST_HASHVAL:     return "HP_GST_HASHVAL";
1709     case DT_HP_EPLTREL:         return "HP_GST_EPLTREL";
1710     case DT_HP_EPLTRELSZ:       return "HP_GST_EPLTRELSZ";
1711     case DT_HP_FILTERED:        return "HP_FILTERED";
1712     case DT_HP_FILTER_TLS:      return "HP_FILTER_TLS";
1713     case DT_HP_COMPAT_FILTERED: return "HP_COMPAT_FILTERED";
1714     case DT_HP_LAZYLOAD:        return "HP_LAZYLOAD";
1715     case DT_HP_BIND_NOW_COUNT:  return "HP_BIND_NOW_COUNT";
1716     case DT_PLT:                return "PLT";
1717     case DT_PLT_SIZE:           return "PLT_SIZE";
1718     case DT_DLT:                return "DLT";
1719     case DT_DLT_SIZE:           return "DLT_SIZE";
1720     default:
1721       return NULL;
1722     }
1723 }
1724
1725 static const char *
1726 get_ia64_dynamic_type (unsigned long type)
1727 {
1728   switch (type)
1729     {
1730     case DT_IA_64_PLT_RESERVE:         return "IA_64_PLT_RESERVE";
1731     case DT_IA_64_VMS_SUBTYPE:         return "VMS_SUBTYPE";
1732     case DT_IA_64_VMS_IMGIOCNT:        return "VMS_IMGIOCNT";
1733     case DT_IA_64_VMS_LNKFLAGS:        return "VMS_LNKFLAGS";
1734     case DT_IA_64_VMS_VIR_MEM_BLK_SIZ: return "VMS_VIR_MEM_BLK_SIZ";
1735     case DT_IA_64_VMS_IDENT:           return "VMS_IDENT";
1736     case DT_IA_64_VMS_NEEDED_IDENT:    return "VMS_NEEDED_IDENT";
1737     case DT_IA_64_VMS_IMG_RELA_CNT:    return "VMS_IMG_RELA_CNT";
1738     case DT_IA_64_VMS_SEG_RELA_CNT:    return "VMS_SEG_RELA_CNT";
1739     case DT_IA_64_VMS_FIXUP_RELA_CNT:  return "VMS_FIXUP_RELA_CNT";
1740     case DT_IA_64_VMS_FIXUP_NEEDED:    return "VMS_FIXUP_NEEDED";
1741     case DT_IA_64_VMS_SYMVEC_CNT:      return "VMS_SYMVEC_CNT";
1742     case DT_IA_64_VMS_XLATED:          return "VMS_XLATED";
1743     case DT_IA_64_VMS_STACKSIZE:       return "VMS_STACKSIZE";
1744     case DT_IA_64_VMS_UNWINDSZ:        return "VMS_UNWINDSZ";
1745     case DT_IA_64_VMS_UNWIND_CODSEG:   return "VMS_UNWIND_CODSEG";
1746     case DT_IA_64_VMS_UNWIND_INFOSEG:  return "VMS_UNWIND_INFOSEG";
1747     case DT_IA_64_VMS_LINKTIME:        return "VMS_LINKTIME";
1748     case DT_IA_64_VMS_SEG_NO:          return "VMS_SEG_NO";
1749     case DT_IA_64_VMS_SYMVEC_OFFSET:   return "VMS_SYMVEC_OFFSET";
1750     case DT_IA_64_VMS_SYMVEC_SEG:      return "VMS_SYMVEC_SEG";
1751     case DT_IA_64_VMS_UNWIND_OFFSET:   return "VMS_UNWIND_OFFSET";
1752     case DT_IA_64_VMS_UNWIND_SEG:      return "VMS_UNWIND_SEG";
1753     case DT_IA_64_VMS_STRTAB_OFFSET:   return "VMS_STRTAB_OFFSET";
1754     case DT_IA_64_VMS_SYSVER_OFFSET:   return "VMS_SYSVER_OFFSET";
1755     case DT_IA_64_VMS_IMG_RELA_OFF:    return "VMS_IMG_RELA_OFF";
1756     case DT_IA_64_VMS_SEG_RELA_OFF:    return "VMS_SEG_RELA_OFF";
1757     case DT_IA_64_VMS_FIXUP_RELA_OFF:  return "VMS_FIXUP_RELA_OFF";
1758     case DT_IA_64_VMS_PLTGOT_OFFSET:   return "VMS_PLTGOT_OFFSET";
1759     case DT_IA_64_VMS_PLTGOT_SEG:      return "VMS_PLTGOT_SEG";
1760     case DT_IA_64_VMS_FPMODE:          return "VMS_FPMODE";
1761     default:
1762       return NULL;
1763     }
1764 }
1765
1766 static const char *
1767 get_alpha_dynamic_type (unsigned long type)
1768 {
1769   switch (type)
1770     {
1771     case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
1772     default:
1773       return NULL;
1774     }
1775 }
1776
1777 static const char *
1778 get_score_dynamic_type (unsigned long type)
1779 {
1780   switch (type)
1781     {
1782     case DT_SCORE_BASE_ADDRESS: return "SCORE_BASE_ADDRESS";
1783     case DT_SCORE_LOCAL_GOTNO:  return "SCORE_LOCAL_GOTNO";
1784     case DT_SCORE_SYMTABNO:     return "SCORE_SYMTABNO";
1785     case DT_SCORE_GOTSYM:       return "SCORE_GOTSYM";
1786     case DT_SCORE_UNREFEXTNO:   return "SCORE_UNREFEXTNO";
1787     case DT_SCORE_HIPAGENO:     return "SCORE_HIPAGENO";
1788     default:
1789       return NULL;
1790     }
1791 }
1792
1793 static const char *
1794 get_tic6x_dynamic_type (unsigned long type)
1795 {
1796   switch (type)
1797     {
1798     case DT_C6000_GSYM_OFFSET: return "C6000_GSYM_OFFSET";
1799     case DT_C6000_GSTR_OFFSET: return "C6000_GSTR_OFFSET";
1800     case DT_C6000_DSBT_BASE:   return "C6000_DSBT_BASE";
1801     case DT_C6000_DSBT_SIZE:   return "C6000_DSBT_SIZE";
1802     case DT_C6000_PREEMPTMAP:  return "C6000_PREEMPTMAP";
1803     case DT_C6000_DSBT_INDEX:  return "C6000_DSBT_INDEX";
1804     default:
1805       return NULL;
1806     }
1807 }
1808
1809 static const char *
1810 get_nios2_dynamic_type (unsigned long type)
1811 {
1812   switch (type)
1813     {
1814     case DT_NIOS2_GP: return "NIOS2_GP";
1815     default:
1816       return NULL;
1817     }
1818 }
1819
1820 static const char *
1821 get_dynamic_type (unsigned long type)
1822 {
1823   static char buff[64];
1824
1825   switch (type)
1826     {
1827     case DT_NULL:       return "NULL";
1828     case DT_NEEDED:     return "NEEDED";
1829     case DT_PLTRELSZ:   return "PLTRELSZ";
1830     case DT_PLTGOT:     return "PLTGOT";
1831     case DT_HASH:       return "HASH";
1832     case DT_STRTAB:     return "STRTAB";
1833     case DT_SYMTAB:     return "SYMTAB";
1834     case DT_RELA:       return "RELA";
1835     case DT_RELASZ:     return "RELASZ";
1836     case DT_RELAENT:    return "RELAENT";
1837     case DT_STRSZ:      return "STRSZ";
1838     case DT_SYMENT:     return "SYMENT";
1839     case DT_INIT:       return "INIT";
1840     case DT_FINI:       return "FINI";
1841     case DT_SONAME:     return "SONAME";
1842     case DT_RPATH:      return "RPATH";
1843     case DT_SYMBOLIC:   return "SYMBOLIC";
1844     case DT_REL:        return "REL";
1845     case DT_RELSZ:      return "RELSZ";
1846     case DT_RELENT:     return "RELENT";
1847     case DT_PLTREL:     return "PLTREL";
1848     case DT_DEBUG:      return "DEBUG";
1849     case DT_TEXTREL:    return "TEXTREL";
1850     case DT_JMPREL:     return "JMPREL";
1851     case DT_BIND_NOW:   return "BIND_NOW";
1852     case DT_INIT_ARRAY: return "INIT_ARRAY";
1853     case DT_FINI_ARRAY: return "FINI_ARRAY";
1854     case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
1855     case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
1856     case DT_RUNPATH:    return "RUNPATH";
1857     case DT_FLAGS:      return "FLAGS";
1858
1859     case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1860     case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
1861
1862     case DT_CHECKSUM:   return "CHECKSUM";
1863     case DT_PLTPADSZ:   return "PLTPADSZ";
1864     case DT_MOVEENT:    return "MOVEENT";
1865     case DT_MOVESZ:     return "MOVESZ";
1866     case DT_FEATURE:    return "FEATURE";
1867     case DT_POSFLAG_1:  return "POSFLAG_1";
1868     case DT_SYMINSZ:    return "SYMINSZ";
1869     case DT_SYMINENT:   return "SYMINENT"; /* aka VALRNGHI */
1870
1871     case DT_ADDRRNGLO:  return "ADDRRNGLO";
1872     case DT_CONFIG:     return "CONFIG";
1873     case DT_DEPAUDIT:   return "DEPAUDIT";
1874     case DT_AUDIT:      return "AUDIT";
1875     case DT_PLTPAD:     return "PLTPAD";
1876     case DT_MOVETAB:    return "MOVETAB";
1877     case DT_SYMINFO:    return "SYMINFO"; /* aka ADDRRNGHI */
1878
1879     case DT_VERSYM:     return "VERSYM";
1880
1881     case DT_TLSDESC_GOT: return "TLSDESC_GOT";
1882     case DT_TLSDESC_PLT: return "TLSDESC_PLT";
1883     case DT_RELACOUNT:  return "RELACOUNT";
1884     case DT_RELCOUNT:   return "RELCOUNT";
1885     case DT_FLAGS_1:    return "FLAGS_1";
1886     case DT_VERDEF:     return "VERDEF";
1887     case DT_VERDEFNUM:  return "VERDEFNUM";
1888     case DT_VERNEED:    return "VERNEED";
1889     case DT_VERNEEDNUM: return "VERNEEDNUM";
1890
1891     case DT_AUXILIARY:  return "AUXILIARY";
1892     case DT_USED:       return "USED";
1893     case DT_FILTER:     return "FILTER";
1894
1895     case DT_GNU_PRELINKED: return "GNU_PRELINKED";
1896     case DT_GNU_CONFLICT: return "GNU_CONFLICT";
1897     case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
1898     case DT_GNU_LIBLIST: return "GNU_LIBLIST";
1899     case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
1900     case DT_GNU_HASH:   return "GNU_HASH";
1901
1902     default:
1903       if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
1904         {
1905           const char * result;
1906
1907           switch (elf_header.e_machine)
1908             {
1909             case EM_MIPS:
1910             case EM_MIPS_RS3_LE:
1911               result = get_mips_dynamic_type (type);
1912               break;
1913             case EM_SPARCV9:
1914               result = get_sparc64_dynamic_type (type);
1915               break;
1916             case EM_PPC:
1917               result = get_ppc_dynamic_type (type);
1918               break;
1919             case EM_PPC64:
1920               result = get_ppc64_dynamic_type (type);
1921               break;
1922             case EM_IA_64:
1923               result = get_ia64_dynamic_type (type);
1924               break;
1925             case EM_ALPHA:
1926               result = get_alpha_dynamic_type (type);
1927               break;
1928             case EM_SCORE:
1929               result = get_score_dynamic_type (type);
1930               break;
1931             case EM_TI_C6000:
1932               result = get_tic6x_dynamic_type (type);
1933               break;
1934             case EM_ALTERA_NIOS2:
1935               result = get_nios2_dynamic_type (type);
1936               break;
1937             default:
1938               result = NULL;
1939               break;
1940             }
1941
1942           if (result != NULL)
1943             return result;
1944
1945           snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
1946         }
1947       else if (((type >= DT_LOOS) && (type <= DT_HIOS))
1948                || (elf_header.e_machine == EM_PARISC
1949                    && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
1950         {
1951           const char * result;
1952
1953           switch (elf_header.e_machine)
1954             {
1955             case EM_PARISC:
1956               result = get_parisc_dynamic_type (type);
1957               break;
1958             case EM_IA_64:
1959               result = get_ia64_dynamic_type (type);
1960               break;
1961             default:
1962               result = NULL;
1963               break;
1964             }
1965
1966           if (result != NULL)
1967             return result;
1968
1969           snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
1970                     type);
1971         }
1972       else
1973         snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
1974
1975       return buff;
1976     }
1977 }
1978
1979 static char *
1980 get_file_type (unsigned e_type)
1981 {
1982   static char buff[32];
1983
1984   switch (e_type)
1985     {
1986     case ET_NONE:       return _("NONE (None)");
1987     case ET_REL:        return _("REL (Relocatable file)");
1988     case ET_EXEC:       return _("EXEC (Executable file)");
1989     case ET_DYN:        return _("DYN (Shared object file)");
1990     case ET_CORE:       return _("CORE (Core file)");
1991
1992     default:
1993       if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
1994         snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
1995       else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
1996         snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
1997       else
1998         snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
1999       return buff;
2000     }
2001 }
2002
2003 static char *
2004 get_machine_name (unsigned e_machine)
2005 {
2006   static char buff[64]; /* XXX */
2007
2008   switch (e_machine)
2009     {
2010     case EM_NONE:               return _("None");
2011     case EM_AARCH64:            return "AArch64";
2012     case EM_M32:                return "WE32100";
2013     case EM_SPARC:              return "Sparc";
2014     case EM_SPU:                return "SPU";
2015     case EM_386:                return "Intel 80386";
2016     case EM_68K:                return "MC68000";
2017     case EM_88K:                return "MC88000";
2018     case EM_486:                return "Intel 80486";
2019     case EM_860:                return "Intel 80860";
2020     case EM_MIPS:               return "MIPS R3000";
2021     case EM_S370:               return "IBM System/370";
2022     case EM_MIPS_RS3_LE:        return "MIPS R4000 big-endian";
2023     case EM_OLD_SPARCV9:        return "Sparc v9 (old)";
2024     case EM_PARISC:             return "HPPA";
2025     case EM_PPC_OLD:            return "Power PC (old)";
2026     case EM_SPARC32PLUS:        return "Sparc v8+" ;
2027     case EM_960:                return "Intel 90860";
2028     case EM_PPC:                return "PowerPC";
2029     case EM_PPC64:              return "PowerPC64";
2030     case EM_FR20:               return "Fujitsu FR20";
2031     case EM_RH32:               return "TRW RH32";
2032     case EM_MCORE:              return "MCORE";
2033     case EM_ARM:                return "ARM";
2034     case EM_OLD_ALPHA:          return "Digital Alpha (old)";
2035     case EM_SH:                 return "Renesas / SuperH SH";
2036     case EM_SPARCV9:            return "Sparc v9";
2037     case EM_TRICORE:            return "Siemens Tricore";
2038     case EM_ARC:                return "ARC";
2039     case EM_H8_300:             return "Renesas H8/300";
2040     case EM_H8_300H:            return "Renesas H8/300H";
2041     case EM_H8S:                return "Renesas H8S";
2042     case EM_H8_500:             return "Renesas H8/500";
2043     case EM_IA_64:              return "Intel IA-64";
2044     case EM_MIPS_X:             return "Stanford MIPS-X";
2045     case EM_COLDFIRE:           return "Motorola Coldfire";
2046     case EM_ALPHA:              return "Alpha";
2047     case EM_CYGNUS_D10V:
2048     case EM_D10V:               return "d10v";
2049     case EM_CYGNUS_D30V:
2050     case EM_D30V:               return "d30v";
2051     case EM_CYGNUS_M32R:
2052     case EM_M32R:               return "Renesas M32R (formerly Mitsubishi M32r)";
2053     case EM_CYGNUS_V850:
2054     case EM_V800:               return "Renesas V850 (using RH850 ABI)";
2055     case EM_V850:               return "Renesas V850";
2056     case EM_CYGNUS_MN10300:
2057     case EM_MN10300:            return "mn10300";
2058     case EM_CYGNUS_MN10200:
2059     case EM_MN10200:            return "mn10200";
2060     case EM_MOXIE:              return "Moxie";
2061     case EM_CYGNUS_FR30:
2062     case EM_FR30:               return "Fujitsu FR30";
2063     case EM_CYGNUS_FRV:         return "Fujitsu FR-V";
2064     case EM_PJ_OLD:
2065     case EM_PJ:                 return "picoJava";
2066     case EM_MMA:                return "Fujitsu Multimedia Accelerator";
2067     case EM_PCP:                return "Siemens PCP";
2068     case EM_NCPU:               return "Sony nCPU embedded RISC processor";
2069     case EM_NDR1:               return "Denso NDR1 microprocesspr";
2070     case EM_STARCORE:           return "Motorola Star*Core processor";
2071     case EM_ME16:               return "Toyota ME16 processor";
2072     case EM_ST100:              return "STMicroelectronics ST100 processor";
2073     case EM_TINYJ:              return "Advanced Logic Corp. TinyJ embedded processor";
2074     case EM_PDSP:               return "Sony DSP processor";
2075     case EM_PDP10:              return "Digital Equipment Corp. PDP-10";
2076     case EM_PDP11:              return "Digital Equipment Corp. PDP-11";
2077     case EM_FX66:               return "Siemens FX66 microcontroller";
2078     case EM_ST9PLUS:            return "STMicroelectronics ST9+ 8/16 bit microcontroller";
2079     case EM_ST7:                return "STMicroelectronics ST7 8-bit microcontroller";
2080     case EM_68HC16:             return "Motorola MC68HC16 Microcontroller";
2081     case EM_68HC12:             return "Motorola MC68HC12 Microcontroller";
2082     case EM_68HC11:             return "Motorola MC68HC11 Microcontroller";
2083     case EM_68HC08:             return "Motorola MC68HC08 Microcontroller";
2084     case EM_68HC05:             return "Motorola MC68HC05 Microcontroller";
2085     case EM_SVX:                return "Silicon Graphics SVx";
2086     case EM_ST19:               return "STMicroelectronics ST19 8-bit microcontroller";
2087     case EM_VAX:                return "Digital VAX";
2088     case EM_AVR_OLD:
2089     case EM_AVR:                return "Atmel AVR 8-bit microcontroller";
2090     case EM_CRIS:               return "Axis Communications 32-bit embedded processor";
2091     case EM_JAVELIN:            return "Infineon Technologies 32-bit embedded cpu";
2092     case EM_FIREPATH:           return "Element 14 64-bit DSP processor";
2093     case EM_ZSP:                return "LSI Logic's 16-bit DSP processor";
2094     case EM_MMIX:               return "Donald Knuth's educational 64-bit processor";
2095     case EM_HUANY:              return "Harvard Universitys's machine-independent object format";
2096     case EM_PRISM:              return "Vitesse Prism";
2097     case EM_X86_64:             return "Advanced Micro Devices X86-64";
2098     case EM_L1OM:               return "Intel L1OM";
2099     case EM_K1OM:               return "Intel K1OM";
2100     case EM_S390_OLD:
2101     case EM_S390:               return "IBM S/390";
2102     case EM_SCORE:              return "SUNPLUS S+Core";
2103     case EM_XSTORMY16:          return "Sanyo XStormy16 CPU core";
2104     case EM_OR1K:               return "OpenRISC 1000";
2105     case EM_ARC_A5:             return "ARC International ARCompact processor";
2106     case EM_CRX:                return "National Semiconductor CRX microprocessor";
2107     case EM_ADAPTEVA_EPIPHANY:  return "Adapteva EPIPHANY";
2108     case EM_DLX:                return "OpenDLX";
2109     case EM_IP2K_OLD:
2110     case EM_IP2K:               return "Ubicom IP2xxx 8-bit microcontrollers";
2111     case EM_IQ2000:             return "Vitesse IQ2000";
2112     case EM_XTENSA_OLD:
2113     case EM_XTENSA:             return "Tensilica Xtensa Processor";
2114     case EM_VIDEOCORE:          return "Alphamosaic VideoCore processor";
2115     case EM_TMM_GPP:            return "Thompson Multimedia General Purpose Processor";
2116     case EM_NS32K:              return "National Semiconductor 32000 series";
2117     case EM_TPC:                return "Tenor Network TPC processor";
2118     case EM_ST200:              return "STMicroelectronics ST200 microcontroller";
2119     case EM_MAX:                return "MAX Processor";
2120     case EM_CR:                 return "National Semiconductor CompactRISC";
2121     case EM_F2MC16:             return "Fujitsu F2MC16";
2122     case EM_MSP430:             return "Texas Instruments msp430 microcontroller";
2123     case EM_LATTICEMICO32:      return "Lattice Mico32";
2124     case EM_M32C_OLD:
2125     case EM_M32C:               return "Renesas M32c";
2126     case EM_MT:                 return "Morpho Techologies MT processor";
2127     case EM_BLACKFIN:           return "Analog Devices Blackfin";
2128     case EM_SE_C33:             return "S1C33 Family of Seiko Epson processors";
2129     case EM_SEP:                return "Sharp embedded microprocessor";
2130     case EM_ARCA:               return "Arca RISC microprocessor";
2131     case EM_UNICORE:            return "Unicore";
2132     case EM_EXCESS:             return "eXcess 16/32/64-bit configurable embedded CPU";
2133     case EM_DXP:                return "Icera Semiconductor Inc. Deep Execution Processor";
2134     case EM_NIOS32:             return "Altera Nios";
2135     case EM_ALTERA_NIOS2:       return "Altera Nios II";
2136     case EM_C166:
2137     case EM_XC16X:              return "Infineon Technologies xc16x";
2138     case EM_M16C:               return "Renesas M16C series microprocessors";
2139     case EM_DSPIC30F:           return "Microchip Technology dsPIC30F Digital Signal Controller";
2140     case EM_CE:                 return "Freescale Communication Engine RISC core";
2141     case EM_TSK3000:            return "Altium TSK3000 core";
2142     case EM_RS08:               return "Freescale RS08 embedded processor";
2143     case EM_ECOG2:              return "Cyan Technology eCOG2 microprocessor";
2144     case EM_DSP24:              return "New Japan Radio (NJR) 24-bit DSP Processor";
2145     case EM_VIDEOCORE3:         return "Broadcom VideoCore III processor";
2146     case EM_SE_C17:             return "Seiko Epson C17 family";
2147     case EM_TI_C6000:           return "Texas Instruments TMS320C6000 DSP family";
2148     case EM_TI_C2000:           return "Texas Instruments TMS320C2000 DSP family";
2149     case EM_TI_C5500:           return "Texas Instruments TMS320C55x DSP family";
2150     case EM_MMDSP_PLUS:         return "STMicroelectronics 64bit VLIW Data Signal Processor";
2151     case EM_CYPRESS_M8C:        return "Cypress M8C microprocessor";
2152     case EM_R32C:               return "Renesas R32C series microprocessors";
2153     case EM_TRIMEDIA:           return "NXP Semiconductors TriMedia architecture family";
2154     case EM_QDSP6:              return "QUALCOMM DSP6 Processor";
2155     case EM_8051:               return "Intel 8051 and variants";
2156     case EM_STXP7X:             return "STMicroelectronics STxP7x family";
2157     case EM_NDS32:              return "Andes Technology compact code size embedded RISC processor family";
2158     case EM_ECOG1X:             return "Cyan Technology eCOG1X family";
2159     case EM_MAXQ30:             return "Dallas Semiconductor MAXQ30 Core microcontrollers";
2160     case EM_XIMO16:             return "New Japan Radio (NJR) 16-bit DSP Processor";
2161     case EM_MANIK:              return "M2000 Reconfigurable RISC Microprocessor";
2162     case EM_CRAYNV2:            return "Cray Inc. NV2 vector architecture";
2163     case EM_CYGNUS_MEP:         return "Toshiba MeP Media Engine";
2164     case EM_CR16:
2165     case EM_MICROBLAZE:
2166     case EM_MICROBLAZE_OLD:     return "Xilinx MicroBlaze";
2167     case EM_RL78:               return "Renesas RL78";
2168     case EM_RX:                 return "Renesas RX";
2169     case EM_METAG:              return "Imagination Technologies Meta processor architecture";
2170     case EM_MCST_ELBRUS:        return "MCST Elbrus general purpose hardware architecture";
2171     case EM_ECOG16:             return "Cyan Technology eCOG16 family";
2172     case EM_ETPU:               return "Freescale Extended Time Processing Unit";
2173     case EM_SLE9X:              return "Infineon Technologies SLE9X core";
2174     case EM_AVR32:              return "Atmel Corporation 32-bit microprocessor family";
2175     case EM_STM8:               return "STMicroeletronics STM8 8-bit microcontroller";
2176     case EM_TILE64:             return "Tilera TILE64 multicore architecture family";
2177     case EM_TILEPRO:            return "Tilera TILEPro multicore architecture family";
2178     case EM_TILEGX:             return "Tilera TILE-Gx multicore architecture family";
2179     case EM_CUDA:               return "NVIDIA CUDA architecture";
2180     case EM_XGATE:              return "Motorola XGATE embedded processor";
2181     default:
2182       snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
2183       return buff;
2184     }
2185 }
2186
2187 static void
2188 decode_ARM_machine_flags (unsigned e_flags, char buf[])
2189 {
2190   unsigned eabi;
2191   int unknown = 0;
2192
2193   eabi = EF_ARM_EABI_VERSION (e_flags);
2194   e_flags &= ~ EF_ARM_EABIMASK;
2195
2196   /* Handle "generic" ARM flags.  */
2197   if (e_flags & EF_ARM_RELEXEC)
2198     {
2199       strcat (buf, ", relocatable executable");
2200       e_flags &= ~ EF_ARM_RELEXEC;
2201     }
2202
2203   if (e_flags & EF_ARM_HASENTRY)
2204     {
2205       strcat (buf, ", has entry point");
2206       e_flags &= ~ EF_ARM_HASENTRY;
2207     }
2208
2209   /* Now handle EABI specific flags.  */
2210   switch (eabi)
2211     {
2212     default:
2213       strcat (buf, ", <unrecognized EABI>");
2214       if (e_flags)
2215         unknown = 1;
2216       break;
2217
2218     case EF_ARM_EABI_VER1:
2219       strcat (buf, ", Version1 EABI");
2220       while (e_flags)
2221         {
2222           unsigned flag;
2223
2224           /* Process flags one bit at a time.  */
2225           flag = e_flags & - e_flags;
2226           e_flags &= ~ flag;
2227
2228           switch (flag)
2229             {
2230             case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK.  */
2231               strcat (buf, ", sorted symbol tables");
2232               break;
2233
2234             default:
2235               unknown = 1;
2236               break;
2237             }
2238         }
2239       break;
2240
2241     case EF_ARM_EABI_VER2:
2242       strcat (buf, ", Version2 EABI");
2243       while (e_flags)
2244         {
2245           unsigned flag;
2246
2247           /* Process flags one bit at a time.  */
2248           flag = e_flags & - e_flags;
2249           e_flags &= ~ flag;
2250
2251           switch (flag)
2252             {
2253             case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK.  */
2254               strcat (buf, ", sorted symbol tables");
2255               break;
2256
2257             case EF_ARM_DYNSYMSUSESEGIDX:
2258               strcat (buf, ", dynamic symbols use segment index");
2259               break;
2260
2261             case EF_ARM_MAPSYMSFIRST:
2262               strcat (buf, ", mapping symbols precede others");
2263               break;
2264
2265             default:
2266               unknown = 1;
2267               break;
2268             }
2269         }
2270       break;
2271
2272     case EF_ARM_EABI_VER3:
2273       strcat (buf, ", Version3 EABI");
2274       break;
2275
2276     case EF_ARM_EABI_VER4:
2277       strcat (buf, ", Version4 EABI");
2278       while (e_flags)
2279         {
2280           unsigned flag;
2281
2282           /* Process flags one bit at a time.  */
2283           flag = e_flags & - e_flags;
2284           e_flags &= ~ flag;
2285
2286           switch (flag)
2287             {
2288             case EF_ARM_BE8:
2289               strcat (buf, ", BE8");
2290               break;
2291
2292             case EF_ARM_LE8:
2293               strcat (buf, ", LE8");
2294               break;
2295
2296             default:
2297               unknown = 1;
2298               break;
2299             }
2300       break;
2301         }
2302       break;
2303
2304     case EF_ARM_EABI_VER5:
2305       strcat (buf, ", Version5 EABI");
2306       while (e_flags)
2307         {
2308           unsigned flag;
2309
2310           /* Process flags one bit at a time.  */
2311           flag = e_flags & - e_flags;
2312           e_flags &= ~ flag;
2313
2314           switch (flag)
2315             {
2316             case EF_ARM_BE8:
2317               strcat (buf, ", BE8");
2318               break;
2319
2320             case EF_ARM_LE8:
2321               strcat (buf, ", LE8");
2322               break;
2323
2324             case EF_ARM_ABI_FLOAT_SOFT: /* Conflicts with EF_ARM_SOFT_FLOAT.  */
2325               strcat (buf, ", soft-float ABI");
2326               break;
2327
2328             case EF_ARM_ABI_FLOAT_HARD: /* Conflicts with EF_ARM_VFP_FLOAT.  */
2329               strcat (buf, ", hard-float ABI");
2330               break;
2331
2332             default:
2333               unknown = 1;
2334               break;
2335             }
2336         }
2337       break;
2338
2339     case EF_ARM_EABI_UNKNOWN:
2340       strcat (buf, ", GNU EABI");
2341       while (e_flags)
2342         {
2343           unsigned flag;
2344
2345           /* Process flags one bit at a time.  */
2346           flag = e_flags & - e_flags;
2347           e_flags &= ~ flag;
2348
2349           switch (flag)
2350             {
2351             case EF_ARM_INTERWORK:
2352               strcat (buf, ", interworking enabled");
2353               break;
2354
2355             case EF_ARM_APCS_26:
2356               strcat (buf, ", uses APCS/26");
2357               break;
2358
2359             case EF_ARM_APCS_FLOAT:
2360               strcat (buf, ", uses APCS/float");
2361               break;
2362
2363             case EF_ARM_PIC:
2364               strcat (buf, ", position independent");
2365               break;
2366
2367             case EF_ARM_ALIGN8:
2368               strcat (buf, ", 8 bit structure alignment");
2369               break;
2370
2371             case EF_ARM_NEW_ABI:
2372               strcat (buf, ", uses new ABI");
2373               break;
2374
2375             case EF_ARM_OLD_ABI:
2376               strcat (buf, ", uses old ABI");
2377               break;
2378
2379             case EF_ARM_SOFT_FLOAT:
2380               strcat (buf, ", software FP");
2381               break;
2382
2383             case EF_ARM_VFP_FLOAT:
2384               strcat (buf, ", VFP");
2385               break;
2386
2387             case EF_ARM_MAVERICK_FLOAT:
2388               strcat (buf, ", Maverick FP");
2389               break;
2390
2391             default:
2392               unknown = 1;
2393               break;
2394             }
2395         }
2396     }
2397
2398   if (unknown)
2399     strcat (buf,_(", <unknown>"));
2400 }
2401
2402 static void
2403 decode_NDS32_machine_flags (unsigned e_flags, char buf[], size_t size)
2404 {
2405   unsigned abi;
2406   unsigned arch;
2407   unsigned config;
2408   unsigned version;
2409   int has_fpu = 0;
2410   int r = 0;
2411
2412   static const char *ABI_STRINGS[] =
2413   {
2414     "ABI v0", /* use r5 as return register; only used in N1213HC */
2415     "ABI v1", /* use r0 as return register */
2416     "ABI v2", /* use r0 as return register and don't reserve 24 bytes for arguments */
2417     "ABI v2fp", /* for FPU */
2418     "AABI",
2419     "ABI2 FP+"
2420   };
2421   static const char *VER_STRINGS[] =
2422   {
2423     "Andes ELF V1.3 or older",
2424     "Andes ELF V1.3.1",
2425     "Andes ELF V1.4"
2426   };
2427   static const char *ARCH_STRINGS[] =
2428   {
2429     "",
2430     "Andes Star v1.0",
2431     "Andes Star v2.0",
2432     "Andes Star v3.0",
2433     "Andes Star v3.0m"
2434   };
2435
2436   abi = EF_NDS_ABI & e_flags;
2437   arch = EF_NDS_ARCH & e_flags;
2438   config = EF_NDS_INST & e_flags;
2439   version = EF_NDS32_ELF_VERSION & e_flags;
2440
2441   memset (buf, 0, size);
2442
2443   switch (abi)
2444     {
2445     case E_NDS_ABI_V0:
2446     case E_NDS_ABI_V1:
2447     case E_NDS_ABI_V2:
2448     case E_NDS_ABI_V2FP:
2449     case E_NDS_ABI_AABI:
2450     case E_NDS_ABI_V2FP_PLUS:
2451       /* In case there are holes in the array.  */
2452       r += snprintf (buf + r, size - r, ", %s", ABI_STRINGS[abi >> EF_NDS_ABI_SHIFT]);
2453       break;
2454
2455     default:
2456       r += snprintf (buf + r, size - r, ", <unrecognized ABI>");
2457       break;
2458     }
2459
2460   switch (version)
2461     {
2462     case E_NDS32_ELF_VER_1_2:
2463     case E_NDS32_ELF_VER_1_3:
2464     case E_NDS32_ELF_VER_1_4:
2465       r += snprintf (buf + r, size - r, ", %s", VER_STRINGS[version >> EF_NDS32_ELF_VERSION_SHIFT]);
2466       break;
2467
2468     default:
2469       r += snprintf (buf + r, size - r, ", <unrecognized ELF version number>");
2470       break;
2471     }
2472
2473   if (E_NDS_ABI_V0 == abi)
2474     {
2475       /* OLD ABI; only used in N1213HC, has performance extension 1.  */
2476       r += snprintf (buf + r, size - r, ", Andes Star v1.0, N1213HC, MAC, PERF1");
2477       if (arch == E_NDS_ARCH_STAR_V1_0)
2478         r += snprintf (buf + r, size -r, ", 16b"); /* has 16-bit instructions */
2479       return;
2480     }
2481
2482   switch (arch)
2483     {
2484     case E_NDS_ARCH_STAR_V1_0:
2485     case E_NDS_ARCH_STAR_V2_0:
2486     case E_NDS_ARCH_STAR_V3_0:
2487     case E_NDS_ARCH_STAR_V3_M:
2488       r += snprintf (buf + r, size - r, ", %s", ARCH_STRINGS[arch >> EF_NDS_ARCH_SHIFT]);
2489       break;
2490
2491     default:
2492       r += snprintf (buf + r, size - r, ", <unrecognized architecture>");
2493       /* ARCH version determines how the e_flags are interpreted.
2494          If it is unknown, we cannot proceed.  */
2495       return;
2496     }
2497
2498   /* Newer ABI; Now handle architecture specific flags.  */
2499   if (arch == E_NDS_ARCH_STAR_V1_0)
2500     {
2501       if (config & E_NDS32_HAS_MFUSR_PC_INST)
2502         r += snprintf (buf + r, size -r, ", MFUSR_PC");
2503
2504       if (!(config & E_NDS32_HAS_NO_MAC_INST))
2505         r += snprintf (buf + r, size -r, ", MAC");
2506
2507       if (config & E_NDS32_HAS_DIV_INST)
2508         r += snprintf (buf + r, size -r, ", DIV");
2509
2510       if (config & E_NDS32_HAS_16BIT_INST)
2511         r += snprintf (buf + r, size -r, ", 16b");
2512     }
2513   else
2514     {
2515       if (config & E_NDS32_HAS_MFUSR_PC_INST)
2516         {
2517           if (version <= E_NDS32_ELF_VER_1_3)
2518             r += snprintf (buf + r, size -r, ", [B8]");
2519           else
2520             r += snprintf (buf + r, size -r, ", EX9");
2521         }
2522
2523       if (config & E_NDS32_HAS_MAC_DX_INST)
2524         r += snprintf (buf + r, size -r, ", MAC_DX");
2525
2526       if (config & E_NDS32_HAS_DIV_DX_INST)
2527         r += snprintf (buf + r, size -r, ", DIV_DX");
2528
2529       if (config & E_NDS32_HAS_16BIT_INST)
2530         {
2531           if (version <= E_NDS32_ELF_VER_1_3)
2532             r += snprintf (buf + r, size -r, ", 16b");
2533           else
2534             r += snprintf (buf + r, size -r, ", IFC");
2535         }
2536     }
2537
2538   if (config & E_NDS32_HAS_EXT_INST)
2539     r += snprintf (buf + r, size -r, ", PERF1");
2540
2541   if (config & E_NDS32_HAS_EXT2_INST)
2542     r += snprintf (buf + r, size -r, ", PERF2");
2543
2544   if (config & E_NDS32_HAS_FPU_INST)
2545     {
2546       has_fpu = 1;
2547       r += snprintf (buf + r, size -r, ", FPU_SP");
2548     }
2549
2550   if (config & E_NDS32_HAS_FPU_DP_INST)
2551     {
2552       has_fpu = 1;
2553       r += snprintf (buf + r, size -r, ", FPU_DP");
2554     }
2555
2556   if (config & E_NDS32_HAS_FPU_MAC_INST)
2557     {
2558       has_fpu = 1;
2559       r += snprintf (buf + r, size -r, ", FPU_MAC");
2560     }
2561
2562   if (has_fpu)
2563     {
2564       switch ((config & E_NDS32_FPU_REG_CONF) >> E_NDS32_FPU_REG_CONF_SHIFT)
2565         {
2566         case E_NDS32_FPU_REG_8SP_4DP:
2567           r += snprintf (buf + r, size -r, ", FPU_REG:8/4");
2568           break;
2569         case E_NDS32_FPU_REG_16SP_8DP:
2570           r += snprintf (buf + r, size -r, ", FPU_REG:16/8");
2571           break;
2572         case E_NDS32_FPU_REG_32SP_16DP:
2573           r += snprintf (buf + r, size -r, ", FPU_REG:32/16");
2574           break;
2575         case E_NDS32_FPU_REG_32SP_32DP:
2576           r += snprintf (buf + r, size -r, ", FPU_REG:32/32");
2577           break;
2578         }
2579     }
2580
2581   if (config & E_NDS32_HAS_AUDIO_INST)
2582     r += snprintf (buf + r, size -r, ", AUDIO");
2583
2584   if (config & E_NDS32_HAS_STRING_INST)
2585     r += snprintf (buf + r, size -r, ", STR");
2586
2587   if (config & E_NDS32_HAS_REDUCED_REGS)
2588     r += snprintf (buf + r, size -r, ", 16REG");
2589
2590   if (config & E_NDS32_HAS_VIDEO_INST)
2591     {
2592       if (version <= E_NDS32_ELF_VER_1_3)
2593         r += snprintf (buf + r, size -r, ", VIDEO");
2594       else
2595         r += snprintf (buf + r, size -r, ", SATURATION");
2596     }
2597
2598   if (config & E_NDS32_HAS_ENCRIPT_INST)
2599     r += snprintf (buf + r, size -r, ", ENCRP");
2600
2601   if (config & E_NDS32_HAS_L2C_INST)
2602     r += snprintf (buf + r, size -r, ", L2C");
2603 }
2604
2605 static char *
2606 get_machine_flags (unsigned e_flags, unsigned e_machine)
2607 {
2608   static char buf[1024];
2609
2610   buf[0] = '\0';
2611
2612   if (e_flags)
2613     {
2614       switch (e_machine)
2615         {
2616         default:
2617           break;
2618
2619         case EM_ARM:
2620           decode_ARM_machine_flags (e_flags, buf);
2621           break;
2622
2623         case EM_BLACKFIN:
2624           if (e_flags & EF_BFIN_PIC)
2625             strcat (buf, ", PIC");
2626
2627           if (e_flags & EF_BFIN_FDPIC)
2628             strcat (buf, ", FDPIC");
2629
2630           if (e_flags & EF_BFIN_CODE_IN_L1)
2631             strcat (buf, ", code in L1");
2632
2633           if (e_flags & EF_BFIN_DATA_IN_L1)
2634             strcat (buf, ", data in L1");
2635
2636           break;
2637
2638         case EM_CYGNUS_FRV:
2639           switch (e_flags & EF_FRV_CPU_MASK)
2640             {
2641             case EF_FRV_CPU_GENERIC:
2642               break;
2643
2644             default:
2645               strcat (buf, ", fr???");
2646               break;
2647
2648             case EF_FRV_CPU_FR300:
2649               strcat (buf, ", fr300");
2650               break;
2651
2652             case EF_FRV_CPU_FR400:
2653               strcat (buf, ", fr400");
2654               break;
2655             case EF_FRV_CPU_FR405:
2656               strcat (buf, ", fr405");
2657               break;
2658
2659             case EF_FRV_CPU_FR450:
2660               strcat (buf, ", fr450");
2661               break;
2662
2663             case EF_FRV_CPU_FR500:
2664               strcat (buf, ", fr500");
2665               break;
2666             case EF_FRV_CPU_FR550:
2667               strcat (buf, ", fr550");
2668               break;
2669
2670             case EF_FRV_CPU_SIMPLE:
2671               strcat (buf, ", simple");
2672               break;
2673             case EF_FRV_CPU_TOMCAT:
2674               strcat (buf, ", tomcat");
2675               break;
2676             }
2677           break;
2678
2679         case EM_68K:
2680           if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
2681             strcat (buf, ", m68000");
2682           else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
2683             strcat (buf, ", cpu32");
2684           else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
2685             strcat (buf, ", fido_a");
2686           else
2687             {
2688               char const * isa = _("unknown");
2689               char const * mac = _("unknown mac");
2690               char const * additional = NULL;
2691
2692               switch (e_flags & EF_M68K_CF_ISA_MASK)
2693                 {
2694                 case EF_M68K_CF_ISA_A_NODIV:
2695                   isa = "A";
2696                   additional = ", nodiv";
2697                   break;
2698                 case EF_M68K_CF_ISA_A:
2699                   isa = "A";
2700                   break;
2701                 case EF_M68K_CF_ISA_A_PLUS:
2702                   isa = "A+";
2703                   break;
2704                 case EF_M68K_CF_ISA_B_NOUSP:
2705                   isa = "B";
2706                   additional = ", nousp";
2707                   break;
2708                 case EF_M68K_CF_ISA_B:
2709                   isa = "B";
2710                   break;
2711                 case EF_M68K_CF_ISA_C:
2712                   isa = "C";
2713                   break;
2714                 case EF_M68K_CF_ISA_C_NODIV:
2715                   isa = "C";
2716                   additional = ", nodiv";
2717                   break;
2718                 }
2719               strcat (buf, ", cf, isa ");
2720               strcat (buf, isa);
2721               if (additional)
2722                 strcat (buf, additional);
2723               if (e_flags & EF_M68K_CF_FLOAT)
2724                 strcat (buf, ", float");
2725               switch (e_flags & EF_M68K_CF_MAC_MASK)
2726                 {
2727                 case 0:
2728                   mac = NULL;
2729                   break;
2730                 case EF_M68K_CF_MAC:
2731                   mac = "mac";
2732                   break;
2733                 case EF_M68K_CF_EMAC:
2734                   mac = "emac";
2735                   break;
2736                 case EF_M68K_CF_EMAC_B:
2737                   mac = "emac_b";
2738                   break;
2739                 }
2740               if (mac)
2741                 {
2742                   strcat (buf, ", ");
2743                   strcat (buf, mac);
2744                 }
2745             }
2746           break;
2747
2748         case EM_PPC:
2749           if (e_flags & EF_PPC_EMB)
2750             strcat (buf, ", emb");
2751
2752           if (e_flags & EF_PPC_RELOCATABLE)
2753             strcat (buf, _(", relocatable"));
2754
2755           if (e_flags & EF_PPC_RELOCATABLE_LIB)
2756             strcat (buf, _(", relocatable-lib"));
2757           break;
2758
2759         case EM_PPC64:
2760           if (e_flags & EF_PPC64_ABI)
2761             {
2762               char abi[] = ", abiv0";
2763
2764               abi[6] += e_flags & EF_PPC64_ABI;
2765               strcat (buf, abi);
2766             }
2767           break;
2768
2769         case EM_V800:
2770           if ((e_flags & EF_RH850_ABI) == EF_RH850_ABI)
2771             strcat (buf, ", RH850 ABI");
2772
2773           if (e_flags & EF_V800_850E3)
2774             strcat (buf, ", V3 architecture");
2775
2776           if ((e_flags & (EF_RH850_FPU_DOUBLE | EF_RH850_FPU_SINGLE)) == 0)
2777             strcat (buf, ", FPU not used");
2778
2779           if ((e_flags & (EF_RH850_REGMODE22 | EF_RH850_REGMODE32)) == 0)
2780             strcat (buf, ", regmode: COMMON");
2781
2782           if ((e_flags & (EF_RH850_GP_FIX | EF_RH850_GP_NOFIX)) == 0)
2783             strcat (buf, ", r4 not used");
2784
2785           if ((e_flags & (EF_RH850_EP_FIX | EF_RH850_EP_NOFIX)) == 0)
2786             strcat (buf, ", r30 not used");
2787
2788           if ((e_flags & (EF_RH850_TP_FIX | EF_RH850_TP_NOFIX)) == 0)
2789             strcat (buf, ", r5 not used");
2790
2791           if ((e_flags & (EF_RH850_REG2_RESERVE | EF_RH850_REG2_NORESERVE)) == 0)
2792             strcat (buf, ", r2 not used");
2793
2794           for (e_flags &= 0xFFFF; e_flags; e_flags &= ~ (e_flags & - e_flags))
2795             {
2796               switch (e_flags & - e_flags)
2797                 {
2798                 case EF_RH850_FPU_DOUBLE: strcat (buf, ", double precision FPU"); break;
2799                 case EF_RH850_FPU_SINGLE: strcat (buf, ", single precision FPU"); break;
2800                 case EF_RH850_SIMD: strcat (buf, ", SIMD"); break;
2801                 case EF_RH850_CACHE: strcat (buf, ", CACHE"); break;
2802                 case EF_RH850_MMU: strcat (buf, ", MMU"); break;
2803                 case EF_RH850_REGMODE22: strcat (buf, ", regmode:22"); break;
2804                 case EF_RH850_REGMODE32: strcat (buf, ", regmode:23"); break;
2805                 case EF_RH850_DATA_ALIGN8: strcat (buf, ", 8-byte alignment"); break;
2806                 case EF_RH850_GP_FIX: strcat (buf, ", r4 fixed"); break;
2807                 case EF_RH850_GP_NOFIX: strcat (buf, ", r4 free"); break;
2808                 case EF_RH850_EP_FIX: strcat (buf, ", r30 fixed"); break;
2809                 case EF_RH850_EP_NOFIX: strcat (buf, ", r30 free"); break;
2810                 case EF_RH850_TP_FIX: strcat (buf, ", r5 fixed"); break;
2811                 case EF_RH850_TP_NOFIX: strcat (buf, ", r5 free"); break;
2812                 case EF_RH850_REG2_RESERVE: strcat (buf, ", r2 fixed"); break;
2813                 case EF_RH850_REG2_NORESERVE: strcat (buf, ", r2 free"); break;
2814                 default: break;
2815                 }
2816             }
2817           break;
2818
2819         case EM_V850:
2820         case EM_CYGNUS_V850:
2821           switch (e_flags & EF_V850_ARCH)
2822             {
2823             case E_V850E3V5_ARCH:
2824               strcat (buf, ", v850e3v5");
2825               break;
2826             case E_V850E2V3_ARCH:
2827               strcat (buf, ", v850e2v3");
2828               break;
2829             case E_V850E2_ARCH:
2830               strcat (buf, ", v850e2");
2831               break;
2832             case E_V850E1_ARCH:
2833               strcat (buf, ", v850e1");
2834               break;
2835             case E_V850E_ARCH:
2836               strcat (buf, ", v850e");
2837               break;
2838             case E_V850_ARCH:
2839               strcat (buf, ", v850");
2840               break;
2841             default:
2842               strcat (buf, _(", unknown v850 architecture variant"));
2843               break;
2844             }
2845           break;
2846
2847         case EM_M32R:
2848         case EM_CYGNUS_M32R:
2849           if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
2850             strcat (buf, ", m32r");
2851           break;
2852
2853         case EM_MIPS:
2854         case EM_MIPS_RS3_LE:
2855           if (e_flags & EF_MIPS_NOREORDER)
2856             strcat (buf, ", noreorder");
2857
2858           if (e_flags & EF_MIPS_PIC)
2859             strcat (buf, ", pic");
2860
2861           if (e_flags & EF_MIPS_CPIC)
2862             strcat (buf, ", cpic");
2863
2864           if (e_flags & EF_MIPS_UCODE)
2865             strcat (buf, ", ugen_reserved");
2866
2867           if (e_flags & EF_MIPS_ABI2)
2868             strcat (buf, ", abi2");
2869
2870           if (e_flags & EF_MIPS_OPTIONS_FIRST)
2871             strcat (buf, ", odk first");
2872
2873           if (e_flags & EF_MIPS_32BITMODE)
2874             strcat (buf, ", 32bitmode");
2875
2876           if (e_flags & EF_MIPS_NAN2008)
2877             strcat (buf, ", nan2008");
2878
2879           if (e_flags & EF_MIPS_FP64)
2880             strcat (buf, ", fp64");
2881
2882           switch ((e_flags & EF_MIPS_MACH))
2883             {
2884             case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
2885             case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
2886             case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
2887             case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
2888             case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
2889             case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
2890             case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
2891             case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
2892             case E_MIPS_MACH_SB1:  strcat (buf, ", sb1");  break;
2893             case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
2894             case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break;
2895             case E_MIPS_MACH_LS2F: strcat (buf, ", loongson-2f"); break;
2896             case E_MIPS_MACH_LS3A: strcat (buf, ", loongson-3a"); break;
2897             case E_MIPS_MACH_OCTEON: strcat (buf, ", octeon"); break;
2898             case E_MIPS_MACH_OCTEON2: strcat (buf, ", octeon2"); break;
2899             case E_MIPS_MACH_OCTEON3: strcat (buf, ", octeon3"); break;
2900             case E_MIPS_MACH_XLR:  strcat (buf, ", xlr"); break;
2901             case 0:
2902             /* We simply ignore the field in this case to avoid confusion:
2903                MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
2904                extension.  */
2905               break;
2906             default: strcat (buf, _(", unknown CPU")); break;
2907             }
2908
2909           switch ((e_flags & EF_MIPS_ABI))
2910             {
2911             case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
2912             case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
2913             case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
2914             case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
2915             case 0:
2916             /* We simply ignore the field in this case to avoid confusion:
2917                MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
2918                This means it is likely to be an o32 file, but not for
2919                sure.  */
2920               break;
2921             default: strcat (buf, _(", unknown ABI")); break;
2922             }
2923
2924           if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
2925             strcat (buf, ", mdmx");
2926
2927           if (e_flags & EF_MIPS_ARCH_ASE_M16)
2928             strcat (buf, ", mips16");
2929
2930           if (e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
2931             strcat (buf, ", micromips");
2932
2933           switch ((e_flags & EF_MIPS_ARCH))
2934             {
2935             case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
2936             case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
2937             case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
2938             case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
2939             case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
2940             case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
2941             case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
2942             case E_MIPS_ARCH_32R6: strcat (buf, ", mips32r6"); break;
2943             case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
2944             case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
2945             case E_MIPS_ARCH_64R6: strcat (buf, ", mips64r6"); break;
2946             default: strcat (buf, _(", unknown ISA")); break;
2947             }
2948           break;
2949
2950         case EM_NDS32:
2951           decode_NDS32_machine_flags (e_flags, buf, sizeof buf);
2952           break;
2953
2954         case EM_SH:
2955           switch ((e_flags & EF_SH_MACH_MASK))
2956             {
2957             case EF_SH1: strcat (buf, ", sh1"); break;
2958             case EF_SH2: strcat (buf, ", sh2"); break;
2959             case EF_SH3: strcat (buf, ", sh3"); break;
2960             case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
2961             case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
2962             case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
2963             case EF_SH3E: strcat (buf, ", sh3e"); break;
2964             case EF_SH4: strcat (buf, ", sh4"); break;
2965             case EF_SH5: strcat (buf, ", sh5"); break;
2966             case EF_SH2E: strcat (buf, ", sh2e"); break;
2967             case EF_SH4A: strcat (buf, ", sh4a"); break;
2968             case EF_SH2A: strcat (buf, ", sh2a"); break;
2969             case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
2970             case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
2971             case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
2972             case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
2973             case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
2974             case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
2975             case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
2976             case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
2977             case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
2978             default: strcat (buf, _(", unknown ISA")); break;
2979             }
2980
2981           if (e_flags & EF_SH_PIC)
2982             strcat (buf, ", pic");
2983
2984           if (e_flags & EF_SH_FDPIC)
2985             strcat (buf, ", fdpic");
2986           break;
2987           
2988         case EM_OR1K:
2989           if (e_flags & EF_OR1K_NODELAY)
2990             strcat (buf, ", no delay");
2991           break;
2992
2993         case EM_SPARCV9:
2994           if (e_flags & EF_SPARC_32PLUS)
2995             strcat (buf, ", v8+");
2996
2997           if (e_flags & EF_SPARC_SUN_US1)
2998             strcat (buf, ", ultrasparcI");
2999
3000           if (e_flags & EF_SPARC_SUN_US3)
3001             strcat (buf, ", ultrasparcIII");
3002
3003           if (e_flags & EF_SPARC_HAL_R1)
3004             strcat (buf, ", halr1");
3005
3006           if (e_flags & EF_SPARC_LEDATA)
3007             strcat (buf, ", ledata");
3008
3009           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
3010             strcat (buf, ", tso");
3011
3012           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
3013             strcat (buf, ", pso");
3014
3015           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
3016             strcat (buf, ", rmo");
3017           break;
3018
3019         case EM_PARISC:
3020           switch (e_flags & EF_PARISC_ARCH)
3021             {
3022             case EFA_PARISC_1_0:
3023               strcpy (buf, ", PA-RISC 1.0");
3024               break;
3025             case EFA_PARISC_1_1:
3026               strcpy (buf, ", PA-RISC 1.1");
3027               break;
3028             case EFA_PARISC_2_0:
3029               strcpy (buf, ", PA-RISC 2.0");
3030               break;
3031             default:
3032               break;
3033             }
3034           if (e_flags & EF_PARISC_TRAPNIL)
3035             strcat (buf, ", trapnil");
3036           if (e_flags & EF_PARISC_EXT)
3037             strcat (buf, ", ext");
3038           if (e_flags & EF_PARISC_LSB)
3039             strcat (buf, ", lsb");
3040           if (e_flags & EF_PARISC_WIDE)
3041             strcat (buf, ", wide");
3042           if (e_flags & EF_PARISC_NO_KABP)
3043             strcat (buf, ", no kabp");
3044           if (e_flags & EF_PARISC_LAZYSWAP)
3045             strcat (buf, ", lazyswap");
3046           break;
3047
3048         case EM_PJ:
3049         case EM_PJ_OLD:
3050           if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
3051             strcat (buf, ", new calling convention");
3052
3053           if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
3054             strcat (buf, ", gnu calling convention");
3055           break;
3056
3057         case EM_IA_64:
3058           if ((e_flags & EF_IA_64_ABI64))
3059             strcat (buf, ", 64-bit");
3060           else
3061             strcat (buf, ", 32-bit");
3062           if ((e_flags & EF_IA_64_REDUCEDFP))
3063             strcat (buf, ", reduced fp model");
3064           if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
3065             strcat (buf, ", no function descriptors, constant gp");
3066           else if ((e_flags & EF_IA_64_CONS_GP))
3067             strcat (buf, ", constant gp");
3068           if ((e_flags & EF_IA_64_ABSOLUTE))
3069             strcat (buf, ", absolute");
3070           if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
3071             {
3072               if ((e_flags & EF_IA_64_VMS_LINKAGES))
3073                 strcat (buf, ", vms_linkages");
3074               switch ((e_flags & EF_IA_64_VMS_COMCOD))
3075                 {
3076                 case EF_IA_64_VMS_COMCOD_SUCCESS:
3077                   break;
3078                 case EF_IA_64_VMS_COMCOD_WARNING:
3079                   strcat (buf, ", warning");
3080                   break;
3081                 case EF_IA_64_VMS_COMCOD_ERROR:
3082                   strcat (buf, ", error");
3083                   break;
3084                 case EF_IA_64_VMS_COMCOD_ABORT:
3085                   strcat (buf, ", abort");
3086                   break;
3087                 default:
3088                   abort ();
3089                 }
3090             }
3091           break;
3092
3093         case EM_VAX:
3094           if ((e_flags & EF_VAX_NONPIC))
3095             strcat (buf, ", non-PIC");
3096           if ((e_flags & EF_VAX_DFLOAT))
3097             strcat (buf, ", D-Float");
3098           if ((e_flags & EF_VAX_GFLOAT))
3099             strcat (buf, ", G-Float");
3100           break;
3101
3102         case EM_RL78:
3103           if (e_flags & E_FLAG_RL78_G10)
3104             strcat (buf, ", G10");
3105           if (e_flags & E_FLAG_RL78_64BIT_DOUBLES)
3106             strcat (buf, ", 64-bit doubles");
3107           break;
3108
3109         case EM_RX:
3110           if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
3111             strcat (buf, ", 64-bit doubles");
3112           if (e_flags & E_FLAG_RX_DSP)
3113             strcat (buf, ", dsp");
3114           if (e_flags & E_FLAG_RX_PID)
3115             strcat (buf, ", pid");
3116           if (e_flags & E_FLAG_RX_ABI)
3117             strcat (buf, ", RX ABI");
3118           break;
3119
3120         case EM_S390:
3121           if (e_flags & EF_S390_HIGH_GPRS)
3122             strcat (buf, ", highgprs");
3123           break;
3124
3125         case EM_TI_C6000:
3126           if ((e_flags & EF_C6000_REL))
3127             strcat (buf, ", relocatable module");
3128           break;
3129
3130         case EM_MSP430:
3131           strcat (buf, _(": architecture variant: "));
3132           switch (e_flags & EF_MSP430_MACH)
3133             {
3134             case E_MSP430_MACH_MSP430x11: strcat (buf, "MSP430x11"); break;
3135             case E_MSP430_MACH_MSP430x11x1 : strcat (buf, "MSP430x11x1 "); break;
3136             case E_MSP430_MACH_MSP430x12: strcat (buf, "MSP430x12"); break;
3137             case E_MSP430_MACH_MSP430x13: strcat (buf, "MSP430x13"); break;
3138             case E_MSP430_MACH_MSP430x14: strcat (buf, "MSP430x14"); break;
3139             case E_MSP430_MACH_MSP430x15: strcat (buf, "MSP430x15"); break;
3140             case E_MSP430_MACH_MSP430x16: strcat (buf, "MSP430x16"); break;
3141             case E_MSP430_MACH_MSP430x31: strcat (buf, "MSP430x31"); break;
3142             case E_MSP430_MACH_MSP430x32: strcat (buf, "MSP430x32"); break;
3143             case E_MSP430_MACH_MSP430x33: strcat (buf, "MSP430x33"); break;
3144             case E_MSP430_MACH_MSP430x41: strcat (buf, "MSP430x41"); break;
3145             case E_MSP430_MACH_MSP430x42: strcat (buf, "MSP430x42"); break;
3146             case E_MSP430_MACH_MSP430x43: strcat (buf, "MSP430x43"); break;
3147             case E_MSP430_MACH_MSP430x44: strcat (buf, "MSP430x44"); break;
3148             case E_MSP430_MACH_MSP430X  : strcat (buf, "MSP430X"); break;
3149             default:
3150               strcat (buf, _(": unknown")); break;
3151             }
3152
3153           if (e_flags & ~ EF_MSP430_MACH)
3154             strcat (buf, _(": unknown extra flag bits also present"));
3155         }
3156     }
3157
3158   return buf;
3159 }
3160
3161 static const char *
3162 get_osabi_name (unsigned int osabi)
3163 {
3164   static char buff[32];
3165
3166   switch (osabi)
3167     {
3168     case ELFOSABI_NONE:         return "UNIX - System V";
3169     case ELFOSABI_HPUX:         return "UNIX - HP-UX";
3170     case ELFOSABI_NETBSD:       return "UNIX - NetBSD";
3171     case ELFOSABI_GNU:          return "UNIX - GNU";
3172     case ELFOSABI_SOLARIS:      return "UNIX - Solaris";
3173     case ELFOSABI_AIX:          return "UNIX - AIX";
3174     case ELFOSABI_IRIX:         return "UNIX - IRIX";
3175     case ELFOSABI_FREEBSD:      return "UNIX - FreeBSD";
3176     case ELFOSABI_TRU64:        return "UNIX - TRU64";
3177     case ELFOSABI_MODESTO:      return "Novell - Modesto";
3178     case ELFOSABI_OPENBSD:      return "UNIX - OpenBSD";
3179     case ELFOSABI_OPENVMS:      return "VMS - OpenVMS";
3180     case ELFOSABI_NSK:          return "HP - Non-Stop Kernel";
3181     case ELFOSABI_AROS:         return "AROS";
3182     case ELFOSABI_FENIXOS:      return "FenixOS";
3183     default:
3184       if (osabi >= 64)
3185         switch (elf_header.e_machine)
3186           {
3187           case EM_ARM:
3188             switch (osabi)
3189               {
3190               case ELFOSABI_ARM:        return "ARM";
3191               default:
3192                 break;
3193               }
3194             break;
3195
3196           case EM_MSP430:
3197           case EM_MSP430_OLD:
3198             switch (osabi)
3199               {
3200               case ELFOSABI_STANDALONE: return _("Standalone App");
3201               default:
3202                 break;
3203               }
3204             break;
3205
3206           case EM_TI_C6000:
3207             switch (osabi)
3208               {
3209               case ELFOSABI_C6000_ELFABI:       return _("Bare-metal C6000");
3210               case ELFOSABI_C6000_LINUX:        return "Linux C6000";
3211               default:
3212                 break;
3213               }
3214             break;
3215
3216           default:
3217             break;
3218           }
3219       snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
3220       return buff;
3221     }
3222 }
3223
3224 static const char *
3225 get_aarch64_segment_type (unsigned long type)
3226 {
3227   switch (type)
3228     {
3229     case PT_AARCH64_ARCHEXT:
3230       return "AARCH64_ARCHEXT";
3231     default:
3232       break;
3233     }
3234
3235   return NULL;
3236 }
3237
3238 static const char *
3239 get_arm_segment_type (unsigned long type)
3240 {
3241   switch (type)
3242     {
3243     case PT_ARM_EXIDX:
3244       return "EXIDX";
3245     default:
3246       break;
3247     }
3248
3249   return NULL;
3250 }
3251
3252 static const char *
3253 get_mips_segment_type (unsigned long type)
3254 {
3255   switch (type)
3256     {
3257     case PT_MIPS_REGINFO:
3258       return "REGINFO";
3259     case PT_MIPS_RTPROC:
3260       return "RTPROC";
3261     case PT_MIPS_OPTIONS:
3262       return "OPTIONS";
3263     case PT_MIPS_ABIFLAGS:
3264       return "ABIFLAGS";
3265     default:
3266       break;
3267     }
3268
3269   return NULL;
3270 }
3271
3272 static const char *
3273 get_parisc_segment_type (unsigned long type)
3274 {
3275   switch (type)
3276     {
3277     case PT_HP_TLS:             return "HP_TLS";
3278     case PT_HP_CORE_NONE:       return "HP_CORE_NONE";
3279     case PT_HP_CORE_VERSION:    return "HP_CORE_VERSION";
3280     case PT_HP_CORE_KERNEL:     return "HP_CORE_KERNEL";
3281     case PT_HP_CORE_COMM:       return "HP_CORE_COMM";
3282     case PT_HP_CORE_PROC:       return "HP_CORE_PROC";
3283     case PT_HP_CORE_LOADABLE:   return "HP_CORE_LOADABLE";
3284     case PT_HP_CORE_STACK:      return "HP_CORE_STACK";
3285     case PT_HP_CORE_SHM:        return "HP_CORE_SHM";
3286     case PT_HP_CORE_MMF:        return "HP_CORE_MMF";
3287     case PT_HP_PARALLEL:        return "HP_PARALLEL";
3288     case PT_HP_FASTBIND:        return "HP_FASTBIND";
3289     case PT_HP_OPT_ANNOT:       return "HP_OPT_ANNOT";
3290     case PT_HP_HSL_ANNOT:       return "HP_HSL_ANNOT";
3291     case PT_HP_STACK:           return "HP_STACK";
3292     case PT_HP_CORE_UTSNAME:    return "HP_CORE_UTSNAME";
3293     case PT_PARISC_ARCHEXT:     return "PARISC_ARCHEXT";
3294     case PT_PARISC_UNWIND:      return "PARISC_UNWIND";
3295     case PT_PARISC_WEAKORDER:   return "PARISC_WEAKORDER";
3296     default:
3297       break;
3298     }
3299
3300   return NULL;
3301 }
3302
3303 static const char *
3304 get_ia64_segment_type (unsigned long type)
3305 {
3306   switch (type)
3307     {
3308     case PT_IA_64_ARCHEXT:      return "IA_64_ARCHEXT";
3309     case PT_IA_64_UNWIND:       return "IA_64_UNWIND";
3310     case PT_HP_TLS:             return "HP_TLS";
3311     case PT_IA_64_HP_OPT_ANOT:  return "HP_OPT_ANNOT";
3312     case PT_IA_64_HP_HSL_ANOT:  return "HP_HSL_ANNOT";
3313     case PT_IA_64_HP_STACK:     return "HP_STACK";
3314     default:
3315       break;
3316     }
3317
3318   return NULL;
3319 }
3320
3321 static const char *
3322 get_tic6x_segment_type (unsigned long type)
3323 {
3324   switch (type)
3325     {
3326     case PT_C6000_PHATTR:       return "C6000_PHATTR";
3327     default:
3328       break;
3329     }
3330
3331   return NULL;
3332 }
3333
3334 static const char *
3335 get_segment_type (unsigned long p_type)
3336 {
3337   static char buff[32];
3338
3339   switch (p_type)
3340     {
3341     case PT_NULL:       return "NULL";
3342     case PT_LOAD:       return "LOAD";
3343     case PT_DYNAMIC:    return "DYNAMIC";
3344     case PT_INTERP:     return "INTERP";
3345     case PT_NOTE:       return "NOTE";
3346     case PT_SHLIB:      return "SHLIB";
3347     case PT_PHDR:       return "PHDR";
3348     case PT_TLS:        return "TLS";
3349
3350     case PT_GNU_EH_FRAME:
3351                         return "GNU_EH_FRAME";
3352     case PT_GNU_STACK:  return "GNU_STACK";
3353     case PT_GNU_RELRO:  return "GNU_RELRO";
3354
3355     default:
3356       if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
3357         {
3358           const char * result;
3359
3360           switch (elf_header.e_machine)
3361             {
3362             case EM_AARCH64:
3363               result = get_aarch64_segment_type (p_type);
3364               break;
3365             case EM_ARM:
3366               result = get_arm_segment_type (p_type);
3367               break;
3368             case EM_MIPS:
3369             case EM_MIPS_RS3_LE:
3370               result = get_mips_segment_type (p_type);
3371               break;
3372             case EM_PARISC:
3373               result = get_parisc_segment_type (p_type);
3374               break;
3375             case EM_IA_64:
3376               result = get_ia64_segment_type (p_type);
3377               break;
3378             case EM_TI_C6000:
3379               result = get_tic6x_segment_type (p_type);
3380               break;
3381             default:
3382               result = NULL;
3383               break;
3384             }
3385
3386           if (result != NULL)
3387             return result;
3388
3389           sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
3390         }
3391       else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
3392         {
3393           const char * result;
3394
3395           switch (elf_header.e_machine)
3396             {
3397             case EM_PARISC:
3398               result = get_parisc_segment_type (p_type);
3399               break;
3400             case EM_IA_64:
3401               result = get_ia64_segment_type (p_type);
3402               break;
3403             default:
3404               result = NULL;
3405               break;
3406             }
3407
3408           if (result != NULL)
3409             return result;
3410
3411           sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
3412         }
3413       else
3414         snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
3415
3416       return buff;
3417     }
3418 }
3419
3420 static const char *
3421 get_mips_section_type_name (unsigned int sh_type)
3422 {
3423   switch (sh_type)
3424     {
3425     case SHT_MIPS_LIBLIST:       return "MIPS_LIBLIST";
3426     case SHT_MIPS_MSYM:          return "MIPS_MSYM";
3427     case SHT_MIPS_CONFLICT:      return "MIPS_CONFLICT";
3428     case SHT_MIPS_GPTAB:         return "MIPS_GPTAB";
3429     case SHT_MIPS_UCODE:         return "MIPS_UCODE";
3430     case SHT_MIPS_DEBUG:         return "MIPS_DEBUG";
3431     case SHT_MIPS_REGINFO:       return "MIPS_REGINFO";
3432     case SHT_MIPS_PACKAGE:       return "MIPS_PACKAGE";
3433     case SHT_MIPS_PACKSYM:       return "MIPS_PACKSYM";
3434     case SHT_MIPS_RELD:          return "MIPS_RELD";
3435     case SHT_MIPS_IFACE:         return "MIPS_IFACE";
3436     case SHT_MIPS_CONTENT:       return "MIPS_CONTENT";
3437     case SHT_MIPS_OPTIONS:       return "MIPS_OPTIONS";
3438     case SHT_MIPS_SHDR:          return "MIPS_SHDR";
3439     case SHT_MIPS_FDESC:         return "MIPS_FDESC";
3440     case SHT_MIPS_EXTSYM:        return "MIPS_EXTSYM";
3441     case SHT_MIPS_DENSE:         return "MIPS_DENSE";
3442     case SHT_MIPS_PDESC:         return "MIPS_PDESC";
3443     case SHT_MIPS_LOCSYM:        return "MIPS_LOCSYM";
3444     case SHT_MIPS_AUXSYM:        return "MIPS_AUXSYM";
3445     case SHT_MIPS_OPTSYM:        return "MIPS_OPTSYM";
3446     case SHT_MIPS_LOCSTR:        return "MIPS_LOCSTR";
3447     case SHT_MIPS_LINE:          return "MIPS_LINE";
3448     case SHT_MIPS_RFDESC:        return "MIPS_RFDESC";
3449     case SHT_MIPS_DELTASYM:      return "MIPS_DELTASYM";
3450     case SHT_MIPS_DELTAINST:     return "MIPS_DELTAINST";
3451     case SHT_MIPS_DELTACLASS:    return "MIPS_DELTACLASS";
3452     case SHT_MIPS_DWARF:         return "MIPS_DWARF";
3453     case SHT_MIPS_DELTADECL:     return "MIPS_DELTADECL";
3454     case SHT_MIPS_SYMBOL_LIB:    return "MIPS_SYMBOL_LIB";
3455     case SHT_MIPS_EVENTS:        return "MIPS_EVENTS";
3456     case SHT_MIPS_TRANSLATE:     return "MIPS_TRANSLATE";
3457     case SHT_MIPS_PIXIE:         return "MIPS_PIXIE";
3458     case SHT_MIPS_XLATE:         return "MIPS_XLATE";
3459     case SHT_MIPS_XLATE_DEBUG:   return "MIPS_XLATE_DEBUG";
3460     case SHT_MIPS_WHIRL:         return "MIPS_WHIRL";
3461     case SHT_MIPS_EH_REGION:     return "MIPS_EH_REGION";
3462     case SHT_MIPS_XLATE_OLD:     return "MIPS_XLATE_OLD";
3463     case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
3464     case SHT_MIPS_ABIFLAGS:      return "MIPS_ABIFLAGS";
3465     default:
3466       break;
3467     }
3468   return NULL;
3469 }
3470
3471 static const char *
3472 get_parisc_section_type_name (unsigned int sh_type)
3473 {
3474   switch (sh_type)
3475     {
3476     case SHT_PARISC_EXT:        return "PARISC_EXT";
3477     case SHT_PARISC_UNWIND:     return "PARISC_UNWIND";
3478     case SHT_PARISC_DOC:        return "PARISC_DOC";
3479     case SHT_PARISC_ANNOT:      return "PARISC_ANNOT";
3480     case SHT_PARISC_SYMEXTN:    return "PARISC_SYMEXTN";
3481     case SHT_PARISC_STUBS:      return "PARISC_STUBS";
3482     case SHT_PARISC_DLKM:       return "PARISC_DLKM";
3483     default:
3484       break;
3485     }
3486   return NULL;
3487 }
3488
3489 static const char *
3490 get_ia64_section_type_name (unsigned int sh_type)
3491 {
3492   /* If the top 8 bits are 0x78 the next 8 are the os/abi ID.  */
3493   if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
3494     return get_osabi_name ((sh_type & 0x00FF0000) >> 16);
3495
3496   switch (sh_type)
3497     {
3498     case SHT_IA_64_EXT:                return "IA_64_EXT";
3499     case SHT_IA_64_UNWIND:             return "IA_64_UNWIND";
3500     case SHT_IA_64_PRIORITY_INIT:      return "IA_64_PRIORITY_INIT";
3501     case SHT_IA_64_VMS_TRACE:          return "VMS_TRACE";
3502     case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
3503     case SHT_IA_64_VMS_DEBUG:          return "VMS_DEBUG";
3504     case SHT_IA_64_VMS_DEBUG_STR:      return "VMS_DEBUG_STR";
3505     case SHT_IA_64_VMS_LINKAGES:       return "VMS_LINKAGES";
3506     case SHT_IA_64_VMS_SYMBOL_VECTOR:  return "VMS_SYMBOL_VECTOR";
3507     case SHT_IA_64_VMS_FIXUP:          return "VMS_FIXUP";
3508     default:
3509       break;
3510     }
3511   return NULL;
3512 }
3513
3514 static const char *
3515 get_x86_64_section_type_name (unsigned int sh_type)
3516 {
3517   switch (sh_type)
3518     {
3519     case SHT_X86_64_UNWIND:     return "X86_64_UNWIND";
3520     default:
3521       break;
3522     }
3523   return NULL;
3524 }
3525
3526 static const char *
3527 get_aarch64_section_type_name (unsigned int sh_type)
3528 {
3529   switch (sh_type)
3530     {
3531     case SHT_AARCH64_ATTRIBUTES:
3532       return "AARCH64_ATTRIBUTES";
3533     default:
3534       break;
3535     }
3536   return NULL;
3537 }
3538
3539 static const char *
3540 get_arm_section_type_name (unsigned int sh_type)
3541 {
3542   switch (sh_type)
3543     {
3544     case SHT_ARM_EXIDX:           return "ARM_EXIDX";
3545     case SHT_ARM_PREEMPTMAP:      return "ARM_PREEMPTMAP";
3546     case SHT_ARM_ATTRIBUTES:      return "ARM_ATTRIBUTES";
3547     case SHT_ARM_DEBUGOVERLAY:    return "ARM_DEBUGOVERLAY";
3548     case SHT_ARM_OVERLAYSECTION:  return "ARM_OVERLAYSECTION";
3549     default:
3550       break;
3551     }
3552   return NULL;
3553 }
3554
3555 static const char *
3556 get_tic6x_section_type_name (unsigned int sh_type)
3557 {
3558   switch (sh_type)
3559     {
3560     case SHT_C6000_UNWIND:
3561       return "C6000_UNWIND";
3562     case SHT_C6000_PREEMPTMAP:
3563       return "C6000_PREEMPTMAP";
3564     case SHT_C6000_ATTRIBUTES:
3565       return "C6000_ATTRIBUTES";
3566     case SHT_TI_ICODE:
3567       return "TI_ICODE";
3568     case SHT_TI_XREF:
3569       return "TI_XREF";
3570     case SHT_TI_HANDLER:
3571       return "TI_HANDLER";
3572     case SHT_TI_INITINFO:
3573       return "TI_INITINFO";
3574     case SHT_TI_PHATTRS:
3575       return "TI_PHATTRS";
3576     default:
3577       break;
3578     }
3579   return NULL;
3580 }
3581
3582 static const char *
3583 get_msp430x_section_type_name (unsigned int sh_type)
3584 {
3585   switch (sh_type)
3586     {
3587     case SHT_MSP430_SEC_FLAGS:   return "MSP430_SEC_FLAGS";
3588     case SHT_MSP430_SYM_ALIASES: return "MSP430_SYM_ALIASES";
3589     case SHT_MSP430_ATTRIBUTES:  return "MSP430_ATTRIBUTES";
3590     default: return NULL;
3591     }
3592 }
3593
3594 static const char *
3595 get_section_type_name (unsigned int sh_type)
3596 {
3597   static char buff[32];
3598
3599   switch (sh_type)
3600     {
3601     case SHT_NULL:              return "NULL";
3602     case SHT_PROGBITS:          return "PROGBITS";
3603     case SHT_SYMTAB:            return "SYMTAB";
3604     case SHT_STRTAB:            return "STRTAB";
3605     case SHT_RELA:              return "RELA";
3606     case SHT_HASH:              return "HASH";
3607     case SHT_DYNAMIC:           return "DYNAMIC";
3608     case SHT_NOTE:              return "NOTE";
3609     case SHT_NOBITS:            return "NOBITS";
3610     case SHT_REL:               return "REL";
3611     case SHT_SHLIB:             return "SHLIB";
3612     case SHT_DYNSYM:            return "DYNSYM";
3613     case SHT_INIT_ARRAY:        return "INIT_ARRAY";
3614     case SHT_FINI_ARRAY:        return "FINI_ARRAY";
3615     case SHT_PREINIT_ARRAY:     return "PREINIT_ARRAY";
3616     case SHT_GNU_HASH:          return "GNU_HASH";
3617     case SHT_GROUP:             return "GROUP";
3618     case SHT_SYMTAB_SHNDX:      return "SYMTAB SECTION INDICIES";
3619     case SHT_GNU_verdef:        return "VERDEF";
3620     case SHT_GNU_verneed:       return "VERNEED";
3621     case SHT_GNU_versym:        return "VERSYM";
3622     case 0x6ffffff0:            return "VERSYM";
3623     case 0x6ffffffc:            return "VERDEF";
3624     case 0x7ffffffd:            return "AUXILIARY";
3625     case 0x7fffffff:            return "FILTER";
3626     case SHT_GNU_LIBLIST:       return "GNU_LIBLIST";
3627
3628     default:
3629       if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
3630         {
3631           const char * result;
3632
3633           switch (elf_header.e_machine)
3634             {
3635             case EM_MIPS:
3636             case EM_MIPS_RS3_LE:
3637               result = get_mips_section_type_name (sh_type);
3638               break;
3639             case EM_PARISC:
3640               result = get_parisc_section_type_name (sh_type);
3641               break;
3642             case EM_IA_64:
3643               result = get_ia64_section_type_name (sh_type);
3644               break;
3645             case EM_X86_64:
3646             case EM_L1OM:
3647             case EM_K1OM:
3648               result = get_x86_64_section_type_name (sh_type);
3649               break;
3650             case EM_AARCH64:
3651               result = get_aarch64_section_type_name (sh_type);
3652               break;
3653             case EM_ARM:
3654               result = get_arm_section_type_name (sh_type);
3655               break;
3656             case EM_TI_C6000:
3657               result = get_tic6x_section_type_name (sh_type);
3658               break;
3659             case EM_MSP430:
3660               result = get_msp430x_section_type_name (sh_type);
3661               break;
3662             default:
3663               result = NULL;
3664               break;
3665             }
3666
3667           if (result != NULL)
3668             return result;
3669
3670           sprintf (buff, "LOPROC+%x", sh_type - SHT_LOPROC);
3671         }
3672       else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
3673         {
3674           const char * result;
3675
3676           switch (elf_header.e_machine)
3677             {
3678             case EM_IA_64:
3679               result = get_ia64_section_type_name (sh_type);
3680               break;
3681             default:
3682               result = NULL;
3683               break;
3684             }
3685
3686           if (result != NULL)
3687             return result;
3688
3689           sprintf (buff, "LOOS+%x", sh_type - SHT_LOOS);
3690         }
3691       else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
3692         sprintf (buff, "LOUSER+%x", sh_type - SHT_LOUSER);
3693       else
3694         /* This message is probably going to be displayed in a 15
3695            character wide field, so put the hex value first.  */
3696         snprintf (buff, sizeof (buff), _("%08x: <unknown>"), sh_type);
3697
3698       return buff;
3699     }
3700 }
3701
3702 #define OPTION_DEBUG_DUMP       512
3703 #define OPTION_DYN_SYMS         513
3704 #define OPTION_DWARF_DEPTH      514
3705 #define OPTION_DWARF_START      515
3706 #define OPTION_DWARF_CHECK      516
3707
3708 static struct option options[] =
3709 {
3710   {"all",              no_argument, 0, 'a'},
3711   {"file-header",      no_argument, 0, 'h'},
3712   {"program-headers",  no_argument, 0, 'l'},
3713   {"headers",          no_argument, 0, 'e'},
3714   {"histogram",        no_argument, 0, 'I'},
3715   {"segments",         no_argument, 0, 'l'},
3716   {"sections",         no_argument, 0, 'S'},
3717   {"section-headers",  no_argument, 0, 'S'},
3718   {"section-groups",   no_argument, 0, 'g'},
3719   {"section-details",  no_argument, 0, 't'},
3720   {"full-section-name",no_argument, 0, 'N'},
3721   {"symbols",          no_argument, 0, 's'},
3722   {"syms",             no_argument, 0, 's'},
3723   {"dyn-syms",         no_argument, 0, OPTION_DYN_SYMS},
3724   {"relocs",           no_argument, 0, 'r'},
3725   {"notes",            no_argument, 0, 'n'},
3726   {"dynamic",          no_argument, 0, 'd'},
3727   {"arch-specific",    no_argument, 0, 'A'},
3728   {"version-info",     no_argument, 0, 'V'},
3729   {"use-dynamic",      no_argument, 0, 'D'},
3730   {"unwind",           no_argument, 0, 'u'},
3731   {"archive-index",    no_argument, 0, 'c'},
3732   {"hex-dump",         required_argument, 0, 'x'},
3733   {"relocated-dump",   required_argument, 0, 'R'},
3734   {"string-dump",      required_argument, 0, 'p'},
3735 #ifdef SUPPORT_DISASSEMBLY
3736   {"instruction-dump", required_argument, 0, 'i'},
3737 #endif
3738   {"debug-dump",       optional_argument, 0, OPTION_DEBUG_DUMP},
3739
3740   {"dwarf-depth",      required_argument, 0, OPTION_DWARF_DEPTH},
3741   {"dwarf-start",      required_argument, 0, OPTION_DWARF_START},
3742   {"dwarf-check",      no_argument, 0, OPTION_DWARF_CHECK},
3743
3744   {"version",          no_argument, 0, 'v'},
3745   {"wide",             no_argument, 0, 'W'},
3746   {"help",             no_argument, 0, 'H'},
3747   {0,                  no_argument, 0, 0}
3748 };
3749
3750 static void
3751 usage (FILE * stream)
3752 {
3753   fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
3754   fprintf (stream, _(" Display information about the contents of ELF format files\n"));
3755   fprintf (stream, _(" Options are:\n\
3756   -a --all               Equivalent to: -h -l -S -s -r -d -V -A -I\n\
3757   -h --file-header       Display the ELF file header\n\
3758   -l --program-headers   Display the program headers\n\
3759      --segments          An alias for --program-headers\n\
3760   -S --section-headers   Display the sections' header\n\
3761      --sections          An alias for --section-headers\n\
3762   -g --section-groups    Display the section groups\n\
3763   -t --section-details   Display the section details\n\
3764   -e --headers           Equivalent to: -h -l -S\n\
3765   -s --syms              Display the symbol table\n\
3766      --symbols           An alias for --syms\n\
3767   --dyn-syms             Display the dynamic symbol table\n\
3768   -n --notes             Display the core notes (if present)\n\
3769   -r --relocs            Display the relocations (if present)\n\
3770   -u --unwind            Display the unwind info (if present)\n\
3771   -d --dynamic           Display the dynamic section (if present)\n\
3772   -V --version-info      Display the version sections (if present)\n\
3773   -A --arch-specific     Display architecture specific information (if any)\n\
3774   -c --archive-index     Display the symbol/file index in an archive\n\
3775   -D --use-dynamic       Use the dynamic section info when displaying symbols\n\
3776   -x --hex-dump=<number|name>\n\
3777                          Dump the contents of section <number|name> as bytes\n\
3778   -p --string-dump=<number|name>\n\
3779                          Dump the contents of section <number|name> as strings\n\
3780   -R --relocated-dump=<number|name>\n\
3781                          Dump the contents of section <number|name> as relocated bytes\n\
3782   -w[lLiaprmfFsoRt] or\n\
3783   --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
3784                =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
3785                =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
3786                =addr,=cu_index]\n\
3787                          Display the contents of DWARF2 debug sections\n"));
3788   fprintf (stream, _("\
3789   --dwarf-depth=N        Do not display DIEs at depth N or greater\n\
3790   --dwarf-start=N        Display DIEs starting with N, at the same depth\n\
3791                          or deeper\n"));
3792 #ifdef SUPPORT_DISASSEMBLY
3793   fprintf (stream, _("\
3794   -i --instruction-dump=<number|name>\n\
3795                          Disassemble the contents of section <number|name>\n"));
3796 #endif
3797   fprintf (stream, _("\
3798   -I --histogram         Display histogram of bucket list lengths\n\
3799   -W --wide              Allow output width to exceed 80 characters\n\
3800   @<file>                Read options from <file>\n\
3801   -H --help              Display this information\n\
3802   -v --version           Display the version number of readelf\n"));
3803
3804   if (REPORT_BUGS_TO[0] && stream == stdout)
3805     fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
3806
3807   exit (stream == stdout ? 0 : 1);
3808 }
3809
3810 /* Record the fact that the user wants the contents of section number
3811    SECTION to be displayed using the method(s) encoded as flags bits
3812    in TYPE.  Note, TYPE can be zero if we are creating the array for
3813    the first time.  */
3814
3815 static void
3816 request_dump_bynumber (unsigned int section, dump_type type)
3817 {
3818   if (section >= num_dump_sects)
3819     {
3820       dump_type * new_dump_sects;
3821
3822       new_dump_sects = (dump_type *) calloc (section + 1,
3823                                              sizeof (* dump_sects));
3824
3825       if (new_dump_sects == NULL)
3826         error (_("Out of memory allocating dump request table.\n"));
3827       else
3828         {
3829           /* Copy current flag settings.  */
3830           memcpy (new_dump_sects, dump_sects, num_dump_sects * sizeof (* dump_sects));
3831
3832           free (dump_sects);
3833
3834           dump_sects = new_dump_sects;
3835           num_dump_sects = section + 1;
3836         }
3837     }
3838
3839   if (dump_sects)
3840     dump_sects[section] |= type;
3841
3842   return;
3843 }
3844
3845 /* Request a dump by section name.  */
3846
3847 static void
3848 request_dump_byname (const char * section, dump_type type)
3849 {
3850   struct dump_list_entry * new_request;
3851
3852   new_request = (struct dump_list_entry *)
3853       malloc (sizeof (struct dump_list_entry));
3854   if (!new_request)
3855     error (_("Out of memory allocating dump request table.\n"));
3856
3857   new_request->name = strdup (section);
3858   if (!new_request->name)
3859     error (_("Out of memory allocating dump request table.\n"));
3860
3861   new_request->type = type;
3862
3863   new_request->next = dump_sects_byname;
3864   dump_sects_byname = new_request;
3865 }
3866
3867 static inline void
3868 request_dump (dump_type type)
3869 {
3870   int section;
3871   char * cp;
3872
3873   do_dump++;
3874   section = strtoul (optarg, & cp, 0);
3875
3876   if (! *cp && section >= 0)
3877     request_dump_bynumber (section, type);
3878   else
3879     request_dump_byname (optarg, type);
3880 }
3881
3882
3883 static void
3884 parse_args (int argc, char ** argv)
3885 {
3886   int c;
3887
3888   if (argc < 2)
3889     usage (stderr);
3890
3891   while ((c = getopt_long
3892           (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:", options, NULL)) != EOF)
3893     {
3894       switch (c)
3895         {
3896         case 0:
3897           /* Long options.  */
3898           break;
3899         case 'H':
3900           usage (stdout);
3901           break;
3902
3903         case 'a':
3904           do_syms++;
3905           do_reloc++;
3906           do_unwind++;
3907           do_dynamic++;
3908           do_header++;
3909           do_sections++;
3910           do_section_groups++;
3911           do_segments++;
3912           do_version++;
3913           do_histogram++;
3914           do_arch++;
3915           do_notes++;
3916           break;
3917         case 'g':
3918           do_section_groups++;
3919           break;
3920         case 't':
3921         case 'N':
3922           do_sections++;
3923           do_section_details++;
3924           break;
3925         case 'e':
3926           do_header++;
3927           do_sections++;
3928           do_segments++;
3929           break;
3930         case 'A':
3931           do_arch++;
3932           break;
3933         case 'D':
3934           do_using_dynamic++;
3935           break;
3936         case 'r':
3937           do_reloc++;
3938           break;
3939         case 'u':
3940           do_unwind++;
3941           break;
3942         case 'h':
3943           do_header++;
3944           break;
3945         case 'l':
3946           do_segments++;
3947           break;
3948         case 's':
3949           do_syms++;
3950           break;
3951         case 'S':
3952           do_sections++;
3953           break;
3954         case 'd':
3955           do_dynamic++;
3956           break;
3957         case 'I':
3958           do_histogram++;
3959           break;
3960         case 'n':
3961           do_notes++;
3962           break;
3963         case 'c':
3964           do_archive_index++;
3965           break;
3966         case 'x':
3967           request_dump (HEX_DUMP);
3968           break;
3969         case 'p':
3970           request_dump (STRING_DUMP);
3971           break;
3972         case 'R':
3973           request_dump (RELOC_DUMP);
3974           break;
3975         case 'w':
3976           do_dump++;
3977           if (optarg == 0)
3978             {
3979               do_debugging = 1;
3980               dwarf_select_sections_all ();
3981             }
3982           else
3983             {
3984               do_debugging = 0;
3985               dwarf_select_sections_by_letters (optarg);
3986             }
3987           break;
3988         case OPTION_DEBUG_DUMP:
3989           do_dump++;
3990           if (optarg == 0)
3991             do_debugging = 1;
3992           else
3993             {
3994               do_debugging = 0;
3995               dwarf_select_sections_by_names (optarg);
3996             }
3997           break;
3998         case OPTION_DWARF_DEPTH:
3999           {
4000             char *cp;
4001
4002             dwarf_cutoff_level = strtoul (optarg, & cp, 0);
4003           }
4004           break;
4005         case OPTION_DWARF_START:
4006           {
4007             char *cp;
4008
4009             dwarf_start_die = strtoul (optarg, & cp, 0);
4010           }
4011           break;
4012         case OPTION_DWARF_CHECK:
4013           dwarf_check = 1;
4014           break;
4015         case OPTION_DYN_SYMS:
4016           do_dyn_syms++;
4017           break;
4018 #ifdef SUPPORT_DISASSEMBLY
4019         case 'i':
4020           request_dump (DISASS_DUMP);
4021           break;
4022 #endif
4023         case 'v':
4024           print_version (program_name);
4025           break;
4026         case 'V':
4027           do_version++;
4028           break;
4029         case 'W':
4030           do_wide++;
4031           break;
4032         default:
4033           /* xgettext:c-format */
4034           error (_("Invalid option '-%c'\n"), c);
4035           /* Drop through.  */
4036         case '?':
4037           usage (stderr);
4038         }
4039     }
4040
4041   if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
4042       && !do_segments && !do_header && !do_dump && !do_version
4043       && !do_histogram && !do_debugging && !do_arch && !do_notes
4044       && !do_section_groups && !do_archive_index
4045       && !do_dyn_syms)
4046     usage (stderr);
4047   else if (argc < 3)
4048     {
4049       warn (_("Nothing to do.\n"));
4050       usage (stderr);
4051     }
4052 }
4053
4054 static const char *
4055 get_elf_class (unsigned int elf_class)
4056 {
4057   static char buff[32];
4058
4059   switch (elf_class)
4060     {
4061     case ELFCLASSNONE: return _("none");
4062     case ELFCLASS32:   return "ELF32";
4063     case ELFCLASS64:   return "ELF64";
4064     default:
4065       snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
4066       return buff;
4067     }
4068 }
4069
4070 static const char *
4071 get_data_encoding (unsigned int encoding)
4072 {
4073   static char buff[32];
4074
4075   switch (encoding)
4076     {
4077     case ELFDATANONE: return _("none");
4078     case ELFDATA2LSB: return _("2's complement, little endian");
4079     case ELFDATA2MSB: return _("2's complement, big endian");
4080     default:
4081       snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
4082       return buff;
4083     }
4084 }
4085
4086 /* Decode the data held in 'elf_header'.  */
4087
4088 static int
4089 process_file_header (void)
4090 {
4091   if (   elf_header.e_ident[EI_MAG0] != ELFMAG0
4092       || elf_header.e_ident[EI_MAG1] != ELFMAG1
4093       || elf_header.e_ident[EI_MAG2] != ELFMAG2
4094       || elf_header.e_ident[EI_MAG3] != ELFMAG3)
4095     {
4096       error
4097         (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
4098       return 0;
4099     }
4100
4101   init_dwarf_regnames (elf_header.e_machine);
4102
4103   if (do_header)
4104     {
4105       int i;
4106
4107       printf (_("ELF Header:\n"));
4108       printf (_("  Magic:   "));
4109       for (i = 0; i < EI_NIDENT; i++)
4110         printf ("%2.2x ", elf_header.e_ident[i]);
4111       printf ("\n");
4112       printf (_("  Class:                             %s\n"),
4113               get_elf_class (elf_header.e_ident[EI_CLASS]));
4114       printf (_("  Data:                              %s\n"),
4115               get_data_encoding (elf_header.e_ident[EI_DATA]));
4116       printf (_("  Version:                           %d %s\n"),
4117               elf_header.e_ident[EI_VERSION],
4118               (elf_header.e_ident[EI_VERSION] == EV_CURRENT
4119                ? "(current)"
4120                : (elf_header.e_ident[EI_VERSION] != EV_NONE
4121                   ? _("<unknown: %lx>")
4122                   : "")));
4123       printf (_("  OS/ABI:                            %s\n"),
4124               get_osabi_name (elf_header.e_ident[EI_OSABI]));
4125       printf (_("  ABI Version:                       %d\n"),
4126               elf_header.e_ident[EI_ABIVERSION]);
4127       printf (_("  Type:                              %s\n"),
4128               get_file_type (elf_header.e_type));
4129       printf (_("  Machine:                           %s\n"),
4130               get_machine_name (elf_header.e_machine));
4131       printf (_("  Version:                           0x%lx\n"),
4132               (unsigned long) elf_header.e_version);
4133
4134       printf (_("  Entry point address:               "));
4135       print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4136       printf (_("\n  Start of program headers:          "));
4137       print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4138       printf (_(" (bytes into file)\n  Start of section headers:          "));
4139       print_vma ((bfd_vma) elf_header.e_shoff, DEC);
4140       printf (_(" (bytes into file)\n"));
4141
4142       printf (_("  Flags:                             0x%lx%s\n"),
4143               (unsigned long) elf_header.e_flags,
4144               get_machine_flags (elf_header.e_flags, elf_header.e_machine));
4145       printf (_("  Size of this header:               %ld (bytes)\n"),
4146               (long) elf_header.e_ehsize);
4147       printf (_("  Size of program headers:           %ld (bytes)\n"),
4148               (long) elf_header.e_phentsize);
4149       printf (_("  Number of program headers:         %ld"),
4150               (long) elf_header.e_phnum);
4151       if (section_headers != NULL
4152           && elf_header.e_phnum == PN_XNUM
4153           && section_headers[0].sh_info != 0)
4154         printf (" (%ld)", (long) section_headers[0].sh_info);
4155       putc ('\n', stdout);
4156       printf (_("  Size of section headers:           %ld (bytes)\n"),
4157               (long) elf_header.e_shentsize);
4158       printf (_("  Number of section headers:         %ld"),
4159               (long) elf_header.e_shnum);
4160       if (section_headers != NULL && elf_header.e_shnum == SHN_UNDEF)
4161         printf (" (%ld)", (long) section_headers[0].sh_size);
4162       putc ('\n', stdout);
4163       printf (_("  Section header string table index: %ld"),
4164               (long) elf_header.e_shstrndx);
4165       if (section_headers != NULL
4166           && elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
4167         printf (" (%u)", section_headers[0].sh_link);
4168       else if (elf_header.e_shstrndx != SHN_UNDEF
4169                && elf_header.e_shstrndx >= elf_header.e_shnum)
4170         printf (_(" <corrupt: out of range>"));
4171       putc ('\n', stdout);
4172     }
4173
4174   if (section_headers != NULL)
4175     {
4176       if (elf_header.e_phnum == PN_XNUM
4177           && section_headers[0].sh_info != 0)
4178         elf_header.e_phnum = section_headers[0].sh_info;
4179       if (elf_header.e_shnum == SHN_UNDEF)
4180         elf_header.e_shnum = section_headers[0].sh_size;
4181       if (elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
4182         elf_header.e_shstrndx = section_headers[0].sh_link;
4183       else if (elf_header.e_shstrndx >= elf_header.e_shnum)
4184         elf_header.e_shstrndx = SHN_UNDEF;
4185       free (section_headers);
4186       section_headers = NULL;
4187     }
4188
4189   return 1;
4190 }
4191
4192 static bfd_boolean
4193 get_32bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
4194 {
4195   Elf32_External_Phdr * phdrs;
4196   Elf32_External_Phdr * external;
4197   Elf_Internal_Phdr *   internal;
4198   unsigned int i;
4199   unsigned int size = elf_header.e_phentsize;
4200   unsigned int num  = elf_header.e_phnum;
4201
4202   /* PR binutils/17531: Cope with unexpected section header sizes.  */
4203   if (size == 0 || num == 0)
4204     return FALSE;
4205   if (size < sizeof * phdrs)
4206     {
4207       error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4208       return FALSE;
4209     }
4210   if (size > sizeof * phdrs)
4211     warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4212
4213   phdrs = (Elf32_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
4214                                             size, num, _("program headers"));
4215   if (phdrs == NULL)
4216     return FALSE;
4217
4218   for (i = 0, internal = pheaders, external = phdrs;
4219        i < elf_header.e_phnum;
4220        i++, internal++, external++)
4221     {
4222       internal->p_type   = BYTE_GET (external->p_type);
4223       internal->p_offset = BYTE_GET (external->p_offset);
4224       internal->p_vaddr  = BYTE_GET (external->p_vaddr);
4225       internal->p_paddr  = BYTE_GET (external->p_paddr);
4226       internal->p_filesz = BYTE_GET (external->p_filesz);
4227       internal->p_memsz  = BYTE_GET (external->p_memsz);
4228       internal->p_flags  = BYTE_GET (external->p_flags);
4229       internal->p_align  = BYTE_GET (external->p_align);
4230     }
4231
4232   free (phdrs);
4233   return TRUE;
4234 }
4235
4236 static bfd_boolean
4237 get_64bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
4238 {
4239   Elf64_External_Phdr * phdrs;
4240   Elf64_External_Phdr * external;
4241   Elf_Internal_Phdr *   internal;
4242   unsigned int i;
4243   unsigned int size = elf_header.e_phentsize;
4244   unsigned int num  = elf_header.e_phnum;
4245
4246   /* PR binutils/17531: Cope with unexpected section header sizes.  */
4247   if (size == 0 || num == 0)
4248     return FALSE;
4249   if (size < sizeof * phdrs)
4250     {
4251       error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4252       return FALSE;
4253     }
4254   if (size > sizeof * phdrs)
4255     warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4256
4257   phdrs = (Elf64_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
4258                                             size, num, _("program headers"));
4259   if (!phdrs)
4260     return FALSE;
4261
4262   for (i = 0, internal = pheaders, external = phdrs;
4263        i < elf_header.e_phnum;
4264        i++, internal++, external++)
4265     {
4266       internal->p_type   = BYTE_GET (external->p_type);
4267       internal->p_flags  = BYTE_GET (external->p_flags);
4268       internal->p_offset = BYTE_GET (external->p_offset);
4269       internal->p_vaddr  = BYTE_GET (external->p_vaddr);
4270       internal->p_paddr  = BYTE_GET (external->p_paddr);
4271       internal->p_filesz = BYTE_GET (external->p_filesz);
4272       internal->p_memsz  = BYTE_GET (external->p_memsz);
4273       internal->p_align  = BYTE_GET (external->p_align);
4274     }
4275
4276   free (phdrs);
4277   return TRUE;
4278 }
4279
4280 /* Returns 1 if the program headers were read into `program_headers'.  */
4281
4282 static int
4283 get_program_headers (FILE * file)
4284 {
4285   Elf_Internal_Phdr * phdrs;
4286
4287   /* Check cache of prior read.  */
4288   if (program_headers != NULL)
4289     return 1;
4290
4291   phdrs = (Elf_Internal_Phdr *) cmalloc (elf_header.e_phnum,
4292                                          sizeof (Elf_Internal_Phdr));
4293
4294   if (phdrs == NULL)
4295     {
4296       error (_("Out of memory reading %u program headers\n"),
4297              elf_header.e_phnum);
4298       return 0;
4299     }
4300
4301   if (is_32bit_elf
4302       ? get_32bit_program_headers (file, phdrs)
4303       : get_64bit_program_headers (file, phdrs))
4304     {
4305       program_headers = phdrs;
4306       return 1;
4307     }
4308
4309   free (phdrs);
4310   return 0;
4311 }
4312
4313 /* Returns 1 if the program headers were loaded.  */
4314
4315 static int
4316 process_program_headers (FILE * file)
4317 {
4318   Elf_Internal_Phdr * segment;
4319   unsigned int i;
4320
4321   if (elf_header.e_phnum == 0)
4322     {
4323       /* PR binutils/12467.  */
4324       if (elf_header.e_phoff != 0)
4325         warn (_("possibly corrupt ELF header - it has a non-zero program"
4326                 " header offset, but no program headers"));
4327       else if (do_segments)
4328         printf (_("\nThere are no program headers in this file.\n"));
4329       return 0;
4330     }
4331
4332   if (do_segments && !do_header)
4333     {
4334       printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
4335       printf (_("Entry point "));
4336       print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4337       printf (_("\nThere are %d program headers, starting at offset "),
4338               elf_header.e_phnum);
4339       print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4340       printf ("\n");
4341     }
4342
4343   if (! get_program_headers (file))
4344       return 0;
4345
4346   if (do_segments)
4347     {
4348       if (elf_header.e_phnum > 1)
4349         printf (_("\nProgram Headers:\n"));
4350       else
4351         printf (_("\nProgram Headers:\n"));
4352
4353       if (is_32bit_elf)
4354         printf
4355           (_("  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align\n"));
4356       else if (do_wide)
4357         printf
4358           (_("  Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align\n"));
4359       else
4360         {
4361           printf
4362             (_("  Type           Offset             VirtAddr           PhysAddr\n"));
4363           printf
4364             (_("                 FileSiz            MemSiz              Flags  Align\n"));
4365         }
4366     }
4367
4368   dynamic_addr = 0;
4369   dynamic_size = 0;
4370
4371   for (i = 0, segment = program_headers;
4372        i < elf_header.e_phnum;
4373        i++, segment++)
4374     {
4375       if (do_segments)
4376         {
4377           printf ("  %-14.14s ", get_segment_type (segment->p_type));
4378
4379           if (is_32bit_elf)
4380             {
4381               printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4382               printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
4383               printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
4384               printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
4385               printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
4386               printf ("%c%c%c ",
4387                       (segment->p_flags & PF_R ? 'R' : ' '),
4388                       (segment->p_flags & PF_W ? 'W' : ' '),
4389                       (segment->p_flags & PF_X ? 'E' : ' '));
4390               printf ("%#lx", (unsigned long) segment->p_align);
4391             }
4392           else if (do_wide)
4393             {
4394               if ((unsigned long) segment->p_offset == segment->p_offset)
4395                 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4396               else
4397                 {
4398                   print_vma (segment->p_offset, FULL_HEX);
4399                   putchar (' ');
4400                 }
4401
4402               print_vma (segment->p_vaddr, FULL_HEX);
4403               putchar (' ');
4404               print_vma (segment->p_paddr, FULL_HEX);
4405               putchar (' ');
4406
4407               if ((unsigned long) segment->p_filesz == segment->p_filesz)
4408                 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
4409               else
4410                 {
4411                   print_vma (segment->p_filesz, FULL_HEX);
4412                   putchar (' ');
4413                 }
4414
4415               if ((unsigned long) segment->p_memsz == segment->p_memsz)
4416                 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
4417               else
4418                 {
4419                   print_vma (segment->p_memsz, FULL_HEX);
4420                 }
4421
4422               printf (" %c%c%c ",
4423                       (segment->p_flags & PF_R ? 'R' : ' '),
4424                       (segment->p_flags & PF_W ? 'W' : ' '),
4425                       (segment->p_flags & PF_X ? 'E' : ' '));
4426
4427               if ((unsigned long) segment->p_align == segment->p_align)
4428                 printf ("%#lx", (unsigned long) segment->p_align);
4429               else
4430                 {
4431                   print_vma (segment->p_align, PREFIX_HEX);
4432                 }
4433             }
4434           else
4435             {
4436               print_vma (segment->p_offset, FULL_HEX);
4437               putchar (' ');
4438               print_vma (segment->p_vaddr, FULL_HEX);
4439               putchar (' ');
4440               print_vma (segment->p_paddr, FULL_HEX);
4441               printf ("\n                 ");
4442               print_vma (segment->p_filesz, FULL_HEX);
4443               putchar (' ');
4444               print_vma (segment->p_memsz, FULL_HEX);
4445               printf ("  %c%c%c    ",
4446                       (segment->p_flags & PF_R ? 'R' : ' '),
4447                       (segment->p_flags & PF_W ? 'W' : ' '),
4448                       (segment->p_flags & PF_X ? 'E' : ' '));
4449               print_vma (segment->p_align, HEX);
4450             }
4451         }
4452
4453       if (do_segments)
4454         putc ('\n', stdout);
4455
4456       switch (segment->p_type)
4457         {
4458         case PT_DYNAMIC:
4459           if (dynamic_addr)
4460             error (_("more than one dynamic segment\n"));
4461
4462           /* By default, assume that the .dynamic section is the first
4463              section in the DYNAMIC segment.  */
4464           dynamic_addr = segment->p_offset;
4465           dynamic_size = segment->p_filesz;
4466           /* PR binutils/17512: Avoid corrupt dynamic section info in the segment.  */
4467           if (dynamic_addr + dynamic_size >= current_file_size)
4468             {
4469               error (_("the dynamic segment offset + size exceeds the size of the file\n"));
4470               dynamic_addr = dynamic_size = 0;
4471             }
4472
4473           /* Try to locate the .dynamic section. If there is
4474              a section header table, we can easily locate it.  */
4475           if (section_headers != NULL)
4476             {
4477               Elf_Internal_Shdr * sec;
4478
4479               sec = find_section (".dynamic");
4480               if (sec == NULL || sec->sh_size == 0)
4481                 {
4482                   /* A corresponding .dynamic section is expected, but on
4483                      IA-64/OpenVMS it is OK for it to be missing.  */
4484                   if (!is_ia64_vms ())
4485                     error (_("no .dynamic section in the dynamic segment\n"));
4486                   break;
4487                 }
4488
4489               if (sec->sh_type == SHT_NOBITS)
4490                 {
4491                   dynamic_size = 0;
4492                   break;
4493                 }
4494
4495               dynamic_addr = sec->sh_offset;
4496               dynamic_size = sec->sh_size;
4497
4498               if (dynamic_addr < segment->p_offset
4499                   || dynamic_addr > segment->p_offset + segment->p_filesz)
4500                 warn (_("the .dynamic section is not contained"
4501                         " within the dynamic segment\n"));
4502               else if (dynamic_addr > segment->p_offset)
4503                 warn (_("the .dynamic section is not the first section"
4504                         " in the dynamic segment.\n"));
4505             }
4506           break;
4507
4508         case PT_INTERP:
4509           if (fseek (file, archive_file_offset + (long) segment->p_offset,
4510                      SEEK_SET))
4511             error (_("Unable to find program interpreter name\n"));
4512           else
4513             {
4514               char fmt [32];
4515               int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX - 1);
4516
4517               if (ret >= (int) sizeof (fmt) || ret < 0)
4518                 error (_("Internal error: failed to create format string to display program interpreter\n"));
4519
4520               program_interpreter[0] = 0;
4521               if (fscanf (file, fmt, program_interpreter) <= 0)
4522                 error (_("Unable to read program interpreter name\n"));
4523
4524               if (do_segments)
4525                 printf (_("      [Requesting program interpreter: %s]\n"),
4526                     program_interpreter);
4527             }
4528           break;
4529         }
4530     }
4531
4532   if (do_segments && section_headers != NULL && string_table != NULL)
4533     {
4534       printf (_("\n Section to Segment mapping:\n"));
4535       printf (_("  Segment Sections...\n"));
4536
4537       for (i = 0; i < elf_header.e_phnum; i++)
4538         {
4539           unsigned int j;
4540           Elf_Internal_Shdr * section;
4541
4542           segment = program_headers + i;
4543           section = section_headers + 1;
4544
4545           printf ("   %2.2d     ", i);
4546
4547           for (j = 1; j < elf_header.e_shnum; j++, section++)
4548             {
4549               if (!ELF_TBSS_SPECIAL (section, segment)
4550                   && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
4551                 printf ("%s ", printable_section_name (section));
4552             }
4553
4554           putc ('\n',stdout);
4555         }
4556     }
4557
4558   return 1;
4559 }
4560
4561
4562 /* Find the file offset corresponding to VMA by using the program headers.  */
4563
4564 static long
4565 offset_from_vma (FILE * file, bfd_vma vma, bfd_size_type size)
4566 {
4567   Elf_Internal_Phdr * seg;
4568
4569   if (! get_program_headers (file))
4570     {
4571       warn (_("Cannot interpret virtual addresses without program headers.\n"));
4572       return (long) vma;
4573     }
4574
4575   for (seg = program_headers;
4576        seg < program_headers + elf_header.e_phnum;
4577        ++seg)
4578     {
4579       if (seg->p_type != PT_LOAD)
4580         continue;
4581
4582       if (vma >= (seg->p_vaddr & -seg->p_align)
4583           && vma + size <= seg->p_vaddr + seg->p_filesz)
4584         return vma - seg->p_vaddr + seg->p_offset;
4585     }
4586
4587   warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
4588         (unsigned long) vma);
4589   return (long) vma;
4590 }
4591
4592
4593 /* Allocate memory and load the sections headers into the global pointer
4594    SECTION_HEADERS.  If PROBE is true, this is just a probe and we do not
4595    generate any error messages if the load fails.  */
4596
4597 static bfd_boolean
4598 get_32bit_section_headers (FILE * file, bfd_boolean probe)
4599 {
4600   Elf32_External_Shdr * shdrs;
4601   Elf_Internal_Shdr *   internal;
4602   unsigned int i;
4603   unsigned int size = elf_header.e_shentsize;
4604   unsigned int num = probe ? 1 : elf_header.e_shnum;
4605
4606   /* PR binutils/17531: Cope with unexpected section header sizes.  */
4607   if (size == 0 || num == 0)
4608     return FALSE;
4609   if (size < sizeof * shdrs)
4610     {
4611       if (! probe)
4612         error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
4613       return FALSE;
4614     }
4615   if (!probe && size > sizeof * shdrs)
4616     warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
4617
4618   shdrs = (Elf32_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
4619                                             size, num,
4620                                             probe ? NULL : _("section headers"));
4621   if (shdrs == NULL)
4622     return FALSE;
4623
4624   if (section_headers != NULL)
4625     free (section_headers);
4626   section_headers = (Elf_Internal_Shdr *) cmalloc (num,
4627                                                    sizeof (Elf_Internal_Shdr));
4628   if (section_headers == NULL)
4629     {
4630       if (!probe)
4631         error (_("Out of memory reading %u section headers\n"), num);
4632       return FALSE;
4633     }
4634
4635   for (i = 0, internal = section_headers;
4636        i < num;
4637        i++, internal++)
4638     {
4639       internal->sh_name      = BYTE_GET (shdrs[i].sh_name);
4640       internal->sh_type      = BYTE_GET (shdrs[i].sh_type);
4641       internal->sh_flags     = BYTE_GET (shdrs[i].sh_flags);
4642       internal->sh_addr      = BYTE_GET (shdrs[i].sh_addr);
4643       internal->sh_offset    = BYTE_GET (shdrs[i].sh_offset);
4644       internal->sh_size      = BYTE_GET (shdrs[i].sh_size);
4645       internal->sh_link      = BYTE_GET (shdrs[i].sh_link);
4646       internal->sh_info      = BYTE_GET (shdrs[i].sh_info);
4647       internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
4648       internal->sh_entsize   = BYTE_GET (shdrs[i].sh_entsize);
4649     }
4650
4651   free (shdrs);
4652   return TRUE;
4653 }
4654
4655 static bfd_boolean
4656 get_64bit_section_headers (FILE * file, bfd_boolean probe)
4657 {
4658   Elf64_External_Shdr * shdrs;
4659   Elf_Internal_Shdr *   internal;
4660   unsigned int i;
4661   unsigned int size = elf_header.e_shentsize;
4662   unsigned int num = probe ? 1 : elf_header.e_shnum;
4663
4664   /* PR binutils/17531: Cope with unexpected section header sizes.  */
4665   if (size == 0 || num == 0)
4666     return FALSE;
4667   if (size < sizeof * shdrs)
4668     {
4669       if (! probe)
4670         error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
4671       return FALSE;
4672     }
4673   if (! probe && size > sizeof * shdrs)
4674     warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
4675
4676   shdrs = (Elf64_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
4677                                             size, num,
4678                                             probe ? NULL : _("section headers"));
4679   if (shdrs == NULL)
4680     return FALSE;
4681
4682   if (section_headers != NULL)
4683     free (section_headers);
4684   section_headers = (Elf_Internal_Shdr *) cmalloc (num,
4685                                                    sizeof (Elf_Internal_Shdr));
4686   if (section_headers == NULL)
4687     {
4688       if (! probe)
4689         error (_("Out of memory reading %u section headers\n"), num);
4690       return FALSE;
4691     }
4692
4693   for (i = 0, internal = section_headers;
4694        i < num;
4695        i++, internal++)
4696     {
4697       internal->sh_name      = BYTE_GET (shdrs[i].sh_name);
4698       internal->sh_type      = BYTE_GET (shdrs[i].sh_type);
4699       internal->sh_flags     = BYTE_GET (shdrs[i].sh_flags);
4700       internal->sh_addr      = BYTE_GET (shdrs[i].sh_addr);
4701       internal->sh_size      = BYTE_GET (shdrs[i].sh_size);
4702       internal->sh_entsize   = BYTE_GET (shdrs[i].sh_entsize);
4703       internal->sh_link      = BYTE_GET (shdrs[i].sh_link);
4704       internal->sh_info      = BYTE_GET (shdrs[i].sh_info);
4705       internal->sh_offset    = BYTE_GET (shdrs[i].sh_offset);
4706       internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
4707     }
4708
4709   free (shdrs);
4710   return TRUE;
4711 }
4712
4713 static Elf_Internal_Sym *
4714 get_32bit_elf_symbols (FILE * file,
4715                        Elf_Internal_Shdr * section,
4716                        unsigned long * num_syms_return)
4717 {
4718   unsigned long number = 0;
4719   Elf32_External_Sym * esyms = NULL;
4720   Elf_External_Sym_Shndx * shndx = NULL;
4721   Elf_Internal_Sym * isyms = NULL;
4722   Elf_Internal_Sym * psym;
4723   unsigned int j;
4724
4725   /* Run some sanity checks first.  */
4726   if (section->sh_entsize == 0)
4727     {
4728       error (_("sh_entsize is zero\n"));
4729       goto exit_point;
4730     }
4731
4732   if (section->sh_size > current_file_size)
4733     {
4734       error (_("Section %s has an invalid sh_size of 0x%lx\n"),
4735              printable_section_name (section), (unsigned long) section->sh_size);
4736       goto exit_point;
4737     }
4738
4739   number = section->sh_size / section->sh_entsize;
4740
4741   if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
4742     {
4743       error (_("Invalid sh_entsize\n"));
4744       goto exit_point;
4745     }
4746
4747   esyms = (Elf32_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
4748                                            section->sh_size, _("symbols"));
4749   if (esyms == NULL)
4750     goto exit_point;
4751
4752   shndx = NULL;
4753   if (symtab_shndx_hdr != NULL
4754       && (symtab_shndx_hdr->sh_link
4755           == (unsigned long) (section - section_headers)))
4756     {
4757       shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
4758                                                    symtab_shndx_hdr->sh_offset,
4759                                                    1, symtab_shndx_hdr->sh_size,
4760                                                    _("symbol table section indicies"));
4761       if (shndx == NULL)
4762         goto exit_point;
4763     }
4764
4765   isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
4766
4767   if (isyms == NULL)
4768     {
4769       error (_("Out of memory reading %lu symbols\n"),
4770              (unsigned long) number);
4771       goto exit_point;
4772     }
4773
4774   for (j = 0, psym = isyms; j < number; j++, psym++)
4775     {
4776       psym->st_name  = BYTE_GET (esyms[j].st_name);
4777       psym->st_value = BYTE_GET (esyms[j].st_value);
4778       psym->st_size  = BYTE_GET (esyms[j].st_size);
4779       psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
4780       if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
4781         psym->st_shndx
4782           = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
4783       else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
4784         psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
4785       psym->st_info  = BYTE_GET (esyms[j].st_info);
4786       psym->st_other = BYTE_GET (esyms[j].st_other);
4787     }
4788
4789  exit_point:
4790   if (shndx != NULL)
4791     free (shndx);
4792   if (esyms != NULL)
4793     free (esyms);
4794
4795   if (num_syms_return != NULL)
4796     * num_syms_return = isyms == NULL ? 0 : number;
4797
4798   return isyms;
4799 }
4800
4801 static Elf_Internal_Sym *
4802 get_64bit_elf_symbols (FILE * file,
4803                        Elf_Internal_Shdr * section,
4804                        unsigned long * num_syms_return)
4805 {
4806   unsigned long number = 0;
4807   Elf64_External_Sym * esyms = NULL;
4808   Elf_External_Sym_Shndx * shndx = NULL;
4809   Elf_Internal_Sym * isyms = NULL;
4810   Elf_Internal_Sym * psym;
4811   unsigned int j;
4812
4813   /* Run some sanity checks first.  */
4814   if (section->sh_entsize == 0)
4815     {
4816       error (_("sh_entsize is zero\n"));
4817       goto exit_point;
4818     }
4819
4820   if (section->sh_size > current_file_size)
4821     {
4822       error (_("Section %s has an invalid sh_size of 0x%lx\n"),
4823              printable_section_name (section), (unsigned long) section->sh_size);
4824       goto exit_point;
4825     }
4826
4827   number = section->sh_size / section->sh_entsize;
4828
4829   if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
4830     {
4831       error (_("Invalid sh_entsize\n"));
4832       goto exit_point;
4833     }
4834
4835   esyms = (Elf64_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
4836                                            section->sh_size, _("symbols"));
4837   if (!esyms)
4838     goto exit_point;
4839
4840   if (symtab_shndx_hdr != NULL
4841       && (symtab_shndx_hdr->sh_link
4842           == (unsigned long) (section - section_headers)))
4843     {
4844       shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
4845                                                    symtab_shndx_hdr->sh_offset,
4846                                                    1, symtab_shndx_hdr->sh_size,
4847                                                    _("symbol table section indicies"));
4848       if (shndx == NULL)
4849         goto exit_point;
4850     }
4851
4852   isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
4853
4854   if (isyms == NULL)
4855     {
4856       error (_("Out of memory reading %lu symbols\n"),
4857              (unsigned long) number);
4858       goto exit_point;
4859     }
4860
4861   for (j = 0, psym = isyms; j < number; j++, psym++)
4862     {
4863       psym->st_name  = BYTE_GET (esyms[j].st_name);
4864       psym->st_info  = BYTE_GET (esyms[j].st_info);
4865       psym->st_other = BYTE_GET (esyms[j].st_other);
4866       psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
4867
4868       if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
4869         psym->st_shndx
4870           = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
4871       else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
4872         psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
4873
4874       psym->st_value = BYTE_GET (esyms[j].st_value);
4875       psym->st_size  = BYTE_GET (esyms[j].st_size);
4876     }
4877
4878  exit_point:
4879   if (shndx != NULL)
4880     free (shndx);
4881   if (esyms != NULL)
4882     free (esyms);
4883
4884   if (num_syms_return != NULL)
4885     * num_syms_return = isyms == NULL ? 0 : number;
4886
4887   return isyms;
4888 }
4889
4890 static const char *
4891 get_elf_section_flags (bfd_vma sh_flags)
4892 {
4893   static char buff[1024];
4894   char * p = buff;
4895   int field_size = is_32bit_elf ? 8 : 16;
4896   int sindex;
4897   int size = sizeof (buff) - (field_size + 4 + 1);
4898   bfd_vma os_flags = 0;
4899   bfd_vma proc_flags = 0;
4900   bfd_vma unknown_flags = 0;
4901   static const struct
4902     {
4903       const char * str;
4904       int len;
4905     }
4906   flags [] =
4907     {
4908       /*  0 */ { STRING_COMMA_LEN ("WRITE") },
4909       /*  1 */ { STRING_COMMA_LEN ("ALLOC") },
4910       /*  2 */ { STRING_COMMA_LEN ("EXEC") },
4911       /*  3 */ { STRING_COMMA_LEN ("MERGE") },
4912       /*  4 */ { STRING_COMMA_LEN ("STRINGS") },
4913       /*  5 */ { STRING_COMMA_LEN ("INFO LINK") },
4914       /*  6 */ { STRING_COMMA_LEN ("LINK ORDER") },
4915       /*  7 */ { STRING_COMMA_LEN ("OS NONCONF") },
4916       /*  8 */ { STRING_COMMA_LEN ("GROUP") },
4917       /*  9 */ { STRING_COMMA_LEN ("TLS") },
4918       /* IA-64 specific.  */
4919       /* 10 */ { STRING_COMMA_LEN ("SHORT") },
4920       /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
4921       /* IA-64 OpenVMS specific.  */
4922       /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
4923       /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
4924       /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
4925       /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
4926       /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
4927       /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
4928       /* Generic.  */
4929       /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
4930       /* SPARC specific.  */
4931       /* 19 */ { STRING_COMMA_LEN ("ORDERED") }
4932     };
4933
4934   if (do_section_details)
4935     {
4936       sprintf (buff, "[%*.*lx]: ",
4937                field_size, field_size, (unsigned long) sh_flags);
4938       p += field_size + 4;
4939     }
4940
4941   while (sh_flags)
4942     {
4943       bfd_vma flag;
4944
4945       flag = sh_flags & - sh_flags;
4946       sh_flags &= ~ flag;
4947
4948       if (do_section_details)
4949         {
4950           switch (flag)
4951             {
4952             case SHF_WRITE:             sindex = 0; break;
4953             case SHF_ALLOC:             sindex = 1; break;
4954             case SHF_EXECINSTR:         sindex = 2; break;
4955             case SHF_MERGE:             sindex = 3; break;
4956             case SHF_STRINGS:           sindex = 4; break;
4957             case SHF_INFO_LINK:         sindex = 5; break;
4958             case SHF_LINK_ORDER:        sindex = 6; break;
4959             case SHF_OS_NONCONFORMING:  sindex = 7; break;
4960             case SHF_GROUP:             sindex = 8; break;
4961             case SHF_TLS:               sindex = 9; break;
4962             case SHF_EXCLUDE:           sindex = 18; break;
4963
4964             default:
4965               sindex = -1;
4966               switch (elf_header.e_machine)
4967                 {
4968                 case EM_IA_64:
4969                   if (flag == SHF_IA_64_SHORT)
4970                     sindex = 10;
4971                   else if (flag == SHF_IA_64_NORECOV)
4972                     sindex = 11;
4973 #ifdef BFD64
4974                   else if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
4975                     switch (flag)
4976                       {
4977                       case SHF_IA_64_VMS_GLOBAL:      sindex = 12; break;
4978                       case SHF_IA_64_VMS_OVERLAID:    sindex = 13; break;
4979                       case SHF_IA_64_VMS_SHARED:      sindex = 14; break;
4980                       case SHF_IA_64_VMS_VECTOR:      sindex = 15; break;
4981                       case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
4982                       case SHF_IA_64_VMS_PROTECTED:   sindex = 17; break;
4983                       default:                        break;
4984                       }
4985 #endif
4986                   break;
4987
4988                 case EM_386:
4989                 case EM_486:
4990                 case EM_X86_64:
4991                 case EM_L1OM:
4992                 case EM_K1OM:
4993                 case EM_OLD_SPARCV9:
4994                 case EM_SPARC32PLUS:
4995                 case EM_SPARCV9:
4996                 case EM_SPARC:
4997                   if (flag == SHF_ORDERED)
4998                     sindex = 19;
4999                   break;
5000                 default:
5001                   break;
5002                 }
5003             }
5004
5005           if (sindex != -1)
5006             {
5007               if (p != buff + field_size + 4)
5008                 {
5009                   if (size < (10 + 2))
5010                     abort ();
5011                   size -= 2;
5012                   *p++ = ',';
5013                   *p++ = ' ';
5014                 }
5015
5016               size -= flags [sindex].len;
5017               p = stpcpy (p, flags [sindex].str);
5018             }
5019           else if (flag & SHF_MASKOS)
5020             os_flags |= flag;
5021           else if (flag & SHF_MASKPROC)
5022             proc_flags |= flag;
5023           else
5024             unknown_flags |= flag;
5025         }
5026       else
5027         {
5028           switch (flag)
5029             {
5030             case SHF_WRITE:             *p = 'W'; break;
5031             case SHF_ALLOC:             *p = 'A'; break;
5032             case SHF_EXECINSTR:         *p = 'X'; break;
5033             case SHF_MERGE:             *p = 'M'; break;
5034             case SHF_STRINGS:           *p = 'S'; break;
5035             case SHF_INFO_LINK:         *p = 'I'; break;
5036             case SHF_LINK_ORDER:        *p = 'L'; break;
5037             case SHF_OS_NONCONFORMING:  *p = 'O'; break;
5038             case SHF_GROUP:             *p = 'G'; break;
5039             case SHF_TLS:               *p = 'T'; break;
5040             case SHF_EXCLUDE:           *p = 'E'; break;
5041
5042             default:
5043               if ((elf_header.e_machine == EM_X86_64
5044                    || elf_header.e_machine == EM_L1OM
5045                    || elf_header.e_machine == EM_K1OM)
5046                   && flag == SHF_X86_64_LARGE)
5047                 *p = 'l';
5048               else if (flag & SHF_MASKOS)
5049                 {
5050                   *p = 'o';
5051                   sh_flags &= ~ SHF_MASKOS;
5052                 }
5053               else if (flag & SHF_MASKPROC)
5054                 {
5055                   *p = 'p';
5056                   sh_flags &= ~ SHF_MASKPROC;
5057                 }
5058               else
5059                 *p = 'x';
5060               break;
5061             }
5062           p++;
5063         }
5064     }
5065
5066   if (do_section_details)
5067     {
5068       if (os_flags)
5069         {
5070           size -= 5 + field_size;
5071           if (p != buff + field_size + 4)
5072             {
5073               if (size < (2 + 1))
5074                 abort ();
5075               size -= 2;
5076               *p++ = ',';
5077               *p++ = ' ';
5078             }
5079           sprintf (p, "OS (%*.*lx)", field_size, field_size,
5080                    (unsigned long) os_flags);
5081           p += 5 + field_size;
5082         }
5083       if (proc_flags)
5084         {
5085           size -= 7 + field_size;
5086           if (p != buff + field_size + 4)
5087             {
5088               if (size < (2 + 1))
5089                 abort ();
5090               size -= 2;
5091               *p++ = ',';
5092               *p++ = ' ';
5093             }
5094           sprintf (p, "PROC (%*.*lx)", field_size, field_size,
5095                    (unsigned long) proc_flags);
5096           p += 7 + field_size;
5097         }
5098       if (unknown_flags)
5099         {
5100           size -= 10 + field_size;
5101           if (p != buff + field_size + 4)
5102             {
5103               if (size < (2 + 1))
5104                 abort ();
5105               size -= 2;
5106               *p++ = ',';
5107               *p++ = ' ';
5108             }
5109           sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
5110                    (unsigned long) unknown_flags);
5111           p += 10 + field_size;
5112         }
5113     }
5114
5115   *p = '\0';
5116   return buff;
5117 }
5118
5119 static int
5120 process_section_headers (FILE * file)
5121 {
5122   Elf_Internal_Shdr * section;
5123   unsigned int i;
5124
5125   section_headers = NULL;
5126
5127   if (elf_header.e_shnum == 0)
5128     {
5129       /* PR binutils/12467.  */
5130       if (elf_header.e_shoff != 0)
5131         warn (_("possibly corrupt ELF file header - it has a non-zero"
5132                 " section header offset, but no section headers\n"));
5133       else if (do_sections)
5134         printf (_("\nThere are no sections in this file.\n"));
5135
5136       return 1;
5137     }
5138
5139   if (do_sections && !do_header)
5140     printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
5141             elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
5142
5143   if (is_32bit_elf)
5144     {
5145       if (! get_32bit_section_headers (file, FALSE))
5146         return 0;
5147     }
5148   else if (! get_64bit_section_headers (file, FALSE))
5149     return 0;
5150
5151   /* Read in the string table, so that we have names to display.  */
5152   if (elf_header.e_shstrndx != SHN_UNDEF
5153        && elf_header.e_shstrndx < elf_header.e_shnum)
5154     {
5155       section = section_headers + elf_header.e_shstrndx;
5156
5157       if (section->sh_size != 0)
5158         {
5159           string_table = (char *) get_data (NULL, file, section->sh_offset,
5160                                             1, section->sh_size,
5161                                             _("string table"));
5162
5163           string_table_length = string_table != NULL ? section->sh_size : 0;
5164         }
5165     }
5166
5167   /* Scan the sections for the dynamic symbol table
5168      and dynamic string table and debug sections.  */
5169   dynamic_symbols = NULL;
5170   dynamic_strings = NULL;
5171   dynamic_syminfo = NULL;
5172   symtab_shndx_hdr = NULL;
5173
5174   eh_addr_size = is_32bit_elf ? 4 : 8;
5175   switch (elf_header.e_machine)
5176     {
5177     case EM_MIPS:
5178     case EM_MIPS_RS3_LE:
5179       /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
5180          FDE addresses.  However, the ABI also has a semi-official ILP32
5181          variant for which the normal FDE address size rules apply.
5182
5183          GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
5184          section, where XX is the size of longs in bits.  Unfortunately,
5185          earlier compilers provided no way of distinguishing ILP32 objects
5186          from LP64 objects, so if there's any doubt, we should assume that
5187          the official LP64 form is being used.  */
5188       if ((elf_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
5189           && find_section (".gcc_compiled_long32") == NULL)
5190         eh_addr_size = 8;
5191       break;
5192
5193     case EM_H8_300:
5194     case EM_H8_300H:
5195       switch (elf_header.e_flags & EF_H8_MACH)
5196         {
5197         case E_H8_MACH_H8300:
5198         case E_H8_MACH_H8300HN:
5199         case E_H8_MACH_H8300SN:
5200         case E_H8_MACH_H8300SXN:
5201           eh_addr_size = 2;
5202           break;
5203         case E_H8_MACH_H8300H:
5204         case E_H8_MACH_H8300S:
5205         case E_H8_MACH_H8300SX:
5206           eh_addr_size = 4;
5207           break;
5208         }
5209       break;
5210
5211     case EM_M32C_OLD:
5212     case EM_M32C:
5213       switch (elf_header.e_flags & EF_M32C_CPU_MASK)
5214         {
5215         case EF_M32C_CPU_M16C:
5216           eh_addr_size = 2;
5217           break;
5218         }
5219       break;
5220     }
5221
5222 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64)                \
5223   do                                                                    \
5224     {                                                                   \
5225       bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64;  \
5226       if (section->sh_entsize != expected_entsize)                      \
5227         {                                                               \
5228           char buf[40];                                                 \
5229           sprintf_vma (buf, section->sh_entsize);                       \
5230           /* Note: coded this way so that there is a single string for  \
5231              translation.  */ \
5232           error (_("Section %d has invalid sh_entsize of %s\n"), i, buf); \
5233           error (_("(Using the expected size of %u for the rest of this dump)\n"), \
5234                    (unsigned) expected_entsize);                        \
5235           section->sh_entsize = expected_entsize;                       \
5236         }                                                               \
5237     }                                                                   \
5238   while (0)
5239
5240 #define CHECK_ENTSIZE(section, i, type)                                 \
5241   CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type),         \
5242                         sizeof (Elf64_External_##type))
5243
5244   for (i = 0, section = section_headers;
5245        i < elf_header.e_shnum;
5246        i++, section++)
5247     {
5248       char * name = SECTION_NAME (section);
5249
5250       if (section->sh_type == SHT_DYNSYM)
5251         {
5252           if (dynamic_symbols != NULL)
5253             {
5254               error (_("File contains multiple dynamic symbol tables\n"));
5255               continue;
5256             }
5257
5258           CHECK_ENTSIZE (section, i, Sym);
5259           dynamic_symbols = GET_ELF_SYMBOLS (file, section, & num_dynamic_syms);
5260         }
5261       else if (section->sh_type == SHT_STRTAB
5262                && streq (name, ".dynstr"))
5263         {
5264           if (dynamic_strings != NULL)
5265             {
5266               error (_("File contains multiple dynamic string tables\n"));
5267               continue;
5268             }
5269
5270           dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
5271                                                1, section->sh_size,
5272                                                _("dynamic strings"));
5273           dynamic_strings_length = dynamic_strings == NULL ? 0 : section->sh_size;
5274         }
5275       else if (section->sh_type == SHT_SYMTAB_SHNDX)
5276         {
5277           if (symtab_shndx_hdr != NULL)
5278             {
5279               error (_("File contains multiple symtab shndx tables\n"));
5280               continue;
5281             }
5282           symtab_shndx_hdr = section;
5283         }
5284       else if (section->sh_type == SHT_SYMTAB)
5285         CHECK_ENTSIZE (section, i, Sym);
5286       else if (section->sh_type == SHT_GROUP)
5287         CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
5288       else if (section->sh_type == SHT_REL)
5289         CHECK_ENTSIZE (section, i, Rel);
5290       else if (section->sh_type == SHT_RELA)
5291         CHECK_ENTSIZE (section, i, Rela);
5292       else if ((do_debugging || do_debug_info || do_debug_abbrevs
5293                 || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
5294                 || do_debug_aranges || do_debug_frames || do_debug_macinfo
5295                 || do_debug_str || do_debug_loc || do_debug_ranges
5296                 || do_debug_addr || do_debug_cu_index)
5297                && (const_strneq (name, ".debug_")
5298                    || const_strneq (name, ".zdebug_")))
5299         {
5300           if (name[1] == 'z')
5301             name += sizeof (".zdebug_") - 1;
5302           else
5303             name += sizeof (".debug_") - 1;
5304
5305           if (do_debugging
5306               || (do_debug_info     && const_strneq (name, "info"))
5307               || (do_debug_info     && const_strneq (name, "types"))
5308               || (do_debug_abbrevs  && const_strneq (name, "abbrev"))
5309               || (do_debug_lines    && strcmp (name, "line") == 0)
5310               || (do_debug_lines    && const_strneq (name, "line."))
5311               || (do_debug_pubnames && const_strneq (name, "pubnames"))
5312               || (do_debug_pubtypes && const_strneq (name, "pubtypes"))
5313               || (do_debug_pubnames && const_strneq (name, "gnu_pubnames"))
5314               || (do_debug_pubtypes && const_strneq (name, "gnu_pubtypes"))
5315               || (do_debug_aranges  && const_strneq (name, "aranges"))
5316               || (do_debug_ranges   && const_strneq (name, "ranges"))
5317               || (do_debug_frames   && const_strneq (name, "frame"))
5318               || (do_debug_macinfo  && const_strneq (name, "macinfo"))
5319               || (do_debug_macinfo  && const_strneq (name, "macro"))
5320               || (do_debug_str      && const_strneq (name, "str"))
5321               || (do_debug_loc      && const_strneq (name, "loc"))
5322               || (do_debug_addr     && const_strneq (name, "addr"))
5323               || (do_debug_cu_index && const_strneq (name, "cu_index"))
5324               || (do_debug_cu_index && const_strneq (name, "tu_index"))
5325               )
5326             request_dump_bynumber (i, DEBUG_DUMP);
5327         }
5328       /* Linkonce section to be combined with .debug_info at link time.  */
5329       else if ((do_debugging || do_debug_info)
5330                && const_strneq (name, ".gnu.linkonce.wi."))
5331         request_dump_bynumber (i, DEBUG_DUMP);
5332       else if (do_debug_frames && streq (name, ".eh_frame"))
5333         request_dump_bynumber (i, DEBUG_DUMP);
5334       else if (do_gdb_index && streq (name, ".gdb_index"))
5335         request_dump_bynumber (i, DEBUG_DUMP);
5336       /* Trace sections for Itanium VMS.  */
5337       else if ((do_debugging || do_trace_info || do_trace_abbrevs
5338                 || do_trace_aranges)
5339                && const_strneq (name, ".trace_"))
5340         {
5341           name += sizeof (".trace_") - 1;
5342
5343           if (do_debugging
5344               || (do_trace_info     && streq (name, "info"))
5345               || (do_trace_abbrevs  && streq (name, "abbrev"))
5346               || (do_trace_aranges  && streq (name, "aranges"))
5347               )
5348             request_dump_bynumber (i, DEBUG_DUMP);
5349         }
5350     }
5351
5352   if (! do_sections)
5353     return 1;
5354
5355   if (elf_header.e_shnum > 1)
5356     printf (_("\nSection Headers:\n"));
5357   else
5358     printf (_("\nSection Header:\n"));
5359
5360   if (is_32bit_elf)
5361     {
5362       if (do_section_details)
5363         {
5364           printf (_("  [Nr] Name\n"));
5365           printf (_("       Type            Addr     Off    Size   ES   Lk Inf Al\n"));
5366         }
5367       else
5368         printf
5369           (_("  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al\n"));
5370     }
5371   else if (do_wide)
5372     {
5373       if (do_section_details)
5374         {
5375           printf (_("  [Nr] Name\n"));
5376           printf (_("       Type            Address          Off    Size   ES   Lk Inf Al\n"));
5377         }
5378       else
5379         printf
5380           (_("  [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al\n"));
5381     }
5382   else
5383     {
5384       if (do_section_details)
5385         {
5386           printf (_("  [Nr] Name\n"));
5387           printf (_("       Type              Address          Offset            Link\n"));
5388           printf (_("       Size              EntSize          Info              Align\n"));
5389         }
5390       else
5391         {
5392           printf (_("  [Nr] Name              Type             Address           Offset\n"));
5393           printf (_("       Size              EntSize          Flags  Link  Info  Align\n"));
5394         }
5395     }
5396
5397   if (do_section_details)
5398     printf (_("       Flags\n"));
5399
5400   for (i = 0, section = section_headers;
5401        i < elf_header.e_shnum;
5402        i++, section++)
5403     {
5404       printf ("  [%2u] ", i);
5405       if (do_section_details)
5406         printf ("%s\n      ", printable_section_name (section));
5407       else
5408         print_symbol (-17, SECTION_NAME (section));
5409
5410       printf (do_wide ? " %-15s " : " %-15.15s ",
5411               get_section_type_name (section->sh_type));
5412
5413       if (is_32bit_elf)
5414         {
5415           const char * link_too_big = NULL;
5416
5417           print_vma (section->sh_addr, LONG_HEX);
5418
5419           printf ( " %6.6lx %6.6lx %2.2lx",
5420                    (unsigned long) section->sh_offset,
5421                    (unsigned long) section->sh_size,
5422                    (unsigned long) section->sh_entsize);
5423
5424           if (do_section_details)
5425             fputs ("  ", stdout);
5426           else
5427             printf (" %3s ", get_elf_section_flags (section->sh_flags));
5428
5429           if (section->sh_link >= elf_header.e_shnum)
5430             {
5431               link_too_big = "";
5432               /* The sh_link value is out of range.  Normally this indicates
5433                  an error but it can have special values in Solaris binaries.  */
5434               switch (elf_header.e_machine)
5435                 {
5436                 case EM_386:
5437                 case EM_486:
5438                 case EM_X86_64:
5439                 case EM_L1OM:
5440                 case EM_K1OM:
5441                 case EM_OLD_SPARCV9:
5442                 case EM_SPARC32PLUS:
5443                 case EM_SPARCV9:
5444                 case EM_SPARC:
5445                   if (section->sh_link == (SHN_BEFORE & 0xffff))
5446                     link_too_big = "BEFORE";
5447                   else if (section->sh_link == (SHN_AFTER & 0xffff))
5448                     link_too_big = "AFTER";
5449                   break;
5450                 default:
5451                   break;
5452                 }
5453             }
5454
5455           if (do_section_details)
5456             {
5457               if (link_too_big != NULL && * link_too_big)
5458                 printf ("<%s> ", link_too_big);
5459               else
5460                 printf ("%2u ", section->sh_link);
5461               printf ("%3u %2lu\n", section->sh_info,
5462                       (unsigned long) section->sh_addralign);
5463             }
5464           else
5465             printf ("%2u %3u %2lu\n",
5466                     section->sh_link,
5467                     section->sh_info,
5468                     (unsigned long) section->sh_addralign);
5469
5470           if (link_too_big && ! * link_too_big)
5471             warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
5472                   i, section->sh_link);
5473         }
5474       else if (do_wide)
5475         {
5476           print_vma (section->sh_addr, LONG_HEX);
5477
5478           if ((long) section->sh_offset == section->sh_offset)
5479             printf (" %6.6lx", (unsigned long) section->sh_offset);
5480           else
5481             {
5482               putchar (' ');
5483               print_vma (section->sh_offset, LONG_HEX);
5484             }
5485
5486           if ((unsigned long) section->sh_size == section->sh_size)
5487             printf (" %6.6lx", (unsigned long) section->sh_size);
5488           else
5489             {
5490               putchar (' ');
5491               print_vma (section->sh_size, LONG_HEX);
5492             }
5493
5494           if ((unsigned long) section->sh_entsize == section->sh_entsize)
5495             printf (" %2.2lx", (unsigned long) section->sh_entsize);
5496           else
5497             {
5498               putchar (' ');
5499               print_vma (section->sh_entsize, LONG_HEX);
5500             }
5501
5502           if (do_section_details)
5503             fputs ("  ", stdout);
5504           else
5505             printf (" %3s ", get_elf_section_flags (section->sh_flags));
5506
5507           printf ("%2u %3u ", section->sh_link, section->sh_info);
5508
5509           if ((unsigned long) section->sh_addralign == section->sh_addralign)
5510             printf ("%2lu\n", (unsigned long) section->sh_addralign);
5511           else
5512             {
5513               print_vma (section->sh_addralign, DEC);
5514               putchar ('\n');
5515             }
5516         }
5517       else if (do_section_details)
5518         {
5519           printf ("       %-15.15s  ",
5520                   get_section_type_name (section->sh_type));
5521           print_vma (section->sh_addr, LONG_HEX);
5522           if ((long) section->sh_offset == section->sh_offset)
5523             printf ("  %16.16lx", (unsigned long) section->sh_offset);
5524           else
5525             {
5526               printf ("  ");
5527               print_vma (section->sh_offset, LONG_HEX);
5528             }
5529           printf ("  %u\n       ", section->sh_link);
5530           print_vma (section->sh_size, LONG_HEX);
5531           putchar (' ');
5532           print_vma (section->sh_entsize, LONG_HEX);
5533
5534           printf ("  %-16u  %lu\n",
5535                   section->sh_info,
5536                   (unsigned long) section->sh_addralign);
5537         }
5538       else
5539         {
5540           putchar (' ');
5541           print_vma (section->sh_addr, LONG_HEX);
5542           if ((long) section->sh_offset == section->sh_offset)
5543             printf ("  %8.8lx", (unsigned long) section->sh_offset);
5544           else
5545             {
5546               printf ("  ");
5547               print_vma (section->sh_offset, LONG_HEX);
5548             }
5549           printf ("\n       ");
5550           print_vma (section->sh_size, LONG_HEX);
5551           printf ("  ");
5552           print_vma (section->sh_entsize, LONG_HEX);
5553
5554           printf (" %3s ", get_elf_section_flags (section->sh_flags));
5555
5556           printf ("     %2u   %3u     %lu\n",
5557                   section->sh_link,
5558                   section->sh_info,
5559                   (unsigned long) section->sh_addralign);
5560         }
5561
5562       if (do_section_details)
5563         printf ("       %s\n", get_elf_section_flags (section->sh_flags));
5564     }
5565
5566   if (!do_section_details)
5567     {
5568       if (elf_header.e_machine == EM_X86_64
5569           || elf_header.e_machine == EM_L1OM
5570           || elf_header.e_machine == EM_K1OM)
5571         printf (_("Key to Flags:\n\
5572   W (write), A (alloc), X (execute), M (merge), S (strings), l (large)\n\
5573   I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)\n\
5574   O (extra OS processing required) o (OS specific), p (processor specific)\n"));
5575       else
5576         printf (_("Key to Flags:\n\
5577   W (write), A (alloc), X (execute), M (merge), S (strings)\n\
5578   I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)\n\
5579   O (extra OS processing required) o (OS specific), p (processor specific)\n"));
5580     }
5581
5582   return 1;
5583 }
5584
5585 static const char *
5586 get_group_flags (unsigned int flags)
5587 {
5588   static char buff[32];
5589   switch (flags)
5590     {
5591     case 0:
5592       return "";
5593
5594     case GRP_COMDAT:
5595       return "COMDAT ";
5596
5597    default:
5598       snprintf (buff, sizeof (buff), _("[<unknown>: 0x%x] "), flags);
5599       break;
5600     }
5601   return buff;
5602 }
5603
5604 static int
5605 process_section_groups (FILE * file)
5606 {
5607   Elf_Internal_Shdr * section;
5608   unsigned int i;
5609   struct group * group;
5610   Elf_Internal_Shdr * symtab_sec;
5611   Elf_Internal_Shdr * strtab_sec;
5612   Elf_Internal_Sym * symtab;
5613   unsigned long num_syms;
5614   char * strtab;
5615   size_t strtab_size;
5616
5617   /* Don't process section groups unless needed.  */
5618   if (!do_unwind && !do_section_groups)
5619     return 1;
5620
5621   if (elf_header.e_shnum == 0)
5622     {
5623       if (do_section_groups)
5624         printf (_("\nThere are no sections to group in this file.\n"));
5625
5626       return 1;
5627     }
5628
5629   if (section_headers == NULL)
5630     {
5631       error (_("Section headers are not available!\n"));
5632       /* PR 13622: This can happen with a corrupt ELF header.  */
5633       return 0;
5634     }
5635
5636   section_headers_groups = (struct group **) calloc (elf_header.e_shnum,
5637                                                      sizeof (struct group *));
5638
5639   if (section_headers_groups == NULL)
5640     {
5641       error (_("Out of memory reading %u section group headers\n"),
5642              elf_header.e_shnum);
5643       return 0;
5644     }
5645
5646   /* Scan the sections for the group section.  */
5647   group_count = 0;
5648   for (i = 0, section = section_headers;
5649        i < elf_header.e_shnum;
5650        i++, section++)
5651     if (section->sh_type == SHT_GROUP)
5652       group_count++;
5653
5654   if (group_count == 0)
5655     {
5656       if (do_section_groups)
5657         printf (_("\nThere are no section groups in this file.\n"));
5658
5659       return 1;
5660     }
5661
5662   section_groups = (struct group *) calloc (group_count, sizeof (struct group));
5663
5664   if (section_groups == NULL)
5665     {
5666       error (_("Out of memory reading %lu groups\n"),
5667              (unsigned long) group_count);
5668       return 0;
5669     }
5670
5671   symtab_sec = NULL;
5672   strtab_sec = NULL;
5673   symtab = NULL;
5674   num_syms = 0;
5675   strtab = NULL;
5676   strtab_size = 0;
5677   for (i = 0, section = section_headers, group = section_groups;
5678        i < elf_header.e_shnum;
5679        i++, section++)
5680     {
5681       if (section->sh_type == SHT_GROUP)
5682         {
5683           const char * name = printable_section_name (section);
5684           const char * group_name;
5685           unsigned char * start;
5686           unsigned char * indices;
5687           unsigned int entry, j, size;
5688           Elf_Internal_Shdr * sec;
5689           Elf_Internal_Sym * sym;
5690
5691           /* Get the symbol table.  */
5692           if (section->sh_link >= elf_header.e_shnum
5693               || ((sec = section_headers + section->sh_link)->sh_type
5694                   != SHT_SYMTAB))
5695             {
5696               error (_("Bad sh_link in group section `%s'\n"), name);
5697               continue;
5698             }
5699
5700           if (symtab_sec != sec)
5701             {
5702               symtab_sec = sec;
5703               if (symtab)
5704                 free (symtab);
5705               symtab = GET_ELF_SYMBOLS (file, symtab_sec, & num_syms);
5706             }
5707
5708           if (symtab == NULL)
5709             {
5710               error (_("Corrupt header in group section `%s'\n"), name);
5711               continue;
5712             }
5713
5714           if (section->sh_info >= num_syms)
5715             {
5716               error (_("Bad sh_info in group section `%s'\n"), name);
5717               continue;
5718             }
5719
5720           sym = symtab + section->sh_info;
5721
5722           if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
5723             {
5724               if (sym->st_shndx == 0
5725                   || sym->st_shndx >= elf_header.e_shnum)
5726                 {
5727                   error (_("Bad sh_info in group section `%s'\n"), name);
5728                   continue;
5729                 }
5730
5731               group_name = SECTION_NAME (section_headers + sym->st_shndx);
5732               strtab_sec = NULL;
5733               if (strtab)
5734                 free (strtab);
5735               strtab = NULL;
5736               strtab_size = 0;
5737             }
5738           else
5739             {
5740               /* Get the string table.  */
5741               if (symtab_sec->sh_link >= elf_header.e_shnum)
5742                 {
5743                   strtab_sec = NULL;
5744                   if (strtab)
5745                     free (strtab);
5746                   strtab = NULL;
5747                   strtab_size = 0;
5748                 }
5749               else if (strtab_sec
5750                        != (sec = section_headers + symtab_sec->sh_link))
5751                 {
5752                   strtab_sec = sec;
5753                   if (strtab)
5754                     free (strtab);
5755
5756                   strtab = (char *) get_data (NULL, file, strtab_sec->sh_offset,
5757                                               1, strtab_sec->sh_size,
5758                                               _("string table"));
5759                   strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
5760                 }
5761               group_name = sym->st_name < strtab_size
5762                 ? strtab + sym->st_name : _("<corrupt>");
5763             }
5764
5765           start = (unsigned char *) get_data (NULL, file, section->sh_offset,
5766                                               1, section->sh_size,
5767                                               _("section data"));
5768           if (start == NULL)
5769             continue;
5770
5771           indices = start;
5772           size = (section->sh_size / section->sh_entsize) - 1;
5773           entry = byte_get (indices, 4);
5774           indices += 4;
5775
5776           if (do_section_groups)
5777             {
5778               printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
5779                       get_group_flags (entry), i, name, group_name, size);
5780
5781               printf (_("   [Index]    Name\n"));
5782             }
5783
5784           group->group_index = i;
5785
5786           for (j = 0; j < size; j++)
5787             {
5788               struct group_list * g;
5789
5790               entry = byte_get (indices, 4);
5791               indices += 4;
5792
5793               if (entry >= elf_header.e_shnum)
5794                 {
5795                   error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
5796                          entry, i, elf_header.e_shnum - 1);
5797                   continue;
5798                 }
5799
5800               if (section_headers_groups [entry] != NULL)
5801                 {
5802                   if (entry)
5803                     {
5804                       error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
5805                              entry, i,
5806                              section_headers_groups [entry]->group_index);
5807                       continue;
5808                     }
5809                   else
5810                     {
5811                       /* Intel C/C++ compiler may put section 0 in a
5812                          section group. We just warn it the first time
5813                          and ignore it afterwards.  */
5814                       static int warned = 0;
5815                       if (!warned)
5816                         {
5817                           error (_("section 0 in group section [%5u]\n"),
5818                                  section_headers_groups [entry]->group_index);
5819                           warned++;
5820                         }
5821                     }
5822                 }
5823
5824               section_headers_groups [entry] = group;
5825
5826               if (do_section_groups)
5827                 {
5828                   sec = section_headers + entry;
5829                   printf ("   [%5u]   %s\n", entry, printable_section_name (sec));
5830                 }
5831
5832               g = (struct group_list *) xmalloc (sizeof (struct group_list));
5833               g->section_index = entry;
5834               g->next = group->root;
5835               group->root = g;
5836             }
5837
5838           if (start)
5839             free (start);
5840
5841           group++;
5842         }
5843     }
5844
5845   if (symtab)
5846     free (symtab);
5847   if (strtab)
5848     free (strtab);
5849   return 1;
5850 }
5851
5852 /* Data used to display dynamic fixups.  */
5853
5854 struct ia64_vms_dynfixup
5855 {
5856   bfd_vma needed_ident;         /* Library ident number.  */
5857   bfd_vma needed;               /* Index in the dstrtab of the library name.  */
5858   bfd_vma fixup_needed;         /* Index of the library.  */
5859   bfd_vma fixup_rela_cnt;       /* Number of fixups.  */
5860   bfd_vma fixup_rela_off;       /* Fixups offset in the dynamic segment.  */
5861 };
5862
5863 /* Data used to display dynamic relocations.  */
5864
5865 struct ia64_vms_dynimgrela
5866 {
5867   bfd_vma img_rela_cnt;         /* Number of relocations.  */
5868   bfd_vma img_rela_off;         /* Reloc offset in the dynamic segment.  */
5869 };
5870
5871 /* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
5872    library).  */
5873
5874 static void
5875 dump_ia64_vms_dynamic_fixups (FILE *file, struct ia64_vms_dynfixup *fixup,
5876                               const char *strtab, unsigned int strtab_sz)
5877 {
5878   Elf64_External_VMS_IMAGE_FIXUP *imfs;
5879   long i;
5880   const char *lib_name;
5881
5882   imfs = get_data (NULL, file, dynamic_addr + fixup->fixup_rela_off,
5883                    1, fixup->fixup_rela_cnt * sizeof (*imfs),
5884                    _("dynamic section image fixups"));
5885   if (!imfs)
5886     return;
5887
5888   if (fixup->needed < strtab_sz)
5889     lib_name = strtab + fixup->needed;
5890   else
5891     {
5892       warn ("corrupt library name index of 0x%lx found in dynamic entry",
5893             (unsigned long) fixup->needed);
5894       lib_name = "???";
5895     }
5896   printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
5897           (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
5898   printf
5899     (_("Seg Offset           Type                             SymVec DataType\n"));
5900
5901   for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
5902     {
5903       unsigned int type;
5904       const char *rtype;
5905
5906       printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
5907       printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
5908       type = BYTE_GET (imfs [i].type);
5909       rtype = elf_ia64_reloc_type (type);
5910       if (rtype == NULL)
5911         printf (" 0x%08x                       ", type);
5912       else
5913         printf (" %-32s ", rtype);
5914       printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
5915       printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
5916     }
5917
5918   free (imfs);
5919 }
5920
5921 /* Display IA-64 OpenVMS dynamic relocations (used to relocate an image).  */
5922
5923 static void
5924 dump_ia64_vms_dynamic_relocs (FILE *file, struct ia64_vms_dynimgrela *imgrela)
5925 {
5926   Elf64_External_VMS_IMAGE_RELA *imrs;
5927   long i;
5928
5929   imrs = get_data (NULL, file, dynamic_addr + imgrela->img_rela_off,
5930                    1, imgrela->img_rela_cnt * sizeof (*imrs),
5931                    _("dynamic section image relocations"));
5932   if (!imrs)
5933     return;
5934
5935   printf (_("\nImage relocs\n"));
5936   printf
5937     (_("Seg Offset   Type                            Addend            Seg Sym Off\n"));
5938
5939   for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
5940     {
5941       unsigned int type;
5942       const char *rtype;
5943
5944       printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
5945       printf ("%08" BFD_VMA_FMT "x ",
5946               (bfd_vma) BYTE_GET (imrs [i].rela_offset));
5947       type = BYTE_GET (imrs [i].type);
5948       rtype = elf_ia64_reloc_type (type);
5949       if (rtype == NULL)
5950         printf ("0x%08x                      ", type);
5951       else
5952         printf ("%-31s ", rtype);
5953       print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
5954       printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
5955       printf ("%08" BFD_VMA_FMT "x\n",
5956               (bfd_vma) BYTE_GET (imrs [i].sym_offset));
5957     }
5958
5959   free (imrs);
5960 }
5961
5962 /* Display IA-64 OpenVMS dynamic relocations and fixups.  */
5963
5964 static int
5965 process_ia64_vms_dynamic_relocs (FILE *file)
5966 {
5967   struct ia64_vms_dynfixup fixup;
5968   struct ia64_vms_dynimgrela imgrela;
5969   Elf_Internal_Dyn *entry;
5970   int res = 0;
5971   bfd_vma strtab_off = 0;
5972   bfd_vma strtab_sz = 0;
5973   char *strtab = NULL;
5974
5975   memset (&fixup, 0, sizeof (fixup));
5976   memset (&imgrela, 0, sizeof (imgrela));
5977
5978   /* Note: the order of the entries is specified by the OpenVMS specs.  */
5979   for (entry = dynamic_section;
5980        entry < dynamic_section + dynamic_nent;
5981        entry++)
5982     {
5983       switch (entry->d_tag)
5984         {
5985         case DT_IA_64_VMS_STRTAB_OFFSET:
5986           strtab_off = entry->d_un.d_val;
5987           break;
5988         case DT_STRSZ:
5989           strtab_sz = entry->d_un.d_val;
5990           if (strtab == NULL)
5991             strtab = get_data (NULL, file, dynamic_addr + strtab_off,
5992                                1, strtab_sz, _("dynamic string section"));
5993           break;
5994
5995         case DT_IA_64_VMS_NEEDED_IDENT:
5996           fixup.needed_ident = entry->d_un.d_val;
5997           break;
5998         case DT_NEEDED:
5999           fixup.needed = entry->d_un.d_val;
6000           break;
6001         case DT_IA_64_VMS_FIXUP_NEEDED:
6002           fixup.fixup_needed = entry->d_un.d_val;
6003           break;
6004         case DT_IA_64_VMS_FIXUP_RELA_CNT:
6005           fixup.fixup_rela_cnt = entry->d_un.d_val;
6006           break;
6007         case DT_IA_64_VMS_FIXUP_RELA_OFF:
6008           fixup.fixup_rela_off = entry->d_un.d_val;
6009           res++;
6010           dump_ia64_vms_dynamic_fixups (file, &fixup, strtab, strtab_sz);
6011           break;
6012
6013         case DT_IA_64_VMS_IMG_RELA_CNT:
6014           imgrela.img_rela_cnt = entry->d_un.d_val;
6015           break;
6016         case DT_IA_64_VMS_IMG_RELA_OFF:
6017           imgrela.img_rela_off = entry->d_un.d_val;
6018           res++;
6019           dump_ia64_vms_dynamic_relocs (file, &imgrela);
6020           break;
6021
6022         default:
6023           break;
6024         }
6025     }
6026
6027   if (strtab != NULL)
6028     free (strtab);
6029
6030   return res;
6031 }
6032
6033 static struct
6034 {
6035   const char * name;
6036   int reloc;
6037   int size;
6038   int rela;
6039 } dynamic_relocations [] =
6040 {
6041     { "REL", DT_REL, DT_RELSZ, FALSE },
6042     { "RELA", DT_RELA, DT_RELASZ, TRUE },
6043     { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
6044 };
6045
6046 /* Process the reloc section.  */
6047
6048 static int
6049 process_relocs (FILE * file)
6050 {
6051   unsigned long rel_size;
6052   unsigned long rel_offset;
6053
6054
6055   if (!do_reloc)
6056     return 1;
6057
6058   if (do_using_dynamic)
6059     {
6060       int is_rela;
6061       const char * name;
6062       int has_dynamic_reloc;
6063       unsigned int i;
6064
6065       has_dynamic_reloc = 0;
6066
6067       for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
6068         {
6069           is_rela = dynamic_relocations [i].rela;
6070           name = dynamic_relocations [i].name;
6071           rel_size = dynamic_info [dynamic_relocations [i].size];
6072           rel_offset = dynamic_info [dynamic_relocations [i].reloc];
6073
6074           has_dynamic_reloc |= rel_size;
6075
6076           if (is_rela == UNKNOWN)
6077             {
6078               if (dynamic_relocations [i].reloc == DT_JMPREL)
6079                 switch (dynamic_info[DT_PLTREL])
6080                   {
6081                   case DT_REL:
6082                     is_rela = FALSE;
6083                     break;
6084                   case DT_RELA:
6085                     is_rela = TRUE;
6086                     break;
6087                   }
6088             }
6089
6090           if (rel_size)
6091             {
6092               printf
6093                 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
6094                  name, rel_offset, rel_size);
6095
6096               dump_relocations (file,
6097                                 offset_from_vma (file, rel_offset, rel_size),
6098                                 rel_size,
6099                                 dynamic_symbols, num_dynamic_syms,
6100                                 dynamic_strings, dynamic_strings_length, is_rela);
6101             }
6102         }
6103
6104       if (is_ia64_vms ())
6105         has_dynamic_reloc |= process_ia64_vms_dynamic_relocs (file);
6106
6107       if (! has_dynamic_reloc)
6108         printf (_("\nThere are no dynamic relocations in this file.\n"));
6109     }
6110   else
6111     {
6112       Elf_Internal_Shdr * section;
6113       unsigned long i;
6114       int found = 0;
6115
6116       for (i = 0, section = section_headers;
6117            i < elf_header.e_shnum;
6118            i++, section++)
6119         {
6120           if (   section->sh_type != SHT_RELA
6121               && section->sh_type != SHT_REL)
6122             continue;
6123
6124           rel_offset = section->sh_offset;
6125           rel_size   = section->sh_size;
6126
6127           if (rel_size)
6128             {
6129               Elf_Internal_Shdr * strsec;
6130               int is_rela;
6131
6132               printf (_("\nRelocation section "));
6133
6134               if (string_table == NULL)
6135                 printf ("%d", section->sh_name);
6136               else
6137                 printf ("'%s'", printable_section_name (section));
6138
6139               printf (_(" at offset 0x%lx contains %lu entries:\n"),
6140                  rel_offset, (unsigned long) (rel_size / section->sh_entsize));
6141
6142               is_rela = section->sh_type == SHT_RELA;
6143
6144               if (section->sh_link != 0
6145                   && section->sh_link < elf_header.e_shnum)
6146                 {
6147                   Elf_Internal_Shdr * symsec;
6148                   Elf_Internal_Sym *  symtab;
6149                   unsigned long nsyms;
6150                   unsigned long strtablen = 0;
6151                   char * strtab = NULL;
6152
6153                   symsec = section_headers + section->sh_link;
6154                   if (symsec->sh_type != SHT_SYMTAB
6155                       && symsec->sh_type != SHT_DYNSYM)
6156                     continue;
6157
6158                   symtab = GET_ELF_SYMBOLS (file, symsec, & nsyms);
6159
6160                   if (symtab == NULL)
6161                     continue;
6162
6163                   if (symsec->sh_link != 0
6164                       && symsec->sh_link < elf_header.e_shnum)
6165                     {
6166                       strsec = section_headers + symsec->sh_link;
6167
6168                       strtab = (char *) get_data (NULL, file, strsec->sh_offset,
6169                                                   1, strsec->sh_size,
6170                                                   _("string table"));
6171                       strtablen = strtab == NULL ? 0 : strsec->sh_size;
6172                     }
6173
6174                   dump_relocations (file, rel_offset, rel_size,
6175                                     symtab, nsyms, strtab, strtablen, is_rela);
6176                   if (strtab)
6177                     free (strtab);
6178                   free (symtab);
6179                 }
6180               else
6181                 dump_relocations (file, rel_offset, rel_size,
6182                                   NULL, 0, NULL, 0, is_rela);
6183
6184               found = 1;
6185             }
6186         }
6187
6188       if (! found)
6189         printf (_("\nThere are no relocations in this file.\n"));
6190     }
6191
6192   return 1;
6193 }
6194
6195 /* Process the unwind section.  */
6196
6197 #include "unwind-ia64.h"
6198
6199 /* An absolute address consists of a section and an offset.  If the
6200    section is NULL, the offset itself is the address, otherwise, the
6201    address equals to LOAD_ADDRESS(section) + offset.  */
6202
6203 struct absaddr
6204   {
6205     unsigned short section;
6206     bfd_vma offset;
6207   };
6208
6209 #define ABSADDR(a) \
6210   ((a).section \
6211    ? section_headers [(a).section].sh_addr + (a).offset \
6212    : (a).offset)
6213
6214 struct ia64_unw_table_entry
6215   {
6216     struct absaddr start;
6217     struct absaddr end;
6218     struct absaddr info;
6219   };
6220
6221 struct ia64_unw_aux_info
6222   {
6223
6224     struct ia64_unw_table_entry *table; /* Unwind table.  */
6225     unsigned long table_len;    /* Length of unwind table.  */
6226     unsigned char * info;       /* Unwind info.  */
6227     unsigned long info_size;    /* Size of unwind info.  */
6228     bfd_vma info_addr;          /* starting address of unwind info.  */
6229     bfd_vma seg_base;           /* Starting address of segment.  */
6230     Elf_Internal_Sym * symtab;  /* The symbol table.  */
6231     unsigned long nsyms;        /* Number of symbols.  */
6232     char * strtab;              /* The string table.  */
6233     unsigned long strtab_size;  /* Size of string table.  */
6234   };
6235
6236 static void
6237 find_symbol_for_address (Elf_Internal_Sym * symtab,
6238                          unsigned long nsyms,
6239                          const char * strtab,
6240                          unsigned long strtab_size,
6241                          struct absaddr addr,
6242                          const char ** symname,
6243                          bfd_vma * offset)
6244 {
6245   bfd_vma dist = 0x100000;
6246   Elf_Internal_Sym * sym;
6247   Elf_Internal_Sym * best = NULL;
6248   unsigned long i;
6249
6250   REMOVE_ARCH_BITS (addr.offset);
6251
6252   for (i = 0, sym = symtab; i < nsyms; ++i, ++sym)
6253     {
6254       bfd_vma value = sym->st_value;
6255
6256       REMOVE_ARCH_BITS (value);
6257
6258       if (ELF_ST_TYPE (sym->st_info) == STT_FUNC
6259           && sym->st_name != 0
6260           && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
6261           && addr.offset >= value
6262           && addr.offset - value < dist)
6263         {
6264           best = sym;
6265           dist = addr.offset - value;
6266           if (!dist)
6267             break;
6268         }
6269     }
6270
6271   if (best)
6272     {
6273       *symname = (best->st_name >= strtab_size
6274                   ? _("<corrupt>") : strtab + best->st_name);
6275       *offset = dist;
6276       return;
6277     }
6278
6279   *symname = NULL;
6280   *offset = addr.offset;
6281 }
6282
6283 static void
6284 dump_ia64_unwind (struct ia64_unw_aux_info * aux)
6285 {
6286   struct ia64_unw_table_entry * tp;
6287   int in_body;
6288
6289   for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
6290     {
6291       bfd_vma stamp;
6292       bfd_vma offset;
6293       const unsigned char * dp;
6294       const unsigned char * head;
6295       const char * procname;
6296
6297       find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
6298                                aux->strtab_size, tp->start, &procname, &offset);
6299
6300       fputs ("\n<", stdout);
6301
6302       if (procname)
6303         {
6304           fputs (procname, stdout);
6305
6306           if (offset)
6307             printf ("+%lx", (unsigned long) offset);
6308         }
6309
6310       fputs (">: [", stdout);
6311       print_vma (tp->start.offset, PREFIX_HEX);
6312       fputc ('-', stdout);
6313       print_vma (tp->end.offset, PREFIX_HEX);
6314       printf ("], info at +0x%lx\n",
6315               (unsigned long) (tp->info.offset - aux->seg_base));
6316
6317       head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
6318       stamp = byte_get ((unsigned char *) head, sizeof (stamp));
6319
6320       printf ("  v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
6321               (unsigned) UNW_VER (stamp),
6322               (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
6323               UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
6324               UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
6325               (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
6326
6327       if (UNW_VER (stamp) != 1)
6328         {
6329           printf (_("\tUnknown version.\n"));
6330           continue;
6331         }
6332
6333       in_body = 0;
6334       for (dp = head + 8; dp < head + 8 + eh_addr_size * UNW_LENGTH (stamp);)
6335         dp = unw_decode (dp, in_body, & in_body);
6336     }
6337 }
6338
6339 static int
6340 slurp_ia64_unwind_table (FILE * file,
6341                          struct ia64_unw_aux_info * aux,
6342                          Elf_Internal_Shdr * sec)
6343 {
6344   unsigned long size, nrelas, i;
6345   Elf_Internal_Phdr * seg;
6346   struct ia64_unw_table_entry * tep;
6347   Elf_Internal_Shdr * relsec;
6348   Elf_Internal_Rela * rela;
6349   Elf_Internal_Rela * rp;
6350   unsigned char * table;
6351   unsigned char * tp;
6352   Elf_Internal_Sym * sym;
6353   const char * relname;
6354
6355   /* First, find the starting address of the segment that includes
6356      this section: */
6357
6358   if (elf_header.e_phnum)
6359     {
6360       if (! get_program_headers (file))
6361           return 0;
6362
6363       for (seg = program_headers;
6364            seg < program_headers + elf_header.e_phnum;
6365            ++seg)
6366         {
6367           if (seg->p_type != PT_LOAD)
6368             continue;
6369
6370           if (sec->sh_addr >= seg->p_vaddr
6371               && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
6372             {
6373               aux->seg_base = seg->p_vaddr;
6374               break;
6375             }
6376         }
6377     }
6378
6379   /* Second, build the unwind table from the contents of the unwind section:  */
6380   size = sec->sh_size;
6381   table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
6382                                       _("unwind table"));
6383   if (!table)
6384     return 0;
6385
6386   aux->table = (struct ia64_unw_table_entry *)
6387       xcmalloc (size / (3 * eh_addr_size), sizeof (aux->table[0]));
6388   tep = aux->table;
6389   for (tp = table; tp < table + size; ++tep)
6390     {
6391       tep->start.section = SHN_UNDEF;
6392       tep->end.section   = SHN_UNDEF;
6393       tep->info.section  = SHN_UNDEF;
6394       tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
6395       tep->end.offset   = byte_get (tp, eh_addr_size); tp += eh_addr_size;
6396       tep->info.offset  = byte_get (tp, eh_addr_size); tp += eh_addr_size;
6397       tep->start.offset += aux->seg_base;
6398       tep->end.offset   += aux->seg_base;
6399       tep->info.offset  += aux->seg_base;
6400     }
6401   free (table);
6402
6403   /* Third, apply any relocations to the unwind table:  */
6404   for (relsec = section_headers;
6405        relsec < section_headers + elf_header.e_shnum;
6406        ++relsec)
6407     {
6408       if (relsec->sh_type != SHT_RELA
6409           || relsec->sh_info >= elf_header.e_shnum
6410           || section_headers + relsec->sh_info != sec)
6411         continue;
6412
6413       if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
6414                               & rela, & nrelas))
6415         return 0;
6416
6417       for (rp = rela; rp < rela + nrelas; ++rp)
6418         {
6419           relname = elf_ia64_reloc_type (get_reloc_type (rp->r_info));
6420           sym = aux->symtab + get_reloc_symindex (rp->r_info);
6421
6422           if (! const_strneq (relname, "R_IA64_SEGREL"))
6423             {
6424               warn (_("Skipping unexpected relocation type %s\n"), relname);
6425               continue;
6426             }
6427
6428           i = rp->r_offset / (3 * eh_addr_size);
6429
6430           switch (rp->r_offset/eh_addr_size % 3)
6431             {
6432             case 0:
6433               aux->table[i].start.section = sym->st_shndx;
6434               aux->table[i].start.offset  = rp->r_addend + sym->st_value;
6435               break;
6436             case 1:
6437               aux->table[i].end.section   = sym->st_shndx;
6438               aux->table[i].end.offset    = rp->r_addend + sym->st_value;
6439               break;
6440             case 2:
6441               aux->table[i].info.section  = sym->st_shndx;
6442               aux->table[i].info.offset   = rp->r_addend + sym->st_value;
6443               break;
6444             default:
6445               break;
6446             }
6447         }
6448
6449       free (rela);
6450     }
6451
6452   aux->table_len = size / (3 * eh_addr_size);
6453   return 1;
6454 }
6455
6456 static void
6457 ia64_process_unwind (FILE * file)
6458 {
6459   Elf_Internal_Shdr * sec;
6460   Elf_Internal_Shdr * unwsec = NULL;
6461   Elf_Internal_Shdr * strsec;
6462   unsigned long i, unwcount = 0, unwstart = 0;
6463   struct ia64_unw_aux_info aux;
6464
6465   memset (& aux, 0, sizeof (aux));
6466
6467   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
6468     {
6469       if (sec->sh_type == SHT_SYMTAB
6470           && sec->sh_link < elf_header.e_shnum)
6471         {
6472           aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
6473
6474           strsec = section_headers + sec->sh_link;
6475           if (aux.strtab != NULL)
6476             {
6477               error (_("Multiple auxillary string tables encountered\n"));
6478               free (aux.strtab);
6479             }
6480           aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
6481                                           1, strsec->sh_size,
6482                                           _("string table"));
6483           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
6484         }
6485       else if (sec->sh_type == SHT_IA_64_UNWIND)
6486         unwcount++;
6487     }
6488
6489   if (!unwcount)
6490     printf (_("\nThere are no unwind sections in this file.\n"));
6491
6492   while (unwcount-- > 0)
6493     {
6494       char * suffix;
6495       size_t len, len2;
6496
6497       for (i = unwstart, sec = section_headers + unwstart, unwsec = NULL;
6498            i < elf_header.e_shnum; ++i, ++sec)
6499         if (sec->sh_type == SHT_IA_64_UNWIND)
6500           {
6501             unwsec = sec;
6502             break;
6503           }
6504       /* We have already counted the number of SHT_IA64_UNWIND
6505          sections so the loop above should never fail.  */
6506       assert (unwsec != NULL);
6507
6508       unwstart = i + 1;
6509       len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
6510
6511       if ((unwsec->sh_flags & SHF_GROUP) != 0)
6512         {
6513           /* We need to find which section group it is in.  */
6514           struct group_list * g;
6515
6516           if (section_headers_groups == NULL
6517               || section_headers_groups [i] == NULL)
6518             i = elf_header.e_shnum;
6519           else
6520             {
6521               g = section_headers_groups [i]->root;
6522
6523               for (; g != NULL; g = g->next)
6524                 {
6525                   sec = section_headers + g->section_index;
6526
6527                   if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
6528                     break;
6529                 }
6530
6531               if (g == NULL)
6532                 i = elf_header.e_shnum;
6533             }
6534         }
6535       else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
6536         {
6537           /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO.  */
6538           len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
6539           suffix = SECTION_NAME (unwsec) + len;
6540           for (i = 0, sec = section_headers; i < elf_header.e_shnum;
6541                ++i, ++sec)
6542             if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
6543                 && streq (SECTION_NAME (sec) + len2, suffix))
6544               break;
6545         }
6546       else
6547         {
6548           /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
6549              .IA_64.unwind or BAR -> .IA_64.unwind_info.  */
6550           len = sizeof (ELF_STRING_ia64_unwind) - 1;
6551           len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
6552           suffix = "";
6553           if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
6554             suffix = SECTION_NAME (unwsec) + len;
6555           for (i = 0, sec = section_headers; i < elf_header.e_shnum;
6556                ++i, ++sec)
6557             if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
6558                 && streq (SECTION_NAME (sec) + len2, suffix))
6559               break;
6560         }
6561
6562       if (i == elf_header.e_shnum)
6563         {
6564           printf (_("\nCould not find unwind info section for "));
6565
6566           if (string_table == NULL)
6567             printf ("%d", unwsec->sh_name);
6568           else
6569             printf ("'%s'", printable_section_name (unwsec));
6570         }
6571       else
6572         {
6573           aux.info_addr = sec->sh_addr;
6574           aux.info = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1,
6575                                                  sec->sh_size,
6576                                                  _("unwind info"));
6577           aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
6578
6579           printf (_("\nUnwind section "));
6580
6581           if (string_table == NULL)
6582             printf ("%d", unwsec->sh_name);
6583           else
6584             printf ("'%s'", printable_section_name (unwsec));
6585
6586           printf (_(" at offset 0x%lx contains %lu entries:\n"),
6587                   (unsigned long) unwsec->sh_offset,
6588                   (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
6589
6590           (void) slurp_ia64_unwind_table (file, & aux, unwsec);
6591
6592           if (aux.table_len > 0)
6593             dump_ia64_unwind (& aux);
6594
6595           if (aux.table)
6596             free ((char *) aux.table);
6597           if (aux.info)
6598             free ((char *) aux.info);
6599           aux.table = NULL;
6600           aux.info = NULL;
6601         }
6602     }
6603
6604   if (aux.symtab)
6605     free (aux.symtab);
6606   if (aux.strtab)
6607     free ((char *) aux.strtab);
6608 }
6609
6610 struct hppa_unw_table_entry
6611   {
6612     struct absaddr start;
6613     struct absaddr end;
6614     unsigned int Cannot_unwind:1;                       /* 0 */
6615     unsigned int Millicode:1;                   /* 1 */
6616     unsigned int Millicode_save_sr0:1;          /* 2 */
6617     unsigned int Region_description:2;          /* 3..4 */
6618     unsigned int reserved1:1;                   /* 5 */
6619     unsigned int Entry_SR:1;                    /* 6 */
6620     unsigned int Entry_FR:4;     /* number saved */     /* 7..10 */
6621     unsigned int Entry_GR:5;     /* number saved */     /* 11..15 */
6622     unsigned int Args_stored:1;                 /* 16 */
6623     unsigned int Variable_Frame:1;                      /* 17 */
6624     unsigned int Separate_Package_Body:1;               /* 18 */
6625     unsigned int Frame_Extension_Millicode:1;   /* 19 */
6626     unsigned int Stack_Overflow_Check:1;                /* 20 */
6627     unsigned int Two_Instruction_SP_Increment:1;        /* 21 */
6628     unsigned int Ada_Region:1;                  /* 22 */
6629     unsigned int cxx_info:1;                    /* 23 */
6630     unsigned int cxx_try_catch:1;                       /* 24 */
6631     unsigned int sched_entry_seq:1;                     /* 25 */
6632     unsigned int reserved2:1;                   /* 26 */
6633     unsigned int Save_SP:1;                             /* 27 */
6634     unsigned int Save_RP:1;                             /* 28 */
6635     unsigned int Save_MRP_in_frame:1;           /* 29 */
6636     unsigned int extn_ptr_defined:1;            /* 30 */
6637     unsigned int Cleanup_defined:1;                     /* 31 */
6638
6639     unsigned int MPE_XL_interrupt_marker:1;             /* 0 */
6640     unsigned int HP_UX_interrupt_marker:1;              /* 1 */
6641     unsigned int Large_frame:1;                 /* 2 */
6642     unsigned int Pseudo_SP_Set:1;                       /* 3 */
6643     unsigned int reserved4:1;                   /* 4 */
6644     unsigned int Total_frame_size:27;           /* 5..31 */
6645   };
6646
6647 struct hppa_unw_aux_info
6648   {
6649     struct hppa_unw_table_entry *table; /* Unwind table.  */
6650     unsigned long table_len;    /* Length of unwind table.  */
6651     bfd_vma seg_base;           /* Starting address of segment.  */
6652     Elf_Internal_Sym * symtab;  /* The symbol table.  */
6653     unsigned long nsyms;        /* Number of symbols.  */
6654     char * strtab;              /* The string table.  */
6655     unsigned long strtab_size;  /* Size of string table.  */
6656   };
6657
6658 static void
6659 dump_hppa_unwind (struct hppa_unw_aux_info * aux)
6660 {
6661   struct hppa_unw_table_entry * tp;
6662
6663   for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
6664     {
6665       bfd_vma offset;
6666       const char * procname;
6667
6668       find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
6669                                aux->strtab_size, tp->start, &procname,
6670                                &offset);
6671
6672       fputs ("\n<", stdout);
6673
6674       if (procname)
6675         {
6676           fputs (procname, stdout);
6677
6678           if (offset)
6679             printf ("+%lx", (unsigned long) offset);
6680         }
6681
6682       fputs (">: [", stdout);
6683       print_vma (tp->start.offset, PREFIX_HEX);
6684       fputc ('-', stdout);
6685       print_vma (tp->end.offset, PREFIX_HEX);
6686       printf ("]\n\t");
6687
6688 #define PF(_m) if (tp->_m) printf (#_m " ");
6689 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
6690       PF(Cannot_unwind);
6691       PF(Millicode);
6692       PF(Millicode_save_sr0);
6693       /* PV(Region_description);  */
6694       PF(Entry_SR);
6695       PV(Entry_FR);
6696       PV(Entry_GR);
6697       PF(Args_stored);
6698       PF(Variable_Frame);
6699       PF(Separate_Package_Body);
6700       PF(Frame_Extension_Millicode);
6701       PF(Stack_Overflow_Check);
6702       PF(Two_Instruction_SP_Increment);
6703       PF(Ada_Region);
6704       PF(cxx_info);
6705       PF(cxx_try_catch);
6706       PF(sched_entry_seq);
6707       PF(Save_SP);
6708       PF(Save_RP);
6709       PF(Save_MRP_in_frame);
6710       PF(extn_ptr_defined);
6711       PF(Cleanup_defined);
6712       PF(MPE_XL_interrupt_marker);
6713       PF(HP_UX_interrupt_marker);
6714       PF(Large_frame);
6715       PF(Pseudo_SP_Set);
6716       PV(Total_frame_size);
6717 #undef PF
6718 #undef PV
6719     }
6720
6721   printf ("\n");
6722 }
6723
6724 static int
6725 slurp_hppa_unwind_table (FILE * file,
6726                          struct hppa_unw_aux_info * aux,
6727                          Elf_Internal_Shdr * sec)
6728 {
6729   unsigned long size, unw_ent_size, nentries, nrelas, i;
6730   Elf_Internal_Phdr * seg;
6731   struct hppa_unw_table_entry * tep;
6732   Elf_Internal_Shdr * relsec;
6733   Elf_Internal_Rela * rela;
6734   Elf_Internal_Rela * rp;
6735   unsigned char * table;
6736   unsigned char * tp;
6737   Elf_Internal_Sym * sym;
6738   const char * relname;
6739
6740   /* First, find the starting address of the segment that includes
6741      this section.  */
6742
6743   if (elf_header.e_phnum)
6744     {
6745       if (! get_program_headers (file))
6746         return 0;
6747
6748       for (seg = program_headers;
6749            seg < program_headers + elf_header.e_phnum;
6750            ++seg)
6751         {
6752           if (seg->p_type != PT_LOAD)
6753             continue;
6754
6755           if (sec->sh_addr >= seg->p_vaddr
6756               && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
6757             {
6758               aux->seg_base = seg->p_vaddr;
6759               break;
6760             }
6761         }
6762     }
6763
6764   /* Second, build the unwind table from the contents of the unwind
6765      section.  */
6766   size = sec->sh_size;
6767   table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
6768                                       _("unwind table"));
6769   if (!table)
6770     return 0;
6771
6772   unw_ent_size = 16;
6773   nentries = size / unw_ent_size;
6774   size = unw_ent_size * nentries;
6775
6776   tep = aux->table = (struct hppa_unw_table_entry *)
6777       xcmalloc (nentries, sizeof (aux->table[0]));
6778
6779   for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
6780     {
6781       unsigned int tmp1, tmp2;
6782
6783       tep->start.section = SHN_UNDEF;
6784       tep->end.section   = SHN_UNDEF;
6785
6786       tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
6787       tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
6788       tmp1 = byte_get ((unsigned char *) tp + 8, 4);
6789       tmp2 = byte_get ((unsigned char *) tp + 12, 4);
6790
6791       tep->start.offset += aux->seg_base;
6792       tep->end.offset   += aux->seg_base;
6793
6794       tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
6795       tep->Millicode = (tmp1 >> 30) & 0x1;
6796       tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
6797       tep->Region_description = (tmp1 >> 27) & 0x3;
6798       tep->reserved1 = (tmp1 >> 26) & 0x1;
6799       tep->Entry_SR = (tmp1 >> 25) & 0x1;
6800       tep->Entry_FR = (tmp1 >> 21) & 0xf;
6801       tep->Entry_GR = (tmp1 >> 16) & 0x1f;
6802       tep->Args_stored = (tmp1 >> 15) & 0x1;
6803       tep->Variable_Frame = (tmp1 >> 14) & 0x1;
6804       tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
6805       tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
6806       tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
6807       tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
6808       tep->Ada_Region = (tmp1 >> 9) & 0x1;
6809       tep->cxx_info = (tmp1 >> 8) & 0x1;
6810       tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
6811       tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
6812       tep->reserved2 = (tmp1 >> 5) & 0x1;
6813       tep->Save_SP = (tmp1 >> 4) & 0x1;
6814       tep->Save_RP = (tmp1 >> 3) & 0x1;
6815       tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
6816       tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
6817       tep->Cleanup_defined = tmp1 & 0x1;
6818
6819       tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
6820       tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
6821       tep->Large_frame = (tmp2 >> 29) & 0x1;
6822       tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
6823       tep->reserved4 = (tmp2 >> 27) & 0x1;
6824       tep->Total_frame_size = tmp2 & 0x7ffffff;
6825     }
6826   free (table);
6827
6828   /* Third, apply any relocations to the unwind table.  */
6829   for (relsec = section_headers;
6830        relsec < section_headers + elf_header.e_shnum;
6831        ++relsec)
6832     {
6833       if (relsec->sh_type != SHT_RELA
6834           || relsec->sh_info >= elf_header.e_shnum
6835           || section_headers + relsec->sh_info != sec)
6836         continue;
6837
6838       if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
6839                               & rela, & nrelas))
6840         return 0;
6841
6842       for (rp = rela; rp < rela + nrelas; ++rp)
6843         {
6844           relname = elf_hppa_reloc_type (get_reloc_type (rp->r_info));
6845           sym = aux->symtab + get_reloc_symindex (rp->r_info);
6846
6847           /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64.  */
6848           if (! const_strneq (relname, "R_PARISC_SEGREL"))
6849             {
6850               warn (_("Skipping unexpected relocation type %s\n"), relname);
6851               continue;
6852             }
6853
6854           i = rp->r_offset / unw_ent_size;
6855
6856           switch ((rp->r_offset % unw_ent_size) / eh_addr_size)
6857             {
6858             case 0:
6859               aux->table[i].start.section = sym->st_shndx;
6860               aux->table[i].start.offset  = sym->st_value + rp->r_addend;
6861               break;
6862             case 1:
6863               aux->table[i].end.section   = sym->st_shndx;
6864               aux->table[i].end.offset    = sym->st_value + rp->r_addend;
6865               break;
6866             default:
6867               break;
6868             }
6869         }
6870
6871       free (rela);
6872     }
6873
6874   aux->table_len = nentries;
6875
6876   return 1;
6877 }
6878
6879 static void
6880 hppa_process_unwind (FILE * file)
6881 {
6882   struct hppa_unw_aux_info aux;
6883   Elf_Internal_Shdr * unwsec = NULL;
6884   Elf_Internal_Shdr * strsec;
6885   Elf_Internal_Shdr * sec;
6886   unsigned long i;
6887
6888   if (string_table == NULL)
6889     return;
6890
6891   memset (& aux, 0, sizeof (aux));
6892
6893   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
6894     {
6895       if (sec->sh_type == SHT_SYMTAB
6896           && sec->sh_link < elf_header.e_shnum)
6897         {
6898           aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
6899
6900           strsec = section_headers + sec->sh_link;
6901           if (aux.strtab != NULL)
6902             {
6903               error (_("Multiple auxillary string tables encountered\n"));
6904               free (aux.strtab);
6905             }
6906           aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
6907                                           1, strsec->sh_size,
6908                                           _("string table"));
6909           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
6910         }
6911       else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
6912         unwsec = sec;
6913     }
6914
6915   if (!unwsec)
6916     printf (_("\nThere are no unwind sections in this file.\n"));
6917
6918   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
6919     {
6920       if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
6921         {
6922           printf (_("\nUnwind section '%s' at offset 0x%lx contains %lu entries:\n"),
6923                   printable_section_name (sec),
6924                   (unsigned long) sec->sh_offset,
6925                   (unsigned long) (sec->sh_size / (2 * eh_addr_size + 8)));
6926
6927           slurp_hppa_unwind_table (file, &aux, sec);
6928           if (aux.table_len > 0)
6929             dump_hppa_unwind (&aux);
6930
6931           if (aux.table)
6932             free ((char *) aux.table);
6933           aux.table = NULL;
6934         }
6935     }
6936
6937   if (aux.symtab)
6938     free (aux.symtab);
6939   if (aux.strtab)
6940     free ((char *) aux.strtab);
6941 }
6942
6943 struct arm_section
6944 {
6945   unsigned char *      data;            /* The unwind data.  */
6946   Elf_Internal_Shdr *  sec;             /* The cached unwind section header.  */
6947   Elf_Internal_Rela *  rela;            /* The cached relocations for this section.  */
6948   unsigned long        nrelas;          /* The number of relocations.  */
6949   unsigned int         rel_type;        /* REL or RELA ?  */
6950   Elf_Internal_Rela *  next_rela;       /* Cyclic pointer to the next reloc to process.  */
6951 };
6952
6953 struct arm_unw_aux_info
6954 {
6955   FILE *              file;             /* The file containing the unwind sections.  */
6956   Elf_Internal_Sym *  symtab;           /* The file's symbol table.  */
6957   unsigned long       nsyms;            /* Number of symbols.  */
6958   char *              strtab;           /* The file's string table.  */
6959   unsigned long       strtab_size;      /* Size of string table.  */
6960 };
6961
6962 static const char *
6963 arm_print_vma_and_name (struct arm_unw_aux_info *aux,
6964                         bfd_vma fn, struct absaddr addr)
6965 {
6966   const char *procname;
6967   bfd_vma sym_offset;
6968
6969   if (addr.section == SHN_UNDEF)
6970     addr.offset = fn;
6971
6972   find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
6973                            aux->strtab_size, addr, &procname,
6974                            &sym_offset);
6975
6976   print_vma (fn, PREFIX_HEX);
6977
6978   if (procname)
6979     {
6980       fputs (" <", stdout);
6981       fputs (procname, stdout);
6982
6983       if (sym_offset)
6984         printf ("+0x%lx", (unsigned long) sym_offset);
6985       fputc ('>', stdout);
6986     }
6987
6988   return procname;
6989 }
6990
6991 static void
6992 arm_free_section (struct arm_section *arm_sec)
6993 {
6994   if (arm_sec->data != NULL)
6995     free (arm_sec->data);
6996
6997   if (arm_sec->rela != NULL)
6998     free (arm_sec->rela);
6999 }
7000
7001 /* 1) If SEC does not match the one cached in ARM_SEC, then free the current
7002       cached section and install SEC instead.
7003    2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
7004       and return its valued in * WORDP, relocating if necessary.
7005    3) Update the NEXT_RELA field in ARM_SEC and store the section index and
7006       relocation's offset in ADDR.
7007    4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
7008       into the string table of the symbol associated with the reloc.  If no
7009       reloc was applied store -1 there.
7010    5) Return TRUE upon success, FALSE otherwise.  */
7011
7012 static bfd_boolean
7013 get_unwind_section_word (struct arm_unw_aux_info *  aux,
7014                          struct arm_section *       arm_sec,
7015                          Elf_Internal_Shdr *        sec,
7016                          bfd_vma                    word_offset,
7017                          unsigned int *             wordp,
7018                          struct absaddr *           addr,
7019                          bfd_vma *                  sym_name)
7020 {
7021   Elf_Internal_Rela *rp;
7022   Elf_Internal_Sym *sym;
7023   const char * relname;
7024   unsigned int word;
7025   bfd_boolean wrapped;
7026
7027   if (sec == NULL || arm_sec == NULL)
7028     return FALSE;
7029
7030   addr->section = SHN_UNDEF;
7031   addr->offset = 0;
7032
7033   if (sym_name != NULL)
7034     *sym_name = (bfd_vma) -1;
7035
7036   /* If necessary, update the section cache.  */
7037   if (sec != arm_sec->sec)
7038     {
7039       Elf_Internal_Shdr *relsec;
7040
7041       arm_free_section (arm_sec);
7042
7043       arm_sec->sec = sec;
7044       arm_sec->data = get_data (NULL, aux->file, sec->sh_offset, 1,
7045                                 sec->sh_size, _("unwind data"));
7046       arm_sec->rela = NULL;
7047       arm_sec->nrelas = 0;
7048
7049       for (relsec = section_headers;
7050            relsec < section_headers + elf_header.e_shnum;
7051            ++relsec)
7052         {
7053           if (relsec->sh_info >= elf_header.e_shnum
7054               || section_headers + relsec->sh_info != sec
7055               /* PR 15745: Check the section type as well.  */
7056               || (relsec->sh_type != SHT_REL
7057                   && relsec->sh_type != SHT_RELA))
7058             continue;
7059
7060           arm_sec->rel_type = relsec->sh_type;
7061           if (relsec->sh_type == SHT_REL)
7062             {
7063               if (!slurp_rel_relocs (aux->file, relsec->sh_offset,
7064                                      relsec->sh_size,
7065                                      & arm_sec->rela, & arm_sec->nrelas))
7066                 return FALSE;
7067             }
7068           else /* relsec->sh_type == SHT_RELA */
7069             {
7070               if (!slurp_rela_relocs (aux->file, relsec->sh_offset,
7071                                       relsec->sh_size,
7072                                       & arm_sec->rela, & arm_sec->nrelas))
7073                 return FALSE;
7074             }
7075           break;
7076         }
7077
7078       arm_sec->next_rela = arm_sec->rela;
7079     }
7080
7081   /* If there is no unwind data we can do nothing.  */
7082   if (arm_sec->data == NULL)
7083     return FALSE;
7084
7085   /* If the offset is invalid then fail.  */
7086   if (word_offset > sec->sh_size - 4)
7087     return FALSE;
7088
7089   /* Get the word at the required offset.  */
7090   word = byte_get (arm_sec->data + word_offset, 4);
7091
7092   /* PR 17531: file: id:000001,src:001266+003044,op:splice,rep:128.  */
7093   if (arm_sec->rela == NULL)
7094     {
7095       * wordp = word;
7096       return TRUE;
7097     }
7098
7099   /* Look through the relocs to find the one that applies to the provided offset.  */
7100   wrapped = FALSE;
7101   for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
7102     {
7103       bfd_vma prelval, offset;
7104
7105       if (rp->r_offset > word_offset && !wrapped)
7106         {
7107           rp = arm_sec->rela;
7108           wrapped = TRUE;
7109         }
7110       if (rp->r_offset > word_offset)
7111         break;
7112
7113       if (rp->r_offset & 3)
7114         {
7115           warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
7116                 (unsigned long) rp->r_offset);
7117           continue;
7118         }
7119
7120       if (rp->r_offset < word_offset)
7121         continue;
7122
7123       /* PR 17531: file: 027-161405-0.004  */
7124       if (aux->symtab == NULL)
7125         continue;
7126
7127       if (arm_sec->rel_type == SHT_REL)
7128         {
7129           offset = word & 0x7fffffff;
7130           if (offset & 0x40000000)
7131             offset |= ~ (bfd_vma) 0x7fffffff;
7132         }
7133       else if (arm_sec->rel_type == SHT_RELA)
7134         offset = rp->r_addend;
7135       else
7136         {
7137           error (_("Unknown section relocation type %d encountered\n"),
7138                  arm_sec->rel_type);
7139           break;
7140         }
7141
7142       /* PR 17531 file: 027-1241568-0.004.  */
7143       if (ELF32_R_SYM (rp->r_info) >= aux->nsyms)
7144         {
7145           error (_("Bad symbol index in unwind relocation (%lu > %lu)\n"),
7146                  (unsigned long) ELF32_R_SYM (rp->r_info), aux->nsyms);
7147           break;
7148         }
7149
7150       sym = aux->symtab + ELF32_R_SYM (rp->r_info);
7151       offset += sym->st_value;
7152       prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
7153
7154       /* Check that we are processing the expected reloc type.  */
7155       if (elf_header.e_machine == EM_ARM)
7156         {
7157           relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
7158           if (relname == NULL)
7159             {
7160               warn (_("Skipping unknown ARM relocation type: %d\n"),
7161                     (int) ELF32_R_TYPE (rp->r_info));
7162               continue;
7163             }
7164
7165           if (streq (relname, "R_ARM_NONE"))
7166               continue;
7167
7168           if (! streq (relname, "R_ARM_PREL31"))
7169             {
7170               warn (_("Skipping unexpected ARM relocation type %s\n"), relname);
7171               continue;
7172             }
7173         }
7174       else if (elf_header.e_machine == EM_TI_C6000)
7175         {
7176           relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
7177           if (relname == NULL)
7178             {
7179               warn (_("Skipping unknown C6000 relocation type: %d\n"),
7180                     (int) ELF32_R_TYPE (rp->r_info));
7181               continue;
7182             }
7183
7184           if (streq (relname, "R_C6000_NONE"))
7185             continue;
7186
7187           if (! streq (relname, "R_C6000_PREL31"))
7188             {
7189               warn (_("Skipping unexpected C6000 relocation type %s\n"), relname);
7190               continue;
7191             }
7192
7193           prelval >>= 1;
7194         }
7195       else
7196         {
7197           /* This function currently only supports ARM and TI unwinders.  */
7198           warn (_("Only TI and ARM unwinders are currently supported\n"));
7199           break;
7200         }
7201
7202       word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
7203       addr->section = sym->st_shndx;
7204       addr->offset = offset;
7205
7206       if (sym_name)
7207         * sym_name = sym->st_name;
7208       break;
7209     }
7210
7211   *wordp = word;
7212   arm_sec->next_rela = rp;
7213
7214   return TRUE;
7215 }
7216
7217 static const char *tic6x_unwind_regnames[16] =
7218 {
7219   "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
7220   "A14", "A13", "A12", "A11", "A10",
7221   "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
7222 };
7223
7224 static void
7225 decode_tic6x_unwind_regmask (unsigned int mask)
7226 {
7227   int i;
7228
7229   for (i = 12; mask; mask >>= 1, i--)
7230     {
7231       if (mask & 1)
7232         {
7233           fputs (tic6x_unwind_regnames[i], stdout);
7234           if (mask > 1)
7235             fputs (", ", stdout);
7236         }
7237     }
7238 }
7239
7240 #define ADVANCE                                                 \
7241   if (remaining == 0 && more_words)                             \
7242     {                                                           \
7243       data_offset += 4;                                         \
7244       if (! get_unwind_section_word (aux, data_arm_sec, data_sec,       \
7245                                      data_offset, & word, & addr, NULL))        \
7246         return;                                                 \
7247       remaining = 4;                                            \
7248       more_words--;                                             \
7249     }                                                           \
7250
7251 #define GET_OP(OP)                      \
7252   ADVANCE;                              \
7253   if (remaining)                        \
7254     {                                   \
7255       remaining--;                      \
7256       (OP) = word >> 24;                \
7257       word <<= 8;                       \
7258     }                                   \
7259   else                                  \
7260     {                                   \
7261       printf (_("[Truncated opcode]\n"));       \
7262       return;                           \
7263     }                                   \
7264   printf ("0x%02x ", OP)
7265
7266 static void
7267 decode_arm_unwind_bytecode (struct arm_unw_aux_info *aux,
7268                             unsigned int word, unsigned int remaining,
7269                             unsigned int more_words,
7270                             bfd_vma data_offset, Elf_Internal_Shdr *data_sec,
7271                             struct arm_section *data_arm_sec)
7272 {
7273   struct absaddr addr;
7274
7275   /* Decode the unwinding instructions.  */
7276   while (1)
7277     {
7278       unsigned int op, op2;
7279
7280       ADVANCE;
7281       if (remaining == 0)
7282         break;
7283       remaining--;
7284       op = word >> 24;
7285       word <<= 8;
7286
7287       printf ("  0x%02x ", op);
7288
7289       if ((op & 0xc0) == 0x00)
7290         {
7291           int offset = ((op & 0x3f) << 2) + 4;
7292
7293           printf ("     vsp = vsp + %d", offset);
7294         }
7295       else if ((op & 0xc0) == 0x40)
7296         {
7297           int offset = ((op & 0x3f) << 2) + 4;
7298
7299           printf ("     vsp = vsp - %d", offset);
7300         }
7301       else if ((op & 0xf0) == 0x80)
7302         {
7303           GET_OP (op2);
7304           if (op == 0x80 && op2 == 0)
7305             printf (_("Refuse to unwind"));
7306           else
7307             {
7308               unsigned int mask = ((op & 0x0f) << 8) | op2;
7309               int first = 1;
7310               int i;
7311
7312               printf ("pop {");
7313               for (i = 0; i < 12; i++)
7314                 if (mask & (1 << i))
7315                   {
7316                     if (first)
7317                       first = 0;
7318                     else
7319                       printf (", ");
7320                     printf ("r%d", 4 + i);
7321                   }
7322               printf ("}");
7323             }
7324         }
7325       else if ((op & 0xf0) == 0x90)
7326         {
7327           if (op == 0x9d || op == 0x9f)
7328             printf (_("     [Reserved]"));
7329           else
7330             printf ("     vsp = r%d", op & 0x0f);
7331         }
7332       else if ((op & 0xf0) == 0xa0)
7333         {
7334           int end = 4 + (op & 0x07);
7335           int first = 1;
7336           int i;
7337
7338           printf ("     pop {");
7339           for (i = 4; i <= end; i++)
7340             {
7341               if (first)
7342                 first = 0;
7343               else
7344                 printf (", ");
7345               printf ("r%d", i);
7346             }
7347           if (op & 0x08)
7348             {
7349               if (!first)
7350                 printf (", ");
7351               printf ("r14");
7352             }
7353           printf ("}");
7354         }
7355       else if (op == 0xb0)
7356         printf (_("     finish"));
7357       else if (op == 0xb1)
7358         {
7359           GET_OP (op2);
7360           if (op2 == 0 || (op2 & 0xf0) != 0)
7361             printf (_("[Spare]"));
7362           else
7363             {
7364               unsigned int mask = op2 & 0x0f;
7365               int first = 1;
7366               int i;
7367
7368               printf ("pop {");
7369               for (i = 0; i < 12; i++)
7370                 if (mask & (1 << i))
7371                   {
7372                     if (first)
7373                       first = 0;
7374                     else
7375                       printf (", ");
7376                     printf ("r%d", i);
7377                   }
7378               printf ("}");
7379             }
7380         }
7381       else if (op == 0xb2)
7382         {
7383           unsigned char buf[9];
7384           unsigned int i, len;
7385           unsigned long offset;
7386
7387           for (i = 0; i < sizeof (buf); i++)
7388             {
7389               GET_OP (buf[i]);
7390               if ((buf[i] & 0x80) == 0)
7391                 break;
7392             }
7393           if (i == sizeof (buf))
7394             printf (_("corrupt change to vsp"));
7395           else
7396             {
7397               offset = read_uleb128 (buf, &len, buf + i + 1);
7398               assert (len == i + 1);
7399               offset = offset * 4 + 0x204;
7400               printf ("vsp = vsp + %ld", offset);
7401             }
7402         }
7403       else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
7404         {
7405           unsigned int first, last;
7406
7407           GET_OP (op2);
7408           first = op2 >> 4;
7409           last = op2 & 0x0f;
7410           if (op == 0xc8)
7411             first = first + 16;
7412           printf ("pop {D%d", first);
7413           if (last)
7414             printf ("-D%d", first + last);
7415           printf ("}");
7416         }
7417       else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
7418         {
7419           unsigned int count = op & 0x07;
7420
7421           printf ("pop {D8");
7422           if (count)
7423             printf ("-D%d", 8 + count);
7424           printf ("}");
7425         }
7426       else if (op >= 0xc0 && op <= 0xc5)
7427         {
7428           unsigned int count = op & 0x07;
7429
7430           printf ("     pop {wR10");
7431           if (count)
7432             printf ("-wR%d", 10 + count);
7433           printf ("}");
7434         }
7435       else if (op == 0xc6)
7436         {
7437           unsigned int first, last;
7438
7439           GET_OP (op2);
7440           first = op2 >> 4;
7441           last = op2 & 0x0f;
7442           printf ("pop {wR%d", first);
7443           if (last)
7444             printf ("-wR%d", first + last);
7445           printf ("}");
7446         }
7447       else if (op == 0xc7)
7448         {
7449           GET_OP (op2);
7450           if (op2 == 0 || (op2 & 0xf0) != 0)
7451             printf (_("[Spare]"));
7452           else
7453             {
7454               unsigned int mask = op2 & 0x0f;
7455               int first = 1;
7456               int i;
7457
7458               printf ("pop {");
7459               for (i = 0; i < 4; i++)
7460                 if (mask & (1 << i))
7461                   {
7462                     if (first)
7463                       first = 0;
7464                     else
7465                       printf (", ");
7466                     printf ("wCGR%d", i);
7467                   }
7468               printf ("}");
7469             }
7470         }
7471       else
7472         printf (_("     [unsupported opcode]"));
7473       printf ("\n");
7474     }
7475 }
7476
7477 static void
7478 decode_tic6x_unwind_bytecode (struct arm_unw_aux_info *aux,
7479                             unsigned int word, unsigned int remaining,
7480                             unsigned int more_words,
7481                             bfd_vma data_offset, Elf_Internal_Shdr *data_sec,
7482                             struct arm_section *data_arm_sec)
7483 {
7484   struct absaddr addr;
7485
7486   /* Decode the unwinding instructions.  */
7487   while (1)
7488     {
7489       unsigned int op, op2;
7490
7491       ADVANCE;
7492       if (remaining == 0)
7493         break;
7494       remaining--;
7495       op = word >> 24;
7496       word <<= 8;
7497
7498       printf ("  0x%02x ", op);
7499
7500       if ((op & 0xc0) == 0x00)
7501         {
7502           int offset = ((op & 0x3f) << 3) + 8;
7503           printf ("     sp = sp + %d", offset);
7504         }
7505       else if ((op & 0xc0) == 0x80)
7506         {
7507           GET_OP (op2);
7508           if (op == 0x80 && op2 == 0)
7509             printf (_("Refuse to unwind"));
7510           else
7511             {
7512               unsigned int mask = ((op & 0x1f) << 8) | op2;
7513               if (op & 0x20)
7514                 printf ("pop compact {");
7515               else
7516                 printf ("pop {");
7517
7518               decode_tic6x_unwind_regmask (mask);
7519               printf("}");
7520             }
7521         }
7522       else if ((op & 0xf0) == 0xc0)
7523         {
7524           unsigned int reg;
7525           unsigned int nregs;
7526           unsigned int i;
7527           const char *name;
7528           struct
7529           {
7530               unsigned int offset;
7531               unsigned int reg;
7532           } regpos[16];
7533
7534           /* Scan entire instruction first so that GET_OP output is not
7535              interleaved with disassembly.  */
7536           nregs = 0;
7537           for (i = 0; nregs < (op & 0xf); i++)
7538             {
7539               GET_OP (op2);
7540               reg = op2 >> 4;
7541               if (reg != 0xf)
7542                 {
7543                   regpos[nregs].offset = i * 2;
7544                   regpos[nregs].reg = reg;
7545                   nregs++;
7546                 }
7547
7548               reg = op2 & 0xf;
7549               if (reg != 0xf)
7550                 {
7551                   regpos[nregs].offset = i * 2 + 1;
7552                   regpos[nregs].reg = reg;
7553                   nregs++;
7554                 }
7555             }
7556
7557           printf (_("pop frame {"));
7558           reg = nregs - 1;
7559           for (i = i * 2; i > 0; i--)
7560             {
7561               if (regpos[reg].offset == i - 1)
7562                 {
7563                   name = tic6x_unwind_regnames[regpos[reg].reg];
7564                   if (reg > 0)
7565                     reg--;
7566                 }
7567               else
7568                 name = _("[pad]");
7569
7570               fputs (name, stdout);
7571               if (i > 1)
7572                 printf (", ");
7573             }
7574
7575           printf ("}");
7576         }
7577       else if (op == 0xd0)
7578         printf ("     MOV FP, SP");
7579       else if (op == 0xd1)
7580         printf ("     __c6xabi_pop_rts");
7581       else if (op == 0xd2)
7582         {
7583           unsigned char buf[9];
7584           unsigned int i, len;
7585           unsigned long offset;
7586
7587           for (i = 0; i < sizeof (buf); i++)
7588             {
7589               GET_OP (buf[i]);
7590               if ((buf[i] & 0x80) == 0)
7591                 break;
7592             }
7593           /* PR 17531: file: id:000001,src:001906+004739,op:splice,rep:2.  */
7594           if (i == sizeof (buf))
7595             {
7596               printf ("<corrupt sp adjust>\n");
7597               warn (_("Corrupt stack pointer adjustment detected\n"));
7598               return;
7599             }
7600           
7601           offset = read_uleb128 (buf, &len, buf + i + 1);
7602           assert (len == i + 1);
7603           offset = offset * 8 + 0x408;
7604           printf (_("sp = sp + %ld"), offset);
7605         }
7606       else if ((op & 0xf0) == 0xe0)
7607         {
7608           if ((op & 0x0f) == 7)
7609             printf ("     RETURN");
7610           else
7611             printf ("     MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
7612         }
7613       else
7614         {
7615           printf (_("     [unsupported opcode]"));
7616         }
7617       putchar ('\n');
7618     }
7619 }
7620
7621 static bfd_vma
7622 arm_expand_prel31 (bfd_vma word, bfd_vma where)
7623 {
7624   bfd_vma offset;
7625
7626   offset = word & 0x7fffffff;
7627   if (offset & 0x40000000)
7628     offset |= ~ (bfd_vma) 0x7fffffff;
7629
7630   if (elf_header.e_machine == EM_TI_C6000)
7631     offset <<= 1;
7632
7633   return offset + where;
7634 }
7635
7636 static void
7637 decode_arm_unwind (struct arm_unw_aux_info *  aux,
7638                    unsigned int               word,
7639                    unsigned int               remaining,
7640                    bfd_vma                    data_offset,
7641                    Elf_Internal_Shdr *        data_sec,
7642                    struct arm_section *       data_arm_sec)
7643 {
7644   int per_index;
7645   unsigned int more_words = 0;
7646   struct absaddr addr;
7647   bfd_vma sym_name = (bfd_vma) -1;
7648
7649   if (remaining == 0)
7650     {
7651       /* Fetch the first word.
7652          Note - when decoding an object file the address extracted
7653          here will always be 0.  So we also pass in the sym_name
7654          parameter so that we can find the symbol associated with
7655          the personality routine.  */
7656       if (! get_unwind_section_word (aux, data_arm_sec, data_sec, data_offset,
7657                                      & word, & addr, & sym_name))
7658         return;
7659
7660       remaining = 4;
7661     }
7662
7663   if ((word & 0x80000000) == 0)
7664     {
7665       /* Expand prel31 for personality routine.  */
7666       bfd_vma fn;
7667       const char *procname;
7668
7669       fn = arm_expand_prel31 (word, data_sec->sh_addr + data_offset);
7670       printf (_("  Personality routine: "));
7671       if (fn == 0
7672           && addr.section == SHN_UNDEF && addr.offset == 0
7673           && sym_name != (bfd_vma) -1 && sym_name < aux->strtab_size)
7674         {
7675           procname = aux->strtab + sym_name;
7676           print_vma (fn, PREFIX_HEX);
7677           if (procname)
7678             {
7679               fputs (" <", stdout);
7680               fputs (procname, stdout);
7681               fputc ('>', stdout);
7682             }
7683         }
7684       else
7685         procname = arm_print_vma_and_name (aux, fn, addr);
7686       fputc ('\n', stdout);
7687
7688       /* The GCC personality routines use the standard compact
7689          encoding, starting with one byte giving the number of
7690          words.  */
7691       if (procname != NULL
7692           && (const_strneq (procname, "__gcc_personality_v0")
7693               || const_strneq (procname, "__gxx_personality_v0")
7694               || const_strneq (procname, "__gcj_personality_v0")
7695               || const_strneq (procname, "__gnu_objc_personality_v0")))
7696         {
7697           remaining = 0;
7698           more_words = 1;
7699           ADVANCE;
7700           if (!remaining)
7701             {
7702               printf (_("  [Truncated data]\n"));
7703               return;
7704             }
7705           more_words = word >> 24;
7706           word <<= 8;
7707           remaining--;
7708           per_index = -1;
7709         }
7710       else
7711         return;
7712     }
7713   else
7714     {
7715       /* ARM EHABI Section 6.3:
7716
7717          An exception-handling table entry for the compact model looks like:
7718
7719            31 30-28 27-24 23-0
7720            -- ----- ----- ----
7721             1   0   index Data for personalityRoutine[index]    */
7722
7723       if (elf_header.e_machine == EM_ARM
7724           && (word & 0x70000000))
7725         warn (_("Corrupt ARM compact model table entry: %x \n"), word);
7726
7727       per_index = (word >> 24) & 0x7f;
7728       printf (_("  Compact model index: %d\n"), per_index);
7729       if (per_index == 0)
7730         {
7731           more_words = 0;
7732           word <<= 8;
7733           remaining--;
7734         }
7735       else if (per_index < 3)
7736         {
7737           more_words = (word >> 16) & 0xff;
7738           word <<= 16;
7739           remaining -= 2;
7740         }
7741     }
7742
7743   switch (elf_header.e_machine)
7744     {
7745     case EM_ARM:
7746       if (per_index < 3)
7747         {
7748           decode_arm_unwind_bytecode (aux, word, remaining, more_words,
7749                                       data_offset, data_sec, data_arm_sec);
7750         }
7751       else
7752         {
7753           warn (_("Unknown ARM compact model index encountered\n"));
7754           printf (_("  [reserved]\n"));
7755         }
7756       break;
7757
7758     case EM_TI_C6000:
7759       if (per_index < 3)
7760         {
7761           decode_tic6x_unwind_bytecode (aux, word, remaining, more_words,
7762                                         data_offset, data_sec, data_arm_sec);
7763         }
7764       else if (per_index < 5)
7765         {
7766           if (((word >> 17) & 0x7f) == 0x7f)
7767             printf (_("  Restore stack from frame pointer\n"));
7768           else
7769             printf (_("  Stack increment %d\n"), (word >> 14) & 0x1fc);
7770           printf (_("  Registers restored: "));
7771           if (per_index == 4)
7772             printf (" (compact) ");
7773           decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
7774           putchar ('\n');
7775           printf (_("  Return register: %s\n"),
7776                   tic6x_unwind_regnames[word & 0xf]);
7777         }
7778       else
7779         printf (_("  [reserved (%d)]\n"), per_index);
7780       break;
7781
7782     default:
7783       error (_("Unsupported architecture type %d encountered when decoding unwind table\n"),
7784              elf_header.e_machine);
7785     }
7786
7787   /* Decode the descriptors.  Not implemented.  */
7788 }
7789
7790 static void
7791 dump_arm_unwind (struct arm_unw_aux_info *aux, Elf_Internal_Shdr *exidx_sec)
7792 {
7793   struct arm_section exidx_arm_sec, extab_arm_sec;
7794   unsigned int i, exidx_len;
7795
7796   memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
7797   memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
7798   exidx_len = exidx_sec->sh_size / 8;
7799
7800   for (i = 0; i < exidx_len; i++)
7801     {
7802       unsigned int exidx_fn, exidx_entry;
7803       struct absaddr fn_addr, entry_addr;
7804       bfd_vma fn;
7805
7806       fputc ('\n', stdout);
7807
7808       if (! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
7809                                      8 * i, & exidx_fn, & fn_addr, NULL)
7810           || ! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
7811                                         8 * i + 4, & exidx_entry, & entry_addr, NULL))
7812         {
7813           arm_free_section (& exidx_arm_sec);
7814           arm_free_section (& extab_arm_sec);
7815           return;
7816         }
7817
7818       /* ARM EHABI, Section 5:
7819          An index table entry consists of 2 words.
7820          The first word contains a prel31 offset to the start of a function, with bit 31 clear.  */
7821       if (exidx_fn & 0x80000000)
7822         warn (_("corrupt index table entry: %x\n"), exidx_fn);
7823
7824       fn = arm_expand_prel31 (exidx_fn, exidx_sec->sh_addr + 8 * i);
7825
7826       arm_print_vma_and_name (aux, fn, fn_addr);
7827       fputs (": ", stdout);
7828
7829       if (exidx_entry == 1)
7830         {
7831           print_vma (exidx_entry, PREFIX_HEX);
7832           fputs (" [cantunwind]\n", stdout);
7833         }
7834       else if (exidx_entry & 0x80000000)
7835         {
7836           print_vma (exidx_entry, PREFIX_HEX);
7837           fputc ('\n', stdout);
7838           decode_arm_unwind (aux, exidx_entry, 4, 0, NULL, NULL);
7839         }
7840       else
7841         {
7842           bfd_vma table, table_offset = 0;
7843           Elf_Internal_Shdr *table_sec;
7844
7845           fputs ("@", stdout);
7846           table = arm_expand_prel31 (exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
7847           print_vma (table, PREFIX_HEX);
7848           printf ("\n");
7849
7850           /* Locate the matching .ARM.extab.  */
7851           if (entry_addr.section != SHN_UNDEF
7852               && entry_addr.section < elf_header.e_shnum)
7853             {
7854               table_sec = section_headers + entry_addr.section;
7855               table_offset = entry_addr.offset;
7856             }
7857           else
7858             {
7859               table_sec = find_section_by_address (table);
7860               if (table_sec != NULL)
7861                 table_offset = table - table_sec->sh_addr;
7862             }
7863           if (table_sec == NULL)
7864             {
7865               warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
7866                     (unsigned long) table);
7867               continue;
7868             }
7869           decode_arm_unwind (aux, 0, 0, table_offset, table_sec,
7870                              &extab_arm_sec);
7871         }
7872     }
7873
7874   printf ("\n");
7875
7876   arm_free_section (&exidx_arm_sec);
7877   arm_free_section (&extab_arm_sec);
7878 }
7879
7880 /* Used for both ARM and C6X unwinding tables.  */
7881
7882 static void
7883 arm_process_unwind (FILE *file)
7884 {
7885   struct arm_unw_aux_info aux;
7886   Elf_Internal_Shdr *unwsec = NULL;
7887   Elf_Internal_Shdr *strsec;
7888   Elf_Internal_Shdr *sec;
7889   unsigned long i;
7890   unsigned int sec_type;
7891
7892   switch (elf_header.e_machine)
7893     {
7894     case EM_ARM:
7895       sec_type = SHT_ARM_EXIDX;
7896       break;
7897
7898     case EM_TI_C6000:
7899       sec_type = SHT_C6000_UNWIND;
7900       break;
7901
7902     default:
7903       error (_("Unsupported architecture type %d encountered when processing unwind table\n"),
7904              elf_header.e_machine);
7905       return;
7906     }
7907
7908   if (string_table == NULL)
7909     return;
7910
7911   memset (& aux, 0, sizeof (aux));
7912   aux.file = file;
7913
7914   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7915     {
7916       if (sec->sh_type == SHT_SYMTAB && sec->sh_link < elf_header.e_shnum)
7917         {
7918           aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
7919
7920           strsec = section_headers + sec->sh_link;
7921
7922           /* PR binutils/17531 file: 011-12666-0.004.  */
7923           if (aux.strtab != NULL)
7924             {
7925               error (_("Multiple string tables found in file.\n"));
7926               free (aux.strtab);
7927             }
7928           aux.strtab = get_data (NULL, file, strsec->sh_offset,
7929                                  1, strsec->sh_size, _("string table"));
7930           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7931         }
7932       else if (sec->sh_type == sec_type)
7933         unwsec = sec;
7934     }
7935
7936   if (unwsec == NULL)
7937     printf (_("\nThere are no unwind sections in this file.\n"));
7938   else
7939     for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7940       {
7941         if (sec->sh_type == sec_type)
7942           {
7943             printf (_("\nUnwind table index '%s' at offset 0x%lx contains %lu entries:\n"),
7944                     printable_section_name (sec),
7945                     (unsigned long) sec->sh_offset,
7946                     (unsigned long) (sec->sh_size / (2 * eh_addr_size)));
7947
7948             dump_arm_unwind (&aux, sec);
7949           }
7950       }
7951
7952   if (aux.symtab)
7953     free (aux.symtab);
7954   if (aux.strtab)
7955     free ((char *) aux.strtab);
7956 }
7957
7958 static void
7959 process_unwind (FILE * file)
7960 {
7961   struct unwind_handler
7962   {
7963     int machtype;
7964     void (* handler)(FILE *);
7965   } handlers[] =
7966   {
7967     { EM_ARM, arm_process_unwind },
7968     { EM_IA_64, ia64_process_unwind },
7969     { EM_PARISC, hppa_process_unwind },
7970     { EM_TI_C6000, arm_process_unwind },
7971     { 0, 0 }
7972   };
7973   int i;
7974
7975   if (!do_unwind)
7976     return;
7977
7978   for (i = 0; handlers[i].handler != NULL; i++)
7979     if (elf_header.e_machine == handlers[i].machtype)
7980       {
7981         handlers[i].handler (file);
7982         return;
7983       }
7984
7985   printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
7986           get_machine_name (elf_header.e_machine));
7987 }
7988
7989 static void
7990 dynamic_section_mips_val (Elf_Internal_Dyn * entry)
7991 {
7992   switch (entry->d_tag)
7993     {
7994     case DT_MIPS_FLAGS:
7995       if (entry->d_un.d_val == 0)
7996         printf (_("NONE"));
7997       else
7998         {
7999           static const char * opts[] =
8000           {
8001             "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
8002             "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
8003             "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
8004             "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
8005             "RLD_ORDER_SAFE"
8006           };
8007           unsigned int cnt;
8008           int first = 1;
8009
8010           for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
8011             if (entry->d_un.d_val & (1 << cnt))
8012               {
8013                 printf ("%s%s", first ? "" : " ", opts[cnt]);
8014                 first = 0;
8015               }
8016         }
8017       break;
8018
8019     case DT_MIPS_IVERSION:
8020       if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
8021         printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry->d_un.d_val));
8022       else
8023         {
8024           char buf[40];
8025           sprintf_vma (buf, entry->d_un.d_ptr);
8026           /* Note: coded this way so that there is a single string for translation.  */
8027           printf (_("<corrupt: %s>"), buf);
8028         }
8029       break;
8030
8031     case DT_MIPS_TIME_STAMP:
8032       {
8033         char timebuf[20];
8034         struct tm * tmp;
8035
8036         time_t atime = entry->d_un.d_val;
8037         tmp = gmtime (&atime);
8038         snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
8039                   tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
8040                   tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
8041         printf (_("Time Stamp: %s"), timebuf);
8042       }
8043       break;
8044
8045     case DT_MIPS_RLD_VERSION:
8046     case DT_MIPS_LOCAL_GOTNO:
8047     case DT_MIPS_CONFLICTNO:
8048     case DT_MIPS_LIBLISTNO:
8049     case DT_MIPS_SYMTABNO:
8050     case DT_MIPS_UNREFEXTNO:
8051     case DT_MIPS_HIPAGENO:
8052     case DT_MIPS_DELTA_CLASS_NO:
8053     case DT_MIPS_DELTA_INSTANCE_NO:
8054     case DT_MIPS_DELTA_RELOC_NO:
8055     case DT_MIPS_DELTA_SYM_NO:
8056     case DT_MIPS_DELTA_CLASSSYM_NO:
8057     case DT_MIPS_COMPACT_SIZE:
8058       print_vma (entry->d_un.d_ptr, DEC);
8059       break;
8060
8061     default:
8062       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8063     }
8064     putchar ('\n');
8065 }
8066
8067 static void
8068 dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
8069 {
8070   switch (entry->d_tag)
8071     {
8072     case DT_HP_DLD_FLAGS:
8073       {
8074         static struct
8075         {
8076           long int bit;
8077           const char * str;
8078         }
8079         flags[] =
8080         {
8081           { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
8082           { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
8083           { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
8084           { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
8085           { DT_HP_BIND_NOW, "HP_BIND_NOW" },
8086           { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
8087           { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
8088           { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
8089           { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
8090           { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
8091           { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
8092           { DT_HP_GST, "HP_GST" },
8093           { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
8094           { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
8095           { DT_HP_NODELETE, "HP_NODELETE" },
8096           { DT_HP_GROUP, "HP_GROUP" },
8097           { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
8098         };
8099         int first = 1;
8100         size_t cnt;
8101         bfd_vma val = entry->d_un.d_val;
8102
8103         for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
8104           if (val & flags[cnt].bit)
8105             {
8106               if (! first)
8107                 putchar (' ');
8108               fputs (flags[cnt].str, stdout);
8109               first = 0;
8110               val ^= flags[cnt].bit;
8111             }
8112
8113         if (val != 0 || first)
8114           {
8115             if (! first)
8116               putchar (' ');
8117             print_vma (val, HEX);
8118           }
8119       }
8120       break;
8121
8122     default:
8123       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8124       break;
8125     }
8126   putchar ('\n');
8127 }
8128
8129 #ifdef BFD64
8130
8131 /* VMS vs Unix time offset and factor.  */
8132
8133 #define VMS_EPOCH_OFFSET 35067168000000000LL
8134 #define VMS_GRANULARITY_FACTOR 10000000
8135
8136 /* Display a VMS time in a human readable format.  */
8137
8138 static void
8139 print_vms_time (bfd_int64_t vmstime)
8140 {
8141   struct tm *tm;
8142   time_t unxtime;
8143
8144   unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
8145   tm = gmtime (&unxtime);
8146   printf ("%04u-%02u-%02uT%02u:%02u:%02u",
8147           tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
8148           tm->tm_hour, tm->tm_min, tm->tm_sec);
8149 }
8150 #endif /* BFD64 */
8151
8152 static void
8153 dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
8154 {
8155   switch (entry->d_tag)
8156     {
8157     case DT_IA_64_PLT_RESERVE:
8158       /* First 3 slots reserved.  */
8159       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8160       printf (" -- ");
8161       print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
8162       break;
8163
8164     case DT_IA_64_VMS_LINKTIME:
8165 #ifdef BFD64
8166       print_vms_time (entry->d_un.d_val);
8167 #endif
8168       break;
8169
8170     case DT_IA_64_VMS_LNKFLAGS:
8171       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8172       if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
8173         printf (" CALL_DEBUG");
8174       if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
8175         printf (" NOP0BUFS");
8176       if (entry->d_un.d_val & VMS_LF_P0IMAGE)
8177         printf (" P0IMAGE");
8178       if (entry->d_un.d_val & VMS_LF_MKTHREADS)
8179         printf (" MKTHREADS");
8180       if (entry->d_un.d_val & VMS_LF_UPCALLS)
8181         printf (" UPCALLS");
8182       if (entry->d_un.d_val & VMS_LF_IMGSTA)
8183         printf (" IMGSTA");
8184       if (entry->d_un.d_val & VMS_LF_INITIALIZE)
8185         printf (" INITIALIZE");
8186       if (entry->d_un.d_val & VMS_LF_MAIN)
8187         printf (" MAIN");
8188       if (entry->d_un.d_val & VMS_LF_EXE_INIT)
8189         printf (" EXE_INIT");
8190       if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
8191         printf (" TBK_IN_IMG");
8192       if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
8193         printf (" DBG_IN_IMG");
8194       if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
8195         printf (" TBK_IN_DSF");
8196       if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
8197         printf (" DBG_IN_DSF");
8198       if (entry->d_un.d_val & VMS_LF_SIGNATURES)
8199         printf (" SIGNATURES");
8200       if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
8201         printf (" REL_SEG_OFF");
8202       break;
8203
8204     default:
8205       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8206       break;
8207     }
8208   putchar ('\n');
8209 }
8210
8211 static int
8212 get_32bit_dynamic_section (FILE * file)
8213 {
8214   Elf32_External_Dyn * edyn;
8215   Elf32_External_Dyn * ext;
8216   Elf_Internal_Dyn * entry;
8217
8218   edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
8219                                           dynamic_size, _("dynamic section"));
8220   if (!edyn)
8221     return 0;
8222
8223   /* SGI's ELF has more than one section in the DYNAMIC segment, and we
8224      might not have the luxury of section headers.  Look for the DT_NULL
8225      terminator to determine the number of entries.  */
8226   for (ext = edyn, dynamic_nent = 0;
8227        (char *) ext < (char *) edyn + dynamic_size - sizeof (* entry);
8228        ext++)
8229     {
8230       dynamic_nent++;
8231       if (BYTE_GET (ext->d_tag) == DT_NULL)
8232         break;
8233     }
8234
8235   dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
8236                                                   sizeof (* entry));
8237   if (dynamic_section == NULL)
8238     {
8239       error (_("Out of memory allocating space for %lu dynamic entries\n"),
8240              (unsigned long) dynamic_nent);
8241       free (edyn);
8242       return 0;
8243     }
8244
8245   for (ext = edyn, entry = dynamic_section;
8246        entry < dynamic_section + dynamic_nent;
8247        ext++, entry++)
8248     {
8249       entry->d_tag      = BYTE_GET (ext->d_tag);
8250       entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
8251     }
8252
8253   free (edyn);
8254
8255   return 1;
8256 }
8257
8258 static int
8259 get_64bit_dynamic_section (FILE * file)
8260 {
8261   Elf64_External_Dyn * edyn;
8262   Elf64_External_Dyn * ext;
8263   Elf_Internal_Dyn * entry;
8264
8265   /* Read in the data.  */
8266   edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
8267                                           dynamic_size, _("dynamic section"));
8268   if (!edyn)
8269     return 0;
8270
8271   /* SGI's ELF has more than one section in the DYNAMIC segment, and we
8272      might not have the luxury of section headers.  Look for the DT_NULL
8273      terminator to determine the number of entries.  */
8274   for (ext = edyn, dynamic_nent = 0;
8275        /* PR 17533 file: 033-67080-0.004 - do not read off the end of the buffer.  */
8276        (char *) ext < ((char *) edyn) + dynamic_size - sizeof (* ext);
8277        ext++)
8278     {
8279       dynamic_nent++;
8280       if (BYTE_GET (ext->d_tag) == DT_NULL)
8281         break;
8282     }
8283
8284   dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
8285                                                   sizeof (* entry));
8286   if (dynamic_section == NULL)
8287     {
8288       error (_("Out of memory allocating space for %lu dynamic entries\n"),
8289              (unsigned long) dynamic_nent);
8290       free (edyn);
8291       return 0;
8292     }
8293
8294   /* Convert from external to internal formats.  */
8295   for (ext = edyn, entry = dynamic_section;
8296        entry < dynamic_section + dynamic_nent;
8297        ext++, entry++)
8298     {
8299       entry->d_tag      = BYTE_GET (ext->d_tag);
8300       entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
8301     }
8302
8303   free (edyn);
8304
8305   return 1;
8306 }
8307
8308 static void
8309 print_dynamic_flags (bfd_vma flags)
8310 {
8311   int first = 1;
8312
8313   while (flags)
8314     {
8315       bfd_vma flag;
8316
8317       flag = flags & - flags;
8318       flags &= ~ flag;
8319
8320       if (first)
8321         first = 0;
8322       else
8323         putc (' ', stdout);
8324
8325       switch (flag)
8326         {
8327         case DF_ORIGIN:         fputs ("ORIGIN", stdout); break;
8328         case DF_SYMBOLIC:       fputs ("SYMBOLIC", stdout); break;
8329         case DF_TEXTREL:        fputs ("TEXTREL", stdout); break;
8330         case DF_BIND_NOW:       fputs ("BIND_NOW", stdout); break;
8331         case DF_STATIC_TLS:     fputs ("STATIC_TLS", stdout); break;
8332         default:                fputs (_("unknown"), stdout); break;
8333         }
8334     }
8335   puts ("");
8336 }
8337
8338 /* Parse and display the contents of the dynamic section.  */
8339
8340 static int
8341 process_dynamic_section (FILE * file)
8342 {
8343   Elf_Internal_Dyn * entry;
8344
8345   if (dynamic_size == 0)
8346     {
8347       if (do_dynamic)
8348         printf (_("\nThere is no dynamic section in this file.\n"));
8349
8350       return 1;
8351     }
8352
8353   if (is_32bit_elf)
8354     {
8355       if (! get_32bit_dynamic_section (file))
8356         return 0;
8357     }
8358   else if (! get_64bit_dynamic_section (file))
8359     return 0;
8360
8361   /* Find the appropriate symbol table.  */
8362   if (dynamic_symbols == NULL)
8363     {
8364       for (entry = dynamic_section;
8365            entry < dynamic_section + dynamic_nent;
8366            ++entry)
8367         {
8368           Elf_Internal_Shdr section;
8369
8370           if (entry->d_tag != DT_SYMTAB)
8371             continue;
8372
8373           dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
8374
8375           /* Since we do not know how big the symbol table is,
8376              we default to reading in the entire file (!) and
8377              processing that.  This is overkill, I know, but it
8378              should work.  */
8379           section.sh_offset = offset_from_vma (file, entry->d_un.d_val, 0);
8380
8381           if (archive_file_offset != 0)
8382             section.sh_size = archive_file_size - section.sh_offset;
8383           else
8384             {
8385               if (fseek (file, 0, SEEK_END))
8386                 error (_("Unable to seek to end of file!\n"));
8387
8388               section.sh_size = ftell (file) - section.sh_offset;
8389             }
8390
8391           if (is_32bit_elf)
8392             section.sh_entsize = sizeof (Elf32_External_Sym);
8393           else
8394             section.sh_entsize = sizeof (Elf64_External_Sym);
8395           section.sh_name = string_table_length;
8396
8397           dynamic_symbols = GET_ELF_SYMBOLS (file, &section, & num_dynamic_syms);
8398           if (num_dynamic_syms < 1)
8399             {
8400               error (_("Unable to determine the number of symbols to load\n"));
8401               continue;
8402             }
8403         }
8404     }
8405
8406   /* Similarly find a string table.  */
8407   if (dynamic_strings == NULL)
8408     {
8409       for (entry = dynamic_section;
8410            entry < dynamic_section + dynamic_nent;
8411            ++entry)
8412         {
8413           unsigned long offset;
8414           long str_tab_len;
8415
8416           if (entry->d_tag != DT_STRTAB)
8417             continue;
8418
8419           dynamic_info[DT_STRTAB] = entry->d_un.d_val;
8420
8421           /* Since we do not know how big the string table is,
8422              we default to reading in the entire file (!) and
8423              processing that.  This is overkill, I know, but it
8424              should work.  */
8425
8426           offset = offset_from_vma (file, entry->d_un.d_val, 0);
8427
8428           if (archive_file_offset != 0)
8429             str_tab_len = archive_file_size - offset;
8430           else
8431             {
8432               if (fseek (file, 0, SEEK_END))
8433                 error (_("Unable to seek to end of file\n"));
8434               str_tab_len = ftell (file) - offset;
8435             }
8436
8437           if (str_tab_len < 1)
8438             {
8439               error
8440                 (_("Unable to determine the length of the dynamic string table\n"));
8441               continue;
8442             }
8443
8444           dynamic_strings = (char *) get_data (NULL, file, offset, 1,
8445                                                str_tab_len,
8446                                                _("dynamic string table"));
8447           dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
8448           break;
8449         }
8450     }
8451
8452   /* And find the syminfo section if available.  */
8453   if (dynamic_syminfo == NULL)
8454     {
8455       unsigned long syminsz = 0;
8456
8457       for (entry = dynamic_section;
8458            entry < dynamic_section + dynamic_nent;
8459            ++entry)
8460         {
8461           if (entry->d_tag == DT_SYMINENT)
8462             {
8463               /* Note: these braces are necessary to avoid a syntax
8464                  error from the SunOS4 C compiler.  */
8465               /* PR binutils/17531: A corrupt file can trigger this test.
8466                  So do not use an assert, instead generate an error message.  */
8467               if (sizeof (Elf_External_Syminfo) != entry->d_un.d_val)
8468                 error (_("Bad value (%d) for SYMINENT entry\n"),
8469                        (int) entry->d_un.d_val);
8470             }
8471           else if (entry->d_tag == DT_SYMINSZ)
8472             syminsz = entry->d_un.d_val;
8473           else if (entry->d_tag == DT_SYMINFO)
8474             dynamic_syminfo_offset = offset_from_vma (file, entry->d_un.d_val,
8475                                                       syminsz);
8476         }
8477
8478       if (dynamic_syminfo_offset != 0 && syminsz != 0)
8479         {
8480           Elf_External_Syminfo * extsyminfo;
8481           Elf_External_Syminfo * extsym;
8482           Elf_Internal_Syminfo * syminfo;
8483
8484           /* There is a syminfo section.  Read the data.  */
8485           extsyminfo = (Elf_External_Syminfo *)
8486               get_data (NULL, file, dynamic_syminfo_offset, 1, syminsz,
8487                         _("symbol information"));
8488           if (!extsyminfo)
8489             return 0;
8490
8491           dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
8492           if (dynamic_syminfo == NULL)
8493             {
8494               error (_("Out of memory allocating %lu byte for dynamic symbol info\n"),
8495                      (unsigned long) syminsz);
8496               return 0;
8497             }
8498
8499           dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
8500           for (syminfo = dynamic_syminfo, extsym = extsyminfo;
8501                syminfo < dynamic_syminfo + dynamic_syminfo_nent;
8502                ++syminfo, ++extsym)
8503             {
8504               syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
8505               syminfo->si_flags = BYTE_GET (extsym->si_flags);
8506             }
8507
8508           free (extsyminfo);
8509         }
8510     }
8511
8512   if (do_dynamic && dynamic_addr)
8513     printf (_("\nDynamic section at offset 0x%lx contains %lu entries:\n"),
8514             dynamic_addr, (unsigned long) dynamic_nent);
8515   if (do_dynamic)
8516     printf (_("  Tag        Type                         Name/Value\n"));
8517
8518   for (entry = dynamic_section;
8519        entry < dynamic_section + dynamic_nent;
8520        entry++)
8521     {
8522       if (do_dynamic)
8523         {
8524           const char * dtype;
8525
8526           putchar (' ');
8527           print_vma (entry->d_tag, FULL_HEX);
8528           dtype = get_dynamic_type (entry->d_tag);
8529           printf (" (%s)%*s", dtype,
8530                   ((is_32bit_elf ? 27 : 19)
8531                    - (int) strlen (dtype)),
8532                   " ");
8533         }
8534
8535       switch (entry->d_tag)
8536         {
8537         case DT_FLAGS:
8538           if (do_dynamic)
8539             print_dynamic_flags (entry->d_un.d_val);
8540           break;
8541
8542         case DT_AUXILIARY:
8543         case DT_FILTER:
8544         case DT_CONFIG:
8545         case DT_DEPAUDIT:
8546         case DT_AUDIT:
8547           if (do_dynamic)
8548             {
8549               switch (entry->d_tag)
8550                 {
8551                 case DT_AUXILIARY:
8552                   printf (_("Auxiliary library"));
8553                   break;
8554
8555                 case DT_FILTER:
8556                   printf (_("Filter library"));
8557                   break;
8558
8559                 case DT_CONFIG:
8560                   printf (_("Configuration file"));
8561                   break;
8562
8563                 case DT_DEPAUDIT:
8564                   printf (_("Dependency audit library"));
8565                   break;
8566
8567                 case DT_AUDIT:
8568                   printf (_("Audit library"));
8569                   break;
8570                 }
8571
8572               if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
8573                 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
8574               else
8575                 {
8576                   printf (": ");
8577                   print_vma (entry->d_un.d_val, PREFIX_HEX);
8578                   putchar ('\n');
8579                 }
8580             }
8581           break;
8582
8583         case DT_FEATURE:
8584           if (do_dynamic)
8585             {
8586               printf (_("Flags:"));
8587
8588               if (entry->d_un.d_val == 0)
8589                 printf (_(" None\n"));
8590               else
8591                 {
8592                   unsigned long int val = entry->d_un.d_val;
8593
8594                   if (val & DTF_1_PARINIT)
8595                     {
8596                       printf (" PARINIT");
8597                       val ^= DTF_1_PARINIT;
8598                     }
8599                   if (val & DTF_1_CONFEXP)
8600                     {
8601                       printf (" CONFEXP");
8602                       val ^= DTF_1_CONFEXP;
8603                     }
8604                   if (val != 0)
8605                     printf (" %lx", val);
8606                   puts ("");
8607                 }
8608             }
8609           break;
8610
8611         case DT_POSFLAG_1:
8612           if (do_dynamic)
8613             {
8614               printf (_("Flags:"));
8615
8616               if (entry->d_un.d_val == 0)
8617                 printf (_(" None\n"));
8618               else
8619                 {
8620                   unsigned long int val = entry->d_un.d_val;
8621
8622                   if (val & DF_P1_LAZYLOAD)
8623                     {
8624                       printf (" LAZYLOAD");
8625                       val ^= DF_P1_LAZYLOAD;
8626                     }
8627                   if (val & DF_P1_GROUPPERM)
8628                     {
8629                       printf (" GROUPPERM");
8630                       val ^= DF_P1_GROUPPERM;
8631                     }
8632                   if (val != 0)
8633                     printf (" %lx", val);
8634                   puts ("");
8635                 }
8636             }
8637           break;
8638
8639         case DT_FLAGS_1:
8640           if (do_dynamic)
8641             {
8642               printf (_("Flags:"));
8643               if (entry->d_un.d_val == 0)
8644                 printf (_(" None\n"));
8645               else
8646                 {
8647                   unsigned long int val = entry->d_un.d_val;
8648
8649                   if (val & DF_1_NOW)
8650                     {
8651                       printf (" NOW");
8652                       val ^= DF_1_NOW;
8653                     }
8654                   if (val & DF_1_GLOBAL)
8655                     {
8656                       printf (" GLOBAL");
8657                       val ^= DF_1_GLOBAL;
8658                     }
8659                   if (val & DF_1_GROUP)
8660                     {
8661                       printf (" GROUP");
8662                       val ^= DF_1_GROUP;
8663                     }
8664                   if (val & DF_1_NODELETE)
8665                     {
8666                       printf (" NODELETE");
8667                       val ^= DF_1_NODELETE;
8668                     }
8669                   if (val & DF_1_LOADFLTR)
8670                     {
8671                       printf (" LOADFLTR");
8672                       val ^= DF_1_LOADFLTR;
8673                     }
8674                   if (val & DF_1_INITFIRST)
8675                     {
8676                       printf (" INITFIRST");
8677                       val ^= DF_1_INITFIRST;
8678                     }
8679                   if (val & DF_1_NOOPEN)
8680                     {
8681                       printf (" NOOPEN");
8682                       val ^= DF_1_NOOPEN;
8683                     }
8684                   if (val & DF_1_ORIGIN)
8685                     {
8686                       printf (" ORIGIN");
8687                       val ^= DF_1_ORIGIN;
8688                     }
8689                   if (val & DF_1_DIRECT)
8690                     {
8691                       printf (" DIRECT");
8692                       val ^= DF_1_DIRECT;
8693                     }
8694                   if (val & DF_1_TRANS)
8695                     {
8696                       printf (" TRANS");
8697                       val ^= DF_1_TRANS;
8698                     }
8699                   if (val & DF_1_INTERPOSE)
8700                     {
8701                       printf (" INTERPOSE");
8702                       val ^= DF_1_INTERPOSE;
8703                     }
8704                   if (val & DF_1_NODEFLIB)
8705                     {
8706                       printf (" NODEFLIB");
8707                       val ^= DF_1_NODEFLIB;
8708                     }
8709                   if (val & DF_1_NODUMP)
8710                     {
8711                       printf (" NODUMP");
8712                       val ^= DF_1_NODUMP;
8713                     }
8714                   if (val & DF_1_CONFALT)
8715                     {
8716                       printf (" CONFALT");
8717                       val ^= DF_1_CONFALT;
8718                     }
8719                   if (val & DF_1_ENDFILTEE)
8720                     {
8721                       printf (" ENDFILTEE");
8722                       val ^= DF_1_ENDFILTEE;
8723                     }
8724                   if (val & DF_1_DISPRELDNE)
8725                     {
8726                       printf (" DISPRELDNE");
8727                       val ^= DF_1_DISPRELDNE;
8728                     }
8729                   if (val & DF_1_DISPRELPND)
8730                     {
8731                       printf (" DISPRELPND");
8732                       val ^= DF_1_DISPRELPND;
8733                     }
8734                   if (val & DF_1_NODIRECT)
8735                     {
8736                       printf (" NODIRECT");
8737                       val ^= DF_1_NODIRECT;
8738                     }
8739                   if (val & DF_1_IGNMULDEF)
8740                     {
8741                       printf (" IGNMULDEF");
8742                       val ^= DF_1_IGNMULDEF;
8743                     }
8744                   if (val & DF_1_NOKSYMS)
8745                     {
8746                       printf (" NOKSYMS");
8747                       val ^= DF_1_NOKSYMS;
8748                     }
8749                   if (val & DF_1_NOHDR)
8750                     {
8751                       printf (" NOHDR");
8752                       val ^= DF_1_NOHDR;
8753                     }
8754                   if (val & DF_1_EDITED)
8755                     {
8756                       printf (" EDITED");
8757                       val ^= DF_1_EDITED;
8758                     }
8759                   if (val & DF_1_NORELOC)
8760                     {
8761                       printf (" NORELOC");
8762                       val ^= DF_1_NORELOC;
8763                     }
8764                   if (val & DF_1_SYMINTPOSE)
8765                     {
8766                       printf (" SYMINTPOSE");
8767                       val ^= DF_1_SYMINTPOSE;
8768                     }
8769                   if (val & DF_1_GLOBAUDIT)
8770                     {
8771                       printf (" GLOBAUDIT");
8772                       val ^= DF_1_GLOBAUDIT;
8773                     }
8774                   if (val & DF_1_SINGLETON)
8775                     {
8776                       printf (" SINGLETON");
8777                       val ^= DF_1_SINGLETON;
8778                     }
8779                   if (val != 0)
8780                     printf (" %lx", val);
8781                   puts ("");
8782                 }
8783             }
8784           break;
8785
8786         case DT_PLTREL:
8787           dynamic_info[entry->d_tag] = entry->d_un.d_val;
8788           if (do_dynamic)
8789             puts (get_dynamic_type (entry->d_un.d_val));
8790           break;
8791
8792         case DT_NULL    :
8793         case DT_NEEDED  :
8794         case DT_PLTGOT  :
8795         case DT_HASH    :
8796         case DT_STRTAB  :
8797         case DT_SYMTAB  :
8798         case DT_RELA    :
8799         case DT_INIT    :
8800         case DT_FINI    :
8801         case DT_SONAME  :
8802         case DT_RPATH   :
8803         case DT_SYMBOLIC:
8804         case DT_REL     :
8805         case DT_DEBUG   :
8806         case DT_TEXTREL :
8807         case DT_JMPREL  :
8808         case DT_RUNPATH :
8809           dynamic_info[entry->d_tag] = entry->d_un.d_val;
8810
8811           if (do_dynamic)
8812             {
8813               char * name;
8814
8815               if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
8816                 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
8817               else
8818                 name = NULL;
8819
8820               if (name)
8821                 {
8822                   switch (entry->d_tag)
8823                     {
8824                     case DT_NEEDED:
8825                       printf (_("Shared library: [%s]"), name);
8826
8827                       if (streq (name, program_interpreter))
8828                         printf (_(" program interpreter"));
8829                       break;
8830
8831                     case DT_SONAME:
8832                       printf (_("Library soname: [%s]"), name);
8833                       break;
8834
8835                     case DT_RPATH:
8836                       printf (_("Library rpath: [%s]"), name);
8837                       break;
8838
8839                     case DT_RUNPATH:
8840                       printf (_("Library runpath: [%s]"), name);
8841                       break;
8842
8843                     default:
8844                       print_vma (entry->d_un.d_val, PREFIX_HEX);
8845                       break;
8846                     }
8847                 }
8848               else
8849                 print_vma (entry->d_un.d_val, PREFIX_HEX);
8850
8851               putchar ('\n');
8852             }
8853           break;
8854
8855         case DT_PLTRELSZ:
8856         case DT_RELASZ  :
8857         case DT_STRSZ   :
8858         case DT_RELSZ   :
8859         case DT_RELAENT :
8860         case DT_SYMENT  :
8861         case DT_RELENT  :
8862           dynamic_info[entry->d_tag] = entry->d_un.d_val;
8863         case DT_PLTPADSZ:
8864         case DT_MOVEENT :
8865         case DT_MOVESZ  :
8866         case DT_INIT_ARRAYSZ:
8867         case DT_FINI_ARRAYSZ:
8868         case DT_GNU_CONFLICTSZ:
8869         case DT_GNU_LIBLISTSZ:
8870           if (do_dynamic)
8871             {
8872               print_vma (entry->d_un.d_val, UNSIGNED);
8873               printf (_(" (bytes)\n"));
8874             }
8875           break;
8876
8877         case DT_VERDEFNUM:
8878         case DT_VERNEEDNUM:
8879         case DT_RELACOUNT:
8880         case DT_RELCOUNT:
8881           if (do_dynamic)
8882             {
8883               print_vma (entry->d_un.d_val, UNSIGNED);
8884               putchar ('\n');
8885             }
8886           break;
8887
8888         case DT_SYMINSZ:
8889         case DT_SYMINENT:
8890         case DT_SYMINFO:
8891         case DT_USED:
8892         case DT_INIT_ARRAY:
8893         case DT_FINI_ARRAY:
8894           if (do_dynamic)
8895             {
8896               if (entry->d_tag == DT_USED
8897                   && VALID_DYNAMIC_NAME (entry->d_un.d_val))
8898                 {
8899                   char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
8900
8901                   if (*name)
8902                     {
8903                       printf (_("Not needed object: [%s]\n"), name);
8904                       break;
8905                     }
8906                 }
8907
8908               print_vma (entry->d_un.d_val, PREFIX_HEX);
8909               putchar ('\n');
8910             }
8911           break;
8912
8913         case DT_BIND_NOW:
8914           /* The value of this entry is ignored.  */
8915           if (do_dynamic)
8916             putchar ('\n');
8917           break;
8918
8919         case DT_GNU_PRELINKED:
8920           if (do_dynamic)
8921             {
8922               struct tm * tmp;
8923               time_t atime = entry->d_un.d_val;
8924
8925               tmp = gmtime (&atime);
8926               /* PR 17533 file: 041-1244816-0.004.  */
8927               if (tmp == NULL)
8928                 printf (_("<corrupt time val: %lx"),
8929                         (unsigned long) atime);
8930               else
8931                 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
8932                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
8933                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
8934
8935             }
8936           break;
8937
8938         case DT_GNU_HASH:
8939           dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
8940           if (do_dynamic)
8941             {
8942               print_vma (entry->d_un.d_val, PREFIX_HEX);
8943               putchar ('\n');
8944             }
8945           break;
8946
8947         default:
8948           if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
8949             version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
8950               entry->d_un.d_val;
8951
8952           if (do_dynamic)
8953             {
8954               switch (elf_header.e_machine)
8955                 {
8956                 case EM_MIPS:
8957                 case EM_MIPS_RS3_LE:
8958                   dynamic_section_mips_val (entry);
8959                   break;
8960                 case EM_PARISC:
8961                   dynamic_section_parisc_val (entry);
8962                   break;
8963                 case EM_IA_64:
8964                   dynamic_section_ia64_val (entry);
8965                   break;
8966                 default:
8967                   print_vma (entry->d_un.d_val, PREFIX_HEX);
8968                   putchar ('\n');
8969                 }
8970             }
8971           break;
8972         }
8973     }
8974
8975   return 1;
8976 }
8977
8978 static char *
8979 get_ver_flags (unsigned int flags)
8980 {
8981   static char buff[32];
8982
8983   buff[0] = 0;
8984
8985   if (flags == 0)
8986     return _("none");
8987
8988   if (flags & VER_FLG_BASE)
8989     strcat (buff, "BASE ");
8990
8991   if (flags & VER_FLG_WEAK)
8992     {
8993       if (flags & VER_FLG_BASE)
8994         strcat (buff, "| ");
8995
8996       strcat (buff, "WEAK ");
8997     }
8998
8999   if (flags & VER_FLG_INFO)
9000     {
9001       if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
9002         strcat (buff, "| ");
9003
9004       strcat (buff, "INFO ");
9005     }
9006
9007   if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
9008     strcat (buff, _("| <unknown>"));
9009
9010   return buff;
9011 }
9012
9013 /* Display the contents of the version sections.  */
9014
9015 static int
9016 process_version_sections (FILE * file)
9017 {
9018   Elf_Internal_Shdr * section;
9019   unsigned i;
9020   int found = 0;
9021
9022   if (! do_version)
9023     return 1;
9024
9025   for (i = 0, section = section_headers;
9026        i < elf_header.e_shnum;
9027        i++, section++)
9028     {
9029       switch (section->sh_type)
9030         {
9031         case SHT_GNU_verdef:
9032           {
9033             Elf_External_Verdef * edefs;
9034             unsigned int idx;
9035             unsigned int cnt;
9036             char * endbuf;
9037
9038             found = 1;
9039
9040             printf (_("\nVersion definition section '%s' contains %u entries:\n"),
9041                     printable_section_name (section),
9042                     section->sh_info);
9043
9044             printf (_("  Addr: 0x"));
9045             printf_vma (section->sh_addr);
9046             printf (_("  Offset: %#08lx  Link: %u (%s)"),
9047                     (unsigned long) section->sh_offset, section->sh_link,
9048                     printable_section_name_from_index (section->sh_link));
9049
9050             edefs = (Elf_External_Verdef *)
9051                 get_data (NULL, file, section->sh_offset, 1,section->sh_size,
9052                           _("version definition section"));
9053             if (!edefs)
9054               break;
9055             endbuf = (char *) edefs + section->sh_size;
9056
9057             for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
9058               {
9059                 char * vstart;
9060                 Elf_External_Verdef * edef;
9061                 Elf_Internal_Verdef ent;
9062                 Elf_External_Verdaux * eaux;
9063                 Elf_Internal_Verdaux aux;
9064                 int j;
9065                 int isum;
9066
9067                 /* Check for very large indicies.  */
9068                 if (idx > (size_t) (endbuf - (char *) edefs))
9069                   break;
9070
9071                 vstart = ((char *) edefs) + idx;
9072                 if (vstart + sizeof (*edef) > endbuf)
9073                   break;
9074
9075                 edef = (Elf_External_Verdef *) vstart;
9076
9077                 ent.vd_version = BYTE_GET (edef->vd_version);
9078                 ent.vd_flags   = BYTE_GET (edef->vd_flags);
9079                 ent.vd_ndx     = BYTE_GET (edef->vd_ndx);
9080                 ent.vd_cnt     = BYTE_GET (edef->vd_cnt);
9081                 ent.vd_hash    = BYTE_GET (edef->vd_hash);
9082                 ent.vd_aux     = BYTE_GET (edef->vd_aux);
9083                 ent.vd_next    = BYTE_GET (edef->vd_next);
9084
9085                 printf (_("  %#06x: Rev: %d  Flags: %s"),
9086                         idx, ent.vd_version, get_ver_flags (ent.vd_flags));
9087
9088                 printf (_("  Index: %d  Cnt: %d  "),
9089                         ent.vd_ndx, ent.vd_cnt);
9090
9091                 /* Check for overflow.  */
9092                 if (ent.vd_aux > (size_t) (endbuf - vstart))
9093                   break;
9094
9095                 vstart += ent.vd_aux;
9096
9097                 eaux = (Elf_External_Verdaux *) vstart;
9098
9099                 aux.vda_name = BYTE_GET (eaux->vda_name);
9100                 aux.vda_next = BYTE_GET (eaux->vda_next);
9101
9102                 if (VALID_DYNAMIC_NAME (aux.vda_name))
9103                   printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
9104                 else
9105                   printf (_("Name index: %ld\n"), aux.vda_name);
9106
9107                 isum = idx + ent.vd_aux;
9108
9109                 for (j = 1; j < ent.vd_cnt; j++)
9110                   {
9111                     /* Check for overflow.  */
9112                     if (aux.vda_next > (size_t) (endbuf - vstart))
9113                       break;
9114
9115                     isum   += aux.vda_next;
9116                     vstart += aux.vda_next;
9117
9118                     eaux = (Elf_External_Verdaux *) vstart;
9119                     if (vstart + sizeof (*eaux) > endbuf)
9120                       break;
9121
9122                     aux.vda_name = BYTE_GET (eaux->vda_name);
9123                     aux.vda_next = BYTE_GET (eaux->vda_next);
9124
9125                     if (VALID_DYNAMIC_NAME (aux.vda_name))
9126                       printf (_("  %#06x: Parent %d: %s\n"),
9127                               isum, j, GET_DYNAMIC_NAME (aux.vda_name));
9128                     else
9129                       printf (_("  %#06x: Parent %d, name index: %ld\n"),
9130                               isum, j, aux.vda_name);
9131                   }
9132
9133                 if (j < ent.vd_cnt)
9134                   printf (_("  Version def aux past end of section\n"));
9135
9136                 idx += ent.vd_next;
9137               }
9138
9139             if (cnt < section->sh_info)
9140               printf (_("  Version definition past end of section\n"));
9141
9142             free (edefs);
9143           }
9144           break;
9145
9146         case SHT_GNU_verneed:
9147           {
9148             Elf_External_Verneed * eneed;
9149             unsigned int idx;
9150             unsigned int cnt;
9151             char * endbuf;
9152
9153             found = 1;
9154
9155             printf (_("\nVersion needs section '%s' contains %u entries:\n"),
9156                     printable_section_name (section), section->sh_info);
9157
9158             printf (_(" Addr: 0x"));
9159             printf_vma (section->sh_addr);
9160             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
9161                     (unsigned long) section->sh_offset, section->sh_link,
9162                     printable_section_name_from_index (section->sh_link));
9163
9164             eneed = (Elf_External_Verneed *) get_data (NULL, file,
9165                                                        section->sh_offset, 1,
9166                                                        section->sh_size,
9167                                                        _("Version Needs section"));
9168             if (!eneed)
9169               break;
9170             endbuf = (char *) eneed + section->sh_size;
9171
9172             for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
9173               {
9174                 Elf_External_Verneed * entry;
9175                 Elf_Internal_Verneed ent;
9176                 int j;
9177                 int isum;
9178                 char * vstart;
9179
9180                 if (idx > (size_t) (endbuf - (char *) eneed))
9181                   break;
9182
9183                 vstart = ((char *) eneed) + idx;
9184                 if (vstart + sizeof (*entry) > endbuf)
9185                   break;
9186
9187                 entry = (Elf_External_Verneed *) vstart;
9188
9189                 ent.vn_version = BYTE_GET (entry->vn_version);
9190                 ent.vn_cnt     = BYTE_GET (entry->vn_cnt);
9191                 ent.vn_file    = BYTE_GET (entry->vn_file);
9192                 ent.vn_aux     = BYTE_GET (entry->vn_aux);
9193                 ent.vn_next    = BYTE_GET (entry->vn_next);
9194
9195                 printf (_("  %#06x: Version: %d"), idx, ent.vn_version);
9196
9197                 if (VALID_DYNAMIC_NAME (ent.vn_file))
9198                   printf (_("  File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
9199                 else
9200                   printf (_("  File: %lx"), ent.vn_file);
9201
9202                 printf (_("  Cnt: %d\n"), ent.vn_cnt);
9203
9204                 /* Check for overflow.  */
9205                 if (ent.vn_aux > (size_t) (endbuf - vstart))
9206                   break;
9207
9208                 vstart += ent.vn_aux;
9209
9210                 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
9211                   {
9212                     Elf_External_Vernaux * eaux;
9213                     Elf_Internal_Vernaux aux;
9214
9215                     if (vstart + sizeof (*eaux) > endbuf)
9216                       break;
9217                     eaux = (Elf_External_Vernaux *) vstart;
9218
9219                     aux.vna_hash  = BYTE_GET (eaux->vna_hash);
9220                     aux.vna_flags = BYTE_GET (eaux->vna_flags);
9221                     aux.vna_other = BYTE_GET (eaux->vna_other);
9222                     aux.vna_name  = BYTE_GET (eaux->vna_name);
9223                     aux.vna_next  = BYTE_GET (eaux->vna_next);
9224
9225                     if (VALID_DYNAMIC_NAME (aux.vna_name))
9226                       printf (_("  %#06x:   Name: %s"),
9227                               isum, GET_DYNAMIC_NAME (aux.vna_name));
9228                     else
9229                       printf (_("  %#06x:   Name index: %lx"),
9230                               isum, aux.vna_name);
9231
9232                     printf (_("  Flags: %s  Version: %d\n"),
9233                             get_ver_flags (aux.vna_flags), aux.vna_other);
9234
9235                     /* Check for overflow.  */
9236                     if (aux.vna_next > (size_t) (endbuf - vstart))
9237                       break;
9238
9239                     isum   += aux.vna_next;
9240                     vstart += aux.vna_next;
9241                   }
9242
9243                 if (j < ent.vn_cnt)
9244                   warn (_("Missing Version Needs auxillary information\n"));
9245
9246                 if (ent.vn_next == 0 && cnt < section->sh_info - 1)
9247                   {
9248                     warn (_("Corrupt Version Needs structure - offset to next structure is zero with entries still left to be processed\n"));
9249                     cnt = section->sh_info;
9250                     break;
9251                   }
9252                 idx += ent.vn_next;
9253               }
9254
9255             if (cnt < section->sh_info)
9256               warn (_("Missing Version Needs information\n"));
9257
9258             free (eneed);
9259           }
9260           break;
9261
9262         case SHT_GNU_versym:
9263           {
9264             Elf_Internal_Shdr * link_section;
9265             size_t total;
9266             unsigned int cnt;
9267             unsigned char * edata;
9268             unsigned short * data;
9269             char * strtab;
9270             Elf_Internal_Sym * symbols;
9271             Elf_Internal_Shdr * string_sec;
9272             unsigned long num_syms;
9273             long off;
9274
9275             if (section->sh_link >= elf_header.e_shnum)
9276               break;
9277
9278             link_section = section_headers + section->sh_link;
9279             total = section->sh_size / sizeof (Elf_External_Versym);
9280
9281             if (link_section->sh_link >= elf_header.e_shnum)
9282               break;
9283
9284             found = 1;
9285
9286             symbols = GET_ELF_SYMBOLS (file, link_section, & num_syms);
9287             if (symbols == NULL)
9288               break;
9289
9290             string_sec = section_headers + link_section->sh_link;
9291
9292             strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
9293                                         string_sec->sh_size,
9294                                         _("version string table"));
9295             if (!strtab)
9296               {
9297                 free (symbols);
9298                 break;
9299               }
9300
9301             printf (_("\nVersion symbols section '%s' contains %lu entries:\n"),
9302                     printable_section_name (section), (unsigned long) total);
9303
9304             printf (_(" Addr: "));
9305             printf_vma (section->sh_addr);
9306             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
9307                     (unsigned long) section->sh_offset, section->sh_link,
9308                     printable_section_name (link_section));
9309
9310             off = offset_from_vma (file,
9311                                    version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
9312                                    total * sizeof (short));
9313             edata = (unsigned char *) get_data (NULL, file, off, total,
9314                                                 sizeof (short),
9315                                                 _("version symbol data"));
9316             if (!edata)
9317               {
9318                 free (strtab);
9319                 free (symbols);
9320                 break;
9321               }
9322
9323             data = (short unsigned int *) cmalloc (total, sizeof (short));
9324
9325             for (cnt = total; cnt --;)
9326               data[cnt] = byte_get (edata + cnt * sizeof (short),
9327                                     sizeof (short));
9328
9329             free (edata);
9330
9331             for (cnt = 0; cnt < total; cnt += 4)
9332               {
9333                 int j, nn;
9334                 int check_def, check_need;
9335                 char * name;
9336
9337                 printf ("  %03x:", cnt);
9338
9339                 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
9340                   switch (data[cnt + j])
9341                     {
9342                     case 0:
9343                       fputs (_("   0 (*local*)    "), stdout);
9344                       break;
9345
9346                     case 1:
9347                       fputs (_("   1 (*global*)   "), stdout);
9348                       break;
9349
9350                     default:
9351                       nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
9352                                    data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
9353
9354                       /* If this index value is greater than the size of the symbols
9355                          array, break to avoid an out-of-bounds read.  */
9356                       if ((unsigned long)(cnt + j) >= num_syms)
9357                         {
9358                           warn (_("invalid index into symbol array\n"));
9359                           break;
9360                         }
9361
9362                       check_def = 1;
9363                       check_need = 1;
9364                       if (symbols[cnt + j].st_shndx >= elf_header.e_shnum
9365                           || section_headers[symbols[cnt + j].st_shndx].sh_type
9366                              != SHT_NOBITS)
9367                         {
9368                           if (symbols[cnt + j].st_shndx == SHN_UNDEF)
9369                             check_def = 0;
9370                           else
9371                             check_need = 0;
9372                         }
9373
9374                       if (check_need
9375                           && version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
9376                         {
9377                           Elf_Internal_Verneed ivn;
9378                           unsigned long offset;
9379
9380                           offset = offset_from_vma
9381                             (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
9382                              sizeof (Elf_External_Verneed));
9383
9384                           do
9385                             {
9386                               Elf_Internal_Vernaux ivna;
9387                               Elf_External_Verneed evn;
9388                               Elf_External_Vernaux evna;
9389                               unsigned long a_off;
9390
9391                               if (get_data (&evn, file, offset, sizeof (evn), 1,
9392                                             _("version need")) == NULL)
9393                                 break;
9394
9395                               ivn.vn_aux  = BYTE_GET (evn.vn_aux);
9396                               ivn.vn_next = BYTE_GET (evn.vn_next);
9397
9398                               a_off = offset + ivn.vn_aux;
9399
9400                               do
9401                                 {
9402                                   if (get_data (&evna, file, a_off, sizeof (evna),
9403                                                 1, _("version need aux (2)")) == NULL)
9404                                     {
9405                                       ivna.vna_next  = 0;
9406                                       ivna.vna_other = 0;
9407                                     }
9408                                   else
9409                                     {
9410                                       ivna.vna_next  = BYTE_GET (evna.vna_next);
9411                                       ivna.vna_other = BYTE_GET (evna.vna_other);
9412                                     }
9413
9414                                   a_off += ivna.vna_next;
9415                                 }
9416                               while (ivna.vna_other != data[cnt + j]
9417                                      && ivna.vna_next != 0);
9418
9419                               if (ivna.vna_other == data[cnt + j])
9420                                 {
9421                                   ivna.vna_name = BYTE_GET (evna.vna_name);
9422
9423                                   if (ivna.vna_name >= string_sec->sh_size)
9424                                     name = _("*invalid*");
9425                                   else
9426                                     name = strtab + ivna.vna_name;
9427                                   nn += printf ("(%s%-*s",
9428                                                 name,
9429                                                 12 - (int) strlen (name),
9430                                                 ")");
9431                                   check_def = 0;
9432                                   break;
9433                                 }
9434
9435                               offset += ivn.vn_next;
9436                             }
9437                           while (ivn.vn_next);
9438                         }
9439
9440                       if (check_def && data[cnt + j] != 0x8001
9441                           && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
9442                         {
9443                           Elf_Internal_Verdef ivd;
9444                           Elf_External_Verdef evd;
9445                           unsigned long offset;
9446
9447                           offset = offset_from_vma
9448                             (file, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
9449                              sizeof evd);
9450
9451                           do
9452                             {
9453                               if (get_data (&evd, file, offset, sizeof (evd), 1,
9454                                             _("version def")) == NULL)
9455                                 {
9456                                   ivd.vd_next = 0;
9457                                   /* PR 17531: file: 046-1082287-0.004.  */ 
9458                                   ivd.vd_ndx  = (data[cnt + j] & VERSYM_VERSION) + 1;
9459                                   break;
9460                                 }
9461                               else
9462                                 {
9463                                   ivd.vd_next = BYTE_GET (evd.vd_next);
9464                                   ivd.vd_ndx  = BYTE_GET (evd.vd_ndx);
9465                                 }
9466
9467                               offset += ivd.vd_next;
9468                             }
9469                           while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
9470                                  && ivd.vd_next != 0);
9471
9472                           if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
9473                             {
9474                               Elf_External_Verdaux evda;
9475                               Elf_Internal_Verdaux ivda;
9476
9477                               ivd.vd_aux = BYTE_GET (evd.vd_aux);
9478
9479                               if (get_data (&evda, file,
9480                                             offset - ivd.vd_next + ivd.vd_aux,
9481                                             sizeof (evda), 1,
9482                                             _("version def aux")) == NULL)
9483                                 break;
9484
9485                               ivda.vda_name = BYTE_GET (evda.vda_name);
9486
9487                               if (ivda.vda_name >= string_sec->sh_size)
9488                                 name = _("*invalid*");
9489                               else
9490                                 name = strtab + ivda.vda_name;
9491                               nn += printf ("(%s%-*s",
9492                                             name,
9493                                             12 - (int) strlen (name),
9494                                             ")");
9495                             }
9496                         }
9497
9498                       if (nn < 18)
9499                         printf ("%*c", 18 - nn, ' ');
9500                     }
9501
9502                 putchar ('\n');
9503               }
9504
9505             free (data);
9506             free (strtab);
9507             free (symbols);
9508           }
9509           break;
9510
9511         default:
9512           break;
9513         }
9514     }
9515
9516   if (! found)
9517     printf (_("\nNo version information found in this file.\n"));
9518
9519   return 1;
9520 }
9521
9522 static const char *
9523 get_symbol_binding (unsigned int binding)
9524 {
9525   static char buff[32];
9526
9527   switch (binding)
9528     {
9529     case STB_LOCAL:     return "LOCAL";
9530     case STB_GLOBAL:    return "GLOBAL";
9531     case STB_WEAK:      return "WEAK";
9532     default:
9533       if (binding >= STB_LOPROC && binding <= STB_HIPROC)
9534         snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
9535                   binding);
9536       else if (binding >= STB_LOOS && binding <= STB_HIOS)
9537         {
9538           if (binding == STB_GNU_UNIQUE
9539               && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
9540                   /* GNU is still using the default value 0.  */
9541                   || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
9542             return "UNIQUE";
9543           snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
9544         }
9545       else
9546         snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
9547       return buff;
9548     }
9549 }
9550
9551 static const char *
9552 get_symbol_type (unsigned int type)
9553 {
9554   static char buff[32];
9555
9556   switch (type)
9557     {
9558     case STT_NOTYPE:    return "NOTYPE";
9559     case STT_OBJECT:    return "OBJECT";
9560     case STT_FUNC:      return "FUNC";
9561     case STT_SECTION:   return "SECTION";
9562     case STT_FILE:      return "FILE";
9563     case STT_COMMON:    return "COMMON";
9564     case STT_TLS:       return "TLS";
9565     case STT_RELC:      return "RELC";
9566     case STT_SRELC:     return "SRELC";
9567     default:
9568       if (type >= STT_LOPROC && type <= STT_HIPROC)
9569         {
9570           if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
9571             return "THUMB_FUNC";
9572
9573           if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
9574             return "REGISTER";
9575
9576           if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
9577             return "PARISC_MILLI";
9578
9579           snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
9580         }
9581       else if (type >= STT_LOOS && type <= STT_HIOS)
9582         {
9583           if (elf_header.e_machine == EM_PARISC)
9584             {
9585               if (type == STT_HP_OPAQUE)
9586                 return "HP_OPAQUE";
9587               if (type == STT_HP_STUB)
9588                 return "HP_STUB";
9589             }
9590
9591           if (type == STT_GNU_IFUNC
9592               && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
9593                   || elf_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD
9594                   /* GNU is still using the default value 0.  */
9595                   || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
9596             return "IFUNC";
9597
9598           snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
9599         }
9600       else
9601         snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
9602       return buff;
9603     }
9604 }
9605
9606 static const char *
9607 get_symbol_visibility (unsigned int visibility)
9608 {
9609   switch (visibility)
9610     {
9611     case STV_DEFAULT:   return "DEFAULT";
9612     case STV_INTERNAL:  return "INTERNAL";
9613     case STV_HIDDEN:    return "HIDDEN";
9614     case STV_PROTECTED: return "PROTECTED";
9615     default: abort ();
9616     }
9617 }
9618
9619 static const char *
9620 get_mips_symbol_other (unsigned int other)
9621 {
9622   switch (other)
9623     {
9624     case STO_OPTIONAL:
9625       return "OPTIONAL";
9626     case STO_MIPS_PLT:
9627       return "MIPS PLT";
9628     case STO_MIPS_PIC:
9629       return "MIPS PIC";
9630     case STO_MICROMIPS:
9631       return "MICROMIPS";
9632     case STO_MICROMIPS | STO_MIPS_PIC:
9633       return "MICROMIPS, MIPS PIC";
9634     case STO_MIPS16:
9635       return "MIPS16";
9636     default:
9637       return NULL;
9638     }
9639 }
9640
9641 static const char *
9642 get_ia64_symbol_other (unsigned int other)
9643 {
9644   if (is_ia64_vms ())
9645     {
9646       static char res[32];
9647
9648       res[0] = 0;
9649
9650       /* Function types is for images and .STB files only.  */
9651       switch (elf_header.e_type)
9652         {
9653         case ET_DYN:
9654         case ET_EXEC:
9655           switch (VMS_ST_FUNC_TYPE (other))
9656             {
9657             case VMS_SFT_CODE_ADDR:
9658               strcat (res, " CA");
9659               break;
9660             case VMS_SFT_SYMV_IDX:
9661               strcat (res, " VEC");
9662               break;
9663             case VMS_SFT_FD:
9664               strcat (res, " FD");
9665               break;
9666             case VMS_SFT_RESERVE:
9667               strcat (res, " RSV");
9668               break;
9669             default:
9670               abort ();
9671             }
9672           break;
9673         default:
9674           break;
9675         }
9676       switch (VMS_ST_LINKAGE (other))
9677         {
9678         case VMS_STL_IGNORE:
9679           strcat (res, " IGN");
9680           break;
9681         case VMS_STL_RESERVE:
9682           strcat (res, " RSV");
9683           break;
9684         case VMS_STL_STD:
9685           strcat (res, " STD");
9686           break;
9687         case VMS_STL_LNK:
9688           strcat (res, " LNK");
9689           break;
9690         default:
9691           abort ();
9692         }
9693
9694       if (res[0] != 0)
9695         return res + 1;
9696       else
9697         return res;
9698     }
9699   return NULL;
9700 }
9701
9702 static const char *
9703 get_ppc64_symbol_other (unsigned int other)
9704 {
9705   if (PPC64_LOCAL_ENTRY_OFFSET (other) != 0)
9706     {
9707       static char buf[32];
9708       snprintf (buf, sizeof buf, _("<localentry>: %d"),
9709                 PPC64_LOCAL_ENTRY_OFFSET (other));
9710       return buf;
9711     }
9712   return NULL;
9713 }
9714
9715 static const char *
9716 get_symbol_other (unsigned int other)
9717 {
9718   const char * result = NULL;
9719   static char buff [32];
9720
9721   if (other == 0)
9722     return "";
9723
9724   switch (elf_header.e_machine)
9725     {
9726     case EM_MIPS:
9727       result = get_mips_symbol_other (other);
9728       break;
9729     case EM_IA_64:
9730       result = get_ia64_symbol_other (other);
9731       break;
9732     case EM_PPC64:
9733       result = get_ppc64_symbol_other (other);
9734       break;
9735     default:
9736       break;
9737     }
9738
9739   if (result)
9740     return result;
9741
9742   snprintf (buff, sizeof buff, _("<other>: %x"), other);
9743   return buff;
9744 }
9745
9746 static const char *
9747 get_symbol_index_type (unsigned int type)
9748 {
9749   static char buff[32];
9750
9751   switch (type)
9752     {
9753     case SHN_UNDEF:     return "UND";
9754     case SHN_ABS:       return "ABS";
9755     case SHN_COMMON:    return "COM";
9756     default:
9757       if (type == SHN_IA_64_ANSI_COMMON
9758           && elf_header.e_machine == EM_IA_64
9759           && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
9760         return "ANSI_COM";
9761       else if ((elf_header.e_machine == EM_X86_64
9762                 || elf_header.e_machine == EM_L1OM
9763                 || elf_header.e_machine == EM_K1OM)
9764                && type == SHN_X86_64_LCOMMON)
9765         return "LARGE_COM";
9766       else if ((type == SHN_MIPS_SCOMMON
9767                 && elf_header.e_machine == EM_MIPS)
9768                || (type == SHN_TIC6X_SCOMMON
9769                    && elf_header.e_machine == EM_TI_C6000))
9770         return "SCOM";
9771       else if (type == SHN_MIPS_SUNDEFINED
9772                && elf_header.e_machine == EM_MIPS)
9773         return "SUND";
9774       else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
9775         sprintf (buff, "PRC[0x%04x]", type & 0xffff);
9776       else if (type >= SHN_LOOS && type <= SHN_HIOS)
9777         sprintf (buff, "OS [0x%04x]", type & 0xffff);
9778       else if (type >= SHN_LORESERVE)
9779         sprintf (buff, "RSV[0x%04x]", type & 0xffff);
9780       else if (type >= elf_header.e_shnum)
9781         sprintf (buff, _("bad section index[%3d]"), type);
9782       else
9783         sprintf (buff, "%3d", type);
9784       break;
9785     }
9786
9787   return buff;
9788 }
9789
9790 static bfd_vma *
9791 get_dynamic_data (FILE * file, size_t number, unsigned int ent_size)
9792 {
9793   unsigned char * e_data;
9794   bfd_vma * i_data;
9795
9796   /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
9797      attempting to allocate memory when the read is bound to fail.  */
9798   if (ent_size * number > current_file_size)
9799     {
9800       error (_("Invalid number of dynamic entries: %lu\n"),
9801              (unsigned long) number);
9802       return NULL;
9803     }
9804
9805   e_data = (unsigned char *) cmalloc (number, ent_size);
9806   if (e_data == NULL)
9807     {
9808       error (_("Out of memory reading %lu dynamic entries\n"),
9809              (unsigned long) number);
9810       return NULL;
9811     }
9812
9813   if (fread (e_data, ent_size, number, file) != number)
9814     {
9815       error (_("Unable to read in %lu bytes of dynamic data\n"),
9816              (unsigned long) (number * ent_size));
9817       free (e_data);
9818       return NULL;
9819     }
9820
9821   i_data = (bfd_vma *) cmalloc (number, sizeof (*i_data));
9822   if (i_data == NULL)
9823     {
9824       error (_("Out of memory allocating space for %lu dynamic entries\n"),
9825              (unsigned long) number);
9826       free (e_data);
9827       return NULL;
9828     }
9829
9830   while (number--)
9831     i_data[number] = byte_get (e_data + number * ent_size, ent_size);
9832
9833   free (e_data);
9834
9835   return i_data;
9836 }
9837
9838 static void
9839 print_dynamic_symbol (bfd_vma si, unsigned long hn)
9840 {
9841   Elf_Internal_Sym * psym;
9842   int n;
9843
9844   n = print_vma (si, DEC_5);
9845   if (n < 5)
9846     fputs (&"     "[n], stdout);
9847   printf (" %3lu: ", hn);
9848
9849   if (dynamic_symbols == NULL || si >= num_dynamic_syms)
9850     {
9851       printf (_("<No info available for dynamic symbol number %lu>\n"),
9852               (unsigned long) si);
9853       return;
9854     }
9855
9856   psym = dynamic_symbols + si;
9857   print_vma (psym->st_value, LONG_HEX);
9858   putchar (' ');
9859   print_vma (psym->st_size, DEC_5);
9860
9861   printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
9862   printf (" %-6s",  get_symbol_binding (ELF_ST_BIND (psym->st_info)));
9863   printf (" %-7s",  get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
9864   /* Check to see if any other bits in the st_other field are set.
9865      Note - displaying this information disrupts the layout of the
9866      table being generated, but for the moment this case is very
9867      rare.  */
9868   if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
9869     printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
9870   printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
9871   if (VALID_DYNAMIC_NAME (psym->st_name))
9872     print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
9873   else
9874     printf (_(" <corrupt: %14ld>"), psym->st_name);
9875   putchar ('\n');
9876 }
9877
9878 /* Dump the symbol table.  */
9879 static int
9880 process_symbol_table (FILE * file)
9881 {
9882   Elf_Internal_Shdr * section;
9883   bfd_size_type nbuckets = 0;
9884   bfd_size_type nchains = 0;
9885   bfd_vma * buckets = NULL;
9886   bfd_vma * chains = NULL;
9887   bfd_vma ngnubuckets = 0;
9888   bfd_vma * gnubuckets = NULL;
9889   bfd_vma * gnuchains = NULL;
9890   bfd_vma gnusymidx = 0;
9891   bfd_size_type ngnuchains = 0;
9892
9893   if (!do_syms && !do_dyn_syms && !do_histogram)
9894     return 1;
9895
9896   if (dynamic_info[DT_HASH]
9897       && (do_histogram
9898           || (do_using_dynamic
9899               && !do_dyn_syms
9900               && dynamic_strings != NULL)))
9901     {
9902       unsigned char nb[8];
9903       unsigned char nc[8];
9904       unsigned int hash_ent_size = 4;
9905
9906       if ((elf_header.e_machine == EM_ALPHA
9907            || elf_header.e_machine == EM_S390
9908            || elf_header.e_machine == EM_S390_OLD)
9909           && elf_header.e_ident[EI_CLASS] == ELFCLASS64)
9910         hash_ent_size = 8;
9911
9912       if (fseek (file,
9913                  (archive_file_offset
9914                   + offset_from_vma (file, dynamic_info[DT_HASH],
9915                                      sizeof nb + sizeof nc)),
9916                  SEEK_SET))
9917         {
9918           error (_("Unable to seek to start of dynamic information\n"));
9919           goto no_hash;
9920         }
9921
9922       if (fread (nb, hash_ent_size, 1, file) != 1)
9923         {
9924           error (_("Failed to read in number of buckets\n"));
9925           goto no_hash;
9926         }
9927
9928       if (fread (nc, hash_ent_size, 1, file) != 1)
9929         {
9930           error (_("Failed to read in number of chains\n"));
9931           goto no_hash;
9932         }
9933
9934       nbuckets = byte_get (nb, hash_ent_size);
9935       nchains  = byte_get (nc, hash_ent_size);
9936
9937       buckets = get_dynamic_data (file, nbuckets, hash_ent_size);
9938       chains  = get_dynamic_data (file, nchains, hash_ent_size);
9939
9940     no_hash:
9941       if (buckets == NULL || chains == NULL)
9942         {
9943           if (do_using_dynamic)
9944             return 0;
9945           free (buckets);
9946           free (chains);
9947           buckets = NULL;
9948           chains = NULL;
9949           nbuckets = 0;
9950           nchains = 0;
9951         }
9952     }
9953
9954   if (dynamic_info_DT_GNU_HASH
9955       && (do_histogram
9956           || (do_using_dynamic
9957               && !do_dyn_syms
9958               && dynamic_strings != NULL)))
9959     {
9960       unsigned char nb[16];
9961       bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
9962       bfd_vma buckets_vma;
9963
9964       if (fseek (file,
9965                  (archive_file_offset
9966                   + offset_from_vma (file, dynamic_info_DT_GNU_HASH,
9967                                      sizeof nb)),
9968                  SEEK_SET))
9969         {
9970           error (_("Unable to seek to start of dynamic information\n"));
9971           goto no_gnu_hash;
9972         }
9973
9974       if (fread (nb, 16, 1, file) != 1)
9975         {
9976           error (_("Failed to read in number of buckets\n"));
9977           goto no_gnu_hash;
9978         }
9979
9980       ngnubuckets = byte_get (nb, 4);
9981       gnusymidx = byte_get (nb + 4, 4);
9982       bitmaskwords = byte_get (nb + 8, 4);
9983       buckets_vma = dynamic_info_DT_GNU_HASH + 16;
9984       if (is_32bit_elf)
9985         buckets_vma += bitmaskwords * 4;
9986       else
9987         buckets_vma += bitmaskwords * 8;
9988
9989       if (fseek (file,
9990                  (archive_file_offset
9991                   + offset_from_vma (file, buckets_vma, 4)),
9992                  SEEK_SET))
9993         {
9994           error (_("Unable to seek to start of dynamic information\n"));
9995           goto no_gnu_hash;
9996         }
9997
9998       gnubuckets = get_dynamic_data (file, ngnubuckets, 4);
9999
10000       if (gnubuckets == NULL)
10001         goto no_gnu_hash;
10002
10003       for (i = 0; i < ngnubuckets; i++)
10004         if (gnubuckets[i] != 0)
10005           {
10006             if (gnubuckets[i] < gnusymidx)
10007               return 0;
10008
10009             if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
10010               maxchain = gnubuckets[i];
10011           }
10012
10013       if (maxchain == 0xffffffff)
10014         goto no_gnu_hash;
10015
10016       maxchain -= gnusymidx;
10017
10018       if (fseek (file,
10019                  (archive_file_offset
10020                   + offset_from_vma (file, buckets_vma
10021                                            + 4 * (ngnubuckets + maxchain), 4)),
10022                  SEEK_SET))
10023         {
10024           error (_("Unable to seek to start of dynamic information\n"));
10025           goto no_gnu_hash;
10026         }
10027
10028       do
10029         {
10030           if (fread (nb, 4, 1, file) != 1)
10031             {
10032               error (_("Failed to determine last chain length\n"));
10033               goto no_gnu_hash;
10034             }
10035
10036           if (maxchain + 1 == 0)
10037             goto no_gnu_hash;
10038
10039           ++maxchain;
10040         }
10041       while ((byte_get (nb, 4) & 1) == 0);
10042
10043       if (fseek (file,
10044                  (archive_file_offset
10045                   + offset_from_vma (file, buckets_vma + 4 * ngnubuckets, 4)),
10046                  SEEK_SET))
10047         {
10048           error (_("Unable to seek to start of dynamic information\n"));
10049           goto no_gnu_hash;
10050         }
10051
10052       gnuchains = get_dynamic_data (file, maxchain, 4);
10053       ngnuchains = maxchain;
10054
10055     no_gnu_hash:
10056       if (gnuchains == NULL)
10057         {
10058           free (gnubuckets);
10059           gnubuckets = NULL;
10060           ngnubuckets = 0;
10061           if (do_using_dynamic)
10062             return 0;
10063         }
10064     }
10065
10066   if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
10067       && do_syms
10068       && do_using_dynamic
10069       && dynamic_strings != NULL
10070       && dynamic_symbols != NULL)
10071     {
10072       unsigned long hn;
10073
10074       if (dynamic_info[DT_HASH])
10075         {
10076           bfd_vma si;
10077
10078           printf (_("\nSymbol table for image:\n"));
10079           if (is_32bit_elf)
10080             printf (_("  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"));
10081           else
10082             printf (_("  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"));
10083
10084           for (hn = 0; hn < nbuckets; hn++)
10085             {
10086               if (! buckets[hn])
10087                 continue;
10088
10089               for (si = buckets[hn]; si < nchains && si > 0; si = chains[si])
10090                 print_dynamic_symbol (si, hn);
10091             }
10092         }
10093
10094       if (dynamic_info_DT_GNU_HASH)
10095         {
10096           printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
10097           if (is_32bit_elf)
10098             printf (_("  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"));
10099           else
10100             printf (_("  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"));
10101
10102           for (hn = 0; hn < ngnubuckets; ++hn)
10103             if (gnubuckets[hn] != 0)
10104               {
10105                 bfd_vma si = gnubuckets[hn];
10106                 bfd_vma off = si - gnusymidx;
10107
10108                 do
10109                   {
10110                     print_dynamic_symbol (si, hn);
10111                     si++;
10112                   }
10113                 while (off < ngnuchains && (gnuchains[off++] & 1) == 0);
10114               }
10115         }
10116     }
10117   else if ((do_dyn_syms || (do_syms && !do_using_dynamic))
10118            && section_headers != NULL)
10119     {
10120       unsigned int i;
10121
10122       for (i = 0, section = section_headers;
10123            i < elf_header.e_shnum;
10124            i++, section++)
10125         {
10126           unsigned int si;
10127           char * strtab = NULL;
10128           unsigned long int strtab_size = 0;
10129           Elf_Internal_Sym * symtab;
10130           Elf_Internal_Sym * psym;
10131           unsigned long num_syms;
10132
10133           if ((section->sh_type != SHT_SYMTAB
10134                && section->sh_type != SHT_DYNSYM)
10135               || (!do_syms
10136                   && section->sh_type == SHT_SYMTAB))
10137             continue;
10138
10139           if (section->sh_entsize == 0)
10140             {
10141               printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
10142                       printable_section_name (section));
10143               continue;
10144             }
10145
10146           printf (_("\nSymbol table '%s' contains %lu entries:\n"),
10147                   printable_section_name (section),
10148                   (unsigned long) (section->sh_size / section->sh_entsize));
10149
10150           if (is_32bit_elf)
10151             printf (_("   Num:    Value  Size Type    Bind   Vis      Ndx Name\n"));
10152           else
10153             printf (_("   Num:    Value          Size Type    Bind   Vis      Ndx Name\n"));
10154
10155           symtab = GET_ELF_SYMBOLS (file, section, & num_syms);
10156           if (symtab == NULL)
10157             continue;
10158
10159           if (section->sh_link == elf_header.e_shstrndx)
10160             {
10161               strtab = string_table;
10162               strtab_size = string_table_length;
10163             }
10164           else if (section->sh_link < elf_header.e_shnum)
10165             {
10166               Elf_Internal_Shdr * string_sec;
10167
10168               string_sec = section_headers + section->sh_link;
10169
10170               strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
10171                                           1, string_sec->sh_size,
10172                                           _("string table"));
10173               strtab_size = strtab != NULL ? string_sec->sh_size : 0;
10174             }
10175
10176           for (si = 0, psym = symtab; si < num_syms; si++, psym++)
10177             {
10178               printf ("%6d: ", si);
10179               print_vma (psym->st_value, LONG_HEX);
10180               putchar (' ');
10181               print_vma (psym->st_size, DEC_5);
10182               printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
10183               printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
10184               printf (" %-7s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
10185               /* Check to see if any other bits in the st_other field are set.
10186                  Note - displaying this information disrupts the layout of the
10187                  table being generated, but for the moment this case is very rare.  */
10188               if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
10189                 printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
10190               printf (" %4s ", get_symbol_index_type (psym->st_shndx));
10191               print_symbol (25, psym->st_name < strtab_size
10192                             ? strtab + psym->st_name : _("<corrupt>"));
10193
10194               if (section->sh_type == SHT_DYNSYM
10195                   && version_info[DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
10196                 {
10197                   unsigned char data[2];
10198                   unsigned short vers_data;
10199                   unsigned long offset;
10200                   int is_nobits;
10201                   int check_def;
10202
10203                   offset = offset_from_vma
10204                     (file, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10205                      sizeof data + si * sizeof (vers_data));
10206
10207                   if (get_data (&data, file, offset + si * sizeof (vers_data),
10208                                 sizeof (data), 1, _("version data")) == NULL)
10209                     break;
10210
10211                   vers_data = byte_get (data, 2);
10212
10213                   is_nobits = (psym->st_shndx < elf_header.e_shnum
10214                                && section_headers[psym->st_shndx].sh_type
10215                                   == SHT_NOBITS);
10216
10217                   check_def = (psym->st_shndx != SHN_UNDEF);
10218
10219                   if ((vers_data & VERSYM_HIDDEN) || vers_data > 1)
10220                     {
10221                       if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)]
10222                           && (is_nobits || ! check_def))
10223                         {
10224                           Elf_External_Verneed evn;
10225                           Elf_Internal_Verneed ivn;
10226                           Elf_Internal_Vernaux ivna;
10227
10228                           /* We must test both.  */
10229                           offset = offset_from_vma
10230                             (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10231                              sizeof evn);
10232
10233                           do
10234                             {
10235                               unsigned long vna_off;
10236
10237                               if (get_data (&evn, file, offset, sizeof (evn), 1,
10238                                             _("version need")) == NULL)
10239                                 {
10240                                   ivna.vna_next = 0;
10241                                   ivna.vna_other = 0;
10242                                   ivna.vna_name = 0;
10243                                   break;
10244                                 }
10245
10246                               ivn.vn_aux  = BYTE_GET (evn.vn_aux);
10247                               ivn.vn_next = BYTE_GET (evn.vn_next);
10248
10249                               vna_off = offset + ivn.vn_aux;
10250
10251                               do
10252                                 {
10253                                   Elf_External_Vernaux evna;
10254
10255                                   if (get_data (&evna, file, vna_off,
10256                                                 sizeof (evna), 1,
10257                                                 _("version need aux (3)")) == NULL)
10258                                     {
10259                                       ivna.vna_next = 0;
10260                                       ivna.vna_other = 0;
10261                                       ivna.vna_name = 0;
10262                                     }
10263                                   else
10264                                     {
10265                                       ivna.vna_other = BYTE_GET (evna.vna_other);
10266                                       ivna.vna_next  = BYTE_GET (evna.vna_next);
10267                                       ivna.vna_name  = BYTE_GET (evna.vna_name);
10268                                     }
10269
10270                                   vna_off += ivna.vna_next;
10271                                 }
10272                               while (ivna.vna_other != vers_data
10273                                      && ivna.vna_next != 0);
10274
10275                               if (ivna.vna_other == vers_data)
10276                                 break;
10277
10278                               offset += ivn.vn_next;
10279                             }
10280                           while (ivn.vn_next != 0);
10281
10282                           if (ivna.vna_other == vers_data)
10283                             {
10284                               printf ("@%s (%d)",
10285                                       ivna.vna_name < strtab_size
10286                                       ? strtab + ivna.vna_name : _("<corrupt>"),
10287                                       ivna.vna_other);
10288                               check_def = 0;
10289                             }
10290                           else if (! is_nobits)
10291                             error (_("bad dynamic symbol\n"));
10292                           else
10293                             check_def = 1;
10294                         }
10295
10296                       if (check_def)
10297                         {
10298                           if (vers_data != 0x8001
10299                               && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10300                             {
10301                               Elf_Internal_Verdef ivd;
10302                               Elf_Internal_Verdaux ivda;
10303                               Elf_External_Verdaux evda;
10304                               unsigned long off;
10305
10306                               off = offset_from_vma
10307                                 (file,
10308                                  version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10309                                  sizeof (Elf_External_Verdef));
10310
10311                               do
10312                                 {
10313                                   Elf_External_Verdef evd;
10314
10315                                   if (get_data (&evd, file, off, sizeof (evd),
10316                                                 1, _("version def")) == NULL)
10317                                     {
10318                                       ivd.vd_ndx = 0;
10319                                       ivd.vd_aux = 0;
10320                                       ivd.vd_next = 0;
10321                                     }
10322                                   else
10323                                     {
10324                                       ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
10325                                       ivd.vd_aux = BYTE_GET (evd.vd_aux);
10326                                       ivd.vd_next = BYTE_GET (evd.vd_next);
10327                                     }
10328
10329                                   off += ivd.vd_next;
10330                                 }
10331                               while (ivd.vd_ndx != (vers_data & VERSYM_VERSION)
10332                                      && ivd.vd_next != 0);
10333
10334                               off -= ivd.vd_next;
10335                               off += ivd.vd_aux;
10336
10337                               if (get_data (&evda, file, off, sizeof (evda),
10338                                             1, _("version def aux")) == NULL)
10339                                 break;
10340
10341                               ivda.vda_name = BYTE_GET (evda.vda_name);
10342
10343                               if (psym->st_name != ivda.vda_name)
10344                                 printf ((vers_data & VERSYM_HIDDEN)
10345                                         ? "@%s" : "@@%s",
10346                                         ivda.vda_name < strtab_size
10347                                         ? strtab + ivda.vda_name : _("<corrupt>"));
10348                             }
10349                         }
10350                     }
10351                 }
10352
10353               putchar ('\n');
10354             }
10355
10356           free (symtab);
10357           if (strtab != string_table)
10358             free (strtab);
10359         }
10360     }
10361   else if (do_syms)
10362     printf
10363       (_("\nDynamic symbol information is not available for displaying symbols.\n"));
10364
10365   if (do_histogram && buckets != NULL)
10366     {
10367       unsigned long * lengths;
10368       unsigned long * counts;
10369       unsigned long hn;
10370       bfd_vma si;
10371       unsigned long maxlength = 0;
10372       unsigned long nzero_counts = 0;
10373       unsigned long nsyms = 0;
10374
10375       printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
10376               (unsigned long) nbuckets);
10377
10378       lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
10379       if (lengths == NULL)
10380         {
10381           error (_("Out of memory allocating space for histogram buckets\n"));
10382           return 0;
10383         }
10384
10385       printf (_(" Length  Number     %% of total  Coverage\n"));
10386       for (hn = 0; hn < nbuckets; ++hn)
10387         {
10388           for (si = buckets[hn]; si > 0 && si < nchains; si = chains[si])
10389             {
10390               ++nsyms;
10391               if (maxlength < ++lengths[hn])
10392                 ++maxlength;
10393
10394               /* PR binutils/17531: A corrupt binary could contain broken
10395                  histogram data.  Do not go into an infinite loop trying
10396                  to process it.  */
10397               if (chains[si] == si)
10398                 {
10399                   error (_("histogram chain links to itself\n"));
10400                   break;
10401                 }
10402             }
10403         }
10404
10405       counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
10406       if (counts == NULL)
10407         {
10408           free (lengths);
10409           error (_("Out of memory allocating space for histogram counts\n"));
10410           return 0;
10411         }
10412
10413       for (hn = 0; hn < nbuckets; ++hn)
10414         ++counts[lengths[hn]];
10415
10416       if (nbuckets > 0)
10417         {
10418           unsigned long i;
10419           printf ("      0  %-10lu (%5.1f%%)\n",
10420                   counts[0], (counts[0] * 100.0) / nbuckets);
10421           for (i = 1; i <= maxlength; ++i)
10422             {
10423               nzero_counts += counts[i] * i;
10424               printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
10425                       i, counts[i], (counts[i] * 100.0) / nbuckets,
10426                       (nzero_counts * 100.0) / nsyms);
10427             }
10428         }
10429
10430       free (counts);
10431       free (lengths);
10432     }
10433
10434   if (buckets != NULL)
10435     {
10436       free (buckets);
10437       free (chains);
10438     }
10439
10440   if (do_histogram && gnubuckets != NULL)
10441     {
10442       unsigned long * lengths;
10443       unsigned long * counts;
10444       unsigned long hn;
10445       unsigned long maxlength = 0;
10446       unsigned long nzero_counts = 0;
10447       unsigned long nsyms = 0;
10448
10449       printf (_("\nHistogram for `.gnu.hash' bucket list length (total of %lu buckets):\n"),
10450               (unsigned long) ngnubuckets);
10451
10452       lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
10453       if (lengths == NULL)
10454         {
10455           error (_("Out of memory allocating space for gnu histogram buckets\n"));
10456           return 0;
10457         }
10458
10459       printf (_(" Length  Number     %% of total  Coverage\n"));
10460
10461       for (hn = 0; hn < ngnubuckets; ++hn)
10462         if (gnubuckets[hn] != 0)
10463           {
10464             bfd_vma off, length = 1;
10465
10466             for (off = gnubuckets[hn] - gnusymidx;
10467                  /* PR 17531 file: 010-77222-0.004.  */
10468                  off < ngnuchains && (gnuchains[off] & 1) == 0;
10469                  ++off)
10470               ++length;
10471             lengths[hn] = length;
10472             if (length > maxlength)
10473               maxlength = length;
10474             nsyms += length;
10475           }
10476
10477       counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
10478       if (counts == NULL)
10479         {
10480           free (lengths);
10481           error (_("Out of memory allocating space for gnu histogram counts\n"));
10482           return 0;
10483         }
10484
10485       for (hn = 0; hn < ngnubuckets; ++hn)
10486         ++counts[lengths[hn]];
10487
10488       if (ngnubuckets > 0)
10489         {
10490           unsigned long j;
10491           printf ("      0  %-10lu (%5.1f%%)\n",
10492                   counts[0], (counts[0] * 100.0) / ngnubuckets);
10493           for (j = 1; j <= maxlength; ++j)
10494             {
10495               nzero_counts += counts[j] * j;
10496               printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
10497                       j, counts[j], (counts[j] * 100.0) / ngnubuckets,
10498                       (nzero_counts * 100.0) / nsyms);
10499             }
10500         }
10501
10502       free (counts);
10503       free (lengths);
10504       free (gnubuckets);
10505       free (gnuchains);
10506     }
10507
10508   return 1;
10509 }
10510
10511 static int
10512 process_syminfo (FILE * file ATTRIBUTE_UNUSED)
10513 {
10514   unsigned int i;
10515
10516   if (dynamic_syminfo == NULL
10517       || !do_dynamic)
10518     /* No syminfo, this is ok.  */
10519     return 1;
10520
10521   /* There better should be a dynamic symbol section.  */
10522   if (dynamic_symbols == NULL || dynamic_strings == NULL)
10523     return 0;
10524
10525   if (dynamic_addr)
10526     printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
10527             dynamic_syminfo_offset, dynamic_syminfo_nent);
10528
10529   printf (_(" Num: Name                           BoundTo     Flags\n"));
10530   for (i = 0; i < dynamic_syminfo_nent; ++i)
10531     {
10532       unsigned short int flags = dynamic_syminfo[i].si_flags;
10533
10534       printf ("%4d: ", i);
10535       if (i >= num_dynamic_syms)
10536         printf (_("<corrupt index>"));
10537       else if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
10538         print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
10539       else
10540         printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
10541       putchar (' ');
10542
10543       switch (dynamic_syminfo[i].si_boundto)
10544         {
10545         case SYMINFO_BT_SELF:
10546           fputs ("SELF       ", stdout);
10547           break;
10548         case SYMINFO_BT_PARENT:
10549           fputs ("PARENT     ", stdout);
10550           break;
10551         default:
10552           if (dynamic_syminfo[i].si_boundto > 0
10553               && dynamic_syminfo[i].si_boundto < dynamic_nent
10554               && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
10555             {
10556               print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
10557               putchar (' ' );
10558             }
10559           else
10560             printf ("%-10d ", dynamic_syminfo[i].si_boundto);
10561           break;
10562         }
10563
10564       if (flags & SYMINFO_FLG_DIRECT)
10565         printf (" DIRECT");
10566       if (flags & SYMINFO_FLG_PASSTHRU)
10567         printf (" PASSTHRU");
10568       if (flags & SYMINFO_FLG_COPY)
10569         printf (" COPY");
10570       if (flags & SYMINFO_FLG_LAZYLOAD)
10571         printf (" LAZYLOAD");
10572
10573       puts ("");
10574     }
10575
10576   return 1;
10577 }
10578
10579 /* Check to see if the given reloc needs to be handled in a target specific
10580    manner.  If so then process the reloc and return TRUE otherwise return
10581    FALSE.  */
10582
10583 static bfd_boolean
10584 target_specific_reloc_handling (Elf_Internal_Rela * reloc,
10585                                 unsigned char *     start,
10586                                 Elf_Internal_Sym *  symtab)
10587 {
10588   unsigned int reloc_type = get_reloc_type (reloc->r_info);
10589
10590   switch (elf_header.e_machine)
10591     {
10592     case EM_MSP430:
10593     case EM_MSP430_OLD:
10594       {
10595         static Elf_Internal_Sym * saved_sym = NULL;
10596
10597         switch (reloc_type)
10598           {
10599           case 10: /* R_MSP430_SYM_DIFF */
10600             if (uses_msp430x_relocs ())
10601               break;
10602           case 21: /* R_MSP430X_SYM_DIFF */
10603             saved_sym = symtab + get_reloc_symindex (reloc->r_info);
10604             return TRUE;
10605
10606           case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
10607           case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
10608             goto handle_sym_diff;
10609
10610           case 5: /* R_MSP430_16_BYTE */
10611           case 9: /* R_MSP430_8 */
10612             if (uses_msp430x_relocs ())
10613               break;
10614             goto handle_sym_diff;
10615
10616           case 2: /* R_MSP430_ABS16 */
10617           case 15: /* R_MSP430X_ABS16 */
10618             if (! uses_msp430x_relocs ())
10619               break;
10620             goto handle_sym_diff;
10621
10622           handle_sym_diff:
10623             if (saved_sym != NULL)
10624               {
10625                 bfd_vma value;
10626
10627                 value = reloc->r_addend
10628                   + (symtab[get_reloc_symindex (reloc->r_info)].st_value
10629                      - saved_sym->st_value);
10630
10631                 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
10632
10633                 saved_sym = NULL;
10634                 return TRUE;
10635               }
10636             break;
10637
10638           default:
10639             if (saved_sym != NULL)
10640               error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc\n"));
10641             break;
10642           }
10643         break;
10644       }
10645
10646     case EM_MN10300:
10647     case EM_CYGNUS_MN10300:
10648       {
10649         static Elf_Internal_Sym * saved_sym = NULL;
10650
10651         switch (reloc_type)
10652           {
10653           case 34: /* R_MN10300_ALIGN */
10654             return TRUE;
10655           case 33: /* R_MN10300_SYM_DIFF */
10656             saved_sym = symtab + get_reloc_symindex (reloc->r_info);
10657             return TRUE;
10658           case 1: /* R_MN10300_32 */
10659           case 2: /* R_MN10300_16 */
10660             if (saved_sym != NULL)
10661               {
10662                 bfd_vma value;
10663
10664                 value = reloc->r_addend
10665                   + (symtab[get_reloc_symindex (reloc->r_info)].st_value
10666                      - saved_sym->st_value);
10667
10668                 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
10669
10670                 saved_sym = NULL;
10671                 return TRUE;
10672               }
10673             break;
10674           default:
10675             if (saved_sym != NULL)
10676               error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc\n"));
10677             break;
10678           }
10679         break;
10680       }
10681     }
10682
10683   return FALSE;
10684 }
10685
10686 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
10687    DWARF debug sections.  This is a target specific test.  Note - we do not
10688    go through the whole including-target-headers-multiple-times route, (as
10689    we have already done with <elf/h8.h>) because this would become very
10690    messy and even then this function would have to contain target specific
10691    information (the names of the relocs instead of their numeric values).
10692    FIXME: This is not the correct way to solve this problem.  The proper way
10693    is to have target specific reloc sizing and typing functions created by
10694    the reloc-macros.h header, in the same way that it already creates the
10695    reloc naming functions.  */
10696
10697 static bfd_boolean
10698 is_32bit_abs_reloc (unsigned int reloc_type)
10699 {
10700   switch (elf_header.e_machine)
10701     {
10702     case EM_386:
10703     case EM_486:
10704       return reloc_type == 1; /* R_386_32.  */
10705     case EM_68K:
10706       return reloc_type == 1; /* R_68K_32.  */
10707     case EM_860:
10708       return reloc_type == 1; /* R_860_32.  */
10709     case EM_960:
10710       return reloc_type == 2; /* R_960_32.  */
10711     case EM_AARCH64:
10712       return reloc_type == 258; /* R_AARCH64_ABS32 */
10713     case EM_ALPHA:
10714       return reloc_type == 1; /* R_ALPHA_REFLONG.  */
10715     case EM_ARC:
10716       return reloc_type == 1; /* R_ARC_32.  */
10717     case EM_ARM:
10718       return reloc_type == 2; /* R_ARM_ABS32 */
10719     case EM_AVR_OLD:
10720     case EM_AVR:
10721       return reloc_type == 1;
10722     case EM_ADAPTEVA_EPIPHANY:
10723       return reloc_type == 3;
10724     case EM_BLACKFIN:
10725       return reloc_type == 0x12; /* R_byte4_data.  */
10726     case EM_CRIS:
10727       return reloc_type == 3; /* R_CRIS_32.  */
10728     case EM_CR16:
10729       return reloc_type == 3; /* R_CR16_NUM32.  */
10730     case EM_CRX:
10731       return reloc_type == 15; /* R_CRX_NUM32.  */
10732     case EM_CYGNUS_FRV:
10733       return reloc_type == 1;
10734     case EM_CYGNUS_D10V:
10735     case EM_D10V:
10736       return reloc_type == 6; /* R_D10V_32.  */
10737     case EM_CYGNUS_D30V:
10738     case EM_D30V:
10739       return reloc_type == 12; /* R_D30V_32_NORMAL.  */
10740     case EM_DLX:
10741       return reloc_type == 3; /* R_DLX_RELOC_32.  */
10742     case EM_CYGNUS_FR30:
10743     case EM_FR30:
10744       return reloc_type == 3; /* R_FR30_32.  */
10745     case EM_H8S:
10746     case EM_H8_300:
10747     case EM_H8_300H:
10748       return reloc_type == 1; /* R_H8_DIR32.  */
10749     case EM_IA_64:
10750       return reloc_type == 0x65; /* R_IA64_SECREL32LSB.  */
10751     case EM_IP2K_OLD:
10752     case EM_IP2K:
10753       return reloc_type == 2; /* R_IP2K_32.  */
10754     case EM_IQ2000:
10755       return reloc_type == 2; /* R_IQ2000_32.  */
10756     case EM_LATTICEMICO32:
10757       return reloc_type == 3; /* R_LM32_32.  */
10758     case EM_M32C_OLD:
10759     case EM_M32C:
10760       return reloc_type == 3; /* R_M32C_32.  */
10761     case EM_M32R:
10762       return reloc_type == 34; /* R_M32R_32_RELA.  */
10763     case EM_MCORE:
10764       return reloc_type == 1; /* R_MCORE_ADDR32.  */
10765     case EM_CYGNUS_MEP:
10766       return reloc_type == 4; /* R_MEP_32.  */
10767     case EM_METAG:
10768       return reloc_type == 2; /* R_METAG_ADDR32.  */
10769     case EM_MICROBLAZE:
10770       return reloc_type == 1; /* R_MICROBLAZE_32.  */
10771     case EM_MIPS:
10772       return reloc_type == 2; /* R_MIPS_32.  */
10773     case EM_MMIX:
10774       return reloc_type == 4; /* R_MMIX_32.  */
10775     case EM_CYGNUS_MN10200:
10776     case EM_MN10200:
10777       return reloc_type == 1; /* R_MN10200_32.  */
10778     case EM_CYGNUS_MN10300:
10779     case EM_MN10300:
10780       return reloc_type == 1; /* R_MN10300_32.  */
10781     case EM_MOXIE:
10782       return reloc_type == 1; /* R_MOXIE_32.  */
10783     case EM_MSP430_OLD:
10784     case EM_MSP430:
10785       return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32.  */
10786     case EM_MT:
10787       return reloc_type == 2; /* R_MT_32.  */
10788     case EM_NDS32:
10789       return reloc_type == 20; /* R_NDS32_RELA.  */
10790     case EM_ALTERA_NIOS2:
10791       return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32.  */
10792     case EM_NIOS32:
10793       return reloc_type == 1; /* R_NIOS_32.  */
10794     case EM_OR1K:
10795       return reloc_type == 1; /* R_OR1K_32.  */
10796     case EM_PARISC:
10797       return (reloc_type == 1 /* R_PARISC_DIR32.  */
10798               || reloc_type == 41); /* R_PARISC_SECREL32.  */
10799     case EM_PJ:
10800     case EM_PJ_OLD:
10801       return reloc_type == 1; /* R_PJ_DATA_DIR32.  */
10802     case EM_PPC64:
10803       return reloc_type == 1; /* R_PPC64_ADDR32.  */
10804     case EM_PPC:
10805       return reloc_type == 1; /* R_PPC_ADDR32.  */
10806     case EM_RL78:
10807       return reloc_type == 1; /* R_RL78_DIR32.  */
10808     case EM_RX:
10809       return reloc_type == 1; /* R_RX_DIR32.  */
10810     case EM_S370:
10811       return reloc_type == 1; /* R_I370_ADDR31.  */
10812     case EM_S390_OLD:
10813     case EM_S390:
10814       return reloc_type == 4; /* R_S390_32.  */
10815     case EM_SCORE:
10816       return reloc_type == 8; /* R_SCORE_ABS32.  */
10817     case EM_SH:
10818       return reloc_type == 1; /* R_SH_DIR32.  */
10819     case EM_SPARC32PLUS:
10820     case EM_SPARCV9:
10821     case EM_SPARC:
10822       return reloc_type == 3 /* R_SPARC_32.  */
10823         || reloc_type == 23; /* R_SPARC_UA32.  */
10824     case EM_SPU:
10825       return reloc_type == 6; /* R_SPU_ADDR32 */
10826     case EM_TI_C6000:
10827       return reloc_type == 1; /* R_C6000_ABS32.  */
10828     case EM_TILEGX:
10829       return reloc_type == 2; /* R_TILEGX_32.  */
10830     case EM_TILEPRO:
10831       return reloc_type == 1; /* R_TILEPRO_32.  */
10832     case EM_CYGNUS_V850:
10833     case EM_V850:
10834       return reloc_type == 6; /* R_V850_ABS32.  */
10835     case EM_V800:
10836       return reloc_type == 0x33; /* R_V810_WORD.  */
10837     case EM_VAX:
10838       return reloc_type == 1; /* R_VAX_32.  */
10839     case EM_X86_64:
10840     case EM_L1OM:
10841     case EM_K1OM:
10842       return reloc_type == 10; /* R_X86_64_32.  */
10843     case EM_XC16X:
10844     case EM_C166:
10845       return reloc_type == 3; /* R_XC16C_ABS_32.  */
10846     case EM_XGATE:
10847       return reloc_type == 4; /* R_XGATE_32.  */
10848     case EM_XSTORMY16:
10849       return reloc_type == 1; /* R_XSTROMY16_32.  */
10850     case EM_XTENSA_OLD:
10851     case EM_XTENSA:
10852       return reloc_type == 1; /* R_XTENSA_32.  */
10853     default:
10854       error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
10855              elf_header.e_machine);
10856       abort ();
10857     }
10858 }
10859
10860 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
10861    a 32-bit pc-relative RELA relocation used in DWARF debug sections.  */
10862
10863 static bfd_boolean
10864 is_32bit_pcrel_reloc (unsigned int reloc_type)
10865 {
10866   switch (elf_header.e_machine)
10867     {
10868     case EM_386:
10869     case EM_486:
10870       return reloc_type == 2;  /* R_386_PC32.  */
10871     case EM_68K:
10872       return reloc_type == 4;  /* R_68K_PC32.  */
10873     case EM_AARCH64:
10874       return reloc_type == 261; /* R_AARCH64_PREL32 */
10875     case EM_ADAPTEVA_EPIPHANY:
10876       return reloc_type == 6;
10877     case EM_ALPHA:
10878       return reloc_type == 10; /* R_ALPHA_SREL32.  */
10879     case EM_ARM:
10880       return reloc_type == 3;  /* R_ARM_REL32 */
10881     case EM_MICROBLAZE:
10882       return reloc_type == 2;  /* R_MICROBLAZE_32_PCREL.  */
10883     case EM_OR1K:
10884       return reloc_type == 9; /* R_OR1K_32_PCREL.  */
10885     case EM_PARISC:
10886       return reloc_type == 9;  /* R_PARISC_PCREL32.  */
10887     case EM_PPC:
10888       return reloc_type == 26; /* R_PPC_REL32.  */
10889     case EM_PPC64:
10890       return reloc_type == 26; /* R_PPC64_REL32.  */
10891     case EM_S390_OLD:
10892     case EM_S390:
10893       return reloc_type == 5;  /* R_390_PC32.  */
10894     case EM_SH:
10895       return reloc_type == 2;  /* R_SH_REL32.  */
10896     case EM_SPARC32PLUS:
10897     case EM_SPARCV9:
10898     case EM_SPARC:
10899       return reloc_type == 6;  /* R_SPARC_DISP32.  */
10900     case EM_SPU:
10901       return reloc_type == 13; /* R_SPU_REL32.  */
10902     case EM_TILEGX:
10903       return reloc_type == 6; /* R_TILEGX_32_PCREL.  */
10904     case EM_TILEPRO:
10905       return reloc_type == 4; /* R_TILEPRO_32_PCREL.  */
10906     case EM_X86_64:
10907     case EM_L1OM:
10908     case EM_K1OM:
10909       return reloc_type == 2;  /* R_X86_64_PC32.  */
10910     case EM_XTENSA_OLD:
10911     case EM_XTENSA:
10912       return reloc_type == 14; /* R_XTENSA_32_PCREL.  */
10913     default:
10914       /* Do not abort or issue an error message here.  Not all targets use
10915          pc-relative 32-bit relocs in their DWARF debug information and we
10916          have already tested for target coverage in is_32bit_abs_reloc.  A
10917          more helpful warning message will be generated by apply_relocations
10918          anyway, so just return.  */
10919       return FALSE;
10920     }
10921 }
10922
10923 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
10924    a 64-bit absolute RELA relocation used in DWARF debug sections.  */
10925
10926 static bfd_boolean
10927 is_64bit_abs_reloc (unsigned int reloc_type)
10928 {
10929   switch (elf_header.e_machine)
10930     {
10931     case EM_AARCH64:
10932       return reloc_type == 257; /* R_AARCH64_ABS64.  */
10933     case EM_ALPHA:
10934       return reloc_type == 2; /* R_ALPHA_REFQUAD.  */
10935     case EM_IA_64:
10936       return reloc_type == 0x27; /* R_IA64_DIR64LSB.  */
10937     case EM_PARISC:
10938       return reloc_type == 80; /* R_PARISC_DIR64.  */
10939     case EM_PPC64:
10940       return reloc_type == 38; /* R_PPC64_ADDR64.  */
10941     case EM_SPARC32PLUS:
10942     case EM_SPARCV9:
10943     case EM_SPARC:
10944       return reloc_type == 54; /* R_SPARC_UA64.  */
10945     case EM_X86_64:
10946     case EM_L1OM:
10947     case EM_K1OM:
10948       return reloc_type == 1; /* R_X86_64_64.  */
10949     case EM_S390_OLD:
10950     case EM_S390:
10951       return reloc_type == 22;  /* R_S390_64.  */
10952     case EM_TILEGX:
10953       return reloc_type == 1; /* R_TILEGX_64.  */
10954     case EM_MIPS:
10955       return reloc_type == 18;  /* R_MIPS_64.  */
10956     default:
10957       return FALSE;
10958     }
10959 }
10960
10961 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
10962    a 64-bit pc-relative RELA relocation used in DWARF debug sections.  */
10963
10964 static bfd_boolean
10965 is_64bit_pcrel_reloc (unsigned int reloc_type)
10966 {
10967   switch (elf_header.e_machine)
10968     {
10969     case EM_AARCH64:
10970       return reloc_type == 260; /* R_AARCH64_PREL64.  */
10971     case EM_ALPHA:
10972       return reloc_type == 11; /* R_ALPHA_SREL64.  */
10973     case EM_IA_64:
10974       return reloc_type == 0x4f; /* R_IA64_PCREL64LSB.  */
10975     case EM_PARISC:
10976       return reloc_type == 72; /* R_PARISC_PCREL64.  */
10977     case EM_PPC64:
10978       return reloc_type == 44; /* R_PPC64_REL64.  */
10979     case EM_SPARC32PLUS:
10980     case EM_SPARCV9:
10981     case EM_SPARC:
10982       return reloc_type == 46; /* R_SPARC_DISP64.  */
10983     case EM_X86_64:
10984     case EM_L1OM:
10985     case EM_K1OM:
10986       return reloc_type == 24; /* R_X86_64_PC64.  */
10987     case EM_S390_OLD:
10988     case EM_S390:
10989       return reloc_type == 23;  /* R_S390_PC64.  */
10990     case EM_TILEGX:
10991       return reloc_type == 5;  /* R_TILEGX_64_PCREL.  */
10992     default:
10993       return FALSE;
10994     }
10995 }
10996
10997 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
10998    a 24-bit absolute RELA relocation used in DWARF debug sections.  */
10999
11000 static bfd_boolean
11001 is_24bit_abs_reloc (unsigned int reloc_type)
11002 {
11003   switch (elf_header.e_machine)
11004     {
11005     case EM_CYGNUS_MN10200:
11006     case EM_MN10200:
11007       return reloc_type == 4; /* R_MN10200_24.  */
11008     default:
11009       return FALSE;
11010     }
11011 }
11012
11013 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11014    a 16-bit absolute RELA relocation used in DWARF debug sections.  */
11015
11016 static bfd_boolean
11017 is_16bit_abs_reloc (unsigned int reloc_type)
11018 {
11019   switch (elf_header.e_machine)
11020     {
11021     case EM_AVR_OLD:
11022     case EM_AVR:
11023       return reloc_type == 4; /* R_AVR_16.  */
11024     case EM_ADAPTEVA_EPIPHANY:
11025       return reloc_type == 5;
11026     case EM_CYGNUS_D10V:
11027     case EM_D10V:
11028       return reloc_type == 3; /* R_D10V_16.  */
11029     case EM_H8S:
11030     case EM_H8_300:
11031     case EM_H8_300H:
11032       return reloc_type == R_H8_DIR16;
11033     case EM_IP2K_OLD:
11034     case EM_IP2K:
11035       return reloc_type == 1; /* R_IP2K_16.  */
11036     case EM_M32C_OLD:
11037     case EM_M32C:
11038       return reloc_type == 1; /* R_M32C_16 */
11039     case EM_MSP430:
11040       if (uses_msp430x_relocs ())
11041         return reloc_type == 2; /* R_MSP430_ABS16.  */
11042     case EM_MSP430_OLD:
11043       return reloc_type == 5; /* R_MSP430_16_BYTE.  */
11044     case EM_NDS32:
11045       return reloc_type == 19; /* R_NDS32_RELA.  */
11046     case EM_ALTERA_NIOS2:
11047       return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16.  */
11048     case EM_NIOS32:
11049       return reloc_type == 9; /* R_NIOS_16.  */
11050     case EM_OR1K:
11051       return reloc_type == 2; /* R_OR1K_16.  */
11052     case EM_TI_C6000:
11053       return reloc_type == 2; /* R_C6000_ABS16.  */
11054     case EM_XC16X:
11055     case EM_C166:
11056       return reloc_type == 2; /* R_XC16C_ABS_16.  */
11057     case EM_CYGNUS_MN10200:
11058     case EM_MN10200:
11059       return reloc_type == 2; /* R_MN10200_16.  */
11060     case EM_CYGNUS_MN10300:
11061     case EM_MN10300:
11062       return reloc_type == 2; /* R_MN10300_16.  */
11063     case EM_XGATE:
11064       return reloc_type == 3; /* R_XGATE_16.  */
11065     default:
11066       return FALSE;
11067     }
11068 }
11069
11070 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
11071    relocation entries (possibly formerly used for SHT_GROUP sections).  */
11072
11073 static bfd_boolean
11074 is_none_reloc (unsigned int reloc_type)
11075 {
11076   switch (elf_header.e_machine)
11077     {
11078     case EM_68K:     /* R_68K_NONE.  */
11079     case EM_386:     /* R_386_NONE.  */
11080     case EM_SPARC32PLUS:
11081     case EM_SPARCV9:
11082     case EM_SPARC:   /* R_SPARC_NONE.  */
11083     case EM_MIPS:    /* R_MIPS_NONE.  */
11084     case EM_PARISC:  /* R_PARISC_NONE.  */
11085     case EM_ALPHA:   /* R_ALPHA_NONE.  */
11086     case EM_ADAPTEVA_EPIPHANY:
11087     case EM_PPC:     /* R_PPC_NONE.  */
11088     case EM_PPC64:   /* R_PPC64_NONE.  */
11089     case EM_ARM:     /* R_ARM_NONE.  */
11090     case EM_IA_64:   /* R_IA64_NONE.  */
11091     case EM_SH:      /* R_SH_NONE.  */
11092     case EM_S390_OLD:
11093     case EM_S390:    /* R_390_NONE.  */
11094     case EM_CRIS:    /* R_CRIS_NONE.  */
11095     case EM_X86_64:  /* R_X86_64_NONE.  */
11096     case EM_L1OM:    /* R_X86_64_NONE.  */
11097     case EM_K1OM:    /* R_X86_64_NONE.  */
11098     case EM_MN10300: /* R_MN10300_NONE.  */
11099     case EM_MOXIE:   /* R_MOXIE_NONE.  */
11100     case EM_M32R:    /* R_M32R_NONE.  */
11101     case EM_TI_C6000:/* R_C6000_NONE.  */
11102     case EM_TILEGX:  /* R_TILEGX_NONE.  */
11103     case EM_TILEPRO: /* R_TILEPRO_NONE.  */
11104     case EM_XC16X:
11105     case EM_C166:    /* R_XC16X_NONE.  */
11106     case EM_ALTERA_NIOS2: /* R_NIOS2_NONE.  */
11107     case EM_NIOS32:  /* R_NIOS_NONE.  */
11108     case EM_OR1K:    /* R_OR1K_NONE. */
11109       return reloc_type == 0;
11110     case EM_AARCH64:
11111       return reloc_type == 0 || reloc_type == 256;
11112     case EM_NDS32:
11113       return (reloc_type == 0       /* R_XTENSA_NONE.  */
11114               || reloc_type == 204  /* R_NDS32_DIFF8.  */
11115               || reloc_type == 205  /* R_NDS32_DIFF16.  */
11116               || reloc_type == 206  /* R_NDS32_DIFF32.  */
11117               || reloc_type == 207  /* R_NDS32_ULEB128.  */);
11118     case EM_XTENSA_OLD:
11119     case EM_XTENSA:
11120       return (reloc_type == 0      /* R_XTENSA_NONE.  */
11121               || reloc_type == 17  /* R_XTENSA_DIFF8.  */
11122               || reloc_type == 18  /* R_XTENSA_DIFF16.  */
11123               || reloc_type == 19  /* R_XTENSA_DIFF32.  */);
11124     case EM_METAG:
11125       return reloc_type == 3; /* R_METAG_NONE.  */
11126     }
11127   return FALSE;
11128 }
11129
11130 /* Apply relocations to a section.
11131    Note: So far support has been added only for those relocations
11132    which can be found in debug sections.
11133    FIXME: Add support for more relocations ?  */
11134
11135 static void
11136 apply_relocations (void * file,
11137                    Elf_Internal_Shdr * section,
11138                    unsigned char * start)
11139 {
11140   Elf_Internal_Shdr * relsec;
11141   unsigned char * end = start + section->sh_size;
11142
11143   if (elf_header.e_type != ET_REL)
11144     return;
11145
11146   /* Find the reloc section associated with the section.  */
11147   for (relsec = section_headers;
11148        relsec < section_headers + elf_header.e_shnum;
11149        ++relsec)
11150     {
11151       bfd_boolean is_rela;
11152       unsigned long num_relocs;
11153       Elf_Internal_Rela * relocs;
11154       Elf_Internal_Rela * rp;
11155       Elf_Internal_Shdr * symsec;
11156       Elf_Internal_Sym * symtab;
11157       unsigned long num_syms;
11158       Elf_Internal_Sym * sym;
11159
11160       if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
11161           || relsec->sh_info >= elf_header.e_shnum
11162           || section_headers + relsec->sh_info != section
11163           || relsec->sh_size == 0
11164           || relsec->sh_link >= elf_header.e_shnum)
11165         continue;
11166
11167       is_rela = relsec->sh_type == SHT_RELA;
11168
11169       if (is_rela)
11170         {
11171           if (!slurp_rela_relocs ((FILE *) file, relsec->sh_offset,
11172                                   relsec->sh_size, & relocs, & num_relocs))
11173             return;
11174         }
11175       else
11176         {
11177           if (!slurp_rel_relocs ((FILE *) file, relsec->sh_offset,
11178                                  relsec->sh_size, & relocs, & num_relocs))
11179             return;
11180         }
11181
11182       /* SH uses RELA but uses in place value instead of the addend field.  */
11183       if (elf_header.e_machine == EM_SH)
11184         is_rela = FALSE;
11185
11186       symsec = section_headers + relsec->sh_link;
11187       symtab = GET_ELF_SYMBOLS ((FILE *) file, symsec, & num_syms);
11188
11189       for (rp = relocs; rp < relocs + num_relocs; ++rp)
11190         {
11191           bfd_vma         addend;
11192           unsigned int    reloc_type;
11193           unsigned int    reloc_size;
11194           unsigned char * rloc;
11195           unsigned long   sym_index;
11196
11197           reloc_type = get_reloc_type (rp->r_info);
11198
11199           if (target_specific_reloc_handling (rp, start, symtab))
11200             continue;
11201           else if (is_none_reloc (reloc_type))
11202             continue;
11203           else if (is_32bit_abs_reloc (reloc_type)
11204                    || is_32bit_pcrel_reloc (reloc_type))
11205             reloc_size = 4;
11206           else if (is_64bit_abs_reloc (reloc_type)
11207                    || is_64bit_pcrel_reloc (reloc_type))
11208             reloc_size = 8;
11209           else if (is_24bit_abs_reloc (reloc_type))
11210             reloc_size = 3;
11211           else if (is_16bit_abs_reloc (reloc_type))
11212             reloc_size = 2;
11213           else
11214             {
11215               warn (_("unable to apply unsupported reloc type %d to section %s\n"),
11216                     reloc_type, printable_section_name (section));
11217               continue;
11218             }
11219
11220           rloc = start + rp->r_offset;
11221           if ((rloc + reloc_size) > end || (rloc < start))
11222             {
11223               warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
11224                     (unsigned long) rp->r_offset,
11225                     printable_section_name (section));
11226               continue;
11227             }
11228
11229           sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
11230           if (sym_index >= num_syms)
11231             {
11232               warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
11233                     sym_index, printable_section_name (section));
11234               continue;
11235             }
11236           sym = symtab + sym_index;
11237
11238           /* If the reloc has a symbol associated with it,
11239              make sure that it is of an appropriate type.
11240
11241              Relocations against symbols without type can happen.
11242              Gcc -feliminate-dwarf2-dups may generate symbols
11243              without type for debug info.
11244
11245              Icc generates relocations against function symbols
11246              instead of local labels.
11247
11248              Relocations against object symbols can happen, eg when
11249              referencing a global array.  For an example of this see
11250              the _clz.o binary in libgcc.a.  */
11251           if (sym != symtab
11252               && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
11253             {
11254               warn (_("skipping unexpected symbol type %s in %ld'th relocation in section %s\n"),
11255                     get_symbol_type (ELF_ST_TYPE (sym->st_info)),
11256                     (long int)(rp - relocs),
11257                     printable_section_name (relsec));
11258               continue;
11259             }
11260
11261           addend = 0;
11262           if (is_rela)
11263             addend += rp->r_addend;
11264           /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
11265              partial_inplace.  */
11266           if (!is_rela
11267               || (elf_header.e_machine == EM_XTENSA
11268                   && reloc_type == 1)
11269               || ((elf_header.e_machine == EM_PJ
11270                    || elf_header.e_machine == EM_PJ_OLD)
11271                   && reloc_type == 1)
11272               || ((elf_header.e_machine == EM_D30V
11273                    || elf_header.e_machine == EM_CYGNUS_D30V)
11274                   && reloc_type == 12))
11275             addend += byte_get (rloc, reloc_size);
11276
11277           if (is_32bit_pcrel_reloc (reloc_type)
11278               || is_64bit_pcrel_reloc (reloc_type))
11279             {
11280               /* On HPPA, all pc-relative relocations are biased by 8.  */
11281               if (elf_header.e_machine == EM_PARISC)
11282                 addend -= 8;
11283               byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
11284                         reloc_size);
11285             }
11286           else
11287             byte_put (rloc, addend + sym->st_value, reloc_size);
11288         }
11289
11290       free (symtab);
11291       free (relocs);
11292       break;
11293     }
11294 }
11295
11296 #ifdef SUPPORT_DISASSEMBLY
11297 static int
11298 disassemble_section (Elf_Internal_Shdr * section, FILE * file)
11299 {
11300   printf (_("\nAssembly dump of section %s\n"), printable_section_name (section));
11301
11302   /* FIXME: XXX -- to be done --- XXX */
11303
11304   return 1;
11305 }
11306 #endif
11307
11308 /* Reads in the contents of SECTION from FILE, returning a pointer
11309    to a malloc'ed buffer or NULL if something went wrong.  */
11310
11311 static char *
11312 get_section_contents (Elf_Internal_Shdr * section, FILE * file)
11313 {
11314   bfd_size_type num_bytes;
11315
11316   num_bytes = section->sh_size;
11317
11318   if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
11319     {
11320       printf (_("\nSection '%s' has no data to dump.\n"),
11321               printable_section_name (section));
11322       return NULL;
11323     }
11324
11325   return  (char *) get_data (NULL, file, section->sh_offset, 1, num_bytes,
11326                              _("section contents"));
11327 }
11328
11329
11330 static void
11331 dump_section_as_strings (Elf_Internal_Shdr * section, FILE * file)
11332 {
11333   Elf_Internal_Shdr * relsec;
11334   bfd_size_type num_bytes;
11335   char * data;
11336   char * end;
11337   char * start;
11338   bfd_boolean some_strings_shown;
11339
11340   start = get_section_contents (section, file);
11341   if (start == NULL)
11342     return;
11343
11344   printf (_("\nString dump of section '%s':\n"), printable_section_name (section));
11345
11346   /* If the section being dumped has relocations against it the user might
11347      be expecting these relocations to have been applied.  Check for this
11348      case and issue a warning message in order to avoid confusion.
11349      FIXME: Maybe we ought to have an option that dumps a section with
11350      relocs applied ?  */
11351   for (relsec = section_headers;
11352        relsec < section_headers + elf_header.e_shnum;
11353        ++relsec)
11354     {
11355       if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
11356           || relsec->sh_info >= elf_header.e_shnum
11357           || section_headers + relsec->sh_info != section
11358           || relsec->sh_size == 0
11359           || relsec->sh_link >= elf_header.e_shnum)
11360         continue;
11361
11362       printf (_("  Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
11363       break;
11364     }
11365
11366   num_bytes = section->sh_size;
11367   data = start;
11368   end  = start + num_bytes;
11369   some_strings_shown = FALSE;
11370
11371   while (data < end)
11372     {
11373       while (!ISPRINT (* data))
11374         if (++ data >= end)
11375           break;
11376
11377       if (data < end)
11378         {
11379           size_t maxlen = end - data;
11380
11381 #ifndef __MSVCRT__
11382           /* PR 11128: Use two separate invocations in order to work
11383              around bugs in the Solaris 8 implementation of printf.  */
11384           printf ("  [%6tx]  ", data - start);
11385 #else
11386           printf ("  [%6Ix]  ", (size_t) (data - start));
11387 #endif
11388           if (maxlen > 0)
11389             {
11390               print_symbol ((int) maxlen, data);
11391               putchar ('\n');
11392               data += strnlen (data, maxlen);
11393             }
11394           else
11395             {
11396               printf (_("<corrupt>\n"));
11397               data = end;
11398             }
11399           some_strings_shown = TRUE;
11400         }
11401     }
11402
11403   if (! some_strings_shown)
11404     printf (_("  No strings found in this section."));
11405
11406   free (start);
11407
11408   putchar ('\n');
11409 }
11410
11411 static void
11412 dump_section_as_bytes (Elf_Internal_Shdr * section,
11413                        FILE * file,
11414                        bfd_boolean relocate)
11415 {
11416   Elf_Internal_Shdr * relsec;
11417   bfd_size_type bytes;
11418   bfd_vma addr;
11419   unsigned char * data;
11420   unsigned char * start;
11421
11422   start = (unsigned char *) get_section_contents (section, file);
11423   if (start == NULL)
11424     return;
11425
11426   printf (_("\nHex dump of section '%s':\n"), printable_section_name (section));
11427
11428   if (relocate)
11429     {
11430       apply_relocations (file, section, start);
11431     }
11432   else
11433     {
11434       /* If the section being dumped has relocations against it the user might
11435          be expecting these relocations to have been applied.  Check for this
11436          case and issue a warning message in order to avoid confusion.
11437          FIXME: Maybe we ought to have an option that dumps a section with
11438          relocs applied ?  */
11439       for (relsec = section_headers;
11440            relsec < section_headers + elf_header.e_shnum;
11441            ++relsec)
11442         {
11443           if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
11444               || relsec->sh_info >= elf_header.e_shnum
11445               || section_headers + relsec->sh_info != section
11446               || relsec->sh_size == 0
11447               || relsec->sh_link >= elf_header.e_shnum)
11448             continue;
11449
11450           printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
11451           break;
11452         }
11453     }
11454
11455   addr = section->sh_addr;
11456   bytes = section->sh_size;
11457   data = start;
11458
11459   while (bytes)
11460     {
11461       int j;
11462       int k;
11463       int lbytes;
11464
11465       lbytes = (bytes > 16 ? 16 : bytes);
11466
11467       printf ("  0x%8.8lx ", (unsigned long) addr);
11468
11469       for (j = 0; j < 16; j++)
11470         {
11471           if (j < lbytes)
11472             printf ("%2.2x", data[j]);
11473           else
11474             printf ("  ");
11475
11476           if ((j & 3) == 3)
11477             printf (" ");
11478         }
11479
11480       for (j = 0; j < lbytes; j++)
11481         {
11482           k = data[j];
11483           if (k >= ' ' && k < 0x7f)
11484             printf ("%c", k);
11485           else
11486             printf (".");
11487         }
11488
11489       putchar ('\n');
11490
11491       data  += lbytes;
11492       addr  += lbytes;
11493       bytes -= lbytes;
11494     }
11495
11496   free (start);
11497
11498   putchar ('\n');
11499 }
11500
11501 /* Uncompresses a section that was compressed using zlib, in place.  */
11502
11503 static int
11504 uncompress_section_contents (unsigned char **buffer ATTRIBUTE_UNUSED,
11505                              dwarf_size_type *size ATTRIBUTE_UNUSED)
11506 {
11507 #ifndef HAVE_ZLIB_H
11508   return FALSE;
11509 #else
11510   dwarf_size_type compressed_size = *size;
11511   unsigned char * compressed_buffer = *buffer;
11512   dwarf_size_type uncompressed_size;
11513   unsigned char * uncompressed_buffer;
11514   z_stream strm;
11515   int rc;
11516   dwarf_size_type header_size = 12;
11517
11518   /* Read the zlib header.  In this case, it should be "ZLIB" followed
11519      by the uncompressed section size, 8 bytes in big-endian order.  */
11520   if (compressed_size < header_size
11521       || ! streq ((char *) compressed_buffer, "ZLIB"))
11522     return 0;
11523
11524   uncompressed_size = compressed_buffer[4]; uncompressed_size <<= 8;
11525   uncompressed_size += compressed_buffer[5]; uncompressed_size <<= 8;
11526   uncompressed_size += compressed_buffer[6]; uncompressed_size <<= 8;
11527   uncompressed_size += compressed_buffer[7]; uncompressed_size <<= 8;
11528   uncompressed_size += compressed_buffer[8]; uncompressed_size <<= 8;
11529   uncompressed_size += compressed_buffer[9]; uncompressed_size <<= 8;
11530   uncompressed_size += compressed_buffer[10]; uncompressed_size <<= 8;
11531   uncompressed_size += compressed_buffer[11];
11532
11533   /* It is possible the section consists of several compressed
11534      buffers concatenated together, so we uncompress in a loop.  */
11535   strm.zalloc = NULL;
11536   strm.zfree = NULL;
11537   strm.opaque = NULL;
11538   strm.avail_in = compressed_size - header_size;
11539   strm.next_in = (Bytef *) compressed_buffer + header_size;
11540   strm.avail_out = uncompressed_size;
11541   uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
11542
11543   rc = inflateInit (& strm);
11544   while (strm.avail_in > 0)
11545     {
11546       if (rc != Z_OK)
11547         goto fail;
11548       strm.next_out = ((Bytef *) uncompressed_buffer
11549                        + (uncompressed_size - strm.avail_out));
11550       rc = inflate (&strm, Z_FINISH);
11551       if (rc != Z_STREAM_END)
11552         goto fail;
11553       rc = inflateReset (& strm);
11554     }
11555   rc = inflateEnd (& strm);
11556   if (rc != Z_OK
11557       || strm.avail_out != 0)
11558     goto fail;
11559
11560   free (compressed_buffer);
11561   *buffer = uncompressed_buffer;
11562   *size = uncompressed_size;
11563   return 1;
11564
11565  fail:
11566   free (uncompressed_buffer);
11567   /* Indicate decompression failure.  */
11568   *buffer = NULL;
11569   return 0;
11570 #endif  /* HAVE_ZLIB_H */
11571 }
11572
11573 static int
11574 load_specific_debug_section (enum dwarf_section_display_enum debug,
11575                              Elf_Internal_Shdr * sec, void * file)
11576 {
11577   struct dwarf_section * section = &debug_displays [debug].section;
11578   char buf [64];
11579
11580   /* If it is already loaded, do nothing.  */
11581   if (section->start != NULL)
11582     return 1;
11583
11584   snprintf (buf, sizeof (buf), _("%s section data"), section->name);
11585   section->address = sec->sh_addr;
11586   section->start = (unsigned char *) get_data (NULL, (FILE *) file,
11587                                                sec->sh_offset, 1,
11588                                                sec->sh_size, buf);
11589   if (section->start == NULL)
11590     section->size = 0;
11591   else
11592     {
11593       section->size = sec->sh_size;
11594       if (uncompress_section_contents (&section->start, &section->size))
11595         sec->sh_size = section->size;
11596     }
11597
11598   if (section->start == NULL)
11599     return 0;
11600
11601   if (debug_displays [debug].relocate)
11602     apply_relocations ((FILE *) file, sec, section->start);
11603
11604   return 1;
11605 }
11606
11607 /* If this is not NULL, load_debug_section will only look for sections
11608    within the list of sections given here.  */
11609 unsigned int *section_subset = NULL;
11610
11611 int
11612 load_debug_section (enum dwarf_section_display_enum debug, void * file)
11613 {
11614   struct dwarf_section * section = &debug_displays [debug].section;
11615   Elf_Internal_Shdr * sec;
11616
11617   /* Locate the debug section.  */
11618   sec = find_section_in_set (section->uncompressed_name, section_subset);
11619   if (sec != NULL)
11620     section->name = section->uncompressed_name;
11621   else
11622     {
11623       sec = find_section_in_set (section->compressed_name, section_subset);
11624       if (sec != NULL)
11625         section->name = section->compressed_name;
11626     }
11627   if (sec == NULL)
11628     return 0;
11629
11630   /* If we're loading from a subset of sections, and we've loaded
11631      a section matching this name before, it's likely that it's a
11632      different one.  */
11633   if (section_subset != NULL)
11634     free_debug_section (debug);
11635
11636   return load_specific_debug_section (debug, sec, (FILE *) file);
11637 }
11638
11639 void
11640 free_debug_section (enum dwarf_section_display_enum debug)
11641 {
11642   struct dwarf_section * section = &debug_displays [debug].section;
11643
11644   if (section->start == NULL)
11645     return;
11646
11647   free ((char *) section->start);
11648   section->start = NULL;
11649   section->address = 0;
11650   section->size = 0;
11651 }
11652
11653 static int
11654 display_debug_section (int shndx, Elf_Internal_Shdr * section, FILE * file)
11655 {
11656   char * name = SECTION_NAME (section);
11657   const char * print_name = printable_section_name (section);
11658   bfd_size_type length;
11659   int result = 1;
11660   int i;
11661
11662   length = section->sh_size;
11663   if (length == 0)
11664     {
11665       printf (_("\nSection '%s' has no debugging data.\n"), print_name);
11666       return 0;
11667     }
11668   if (section->sh_type == SHT_NOBITS)
11669     {
11670       /* There is no point in dumping the contents of a debugging section
11671          which has the NOBITS type - the bits in the file will be random.
11672          This can happen when a file containing a .eh_frame section is
11673          stripped with the --only-keep-debug command line option.  */
11674       printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"),
11675               print_name);
11676       return 0;
11677     }
11678
11679   if (const_strneq (name, ".gnu.linkonce.wi."))
11680     name = ".debug_info";
11681
11682   /* See if we know how to display the contents of this section.  */
11683   for (i = 0; i < max; i++)
11684     if (streq (debug_displays[i].section.uncompressed_name, name)
11685         || (i == line && const_strneq (name, ".debug_line."))
11686         || streq (debug_displays[i].section.compressed_name, name))
11687       {
11688         struct dwarf_section * sec = &debug_displays [i].section;
11689         int secondary = (section != find_section (name));
11690
11691         if (secondary)
11692           free_debug_section ((enum dwarf_section_display_enum) i);
11693
11694         if (i == line && const_strneq (name, ".debug_line."))
11695           sec->name = name;
11696         else if (streq (sec->uncompressed_name, name))
11697           sec->name = sec->uncompressed_name;
11698         else
11699           sec->name = sec->compressed_name;
11700         if (load_specific_debug_section ((enum dwarf_section_display_enum) i,
11701                                          section, file))
11702           {
11703             /* If this debug section is part of a CU/TU set in a .dwp file,
11704                restrict load_debug_section to the sections in that set.  */
11705             section_subset = find_cu_tu_set (file, shndx);
11706
11707             result &= debug_displays[i].display (sec, file);
11708
11709             section_subset = NULL;
11710
11711             if (secondary || (i != info && i != abbrev))
11712               free_debug_section ((enum dwarf_section_display_enum) i);
11713           }
11714
11715         break;
11716       }
11717
11718   if (i == max)
11719     {
11720       printf (_("Unrecognized debug section: %s\n"), print_name);
11721       result = 0;
11722     }
11723
11724   return result;
11725 }
11726
11727 /* Set DUMP_SECTS for all sections where dumps were requested
11728    based on section name.  */
11729
11730 static void
11731 initialise_dumps_byname (void)
11732 {
11733   struct dump_list_entry * cur;
11734
11735   for (cur = dump_sects_byname; cur; cur = cur->next)
11736     {
11737       unsigned int i;
11738       int any;
11739
11740       for (i = 0, any = 0; i < elf_header.e_shnum; i++)
11741         if (streq (SECTION_NAME (section_headers + i), cur->name))
11742           {
11743             request_dump_bynumber (i, cur->type);
11744             any = 1;
11745           }
11746
11747       if (!any)
11748         warn (_("Section '%s' was not dumped because it does not exist!\n"),
11749               cur->name);
11750     }
11751 }
11752
11753 static void
11754 process_section_contents (FILE * file)
11755 {
11756   Elf_Internal_Shdr * section;
11757   unsigned int i;
11758
11759   if (! do_dump)
11760     return;
11761
11762   initialise_dumps_byname ();
11763
11764   for (i = 0, section = section_headers;
11765        i < elf_header.e_shnum && i < num_dump_sects;
11766        i++, section++)
11767     {
11768 #ifdef SUPPORT_DISASSEMBLY
11769       if (dump_sects[i] & DISASS_DUMP)
11770         disassemble_section (section, file);
11771 #endif
11772       if (dump_sects[i] & HEX_DUMP)
11773         dump_section_as_bytes (section, file, FALSE);
11774
11775       if (dump_sects[i] & RELOC_DUMP)
11776         dump_section_as_bytes (section, file, TRUE);
11777
11778       if (dump_sects[i] & STRING_DUMP)
11779         dump_section_as_strings (section, file);
11780
11781       if (dump_sects[i] & DEBUG_DUMP)
11782         display_debug_section (i, section, file);
11783     }
11784
11785   /* Check to see if the user requested a
11786      dump of a section that does not exist.  */
11787   while (i++ < num_dump_sects)
11788     if (dump_sects[i])
11789       warn (_("Section %d was not dumped because it does not exist!\n"), i);
11790 }
11791
11792 static void
11793 process_mips_fpe_exception (int mask)
11794 {
11795   if (mask)
11796     {
11797       int first = 1;
11798       if (mask & OEX_FPU_INEX)
11799         fputs ("INEX", stdout), first = 0;
11800       if (mask & OEX_FPU_UFLO)
11801         printf ("%sUFLO", first ? "" : "|"), first = 0;
11802       if (mask & OEX_FPU_OFLO)
11803         printf ("%sOFLO", first ? "" : "|"), first = 0;
11804       if (mask & OEX_FPU_DIV0)
11805         printf ("%sDIV0", first ? "" : "|"), first = 0;
11806       if (mask & OEX_FPU_INVAL)
11807         printf ("%sINVAL", first ? "" : "|");
11808     }
11809   else
11810     fputs ("0", stdout);
11811 }
11812
11813 /* Display's the value of TAG at location P.  If TAG is
11814    greater than 0 it is assumed to be an unknown tag, and
11815    a message is printed to this effect.  Otherwise it is
11816    assumed that a message has already been printed.
11817
11818    If the bottom bit of TAG is set it assumed to have a
11819    string value, otherwise it is assumed to have an integer
11820    value.
11821
11822    Returns an updated P pointing to the first unread byte
11823    beyond the end of TAG's value.
11824
11825    Reads at or beyond END will not be made.  */
11826
11827 static unsigned char *
11828 display_tag_value (int tag,
11829                    unsigned char * p,
11830                    const unsigned char * const end)
11831 {
11832   unsigned long val;
11833
11834   if (tag > 0)
11835     printf ("  Tag_unknown_%d: ", tag);
11836
11837   if (p >= end)
11838     {
11839       warn (_("<corrupt tag>\n"));
11840     }
11841   else if (tag & 1)
11842     {
11843       /* PR 17531 file: 027-19978-0.004.  */
11844       size_t maxlen = (end - p) - 1;
11845
11846       putchar ('"');
11847       if (maxlen > 0)
11848         {
11849           print_symbol ((int) maxlen, (const char *) p);
11850           p += strnlen ((char *) p, maxlen) + 1;
11851         }
11852       else
11853         {
11854           printf (_("<corrupt string tag>"));
11855           p = (unsigned char *) end;
11856         }
11857       printf ("\"\n");
11858     }
11859   else
11860     {
11861       unsigned int len;
11862
11863       val = read_uleb128 (p, &len, end);
11864       p += len;
11865       printf ("%ld (0x%lx)\n", val, val);
11866     }
11867
11868   assert (p <= end);
11869   return p;
11870 }
11871
11872 /* ARM EABI attributes section.  */
11873 typedef struct
11874 {
11875   unsigned int tag;
11876   const char * name;
11877   /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup.  */
11878   unsigned int type;
11879   const char ** table;
11880 } arm_attr_public_tag;
11881
11882 static const char * arm_attr_tag_CPU_arch[] =
11883   {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
11884    "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8"};
11885 static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
11886 static const char * arm_attr_tag_THUMB_ISA_use[] =
11887   {"No", "Thumb-1", "Thumb-2"};
11888 static const char * arm_attr_tag_FP_arch[] =
11889   {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
11890    "FP for ARMv8"};
11891 static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
11892 static const char * arm_attr_tag_Advanced_SIMD_arch[] =
11893   {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8"};
11894 static const char * arm_attr_tag_PCS_config[] =
11895   {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
11896    "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
11897 static const char * arm_attr_tag_ABI_PCS_R9_use[] =
11898   {"V6", "SB", "TLS", "Unused"};
11899 static const char * arm_attr_tag_ABI_PCS_RW_data[] =
11900   {"Absolute", "PC-relative", "SB-relative", "None"};
11901 static const char * arm_attr_tag_ABI_PCS_RO_data[] =
11902   {"Absolute", "PC-relative", "None"};
11903 static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
11904   {"None", "direct", "GOT-indirect"};
11905 static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
11906   {"None", "??? 1", "2", "??? 3", "4"};
11907 static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
11908 static const char * arm_attr_tag_ABI_FP_denormal[] =
11909   {"Unused", "Needed", "Sign only"};
11910 static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
11911 static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
11912 static const char * arm_attr_tag_ABI_FP_number_model[] =
11913   {"Unused", "Finite", "RTABI", "IEEE 754"};
11914 static const char * arm_attr_tag_ABI_enum_size[] =
11915   {"Unused", "small", "int", "forced to int"};
11916 static const char * arm_attr_tag_ABI_HardFP_use[] =
11917   {"As Tag_FP_arch", "SP only", "DP only", "SP and DP"};
11918 static const char * arm_attr_tag_ABI_VFP_args[] =
11919   {"AAPCS", "VFP registers", "custom"};
11920 static const char * arm_attr_tag_ABI_WMMX_args[] =
11921   {"AAPCS", "WMMX registers", "custom"};
11922 static const char * arm_attr_tag_ABI_optimization_goals[] =
11923   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
11924     "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
11925 static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
11926   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
11927     "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
11928 static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
11929 static const char * arm_attr_tag_FP_HP_extension[] =
11930   {"Not Allowed", "Allowed"};
11931 static const char * arm_attr_tag_ABI_FP_16bit_format[] =
11932   {"None", "IEEE 754", "Alternative Format"};
11933 static const char * arm_attr_tag_MPextension_use[] =
11934   {"Not Allowed", "Allowed"};
11935 static const char * arm_attr_tag_DIV_use[] =
11936   {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
11937     "Allowed in v7-A with integer division extension"};
11938 static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
11939 static const char * arm_attr_tag_Virtualization_use[] =
11940   {"Not Allowed", "TrustZone", "Virtualization Extensions",
11941     "TrustZone and Virtualization Extensions"};
11942 static const char * arm_attr_tag_MPextension_use_legacy[] =
11943   {"Not Allowed", "Allowed"};
11944
11945 #define LOOKUP(id, name) \
11946   {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
11947 static arm_attr_public_tag arm_attr_public_tags[] =
11948 {
11949   {4, "CPU_raw_name", 1, NULL},
11950   {5, "CPU_name", 1, NULL},
11951   LOOKUP(6, CPU_arch),
11952   {7, "CPU_arch_profile", 0, NULL},
11953   LOOKUP(8, ARM_ISA_use),
11954   LOOKUP(9, THUMB_ISA_use),
11955   LOOKUP(10, FP_arch),
11956   LOOKUP(11, WMMX_arch),
11957   LOOKUP(12, Advanced_SIMD_arch),
11958   LOOKUP(13, PCS_config),
11959   LOOKUP(14, ABI_PCS_R9_use),
11960   LOOKUP(15, ABI_PCS_RW_data),
11961   LOOKUP(16, ABI_PCS_RO_data),
11962   LOOKUP(17, ABI_PCS_GOT_use),
11963   LOOKUP(18, ABI_PCS_wchar_t),
11964   LOOKUP(19, ABI_FP_rounding),
11965   LOOKUP(20, ABI_FP_denormal),
11966   LOOKUP(21, ABI_FP_exceptions),
11967   LOOKUP(22, ABI_FP_user_exceptions),
11968   LOOKUP(23, ABI_FP_number_model),
11969   {24, "ABI_align_needed", 0, NULL},
11970   {25, "ABI_align_preserved", 0, NULL},
11971   LOOKUP(26, ABI_enum_size),
11972   LOOKUP(27, ABI_HardFP_use),
11973   LOOKUP(28, ABI_VFP_args),
11974   LOOKUP(29, ABI_WMMX_args),
11975   LOOKUP(30, ABI_optimization_goals),
11976   LOOKUP(31, ABI_FP_optimization_goals),
11977   {32, "compatibility", 0, NULL},
11978   LOOKUP(34, CPU_unaligned_access),
11979   LOOKUP(36, FP_HP_extension),
11980   LOOKUP(38, ABI_FP_16bit_format),
11981   LOOKUP(42, MPextension_use),
11982   LOOKUP(44, DIV_use),
11983   {64, "nodefaults", 0, NULL},
11984   {65, "also_compatible_with", 0, NULL},
11985   LOOKUP(66, T2EE_use),
11986   {67, "conformance", 1, NULL},
11987   LOOKUP(68, Virtualization_use),
11988   LOOKUP(70, MPextension_use_legacy)
11989 };
11990 #undef LOOKUP
11991
11992 static unsigned char *
11993 display_arm_attribute (unsigned char * p,
11994                        const unsigned char * const end)
11995 {
11996   unsigned int tag;
11997   unsigned int len;
11998   unsigned int val;
11999   arm_attr_public_tag * attr;
12000   unsigned i;
12001   unsigned int type;
12002
12003   tag = read_uleb128 (p, &len, end);
12004   p += len;
12005   attr = NULL;
12006   for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
12007     {
12008       if (arm_attr_public_tags[i].tag == tag)
12009         {
12010           attr = &arm_attr_public_tags[i];
12011           break;
12012         }
12013     }
12014
12015   if (attr)
12016     {
12017       printf ("  Tag_%s: ", attr->name);
12018       switch (attr->type)
12019         {
12020         case 0:
12021           switch (tag)
12022             {
12023             case 7: /* Tag_CPU_arch_profile.  */
12024               val = read_uleb128 (p, &len, end);
12025               p += len;
12026               switch (val)
12027                 {
12028                 case 0: printf (_("None\n")); break;
12029                 case 'A': printf (_("Application\n")); break;
12030                 case 'R': printf (_("Realtime\n")); break;
12031                 case 'M': printf (_("Microcontroller\n")); break;
12032                 case 'S': printf (_("Application or Realtime\n")); break;
12033                 default: printf ("??? (%d)\n", val); break;
12034                 }
12035               break;
12036
12037             case 24: /* Tag_align_needed.  */
12038               val = read_uleb128 (p, &len, end);
12039               p += len;
12040               switch (val)
12041                 {
12042                 case 0: printf (_("None\n")); break;
12043                 case 1: printf (_("8-byte\n")); break;
12044                 case 2: printf (_("4-byte\n")); break;
12045                 case 3: printf ("??? 3\n"); break;
12046                 default:
12047                   if (val <= 12)
12048                     printf (_("8-byte and up to %d-byte extended\n"),
12049                             1 << val);
12050                   else
12051                     printf ("??? (%d)\n", val);
12052                   break;
12053                 }
12054               break;
12055
12056             case 25: /* Tag_align_preserved.  */
12057               val = read_uleb128 (p, &len, end);
12058               p += len;
12059               switch (val)
12060                 {
12061                 case 0: printf (_("None\n")); break;
12062                 case 1: printf (_("8-byte, except leaf SP\n")); break;
12063                 case 2: printf (_("8-byte\n")); break;
12064                 case 3: printf ("??? 3\n"); break;
12065                 default:
12066                   if (val <= 12)
12067                     printf (_("8-byte and up to %d-byte extended\n"),
12068                             1 << val);
12069                   else
12070                     printf ("??? (%d)\n", val);
12071                   break;
12072                 }
12073               break;
12074
12075             case 32: /* Tag_compatibility.  */
12076               {
12077                 val = read_uleb128 (p, &len, end);
12078                 p += len;
12079                 printf (_("flag = %d, vendor = "), val);
12080                 if (p < end - 1)
12081                   {
12082                     size_t maxlen = (end - p) - 1;
12083
12084                     print_symbol ((int) maxlen, (const char *) p);
12085                     p += strnlen ((char *) p, maxlen) + 1;
12086                   }
12087                 else
12088                   {
12089                     printf (_("<corrupt>"));
12090                     p = (unsigned char *) end;
12091                   }
12092                 putchar ('\n');
12093               }
12094               break;
12095
12096             case 64: /* Tag_nodefaults.  */
12097               /* PR 17531: file: 001-505008-0.01.  */
12098               if (p < end)
12099                 p++;
12100               printf (_("True\n"));
12101               break;
12102
12103             case 65: /* Tag_also_compatible_with.  */
12104               val = read_uleb128 (p, &len, end);
12105               p += len;
12106               if (val == 6 /* Tag_CPU_arch.  */)
12107                 {
12108                   val = read_uleb128 (p, &len, end);
12109                   p += len;
12110                   if ((unsigned int) val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
12111                     printf ("??? (%d)\n", val);
12112                   else
12113                     printf ("%s\n", arm_attr_tag_CPU_arch[val]);
12114                 }
12115               else
12116                 printf ("???\n");
12117               while (p < end && *(p++) != '\0' /* NUL terminator.  */)
12118                 ;
12119               break;
12120
12121             default:
12122               abort ();
12123             }
12124           return p;
12125
12126         case 1:
12127           return display_tag_value (-1, p, end);
12128         case 2:
12129           return display_tag_value (0, p, end);
12130
12131         default:
12132           assert (attr->type & 0x80);
12133           val = read_uleb128 (p, &len, end);
12134           p += len;
12135           type = attr->type & 0x7f;
12136           if (val >= type)
12137             printf ("??? (%d)\n", val);
12138           else
12139             printf ("%s\n", attr->table[val]);
12140           return p;
12141         }
12142     }
12143
12144   return display_tag_value (tag, p, end);
12145 }
12146
12147 static unsigned char *
12148 display_gnu_attribute (unsigned char * p,
12149                        unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const),
12150                        const unsigned char * const end)
12151 {
12152   int tag;
12153   unsigned int len;
12154   int val;
12155
12156   tag = read_uleb128 (p, &len, end);
12157   p += len;
12158
12159   /* Tag_compatibility is the only generic GNU attribute defined at
12160      present.  */
12161   if (tag == 32)
12162     {
12163       val = read_uleb128 (p, &len, end);
12164       p += len;
12165
12166       printf (_("flag = %d, vendor = "), val);
12167       if (p == end)
12168         {
12169           printf (_("<corrupt>\n"));
12170           warn (_("corrupt vendor attribute\n"));
12171         }
12172       else
12173         {
12174           if (p < end - 1)
12175             {
12176               size_t maxlen = (end - p) - 1;
12177
12178               print_symbol ((int) maxlen, (const char *) p);
12179               p += strnlen ((char *) p, maxlen) + 1;
12180             }
12181           else
12182             {
12183               printf (_("<corrupt>"));
12184               p = (unsigned char *) end;
12185             }
12186           putchar ('\n');
12187         }
12188       return p;
12189     }
12190
12191   if ((tag & 2) == 0 && display_proc_gnu_attribute)
12192     return display_proc_gnu_attribute (p, tag, end);
12193
12194   return display_tag_value (tag, p, end);
12195 }
12196
12197 static unsigned char *
12198 display_power_gnu_attribute (unsigned char * p,
12199                              int tag,
12200                              const unsigned char * const end)
12201 {
12202   unsigned int len;
12203   int val;
12204
12205   if (tag == Tag_GNU_Power_ABI_FP)
12206     {
12207       val = read_uleb128 (p, &len, end);
12208       p += len;
12209       printf ("  Tag_GNU_Power_ABI_FP: ");
12210
12211       switch (val)
12212         {
12213         case 0:
12214           printf (_("Hard or soft float\n"));
12215           break;
12216         case 1:
12217           printf (_("Hard float\n"));
12218           break;
12219         case 2:
12220           printf (_("Soft float\n"));
12221           break;
12222         case 3:
12223           printf (_("Single-precision hard float\n"));
12224           break;
12225         default:
12226           printf ("??? (%d)\n", val);
12227           break;
12228         }
12229       return p;
12230    }
12231
12232   if (tag == Tag_GNU_Power_ABI_Vector)
12233     {
12234       val = read_uleb128 (p, &len, end);
12235       p += len;
12236       printf ("  Tag_GNU_Power_ABI_Vector: ");
12237       switch (val)
12238         {
12239         case 0:
12240           printf (_("Any\n"));
12241           break;
12242         case 1:
12243           printf (_("Generic\n"));
12244           break;
12245         case 2:
12246           printf ("AltiVec\n");
12247           break;
12248         case 3:
12249           printf ("SPE\n");
12250           break;
12251         default:
12252           printf ("??? (%d)\n", val);
12253           break;
12254         }
12255       return p;
12256    }
12257
12258   if (tag == Tag_GNU_Power_ABI_Struct_Return)
12259     {
12260       if (p == end)
12261         {
12262           warn (_("corrupt Tag_GNU_Power_ABI_Struct_Return\n"));
12263           return p;
12264         }
12265
12266       val = read_uleb128 (p, &len, end);
12267       p += len;
12268       printf ("  Tag_GNU_Power_ABI_Struct_Return: ");
12269       switch (val)
12270        {
12271        case 0:
12272          printf (_("Any\n"));
12273          break;
12274        case 1:
12275          printf ("r3/r4\n");
12276          break;
12277        case 2:
12278          printf (_("Memory\n"));
12279          break;
12280        default:
12281          printf ("??? (%d)\n", val);
12282          break;
12283        }
12284       return p;
12285     }
12286
12287   return display_tag_value (tag & 1, p, end);
12288 }
12289
12290 static void
12291 display_sparc_hwcaps (int mask)
12292 {
12293   if (mask)
12294     {
12295       int first = 1;
12296
12297       if (mask & ELF_SPARC_HWCAP_MUL32)
12298         fputs ("mul32", stdout), first = 0;
12299       if (mask & ELF_SPARC_HWCAP_DIV32)
12300         printf ("%sdiv32", first ? "" : "|"), first = 0;
12301       if (mask & ELF_SPARC_HWCAP_FSMULD)
12302         printf ("%sfsmuld", first ? "" : "|"), first = 0;
12303       if (mask & ELF_SPARC_HWCAP_V8PLUS)
12304         printf ("%sv8plus", first ? "" : "|"), first = 0;
12305       if (mask & ELF_SPARC_HWCAP_POPC)
12306         printf ("%spopc", first ? "" : "|"), first = 0;
12307       if (mask & ELF_SPARC_HWCAP_VIS)
12308         printf ("%svis", first ? "" : "|"), first = 0;
12309       if (mask & ELF_SPARC_HWCAP_VIS2)
12310         printf ("%svis2", first ? "" : "|"), first = 0;
12311       if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
12312         printf ("%sASIBlkInit", first ? "" : "|"), first = 0;
12313       if (mask & ELF_SPARC_HWCAP_FMAF)
12314         printf ("%sfmaf", first ? "" : "|"), first = 0;
12315       if (mask & ELF_SPARC_HWCAP_VIS3)
12316         printf ("%svis3", first ? "" : "|"), first = 0;
12317       if (mask & ELF_SPARC_HWCAP_HPC)
12318         printf ("%shpc", first ? "" : "|"), first = 0;
12319       if (mask & ELF_SPARC_HWCAP_RANDOM)
12320         printf ("%srandom", first ? "" : "|"), first = 0;
12321       if (mask & ELF_SPARC_HWCAP_TRANS)
12322         printf ("%strans", first ? "" : "|"), first = 0;
12323       if (mask & ELF_SPARC_HWCAP_FJFMAU)
12324         printf ("%sfjfmau", first ? "" : "|"), first = 0;
12325       if (mask & ELF_SPARC_HWCAP_IMA)
12326         printf ("%sima", first ? "" : "|"), first = 0;
12327       if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
12328         printf ("%scspare", first ? "" : "|"), first = 0;
12329     }
12330   else
12331     fputc ('0', stdout);
12332   fputc ('\n', stdout);
12333 }
12334
12335 static void
12336 display_sparc_hwcaps2 (int mask)
12337 {
12338   if (mask)
12339     {
12340       int first = 1;
12341
12342       if (mask & ELF_SPARC_HWCAP2_FJATHPLUS)
12343         fputs ("fjathplus", stdout), first = 0;
12344       if (mask & ELF_SPARC_HWCAP2_VIS3B)
12345         printf ("%svis3b", first ? "" : "|"), first = 0;
12346       if (mask & ELF_SPARC_HWCAP2_ADP)
12347         printf ("%sadp", first ? "" : "|"), first = 0;
12348       if (mask & ELF_SPARC_HWCAP2_SPARC5)
12349         printf ("%ssparc5", first ? "" : "|"), first = 0;
12350       if (mask & ELF_SPARC_HWCAP2_MWAIT)
12351         printf ("%smwait", first ? "" : "|"), first = 0;
12352       if (mask & ELF_SPARC_HWCAP2_XMPMUL)
12353         printf ("%sxmpmul", first ? "" : "|"), first = 0;
12354       if (mask & ELF_SPARC_HWCAP2_XMONT)
12355         printf ("%sxmont2", first ? "" : "|"), first = 0;
12356       if (mask & ELF_SPARC_HWCAP2_NSEC)
12357         printf ("%snsec", first ? "" : "|"), first = 0;
12358       if (mask & ELF_SPARC_HWCAP2_FJATHHPC)
12359         printf ("%sfjathhpc", first ? "" : "|"), first = 0;
12360       if (mask & ELF_SPARC_HWCAP2_FJDES)
12361         printf ("%sfjdes", first ? "" : "|"), first = 0;
12362       if (mask & ELF_SPARC_HWCAP2_FJAES)
12363         printf ("%sfjaes", first ? "" : "|"), first = 0;
12364     }
12365   else
12366     fputc ('0', stdout);
12367   fputc ('\n', stdout);
12368 }
12369
12370 static unsigned char *
12371 display_sparc_gnu_attribute (unsigned char * p,
12372                              int tag,
12373                              const unsigned char * const end)
12374 {
12375   unsigned int len;
12376   int val;
12377
12378   if (tag == Tag_GNU_Sparc_HWCAPS)
12379     {
12380       val = read_uleb128 (p, &len, end);
12381       p += len;
12382       printf ("  Tag_GNU_Sparc_HWCAPS: ");
12383       display_sparc_hwcaps (val);
12384       return p;
12385     }
12386   if (tag == Tag_GNU_Sparc_HWCAPS2)
12387     {
12388       val = read_uleb128 (p, &len, end);
12389       p += len;
12390       printf ("  Tag_GNU_Sparc_HWCAPS2: ");
12391       display_sparc_hwcaps2 (val);
12392       return p;
12393     }
12394
12395   return display_tag_value (tag, p, end);
12396 }
12397
12398 static void
12399 print_mips_fp_abi_value (int val)
12400 {
12401   switch (val)
12402     {
12403     case Val_GNU_MIPS_ABI_FP_ANY:
12404       printf (_("Hard or soft float\n"));
12405       break;
12406     case Val_GNU_MIPS_ABI_FP_DOUBLE:
12407       printf (_("Hard float (double precision)\n"));
12408       break;
12409     case Val_GNU_MIPS_ABI_FP_SINGLE:
12410       printf (_("Hard float (single precision)\n"));
12411       break;
12412     case Val_GNU_MIPS_ABI_FP_SOFT:
12413       printf (_("Soft float\n"));
12414       break;
12415     case Val_GNU_MIPS_ABI_FP_OLD_64:
12416       printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
12417       break;
12418     case Val_GNU_MIPS_ABI_FP_XX:
12419       printf (_("Hard float (32-bit CPU, Any FPU)\n"));
12420       break;
12421     case Val_GNU_MIPS_ABI_FP_64:
12422       printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
12423       break;
12424     case Val_GNU_MIPS_ABI_FP_64A:
12425       printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
12426       break;
12427     default:
12428       printf ("??? (%d)\n", val);
12429       break;
12430     }
12431 }
12432
12433 static unsigned char *
12434 display_mips_gnu_attribute (unsigned char * p,
12435                             int tag,
12436                             const unsigned char * const end)
12437 {
12438   if (tag == Tag_GNU_MIPS_ABI_FP)
12439     {
12440       unsigned int len;
12441       int val;
12442
12443       val = read_uleb128 (p, &len, end);
12444       p += len;
12445       printf ("  Tag_GNU_MIPS_ABI_FP: ");
12446
12447       print_mips_fp_abi_value (val);
12448
12449       return p;
12450    }
12451
12452   if (tag == Tag_GNU_MIPS_ABI_MSA)
12453     {
12454       unsigned int len;
12455       int val;
12456
12457       val = read_uleb128 (p, &len, end);
12458       p += len;
12459       printf ("  Tag_GNU_MIPS_ABI_MSA: ");
12460
12461       switch (val)
12462         {
12463         case Val_GNU_MIPS_ABI_MSA_ANY:
12464           printf (_("Any MSA or not\n"));
12465           break;
12466         case Val_GNU_MIPS_ABI_MSA_128:
12467           printf (_("128-bit MSA\n"));
12468           break;
12469         default:
12470           printf ("??? (%d)\n", val);
12471           break;
12472         }
12473       return p;
12474     }
12475
12476   return display_tag_value (tag & 1, p, end);
12477 }
12478
12479 static unsigned char *
12480 display_tic6x_attribute (unsigned char * p,
12481                          const unsigned char * const end)
12482 {
12483   int tag;
12484   unsigned int len;
12485   int val;
12486
12487   tag = read_uleb128 (p, &len, end);
12488   p += len;
12489
12490   switch (tag)
12491     {
12492     case Tag_ISA:
12493       val = read_uleb128 (p, &len, end);
12494       p += len;
12495       printf ("  Tag_ISA: ");
12496
12497       switch (val)
12498         {
12499         case C6XABI_Tag_ISA_none:
12500           printf (_("None\n"));
12501           break;
12502         case C6XABI_Tag_ISA_C62X:
12503           printf ("C62x\n");
12504           break;
12505         case C6XABI_Tag_ISA_C67X:
12506           printf ("C67x\n");
12507           break;
12508         case C6XABI_Tag_ISA_C67XP:
12509           printf ("C67x+\n");
12510           break;
12511         case C6XABI_Tag_ISA_C64X:
12512           printf ("C64x\n");
12513           break;
12514         case C6XABI_Tag_ISA_C64XP:
12515           printf ("C64x+\n");
12516           break;
12517         case C6XABI_Tag_ISA_C674X:
12518           printf ("C674x\n");
12519           break;
12520         default:
12521           printf ("??? (%d)\n", val);
12522           break;
12523         }
12524       return p;
12525
12526     case Tag_ABI_wchar_t:
12527       val = read_uleb128 (p, &len, end);
12528       p += len;
12529       printf ("  Tag_ABI_wchar_t: ");
12530       switch (val)
12531         {
12532         case 0:
12533           printf (_("Not used\n"));
12534           break;
12535         case 1:
12536           printf (_("2 bytes\n"));
12537           break;
12538         case 2:
12539           printf (_("4 bytes\n"));
12540           break;
12541         default:
12542           printf ("??? (%d)\n", val);
12543           break;
12544         }
12545       return p;
12546
12547     case Tag_ABI_stack_align_needed:
12548       val = read_uleb128 (p, &len, end);
12549       p += len;
12550       printf ("  Tag_ABI_stack_align_needed: ");
12551       switch (val)
12552         {
12553         case 0:
12554           printf (_("8-byte\n"));
12555           break;
12556         case 1:
12557           printf (_("16-byte\n"));
12558           break;
12559         default:
12560           printf ("??? (%d)\n", val);
12561           break;
12562         }
12563       return p;
12564
12565     case Tag_ABI_stack_align_preserved:
12566       val = read_uleb128 (p, &len, end);
12567       p += len;
12568       printf ("  Tag_ABI_stack_align_preserved: ");
12569       switch (val)
12570         {
12571         case 0:
12572           printf (_("8-byte\n"));
12573           break;
12574         case 1:
12575           printf (_("16-byte\n"));
12576           break;
12577         default:
12578           printf ("??? (%d)\n", val);
12579           break;
12580         }
12581       return p;
12582
12583     case Tag_ABI_DSBT:
12584       val = read_uleb128 (p, &len, end);
12585       p += len;
12586       printf ("  Tag_ABI_DSBT: ");
12587       switch (val)
12588         {
12589         case 0:
12590           printf (_("DSBT addressing not used\n"));
12591           break;
12592         case 1:
12593           printf (_("DSBT addressing used\n"));
12594           break;
12595         default:
12596           printf ("??? (%d)\n", val);
12597           break;
12598         }
12599       return p;
12600
12601     case Tag_ABI_PID:
12602       val = read_uleb128 (p, &len, end);
12603       p += len;
12604       printf ("  Tag_ABI_PID: ");
12605       switch (val)
12606         {
12607         case 0:
12608           printf (_("Data addressing position-dependent\n"));
12609           break;
12610         case 1:
12611           printf (_("Data addressing position-independent, GOT near DP\n"));
12612           break;
12613         case 2:
12614           printf (_("Data addressing position-independent, GOT far from DP\n"));
12615           break;
12616         default:
12617           printf ("??? (%d)\n", val);
12618           break;
12619         }
12620       return p;
12621
12622     case Tag_ABI_PIC:
12623       val = read_uleb128 (p, &len, end);
12624       p += len;
12625       printf ("  Tag_ABI_PIC: ");
12626       switch (val)
12627         {
12628         case 0:
12629           printf (_("Code addressing position-dependent\n"));
12630           break;
12631         case 1:
12632           printf (_("Code addressing position-independent\n"));
12633           break;
12634         default:
12635           printf ("??? (%d)\n", val);
12636           break;
12637         }
12638       return p;
12639
12640     case Tag_ABI_array_object_alignment:
12641       val = read_uleb128 (p, &len, end);
12642       p += len;
12643       printf ("  Tag_ABI_array_object_alignment: ");
12644       switch (val)
12645         {
12646         case 0:
12647           printf (_("8-byte\n"));
12648           break;
12649         case 1:
12650           printf (_("4-byte\n"));
12651           break;
12652         case 2:
12653           printf (_("16-byte\n"));
12654           break;
12655         default:
12656           printf ("??? (%d)\n", val);
12657           break;
12658         }
12659       return p;
12660
12661     case Tag_ABI_array_object_align_expected:
12662       val = read_uleb128 (p, &len, end);
12663       p += len;
12664       printf ("  Tag_ABI_array_object_align_expected: ");
12665       switch (val)
12666         {
12667         case 0:
12668           printf (_("8-byte\n"));
12669           break;
12670         case 1:
12671           printf (_("4-byte\n"));
12672           break;
12673         case 2:
12674           printf (_("16-byte\n"));
12675           break;
12676         default:
12677           printf ("??? (%d)\n", val);
12678           break;
12679         }
12680       return p;
12681
12682     case Tag_ABI_compatibility:
12683       {
12684         val = read_uleb128 (p, &len, end);
12685         p += len;
12686         printf ("  Tag_ABI_compatibility: ");
12687         printf (_("flag = %d, vendor = "), val);
12688         if (p < end - 1)
12689           {
12690             size_t maxlen = (end - p) - 1;
12691
12692             print_symbol ((int) maxlen, (const char *) p);
12693             p += strnlen ((char *) p, maxlen) + 1;
12694           }
12695         else
12696           {
12697             printf (_("<corrupt>"));
12698             p = (unsigned char *) end;
12699           }
12700         putchar ('\n');
12701         return p;
12702       }
12703
12704     case Tag_ABI_conformance:
12705       {
12706         printf ("  Tag_ABI_conformance: \"");
12707         if (p < end - 1)
12708           {
12709             size_t maxlen = (end - p) - 1;
12710
12711             print_symbol ((int) maxlen, (const char *) p);
12712             p += strnlen ((char *) p, maxlen) + 1;
12713           }
12714         else
12715           {
12716             printf (_("<corrupt>"));
12717             p = (unsigned char *) end;
12718           }
12719         printf ("\"\n");
12720         return p;
12721       }
12722     }
12723
12724   return display_tag_value (tag, p, end);
12725 }
12726
12727 static void
12728 display_raw_attribute (unsigned char * p, unsigned char * end)
12729 {
12730   unsigned long addr = 0;
12731   size_t bytes = end - p;
12732
12733   assert (end > p);
12734   while (bytes)
12735     {
12736       int j;
12737       int k;
12738       int lbytes = (bytes > 16 ? 16 : bytes);
12739
12740       printf ("  0x%8.8lx ", addr);
12741
12742       for (j = 0; j < 16; j++)
12743         {
12744           if (j < lbytes)
12745             printf ("%2.2x", p[j]);
12746           else
12747             printf ("  ");
12748
12749           if ((j & 3) == 3)
12750             printf (" ");
12751         }
12752
12753       for (j = 0; j < lbytes; j++)
12754         {
12755           k = p[j];
12756           if (k >= ' ' && k < 0x7f)
12757             printf ("%c", k);
12758           else
12759             printf (".");
12760         }
12761
12762       putchar ('\n');
12763
12764       p  += lbytes;
12765       bytes -= lbytes;
12766       addr += lbytes;
12767     }
12768
12769   putchar ('\n');
12770 }
12771
12772 static unsigned char *
12773 display_msp430x_attribute (unsigned char * p,
12774                            const unsigned char * const end)
12775 {
12776   unsigned int len;
12777   int val;
12778   int tag;
12779
12780   tag = read_uleb128 (p, & len, end);
12781   p += len;
12782
12783   switch (tag)
12784     {
12785     case OFBA_MSPABI_Tag_ISA:
12786       val = read_uleb128 (p, &len, end);
12787       p += len;
12788       printf ("  Tag_ISA: ");
12789       switch (val)
12790         {
12791         case 0: printf (_("None\n")); break;
12792         case 1: printf (_("MSP430\n")); break;
12793         case 2: printf (_("MSP430X\n")); break;
12794         default: printf ("??? (%d)\n", val); break;
12795         }
12796       break;
12797
12798     case OFBA_MSPABI_Tag_Code_Model:
12799       val = read_uleb128 (p, &len, end);
12800       p += len;
12801       printf ("  Tag_Code_Model: ");
12802       switch (val)
12803         {
12804         case 0: printf (_("None\n")); break;
12805         case 1: printf (_("Small\n")); break;
12806         case 2: printf (_("Large\n")); break;
12807         default: printf ("??? (%d)\n", val); break;
12808         }
12809       break;
12810
12811     case OFBA_MSPABI_Tag_Data_Model:
12812       val = read_uleb128 (p, &len, end);
12813       p += len;
12814       printf ("  Tag_Data_Model: ");
12815       switch (val)
12816         {
12817         case 0: printf (_("None\n")); break;
12818         case 1: printf (_("Small\n")); break;
12819         case 2: printf (_("Large\n")); break;
12820         case 3: printf (_("Restricted Large\n")); break;
12821         default: printf ("??? (%d)\n", val); break;
12822         }
12823       break;
12824
12825     default:
12826       printf (_("  <unknown tag %d>: "), tag);
12827
12828       if (tag & 1)
12829         {
12830           putchar ('"');
12831           if (p < end - 1)
12832             {
12833               size_t maxlen = (end - p) - 1;
12834
12835               print_symbol ((int) maxlen, (const char *) p);
12836               p += strnlen ((char *) p, maxlen) + 1;
12837             }
12838           else
12839             {
12840               printf (_("<corrupt>"));
12841               p = (unsigned char *) end;
12842             }
12843           printf ("\"\n");
12844         }
12845       else
12846         {
12847           val = read_uleb128 (p, &len, end);
12848           p += len;
12849           printf ("%d (0x%x)\n", val, val);
12850         }
12851       break;
12852    }
12853
12854   assert (p <= end);
12855   return p;
12856 }
12857
12858 static int
12859 process_attributes (FILE * file,
12860                     const char * public_name,
12861                     unsigned int proc_type,
12862                     unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
12863                     unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const))
12864 {
12865   Elf_Internal_Shdr * sect;
12866   unsigned i;
12867
12868   /* Find the section header so that we get the size.  */
12869   for (i = 0, sect = section_headers;
12870        i < elf_header.e_shnum;
12871        i++, sect++)
12872     {
12873       unsigned char * contents;
12874       unsigned char * p;
12875
12876       if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
12877         continue;
12878
12879       contents = (unsigned char *) get_data (NULL, file, sect->sh_offset, 1,
12880                                              sect->sh_size, _("attributes"));
12881       if (contents == NULL)
12882         continue;
12883
12884       p = contents;
12885       if (*p == 'A')
12886         {
12887           bfd_vma section_len;
12888
12889           section_len = sect->sh_size - 1;
12890           p++;
12891
12892           while (section_len > 0)
12893             {
12894               bfd_vma attr_len;
12895               unsigned int namelen;
12896               bfd_boolean public_section;
12897               bfd_boolean gnu_section;
12898
12899               if (section_len <= 4)
12900                 {
12901                   error (_("Tag section ends prematurely\n"));
12902                   break;
12903                 }
12904               attr_len = byte_get (p, 4);
12905               p += 4;
12906
12907               if (attr_len > section_len)
12908                 {
12909                   error (_("Bad attribute length (%u > %u)\n"),
12910                           (unsigned) attr_len, (unsigned) section_len);
12911                   attr_len = section_len;
12912                 }
12913               /* PR 17531: file: 001-101425-0.004  */
12914               else if (attr_len < 5)
12915                 {
12916                   error (_("Attribute length of %u is too small\n"), (unsigned) attr_len);
12917                   break;
12918                 }
12919
12920               section_len -= attr_len;
12921               attr_len -= 4;
12922
12923               namelen = strnlen ((char *) p, attr_len) + 1;
12924               if (namelen == 0 || namelen >= attr_len)
12925                 {
12926                   error (_("Corrupt attribute section name\n"));
12927                   break;
12928                 }
12929
12930               printf (_("Attribute Section: "));
12931               print_symbol (INT_MAX, (const char *) p);
12932               putchar ('\n');
12933
12934               if (public_name && streq ((char *) p, public_name))
12935                 public_section = TRUE;
12936               else
12937                 public_section = FALSE;
12938
12939               if (streq ((char *) p, "gnu"))
12940                 gnu_section = TRUE;
12941               else
12942                 gnu_section = FALSE;
12943
12944               p += namelen;
12945               attr_len -= namelen;
12946
12947               while (attr_len > 0 && p < contents + sect->sh_size)
12948                 {
12949                   int tag;
12950                   int val;
12951                   bfd_vma size;
12952                   unsigned char * end;
12953
12954                   /* PR binutils/17531: Safe handling of corrupt files.  */
12955                   if (attr_len < 6)
12956                     {
12957                       error (_("Unused bytes at end of section\n"));
12958                       section_len = 0;
12959                       break;
12960                     }
12961
12962                   tag = *(p++);
12963                   size = byte_get (p, 4);
12964                   if (size > attr_len)
12965                     {
12966                       error (_("Bad subsection length (%u > %u)\n"),
12967                               (unsigned) size, (unsigned) attr_len);
12968                       size = attr_len;
12969                     }
12970                   /* PR binutils/17531: Safe handling of corrupt files.  */
12971                   if (size < 6)
12972                     {
12973                       error (_("Bad subsection length (%u < 6)\n"),
12974                               (unsigned) size);
12975                       section_len = 0;
12976                       break;
12977                     }
12978
12979                   attr_len -= size;
12980                   end = p + size - 1;
12981                   assert (end <= contents + sect->sh_size);
12982                   p += 4;
12983
12984                   switch (tag)
12985                     {
12986                     case 1:
12987                       printf (_("File Attributes\n"));
12988                       break;
12989                     case 2:
12990                       printf (_("Section Attributes:"));
12991                       goto do_numlist;
12992                     case 3:
12993                       printf (_("Symbol Attributes:"));
12994                     do_numlist:
12995                       for (;;)
12996                         {
12997                           unsigned int j;
12998
12999                           val = read_uleb128 (p, &j, end);
13000                           p += j;
13001                           if (val == 0)
13002                             break;
13003                           printf (" %d", val);
13004                         }
13005                       printf ("\n");
13006                       break;
13007                     default:
13008                       printf (_("Unknown tag: %d\n"), tag);
13009                       public_section = FALSE;
13010                       break;
13011                     }
13012
13013                   if (public_section && display_pub_attribute != NULL)
13014                     {
13015                       while (p < end)
13016                         p = display_pub_attribute (p, end);
13017                       assert (p <= end);
13018                     }
13019                   else if (gnu_section && display_proc_gnu_attribute != NULL)
13020                     {
13021                       while (p < end)
13022                         p = display_gnu_attribute (p,
13023                                                    display_proc_gnu_attribute,
13024                                                    end);
13025                       assert (p <= end);
13026                     }
13027                   else if (p < end)
13028                     {
13029                       printf (_("  Unknown attribute:\n"));
13030                       display_raw_attribute (p, end);
13031                       p = end;
13032                     }
13033                   else
13034                     attr_len = 0;
13035                 }
13036             }
13037         }
13038       else
13039         printf (_("Unknown format '%c' (%d)\n"), *p, *p);
13040
13041       free (contents);
13042     }
13043   return 1;
13044 }
13045
13046 static int
13047 process_arm_specific (FILE * file)
13048 {
13049   return process_attributes (file, "aeabi", SHT_ARM_ATTRIBUTES,
13050                              display_arm_attribute, NULL);
13051 }
13052
13053 static int
13054 process_power_specific (FILE * file)
13055 {
13056   return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
13057                              display_power_gnu_attribute);
13058 }
13059
13060 static int
13061 process_sparc_specific (FILE * file)
13062 {
13063   return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
13064                              display_sparc_gnu_attribute);
13065 }
13066
13067 static int
13068 process_tic6x_specific (FILE * file)
13069 {
13070   return process_attributes (file, "c6xabi", SHT_C6000_ATTRIBUTES,
13071                              display_tic6x_attribute, NULL);
13072 }
13073
13074 static int
13075 process_msp430x_specific (FILE * file)
13076 {
13077   return process_attributes (file, "mspabi", SHT_MSP430_ATTRIBUTES,
13078                              display_msp430x_attribute, NULL);
13079 }
13080
13081 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
13082    Print the Address, Access and Initial fields of an entry at VMA ADDR
13083    and return the VMA of the next entry.  */
13084
13085 static bfd_vma
13086 print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
13087 {
13088   printf ("  ");
13089   print_vma (addr, LONG_HEX);
13090   printf (" ");
13091   if (addr < pltgot + 0xfff0)
13092     printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
13093   else
13094     printf ("%10s", "");
13095   printf (" ");
13096   if (data == NULL)
13097     printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
13098   else
13099     {
13100       bfd_vma entry;
13101
13102       entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
13103       print_vma (entry, LONG_HEX);
13104     }
13105   return addr + (is_32bit_elf ? 4 : 8);
13106 }
13107
13108 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
13109    PLTGOT.  Print the Address and Initial fields of an entry at VMA
13110    ADDR and return the VMA of the next entry.  */
13111
13112 static bfd_vma
13113 print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
13114 {
13115   printf ("  ");
13116   print_vma (addr, LONG_HEX);
13117   printf (" ");
13118   if (data == NULL)
13119     printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
13120   else
13121     {
13122       bfd_vma entry;
13123
13124       entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
13125       print_vma (entry, LONG_HEX);
13126     }
13127   return addr + (is_32bit_elf ? 4 : 8);
13128 }
13129
13130 static void
13131 print_mips_ases (unsigned int mask)
13132 {
13133   if (mask & AFL_ASE_DSP)
13134     fputs ("\n\tDSP ASE", stdout);
13135   if (mask & AFL_ASE_DSPR2)
13136     fputs ("\n\tDSP R2 ASE", stdout);
13137   if (mask & AFL_ASE_EVA)
13138     fputs ("\n\tEnhanced VA Scheme", stdout);
13139   if (mask & AFL_ASE_MCU)
13140     fputs ("\n\tMCU (MicroController) ASE", stdout);
13141   if (mask & AFL_ASE_MDMX)
13142     fputs ("\n\tMDMX ASE", stdout);
13143   if (mask & AFL_ASE_MIPS3D)
13144     fputs ("\n\tMIPS-3D ASE", stdout);
13145   if (mask & AFL_ASE_MT)
13146     fputs ("\n\tMT ASE", stdout);
13147   if (mask & AFL_ASE_SMARTMIPS)
13148     fputs ("\n\tSmartMIPS ASE", stdout);
13149   if (mask & AFL_ASE_VIRT)
13150     fputs ("\n\tVZ ASE", stdout);
13151   if (mask & AFL_ASE_MSA)
13152     fputs ("\n\tMSA ASE", stdout);
13153   if (mask & AFL_ASE_MIPS16)
13154     fputs ("\n\tMIPS16 ASE", stdout);
13155   if (mask & AFL_ASE_MICROMIPS)
13156     fputs ("\n\tMICROMIPS ASE", stdout);
13157   if (mask & AFL_ASE_XPA)
13158     fputs ("\n\tXPA ASE", stdout);
13159   if (mask == 0)
13160     fprintf (stdout, "\n\t%s", _("None"));
13161   else if ((mask & ~AFL_ASE_MASK) != 0)
13162     fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
13163 }
13164
13165 static void
13166 print_mips_isa_ext (unsigned int isa_ext)
13167 {
13168   switch (isa_ext)
13169     {
13170     case 0:
13171       fputs (_("None"), stdout);
13172       break;
13173     case AFL_EXT_XLR:
13174       fputs ("RMI XLR", stdout);
13175       break;
13176     case AFL_EXT_OCTEON3:
13177       fputs ("Cavium Networks Octeon3", stdout);
13178       break;
13179     case AFL_EXT_OCTEON2:
13180       fputs ("Cavium Networks Octeon2", stdout);
13181       break;
13182     case AFL_EXT_OCTEONP:
13183       fputs ("Cavium Networks OcteonP", stdout);
13184       break;
13185     case AFL_EXT_LOONGSON_3A:
13186       fputs ("Loongson 3A", stdout);
13187       break;
13188     case AFL_EXT_OCTEON:
13189       fputs ("Cavium Networks Octeon", stdout);
13190       break;
13191     case AFL_EXT_5900:
13192       fputs ("Toshiba R5900", stdout);
13193       break;
13194     case AFL_EXT_4650:
13195       fputs ("MIPS R4650", stdout);
13196       break;
13197     case AFL_EXT_4010:
13198       fputs ("LSI R4010", stdout);
13199       break;
13200     case AFL_EXT_4100:
13201       fputs ("NEC VR4100", stdout);
13202       break;
13203     case AFL_EXT_3900:
13204       fputs ("Toshiba R3900", stdout);
13205       break;
13206     case AFL_EXT_10000:
13207       fputs ("MIPS R10000", stdout);
13208       break;
13209     case AFL_EXT_SB1:
13210       fputs ("Broadcom SB-1", stdout);
13211       break;
13212     case AFL_EXT_4111:
13213       fputs ("NEC VR4111/VR4181", stdout);
13214       break;
13215     case AFL_EXT_4120:
13216       fputs ("NEC VR4120", stdout);
13217       break;
13218     case AFL_EXT_5400:
13219       fputs ("NEC VR5400", stdout);
13220       break;
13221     case AFL_EXT_5500:
13222       fputs ("NEC VR5500", stdout);
13223       break;
13224     case AFL_EXT_LOONGSON_2E:
13225       fputs ("ST Microelectronics Loongson 2E", stdout);
13226       break;
13227     case AFL_EXT_LOONGSON_2F:
13228       fputs ("ST Microelectronics Loongson 2F", stdout);
13229       break;
13230     default:
13231       fprintf (stdout, "%s (%d)", _("Unknown"), isa_ext);
13232     }
13233 }
13234
13235 static int
13236 get_mips_reg_size (int reg_size)
13237 {
13238   return (reg_size == AFL_REG_NONE) ? 0
13239          : (reg_size == AFL_REG_32) ? 32
13240          : (reg_size == AFL_REG_64) ? 64
13241          : (reg_size == AFL_REG_128) ? 128
13242          : -1;
13243 }
13244
13245 static int
13246 process_mips_specific (FILE * file)
13247 {
13248   Elf_Internal_Dyn * entry;
13249   Elf_Internal_Shdr *sect = NULL;
13250   size_t liblist_offset = 0;
13251   size_t liblistno = 0;
13252   size_t conflictsno = 0;
13253   size_t options_offset = 0;
13254   size_t conflicts_offset = 0;
13255   size_t pltrelsz = 0;
13256   size_t pltrel = 0;
13257   bfd_vma pltgot = 0;
13258   bfd_vma mips_pltgot = 0;
13259   bfd_vma jmprel = 0;
13260   bfd_vma local_gotno = 0;
13261   bfd_vma gotsym = 0;
13262   bfd_vma symtabno = 0;
13263
13264   process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
13265                       display_mips_gnu_attribute);
13266
13267   sect = find_section (".MIPS.abiflags");
13268
13269   if (sect != NULL)
13270     {
13271       Elf_External_ABIFlags_v0 *abiflags_ext;
13272       Elf_Internal_ABIFlags_v0 abiflags_in;
13273
13274       if (sizeof (Elf_External_ABIFlags_v0) != sect->sh_size)
13275         fputs ("\nCorrupt ABI Flags section.\n", stdout);
13276       else
13277         {
13278           abiflags_ext = get_data (NULL, file, sect->sh_offset, 1,
13279                                    sect->sh_size, _("MIPS ABI Flags section"));
13280           if (abiflags_ext)
13281             {
13282               abiflags_in.version = BYTE_GET (abiflags_ext->version);
13283               abiflags_in.isa_level = BYTE_GET (abiflags_ext->isa_level);
13284               abiflags_in.isa_rev = BYTE_GET (abiflags_ext->isa_rev);
13285               abiflags_in.gpr_size = BYTE_GET (abiflags_ext->gpr_size);
13286               abiflags_in.cpr1_size = BYTE_GET (abiflags_ext->cpr1_size);
13287               abiflags_in.cpr2_size = BYTE_GET (abiflags_ext->cpr2_size);
13288               abiflags_in.fp_abi = BYTE_GET (abiflags_ext->fp_abi);
13289               abiflags_in.isa_ext = BYTE_GET (abiflags_ext->isa_ext);
13290               abiflags_in.ases = BYTE_GET (abiflags_ext->ases);
13291               abiflags_in.flags1 = BYTE_GET (abiflags_ext->flags1);
13292               abiflags_in.flags2 = BYTE_GET (abiflags_ext->flags2);
13293
13294               printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in.version);
13295               printf ("\nISA: MIPS%d", abiflags_in.isa_level);
13296               if (abiflags_in.isa_rev > 1)
13297                 printf ("r%d", abiflags_in.isa_rev);
13298               printf ("\nGPR size: %d",
13299                       get_mips_reg_size (abiflags_in.gpr_size));
13300               printf ("\nCPR1 size: %d",
13301                       get_mips_reg_size (abiflags_in.cpr1_size));
13302               printf ("\nCPR2 size: %d",
13303                       get_mips_reg_size (abiflags_in.cpr2_size));
13304               fputs ("\nFP ABI: ", stdout);
13305               print_mips_fp_abi_value (abiflags_in.fp_abi);
13306               fputs ("ISA Extension: ", stdout);
13307               print_mips_isa_ext (abiflags_in.isa_ext);
13308               fputs ("\nASEs:", stdout);
13309               print_mips_ases (abiflags_in.ases);
13310               printf ("\nFLAGS 1: %8.8lx", abiflags_in.flags1);
13311               printf ("\nFLAGS 2: %8.8lx", abiflags_in.flags2);
13312               fputc ('\n', stdout);
13313               free (abiflags_ext);
13314             }
13315         }
13316     }
13317
13318   /* We have a lot of special sections.  Thanks SGI!  */
13319   if (dynamic_section == NULL)
13320     /* No information available.  */
13321     return 0;
13322
13323   for (entry = dynamic_section;
13324        /* PR 17531 file: 012-50589-0.004.  */
13325        entry < dynamic_section + dynamic_nent && entry->d_tag != DT_NULL;
13326        ++entry)
13327     switch (entry->d_tag)
13328       {
13329       case DT_MIPS_LIBLIST:
13330         liblist_offset
13331           = offset_from_vma (file, entry->d_un.d_val,
13332                              liblistno * sizeof (Elf32_External_Lib));
13333         break;
13334       case DT_MIPS_LIBLISTNO:
13335         liblistno = entry->d_un.d_val;
13336         break;
13337       case DT_MIPS_OPTIONS:
13338         options_offset = offset_from_vma (file, entry->d_un.d_val, 0);
13339         break;
13340       case DT_MIPS_CONFLICT:
13341         conflicts_offset
13342           = offset_from_vma (file, entry->d_un.d_val,
13343                              conflictsno * sizeof (Elf32_External_Conflict));
13344         break;
13345       case DT_MIPS_CONFLICTNO:
13346         conflictsno = entry->d_un.d_val;
13347         break;
13348       case DT_PLTGOT:
13349         pltgot = entry->d_un.d_ptr;
13350         break;
13351       case DT_MIPS_LOCAL_GOTNO:
13352         local_gotno = entry->d_un.d_val;
13353         break;
13354       case DT_MIPS_GOTSYM:
13355         gotsym = entry->d_un.d_val;
13356         break;
13357       case DT_MIPS_SYMTABNO:
13358         symtabno = entry->d_un.d_val;
13359         break;
13360       case DT_MIPS_PLTGOT:
13361         mips_pltgot = entry->d_un.d_ptr;
13362         break;
13363       case DT_PLTREL:
13364         pltrel = entry->d_un.d_val;
13365         break;
13366       case DT_PLTRELSZ:
13367         pltrelsz = entry->d_un.d_val;
13368         break;
13369       case DT_JMPREL:
13370         jmprel = entry->d_un.d_ptr;
13371         break;
13372       default:
13373         break;
13374       }
13375
13376   if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
13377     {
13378       Elf32_External_Lib * elib;
13379       size_t cnt;
13380
13381       elib = (Elf32_External_Lib *) get_data (NULL, file, liblist_offset,
13382                                               liblistno,
13383                                               sizeof (Elf32_External_Lib),
13384                                               _("liblist section data"));
13385       if (elib)
13386         {
13387           printf (_("\nSection '.liblist' contains %lu entries:\n"),
13388                   (unsigned long) liblistno);
13389           fputs (_("     Library              Time Stamp          Checksum   Version Flags\n"),
13390                  stdout);
13391
13392           for (cnt = 0; cnt < liblistno; ++cnt)
13393             {
13394               Elf32_Lib liblist;
13395               time_t atime;
13396               char timebuf[20];
13397               struct tm * tmp;
13398
13399               liblist.l_name = BYTE_GET (elib[cnt].l_name);
13400               atime = BYTE_GET (elib[cnt].l_time_stamp);
13401               liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
13402               liblist.l_version = BYTE_GET (elib[cnt].l_version);
13403               liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
13404
13405               tmp = gmtime (&atime);
13406               snprintf (timebuf, sizeof (timebuf),
13407                         "%04u-%02u-%02uT%02u:%02u:%02u",
13408                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
13409                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
13410
13411               printf ("%3lu: ", (unsigned long) cnt);
13412               if (VALID_DYNAMIC_NAME (liblist.l_name))
13413                 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
13414               else
13415                 printf (_("<corrupt: %9ld>"), liblist.l_name);
13416               printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
13417                       liblist.l_version);
13418
13419               if (liblist.l_flags == 0)
13420                 puts (_(" NONE"));
13421               else
13422                 {
13423                   static const struct
13424                   {
13425                     const char * name;
13426                     int bit;
13427                   }
13428                   l_flags_vals[] =
13429                   {
13430                     { " EXACT_MATCH", LL_EXACT_MATCH },
13431                     { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
13432                     { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
13433                     { " EXPORTS", LL_EXPORTS },
13434                     { " DELAY_LOAD", LL_DELAY_LOAD },
13435                     { " DELTA", LL_DELTA }
13436                   };
13437                   int flags = liblist.l_flags;
13438                   size_t fcnt;
13439
13440                   for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
13441                     if ((flags & l_flags_vals[fcnt].bit) != 0)
13442                       {
13443                         fputs (l_flags_vals[fcnt].name, stdout);
13444                         flags ^= l_flags_vals[fcnt].bit;
13445                       }
13446                   if (flags != 0)
13447                     printf (" %#x", (unsigned int) flags);
13448
13449                   puts ("");
13450                 }
13451             }
13452
13453           free (elib);
13454         }
13455     }
13456
13457   if (options_offset != 0)
13458     {
13459       Elf_External_Options * eopt;
13460       Elf_Internal_Options * iopt;
13461       Elf_Internal_Options * option;
13462       size_t offset;
13463       int cnt;
13464       sect = section_headers;
13465
13466       /* Find the section header so that we get the size.  */
13467       sect = find_section_by_type (SHT_MIPS_OPTIONS);
13468       /* PR 17533 file: 012-277276-0.004.  */ 
13469       if (sect == NULL)
13470         {
13471           error (_("No MIPS_OPTIONS header found\n"));
13472           return 0;
13473         }
13474
13475       eopt = (Elf_External_Options *) get_data (NULL, file, options_offset, 1,
13476                                                 sect->sh_size, _("options"));
13477       if (eopt)
13478         {
13479           iopt = (Elf_Internal_Options *)
13480               cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
13481           if (iopt == NULL)
13482             {
13483               error (_("Out of memory allocatinf space for MIPS options\n"));
13484               return 0;
13485             }
13486
13487           offset = cnt = 0;
13488           option = iopt;
13489
13490           while (offset < sect->sh_size)
13491             {
13492               Elf_External_Options * eoption;
13493
13494               eoption = (Elf_External_Options *) ((char *) eopt + offset);
13495
13496               option->kind = BYTE_GET (eoption->kind);
13497               option->size = BYTE_GET (eoption->size);
13498               option->section = BYTE_GET (eoption->section);
13499               option->info = BYTE_GET (eoption->info);
13500
13501               offset += option->size;
13502
13503               ++option;
13504               ++cnt;
13505             }
13506
13507           printf (_("\nSection '%s' contains %d entries:\n"),
13508                   printable_section_name (sect), cnt);
13509
13510           option = iopt;
13511
13512           while (cnt-- > 0)
13513             {
13514               size_t len;
13515
13516               switch (option->kind)
13517                 {
13518                 case ODK_NULL:
13519                   /* This shouldn't happen.  */
13520                   printf (" NULL       %d %lx", option->section, option->info);
13521                   break;
13522                 case ODK_REGINFO:
13523                   printf (" REGINFO    ");
13524                   if (elf_header.e_machine == EM_MIPS)
13525                     {
13526                       /* 32bit form.  */
13527                       Elf32_External_RegInfo * ereg;
13528                       Elf32_RegInfo reginfo;
13529
13530                       ereg = (Elf32_External_RegInfo *) (option + 1);
13531                       reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
13532                       reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
13533                       reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
13534                       reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
13535                       reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
13536                       reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
13537
13538                       printf ("GPR %08lx  GP 0x%lx\n",
13539                               reginfo.ri_gprmask,
13540                               (unsigned long) reginfo.ri_gp_value);
13541                       printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
13542                               reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
13543                               reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
13544                     }
13545                   else
13546                     {
13547                       /* 64 bit form.  */
13548                       Elf64_External_RegInfo * ereg;
13549                       Elf64_Internal_RegInfo reginfo;
13550
13551                       ereg = (Elf64_External_RegInfo *) (option + 1);
13552                       reginfo.ri_gprmask    = BYTE_GET (ereg->ri_gprmask);
13553                       reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
13554                       reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
13555                       reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
13556                       reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
13557                       reginfo.ri_gp_value   = BYTE_GET (ereg->ri_gp_value);
13558
13559                       printf ("GPR %08lx  GP 0x",
13560                               reginfo.ri_gprmask);
13561                       printf_vma (reginfo.ri_gp_value);
13562                       printf ("\n");
13563
13564                       printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
13565                               reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
13566                               reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
13567                     }
13568                   ++option;
13569                   continue;
13570                 case ODK_EXCEPTIONS:
13571                   fputs (" EXCEPTIONS fpe_min(", stdout);
13572                   process_mips_fpe_exception (option->info & OEX_FPU_MIN);
13573                   fputs (") fpe_max(", stdout);
13574                   process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
13575                   fputs (")", stdout);
13576
13577                   if (option->info & OEX_PAGE0)
13578                     fputs (" PAGE0", stdout);
13579                   if (option->info & OEX_SMM)
13580                     fputs (" SMM", stdout);
13581                   if (option->info & OEX_FPDBUG)
13582                     fputs (" FPDBUG", stdout);
13583                   if (option->info & OEX_DISMISS)
13584                     fputs (" DISMISS", stdout);
13585                   break;
13586                 case ODK_PAD:
13587                   fputs (" PAD       ", stdout);
13588                   if (option->info & OPAD_PREFIX)
13589                     fputs (" PREFIX", stdout);
13590                   if (option->info & OPAD_POSTFIX)
13591                     fputs (" POSTFIX", stdout);
13592                   if (option->info & OPAD_SYMBOL)
13593                     fputs (" SYMBOL", stdout);
13594                   break;
13595                 case ODK_HWPATCH:
13596                   fputs (" HWPATCH   ", stdout);
13597                   if (option->info & OHW_R4KEOP)
13598                     fputs (" R4KEOP", stdout);
13599                   if (option->info & OHW_R8KPFETCH)
13600                     fputs (" R8KPFETCH", stdout);
13601                   if (option->info & OHW_R5KEOP)
13602                     fputs (" R5KEOP", stdout);
13603                   if (option->info & OHW_R5KCVTL)
13604                     fputs (" R5KCVTL", stdout);
13605                   break;
13606                 case ODK_FILL:
13607                   fputs (" FILL       ", stdout);
13608                   /* XXX Print content of info word?  */
13609                   break;
13610                 case ODK_TAGS:
13611                   fputs (" TAGS       ", stdout);
13612                   /* XXX Print content of info word?  */
13613                   break;
13614                 case ODK_HWAND:
13615                   fputs (" HWAND     ", stdout);
13616                   if (option->info & OHWA0_R4KEOP_CHECKED)
13617                     fputs (" R4KEOP_CHECKED", stdout);
13618                   if (option->info & OHWA0_R4KEOP_CLEAN)
13619                     fputs (" R4KEOP_CLEAN", stdout);
13620                   break;
13621                 case ODK_HWOR:
13622                   fputs (" HWOR      ", stdout);
13623                   if (option->info & OHWA0_R4KEOP_CHECKED)
13624                     fputs (" R4KEOP_CHECKED", stdout);
13625                   if (option->info & OHWA0_R4KEOP_CLEAN)
13626                     fputs (" R4KEOP_CLEAN", stdout);
13627                   break;
13628                 case ODK_GP_GROUP:
13629                   printf (" GP_GROUP  %#06lx  self-contained %#06lx",
13630                           option->info & OGP_GROUP,
13631                           (option->info & OGP_SELF) >> 16);
13632                   break;
13633                 case ODK_IDENT:
13634                   printf (" IDENT     %#06lx  self-contained %#06lx",
13635                           option->info & OGP_GROUP,
13636                           (option->info & OGP_SELF) >> 16);
13637                   break;
13638                 default:
13639                   /* This shouldn't happen.  */
13640                   printf (" %3d ???     %d %lx",
13641                           option->kind, option->section, option->info);
13642                   break;
13643                 }
13644
13645               len = sizeof (* eopt);
13646               while (len < option->size)
13647                 if (((char *) option)[len] >= ' '
13648                     && ((char *) option)[len] < 0x7f)
13649                   printf ("%c", ((char *) option)[len++]);
13650                 else
13651                   printf ("\\%03o", ((char *) option)[len++]);
13652
13653               fputs ("\n", stdout);
13654               ++option;
13655             }
13656
13657           free (eopt);
13658         }
13659     }
13660
13661   if (conflicts_offset != 0 && conflictsno != 0)
13662     {
13663       Elf32_Conflict * iconf;
13664       size_t cnt;
13665
13666       if (dynamic_symbols == NULL)
13667         {
13668           error (_("conflict list found without a dynamic symbol table\n"));
13669           return 0;
13670         }
13671
13672       iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
13673       if (iconf == NULL)
13674         {
13675           error (_("Out of memory allocating space for dynamic conflicts\n"));
13676           return 0;
13677         }
13678
13679       if (is_32bit_elf)
13680         {
13681           Elf32_External_Conflict * econf32;
13682
13683           econf32 = (Elf32_External_Conflict *)
13684               get_data (NULL, file, conflicts_offset, conflictsno,
13685                         sizeof (* econf32), _("conflict"));
13686           if (!econf32)
13687             return 0;
13688
13689           for (cnt = 0; cnt < conflictsno; ++cnt)
13690             iconf[cnt] = BYTE_GET (econf32[cnt]);
13691
13692           free (econf32);
13693         }
13694       else
13695         {
13696           Elf64_External_Conflict * econf64;
13697
13698           econf64 = (Elf64_External_Conflict *)
13699               get_data (NULL, file, conflicts_offset, conflictsno,
13700                         sizeof (* econf64), _("conflict"));
13701           if (!econf64)
13702             return 0;
13703
13704           for (cnt = 0; cnt < conflictsno; ++cnt)
13705             iconf[cnt] = BYTE_GET (econf64[cnt]);
13706
13707           free (econf64);
13708         }
13709
13710       printf (_("\nSection '.conflict' contains %lu entries:\n"),
13711               (unsigned long) conflictsno);
13712       puts (_("  Num:    Index       Value  Name"));
13713
13714       for (cnt = 0; cnt < conflictsno; ++cnt)
13715         {
13716           printf ("%5lu: %8lu  ", (unsigned long) cnt, iconf[cnt]);
13717
13718           if (iconf[cnt] >= num_dynamic_syms)
13719             printf (_("<corrupt symbol index>"));
13720           else
13721             {
13722               Elf_Internal_Sym * psym;
13723
13724               psym = & dynamic_symbols[iconf[cnt]];
13725               print_vma (psym->st_value, FULL_HEX);
13726               putchar (' ');
13727               if (VALID_DYNAMIC_NAME (psym->st_name))
13728                 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
13729               else
13730                 printf (_("<corrupt: %14ld>"), psym->st_name);
13731             }
13732           putchar ('\n');
13733         }
13734
13735       free (iconf);
13736     }
13737
13738   if (pltgot != 0 && local_gotno != 0)
13739     {
13740       bfd_vma ent, local_end, global_end;
13741       size_t i, offset;
13742       unsigned char * data;
13743       int addr_size;
13744
13745       ent = pltgot;
13746       addr_size = (is_32bit_elf ? 4 : 8);
13747       local_end = pltgot + local_gotno * addr_size;
13748
13749       /* PR binutils/17533 file: 012-111227-0.004  */
13750       if (symtabno < gotsym)
13751         {
13752           error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
13753                  (long) gotsym, (long) symtabno);
13754           return 0;
13755         }
13756  
13757       global_end = local_end + (symtabno - gotsym) * addr_size;
13758       assert (global_end >= local_end);
13759       offset = offset_from_vma (file, pltgot, global_end - pltgot);
13760       data = (unsigned char *) get_data (NULL, file, offset,
13761                                          global_end - pltgot, 1,
13762                                          _("Global Offset Table data"));
13763       if (data == NULL)
13764         return 0;
13765
13766       printf (_("\nPrimary GOT:\n"));
13767       printf (_(" Canonical gp value: "));
13768       print_vma (pltgot + 0x7ff0, LONG_HEX);
13769       printf ("\n\n");
13770
13771       printf (_(" Reserved entries:\n"));
13772       printf (_("  %*s %10s %*s Purpose\n"),
13773               addr_size * 2, _("Address"), _("Access"),
13774               addr_size * 2, _("Initial"));
13775       ent = print_mips_got_entry (data, pltgot, ent);
13776       printf (_(" Lazy resolver\n"));
13777       if (data
13778           && (byte_get (data + ent - pltgot, addr_size)
13779               >> (addr_size * 8 - 1)) != 0)
13780         {
13781           ent = print_mips_got_entry (data, pltgot, ent);
13782           printf (_(" Module pointer (GNU extension)\n"));
13783         }
13784       printf ("\n");
13785
13786       if (ent < local_end)
13787         {
13788           printf (_(" Local entries:\n"));
13789           printf ("  %*s %10s %*s\n",
13790                   addr_size * 2, _("Address"), _("Access"),
13791                   addr_size * 2, _("Initial"));
13792           while (ent < local_end)
13793             {
13794               ent = print_mips_got_entry (data, pltgot, ent);
13795               printf ("\n");
13796             }
13797           printf ("\n");
13798         }
13799
13800       if (gotsym < symtabno)
13801         {
13802           int sym_width;
13803
13804           printf (_(" Global entries:\n"));
13805           printf ("  %*s %10s %*s %*s %-7s %3s %s\n",
13806                   addr_size * 2, _("Address"),
13807                   _("Access"),
13808                   addr_size * 2, _("Initial"),
13809                   addr_size * 2, _("Sym.Val."),
13810                   _("Type"),
13811                   /* Note for translators: "Ndx" = abbreviated form of "Index".  */
13812                   _("Ndx"), _("Name"));
13813
13814           sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
13815
13816           for (i = gotsym; i < symtabno; i++)
13817             {
13818               ent = print_mips_got_entry (data, pltgot, ent);
13819               printf (" ");
13820
13821               if (dynamic_symbols == NULL)
13822                 printf (_("<no dynamic symbols>"));
13823               else if (i < num_dynamic_syms)
13824                 {
13825                   Elf_Internal_Sym * psym = dynamic_symbols + i;
13826
13827                   print_vma (psym->st_value, LONG_HEX);
13828                   printf (" %-7s %3s ",
13829                           get_symbol_type (ELF_ST_TYPE (psym->st_info)),
13830                           get_symbol_index_type (psym->st_shndx));
13831
13832                   if (VALID_DYNAMIC_NAME (psym->st_name))
13833                     print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
13834                   else
13835                     printf (_("<corrupt: %14ld>"), psym->st_name);
13836                 }
13837               else
13838                 printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
13839                         (unsigned long) i);
13840
13841               printf ("\n");
13842             }
13843           printf ("\n");
13844         }
13845
13846       if (data)
13847         free (data);
13848     }
13849
13850   if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
13851     {
13852       bfd_vma ent, end;
13853       size_t offset, rel_offset;
13854       unsigned long count, i;
13855       unsigned char * data;
13856       int addr_size, sym_width;
13857       Elf_Internal_Rela * rels;
13858
13859       rel_offset = offset_from_vma (file, jmprel, pltrelsz);
13860       if (pltrel == DT_RELA)
13861         {
13862           if (!slurp_rela_relocs (file, rel_offset, pltrelsz, &rels, &count))
13863             return 0;
13864         }
13865       else
13866         {
13867           if (!slurp_rel_relocs (file, rel_offset, pltrelsz, &rels, &count))
13868             return 0;
13869         }
13870
13871       ent = mips_pltgot;
13872       addr_size = (is_32bit_elf ? 4 : 8);
13873       end = mips_pltgot + (2 + count) * addr_size;
13874
13875       offset = offset_from_vma (file, mips_pltgot, end - mips_pltgot);
13876       data = (unsigned char *) get_data (NULL, file, offset, end - mips_pltgot,
13877                                          1, _("Procedure Linkage Table data"));
13878       if (data == NULL)
13879         return 0;
13880
13881       printf ("\nPLT GOT:\n\n");
13882       printf (_(" Reserved entries:\n"));
13883       printf (_("  %*s %*s Purpose\n"),
13884               addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
13885       ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
13886       printf (_(" PLT lazy resolver\n"));
13887       ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
13888       printf (_(" Module pointer\n"));
13889       printf ("\n");
13890
13891       printf (_(" Entries:\n"));
13892       printf ("  %*s %*s %*s %-7s %3s %s\n",
13893               addr_size * 2, _("Address"),
13894               addr_size * 2, _("Initial"),
13895               addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
13896       sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
13897       for (i = 0; i < count; i++)
13898         {
13899           unsigned long idx = get_reloc_symindex (rels[i].r_info);
13900
13901           ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
13902           printf (" ");
13903
13904           if (idx >= num_dynamic_syms)
13905             printf (_("<corrupt symbol index: %lu>"), idx);
13906           else
13907             {
13908               Elf_Internal_Sym * psym = dynamic_symbols + idx;
13909
13910               print_vma (psym->st_value, LONG_HEX);
13911               printf (" %-7s %3s ",
13912                       get_symbol_type (ELF_ST_TYPE (psym->st_info)),
13913                       get_symbol_index_type (psym->st_shndx));
13914               if (VALID_DYNAMIC_NAME (psym->st_name))
13915                 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
13916               else
13917                 printf (_("<corrupt: %14ld>"), psym->st_name);
13918             }
13919           printf ("\n");
13920         }
13921       printf ("\n");
13922
13923       if (data)
13924         free (data);
13925       free (rels);
13926     }
13927
13928   return 1;
13929 }
13930
13931 static int
13932 process_nds32_specific (FILE * file)
13933 {
13934   Elf_Internal_Shdr *sect = NULL;
13935
13936   sect = find_section (".nds32_e_flags");
13937   if (sect != NULL)
13938     {
13939       unsigned int *flag;
13940
13941       printf ("\nNDS32 elf flags section:\n");
13942       flag = get_data (NULL, file, sect->sh_offset, 1,
13943                        sect->sh_size, _("NDS32 elf flags section"));
13944
13945       switch ((*flag) & 0x3)
13946         {
13947         case 0:
13948           printf ("(VEC_SIZE):\tNo entry.\n");
13949           break;
13950         case 1:
13951           printf ("(VEC_SIZE):\t4 bytes\n");
13952           break;
13953         case 2:
13954           printf ("(VEC_SIZE):\t16 bytes\n");
13955           break;
13956         case 3:
13957           printf ("(VEC_SIZE):\treserved\n");
13958           break;
13959         }
13960     }
13961
13962   return TRUE;
13963 }
13964
13965 static int
13966 process_gnu_liblist (FILE * file)
13967 {
13968   Elf_Internal_Shdr * section;
13969   Elf_Internal_Shdr * string_sec;
13970   Elf32_External_Lib * elib;
13971   char * strtab;
13972   size_t strtab_size;
13973   size_t cnt;
13974   unsigned i;
13975
13976   if (! do_arch)
13977     return 0;
13978
13979   for (i = 0, section = section_headers;
13980        i < elf_header.e_shnum;
13981        i++, section++)
13982     {
13983       switch (section->sh_type)
13984         {
13985         case SHT_GNU_LIBLIST:
13986           if (section->sh_link >= elf_header.e_shnum)
13987             break;
13988
13989           elib = (Elf32_External_Lib *)
13990               get_data (NULL, file, section->sh_offset, 1, section->sh_size,
13991                         _("liblist section data"));
13992
13993           if (elib == NULL)
13994             break;
13995           string_sec = section_headers + section->sh_link;
13996
13997           strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
13998                                       string_sec->sh_size,
13999                                       _("liblist string table"));
14000           if (strtab == NULL
14001               || section->sh_entsize != sizeof (Elf32_External_Lib))
14002             {
14003               free (elib);
14004               free (strtab);
14005               break;
14006             }
14007           strtab_size = string_sec->sh_size;
14008
14009           printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
14010                   printable_section_name (section),
14011                   (unsigned long) (section->sh_size / sizeof (Elf32_External_Lib)));
14012
14013           puts (_("     Library              Time Stamp          Checksum   Version Flags"));
14014
14015           for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
14016                ++cnt)
14017             {
14018               Elf32_Lib liblist;
14019               time_t atime;
14020               char timebuf[20];
14021               struct tm * tmp;
14022
14023               liblist.l_name = BYTE_GET (elib[cnt].l_name);
14024               atime = BYTE_GET (elib[cnt].l_time_stamp);
14025               liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
14026               liblist.l_version = BYTE_GET (elib[cnt].l_version);
14027               liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
14028
14029               tmp = gmtime (&atime);
14030               snprintf (timebuf, sizeof (timebuf),
14031                         "%04u-%02u-%02uT%02u:%02u:%02u",
14032                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
14033                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
14034
14035               printf ("%3lu: ", (unsigned long) cnt);
14036               if (do_wide)
14037                 printf ("%-20s", liblist.l_name < strtab_size
14038                         ? strtab + liblist.l_name : _("<corrupt>"));
14039               else
14040                 printf ("%-20.20s", liblist.l_name < strtab_size
14041                         ? strtab + liblist.l_name : _("<corrupt>"));
14042               printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
14043                       liblist.l_version, liblist.l_flags);
14044             }
14045
14046           free (elib);
14047           free (strtab);
14048         }
14049     }
14050
14051   return 1;
14052 }
14053
14054 static const char *
14055 get_note_type (unsigned e_type)
14056 {
14057   static char buff[64];
14058
14059   if (elf_header.e_type == ET_CORE)
14060     switch (e_type)
14061       {
14062       case NT_AUXV:
14063         return _("NT_AUXV (auxiliary vector)");
14064       case NT_PRSTATUS:
14065         return _("NT_PRSTATUS (prstatus structure)");
14066       case NT_FPREGSET:
14067         return _("NT_FPREGSET (floating point registers)");
14068       case NT_PRPSINFO:
14069         return _("NT_PRPSINFO (prpsinfo structure)");
14070       case NT_TASKSTRUCT:
14071         return _("NT_TASKSTRUCT (task structure)");
14072       case NT_PRXFPREG:
14073         return _("NT_PRXFPREG (user_xfpregs structure)");
14074       case NT_PPC_VMX:
14075         return _("NT_PPC_VMX (ppc Altivec registers)");
14076       case NT_PPC_VSX:
14077         return _("NT_PPC_VSX (ppc VSX registers)");
14078       case NT_386_TLS:
14079         return _("NT_386_TLS (x86 TLS information)");
14080       case NT_386_IOPERM:
14081         return _("NT_386_IOPERM (x86 I/O permissions)");
14082       case NT_X86_XSTATE:
14083         return _("NT_X86_XSTATE (x86 XSAVE extended state)");
14084       case NT_S390_HIGH_GPRS:
14085         return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
14086       case NT_S390_TIMER:
14087         return _("NT_S390_TIMER (s390 timer register)");
14088       case NT_S390_TODCMP:
14089         return _("NT_S390_TODCMP (s390 TOD comparator register)");
14090       case NT_S390_TODPREG:
14091         return _("NT_S390_TODPREG (s390 TOD programmable register)");
14092       case NT_S390_CTRS:
14093         return _("NT_S390_CTRS (s390 control registers)");
14094       case NT_S390_PREFIX:
14095         return _("NT_S390_PREFIX (s390 prefix register)");
14096       case NT_S390_LAST_BREAK:
14097         return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
14098       case NT_S390_SYSTEM_CALL:
14099         return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
14100       case NT_S390_TDB:
14101         return _("NT_S390_TDB (s390 transaction diagnostic block)");
14102       case NT_ARM_VFP:
14103         return _("NT_ARM_VFP (arm VFP registers)");
14104       case NT_ARM_TLS:
14105         return _("NT_ARM_TLS (AArch TLS registers)");
14106       case NT_ARM_HW_BREAK:
14107         return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
14108       case NT_ARM_HW_WATCH:
14109         return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
14110       case NT_PSTATUS:
14111         return _("NT_PSTATUS (pstatus structure)");
14112       case NT_FPREGS:
14113         return _("NT_FPREGS (floating point registers)");
14114       case NT_PSINFO:
14115         return _("NT_PSINFO (psinfo structure)");
14116       case NT_LWPSTATUS:
14117         return _("NT_LWPSTATUS (lwpstatus_t structure)");
14118       case NT_LWPSINFO:
14119         return _("NT_LWPSINFO (lwpsinfo_t structure)");
14120       case NT_WIN32PSTATUS:
14121         return _("NT_WIN32PSTATUS (win32_pstatus structure)");
14122       case NT_SIGINFO:
14123         return _("NT_SIGINFO (siginfo_t data)");
14124       case NT_FILE:
14125         return _("NT_FILE (mapped files)");
14126       default:
14127         break;
14128       }
14129   else
14130     switch (e_type)
14131       {
14132       case NT_VERSION:
14133         return _("NT_VERSION (version)");
14134       case NT_ARCH:
14135         return _("NT_ARCH (architecture)");
14136       default:
14137         break;
14138       }
14139
14140   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
14141   return buff;
14142 }
14143
14144 static int
14145 print_core_note (Elf_Internal_Note *pnote)
14146 {
14147   unsigned int addr_size = is_32bit_elf ? 4 : 8;
14148   bfd_vma count, page_size;
14149   unsigned char *descdata, *filenames, *descend;
14150
14151   if (pnote->type != NT_FILE)
14152     return 1;
14153
14154 #ifndef BFD64
14155   if (!is_32bit_elf)
14156     {
14157       printf (_("    Cannot decode 64-bit note in 32-bit build\n"));
14158       /* Still "successful".  */
14159       return 1;
14160     }
14161 #endif
14162
14163   if (pnote->descsz < 2 * addr_size)
14164     {
14165       printf (_("    Malformed note - too short for header\n"));
14166       return 0;
14167     }
14168
14169   descdata = (unsigned char *) pnote->descdata;
14170   descend = descdata + pnote->descsz;
14171
14172   if (descdata[pnote->descsz - 1] != '\0')
14173     {
14174       printf (_("    Malformed note - does not end with \\0\n"));
14175       return 0;
14176     }
14177
14178   count = byte_get (descdata, addr_size);
14179   descdata += addr_size;
14180
14181   page_size = byte_get (descdata, addr_size);
14182   descdata += addr_size;
14183
14184   if (pnote->descsz < 2 * addr_size + count * 3 * addr_size)
14185     {
14186       printf (_("    Malformed note - too short for supplied file count\n"));
14187       return 0;
14188     }
14189
14190   printf (_("    Page size: "));
14191   print_vma (page_size, DEC);
14192   printf ("\n");
14193
14194   printf (_("    %*s%*s%*s\n"),
14195           (int) (2 + 2 * addr_size), _("Start"),
14196           (int) (4 + 2 * addr_size), _("End"),
14197           (int) (4 + 2 * addr_size), _("Page Offset"));
14198   filenames = descdata + count * 3 * addr_size;
14199   while (--count > 0)
14200     {
14201       bfd_vma start, end, file_ofs;
14202
14203       if (filenames == descend)
14204         {
14205           printf (_("    Malformed note - filenames end too early\n"));
14206           return 0;
14207         }
14208
14209       start = byte_get (descdata, addr_size);
14210       descdata += addr_size;
14211       end = byte_get (descdata, addr_size);
14212       descdata += addr_size;
14213       file_ofs = byte_get (descdata, addr_size);
14214       descdata += addr_size;
14215
14216       printf ("    ");
14217       print_vma (start, FULL_HEX);
14218       printf ("  ");
14219       print_vma (end, FULL_HEX);
14220       printf ("  ");
14221       print_vma (file_ofs, FULL_HEX);
14222       printf ("\n        %s\n", filenames);
14223
14224       filenames += 1 + strlen ((char *) filenames);
14225     }
14226
14227   return 1;
14228 }
14229
14230 static const char *
14231 get_gnu_elf_note_type (unsigned e_type)
14232 {
14233   static char buff[64];
14234
14235   switch (e_type)
14236     {
14237     case NT_GNU_ABI_TAG:
14238       return _("NT_GNU_ABI_TAG (ABI version tag)");
14239     case NT_GNU_HWCAP:
14240       return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
14241     case NT_GNU_BUILD_ID:
14242       return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
14243     case NT_GNU_GOLD_VERSION:
14244       return _("NT_GNU_GOLD_VERSION (gold version)");
14245     default:
14246       break;
14247     }
14248
14249   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
14250   return buff;
14251 }
14252
14253 static int
14254 print_gnu_note (Elf_Internal_Note *pnote)
14255 {
14256   switch (pnote->type)
14257     {
14258     case NT_GNU_BUILD_ID:
14259       {
14260         unsigned long i;
14261
14262         printf (_("    Build ID: "));
14263         for (i = 0; i < pnote->descsz; ++i)
14264           printf ("%02x", pnote->descdata[i] & 0xff);
14265         printf ("\n");
14266       }
14267       break;
14268
14269     case NT_GNU_ABI_TAG:
14270       {
14271         unsigned long os, major, minor, subminor;
14272         const char *osname;
14273
14274         /* PR 17531: file: 030-599401-0.004.  */
14275         if (pnote->descsz < 16)
14276           {
14277             printf (_("    <corrupt GNU_ABI_TAG>\n"));
14278             break;
14279           }
14280
14281         os = byte_get ((unsigned char *) pnote->descdata, 4);
14282         major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
14283         minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
14284         subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
14285
14286         switch (os)
14287           {
14288           case GNU_ABI_TAG_LINUX:
14289             osname = "Linux";
14290             break;
14291           case GNU_ABI_TAG_HURD:
14292             osname = "Hurd";
14293             break;
14294           case GNU_ABI_TAG_SOLARIS:
14295             osname = "Solaris";
14296             break;
14297           case GNU_ABI_TAG_FREEBSD:
14298             osname = "FreeBSD";
14299             break;
14300           case GNU_ABI_TAG_NETBSD:
14301             osname = "NetBSD";
14302             break;
14303           default:
14304             osname = "Unknown";
14305             break;
14306           }
14307
14308         printf (_("    OS: %s, ABI: %ld.%ld.%ld\n"), osname,
14309                 major, minor, subminor);
14310       }
14311       break;
14312
14313     case NT_GNU_GOLD_VERSION:
14314       {
14315         unsigned long i;
14316
14317         printf (_("    Version: "));
14318         for (i = 0; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
14319           printf ("%c", pnote->descdata[i]);
14320         printf ("\n");
14321       }
14322       break;
14323     }
14324
14325   return 1;
14326 }
14327
14328 static const char *
14329 get_netbsd_elfcore_note_type (unsigned e_type)
14330 {
14331   static char buff[64];
14332
14333   if (e_type == NT_NETBSDCORE_PROCINFO)
14334     {
14335       /* NetBSD core "procinfo" structure.  */
14336       return _("NetBSD procinfo structure");
14337     }
14338
14339   /* As of Jan 2002 there are no other machine-independent notes
14340      defined for NetBSD core files.  If the note type is less
14341      than the start of the machine-dependent note types, we don't
14342      understand it.  */
14343
14344   if (e_type < NT_NETBSDCORE_FIRSTMACH)
14345     {
14346       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
14347       return buff;
14348     }
14349
14350   switch (elf_header.e_machine)
14351     {
14352     /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
14353        and PT_GETFPREGS == mach+2.  */
14354
14355     case EM_OLD_ALPHA:
14356     case EM_ALPHA:
14357     case EM_SPARC:
14358     case EM_SPARC32PLUS:
14359     case EM_SPARCV9:
14360       switch (e_type)
14361         {
14362         case NT_NETBSDCORE_FIRSTMACH + 0:
14363           return _("PT_GETREGS (reg structure)");
14364         case NT_NETBSDCORE_FIRSTMACH + 2:
14365           return _("PT_GETFPREGS (fpreg structure)");
14366         default:
14367           break;
14368         }
14369       break;
14370
14371     /* On all other arch's, PT_GETREGS == mach+1 and
14372        PT_GETFPREGS == mach+3.  */
14373     default:
14374       switch (e_type)
14375         {
14376         case NT_NETBSDCORE_FIRSTMACH + 1:
14377           return _("PT_GETREGS (reg structure)");
14378         case NT_NETBSDCORE_FIRSTMACH + 3:
14379           return _("PT_GETFPREGS (fpreg structure)");
14380         default:
14381           break;
14382         }
14383     }
14384
14385   snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
14386             e_type - NT_NETBSDCORE_FIRSTMACH);
14387   return buff;
14388 }
14389
14390 static const char *
14391 get_stapsdt_note_type (unsigned e_type)
14392 {
14393   static char buff[64];
14394
14395   switch (e_type)
14396     {
14397     case NT_STAPSDT:
14398       return _("NT_STAPSDT (SystemTap probe descriptors)");
14399
14400     default:
14401       break;
14402     }
14403
14404   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
14405   return buff;
14406 }
14407
14408 static int
14409 print_stapsdt_note (Elf_Internal_Note *pnote)
14410 {
14411   int addr_size = is_32bit_elf ? 4 : 8;
14412   char *data = pnote->descdata;
14413   char *data_end = pnote->descdata + pnote->descsz;
14414   bfd_vma pc, base_addr, semaphore;
14415   char *provider, *probe, *arg_fmt;
14416
14417   pc = byte_get ((unsigned char *) data, addr_size);
14418   data += addr_size;
14419   base_addr = byte_get ((unsigned char *) data, addr_size);
14420   data += addr_size;
14421   semaphore = byte_get ((unsigned char *) data, addr_size);
14422   data += addr_size;
14423
14424   provider = data;
14425   data += strlen (data) + 1;
14426   probe = data;
14427   data += strlen (data) + 1;
14428   arg_fmt = data;
14429   data += strlen (data) + 1;
14430
14431   printf (_("    Provider: %s\n"), provider);
14432   printf (_("    Name: %s\n"), probe);
14433   printf (_("    Location: "));
14434   print_vma (pc, FULL_HEX);
14435   printf (_(", Base: "));
14436   print_vma (base_addr, FULL_HEX);
14437   printf (_(", Semaphore: "));
14438   print_vma (semaphore, FULL_HEX);
14439   printf ("\n");
14440   printf (_("    Arguments: %s\n"), arg_fmt);
14441
14442   return data == data_end;
14443 }
14444
14445 static const char *
14446 get_ia64_vms_note_type (unsigned e_type)
14447 {
14448   static char buff[64];
14449
14450   switch (e_type)
14451     {
14452     case NT_VMS_MHD:
14453       return _("NT_VMS_MHD (module header)");
14454     case NT_VMS_LNM:
14455       return _("NT_VMS_LNM (language name)");
14456     case NT_VMS_SRC:
14457       return _("NT_VMS_SRC (source files)");
14458     case NT_VMS_TITLE:
14459       return "NT_VMS_TITLE";
14460     case NT_VMS_EIDC:
14461       return _("NT_VMS_EIDC (consistency check)");
14462     case NT_VMS_FPMODE:
14463       return _("NT_VMS_FPMODE (FP mode)");
14464     case NT_VMS_LINKTIME:
14465       return "NT_VMS_LINKTIME";
14466     case NT_VMS_IMGNAM:
14467       return _("NT_VMS_IMGNAM (image name)");
14468     case NT_VMS_IMGID:
14469       return _("NT_VMS_IMGID (image id)");
14470     case NT_VMS_LINKID:
14471       return _("NT_VMS_LINKID (link id)");
14472     case NT_VMS_IMGBID:
14473       return _("NT_VMS_IMGBID (build id)");
14474     case NT_VMS_GSTNAM:
14475       return _("NT_VMS_GSTNAM (sym table name)");
14476     case NT_VMS_ORIG_DYN:
14477       return "NT_VMS_ORIG_DYN";
14478     case NT_VMS_PATCHTIME:
14479       return "NT_VMS_PATCHTIME";
14480     default:
14481       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
14482       return buff;
14483     }
14484 }
14485
14486 static int
14487 print_ia64_vms_note (Elf_Internal_Note * pnote)
14488 {
14489   switch (pnote->type)
14490     {
14491     case NT_VMS_MHD:
14492       if (pnote->descsz > 36)
14493         {
14494           size_t l = strlen (pnote->descdata + 34);
14495           printf (_("    Creation date  : %.17s\n"), pnote->descdata);
14496           printf (_("    Last patch date: %.17s\n"), pnote->descdata + 17);
14497           printf (_("    Module name    : %s\n"), pnote->descdata + 34);
14498           printf (_("    Module version : %s\n"), pnote->descdata + 34 + l + 1);
14499         }
14500       else
14501         printf (_("    Invalid size\n"));
14502       break;
14503     case NT_VMS_LNM:
14504       printf (_("   Language: %s\n"), pnote->descdata);
14505       break;
14506 #ifdef BFD64
14507     case NT_VMS_FPMODE:
14508       printf (_("   Floating Point mode: "));
14509       printf ("0x%016" BFD_VMA_FMT "x\n",
14510               (bfd_vma)byte_get ((unsigned char *)pnote->descdata, 8));
14511       break;
14512     case NT_VMS_LINKTIME:
14513       printf (_("   Link time: "));
14514       print_vms_time
14515         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
14516       printf ("\n");
14517       break;
14518     case NT_VMS_PATCHTIME:
14519       printf (_("   Patch time: "));
14520       print_vms_time
14521         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
14522       printf ("\n");
14523       break;
14524     case NT_VMS_ORIG_DYN:
14525       printf (_("   Major id: %u,  minor id: %u\n"),
14526               (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
14527               (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
14528       printf (_("   Last modified  : "));
14529       print_vms_time
14530         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
14531       printf (_("\n   Link flags  : "));
14532       printf ("0x%016" BFD_VMA_FMT "x\n",
14533               (bfd_vma)byte_get ((unsigned char *)pnote->descdata + 16, 8));
14534       printf (_("   Header flags: 0x%08x\n"),
14535               (unsigned)byte_get ((unsigned char *)pnote->descdata + 24, 4));
14536       printf (_("   Image id    : %s\n"), pnote->descdata + 32);
14537       break;
14538 #endif
14539     case NT_VMS_IMGNAM:
14540       printf (_("    Image name: %s\n"), pnote->descdata);
14541       break;
14542     case NT_VMS_GSTNAM:
14543       printf (_("    Global symbol table name: %s\n"), pnote->descdata);
14544       break;
14545     case NT_VMS_IMGID:
14546       printf (_("    Image id: %s\n"), pnote->descdata);
14547       break;
14548     case NT_VMS_LINKID:
14549       printf (_("    Linker id: %s\n"), pnote->descdata);
14550       break;
14551     default:
14552       break;
14553     }
14554   return 1;
14555 }
14556
14557 /* Note that by the ELF standard, the name field is already null byte
14558    terminated, and namesz includes the terminating null byte.
14559    I.E. the value of namesz for the name "FSF" is 4.
14560
14561    If the value of namesz is zero, there is no name present.  */
14562 static int
14563 process_note (Elf_Internal_Note * pnote)
14564 {
14565   const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
14566   const char * nt;
14567
14568   if (pnote->namesz == 0)
14569     /* If there is no note name, then use the default set of
14570        note type strings.  */
14571     nt = get_note_type (pnote->type);
14572
14573   else if (const_strneq (pnote->namedata, "GNU"))
14574     /* GNU-specific object file notes.  */
14575     nt = get_gnu_elf_note_type (pnote->type);
14576
14577   else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
14578     /* NetBSD-specific core file notes.  */
14579     nt = get_netbsd_elfcore_note_type (pnote->type);
14580
14581   else if (strneq (pnote->namedata, "SPU/", 4))
14582     {
14583       /* SPU-specific core file notes.  */
14584       nt = pnote->namedata + 4;
14585       name = "SPU";
14586     }
14587
14588   else if (const_strneq (pnote->namedata, "IPF/VMS"))
14589     /* VMS/ia64-specific file notes.  */
14590     nt = get_ia64_vms_note_type (pnote->type);
14591
14592   else if (const_strneq (pnote->namedata, "stapsdt"))
14593     nt = get_stapsdt_note_type (pnote->type);
14594
14595   else
14596     /* Don't recognize this note name; just use the default set of
14597        note type strings.  */
14598     nt = get_note_type (pnote->type);
14599
14600   printf ("  %-20s 0x%08lx\t%s\n", name, pnote->descsz, nt);
14601
14602   if (const_strneq (pnote->namedata, "IPF/VMS"))
14603     return print_ia64_vms_note (pnote);
14604   else if (const_strneq (pnote->namedata, "GNU"))
14605     return print_gnu_note (pnote);
14606   else if (const_strneq (pnote->namedata, "stapsdt"))
14607     return print_stapsdt_note (pnote);
14608   else if (const_strneq (pnote->namedata, "CORE"))
14609     return print_core_note (pnote);
14610   else
14611     return 1;
14612 }
14613
14614
14615 static int
14616 process_corefile_note_segment (FILE * file, bfd_vma offset, bfd_vma length)
14617 {
14618   Elf_External_Note * pnotes;
14619   Elf_External_Note * external;
14620   int res = 1;
14621
14622   if (length <= 0)
14623     return 0;
14624
14625   pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
14626                                            _("notes"));
14627   if (pnotes == NULL)
14628     return 0;
14629
14630   external = pnotes;
14631
14632   printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
14633           (unsigned long) offset, (unsigned long) length);
14634   printf (_("  %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
14635
14636   while ((char *) external < (char *) pnotes + length)
14637     {
14638       Elf_Internal_Note inote;
14639       size_t min_notesz;
14640       char *next;
14641       char * temp = NULL;
14642       size_t data_remaining = ((char *) pnotes + length) - (char *) external;
14643
14644       if (!is_ia64_vms ())
14645         {
14646           /* PR binutils/15191
14647              Make sure that there is enough data to read.  */
14648           min_notesz = offsetof (Elf_External_Note, name);
14649           if (data_remaining < min_notesz)
14650             {
14651               warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
14652                     (int) data_remaining);
14653               break;
14654             }
14655           inote.type     = BYTE_GET (external->type);
14656           inote.namesz   = BYTE_GET (external->namesz);
14657           inote.namedata = external->name;
14658           inote.descsz   = BYTE_GET (external->descsz);
14659           inote.descdata = inote.namedata + align_power (inote.namesz, 2);
14660           inote.descpos  = offset + (inote.descdata - (char *) pnotes);
14661           next = inote.descdata + align_power (inote.descsz, 2);
14662         }
14663       else
14664         {
14665           Elf64_External_VMS_Note *vms_external;
14666
14667           /* PR binutils/15191
14668              Make sure that there is enough data to read.  */
14669           min_notesz = offsetof (Elf64_External_VMS_Note, name);
14670           if (data_remaining < min_notesz)
14671             {
14672               warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
14673                     (int) data_remaining);
14674               break;
14675             }
14676
14677           vms_external = (Elf64_External_VMS_Note *) external;
14678           inote.type     = BYTE_GET (vms_external->type);
14679           inote.namesz   = BYTE_GET (vms_external->namesz);
14680           inote.namedata = vms_external->name;
14681           inote.descsz   = BYTE_GET (vms_external->descsz);
14682           inote.descdata = inote.namedata + align_power (inote.namesz, 3);
14683           inote.descpos  = offset + (inote.descdata - (char *) pnotes);
14684           next = inote.descdata + align_power (inote.descsz, 3);
14685         }
14686
14687       if (inote.descdata < (char *) external + min_notesz
14688           || next < (char *) external + min_notesz
14689           || data_remaining < (size_t)(next - (char *) external))
14690         {
14691           warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
14692                 (unsigned long) ((char *) external - (char *) pnotes));
14693           warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx\n"),
14694                 inote.type, inote.namesz, inote.descsz);
14695           break;
14696         }
14697
14698       external = (Elf_External_Note *) next;
14699
14700       /* Verify that name is null terminated.  It appears that at least
14701          one version of Linux (RedHat 6.0) generates corefiles that don't
14702          comply with the ELF spec by failing to include the null byte in
14703          namesz.  */
14704       if (inote.namedata[inote.namesz - 1] != '\0')
14705         {
14706           temp = (char *) malloc (inote.namesz + 1);
14707
14708           if (temp == NULL)
14709             {
14710               error (_("Out of memory allocating space for inote name\n"));
14711               res = 0;
14712               break;
14713             }
14714
14715           strncpy (temp, inote.namedata, inote.namesz);
14716           temp[inote.namesz] = 0;
14717
14718           /* warn (_("'%s' NOTE name not properly null terminated\n"), temp);  */
14719           inote.namedata = temp;
14720         }
14721
14722       res &= process_note (& inote);
14723
14724       if (temp != NULL)
14725         {
14726           free (temp);
14727           temp = NULL;
14728         }
14729     }
14730
14731   free (pnotes);
14732
14733   return res;
14734 }
14735
14736 static int
14737 process_corefile_note_segments (FILE * file)
14738 {
14739   Elf_Internal_Phdr * segment;
14740   unsigned int i;
14741   int res = 1;
14742
14743   if (! get_program_headers (file))
14744       return 0;
14745
14746   for (i = 0, segment = program_headers;
14747        i < elf_header.e_phnum;
14748        i++, segment++)
14749     {
14750       if (segment->p_type == PT_NOTE)
14751         res &= process_corefile_note_segment (file,
14752                                               (bfd_vma) segment->p_offset,
14753                                               (bfd_vma) segment->p_filesz);
14754     }
14755
14756   return res;
14757 }
14758
14759 static int
14760 process_note_sections (FILE * file)
14761 {
14762   Elf_Internal_Shdr * section;
14763   unsigned long i;
14764   int n = 0;
14765   int res = 1;
14766
14767   for (i = 0, section = section_headers;
14768        i < elf_header.e_shnum && section != NULL;
14769        i++, section++)
14770     if (section->sh_type == SHT_NOTE)
14771       {
14772         res &= process_corefile_note_segment (file,
14773                                               (bfd_vma) section->sh_offset,
14774                                               (bfd_vma) section->sh_size);
14775         n++;
14776       }
14777
14778   if (n == 0)
14779     /* Try processing NOTE segments instead.  */
14780     return process_corefile_note_segments (file);
14781
14782   return res;
14783 }
14784
14785 static int
14786 process_notes (FILE * file)
14787 {
14788   /* If we have not been asked to display the notes then do nothing.  */
14789   if (! do_notes)
14790     return 1;
14791
14792   if (elf_header.e_type != ET_CORE)
14793     return process_note_sections (file);
14794
14795   /* No program headers means no NOTE segment.  */
14796   if (elf_header.e_phnum > 0)
14797     return process_corefile_note_segments (file);
14798
14799   printf (_("No note segments present in the core file.\n"));
14800   return 1;
14801 }
14802
14803 static int
14804 process_arch_specific (FILE * file)
14805 {
14806   if (! do_arch)
14807     return 1;
14808
14809   switch (elf_header.e_machine)
14810     {
14811     case EM_ARM:
14812       return process_arm_specific (file);
14813     case EM_MIPS:
14814     case EM_MIPS_RS3_LE:
14815       return process_mips_specific (file);
14816       break;
14817     case EM_NDS32:
14818       return process_nds32_specific (file);
14819       break;
14820     case EM_PPC:
14821       return process_power_specific (file);
14822       break;
14823     case EM_SPARC:
14824     case EM_SPARC32PLUS:
14825     case EM_SPARCV9:
14826       return process_sparc_specific (file);
14827       break;
14828     case EM_TI_C6000:
14829       return process_tic6x_specific (file);
14830       break;
14831     case EM_MSP430:
14832       return process_msp430x_specific (file);
14833     default:
14834       break;
14835     }
14836   return 1;
14837 }
14838
14839 static int
14840 get_file_header (FILE * file)
14841 {
14842   /* Read in the identity array.  */
14843   if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
14844     return 0;
14845
14846   /* Determine how to read the rest of the header.  */
14847   switch (elf_header.e_ident[EI_DATA])
14848     {
14849     default: /* fall through */
14850     case ELFDATANONE: /* fall through */
14851     case ELFDATA2LSB:
14852       byte_get = byte_get_little_endian;
14853       byte_put = byte_put_little_endian;
14854       break;
14855     case ELFDATA2MSB:
14856       byte_get = byte_get_big_endian;
14857       byte_put = byte_put_big_endian;
14858       break;
14859     }
14860
14861   /* For now we only support 32 bit and 64 bit ELF files.  */
14862   is_32bit_elf = (elf_header.e_ident[EI_CLASS] != ELFCLASS64);
14863
14864   /* Read in the rest of the header.  */
14865   if (is_32bit_elf)
14866     {
14867       Elf32_External_Ehdr ehdr32;
14868
14869       if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
14870         return 0;
14871
14872       elf_header.e_type      = BYTE_GET (ehdr32.e_type);
14873       elf_header.e_machine   = BYTE_GET (ehdr32.e_machine);
14874       elf_header.e_version   = BYTE_GET (ehdr32.e_version);
14875       elf_header.e_entry     = BYTE_GET (ehdr32.e_entry);
14876       elf_header.e_phoff     = BYTE_GET (ehdr32.e_phoff);
14877       elf_header.e_shoff     = BYTE_GET (ehdr32.e_shoff);
14878       elf_header.e_flags     = BYTE_GET (ehdr32.e_flags);
14879       elf_header.e_ehsize    = BYTE_GET (ehdr32.e_ehsize);
14880       elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
14881       elf_header.e_phnum     = BYTE_GET (ehdr32.e_phnum);
14882       elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
14883       elf_header.e_shnum     = BYTE_GET (ehdr32.e_shnum);
14884       elf_header.e_shstrndx  = BYTE_GET (ehdr32.e_shstrndx);
14885     }
14886   else
14887     {
14888       Elf64_External_Ehdr ehdr64;
14889
14890       /* If we have been compiled with sizeof (bfd_vma) == 4, then
14891          we will not be able to cope with the 64bit data found in
14892          64 ELF files.  Detect this now and abort before we start
14893          overwriting things.  */
14894       if (sizeof (bfd_vma) < 8)
14895         {
14896           error (_("This instance of readelf has been built without support for a\n\
14897 64 bit data type and so it cannot read 64 bit ELF files.\n"));
14898           return 0;
14899         }
14900
14901       if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
14902         return 0;
14903
14904       elf_header.e_type      = BYTE_GET (ehdr64.e_type);
14905       elf_header.e_machine   = BYTE_GET (ehdr64.e_machine);
14906       elf_header.e_version   = BYTE_GET (ehdr64.e_version);
14907       elf_header.e_entry     = BYTE_GET (ehdr64.e_entry);
14908       elf_header.e_phoff     = BYTE_GET (ehdr64.e_phoff);
14909       elf_header.e_shoff     = BYTE_GET (ehdr64.e_shoff);
14910       elf_header.e_flags     = BYTE_GET (ehdr64.e_flags);
14911       elf_header.e_ehsize    = BYTE_GET (ehdr64.e_ehsize);
14912       elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
14913       elf_header.e_phnum     = BYTE_GET (ehdr64.e_phnum);
14914       elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
14915       elf_header.e_shnum     = BYTE_GET (ehdr64.e_shnum);
14916       elf_header.e_shstrndx  = BYTE_GET (ehdr64.e_shstrndx);
14917     }
14918
14919   if (elf_header.e_shoff)
14920     {
14921       /* There may be some extensions in the first section header.  Don't
14922          bomb if we can't read it.  */
14923       if (is_32bit_elf)
14924         get_32bit_section_headers (file, TRUE);
14925       else
14926         get_64bit_section_headers (file, TRUE);
14927     }
14928
14929   return 1;
14930 }
14931
14932 /* Process one ELF object file according to the command line options.
14933    This file may actually be stored in an archive.  The file is
14934    positioned at the start of the ELF object.  */
14935
14936 static int
14937 process_object (char * file_name, FILE * file)
14938 {
14939   unsigned int i;
14940
14941   if (! get_file_header (file))
14942     {
14943       error (_("%s: Failed to read file header\n"), file_name);
14944       return 1;
14945     }
14946
14947   /* Initialise per file variables.  */
14948   for (i = ARRAY_SIZE (version_info); i--;)
14949     version_info[i] = 0;
14950
14951   for (i = ARRAY_SIZE (dynamic_info); i--;)
14952     dynamic_info[i] = 0;
14953   dynamic_info_DT_GNU_HASH = 0;
14954
14955   /* Process the file.  */
14956   if (show_name)
14957     printf (_("\nFile: %s\n"), file_name);
14958
14959   /* Initialise the dump_sects array from the cmdline_dump_sects array.
14960      Note we do this even if cmdline_dump_sects is empty because we
14961      must make sure that the dump_sets array is zeroed out before each
14962      object file is processed.  */
14963   if (num_dump_sects > num_cmdline_dump_sects)
14964     memset (dump_sects, 0, num_dump_sects * sizeof (* dump_sects));
14965
14966   if (num_cmdline_dump_sects > 0)
14967     {
14968       if (num_dump_sects == 0)
14969         /* A sneaky way of allocating the dump_sects array.  */
14970         request_dump_bynumber (num_cmdline_dump_sects, 0);
14971
14972       assert (num_dump_sects >= num_cmdline_dump_sects);
14973       memcpy (dump_sects, cmdline_dump_sects,
14974               num_cmdline_dump_sects * sizeof (* dump_sects));
14975     }
14976
14977   if (! process_file_header ())
14978     return 1;
14979
14980   if (! process_section_headers (file))
14981     {
14982       /* Without loaded section headers we cannot process lots of
14983          things.  */
14984       do_unwind = do_version = do_dump = do_arch = 0;
14985
14986       if (! do_using_dynamic)
14987         do_syms = do_dyn_syms = do_reloc = 0;
14988     }
14989
14990   if (! process_section_groups (file))
14991     {
14992       /* Without loaded section groups we cannot process unwind.  */
14993       do_unwind = 0;
14994     }
14995
14996   if (process_program_headers (file))
14997     process_dynamic_section (file);
14998
14999   process_relocs (file);
15000
15001   process_unwind (file);
15002
15003   process_symbol_table (file);
15004
15005   process_syminfo (file);
15006
15007   process_version_sections (file);
15008
15009   process_section_contents (file);
15010
15011   process_notes (file);
15012
15013   process_gnu_liblist (file);
15014
15015   process_arch_specific (file);
15016
15017   if (program_headers)
15018     {
15019       free (program_headers);
15020       program_headers = NULL;
15021     }
15022
15023   if (section_headers)
15024     {
15025       free (section_headers);
15026       section_headers = NULL;
15027     }
15028
15029   if (string_table)
15030     {
15031       free (string_table);
15032       string_table = NULL;
15033       string_table_length = 0;
15034     }
15035
15036   if (dynamic_strings)
15037     {
15038       free (dynamic_strings);
15039       dynamic_strings = NULL;
15040       dynamic_strings_length = 0;
15041     }
15042
15043   if (dynamic_symbols)
15044     {
15045       free (dynamic_symbols);
15046       dynamic_symbols = NULL;
15047       num_dynamic_syms = 0;
15048     }
15049
15050   if (dynamic_syminfo)
15051     {
15052       free (dynamic_syminfo);
15053       dynamic_syminfo = NULL;
15054     }
15055
15056   if (dynamic_section)
15057     {
15058       free (dynamic_section);
15059       dynamic_section = NULL;
15060     }
15061
15062   if (section_headers_groups)
15063     {
15064       free (section_headers_groups);
15065       section_headers_groups = NULL;
15066     }
15067
15068   if (section_groups)
15069     {
15070       struct group_list * g;
15071       struct group_list * next;
15072
15073       for (i = 0; i < group_count; i++)
15074         {
15075           for (g = section_groups [i].root; g != NULL; g = next)
15076             {
15077               next = g->next;
15078               free (g);
15079             }
15080         }
15081
15082       free (section_groups);
15083       section_groups = NULL;
15084     }
15085
15086   free_debug_memory ();
15087
15088   return 0;
15089 }
15090
15091 /* Process an ELF archive.
15092    On entry the file is positioned just after the ARMAG string.  */
15093
15094 static int
15095 process_archive (char * file_name, FILE * file, bfd_boolean is_thin_archive)
15096 {
15097   struct archive_info arch;
15098   struct archive_info nested_arch;
15099   size_t got;
15100   int ret;
15101
15102   show_name = 1;
15103
15104   /* The ARCH structure is used to hold information about this archive.  */
15105   arch.file_name = NULL;
15106   arch.file = NULL;
15107   arch.index_array = NULL;
15108   arch.sym_table = NULL;
15109   arch.longnames = NULL;
15110
15111   /* The NESTED_ARCH structure is used as a single-item cache of information
15112      about a nested archive (when members of a thin archive reside within
15113      another regular archive file).  */
15114   nested_arch.file_name = NULL;
15115   nested_arch.file = NULL;
15116   nested_arch.index_array = NULL;
15117   nested_arch.sym_table = NULL;
15118   nested_arch.longnames = NULL;
15119
15120   if (setup_archive (&arch, file_name, file, is_thin_archive, do_archive_index) != 0)
15121     {
15122       ret = 1;
15123       goto out;
15124     }
15125
15126   if (do_archive_index)
15127     {
15128       if (arch.sym_table == NULL)
15129         error (_("%s: unable to dump the index as none was found\n"), file_name);
15130       else
15131         {
15132           unsigned int i, l;
15133           unsigned long current_pos;
15134
15135           printf (_("Index of archive %s: (%ld entries, 0x%lx bytes in the symbol table)\n"),
15136                   file_name, (long) arch.index_num, arch.sym_size);
15137           current_pos = ftell (file);
15138
15139           for (i = l = 0; i < arch.index_num; i++)
15140             {
15141               if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
15142                 {
15143                   char * member_name;
15144
15145                   member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
15146
15147                   if (member_name != NULL)
15148                     {
15149                       char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
15150
15151                       if (qualified_name != NULL)
15152                         {
15153                           printf (_("Contents of binary %s at offset "), qualified_name);
15154                           (void) print_vma (arch.index_array[i], PREFIX_HEX);
15155                           putchar ('\n');
15156                           free (qualified_name);
15157                         }
15158                     }
15159                 }
15160
15161               if (l >= arch.sym_size)
15162                 {
15163                   error (_("%s: end of the symbol table reached before the end of the index\n"),
15164                          file_name);
15165                   break;
15166                 }
15167               printf ("\t%s\n", arch.sym_table + l);
15168               l += strlen (arch.sym_table + l) + 1;
15169             }
15170
15171           if (arch.uses_64bit_indicies)
15172             l = (l + 7) & ~ 7;
15173           else
15174             l += l & 1;
15175
15176           if (l < arch.sym_size)
15177             error (_("%s: %ld bytes remain in the symbol table, but without corresponding entries in the index table\n"),
15178                    file_name, arch.sym_size - l);
15179
15180           if (fseek (file, current_pos, SEEK_SET) != 0)
15181             {
15182               error (_("%s: failed to seek back to start of object files in the archive\n"), file_name);
15183               ret = 1;
15184               goto out;
15185             }
15186         }
15187
15188       if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
15189           && !do_segments && !do_header && !do_dump && !do_version
15190           && !do_histogram && !do_debugging && !do_arch && !do_notes
15191           && !do_section_groups && !do_dyn_syms)
15192         {
15193           ret = 0; /* Archive index only.  */
15194           goto out;
15195         }
15196     }
15197
15198   ret = 0;
15199
15200   while (1)
15201     {
15202       char * name;
15203       size_t namelen;
15204       char * qualified_name;
15205
15206       /* Read the next archive header.  */
15207       if (fseek (file, arch.next_arhdr_offset, SEEK_SET) != 0)
15208         {
15209           error (_("%s: failed to seek to next archive header\n"), file_name);
15210           return 1;
15211         }
15212       got = fread (&arch.arhdr, 1, sizeof arch.arhdr, file);
15213       if (got != sizeof arch.arhdr)
15214         {
15215           if (got == 0)
15216             break;
15217           error (_("%s: failed to read archive header\n"), file_name);
15218           ret = 1;
15219           break;
15220         }
15221       if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
15222         {
15223           error (_("%s: did not find a valid archive header\n"), arch.file_name);
15224           ret = 1;
15225           break;
15226         }
15227
15228       arch.next_arhdr_offset += sizeof arch.arhdr;
15229
15230       archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
15231       if (archive_file_size & 01)
15232         ++archive_file_size;
15233
15234       name = get_archive_member_name (&arch, &nested_arch);
15235       if (name == NULL)
15236         {
15237           error (_("%s: bad archive file name\n"), file_name);
15238           ret = 1;
15239           break;
15240         }
15241       namelen = strlen (name);
15242
15243       qualified_name = make_qualified_name (&arch, &nested_arch, name);
15244       if (qualified_name == NULL)
15245         {
15246           error (_("%s: bad archive file name\n"), file_name);
15247           ret = 1;
15248           break;
15249         }
15250
15251       if (is_thin_archive && arch.nested_member_origin == 0)
15252         {
15253           /* This is a proxy for an external member of a thin archive.  */
15254           FILE * member_file;
15255           char * member_file_name = adjust_relative_path (file_name, name, namelen);
15256           if (member_file_name == NULL)
15257             {
15258               ret = 1;
15259               break;
15260             }
15261
15262           member_file = fopen (member_file_name, "rb");
15263           if (member_file == NULL)
15264             {
15265               error (_("Input file '%s' is not readable.\n"), member_file_name);
15266               free (member_file_name);
15267               ret = 1;
15268               break;
15269             }
15270
15271           archive_file_offset = arch.nested_member_origin;
15272
15273           ret |= process_object (qualified_name, member_file);
15274
15275           fclose (member_file);
15276           free (member_file_name);
15277         }
15278       else if (is_thin_archive)
15279         {
15280           /* PR 15140: Allow for corrupt thin archives.  */
15281           if (nested_arch.file == NULL)
15282             {
15283               error (_("%s: contains corrupt thin archive: %s\n"),
15284                      file_name, name);
15285               ret = 1;
15286               break;
15287             }
15288
15289           /* This is a proxy for a member of a nested archive.  */
15290           archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
15291
15292           /* The nested archive file will have been opened and setup by
15293              get_archive_member_name.  */
15294           if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
15295             {
15296               error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
15297               ret = 1;
15298               break;
15299             }
15300
15301           ret |= process_object (qualified_name, nested_arch.file);
15302         }
15303       else
15304         {
15305           archive_file_offset = arch.next_arhdr_offset;
15306           arch.next_arhdr_offset += archive_file_size;
15307
15308           ret |= process_object (qualified_name, file);
15309         }
15310
15311       if (dump_sects != NULL)
15312         {
15313           free (dump_sects);
15314           dump_sects = NULL;
15315           num_dump_sects = 0;
15316         }
15317
15318       free (qualified_name);
15319     }
15320
15321  out:
15322   if (nested_arch.file != NULL)
15323     fclose (nested_arch.file);
15324   release_archive (&nested_arch);
15325   release_archive (&arch);
15326
15327   return ret;
15328 }
15329
15330 static int
15331 process_file (char * file_name)
15332 {
15333   FILE * file;
15334   struct stat statbuf;
15335   char armag[SARMAG];
15336   int ret;
15337
15338   if (stat (file_name, &statbuf) < 0)
15339     {
15340       if (errno == ENOENT)
15341         error (_("'%s': No such file\n"), file_name);
15342       else
15343         error (_("Could not locate '%s'.  System error message: %s\n"),
15344                file_name, strerror (errno));
15345       return 1;
15346     }
15347
15348   if (! S_ISREG (statbuf.st_mode))
15349     {
15350       error (_("'%s' is not an ordinary file\n"), file_name);
15351       return 1;
15352     }
15353
15354   file = fopen (file_name, "rb");
15355   if (file == NULL)
15356     {
15357       error (_("Input file '%s' is not readable.\n"), file_name);
15358       return 1;
15359     }
15360
15361   if (fread (armag, SARMAG, 1, file) != 1)
15362     {
15363       error (_("%s: Failed to read file's magic number\n"), file_name);
15364       fclose (file);
15365       return 1;
15366     }
15367
15368   current_file_size = (bfd_size_type) statbuf.st_size;
15369
15370   if (memcmp (armag, ARMAG, SARMAG) == 0)
15371     ret = process_archive (file_name, file, FALSE);
15372   else if (memcmp (armag, ARMAGT, SARMAG) == 0)
15373     ret = process_archive (file_name, file, TRUE);
15374   else
15375     {
15376       if (do_archive_index)
15377         error (_("File %s is not an archive so its index cannot be displayed.\n"),
15378                file_name);
15379
15380       rewind (file);
15381       archive_file_size = archive_file_offset = 0;
15382       ret = process_object (file_name, file);
15383     }
15384
15385   fclose (file);
15386
15387   current_file_size = 0;
15388   return ret;
15389 }
15390
15391 #ifdef SUPPORT_DISASSEMBLY
15392 /* Needed by the i386 disassembler.  For extra credit, someone could
15393    fix this so that we insert symbolic addresses here, esp for GOT/PLT
15394    symbols.  */
15395
15396 void
15397 print_address (unsigned int addr, FILE * outfile)
15398 {
15399   fprintf (outfile,"0x%8.8x", addr);
15400 }
15401
15402 /* Needed by the i386 disassembler.  */
15403 void
15404 db_task_printsym (unsigned int addr)
15405 {
15406   print_address (addr, stderr);
15407 }
15408 #endif
15409
15410 int
15411 main (int argc, char ** argv)
15412 {
15413   int err;
15414
15415 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
15416   setlocale (LC_MESSAGES, "");
15417 #endif
15418 #if defined (HAVE_SETLOCALE)
15419   setlocale (LC_CTYPE, "");
15420 #endif
15421   bindtextdomain (PACKAGE, LOCALEDIR);
15422   textdomain (PACKAGE);
15423
15424   expandargv (&argc, &argv);
15425
15426   parse_args (argc, argv);
15427
15428   if (num_dump_sects > 0)
15429     {
15430       /* Make a copy of the dump_sects array.  */
15431       cmdline_dump_sects = (dump_type *)
15432           malloc (num_dump_sects * sizeof (* dump_sects));
15433       if (cmdline_dump_sects == NULL)
15434         error (_("Out of memory allocating dump request table.\n"));
15435       else
15436         {
15437           memcpy (cmdline_dump_sects, dump_sects,
15438                   num_dump_sects * sizeof (* dump_sects));
15439           num_cmdline_dump_sects = num_dump_sects;
15440         }
15441     }
15442
15443   if (optind < (argc - 1))
15444     show_name = 1;
15445
15446   err = 0;
15447   while (optind < argc)
15448     err |= process_file (argv[optind++]);
15449
15450   if (dump_sects != NULL)
15451     free (dump_sects);
15452   if (cmdline_dump_sects != NULL)
15453     free (cmdline_dump_sects);
15454
15455   return err;
15456 }