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