Add support for MIPS R6.
[platform/upstream/binutils.git] / binutils / readelf.c
1 /* readelf.c -- display contents of an ELF format file
2    Copyright (C) 1998-2014 Free Software Foundation, Inc.
3
4    Originally developed by Eric Youngdale <eric@andante.jic.com>
5    Modifications by Nick Clifton <nickc@redhat.com>
6
7    This file is part of GNU Binutils.
8
9    This program is free software; you can redistribute it and/or modify
10    it under the terms of the GNU General Public License as published by
11    the Free Software Foundation; either version 3 of the License, or
12    (at your option) any later version.
13
14    This program is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17    GNU General Public License for more details.
18
19    You should have received a copy of the GNU General Public License
20    along with this program; if not, write to the Free Software
21    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
22    02110-1301, USA.  */
23 \f
24 /* The difference between readelf and objdump:
25
26   Both programs are capable of displaying the contents of ELF format files,
27   so why does the binutils project have two file dumpers ?
28
29   The reason is that objdump sees an ELF file through a BFD filter of the
30   world; if BFD has a bug where, say, it disagrees about a machine constant
31   in e_flags, then the odds are good that it will remain internally
32   consistent.  The linker sees it the BFD way, objdump sees it the BFD way,
33   GAS sees it the BFD way.  There was need for a tool to go find out what
34   the file actually says.
35
36   This is why the readelf program does not link against the BFD library - it
37   exists as an independent program to help verify the correct working of BFD.
38
39   There is also the case that readelf can provide more information about an
40   ELF file than is provided by objdump.  In particular it can display DWARF
41   debugging information which (at the moment) objdump cannot.  */
42 \f
43 #include "sysdep.h"
44 #include <assert.h>
45 #include <time.h>
46 #ifdef HAVE_ZLIB_H
47 #include <zlib.h>
48 #endif
49 #ifdef HAVE_WCHAR_H
50 #include <wchar.h>
51 #endif
52
53 #if __GNUC__ >= 2
54 /* Define BFD64 here, even if our default architecture is 32 bit ELF
55    as this will allow us to read in and parse 64bit and 32bit ELF files.
56    Only do this if we believe that the compiler can support a 64 bit
57    data type.  For now we only rely on GCC being able to do this.  */
58 #define BFD64
59 #endif
60
61 #include "bfd.h"
62 #include "bucomm.h"
63 #include "elfcomm.h"
64 #include "dwarf.h"
65
66 #include "elf/common.h"
67 #include "elf/external.h"
68 #include "elf/internal.h"
69
70
71 /* Included here, before RELOC_MACROS_GEN_FUNC is defined, so that
72    we can obtain the H8 reloc numbers.  We need these for the
73    get_reloc_size() function.  We include h8.h again after defining
74    RELOC_MACROS_GEN_FUNC so that we get the naming function as well.  */
75
76 #include "elf/h8.h"
77 #undef _ELF_H8_H
78
79 /* Undo the effects of #including reloc-macros.h.  */
80
81 #undef START_RELOC_NUMBERS
82 #undef RELOC_NUMBER
83 #undef FAKE_RELOC
84 #undef EMPTY_RELOC
85 #undef END_RELOC_NUMBERS
86 #undef _RELOC_MACROS_H
87
88 /* The following headers use the elf/reloc-macros.h file to
89    automatically generate relocation recognition functions
90    such as elf_mips_reloc_type()  */
91
92 #define RELOC_MACROS_GEN_FUNC
93
94 #include "elf/aarch64.h"
95 #include "elf/alpha.h"
96 #include "elf/arc.h"
97 #include "elf/arm.h"
98 #include "elf/avr.h"
99 #include "elf/bfin.h"
100 #include "elf/cr16.h"
101 #include "elf/cris.h"
102 #include "elf/crx.h"
103 #include "elf/d10v.h"
104 #include "elf/d30v.h"
105 #include "elf/dlx.h"
106 #include "elf/epiphany.h"
107 #include "elf/fr30.h"
108 #include "elf/frv.h"
109 #include "elf/h8.h"
110 #include "elf/hppa.h"
111 #include "elf/i386.h"
112 #include "elf/i370.h"
113 #include "elf/i860.h"
114 #include "elf/i960.h"
115 #include "elf/ia64.h"
116 #include "elf/ip2k.h"
117 #include "elf/lm32.h"
118 #include "elf/iq2000.h"
119 #include "elf/m32c.h"
120 #include "elf/m32r.h"
121 #include "elf/m68k.h"
122 #include "elf/m68hc11.h"
123 #include "elf/mcore.h"
124 #include "elf/mep.h"
125 #include "elf/metag.h"
126 #include "elf/microblaze.h"
127 #include "elf/mips.h"
128 #include "elf/mmix.h"
129 #include "elf/mn10200.h"
130 #include "elf/mn10300.h"
131 #include "elf/moxie.h"
132 #include "elf/mt.h"
133 #include "elf/msp430.h"
134 #include "elf/nds32.h"
135 #include "elf/nios2.h"
136 #include "elf/or1k.h"
137 #include "elf/pj.h"
138 #include "elf/ppc.h"
139 #include "elf/ppc64.h"
140 #include "elf/rl78.h"
141 #include "elf/rx.h"
142 #include "elf/s390.h"
143 #include "elf/score.h"
144 #include "elf/sh.h"
145 #include "elf/sparc.h"
146 #include "elf/spu.h"
147 #include "elf/tic6x.h"
148 #include "elf/tilegx.h"
149 #include "elf/tilepro.h"
150 #include "elf/v850.h"
151 #include "elf/vax.h"
152 #include "elf/x86-64.h"
153 #include "elf/xc16x.h"
154 #include "elf/xgate.h"
155 #include "elf/xstormy16.h"
156 #include "elf/xtensa.h"
157
158 #include "getopt.h"
159 #include "libiberty.h"
160 #include "safe-ctype.h"
161 #include "filenames.h"
162
163 #ifndef offsetof
164 #define offsetof(TYPE, MEMBER) ((size_t) &(((TYPE *) 0)->MEMBER))
165 #endif
166
167 char * program_name = "readelf";
168 static long archive_file_offset;
169 static unsigned long archive_file_size;
170 static unsigned long dynamic_addr;
171 static bfd_size_type dynamic_size;
172 static unsigned int dynamic_nent;
173 static char * dynamic_strings;
174 static unsigned long dynamic_strings_length;
175 static char * string_table;
176 static unsigned long string_table_length;
177 static unsigned long num_dynamic_syms;
178 static Elf_Internal_Sym * dynamic_symbols;
179 static Elf_Internal_Syminfo * dynamic_syminfo;
180 static unsigned long dynamic_syminfo_offset;
181 static unsigned int dynamic_syminfo_nent;
182 static char program_interpreter[PATH_MAX];
183 static bfd_vma dynamic_info[DT_ENCODING];
184 static bfd_vma dynamic_info_DT_GNU_HASH;
185 static bfd_vma version_info[16];
186 static Elf_Internal_Ehdr elf_header;
187 static Elf_Internal_Shdr * section_headers;
188 static Elf_Internal_Phdr * program_headers;
189 static Elf_Internal_Dyn *  dynamic_section;
190 static Elf_Internal_Shdr * symtab_shndx_hdr;
191 static int show_name;
192 static int do_dynamic;
193 static int do_syms;
194 static int do_dyn_syms;
195 static int do_reloc;
196 static int do_sections;
197 static int do_section_groups;
198 static int do_section_details;
199 static int do_segments;
200 static int do_unwind;
201 static int do_using_dynamic;
202 static int do_header;
203 static int do_dump;
204 static int do_version;
205 static int do_histogram;
206 static int do_debugging;
207 static int do_arch;
208 static int do_notes;
209 static int do_archive_index;
210 static int is_32bit_elf;
211
212 struct group_list
213 {
214   struct group_list * next;
215   unsigned int section_index;
216 };
217
218 struct group
219 {
220   struct group_list * root;
221   unsigned int group_index;
222 };
223
224 static size_t group_count;
225 static struct group * section_groups;
226 static struct group ** section_headers_groups;
227
228
229 /* Flag bits indicating particular types of dump.  */
230 #define HEX_DUMP        (1 << 0)        /* The -x command line switch.  */
231 #define DISASS_DUMP     (1 << 1)        /* The -i command line switch.  */
232 #define DEBUG_DUMP      (1 << 2)        /* The -w command line switch.  */
233 #define STRING_DUMP     (1 << 3)        /* The -p command line switch.  */
234 #define RELOC_DUMP      (1 << 4)        /* The -R command line switch.  */
235
236 typedef unsigned char dump_type;
237
238 /* A linked list of the section names for which dumps were requested.  */
239 struct dump_list_entry
240 {
241   char * name;
242   dump_type type;
243   struct dump_list_entry * next;
244 };
245 static struct dump_list_entry * dump_sects_byname;
246
247 /* A dynamic array of flags indicating for which sections a dump
248    has been requested via command line switches.  */
249 static dump_type *   cmdline_dump_sects = NULL;
250 static unsigned int  num_cmdline_dump_sects = 0;
251
252 /* A dynamic array of flags indicating for which sections a dump of
253    some kind has been requested.  It is reset on a per-object file
254    basis and then initialised from the cmdline_dump_sects array,
255    the results of interpreting the -w switch, and the
256    dump_sects_byname list.  */
257 static dump_type *   dump_sects = NULL;
258 static unsigned int  num_dump_sects = 0;
259
260
261 /* How to print a vma value.  */
262 typedef enum print_mode
263 {
264   HEX,
265   DEC,
266   DEC_5,
267   UNSIGNED,
268   PREFIX_HEX,
269   FULL_HEX,
270   LONG_HEX
271 }
272 print_mode;
273
274 #define UNKNOWN -1
275
276 #define SECTION_NAME(X)                                         \
277   ((X) == NULL ? _("<none>")                                    \
278    : string_table == NULL ? _("<no-name>")                      \
279    : ((X)->sh_name >= string_table_length ? _("<corrupt>")      \
280   : string_table + (X)->sh_name))
281
282 #define DT_VERSIONTAGIDX(tag)   (DT_VERNEEDNUM - (tag)) /* Reverse order!  */
283
284 #define GET_ELF_SYMBOLS(file, section, sym_count)                       \
285   (is_32bit_elf ? get_32bit_elf_symbols (file, section, sym_count)      \
286    : get_64bit_elf_symbols (file, section, sym_count))
287
288 #define VALID_DYNAMIC_NAME(offset)      ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
289 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
290    already been called and verified that the string exists.  */
291 #define GET_DYNAMIC_NAME(offset)        (dynamic_strings + offset)
292
293 #define REMOVE_ARCH_BITS(ADDR)                  \
294   do                                            \
295     {                                           \
296       if (elf_header.e_machine == EM_ARM)       \
297         (ADDR) &= ~1;                           \
298     }                                           \
299   while (0)
300 \f
301 /* Retrieve NMEMB structures, each SIZE bytes long from FILE starting at OFFSET.
302    Put the retrieved data into VAR, if it is not NULL.  Otherwise allocate a buffer
303    using malloc and fill that.  In either case return the pointer to the start of
304    the retrieved data or NULL if something went wrong.  If something does go wrong
305    emit an error message using REASON as part of the context.  */
306
307 static void *
308 get_data (void * var, FILE * file, long offset, size_t size, size_t nmemb,
309           const char * reason)
310 {
311   void * mvar;
312
313   if (size == 0 || nmemb == 0)
314     return NULL;
315
316   if (fseek (file, archive_file_offset + offset, SEEK_SET))
317     {
318       error (_("Unable to seek to 0x%lx for %s\n"),
319              (unsigned long) archive_file_offset + offset, reason);
320       return NULL;
321     }
322
323   mvar = var;
324   if (mvar == NULL)
325     {
326       /* Check for overflow.  */
327       if (nmemb < (~(size_t) 0 - 1) / size)
328         /* + 1 so that we can '\0' terminate invalid string table sections.  */
329         mvar = malloc (size * nmemb + 1);
330
331       if (mvar == NULL)
332         {
333           error (_("Out of memory allocating 0x%lx bytes for %s\n"),
334                  (unsigned long)(size * nmemb), reason);
335           return NULL;
336         }
337
338       ((char *) mvar)[size * nmemb] = '\0';
339     }
340
341   if (fread (mvar, size, nmemb, file) != nmemb)
342     {
343       error (_("Unable to read in 0x%lx bytes of %s\n"),
344              (unsigned long)(size * nmemb), reason);
345       if (mvar != var)
346         free (mvar);
347       return NULL;
348     }
349
350   return mvar;
351 }
352
353 /* Print a VMA value.  */
354
355 static int
356 print_vma (bfd_vma vma, print_mode mode)
357 {
358   int nc = 0;
359
360   switch (mode)
361     {
362     case FULL_HEX:
363       nc = printf ("0x");
364       /* Drop through.  */
365
366     case LONG_HEX:
367 #ifdef BFD64
368       if (is_32bit_elf)
369         return nc + printf ("%8.8" BFD_VMA_FMT "x", vma);
370 #endif
371       printf_vma (vma);
372       return nc + 16;
373
374     case DEC_5:
375       if (vma <= 99999)
376         return printf ("%5" BFD_VMA_FMT "d", vma);
377       /* Drop through.  */
378
379     case PREFIX_HEX:
380       nc = printf ("0x");
381       /* Drop through.  */
382
383     case HEX:
384       return nc + printf ("%" BFD_VMA_FMT "x", vma);
385
386     case DEC:
387       return printf ("%" BFD_VMA_FMT "d", vma);
388
389     case UNSIGNED:
390       return printf ("%" BFD_VMA_FMT "u", vma);
391     }
392   return 0;
393 }
394
395 /* Display a symbol on stdout.  Handles the display of control characters and
396    multibye characters (assuming the host environment supports them).
397
398    Display at most abs(WIDTH) characters, truncating as necessary, unless do_wide is true.
399
400    If WIDTH is negative then ensure that the output is at least (- WIDTH) characters,
401    padding as necessary.
402
403    Returns the number of emitted characters.  */
404
405 static unsigned int
406 print_symbol (int width, const char *symbol)
407 {
408   bfd_boolean extra_padding = FALSE;
409   int num_printed = 0;
410 #ifdef HAVE_MBSTATE_T
411   mbstate_t state;
412 #endif
413   int width_remaining;
414
415   if (width < 0)
416     {
417       /* Keep the width positive.  This also helps.  */
418       width = - width;
419       extra_padding = TRUE;
420     }
421
422   if (do_wide)
423     /* Set the remaining width to a very large value.
424        This simplifies the code below.  */
425     width_remaining = INT_MAX;
426   else
427     width_remaining = width;
428
429 #ifdef HAVE_MBSTATE_T
430   /* Initialise the multibyte conversion state.  */
431   memset (& state, 0, sizeof (state));
432 #endif
433
434   while (width_remaining)
435     {
436       size_t  n;
437       const char c = *symbol++;
438
439       if (c == 0)
440         break;
441
442       /* Do not print control characters directly as they can affect terminal
443          settings.  Such characters usually appear in the names generated
444          by the assembler for local labels.  */
445       if (ISCNTRL (c))
446         {
447           if (width_remaining < 2)
448             break;
449
450           printf ("^%c", c + 0x40);
451           width_remaining -= 2;
452           num_printed += 2;
453         }
454       else if (ISPRINT (c))
455         {
456           putchar (c);
457           width_remaining --;
458           num_printed ++;
459         }
460       else
461         {
462 #ifdef HAVE_MBSTATE_T
463           wchar_t w;
464 #endif
465           /* Let printf do the hard work of displaying multibyte characters.  */
466           printf ("%.1s", symbol - 1);
467           width_remaining --;
468           num_printed ++;
469
470 #ifdef HAVE_MBSTATE_T
471           /* Try to find out how many bytes made up the character that was
472              just printed.  Advance the symbol pointer past the bytes that
473              were displayed.  */
474           n = mbrtowc (& w, symbol - 1, MB_CUR_MAX, & state);
475 #else
476           n = 1;
477 #endif
478           if (n != (size_t) -1 && n != (size_t) -2 && n > 0)
479             symbol += (n - 1);
480         }
481     }
482
483   if (extra_padding && num_printed < width)
484     {
485       /* Fill in the remaining spaces.  */
486       printf ("%-*s", width - num_printed, " ");
487       num_printed = width;
488     }
489
490   return num_printed;
491 }
492
493 /* Return a pointer to section NAME, or NULL if no such section exists.  */
494
495 static Elf_Internal_Shdr *
496 find_section (const char * name)
497 {
498   unsigned int i;
499
500   for (i = 0; i < elf_header.e_shnum; i++)
501     if (streq (SECTION_NAME (section_headers + i), name))
502       return section_headers + i;
503
504   return NULL;
505 }
506
507 /* Return a pointer to a section containing ADDR, or NULL if no such
508    section exists.  */
509
510 static Elf_Internal_Shdr *
511 find_section_by_address (bfd_vma addr)
512 {
513   unsigned int i;
514
515   for (i = 0; i < elf_header.e_shnum; i++)
516     {
517       Elf_Internal_Shdr *sec = section_headers + i;
518       if (addr >= sec->sh_addr && addr < sec->sh_addr + sec->sh_size)
519         return sec;
520     }
521
522   return NULL;
523 }
524
525 /* Return a pointer to section NAME, or NULL if no such section exists,
526    restricted to the list of sections given in SET.  */
527
528 static Elf_Internal_Shdr *
529 find_section_in_set (const char * name, unsigned int * set)
530 {
531   unsigned int i;
532
533   if (set != NULL)
534     {
535       while ((i = *set++) > 0)
536         if (streq (SECTION_NAME (section_headers + i), name))
537           return section_headers + i;
538     }
539
540   return find_section (name);
541 }
542
543 /* Read an unsigned LEB128 encoded value from p.  Set *PLEN to the number of
544    bytes read.  */
545
546 static inline unsigned long
547 read_uleb128 (unsigned char *data,
548               unsigned int *length_return,
549               const unsigned char * const end)
550 {
551   return read_leb128 (data, length_return, FALSE, end);
552 }
553
554 /* Return true if the current file is for IA-64 machine and OpenVMS ABI.
555    This OS has so many departures from the ELF standard that we test it at
556    many places.  */
557
558 static inline int
559 is_ia64_vms (void)
560 {
561   return elf_header.e_machine == EM_IA_64
562     && elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS;
563 }
564
565 /* Guess the relocation size commonly used by the specific machines.  */
566
567 static int
568 guess_is_rela (unsigned int e_machine)
569 {
570   switch (e_machine)
571     {
572       /* Targets that use REL relocations.  */
573     case EM_386:
574     case EM_486:
575     case EM_960:
576     case EM_ARM:
577     case EM_D10V:
578     case EM_CYGNUS_D10V:
579     case EM_DLX:
580     case EM_MIPS:
581     case EM_MIPS_RS3_LE:
582     case EM_CYGNUS_M32R:
583     case EM_SCORE:
584     case EM_XGATE:
585       return FALSE;
586
587       /* Targets that use RELA relocations.  */
588     case EM_68K:
589     case EM_860:
590     case EM_AARCH64:
591     case EM_ADAPTEVA_EPIPHANY:
592     case EM_ALPHA:
593     case EM_ALTERA_NIOS2:
594     case EM_AVR:
595     case EM_AVR_OLD:
596     case EM_BLACKFIN:
597     case EM_CR16:
598     case EM_CRIS:
599     case EM_CRX:
600     case EM_D30V:
601     case EM_CYGNUS_D30V:
602     case EM_FR30:
603     case EM_CYGNUS_FR30:
604     case EM_CYGNUS_FRV:
605     case EM_H8S:
606     case EM_H8_300:
607     case EM_H8_300H:
608     case EM_IA_64:
609     case EM_IP2K:
610     case EM_IP2K_OLD:
611     case EM_IQ2000:
612     case EM_LATTICEMICO32:
613     case EM_M32C_OLD:
614     case EM_M32C:
615     case EM_M32R:
616     case EM_MCORE:
617     case EM_CYGNUS_MEP:
618     case EM_METAG:
619     case EM_MMIX:
620     case EM_MN10200:
621     case EM_CYGNUS_MN10200:
622     case EM_MN10300:
623     case EM_CYGNUS_MN10300:
624     case EM_MOXIE:
625     case EM_MSP430:
626     case EM_MSP430_OLD:
627     case EM_MT:
628     case EM_NDS32:
629     case EM_NIOS32:
630     case EM_OR1K:
631     case EM_PPC64:
632     case EM_PPC:
633     case EM_RL78:
634     case EM_RX:
635     case EM_S390:
636     case EM_S390_OLD:
637     case EM_SH:
638     case EM_SPARC:
639     case EM_SPARC32PLUS:
640     case EM_SPARCV9:
641     case EM_SPU:
642     case EM_TI_C6000:
643     case EM_TILEGX:
644     case EM_TILEPRO:
645     case EM_V800:
646     case EM_V850:
647     case EM_CYGNUS_V850:
648     case EM_VAX:
649     case EM_X86_64:
650     case EM_L1OM:
651     case EM_K1OM:
652     case EM_XSTORMY16:
653     case EM_XTENSA:
654     case EM_XTENSA_OLD:
655     case EM_MICROBLAZE:
656     case EM_MICROBLAZE_OLD:
657       return TRUE;
658
659     case EM_68HC05:
660     case EM_68HC08:
661     case EM_68HC11:
662     case EM_68HC16:
663     case EM_FX66:
664     case EM_ME16:
665     case EM_MMA:
666     case EM_NCPU:
667     case EM_NDR1:
668     case EM_PCP:
669     case EM_ST100:
670     case EM_ST19:
671     case EM_ST7:
672     case EM_ST9PLUS:
673     case EM_STARCORE:
674     case EM_SVX:
675     case EM_TINYJ:
676     default:
677       warn (_("Don't know about relocations on this machine architecture\n"));
678       return FALSE;
679     }
680 }
681
682 static int
683 slurp_rela_relocs (FILE * file,
684                    unsigned long rel_offset,
685                    unsigned long rel_size,
686                    Elf_Internal_Rela ** relasp,
687                    unsigned long * nrelasp)
688 {
689   Elf_Internal_Rela * relas;
690   unsigned long nrelas;
691   unsigned int i;
692
693   if (is_32bit_elf)
694     {
695       Elf32_External_Rela * erelas;
696
697       erelas = (Elf32_External_Rela *) get_data (NULL, file, rel_offset, 1,
698                                                  rel_size, _("32-bit relocation data"));
699       if (!erelas)
700         return 0;
701
702       nrelas = rel_size / sizeof (Elf32_External_Rela);
703
704       relas = (Elf_Internal_Rela *) cmalloc (nrelas,
705                                              sizeof (Elf_Internal_Rela));
706
707       if (relas == NULL)
708         {
709           free (erelas);
710           error (_("out of memory parsing relocs\n"));
711           return 0;
712         }
713
714       for (i = 0; i < nrelas; i++)
715         {
716           relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
717           relas[i].r_info   = BYTE_GET (erelas[i].r_info);
718           relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
719         }
720
721       free (erelas);
722     }
723   else
724     {
725       Elf64_External_Rela * erelas;
726
727       erelas = (Elf64_External_Rela *) get_data (NULL, file, rel_offset, 1,
728                                                  rel_size, _("64-bit relocation data"));
729       if (!erelas)
730         return 0;
731
732       nrelas = rel_size / sizeof (Elf64_External_Rela);
733
734       relas = (Elf_Internal_Rela *) cmalloc (nrelas,
735                                              sizeof (Elf_Internal_Rela));
736
737       if (relas == NULL)
738         {
739           free (erelas);
740           error (_("out of memory parsing relocs\n"));
741           return 0;
742         }
743
744       for (i = 0; i < nrelas; i++)
745         {
746           relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
747           relas[i].r_info   = BYTE_GET (erelas[i].r_info);
748           relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
749
750           /* The #ifdef BFD64 below is to prevent a compile time
751              warning.  We know that if we do not have a 64 bit data
752              type that we will never execute this code anyway.  */
753 #ifdef BFD64
754           if (elf_header.e_machine == EM_MIPS
755               && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
756             {
757               /* In little-endian objects, r_info isn't really a
758                  64-bit little-endian value: it has a 32-bit
759                  little-endian symbol index followed by four
760                  individual byte fields.  Reorder INFO
761                  accordingly.  */
762               bfd_vma inf = relas[i].r_info;
763               inf = (((inf & 0xffffffff) << 32)
764                       | ((inf >> 56) & 0xff)
765                       | ((inf >> 40) & 0xff00)
766                       | ((inf >> 24) & 0xff0000)
767                       | ((inf >> 8) & 0xff000000));
768               relas[i].r_info = inf;
769             }
770 #endif /* BFD64 */
771         }
772
773       free (erelas);
774     }
775   *relasp = relas;
776   *nrelasp = nrelas;
777   return 1;
778 }
779
780 static int
781 slurp_rel_relocs (FILE * file,
782                   unsigned long rel_offset,
783                   unsigned long rel_size,
784                   Elf_Internal_Rela ** relsp,
785                   unsigned long * nrelsp)
786 {
787   Elf_Internal_Rela * rels;
788   unsigned long nrels;
789   unsigned int i;
790
791   if (is_32bit_elf)
792     {
793       Elf32_External_Rel * erels;
794
795       erels = (Elf32_External_Rel *) get_data (NULL, file, rel_offset, 1,
796                                                rel_size, _("32-bit relocation data"));
797       if (!erels)
798         return 0;
799
800       nrels = rel_size / sizeof (Elf32_External_Rel);
801
802       rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
803
804       if (rels == NULL)
805         {
806           free (erels);
807           error (_("out of memory parsing relocs\n"));
808           return 0;
809         }
810
811       for (i = 0; i < nrels; i++)
812         {
813           rels[i].r_offset = BYTE_GET (erels[i].r_offset);
814           rels[i].r_info   = BYTE_GET (erels[i].r_info);
815           rels[i].r_addend = 0;
816         }
817
818       free (erels);
819     }
820   else
821     {
822       Elf64_External_Rel * erels;
823
824       erels = (Elf64_External_Rel *) get_data (NULL, file, rel_offset, 1,
825                                                rel_size, _("64-bit relocation data"));
826       if (!erels)
827         return 0;
828
829       nrels = rel_size / sizeof (Elf64_External_Rel);
830
831       rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
832
833       if (rels == NULL)
834         {
835           free (erels);
836           error (_("out of memory parsing relocs\n"));
837           return 0;
838         }
839
840       for (i = 0; i < nrels; i++)
841         {
842           rels[i].r_offset = BYTE_GET (erels[i].r_offset);
843           rels[i].r_info   = BYTE_GET (erels[i].r_info);
844           rels[i].r_addend = 0;
845
846           /* The #ifdef BFD64 below is to prevent a compile time
847              warning.  We know that if we do not have a 64 bit data
848              type that we will never execute this code anyway.  */
849 #ifdef BFD64
850           if (elf_header.e_machine == EM_MIPS
851               && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
852             {
853               /* In little-endian objects, r_info isn't really a
854                  64-bit little-endian value: it has a 32-bit
855                  little-endian symbol index followed by four
856                  individual byte fields.  Reorder INFO
857                  accordingly.  */
858               bfd_vma inf = rels[i].r_info;
859               inf = (((inf & 0xffffffff) << 32)
860                      | ((inf >> 56) & 0xff)
861                      | ((inf >> 40) & 0xff00)
862                      | ((inf >> 24) & 0xff0000)
863                      | ((inf >> 8) & 0xff000000));
864               rels[i].r_info = inf;
865             }
866 #endif /* BFD64 */
867         }
868
869       free (erels);
870     }
871   *relsp = rels;
872   *nrelsp = nrels;
873   return 1;
874 }
875
876 /* Returns the reloc type extracted from the reloc info field.  */
877
878 static unsigned int
879 get_reloc_type (bfd_vma reloc_info)
880 {
881   if (is_32bit_elf)
882     return ELF32_R_TYPE (reloc_info);
883
884   switch (elf_header.e_machine)
885     {
886     case EM_MIPS:
887       /* Note: We assume that reloc_info has already been adjusted for us.  */
888       return ELF64_MIPS_R_TYPE (reloc_info);
889
890     case EM_SPARCV9:
891       return ELF64_R_TYPE_ID (reloc_info);
892
893     default:
894       return ELF64_R_TYPE (reloc_info);
895     }
896 }
897
898 /* Return the symbol index extracted from the reloc info field.  */
899
900 static bfd_vma
901 get_reloc_symindex (bfd_vma reloc_info)
902 {
903   return is_32bit_elf ? ELF32_R_SYM (reloc_info) : ELF64_R_SYM (reloc_info);
904 }
905
906 static inline bfd_boolean
907 uses_msp430x_relocs (void)
908 {
909   return
910     elf_header.e_machine == EM_MSP430 /* Paranoia.  */
911     /* GCC uses osabi == ELFOSBI_STANDALONE.  */
912     && (((elf_header.e_flags & EF_MSP430_MACH) == E_MSP430_MACH_MSP430X)
913         /* TI compiler uses ELFOSABI_NONE.  */
914         || (elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE));
915 }
916
917 /* Display the contents of the relocation data found at the specified
918    offset.  */
919
920 static void
921 dump_relocations (FILE * file,
922                   unsigned long rel_offset,
923                   unsigned long rel_size,
924                   Elf_Internal_Sym * symtab,
925                   unsigned long nsyms,
926                   char * strtab,
927                   unsigned long strtablen,
928                   int is_rela)
929 {
930   unsigned int i;
931   Elf_Internal_Rela * rels;
932
933   if (is_rela == UNKNOWN)
934     is_rela = guess_is_rela (elf_header.e_machine);
935
936   if (is_rela)
937     {
938       if (!slurp_rela_relocs (file, rel_offset, rel_size, &rels, &rel_size))
939         return;
940     }
941   else
942     {
943       if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
944         return;
945     }
946
947   if (is_32bit_elf)
948     {
949       if (is_rela)
950         {
951           if (do_wide)
952             printf (_(" Offset     Info    Type                Sym. Value  Symbol's Name + Addend\n"));
953           else
954             printf (_(" Offset     Info    Type            Sym.Value  Sym. Name + Addend\n"));
955         }
956       else
957         {
958           if (do_wide)
959             printf (_(" Offset     Info    Type                Sym. Value  Symbol's Name\n"));
960           else
961             printf (_(" Offset     Info    Type            Sym.Value  Sym. Name\n"));
962         }
963     }
964   else
965     {
966       if (is_rela)
967         {
968           if (do_wide)
969             printf (_("    Offset             Info             Type               Symbol's Value  Symbol's Name + Addend\n"));
970           else
971             printf (_("  Offset          Info           Type           Sym. Value    Sym. Name + Addend\n"));
972         }
973       else
974         {
975           if (do_wide)
976             printf (_("    Offset             Info             Type               Symbol's Value  Symbol's Name\n"));
977           else
978             printf (_("  Offset          Info           Type           Sym. Value    Sym. Name\n"));
979         }
980     }
981
982   for (i = 0; i < rel_size; i++)
983     {
984       const char * rtype;
985       bfd_vma offset;
986       bfd_vma inf;
987       bfd_vma symtab_index;
988       bfd_vma type;
989
990       offset = rels[i].r_offset;
991       inf    = rels[i].r_info;
992
993       type = get_reloc_type (inf);
994       symtab_index = get_reloc_symindex  (inf);
995
996       if (is_32bit_elf)
997         {
998           printf ("%8.8lx  %8.8lx ",
999                   (unsigned long) offset & 0xffffffff,
1000                   (unsigned long) inf & 0xffffffff);
1001         }
1002       else
1003         {
1004 #if BFD_HOST_64BIT_LONG
1005           printf (do_wide
1006                   ? "%16.16lx  %16.16lx "
1007                   : "%12.12lx  %12.12lx ",
1008                   offset, inf);
1009 #elif BFD_HOST_64BIT_LONG_LONG
1010 #ifndef __MSVCRT__
1011           printf (do_wide
1012                   ? "%16.16llx  %16.16llx "
1013                   : "%12.12llx  %12.12llx ",
1014                   offset, inf);
1015 #else
1016           printf (do_wide
1017                   ? "%16.16I64x  %16.16I64x "
1018                   : "%12.12I64x  %12.12I64x ",
1019                   offset, inf);
1020 #endif
1021 #else
1022           printf (do_wide
1023                   ? "%8.8lx%8.8lx  %8.8lx%8.8lx "
1024                   : "%4.4lx%8.8lx  %4.4lx%8.8lx ",
1025                   _bfd_int64_high (offset),
1026                   _bfd_int64_low (offset),
1027                   _bfd_int64_high (inf),
1028                   _bfd_int64_low (inf));
1029 #endif
1030         }
1031
1032       switch (elf_header.e_machine)
1033         {
1034         default:
1035           rtype = NULL;
1036           break;
1037
1038         case EM_AARCH64:
1039           rtype = elf_aarch64_reloc_type (type);
1040           break;
1041
1042         case EM_M32R:
1043         case EM_CYGNUS_M32R:
1044           rtype = elf_m32r_reloc_type (type);
1045           break;
1046
1047         case EM_386:
1048         case EM_486:
1049           rtype = elf_i386_reloc_type (type);
1050           break;
1051
1052         case EM_68HC11:
1053         case EM_68HC12:
1054           rtype = elf_m68hc11_reloc_type (type);
1055           break;
1056
1057         case EM_68K:
1058           rtype = elf_m68k_reloc_type (type);
1059           break;
1060
1061         case EM_960:
1062           rtype = elf_i960_reloc_type (type);
1063           break;
1064
1065         case EM_AVR:
1066         case EM_AVR_OLD:
1067           rtype = elf_avr_reloc_type (type);
1068           break;
1069
1070         case EM_OLD_SPARCV9:
1071         case EM_SPARC32PLUS:
1072         case EM_SPARCV9:
1073         case EM_SPARC:
1074           rtype = elf_sparc_reloc_type (type);
1075           break;
1076
1077         case EM_SPU:
1078           rtype = elf_spu_reloc_type (type);
1079           break;
1080
1081         case EM_V800:
1082           rtype = v800_reloc_type (type);
1083           break;
1084         case EM_V850:
1085         case EM_CYGNUS_V850:
1086           rtype = v850_reloc_type (type);
1087           break;
1088
1089         case EM_D10V:
1090         case EM_CYGNUS_D10V:
1091           rtype = elf_d10v_reloc_type (type);
1092           break;
1093
1094         case EM_D30V:
1095         case EM_CYGNUS_D30V:
1096           rtype = elf_d30v_reloc_type (type);
1097           break;
1098
1099         case EM_DLX:
1100           rtype = elf_dlx_reloc_type (type);
1101           break;
1102
1103         case EM_SH:
1104           rtype = elf_sh_reloc_type (type);
1105           break;
1106
1107         case EM_MN10300:
1108         case EM_CYGNUS_MN10300:
1109           rtype = elf_mn10300_reloc_type (type);
1110           break;
1111
1112         case EM_MN10200:
1113         case EM_CYGNUS_MN10200:
1114           rtype = elf_mn10200_reloc_type (type);
1115           break;
1116
1117         case EM_FR30:
1118         case EM_CYGNUS_FR30:
1119           rtype = elf_fr30_reloc_type (type);
1120           break;
1121
1122         case EM_CYGNUS_FRV:
1123           rtype = elf_frv_reloc_type (type);
1124           break;
1125
1126         case EM_MCORE:
1127           rtype = elf_mcore_reloc_type (type);
1128           break;
1129
1130         case EM_MMIX:
1131           rtype = elf_mmix_reloc_type (type);
1132           break;
1133
1134         case EM_MOXIE:
1135           rtype = elf_moxie_reloc_type (type);
1136           break;
1137
1138         case EM_MSP430:
1139           if (uses_msp430x_relocs ())
1140             {
1141               rtype = elf_msp430x_reloc_type (type);
1142               break;
1143             }
1144         case EM_MSP430_OLD:
1145           rtype = elf_msp430_reloc_type (type);
1146           break;
1147
1148         case EM_NDS32:
1149           rtype = elf_nds32_reloc_type (type);
1150           break;
1151
1152         case EM_PPC:
1153           rtype = elf_ppc_reloc_type (type);
1154           break;
1155
1156         case EM_PPC64:
1157           rtype = elf_ppc64_reloc_type (type);
1158           break;
1159
1160         case EM_MIPS:
1161         case EM_MIPS_RS3_LE:
1162           rtype = elf_mips_reloc_type (type);
1163           break;
1164
1165         case EM_ALPHA:
1166           rtype = elf_alpha_reloc_type (type);
1167           break;
1168
1169         case EM_ARM:
1170           rtype = elf_arm_reloc_type (type);
1171           break;
1172
1173         case EM_ARC:
1174           rtype = elf_arc_reloc_type (type);
1175           break;
1176
1177         case EM_PARISC:
1178           rtype = elf_hppa_reloc_type (type);
1179           break;
1180
1181         case EM_H8_300:
1182         case EM_H8_300H:
1183         case EM_H8S:
1184           rtype = elf_h8_reloc_type (type);
1185           break;
1186
1187         case EM_OR1K:
1188           rtype = elf_or1k_reloc_type (type);
1189           break;
1190
1191         case EM_PJ:
1192         case EM_PJ_OLD:
1193           rtype = elf_pj_reloc_type (type);
1194           break;
1195         case EM_IA_64:
1196           rtype = elf_ia64_reloc_type (type);
1197           break;
1198
1199         case EM_CRIS:
1200           rtype = elf_cris_reloc_type (type);
1201           break;
1202
1203         case EM_860:
1204           rtype = elf_i860_reloc_type (type);
1205           break;
1206
1207         case EM_X86_64:
1208         case EM_L1OM:
1209         case EM_K1OM:
1210           rtype = elf_x86_64_reloc_type (type);
1211           break;
1212
1213         case EM_S370:
1214           rtype = i370_reloc_type (type);
1215           break;
1216
1217         case EM_S390_OLD:
1218         case EM_S390:
1219           rtype = elf_s390_reloc_type (type);
1220           break;
1221
1222         case EM_SCORE:
1223           rtype = elf_score_reloc_type (type);
1224           break;
1225
1226         case EM_XSTORMY16:
1227           rtype = elf_xstormy16_reloc_type (type);
1228           break;
1229
1230         case EM_CRX:
1231           rtype = elf_crx_reloc_type (type);
1232           break;
1233
1234         case EM_VAX:
1235           rtype = elf_vax_reloc_type (type);
1236           break;
1237
1238         case EM_ADAPTEVA_EPIPHANY:
1239           rtype = elf_epiphany_reloc_type (type);
1240           break;
1241
1242         case EM_IP2K:
1243         case EM_IP2K_OLD:
1244           rtype = elf_ip2k_reloc_type (type);
1245           break;
1246
1247         case EM_IQ2000:
1248           rtype = elf_iq2000_reloc_type (type);
1249           break;
1250
1251         case EM_XTENSA_OLD:
1252         case EM_XTENSA:
1253           rtype = elf_xtensa_reloc_type (type);
1254           break;
1255
1256         case EM_LATTICEMICO32:
1257           rtype = elf_lm32_reloc_type (type);
1258           break;
1259
1260         case EM_M32C_OLD:
1261         case EM_M32C:
1262           rtype = elf_m32c_reloc_type (type);
1263           break;
1264
1265         case EM_MT:
1266           rtype = elf_mt_reloc_type (type);
1267           break;
1268
1269         case EM_BLACKFIN:
1270           rtype = elf_bfin_reloc_type (type);
1271           break;
1272
1273         case EM_CYGNUS_MEP:
1274           rtype = elf_mep_reloc_type (type);
1275           break;
1276
1277         case EM_CR16:
1278           rtype = elf_cr16_reloc_type (type);
1279           break;
1280
1281         case EM_MICROBLAZE:
1282         case EM_MICROBLAZE_OLD:
1283           rtype = elf_microblaze_reloc_type (type);
1284           break;
1285
1286         case EM_RL78:
1287           rtype = elf_rl78_reloc_type (type);
1288           break;
1289
1290         case EM_RX:
1291           rtype = elf_rx_reloc_type (type);
1292           break;
1293
1294         case EM_METAG:
1295           rtype = elf_metag_reloc_type (type);
1296           break;
1297
1298         case EM_XC16X:
1299         case EM_C166:
1300           rtype = elf_xc16x_reloc_type (type);
1301           break;
1302
1303         case EM_TI_C6000:
1304           rtype = elf_tic6x_reloc_type (type);
1305           break;
1306
1307         case EM_TILEGX:
1308           rtype = elf_tilegx_reloc_type (type);
1309           break;
1310
1311         case EM_TILEPRO:
1312           rtype = elf_tilepro_reloc_type (type);
1313           break;
1314
1315         case EM_XGATE:
1316           rtype = elf_xgate_reloc_type (type);
1317           break;
1318
1319         case EM_ALTERA_NIOS2:
1320           rtype = elf_nios2_reloc_type (type);
1321           break;
1322         }
1323
1324       if (rtype == NULL)
1325         printf (_("unrecognized: %-7lx"), (unsigned long) type & 0xffffffff);
1326       else
1327         printf (do_wide ? "%-22.22s" : "%-17.17s", rtype);
1328
1329       if (elf_header.e_machine == EM_ALPHA
1330           && rtype != NULL
1331           && streq (rtype, "R_ALPHA_LITUSE")
1332           && is_rela)
1333         {
1334           switch (rels[i].r_addend)
1335             {
1336             case LITUSE_ALPHA_ADDR:   rtype = "ADDR";   break;
1337             case LITUSE_ALPHA_BASE:   rtype = "BASE";   break;
1338             case LITUSE_ALPHA_BYTOFF: rtype = "BYTOFF"; break;
1339             case LITUSE_ALPHA_JSR:    rtype = "JSR";    break;
1340             case LITUSE_ALPHA_TLSGD:  rtype = "TLSGD";  break;
1341             case LITUSE_ALPHA_TLSLDM: rtype = "TLSLDM"; break;
1342             case LITUSE_ALPHA_JSRDIRECT: rtype = "JSRDIRECT"; break;
1343             default: rtype = NULL;
1344             }
1345           if (rtype)
1346             printf (" (%s)", rtype);
1347           else
1348             {
1349               putchar (' ');
1350               printf (_("<unknown addend: %lx>"),
1351                       (unsigned long) rels[i].r_addend);
1352             }
1353         }
1354       else if (symtab_index)
1355         {
1356           if (symtab == NULL || symtab_index >= nsyms)
1357             printf (_(" bad symbol index: %08lx"), (unsigned long) symtab_index);
1358           else
1359             {
1360               Elf_Internal_Sym * psym;
1361
1362               psym = symtab + symtab_index;
1363
1364               printf (" ");
1365
1366               if (ELF_ST_TYPE (psym->st_info) == STT_GNU_IFUNC)
1367                 {
1368                   const char * name;
1369                   unsigned int len;
1370                   unsigned int width = is_32bit_elf ? 8 : 14;
1371
1372                   /* Relocations against GNU_IFUNC symbols do not use the value
1373                      of the symbol as the address to relocate against.  Instead
1374                      they invoke the function named by the symbol and use its
1375                      result as the address for relocation.
1376
1377                      To indicate this to the user, do not display the value of
1378                      the symbol in the "Symbols's Value" field.  Instead show
1379                      its name followed by () as a hint that the symbol is
1380                      invoked.  */
1381
1382                   if (strtab == NULL
1383                       || psym->st_name == 0
1384                       || psym->st_name >= strtablen)
1385                     name = "??";
1386                   else
1387                     name = strtab + psym->st_name;
1388
1389                   len = print_symbol (width, name);
1390                   printf ("()%-*s", len <= width ? (width + 1) - len : 1, " ");
1391                 }
1392               else
1393                 {
1394                   print_vma (psym->st_value, LONG_HEX);
1395
1396                   printf (is_32bit_elf ? "   " : " ");
1397                 }
1398
1399               if (psym->st_name == 0)
1400                 {
1401                   const char * sec_name = "<null>";
1402                   char name_buf[40];
1403
1404                   if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1405                     {
1406                       if (psym->st_shndx < elf_header.e_shnum)
1407                         sec_name
1408                           = SECTION_NAME (section_headers + psym->st_shndx);
1409                       else if (psym->st_shndx == SHN_ABS)
1410                         sec_name = "ABS";
1411                       else if (psym->st_shndx == SHN_COMMON)
1412                         sec_name = "COMMON";
1413                       else if ((elf_header.e_machine == EM_MIPS
1414                                 && psym->st_shndx == SHN_MIPS_SCOMMON)
1415                                || (elf_header.e_machine == EM_TI_C6000
1416                                    && psym->st_shndx == SHN_TIC6X_SCOMMON))
1417                         sec_name = "SCOMMON";
1418                       else if (elf_header.e_machine == EM_MIPS
1419                                && psym->st_shndx == SHN_MIPS_SUNDEFINED)
1420                         sec_name = "SUNDEF";
1421                       else if ((elf_header.e_machine == EM_X86_64
1422                                 || elf_header.e_machine == EM_L1OM
1423                                 || elf_header.e_machine == EM_K1OM)
1424                                && psym->st_shndx == SHN_X86_64_LCOMMON)
1425                         sec_name = "LARGE_COMMON";
1426                       else if (elf_header.e_machine == EM_IA_64
1427                                && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
1428                                && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1429                         sec_name = "ANSI_COM";
1430                       else if (is_ia64_vms ()
1431                                && psym->st_shndx == SHN_IA_64_VMS_SYMVEC)
1432                         sec_name = "VMS_SYMVEC";
1433                       else
1434                         {
1435                           sprintf (name_buf, "<section 0x%x>",
1436                                    (unsigned int) psym->st_shndx);
1437                           sec_name = name_buf;
1438                         }
1439                     }
1440                   print_symbol (22, sec_name);
1441                 }
1442               else if (strtab == NULL)
1443                 printf (_("<string table index: %3ld>"), psym->st_name);
1444               else if (psym->st_name >= strtablen)
1445                 printf (_("<corrupt string table index: %3ld>"), psym->st_name);
1446               else
1447                 print_symbol (22, strtab + psym->st_name);
1448
1449               if (is_rela)
1450                 {
1451                   bfd_signed_vma off = rels[i].r_addend;
1452
1453                   if (off < 0)
1454                     printf (" - %" BFD_VMA_FMT "x", - off);
1455                   else
1456                     printf (" + %" BFD_VMA_FMT "x", off);
1457                 }
1458             }
1459         }
1460       else if (is_rela)
1461         {
1462           bfd_signed_vma off = rels[i].r_addend;
1463
1464           printf ("%*c", is_32bit_elf ? 12 : 20, ' ');
1465           if (off < 0)
1466             printf ("-%" BFD_VMA_FMT "x", - off);
1467           else
1468             printf ("%" BFD_VMA_FMT "x", off);
1469         }
1470
1471       if (elf_header.e_machine == EM_SPARCV9
1472           && rtype != NULL
1473           && streq (rtype, "R_SPARC_OLO10"))
1474         printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf));
1475
1476       putchar ('\n');
1477
1478 #ifdef BFD64
1479       if (! is_32bit_elf && elf_header.e_machine == EM_MIPS)
1480         {
1481           bfd_vma type2 = ELF64_MIPS_R_TYPE2 (inf);
1482           bfd_vma type3 = ELF64_MIPS_R_TYPE3 (inf);
1483           const char * rtype2 = elf_mips_reloc_type (type2);
1484           const char * rtype3 = elf_mips_reloc_type (type3);
1485
1486           printf ("                    Type2: ");
1487
1488           if (rtype2 == NULL)
1489             printf (_("unrecognized: %-7lx"),
1490                     (unsigned long) type2 & 0xffffffff);
1491           else
1492             printf ("%-17.17s", rtype2);
1493
1494           printf ("\n                    Type3: ");
1495
1496           if (rtype3 == NULL)
1497             printf (_("unrecognized: %-7lx"),
1498                     (unsigned long) type3 & 0xffffffff);
1499           else
1500             printf ("%-17.17s", rtype3);
1501
1502           putchar ('\n');
1503         }
1504 #endif /* BFD64 */
1505     }
1506
1507   free (rels);
1508 }
1509
1510 static const char *
1511 get_mips_dynamic_type (unsigned long type)
1512 {
1513   switch (type)
1514     {
1515     case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1516     case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1517     case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1518     case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1519     case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1520     case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1521     case DT_MIPS_MSYM: return "MIPS_MSYM";
1522     case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1523     case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1524     case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1525     case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1526     case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1527     case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1528     case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1529     case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1530     case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1531     case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1532     case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1533     case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1534     case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1535     case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1536     case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1537     case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1538     case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1539     case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1540     case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1541     case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1542     case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1543     case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1544     case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1545     case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1546     case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1547     case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1548     case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1549     case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1550     case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1551     case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1552     case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1553     case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1554     case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1555     case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1556     case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1557     case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1558     case DT_MIPS_PLTGOT: return "MIPS_PLTGOT";
1559     case DT_MIPS_RWPLT: return "MIPS_RWPLT";
1560     default:
1561       return NULL;
1562     }
1563 }
1564
1565 static const char *
1566 get_sparc64_dynamic_type (unsigned long type)
1567 {
1568   switch (type)
1569     {
1570     case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1571     default:
1572       return NULL;
1573     }
1574 }
1575
1576 static const char *
1577 get_ppc_dynamic_type (unsigned long type)
1578 {
1579   switch (type)
1580     {
1581     case DT_PPC_GOT:    return "PPC_GOT";
1582     case DT_PPC_OPT:    return "PPC_OPT";
1583     default:
1584       return NULL;
1585     }
1586 }
1587
1588 static const char *
1589 get_ppc64_dynamic_type (unsigned long type)
1590 {
1591   switch (type)
1592     {
1593     case DT_PPC64_GLINK:  return "PPC64_GLINK";
1594     case DT_PPC64_OPD:    return "PPC64_OPD";
1595     case DT_PPC64_OPDSZ:  return "PPC64_OPDSZ";
1596     case DT_PPC64_OPT:    return "PPC64_OPT";
1597     default:
1598       return NULL;
1599     }
1600 }
1601
1602 static const char *
1603 get_parisc_dynamic_type (unsigned long type)
1604 {
1605   switch (type)
1606     {
1607     case DT_HP_LOAD_MAP:        return "HP_LOAD_MAP";
1608     case DT_HP_DLD_FLAGS:       return "HP_DLD_FLAGS";
1609     case DT_HP_DLD_HOOK:        return "HP_DLD_HOOK";
1610     case DT_HP_UX10_INIT:       return "HP_UX10_INIT";
1611     case DT_HP_UX10_INITSZ:     return "HP_UX10_INITSZ";
1612     case DT_HP_PREINIT:         return "HP_PREINIT";
1613     case DT_HP_PREINITSZ:       return "HP_PREINITSZ";
1614     case DT_HP_NEEDED:          return "HP_NEEDED";
1615     case DT_HP_TIME_STAMP:      return "HP_TIME_STAMP";
1616     case DT_HP_CHECKSUM:        return "HP_CHECKSUM";
1617     case DT_HP_GST_SIZE:        return "HP_GST_SIZE";
1618     case DT_HP_GST_VERSION:     return "HP_GST_VERSION";
1619     case DT_HP_GST_HASHVAL:     return "HP_GST_HASHVAL";
1620     case DT_HP_EPLTREL:         return "HP_GST_EPLTREL";
1621     case DT_HP_EPLTRELSZ:       return "HP_GST_EPLTRELSZ";
1622     case DT_HP_FILTERED:        return "HP_FILTERED";
1623     case DT_HP_FILTER_TLS:      return "HP_FILTER_TLS";
1624     case DT_HP_COMPAT_FILTERED: return "HP_COMPAT_FILTERED";
1625     case DT_HP_LAZYLOAD:        return "HP_LAZYLOAD";
1626     case DT_HP_BIND_NOW_COUNT:  return "HP_BIND_NOW_COUNT";
1627     case DT_PLT:                return "PLT";
1628     case DT_PLT_SIZE:           return "PLT_SIZE";
1629     case DT_DLT:                return "DLT";
1630     case DT_DLT_SIZE:           return "DLT_SIZE";
1631     default:
1632       return NULL;
1633     }
1634 }
1635
1636 static const char *
1637 get_ia64_dynamic_type (unsigned long type)
1638 {
1639   switch (type)
1640     {
1641     case DT_IA_64_PLT_RESERVE:         return "IA_64_PLT_RESERVE";
1642     case DT_IA_64_VMS_SUBTYPE:         return "VMS_SUBTYPE";
1643     case DT_IA_64_VMS_IMGIOCNT:        return "VMS_IMGIOCNT";
1644     case DT_IA_64_VMS_LNKFLAGS:        return "VMS_LNKFLAGS";
1645     case DT_IA_64_VMS_VIR_MEM_BLK_SIZ: return "VMS_VIR_MEM_BLK_SIZ";
1646     case DT_IA_64_VMS_IDENT:           return "VMS_IDENT";
1647     case DT_IA_64_VMS_NEEDED_IDENT:    return "VMS_NEEDED_IDENT";
1648     case DT_IA_64_VMS_IMG_RELA_CNT:    return "VMS_IMG_RELA_CNT";
1649     case DT_IA_64_VMS_SEG_RELA_CNT:    return "VMS_SEG_RELA_CNT";
1650     case DT_IA_64_VMS_FIXUP_RELA_CNT:  return "VMS_FIXUP_RELA_CNT";
1651     case DT_IA_64_VMS_FIXUP_NEEDED:    return "VMS_FIXUP_NEEDED";
1652     case DT_IA_64_VMS_SYMVEC_CNT:      return "VMS_SYMVEC_CNT";
1653     case DT_IA_64_VMS_XLATED:          return "VMS_XLATED";
1654     case DT_IA_64_VMS_STACKSIZE:       return "VMS_STACKSIZE";
1655     case DT_IA_64_VMS_UNWINDSZ:        return "VMS_UNWINDSZ";
1656     case DT_IA_64_VMS_UNWIND_CODSEG:   return "VMS_UNWIND_CODSEG";
1657     case DT_IA_64_VMS_UNWIND_INFOSEG:  return "VMS_UNWIND_INFOSEG";
1658     case DT_IA_64_VMS_LINKTIME:        return "VMS_LINKTIME";
1659     case DT_IA_64_VMS_SEG_NO:          return "VMS_SEG_NO";
1660     case DT_IA_64_VMS_SYMVEC_OFFSET:   return "VMS_SYMVEC_OFFSET";
1661     case DT_IA_64_VMS_SYMVEC_SEG:      return "VMS_SYMVEC_SEG";
1662     case DT_IA_64_VMS_UNWIND_OFFSET:   return "VMS_UNWIND_OFFSET";
1663     case DT_IA_64_VMS_UNWIND_SEG:      return "VMS_UNWIND_SEG";
1664     case DT_IA_64_VMS_STRTAB_OFFSET:   return "VMS_STRTAB_OFFSET";
1665     case DT_IA_64_VMS_SYSVER_OFFSET:   return "VMS_SYSVER_OFFSET";
1666     case DT_IA_64_VMS_IMG_RELA_OFF:    return "VMS_IMG_RELA_OFF";
1667     case DT_IA_64_VMS_SEG_RELA_OFF:    return "VMS_SEG_RELA_OFF";
1668     case DT_IA_64_VMS_FIXUP_RELA_OFF:  return "VMS_FIXUP_RELA_OFF";
1669     case DT_IA_64_VMS_PLTGOT_OFFSET:   return "VMS_PLTGOT_OFFSET";
1670     case DT_IA_64_VMS_PLTGOT_SEG:      return "VMS_PLTGOT_SEG";
1671     case DT_IA_64_VMS_FPMODE:          return "VMS_FPMODE";
1672     default:
1673       return NULL;
1674     }
1675 }
1676
1677 static const char *
1678 get_alpha_dynamic_type (unsigned long type)
1679 {
1680   switch (type)
1681     {
1682     case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
1683     default:
1684       return NULL;
1685     }
1686 }
1687
1688 static const char *
1689 get_score_dynamic_type (unsigned long type)
1690 {
1691   switch (type)
1692     {
1693     case DT_SCORE_BASE_ADDRESS: return "SCORE_BASE_ADDRESS";
1694     case DT_SCORE_LOCAL_GOTNO:  return "SCORE_LOCAL_GOTNO";
1695     case DT_SCORE_SYMTABNO:     return "SCORE_SYMTABNO";
1696     case DT_SCORE_GOTSYM:       return "SCORE_GOTSYM";
1697     case DT_SCORE_UNREFEXTNO:   return "SCORE_UNREFEXTNO";
1698     case DT_SCORE_HIPAGENO:     return "SCORE_HIPAGENO";
1699     default:
1700       return NULL;
1701     }
1702 }
1703
1704 static const char *
1705 get_tic6x_dynamic_type (unsigned long type)
1706 {
1707   switch (type)
1708     {
1709     case DT_C6000_GSYM_OFFSET: return "C6000_GSYM_OFFSET";
1710     case DT_C6000_GSTR_OFFSET: return "C6000_GSTR_OFFSET";
1711     case DT_C6000_DSBT_BASE:   return "C6000_DSBT_BASE";
1712     case DT_C6000_DSBT_SIZE:   return "C6000_DSBT_SIZE";
1713     case DT_C6000_PREEMPTMAP:  return "C6000_PREEMPTMAP";
1714     case DT_C6000_DSBT_INDEX:  return "C6000_DSBT_INDEX";
1715     default:
1716       return NULL;
1717     }
1718 }
1719
1720 static const char *
1721 get_nios2_dynamic_type (unsigned long type)
1722 {
1723   switch (type)
1724     {
1725     case DT_NIOS2_GP: return "NIOS2_GP";
1726     default:
1727       return NULL;
1728     }
1729 }
1730
1731 static const char *
1732 get_dynamic_type (unsigned long type)
1733 {
1734   static char buff[64];
1735
1736   switch (type)
1737     {
1738     case DT_NULL:       return "NULL";
1739     case DT_NEEDED:     return "NEEDED";
1740     case DT_PLTRELSZ:   return "PLTRELSZ";
1741     case DT_PLTGOT:     return "PLTGOT";
1742     case DT_HASH:       return "HASH";
1743     case DT_STRTAB:     return "STRTAB";
1744     case DT_SYMTAB:     return "SYMTAB";
1745     case DT_RELA:       return "RELA";
1746     case DT_RELASZ:     return "RELASZ";
1747     case DT_RELAENT:    return "RELAENT";
1748     case DT_STRSZ:      return "STRSZ";
1749     case DT_SYMENT:     return "SYMENT";
1750     case DT_INIT:       return "INIT";
1751     case DT_FINI:       return "FINI";
1752     case DT_SONAME:     return "SONAME";
1753     case DT_RPATH:      return "RPATH";
1754     case DT_SYMBOLIC:   return "SYMBOLIC";
1755     case DT_REL:        return "REL";
1756     case DT_RELSZ:      return "RELSZ";
1757     case DT_RELENT:     return "RELENT";
1758     case DT_PLTREL:     return "PLTREL";
1759     case DT_DEBUG:      return "DEBUG";
1760     case DT_TEXTREL:    return "TEXTREL";
1761     case DT_JMPREL:     return "JMPREL";
1762     case DT_BIND_NOW:   return "BIND_NOW";
1763     case DT_INIT_ARRAY: return "INIT_ARRAY";
1764     case DT_FINI_ARRAY: return "FINI_ARRAY";
1765     case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
1766     case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
1767     case DT_RUNPATH:    return "RUNPATH";
1768     case DT_FLAGS:      return "FLAGS";
1769
1770     case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1771     case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
1772
1773     case DT_CHECKSUM:   return "CHECKSUM";
1774     case DT_PLTPADSZ:   return "PLTPADSZ";
1775     case DT_MOVEENT:    return "MOVEENT";
1776     case DT_MOVESZ:     return "MOVESZ";
1777     case DT_FEATURE:    return "FEATURE";
1778     case DT_POSFLAG_1:  return "POSFLAG_1";
1779     case DT_SYMINSZ:    return "SYMINSZ";
1780     case DT_SYMINENT:   return "SYMINENT"; /* aka VALRNGHI */
1781
1782     case DT_ADDRRNGLO:  return "ADDRRNGLO";
1783     case DT_CONFIG:     return "CONFIG";
1784     case DT_DEPAUDIT:   return "DEPAUDIT";
1785     case DT_AUDIT:      return "AUDIT";
1786     case DT_PLTPAD:     return "PLTPAD";
1787     case DT_MOVETAB:    return "MOVETAB";
1788     case DT_SYMINFO:    return "SYMINFO"; /* aka ADDRRNGHI */
1789
1790     case DT_VERSYM:     return "VERSYM";
1791
1792     case DT_TLSDESC_GOT: return "TLSDESC_GOT";
1793     case DT_TLSDESC_PLT: return "TLSDESC_PLT";
1794     case DT_RELACOUNT:  return "RELACOUNT";
1795     case DT_RELCOUNT:   return "RELCOUNT";
1796     case DT_FLAGS_1:    return "FLAGS_1";
1797     case DT_VERDEF:     return "VERDEF";
1798     case DT_VERDEFNUM:  return "VERDEFNUM";
1799     case DT_VERNEED:    return "VERNEED";
1800     case DT_VERNEEDNUM: return "VERNEEDNUM";
1801
1802     case DT_AUXILIARY:  return "AUXILIARY";
1803     case DT_USED:       return "USED";
1804     case DT_FILTER:     return "FILTER";
1805
1806     case DT_GNU_PRELINKED: return "GNU_PRELINKED";
1807     case DT_GNU_CONFLICT: return "GNU_CONFLICT";
1808     case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
1809     case DT_GNU_LIBLIST: return "GNU_LIBLIST";
1810     case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
1811     case DT_GNU_HASH:   return "GNU_HASH";
1812
1813     default:
1814       if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
1815         {
1816           const char * result;
1817
1818           switch (elf_header.e_machine)
1819             {
1820             case EM_MIPS:
1821             case EM_MIPS_RS3_LE:
1822               result = get_mips_dynamic_type (type);
1823               break;
1824             case EM_SPARCV9:
1825               result = get_sparc64_dynamic_type (type);
1826               break;
1827             case EM_PPC:
1828               result = get_ppc_dynamic_type (type);
1829               break;
1830             case EM_PPC64:
1831               result = get_ppc64_dynamic_type (type);
1832               break;
1833             case EM_IA_64:
1834               result = get_ia64_dynamic_type (type);
1835               break;
1836             case EM_ALPHA:
1837               result = get_alpha_dynamic_type (type);
1838               break;
1839             case EM_SCORE:
1840               result = get_score_dynamic_type (type);
1841               break;
1842             case EM_TI_C6000:
1843               result = get_tic6x_dynamic_type (type);
1844               break;
1845             case EM_ALTERA_NIOS2:
1846               result = get_nios2_dynamic_type (type);
1847               break;
1848             default:
1849               result = NULL;
1850               break;
1851             }
1852
1853           if (result != NULL)
1854             return result;
1855
1856           snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
1857         }
1858       else if (((type >= DT_LOOS) && (type <= DT_HIOS))
1859                || (elf_header.e_machine == EM_PARISC
1860                    && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
1861         {
1862           const char * result;
1863
1864           switch (elf_header.e_machine)
1865             {
1866             case EM_PARISC:
1867               result = get_parisc_dynamic_type (type);
1868               break;
1869             case EM_IA_64:
1870               result = get_ia64_dynamic_type (type);
1871               break;
1872             default:
1873               result = NULL;
1874               break;
1875             }
1876
1877           if (result != NULL)
1878             return result;
1879
1880           snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
1881                     type);
1882         }
1883       else
1884         snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
1885
1886       return buff;
1887     }
1888 }
1889
1890 static char *
1891 get_file_type (unsigned e_type)
1892 {
1893   static char buff[32];
1894
1895   switch (e_type)
1896     {
1897     case ET_NONE:       return _("NONE (None)");
1898     case ET_REL:        return _("REL (Relocatable file)");
1899     case ET_EXEC:       return _("EXEC (Executable file)");
1900     case ET_DYN:        return _("DYN (Shared object file)");
1901     case ET_CORE:       return _("CORE (Core file)");
1902
1903     default:
1904       if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
1905         snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
1906       else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
1907         snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
1908       else
1909         snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
1910       return buff;
1911     }
1912 }
1913
1914 static char *
1915 get_machine_name (unsigned e_machine)
1916 {
1917   static char buff[64]; /* XXX */
1918
1919   switch (e_machine)
1920     {
1921     case EM_NONE:               return _("None");
1922     case EM_AARCH64:            return "AArch64";
1923     case EM_M32:                return "WE32100";
1924     case EM_SPARC:              return "Sparc";
1925     case EM_SPU:                return "SPU";
1926     case EM_386:                return "Intel 80386";
1927     case EM_68K:                return "MC68000";
1928     case EM_88K:                return "MC88000";
1929     case EM_486:                return "Intel 80486";
1930     case EM_860:                return "Intel 80860";
1931     case EM_MIPS:               return "MIPS R3000";
1932     case EM_S370:               return "IBM System/370";
1933     case EM_MIPS_RS3_LE:        return "MIPS R4000 big-endian";
1934     case EM_OLD_SPARCV9:        return "Sparc v9 (old)";
1935     case EM_PARISC:             return "HPPA";
1936     case EM_PPC_OLD:            return "Power PC (old)";
1937     case EM_SPARC32PLUS:        return "Sparc v8+" ;
1938     case EM_960:                return "Intel 90860";
1939     case EM_PPC:                return "PowerPC";
1940     case EM_PPC64:              return "PowerPC64";
1941     case EM_FR20:               return "Fujitsu FR20";
1942     case EM_RH32:               return "TRW RH32";
1943     case EM_MCORE:              return "MCORE";
1944     case EM_ARM:                return "ARM";
1945     case EM_OLD_ALPHA:          return "Digital Alpha (old)";
1946     case EM_SH:                 return "Renesas / SuperH SH";
1947     case EM_SPARCV9:            return "Sparc v9";
1948     case EM_TRICORE:            return "Siemens Tricore";
1949     case EM_ARC:                return "ARC";
1950     case EM_H8_300:             return "Renesas H8/300";
1951     case EM_H8_300H:            return "Renesas H8/300H";
1952     case EM_H8S:                return "Renesas H8S";
1953     case EM_H8_500:             return "Renesas H8/500";
1954     case EM_IA_64:              return "Intel IA-64";
1955     case EM_MIPS_X:             return "Stanford MIPS-X";
1956     case EM_COLDFIRE:           return "Motorola Coldfire";
1957     case EM_ALPHA:              return "Alpha";
1958     case EM_CYGNUS_D10V:
1959     case EM_D10V:               return "d10v";
1960     case EM_CYGNUS_D30V:
1961     case EM_D30V:               return "d30v";
1962     case EM_CYGNUS_M32R:
1963     case EM_M32R:               return "Renesas M32R (formerly Mitsubishi M32r)";
1964     case EM_CYGNUS_V850:
1965     case EM_V800:               return "Renesas V850 (using RH850 ABI)";
1966     case EM_V850:               return "Renesas V850";
1967     case EM_CYGNUS_MN10300:
1968     case EM_MN10300:            return "mn10300";
1969     case EM_CYGNUS_MN10200:
1970     case EM_MN10200:            return "mn10200";
1971     case EM_MOXIE:              return "Moxie";
1972     case EM_CYGNUS_FR30:
1973     case EM_FR30:               return "Fujitsu FR30";
1974     case EM_CYGNUS_FRV:         return "Fujitsu FR-V";
1975     case EM_PJ_OLD:
1976     case EM_PJ:                 return "picoJava";
1977     case EM_MMA:                return "Fujitsu Multimedia Accelerator";
1978     case EM_PCP:                return "Siemens PCP";
1979     case EM_NCPU:               return "Sony nCPU embedded RISC processor";
1980     case EM_NDR1:               return "Denso NDR1 microprocesspr";
1981     case EM_STARCORE:           return "Motorola Star*Core processor";
1982     case EM_ME16:               return "Toyota ME16 processor";
1983     case EM_ST100:              return "STMicroelectronics ST100 processor";
1984     case EM_TINYJ:              return "Advanced Logic Corp. TinyJ embedded processor";
1985     case EM_PDSP:               return "Sony DSP processor";
1986     case EM_PDP10:              return "Digital Equipment Corp. PDP-10";
1987     case EM_PDP11:              return "Digital Equipment Corp. PDP-11";
1988     case EM_FX66:               return "Siemens FX66 microcontroller";
1989     case EM_ST9PLUS:            return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1990     case EM_ST7:                return "STMicroelectronics ST7 8-bit microcontroller";
1991     case EM_68HC16:             return "Motorola MC68HC16 Microcontroller";
1992     case EM_68HC12:             return "Motorola MC68HC12 Microcontroller";
1993     case EM_68HC11:             return "Motorola MC68HC11 Microcontroller";
1994     case EM_68HC08:             return "Motorola MC68HC08 Microcontroller";
1995     case EM_68HC05:             return "Motorola MC68HC05 Microcontroller";
1996     case EM_SVX:                return "Silicon Graphics SVx";
1997     case EM_ST19:               return "STMicroelectronics ST19 8-bit microcontroller";
1998     case EM_VAX:                return "Digital VAX";
1999     case EM_AVR_OLD:
2000     case EM_AVR:                return "Atmel AVR 8-bit microcontroller";
2001     case EM_CRIS:               return "Axis Communications 32-bit embedded processor";
2002     case EM_JAVELIN:            return "Infineon Technologies 32-bit embedded cpu";
2003     case EM_FIREPATH:           return "Element 14 64-bit DSP processor";
2004     case EM_ZSP:                return "LSI Logic's 16-bit DSP processor";
2005     case EM_MMIX:               return "Donald Knuth's educational 64-bit processor";
2006     case EM_HUANY:              return "Harvard Universitys's machine-independent object format";
2007     case EM_PRISM:              return "Vitesse Prism";
2008     case EM_X86_64:             return "Advanced Micro Devices X86-64";
2009     case EM_L1OM:               return "Intel L1OM";
2010     case EM_K1OM:               return "Intel K1OM";
2011     case EM_S390_OLD:
2012     case EM_S390:               return "IBM S/390";
2013     case EM_SCORE:              return "SUNPLUS S+Core";
2014     case EM_XSTORMY16:          return "Sanyo XStormy16 CPU core";
2015     case EM_OR1K:               return "OpenRISC 1000";
2016     case EM_ARC_A5:             return "ARC International ARCompact processor";
2017     case EM_CRX:                return "National Semiconductor CRX microprocessor";
2018     case EM_ADAPTEVA_EPIPHANY:  return "Adapteva EPIPHANY";
2019     case EM_DLX:                return "OpenDLX";
2020     case EM_IP2K_OLD:
2021     case EM_IP2K:               return "Ubicom IP2xxx 8-bit microcontrollers";
2022     case EM_IQ2000:             return "Vitesse IQ2000";
2023     case EM_XTENSA_OLD:
2024     case EM_XTENSA:             return "Tensilica Xtensa Processor";
2025     case EM_VIDEOCORE:          return "Alphamosaic VideoCore processor";
2026     case EM_TMM_GPP:            return "Thompson Multimedia General Purpose Processor";
2027     case EM_NS32K:              return "National Semiconductor 32000 series";
2028     case EM_TPC:                return "Tenor Network TPC processor";
2029     case EM_ST200:              return "STMicroelectronics ST200 microcontroller";
2030     case EM_MAX:                return "MAX Processor";
2031     case EM_CR:                 return "National Semiconductor CompactRISC";
2032     case EM_F2MC16:             return "Fujitsu F2MC16";
2033     case EM_MSP430:             return "Texas Instruments msp430 microcontroller";
2034     case EM_LATTICEMICO32:      return "Lattice Mico32";
2035     case EM_M32C_OLD:
2036     case EM_M32C:               return "Renesas M32c";
2037     case EM_MT:                 return "Morpho Techologies MT processor";
2038     case EM_BLACKFIN:           return "Analog Devices Blackfin";
2039     case EM_SE_C33:             return "S1C33 Family of Seiko Epson processors";
2040     case EM_SEP:                return "Sharp embedded microprocessor";
2041     case EM_ARCA:               return "Arca RISC microprocessor";
2042     case EM_UNICORE:            return "Unicore";
2043     case EM_EXCESS:             return "eXcess 16/32/64-bit configurable embedded CPU";
2044     case EM_DXP:                return "Icera Semiconductor Inc. Deep Execution Processor";
2045     case EM_NIOS32:             return "Altera Nios";
2046     case EM_ALTERA_NIOS2:       return "Altera Nios II";
2047     case EM_C166:
2048     case EM_XC16X:              return "Infineon Technologies xc16x";
2049     case EM_M16C:               return "Renesas M16C series microprocessors";
2050     case EM_DSPIC30F:           return "Microchip Technology dsPIC30F Digital Signal Controller";
2051     case EM_CE:                 return "Freescale Communication Engine RISC core";
2052     case EM_TSK3000:            return "Altium TSK3000 core";
2053     case EM_RS08:               return "Freescale RS08 embedded processor";
2054     case EM_ECOG2:              return "Cyan Technology eCOG2 microprocessor";
2055     case EM_DSP24:              return "New Japan Radio (NJR) 24-bit DSP Processor";
2056     case EM_VIDEOCORE3:         return "Broadcom VideoCore III processor";
2057     case EM_SE_C17:             return "Seiko Epson C17 family";
2058     case EM_TI_C6000:           return "Texas Instruments TMS320C6000 DSP family";
2059     case EM_TI_C2000:           return "Texas Instruments TMS320C2000 DSP family";
2060     case EM_TI_C5500:           return "Texas Instruments TMS320C55x DSP family";
2061     case EM_MMDSP_PLUS:         return "STMicroelectronics 64bit VLIW Data Signal Processor";
2062     case EM_CYPRESS_M8C:        return "Cypress M8C microprocessor";
2063     case EM_R32C:               return "Renesas R32C series microprocessors";
2064     case EM_TRIMEDIA:           return "NXP Semiconductors TriMedia architecture family";
2065     case EM_QDSP6:              return "QUALCOMM DSP6 Processor";
2066     case EM_8051:               return "Intel 8051 and variants";
2067     case EM_STXP7X:             return "STMicroelectronics STxP7x family";
2068     case EM_NDS32:              return "Andes Technology compact code size embedded RISC processor family";
2069     case EM_ECOG1X:             return "Cyan Technology eCOG1X family";
2070     case EM_MAXQ30:             return "Dallas Semiconductor MAXQ30 Core microcontrollers";
2071     case EM_XIMO16:             return "New Japan Radio (NJR) 16-bit DSP Processor";
2072     case EM_MANIK:              return "M2000 Reconfigurable RISC Microprocessor";
2073     case EM_CRAYNV2:            return "Cray Inc. NV2 vector architecture";
2074     case EM_CYGNUS_MEP:         return "Toshiba MeP Media Engine";
2075     case EM_CR16:
2076     case EM_MICROBLAZE:
2077     case EM_MICROBLAZE_OLD:     return "Xilinx MicroBlaze";
2078     case EM_RL78:               return "Renesas RL78";
2079     case EM_RX:                 return "Renesas RX";
2080     case EM_METAG:              return "Imagination Technologies Meta processor architecture";
2081     case EM_MCST_ELBRUS:        return "MCST Elbrus general purpose hardware architecture";
2082     case EM_ECOG16:             return "Cyan Technology eCOG16 family";
2083     case EM_ETPU:               return "Freescale Extended Time Processing Unit";
2084     case EM_SLE9X:              return "Infineon Technologies SLE9X core";
2085     case EM_AVR32:              return "Atmel Corporation 32-bit microprocessor family";
2086     case EM_STM8:               return "STMicroeletronics STM8 8-bit microcontroller";
2087     case EM_TILE64:             return "Tilera TILE64 multicore architecture family";
2088     case EM_TILEPRO:            return "Tilera TILEPro multicore architecture family";
2089     case EM_TILEGX:             return "Tilera TILE-Gx multicore architecture family";
2090     case EM_CUDA:               return "NVIDIA CUDA architecture";
2091     case EM_XGATE:              return "Motorola XGATE embedded processor";
2092     default:
2093       snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
2094       return buff;
2095     }
2096 }
2097
2098 static void
2099 decode_ARM_machine_flags (unsigned e_flags, char buf[])
2100 {
2101   unsigned eabi;
2102   int unknown = 0;
2103
2104   eabi = EF_ARM_EABI_VERSION (e_flags);
2105   e_flags &= ~ EF_ARM_EABIMASK;
2106
2107   /* Handle "generic" ARM flags.  */
2108   if (e_flags & EF_ARM_RELEXEC)
2109     {
2110       strcat (buf, ", relocatable executable");
2111       e_flags &= ~ EF_ARM_RELEXEC;
2112     }
2113
2114   if (e_flags & EF_ARM_HASENTRY)
2115     {
2116       strcat (buf, ", has entry point");
2117       e_flags &= ~ EF_ARM_HASENTRY;
2118     }
2119
2120   /* Now handle EABI specific flags.  */
2121   switch (eabi)
2122     {
2123     default:
2124       strcat (buf, ", <unrecognized EABI>");
2125       if (e_flags)
2126         unknown = 1;
2127       break;
2128
2129     case EF_ARM_EABI_VER1:
2130       strcat (buf, ", Version1 EABI");
2131       while (e_flags)
2132         {
2133           unsigned flag;
2134
2135           /* Process flags one bit at a time.  */
2136           flag = e_flags & - e_flags;
2137           e_flags &= ~ flag;
2138
2139           switch (flag)
2140             {
2141             case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK.  */
2142               strcat (buf, ", sorted symbol tables");
2143               break;
2144
2145             default:
2146               unknown = 1;
2147               break;
2148             }
2149         }
2150       break;
2151
2152     case EF_ARM_EABI_VER2:
2153       strcat (buf, ", Version2 EABI");
2154       while (e_flags)
2155         {
2156           unsigned flag;
2157
2158           /* Process flags one bit at a time.  */
2159           flag = e_flags & - e_flags;
2160           e_flags &= ~ flag;
2161
2162           switch (flag)
2163             {
2164             case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK.  */
2165               strcat (buf, ", sorted symbol tables");
2166               break;
2167
2168             case EF_ARM_DYNSYMSUSESEGIDX:
2169               strcat (buf, ", dynamic symbols use segment index");
2170               break;
2171
2172             case EF_ARM_MAPSYMSFIRST:
2173               strcat (buf, ", mapping symbols precede others");
2174               break;
2175
2176             default:
2177               unknown = 1;
2178               break;
2179             }
2180         }
2181       break;
2182
2183     case EF_ARM_EABI_VER3:
2184       strcat (buf, ", Version3 EABI");
2185       break;
2186
2187     case EF_ARM_EABI_VER4:
2188       strcat (buf, ", Version4 EABI");
2189       while (e_flags)
2190         {
2191           unsigned flag;
2192
2193           /* Process flags one bit at a time.  */
2194           flag = e_flags & - e_flags;
2195           e_flags &= ~ flag;
2196
2197           switch (flag)
2198             {
2199             case EF_ARM_BE8:
2200               strcat (buf, ", BE8");
2201               break;
2202
2203             case EF_ARM_LE8:
2204               strcat (buf, ", LE8");
2205               break;
2206
2207             default:
2208               unknown = 1;
2209               break;
2210             }
2211       break;
2212         }
2213       break;
2214
2215     case EF_ARM_EABI_VER5:
2216       strcat (buf, ", Version5 EABI");
2217       while (e_flags)
2218         {
2219           unsigned flag;
2220
2221           /* Process flags one bit at a time.  */
2222           flag = e_flags & - e_flags;
2223           e_flags &= ~ flag;
2224
2225           switch (flag)
2226             {
2227             case EF_ARM_BE8:
2228               strcat (buf, ", BE8");
2229               break;
2230
2231             case EF_ARM_LE8:
2232               strcat (buf, ", LE8");
2233               break;
2234
2235             case EF_ARM_ABI_FLOAT_SOFT: /* Conflicts with EF_ARM_SOFT_FLOAT.  */
2236               strcat (buf, ", soft-float ABI");
2237               break;
2238
2239             case EF_ARM_ABI_FLOAT_HARD: /* Conflicts with EF_ARM_VFP_FLOAT.  */
2240               strcat (buf, ", hard-float ABI");
2241               break;
2242
2243             default:
2244               unknown = 1;
2245               break;
2246             }
2247         }
2248       break;
2249
2250     case EF_ARM_EABI_UNKNOWN:
2251       strcat (buf, ", GNU EABI");
2252       while (e_flags)
2253         {
2254           unsigned flag;
2255
2256           /* Process flags one bit at a time.  */
2257           flag = e_flags & - e_flags;
2258           e_flags &= ~ flag;
2259
2260           switch (flag)
2261             {
2262             case EF_ARM_INTERWORK:
2263               strcat (buf, ", interworking enabled");
2264               break;
2265
2266             case EF_ARM_APCS_26:
2267               strcat (buf, ", uses APCS/26");
2268               break;
2269
2270             case EF_ARM_APCS_FLOAT:
2271               strcat (buf, ", uses APCS/float");
2272               break;
2273
2274             case EF_ARM_PIC:
2275               strcat (buf, ", position independent");
2276               break;
2277
2278             case EF_ARM_ALIGN8:
2279               strcat (buf, ", 8 bit structure alignment");
2280               break;
2281
2282             case EF_ARM_NEW_ABI:
2283               strcat (buf, ", uses new ABI");
2284               break;
2285
2286             case EF_ARM_OLD_ABI:
2287               strcat (buf, ", uses old ABI");
2288               break;
2289
2290             case EF_ARM_SOFT_FLOAT:
2291               strcat (buf, ", software FP");
2292               break;
2293
2294             case EF_ARM_VFP_FLOAT:
2295               strcat (buf, ", VFP");
2296               break;
2297
2298             case EF_ARM_MAVERICK_FLOAT:
2299               strcat (buf, ", Maverick FP");
2300               break;
2301
2302             default:
2303               unknown = 1;
2304               break;
2305             }
2306         }
2307     }
2308
2309   if (unknown)
2310     strcat (buf,_(", <unknown>"));
2311 }
2312
2313 static void
2314 decode_NDS32_machine_flags (unsigned e_flags, char buf[], size_t size)
2315 {
2316   unsigned abi;
2317   unsigned arch;
2318   unsigned config;
2319   unsigned version;
2320   int has_fpu = 0;
2321   int r = 0;
2322
2323   static const char *ABI_STRINGS[] =
2324   {
2325     "ABI v0", /* use r5 as return register; only used in N1213HC */
2326     "ABI v1", /* use r0 as return register */
2327     "ABI v2", /* use r0 as return register and don't reserve 24 bytes for arguments */
2328     "ABI v2fp", /* for FPU */
2329     "AABI"
2330   };
2331   static const char *VER_STRINGS[] =
2332   {
2333     "Andes ELF V1.3 or older",
2334     "Andes ELF V1.3.1",
2335     "Andes ELF V1.4"
2336   };
2337   static const char *ARCH_STRINGS[] =
2338   {
2339     "",
2340     "Andes Star v1.0",
2341     "Andes Star v2.0",
2342     "Andes Star v3.0",
2343     "Andes Star v3.0m"
2344   };
2345
2346   abi = EF_NDS_ABI & e_flags;
2347   arch = EF_NDS_ARCH & e_flags;
2348   config = EF_NDS_INST & e_flags;
2349   version = EF_NDS32_ELF_VERSION & e_flags;
2350
2351   memset (buf, 0, size);
2352
2353   switch (abi)
2354     {
2355     case E_NDS_ABI_V0:
2356     case E_NDS_ABI_V1:
2357     case E_NDS_ABI_V2:
2358     case E_NDS_ABI_V2FP:
2359     case E_NDS_ABI_AABI:
2360       /* In case there are holes in the array.  */
2361       r += snprintf (buf + r, size - r, ", %s", ABI_STRINGS[abi >> EF_NDS_ABI_SHIFT]);
2362       break;
2363
2364     default:
2365       r += snprintf (buf + r, size - r, ", <unrecognized ABI>");
2366       break;
2367     }
2368
2369   switch (version)
2370     {
2371     case E_NDS32_ELF_VER_1_2:
2372     case E_NDS32_ELF_VER_1_3:
2373     case E_NDS32_ELF_VER_1_4:
2374       r += snprintf (buf + r, size - r, ", %s", VER_STRINGS[version >> EF_NDS32_ELF_VERSION_SHIFT]);
2375       break;
2376
2377     default:
2378       r += snprintf (buf + r, size - r, ", <unrecognized ELF version number>");
2379       break;
2380     }
2381
2382   if (E_NDS_ABI_V0 == abi)
2383     {
2384       /* OLD ABI; only used in N1213HC, has performance extension 1.  */
2385       r += snprintf (buf + r, size - r, ", Andes Star v1.0, N1213HC, MAC, PERF1");
2386       if (arch == E_NDS_ARCH_STAR_V1_0)
2387         r += snprintf (buf + r, size -r, ", 16b"); /* has 16-bit instructions */
2388       return;
2389     }
2390
2391   switch (arch)
2392     {
2393     case E_NDS_ARCH_STAR_V1_0:
2394     case E_NDS_ARCH_STAR_V2_0:
2395     case E_NDS_ARCH_STAR_V3_0:
2396     case E_NDS_ARCH_STAR_V3_M:
2397       r += snprintf (buf + r, size - r, ", %s", ARCH_STRINGS[arch >> EF_NDS_ARCH_SHIFT]);
2398       break;
2399
2400     default:
2401       r += snprintf (buf + r, size - r, ", <unrecognized architecture>");
2402       /* ARCH version determines how the e_flags are interpreted.
2403          If it is unknown, we cannot proceed.  */
2404       return;
2405     }
2406
2407   /* Newer ABI; Now handle architecture specific flags.  */
2408   if (arch == E_NDS_ARCH_STAR_V1_0)
2409     {
2410       if (config & E_NDS32_HAS_MFUSR_PC_INST)
2411         r += snprintf (buf + r, size -r, ", MFUSR_PC");
2412
2413       if (!(config & E_NDS32_HAS_NO_MAC_INST))
2414         r += snprintf (buf + r, size -r, ", MAC");
2415
2416       if (config & E_NDS32_HAS_DIV_INST)
2417         r += snprintf (buf + r, size -r, ", DIV");
2418
2419       if (config & E_NDS32_HAS_16BIT_INST)
2420         r += snprintf (buf + r, size -r, ", 16b");
2421     }
2422   else
2423     {
2424       if (config & E_NDS32_HAS_MFUSR_PC_INST)
2425         {
2426           if (version <= E_NDS32_ELF_VER_1_3)
2427             r += snprintf (buf + r, size -r, ", [B8]");
2428           else
2429             r += snprintf (buf + r, size -r, ", EX9");
2430         }
2431
2432       if (config & E_NDS32_HAS_MAC_DX_INST)
2433         r += snprintf (buf + r, size -r, ", MAC_DX");
2434
2435       if (config & E_NDS32_HAS_DIV_DX_INST)
2436         r += snprintf (buf + r, size -r, ", DIV_DX");
2437
2438       if (config & E_NDS32_HAS_16BIT_INST)
2439         {
2440           if (version <= E_NDS32_ELF_VER_1_3)
2441             r += snprintf (buf + r, size -r, ", 16b");
2442           else
2443             r += snprintf (buf + r, size -r, ", IFC");
2444         }
2445     }
2446
2447   if (config & E_NDS32_HAS_EXT_INST)
2448     r += snprintf (buf + r, size -r, ", PERF1");
2449
2450   if (config & E_NDS32_HAS_EXT2_INST)
2451     r += snprintf (buf + r, size -r, ", PERF2");
2452
2453   if (config & E_NDS32_HAS_FPU_INST)
2454     {
2455       has_fpu = 1;
2456       r += snprintf (buf + r, size -r, ", FPU_SP");
2457     }
2458
2459   if (config & E_NDS32_HAS_FPU_DP_INST)
2460     {
2461       has_fpu = 1;
2462       r += snprintf (buf + r, size -r, ", FPU_DP");
2463     }
2464
2465   if (config & E_NDS32_HAS_FPU_MAC_INST)
2466     {
2467       has_fpu = 1;
2468       r += snprintf (buf + r, size -r, ", FPU_MAC");
2469     }
2470
2471   if (has_fpu)
2472     {
2473       switch ((config & E_NDS32_FPU_REG_CONF) >> E_NDS32_FPU_REG_CONF_SHIFT)
2474         {
2475         case E_NDS32_FPU_REG_8SP_4DP:
2476           r += snprintf (buf + r, size -r, ", FPU_REG:8/4");
2477           break;
2478         case E_NDS32_FPU_REG_16SP_8DP:
2479           r += snprintf (buf + r, size -r, ", FPU_REG:16/8");
2480           break;
2481         case E_NDS32_FPU_REG_32SP_16DP:
2482           r += snprintf (buf + r, size -r, ", FPU_REG:32/16");
2483           break;
2484         case E_NDS32_FPU_REG_32SP_32DP:
2485           r += snprintf (buf + r, size -r, ", FPU_REG:32/32");
2486           break;
2487         }
2488     }
2489
2490   if (config & E_NDS32_HAS_AUDIO_INST)
2491     r += snprintf (buf + r, size -r, ", AUDIO");
2492
2493   if (config & E_NDS32_HAS_STRING_INST)
2494     r += snprintf (buf + r, size -r, ", STR");
2495
2496   if (config & E_NDS32_HAS_REDUCED_REGS)
2497     r += snprintf (buf + r, size -r, ", 16REG");
2498
2499   if (config & E_NDS32_HAS_VIDEO_INST)
2500     {
2501       if (version <= E_NDS32_ELF_VER_1_3)
2502         r += snprintf (buf + r, size -r, ", VIDEO");
2503       else
2504         r += snprintf (buf + r, size -r, ", SATURATION");
2505     }
2506
2507   if (config & E_NDS32_HAS_ENCRIPT_INST)
2508     r += snprintf (buf + r, size -r, ", ENCRP");
2509
2510   if (config & E_NDS32_HAS_L2C_INST)
2511     r += snprintf (buf + r, size -r, ", L2C");
2512 }
2513
2514 static char *
2515 get_machine_flags (unsigned e_flags, unsigned e_machine)
2516 {
2517   static char buf[1024];
2518
2519   buf[0] = '\0';
2520
2521   if (e_flags)
2522     {
2523       switch (e_machine)
2524         {
2525         default:
2526           break;
2527
2528         case EM_ARM:
2529           decode_ARM_machine_flags (e_flags, buf);
2530           break;
2531
2532         case EM_BLACKFIN:
2533           if (e_flags & EF_BFIN_PIC)
2534             strcat (buf, ", PIC");
2535
2536           if (e_flags & EF_BFIN_FDPIC)
2537             strcat (buf, ", FDPIC");
2538
2539           if (e_flags & EF_BFIN_CODE_IN_L1)
2540             strcat (buf, ", code in L1");
2541
2542           if (e_flags & EF_BFIN_DATA_IN_L1)
2543             strcat (buf, ", data in L1");
2544
2545           break;
2546
2547         case EM_CYGNUS_FRV:
2548           switch (e_flags & EF_FRV_CPU_MASK)
2549             {
2550             case EF_FRV_CPU_GENERIC:
2551               break;
2552
2553             default:
2554               strcat (buf, ", fr???");
2555               break;
2556
2557             case EF_FRV_CPU_FR300:
2558               strcat (buf, ", fr300");
2559               break;
2560
2561             case EF_FRV_CPU_FR400:
2562               strcat (buf, ", fr400");
2563               break;
2564             case EF_FRV_CPU_FR405:
2565               strcat (buf, ", fr405");
2566               break;
2567
2568             case EF_FRV_CPU_FR450:
2569               strcat (buf, ", fr450");
2570               break;
2571
2572             case EF_FRV_CPU_FR500:
2573               strcat (buf, ", fr500");
2574               break;
2575             case EF_FRV_CPU_FR550:
2576               strcat (buf, ", fr550");
2577               break;
2578
2579             case EF_FRV_CPU_SIMPLE:
2580               strcat (buf, ", simple");
2581               break;
2582             case EF_FRV_CPU_TOMCAT:
2583               strcat (buf, ", tomcat");
2584               break;
2585             }
2586           break;
2587
2588         case EM_68K:
2589           if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
2590             strcat (buf, ", m68000");
2591           else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
2592             strcat (buf, ", cpu32");
2593           else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
2594             strcat (buf, ", fido_a");
2595           else
2596             {
2597               char const * isa = _("unknown");
2598               char const * mac = _("unknown mac");
2599               char const * additional = NULL;
2600
2601               switch (e_flags & EF_M68K_CF_ISA_MASK)
2602                 {
2603                 case EF_M68K_CF_ISA_A_NODIV:
2604                   isa = "A";
2605                   additional = ", nodiv";
2606                   break;
2607                 case EF_M68K_CF_ISA_A:
2608                   isa = "A";
2609                   break;
2610                 case EF_M68K_CF_ISA_A_PLUS:
2611                   isa = "A+";
2612                   break;
2613                 case EF_M68K_CF_ISA_B_NOUSP:
2614                   isa = "B";
2615                   additional = ", nousp";
2616                   break;
2617                 case EF_M68K_CF_ISA_B:
2618                   isa = "B";
2619                   break;
2620                 case EF_M68K_CF_ISA_C:
2621                   isa = "C";
2622                   break;
2623                 case EF_M68K_CF_ISA_C_NODIV:
2624                   isa = "C";
2625                   additional = ", nodiv";
2626                   break;
2627                 }
2628               strcat (buf, ", cf, isa ");
2629               strcat (buf, isa);
2630               if (additional)
2631                 strcat (buf, additional);
2632               if (e_flags & EF_M68K_CF_FLOAT)
2633                 strcat (buf, ", float");
2634               switch (e_flags & EF_M68K_CF_MAC_MASK)
2635                 {
2636                 case 0:
2637                   mac = NULL;
2638                   break;
2639                 case EF_M68K_CF_MAC:
2640                   mac = "mac";
2641                   break;
2642                 case EF_M68K_CF_EMAC:
2643                   mac = "emac";
2644                   break;
2645                 case EF_M68K_CF_EMAC_B:
2646                   mac = "emac_b";
2647                   break;
2648                 }
2649               if (mac)
2650                 {
2651                   strcat (buf, ", ");
2652                   strcat (buf, mac);
2653                 }
2654             }
2655           break;
2656
2657         case EM_PPC:
2658           if (e_flags & EF_PPC_EMB)
2659             strcat (buf, ", emb");
2660
2661           if (e_flags & EF_PPC_RELOCATABLE)
2662             strcat (buf, _(", relocatable"));
2663
2664           if (e_flags & EF_PPC_RELOCATABLE_LIB)
2665             strcat (buf, _(", relocatable-lib"));
2666           break;
2667
2668         case EM_PPC64:
2669           if (e_flags & EF_PPC64_ABI)
2670             {
2671               char abi[] = ", abiv0";
2672
2673               abi[6] += e_flags & EF_PPC64_ABI;
2674               strcat (buf, abi);
2675             }
2676           break;
2677
2678         case EM_V800:
2679           if ((e_flags & EF_RH850_ABI) == EF_RH850_ABI)
2680             strcat (buf, ", RH850 ABI");
2681
2682           if (e_flags & EF_V800_850E3)
2683             strcat (buf, ", V3 architecture");
2684
2685           if ((e_flags & (EF_RH850_FPU_DOUBLE | EF_RH850_FPU_SINGLE)) == 0)
2686             strcat (buf, ", FPU not used");
2687
2688           if ((e_flags & (EF_RH850_REGMODE22 | EF_RH850_REGMODE32)) == 0)
2689             strcat (buf, ", regmode: COMMON");
2690
2691           if ((e_flags & (EF_RH850_GP_FIX | EF_RH850_GP_NOFIX)) == 0)
2692             strcat (buf, ", r4 not used");
2693
2694           if ((e_flags & (EF_RH850_EP_FIX | EF_RH850_EP_NOFIX)) == 0)
2695             strcat (buf, ", r30 not used");
2696
2697           if ((e_flags & (EF_RH850_TP_FIX | EF_RH850_TP_NOFIX)) == 0)
2698             strcat (buf, ", r5 not used");
2699
2700           if ((e_flags & (EF_RH850_REG2_RESERVE | EF_RH850_REG2_NORESERVE)) == 0)
2701             strcat (buf, ", r2 not used");
2702
2703           for (e_flags &= 0xFFFF; e_flags; e_flags &= ~ (e_flags & - e_flags))
2704             {
2705               switch (e_flags & - e_flags)
2706                 {
2707                 case EF_RH850_FPU_DOUBLE: strcat (buf, ", double precision FPU"); break;
2708                 case EF_RH850_FPU_SINGLE: strcat (buf, ", single precision FPU"); break;
2709                 case EF_RH850_SIMD: strcat (buf, ", SIMD"); break;
2710                 case EF_RH850_CACHE: strcat (buf, ", CACHE"); break;
2711                 case EF_RH850_MMU: strcat (buf, ", MMU"); break;
2712                 case EF_RH850_REGMODE22: strcat (buf, ", regmode:22"); break;
2713                 case EF_RH850_REGMODE32: strcat (buf, ", regmode:23"); break;
2714                 case EF_RH850_DATA_ALIGN8: strcat (buf, ", 8-byte alignment"); break;
2715                 case EF_RH850_GP_FIX: strcat (buf, ", r4 fixed"); break;
2716                 case EF_RH850_GP_NOFIX: strcat (buf, ", r4 free"); break;
2717                 case EF_RH850_EP_FIX: strcat (buf, ", r30 fixed"); break;
2718                 case EF_RH850_EP_NOFIX: strcat (buf, ", r30 free"); break;
2719                 case EF_RH850_TP_FIX: strcat (buf, ", r5 fixed"); break;
2720                 case EF_RH850_TP_NOFIX: strcat (buf, ", r5 free"); break;
2721                 case EF_RH850_REG2_RESERVE: strcat (buf, ", r2 fixed"); break;
2722                 case EF_RH850_REG2_NORESERVE: strcat (buf, ", r2 free"); break;
2723                 default: break;
2724                 }
2725             }
2726           break;
2727
2728         case EM_V850:
2729         case EM_CYGNUS_V850:
2730           switch (e_flags & EF_V850_ARCH)
2731             {
2732             case E_V850E3V5_ARCH:
2733               strcat (buf, ", v850e3v5");
2734               break;
2735             case E_V850E2V3_ARCH:
2736               strcat (buf, ", v850e2v3");
2737               break;
2738             case E_V850E2_ARCH:
2739               strcat (buf, ", v850e2");
2740               break;
2741             case E_V850E1_ARCH:
2742               strcat (buf, ", v850e1");
2743               break;
2744             case E_V850E_ARCH:
2745               strcat (buf, ", v850e");
2746               break;
2747             case E_V850_ARCH:
2748               strcat (buf, ", v850");
2749               break;
2750             default:
2751               strcat (buf, _(", unknown v850 architecture variant"));
2752               break;
2753             }
2754           break;
2755
2756         case EM_M32R:
2757         case EM_CYGNUS_M32R:
2758           if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
2759             strcat (buf, ", m32r");
2760           break;
2761
2762         case EM_MIPS:
2763         case EM_MIPS_RS3_LE:
2764           if (e_flags & EF_MIPS_NOREORDER)
2765             strcat (buf, ", noreorder");
2766
2767           if (e_flags & EF_MIPS_PIC)
2768             strcat (buf, ", pic");
2769
2770           if (e_flags & EF_MIPS_CPIC)
2771             strcat (buf, ", cpic");
2772
2773           if (e_flags & EF_MIPS_UCODE)
2774             strcat (buf, ", ugen_reserved");
2775
2776           if (e_flags & EF_MIPS_ABI2)
2777             strcat (buf, ", abi2");
2778
2779           if (e_flags & EF_MIPS_OPTIONS_FIRST)
2780             strcat (buf, ", odk first");
2781
2782           if (e_flags & EF_MIPS_32BITMODE)
2783             strcat (buf, ", 32bitmode");
2784
2785           if (e_flags & EF_MIPS_NAN2008)
2786             strcat (buf, ", nan2008");
2787
2788           if (e_flags & EF_MIPS_FP64)
2789             strcat (buf, ", fp64");
2790
2791           switch ((e_flags & EF_MIPS_MACH))
2792             {
2793             case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
2794             case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
2795             case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
2796             case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
2797             case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
2798             case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
2799             case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
2800             case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
2801             case E_MIPS_MACH_SB1:  strcat (buf, ", sb1");  break;
2802             case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
2803             case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break;
2804             case E_MIPS_MACH_LS2F: strcat (buf, ", loongson-2f"); break;
2805             case E_MIPS_MACH_LS3A: strcat (buf, ", loongson-3a"); break;
2806             case E_MIPS_MACH_OCTEON: strcat (buf, ", octeon"); break;
2807             case E_MIPS_MACH_OCTEON2: strcat (buf, ", octeon2"); break;
2808             case E_MIPS_MACH_OCTEON3: strcat (buf, ", octeon3"); break;
2809             case E_MIPS_MACH_XLR:  strcat (buf, ", xlr"); break;
2810             case 0:
2811             /* We simply ignore the field in this case to avoid confusion:
2812                MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
2813                extension.  */
2814               break;
2815             default: strcat (buf, _(", unknown CPU")); break;
2816             }
2817
2818           switch ((e_flags & EF_MIPS_ABI))
2819             {
2820             case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
2821             case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
2822             case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
2823             case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
2824             case 0:
2825             /* We simply ignore the field in this case to avoid confusion:
2826                MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
2827                This means it is likely to be an o32 file, but not for
2828                sure.  */
2829               break;
2830             default: strcat (buf, _(", unknown ABI")); break;
2831             }
2832
2833           if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
2834             strcat (buf, ", mdmx");
2835
2836           if (e_flags & EF_MIPS_ARCH_ASE_M16)
2837             strcat (buf, ", mips16");
2838
2839           if (e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
2840             strcat (buf, ", micromips");
2841
2842           switch ((e_flags & EF_MIPS_ARCH))
2843             {
2844             case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
2845             case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
2846             case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
2847             case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
2848             case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
2849             case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
2850             case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
2851             case E_MIPS_ARCH_32R6: strcat (buf, ", mips32r6"); break;
2852             case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
2853             case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
2854             case E_MIPS_ARCH_64R6: strcat (buf, ", mips64r6"); break;
2855             default: strcat (buf, _(", unknown ISA")); break;
2856             }
2857           break;
2858
2859         case EM_NDS32:
2860           decode_NDS32_machine_flags (e_flags, buf, sizeof buf);
2861           break;
2862
2863         case EM_SH:
2864           switch ((e_flags & EF_SH_MACH_MASK))
2865             {
2866             case EF_SH1: strcat (buf, ", sh1"); break;
2867             case EF_SH2: strcat (buf, ", sh2"); break;
2868             case EF_SH3: strcat (buf, ", sh3"); break;
2869             case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
2870             case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
2871             case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
2872             case EF_SH3E: strcat (buf, ", sh3e"); break;
2873             case EF_SH4: strcat (buf, ", sh4"); break;
2874             case EF_SH5: strcat (buf, ", sh5"); break;
2875             case EF_SH2E: strcat (buf, ", sh2e"); break;
2876             case EF_SH4A: strcat (buf, ", sh4a"); break;
2877             case EF_SH2A: strcat (buf, ", sh2a"); break;
2878             case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
2879             case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
2880             case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
2881             case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
2882             case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
2883             case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
2884             case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
2885             case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
2886             case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
2887             default: strcat (buf, _(", unknown ISA")); break;
2888             }
2889
2890           if (e_flags & EF_SH_PIC)
2891             strcat (buf, ", pic");
2892
2893           if (e_flags & EF_SH_FDPIC)
2894             strcat (buf, ", fdpic");
2895           break;
2896           
2897         case EM_OR1K:
2898           if (e_flags & EF_OR1K_NODELAY)
2899             strcat (buf, ", no delay");
2900           break;
2901
2902         case EM_SPARCV9:
2903           if (e_flags & EF_SPARC_32PLUS)
2904             strcat (buf, ", v8+");
2905
2906           if (e_flags & EF_SPARC_SUN_US1)
2907             strcat (buf, ", ultrasparcI");
2908
2909           if (e_flags & EF_SPARC_SUN_US3)
2910             strcat (buf, ", ultrasparcIII");
2911
2912           if (e_flags & EF_SPARC_HAL_R1)
2913             strcat (buf, ", halr1");
2914
2915           if (e_flags & EF_SPARC_LEDATA)
2916             strcat (buf, ", ledata");
2917
2918           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
2919             strcat (buf, ", tso");
2920
2921           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
2922             strcat (buf, ", pso");
2923
2924           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
2925             strcat (buf, ", rmo");
2926           break;
2927
2928         case EM_PARISC:
2929           switch (e_flags & EF_PARISC_ARCH)
2930             {
2931             case EFA_PARISC_1_0:
2932               strcpy (buf, ", PA-RISC 1.0");
2933               break;
2934             case EFA_PARISC_1_1:
2935               strcpy (buf, ", PA-RISC 1.1");
2936               break;
2937             case EFA_PARISC_2_0:
2938               strcpy (buf, ", PA-RISC 2.0");
2939               break;
2940             default:
2941               break;
2942             }
2943           if (e_flags & EF_PARISC_TRAPNIL)
2944             strcat (buf, ", trapnil");
2945           if (e_flags & EF_PARISC_EXT)
2946             strcat (buf, ", ext");
2947           if (e_flags & EF_PARISC_LSB)
2948             strcat (buf, ", lsb");
2949           if (e_flags & EF_PARISC_WIDE)
2950             strcat (buf, ", wide");
2951           if (e_flags & EF_PARISC_NO_KABP)
2952             strcat (buf, ", no kabp");
2953           if (e_flags & EF_PARISC_LAZYSWAP)
2954             strcat (buf, ", lazyswap");
2955           break;
2956
2957         case EM_PJ:
2958         case EM_PJ_OLD:
2959           if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
2960             strcat (buf, ", new calling convention");
2961
2962           if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
2963             strcat (buf, ", gnu calling convention");
2964           break;
2965
2966         case EM_IA_64:
2967           if ((e_flags & EF_IA_64_ABI64))
2968             strcat (buf, ", 64-bit");
2969           else
2970             strcat (buf, ", 32-bit");
2971           if ((e_flags & EF_IA_64_REDUCEDFP))
2972             strcat (buf, ", reduced fp model");
2973           if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
2974             strcat (buf, ", no function descriptors, constant gp");
2975           else if ((e_flags & EF_IA_64_CONS_GP))
2976             strcat (buf, ", constant gp");
2977           if ((e_flags & EF_IA_64_ABSOLUTE))
2978             strcat (buf, ", absolute");
2979           if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
2980             {
2981               if ((e_flags & EF_IA_64_VMS_LINKAGES))
2982                 strcat (buf, ", vms_linkages");
2983               switch ((e_flags & EF_IA_64_VMS_COMCOD))
2984                 {
2985                 case EF_IA_64_VMS_COMCOD_SUCCESS:
2986                   break;
2987                 case EF_IA_64_VMS_COMCOD_WARNING:
2988                   strcat (buf, ", warning");
2989                   break;
2990                 case EF_IA_64_VMS_COMCOD_ERROR:
2991                   strcat (buf, ", error");
2992                   break;
2993                 case EF_IA_64_VMS_COMCOD_ABORT:
2994                   strcat (buf, ", abort");
2995                   break;
2996                 default:
2997                   abort ();
2998                 }
2999             }
3000           break;
3001
3002         case EM_VAX:
3003           if ((e_flags & EF_VAX_NONPIC))
3004             strcat (buf, ", non-PIC");
3005           if ((e_flags & EF_VAX_DFLOAT))
3006             strcat (buf, ", D-Float");
3007           if ((e_flags & EF_VAX_GFLOAT))
3008             strcat (buf, ", G-Float");
3009           break;
3010
3011         case EM_RL78:
3012           if (e_flags & E_FLAG_RL78_G10)
3013             strcat (buf, ", G10");
3014           if (e_flags & E_FLAG_RL78_64BIT_DOUBLES)
3015             strcat (buf, ", 64-bit doubles");
3016           break;
3017
3018         case EM_RX:
3019           if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
3020             strcat (buf, ", 64-bit doubles");
3021           if (e_flags & E_FLAG_RX_DSP)
3022             strcat (buf, ", dsp");
3023           if (e_flags & E_FLAG_RX_PID)
3024             strcat (buf, ", pid");
3025           if (e_flags & E_FLAG_RX_ABI)
3026             strcat (buf, ", RX ABI");
3027           break;
3028
3029         case EM_S390:
3030           if (e_flags & EF_S390_HIGH_GPRS)
3031             strcat (buf, ", highgprs");
3032           break;
3033
3034         case EM_TI_C6000:
3035           if ((e_flags & EF_C6000_REL))
3036             strcat (buf, ", relocatable module");
3037           break;
3038
3039         case EM_MSP430:
3040           strcat (buf, _(": architecture variant: "));
3041           switch (e_flags & EF_MSP430_MACH)
3042             {
3043             case E_MSP430_MACH_MSP430x11: strcat (buf, "MSP430x11"); break;
3044             case E_MSP430_MACH_MSP430x11x1 : strcat (buf, "MSP430x11x1 "); break;
3045             case E_MSP430_MACH_MSP430x12: strcat (buf, "MSP430x12"); break;
3046             case E_MSP430_MACH_MSP430x13: strcat (buf, "MSP430x13"); break;
3047             case E_MSP430_MACH_MSP430x14: strcat (buf, "MSP430x14"); break;
3048             case E_MSP430_MACH_MSP430x15: strcat (buf, "MSP430x15"); break;
3049             case E_MSP430_MACH_MSP430x16: strcat (buf, "MSP430x16"); break;
3050             case E_MSP430_MACH_MSP430x31: strcat (buf, "MSP430x31"); break;
3051             case E_MSP430_MACH_MSP430x32: strcat (buf, "MSP430x32"); break;
3052             case E_MSP430_MACH_MSP430x33: strcat (buf, "MSP430x33"); break;
3053             case E_MSP430_MACH_MSP430x41: strcat (buf, "MSP430x41"); break;
3054             case E_MSP430_MACH_MSP430x42: strcat (buf, "MSP430x42"); break;
3055             case E_MSP430_MACH_MSP430x43: strcat (buf, "MSP430x43"); break;
3056             case E_MSP430_MACH_MSP430x44: strcat (buf, "MSP430x44"); break;
3057             case E_MSP430_MACH_MSP430X  : strcat (buf, "MSP430X"); break;
3058             default:
3059               strcat (buf, _(": unknown")); break;
3060             }
3061
3062           if (e_flags & ~ EF_MSP430_MACH)
3063             strcat (buf, _(": unknown extra flag bits also present"));
3064         }
3065     }
3066
3067   return buf;
3068 }
3069
3070 static const char *
3071 get_osabi_name (unsigned int osabi)
3072 {
3073   static char buff[32];
3074
3075   switch (osabi)
3076     {
3077     case ELFOSABI_NONE:         return "UNIX - System V";
3078     case ELFOSABI_HPUX:         return "UNIX - HP-UX";
3079     case ELFOSABI_NETBSD:       return "UNIX - NetBSD";
3080     case ELFOSABI_GNU:          return "UNIX - GNU";
3081     case ELFOSABI_SOLARIS:      return "UNIX - Solaris";
3082     case ELFOSABI_AIX:          return "UNIX - AIX";
3083     case ELFOSABI_IRIX:         return "UNIX - IRIX";
3084     case ELFOSABI_FREEBSD:      return "UNIX - FreeBSD";
3085     case ELFOSABI_TRU64:        return "UNIX - TRU64";
3086     case ELFOSABI_MODESTO:      return "Novell - Modesto";
3087     case ELFOSABI_OPENBSD:      return "UNIX - OpenBSD";
3088     case ELFOSABI_OPENVMS:      return "VMS - OpenVMS";
3089     case ELFOSABI_NSK:          return "HP - Non-Stop Kernel";
3090     case ELFOSABI_AROS:         return "AROS";
3091     case ELFOSABI_FENIXOS:      return "FenixOS";
3092     default:
3093       if (osabi >= 64)
3094         switch (elf_header.e_machine)
3095           {
3096           case EM_ARM:
3097             switch (osabi)
3098               {
3099               case ELFOSABI_ARM:        return "ARM";
3100               default:
3101                 break;
3102               }
3103             break;
3104
3105           case EM_MSP430:
3106           case EM_MSP430_OLD:
3107             switch (osabi)
3108               {
3109               case ELFOSABI_STANDALONE: return _("Standalone App");
3110               default:
3111                 break;
3112               }
3113             break;
3114
3115           case EM_TI_C6000:
3116             switch (osabi)
3117               {
3118               case ELFOSABI_C6000_ELFABI:       return _("Bare-metal C6000");
3119               case ELFOSABI_C6000_LINUX:        return "Linux C6000";
3120               default:
3121                 break;
3122               }
3123             break;
3124
3125           default:
3126             break;
3127           }
3128       snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
3129       return buff;
3130     }
3131 }
3132
3133 static const char *
3134 get_aarch64_segment_type (unsigned long type)
3135 {
3136   switch (type)
3137     {
3138     case PT_AARCH64_ARCHEXT:
3139       return "AARCH64_ARCHEXT";
3140     default:
3141       break;
3142     }
3143
3144   return NULL;
3145 }
3146
3147 static const char *
3148 get_arm_segment_type (unsigned long type)
3149 {
3150   switch (type)
3151     {
3152     case PT_ARM_EXIDX:
3153       return "EXIDX";
3154     default:
3155       break;
3156     }
3157
3158   return NULL;
3159 }
3160
3161 static const char *
3162 get_mips_segment_type (unsigned long type)
3163 {
3164   switch (type)
3165     {
3166     case PT_MIPS_REGINFO:
3167       return "REGINFO";
3168     case PT_MIPS_RTPROC:
3169       return "RTPROC";
3170     case PT_MIPS_OPTIONS:
3171       return "OPTIONS";
3172     case PT_MIPS_ABIFLAGS:
3173       return "ABIFLAGS";
3174     default:
3175       break;
3176     }
3177
3178   return NULL;
3179 }
3180
3181 static const char *
3182 get_parisc_segment_type (unsigned long type)
3183 {
3184   switch (type)
3185     {
3186     case PT_HP_TLS:             return "HP_TLS";
3187     case PT_HP_CORE_NONE:       return "HP_CORE_NONE";
3188     case PT_HP_CORE_VERSION:    return "HP_CORE_VERSION";
3189     case PT_HP_CORE_KERNEL:     return "HP_CORE_KERNEL";
3190     case PT_HP_CORE_COMM:       return "HP_CORE_COMM";
3191     case PT_HP_CORE_PROC:       return "HP_CORE_PROC";
3192     case PT_HP_CORE_LOADABLE:   return "HP_CORE_LOADABLE";
3193     case PT_HP_CORE_STACK:      return "HP_CORE_STACK";
3194     case PT_HP_CORE_SHM:        return "HP_CORE_SHM";
3195     case PT_HP_CORE_MMF:        return "HP_CORE_MMF";
3196     case PT_HP_PARALLEL:        return "HP_PARALLEL";
3197     case PT_HP_FASTBIND:        return "HP_FASTBIND";
3198     case PT_HP_OPT_ANNOT:       return "HP_OPT_ANNOT";
3199     case PT_HP_HSL_ANNOT:       return "HP_HSL_ANNOT";
3200     case PT_HP_STACK:           return "HP_STACK";
3201     case PT_HP_CORE_UTSNAME:    return "HP_CORE_UTSNAME";
3202     case PT_PARISC_ARCHEXT:     return "PARISC_ARCHEXT";
3203     case PT_PARISC_UNWIND:      return "PARISC_UNWIND";
3204     case PT_PARISC_WEAKORDER:   return "PARISC_WEAKORDER";
3205     default:
3206       break;
3207     }
3208
3209   return NULL;
3210 }
3211
3212 static const char *
3213 get_ia64_segment_type (unsigned long type)
3214 {
3215   switch (type)
3216     {
3217     case PT_IA_64_ARCHEXT:      return "IA_64_ARCHEXT";
3218     case PT_IA_64_UNWIND:       return "IA_64_UNWIND";
3219     case PT_HP_TLS:             return "HP_TLS";
3220     case PT_IA_64_HP_OPT_ANOT:  return "HP_OPT_ANNOT";
3221     case PT_IA_64_HP_HSL_ANOT:  return "HP_HSL_ANNOT";
3222     case PT_IA_64_HP_STACK:     return "HP_STACK";
3223     default:
3224       break;
3225     }
3226
3227   return NULL;
3228 }
3229
3230 static const char *
3231 get_tic6x_segment_type (unsigned long type)
3232 {
3233   switch (type)
3234     {
3235     case PT_C6000_PHATTR:       return "C6000_PHATTR";
3236     default:
3237       break;
3238     }
3239
3240   return NULL;
3241 }
3242
3243 static const char *
3244 get_segment_type (unsigned long p_type)
3245 {
3246   static char buff[32];
3247
3248   switch (p_type)
3249     {
3250     case PT_NULL:       return "NULL";
3251     case PT_LOAD:       return "LOAD";
3252     case PT_DYNAMIC:    return "DYNAMIC";
3253     case PT_INTERP:     return "INTERP";
3254     case PT_NOTE:       return "NOTE";
3255     case PT_SHLIB:      return "SHLIB";
3256     case PT_PHDR:       return "PHDR";
3257     case PT_TLS:        return "TLS";
3258
3259     case PT_GNU_EH_FRAME:
3260                         return "GNU_EH_FRAME";
3261     case PT_GNU_STACK:  return "GNU_STACK";
3262     case PT_GNU_RELRO:  return "GNU_RELRO";
3263
3264     default:
3265       if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
3266         {
3267           const char * result;
3268
3269           switch (elf_header.e_machine)
3270             {
3271             case EM_AARCH64:
3272               result = get_aarch64_segment_type (p_type);
3273               break;
3274             case EM_ARM:
3275               result = get_arm_segment_type (p_type);
3276               break;
3277             case EM_MIPS:
3278             case EM_MIPS_RS3_LE:
3279               result = get_mips_segment_type (p_type);
3280               break;
3281             case EM_PARISC:
3282               result = get_parisc_segment_type (p_type);
3283               break;
3284             case EM_IA_64:
3285               result = get_ia64_segment_type (p_type);
3286               break;
3287             case EM_TI_C6000:
3288               result = get_tic6x_segment_type (p_type);
3289               break;
3290             default:
3291               result = NULL;
3292               break;
3293             }
3294
3295           if (result != NULL)
3296             return result;
3297
3298           sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
3299         }
3300       else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
3301         {
3302           const char * result;
3303
3304           switch (elf_header.e_machine)
3305             {
3306             case EM_PARISC:
3307               result = get_parisc_segment_type (p_type);
3308               break;
3309             case EM_IA_64:
3310               result = get_ia64_segment_type (p_type);
3311               break;
3312             default:
3313               result = NULL;
3314               break;
3315             }
3316
3317           if (result != NULL)
3318             return result;
3319
3320           sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
3321         }
3322       else
3323         snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
3324
3325       return buff;
3326     }
3327 }
3328
3329 static const char *
3330 get_mips_section_type_name (unsigned int sh_type)
3331 {
3332   switch (sh_type)
3333     {
3334     case SHT_MIPS_LIBLIST:       return "MIPS_LIBLIST";
3335     case SHT_MIPS_MSYM:          return "MIPS_MSYM";
3336     case SHT_MIPS_CONFLICT:      return "MIPS_CONFLICT";
3337     case SHT_MIPS_GPTAB:         return "MIPS_GPTAB";
3338     case SHT_MIPS_UCODE:         return "MIPS_UCODE";
3339     case SHT_MIPS_DEBUG:         return "MIPS_DEBUG";
3340     case SHT_MIPS_REGINFO:       return "MIPS_REGINFO";
3341     case SHT_MIPS_PACKAGE:       return "MIPS_PACKAGE";
3342     case SHT_MIPS_PACKSYM:       return "MIPS_PACKSYM";
3343     case SHT_MIPS_RELD:          return "MIPS_RELD";
3344     case SHT_MIPS_IFACE:         return "MIPS_IFACE";
3345     case SHT_MIPS_CONTENT:       return "MIPS_CONTENT";
3346     case SHT_MIPS_OPTIONS:       return "MIPS_OPTIONS";
3347     case SHT_MIPS_SHDR:          return "MIPS_SHDR";
3348     case SHT_MIPS_FDESC:         return "MIPS_FDESC";
3349     case SHT_MIPS_EXTSYM:        return "MIPS_EXTSYM";
3350     case SHT_MIPS_DENSE:         return "MIPS_DENSE";
3351     case SHT_MIPS_PDESC:         return "MIPS_PDESC";
3352     case SHT_MIPS_LOCSYM:        return "MIPS_LOCSYM";
3353     case SHT_MIPS_AUXSYM:        return "MIPS_AUXSYM";
3354     case SHT_MIPS_OPTSYM:        return "MIPS_OPTSYM";
3355     case SHT_MIPS_LOCSTR:        return "MIPS_LOCSTR";
3356     case SHT_MIPS_LINE:          return "MIPS_LINE";
3357     case SHT_MIPS_RFDESC:        return "MIPS_RFDESC";
3358     case SHT_MIPS_DELTASYM:      return "MIPS_DELTASYM";
3359     case SHT_MIPS_DELTAINST:     return "MIPS_DELTAINST";
3360     case SHT_MIPS_DELTACLASS:    return "MIPS_DELTACLASS";
3361     case SHT_MIPS_DWARF:         return "MIPS_DWARF";
3362     case SHT_MIPS_DELTADECL:     return "MIPS_DELTADECL";
3363     case SHT_MIPS_SYMBOL_LIB:    return "MIPS_SYMBOL_LIB";
3364     case SHT_MIPS_EVENTS:        return "MIPS_EVENTS";
3365     case SHT_MIPS_TRANSLATE:     return "MIPS_TRANSLATE";
3366     case SHT_MIPS_PIXIE:         return "MIPS_PIXIE";
3367     case SHT_MIPS_XLATE:         return "MIPS_XLATE";
3368     case SHT_MIPS_XLATE_DEBUG:   return "MIPS_XLATE_DEBUG";
3369     case SHT_MIPS_WHIRL:         return "MIPS_WHIRL";
3370     case SHT_MIPS_EH_REGION:     return "MIPS_EH_REGION";
3371     case SHT_MIPS_XLATE_OLD:     return "MIPS_XLATE_OLD";
3372     case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
3373     case SHT_MIPS_ABIFLAGS:      return "MIPS_ABIFLAGS";
3374     default:
3375       break;
3376     }
3377   return NULL;
3378 }
3379
3380 static const char *
3381 get_parisc_section_type_name (unsigned int sh_type)
3382 {
3383   switch (sh_type)
3384     {
3385     case SHT_PARISC_EXT:        return "PARISC_EXT";
3386     case SHT_PARISC_UNWIND:     return "PARISC_UNWIND";
3387     case SHT_PARISC_DOC:        return "PARISC_DOC";
3388     case SHT_PARISC_ANNOT:      return "PARISC_ANNOT";
3389     case SHT_PARISC_SYMEXTN:    return "PARISC_SYMEXTN";
3390     case SHT_PARISC_STUBS:      return "PARISC_STUBS";
3391     case SHT_PARISC_DLKM:       return "PARISC_DLKM";
3392     default:
3393       break;
3394     }
3395   return NULL;
3396 }
3397
3398 static const char *
3399 get_ia64_section_type_name (unsigned int sh_type)
3400 {
3401   /* If the top 8 bits are 0x78 the next 8 are the os/abi ID.  */
3402   if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
3403     return get_osabi_name ((sh_type & 0x00FF0000) >> 16);
3404
3405   switch (sh_type)
3406     {
3407     case SHT_IA_64_EXT:                return "IA_64_EXT";
3408     case SHT_IA_64_UNWIND:             return "IA_64_UNWIND";
3409     case SHT_IA_64_PRIORITY_INIT:      return "IA_64_PRIORITY_INIT";
3410     case SHT_IA_64_VMS_TRACE:          return "VMS_TRACE";
3411     case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
3412     case SHT_IA_64_VMS_DEBUG:          return "VMS_DEBUG";
3413     case SHT_IA_64_VMS_DEBUG_STR:      return "VMS_DEBUG_STR";
3414     case SHT_IA_64_VMS_LINKAGES:       return "VMS_LINKAGES";
3415     case SHT_IA_64_VMS_SYMBOL_VECTOR:  return "VMS_SYMBOL_VECTOR";
3416     case SHT_IA_64_VMS_FIXUP:          return "VMS_FIXUP";
3417     default:
3418       break;
3419     }
3420   return NULL;
3421 }
3422
3423 static const char *
3424 get_x86_64_section_type_name (unsigned int sh_type)
3425 {
3426   switch (sh_type)
3427     {
3428     case SHT_X86_64_UNWIND:     return "X86_64_UNWIND";
3429     default:
3430       break;
3431     }
3432   return NULL;
3433 }
3434
3435 static const char *
3436 get_aarch64_section_type_name (unsigned int sh_type)
3437 {
3438   switch (sh_type)
3439     {
3440     case SHT_AARCH64_ATTRIBUTES:
3441       return "AARCH64_ATTRIBUTES";
3442     default:
3443       break;
3444     }
3445   return NULL;
3446 }
3447
3448 static const char *
3449 get_arm_section_type_name (unsigned int sh_type)
3450 {
3451   switch (sh_type)
3452     {
3453     case SHT_ARM_EXIDX:           return "ARM_EXIDX";
3454     case SHT_ARM_PREEMPTMAP:      return "ARM_PREEMPTMAP";
3455     case SHT_ARM_ATTRIBUTES:      return "ARM_ATTRIBUTES";
3456     case SHT_ARM_DEBUGOVERLAY:    return "ARM_DEBUGOVERLAY";
3457     case SHT_ARM_OVERLAYSECTION:  return "ARM_OVERLAYSECTION";
3458     default:
3459       break;
3460     }
3461   return NULL;
3462 }
3463
3464 static const char *
3465 get_tic6x_section_type_name (unsigned int sh_type)
3466 {
3467   switch (sh_type)
3468     {
3469     case SHT_C6000_UNWIND:
3470       return "C6000_UNWIND";
3471     case SHT_C6000_PREEMPTMAP:
3472       return "C6000_PREEMPTMAP";
3473     case SHT_C6000_ATTRIBUTES:
3474       return "C6000_ATTRIBUTES";
3475     case SHT_TI_ICODE:
3476       return "TI_ICODE";
3477     case SHT_TI_XREF:
3478       return "TI_XREF";
3479     case SHT_TI_HANDLER:
3480       return "TI_HANDLER";
3481     case SHT_TI_INITINFO:
3482       return "TI_INITINFO";
3483     case SHT_TI_PHATTRS:
3484       return "TI_PHATTRS";
3485     default:
3486       break;
3487     }
3488   return NULL;
3489 }
3490
3491 static const char *
3492 get_msp430x_section_type_name (unsigned int sh_type)
3493 {
3494   switch (sh_type)
3495     {
3496     case SHT_MSP430_SEC_FLAGS:   return "MSP430_SEC_FLAGS";
3497     case SHT_MSP430_SYM_ALIASES: return "MSP430_SYM_ALIASES";
3498     case SHT_MSP430_ATTRIBUTES:  return "MSP430_ATTRIBUTES";
3499     default: return NULL;
3500     }
3501 }
3502
3503 static const char *
3504 get_section_type_name (unsigned int sh_type)
3505 {
3506   static char buff[32];
3507
3508   switch (sh_type)
3509     {
3510     case SHT_NULL:              return "NULL";
3511     case SHT_PROGBITS:          return "PROGBITS";
3512     case SHT_SYMTAB:            return "SYMTAB";
3513     case SHT_STRTAB:            return "STRTAB";
3514     case SHT_RELA:              return "RELA";
3515     case SHT_HASH:              return "HASH";
3516     case SHT_DYNAMIC:           return "DYNAMIC";
3517     case SHT_NOTE:              return "NOTE";
3518     case SHT_NOBITS:            return "NOBITS";
3519     case SHT_REL:               return "REL";
3520     case SHT_SHLIB:             return "SHLIB";
3521     case SHT_DYNSYM:            return "DYNSYM";
3522     case SHT_INIT_ARRAY:        return "INIT_ARRAY";
3523     case SHT_FINI_ARRAY:        return "FINI_ARRAY";
3524     case SHT_PREINIT_ARRAY:     return "PREINIT_ARRAY";
3525     case SHT_GNU_HASH:          return "GNU_HASH";
3526     case SHT_GROUP:             return "GROUP";
3527     case SHT_SYMTAB_SHNDX:      return "SYMTAB SECTION INDICIES";
3528     case SHT_GNU_verdef:        return "VERDEF";
3529     case SHT_GNU_verneed:       return "VERNEED";
3530     case SHT_GNU_versym:        return "VERSYM";
3531     case 0x6ffffff0:            return "VERSYM";
3532     case 0x6ffffffc:            return "VERDEF";
3533     case 0x7ffffffd:            return "AUXILIARY";
3534     case 0x7fffffff:            return "FILTER";
3535     case SHT_GNU_LIBLIST:       return "GNU_LIBLIST";
3536
3537     default:
3538       if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
3539         {
3540           const char * result;
3541
3542           switch (elf_header.e_machine)
3543             {
3544             case EM_MIPS:
3545             case EM_MIPS_RS3_LE:
3546               result = get_mips_section_type_name (sh_type);
3547               break;
3548             case EM_PARISC:
3549               result = get_parisc_section_type_name (sh_type);
3550               break;
3551             case EM_IA_64:
3552               result = get_ia64_section_type_name (sh_type);
3553               break;
3554             case EM_X86_64:
3555             case EM_L1OM:
3556             case EM_K1OM:
3557               result = get_x86_64_section_type_name (sh_type);
3558               break;
3559             case EM_AARCH64:
3560               result = get_aarch64_section_type_name (sh_type);
3561               break;
3562             case EM_ARM:
3563               result = get_arm_section_type_name (sh_type);
3564               break;
3565             case EM_TI_C6000:
3566               result = get_tic6x_section_type_name (sh_type);
3567               break;
3568             case EM_MSP430:
3569               result = get_msp430x_section_type_name (sh_type);
3570               break;
3571             default:
3572               result = NULL;
3573               break;
3574             }
3575
3576           if (result != NULL)
3577             return result;
3578
3579           sprintf (buff, "LOPROC+%x", sh_type - SHT_LOPROC);
3580         }
3581       else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
3582         {
3583           const char * result;
3584
3585           switch (elf_header.e_machine)
3586             {
3587             case EM_IA_64:
3588               result = get_ia64_section_type_name (sh_type);
3589               break;
3590             default:
3591               result = NULL;
3592               break;
3593             }
3594
3595           if (result != NULL)
3596             return result;
3597
3598           sprintf (buff, "LOOS+%x", sh_type - SHT_LOOS);
3599         }
3600       else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
3601         sprintf (buff, "LOUSER+%x", sh_type - SHT_LOUSER);
3602       else
3603         /* This message is probably going to be displayed in a 15
3604            character wide field, so put the hex value first.  */
3605         snprintf (buff, sizeof (buff), _("%08x: <unknown>"), sh_type);
3606
3607       return buff;
3608     }
3609 }
3610
3611 #define OPTION_DEBUG_DUMP       512
3612 #define OPTION_DYN_SYMS         513
3613 #define OPTION_DWARF_DEPTH      514
3614 #define OPTION_DWARF_START      515
3615 #define OPTION_DWARF_CHECK      516
3616
3617 static struct option options[] =
3618 {
3619   {"all",              no_argument, 0, 'a'},
3620   {"file-header",      no_argument, 0, 'h'},
3621   {"program-headers",  no_argument, 0, 'l'},
3622   {"headers",          no_argument, 0, 'e'},
3623   {"histogram",        no_argument, 0, 'I'},
3624   {"segments",         no_argument, 0, 'l'},
3625   {"sections",         no_argument, 0, 'S'},
3626   {"section-headers",  no_argument, 0, 'S'},
3627   {"section-groups",   no_argument, 0, 'g'},
3628   {"section-details",  no_argument, 0, 't'},
3629   {"full-section-name",no_argument, 0, 'N'},
3630   {"symbols",          no_argument, 0, 's'},
3631   {"syms",             no_argument, 0, 's'},
3632   {"dyn-syms",         no_argument, 0, OPTION_DYN_SYMS},
3633   {"relocs",           no_argument, 0, 'r'},
3634   {"notes",            no_argument, 0, 'n'},
3635   {"dynamic",          no_argument, 0, 'd'},
3636   {"arch-specific",    no_argument, 0, 'A'},
3637   {"version-info",     no_argument, 0, 'V'},
3638   {"use-dynamic",      no_argument, 0, 'D'},
3639   {"unwind",           no_argument, 0, 'u'},
3640   {"archive-index",    no_argument, 0, 'c'},
3641   {"hex-dump",         required_argument, 0, 'x'},
3642   {"relocated-dump",   required_argument, 0, 'R'},
3643   {"string-dump",      required_argument, 0, 'p'},
3644 #ifdef SUPPORT_DISASSEMBLY
3645   {"instruction-dump", required_argument, 0, 'i'},
3646 #endif
3647   {"debug-dump",       optional_argument, 0, OPTION_DEBUG_DUMP},
3648
3649   {"dwarf-depth",      required_argument, 0, OPTION_DWARF_DEPTH},
3650   {"dwarf-start",      required_argument, 0, OPTION_DWARF_START},
3651   {"dwarf-check",      no_argument, 0, OPTION_DWARF_CHECK},
3652
3653   {"version",          no_argument, 0, 'v'},
3654   {"wide",             no_argument, 0, 'W'},
3655   {"help",             no_argument, 0, 'H'},
3656   {0,                  no_argument, 0, 0}
3657 };
3658
3659 static void
3660 usage (FILE * stream)
3661 {
3662   fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
3663   fprintf (stream, _(" Display information about the contents of ELF format files\n"));
3664   fprintf (stream, _(" Options are:\n\
3665   -a --all               Equivalent to: -h -l -S -s -r -d -V -A -I\n\
3666   -h --file-header       Display the ELF file header\n\
3667   -l --program-headers   Display the program headers\n\
3668      --segments          An alias for --program-headers\n\
3669   -S --section-headers   Display the sections' header\n\
3670      --sections          An alias for --section-headers\n\
3671   -g --section-groups    Display the section groups\n\
3672   -t --section-details   Display the section details\n\
3673   -e --headers           Equivalent to: -h -l -S\n\
3674   -s --syms              Display the symbol table\n\
3675      --symbols           An alias for --syms\n\
3676   --dyn-syms             Display the dynamic symbol table\n\
3677   -n --notes             Display the core notes (if present)\n\
3678   -r --relocs            Display the relocations (if present)\n\
3679   -u --unwind            Display the unwind info (if present)\n\
3680   -d --dynamic           Display the dynamic section (if present)\n\
3681   -V --version-info      Display the version sections (if present)\n\
3682   -A --arch-specific     Display architecture specific information (if any)\n\
3683   -c --archive-index     Display the symbol/file index in an archive\n\
3684   -D --use-dynamic       Use the dynamic section info when displaying symbols\n\
3685   -x --hex-dump=<number|name>\n\
3686                          Dump the contents of section <number|name> as bytes\n\
3687   -p --string-dump=<number|name>\n\
3688                          Dump the contents of section <number|name> as strings\n\
3689   -R --relocated-dump=<number|name>\n\
3690                          Dump the contents of section <number|name> as relocated bytes\n\
3691   -w[lLiaprmfFsoRt] or\n\
3692   --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
3693                =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
3694                =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
3695                =addr,=cu_index]\n\
3696                          Display the contents of DWARF2 debug sections\n"));
3697   fprintf (stream, _("\
3698   --dwarf-depth=N        Do not display DIEs at depth N or greater\n\
3699   --dwarf-start=N        Display DIEs starting with N, at the same depth\n\
3700                          or deeper\n"));
3701 #ifdef SUPPORT_DISASSEMBLY
3702   fprintf (stream, _("\
3703   -i --instruction-dump=<number|name>\n\
3704                          Disassemble the contents of section <number|name>\n"));
3705 #endif
3706   fprintf (stream, _("\
3707   -I --histogram         Display histogram of bucket list lengths\n\
3708   -W --wide              Allow output width to exceed 80 characters\n\
3709   @<file>                Read options from <file>\n\
3710   -H --help              Display this information\n\
3711   -v --version           Display the version number of readelf\n"));
3712
3713   if (REPORT_BUGS_TO[0] && stream == stdout)
3714     fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
3715
3716   exit (stream == stdout ? 0 : 1);
3717 }
3718
3719 /* Record the fact that the user wants the contents of section number
3720    SECTION to be displayed using the method(s) encoded as flags bits
3721    in TYPE.  Note, TYPE can be zero if we are creating the array for
3722    the first time.  */
3723
3724 static void
3725 request_dump_bynumber (unsigned int section, dump_type type)
3726 {
3727   if (section >= num_dump_sects)
3728     {
3729       dump_type * new_dump_sects;
3730
3731       new_dump_sects = (dump_type *) calloc (section + 1,
3732                                              sizeof (* dump_sects));
3733
3734       if (new_dump_sects == NULL)
3735         error (_("Out of memory allocating dump request table.\n"));
3736       else
3737         {
3738           /* Copy current flag settings.  */
3739           memcpy (new_dump_sects, dump_sects, num_dump_sects * sizeof (* dump_sects));
3740
3741           free (dump_sects);
3742
3743           dump_sects = new_dump_sects;
3744           num_dump_sects = section + 1;
3745         }
3746     }
3747
3748   if (dump_sects)
3749     dump_sects[section] |= type;
3750
3751   return;
3752 }
3753
3754 /* Request a dump by section name.  */
3755
3756 static void
3757 request_dump_byname (const char * section, dump_type type)
3758 {
3759   struct dump_list_entry * new_request;
3760
3761   new_request = (struct dump_list_entry *)
3762       malloc (sizeof (struct dump_list_entry));
3763   if (!new_request)
3764     error (_("Out of memory allocating dump request table.\n"));
3765
3766   new_request->name = strdup (section);
3767   if (!new_request->name)
3768     error (_("Out of memory allocating dump request table.\n"));
3769
3770   new_request->type = type;
3771
3772   new_request->next = dump_sects_byname;
3773   dump_sects_byname = new_request;
3774 }
3775
3776 static inline void
3777 request_dump (dump_type type)
3778 {
3779   int section;
3780   char * cp;
3781
3782   do_dump++;
3783   section = strtoul (optarg, & cp, 0);
3784
3785   if (! *cp && section >= 0)
3786     request_dump_bynumber (section, type);
3787   else
3788     request_dump_byname (optarg, type);
3789 }
3790
3791
3792 static void
3793 parse_args (int argc, char ** argv)
3794 {
3795   int c;
3796
3797   if (argc < 2)
3798     usage (stderr);
3799
3800   while ((c = getopt_long
3801           (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:", options, NULL)) != EOF)
3802     {
3803       switch (c)
3804         {
3805         case 0:
3806           /* Long options.  */
3807           break;
3808         case 'H':
3809           usage (stdout);
3810           break;
3811
3812         case 'a':
3813           do_syms++;
3814           do_reloc++;
3815           do_unwind++;
3816           do_dynamic++;
3817           do_header++;
3818           do_sections++;
3819           do_section_groups++;
3820           do_segments++;
3821           do_version++;
3822           do_histogram++;
3823           do_arch++;
3824           do_notes++;
3825           break;
3826         case 'g':
3827           do_section_groups++;
3828           break;
3829         case 't':
3830         case 'N':
3831           do_sections++;
3832           do_section_details++;
3833           break;
3834         case 'e':
3835           do_header++;
3836           do_sections++;
3837           do_segments++;
3838           break;
3839         case 'A':
3840           do_arch++;
3841           break;
3842         case 'D':
3843           do_using_dynamic++;
3844           break;
3845         case 'r':
3846           do_reloc++;
3847           break;
3848         case 'u':
3849           do_unwind++;
3850           break;
3851         case 'h':
3852           do_header++;
3853           break;
3854         case 'l':
3855           do_segments++;
3856           break;
3857         case 's':
3858           do_syms++;
3859           break;
3860         case 'S':
3861           do_sections++;
3862           break;
3863         case 'd':
3864           do_dynamic++;
3865           break;
3866         case 'I':
3867           do_histogram++;
3868           break;
3869         case 'n':
3870           do_notes++;
3871           break;
3872         case 'c':
3873           do_archive_index++;
3874           break;
3875         case 'x':
3876           request_dump (HEX_DUMP);
3877           break;
3878         case 'p':
3879           request_dump (STRING_DUMP);
3880           break;
3881         case 'R':
3882           request_dump (RELOC_DUMP);
3883           break;
3884         case 'w':
3885           do_dump++;
3886           if (optarg == 0)
3887             {
3888               do_debugging = 1;
3889               dwarf_select_sections_all ();
3890             }
3891           else
3892             {
3893               do_debugging = 0;
3894               dwarf_select_sections_by_letters (optarg);
3895             }
3896           break;
3897         case OPTION_DEBUG_DUMP:
3898           do_dump++;
3899           if (optarg == 0)
3900             do_debugging = 1;
3901           else
3902             {
3903               do_debugging = 0;
3904               dwarf_select_sections_by_names (optarg);
3905             }
3906           break;
3907         case OPTION_DWARF_DEPTH:
3908           {
3909             char *cp;
3910
3911             dwarf_cutoff_level = strtoul (optarg, & cp, 0);
3912           }
3913           break;
3914         case OPTION_DWARF_START:
3915           {
3916             char *cp;
3917
3918             dwarf_start_die = strtoul (optarg, & cp, 0);
3919           }
3920           break;
3921         case OPTION_DWARF_CHECK:
3922           dwarf_check = 1;
3923           break;
3924         case OPTION_DYN_SYMS:
3925           do_dyn_syms++;
3926           break;
3927 #ifdef SUPPORT_DISASSEMBLY
3928         case 'i':
3929           request_dump (DISASS_DUMP);
3930           break;
3931 #endif
3932         case 'v':
3933           print_version (program_name);
3934           break;
3935         case 'V':
3936           do_version++;
3937           break;
3938         case 'W':
3939           do_wide++;
3940           break;
3941         default:
3942           /* xgettext:c-format */
3943           error (_("Invalid option '-%c'\n"), c);
3944           /* Drop through.  */
3945         case '?':
3946           usage (stderr);
3947         }
3948     }
3949
3950   if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
3951       && !do_segments && !do_header && !do_dump && !do_version
3952       && !do_histogram && !do_debugging && !do_arch && !do_notes
3953       && !do_section_groups && !do_archive_index
3954       && !do_dyn_syms)
3955     usage (stderr);
3956   else if (argc < 3)
3957     {
3958       warn (_("Nothing to do.\n"));
3959       usage (stderr);
3960     }
3961 }
3962
3963 static const char *
3964 get_elf_class (unsigned int elf_class)
3965 {
3966   static char buff[32];
3967
3968   switch (elf_class)
3969     {
3970     case ELFCLASSNONE: return _("none");
3971     case ELFCLASS32:   return "ELF32";
3972     case ELFCLASS64:   return "ELF64";
3973     default:
3974       snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
3975       return buff;
3976     }
3977 }
3978
3979 static const char *
3980 get_data_encoding (unsigned int encoding)
3981 {
3982   static char buff[32];
3983
3984   switch (encoding)
3985     {
3986     case ELFDATANONE: return _("none");
3987     case ELFDATA2LSB: return _("2's complement, little endian");
3988     case ELFDATA2MSB: return _("2's complement, big endian");
3989     default:
3990       snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
3991       return buff;
3992     }
3993 }
3994
3995 /* Decode the data held in 'elf_header'.  */
3996
3997 static int
3998 process_file_header (void)
3999 {
4000   if (   elf_header.e_ident[EI_MAG0] != ELFMAG0
4001       || elf_header.e_ident[EI_MAG1] != ELFMAG1
4002       || elf_header.e_ident[EI_MAG2] != ELFMAG2
4003       || elf_header.e_ident[EI_MAG3] != ELFMAG3)
4004     {
4005       error
4006         (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
4007       return 0;
4008     }
4009
4010   init_dwarf_regnames (elf_header.e_machine);
4011
4012   if (do_header)
4013     {
4014       int i;
4015
4016       printf (_("ELF Header:\n"));
4017       printf (_("  Magic:   "));
4018       for (i = 0; i < EI_NIDENT; i++)
4019         printf ("%2.2x ", elf_header.e_ident[i]);
4020       printf ("\n");
4021       printf (_("  Class:                             %s\n"),
4022               get_elf_class (elf_header.e_ident[EI_CLASS]));
4023       printf (_("  Data:                              %s\n"),
4024               get_data_encoding (elf_header.e_ident[EI_DATA]));
4025       printf (_("  Version:                           %d %s\n"),
4026               elf_header.e_ident[EI_VERSION],
4027               (elf_header.e_ident[EI_VERSION] == EV_CURRENT
4028                ? "(current)"
4029                : (elf_header.e_ident[EI_VERSION] != EV_NONE
4030                   ? _("<unknown: %lx>")
4031                   : "")));
4032       printf (_("  OS/ABI:                            %s\n"),
4033               get_osabi_name (elf_header.e_ident[EI_OSABI]));
4034       printf (_("  ABI Version:                       %d\n"),
4035               elf_header.e_ident[EI_ABIVERSION]);
4036       printf (_("  Type:                              %s\n"),
4037               get_file_type (elf_header.e_type));
4038       printf (_("  Machine:                           %s\n"),
4039               get_machine_name (elf_header.e_machine));
4040       printf (_("  Version:                           0x%lx\n"),
4041               (unsigned long) elf_header.e_version);
4042
4043       printf (_("  Entry point address:               "));
4044       print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4045       printf (_("\n  Start of program headers:          "));
4046       print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4047       printf (_(" (bytes into file)\n  Start of section headers:          "));
4048       print_vma ((bfd_vma) elf_header.e_shoff, DEC);
4049       printf (_(" (bytes into file)\n"));
4050
4051       printf (_("  Flags:                             0x%lx%s\n"),
4052               (unsigned long) elf_header.e_flags,
4053               get_machine_flags (elf_header.e_flags, elf_header.e_machine));
4054       printf (_("  Size of this header:               %ld (bytes)\n"),
4055               (long) elf_header.e_ehsize);
4056       printf (_("  Size of program headers:           %ld (bytes)\n"),
4057               (long) elf_header.e_phentsize);
4058       printf (_("  Number of program headers:         %ld"),
4059               (long) elf_header.e_phnum);
4060       if (section_headers != NULL
4061           && elf_header.e_phnum == PN_XNUM
4062           && section_headers[0].sh_info != 0)
4063         printf (" (%ld)", (long) section_headers[0].sh_info);
4064       putc ('\n', stdout);
4065       printf (_("  Size of section headers:           %ld (bytes)\n"),
4066               (long) elf_header.e_shentsize);
4067       printf (_("  Number of section headers:         %ld"),
4068               (long) elf_header.e_shnum);
4069       if (section_headers != NULL && elf_header.e_shnum == SHN_UNDEF)
4070         printf (" (%ld)", (long) section_headers[0].sh_size);
4071       putc ('\n', stdout);
4072       printf (_("  Section header string table index: %ld"),
4073               (long) elf_header.e_shstrndx);
4074       if (section_headers != NULL
4075           && elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
4076         printf (" (%u)", section_headers[0].sh_link);
4077       else if (elf_header.e_shstrndx != SHN_UNDEF
4078                && elf_header.e_shstrndx >= elf_header.e_shnum)
4079         printf (_(" <corrupt: out of range>"));
4080       putc ('\n', stdout);
4081     }
4082
4083   if (section_headers != NULL)
4084     {
4085       if (elf_header.e_phnum == PN_XNUM
4086           && section_headers[0].sh_info != 0)
4087         elf_header.e_phnum = section_headers[0].sh_info;
4088       if (elf_header.e_shnum == SHN_UNDEF)
4089         elf_header.e_shnum = section_headers[0].sh_size;
4090       if (elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
4091         elf_header.e_shstrndx = section_headers[0].sh_link;
4092       else if (elf_header.e_shstrndx >= elf_header.e_shnum)
4093         elf_header.e_shstrndx = SHN_UNDEF;
4094       free (section_headers);
4095       section_headers = NULL;
4096     }
4097
4098   return 1;
4099 }
4100
4101
4102 static int
4103 get_32bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
4104 {
4105   Elf32_External_Phdr * phdrs;
4106   Elf32_External_Phdr * external;
4107   Elf_Internal_Phdr *   internal;
4108   unsigned int i;
4109
4110   phdrs = (Elf32_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
4111                                             elf_header.e_phentsize,
4112                                             elf_header.e_phnum,
4113                                             _("program headers"));
4114   if (!phdrs)
4115     return 0;
4116
4117   for (i = 0, internal = pheaders, external = phdrs;
4118        i < elf_header.e_phnum;
4119        i++, internal++, external++)
4120     {
4121       internal->p_type   = BYTE_GET (external->p_type);
4122       internal->p_offset = BYTE_GET (external->p_offset);
4123       internal->p_vaddr  = BYTE_GET (external->p_vaddr);
4124       internal->p_paddr  = BYTE_GET (external->p_paddr);
4125       internal->p_filesz = BYTE_GET (external->p_filesz);
4126       internal->p_memsz  = BYTE_GET (external->p_memsz);
4127       internal->p_flags  = BYTE_GET (external->p_flags);
4128       internal->p_align  = BYTE_GET (external->p_align);
4129     }
4130
4131   free (phdrs);
4132
4133   return 1;
4134 }
4135
4136 static int
4137 get_64bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
4138 {
4139   Elf64_External_Phdr * phdrs;
4140   Elf64_External_Phdr * external;
4141   Elf_Internal_Phdr *   internal;
4142   unsigned int i;
4143
4144   phdrs = (Elf64_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
4145                                             elf_header.e_phentsize,
4146                                             elf_header.e_phnum,
4147                                             _("program headers"));
4148   if (!phdrs)
4149     return 0;
4150
4151   for (i = 0, internal = pheaders, external = phdrs;
4152        i < elf_header.e_phnum;
4153        i++, internal++, external++)
4154     {
4155       internal->p_type   = BYTE_GET (external->p_type);
4156       internal->p_flags  = BYTE_GET (external->p_flags);
4157       internal->p_offset = BYTE_GET (external->p_offset);
4158       internal->p_vaddr  = BYTE_GET (external->p_vaddr);
4159       internal->p_paddr  = BYTE_GET (external->p_paddr);
4160       internal->p_filesz = BYTE_GET (external->p_filesz);
4161       internal->p_memsz  = BYTE_GET (external->p_memsz);
4162       internal->p_align  = BYTE_GET (external->p_align);
4163     }
4164
4165   free (phdrs);
4166
4167   return 1;
4168 }
4169
4170 /* Returns 1 if the program headers were read into `program_headers'.  */
4171
4172 static int
4173 get_program_headers (FILE * file)
4174 {
4175   Elf_Internal_Phdr * phdrs;
4176
4177   /* Check cache of prior read.  */
4178   if (program_headers != NULL)
4179     return 1;
4180
4181   phdrs = (Elf_Internal_Phdr *) cmalloc (elf_header.e_phnum,
4182                                          sizeof (Elf_Internal_Phdr));
4183
4184   if (phdrs == NULL)
4185     {
4186       error (_("Out of memory\n"));
4187       return 0;
4188     }
4189
4190   if (is_32bit_elf
4191       ? get_32bit_program_headers (file, phdrs)
4192       : get_64bit_program_headers (file, phdrs))
4193     {
4194       program_headers = phdrs;
4195       return 1;
4196     }
4197
4198   free (phdrs);
4199   return 0;
4200 }
4201
4202 /* Returns 1 if the program headers were loaded.  */
4203
4204 static int
4205 process_program_headers (FILE * file)
4206 {
4207   Elf_Internal_Phdr * segment;
4208   unsigned int i;
4209
4210   if (elf_header.e_phnum == 0)
4211     {
4212       /* PR binutils/12467.  */
4213       if (elf_header.e_phoff != 0)
4214         warn (_("possibly corrupt ELF header - it has a non-zero program"
4215                 " header offset, but no program headers"));
4216       else if (do_segments)
4217         printf (_("\nThere are no program headers in this file.\n"));
4218       return 0;
4219     }
4220
4221   if (do_segments && !do_header)
4222     {
4223       printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
4224       printf (_("Entry point "));
4225       print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4226       printf (_("\nThere are %d program headers, starting at offset "),
4227               elf_header.e_phnum);
4228       print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4229       printf ("\n");
4230     }
4231
4232   if (! get_program_headers (file))
4233       return 0;
4234
4235   if (do_segments)
4236     {
4237       if (elf_header.e_phnum > 1)
4238         printf (_("\nProgram Headers:\n"));
4239       else
4240         printf (_("\nProgram Headers:\n"));
4241
4242       if (is_32bit_elf)
4243         printf
4244           (_("  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align\n"));
4245       else if (do_wide)
4246         printf
4247           (_("  Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align\n"));
4248       else
4249         {
4250           printf
4251             (_("  Type           Offset             VirtAddr           PhysAddr\n"));
4252           printf
4253             (_("                 FileSiz            MemSiz              Flags  Align\n"));
4254         }
4255     }
4256
4257   dynamic_addr = 0;
4258   dynamic_size = 0;
4259
4260   for (i = 0, segment = program_headers;
4261        i < elf_header.e_phnum;
4262        i++, segment++)
4263     {
4264       if (do_segments)
4265         {
4266           printf ("  %-14.14s ", get_segment_type (segment->p_type));
4267
4268           if (is_32bit_elf)
4269             {
4270               printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4271               printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
4272               printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
4273               printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
4274               printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
4275               printf ("%c%c%c ",
4276                       (segment->p_flags & PF_R ? 'R' : ' '),
4277                       (segment->p_flags & PF_W ? 'W' : ' '),
4278                       (segment->p_flags & PF_X ? 'E' : ' '));
4279               printf ("%#lx", (unsigned long) segment->p_align);
4280             }
4281           else if (do_wide)
4282             {
4283               if ((unsigned long) segment->p_offset == segment->p_offset)
4284                 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4285               else
4286                 {
4287                   print_vma (segment->p_offset, FULL_HEX);
4288                   putchar (' ');
4289                 }
4290
4291               print_vma (segment->p_vaddr, FULL_HEX);
4292               putchar (' ');
4293               print_vma (segment->p_paddr, FULL_HEX);
4294               putchar (' ');
4295
4296               if ((unsigned long) segment->p_filesz == segment->p_filesz)
4297                 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
4298               else
4299                 {
4300                   print_vma (segment->p_filesz, FULL_HEX);
4301                   putchar (' ');
4302                 }
4303
4304               if ((unsigned long) segment->p_memsz == segment->p_memsz)
4305                 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
4306               else
4307                 {
4308                   print_vma (segment->p_memsz, FULL_HEX);
4309                 }
4310
4311               printf (" %c%c%c ",
4312                       (segment->p_flags & PF_R ? 'R' : ' '),
4313                       (segment->p_flags & PF_W ? 'W' : ' '),
4314                       (segment->p_flags & PF_X ? 'E' : ' '));
4315
4316               if ((unsigned long) segment->p_align == segment->p_align)
4317                 printf ("%#lx", (unsigned long) segment->p_align);
4318               else
4319                 {
4320                   print_vma (segment->p_align, PREFIX_HEX);
4321                 }
4322             }
4323           else
4324             {
4325               print_vma (segment->p_offset, FULL_HEX);
4326               putchar (' ');
4327               print_vma (segment->p_vaddr, FULL_HEX);
4328               putchar (' ');
4329               print_vma (segment->p_paddr, FULL_HEX);
4330               printf ("\n                 ");
4331               print_vma (segment->p_filesz, FULL_HEX);
4332               putchar (' ');
4333               print_vma (segment->p_memsz, FULL_HEX);
4334               printf ("  %c%c%c    ",
4335                       (segment->p_flags & PF_R ? 'R' : ' '),
4336                       (segment->p_flags & PF_W ? 'W' : ' '),
4337                       (segment->p_flags & PF_X ? 'E' : ' '));
4338               print_vma (segment->p_align, HEX);
4339             }
4340         }
4341
4342       switch (segment->p_type)
4343         {
4344         case PT_DYNAMIC:
4345           if (dynamic_addr)
4346             error (_("more than one dynamic segment\n"));
4347
4348           /* By default, assume that the .dynamic section is the first
4349              section in the DYNAMIC segment.  */
4350           dynamic_addr = segment->p_offset;
4351           dynamic_size = segment->p_filesz;
4352
4353           /* Try to locate the .dynamic section. If there is
4354              a section header table, we can easily locate it.  */
4355           if (section_headers != NULL)
4356             {
4357               Elf_Internal_Shdr * sec;
4358
4359               sec = find_section (".dynamic");
4360               if (sec == NULL || sec->sh_size == 0)
4361                 {
4362                   /* A corresponding .dynamic section is expected, but on
4363                      IA-64/OpenVMS it is OK for it to be missing.  */
4364                   if (!is_ia64_vms ())
4365                     error (_("no .dynamic section in the dynamic segment\n"));
4366                   break;
4367                 }
4368
4369               if (sec->sh_type == SHT_NOBITS)
4370                 {
4371                   dynamic_size = 0;
4372                   break;
4373                 }
4374
4375               dynamic_addr = sec->sh_offset;
4376               dynamic_size = sec->sh_size;
4377
4378               if (dynamic_addr < segment->p_offset
4379                   || dynamic_addr > segment->p_offset + segment->p_filesz)
4380                 warn (_("the .dynamic section is not contained"
4381                         " within the dynamic segment\n"));
4382               else if (dynamic_addr > segment->p_offset)
4383                 warn (_("the .dynamic section is not the first section"
4384                         " in the dynamic segment.\n"));
4385             }
4386           break;
4387
4388         case PT_INTERP:
4389           if (fseek (file, archive_file_offset + (long) segment->p_offset,
4390                      SEEK_SET))
4391             error (_("Unable to find program interpreter name\n"));
4392           else
4393             {
4394               char fmt [32];
4395               int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX);
4396
4397               if (ret >= (int) sizeof (fmt) || ret < 0)
4398                 error (_("Internal error: failed to create format string to display program interpreter\n"));
4399
4400               program_interpreter[0] = 0;
4401               if (fscanf (file, fmt, program_interpreter) <= 0)
4402                 error (_("Unable to read program interpreter name\n"));
4403
4404               if (do_segments)
4405                 printf (_("\n      [Requesting program interpreter: %s]"),
4406                     program_interpreter);
4407             }
4408           break;
4409         }
4410
4411       if (do_segments)
4412         putc ('\n', stdout);
4413     }
4414
4415   if (do_segments && section_headers != NULL && string_table != NULL)
4416     {
4417       printf (_("\n Section to Segment mapping:\n"));
4418       printf (_("  Segment Sections...\n"));
4419
4420       for (i = 0; i < elf_header.e_phnum; i++)
4421         {
4422           unsigned int j;
4423           Elf_Internal_Shdr * section;
4424
4425           segment = program_headers + i;
4426           section = section_headers + 1;
4427
4428           printf ("   %2.2d     ", i);
4429
4430           for (j = 1; j < elf_header.e_shnum; j++, section++)
4431             {
4432               if (!ELF_TBSS_SPECIAL (section, segment)
4433                   && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
4434                 printf ("%s ", SECTION_NAME (section));
4435             }
4436
4437           putc ('\n',stdout);
4438         }
4439     }
4440
4441   return 1;
4442 }
4443
4444
4445 /* Find the file offset corresponding to VMA by using the program headers.  */
4446
4447 static long
4448 offset_from_vma (FILE * file, bfd_vma vma, bfd_size_type size)
4449 {
4450   Elf_Internal_Phdr * seg;
4451
4452   if (! get_program_headers (file))
4453     {
4454       warn (_("Cannot interpret virtual addresses without program headers.\n"));
4455       return (long) vma;
4456     }
4457
4458   for (seg = program_headers;
4459        seg < program_headers + elf_header.e_phnum;
4460        ++seg)
4461     {
4462       if (seg->p_type != PT_LOAD)
4463         continue;
4464
4465       if (vma >= (seg->p_vaddr & -seg->p_align)
4466           && vma + size <= seg->p_vaddr + seg->p_filesz)
4467         return vma - seg->p_vaddr + seg->p_offset;
4468     }
4469
4470   warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
4471         (unsigned long) vma);
4472   return (long) vma;
4473 }
4474
4475
4476 static int
4477 get_32bit_section_headers (FILE * file, unsigned int num)
4478 {
4479   Elf32_External_Shdr * shdrs;
4480   Elf_Internal_Shdr *   internal;
4481   unsigned int i;
4482
4483   shdrs = (Elf32_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
4484                                             elf_header.e_shentsize, num,
4485                                             _("section headers"));
4486   if (!shdrs)
4487     return 0;
4488
4489   section_headers = (Elf_Internal_Shdr *) cmalloc (num,
4490                                                    sizeof (Elf_Internal_Shdr));
4491
4492   if (section_headers == NULL)
4493     {
4494       error (_("Out of memory\n"));
4495       return 0;
4496     }
4497
4498   for (i = 0, internal = section_headers;
4499        i < num;
4500        i++, internal++)
4501     {
4502       internal->sh_name      = BYTE_GET (shdrs[i].sh_name);
4503       internal->sh_type      = BYTE_GET (shdrs[i].sh_type);
4504       internal->sh_flags     = BYTE_GET (shdrs[i].sh_flags);
4505       internal->sh_addr      = BYTE_GET (shdrs[i].sh_addr);
4506       internal->sh_offset    = BYTE_GET (shdrs[i].sh_offset);
4507       internal->sh_size      = BYTE_GET (shdrs[i].sh_size);
4508       internal->sh_link      = BYTE_GET (shdrs[i].sh_link);
4509       internal->sh_info      = BYTE_GET (shdrs[i].sh_info);
4510       internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
4511       internal->sh_entsize   = BYTE_GET (shdrs[i].sh_entsize);
4512     }
4513
4514   free (shdrs);
4515
4516   return 1;
4517 }
4518
4519 static int
4520 get_64bit_section_headers (FILE * file, unsigned int num)
4521 {
4522   Elf64_External_Shdr * shdrs;
4523   Elf_Internal_Shdr *   internal;
4524   unsigned int i;
4525
4526   shdrs = (Elf64_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
4527                                             elf_header.e_shentsize, num,
4528                                             _("section headers"));
4529   if (!shdrs)
4530     return 0;
4531
4532   section_headers = (Elf_Internal_Shdr *) cmalloc (num,
4533                                                    sizeof (Elf_Internal_Shdr));
4534
4535   if (section_headers == NULL)
4536     {
4537       error (_("Out of memory\n"));
4538       return 0;
4539     }
4540
4541   for (i = 0, internal = section_headers;
4542        i < num;
4543        i++, internal++)
4544     {
4545       internal->sh_name      = BYTE_GET (shdrs[i].sh_name);
4546       internal->sh_type      = BYTE_GET (shdrs[i].sh_type);
4547       internal->sh_flags     = BYTE_GET (shdrs[i].sh_flags);
4548       internal->sh_addr      = BYTE_GET (shdrs[i].sh_addr);
4549       internal->sh_size      = BYTE_GET (shdrs[i].sh_size);
4550       internal->sh_entsize   = BYTE_GET (shdrs[i].sh_entsize);
4551       internal->sh_link      = BYTE_GET (shdrs[i].sh_link);
4552       internal->sh_info      = BYTE_GET (shdrs[i].sh_info);
4553       internal->sh_offset    = BYTE_GET (shdrs[i].sh_offset);
4554       internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
4555     }
4556
4557   free (shdrs);
4558
4559   return 1;
4560 }
4561
4562 static Elf_Internal_Sym *
4563 get_32bit_elf_symbols (FILE * file,
4564                        Elf_Internal_Shdr * section,
4565                        unsigned long * num_syms_return)
4566 {
4567   unsigned long number = 0;
4568   Elf32_External_Sym * esyms = NULL;
4569   Elf_External_Sym_Shndx * shndx = NULL;
4570   Elf_Internal_Sym * isyms = NULL;
4571   Elf_Internal_Sym * psym;
4572   unsigned int j;
4573
4574   /* Run some sanity checks first.  */
4575   if (section->sh_entsize == 0)
4576     {
4577       error (_("sh_entsize is zero\n"));
4578       goto exit_point;
4579     }
4580
4581   number = section->sh_size / section->sh_entsize;
4582
4583   if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
4584     {
4585       error (_("Invalid sh_entsize\n"));
4586       goto exit_point;
4587     }
4588
4589   esyms = (Elf32_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
4590                                            section->sh_size, _("symbols"));
4591   if (esyms == NULL)
4592     goto exit_point;
4593
4594   shndx = NULL;
4595   if (symtab_shndx_hdr != NULL
4596       && (symtab_shndx_hdr->sh_link
4597           == (unsigned long) (section - section_headers)))
4598     {
4599       shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
4600                                                    symtab_shndx_hdr->sh_offset,
4601                                                    1, symtab_shndx_hdr->sh_size,
4602                                                    _("symbol table section indicies"));
4603       if (shndx == NULL)
4604         goto exit_point;
4605     }
4606
4607   isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
4608
4609   if (isyms == NULL)
4610     {
4611       error (_("Out of memory\n"));
4612       goto exit_point;
4613     }
4614
4615   for (j = 0, psym = isyms; j < number; j++, psym++)
4616     {
4617       psym->st_name  = BYTE_GET (esyms[j].st_name);
4618       psym->st_value = BYTE_GET (esyms[j].st_value);
4619       psym->st_size  = BYTE_GET (esyms[j].st_size);
4620       psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
4621       if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
4622         psym->st_shndx
4623           = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
4624       else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
4625         psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
4626       psym->st_info  = BYTE_GET (esyms[j].st_info);
4627       psym->st_other = BYTE_GET (esyms[j].st_other);
4628     }
4629
4630  exit_point:
4631   if (shndx != NULL)
4632     free (shndx);
4633   if (esyms != NULL)
4634     free (esyms);
4635
4636   if (num_syms_return != NULL)
4637     * num_syms_return = isyms == NULL ? 0 : number;
4638
4639   return isyms;
4640 }
4641
4642 static Elf_Internal_Sym *
4643 get_64bit_elf_symbols (FILE * file,
4644                        Elf_Internal_Shdr * section,
4645                        unsigned long * num_syms_return)
4646 {
4647   unsigned long number = 0;
4648   Elf64_External_Sym * esyms = NULL;
4649   Elf_External_Sym_Shndx * shndx = NULL;
4650   Elf_Internal_Sym * isyms = NULL;
4651   Elf_Internal_Sym * psym;
4652   unsigned int j;
4653
4654   /* Run some sanity checks first.  */
4655   if (section->sh_entsize == 0)
4656     {
4657       error (_("sh_entsize is zero\n"));
4658       goto exit_point;
4659     }
4660
4661   number = section->sh_size / section->sh_entsize;
4662
4663   if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
4664     {
4665       error (_("Invalid sh_entsize\n"));
4666       goto exit_point;
4667     }
4668
4669   esyms = (Elf64_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
4670                                            section->sh_size, _("symbols"));
4671   if (!esyms)
4672     goto exit_point;
4673
4674   if (symtab_shndx_hdr != NULL
4675       && (symtab_shndx_hdr->sh_link
4676           == (unsigned long) (section - section_headers)))
4677     {
4678       shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
4679                                                    symtab_shndx_hdr->sh_offset,
4680                                                    1, symtab_shndx_hdr->sh_size,
4681                                                    _("symbol table section indicies"));
4682       if (shndx == NULL)
4683         goto exit_point;
4684     }
4685
4686   isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
4687
4688   if (isyms == NULL)
4689     {
4690       error (_("Out of memory\n"));
4691       goto exit_point;
4692     }
4693
4694   for (j = 0, psym = isyms; j < number; j++, psym++)
4695     {
4696       psym->st_name  = BYTE_GET (esyms[j].st_name);
4697       psym->st_info  = BYTE_GET (esyms[j].st_info);
4698       psym->st_other = BYTE_GET (esyms[j].st_other);
4699       psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
4700
4701       if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
4702         psym->st_shndx
4703           = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
4704       else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
4705         psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
4706
4707       psym->st_value = BYTE_GET (esyms[j].st_value);
4708       psym->st_size  = BYTE_GET (esyms[j].st_size);
4709     }
4710
4711  exit_point:
4712   if (shndx != NULL)
4713     free (shndx);
4714   if (esyms != NULL)
4715     free (esyms);
4716
4717   if (num_syms_return != NULL)
4718     * num_syms_return = isyms == NULL ? 0 : number;
4719
4720   return isyms;
4721 }
4722
4723 static const char *
4724 get_elf_section_flags (bfd_vma sh_flags)
4725 {
4726   static char buff[1024];
4727   char * p = buff;
4728   int field_size = is_32bit_elf ? 8 : 16;
4729   int sindex;
4730   int size = sizeof (buff) - (field_size + 4 + 1);
4731   bfd_vma os_flags = 0;
4732   bfd_vma proc_flags = 0;
4733   bfd_vma unknown_flags = 0;
4734   static const struct
4735     {
4736       const char * str;
4737       int len;
4738     }
4739   flags [] =
4740     {
4741       /*  0 */ { STRING_COMMA_LEN ("WRITE") },
4742       /*  1 */ { STRING_COMMA_LEN ("ALLOC") },
4743       /*  2 */ { STRING_COMMA_LEN ("EXEC") },
4744       /*  3 */ { STRING_COMMA_LEN ("MERGE") },
4745       /*  4 */ { STRING_COMMA_LEN ("STRINGS") },
4746       /*  5 */ { STRING_COMMA_LEN ("INFO LINK") },
4747       /*  6 */ { STRING_COMMA_LEN ("LINK ORDER") },
4748       /*  7 */ { STRING_COMMA_LEN ("OS NONCONF") },
4749       /*  8 */ { STRING_COMMA_LEN ("GROUP") },
4750       /*  9 */ { STRING_COMMA_LEN ("TLS") },
4751       /* IA-64 specific.  */
4752       /* 10 */ { STRING_COMMA_LEN ("SHORT") },
4753       /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
4754       /* IA-64 OpenVMS specific.  */
4755       /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
4756       /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
4757       /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
4758       /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
4759       /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
4760       /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
4761       /* Generic.  */
4762       /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
4763       /* SPARC specific.  */
4764       /* 19 */ { STRING_COMMA_LEN ("ORDERED") }
4765     };
4766
4767   if (do_section_details)
4768     {
4769       sprintf (buff, "[%*.*lx]: ",
4770                field_size, field_size, (unsigned long) sh_flags);
4771       p += field_size + 4;
4772     }
4773
4774   while (sh_flags)
4775     {
4776       bfd_vma flag;
4777
4778       flag = sh_flags & - sh_flags;
4779       sh_flags &= ~ flag;
4780
4781       if (do_section_details)
4782         {
4783           switch (flag)
4784             {
4785             case SHF_WRITE:             sindex = 0; break;
4786             case SHF_ALLOC:             sindex = 1; break;
4787             case SHF_EXECINSTR:         sindex = 2; break;
4788             case SHF_MERGE:             sindex = 3; break;
4789             case SHF_STRINGS:           sindex = 4; break;
4790             case SHF_INFO_LINK:         sindex = 5; break;
4791             case SHF_LINK_ORDER:        sindex = 6; break;
4792             case SHF_OS_NONCONFORMING:  sindex = 7; break;
4793             case SHF_GROUP:             sindex = 8; break;
4794             case SHF_TLS:               sindex = 9; break;
4795             case SHF_EXCLUDE:           sindex = 18; break;
4796
4797             default:
4798               sindex = -1;
4799               switch (elf_header.e_machine)
4800                 {
4801                 case EM_IA_64:
4802                   if (flag == SHF_IA_64_SHORT)
4803                     sindex = 10;
4804                   else if (flag == SHF_IA_64_NORECOV)
4805                     sindex = 11;
4806 #ifdef BFD64
4807                   else if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
4808                     switch (flag)
4809                       {
4810                       case SHF_IA_64_VMS_GLOBAL:      sindex = 12; break;
4811                       case SHF_IA_64_VMS_OVERLAID:    sindex = 13; break;
4812                       case SHF_IA_64_VMS_SHARED:      sindex = 14; break;
4813                       case SHF_IA_64_VMS_VECTOR:      sindex = 15; break;
4814                       case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
4815                       case SHF_IA_64_VMS_PROTECTED:   sindex = 17; break;
4816                       default:                        break;
4817                       }
4818 #endif
4819                   break;
4820
4821                 case EM_386:
4822                 case EM_486:
4823                 case EM_X86_64:
4824                 case EM_L1OM:
4825                 case EM_K1OM:
4826                 case EM_OLD_SPARCV9:
4827                 case EM_SPARC32PLUS:
4828                 case EM_SPARCV9:
4829                 case EM_SPARC:
4830                   if (flag == SHF_ORDERED)
4831                     sindex = 19;
4832                   break;
4833                 default:
4834                   break;
4835                 }
4836             }
4837
4838           if (sindex != -1)
4839             {
4840               if (p != buff + field_size + 4)
4841                 {
4842                   if (size < (10 + 2))
4843                     abort ();
4844                   size -= 2;
4845                   *p++ = ',';
4846                   *p++ = ' ';
4847                 }
4848
4849               size -= flags [sindex].len;
4850               p = stpcpy (p, flags [sindex].str);
4851             }
4852           else if (flag & SHF_MASKOS)
4853             os_flags |= flag;
4854           else if (flag & SHF_MASKPROC)
4855             proc_flags |= flag;
4856           else
4857             unknown_flags |= flag;
4858         }
4859       else
4860         {
4861           switch (flag)
4862             {
4863             case SHF_WRITE:             *p = 'W'; break;
4864             case SHF_ALLOC:             *p = 'A'; break;
4865             case SHF_EXECINSTR:         *p = 'X'; break;
4866             case SHF_MERGE:             *p = 'M'; break;
4867             case SHF_STRINGS:           *p = 'S'; break;
4868             case SHF_INFO_LINK:         *p = 'I'; break;
4869             case SHF_LINK_ORDER:        *p = 'L'; break;
4870             case SHF_OS_NONCONFORMING:  *p = 'O'; break;
4871             case SHF_GROUP:             *p = 'G'; break;
4872             case SHF_TLS:               *p = 'T'; break;
4873             case SHF_EXCLUDE:           *p = 'E'; break;
4874
4875             default:
4876               if ((elf_header.e_machine == EM_X86_64
4877                    || elf_header.e_machine == EM_L1OM
4878                    || elf_header.e_machine == EM_K1OM)
4879                   && flag == SHF_X86_64_LARGE)
4880                 *p = 'l';
4881               else if (flag & SHF_MASKOS)
4882                 {
4883                   *p = 'o';
4884                   sh_flags &= ~ SHF_MASKOS;
4885                 }
4886               else if (flag & SHF_MASKPROC)
4887                 {
4888                   *p = 'p';
4889                   sh_flags &= ~ SHF_MASKPROC;
4890                 }
4891               else
4892                 *p = 'x';
4893               break;
4894             }
4895           p++;
4896         }
4897     }
4898
4899   if (do_section_details)
4900     {
4901       if (os_flags)
4902         {
4903           size -= 5 + field_size;
4904           if (p != buff + field_size + 4)
4905             {
4906               if (size < (2 + 1))
4907                 abort ();
4908               size -= 2;
4909               *p++ = ',';
4910               *p++ = ' ';
4911             }
4912           sprintf (p, "OS (%*.*lx)", field_size, field_size,
4913                    (unsigned long) os_flags);
4914           p += 5 + field_size;
4915         }
4916       if (proc_flags)
4917         {
4918           size -= 7 + field_size;
4919           if (p != buff + field_size + 4)
4920             {
4921               if (size < (2 + 1))
4922                 abort ();
4923               size -= 2;
4924               *p++ = ',';
4925               *p++ = ' ';
4926             }
4927           sprintf (p, "PROC (%*.*lx)", field_size, field_size,
4928                    (unsigned long) proc_flags);
4929           p += 7 + field_size;
4930         }
4931       if (unknown_flags)
4932         {
4933           size -= 10 + field_size;
4934           if (p != buff + field_size + 4)
4935             {
4936               if (size < (2 + 1))
4937                 abort ();
4938               size -= 2;
4939               *p++ = ',';
4940               *p++ = ' ';
4941             }
4942           sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
4943                    (unsigned long) unknown_flags);
4944           p += 10 + field_size;
4945         }
4946     }
4947
4948   *p = '\0';
4949   return buff;
4950 }
4951
4952 static int
4953 process_section_headers (FILE * file)
4954 {
4955   Elf_Internal_Shdr * section;
4956   unsigned int i;
4957
4958   section_headers = NULL;
4959
4960   if (elf_header.e_shnum == 0)
4961     {
4962       /* PR binutils/12467.  */
4963       if (elf_header.e_shoff != 0)
4964         warn (_("possibly corrupt ELF file header - it has a non-zero"
4965                 " section header offset, but no section headers\n"));
4966       else if (do_sections)
4967         printf (_("\nThere are no sections in this file.\n"));
4968
4969       return 1;
4970     }
4971
4972   if (do_sections && !do_header)
4973     printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
4974             elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
4975
4976   if (is_32bit_elf)
4977     {
4978       if (! get_32bit_section_headers (file, elf_header.e_shnum))
4979         return 0;
4980     }
4981   else if (! get_64bit_section_headers (file, elf_header.e_shnum))
4982     return 0;
4983
4984   /* Read in the string table, so that we have names to display.  */
4985   if (elf_header.e_shstrndx != SHN_UNDEF
4986        && elf_header.e_shstrndx < elf_header.e_shnum)
4987     {
4988       section = section_headers + elf_header.e_shstrndx;
4989
4990       if (section->sh_size != 0)
4991         {
4992           string_table = (char *) get_data (NULL, file, section->sh_offset,
4993                                             1, section->sh_size,
4994                                             _("string table"));
4995
4996           string_table_length = string_table != NULL ? section->sh_size : 0;
4997         }
4998     }
4999
5000   /* Scan the sections for the dynamic symbol table
5001      and dynamic string table and debug sections.  */
5002   dynamic_symbols = NULL;
5003   dynamic_strings = NULL;
5004   dynamic_syminfo = NULL;
5005   symtab_shndx_hdr = NULL;
5006
5007   eh_addr_size = is_32bit_elf ? 4 : 8;
5008   switch (elf_header.e_machine)
5009     {
5010     case EM_MIPS:
5011     case EM_MIPS_RS3_LE:
5012       /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
5013          FDE addresses.  However, the ABI also has a semi-official ILP32
5014          variant for which the normal FDE address size rules apply.
5015
5016          GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
5017          section, where XX is the size of longs in bits.  Unfortunately,
5018          earlier compilers provided no way of distinguishing ILP32 objects
5019          from LP64 objects, so if there's any doubt, we should assume that
5020          the official LP64 form is being used.  */
5021       if ((elf_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
5022           && find_section (".gcc_compiled_long32") == NULL)
5023         eh_addr_size = 8;
5024       break;
5025
5026     case EM_H8_300:
5027     case EM_H8_300H:
5028       switch (elf_header.e_flags & EF_H8_MACH)
5029         {
5030         case E_H8_MACH_H8300:
5031         case E_H8_MACH_H8300HN:
5032         case E_H8_MACH_H8300SN:
5033         case E_H8_MACH_H8300SXN:
5034           eh_addr_size = 2;
5035           break;
5036         case E_H8_MACH_H8300H:
5037         case E_H8_MACH_H8300S:
5038         case E_H8_MACH_H8300SX:
5039           eh_addr_size = 4;
5040           break;
5041         }
5042       break;
5043
5044     case EM_M32C_OLD:
5045     case EM_M32C:
5046       switch (elf_header.e_flags & EF_M32C_CPU_MASK)
5047         {
5048         case EF_M32C_CPU_M16C:
5049           eh_addr_size = 2;
5050           break;
5051         }
5052       break;
5053     }
5054
5055 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
5056   do                                                                        \
5057     {                                                                       \
5058       bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64;      \
5059       if (section->sh_entsize != expected_entsize)                          \
5060         {                                                               \
5061           error (_("Section %d has invalid sh_entsize of %" BFD_VMA_FMT "x\n"), \
5062                  i, section->sh_entsize);       \
5063           error (_("(Using the expected size of %d for the rest of this dump)\n"), \
5064                    (int) expected_entsize); \
5065           section->sh_entsize = expected_entsize;                       \
5066         } \
5067     }                                                                       \
5068   while (0)
5069
5070 #define CHECK_ENTSIZE(section, i, type)                                 \
5071   CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type),         \
5072                         sizeof (Elf64_External_##type))
5073
5074   for (i = 0, section = section_headers;
5075        i < elf_header.e_shnum;
5076        i++, section++)
5077     {
5078       char * name = SECTION_NAME (section);
5079
5080       if (section->sh_type == SHT_DYNSYM)
5081         {
5082           if (dynamic_symbols != NULL)
5083             {
5084               error (_("File contains multiple dynamic symbol tables\n"));
5085               continue;
5086             }
5087
5088           CHECK_ENTSIZE (section, i, Sym);
5089           dynamic_symbols = GET_ELF_SYMBOLS (file, section, & num_dynamic_syms);
5090         }
5091       else if (section->sh_type == SHT_STRTAB
5092                && streq (name, ".dynstr"))
5093         {
5094           if (dynamic_strings != NULL)
5095             {
5096               error (_("File contains multiple dynamic string tables\n"));
5097               continue;
5098             }
5099
5100           dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
5101                                                1, section->sh_size,
5102                                                _("dynamic strings"));
5103           dynamic_strings_length = dynamic_strings == NULL ? 0 : section->sh_size;
5104         }
5105       else if (section->sh_type == SHT_SYMTAB_SHNDX)
5106         {
5107           if (symtab_shndx_hdr != NULL)
5108             {
5109               error (_("File contains multiple symtab shndx tables\n"));
5110               continue;
5111             }
5112           symtab_shndx_hdr = section;
5113         }
5114       else if (section->sh_type == SHT_SYMTAB)
5115         CHECK_ENTSIZE (section, i, Sym);
5116       else if (section->sh_type == SHT_GROUP)
5117         CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
5118       else if (section->sh_type == SHT_REL)
5119         CHECK_ENTSIZE (section, i, Rel);
5120       else if (section->sh_type == SHT_RELA)
5121         CHECK_ENTSIZE (section, i, Rela);
5122       else if ((do_debugging || do_debug_info || do_debug_abbrevs
5123                 || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
5124                 || do_debug_aranges || do_debug_frames || do_debug_macinfo
5125                 || do_debug_str || do_debug_loc || do_debug_ranges
5126                 || do_debug_addr || do_debug_cu_index)
5127                && (const_strneq (name, ".debug_")
5128                    || const_strneq (name, ".zdebug_")))
5129         {
5130           if (name[1] == 'z')
5131             name += sizeof (".zdebug_") - 1;
5132           else
5133             name += sizeof (".debug_") - 1;
5134
5135           if (do_debugging
5136               || (do_debug_info     && const_strneq (name, "info"))
5137               || (do_debug_info     && const_strneq (name, "types"))
5138               || (do_debug_abbrevs  && const_strneq (name, "abbrev"))
5139               || (do_debug_lines    && strcmp (name, "line") == 0)
5140               || (do_debug_lines    && const_strneq (name, "line."))
5141               || (do_debug_pubnames && const_strneq (name, "pubnames"))
5142               || (do_debug_pubtypes && const_strneq (name, "pubtypes"))
5143               || (do_debug_pubnames && const_strneq (name, "gnu_pubnames"))
5144               || (do_debug_pubtypes && const_strneq (name, "gnu_pubtypes"))
5145               || (do_debug_aranges  && const_strneq (name, "aranges"))
5146               || (do_debug_ranges   && const_strneq (name, "ranges"))
5147               || (do_debug_frames   && const_strneq (name, "frame"))
5148               || (do_debug_macinfo  && const_strneq (name, "macinfo"))
5149               || (do_debug_macinfo  && const_strneq (name, "macro"))
5150               || (do_debug_str      && const_strneq (name, "str"))
5151               || (do_debug_loc      && const_strneq (name, "loc"))
5152               || (do_debug_addr     && const_strneq (name, "addr"))
5153               || (do_debug_cu_index && const_strneq (name, "cu_index"))
5154               || (do_debug_cu_index && const_strneq (name, "tu_index"))
5155               )
5156             request_dump_bynumber (i, DEBUG_DUMP);
5157         }
5158       /* Linkonce section to be combined with .debug_info at link time.  */
5159       else if ((do_debugging || do_debug_info)
5160                && const_strneq (name, ".gnu.linkonce.wi."))
5161         request_dump_bynumber (i, DEBUG_DUMP);
5162       else if (do_debug_frames && streq (name, ".eh_frame"))
5163         request_dump_bynumber (i, DEBUG_DUMP);
5164       else if (do_gdb_index && streq (name, ".gdb_index"))
5165         request_dump_bynumber (i, DEBUG_DUMP);
5166       /* Trace sections for Itanium VMS.  */
5167       else if ((do_debugging || do_trace_info || do_trace_abbrevs
5168                 || do_trace_aranges)
5169                && const_strneq (name, ".trace_"))
5170         {
5171           name += sizeof (".trace_") - 1;
5172
5173           if (do_debugging
5174               || (do_trace_info     && streq (name, "info"))
5175               || (do_trace_abbrevs  && streq (name, "abbrev"))
5176               || (do_trace_aranges  && streq (name, "aranges"))
5177               )
5178             request_dump_bynumber (i, DEBUG_DUMP);
5179         }
5180
5181     }
5182
5183   if (! do_sections)
5184     return 1;
5185
5186   if (elf_header.e_shnum > 1)
5187     printf (_("\nSection Headers:\n"));
5188   else
5189     printf (_("\nSection Header:\n"));
5190
5191   if (is_32bit_elf)
5192     {
5193       if (do_section_details)
5194         {
5195           printf (_("  [Nr] Name\n"));
5196           printf (_("       Type            Addr     Off    Size   ES   Lk Inf Al\n"));
5197         }
5198       else
5199         printf
5200           (_("  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al\n"));
5201     }
5202   else if (do_wide)
5203     {
5204       if (do_section_details)
5205         {
5206           printf (_("  [Nr] Name\n"));
5207           printf (_("       Type            Address          Off    Size   ES   Lk Inf Al\n"));
5208         }
5209       else
5210         printf
5211           (_("  [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al\n"));
5212     }
5213   else
5214     {
5215       if (do_section_details)
5216         {
5217           printf (_("  [Nr] Name\n"));
5218           printf (_("       Type              Address          Offset            Link\n"));
5219           printf (_("       Size              EntSize          Info              Align\n"));
5220         }
5221       else
5222         {
5223           printf (_("  [Nr] Name              Type             Address           Offset\n"));
5224           printf (_("       Size              EntSize          Flags  Link  Info  Align\n"));
5225         }
5226     }
5227
5228   if (do_section_details)
5229     printf (_("       Flags\n"));
5230
5231   for (i = 0, section = section_headers;
5232        i < elf_header.e_shnum;
5233        i++, section++)
5234     {
5235       printf ("  [%2u] ", i);
5236       if (do_section_details)
5237         {
5238           print_symbol (INT_MAX, SECTION_NAME (section));
5239           printf ("\n      ");
5240         }
5241       else
5242         {
5243           print_symbol (-17, SECTION_NAME (section));
5244         }
5245
5246       printf (do_wide ? " %-15s " : " %-15.15s ",
5247               get_section_type_name (section->sh_type));
5248
5249       if (is_32bit_elf)
5250         {
5251           const char * link_too_big = NULL;
5252
5253           print_vma (section->sh_addr, LONG_HEX);
5254
5255           printf ( " %6.6lx %6.6lx %2.2lx",
5256                    (unsigned long) section->sh_offset,
5257                    (unsigned long) section->sh_size,
5258                    (unsigned long) section->sh_entsize);
5259
5260           if (do_section_details)
5261             fputs ("  ", stdout);
5262           else
5263             printf (" %3s ", get_elf_section_flags (section->sh_flags));
5264
5265           if (section->sh_link >= elf_header.e_shnum)
5266             {
5267               link_too_big = "";
5268               /* The sh_link value is out of range.  Normally this indicates
5269                  an error but it can have special values in Solaris binaries.  */
5270               switch (elf_header.e_machine)
5271                 {
5272                 case EM_386:
5273                 case EM_486:
5274                 case EM_X86_64:
5275                 case EM_L1OM:
5276                 case EM_K1OM:
5277                 case EM_OLD_SPARCV9:
5278                 case EM_SPARC32PLUS:
5279                 case EM_SPARCV9:
5280                 case EM_SPARC:
5281                   if (section->sh_link == (SHN_BEFORE & 0xffff))
5282                     link_too_big = "BEFORE";
5283                   else if (section->sh_link == (SHN_AFTER & 0xffff))
5284                     link_too_big = "AFTER";
5285                   break;
5286                 default:
5287                   break;
5288                 }
5289             }
5290
5291           if (do_section_details)
5292             {
5293               if (link_too_big != NULL && * link_too_big)
5294                 printf ("<%s> ", link_too_big);
5295               else
5296                 printf ("%2u ", section->sh_link);
5297               printf ("%3u %2lu\n", section->sh_info,
5298                       (unsigned long) section->sh_addralign);
5299             }
5300           else
5301             printf ("%2u %3u %2lu\n",
5302                     section->sh_link,
5303                     section->sh_info,
5304                     (unsigned long) section->sh_addralign);
5305
5306           if (link_too_big && ! * link_too_big)
5307             warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
5308                   i, section->sh_link);
5309         }
5310       else if (do_wide)
5311         {
5312           print_vma (section->sh_addr, LONG_HEX);
5313
5314           if ((long) section->sh_offset == section->sh_offset)
5315             printf (" %6.6lx", (unsigned long) section->sh_offset);
5316           else
5317             {
5318               putchar (' ');
5319               print_vma (section->sh_offset, LONG_HEX);
5320             }
5321
5322           if ((unsigned long) section->sh_size == section->sh_size)
5323             printf (" %6.6lx", (unsigned long) section->sh_size);
5324           else
5325             {
5326               putchar (' ');
5327               print_vma (section->sh_size, LONG_HEX);
5328             }
5329
5330           if ((unsigned long) section->sh_entsize == section->sh_entsize)
5331             printf (" %2.2lx", (unsigned long) section->sh_entsize);
5332           else
5333             {
5334               putchar (' ');
5335               print_vma (section->sh_entsize, LONG_HEX);
5336             }
5337
5338           if (do_section_details)
5339             fputs ("  ", stdout);
5340           else
5341             printf (" %3s ", get_elf_section_flags (section->sh_flags));
5342
5343           printf ("%2u %3u ", section->sh_link, section->sh_info);
5344
5345           if ((unsigned long) section->sh_addralign == section->sh_addralign)
5346             printf ("%2lu\n", (unsigned long) section->sh_addralign);
5347           else
5348             {
5349               print_vma (section->sh_addralign, DEC);
5350               putchar ('\n');
5351             }
5352         }
5353       else if (do_section_details)
5354         {
5355           printf ("       %-15.15s  ",
5356                   get_section_type_name (section->sh_type));
5357           print_vma (section->sh_addr, LONG_HEX);
5358           if ((long) section->sh_offset == section->sh_offset)
5359             printf ("  %16.16lx", (unsigned long) section->sh_offset);
5360           else
5361             {
5362               printf ("  ");
5363               print_vma (section->sh_offset, LONG_HEX);
5364             }
5365           printf ("  %u\n       ", section->sh_link);
5366           print_vma (section->sh_size, LONG_HEX);
5367           putchar (' ');
5368           print_vma (section->sh_entsize, LONG_HEX);
5369
5370           printf ("  %-16u  %lu\n",
5371                   section->sh_info,
5372                   (unsigned long) section->sh_addralign);
5373         }
5374       else
5375         {
5376           putchar (' ');
5377           print_vma (section->sh_addr, LONG_HEX);
5378           if ((long) section->sh_offset == section->sh_offset)
5379             printf ("  %8.8lx", (unsigned long) section->sh_offset);
5380           else
5381             {
5382               printf ("  ");
5383               print_vma (section->sh_offset, LONG_HEX);
5384             }
5385           printf ("\n       ");
5386           print_vma (section->sh_size, LONG_HEX);
5387           printf ("  ");
5388           print_vma (section->sh_entsize, LONG_HEX);
5389
5390           printf (" %3s ", get_elf_section_flags (section->sh_flags));
5391
5392           printf ("     %2u   %3u     %lu\n",
5393                   section->sh_link,
5394                   section->sh_info,
5395                   (unsigned long) section->sh_addralign);
5396         }
5397
5398       if (do_section_details)
5399         printf ("       %s\n", get_elf_section_flags (section->sh_flags));
5400     }
5401
5402   if (!do_section_details)
5403     {
5404       if (elf_header.e_machine == EM_X86_64
5405           || elf_header.e_machine == EM_L1OM
5406           || elf_header.e_machine == EM_K1OM)
5407         printf (_("Key to Flags:\n\
5408   W (write), A (alloc), X (execute), M (merge), S (strings), l (large)\n\
5409   I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)\n\
5410   O (extra OS processing required) o (OS specific), p (processor specific)\n"));
5411       else
5412         printf (_("Key to Flags:\n\
5413   W (write), A (alloc), X (execute), M (merge), S (strings)\n\
5414   I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)\n\
5415   O (extra OS processing required) o (OS specific), p (processor specific)\n"));
5416     }
5417
5418   return 1;
5419 }
5420
5421 static const char *
5422 get_group_flags (unsigned int flags)
5423 {
5424   static char buff[32];
5425   switch (flags)
5426     {
5427     case 0:
5428       return "";
5429
5430     case GRP_COMDAT:
5431       return "COMDAT ";
5432
5433    default:
5434       snprintf (buff, sizeof (buff), _("[<unknown>: 0x%x] "), flags);
5435       break;
5436     }
5437   return buff;
5438 }
5439
5440 static int
5441 process_section_groups (FILE * file)
5442 {
5443   Elf_Internal_Shdr * section;
5444   unsigned int i;
5445   struct group * group;
5446   Elf_Internal_Shdr * symtab_sec;
5447   Elf_Internal_Shdr * strtab_sec;
5448   Elf_Internal_Sym * symtab;
5449   unsigned long num_syms;
5450   char * strtab;
5451   size_t strtab_size;
5452
5453   /* Don't process section groups unless needed.  */
5454   if (!do_unwind && !do_section_groups)
5455     return 1;
5456
5457   if (elf_header.e_shnum == 0)
5458     {
5459       if (do_section_groups)
5460         printf (_("\nThere are no sections to group in this file.\n"));
5461
5462       return 1;
5463     }
5464
5465   if (section_headers == NULL)
5466     {
5467       error (_("Section headers are not available!\n"));
5468       /* PR 13622: This can happen with a corrupt ELF header.  */
5469       return 0;
5470     }
5471
5472   section_headers_groups = (struct group **) calloc (elf_header.e_shnum,
5473                                                      sizeof (struct group *));
5474
5475   if (section_headers_groups == NULL)
5476     {
5477       error (_("Out of memory\n"));
5478       return 0;
5479     }
5480
5481   /* Scan the sections for the group section.  */
5482   group_count = 0;
5483   for (i = 0, section = section_headers;
5484        i < elf_header.e_shnum;
5485        i++, section++)
5486     if (section->sh_type == SHT_GROUP)
5487       group_count++;
5488
5489   if (group_count == 0)
5490     {
5491       if (do_section_groups)
5492         printf (_("\nThere are no section groups in this file.\n"));
5493
5494       return 1;
5495     }
5496
5497   section_groups = (struct group *) calloc (group_count, sizeof (struct group));
5498
5499   if (section_groups == NULL)
5500     {
5501       error (_("Out of memory\n"));
5502       return 0;
5503     }
5504
5505   symtab_sec = NULL;
5506   strtab_sec = NULL;
5507   symtab = NULL;
5508   num_syms = 0;
5509   strtab = NULL;
5510   strtab_size = 0;
5511   for (i = 0, section = section_headers, group = section_groups;
5512        i < elf_header.e_shnum;
5513        i++, section++)
5514     {
5515       if (section->sh_type == SHT_GROUP)
5516         {
5517           char * name = SECTION_NAME (section);
5518           char * group_name;
5519           unsigned char * start;
5520           unsigned char * indices;
5521           unsigned int entry, j, size;
5522           Elf_Internal_Shdr * sec;
5523           Elf_Internal_Sym * sym;
5524
5525           /* Get the symbol table.  */
5526           if (section->sh_link >= elf_header.e_shnum
5527               || ((sec = section_headers + section->sh_link)->sh_type
5528                   != SHT_SYMTAB))
5529             {
5530               error (_("Bad sh_link in group section `%s'\n"), name);
5531               continue;
5532             }
5533
5534           if (symtab_sec != sec)
5535             {
5536               symtab_sec = sec;
5537               if (symtab)
5538                 free (symtab);
5539               symtab = GET_ELF_SYMBOLS (file, symtab_sec, & num_syms);
5540             }
5541
5542           if (symtab == NULL)
5543             {
5544               error (_("Corrupt header in group section `%s'\n"), name);
5545               continue;
5546             }
5547
5548           if (section->sh_info >= num_syms)
5549             {
5550               error (_("Bad sh_info in group section `%s'\n"), name);
5551               continue;
5552             }
5553
5554           sym = symtab + section->sh_info;
5555
5556           if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
5557             {
5558               if (sym->st_shndx == 0
5559                   || sym->st_shndx >= elf_header.e_shnum)
5560                 {
5561                   error (_("Bad sh_info in group section `%s'\n"), name);
5562                   continue;
5563                 }
5564
5565               group_name = SECTION_NAME (section_headers + sym->st_shndx);
5566               strtab_sec = NULL;
5567               if (strtab)
5568                 free (strtab);
5569               strtab = NULL;
5570               strtab_size = 0;
5571             }
5572           else
5573             {
5574               /* Get the string table.  */
5575               if (symtab_sec->sh_link >= elf_header.e_shnum)
5576                 {
5577                   strtab_sec = NULL;
5578                   if (strtab)
5579                     free (strtab);
5580                   strtab = NULL;
5581                   strtab_size = 0;
5582                 }
5583               else if (strtab_sec
5584                        != (sec = section_headers + symtab_sec->sh_link))
5585                 {
5586                   strtab_sec = sec;
5587                   if (strtab)
5588                     free (strtab);
5589                   strtab = (char *) get_data (NULL, file, strtab_sec->sh_offset,
5590                                               1, strtab_sec->sh_size,
5591                                               _("string table"));
5592                   strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
5593                 }
5594               group_name = sym->st_name < strtab_size
5595                 ? strtab + sym->st_name : _("<corrupt>");
5596             }
5597
5598           start = (unsigned char *) get_data (NULL, file, section->sh_offset,
5599                                               1, section->sh_size,
5600                                               _("section data"));
5601           if (start == NULL)
5602             continue;
5603
5604           indices = start;
5605           size = (section->sh_size / section->sh_entsize) - 1;
5606           entry = byte_get (indices, 4);
5607           indices += 4;
5608
5609           if (do_section_groups)
5610             {
5611               printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
5612                       get_group_flags (entry), i, name, group_name, size);
5613
5614               printf (_("   [Index]    Name\n"));
5615             }
5616
5617           group->group_index = i;
5618
5619           for (j = 0; j < size; j++)
5620             {
5621               struct group_list * g;
5622
5623               entry = byte_get (indices, 4);
5624               indices += 4;
5625
5626               if (entry >= elf_header.e_shnum)
5627                 {
5628                   error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
5629                          entry, i, elf_header.e_shnum - 1);
5630                   continue;
5631                 }
5632
5633               if (section_headers_groups [entry] != NULL)
5634                 {
5635                   if (entry)
5636                     {
5637                       error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
5638                              entry, i,
5639                              section_headers_groups [entry]->group_index);
5640                       continue;
5641                     }
5642                   else
5643                     {
5644                       /* Intel C/C++ compiler may put section 0 in a
5645                          section group. We just warn it the first time
5646                          and ignore it afterwards.  */
5647                       static int warned = 0;
5648                       if (!warned)
5649                         {
5650                           error (_("section 0 in group section [%5u]\n"),
5651                                  section_headers_groups [entry]->group_index);
5652                           warned++;
5653                         }
5654                     }
5655                 }
5656
5657               section_headers_groups [entry] = group;
5658
5659               if (do_section_groups)
5660                 {
5661                   sec = section_headers + entry;
5662                   printf ("   [%5u]   %s\n", entry, SECTION_NAME (sec));
5663                 }
5664
5665               g = (struct group_list *) xmalloc (sizeof (struct group_list));
5666               g->section_index = entry;
5667               g->next = group->root;
5668               group->root = g;
5669             }
5670
5671           if (start)
5672             free (start);
5673
5674           group++;
5675         }
5676     }
5677
5678   if (symtab)
5679     free (symtab);
5680   if (strtab)
5681     free (strtab);
5682   return 1;
5683 }
5684
5685 /* Data used to display dynamic fixups.  */
5686
5687 struct ia64_vms_dynfixup
5688 {
5689   bfd_vma needed_ident;         /* Library ident number.  */
5690   bfd_vma needed;               /* Index in the dstrtab of the library name.  */
5691   bfd_vma fixup_needed;         /* Index of the library.  */
5692   bfd_vma fixup_rela_cnt;       /* Number of fixups.  */
5693   bfd_vma fixup_rela_off;       /* Fixups offset in the dynamic segment.  */
5694 };
5695
5696 /* Data used to display dynamic relocations.  */
5697
5698 struct ia64_vms_dynimgrela
5699 {
5700   bfd_vma img_rela_cnt;         /* Number of relocations.  */
5701   bfd_vma img_rela_off;         /* Reloc offset in the dynamic segment.  */
5702 };
5703
5704 /* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
5705    library).  */
5706
5707 static void
5708 dump_ia64_vms_dynamic_fixups (FILE *file, struct ia64_vms_dynfixup *fixup,
5709                               const char *strtab, unsigned int strtab_sz)
5710 {
5711   Elf64_External_VMS_IMAGE_FIXUP *imfs;
5712   long i;
5713   const char *lib_name;
5714
5715   imfs = get_data (NULL, file, dynamic_addr + fixup->fixup_rela_off,
5716                    1, fixup->fixup_rela_cnt * sizeof (*imfs),
5717                    _("dynamic section image fixups"));
5718   if (!imfs)
5719     return;
5720
5721   if (fixup->needed < strtab_sz)
5722     lib_name = strtab + fixup->needed;
5723   else
5724     {
5725       warn ("corrupt library name index of 0x%lx found in dynamic entry",
5726             (unsigned long) fixup->needed);
5727       lib_name = "???";
5728     }
5729   printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
5730           (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
5731   printf
5732     (_("Seg Offset           Type                             SymVec DataType\n"));
5733
5734   for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
5735     {
5736       unsigned int type;
5737       const char *rtype;
5738
5739       printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
5740       printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
5741       type = BYTE_GET (imfs [i].type);
5742       rtype = elf_ia64_reloc_type (type);
5743       if (rtype == NULL)
5744         printf (" 0x%08x                       ", type);
5745       else
5746         printf (" %-32s ", rtype);
5747       printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
5748       printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
5749     }
5750
5751   free (imfs);
5752 }
5753
5754 /* Display IA-64 OpenVMS dynamic relocations (used to relocate an image).  */
5755
5756 static void
5757 dump_ia64_vms_dynamic_relocs (FILE *file, struct ia64_vms_dynimgrela *imgrela)
5758 {
5759   Elf64_External_VMS_IMAGE_RELA *imrs;
5760   long i;
5761
5762   imrs = get_data (NULL, file, dynamic_addr + imgrela->img_rela_off,
5763                    1, imgrela->img_rela_cnt * sizeof (*imrs),
5764                    _("dynamic section image relocations"));
5765   if (!imrs)
5766     return;
5767
5768   printf (_("\nImage relocs\n"));
5769   printf
5770     (_("Seg Offset   Type                            Addend            Seg Sym Off\n"));
5771
5772   for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
5773     {
5774       unsigned int type;
5775       const char *rtype;
5776
5777       printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
5778       printf ("%08" BFD_VMA_FMT "x ",
5779               (bfd_vma) BYTE_GET (imrs [i].rela_offset));
5780       type = BYTE_GET (imrs [i].type);
5781       rtype = elf_ia64_reloc_type (type);
5782       if (rtype == NULL)
5783         printf ("0x%08x                      ", type);
5784       else
5785         printf ("%-31s ", rtype);
5786       print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
5787       printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
5788       printf ("%08" BFD_VMA_FMT "x\n",
5789               (bfd_vma) BYTE_GET (imrs [i].sym_offset));
5790     }
5791
5792   free (imrs);
5793 }
5794
5795 /* Display IA-64 OpenVMS dynamic relocations and fixups.  */
5796
5797 static int
5798 process_ia64_vms_dynamic_relocs (FILE *file)
5799 {
5800   struct ia64_vms_dynfixup fixup;
5801   struct ia64_vms_dynimgrela imgrela;
5802   Elf_Internal_Dyn *entry;
5803   int res = 0;
5804   bfd_vma strtab_off = 0;
5805   bfd_vma strtab_sz = 0;
5806   char *strtab = NULL;
5807
5808   memset (&fixup, 0, sizeof (fixup));
5809   memset (&imgrela, 0, sizeof (imgrela));
5810
5811   /* Note: the order of the entries is specified by the OpenVMS specs.  */
5812   for (entry = dynamic_section;
5813        entry < dynamic_section + dynamic_nent;
5814        entry++)
5815     {
5816       switch (entry->d_tag)
5817         {
5818         case DT_IA_64_VMS_STRTAB_OFFSET:
5819           strtab_off = entry->d_un.d_val;
5820           break;
5821         case DT_STRSZ:
5822           strtab_sz = entry->d_un.d_val;
5823           if (strtab == NULL)
5824             strtab = get_data (NULL, file, dynamic_addr + strtab_off,
5825                                1, strtab_sz, _("dynamic string section"));
5826           break;
5827
5828         case DT_IA_64_VMS_NEEDED_IDENT:
5829           fixup.needed_ident = entry->d_un.d_val;
5830           break;
5831         case DT_NEEDED:
5832           fixup.needed = entry->d_un.d_val;
5833           break;
5834         case DT_IA_64_VMS_FIXUP_NEEDED:
5835           fixup.fixup_needed = entry->d_un.d_val;
5836           break;
5837         case DT_IA_64_VMS_FIXUP_RELA_CNT:
5838           fixup.fixup_rela_cnt = entry->d_un.d_val;
5839           break;
5840         case DT_IA_64_VMS_FIXUP_RELA_OFF:
5841           fixup.fixup_rela_off = entry->d_un.d_val;
5842           res++;
5843           dump_ia64_vms_dynamic_fixups (file, &fixup, strtab, strtab_sz);
5844           break;
5845
5846         case DT_IA_64_VMS_IMG_RELA_CNT:
5847           imgrela.img_rela_cnt = entry->d_un.d_val;
5848           break;
5849         case DT_IA_64_VMS_IMG_RELA_OFF:
5850           imgrela.img_rela_off = entry->d_un.d_val;
5851           res++;
5852           dump_ia64_vms_dynamic_relocs (file, &imgrela);
5853           break;
5854
5855         default:
5856           break;
5857         }
5858     }
5859
5860   if (strtab != NULL)
5861     free (strtab);
5862
5863   return res;
5864 }
5865
5866 static struct
5867 {
5868   const char * name;
5869   int reloc;
5870   int size;
5871   int rela;
5872 } dynamic_relocations [] =
5873 {
5874     { "REL", DT_REL, DT_RELSZ, FALSE },
5875     { "RELA", DT_RELA, DT_RELASZ, TRUE },
5876     { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
5877 };
5878
5879 /* Process the reloc section.  */
5880
5881 static int
5882 process_relocs (FILE * file)
5883 {
5884   unsigned long rel_size;
5885   unsigned long rel_offset;
5886
5887
5888   if (!do_reloc)
5889     return 1;
5890
5891   if (do_using_dynamic)
5892     {
5893       int is_rela;
5894       const char * name;
5895       int has_dynamic_reloc;
5896       unsigned int i;
5897
5898       has_dynamic_reloc = 0;
5899
5900       for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
5901         {
5902           is_rela = dynamic_relocations [i].rela;
5903           name = dynamic_relocations [i].name;
5904           rel_size = dynamic_info [dynamic_relocations [i].size];
5905           rel_offset = dynamic_info [dynamic_relocations [i].reloc];
5906
5907           has_dynamic_reloc |= rel_size;
5908
5909           if (is_rela == UNKNOWN)
5910             {
5911               if (dynamic_relocations [i].reloc == DT_JMPREL)
5912                 switch (dynamic_info[DT_PLTREL])
5913                   {
5914                   case DT_REL:
5915                     is_rela = FALSE;
5916                     break;
5917                   case DT_RELA:
5918                     is_rela = TRUE;
5919                     break;
5920                   }
5921             }
5922
5923           if (rel_size)
5924             {
5925               printf
5926                 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
5927                  name, rel_offset, rel_size);
5928
5929               dump_relocations (file,
5930                                 offset_from_vma (file, rel_offset, rel_size),
5931                                 rel_size,
5932                                 dynamic_symbols, num_dynamic_syms,
5933                                 dynamic_strings, dynamic_strings_length, is_rela);
5934             }
5935         }
5936
5937       if (is_ia64_vms ())
5938         has_dynamic_reloc |= process_ia64_vms_dynamic_relocs (file);
5939
5940       if (! has_dynamic_reloc)
5941         printf (_("\nThere are no dynamic relocations in this file.\n"));
5942     }
5943   else
5944     {
5945       Elf_Internal_Shdr * section;
5946       unsigned long i;
5947       int found = 0;
5948
5949       for (i = 0, section = section_headers;
5950            i < elf_header.e_shnum;
5951            i++, section++)
5952         {
5953           if (   section->sh_type != SHT_RELA
5954               && section->sh_type != SHT_REL)
5955             continue;
5956
5957           rel_offset = section->sh_offset;
5958           rel_size   = section->sh_size;
5959
5960           if (rel_size)
5961             {
5962               Elf_Internal_Shdr * strsec;
5963               int is_rela;
5964
5965               printf (_("\nRelocation section "));
5966
5967               if (string_table == NULL)
5968                 printf ("%d", section->sh_name);
5969               else
5970                 printf ("'%s'", SECTION_NAME (section));
5971
5972               printf (_(" at offset 0x%lx contains %lu entries:\n"),
5973                  rel_offset, (unsigned long) (rel_size / section->sh_entsize));
5974
5975               is_rela = section->sh_type == SHT_RELA;
5976
5977               if (section->sh_link != 0
5978                   && section->sh_link < elf_header.e_shnum)
5979                 {
5980                   Elf_Internal_Shdr * symsec;
5981                   Elf_Internal_Sym *  symtab;
5982                   unsigned long nsyms;
5983                   unsigned long strtablen = 0;
5984                   char * strtab = NULL;
5985
5986                   symsec = section_headers + section->sh_link;
5987                   if (symsec->sh_type != SHT_SYMTAB
5988                       && symsec->sh_type != SHT_DYNSYM)
5989                     continue;
5990
5991                   symtab = GET_ELF_SYMBOLS (file, symsec, & nsyms);
5992
5993                   if (symtab == NULL)
5994                     continue;
5995
5996                   if (symsec->sh_link != 0
5997                       && symsec->sh_link < elf_header.e_shnum)
5998                     {
5999                       strsec = section_headers + symsec->sh_link;
6000
6001                       strtab = (char *) get_data (NULL, file, strsec->sh_offset,
6002                                                   1, strsec->sh_size,
6003                                                   _("string table"));
6004                       strtablen = strtab == NULL ? 0 : strsec->sh_size;
6005                     }
6006
6007                   dump_relocations (file, rel_offset, rel_size,
6008                                     symtab, nsyms, strtab, strtablen, is_rela);
6009                   if (strtab)
6010                     free (strtab);
6011                   free (symtab);
6012                 }
6013               else
6014                 dump_relocations (file, rel_offset, rel_size,
6015                                   NULL, 0, NULL, 0, is_rela);
6016
6017               found = 1;
6018             }
6019         }
6020
6021       if (! found)
6022         printf (_("\nThere are no relocations in this file.\n"));
6023     }
6024
6025   return 1;
6026 }
6027
6028 /* Process the unwind section.  */
6029
6030 #include "unwind-ia64.h"
6031
6032 /* An absolute address consists of a section and an offset.  If the
6033    section is NULL, the offset itself is the address, otherwise, the
6034    address equals to LOAD_ADDRESS(section) + offset.  */
6035
6036 struct absaddr
6037   {
6038     unsigned short section;
6039     bfd_vma offset;
6040   };
6041
6042 #define ABSADDR(a) \
6043   ((a).section \
6044    ? section_headers [(a).section].sh_addr + (a).offset \
6045    : (a).offset)
6046
6047 struct ia64_unw_table_entry
6048   {
6049     struct absaddr start;
6050     struct absaddr end;
6051     struct absaddr info;
6052   };
6053
6054 struct ia64_unw_aux_info
6055   {
6056
6057     struct ia64_unw_table_entry *table; /* Unwind table.  */
6058     unsigned long table_len;    /* Length of unwind table.  */
6059     unsigned char * info;       /* Unwind info.  */
6060     unsigned long info_size;    /* Size of unwind info.  */
6061     bfd_vma info_addr;          /* starting address of unwind info.  */
6062     bfd_vma seg_base;           /* Starting address of segment.  */
6063     Elf_Internal_Sym * symtab;  /* The symbol table.  */
6064     unsigned long nsyms;        /* Number of symbols.  */
6065     char * strtab;              /* The string table.  */
6066     unsigned long strtab_size;  /* Size of string table.  */
6067   };
6068
6069 static void
6070 find_symbol_for_address (Elf_Internal_Sym * symtab,
6071                          unsigned long nsyms,
6072                          const char * strtab,
6073                          unsigned long strtab_size,
6074                          struct absaddr addr,
6075                          const char ** symname,
6076                          bfd_vma * offset)
6077 {
6078   bfd_vma dist = 0x100000;
6079   Elf_Internal_Sym * sym;
6080   Elf_Internal_Sym * best = NULL;
6081   unsigned long i;
6082
6083   REMOVE_ARCH_BITS (addr.offset);
6084
6085   for (i = 0, sym = symtab; i < nsyms; ++i, ++sym)
6086     {
6087       bfd_vma value = sym->st_value;
6088
6089       REMOVE_ARCH_BITS (value);
6090
6091       if (ELF_ST_TYPE (sym->st_info) == STT_FUNC
6092           && sym->st_name != 0
6093           && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
6094           && addr.offset >= value
6095           && addr.offset - value < dist)
6096         {
6097           best = sym;
6098           dist = addr.offset - value;
6099           if (!dist)
6100             break;
6101         }
6102     }
6103
6104   if (best)
6105     {
6106       *symname = (best->st_name >= strtab_size
6107                   ? _("<corrupt>") : strtab + best->st_name);
6108       *offset = dist;
6109       return;
6110     }
6111
6112   *symname = NULL;
6113   *offset = addr.offset;
6114 }
6115
6116 static void
6117 dump_ia64_unwind (struct ia64_unw_aux_info * aux)
6118 {
6119   struct ia64_unw_table_entry * tp;
6120   int in_body;
6121
6122   for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
6123     {
6124       bfd_vma stamp;
6125       bfd_vma offset;
6126       const unsigned char * dp;
6127       const unsigned char * head;
6128       const char * procname;
6129
6130       find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
6131                                aux->strtab_size, tp->start, &procname, &offset);
6132
6133       fputs ("\n<", stdout);
6134
6135       if (procname)
6136         {
6137           fputs (procname, stdout);
6138
6139           if (offset)
6140             printf ("+%lx", (unsigned long) offset);
6141         }
6142
6143       fputs (">: [", stdout);
6144       print_vma (tp->start.offset, PREFIX_HEX);
6145       fputc ('-', stdout);
6146       print_vma (tp->end.offset, PREFIX_HEX);
6147       printf ("], info at +0x%lx\n",
6148               (unsigned long) (tp->info.offset - aux->seg_base));
6149
6150       head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
6151       stamp = byte_get ((unsigned char *) head, sizeof (stamp));
6152
6153       printf ("  v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
6154               (unsigned) UNW_VER (stamp),
6155               (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
6156               UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
6157               UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
6158               (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
6159
6160       if (UNW_VER (stamp) != 1)
6161         {
6162           printf (_("\tUnknown version.\n"));
6163           continue;
6164         }
6165
6166       in_body = 0;
6167       for (dp = head + 8; dp < head + 8 + eh_addr_size * UNW_LENGTH (stamp);)
6168         dp = unw_decode (dp, in_body, & in_body);
6169     }
6170 }
6171
6172 static int
6173 slurp_ia64_unwind_table (FILE * file,
6174                          struct ia64_unw_aux_info * aux,
6175                          Elf_Internal_Shdr * sec)
6176 {
6177   unsigned long size, nrelas, i;
6178   Elf_Internal_Phdr * seg;
6179   struct ia64_unw_table_entry * tep;
6180   Elf_Internal_Shdr * relsec;
6181   Elf_Internal_Rela * rela;
6182   Elf_Internal_Rela * rp;
6183   unsigned char * table;
6184   unsigned char * tp;
6185   Elf_Internal_Sym * sym;
6186   const char * relname;
6187
6188   /* First, find the starting address of the segment that includes
6189      this section: */
6190
6191   if (elf_header.e_phnum)
6192     {
6193       if (! get_program_headers (file))
6194           return 0;
6195
6196       for (seg = program_headers;
6197            seg < program_headers + elf_header.e_phnum;
6198            ++seg)
6199         {
6200           if (seg->p_type != PT_LOAD)
6201             continue;
6202
6203           if (sec->sh_addr >= seg->p_vaddr
6204               && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
6205             {
6206               aux->seg_base = seg->p_vaddr;
6207               break;
6208             }
6209         }
6210     }
6211
6212   /* Second, build the unwind table from the contents of the unwind section:  */
6213   size = sec->sh_size;
6214   table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
6215                                       _("unwind table"));
6216   if (!table)
6217     return 0;
6218
6219   aux->table = (struct ia64_unw_table_entry *)
6220       xcmalloc (size / (3 * eh_addr_size), sizeof (aux->table[0]));
6221   tep = aux->table;
6222   for (tp = table; tp < table + size; ++tep)
6223     {
6224       tep->start.section = SHN_UNDEF;
6225       tep->end.section   = SHN_UNDEF;
6226       tep->info.section  = SHN_UNDEF;
6227       tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
6228       tep->end.offset   = byte_get (tp, eh_addr_size); tp += eh_addr_size;
6229       tep->info.offset  = byte_get (tp, eh_addr_size); tp += eh_addr_size;
6230       tep->start.offset += aux->seg_base;
6231       tep->end.offset   += aux->seg_base;
6232       tep->info.offset  += aux->seg_base;
6233     }
6234   free (table);
6235
6236   /* Third, apply any relocations to the unwind table:  */
6237   for (relsec = section_headers;
6238        relsec < section_headers + elf_header.e_shnum;
6239        ++relsec)
6240     {
6241       if (relsec->sh_type != SHT_RELA
6242           || relsec->sh_info >= elf_header.e_shnum
6243           || section_headers + relsec->sh_info != sec)
6244         continue;
6245
6246       if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
6247                               & rela, & nrelas))
6248         return 0;
6249
6250       for (rp = rela; rp < rela + nrelas; ++rp)
6251         {
6252           relname = elf_ia64_reloc_type (get_reloc_type (rp->r_info));
6253           sym = aux->symtab + get_reloc_symindex (rp->r_info);
6254
6255           if (! const_strneq (relname, "R_IA64_SEGREL"))
6256             {
6257               warn (_("Skipping unexpected relocation type %s\n"), relname);
6258               continue;
6259             }
6260
6261           i = rp->r_offset / (3 * eh_addr_size);
6262
6263           switch (rp->r_offset/eh_addr_size % 3)
6264             {
6265             case 0:
6266               aux->table[i].start.section = sym->st_shndx;
6267               aux->table[i].start.offset  = rp->r_addend + sym->st_value;
6268               break;
6269             case 1:
6270               aux->table[i].end.section   = sym->st_shndx;
6271               aux->table[i].end.offset    = rp->r_addend + sym->st_value;
6272               break;
6273             case 2:
6274               aux->table[i].info.section  = sym->st_shndx;
6275               aux->table[i].info.offset   = rp->r_addend + sym->st_value;
6276               break;
6277             default:
6278               break;
6279             }
6280         }
6281
6282       free (rela);
6283     }
6284
6285   aux->table_len = size / (3 * eh_addr_size);
6286   return 1;
6287 }
6288
6289 static void
6290 ia64_process_unwind (FILE * file)
6291 {
6292   Elf_Internal_Shdr * sec;
6293   Elf_Internal_Shdr * unwsec = NULL;
6294   Elf_Internal_Shdr * strsec;
6295   unsigned long i, unwcount = 0, unwstart = 0;
6296   struct ia64_unw_aux_info aux;
6297
6298   memset (& aux, 0, sizeof (aux));
6299
6300   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
6301     {
6302       if (sec->sh_type == SHT_SYMTAB
6303           && sec->sh_link < elf_header.e_shnum)
6304         {
6305           aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
6306
6307           strsec = section_headers + sec->sh_link;
6308           assert (aux.strtab == NULL);
6309           aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
6310                                           1, strsec->sh_size,
6311                                           _("string table"));
6312           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
6313         }
6314       else if (sec->sh_type == SHT_IA_64_UNWIND)
6315         unwcount++;
6316     }
6317
6318   if (!unwcount)
6319     printf (_("\nThere are no unwind sections in this file.\n"));
6320
6321   while (unwcount-- > 0)
6322     {
6323       char * suffix;
6324       size_t len, len2;
6325
6326       for (i = unwstart, sec = section_headers + unwstart;
6327            i < elf_header.e_shnum; ++i, ++sec)
6328         if (sec->sh_type == SHT_IA_64_UNWIND)
6329           {
6330             unwsec = sec;
6331             break;
6332           }
6333
6334       unwstart = i + 1;
6335       len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
6336
6337       if ((unwsec->sh_flags & SHF_GROUP) != 0)
6338         {
6339           /* We need to find which section group it is in.  */
6340           struct group_list * g = section_headers_groups [i]->root;
6341
6342           for (; g != NULL; g = g->next)
6343             {
6344               sec = section_headers + g->section_index;
6345
6346               if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
6347                 break;
6348             }
6349
6350           if (g == NULL)
6351             i = elf_header.e_shnum;
6352         }
6353       else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
6354         {
6355           /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO.  */
6356           len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
6357           suffix = SECTION_NAME (unwsec) + len;
6358           for (i = 0, sec = section_headers; i < elf_header.e_shnum;
6359                ++i, ++sec)
6360             if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
6361                 && streq (SECTION_NAME (sec) + len2, suffix))
6362               break;
6363         }
6364       else
6365         {
6366           /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
6367              .IA_64.unwind or BAR -> .IA_64.unwind_info.  */
6368           len = sizeof (ELF_STRING_ia64_unwind) - 1;
6369           len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
6370           suffix = "";
6371           if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
6372             suffix = SECTION_NAME (unwsec) + len;
6373           for (i = 0, sec = section_headers; i < elf_header.e_shnum;
6374                ++i, ++sec)
6375             if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
6376                 && streq (SECTION_NAME (sec) + len2, suffix))
6377               break;
6378         }
6379
6380       if (i == elf_header.e_shnum)
6381         {
6382           printf (_("\nCould not find unwind info section for "));
6383
6384           if (string_table == NULL)
6385             printf ("%d", unwsec->sh_name);
6386           else
6387             printf (_("'%s'"), SECTION_NAME (unwsec));
6388         }
6389       else
6390         {
6391           aux.info_addr = sec->sh_addr;
6392           aux.info = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1,
6393                                                  sec->sh_size,
6394                                                  _("unwind info"));
6395           aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
6396
6397           printf (_("\nUnwind section "));
6398
6399           if (string_table == NULL)
6400             printf ("%d", unwsec->sh_name);
6401           else
6402             printf (_("'%s'"), SECTION_NAME (unwsec));
6403
6404           printf (_(" at offset 0x%lx contains %lu entries:\n"),
6405                   (unsigned long) unwsec->sh_offset,
6406                   (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
6407
6408           (void) slurp_ia64_unwind_table (file, & aux, unwsec);
6409
6410           if (aux.table_len > 0)
6411             dump_ia64_unwind (& aux);
6412
6413           if (aux.table)
6414             free ((char *) aux.table);
6415           if (aux.info)
6416             free ((char *) aux.info);
6417           aux.table = NULL;
6418           aux.info = NULL;
6419         }
6420     }
6421
6422   if (aux.symtab)
6423     free (aux.symtab);
6424   if (aux.strtab)
6425     free ((char *) aux.strtab);
6426 }
6427
6428 struct hppa_unw_table_entry
6429   {
6430     struct absaddr start;
6431     struct absaddr end;
6432     unsigned int Cannot_unwind:1;                       /* 0 */
6433     unsigned int Millicode:1;                   /* 1 */
6434     unsigned int Millicode_save_sr0:1;          /* 2 */
6435     unsigned int Region_description:2;          /* 3..4 */
6436     unsigned int reserved1:1;                   /* 5 */
6437     unsigned int Entry_SR:1;                    /* 6 */
6438     unsigned int Entry_FR:4;     /* number saved */     /* 7..10 */
6439     unsigned int Entry_GR:5;     /* number saved */     /* 11..15 */
6440     unsigned int Args_stored:1;                 /* 16 */
6441     unsigned int Variable_Frame:1;                      /* 17 */
6442     unsigned int Separate_Package_Body:1;               /* 18 */
6443     unsigned int Frame_Extension_Millicode:1;   /* 19 */
6444     unsigned int Stack_Overflow_Check:1;                /* 20 */
6445     unsigned int Two_Instruction_SP_Increment:1;        /* 21 */
6446     unsigned int Ada_Region:1;                  /* 22 */
6447     unsigned int cxx_info:1;                    /* 23 */
6448     unsigned int cxx_try_catch:1;                       /* 24 */
6449     unsigned int sched_entry_seq:1;                     /* 25 */
6450     unsigned int reserved2:1;                   /* 26 */
6451     unsigned int Save_SP:1;                             /* 27 */
6452     unsigned int Save_RP:1;                             /* 28 */
6453     unsigned int Save_MRP_in_frame:1;           /* 29 */
6454     unsigned int extn_ptr_defined:1;            /* 30 */
6455     unsigned int Cleanup_defined:1;                     /* 31 */
6456
6457     unsigned int MPE_XL_interrupt_marker:1;             /* 0 */
6458     unsigned int HP_UX_interrupt_marker:1;              /* 1 */
6459     unsigned int Large_frame:1;                 /* 2 */
6460     unsigned int Pseudo_SP_Set:1;                       /* 3 */
6461     unsigned int reserved4:1;                   /* 4 */
6462     unsigned int Total_frame_size:27;           /* 5..31 */
6463   };
6464
6465 struct hppa_unw_aux_info
6466   {
6467     struct hppa_unw_table_entry *table; /* Unwind table.  */
6468     unsigned long table_len;    /* Length of unwind table.  */
6469     bfd_vma seg_base;           /* Starting address of segment.  */
6470     Elf_Internal_Sym * symtab;  /* The symbol table.  */
6471     unsigned long nsyms;        /* Number of symbols.  */
6472     char * strtab;              /* The string table.  */
6473     unsigned long strtab_size;  /* Size of string table.  */
6474   };
6475
6476 static void
6477 dump_hppa_unwind (struct hppa_unw_aux_info * aux)
6478 {
6479   struct hppa_unw_table_entry * tp;
6480
6481   for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
6482     {
6483       bfd_vma offset;
6484       const char * procname;
6485
6486       find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
6487                                aux->strtab_size, tp->start, &procname,
6488                                &offset);
6489
6490       fputs ("\n<", stdout);
6491
6492       if (procname)
6493         {
6494           fputs (procname, stdout);
6495
6496           if (offset)
6497             printf ("+%lx", (unsigned long) offset);
6498         }
6499
6500       fputs (">: [", stdout);
6501       print_vma (tp->start.offset, PREFIX_HEX);
6502       fputc ('-', stdout);
6503       print_vma (tp->end.offset, PREFIX_HEX);
6504       printf ("]\n\t");
6505
6506 #define PF(_m) if (tp->_m) printf (#_m " ");
6507 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
6508       PF(Cannot_unwind);
6509       PF(Millicode);
6510       PF(Millicode_save_sr0);
6511       /* PV(Region_description);  */
6512       PF(Entry_SR);
6513       PV(Entry_FR);
6514       PV(Entry_GR);
6515       PF(Args_stored);
6516       PF(Variable_Frame);
6517       PF(Separate_Package_Body);
6518       PF(Frame_Extension_Millicode);
6519       PF(Stack_Overflow_Check);
6520       PF(Two_Instruction_SP_Increment);
6521       PF(Ada_Region);
6522       PF(cxx_info);
6523       PF(cxx_try_catch);
6524       PF(sched_entry_seq);
6525       PF(Save_SP);
6526       PF(Save_RP);
6527       PF(Save_MRP_in_frame);
6528       PF(extn_ptr_defined);
6529       PF(Cleanup_defined);
6530       PF(MPE_XL_interrupt_marker);
6531       PF(HP_UX_interrupt_marker);
6532       PF(Large_frame);
6533       PF(Pseudo_SP_Set);
6534       PV(Total_frame_size);
6535 #undef PF
6536 #undef PV
6537     }
6538
6539   printf ("\n");
6540 }
6541
6542 static int
6543 slurp_hppa_unwind_table (FILE * file,
6544                          struct hppa_unw_aux_info * aux,
6545                          Elf_Internal_Shdr * sec)
6546 {
6547   unsigned long size, unw_ent_size, nentries, nrelas, i;
6548   Elf_Internal_Phdr * seg;
6549   struct hppa_unw_table_entry * tep;
6550   Elf_Internal_Shdr * relsec;
6551   Elf_Internal_Rela * rela;
6552   Elf_Internal_Rela * rp;
6553   unsigned char * table;
6554   unsigned char * tp;
6555   Elf_Internal_Sym * sym;
6556   const char * relname;
6557
6558   /* First, find the starting address of the segment that includes
6559      this section.  */
6560
6561   if (elf_header.e_phnum)
6562     {
6563       if (! get_program_headers (file))
6564         return 0;
6565
6566       for (seg = program_headers;
6567            seg < program_headers + elf_header.e_phnum;
6568            ++seg)
6569         {
6570           if (seg->p_type != PT_LOAD)
6571             continue;
6572
6573           if (sec->sh_addr >= seg->p_vaddr
6574               && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
6575             {
6576               aux->seg_base = seg->p_vaddr;
6577               break;
6578             }
6579         }
6580     }
6581
6582   /* Second, build the unwind table from the contents of the unwind
6583      section.  */
6584   size = sec->sh_size;
6585   table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
6586                                       _("unwind table"));
6587   if (!table)
6588     return 0;
6589
6590   unw_ent_size = 16;
6591   nentries = size / unw_ent_size;
6592   size = unw_ent_size * nentries;
6593
6594   tep = aux->table = (struct hppa_unw_table_entry *)
6595       xcmalloc (nentries, sizeof (aux->table[0]));
6596
6597   for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
6598     {
6599       unsigned int tmp1, tmp2;
6600
6601       tep->start.section = SHN_UNDEF;
6602       tep->end.section   = SHN_UNDEF;
6603
6604       tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
6605       tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
6606       tmp1 = byte_get ((unsigned char *) tp + 8, 4);
6607       tmp2 = byte_get ((unsigned char *) tp + 12, 4);
6608
6609       tep->start.offset += aux->seg_base;
6610       tep->end.offset   += aux->seg_base;
6611
6612       tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
6613       tep->Millicode = (tmp1 >> 30) & 0x1;
6614       tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
6615       tep->Region_description = (tmp1 >> 27) & 0x3;
6616       tep->reserved1 = (tmp1 >> 26) & 0x1;
6617       tep->Entry_SR = (tmp1 >> 25) & 0x1;
6618       tep->Entry_FR = (tmp1 >> 21) & 0xf;
6619       tep->Entry_GR = (tmp1 >> 16) & 0x1f;
6620       tep->Args_stored = (tmp1 >> 15) & 0x1;
6621       tep->Variable_Frame = (tmp1 >> 14) & 0x1;
6622       tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
6623       tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
6624       tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
6625       tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
6626       tep->Ada_Region = (tmp1 >> 9) & 0x1;
6627       tep->cxx_info = (tmp1 >> 8) & 0x1;
6628       tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
6629       tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
6630       tep->reserved2 = (tmp1 >> 5) & 0x1;
6631       tep->Save_SP = (tmp1 >> 4) & 0x1;
6632       tep->Save_RP = (tmp1 >> 3) & 0x1;
6633       tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
6634       tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
6635       tep->Cleanup_defined = tmp1 & 0x1;
6636
6637       tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
6638       tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
6639       tep->Large_frame = (tmp2 >> 29) & 0x1;
6640       tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
6641       tep->reserved4 = (tmp2 >> 27) & 0x1;
6642       tep->Total_frame_size = tmp2 & 0x7ffffff;
6643     }
6644   free (table);
6645
6646   /* Third, apply any relocations to the unwind table.  */
6647   for (relsec = section_headers;
6648        relsec < section_headers + elf_header.e_shnum;
6649        ++relsec)
6650     {
6651       if (relsec->sh_type != SHT_RELA
6652           || relsec->sh_info >= elf_header.e_shnum
6653           || section_headers + relsec->sh_info != sec)
6654         continue;
6655
6656       if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
6657                               & rela, & nrelas))
6658         return 0;
6659
6660       for (rp = rela; rp < rela + nrelas; ++rp)
6661         {
6662           relname = elf_hppa_reloc_type (get_reloc_type (rp->r_info));
6663           sym = aux->symtab + get_reloc_symindex (rp->r_info);
6664
6665           /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64.  */
6666           if (! const_strneq (relname, "R_PARISC_SEGREL"))
6667             {
6668               warn (_("Skipping unexpected relocation type %s\n"), relname);
6669               continue;
6670             }
6671
6672           i = rp->r_offset / unw_ent_size;
6673
6674           switch ((rp->r_offset % unw_ent_size) / eh_addr_size)
6675             {
6676             case 0:
6677               aux->table[i].start.section = sym->st_shndx;
6678               aux->table[i].start.offset  = sym->st_value + rp->r_addend;
6679               break;
6680             case 1:
6681               aux->table[i].end.section   = sym->st_shndx;
6682               aux->table[i].end.offset    = sym->st_value + rp->r_addend;
6683               break;
6684             default:
6685               break;
6686             }
6687         }
6688
6689       free (rela);
6690     }
6691
6692   aux->table_len = nentries;
6693
6694   return 1;
6695 }
6696
6697 static void
6698 hppa_process_unwind (FILE * file)
6699 {
6700   struct hppa_unw_aux_info aux;
6701   Elf_Internal_Shdr * unwsec = NULL;
6702   Elf_Internal_Shdr * strsec;
6703   Elf_Internal_Shdr * sec;
6704   unsigned long i;
6705
6706   if (string_table == NULL)
6707     return;
6708
6709   memset (& aux, 0, sizeof (aux));
6710
6711   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
6712     {
6713       if (sec->sh_type == SHT_SYMTAB
6714           && sec->sh_link < elf_header.e_shnum)
6715         {
6716           aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
6717
6718           strsec = section_headers + sec->sh_link;
6719           assert (aux.strtab == NULL);
6720           aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
6721                                           1, strsec->sh_size,
6722                                           _("string table"));
6723           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
6724         }
6725       else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
6726         unwsec = sec;
6727     }
6728
6729   if (!unwsec)
6730     printf (_("\nThere are no unwind sections in this file.\n"));
6731
6732   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
6733     {
6734       if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
6735         {
6736           printf (_("\nUnwind section "));
6737           printf (_("'%s'"), SECTION_NAME (sec));
6738
6739           printf (_(" at offset 0x%lx contains %lu entries:\n"),
6740                   (unsigned long) sec->sh_offset,
6741                   (unsigned long) (sec->sh_size / (2 * eh_addr_size + 8)));
6742
6743           slurp_hppa_unwind_table (file, &aux, sec);
6744           if (aux.table_len > 0)
6745             dump_hppa_unwind (&aux);
6746
6747           if (aux.table)
6748             free ((char *) aux.table);
6749           aux.table = NULL;
6750         }
6751     }
6752
6753   if (aux.symtab)
6754     free (aux.symtab);
6755   if (aux.strtab)
6756     free ((char *) aux.strtab);
6757 }
6758
6759 struct arm_section
6760 {
6761   unsigned char *      data;            /* The unwind data.  */
6762   Elf_Internal_Shdr *  sec;             /* The cached unwind section header.  */
6763   Elf_Internal_Rela *  rela;            /* The cached relocations for this section.  */
6764   unsigned long        nrelas;          /* The number of relocations.  */
6765   unsigned int         rel_type;        /* REL or RELA ?  */
6766   Elf_Internal_Rela *  next_rela;       /* Cyclic pointer to the next reloc to process.  */
6767 };
6768
6769 struct arm_unw_aux_info
6770 {
6771   FILE *              file;             /* The file containing the unwind sections.  */
6772   Elf_Internal_Sym *  symtab;           /* The file's symbol table.  */
6773   unsigned long       nsyms;            /* Number of symbols.  */
6774   char *              strtab;           /* The file's string table.  */
6775   unsigned long       strtab_size;      /* Size of string table.  */
6776 };
6777
6778 static const char *
6779 arm_print_vma_and_name (struct arm_unw_aux_info *aux,
6780                         bfd_vma fn, struct absaddr addr)
6781 {
6782   const char *procname;
6783   bfd_vma sym_offset;
6784
6785   if (addr.section == SHN_UNDEF)
6786     addr.offset = fn;
6787
6788   find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
6789                            aux->strtab_size, addr, &procname,
6790                            &sym_offset);
6791
6792   print_vma (fn, PREFIX_HEX);
6793
6794   if (procname)
6795     {
6796       fputs (" <", stdout);
6797       fputs (procname, stdout);
6798
6799       if (sym_offset)
6800         printf ("+0x%lx", (unsigned long) sym_offset);
6801       fputc ('>', stdout);
6802     }
6803
6804   return procname;
6805 }
6806
6807 static void
6808 arm_free_section (struct arm_section *arm_sec)
6809 {
6810   if (arm_sec->data != NULL)
6811     free (arm_sec->data);
6812
6813   if (arm_sec->rela != NULL)
6814     free (arm_sec->rela);
6815 }
6816
6817 /* 1) If SEC does not match the one cached in ARM_SEC, then free the current
6818       cached section and install SEC instead.
6819    2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
6820       and return its valued in * WORDP, relocating if necessary.
6821    3) Update the NEXT_RELA field in ARM_SEC and store the section index and
6822       relocation's offset in ADDR.
6823    4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
6824       into the string table of the symbol associated with the reloc.  If no
6825       reloc was applied store -1 there.
6826    5) Return TRUE upon success, FALSE otherwise.  */
6827
6828 static bfd_boolean
6829 get_unwind_section_word (struct arm_unw_aux_info *  aux,
6830                          struct arm_section *       arm_sec,
6831                          Elf_Internal_Shdr *        sec,
6832                          bfd_vma                    word_offset,
6833                          unsigned int *             wordp,
6834                          struct absaddr *           addr,
6835                          bfd_vma *                  sym_name)
6836 {
6837   Elf_Internal_Rela *rp;
6838   Elf_Internal_Sym *sym;
6839   const char * relname;
6840   unsigned int word;
6841   bfd_boolean wrapped;
6842
6843   addr->section = SHN_UNDEF;
6844   addr->offset = 0;
6845
6846   if (sym_name != NULL)
6847     *sym_name = (bfd_vma) -1;
6848
6849   /* If necessary, update the section cache.  */
6850   if (sec != arm_sec->sec)
6851     {
6852       Elf_Internal_Shdr *relsec;
6853
6854       arm_free_section (arm_sec);
6855
6856       arm_sec->sec = sec;
6857       arm_sec->data = get_data (NULL, aux->file, sec->sh_offset, 1,
6858                                 sec->sh_size, _("unwind data"));
6859       arm_sec->rela = NULL;
6860       arm_sec->nrelas = 0;
6861
6862       for (relsec = section_headers;
6863            relsec < section_headers + elf_header.e_shnum;
6864            ++relsec)
6865         {
6866           if (relsec->sh_info >= elf_header.e_shnum
6867               || section_headers + relsec->sh_info != sec
6868               /* PR 15745: Check the section type as well.  */
6869               || (relsec->sh_type != SHT_REL
6870                   && relsec->sh_type != SHT_RELA))
6871             continue;
6872
6873           arm_sec->rel_type = relsec->sh_type;
6874           if (relsec->sh_type == SHT_REL)
6875             {
6876               if (!slurp_rel_relocs (aux->file, relsec->sh_offset,
6877                                      relsec->sh_size,
6878                                      & arm_sec->rela, & arm_sec->nrelas))
6879                 return FALSE;
6880             }
6881           else /* relsec->sh_type == SHT_RELA */
6882             {
6883               if (!slurp_rela_relocs (aux->file, relsec->sh_offset,
6884                                       relsec->sh_size,
6885                                       & arm_sec->rela, & arm_sec->nrelas))
6886                 return FALSE;
6887             }
6888           break;
6889         }
6890
6891       arm_sec->next_rela = arm_sec->rela;
6892     }
6893
6894   /* If there is no unwind data we can do nothing.  */
6895   if (arm_sec->data == NULL)
6896     return FALSE;
6897
6898   /* Get the word at the required offset.  */
6899   word = byte_get (arm_sec->data + word_offset, 4);
6900
6901   /* Look through the relocs to find the one that applies to the provided offset.  */
6902   wrapped = FALSE;
6903   for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
6904     {
6905       bfd_vma prelval, offset;
6906
6907       if (rp->r_offset > word_offset && !wrapped)
6908         {
6909           rp = arm_sec->rela;
6910           wrapped = TRUE;
6911         }
6912       if (rp->r_offset > word_offset)
6913         break;
6914
6915       if (rp->r_offset & 3)
6916         {
6917           warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
6918                 (unsigned long) rp->r_offset);
6919           continue;
6920         }
6921
6922       if (rp->r_offset < word_offset)
6923         continue;
6924
6925       sym = aux->symtab + ELF32_R_SYM (rp->r_info);
6926
6927       if (arm_sec->rel_type == SHT_REL)
6928         {
6929           offset = word & 0x7fffffff;
6930           if (offset & 0x40000000)
6931             offset |= ~ (bfd_vma) 0x7fffffff;
6932         }
6933       else if (arm_sec->rel_type == SHT_RELA)
6934         offset = rp->r_addend;
6935       else
6936         abort ();
6937
6938       offset += sym->st_value;
6939       prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
6940
6941       /* Check that we are processing the expected reloc type.  */
6942       if (elf_header.e_machine == EM_ARM)
6943         {
6944           relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
6945
6946           if (streq (relname, "R_ARM_NONE"))
6947               continue;
6948
6949           if (! streq (relname, "R_ARM_PREL31"))
6950             {
6951               warn (_("Skipping unexpected relocation type %s\n"), relname);
6952               continue;
6953             }
6954         }
6955       else if (elf_header.e_machine == EM_TI_C6000)
6956         {
6957           relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
6958
6959           if (streq (relname, "R_C6000_NONE"))
6960             continue;
6961
6962           if (! streq (relname, "R_C6000_PREL31"))
6963             {
6964               warn (_("Skipping unexpected relocation type %s\n"), relname);
6965               continue;
6966             }
6967
6968           prelval >>= 1;
6969         }
6970       else
6971         /* This function currently only supports ARM and TI unwinders.  */
6972         abort ();
6973
6974       word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
6975       addr->section = sym->st_shndx;
6976       addr->offset = offset;
6977       if (sym_name)
6978         * sym_name = sym->st_name;
6979       break;
6980     }
6981
6982   *wordp = word;
6983   arm_sec->next_rela = rp;
6984
6985   return TRUE;
6986 }
6987
6988 static const char *tic6x_unwind_regnames[16] =
6989 {
6990   "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
6991   "A14", "A13", "A12", "A11", "A10",
6992   "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
6993 };
6994
6995 static void
6996 decode_tic6x_unwind_regmask (unsigned int mask)
6997 {
6998   int i;
6999
7000   for (i = 12; mask; mask >>= 1, i--)
7001     {
7002       if (mask & 1)
7003         {
7004           fputs (tic6x_unwind_regnames[i], stdout);
7005           if (mask > 1)
7006             fputs (", ", stdout);
7007         }
7008     }
7009 }
7010
7011 #define ADVANCE                                                 \
7012   if (remaining == 0 && more_words)                             \
7013     {                                                           \
7014       data_offset += 4;                                         \
7015       if (! get_unwind_section_word (aux, data_arm_sec, data_sec,       \
7016                                      data_offset, & word, & addr, NULL))        \
7017         return;                                                 \
7018       remaining = 4;                                            \
7019       more_words--;                                             \
7020     }                                                           \
7021
7022 #define GET_OP(OP)                      \
7023   ADVANCE;                              \
7024   if (remaining)                        \
7025     {                                   \
7026       remaining--;                      \
7027       (OP) = word >> 24;                \
7028       word <<= 8;                       \
7029     }                                   \
7030   else                                  \
7031     {                                   \
7032       printf (_("[Truncated opcode]\n"));       \
7033       return;                           \
7034     }                                   \
7035   printf ("0x%02x ", OP)
7036
7037 static void
7038 decode_arm_unwind_bytecode (struct arm_unw_aux_info *aux,
7039                             unsigned int word, unsigned int remaining,
7040                             unsigned int more_words,
7041                             bfd_vma data_offset, Elf_Internal_Shdr *data_sec,
7042                             struct arm_section *data_arm_sec)
7043 {
7044   struct absaddr addr;
7045
7046   /* Decode the unwinding instructions.  */
7047   while (1)
7048     {
7049       unsigned int op, op2;
7050
7051       ADVANCE;
7052       if (remaining == 0)
7053         break;
7054       remaining--;
7055       op = word >> 24;
7056       word <<= 8;
7057
7058       printf ("  0x%02x ", op);
7059
7060       if ((op & 0xc0) == 0x00)
7061         {
7062           int offset = ((op & 0x3f) << 2) + 4;
7063
7064           printf ("     vsp = vsp + %d", offset);
7065         }
7066       else if ((op & 0xc0) == 0x40)
7067         {
7068           int offset = ((op & 0x3f) << 2) + 4;
7069
7070           printf ("     vsp = vsp - %d", offset);
7071         }
7072       else if ((op & 0xf0) == 0x80)
7073         {
7074           GET_OP (op2);
7075           if (op == 0x80 && op2 == 0)
7076             printf (_("Refuse to unwind"));
7077           else
7078             {
7079               unsigned int mask = ((op & 0x0f) << 8) | op2;
7080               int first = 1;
7081               int i;
7082
7083               printf ("pop {");
7084               for (i = 0; i < 12; i++)
7085                 if (mask & (1 << i))
7086                   {
7087                     if (first)
7088                       first = 0;
7089                     else
7090                       printf (", ");
7091                     printf ("r%d", 4 + i);
7092                   }
7093               printf ("}");
7094             }
7095         }
7096       else if ((op & 0xf0) == 0x90)
7097         {
7098           if (op == 0x9d || op == 0x9f)
7099             printf (_("     [Reserved]"));
7100           else
7101             printf ("     vsp = r%d", op & 0x0f);
7102         }
7103       else if ((op & 0xf0) == 0xa0)
7104         {
7105           int end = 4 + (op & 0x07);
7106           int first = 1;
7107           int i;
7108
7109           printf ("     pop {");
7110           for (i = 4; i <= end; i++)
7111             {
7112               if (first)
7113                 first = 0;
7114               else
7115                 printf (", ");
7116               printf ("r%d", i);
7117             }
7118           if (op & 0x08)
7119             {
7120               if (!first)
7121                 printf (", ");
7122               printf ("r14");
7123             }
7124           printf ("}");
7125         }
7126       else if (op == 0xb0)
7127         printf (_("     finish"));
7128       else if (op == 0xb1)
7129         {
7130           GET_OP (op2);
7131           if (op2 == 0 || (op2 & 0xf0) != 0)
7132             printf (_("[Spare]"));
7133           else
7134             {
7135               unsigned int mask = op2 & 0x0f;
7136               int first = 1;
7137               int i;
7138
7139               printf ("pop {");
7140               for (i = 0; i < 12; i++)
7141                 if (mask & (1 << i))
7142                   {
7143                     if (first)
7144                       first = 0;
7145                     else
7146                       printf (", ");
7147                     printf ("r%d", i);
7148                   }
7149               printf ("}");
7150             }
7151         }
7152       else if (op == 0xb2)
7153         {
7154           unsigned char buf[9];
7155           unsigned int i, len;
7156           unsigned long offset;
7157
7158           for (i = 0; i < sizeof (buf); i++)
7159             {
7160               GET_OP (buf[i]);
7161               if ((buf[i] & 0x80) == 0)
7162                 break;
7163             }
7164           assert (i < sizeof (buf));
7165           offset = read_uleb128 (buf, &len, buf + i + 1);
7166           assert (len == i + 1);
7167           offset = offset * 4 + 0x204;
7168           printf ("vsp = vsp + %ld", offset);
7169         }
7170       else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
7171         {
7172           unsigned int first, last;
7173
7174           GET_OP (op2);
7175           first = op2 >> 4;
7176           last = op2 & 0x0f;
7177           if (op == 0xc8)
7178             first = first + 16;
7179           printf ("pop {D%d", first);
7180           if (last)
7181             printf ("-D%d", first + last);
7182           printf ("}");
7183         }
7184       else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
7185         {
7186           unsigned int count = op & 0x07;
7187
7188           printf ("pop {D8");
7189           if (count)
7190             printf ("-D%d", 8 + count);
7191           printf ("}");
7192         }
7193       else if (op >= 0xc0 && op <= 0xc5)
7194         {
7195           unsigned int count = op & 0x07;
7196
7197           printf ("     pop {wR10");
7198           if (count)
7199             printf ("-wR%d", 10 + count);
7200           printf ("}");
7201         }
7202       else if (op == 0xc6)
7203         {
7204           unsigned int first, last;
7205
7206           GET_OP (op2);
7207           first = op2 >> 4;
7208           last = op2 & 0x0f;
7209           printf ("pop {wR%d", first);
7210           if (last)
7211             printf ("-wR%d", first + last);
7212           printf ("}");
7213         }
7214       else if (op == 0xc7)
7215         {
7216           GET_OP (op2);
7217           if (op2 == 0 || (op2 & 0xf0) != 0)
7218             printf (_("[Spare]"));
7219           else
7220             {
7221               unsigned int mask = op2 & 0x0f;
7222               int first = 1;
7223               int i;
7224
7225               printf ("pop {");
7226               for (i = 0; i < 4; i++)
7227                 if (mask & (1 << i))
7228                   {
7229                     if (first)
7230                       first = 0;
7231                     else
7232                       printf (", ");
7233                     printf ("wCGR%d", i);
7234                   }
7235               printf ("}");
7236             }
7237         }
7238       else
7239         printf (_("     [unsupported opcode]"));
7240       printf ("\n");
7241     }
7242 }
7243
7244 static void
7245 decode_tic6x_unwind_bytecode (struct arm_unw_aux_info *aux,
7246                             unsigned int word, unsigned int remaining,
7247                             unsigned int more_words,
7248                             bfd_vma data_offset, Elf_Internal_Shdr *data_sec,
7249                             struct arm_section *data_arm_sec)
7250 {
7251   struct absaddr addr;
7252
7253   /* Decode the unwinding instructions.  */
7254   while (1)
7255     {
7256       unsigned int op, op2;
7257
7258       ADVANCE;
7259       if (remaining == 0)
7260         break;
7261       remaining--;
7262       op = word >> 24;
7263       word <<= 8;
7264
7265       printf ("  0x%02x ", op);
7266
7267       if ((op & 0xc0) == 0x00)
7268         {
7269           int offset = ((op & 0x3f) << 3) + 8;
7270           printf ("     sp = sp + %d", offset);
7271         }
7272       else if ((op & 0xc0) == 0x80)
7273         {
7274           GET_OP (op2);
7275           if (op == 0x80 && op2 == 0)
7276             printf (_("Refuse to unwind"));
7277           else
7278             {
7279               unsigned int mask = ((op & 0x1f) << 8) | op2;
7280               if (op & 0x20)
7281                 printf ("pop compact {");
7282               else
7283                 printf ("pop {");
7284
7285               decode_tic6x_unwind_regmask (mask);
7286               printf("}");
7287             }
7288         }
7289       else if ((op & 0xf0) == 0xc0)
7290         {
7291           unsigned int reg;
7292           unsigned int nregs;
7293           unsigned int i;
7294           const char *name;
7295           struct
7296           {
7297               unsigned int offset;
7298               unsigned int reg;
7299           } regpos[16];
7300
7301           /* Scan entire instruction first so that GET_OP output is not
7302              interleaved with disassembly.  */
7303           nregs = 0;
7304           for (i = 0; nregs < (op & 0xf); i++)
7305             {
7306               GET_OP (op2);
7307               reg = op2 >> 4;
7308               if (reg != 0xf)
7309                 {
7310                   regpos[nregs].offset = i * 2;
7311                   regpos[nregs].reg = reg;
7312                   nregs++;
7313                 }
7314
7315               reg = op2 & 0xf;
7316               if (reg != 0xf)
7317                 {
7318                   regpos[nregs].offset = i * 2 + 1;
7319                   regpos[nregs].reg = reg;
7320                   nregs++;
7321                 }
7322             }
7323
7324           printf (_("pop frame {"));
7325           reg = nregs - 1;
7326           for (i = i * 2; i > 0; i--)
7327             {
7328               if (regpos[reg].offset == i - 1)
7329                 {
7330                   name = tic6x_unwind_regnames[regpos[reg].reg];
7331                   if (reg > 0)
7332                     reg--;
7333                 }
7334               else
7335                 name = _("[pad]");
7336
7337               fputs (name, stdout);
7338               if (i > 1)
7339                 printf (", ");
7340             }
7341
7342           printf ("}");
7343         }
7344       else if (op == 0xd0)
7345         printf ("     MOV FP, SP");
7346       else if (op == 0xd1)
7347         printf ("     __c6xabi_pop_rts");
7348       else if (op == 0xd2)
7349         {
7350           unsigned char buf[9];
7351           unsigned int i, len;
7352           unsigned long offset;
7353
7354           for (i = 0; i < sizeof (buf); i++)
7355             {
7356               GET_OP (buf[i]);
7357               if ((buf[i] & 0x80) == 0)
7358                 break;
7359             }
7360           assert (i < sizeof (buf));
7361           offset = read_uleb128 (buf, &len, buf + i + 1);
7362           assert (len == i + 1);
7363           offset = offset * 8 + 0x408;
7364           printf (_("sp = sp + %ld"), offset);
7365         }
7366       else if ((op & 0xf0) == 0xe0)
7367         {
7368           if ((op & 0x0f) == 7)
7369             printf ("     RETURN");
7370           else
7371             printf ("     MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
7372         }
7373       else
7374         {
7375           printf (_("     [unsupported opcode]"));
7376         }
7377       putchar ('\n');
7378     }
7379 }
7380
7381 static bfd_vma
7382 arm_expand_prel31 (bfd_vma word, bfd_vma where)
7383 {
7384   bfd_vma offset;
7385
7386   offset = word & 0x7fffffff;
7387   if (offset & 0x40000000)
7388     offset |= ~ (bfd_vma) 0x7fffffff;
7389
7390   if (elf_header.e_machine == EM_TI_C6000)
7391     offset <<= 1;
7392
7393   return offset + where;
7394 }
7395
7396 static void
7397 decode_arm_unwind (struct arm_unw_aux_info *  aux,
7398                    unsigned int               word,
7399                    unsigned int               remaining,
7400                    bfd_vma                    data_offset,
7401                    Elf_Internal_Shdr *        data_sec,
7402                    struct arm_section *       data_arm_sec)
7403 {
7404   int per_index;
7405   unsigned int more_words = 0;
7406   struct absaddr addr;
7407   bfd_vma sym_name = (bfd_vma) -1;
7408
7409   if (remaining == 0)
7410     {
7411       /* Fetch the first word.
7412          Note - when decoding an object file the address extracted
7413          here will always be 0.  So we also pass in the sym_name
7414          parameter so that we can find the symbol associated with
7415          the personality routine.  */
7416       if (! get_unwind_section_word (aux, data_arm_sec, data_sec, data_offset,
7417                                      & word, & addr, & sym_name))
7418         return;
7419
7420       remaining = 4;
7421     }
7422
7423   if ((word & 0x80000000) == 0)
7424     {
7425       /* Expand prel31 for personality routine.  */
7426       bfd_vma fn;
7427       const char *procname;
7428
7429       fn = arm_expand_prel31 (word, data_sec->sh_addr + data_offset);
7430       printf (_("  Personality routine: "));
7431       if (fn == 0
7432           && addr.section == SHN_UNDEF && addr.offset == 0
7433           && sym_name != (bfd_vma) -1 && sym_name < aux->strtab_size)
7434         {
7435           procname = aux->strtab + sym_name;
7436           print_vma (fn, PREFIX_HEX);
7437           if (procname)
7438             {
7439               fputs (" <", stdout);
7440               fputs (procname, stdout);
7441               fputc ('>', stdout);
7442             }
7443         }
7444       else
7445         procname = arm_print_vma_and_name (aux, fn, addr);
7446       fputc ('\n', stdout);
7447
7448       /* The GCC personality routines use the standard compact
7449          encoding, starting with one byte giving the number of
7450          words.  */
7451       if (procname != NULL
7452           && (const_strneq (procname, "__gcc_personality_v0")
7453               || const_strneq (procname, "__gxx_personality_v0")
7454               || const_strneq (procname, "__gcj_personality_v0")
7455               || const_strneq (procname, "__gnu_objc_personality_v0")))
7456         {
7457           remaining = 0;
7458           more_words = 1;
7459           ADVANCE;
7460           if (!remaining)
7461             {
7462               printf (_("  [Truncated data]\n"));
7463               return;
7464             }
7465           more_words = word >> 24;
7466           word <<= 8;
7467           remaining--;
7468           per_index = -1;
7469         }
7470       else
7471         return;
7472     }
7473   else
7474     {
7475       /* ARM EHABI Section 6.3:
7476
7477          An exception-handling table entry for the compact model looks like:
7478
7479            31 30-28 27-24 23-0
7480            -- ----- ----- ----
7481             1   0   index Data for personalityRoutine[index]    */
7482
7483       if (elf_header.e_machine == EM_ARM
7484           && (word & 0x70000000))
7485         warn (_("Corrupt ARM compact model table entry: %x \n"), word);
7486
7487       per_index = (word >> 24) & 0x7f;
7488       printf (_("  Compact model index: %d\n"), per_index);
7489       if (per_index == 0)
7490         {
7491           more_words = 0;
7492           word <<= 8;
7493           remaining--;
7494         }
7495       else if (per_index < 3)
7496         {
7497           more_words = (word >> 16) & 0xff;
7498           word <<= 16;
7499           remaining -= 2;
7500         }
7501     }
7502
7503   switch (elf_header.e_machine)
7504     {
7505     case EM_ARM:
7506       if (per_index < 3)
7507         {
7508           decode_arm_unwind_bytecode (aux, word, remaining, more_words,
7509                                       data_offset, data_sec, data_arm_sec);
7510         }
7511       else
7512         {
7513           warn (_("Unknown ARM compact model index encountered\n"));
7514           printf (_("  [reserved]\n"));
7515         }
7516       break;
7517
7518     case EM_TI_C6000:
7519       if (per_index < 3)
7520         {
7521           decode_tic6x_unwind_bytecode (aux, word, remaining, more_words,
7522                                         data_offset, data_sec, data_arm_sec);
7523         }
7524       else if (per_index < 5)
7525         {
7526           if (((word >> 17) & 0x7f) == 0x7f)
7527             printf (_("  Restore stack from frame pointer\n"));
7528           else
7529             printf (_("  Stack increment %d\n"), (word >> 14) & 0x1fc);
7530           printf (_("  Registers restored: "));
7531           if (per_index == 4)
7532             printf (" (compact) ");
7533           decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
7534           putchar ('\n');
7535           printf (_("  Return register: %s\n"),
7536                   tic6x_unwind_regnames[word & 0xf]);
7537         }
7538       else
7539         printf (_("  [reserved (%d)]\n"), per_index);
7540       break;
7541
7542     default:
7543       error (_("Unsupported architecture type %d encountered when decoding unwind table"),
7544              elf_header.e_machine);
7545     }
7546
7547   /* Decode the descriptors.  Not implemented.  */
7548 }
7549
7550 static void
7551 dump_arm_unwind (struct arm_unw_aux_info *aux, Elf_Internal_Shdr *exidx_sec)
7552 {
7553   struct arm_section exidx_arm_sec, extab_arm_sec;
7554   unsigned int i, exidx_len;
7555
7556   memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
7557   memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
7558   exidx_len = exidx_sec->sh_size / 8;
7559
7560   for (i = 0; i < exidx_len; i++)
7561     {
7562       unsigned int exidx_fn, exidx_entry;
7563       struct absaddr fn_addr, entry_addr;
7564       bfd_vma fn;
7565
7566       fputc ('\n', stdout);
7567
7568       if (! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
7569                                      8 * i, & exidx_fn, & fn_addr, NULL)
7570           || ! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
7571                                         8 * i + 4, & exidx_entry, & entry_addr, NULL))
7572         {
7573           arm_free_section (& exidx_arm_sec);
7574           arm_free_section (& extab_arm_sec);
7575           return;
7576         }
7577
7578       /* ARM EHABI, Section 5:
7579          An index table entry consists of 2 words.
7580          The first word contains a prel31 offset to the start of a function, with bit 31 clear.  */
7581       if (exidx_fn & 0x80000000)
7582         warn (_("corrupt index table entry: %x\n"), exidx_fn);
7583
7584       fn = arm_expand_prel31 (exidx_fn, exidx_sec->sh_addr + 8 * i);
7585
7586       arm_print_vma_and_name (aux, fn, fn_addr);
7587       fputs (": ", stdout);
7588
7589       if (exidx_entry == 1)
7590         {
7591           print_vma (exidx_entry, PREFIX_HEX);
7592           fputs (" [cantunwind]\n", stdout);
7593         }
7594       else if (exidx_entry & 0x80000000)
7595         {
7596           print_vma (exidx_entry, PREFIX_HEX);
7597           fputc ('\n', stdout);
7598           decode_arm_unwind (aux, exidx_entry, 4, 0, NULL, NULL);
7599         }
7600       else
7601         {
7602           bfd_vma table, table_offset = 0;
7603           Elf_Internal_Shdr *table_sec;
7604
7605           fputs ("@", stdout);
7606           table = arm_expand_prel31 (exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
7607           print_vma (table, PREFIX_HEX);
7608           printf ("\n");
7609
7610           /* Locate the matching .ARM.extab.  */
7611           if (entry_addr.section != SHN_UNDEF
7612               && entry_addr.section < elf_header.e_shnum)
7613             {
7614               table_sec = section_headers + entry_addr.section;
7615               table_offset = entry_addr.offset;
7616             }
7617           else
7618             {
7619               table_sec = find_section_by_address (table);
7620               if (table_sec != NULL)
7621                 table_offset = table - table_sec->sh_addr;
7622             }
7623           if (table_sec == NULL)
7624             {
7625               warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
7626                     (unsigned long) table);
7627               continue;
7628             }
7629           decode_arm_unwind (aux, 0, 0, table_offset, table_sec,
7630                              &extab_arm_sec);
7631         }
7632     }
7633
7634   printf ("\n");
7635
7636   arm_free_section (&exidx_arm_sec);
7637   arm_free_section (&extab_arm_sec);
7638 }
7639
7640 /* Used for both ARM and C6X unwinding tables.  */
7641
7642 static void
7643 arm_process_unwind (FILE *file)
7644 {
7645   struct arm_unw_aux_info aux;
7646   Elf_Internal_Shdr *unwsec = NULL;
7647   Elf_Internal_Shdr *strsec;
7648   Elf_Internal_Shdr *sec;
7649   unsigned long i;
7650   unsigned int sec_type;
7651
7652   switch (elf_header.e_machine)
7653     {
7654     case EM_ARM:
7655       sec_type = SHT_ARM_EXIDX;
7656       break;
7657
7658     case EM_TI_C6000:
7659       sec_type = SHT_C6000_UNWIND;
7660       break;
7661
7662     default:
7663       error (_("Unsupported architecture type %d encountered when processing unwind table"),
7664              elf_header.e_machine);
7665       return;
7666     }
7667
7668   if (string_table == NULL)
7669     return;
7670
7671   memset (& aux, 0, sizeof (aux));
7672   aux.file = file;
7673
7674   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7675     {
7676       if (sec->sh_type == SHT_SYMTAB && sec->sh_link < elf_header.e_shnum)
7677         {
7678           aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
7679
7680           strsec = section_headers + sec->sh_link;
7681           assert (aux.strtab == NULL);
7682           aux.strtab = get_data (NULL, file, strsec->sh_offset,
7683                                  1, strsec->sh_size, _("string table"));
7684           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7685         }
7686       else if (sec->sh_type == sec_type)
7687         unwsec = sec;
7688     }
7689
7690   if (unwsec == NULL)
7691     printf (_("\nThere are no unwind sections in this file.\n"));
7692   else
7693     for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7694       {
7695         if (sec->sh_type == sec_type)
7696           {
7697             printf (_("\nUnwind table index '%s' at offset 0x%lx contains %lu entries:\n"),
7698                     SECTION_NAME (sec),
7699                     (unsigned long) sec->sh_offset,
7700                     (unsigned long) (sec->sh_size / (2 * eh_addr_size)));
7701
7702             dump_arm_unwind (&aux, sec);
7703           }
7704       }
7705
7706   if (aux.symtab)
7707     free (aux.symtab);
7708   if (aux.strtab)
7709     free ((char *) aux.strtab);
7710 }
7711
7712 static void
7713 process_unwind (FILE * file)
7714 {
7715   struct unwind_handler
7716   {
7717     int machtype;
7718     void (* handler)(FILE *);
7719   } handlers[] =
7720   {
7721     { EM_ARM, arm_process_unwind },
7722     { EM_IA_64, ia64_process_unwind },
7723     { EM_PARISC, hppa_process_unwind },
7724     { EM_TI_C6000, arm_process_unwind },
7725     { 0, 0 }
7726   };
7727   int i;
7728
7729   if (!do_unwind)
7730     return;
7731
7732   for (i = 0; handlers[i].handler != NULL; i++)
7733     if (elf_header.e_machine == handlers[i].machtype)
7734       {
7735         handlers[i].handler (file);
7736         return;
7737       }
7738
7739   printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
7740           get_machine_name (elf_header.e_machine));
7741 }
7742
7743 static void
7744 dynamic_section_mips_val (Elf_Internal_Dyn * entry)
7745 {
7746   switch (entry->d_tag)
7747     {
7748     case DT_MIPS_FLAGS:
7749       if (entry->d_un.d_val == 0)
7750         printf (_("NONE"));
7751       else
7752         {
7753           static const char * opts[] =
7754           {
7755             "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
7756             "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
7757             "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
7758             "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
7759             "RLD_ORDER_SAFE"
7760           };
7761           unsigned int cnt;
7762           int first = 1;
7763
7764           for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
7765             if (entry->d_un.d_val & (1 << cnt))
7766               {
7767                 printf ("%s%s", first ? "" : " ", opts[cnt]);
7768                 first = 0;
7769               }
7770         }
7771       break;
7772
7773     case DT_MIPS_IVERSION:
7774       if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
7775         printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry->d_un.d_val));
7776       else
7777         printf (_("<corrupt: %" BFD_VMA_FMT "d>"), entry->d_un.d_ptr);
7778       break;
7779
7780     case DT_MIPS_TIME_STAMP:
7781       {
7782         char timebuf[20];
7783         struct tm * tmp;
7784
7785         time_t atime = entry->d_un.d_val;
7786         tmp = gmtime (&atime);
7787         snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
7788                   tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
7789                   tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
7790         printf (_("Time Stamp: %s"), timebuf);
7791       }
7792       break;
7793
7794     case DT_MIPS_RLD_VERSION:
7795     case DT_MIPS_LOCAL_GOTNO:
7796     case DT_MIPS_CONFLICTNO:
7797     case DT_MIPS_LIBLISTNO:
7798     case DT_MIPS_SYMTABNO:
7799     case DT_MIPS_UNREFEXTNO:
7800     case DT_MIPS_HIPAGENO:
7801     case DT_MIPS_DELTA_CLASS_NO:
7802     case DT_MIPS_DELTA_INSTANCE_NO:
7803     case DT_MIPS_DELTA_RELOC_NO:
7804     case DT_MIPS_DELTA_SYM_NO:
7805     case DT_MIPS_DELTA_CLASSSYM_NO:
7806     case DT_MIPS_COMPACT_SIZE:
7807       print_vma (entry->d_un.d_ptr, DEC);
7808       break;
7809
7810     default:
7811       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
7812     }
7813     putchar ('\n');
7814 }
7815
7816 static void
7817 dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
7818 {
7819   switch (entry->d_tag)
7820     {
7821     case DT_HP_DLD_FLAGS:
7822       {
7823         static struct
7824         {
7825           long int bit;
7826           const char * str;
7827         }
7828         flags[] =
7829         {
7830           { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
7831           { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
7832           { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
7833           { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
7834           { DT_HP_BIND_NOW, "HP_BIND_NOW" },
7835           { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
7836           { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
7837           { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
7838           { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
7839           { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
7840           { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
7841           { DT_HP_GST, "HP_GST" },
7842           { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
7843           { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
7844           { DT_HP_NODELETE, "HP_NODELETE" },
7845           { DT_HP_GROUP, "HP_GROUP" },
7846           { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
7847         };
7848         int first = 1;
7849         size_t cnt;
7850         bfd_vma val = entry->d_un.d_val;
7851
7852         for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
7853           if (val & flags[cnt].bit)
7854             {
7855               if (! first)
7856                 putchar (' ');
7857               fputs (flags[cnt].str, stdout);
7858               first = 0;
7859               val ^= flags[cnt].bit;
7860             }
7861
7862         if (val != 0 || first)
7863           {
7864             if (! first)
7865               putchar (' ');
7866             print_vma (val, HEX);
7867           }
7868       }
7869       break;
7870
7871     default:
7872       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
7873       break;
7874     }
7875   putchar ('\n');
7876 }
7877
7878 #ifdef BFD64
7879
7880 /* VMS vs Unix time offset and factor.  */
7881
7882 #define VMS_EPOCH_OFFSET 35067168000000000LL
7883 #define VMS_GRANULARITY_FACTOR 10000000
7884
7885 /* Display a VMS time in a human readable format.  */
7886
7887 static void
7888 print_vms_time (bfd_int64_t vmstime)
7889 {
7890   struct tm *tm;
7891   time_t unxtime;
7892
7893   unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
7894   tm = gmtime (&unxtime);
7895   printf ("%04u-%02u-%02uT%02u:%02u:%02u",
7896           tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
7897           tm->tm_hour, tm->tm_min, tm->tm_sec);
7898 }
7899 #endif /* BFD64 */
7900
7901 static void
7902 dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
7903 {
7904   switch (entry->d_tag)
7905     {
7906     case DT_IA_64_PLT_RESERVE:
7907       /* First 3 slots reserved.  */
7908       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
7909       printf (" -- ");
7910       print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
7911       break;
7912
7913     case DT_IA_64_VMS_LINKTIME:
7914 #ifdef BFD64
7915       print_vms_time (entry->d_un.d_val);
7916 #endif
7917       break;
7918
7919     case DT_IA_64_VMS_LNKFLAGS:
7920       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
7921       if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
7922         printf (" CALL_DEBUG");
7923       if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
7924         printf (" NOP0BUFS");
7925       if (entry->d_un.d_val & VMS_LF_P0IMAGE)
7926         printf (" P0IMAGE");
7927       if (entry->d_un.d_val & VMS_LF_MKTHREADS)
7928         printf (" MKTHREADS");
7929       if (entry->d_un.d_val & VMS_LF_UPCALLS)
7930         printf (" UPCALLS");
7931       if (entry->d_un.d_val & VMS_LF_IMGSTA)
7932         printf (" IMGSTA");
7933       if (entry->d_un.d_val & VMS_LF_INITIALIZE)
7934         printf (" INITIALIZE");
7935       if (entry->d_un.d_val & VMS_LF_MAIN)
7936         printf (" MAIN");
7937       if (entry->d_un.d_val & VMS_LF_EXE_INIT)
7938         printf (" EXE_INIT");
7939       if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
7940         printf (" TBK_IN_IMG");
7941       if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
7942         printf (" DBG_IN_IMG");
7943       if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
7944         printf (" TBK_IN_DSF");
7945       if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
7946         printf (" DBG_IN_DSF");
7947       if (entry->d_un.d_val & VMS_LF_SIGNATURES)
7948         printf (" SIGNATURES");
7949       if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
7950         printf (" REL_SEG_OFF");
7951       break;
7952
7953     default:
7954       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
7955       break;
7956     }
7957   putchar ('\n');
7958 }
7959
7960 static int
7961 get_32bit_dynamic_section (FILE * file)
7962 {
7963   Elf32_External_Dyn * edyn;
7964   Elf32_External_Dyn * ext;
7965   Elf_Internal_Dyn * entry;
7966
7967   edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
7968                                           dynamic_size, _("dynamic section"));
7969   if (!edyn)
7970     return 0;
7971
7972 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
7973    might not have the luxury of section headers.  Look for the DT_NULL
7974    terminator to determine the number of entries.  */
7975   for (ext = edyn, dynamic_nent = 0;
7976        (char *) ext < (char *) edyn + dynamic_size;
7977        ext++)
7978     {
7979       dynamic_nent++;
7980       if (BYTE_GET (ext->d_tag) == DT_NULL)
7981         break;
7982     }
7983
7984   dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
7985                                                   sizeof (* entry));
7986   if (dynamic_section == NULL)
7987     {
7988       error (_("Out of memory\n"));
7989       free (edyn);
7990       return 0;
7991     }
7992
7993   for (ext = edyn, entry = dynamic_section;
7994        entry < dynamic_section + dynamic_nent;
7995        ext++, entry++)
7996     {
7997       entry->d_tag      = BYTE_GET (ext->d_tag);
7998       entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
7999     }
8000
8001   free (edyn);
8002
8003   return 1;
8004 }
8005
8006 static int
8007 get_64bit_dynamic_section (FILE * file)
8008 {
8009   Elf64_External_Dyn * edyn;
8010   Elf64_External_Dyn * ext;
8011   Elf_Internal_Dyn * entry;
8012
8013   edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
8014                                           dynamic_size, _("dynamic section"));
8015   if (!edyn)
8016     return 0;
8017
8018 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
8019    might not have the luxury of section headers.  Look for the DT_NULL
8020    terminator to determine the number of entries.  */
8021   for (ext = edyn, dynamic_nent = 0;
8022        (char *) ext < (char *) edyn + dynamic_size;
8023        ext++)
8024     {
8025       dynamic_nent++;
8026       if (BYTE_GET (ext->d_tag) == DT_NULL)
8027         break;
8028     }
8029
8030   dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
8031                                                   sizeof (* entry));
8032   if (dynamic_section == NULL)
8033     {
8034       error (_("Out of memory\n"));
8035       free (edyn);
8036       return 0;
8037     }
8038
8039   for (ext = edyn, entry = dynamic_section;
8040        entry < dynamic_section + dynamic_nent;
8041        ext++, entry++)
8042     {
8043       entry->d_tag      = BYTE_GET (ext->d_tag);
8044       entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
8045     }
8046
8047   free (edyn);
8048
8049   return 1;
8050 }
8051
8052 static void
8053 print_dynamic_flags (bfd_vma flags)
8054 {
8055   int first = 1;
8056
8057   while (flags)
8058     {
8059       bfd_vma flag;
8060
8061       flag = flags & - flags;
8062       flags &= ~ flag;
8063
8064       if (first)
8065         first = 0;
8066       else
8067         putc (' ', stdout);
8068
8069       switch (flag)
8070         {
8071         case DF_ORIGIN:         fputs ("ORIGIN", stdout); break;
8072         case DF_SYMBOLIC:       fputs ("SYMBOLIC", stdout); break;
8073         case DF_TEXTREL:        fputs ("TEXTREL", stdout); break;
8074         case DF_BIND_NOW:       fputs ("BIND_NOW", stdout); break;
8075         case DF_STATIC_TLS:     fputs ("STATIC_TLS", stdout); break;
8076         default:                fputs (_("unknown"), stdout); break;
8077         }
8078     }
8079   puts ("");
8080 }
8081
8082 /* Parse and display the contents of the dynamic section.  */
8083
8084 static int
8085 process_dynamic_section (FILE * file)
8086 {
8087   Elf_Internal_Dyn * entry;
8088
8089   if (dynamic_size == 0)
8090     {
8091       if (do_dynamic)
8092         printf (_("\nThere is no dynamic section in this file.\n"));
8093
8094       return 1;
8095     }
8096
8097   if (is_32bit_elf)
8098     {
8099       if (! get_32bit_dynamic_section (file))
8100         return 0;
8101     }
8102   else if (! get_64bit_dynamic_section (file))
8103     return 0;
8104
8105   /* Find the appropriate symbol table.  */
8106   if (dynamic_symbols == NULL)
8107     {
8108       for (entry = dynamic_section;
8109            entry < dynamic_section + dynamic_nent;
8110            ++entry)
8111         {
8112           Elf_Internal_Shdr section;
8113
8114           if (entry->d_tag != DT_SYMTAB)
8115             continue;
8116
8117           dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
8118
8119           /* Since we do not know how big the symbol table is,
8120              we default to reading in the entire file (!) and
8121              processing that.  This is overkill, I know, but it
8122              should work.  */
8123           section.sh_offset = offset_from_vma (file, entry->d_un.d_val, 0);
8124
8125           if (archive_file_offset != 0)
8126             section.sh_size = archive_file_size - section.sh_offset;
8127           else
8128             {
8129               if (fseek (file, 0, SEEK_END))
8130                 error (_("Unable to seek to end of file!\n"));
8131
8132               section.sh_size = ftell (file) - section.sh_offset;
8133             }
8134
8135           if (is_32bit_elf)
8136             section.sh_entsize = sizeof (Elf32_External_Sym);
8137           else
8138             section.sh_entsize = sizeof (Elf64_External_Sym);
8139
8140           dynamic_symbols = GET_ELF_SYMBOLS (file, &section, & num_dynamic_syms);
8141           if (num_dynamic_syms < 1)
8142             {
8143               error (_("Unable to determine the number of symbols to load\n"));
8144               continue;
8145             }
8146         }
8147     }
8148
8149   /* Similarly find a string table.  */
8150   if (dynamic_strings == NULL)
8151     {
8152       for (entry = dynamic_section;
8153            entry < dynamic_section + dynamic_nent;
8154            ++entry)
8155         {
8156           unsigned long offset;
8157           long str_tab_len;
8158
8159           if (entry->d_tag != DT_STRTAB)
8160             continue;
8161
8162           dynamic_info[DT_STRTAB] = entry->d_un.d_val;
8163
8164           /* Since we do not know how big the string table is,
8165              we default to reading in the entire file (!) and
8166              processing that.  This is overkill, I know, but it
8167              should work.  */
8168
8169           offset = offset_from_vma (file, entry->d_un.d_val, 0);
8170
8171           if (archive_file_offset != 0)
8172             str_tab_len = archive_file_size - offset;
8173           else
8174             {
8175               if (fseek (file, 0, SEEK_END))
8176                 error (_("Unable to seek to end of file\n"));
8177               str_tab_len = ftell (file) - offset;
8178             }
8179
8180           if (str_tab_len < 1)
8181             {
8182               error
8183                 (_("Unable to determine the length of the dynamic string table\n"));
8184               continue;
8185             }
8186
8187           dynamic_strings = (char *) get_data (NULL, file, offset, 1,
8188                                                str_tab_len,
8189                                                _("dynamic string table"));
8190           dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
8191           break;
8192         }
8193     }
8194
8195   /* And find the syminfo section if available.  */
8196   if (dynamic_syminfo == NULL)
8197     {
8198       unsigned long syminsz = 0;
8199
8200       for (entry = dynamic_section;
8201            entry < dynamic_section + dynamic_nent;
8202            ++entry)
8203         {
8204           if (entry->d_tag == DT_SYMINENT)
8205             {
8206               /* Note: these braces are necessary to avoid a syntax
8207                  error from the SunOS4 C compiler.  */
8208               assert (sizeof (Elf_External_Syminfo) == entry->d_un.d_val);
8209             }
8210           else if (entry->d_tag == DT_SYMINSZ)
8211             syminsz = entry->d_un.d_val;
8212           else if (entry->d_tag == DT_SYMINFO)
8213             dynamic_syminfo_offset = offset_from_vma (file, entry->d_un.d_val,
8214                                                       syminsz);
8215         }
8216
8217       if (dynamic_syminfo_offset != 0 && syminsz != 0)
8218         {
8219           Elf_External_Syminfo * extsyminfo;
8220           Elf_External_Syminfo * extsym;
8221           Elf_Internal_Syminfo * syminfo;
8222
8223           /* There is a syminfo section.  Read the data.  */
8224           extsyminfo = (Elf_External_Syminfo *)
8225               get_data (NULL, file, dynamic_syminfo_offset, 1, syminsz,
8226                         _("symbol information"));
8227           if (!extsyminfo)
8228             return 0;
8229
8230           dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
8231           if (dynamic_syminfo == NULL)
8232             {
8233               error (_("Out of memory\n"));
8234               return 0;
8235             }
8236
8237           dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
8238           for (syminfo = dynamic_syminfo, extsym = extsyminfo;
8239                syminfo < dynamic_syminfo + dynamic_syminfo_nent;
8240                ++syminfo, ++extsym)
8241             {
8242               syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
8243               syminfo->si_flags = BYTE_GET (extsym->si_flags);
8244             }
8245
8246           free (extsyminfo);
8247         }
8248     }
8249
8250   if (do_dynamic && dynamic_addr)
8251     printf (_("\nDynamic section at offset 0x%lx contains %u entries:\n"),
8252             dynamic_addr, dynamic_nent);
8253   if (do_dynamic)
8254     printf (_("  Tag        Type                         Name/Value\n"));
8255
8256   for (entry = dynamic_section;
8257        entry < dynamic_section + dynamic_nent;
8258        entry++)
8259     {
8260       if (do_dynamic)
8261         {
8262           const char * dtype;
8263
8264           putchar (' ');
8265           print_vma (entry->d_tag, FULL_HEX);
8266           dtype = get_dynamic_type (entry->d_tag);
8267           printf (" (%s)%*s", dtype,
8268                   ((is_32bit_elf ? 27 : 19)
8269                    - (int) strlen (dtype)),
8270                   " ");
8271         }
8272
8273       switch (entry->d_tag)
8274         {
8275         case DT_FLAGS:
8276           if (do_dynamic)
8277             print_dynamic_flags (entry->d_un.d_val);
8278           break;
8279
8280         case DT_AUXILIARY:
8281         case DT_FILTER:
8282         case DT_CONFIG:
8283         case DT_DEPAUDIT:
8284         case DT_AUDIT:
8285           if (do_dynamic)
8286             {
8287               switch (entry->d_tag)
8288                 {
8289                 case DT_AUXILIARY:
8290                   printf (_("Auxiliary library"));
8291                   break;
8292
8293                 case DT_FILTER:
8294                   printf (_("Filter library"));
8295                   break;
8296
8297                 case DT_CONFIG:
8298                   printf (_("Configuration file"));
8299                   break;
8300
8301                 case DT_DEPAUDIT:
8302                   printf (_("Dependency audit library"));
8303                   break;
8304
8305                 case DT_AUDIT:
8306                   printf (_("Audit library"));
8307                   break;
8308                 }
8309
8310               if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
8311                 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
8312               else
8313                 {
8314                   printf (": ");
8315                   print_vma (entry->d_un.d_val, PREFIX_HEX);
8316                   putchar ('\n');
8317                 }
8318             }
8319           break;
8320
8321         case DT_FEATURE:
8322           if (do_dynamic)
8323             {
8324               printf (_("Flags:"));
8325
8326               if (entry->d_un.d_val == 0)
8327                 printf (_(" None\n"));
8328               else
8329                 {
8330                   unsigned long int val = entry->d_un.d_val;
8331
8332                   if (val & DTF_1_PARINIT)
8333                     {
8334                       printf (" PARINIT");
8335                       val ^= DTF_1_PARINIT;
8336                     }
8337                   if (val & DTF_1_CONFEXP)
8338                     {
8339                       printf (" CONFEXP");
8340                       val ^= DTF_1_CONFEXP;
8341                     }
8342                   if (val != 0)
8343                     printf (" %lx", val);
8344                   puts ("");
8345                 }
8346             }
8347           break;
8348
8349         case DT_POSFLAG_1:
8350           if (do_dynamic)
8351             {
8352               printf (_("Flags:"));
8353
8354               if (entry->d_un.d_val == 0)
8355                 printf (_(" None\n"));
8356               else
8357                 {
8358                   unsigned long int val = entry->d_un.d_val;
8359
8360                   if (val & DF_P1_LAZYLOAD)
8361                     {
8362                       printf (" LAZYLOAD");
8363                       val ^= DF_P1_LAZYLOAD;
8364                     }
8365                   if (val & DF_P1_GROUPPERM)
8366                     {
8367                       printf (" GROUPPERM");
8368                       val ^= DF_P1_GROUPPERM;
8369                     }
8370                   if (val != 0)
8371                     printf (" %lx", val);
8372                   puts ("");
8373                 }
8374             }
8375           break;
8376
8377         case DT_FLAGS_1:
8378           if (do_dynamic)
8379             {
8380               printf (_("Flags:"));
8381               if (entry->d_un.d_val == 0)
8382                 printf (_(" None\n"));
8383               else
8384                 {
8385                   unsigned long int val = entry->d_un.d_val;
8386
8387                   if (val & DF_1_NOW)
8388                     {
8389                       printf (" NOW");
8390                       val ^= DF_1_NOW;
8391                     }
8392                   if (val & DF_1_GLOBAL)
8393                     {
8394                       printf (" GLOBAL");
8395                       val ^= DF_1_GLOBAL;
8396                     }
8397                   if (val & DF_1_GROUP)
8398                     {
8399                       printf (" GROUP");
8400                       val ^= DF_1_GROUP;
8401                     }
8402                   if (val & DF_1_NODELETE)
8403                     {
8404                       printf (" NODELETE");
8405                       val ^= DF_1_NODELETE;
8406                     }
8407                   if (val & DF_1_LOADFLTR)
8408                     {
8409                       printf (" LOADFLTR");
8410                       val ^= DF_1_LOADFLTR;
8411                     }
8412                   if (val & DF_1_INITFIRST)
8413                     {
8414                       printf (" INITFIRST");
8415                       val ^= DF_1_INITFIRST;
8416                     }
8417                   if (val & DF_1_NOOPEN)
8418                     {
8419                       printf (" NOOPEN");
8420                       val ^= DF_1_NOOPEN;
8421                     }
8422                   if (val & DF_1_ORIGIN)
8423                     {
8424                       printf (" ORIGIN");
8425                       val ^= DF_1_ORIGIN;
8426                     }
8427                   if (val & DF_1_DIRECT)
8428                     {
8429                       printf (" DIRECT");
8430                       val ^= DF_1_DIRECT;
8431                     }
8432                   if (val & DF_1_TRANS)
8433                     {
8434                       printf (" TRANS");
8435                       val ^= DF_1_TRANS;
8436                     }
8437                   if (val & DF_1_INTERPOSE)
8438                     {
8439                       printf (" INTERPOSE");
8440                       val ^= DF_1_INTERPOSE;
8441                     }
8442                   if (val & DF_1_NODEFLIB)
8443                     {
8444                       printf (" NODEFLIB");
8445                       val ^= DF_1_NODEFLIB;
8446                     }
8447                   if (val & DF_1_NODUMP)
8448                     {
8449                       printf (" NODUMP");
8450                       val ^= DF_1_NODUMP;
8451                     }
8452                   if (val & DF_1_CONFALT)
8453                     {
8454                       printf (" CONFALT");
8455                       val ^= DF_1_CONFALT;
8456                     }
8457                   if (val & DF_1_ENDFILTEE)
8458                     {
8459                       printf (" ENDFILTEE");
8460                       val ^= DF_1_ENDFILTEE;
8461                     }
8462                   if (val & DF_1_DISPRELDNE)
8463                     {
8464                       printf (" DISPRELDNE");
8465                       val ^= DF_1_DISPRELDNE;
8466                     }
8467                   if (val & DF_1_DISPRELPND)
8468                     {
8469                       printf (" DISPRELPND");
8470                       val ^= DF_1_DISPRELPND;
8471                     }
8472                   if (val & DF_1_NODIRECT)
8473                     {
8474                       printf (" NODIRECT");
8475                       val ^= DF_1_NODIRECT;
8476                     }
8477                   if (val & DF_1_IGNMULDEF)
8478                     {
8479                       printf (" IGNMULDEF");
8480                       val ^= DF_1_IGNMULDEF;
8481                     }
8482                   if (val & DF_1_NOKSYMS)
8483                     {
8484                       printf (" NOKSYMS");
8485                       val ^= DF_1_NOKSYMS;
8486                     }
8487                   if (val & DF_1_NOHDR)
8488                     {
8489                       printf (" NOHDR");
8490                       val ^= DF_1_NOHDR;
8491                     }
8492                   if (val & DF_1_EDITED)
8493                     {
8494                       printf (" EDITED");
8495                       val ^= DF_1_EDITED;
8496                     }
8497                   if (val & DF_1_NORELOC)
8498                     {
8499                       printf (" NORELOC");
8500                       val ^= DF_1_NORELOC;
8501                     }
8502                   if (val & DF_1_SYMINTPOSE)
8503                     {
8504                       printf (" SYMINTPOSE");
8505                       val ^= DF_1_SYMINTPOSE;
8506                     }
8507                   if (val & DF_1_GLOBAUDIT)
8508                     {
8509                       printf (" GLOBAUDIT");
8510                       val ^= DF_1_GLOBAUDIT;
8511                     }
8512                   if (val & DF_1_SINGLETON)
8513                     {
8514                       printf (" SINGLETON");
8515                       val ^= DF_1_SINGLETON;
8516                     }
8517                   if (val != 0)
8518                     printf (" %lx", val);
8519                   puts ("");
8520                 }
8521             }
8522           break;
8523
8524         case DT_PLTREL:
8525           dynamic_info[entry->d_tag] = entry->d_un.d_val;
8526           if (do_dynamic)
8527             puts (get_dynamic_type (entry->d_un.d_val));
8528           break;
8529
8530         case DT_NULL    :
8531         case DT_NEEDED  :
8532         case DT_PLTGOT  :
8533         case DT_HASH    :
8534         case DT_STRTAB  :
8535         case DT_SYMTAB  :
8536         case DT_RELA    :
8537         case DT_INIT    :
8538         case DT_FINI    :
8539         case DT_SONAME  :
8540         case DT_RPATH   :
8541         case DT_SYMBOLIC:
8542         case DT_REL     :
8543         case DT_DEBUG   :
8544         case DT_TEXTREL :
8545         case DT_JMPREL  :
8546         case DT_RUNPATH :
8547           dynamic_info[entry->d_tag] = entry->d_un.d_val;
8548
8549           if (do_dynamic)
8550             {
8551               char * name;
8552
8553               if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
8554                 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
8555               else
8556                 name = NULL;
8557
8558               if (name)
8559                 {
8560                   switch (entry->d_tag)
8561                     {
8562                     case DT_NEEDED:
8563                       printf (_("Shared library: [%s]"), name);
8564
8565                       if (streq (name, program_interpreter))
8566                         printf (_(" program interpreter"));
8567                       break;
8568
8569                     case DT_SONAME:
8570                       printf (_("Library soname: [%s]"), name);
8571                       break;
8572
8573                     case DT_RPATH:
8574                       printf (_("Library rpath: [%s]"), name);
8575                       break;
8576
8577                     case DT_RUNPATH:
8578                       printf (_("Library runpath: [%s]"), name);
8579                       break;
8580
8581                     default:
8582                       print_vma (entry->d_un.d_val, PREFIX_HEX);
8583                       break;
8584                     }
8585                 }
8586               else
8587                 print_vma (entry->d_un.d_val, PREFIX_HEX);
8588
8589               putchar ('\n');
8590             }
8591           break;
8592
8593         case DT_PLTRELSZ:
8594         case DT_RELASZ  :
8595         case DT_STRSZ   :
8596         case DT_RELSZ   :
8597         case DT_RELAENT :
8598         case DT_SYMENT  :
8599         case DT_RELENT  :
8600           dynamic_info[entry->d_tag] = entry->d_un.d_val;
8601         case DT_PLTPADSZ:
8602         case DT_MOVEENT :
8603         case DT_MOVESZ  :
8604         case DT_INIT_ARRAYSZ:
8605         case DT_FINI_ARRAYSZ:
8606         case DT_GNU_CONFLICTSZ:
8607         case DT_GNU_LIBLISTSZ:
8608           if (do_dynamic)
8609             {
8610               print_vma (entry->d_un.d_val, UNSIGNED);
8611               printf (_(" (bytes)\n"));
8612             }
8613           break;
8614
8615         case DT_VERDEFNUM:
8616         case DT_VERNEEDNUM:
8617         case DT_RELACOUNT:
8618         case DT_RELCOUNT:
8619           if (do_dynamic)
8620             {
8621               print_vma (entry->d_un.d_val, UNSIGNED);
8622               putchar ('\n');
8623             }
8624           break;
8625
8626         case DT_SYMINSZ:
8627         case DT_SYMINENT:
8628         case DT_SYMINFO:
8629         case DT_USED:
8630         case DT_INIT_ARRAY:
8631         case DT_FINI_ARRAY:
8632           if (do_dynamic)
8633             {
8634               if (entry->d_tag == DT_USED
8635                   && VALID_DYNAMIC_NAME (entry->d_un.d_val))
8636                 {
8637                   char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
8638
8639                   if (*name)
8640                     {
8641                       printf (_("Not needed object: [%s]\n"), name);
8642                       break;
8643                     }
8644                 }
8645
8646               print_vma (entry->d_un.d_val, PREFIX_HEX);
8647               putchar ('\n');
8648             }
8649           break;
8650
8651         case DT_BIND_NOW:
8652           /* The value of this entry is ignored.  */
8653           if (do_dynamic)
8654             putchar ('\n');
8655           break;
8656
8657         case DT_GNU_PRELINKED:
8658           if (do_dynamic)
8659             {
8660               struct tm * tmp;
8661               time_t atime = entry->d_un.d_val;
8662
8663               tmp = gmtime (&atime);
8664               printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
8665                       tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
8666                       tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
8667
8668             }
8669           break;
8670
8671         case DT_GNU_HASH:
8672           dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
8673           if (do_dynamic)
8674             {
8675               print_vma (entry->d_un.d_val, PREFIX_HEX);
8676               putchar ('\n');
8677             }
8678           break;
8679
8680         default:
8681           if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
8682             version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
8683               entry->d_un.d_val;
8684
8685           if (do_dynamic)
8686             {
8687               switch (elf_header.e_machine)
8688                 {
8689                 case EM_MIPS:
8690                 case EM_MIPS_RS3_LE:
8691                   dynamic_section_mips_val (entry);
8692                   break;
8693                 case EM_PARISC:
8694                   dynamic_section_parisc_val (entry);
8695                   break;
8696                 case EM_IA_64:
8697                   dynamic_section_ia64_val (entry);
8698                   break;
8699                 default:
8700                   print_vma (entry->d_un.d_val, PREFIX_HEX);
8701                   putchar ('\n');
8702                 }
8703             }
8704           break;
8705         }
8706     }
8707
8708   return 1;
8709 }
8710
8711 static char *
8712 get_ver_flags (unsigned int flags)
8713 {
8714   static char buff[32];
8715
8716   buff[0] = 0;
8717
8718   if (flags == 0)
8719     return _("none");
8720
8721   if (flags & VER_FLG_BASE)
8722     strcat (buff, "BASE ");
8723
8724   if (flags & VER_FLG_WEAK)
8725     {
8726       if (flags & VER_FLG_BASE)
8727         strcat (buff, "| ");
8728
8729       strcat (buff, "WEAK ");
8730     }
8731
8732   if (flags & VER_FLG_INFO)
8733     {
8734       if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
8735         strcat (buff, "| ");
8736
8737       strcat (buff, "INFO ");
8738     }
8739
8740   if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
8741     strcat (buff, _("| <unknown>"));
8742
8743   return buff;
8744 }
8745
8746 /* Display the contents of the version sections.  */
8747
8748 static int
8749 process_version_sections (FILE * file)
8750 {
8751   Elf_Internal_Shdr * section;
8752   unsigned i;
8753   int found = 0;
8754
8755   if (! do_version)
8756     return 1;
8757
8758   for (i = 0, section = section_headers;
8759        i < elf_header.e_shnum;
8760        i++, section++)
8761     {
8762       switch (section->sh_type)
8763         {
8764         case SHT_GNU_verdef:
8765           {
8766             Elf_External_Verdef * edefs;
8767             unsigned int idx;
8768             unsigned int cnt;
8769             char * endbuf;
8770
8771             found = 1;
8772
8773             printf
8774               (_("\nVersion definition section '%s' contains %u entries:\n"),
8775                SECTION_NAME (section), section->sh_info);
8776
8777             printf (_("  Addr: 0x"));
8778             printf_vma (section->sh_addr);
8779             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
8780                     (unsigned long) section->sh_offset, section->sh_link,
8781                     section->sh_link < elf_header.e_shnum
8782                     ? SECTION_NAME (section_headers + section->sh_link)
8783                     : _("<corrupt>"));
8784
8785             edefs = (Elf_External_Verdef *)
8786                 get_data (NULL, file, section->sh_offset, 1,section->sh_size,
8787                           _("version definition section"));
8788             if (!edefs)
8789               break;
8790             endbuf = (char *) edefs + section->sh_size;
8791
8792             for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
8793               {
8794                 char * vstart;
8795                 Elf_External_Verdef * edef;
8796                 Elf_Internal_Verdef ent;
8797                 Elf_External_Verdaux * eaux;
8798                 Elf_Internal_Verdaux aux;
8799                 int j;
8800                 int isum;
8801
8802                 /* Check for very large indicies.  */
8803                 if (idx > (size_t) (endbuf - (char *) edefs))
8804                   break;
8805
8806                 vstart = ((char *) edefs) + idx;
8807                 if (vstart + sizeof (*edef) > endbuf)
8808                   break;
8809
8810                 edef = (Elf_External_Verdef *) vstart;
8811
8812                 ent.vd_version = BYTE_GET (edef->vd_version);
8813                 ent.vd_flags   = BYTE_GET (edef->vd_flags);
8814                 ent.vd_ndx     = BYTE_GET (edef->vd_ndx);
8815                 ent.vd_cnt     = BYTE_GET (edef->vd_cnt);
8816                 ent.vd_hash    = BYTE_GET (edef->vd_hash);
8817                 ent.vd_aux     = BYTE_GET (edef->vd_aux);
8818                 ent.vd_next    = BYTE_GET (edef->vd_next);
8819
8820                 printf (_("  %#06x: Rev: %d  Flags: %s"),
8821                         idx, ent.vd_version, get_ver_flags (ent.vd_flags));
8822
8823                 printf (_("  Index: %d  Cnt: %d  "),
8824                         ent.vd_ndx, ent.vd_cnt);
8825
8826                 /* Check for overflow.  */
8827                 if (ent.vd_aux > (size_t) (endbuf - vstart))
8828                   break;
8829
8830                 vstart += ent.vd_aux;
8831
8832                 eaux = (Elf_External_Verdaux *) vstart;
8833
8834                 aux.vda_name = BYTE_GET (eaux->vda_name);
8835                 aux.vda_next = BYTE_GET (eaux->vda_next);
8836
8837                 if (VALID_DYNAMIC_NAME (aux.vda_name))
8838                   printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
8839                 else
8840                   printf (_("Name index: %ld\n"), aux.vda_name);
8841
8842                 isum = idx + ent.vd_aux;
8843
8844                 for (j = 1; j < ent.vd_cnt; j++)
8845                   {
8846                     /* Check for overflow.  */
8847                     if (aux.vda_next > (size_t) (endbuf - vstart))
8848                       break;
8849
8850                     isum   += aux.vda_next;
8851                     vstart += aux.vda_next;
8852
8853                     eaux = (Elf_External_Verdaux *) vstart;
8854                     if (vstart + sizeof (*eaux) > endbuf)
8855                       break;
8856
8857                     aux.vda_name = BYTE_GET (eaux->vda_name);
8858                     aux.vda_next = BYTE_GET (eaux->vda_next);
8859
8860                     if (VALID_DYNAMIC_NAME (aux.vda_name))
8861                       printf (_("  %#06x: Parent %d: %s\n"),
8862                               isum, j, GET_DYNAMIC_NAME (aux.vda_name));
8863                     else
8864                       printf (_("  %#06x: Parent %d, name index: %ld\n"),
8865                               isum, j, aux.vda_name);
8866                   }
8867
8868                 if (j < ent.vd_cnt)
8869                   printf (_("  Version def aux past end of section\n"));
8870
8871                 idx += ent.vd_next;
8872               }
8873
8874             if (cnt < section->sh_info)
8875               printf (_("  Version definition past end of section\n"));
8876
8877             free (edefs);
8878           }
8879           break;
8880
8881         case SHT_GNU_verneed:
8882           {
8883             Elf_External_Verneed * eneed;
8884             unsigned int idx;
8885             unsigned int cnt;
8886             char * endbuf;
8887
8888             found = 1;
8889
8890             printf (_("\nVersion needs section '%s' contains %u entries:\n"),
8891                     SECTION_NAME (section), section->sh_info);
8892
8893             printf (_(" Addr: 0x"));
8894             printf_vma (section->sh_addr);
8895             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
8896                     (unsigned long) section->sh_offset, section->sh_link,
8897                     section->sh_link < elf_header.e_shnum
8898                     ? SECTION_NAME (section_headers + section->sh_link)
8899                     : _("<corrupt>"));
8900
8901             eneed = (Elf_External_Verneed *) get_data (NULL, file,
8902                                                        section->sh_offset, 1,
8903                                                        section->sh_size,
8904                                                        _("Version Needs section"));
8905             if (!eneed)
8906               break;
8907             endbuf = (char *) eneed + section->sh_size;
8908
8909             for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
8910               {
8911                 Elf_External_Verneed * entry;
8912                 Elf_Internal_Verneed ent;
8913                 int j;
8914                 int isum;
8915                 char * vstart;
8916
8917                 if (idx > (size_t) (endbuf - (char *) eneed))
8918                   break;
8919
8920                 vstart = ((char *) eneed) + idx;
8921                 if (vstart + sizeof (*entry) > endbuf)
8922                   break;
8923
8924                 entry = (Elf_External_Verneed *) vstart;
8925
8926                 ent.vn_version = BYTE_GET (entry->vn_version);
8927                 ent.vn_cnt     = BYTE_GET (entry->vn_cnt);
8928                 ent.vn_file    = BYTE_GET (entry->vn_file);
8929                 ent.vn_aux     = BYTE_GET (entry->vn_aux);
8930                 ent.vn_next    = BYTE_GET (entry->vn_next);
8931
8932                 printf (_("  %#06x: Version: %d"), idx, ent.vn_version);
8933
8934                 if (VALID_DYNAMIC_NAME (ent.vn_file))
8935                   printf (_("  File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
8936                 else
8937                   printf (_("  File: %lx"), ent.vn_file);
8938
8939                 printf (_("  Cnt: %d\n"), ent.vn_cnt);
8940
8941                 /* Check for overflow.  */
8942                 if (ent.vn_aux > (size_t) (endbuf - vstart))
8943                   break;
8944
8945                 vstart += ent.vn_aux;
8946
8947                 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
8948                   {
8949                     Elf_External_Vernaux * eaux;
8950                     Elf_Internal_Vernaux aux;
8951
8952                     if (vstart + sizeof (*eaux) > endbuf)
8953                       break;
8954                     eaux = (Elf_External_Vernaux *) vstart;
8955
8956                     aux.vna_hash  = BYTE_GET (eaux->vna_hash);
8957                     aux.vna_flags = BYTE_GET (eaux->vna_flags);
8958                     aux.vna_other = BYTE_GET (eaux->vna_other);
8959                     aux.vna_name  = BYTE_GET (eaux->vna_name);
8960                     aux.vna_next  = BYTE_GET (eaux->vna_next);
8961
8962                     if (VALID_DYNAMIC_NAME (aux.vna_name))
8963                       printf (_("  %#06x:   Name: %s"),
8964                               isum, GET_DYNAMIC_NAME (aux.vna_name));
8965                     else
8966                       printf (_("  %#06x:   Name index: %lx"),
8967                               isum, aux.vna_name);
8968
8969                     printf (_("  Flags: %s  Version: %d\n"),
8970                             get_ver_flags (aux.vna_flags), aux.vna_other);
8971
8972                     /* Check for overflow.  */
8973                     if (aux.vna_next > (size_t) (endbuf - vstart))
8974                       break;
8975
8976                     isum   += aux.vna_next;
8977                     vstart += aux.vna_next;
8978                   }
8979
8980                 if (j < ent.vn_cnt)
8981                   warn (_("Missing Version Needs auxillary information\n"));
8982
8983                 if (ent.vn_next == 0 && cnt < section->sh_info - 1)
8984                   {
8985                     warn (_("Corrupt Version Needs structure - offset to next structure is zero with entries still left to be processed\n"));
8986                     cnt = section->sh_info;
8987                     break;
8988                   }
8989                 idx += ent.vn_next;
8990               }
8991
8992             if (cnt < section->sh_info)
8993               warn (_("Missing Version Needs information\n"));
8994
8995             free (eneed);
8996           }
8997           break;
8998
8999         case SHT_GNU_versym:
9000           {
9001             Elf_Internal_Shdr * link_section;
9002             int total;
9003             int cnt;
9004             unsigned char * edata;
9005             unsigned short * data;
9006             char * strtab;
9007             Elf_Internal_Sym * symbols;
9008             Elf_Internal_Shdr * string_sec;
9009             unsigned long num_syms;
9010             long off;
9011
9012             if (section->sh_link >= elf_header.e_shnum)
9013               break;
9014
9015             link_section = section_headers + section->sh_link;
9016             total = section->sh_size / sizeof (Elf_External_Versym);
9017
9018             if (link_section->sh_link >= elf_header.e_shnum)
9019               break;
9020
9021             found = 1;
9022
9023             symbols = GET_ELF_SYMBOLS (file, link_section, & num_syms);
9024             if (symbols == NULL)
9025               break;
9026
9027             string_sec = section_headers + link_section->sh_link;
9028
9029             strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
9030                                         string_sec->sh_size,
9031                                         _("version string table"));
9032             if (!strtab)
9033               {
9034                 free (symbols);
9035                 break;
9036               }
9037
9038             printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
9039                     SECTION_NAME (section), total);
9040
9041             printf (_(" Addr: "));
9042             printf_vma (section->sh_addr);
9043             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
9044                     (unsigned long) section->sh_offset, section->sh_link,
9045                     SECTION_NAME (link_section));
9046
9047             off = offset_from_vma (file,
9048                                    version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
9049                                    total * sizeof (short));
9050             edata = (unsigned char *) get_data (NULL, file, off, total,
9051                                                 sizeof (short),
9052                                                 _("version symbol data"));
9053             if (!edata)
9054               {
9055                 free (strtab);
9056                 free (symbols);
9057                 break;
9058               }
9059
9060             data = (short unsigned int *) cmalloc (total, sizeof (short));
9061
9062             for (cnt = total; cnt --;)
9063               data[cnt] = byte_get (edata + cnt * sizeof (short),
9064                                     sizeof (short));
9065
9066             free (edata);
9067
9068             for (cnt = 0; cnt < total; cnt += 4)
9069               {
9070                 int j, nn;
9071                 int check_def, check_need;
9072                 char * name;
9073
9074                 printf ("  %03x:", cnt);
9075
9076                 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
9077                   switch (data[cnt + j])
9078                     {
9079                     case 0:
9080                       fputs (_("   0 (*local*)    "), stdout);
9081                       break;
9082
9083                     case 1:
9084                       fputs (_("   1 (*global*)   "), stdout);
9085                       break;
9086
9087                     default:
9088                       nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
9089                                    data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
9090
9091                       /* If this index value is greater than the size of the symbols
9092                          array, break to avoid an out-of-bounds read.  */
9093                       if ((unsigned long)(cnt + j) >= num_syms)
9094                         {
9095                           warn (_("invalid index into symbol array\n"));
9096                           break;
9097                         }
9098
9099                       check_def = 1;
9100                       check_need = 1;
9101                       if (symbols[cnt + j].st_shndx >= elf_header.e_shnum
9102                           || section_headers[symbols[cnt + j].st_shndx].sh_type
9103                              != SHT_NOBITS)
9104                         {
9105                           if (symbols[cnt + j].st_shndx == SHN_UNDEF)
9106                             check_def = 0;
9107                           else
9108                             check_need = 0;
9109                         }
9110
9111                       if (check_need
9112                           && version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
9113                         {
9114                           Elf_Internal_Verneed ivn;
9115                           unsigned long offset;
9116
9117                           offset = offset_from_vma
9118                             (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
9119                              sizeof (Elf_External_Verneed));
9120
9121                           do
9122                             {
9123                               Elf_Internal_Vernaux ivna;
9124                               Elf_External_Verneed evn;
9125                               Elf_External_Vernaux evna;
9126                               unsigned long a_off;
9127
9128                               if (get_data (&evn, file, offset, sizeof (evn), 1,
9129                                             _("version need")) == NULL)
9130                                 break;
9131
9132                               ivn.vn_aux  = BYTE_GET (evn.vn_aux);
9133                               ivn.vn_next = BYTE_GET (evn.vn_next);
9134
9135                               a_off = offset + ivn.vn_aux;
9136
9137                               do
9138                                 {
9139                                   if (get_data (&evna, file, a_off, sizeof (evna),
9140                                                 1, _("version need aux (2)")) == NULL)
9141                                     {
9142                                       ivna.vna_next  = 0;
9143                                       ivna.vna_other = 0;
9144                                     }
9145                                   else
9146                                     {
9147                                       ivna.vna_next  = BYTE_GET (evna.vna_next);
9148                                       ivna.vna_other = BYTE_GET (evna.vna_other);
9149                                     }
9150
9151                                   a_off += ivna.vna_next;
9152                                 }
9153                               while (ivna.vna_other != data[cnt + j]
9154                                      && ivna.vna_next != 0);
9155
9156                               if (ivna.vna_other == data[cnt + j])
9157                                 {
9158                                   ivna.vna_name = BYTE_GET (evna.vna_name);
9159
9160                                   if (ivna.vna_name >= string_sec->sh_size)
9161                                     name = _("*invalid*");
9162                                   else
9163                                     name = strtab + ivna.vna_name;
9164                                   nn += printf ("(%s%-*s",
9165                                                 name,
9166                                                 12 - (int) strlen (name),
9167                                                 ")");
9168                                   check_def = 0;
9169                                   break;
9170                                 }
9171
9172                               offset += ivn.vn_next;
9173                             }
9174                           while (ivn.vn_next);
9175                         }
9176
9177                       if (check_def && data[cnt + j] != 0x8001
9178                           && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
9179                         {
9180                           Elf_Internal_Verdef ivd;
9181                           Elf_External_Verdef evd;
9182                           unsigned long offset;
9183
9184                           offset = offset_from_vma
9185                             (file, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
9186                              sizeof evd);
9187
9188                           do
9189                             {
9190                               if (get_data (&evd, file, offset, sizeof (evd), 1,
9191                                             _("version def")) == NULL)
9192                                 {
9193                                   ivd.vd_next = 0;
9194                                   ivd.vd_ndx  = 0;
9195                                 }
9196                               else
9197                                 {
9198                                   ivd.vd_next = BYTE_GET (evd.vd_next);
9199                                   ivd.vd_ndx  = BYTE_GET (evd.vd_ndx);
9200                                 }
9201
9202                               offset += ivd.vd_next;
9203                             }
9204                           while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
9205                                  && ivd.vd_next != 0);
9206
9207                           if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
9208                             {
9209                               Elf_External_Verdaux evda;
9210                               Elf_Internal_Verdaux ivda;
9211
9212                               ivd.vd_aux = BYTE_GET (evd.vd_aux);
9213
9214                               if (get_data (&evda, file,
9215                                             offset - ivd.vd_next + ivd.vd_aux,
9216                                             sizeof (evda), 1,
9217                                             _("version def aux")) == NULL)
9218                                 break;
9219
9220                               ivda.vda_name = BYTE_GET (evda.vda_name);
9221
9222                               if (ivda.vda_name >= string_sec->sh_size)
9223                                 name = _("*invalid*");
9224                               else
9225                                 name = strtab + ivda.vda_name;
9226                               nn += printf ("(%s%-*s",
9227                                             name,
9228                                             12 - (int) strlen (name),
9229                                             ")");
9230                             }
9231                         }
9232
9233                       if (nn < 18)
9234                         printf ("%*c", 18 - nn, ' ');
9235                     }
9236
9237                 putchar ('\n');
9238               }
9239
9240             free (data);
9241             free (strtab);
9242             free (symbols);
9243           }
9244           break;
9245
9246         default:
9247           break;
9248         }
9249     }
9250
9251   if (! found)
9252     printf (_("\nNo version information found in this file.\n"));
9253
9254   return 1;
9255 }
9256
9257 static const char *
9258 get_symbol_binding (unsigned int binding)
9259 {
9260   static char buff[32];
9261
9262   switch (binding)
9263     {
9264     case STB_LOCAL:     return "LOCAL";
9265     case STB_GLOBAL:    return "GLOBAL";
9266     case STB_WEAK:      return "WEAK";
9267     default:
9268       if (binding >= STB_LOPROC && binding <= STB_HIPROC)
9269         snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
9270                   binding);
9271       else if (binding >= STB_LOOS && binding <= STB_HIOS)
9272         {
9273           if (binding == STB_GNU_UNIQUE
9274               && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
9275                   /* GNU is still using the default value 0.  */
9276                   || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
9277             return "UNIQUE";
9278           snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
9279         }
9280       else
9281         snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
9282       return buff;
9283     }
9284 }
9285
9286 static const char *
9287 get_symbol_type (unsigned int type)
9288 {
9289   static char buff[32];
9290
9291   switch (type)
9292     {
9293     case STT_NOTYPE:    return "NOTYPE";
9294     case STT_OBJECT:    return "OBJECT";
9295     case STT_FUNC:      return "FUNC";
9296     case STT_SECTION:   return "SECTION";
9297     case STT_FILE:      return "FILE";
9298     case STT_COMMON:    return "COMMON";
9299     case STT_TLS:       return "TLS";
9300     case STT_RELC:      return "RELC";
9301     case STT_SRELC:     return "SRELC";
9302     default:
9303       if (type >= STT_LOPROC && type <= STT_HIPROC)
9304         {
9305           if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
9306             return "THUMB_FUNC";
9307
9308           if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
9309             return "REGISTER";
9310
9311           if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
9312             return "PARISC_MILLI";
9313
9314           snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
9315         }
9316       else if (type >= STT_LOOS && type <= STT_HIOS)
9317         {
9318           if (elf_header.e_machine == EM_PARISC)
9319             {
9320               if (type == STT_HP_OPAQUE)
9321                 return "HP_OPAQUE";
9322               if (type == STT_HP_STUB)
9323                 return "HP_STUB";
9324             }
9325
9326           if (type == STT_GNU_IFUNC
9327               && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
9328                   || elf_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD
9329                   /* GNU is still using the default value 0.  */
9330                   || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
9331             return "IFUNC";
9332
9333           snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
9334         }
9335       else
9336         snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
9337       return buff;
9338     }
9339 }
9340
9341 static const char *
9342 get_symbol_visibility (unsigned int visibility)
9343 {
9344   switch (visibility)
9345     {
9346     case STV_DEFAULT:   return "DEFAULT";
9347     case STV_INTERNAL:  return "INTERNAL";
9348     case STV_HIDDEN:    return "HIDDEN";
9349     case STV_PROTECTED: return "PROTECTED";
9350     default: abort ();
9351     }
9352 }
9353
9354 static const char *
9355 get_mips_symbol_other (unsigned int other)
9356 {
9357   switch (other)
9358     {
9359     case STO_OPTIONAL:
9360       return "OPTIONAL";
9361     case STO_MIPS_PLT:
9362       return "MIPS PLT";
9363     case STO_MIPS_PIC:
9364       return "MIPS PIC";
9365     case STO_MICROMIPS:
9366       return "MICROMIPS";
9367     case STO_MICROMIPS | STO_MIPS_PIC:
9368       return "MICROMIPS, MIPS PIC";
9369     case STO_MIPS16:
9370       return "MIPS16";
9371     default:
9372       return NULL;
9373     }
9374 }
9375
9376 static const char *
9377 get_ia64_symbol_other (unsigned int other)
9378 {
9379   if (is_ia64_vms ())
9380     {
9381       static char res[32];
9382
9383       res[0] = 0;
9384
9385       /* Function types is for images and .STB files only.  */
9386       switch (elf_header.e_type)
9387         {
9388         case ET_DYN:
9389         case ET_EXEC:
9390           switch (VMS_ST_FUNC_TYPE (other))
9391             {
9392             case VMS_SFT_CODE_ADDR:
9393               strcat (res, " CA");
9394               break;
9395             case VMS_SFT_SYMV_IDX:
9396               strcat (res, " VEC");
9397               break;
9398             case VMS_SFT_FD:
9399               strcat (res, " FD");
9400               break;
9401             case VMS_SFT_RESERVE:
9402               strcat (res, " RSV");
9403               break;
9404             default:
9405               abort ();
9406             }
9407           break;
9408         default:
9409           break;
9410         }
9411       switch (VMS_ST_LINKAGE (other))
9412         {
9413         case VMS_STL_IGNORE:
9414           strcat (res, " IGN");
9415           break;
9416         case VMS_STL_RESERVE:
9417           strcat (res, " RSV");
9418           break;
9419         case VMS_STL_STD:
9420           strcat (res, " STD");
9421           break;
9422         case VMS_STL_LNK:
9423           strcat (res, " LNK");
9424           break;
9425         default:
9426           abort ();
9427         }
9428
9429       if (res[0] != 0)
9430         return res + 1;
9431       else
9432         return res;
9433     }
9434   return NULL;
9435 }
9436
9437 static const char *
9438 get_ppc64_symbol_other (unsigned int other)
9439 {
9440   if (PPC64_LOCAL_ENTRY_OFFSET (other) != 0)
9441     {
9442       static char buf[32];
9443       snprintf (buf, sizeof buf, _("<localentry>: %d"),
9444                 PPC64_LOCAL_ENTRY_OFFSET (other));
9445       return buf;
9446     }
9447   return NULL;
9448 }
9449
9450 static const char *
9451 get_symbol_other (unsigned int other)
9452 {
9453   const char * result = NULL;
9454   static char buff [32];
9455
9456   if (other == 0)
9457     return "";
9458
9459   switch (elf_header.e_machine)
9460     {
9461     case EM_MIPS:
9462       result = get_mips_symbol_other (other);
9463       break;
9464     case EM_IA_64:
9465       result = get_ia64_symbol_other (other);
9466       break;
9467     case EM_PPC64:
9468       result = get_ppc64_symbol_other (other);
9469       break;
9470     default:
9471       break;
9472     }
9473
9474   if (result)
9475     return result;
9476
9477   snprintf (buff, sizeof buff, _("<other>: %x"), other);
9478   return buff;
9479 }
9480
9481 static const char *
9482 get_symbol_index_type (unsigned int type)
9483 {
9484   static char buff[32];
9485
9486   switch (type)
9487     {
9488     case SHN_UNDEF:     return "UND";
9489     case SHN_ABS:       return "ABS";
9490     case SHN_COMMON:    return "COM";
9491     default:
9492       if (type == SHN_IA_64_ANSI_COMMON
9493           && elf_header.e_machine == EM_IA_64
9494           && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
9495         return "ANSI_COM";
9496       else if ((elf_header.e_machine == EM_X86_64
9497                 || elf_header.e_machine == EM_L1OM
9498                 || elf_header.e_machine == EM_K1OM)
9499                && type == SHN_X86_64_LCOMMON)
9500         return "LARGE_COM";
9501       else if ((type == SHN_MIPS_SCOMMON
9502                 && elf_header.e_machine == EM_MIPS)
9503                || (type == SHN_TIC6X_SCOMMON
9504                    && elf_header.e_machine == EM_TI_C6000))
9505         return "SCOM";
9506       else if (type == SHN_MIPS_SUNDEFINED
9507                && elf_header.e_machine == EM_MIPS)
9508         return "SUND";
9509       else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
9510         sprintf (buff, "PRC[0x%04x]", type & 0xffff);
9511       else if (type >= SHN_LOOS && type <= SHN_HIOS)
9512         sprintf (buff, "OS [0x%04x]", type & 0xffff);
9513       else if (type >= SHN_LORESERVE)
9514         sprintf (buff, "RSV[0x%04x]", type & 0xffff);
9515       else if (type >= elf_header.e_shnum)
9516         sprintf (buff, "bad section index[%3d]", type);
9517       else
9518         sprintf (buff, "%3d", type);
9519       break;
9520     }
9521
9522   return buff;
9523 }
9524
9525 static bfd_vma *
9526 get_dynamic_data (FILE * file, unsigned int number, unsigned int ent_size)
9527 {
9528   unsigned char * e_data;
9529   bfd_vma * i_data;
9530
9531   e_data = (unsigned char *) cmalloc (number, ent_size);
9532
9533   if (e_data == NULL)
9534     {
9535       error (_("Out of memory\n"));
9536       return NULL;
9537     }
9538
9539   if (fread (e_data, ent_size, number, file) != number)
9540     {
9541       error (_("Unable to read in dynamic data\n"));
9542       return NULL;
9543     }
9544
9545   i_data = (bfd_vma *) cmalloc (number, sizeof (*i_data));
9546
9547   if (i_data == NULL)
9548     {
9549       error (_("Out of memory\n"));
9550       free (e_data);
9551       return NULL;
9552     }
9553
9554   while (number--)
9555     i_data[number] = byte_get (e_data + number * ent_size, ent_size);
9556
9557   free (e_data);
9558
9559   return i_data;
9560 }
9561
9562 static void
9563 print_dynamic_symbol (bfd_vma si, unsigned long hn)
9564 {
9565   Elf_Internal_Sym * psym;
9566   int n;
9567
9568   psym = dynamic_symbols + si;
9569
9570   n = print_vma (si, DEC_5);
9571   if (n < 5)
9572     fputs (&"     "[n], stdout);
9573   printf (" %3lu: ", hn);
9574   print_vma (psym->st_value, LONG_HEX);
9575   putchar (' ');
9576   print_vma (psym->st_size, DEC_5);
9577
9578   printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
9579   printf (" %-6s",  get_symbol_binding (ELF_ST_BIND (psym->st_info)));
9580   printf (" %-7s",  get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
9581   /* Check to see if any other bits in the st_other field are set.
9582      Note - displaying this information disrupts the layout of the
9583      table being generated, but for the moment this case is very
9584      rare.  */
9585   if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
9586     printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
9587   printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
9588   if (VALID_DYNAMIC_NAME (psym->st_name))
9589     print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
9590   else
9591     printf (_(" <corrupt: %14ld>"), psym->st_name);
9592   putchar ('\n');
9593 }
9594
9595 /* Dump the symbol table.  */
9596 static int
9597 process_symbol_table (FILE * file)
9598 {
9599   Elf_Internal_Shdr * section;
9600   bfd_vma nbuckets = 0;
9601   bfd_vma nchains = 0;
9602   bfd_vma * buckets = NULL;
9603   bfd_vma * chains = NULL;
9604   bfd_vma ngnubuckets = 0;
9605   bfd_vma * gnubuckets = NULL;
9606   bfd_vma * gnuchains = NULL;
9607   bfd_vma gnusymidx = 0;
9608
9609   if (!do_syms && !do_dyn_syms && !do_histogram)
9610     return 1;
9611
9612   if (dynamic_info[DT_HASH]
9613       && (do_histogram
9614           || (do_using_dynamic
9615               && !do_dyn_syms
9616               && dynamic_strings != NULL)))
9617     {
9618       unsigned char nb[8];
9619       unsigned char nc[8];
9620       int hash_ent_size = 4;
9621
9622       if ((elf_header.e_machine == EM_ALPHA
9623            || elf_header.e_machine == EM_S390
9624            || elf_header.e_machine == EM_S390_OLD)
9625           && elf_header.e_ident[EI_CLASS] == ELFCLASS64)
9626         hash_ent_size = 8;
9627
9628       if (fseek (file,
9629                  (archive_file_offset
9630                   + offset_from_vma (file, dynamic_info[DT_HASH],
9631                                      sizeof nb + sizeof nc)),
9632                  SEEK_SET))
9633         {
9634           error (_("Unable to seek to start of dynamic information\n"));
9635           goto no_hash;
9636         }
9637
9638       if (fread (nb, hash_ent_size, 1, file) != 1)
9639         {
9640           error (_("Failed to read in number of buckets\n"));
9641           goto no_hash;
9642         }
9643
9644       if (fread (nc, hash_ent_size, 1, file) != 1)
9645         {
9646           error (_("Failed to read in number of chains\n"));
9647           goto no_hash;
9648         }
9649
9650       nbuckets = byte_get (nb, hash_ent_size);
9651       nchains  = byte_get (nc, hash_ent_size);
9652
9653       buckets = get_dynamic_data (file, nbuckets, hash_ent_size);
9654       chains  = get_dynamic_data (file, nchains, hash_ent_size);
9655
9656     no_hash:
9657       if (buckets == NULL || chains == NULL)
9658         {
9659           if (do_using_dynamic)
9660             return 0;
9661           free (buckets);
9662           free (chains);
9663           buckets = NULL;
9664           chains = NULL;
9665           nbuckets = 0;
9666           nchains = 0;
9667         }
9668     }
9669
9670   if (dynamic_info_DT_GNU_HASH
9671       && (do_histogram
9672           || (do_using_dynamic
9673               && !do_dyn_syms
9674               && dynamic_strings != NULL)))
9675     {
9676       unsigned char nb[16];
9677       bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
9678       bfd_vma buckets_vma;
9679
9680       if (fseek (file,
9681                  (archive_file_offset
9682                   + offset_from_vma (file, dynamic_info_DT_GNU_HASH,
9683                                      sizeof nb)),
9684                  SEEK_SET))
9685         {
9686           error (_("Unable to seek to start of dynamic information\n"));
9687           goto no_gnu_hash;
9688         }
9689
9690       if (fread (nb, 16, 1, file) != 1)
9691         {
9692           error (_("Failed to read in number of buckets\n"));
9693           goto no_gnu_hash;
9694         }
9695
9696       ngnubuckets = byte_get (nb, 4);
9697       gnusymidx = byte_get (nb + 4, 4);
9698       bitmaskwords = byte_get (nb + 8, 4);
9699       buckets_vma = dynamic_info_DT_GNU_HASH + 16;
9700       if (is_32bit_elf)
9701         buckets_vma += bitmaskwords * 4;
9702       else
9703         buckets_vma += bitmaskwords * 8;
9704
9705       if (fseek (file,
9706                  (archive_file_offset
9707                   + offset_from_vma (file, buckets_vma, 4)),
9708                  SEEK_SET))
9709         {
9710           error (_("Unable to seek to start of dynamic information\n"));
9711           goto no_gnu_hash;
9712         }
9713
9714       gnubuckets = get_dynamic_data (file, ngnubuckets, 4);
9715
9716       if (gnubuckets == NULL)
9717         goto no_gnu_hash;
9718
9719       for (i = 0; i < ngnubuckets; i++)
9720         if (gnubuckets[i] != 0)
9721           {
9722             if (gnubuckets[i] < gnusymidx)
9723               return 0;
9724
9725             if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
9726               maxchain = gnubuckets[i];
9727           }
9728
9729       if (maxchain == 0xffffffff)
9730         goto no_gnu_hash;
9731
9732       maxchain -= gnusymidx;
9733
9734       if (fseek (file,
9735                  (archive_file_offset
9736                   + offset_from_vma (file, buckets_vma
9737                                            + 4 * (ngnubuckets + maxchain), 4)),
9738                  SEEK_SET))
9739         {
9740           error (_("Unable to seek to start of dynamic information\n"));
9741           goto no_gnu_hash;
9742         }
9743
9744       do
9745         {
9746           if (fread (nb, 4, 1, file) != 1)
9747             {
9748               error (_("Failed to determine last chain length\n"));
9749               goto no_gnu_hash;
9750             }
9751
9752           if (maxchain + 1 == 0)
9753             goto no_gnu_hash;
9754
9755           ++maxchain;
9756         }
9757       while ((byte_get (nb, 4) & 1) == 0);
9758
9759       if (fseek (file,
9760                  (archive_file_offset
9761                   + offset_from_vma (file, buckets_vma + 4 * ngnubuckets, 4)),
9762                  SEEK_SET))
9763         {
9764           error (_("Unable to seek to start of dynamic information\n"));
9765           goto no_gnu_hash;
9766         }
9767
9768       gnuchains = get_dynamic_data (file, maxchain, 4);
9769
9770     no_gnu_hash:
9771       if (gnuchains == NULL)
9772         {
9773           free (gnubuckets);
9774           gnubuckets = NULL;
9775           ngnubuckets = 0;
9776           if (do_using_dynamic)
9777             return 0;
9778         }
9779     }
9780
9781   if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
9782       && do_syms
9783       && do_using_dynamic
9784       && dynamic_strings != NULL)
9785     {
9786       unsigned long hn;
9787
9788       if (dynamic_info[DT_HASH])
9789         {
9790           bfd_vma si;
9791
9792           printf (_("\nSymbol table for image:\n"));
9793           if (is_32bit_elf)
9794             printf (_("  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"));
9795           else
9796             printf (_("  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"));
9797
9798           for (hn = 0; hn < nbuckets; hn++)
9799             {
9800               if (! buckets[hn])
9801                 continue;
9802
9803               for (si = buckets[hn]; si < nchains && si > 0; si = chains[si])
9804                 print_dynamic_symbol (si, hn);
9805             }
9806         }
9807
9808       if (dynamic_info_DT_GNU_HASH)
9809         {
9810           printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
9811           if (is_32bit_elf)
9812             printf (_("  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"));
9813           else
9814             printf (_("  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"));
9815
9816           for (hn = 0; hn < ngnubuckets; ++hn)
9817             if (gnubuckets[hn] != 0)
9818               {
9819                 bfd_vma si = gnubuckets[hn];
9820                 bfd_vma off = si - gnusymidx;
9821
9822                 do
9823                   {
9824                     print_dynamic_symbol (si, hn);
9825                     si++;
9826                   }
9827                 while ((gnuchains[off++] & 1) == 0);
9828               }
9829         }
9830     }
9831   else if (do_dyn_syms || (do_syms && !do_using_dynamic))
9832     {
9833       unsigned int i;
9834
9835       for (i = 0, section = section_headers;
9836            i < elf_header.e_shnum;
9837            i++, section++)
9838         {
9839           unsigned int si;
9840           char * strtab = NULL;
9841           unsigned long int strtab_size = 0;
9842           Elf_Internal_Sym * symtab;
9843           Elf_Internal_Sym * psym;
9844           unsigned long num_syms;
9845
9846           if ((section->sh_type != SHT_SYMTAB
9847                && section->sh_type != SHT_DYNSYM)
9848               || (!do_syms
9849                   && section->sh_type == SHT_SYMTAB))
9850             continue;
9851
9852           if (section->sh_entsize == 0)
9853             {
9854               printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
9855                       SECTION_NAME (section));
9856               continue;
9857             }
9858
9859           printf (_("\nSymbol table '%s' contains %lu entries:\n"),
9860                   SECTION_NAME (section),
9861                   (unsigned long) (section->sh_size / section->sh_entsize));
9862
9863           if (is_32bit_elf)
9864             printf (_("   Num:    Value  Size Type    Bind   Vis      Ndx Name\n"));
9865           else
9866             printf (_("   Num:    Value          Size Type    Bind   Vis      Ndx Name\n"));
9867
9868           symtab = GET_ELF_SYMBOLS (file, section, & num_syms);
9869           if (symtab == NULL)
9870             continue;
9871
9872           if (section->sh_link == elf_header.e_shstrndx)
9873             {
9874               strtab = string_table;
9875               strtab_size = string_table_length;
9876             }
9877           else if (section->sh_link < elf_header.e_shnum)
9878             {
9879               Elf_Internal_Shdr * string_sec;
9880
9881               string_sec = section_headers + section->sh_link;
9882
9883               strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
9884                                           1, string_sec->sh_size,
9885                                           _("string table"));
9886               strtab_size = strtab != NULL ? string_sec->sh_size : 0;
9887             }
9888
9889           for (si = 0, psym = symtab; si < num_syms; si++, psym++)
9890             {
9891               printf ("%6d: ", si);
9892               print_vma (psym->st_value, LONG_HEX);
9893               putchar (' ');
9894               print_vma (psym->st_size, DEC_5);
9895               printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
9896               printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
9897               printf (" %-7s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
9898               /* Check to see if any other bits in the st_other field are set.
9899                  Note - displaying this information disrupts the layout of the
9900                  table being generated, but for the moment this case is very rare.  */
9901               if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
9902                 printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
9903               printf (" %4s ", get_symbol_index_type (psym->st_shndx));
9904               print_symbol (25, psym->st_name < strtab_size
9905                             ? strtab + psym->st_name : _("<corrupt>"));
9906
9907               if (section->sh_type == SHT_DYNSYM
9908                   && version_info[DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
9909                 {
9910                   unsigned char data[2];
9911                   unsigned short vers_data;
9912                   unsigned long offset;
9913                   int is_nobits;
9914                   int check_def;
9915
9916                   offset = offset_from_vma
9917                     (file, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
9918                      sizeof data + si * sizeof (vers_data));
9919
9920                   if (get_data (&data, file, offset + si * sizeof (vers_data),
9921                                 sizeof (data), 1, _("version data")) == NULL)
9922                     break;
9923
9924                   vers_data = byte_get (data, 2);
9925
9926                   is_nobits = (psym->st_shndx < elf_header.e_shnum
9927                                && section_headers[psym->st_shndx].sh_type
9928                                   == SHT_NOBITS);
9929
9930                   check_def = (psym->st_shndx != SHN_UNDEF);
9931
9932                   if ((vers_data & VERSYM_HIDDEN) || vers_data > 1)
9933                     {
9934                       if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)]
9935                           && (is_nobits || ! check_def))
9936                         {
9937                           Elf_External_Verneed evn;
9938                           Elf_Internal_Verneed ivn;
9939                           Elf_Internal_Vernaux ivna;
9940
9941                           /* We must test both.  */
9942                           offset = offset_from_vma
9943                             (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
9944                              sizeof evn);
9945
9946                           do
9947                             {
9948                               unsigned long vna_off;
9949
9950                               if (get_data (&evn, file, offset, sizeof (evn), 1,
9951                                             _("version need")) == NULL)
9952                                 {
9953                                   ivna.vna_next = 0;
9954                                   ivna.vna_other = 0;
9955                                   ivna.vna_name = 0;
9956                                   break;
9957                                 }
9958
9959                               ivn.vn_aux  = BYTE_GET (evn.vn_aux);
9960                               ivn.vn_next = BYTE_GET (evn.vn_next);
9961
9962                               vna_off = offset + ivn.vn_aux;
9963
9964                               do
9965                                 {
9966                                   Elf_External_Vernaux evna;
9967
9968                                   if (get_data (&evna, file, vna_off,
9969                                                 sizeof (evna), 1,
9970                                                 _("version need aux (3)")) == NULL)
9971                                     {
9972                                       ivna.vna_next = 0;
9973                                       ivna.vna_other = 0;
9974                                       ivna.vna_name = 0;
9975                                     }
9976                                   else
9977                                     {
9978                                       ivna.vna_other = BYTE_GET (evna.vna_other);
9979                                       ivna.vna_next  = BYTE_GET (evna.vna_next);
9980                                       ivna.vna_name  = BYTE_GET (evna.vna_name);
9981                                     }
9982
9983                                   vna_off += ivna.vna_next;
9984                                 }
9985                               while (ivna.vna_other != vers_data
9986                                      && ivna.vna_next != 0);
9987
9988                               if (ivna.vna_other == vers_data)
9989                                 break;
9990
9991                               offset += ivn.vn_next;
9992                             }
9993                           while (ivn.vn_next != 0);
9994
9995                           if (ivna.vna_other == vers_data)
9996                             {
9997                               printf ("@%s (%d)",
9998                                       ivna.vna_name < strtab_size
9999                                       ? strtab + ivna.vna_name : _("<corrupt>"),
10000                                       ivna.vna_other);
10001                               check_def = 0;
10002                             }
10003                           else if (! is_nobits)
10004                             error (_("bad dynamic symbol\n"));
10005                           else
10006                             check_def = 1;
10007                         }
10008
10009                       if (check_def)
10010                         {
10011                           if (vers_data != 0x8001
10012                               && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10013                             {
10014                               Elf_Internal_Verdef ivd;
10015                               Elf_Internal_Verdaux ivda;
10016                               Elf_External_Verdaux evda;
10017                               unsigned long off;
10018
10019                               off = offset_from_vma
10020                                 (file,
10021                                  version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10022                                  sizeof (Elf_External_Verdef));
10023
10024                               do
10025                                 {
10026                                   Elf_External_Verdef evd;
10027
10028                                   if (get_data (&evd, file, off, sizeof (evd),
10029                                                 1, _("version def")) == NULL)
10030                                     {
10031                                       ivd.vd_ndx = 0;
10032                                       ivd.vd_aux = 0;
10033                                       ivd.vd_next = 0;
10034                                     }
10035                                   else
10036                                     {
10037                                       ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
10038                                       ivd.vd_aux = BYTE_GET (evd.vd_aux);
10039                                       ivd.vd_next = BYTE_GET (evd.vd_next);
10040                                     }
10041
10042                                   off += ivd.vd_next;
10043                                 }
10044                               while (ivd.vd_ndx != (vers_data & VERSYM_VERSION)
10045                                      && ivd.vd_next != 0);
10046
10047                               off -= ivd.vd_next;
10048                               off += ivd.vd_aux;
10049
10050                               if (get_data (&evda, file, off, sizeof (evda),
10051                                             1, _("version def aux")) == NULL)
10052                                 break;
10053
10054                               ivda.vda_name = BYTE_GET (evda.vda_name);
10055
10056                               if (psym->st_name != ivda.vda_name)
10057                                 printf ((vers_data & VERSYM_HIDDEN)
10058                                         ? "@%s" : "@@%s",
10059                                         ivda.vda_name < strtab_size
10060                                         ? strtab + ivda.vda_name : _("<corrupt>"));
10061                             }
10062                         }
10063                     }
10064                 }
10065
10066               putchar ('\n');
10067             }
10068
10069           free (symtab);
10070           if (strtab != string_table)
10071             free (strtab);
10072         }
10073     }
10074   else if (do_syms)
10075     printf
10076       (_("\nDynamic symbol information is not available for displaying symbols.\n"));
10077
10078   if (do_histogram && buckets != NULL)
10079     {
10080       unsigned long * lengths;
10081       unsigned long * counts;
10082       unsigned long hn;
10083       bfd_vma si;
10084       unsigned long maxlength = 0;
10085       unsigned long nzero_counts = 0;
10086       unsigned long nsyms = 0;
10087
10088       printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
10089               (unsigned long) nbuckets);
10090       printf (_(" Length  Number     %% of total  Coverage\n"));
10091
10092       lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
10093       if (lengths == NULL)
10094         {
10095           error (_("Out of memory\n"));
10096           return 0;
10097         }
10098       for (hn = 0; hn < nbuckets; ++hn)
10099         {
10100           for (si = buckets[hn]; si > 0 && si < nchains; si = chains[si])
10101             {
10102               ++nsyms;
10103               if (maxlength < ++lengths[hn])
10104                 ++maxlength;
10105             }
10106         }
10107
10108       counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
10109       if (counts == NULL)
10110         {
10111           free (lengths);
10112           error (_("Out of memory\n"));
10113           return 0;
10114         }
10115
10116       for (hn = 0; hn < nbuckets; ++hn)
10117         ++counts[lengths[hn]];
10118
10119       if (nbuckets > 0)
10120         {
10121           unsigned long i;
10122           printf ("      0  %-10lu (%5.1f%%)\n",
10123                   counts[0], (counts[0] * 100.0) / nbuckets);
10124           for (i = 1; i <= maxlength; ++i)
10125             {
10126               nzero_counts += counts[i] * i;
10127               printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
10128                       i, counts[i], (counts[i] * 100.0) / nbuckets,
10129                       (nzero_counts * 100.0) / nsyms);
10130             }
10131         }
10132
10133       free (counts);
10134       free (lengths);
10135     }
10136
10137   if (buckets != NULL)
10138     {
10139       free (buckets);
10140       free (chains);
10141     }
10142
10143   if (do_histogram && gnubuckets != NULL)
10144     {
10145       unsigned long * lengths;
10146       unsigned long * counts;
10147       unsigned long hn;
10148       unsigned long maxlength = 0;
10149       unsigned long nzero_counts = 0;
10150       unsigned long nsyms = 0;
10151
10152       lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
10153       if (lengths == NULL)
10154         {
10155           error (_("Out of memory\n"));
10156           return 0;
10157         }
10158
10159       printf (_("\nHistogram for `.gnu.hash' bucket list length (total of %lu buckets):\n"),
10160               (unsigned long) ngnubuckets);
10161       printf (_(" Length  Number     %% of total  Coverage\n"));
10162
10163       for (hn = 0; hn < ngnubuckets; ++hn)
10164         if (gnubuckets[hn] != 0)
10165           {
10166             bfd_vma off, length = 1;
10167
10168             for (off = gnubuckets[hn] - gnusymidx;
10169                  (gnuchains[off] & 1) == 0; ++off)
10170               ++length;
10171             lengths[hn] = length;
10172             if (length > maxlength)
10173               maxlength = length;
10174             nsyms += length;
10175           }
10176
10177       counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
10178       if (counts == NULL)
10179         {
10180           free (lengths);
10181           error (_("Out of memory\n"));
10182           return 0;
10183         }
10184
10185       for (hn = 0; hn < ngnubuckets; ++hn)
10186         ++counts[lengths[hn]];
10187
10188       if (ngnubuckets > 0)
10189         {
10190           unsigned long j;
10191           printf ("      0  %-10lu (%5.1f%%)\n",
10192                   counts[0], (counts[0] * 100.0) / ngnubuckets);
10193           for (j = 1; j <= maxlength; ++j)
10194             {
10195               nzero_counts += counts[j] * j;
10196               printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
10197                       j, counts[j], (counts[j] * 100.0) / ngnubuckets,
10198                       (nzero_counts * 100.0) / nsyms);
10199             }
10200         }
10201
10202       free (counts);
10203       free (lengths);
10204       free (gnubuckets);
10205       free (gnuchains);
10206     }
10207
10208   return 1;
10209 }
10210
10211 static int
10212 process_syminfo (FILE * file ATTRIBUTE_UNUSED)
10213 {
10214   unsigned int i;
10215
10216   if (dynamic_syminfo == NULL
10217       || !do_dynamic)
10218     /* No syminfo, this is ok.  */
10219     return 1;
10220
10221   /* There better should be a dynamic symbol section.  */
10222   if (dynamic_symbols == NULL || dynamic_strings == NULL)
10223     return 0;
10224
10225   if (dynamic_addr)
10226     printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
10227             dynamic_syminfo_offset, dynamic_syminfo_nent);
10228
10229   printf (_(" Num: Name                           BoundTo     Flags\n"));
10230   for (i = 0; i < dynamic_syminfo_nent; ++i)
10231     {
10232       unsigned short int flags = dynamic_syminfo[i].si_flags;
10233
10234       printf ("%4d: ", i);
10235       if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
10236         print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
10237       else
10238         printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
10239       putchar (' ');
10240
10241       switch (dynamic_syminfo[i].si_boundto)
10242         {
10243         case SYMINFO_BT_SELF:
10244           fputs ("SELF       ", stdout);
10245           break;
10246         case SYMINFO_BT_PARENT:
10247           fputs ("PARENT     ", stdout);
10248           break;
10249         default:
10250           if (dynamic_syminfo[i].si_boundto > 0
10251               && dynamic_syminfo[i].si_boundto < dynamic_nent
10252               && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
10253             {
10254               print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
10255               putchar (' ' );
10256             }
10257           else
10258             printf ("%-10d ", dynamic_syminfo[i].si_boundto);
10259           break;
10260         }
10261
10262       if (flags & SYMINFO_FLG_DIRECT)
10263         printf (" DIRECT");
10264       if (flags & SYMINFO_FLG_PASSTHRU)
10265         printf (" PASSTHRU");
10266       if (flags & SYMINFO_FLG_COPY)
10267         printf (" COPY");
10268       if (flags & SYMINFO_FLG_LAZYLOAD)
10269         printf (" LAZYLOAD");
10270
10271       puts ("");
10272     }
10273
10274   return 1;
10275 }
10276
10277 /* Check to see if the given reloc needs to be handled in a target specific
10278    manner.  If so then process the reloc and return TRUE otherwise return
10279    FALSE.  */
10280
10281 static bfd_boolean
10282 target_specific_reloc_handling (Elf_Internal_Rela * reloc,
10283                                 unsigned char *     start,
10284                                 Elf_Internal_Sym *  symtab)
10285 {
10286   unsigned int reloc_type = get_reloc_type (reloc->r_info);
10287
10288   switch (elf_header.e_machine)
10289     {
10290     case EM_MSP430:
10291     case EM_MSP430_OLD:
10292       {
10293         static Elf_Internal_Sym * saved_sym = NULL;
10294
10295         switch (reloc_type)
10296           {
10297           case 10: /* R_MSP430_SYM_DIFF */
10298             if (uses_msp430x_relocs ())
10299               break;
10300           case 21: /* R_MSP430X_SYM_DIFF */
10301             saved_sym = symtab + get_reloc_symindex (reloc->r_info);
10302             return TRUE;
10303
10304           case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
10305           case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
10306             goto handle_sym_diff;
10307
10308           case 5: /* R_MSP430_16_BYTE */
10309           case 9: /* R_MSP430_8 */
10310             if (uses_msp430x_relocs ())
10311               break;
10312             goto handle_sym_diff;
10313
10314           case 2: /* R_MSP430_ABS16 */
10315           case 15: /* R_MSP430X_ABS16 */
10316             if (! uses_msp430x_relocs ())
10317               break;
10318             goto handle_sym_diff;
10319
10320           handle_sym_diff:
10321             if (saved_sym != NULL)
10322               {
10323                 bfd_vma value;
10324
10325                 value = reloc->r_addend
10326                   + (symtab[get_reloc_symindex (reloc->r_info)].st_value
10327                      - saved_sym->st_value);
10328
10329                 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
10330
10331                 saved_sym = NULL;
10332                 return TRUE;
10333               }
10334             break;
10335
10336           default:
10337             if (saved_sym != NULL)
10338               error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc"));
10339             break;
10340           }
10341         break;
10342       }
10343
10344     case EM_MN10300:
10345     case EM_CYGNUS_MN10300:
10346       {
10347         static Elf_Internal_Sym * saved_sym = NULL;
10348
10349         switch (reloc_type)
10350           {
10351           case 34: /* R_MN10300_ALIGN */
10352             return TRUE;
10353           case 33: /* R_MN10300_SYM_DIFF */
10354             saved_sym = symtab + get_reloc_symindex (reloc->r_info);
10355             return TRUE;
10356           case 1: /* R_MN10300_32 */
10357           case 2: /* R_MN10300_16 */
10358             if (saved_sym != NULL)
10359               {
10360                 bfd_vma value;
10361
10362                 value = reloc->r_addend
10363                   + (symtab[get_reloc_symindex (reloc->r_info)].st_value
10364                      - saved_sym->st_value);
10365
10366                 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
10367
10368                 saved_sym = NULL;
10369                 return TRUE;
10370               }
10371             break;
10372           default:
10373             if (saved_sym != NULL)
10374               error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc"));
10375             break;
10376           }
10377         break;
10378       }
10379     }
10380
10381   return FALSE;
10382 }
10383
10384 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
10385    DWARF debug sections.  This is a target specific test.  Note - we do not
10386    go through the whole including-target-headers-multiple-times route, (as
10387    we have already done with <elf/h8.h>) because this would become very
10388    messy and even then this function would have to contain target specific
10389    information (the names of the relocs instead of their numeric values).
10390    FIXME: This is not the correct way to solve this problem.  The proper way
10391    is to have target specific reloc sizing and typing functions created by
10392    the reloc-macros.h header, in the same way that it already creates the
10393    reloc naming functions.  */
10394
10395 static bfd_boolean
10396 is_32bit_abs_reloc (unsigned int reloc_type)
10397 {
10398   switch (elf_header.e_machine)
10399     {
10400     case EM_386:
10401     case EM_486:
10402       return reloc_type == 1; /* R_386_32.  */
10403     case EM_68K:
10404       return reloc_type == 1; /* R_68K_32.  */
10405     case EM_860:
10406       return reloc_type == 1; /* R_860_32.  */
10407     case EM_960:
10408       return reloc_type == 2; /* R_960_32.  */
10409     case EM_AARCH64:
10410       return reloc_type == 258; /* R_AARCH64_ABS32 */
10411     case EM_ALPHA:
10412       return reloc_type == 1; /* R_ALPHA_REFLONG.  */
10413     case EM_ARC:
10414       return reloc_type == 1; /* R_ARC_32.  */
10415     case EM_ARM:
10416       return reloc_type == 2; /* R_ARM_ABS32 */
10417     case EM_AVR_OLD:
10418     case EM_AVR:
10419       return reloc_type == 1;
10420     case EM_ADAPTEVA_EPIPHANY:
10421       return reloc_type == 3;
10422     case EM_BLACKFIN:
10423       return reloc_type == 0x12; /* R_byte4_data.  */
10424     case EM_CRIS:
10425       return reloc_type == 3; /* R_CRIS_32.  */
10426     case EM_CR16:
10427       return reloc_type == 3; /* R_CR16_NUM32.  */
10428     case EM_CRX:
10429       return reloc_type == 15; /* R_CRX_NUM32.  */
10430     case EM_CYGNUS_FRV:
10431       return reloc_type == 1;
10432     case EM_CYGNUS_D10V:
10433     case EM_D10V:
10434       return reloc_type == 6; /* R_D10V_32.  */
10435     case EM_CYGNUS_D30V:
10436     case EM_D30V:
10437       return reloc_type == 12; /* R_D30V_32_NORMAL.  */
10438     case EM_DLX:
10439       return reloc_type == 3; /* R_DLX_RELOC_32.  */
10440     case EM_CYGNUS_FR30:
10441     case EM_FR30:
10442       return reloc_type == 3; /* R_FR30_32.  */
10443     case EM_H8S:
10444     case EM_H8_300:
10445     case EM_H8_300H:
10446       return reloc_type == 1; /* R_H8_DIR32.  */
10447     case EM_IA_64:
10448       return reloc_type == 0x65; /* R_IA64_SECREL32LSB.  */
10449     case EM_IP2K_OLD:
10450     case EM_IP2K:
10451       return reloc_type == 2; /* R_IP2K_32.  */
10452     case EM_IQ2000:
10453       return reloc_type == 2; /* R_IQ2000_32.  */
10454     case EM_LATTICEMICO32:
10455       return reloc_type == 3; /* R_LM32_32.  */
10456     case EM_M32C_OLD:
10457     case EM_M32C:
10458       return reloc_type == 3; /* R_M32C_32.  */
10459     case EM_M32R:
10460       return reloc_type == 34; /* R_M32R_32_RELA.  */
10461     case EM_MCORE:
10462       return reloc_type == 1; /* R_MCORE_ADDR32.  */
10463     case EM_CYGNUS_MEP:
10464       return reloc_type == 4; /* R_MEP_32.  */
10465     case EM_METAG:
10466       return reloc_type == 2; /* R_METAG_ADDR32.  */
10467     case EM_MICROBLAZE:
10468       return reloc_type == 1; /* R_MICROBLAZE_32.  */
10469     case EM_MIPS:
10470       return reloc_type == 2; /* R_MIPS_32.  */
10471     case EM_MMIX:
10472       return reloc_type == 4; /* R_MMIX_32.  */
10473     case EM_CYGNUS_MN10200:
10474     case EM_MN10200:
10475       return reloc_type == 1; /* R_MN10200_32.  */
10476     case EM_CYGNUS_MN10300:
10477     case EM_MN10300:
10478       return reloc_type == 1; /* R_MN10300_32.  */
10479     case EM_MOXIE:
10480       return reloc_type == 1; /* R_MOXIE_32.  */
10481     case EM_MSP430_OLD:
10482     case EM_MSP430:
10483       return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32.  */
10484     case EM_MT:
10485       return reloc_type == 2; /* R_MT_32.  */
10486     case EM_NDS32:
10487       return reloc_type == 20; /* R_NDS32_RELA.  */
10488     case EM_ALTERA_NIOS2:
10489       return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32.  */
10490     case EM_NIOS32:
10491       return reloc_type == 1; /* R_NIOS_32.  */
10492     case EM_OR1K:
10493       return reloc_type == 1; /* R_OR1K_32.  */
10494     case EM_PARISC:
10495       return (reloc_type == 1 /* R_PARISC_DIR32.  */
10496               || reloc_type == 41); /* R_PARISC_SECREL32.  */
10497     case EM_PJ:
10498     case EM_PJ_OLD:
10499       return reloc_type == 1; /* R_PJ_DATA_DIR32.  */
10500     case EM_PPC64:
10501       return reloc_type == 1; /* R_PPC64_ADDR32.  */
10502     case EM_PPC:
10503       return reloc_type == 1; /* R_PPC_ADDR32.  */
10504     case EM_RL78:
10505       return reloc_type == 1; /* R_RL78_DIR32.  */
10506     case EM_RX:
10507       return reloc_type == 1; /* R_RX_DIR32.  */
10508     case EM_S370:
10509       return reloc_type == 1; /* R_I370_ADDR31.  */
10510     case EM_S390_OLD:
10511     case EM_S390:
10512       return reloc_type == 4; /* R_S390_32.  */
10513     case EM_SCORE:
10514       return reloc_type == 8; /* R_SCORE_ABS32.  */
10515     case EM_SH:
10516       return reloc_type == 1; /* R_SH_DIR32.  */
10517     case EM_SPARC32PLUS:
10518     case EM_SPARCV9:
10519     case EM_SPARC:
10520       return reloc_type == 3 /* R_SPARC_32.  */
10521         || reloc_type == 23; /* R_SPARC_UA32.  */
10522     case EM_SPU:
10523       return reloc_type == 6; /* R_SPU_ADDR32 */
10524     case EM_TI_C6000:
10525       return reloc_type == 1; /* R_C6000_ABS32.  */
10526     case EM_TILEGX:
10527       return reloc_type == 2; /* R_TILEGX_32.  */
10528     case EM_TILEPRO:
10529       return reloc_type == 1; /* R_TILEPRO_32.  */
10530     case EM_CYGNUS_V850:
10531     case EM_V850:
10532       return reloc_type == 6; /* R_V850_ABS32.  */
10533     case EM_V800:
10534       return reloc_type == 0x33; /* R_V810_WORD.  */
10535     case EM_VAX:
10536       return reloc_type == 1; /* R_VAX_32.  */
10537     case EM_X86_64:
10538     case EM_L1OM:
10539     case EM_K1OM:
10540       return reloc_type == 10; /* R_X86_64_32.  */
10541     case EM_XC16X:
10542     case EM_C166:
10543       return reloc_type == 3; /* R_XC16C_ABS_32.  */
10544     case EM_XGATE:
10545       return reloc_type == 4; /* R_XGATE_32.  */
10546     case EM_XSTORMY16:
10547       return reloc_type == 1; /* R_XSTROMY16_32.  */
10548     case EM_XTENSA_OLD:
10549     case EM_XTENSA:
10550       return reloc_type == 1; /* R_XTENSA_32.  */
10551     default:
10552       error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
10553              elf_header.e_machine);
10554       abort ();
10555     }
10556 }
10557
10558 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
10559    a 32-bit pc-relative RELA relocation used in DWARF debug sections.  */
10560
10561 static bfd_boolean
10562 is_32bit_pcrel_reloc (unsigned int reloc_type)
10563 {
10564   switch (elf_header.e_machine)
10565     {
10566     case EM_386:
10567     case EM_486:
10568       return reloc_type == 2;  /* R_386_PC32.  */
10569     case EM_68K:
10570       return reloc_type == 4;  /* R_68K_PC32.  */
10571     case EM_AARCH64:
10572       return reloc_type == 261; /* R_AARCH64_PREL32 */
10573     case EM_ADAPTEVA_EPIPHANY:
10574       return reloc_type == 6;
10575     case EM_ALPHA:
10576       return reloc_type == 10; /* R_ALPHA_SREL32.  */
10577     case EM_ARM:
10578       return reloc_type == 3;  /* R_ARM_REL32 */
10579     case EM_MICROBLAZE:
10580       return reloc_type == 2;  /* R_MICROBLAZE_32_PCREL.  */
10581     case EM_OR1K:
10582       return reloc_type == 9; /* R_OR1K_32_PCREL.  */
10583     case EM_PARISC:
10584       return reloc_type == 9;  /* R_PARISC_PCREL32.  */
10585     case EM_PPC:
10586       return reloc_type == 26; /* R_PPC_REL32.  */
10587     case EM_PPC64:
10588       return reloc_type == 26; /* R_PPC64_REL32.  */
10589     case EM_S390_OLD:
10590     case EM_S390:
10591       return reloc_type == 5;  /* R_390_PC32.  */
10592     case EM_SH:
10593       return reloc_type == 2;  /* R_SH_REL32.  */
10594     case EM_SPARC32PLUS:
10595     case EM_SPARCV9:
10596     case EM_SPARC:
10597       return reloc_type == 6;  /* R_SPARC_DISP32.  */
10598     case EM_SPU:
10599       return reloc_type == 13; /* R_SPU_REL32.  */
10600     case EM_TILEGX:
10601       return reloc_type == 6; /* R_TILEGX_32_PCREL.  */
10602     case EM_TILEPRO:
10603       return reloc_type == 4; /* R_TILEPRO_32_PCREL.  */
10604     case EM_X86_64:
10605     case EM_L1OM:
10606     case EM_K1OM:
10607       return reloc_type == 2;  /* R_X86_64_PC32.  */
10608     case EM_XTENSA_OLD:
10609     case EM_XTENSA:
10610       return reloc_type == 14; /* R_XTENSA_32_PCREL.  */
10611     default:
10612       /* Do not abort or issue an error message here.  Not all targets use
10613          pc-relative 32-bit relocs in their DWARF debug information and we
10614          have already tested for target coverage in is_32bit_abs_reloc.  A
10615          more helpful warning message will be generated by apply_relocations
10616          anyway, so just return.  */
10617       return FALSE;
10618     }
10619 }
10620
10621 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
10622    a 64-bit absolute RELA relocation used in DWARF debug sections.  */
10623
10624 static bfd_boolean
10625 is_64bit_abs_reloc (unsigned int reloc_type)
10626 {
10627   switch (elf_header.e_machine)
10628     {
10629     case EM_AARCH64:
10630       return reloc_type == 257; /* R_AARCH64_ABS64.  */
10631     case EM_ALPHA:
10632       return reloc_type == 2; /* R_ALPHA_REFQUAD.  */
10633     case EM_IA_64:
10634       return reloc_type == 0x27; /* R_IA64_DIR64LSB.  */
10635     case EM_PARISC:
10636       return reloc_type == 80; /* R_PARISC_DIR64.  */
10637     case EM_PPC64:
10638       return reloc_type == 38; /* R_PPC64_ADDR64.  */
10639     case EM_SPARC32PLUS:
10640     case EM_SPARCV9:
10641     case EM_SPARC:
10642       return reloc_type == 54; /* R_SPARC_UA64.  */
10643     case EM_X86_64:
10644     case EM_L1OM:
10645     case EM_K1OM:
10646       return reloc_type == 1; /* R_X86_64_64.  */
10647     case EM_S390_OLD:
10648     case EM_S390:
10649       return reloc_type == 22;  /* R_S390_64.  */
10650     case EM_TILEGX:
10651       return reloc_type == 1; /* R_TILEGX_64.  */
10652     case EM_MIPS:
10653       return reloc_type == 18;  /* R_MIPS_64.  */
10654     default:
10655       return FALSE;
10656     }
10657 }
10658
10659 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
10660    a 64-bit pc-relative RELA relocation used in DWARF debug sections.  */
10661
10662 static bfd_boolean
10663 is_64bit_pcrel_reloc (unsigned int reloc_type)
10664 {
10665   switch (elf_header.e_machine)
10666     {
10667     case EM_AARCH64:
10668       return reloc_type == 260; /* R_AARCH64_PREL64.  */
10669     case EM_ALPHA:
10670       return reloc_type == 11; /* R_ALPHA_SREL64.  */
10671     case EM_IA_64:
10672       return reloc_type == 0x4f; /* R_IA64_PCREL64LSB.  */
10673     case EM_PARISC:
10674       return reloc_type == 72; /* R_PARISC_PCREL64.  */
10675     case EM_PPC64:
10676       return reloc_type == 44; /* R_PPC64_REL64.  */
10677     case EM_SPARC32PLUS:
10678     case EM_SPARCV9:
10679     case EM_SPARC:
10680       return reloc_type == 46; /* R_SPARC_DISP64.  */
10681     case EM_X86_64:
10682     case EM_L1OM:
10683     case EM_K1OM:
10684       return reloc_type == 24; /* R_X86_64_PC64.  */
10685     case EM_S390_OLD:
10686     case EM_S390:
10687       return reloc_type == 23;  /* R_S390_PC64.  */
10688     case EM_TILEGX:
10689       return reloc_type == 5;  /* R_TILEGX_64_PCREL.  */
10690     default:
10691       return FALSE;
10692     }
10693 }
10694
10695 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
10696    a 24-bit absolute RELA relocation used in DWARF debug sections.  */
10697
10698 static bfd_boolean
10699 is_24bit_abs_reloc (unsigned int reloc_type)
10700 {
10701   switch (elf_header.e_machine)
10702     {
10703     case EM_CYGNUS_MN10200:
10704     case EM_MN10200:
10705       return reloc_type == 4; /* R_MN10200_24.  */
10706     default:
10707       return FALSE;
10708     }
10709 }
10710
10711 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
10712    a 16-bit absolute RELA relocation used in DWARF debug sections.  */
10713
10714 static bfd_boolean
10715 is_16bit_abs_reloc (unsigned int reloc_type)
10716 {
10717   switch (elf_header.e_machine)
10718     {
10719     case EM_AVR_OLD:
10720     case EM_AVR:
10721       return reloc_type == 4; /* R_AVR_16.  */
10722     case EM_ADAPTEVA_EPIPHANY:
10723       return reloc_type == 5;
10724     case EM_CYGNUS_D10V:
10725     case EM_D10V:
10726       return reloc_type == 3; /* R_D10V_16.  */
10727     case EM_H8S:
10728     case EM_H8_300:
10729     case EM_H8_300H:
10730       return reloc_type == R_H8_DIR16;
10731     case EM_IP2K_OLD:
10732     case EM_IP2K:
10733       return reloc_type == 1; /* R_IP2K_16.  */
10734     case EM_M32C_OLD:
10735     case EM_M32C:
10736       return reloc_type == 1; /* R_M32C_16 */
10737     case EM_MSP430:
10738       if (uses_msp430x_relocs ())
10739         return reloc_type == 2; /* R_MSP430_ABS16.  */
10740     case EM_MSP430_OLD:
10741       return reloc_type == 5; /* R_MSP430_16_BYTE.  */
10742     case EM_NDS32:
10743       return reloc_type == 19; /* R_NDS32_RELA.  */
10744     case EM_ALTERA_NIOS2:
10745       return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16.  */
10746     case EM_NIOS32:
10747       return reloc_type == 9; /* R_NIOS_16.  */
10748     case EM_OR1K:
10749       return reloc_type == 2; /* R_OR1K_16.  */
10750     case EM_TI_C6000:
10751       return reloc_type == 2; /* R_C6000_ABS16.  */
10752     case EM_XC16X:
10753     case EM_C166:
10754       return reloc_type == 2; /* R_XC16C_ABS_16.  */
10755     case EM_CYGNUS_MN10200:
10756     case EM_MN10200:
10757       return reloc_type == 2; /* R_MN10200_16.  */
10758     case EM_CYGNUS_MN10300:
10759     case EM_MN10300:
10760       return reloc_type == 2; /* R_MN10300_16.  */
10761     case EM_XGATE:
10762       return reloc_type == 3; /* R_XGATE_16.  */
10763     default:
10764       return FALSE;
10765     }
10766 }
10767
10768 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
10769    relocation entries (possibly formerly used for SHT_GROUP sections).  */
10770
10771 static bfd_boolean
10772 is_none_reloc (unsigned int reloc_type)
10773 {
10774   switch (elf_header.e_machine)
10775     {
10776     case EM_68K:     /* R_68K_NONE.  */
10777     case EM_386:     /* R_386_NONE.  */
10778     case EM_SPARC32PLUS:
10779     case EM_SPARCV9:
10780     case EM_SPARC:   /* R_SPARC_NONE.  */
10781     case EM_MIPS:    /* R_MIPS_NONE.  */
10782     case EM_PARISC:  /* R_PARISC_NONE.  */
10783     case EM_ALPHA:   /* R_ALPHA_NONE.  */
10784     case EM_ADAPTEVA_EPIPHANY:
10785     case EM_PPC:     /* R_PPC_NONE.  */
10786     case EM_PPC64:   /* R_PPC64_NONE.  */
10787     case EM_ARM:     /* R_ARM_NONE.  */
10788     case EM_IA_64:   /* R_IA64_NONE.  */
10789     case EM_SH:      /* R_SH_NONE.  */
10790     case EM_S390_OLD:
10791     case EM_S390:    /* R_390_NONE.  */
10792     case EM_CRIS:    /* R_CRIS_NONE.  */
10793     case EM_X86_64:  /* R_X86_64_NONE.  */
10794     case EM_L1OM:    /* R_X86_64_NONE.  */
10795     case EM_K1OM:    /* R_X86_64_NONE.  */
10796     case EM_MN10300: /* R_MN10300_NONE.  */
10797     case EM_MOXIE:   /* R_MOXIE_NONE.  */
10798     case EM_M32R:    /* R_M32R_NONE.  */
10799     case EM_TI_C6000:/* R_C6000_NONE.  */
10800     case EM_TILEGX:  /* R_TILEGX_NONE.  */
10801     case EM_TILEPRO: /* R_TILEPRO_NONE.  */
10802     case EM_XC16X:
10803     case EM_C166:    /* R_XC16X_NONE.  */
10804     case EM_ALTERA_NIOS2: /* R_NIOS2_NONE.  */
10805     case EM_NIOS32:  /* R_NIOS_NONE.  */
10806     case EM_OR1K:    /* R_OR1K_NONE. */
10807       return reloc_type == 0;
10808     case EM_AARCH64:
10809       return reloc_type == 0 || reloc_type == 256;
10810     case EM_NDS32:
10811       return (reloc_type == 0       /* R_XTENSA_NONE.  */
10812               || reloc_type == 204  /* R_NDS32_DIFF8.  */
10813               || reloc_type == 205  /* R_NDS32_DIFF16.  */
10814               || reloc_type == 206  /* R_NDS32_DIFF32.  */
10815               || reloc_type == 207  /* R_NDS32_ULEB128.  */);
10816     case EM_XTENSA_OLD:
10817     case EM_XTENSA:
10818       return (reloc_type == 0      /* R_XTENSA_NONE.  */
10819               || reloc_type == 17  /* R_XTENSA_DIFF8.  */
10820               || reloc_type == 18  /* R_XTENSA_DIFF16.  */
10821               || reloc_type == 19  /* R_XTENSA_DIFF32.  */);
10822     case EM_METAG:
10823       return reloc_type == 3; /* R_METAG_NONE.  */
10824     }
10825   return FALSE;
10826 }
10827
10828 /* Apply relocations to a section.
10829    Note: So far support has been added only for those relocations
10830    which can be found in debug sections.
10831    FIXME: Add support for more relocations ?  */
10832
10833 static void
10834 apply_relocations (void * file,
10835                    Elf_Internal_Shdr * section,
10836                    unsigned char * start)
10837 {
10838   Elf_Internal_Shdr * relsec;
10839   unsigned char * end = start + section->sh_size;
10840
10841   if (elf_header.e_type != ET_REL)
10842     return;
10843
10844   /* Find the reloc section associated with the section.  */
10845   for (relsec = section_headers;
10846        relsec < section_headers + elf_header.e_shnum;
10847        ++relsec)
10848     {
10849       bfd_boolean is_rela;
10850       unsigned long num_relocs;
10851       Elf_Internal_Rela * relocs;
10852       Elf_Internal_Rela * rp;
10853       Elf_Internal_Shdr * symsec;
10854       Elf_Internal_Sym * symtab;
10855       unsigned long num_syms;
10856       Elf_Internal_Sym * sym;
10857
10858       if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
10859           || relsec->sh_info >= elf_header.e_shnum
10860           || section_headers + relsec->sh_info != section
10861           || relsec->sh_size == 0
10862           || relsec->sh_link >= elf_header.e_shnum)
10863         continue;
10864
10865       is_rela = relsec->sh_type == SHT_RELA;
10866
10867       if (is_rela)
10868         {
10869           if (!slurp_rela_relocs ((FILE *) file, relsec->sh_offset,
10870                                   relsec->sh_size, & relocs, & num_relocs))
10871             return;
10872         }
10873       else
10874         {
10875           if (!slurp_rel_relocs ((FILE *) file, relsec->sh_offset,
10876                                  relsec->sh_size, & relocs, & num_relocs))
10877             return;
10878         }
10879
10880       /* SH uses RELA but uses in place value instead of the addend field.  */
10881       if (elf_header.e_machine == EM_SH)
10882         is_rela = FALSE;
10883
10884       symsec = section_headers + relsec->sh_link;
10885       symtab = GET_ELF_SYMBOLS ((FILE *) file, symsec, & num_syms);
10886
10887       for (rp = relocs; rp < relocs + num_relocs; ++rp)
10888         {
10889           bfd_vma         addend;
10890           unsigned int    reloc_type;
10891           unsigned int    reloc_size;
10892           unsigned char * rloc;
10893           unsigned long   sym_index;
10894
10895           reloc_type = get_reloc_type (rp->r_info);
10896
10897           if (target_specific_reloc_handling (rp, start, symtab))
10898             continue;
10899           else if (is_none_reloc (reloc_type))
10900             continue;
10901           else if (is_32bit_abs_reloc (reloc_type)
10902                    || is_32bit_pcrel_reloc (reloc_type))
10903             reloc_size = 4;
10904           else if (is_64bit_abs_reloc (reloc_type)
10905                    || is_64bit_pcrel_reloc (reloc_type))
10906             reloc_size = 8;
10907           else if (is_24bit_abs_reloc (reloc_type))
10908             reloc_size = 3;
10909           else if (is_16bit_abs_reloc (reloc_type))
10910             reloc_size = 2;
10911           else
10912             {
10913               warn (_("unable to apply unsupported reloc type %d to section %s\n"),
10914                     reloc_type, SECTION_NAME (section));
10915               continue;
10916             }
10917
10918           rloc = start + rp->r_offset;
10919           if ((rloc + reloc_size) > end || (rloc < start))
10920             {
10921               warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
10922                     (unsigned long) rp->r_offset,
10923                     SECTION_NAME (section));
10924               continue;
10925             }
10926
10927           sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
10928           if (sym_index >= num_syms)
10929             {
10930               warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
10931                     sym_index, SECTION_NAME (section));
10932               continue;
10933             }
10934           sym = symtab + sym_index;
10935
10936           /* If the reloc has a symbol associated with it,
10937              make sure that it is of an appropriate type.
10938
10939              Relocations against symbols without type can happen.
10940              Gcc -feliminate-dwarf2-dups may generate symbols
10941              without type for debug info.
10942
10943              Icc generates relocations against function symbols
10944              instead of local labels.
10945
10946              Relocations against object symbols can happen, eg when
10947              referencing a global array.  For an example of this see
10948              the _clz.o binary in libgcc.a.  */
10949           if (sym != symtab
10950               && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
10951             {
10952               warn (_("skipping unexpected symbol type %s in %ld'th relocation in section %s\n"),
10953                     get_symbol_type (ELF_ST_TYPE (sym->st_info)),
10954                     (long int)(rp - relocs),
10955                     SECTION_NAME (relsec));
10956               continue;
10957             }
10958
10959           addend = 0;
10960           if (is_rela)
10961             addend += rp->r_addend;
10962           /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
10963              partial_inplace.  */
10964           if (!is_rela
10965               || (elf_header.e_machine == EM_XTENSA
10966                   && reloc_type == 1)
10967               || ((elf_header.e_machine == EM_PJ
10968                    || elf_header.e_machine == EM_PJ_OLD)
10969                   && reloc_type == 1)
10970               || ((elf_header.e_machine == EM_D30V
10971                    || elf_header.e_machine == EM_CYGNUS_D30V)
10972                   && reloc_type == 12))
10973             addend += byte_get (rloc, reloc_size);
10974
10975           if (is_32bit_pcrel_reloc (reloc_type)
10976               || is_64bit_pcrel_reloc (reloc_type))
10977             {
10978               /* On HPPA, all pc-relative relocations are biased by 8.  */
10979               if (elf_header.e_machine == EM_PARISC)
10980                 addend -= 8;
10981               byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
10982                         reloc_size);
10983             }
10984           else
10985             byte_put (rloc, addend + sym->st_value, reloc_size);
10986         }
10987
10988       free (symtab);
10989       free (relocs);
10990       break;
10991     }
10992 }
10993
10994 #ifdef SUPPORT_DISASSEMBLY
10995 static int
10996 disassemble_section (Elf_Internal_Shdr * section, FILE * file)
10997 {
10998   printf (_("\nAssembly dump of section %s\n"),
10999           SECTION_NAME (section));
11000
11001   /* XXX -- to be done --- XXX */
11002
11003   return 1;
11004 }
11005 #endif
11006
11007 /* Reads in the contents of SECTION from FILE, returning a pointer
11008    to a malloc'ed buffer or NULL if something went wrong.  */
11009
11010 static char *
11011 get_section_contents (Elf_Internal_Shdr * section, FILE * file)
11012 {
11013   bfd_size_type num_bytes;
11014
11015   num_bytes = section->sh_size;
11016
11017   if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
11018     {
11019       printf (_("\nSection '%s' has no data to dump.\n"),
11020               SECTION_NAME (section));
11021       return NULL;
11022     }
11023
11024   return  (char *) get_data (NULL, file, section->sh_offset, 1, num_bytes,
11025                              _("section contents"));
11026 }
11027
11028
11029 static void
11030 dump_section_as_strings (Elf_Internal_Shdr * section, FILE * file)
11031 {
11032   Elf_Internal_Shdr * relsec;
11033   bfd_size_type num_bytes;
11034   char * data;
11035   char * end;
11036   char * start;
11037   char * name = SECTION_NAME (section);
11038   bfd_boolean some_strings_shown;
11039
11040   start = get_section_contents (section, file);
11041   if (start == NULL)
11042     return;
11043
11044   printf (_("\nString dump of section '%s':\n"), name);
11045
11046   /* If the section being dumped has relocations against it the user might
11047      be expecting these relocations to have been applied.  Check for this
11048      case and issue a warning message in order to avoid confusion.
11049      FIXME: Maybe we ought to have an option that dumps a section with
11050      relocs applied ?  */
11051   for (relsec = section_headers;
11052        relsec < section_headers + elf_header.e_shnum;
11053        ++relsec)
11054     {
11055       if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
11056           || relsec->sh_info >= elf_header.e_shnum
11057           || section_headers + relsec->sh_info != section
11058           || relsec->sh_size == 0
11059           || relsec->sh_link >= elf_header.e_shnum)
11060         continue;
11061
11062       printf (_("  Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
11063       break;
11064     }
11065
11066   num_bytes = section->sh_size;
11067   data = start;
11068   end  = start + num_bytes;
11069   some_strings_shown = FALSE;
11070
11071   while (data < end)
11072     {
11073       while (!ISPRINT (* data))
11074         if (++ data >= end)
11075           break;
11076
11077       if (data < end)
11078         {
11079 #ifndef __MSVCRT__
11080           /* PR 11128: Use two separate invocations in order to work
11081              around bugs in the Solaris 8 implementation of printf.  */
11082           printf ("  [%6tx]  ", data - start);
11083           printf ("%s\n", data);
11084 #else
11085           printf ("  [%6Ix]  %s\n", (size_t) (data - start), data);
11086 #endif
11087           data += strlen (data);
11088           some_strings_shown = TRUE;
11089         }
11090     }
11091
11092   if (! some_strings_shown)
11093     printf (_("  No strings found in this section."));
11094
11095   free (start);
11096
11097   putchar ('\n');
11098 }
11099
11100 static void
11101 dump_section_as_bytes (Elf_Internal_Shdr * section,
11102                        FILE * file,
11103                        bfd_boolean relocate)
11104 {
11105   Elf_Internal_Shdr * relsec;
11106   bfd_size_type bytes;
11107   bfd_vma addr;
11108   unsigned char * data;
11109   unsigned char * start;
11110
11111   start = (unsigned char *) get_section_contents (section, file);
11112   if (start == NULL)
11113     return;
11114
11115   printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section));
11116
11117   if (relocate)
11118     {
11119       apply_relocations (file, section, start);
11120     }
11121   else
11122     {
11123       /* If the section being dumped has relocations against it the user might
11124          be expecting these relocations to have been applied.  Check for this
11125          case and issue a warning message in order to avoid confusion.
11126          FIXME: Maybe we ought to have an option that dumps a section with
11127          relocs applied ?  */
11128       for (relsec = section_headers;
11129            relsec < section_headers + elf_header.e_shnum;
11130            ++relsec)
11131         {
11132           if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
11133               || relsec->sh_info >= elf_header.e_shnum
11134               || section_headers + relsec->sh_info != section
11135               || relsec->sh_size == 0
11136               || relsec->sh_link >= elf_header.e_shnum)
11137             continue;
11138
11139           printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
11140           break;
11141         }
11142     }
11143
11144   addr = section->sh_addr;
11145   bytes = section->sh_size;
11146   data = start;
11147
11148   while (bytes)
11149     {
11150       int j;
11151       int k;
11152       int lbytes;
11153
11154       lbytes = (bytes > 16 ? 16 : bytes);
11155
11156       printf ("  0x%8.8lx ", (unsigned long) addr);
11157
11158       for (j = 0; j < 16; j++)
11159         {
11160           if (j < lbytes)
11161             printf ("%2.2x", data[j]);
11162           else
11163             printf ("  ");
11164
11165           if ((j & 3) == 3)
11166             printf (" ");
11167         }
11168
11169       for (j = 0; j < lbytes; j++)
11170         {
11171           k = data[j];
11172           if (k >= ' ' && k < 0x7f)
11173             printf ("%c", k);
11174           else
11175             printf (".");
11176         }
11177
11178       putchar ('\n');
11179
11180       data  += lbytes;
11181       addr  += lbytes;
11182       bytes -= lbytes;
11183     }
11184
11185   free (start);
11186
11187   putchar ('\n');
11188 }
11189
11190 /* Uncompresses a section that was compressed using zlib, in place.  */
11191
11192 static int
11193 uncompress_section_contents (unsigned char **buffer ATTRIBUTE_UNUSED,
11194                              dwarf_size_type *size ATTRIBUTE_UNUSED)
11195 {
11196 #ifndef HAVE_ZLIB_H
11197   return FALSE;
11198 #else
11199   dwarf_size_type compressed_size = *size;
11200   unsigned char * compressed_buffer = *buffer;
11201   dwarf_size_type uncompressed_size;
11202   unsigned char * uncompressed_buffer;
11203   z_stream strm;
11204   int rc;
11205   dwarf_size_type header_size = 12;
11206
11207   /* Read the zlib header.  In this case, it should be "ZLIB" followed
11208      by the uncompressed section size, 8 bytes in big-endian order.  */
11209   if (compressed_size < header_size
11210       || ! streq ((char *) compressed_buffer, "ZLIB"))
11211     return 0;
11212
11213   uncompressed_size = compressed_buffer[4]; uncompressed_size <<= 8;
11214   uncompressed_size += compressed_buffer[5]; uncompressed_size <<= 8;
11215   uncompressed_size += compressed_buffer[6]; uncompressed_size <<= 8;
11216   uncompressed_size += compressed_buffer[7]; uncompressed_size <<= 8;
11217   uncompressed_size += compressed_buffer[8]; uncompressed_size <<= 8;
11218   uncompressed_size += compressed_buffer[9]; uncompressed_size <<= 8;
11219   uncompressed_size += compressed_buffer[10]; uncompressed_size <<= 8;
11220   uncompressed_size += compressed_buffer[11];
11221
11222   /* It is possible the section consists of several compressed
11223      buffers concatenated together, so we uncompress in a loop.  */
11224   strm.zalloc = NULL;
11225   strm.zfree = NULL;
11226   strm.opaque = NULL;
11227   strm.avail_in = compressed_size - header_size;
11228   strm.next_in = (Bytef *) compressed_buffer + header_size;
11229   strm.avail_out = uncompressed_size;
11230   uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
11231
11232   rc = inflateInit (& strm);
11233   while (strm.avail_in > 0)
11234     {
11235       if (rc != Z_OK)
11236         goto fail;
11237       strm.next_out = ((Bytef *) uncompressed_buffer
11238                        + (uncompressed_size - strm.avail_out));
11239       rc = inflate (&strm, Z_FINISH);
11240       if (rc != Z_STREAM_END)
11241         goto fail;
11242       rc = inflateReset (& strm);
11243     }
11244   rc = inflateEnd (& strm);
11245   if (rc != Z_OK
11246       || strm.avail_out != 0)
11247     goto fail;
11248
11249   free (compressed_buffer);
11250   *buffer = uncompressed_buffer;
11251   *size = uncompressed_size;
11252   return 1;
11253
11254  fail:
11255   free (uncompressed_buffer);
11256   /* Indicate decompression failure.  */
11257   *buffer = NULL;
11258   return 0;
11259 #endif  /* HAVE_ZLIB_H */
11260 }
11261
11262 static int
11263 load_specific_debug_section (enum dwarf_section_display_enum debug,
11264                              Elf_Internal_Shdr * sec, void * file)
11265 {
11266   struct dwarf_section * section = &debug_displays [debug].section;
11267   char buf [64];
11268
11269   /* If it is already loaded, do nothing.  */
11270   if (section->start != NULL)
11271     return 1;
11272
11273   snprintf (buf, sizeof (buf), _("%s section data"), section->name);
11274   section->address = sec->sh_addr;
11275   section->start = (unsigned char *) get_data (NULL, (FILE *) file,
11276                                                sec->sh_offset, 1,
11277                                                sec->sh_size, buf);
11278   if (section->start == NULL)
11279     section->size = 0;
11280   else
11281     {
11282       section->size = sec->sh_size;
11283       if (uncompress_section_contents (&section->start, &section->size))
11284         sec->sh_size = section->size;
11285     }
11286
11287   if (section->start == NULL)
11288     return 0;
11289
11290   if (debug_displays [debug].relocate)
11291     apply_relocations ((FILE *) file, sec, section->start);
11292
11293   return 1;
11294 }
11295
11296 /* If this is not NULL, load_debug_section will only look for sections
11297    within the list of sections given here.  */
11298 unsigned int *section_subset = NULL;
11299
11300 int
11301 load_debug_section (enum dwarf_section_display_enum debug, void * file)
11302 {
11303   struct dwarf_section * section = &debug_displays [debug].section;
11304   Elf_Internal_Shdr * sec;
11305
11306   /* Locate the debug section.  */
11307   sec = find_section_in_set (section->uncompressed_name, section_subset);
11308   if (sec != NULL)
11309     section->name = section->uncompressed_name;
11310   else
11311     {
11312       sec = find_section_in_set (section->compressed_name, section_subset);
11313       if (sec != NULL)
11314         section->name = section->compressed_name;
11315     }
11316   if (sec == NULL)
11317     return 0;
11318
11319   /* If we're loading from a subset of sections, and we've loaded
11320      a section matching this name before, it's likely that it's a
11321      different one.  */
11322   if (section_subset != NULL)
11323     free_debug_section (debug);
11324
11325   return load_specific_debug_section (debug, sec, (FILE *) file);
11326 }
11327
11328 void
11329 free_debug_section (enum dwarf_section_display_enum debug)
11330 {
11331   struct dwarf_section * section = &debug_displays [debug].section;
11332
11333   if (section->start == NULL)
11334     return;
11335
11336   free ((char *) section->start);
11337   section->start = NULL;
11338   section->address = 0;
11339   section->size = 0;
11340 }
11341
11342 static int
11343 display_debug_section (int shndx, Elf_Internal_Shdr * section, FILE * file)
11344 {
11345   char * name = SECTION_NAME (section);
11346   bfd_size_type length;
11347   int result = 1;
11348   int i;
11349
11350   length = section->sh_size;
11351   if (length == 0)
11352     {
11353       printf (_("\nSection '%s' has no debugging data.\n"), name);
11354       return 0;
11355     }
11356   if (section->sh_type == SHT_NOBITS)
11357     {
11358       /* There is no point in dumping the contents of a debugging section
11359          which has the NOBITS type - the bits in the file will be random.
11360          This can happen when a file containing a .eh_frame section is
11361          stripped with the --only-keep-debug command line option.  */
11362       printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"), name);
11363       return 0;
11364     }
11365
11366   if (const_strneq (name, ".gnu.linkonce.wi."))
11367     name = ".debug_info";
11368
11369   /* See if we know how to display the contents of this section.  */
11370   for (i = 0; i < max; i++)
11371     if (streq (debug_displays[i].section.uncompressed_name, name)
11372         || (i == line && const_strneq (name, ".debug_line."))
11373         || streq (debug_displays[i].section.compressed_name, name))
11374       {
11375         struct dwarf_section * sec = &debug_displays [i].section;
11376         int secondary = (section != find_section (name));
11377
11378         if (secondary)
11379           free_debug_section ((enum dwarf_section_display_enum) i);
11380
11381         if (i == line && const_strneq (name, ".debug_line."))
11382           sec->name = name;
11383         else if (streq (sec->uncompressed_name, name))
11384           sec->name = sec->uncompressed_name;
11385         else
11386           sec->name = sec->compressed_name;
11387         if (load_specific_debug_section ((enum dwarf_section_display_enum) i,
11388                                          section, file))
11389           {
11390             /* If this debug section is part of a CU/TU set in a .dwp file,
11391                restrict load_debug_section to the sections in that set.  */
11392             section_subset = find_cu_tu_set (file, shndx);
11393
11394             result &= debug_displays[i].display (sec, file);
11395
11396             section_subset = NULL;
11397
11398             if (secondary || (i != info && i != abbrev))
11399               free_debug_section ((enum dwarf_section_display_enum) i);
11400           }
11401
11402         break;
11403       }
11404
11405   if (i == max)
11406     {
11407       printf (_("Unrecognized debug section: %s\n"), name);
11408       result = 0;
11409     }
11410
11411   return result;
11412 }
11413
11414 /* Set DUMP_SECTS for all sections where dumps were requested
11415    based on section name.  */
11416
11417 static void
11418 initialise_dumps_byname (void)
11419 {
11420   struct dump_list_entry * cur;
11421
11422   for (cur = dump_sects_byname; cur; cur = cur->next)
11423     {
11424       unsigned int i;
11425       int any;
11426
11427       for (i = 0, any = 0; i < elf_header.e_shnum; i++)
11428         if (streq (SECTION_NAME (section_headers + i), cur->name))
11429           {
11430             request_dump_bynumber (i, cur->type);
11431             any = 1;
11432           }
11433
11434       if (!any)
11435         warn (_("Section '%s' was not dumped because it does not exist!\n"),
11436               cur->name);
11437     }
11438 }
11439
11440 static void
11441 process_section_contents (FILE * file)
11442 {
11443   Elf_Internal_Shdr * section;
11444   unsigned int i;
11445
11446   if (! do_dump)
11447     return;
11448
11449   initialise_dumps_byname ();
11450
11451   for (i = 0, section = section_headers;
11452        i < elf_header.e_shnum && i < num_dump_sects;
11453        i++, section++)
11454     {
11455 #ifdef SUPPORT_DISASSEMBLY
11456       if (dump_sects[i] & DISASS_DUMP)
11457         disassemble_section (section, file);
11458 #endif
11459       if (dump_sects[i] & HEX_DUMP)
11460         dump_section_as_bytes (section, file, FALSE);
11461
11462       if (dump_sects[i] & RELOC_DUMP)
11463         dump_section_as_bytes (section, file, TRUE);
11464
11465       if (dump_sects[i] & STRING_DUMP)
11466         dump_section_as_strings (section, file);
11467
11468       if (dump_sects[i] & DEBUG_DUMP)
11469         display_debug_section (i, section, file);
11470     }
11471
11472   /* Check to see if the user requested a
11473      dump of a section that does not exist.  */
11474   while (i++ < num_dump_sects)
11475     if (dump_sects[i])
11476       warn (_("Section %d was not dumped because it does not exist!\n"), i);
11477 }
11478
11479 static void
11480 process_mips_fpe_exception (int mask)
11481 {
11482   if (mask)
11483     {
11484       int first = 1;
11485       if (mask & OEX_FPU_INEX)
11486         fputs ("INEX", stdout), first = 0;
11487       if (mask & OEX_FPU_UFLO)
11488         printf ("%sUFLO", first ? "" : "|"), first = 0;
11489       if (mask & OEX_FPU_OFLO)
11490         printf ("%sOFLO", first ? "" : "|"), first = 0;
11491       if (mask & OEX_FPU_DIV0)
11492         printf ("%sDIV0", first ? "" : "|"), first = 0;
11493       if (mask & OEX_FPU_INVAL)
11494         printf ("%sINVAL", first ? "" : "|");
11495     }
11496   else
11497     fputs ("0", stdout);
11498 }
11499
11500 /* Display's the value of TAG at location P.  If TAG is
11501    greater than 0 it is assumed to be an unknown tag, and
11502    a message is printed to this effect.  Otherwise it is
11503    assumed that a message has already been printed.
11504
11505    If the bottom bit of TAG is set it assumed to have a
11506    string value, otherwise it is assumed to have an integer
11507    value.
11508
11509    Returns an updated P pointing to the first unread byte
11510    beyond the end of TAG's value.
11511
11512    Reads at or beyond END will not be made.  */
11513
11514 static unsigned char *
11515 display_tag_value (int tag,
11516                    unsigned char * p,
11517                    const unsigned char * const end)
11518 {
11519   unsigned long val;
11520
11521   if (tag > 0)
11522     printf ("  Tag_unknown_%d: ", tag);
11523
11524   if (p >= end)
11525     {
11526       warn (_("corrupt tag\n"));
11527     }
11528   else if (tag & 1)
11529     {
11530       /* FIXME: we could read beyond END here.  */
11531       printf ("\"%s\"\n", p);
11532       p += strlen ((char *) p) + 1;
11533     }
11534   else
11535     {
11536       unsigned int len;
11537
11538       val = read_uleb128 (p, &len, end);
11539       p += len;
11540       printf ("%ld (0x%lx)\n", val, val);
11541     }
11542
11543   return p;
11544 }
11545
11546 /* ARM EABI attributes section.  */
11547 typedef struct
11548 {
11549   int tag;
11550   const char * name;
11551   /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup.  */
11552   int type;
11553   const char ** table;
11554 } arm_attr_public_tag;
11555
11556 static const char * arm_attr_tag_CPU_arch[] =
11557   {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
11558    "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8"};
11559 static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
11560 static const char * arm_attr_tag_THUMB_ISA_use[] =
11561   {"No", "Thumb-1", "Thumb-2"};
11562 static const char * arm_attr_tag_FP_arch[] =
11563   {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
11564    "FP for ARMv8"};
11565 static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
11566 static const char * arm_attr_tag_Advanced_SIMD_arch[] =
11567   {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8"};
11568 static const char * arm_attr_tag_PCS_config[] =
11569   {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
11570    "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
11571 static const char * arm_attr_tag_ABI_PCS_R9_use[] =
11572   {"V6", "SB", "TLS", "Unused"};
11573 static const char * arm_attr_tag_ABI_PCS_RW_data[] =
11574   {"Absolute", "PC-relative", "SB-relative", "None"};
11575 static const char * arm_attr_tag_ABI_PCS_RO_data[] =
11576   {"Absolute", "PC-relative", "None"};
11577 static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
11578   {"None", "direct", "GOT-indirect"};
11579 static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
11580   {"None", "??? 1", "2", "??? 3", "4"};
11581 static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
11582 static const char * arm_attr_tag_ABI_FP_denormal[] =
11583   {"Unused", "Needed", "Sign only"};
11584 static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
11585 static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
11586 static const char * arm_attr_tag_ABI_FP_number_model[] =
11587   {"Unused", "Finite", "RTABI", "IEEE 754"};
11588 static const char * arm_attr_tag_ABI_enum_size[] =
11589   {"Unused", "small", "int", "forced to int"};
11590 static const char * arm_attr_tag_ABI_HardFP_use[] =
11591   {"As Tag_FP_arch", "SP only", "DP only", "SP and DP"};
11592 static const char * arm_attr_tag_ABI_VFP_args[] =
11593   {"AAPCS", "VFP registers", "custom"};
11594 static const char * arm_attr_tag_ABI_WMMX_args[] =
11595   {"AAPCS", "WMMX registers", "custom"};
11596 static const char * arm_attr_tag_ABI_optimization_goals[] =
11597   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
11598     "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
11599 static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
11600   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
11601     "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
11602 static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
11603 static const char * arm_attr_tag_FP_HP_extension[] =
11604   {"Not Allowed", "Allowed"};
11605 static const char * arm_attr_tag_ABI_FP_16bit_format[] =
11606   {"None", "IEEE 754", "Alternative Format"};
11607 static const char * arm_attr_tag_MPextension_use[] =
11608   {"Not Allowed", "Allowed"};
11609 static const char * arm_attr_tag_DIV_use[] =
11610   {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
11611     "Allowed in v7-A with integer division extension"};
11612 static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
11613 static const char * arm_attr_tag_Virtualization_use[] =
11614   {"Not Allowed", "TrustZone", "Virtualization Extensions",
11615     "TrustZone and Virtualization Extensions"};
11616 static const char * arm_attr_tag_MPextension_use_legacy[] =
11617   {"Not Allowed", "Allowed"};
11618
11619 #define LOOKUP(id, name) \
11620   {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
11621 static arm_attr_public_tag arm_attr_public_tags[] =
11622 {
11623   {4, "CPU_raw_name", 1, NULL},
11624   {5, "CPU_name", 1, NULL},
11625   LOOKUP(6, CPU_arch),
11626   {7, "CPU_arch_profile", 0, NULL},
11627   LOOKUP(8, ARM_ISA_use),
11628   LOOKUP(9, THUMB_ISA_use),
11629   LOOKUP(10, FP_arch),
11630   LOOKUP(11, WMMX_arch),
11631   LOOKUP(12, Advanced_SIMD_arch),
11632   LOOKUP(13, PCS_config),
11633   LOOKUP(14, ABI_PCS_R9_use),
11634   LOOKUP(15, ABI_PCS_RW_data),
11635   LOOKUP(16, ABI_PCS_RO_data),
11636   LOOKUP(17, ABI_PCS_GOT_use),
11637   LOOKUP(18, ABI_PCS_wchar_t),
11638   LOOKUP(19, ABI_FP_rounding),
11639   LOOKUP(20, ABI_FP_denormal),
11640   LOOKUP(21, ABI_FP_exceptions),
11641   LOOKUP(22, ABI_FP_user_exceptions),
11642   LOOKUP(23, ABI_FP_number_model),
11643   {24, "ABI_align_needed", 0, NULL},
11644   {25, "ABI_align_preserved", 0, NULL},
11645   LOOKUP(26, ABI_enum_size),
11646   LOOKUP(27, ABI_HardFP_use),
11647   LOOKUP(28, ABI_VFP_args),
11648   LOOKUP(29, ABI_WMMX_args),
11649   LOOKUP(30, ABI_optimization_goals),
11650   LOOKUP(31, ABI_FP_optimization_goals),
11651   {32, "compatibility", 0, NULL},
11652   LOOKUP(34, CPU_unaligned_access),
11653   LOOKUP(36, FP_HP_extension),
11654   LOOKUP(38, ABI_FP_16bit_format),
11655   LOOKUP(42, MPextension_use),
11656   LOOKUP(44, DIV_use),
11657   {64, "nodefaults", 0, NULL},
11658   {65, "also_compatible_with", 0, NULL},
11659   LOOKUP(66, T2EE_use),
11660   {67, "conformance", 1, NULL},
11661   LOOKUP(68, Virtualization_use),
11662   LOOKUP(70, MPextension_use_legacy)
11663 };
11664 #undef LOOKUP
11665
11666 static unsigned char *
11667 display_arm_attribute (unsigned char * p,
11668                        const unsigned char * const end)
11669 {
11670   int tag;
11671   unsigned int len;
11672   int val;
11673   arm_attr_public_tag * attr;
11674   unsigned i;
11675   int type;
11676
11677   tag = read_uleb128 (p, &len, end);
11678   p += len;
11679   attr = NULL;
11680   for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
11681     {
11682       if (arm_attr_public_tags[i].tag == tag)
11683         {
11684           attr = &arm_attr_public_tags[i];
11685           break;
11686         }
11687     }
11688
11689   if (attr)
11690     {
11691       printf ("  Tag_%s: ", attr->name);
11692       switch (attr->type)
11693         {
11694         case 0:
11695           switch (tag)
11696             {
11697             case 7: /* Tag_CPU_arch_profile.  */
11698               val = read_uleb128 (p, &len, end);
11699               p += len;
11700               switch (val)
11701                 {
11702                 case 0: printf (_("None\n")); break;
11703                 case 'A': printf (_("Application\n")); break;
11704                 case 'R': printf (_("Realtime\n")); break;
11705                 case 'M': printf (_("Microcontroller\n")); break;
11706                 case 'S': printf (_("Application or Realtime\n")); break;
11707                 default: printf ("??? (%d)\n", val); break;
11708                 }
11709               break;
11710
11711             case 24: /* Tag_align_needed.  */
11712               val = read_uleb128 (p, &len, end);
11713               p += len;
11714               switch (val)
11715                 {
11716                 case 0: printf (_("None\n")); break;
11717                 case 1: printf (_("8-byte\n")); break;
11718                 case 2: printf (_("4-byte\n")); break;
11719                 case 3: printf ("??? 3\n"); break;
11720                 default:
11721                   if (val <= 12)
11722                     printf (_("8-byte and up to %d-byte extended\n"),
11723                             1 << val);
11724                   else
11725                     printf ("??? (%d)\n", val);
11726                   break;
11727                 }
11728               break;
11729
11730             case 25: /* Tag_align_preserved.  */
11731               val = read_uleb128 (p, &len, end);
11732               p += len;
11733               switch (val)
11734                 {
11735                 case 0: printf (_("None\n")); break;
11736                 case 1: printf (_("8-byte, except leaf SP\n")); break;
11737                 case 2: printf (_("8-byte\n")); break;
11738                 case 3: printf ("??? 3\n"); break;
11739                 default:
11740                   if (val <= 12)
11741                     printf (_("8-byte and up to %d-byte extended\n"),
11742                             1 << val);
11743                   else
11744                     printf ("??? (%d)\n", val);
11745                   break;
11746                 }
11747               break;
11748
11749             case 32: /* Tag_compatibility.  */
11750               val = read_uleb128 (p, &len, end);
11751               p += len;
11752               printf (_("flag = %d, vendor = %s\n"), val, p);
11753               p += strlen ((char *) p) + 1;
11754               break;
11755
11756             case 64: /* Tag_nodefaults.  */
11757               p++;
11758               printf (_("True\n"));
11759               break;
11760
11761             case 65: /* Tag_also_compatible_with.  */
11762               val = read_uleb128 (p, &len, end);
11763               p += len;
11764               if (val == 6 /* Tag_CPU_arch.  */)
11765                 {
11766                   val = read_uleb128 (p, &len, end);
11767                   p += len;
11768                   if ((unsigned int)val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
11769                     printf ("??? (%d)\n", val);
11770                   else
11771                     printf ("%s\n", arm_attr_tag_CPU_arch[val]);
11772                 }
11773               else
11774                 printf ("???\n");
11775               while (*(p++) != '\0' /* NUL terminator.  */);
11776               break;
11777
11778             default:
11779               abort ();
11780             }
11781           return p;
11782
11783         case 1:
11784           return display_tag_value (-1, p, end);
11785         case 2:
11786           return display_tag_value (0, p, end);
11787
11788         default:
11789           assert (attr->type & 0x80);
11790           val = read_uleb128 (p, &len, end);
11791           p += len;
11792           type = attr->type & 0x7f;
11793           if (val >= type)
11794             printf ("??? (%d)\n", val);
11795           else
11796             printf ("%s\n", attr->table[val]);
11797           return p;
11798         }
11799     }
11800
11801   return display_tag_value (tag, p, end);
11802 }
11803
11804 static unsigned char *
11805 display_gnu_attribute (unsigned char * p,
11806                        unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const),
11807                        const unsigned char * const end)
11808 {
11809   int tag;
11810   unsigned int len;
11811   int val;
11812
11813   tag = read_uleb128 (p, &len, end);
11814   p += len;
11815
11816   /* Tag_compatibility is the only generic GNU attribute defined at
11817      present.  */
11818   if (tag == 32)
11819     {
11820       val = read_uleb128 (p, &len, end);
11821       p += len;
11822       if (p == end)
11823         {
11824           printf (_("flag = %d, vendor = <corrupt>\n"), val);
11825           warn (_("corrupt vendor attribute\n"));
11826         }
11827       else
11828         {
11829           printf (_("flag = %d, vendor = %s\n"), val, p);
11830           p += strlen ((char *) p) + 1;
11831         }
11832       return p;
11833     }
11834
11835   if ((tag & 2) == 0 && display_proc_gnu_attribute)
11836     return display_proc_gnu_attribute (p, tag, end);
11837
11838   return display_tag_value (tag, p, end);
11839 }
11840
11841 static unsigned char *
11842 display_power_gnu_attribute (unsigned char * p,
11843                              int tag,
11844                              const unsigned char * const end)
11845 {
11846   unsigned int len;
11847   int val;
11848
11849   if (tag == Tag_GNU_Power_ABI_FP)
11850     {
11851       val = read_uleb128 (p, &len, end);
11852       p += len;
11853       printf ("  Tag_GNU_Power_ABI_FP: ");
11854
11855       switch (val)
11856         {
11857         case 0:
11858           printf (_("Hard or soft float\n"));
11859           break;
11860         case 1:
11861           printf (_("Hard float\n"));
11862           break;
11863         case 2:
11864           printf (_("Soft float\n"));
11865           break;
11866         case 3:
11867           printf (_("Single-precision hard float\n"));
11868           break;
11869         default:
11870           printf ("??? (%d)\n", val);
11871           break;
11872         }
11873       return p;
11874    }
11875
11876   if (tag == Tag_GNU_Power_ABI_Vector)
11877     {
11878       val = read_uleb128 (p, &len, end);
11879       p += len;
11880       printf ("  Tag_GNU_Power_ABI_Vector: ");
11881       switch (val)
11882         {
11883         case 0:
11884           printf (_("Any\n"));
11885           break;
11886         case 1:
11887           printf (_("Generic\n"));
11888           break;
11889         case 2:
11890           printf ("AltiVec\n");
11891           break;
11892         case 3:
11893           printf ("SPE\n");
11894           break;
11895         default:
11896           printf ("??? (%d)\n", val);
11897           break;
11898         }
11899       return p;
11900    }
11901
11902   if (tag == Tag_GNU_Power_ABI_Struct_Return)
11903     {
11904       if (p == end)
11905         {
11906           warn (_("corrupt Tag_GNU_Power_ABI_Struct_Return"));
11907           return p;
11908         }
11909
11910       val = read_uleb128 (p, &len, end);
11911       p += len;
11912       printf ("  Tag_GNU_Power_ABI_Struct_Return: ");
11913       switch (val)
11914        {
11915        case 0:
11916          printf (_("Any\n"));
11917          break;
11918        case 1:
11919          printf ("r3/r4\n");
11920          break;
11921        case 2:
11922          printf (_("Memory\n"));
11923          break;
11924        default:
11925          printf ("??? (%d)\n", val);
11926          break;
11927        }
11928       return p;
11929     }
11930
11931   return display_tag_value (tag & 1, p, end);
11932 }
11933
11934 static void
11935 display_sparc_hwcaps (int mask)
11936 {
11937   if (mask)
11938     {
11939       int first = 1;
11940       if (mask & ELF_SPARC_HWCAP_MUL32)
11941         fputs ("mul32", stdout), first = 0;
11942       if (mask & ELF_SPARC_HWCAP_DIV32)
11943         printf ("%sdiv32", first ? "" : "|"), first = 0;
11944       if (mask & ELF_SPARC_HWCAP_FSMULD)
11945         printf ("%sfsmuld", first ? "" : "|"), first = 0;
11946       if (mask & ELF_SPARC_HWCAP_V8PLUS)
11947         printf ("%sv8plus", first ? "" : "|"), first = 0;
11948       if (mask & ELF_SPARC_HWCAP_POPC)
11949         printf ("%spopc", first ? "" : "|"), first = 0;
11950       if (mask & ELF_SPARC_HWCAP_VIS)
11951         printf ("%svis", first ? "" : "|"), first = 0;
11952       if (mask & ELF_SPARC_HWCAP_VIS2)
11953         printf ("%svis2", first ? "" : "|"), first = 0;
11954       if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
11955         printf ("%sASIBlkInit", first ? "" : "|"), first = 0;
11956       if (mask & ELF_SPARC_HWCAP_FMAF)
11957         printf ("%sfmaf", first ? "" : "|"), first = 0;
11958       if (mask & ELF_SPARC_HWCAP_VIS3)
11959         printf ("%svis3", first ? "" : "|"), first = 0;
11960       if (mask & ELF_SPARC_HWCAP_HPC)
11961         printf ("%shpc", first ? "" : "|"), first = 0;
11962       if (mask & ELF_SPARC_HWCAP_RANDOM)
11963         printf ("%srandom", first ? "" : "|"), first = 0;
11964       if (mask & ELF_SPARC_HWCAP_TRANS)
11965         printf ("%strans", first ? "" : "|"), first = 0;
11966       if (mask & ELF_SPARC_HWCAP_FJFMAU)
11967         printf ("%sfjfmau", first ? "" : "|"), first = 0;
11968       if (mask & ELF_SPARC_HWCAP_IMA)
11969         printf ("%sima", first ? "" : "|"), first = 0;
11970       if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
11971         printf ("%scspare", first ? "" : "|"), first = 0;
11972     }
11973   else
11974     fputc('0', stdout);
11975   fputc('\n', stdout);
11976 }
11977
11978 static unsigned char *
11979 display_sparc_gnu_attribute (unsigned char * p,
11980                              int tag,
11981                              const unsigned char * const end)
11982 {
11983   if (tag == Tag_GNU_Sparc_HWCAPS)
11984     {
11985       unsigned int len;
11986       int val;
11987
11988       val = read_uleb128 (p, &len, end);
11989       p += len;
11990       printf ("  Tag_GNU_Sparc_HWCAPS: ");
11991       display_sparc_hwcaps (val);
11992       return p;
11993    }
11994
11995   return display_tag_value (tag, p, end);
11996 }
11997
11998 static void
11999 print_mips_fp_abi_value (int val)
12000 {
12001   switch (val)
12002     {
12003     case Val_GNU_MIPS_ABI_FP_ANY:
12004       printf (_("Hard or soft float\n"));
12005       break;
12006     case Val_GNU_MIPS_ABI_FP_DOUBLE:
12007       printf (_("Hard float (double precision)\n"));
12008       break;
12009     case Val_GNU_MIPS_ABI_FP_SINGLE:
12010       printf (_("Hard float (single precision)\n"));
12011       break;
12012     case Val_GNU_MIPS_ABI_FP_SOFT:
12013       printf (_("Soft float\n"));
12014       break;
12015     case Val_GNU_MIPS_ABI_FP_OLD_64:
12016       printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
12017       break;
12018     case Val_GNU_MIPS_ABI_FP_XX:
12019       printf (_("Hard float (32-bit CPU, Any FPU)\n"));
12020       break;
12021     case Val_GNU_MIPS_ABI_FP_64:
12022       printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
12023       break;
12024     case Val_GNU_MIPS_ABI_FP_64A:
12025       printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
12026       break;
12027     default:
12028       printf ("??? (%d)\n", val);
12029       break;
12030     }
12031 }
12032
12033 static unsigned char *
12034 display_mips_gnu_attribute (unsigned char * p,
12035                             int tag,
12036                             const unsigned char * const end)
12037 {
12038   if (tag == Tag_GNU_MIPS_ABI_FP)
12039     {
12040       unsigned int len;
12041       int val;
12042
12043       val = read_uleb128 (p, &len, end);
12044       p += len;
12045       printf ("  Tag_GNU_MIPS_ABI_FP: ");
12046
12047       print_mips_fp_abi_value (val);
12048
12049       return p;
12050    }
12051
12052   if (tag == Tag_GNU_MIPS_ABI_MSA)
12053     {
12054       unsigned int len;
12055       int val;
12056
12057       val = read_uleb128 (p, &len, end);
12058       p += len;
12059       printf ("  Tag_GNU_MIPS_ABI_MSA: ");
12060
12061       switch (val)
12062         {
12063         case Val_GNU_MIPS_ABI_MSA_ANY:
12064           printf (_("Any MSA or not\n"));
12065           break;
12066         case Val_GNU_MIPS_ABI_MSA_128:
12067           printf (_("128-bit MSA\n"));
12068           break;
12069         default:
12070           printf ("??? (%d)\n", val);
12071           break;
12072         }
12073       return p;
12074     }
12075
12076   return display_tag_value (tag & 1, p, end);
12077 }
12078
12079 static unsigned char *
12080 display_tic6x_attribute (unsigned char * p,
12081                          const unsigned char * const end)
12082 {
12083   int tag;
12084   unsigned int len;
12085   int val;
12086
12087   tag = read_uleb128 (p, &len, end);
12088   p += len;
12089
12090   switch (tag)
12091     {
12092     case Tag_ISA:
12093       val = read_uleb128 (p, &len, end);
12094       p += len;
12095       printf ("  Tag_ISA: ");
12096
12097       switch (val)
12098         {
12099         case C6XABI_Tag_ISA_none:
12100           printf (_("None\n"));
12101           break;
12102         case C6XABI_Tag_ISA_C62X:
12103           printf ("C62x\n");
12104           break;
12105         case C6XABI_Tag_ISA_C67X:
12106           printf ("C67x\n");
12107           break;
12108         case C6XABI_Tag_ISA_C67XP:
12109           printf ("C67x+\n");
12110           break;
12111         case C6XABI_Tag_ISA_C64X:
12112           printf ("C64x\n");
12113           break;
12114         case C6XABI_Tag_ISA_C64XP:
12115           printf ("C64x+\n");
12116           break;
12117         case C6XABI_Tag_ISA_C674X:
12118           printf ("C674x\n");
12119           break;
12120         default:
12121           printf ("??? (%d)\n", val);
12122           break;
12123         }
12124       return p;
12125
12126     case Tag_ABI_wchar_t:
12127       val = read_uleb128 (p, &len, end);
12128       p += len;
12129       printf ("  Tag_ABI_wchar_t: ");
12130       switch (val)
12131         {
12132         case 0:
12133           printf (_("Not used\n"));
12134           break;
12135         case 1:
12136           printf (_("2 bytes\n"));
12137           break;
12138         case 2:
12139           printf (_("4 bytes\n"));
12140           break;
12141         default:
12142           printf ("??? (%d)\n", val);
12143           break;
12144         }
12145       return p;
12146
12147     case Tag_ABI_stack_align_needed:
12148       val = read_uleb128 (p, &len, end);
12149       p += len;
12150       printf ("  Tag_ABI_stack_align_needed: ");
12151       switch (val)
12152         {
12153         case 0:
12154           printf (_("8-byte\n"));
12155           break;
12156         case 1:
12157           printf (_("16-byte\n"));
12158           break;
12159         default:
12160           printf ("??? (%d)\n", val);
12161           break;
12162         }
12163       return p;
12164
12165     case Tag_ABI_stack_align_preserved:
12166       val = read_uleb128 (p, &len, end);
12167       p += len;
12168       printf ("  Tag_ABI_stack_align_preserved: ");
12169       switch (val)
12170         {
12171         case 0:
12172           printf (_("8-byte\n"));
12173           break;
12174         case 1:
12175           printf (_("16-byte\n"));
12176           break;
12177         default:
12178           printf ("??? (%d)\n", val);
12179           break;
12180         }
12181       return p;
12182
12183     case Tag_ABI_DSBT:
12184       val = read_uleb128 (p, &len, end);
12185       p += len;
12186       printf ("  Tag_ABI_DSBT: ");
12187       switch (val)
12188         {
12189         case 0:
12190           printf (_("DSBT addressing not used\n"));
12191           break;
12192         case 1:
12193           printf (_("DSBT addressing used\n"));
12194           break;
12195         default:
12196           printf ("??? (%d)\n", val);
12197           break;
12198         }
12199       return p;
12200
12201     case Tag_ABI_PID:
12202       val = read_uleb128 (p, &len, end);
12203       p += len;
12204       printf ("  Tag_ABI_PID: ");
12205       switch (val)
12206         {
12207         case 0:
12208           printf (_("Data addressing position-dependent\n"));
12209           break;
12210         case 1:
12211           printf (_("Data addressing position-independent, GOT near DP\n"));
12212           break;
12213         case 2:
12214           printf (_("Data addressing position-independent, GOT far from DP\n"));
12215           break;
12216         default:
12217           printf ("??? (%d)\n", val);
12218           break;
12219         }
12220       return p;
12221
12222     case Tag_ABI_PIC:
12223       val = read_uleb128 (p, &len, end);
12224       p += len;
12225       printf ("  Tag_ABI_PIC: ");
12226       switch (val)
12227         {
12228         case 0:
12229           printf (_("Code addressing position-dependent\n"));
12230           break;
12231         case 1:
12232           printf (_("Code addressing position-independent\n"));
12233           break;
12234         default:
12235           printf ("??? (%d)\n", val);
12236           break;
12237         }
12238       return p;
12239
12240     case Tag_ABI_array_object_alignment:
12241       val = read_uleb128 (p, &len, end);
12242       p += len;
12243       printf ("  Tag_ABI_array_object_alignment: ");
12244       switch (val)
12245         {
12246         case 0:
12247           printf (_("8-byte\n"));
12248           break;
12249         case 1:
12250           printf (_("4-byte\n"));
12251           break;
12252         case 2:
12253           printf (_("16-byte\n"));
12254           break;
12255         default:
12256           printf ("??? (%d)\n", val);
12257           break;
12258         }
12259       return p;
12260
12261     case Tag_ABI_array_object_align_expected:
12262       val = read_uleb128 (p, &len, end);
12263       p += len;
12264       printf ("  Tag_ABI_array_object_align_expected: ");
12265       switch (val)
12266         {
12267         case 0:
12268           printf (_("8-byte\n"));
12269           break;
12270         case 1:
12271           printf (_("4-byte\n"));
12272           break;
12273         case 2:
12274           printf (_("16-byte\n"));
12275           break;
12276         default:
12277           printf ("??? (%d)\n", val);
12278           break;
12279         }
12280       return p;
12281
12282     case Tag_ABI_compatibility:
12283       val = read_uleb128 (p, &len, end);
12284       p += len;
12285       printf ("  Tag_ABI_compatibility: ");
12286       printf (_("flag = %d, vendor = %s\n"), val, p);
12287       p += strlen ((char *) p) + 1;
12288       return p;
12289
12290     case Tag_ABI_conformance:
12291       printf ("  Tag_ABI_conformance: ");
12292       printf ("\"%s\"\n", p);
12293       p += strlen ((char *) p) + 1;
12294       return p;
12295     }
12296
12297   return display_tag_value (tag, p, end);
12298 }
12299
12300 static void
12301 display_raw_attribute (unsigned char * p, unsigned char * end)
12302 {
12303   unsigned long addr = 0;
12304   size_t bytes = end - p;
12305
12306   while (bytes)
12307     {
12308       int j;
12309       int k;
12310       int lbytes = (bytes > 16 ? 16 : bytes);
12311
12312       printf ("  0x%8.8lx ", addr);
12313
12314       for (j = 0; j < 16; j++)
12315         {
12316           if (j < lbytes)
12317             printf ("%2.2x", p[j]);
12318           else
12319             printf ("  ");
12320
12321           if ((j & 3) == 3)
12322             printf (" ");
12323         }
12324
12325       for (j = 0; j < lbytes; j++)
12326         {
12327           k = p[j];
12328           if (k >= ' ' && k < 0x7f)
12329             printf ("%c", k);
12330           else
12331             printf (".");
12332         }
12333
12334       putchar ('\n');
12335
12336       p  += lbytes;
12337       bytes -= lbytes;
12338       addr += lbytes;
12339     }
12340
12341   putchar ('\n');
12342 }
12343
12344 static unsigned char *
12345 display_msp430x_attribute (unsigned char * p,
12346                            const unsigned char * const end)
12347 {
12348   unsigned int len;
12349   int val;
12350   int tag;
12351
12352   tag = read_uleb128 (p, & len, end);
12353   p += len;
12354
12355   switch (tag)
12356     {
12357     case OFBA_MSPABI_Tag_ISA:
12358       val = read_uleb128 (p, &len, end);
12359       p += len;
12360       printf ("  Tag_ISA: ");
12361       switch (val)
12362         {
12363         case 0: printf (_("None\n")); break;
12364         case 1: printf (_("MSP430\n")); break;
12365         case 2: printf (_("MSP430X\n")); break;
12366         default: printf ("??? (%d)\n", val); break;
12367         }
12368       break;
12369
12370     case OFBA_MSPABI_Tag_Code_Model:
12371       val = read_uleb128 (p, &len, end);
12372       p += len;
12373       printf ("  Tag_Code_Model: ");
12374       switch (val)
12375         {
12376         case 0: printf (_("None\n")); break;
12377         case 1: printf (_("Small\n")); break;
12378         case 2: printf (_("Large\n")); break;
12379         default: printf ("??? (%d)\n", val); break;
12380         }
12381       break;
12382
12383     case OFBA_MSPABI_Tag_Data_Model:
12384       val = read_uleb128 (p, &len, end);
12385       p += len;
12386       printf ("  Tag_Data_Model: ");
12387       switch (val)
12388         {
12389         case 0: printf (_("None\n")); break;
12390         case 1: printf (_("Small\n")); break;
12391         case 2: printf (_("Large\n")); break;
12392         case 3: printf (_("Restricted Large\n")); break;
12393         default: printf ("??? (%d)\n", val); break;
12394         }
12395       break;
12396
12397     default:
12398       printf (_("  <unknown tag %d>: "), tag);
12399
12400       if (tag & 1)
12401         {
12402           printf ("\"%s\"\n", p);
12403           p += strlen ((char *) p) + 1;
12404         }
12405       else
12406         {
12407           val = read_uleb128 (p, &len, end);
12408           p += len;
12409           printf ("%d (0x%x)\n", val, val);
12410         }
12411       break;
12412    }
12413
12414   return p;
12415 }
12416
12417 static int
12418 process_attributes (FILE * file,
12419                     const char * public_name,
12420                     unsigned int proc_type,
12421                     unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
12422                     unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const))
12423 {
12424   Elf_Internal_Shdr * sect;
12425   unsigned char * contents;
12426   unsigned char * p;
12427   unsigned char * end;
12428   bfd_vma section_len;
12429   bfd_vma len;
12430   unsigned i;
12431
12432   /* Find the section header so that we get the size.  */
12433   for (i = 0, sect = section_headers;
12434        i < elf_header.e_shnum;
12435        i++, sect++)
12436     {
12437       if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
12438         continue;
12439
12440       contents = (unsigned char *) get_data (NULL, file, sect->sh_offset, 1,
12441                                              sect->sh_size, _("attributes"));
12442       if (contents == NULL)
12443         continue;
12444
12445       p = contents;
12446       if (*p == 'A')
12447         {
12448           len = sect->sh_size - 1;
12449           p++;
12450
12451           while (len > 0)
12452             {
12453               unsigned int namelen;
12454               bfd_boolean public_section;
12455               bfd_boolean gnu_section;
12456
12457               section_len = byte_get (p, 4);
12458               p += 4;
12459
12460               if (section_len > len)
12461                 {
12462                   error (_("Length of attribute (%u) greater than length of section (%u)\n"),
12463                           (unsigned) section_len, (unsigned) len);
12464                   section_len = len;
12465                 }
12466
12467               len -= section_len;
12468               section_len -= 4;
12469
12470               namelen = strnlen ((char *) p, section_len) + 1;
12471               if (namelen == 0 || namelen >= section_len)
12472                 {
12473                   error (_("Corrupt attribute section name\n"));
12474                   break;
12475                 }
12476
12477               printf (_("Attribute Section: %s\n"), p);
12478
12479               if (public_name && streq ((char *) p, public_name))
12480                 public_section = TRUE;
12481               else
12482                 public_section = FALSE;
12483
12484               if (streq ((char *) p, "gnu"))
12485                 gnu_section = TRUE;
12486               else
12487                 gnu_section = FALSE;
12488
12489               p += namelen;
12490               section_len -= namelen;
12491               while (section_len > 0)
12492                 {
12493                   int tag = *(p++);
12494                   int val;
12495                   bfd_vma size;
12496
12497                   size = byte_get (p, 4);
12498                   if (size > section_len)
12499                     {
12500                       error (_("Bad subsection length (%u > %u)\n"),
12501                               (unsigned) size, (unsigned) section_len);
12502                       size = section_len;
12503                     }
12504
12505                   section_len -= size;
12506                   end = p + size - 1;
12507                   p += 4;
12508
12509                   switch (tag)
12510                     {
12511                     case 1:
12512                       printf (_("File Attributes\n"));
12513                       break;
12514                     case 2:
12515                       printf (_("Section Attributes:"));
12516                       goto do_numlist;
12517                     case 3:
12518                       printf (_("Symbol Attributes:"));
12519                     do_numlist:
12520                       for (;;)
12521                         {
12522                           unsigned int j;
12523
12524                           val = read_uleb128 (p, &j, end);
12525                           p += j;
12526                           if (val == 0)
12527                             break;
12528                           printf (" %d", val);
12529                         }
12530                       printf ("\n");
12531                       break;
12532                     default:
12533                       printf (_("Unknown tag: %d\n"), tag);
12534                       public_section = FALSE;
12535                       break;
12536                     }
12537
12538                   if (public_section)
12539                     {
12540                       while (p < end)
12541                         p = display_pub_attribute (p, end);
12542                     }
12543                   else if (gnu_section)
12544                     {
12545                       while (p < end)
12546                         p = display_gnu_attribute (p,
12547                                                    display_proc_gnu_attribute,
12548                                                    end);
12549                     }
12550                   else
12551                     {
12552                       printf (_("  Unknown section contexts\n"));
12553                       display_raw_attribute (p, end);
12554                       p = end;
12555                     }
12556                 }
12557             }
12558         }
12559       else
12560         printf (_("Unknown format '%c' (%d)\n"), *p, *p);
12561
12562       free (contents);
12563     }
12564   return 1;
12565 }
12566
12567 static int
12568 process_arm_specific (FILE * file)
12569 {
12570   return process_attributes (file, "aeabi", SHT_ARM_ATTRIBUTES,
12571                              display_arm_attribute, NULL);
12572 }
12573
12574 static int
12575 process_power_specific (FILE * file)
12576 {
12577   return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
12578                              display_power_gnu_attribute);
12579 }
12580
12581 static int
12582 process_sparc_specific (FILE * file)
12583 {
12584   return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
12585                              display_sparc_gnu_attribute);
12586 }
12587
12588 static int
12589 process_tic6x_specific (FILE * file)
12590 {
12591   return process_attributes (file, "c6xabi", SHT_C6000_ATTRIBUTES,
12592                              display_tic6x_attribute, NULL);
12593 }
12594
12595 static int
12596 process_msp430x_specific (FILE * file)
12597 {
12598   return process_attributes (file, "mspabi", SHT_MSP430_ATTRIBUTES,
12599                              display_msp430x_attribute, NULL);
12600 }
12601
12602 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
12603    Print the Address, Access and Initial fields of an entry at VMA ADDR
12604    and return the VMA of the next entry.  */
12605
12606 static bfd_vma
12607 print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
12608 {
12609   printf ("  ");
12610   print_vma (addr, LONG_HEX);
12611   printf (" ");
12612   if (addr < pltgot + 0xfff0)
12613     printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
12614   else
12615     printf ("%10s", "");
12616   printf (" ");
12617   if (data == NULL)
12618     printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
12619   else
12620     {
12621       bfd_vma entry;
12622
12623       entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
12624       print_vma (entry, LONG_HEX);
12625     }
12626   return addr + (is_32bit_elf ? 4 : 8);
12627 }
12628
12629 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
12630    PLTGOT.  Print the Address and Initial fields of an entry at VMA
12631    ADDR and return the VMA of the next entry.  */
12632
12633 static bfd_vma
12634 print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
12635 {
12636   printf ("  ");
12637   print_vma (addr, LONG_HEX);
12638   printf (" ");
12639   if (data == NULL)
12640     printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
12641   else
12642     {
12643       bfd_vma entry;
12644
12645       entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
12646       print_vma (entry, LONG_HEX);
12647     }
12648   return addr + (is_32bit_elf ? 4 : 8);
12649 }
12650
12651 static void
12652 print_mips_ases (unsigned int mask)
12653 {
12654   if (mask & AFL_ASE_DSP)
12655     fputs ("\n\tDSP ASE", stdout);
12656   if (mask & AFL_ASE_DSPR2)
12657     fputs ("\n\tDSP R2 ASE", stdout);
12658   if (mask & AFL_ASE_EVA)
12659     fputs ("\n\tEnhanced VA Scheme", stdout);
12660   if (mask & AFL_ASE_MCU)
12661     fputs ("\n\tMCU (MicroController) ASE", stdout);
12662   if (mask & AFL_ASE_MDMX)
12663     fputs ("\n\tMDMX ASE", stdout);
12664   if (mask & AFL_ASE_MIPS3D)
12665     fputs ("\n\tMIPS-3D ASE", stdout);
12666   if (mask & AFL_ASE_MT)
12667     fputs ("\n\tMT ASE", stdout);
12668   if (mask & AFL_ASE_SMARTMIPS)
12669     fputs ("\n\tSmartMIPS ASE", stdout);
12670   if (mask & AFL_ASE_VIRT)
12671     fputs ("\n\tVZ ASE", stdout);
12672   if (mask & AFL_ASE_MSA)
12673     fputs ("\n\tMSA ASE", stdout);
12674   if (mask & AFL_ASE_MIPS16)
12675     fputs ("\n\tMIPS16 ASE", stdout);
12676   if (mask & AFL_ASE_MICROMIPS)
12677     fputs ("\n\tMICROMIPS ASE", stdout);
12678   if (mask & AFL_ASE_XPA)
12679     fputs ("\n\tXPA ASE", stdout);
12680   if (mask == 0)
12681     fprintf (stdout, "\n\t%s", _("None"));
12682 }
12683
12684 static void
12685 print_mips_isa_ext (unsigned int isa_ext)
12686 {
12687   switch (isa_ext)
12688     {
12689     case 0:
12690       fputs (_("None"), stdout);
12691       break;
12692     case AFL_EXT_XLR:
12693       fputs ("RMI XLR", stdout);
12694       break;
12695     case AFL_EXT_OCTEON2:
12696       fputs ("Cavium Networks Octeon2", stdout);
12697       break;
12698     case AFL_EXT_OCTEONP:
12699       fputs ("Cavium Networks OcteonP", stdout);
12700       break;
12701     case AFL_EXT_LOONGSON_3A:
12702       fputs ("Loongson 3A", stdout);
12703       break;
12704     case AFL_EXT_OCTEON:
12705       fputs ("Cavium Networks Octeon", stdout);
12706       break;
12707     case AFL_EXT_5900:
12708       fputs ("Toshiba R5900", stdout);
12709       break;
12710     case AFL_EXT_4650:
12711       fputs ("MIPS R4650", stdout);
12712       break;
12713     case AFL_EXT_4010:
12714       fputs ("LSI R4010", stdout);
12715       break;
12716     case AFL_EXT_4100:
12717       fputs ("NEC VR4100", stdout);
12718       break;
12719     case AFL_EXT_3900:
12720       fputs ("Toshiba R3900", stdout);
12721       break;
12722     case AFL_EXT_10000:
12723       fputs ("MIPS R10000", stdout);
12724       break;
12725     case AFL_EXT_SB1:
12726       fputs ("Broadcom SB-1", stdout);
12727       break;
12728     case AFL_EXT_4111:
12729       fputs ("NEC VR4111/VR4181", stdout);
12730       break;
12731     case AFL_EXT_4120:
12732       fputs ("NEC VR4120", stdout);
12733       break;
12734     case AFL_EXT_5400:
12735       fputs ("NEC VR5400", stdout);
12736       break;
12737     case AFL_EXT_5500:
12738       fputs ("NEC VR5500", stdout);
12739       break;
12740     case AFL_EXT_LOONGSON_2E:
12741       fputs ("ST Microelectronics Loongson 2E", stdout);
12742       break;
12743     case AFL_EXT_LOONGSON_2F:
12744       fputs ("ST Microelectronics Loongson 2F", stdout);
12745       break;
12746     default:
12747       fputs (_("Unknown"), stdout);
12748     }
12749 }
12750
12751 static int
12752 get_mips_reg_size (int reg_size)
12753 {
12754   return (reg_size == AFL_REG_NONE) ? 0
12755          : (reg_size == AFL_REG_32) ? 32
12756          : (reg_size == AFL_REG_64) ? 64
12757          : (reg_size == AFL_REG_128) ? 128
12758          : -1;
12759 }
12760
12761 static int
12762 process_mips_specific (FILE * file)
12763 {
12764   Elf_Internal_Dyn * entry;
12765   Elf_Internal_Shdr *sect = NULL;
12766   size_t liblist_offset = 0;
12767   size_t liblistno = 0;
12768   size_t conflictsno = 0;
12769   size_t options_offset = 0;
12770   size_t conflicts_offset = 0;
12771   size_t pltrelsz = 0;
12772   size_t pltrel = 0;
12773   bfd_vma pltgot = 0;
12774   bfd_vma mips_pltgot = 0;
12775   bfd_vma jmprel = 0;
12776   bfd_vma local_gotno = 0;
12777   bfd_vma gotsym = 0;
12778   bfd_vma symtabno = 0;
12779
12780   process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
12781                       display_mips_gnu_attribute);
12782
12783   sect = find_section (".MIPS.abiflags");
12784
12785   if (sect != NULL)
12786     {
12787       Elf_External_ABIFlags_v0 *abiflags_ext;
12788       Elf_Internal_ABIFlags_v0 abiflags_in;
12789
12790       if (sizeof (Elf_External_ABIFlags_v0) != sect->sh_size)
12791         fputs ("\nCorrupt ABI Flags section.\n", stdout);
12792       else
12793         {
12794           abiflags_ext = get_data (NULL, file, sect->sh_offset, 1,
12795                                    sect->sh_size, _("MIPS ABI Flags section"));
12796           if (abiflags_ext)
12797             {
12798               abiflags_in.version = BYTE_GET (abiflags_ext->version);
12799               abiflags_in.isa_level = BYTE_GET (abiflags_ext->isa_level);
12800               abiflags_in.isa_rev = BYTE_GET (abiflags_ext->isa_rev);
12801               abiflags_in.gpr_size = BYTE_GET (abiflags_ext->gpr_size);
12802               abiflags_in.cpr1_size = BYTE_GET (abiflags_ext->cpr1_size);
12803               abiflags_in.cpr2_size = BYTE_GET (abiflags_ext->cpr2_size);
12804               abiflags_in.fp_abi = BYTE_GET (abiflags_ext->fp_abi);
12805               abiflags_in.isa_ext = BYTE_GET (abiflags_ext->isa_ext);
12806               abiflags_in.ases = BYTE_GET (abiflags_ext->ases);
12807               abiflags_in.flags1 = BYTE_GET (abiflags_ext->flags1);
12808               abiflags_in.flags2 = BYTE_GET (abiflags_ext->flags2);
12809
12810               printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in.version);
12811               printf ("\nISA: MIPS%d", abiflags_in.isa_level);
12812               if (abiflags_in.isa_rev > 1)
12813                 printf ("r%d", abiflags_in.isa_rev);
12814               printf ("\nGPR size: %d",
12815                       get_mips_reg_size (abiflags_in.gpr_size));
12816               printf ("\nCPR1 size: %d",
12817                       get_mips_reg_size (abiflags_in.cpr1_size));
12818               printf ("\nCPR2 size: %d",
12819                       get_mips_reg_size (abiflags_in.cpr2_size));
12820               fputs ("\nFP ABI: ", stdout);
12821               print_mips_fp_abi_value (abiflags_in.fp_abi);
12822               fputs ("ISA Extension: ", stdout);
12823               print_mips_isa_ext (abiflags_in.isa_ext);
12824               fputs ("\nASEs:", stdout);
12825               print_mips_ases (abiflags_in.ases);
12826               printf ("\nFLAGS 1: %8.8lx", abiflags_in.flags1);
12827               printf ("\nFLAGS 2: %8.8lx", abiflags_in.flags2);
12828               fputc ('\n', stdout);
12829               free (abiflags_ext);
12830             }
12831         }
12832     }
12833
12834   /* We have a lot of special sections.  Thanks SGI!  */
12835   if (dynamic_section == NULL)
12836     /* No information available.  */
12837     return 0;
12838
12839   for (entry = dynamic_section; entry->d_tag != DT_NULL; ++entry)
12840     switch (entry->d_tag)
12841       {
12842       case DT_MIPS_LIBLIST:
12843         liblist_offset
12844           = offset_from_vma (file, entry->d_un.d_val,
12845                              liblistno * sizeof (Elf32_External_Lib));
12846         break;
12847       case DT_MIPS_LIBLISTNO:
12848         liblistno = entry->d_un.d_val;
12849         break;
12850       case DT_MIPS_OPTIONS:
12851         options_offset = offset_from_vma (file, entry->d_un.d_val, 0);
12852         break;
12853       case DT_MIPS_CONFLICT:
12854         conflicts_offset
12855           = offset_from_vma (file, entry->d_un.d_val,
12856                              conflictsno * sizeof (Elf32_External_Conflict));
12857         break;
12858       case DT_MIPS_CONFLICTNO:
12859         conflictsno = entry->d_un.d_val;
12860         break;
12861       case DT_PLTGOT:
12862         pltgot = entry->d_un.d_ptr;
12863         break;
12864       case DT_MIPS_LOCAL_GOTNO:
12865         local_gotno = entry->d_un.d_val;
12866         break;
12867       case DT_MIPS_GOTSYM:
12868         gotsym = entry->d_un.d_val;
12869         break;
12870       case DT_MIPS_SYMTABNO:
12871         symtabno = entry->d_un.d_val;
12872         break;
12873       case DT_MIPS_PLTGOT:
12874         mips_pltgot = entry->d_un.d_ptr;
12875         break;
12876       case DT_PLTREL:
12877         pltrel = entry->d_un.d_val;
12878         break;
12879       case DT_PLTRELSZ:
12880         pltrelsz = entry->d_un.d_val;
12881         break;
12882       case DT_JMPREL:
12883         jmprel = entry->d_un.d_ptr;
12884         break;
12885       default:
12886         break;
12887       }
12888
12889   if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
12890     {
12891       Elf32_External_Lib * elib;
12892       size_t cnt;
12893
12894       elib = (Elf32_External_Lib *) get_data (NULL, file, liblist_offset,
12895                                               liblistno,
12896                                               sizeof (Elf32_External_Lib),
12897                                               _("liblist section data"));
12898       if (elib)
12899         {
12900           printf (_("\nSection '.liblist' contains %lu entries:\n"),
12901                   (unsigned long) liblistno);
12902           fputs (_("     Library              Time Stamp          Checksum   Version Flags\n"),
12903                  stdout);
12904
12905           for (cnt = 0; cnt < liblistno; ++cnt)
12906             {
12907               Elf32_Lib liblist;
12908               time_t atime;
12909               char timebuf[20];
12910               struct tm * tmp;
12911
12912               liblist.l_name = BYTE_GET (elib[cnt].l_name);
12913               atime = BYTE_GET (elib[cnt].l_time_stamp);
12914               liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
12915               liblist.l_version = BYTE_GET (elib[cnt].l_version);
12916               liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
12917
12918               tmp = gmtime (&atime);
12919               snprintf (timebuf, sizeof (timebuf),
12920                         "%04u-%02u-%02uT%02u:%02u:%02u",
12921                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
12922                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
12923
12924               printf ("%3lu: ", (unsigned long) cnt);
12925               if (VALID_DYNAMIC_NAME (liblist.l_name))
12926                 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
12927               else
12928                 printf (_("<corrupt: %9ld>"), liblist.l_name);
12929               printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
12930                       liblist.l_version);
12931
12932               if (liblist.l_flags == 0)
12933                 puts (_(" NONE"));
12934               else
12935                 {
12936                   static const struct
12937                   {
12938                     const char * name;
12939                     int bit;
12940                   }
12941                   l_flags_vals[] =
12942                   {
12943                     { " EXACT_MATCH", LL_EXACT_MATCH },
12944                     { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
12945                     { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
12946                     { " EXPORTS", LL_EXPORTS },
12947                     { " DELAY_LOAD", LL_DELAY_LOAD },
12948                     { " DELTA", LL_DELTA }
12949                   };
12950                   int flags = liblist.l_flags;
12951                   size_t fcnt;
12952
12953                   for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
12954                     if ((flags & l_flags_vals[fcnt].bit) != 0)
12955                       {
12956                         fputs (l_flags_vals[fcnt].name, stdout);
12957                         flags ^= l_flags_vals[fcnt].bit;
12958                       }
12959                   if (flags != 0)
12960                     printf (" %#x", (unsigned int) flags);
12961
12962                   puts ("");
12963                 }
12964             }
12965
12966           free (elib);
12967         }
12968     }
12969
12970   if (options_offset != 0)
12971     {
12972       Elf_External_Options * eopt;
12973       Elf_Internal_Options * iopt;
12974       Elf_Internal_Options * option;
12975       size_t offset;
12976       int cnt;
12977       sect = section_headers;
12978
12979       /* Find the section header so that we get the size.  */
12980       while (sect->sh_type != SHT_MIPS_OPTIONS)
12981         ++sect;
12982
12983       eopt = (Elf_External_Options *) get_data (NULL, file, options_offset, 1,
12984                                                 sect->sh_size, _("options"));
12985       if (eopt)
12986         {
12987           iopt = (Elf_Internal_Options *)
12988               cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
12989           if (iopt == NULL)
12990             {
12991               error (_("Out of memory\n"));
12992               return 0;
12993             }
12994
12995           offset = cnt = 0;
12996           option = iopt;
12997
12998           while (offset < sect->sh_size)
12999             {
13000               Elf_External_Options * eoption;
13001
13002               eoption = (Elf_External_Options *) ((char *) eopt + offset);
13003
13004               option->kind = BYTE_GET (eoption->kind);
13005               option->size = BYTE_GET (eoption->size);
13006               option->section = BYTE_GET (eoption->section);
13007               option->info = BYTE_GET (eoption->info);
13008
13009               offset += option->size;
13010
13011               ++option;
13012               ++cnt;
13013             }
13014
13015           printf (_("\nSection '%s' contains %d entries:\n"),
13016                   SECTION_NAME (sect), cnt);
13017
13018           option = iopt;
13019
13020           while (cnt-- > 0)
13021             {
13022               size_t len;
13023
13024               switch (option->kind)
13025                 {
13026                 case ODK_NULL:
13027                   /* This shouldn't happen.  */
13028                   printf (" NULL       %d %lx", option->section, option->info);
13029                   break;
13030                 case ODK_REGINFO:
13031                   printf (" REGINFO    ");
13032                   if (elf_header.e_machine == EM_MIPS)
13033                     {
13034                       /* 32bit form.  */
13035                       Elf32_External_RegInfo * ereg;
13036                       Elf32_RegInfo reginfo;
13037
13038                       ereg = (Elf32_External_RegInfo *) (option + 1);
13039                       reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
13040                       reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
13041                       reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
13042                       reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
13043                       reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
13044                       reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
13045
13046                       printf ("GPR %08lx  GP 0x%lx\n",
13047                               reginfo.ri_gprmask,
13048                               (unsigned long) reginfo.ri_gp_value);
13049                       printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
13050                               reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
13051                               reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
13052                     }
13053                   else
13054                     {
13055                       /* 64 bit form.  */
13056                       Elf64_External_RegInfo * ereg;
13057                       Elf64_Internal_RegInfo reginfo;
13058
13059                       ereg = (Elf64_External_RegInfo *) (option + 1);
13060                       reginfo.ri_gprmask    = BYTE_GET (ereg->ri_gprmask);
13061                       reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
13062                       reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
13063                       reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
13064                       reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
13065                       reginfo.ri_gp_value   = BYTE_GET (ereg->ri_gp_value);
13066
13067                       printf ("GPR %08lx  GP 0x",
13068                               reginfo.ri_gprmask);
13069                       printf_vma (reginfo.ri_gp_value);
13070                       printf ("\n");
13071
13072                       printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
13073                               reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
13074                               reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
13075                     }
13076                   ++option;
13077                   continue;
13078                 case ODK_EXCEPTIONS:
13079                   fputs (" EXCEPTIONS fpe_min(", stdout);
13080                   process_mips_fpe_exception (option->info & OEX_FPU_MIN);
13081                   fputs (") fpe_max(", stdout);
13082                   process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
13083                   fputs (")", stdout);
13084
13085                   if (option->info & OEX_PAGE0)
13086                     fputs (" PAGE0", stdout);
13087                   if (option->info & OEX_SMM)
13088                     fputs (" SMM", stdout);
13089                   if (option->info & OEX_FPDBUG)
13090                     fputs (" FPDBUG", stdout);
13091                   if (option->info & OEX_DISMISS)
13092                     fputs (" DISMISS", stdout);
13093                   break;
13094                 case ODK_PAD:
13095                   fputs (" PAD       ", stdout);
13096                   if (option->info & OPAD_PREFIX)
13097                     fputs (" PREFIX", stdout);
13098                   if (option->info & OPAD_POSTFIX)
13099                     fputs (" POSTFIX", stdout);
13100                   if (option->info & OPAD_SYMBOL)
13101                     fputs (" SYMBOL", stdout);
13102                   break;
13103                 case ODK_HWPATCH:
13104                   fputs (" HWPATCH   ", stdout);
13105                   if (option->info & OHW_R4KEOP)
13106                     fputs (" R4KEOP", stdout);
13107                   if (option->info & OHW_R8KPFETCH)
13108                     fputs (" R8KPFETCH", stdout);
13109                   if (option->info & OHW_R5KEOP)
13110                     fputs (" R5KEOP", stdout);
13111                   if (option->info & OHW_R5KCVTL)
13112                     fputs (" R5KCVTL", stdout);
13113                   break;
13114                 case ODK_FILL:
13115                   fputs (" FILL       ", stdout);
13116                   /* XXX Print content of info word?  */
13117                   break;
13118                 case ODK_TAGS:
13119                   fputs (" TAGS       ", stdout);
13120                   /* XXX Print content of info word?  */
13121                   break;
13122                 case ODK_HWAND:
13123                   fputs (" HWAND     ", stdout);
13124                   if (option->info & OHWA0_R4KEOP_CHECKED)
13125                     fputs (" R4KEOP_CHECKED", stdout);
13126                   if (option->info & OHWA0_R4KEOP_CLEAN)
13127                     fputs (" R4KEOP_CLEAN", stdout);
13128                   break;
13129                 case ODK_HWOR:
13130                   fputs (" HWOR      ", stdout);
13131                   if (option->info & OHWA0_R4KEOP_CHECKED)
13132                     fputs (" R4KEOP_CHECKED", stdout);
13133                   if (option->info & OHWA0_R4KEOP_CLEAN)
13134                     fputs (" R4KEOP_CLEAN", stdout);
13135                   break;
13136                 case ODK_GP_GROUP:
13137                   printf (" GP_GROUP  %#06lx  self-contained %#06lx",
13138                           option->info & OGP_GROUP,
13139                           (option->info & OGP_SELF) >> 16);
13140                   break;
13141                 case ODK_IDENT:
13142                   printf (" IDENT     %#06lx  self-contained %#06lx",
13143                           option->info & OGP_GROUP,
13144                           (option->info & OGP_SELF) >> 16);
13145                   break;
13146                 default:
13147                   /* This shouldn't happen.  */
13148                   printf (" %3d ???     %d %lx",
13149                           option->kind, option->section, option->info);
13150                   break;
13151                 }
13152
13153               len = sizeof (* eopt);
13154               while (len < option->size)
13155                 if (((char *) option)[len] >= ' '
13156                     && ((char *) option)[len] < 0x7f)
13157                   printf ("%c", ((char *) option)[len++]);
13158                 else
13159                   printf ("\\%03o", ((char *) option)[len++]);
13160
13161               fputs ("\n", stdout);
13162               ++option;
13163             }
13164
13165           free (eopt);
13166         }
13167     }
13168
13169   if (conflicts_offset != 0 && conflictsno != 0)
13170     {
13171       Elf32_Conflict * iconf;
13172       size_t cnt;
13173
13174       if (dynamic_symbols == NULL)
13175         {
13176           error (_("conflict list found without a dynamic symbol table\n"));
13177           return 0;
13178         }
13179
13180       iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
13181       if (iconf == NULL)
13182         {
13183           error (_("Out of memory\n"));
13184           return 0;
13185         }
13186
13187       if (is_32bit_elf)
13188         {
13189           Elf32_External_Conflict * econf32;
13190
13191           econf32 = (Elf32_External_Conflict *)
13192               get_data (NULL, file, conflicts_offset, conflictsno,
13193                         sizeof (* econf32), _("conflict"));
13194           if (!econf32)
13195             return 0;
13196
13197           for (cnt = 0; cnt < conflictsno; ++cnt)
13198             iconf[cnt] = BYTE_GET (econf32[cnt]);
13199
13200           free (econf32);
13201         }
13202       else
13203         {
13204           Elf64_External_Conflict * econf64;
13205
13206           econf64 = (Elf64_External_Conflict *)
13207               get_data (NULL, file, conflicts_offset, conflictsno,
13208                         sizeof (* econf64), _("conflict"));
13209           if (!econf64)
13210             return 0;
13211
13212           for (cnt = 0; cnt < conflictsno; ++cnt)
13213             iconf[cnt] = BYTE_GET (econf64[cnt]);
13214
13215           free (econf64);
13216         }
13217
13218       printf (_("\nSection '.conflict' contains %lu entries:\n"),
13219               (unsigned long) conflictsno);
13220       puts (_("  Num:    Index       Value  Name"));
13221
13222       for (cnt = 0; cnt < conflictsno; ++cnt)
13223         {
13224           Elf_Internal_Sym * psym = & dynamic_symbols[iconf[cnt]];
13225
13226           printf ("%5lu: %8lu  ", (unsigned long) cnt, iconf[cnt]);
13227           print_vma (psym->st_value, FULL_HEX);
13228           putchar (' ');
13229           if (VALID_DYNAMIC_NAME (psym->st_name))
13230             print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
13231           else
13232             printf (_("<corrupt: %14ld>"), psym->st_name);
13233           putchar ('\n');
13234         }
13235
13236       free (iconf);
13237     }
13238
13239   if (pltgot != 0 && local_gotno != 0)
13240     {
13241       bfd_vma ent, local_end, global_end;
13242       size_t i, offset;
13243       unsigned char * data;
13244       int addr_size;
13245
13246       ent = pltgot;
13247       addr_size = (is_32bit_elf ? 4 : 8);
13248       local_end = pltgot + local_gotno * addr_size;
13249       global_end = local_end + (symtabno - gotsym) * addr_size;
13250
13251       offset = offset_from_vma (file, pltgot, global_end - pltgot);
13252       data = (unsigned char *) get_data (NULL, file, offset,
13253                                          global_end - pltgot, 1,
13254                                          _("Global Offset Table data"));
13255       if (data == NULL)
13256         return 0;
13257
13258       printf (_("\nPrimary GOT:\n"));
13259       printf (_(" Canonical gp value: "));
13260       print_vma (pltgot + 0x7ff0, LONG_HEX);
13261       printf ("\n\n");
13262
13263       printf (_(" Reserved entries:\n"));
13264       printf (_("  %*s %10s %*s Purpose\n"),
13265               addr_size * 2, _("Address"), _("Access"),
13266               addr_size * 2, _("Initial"));
13267       ent = print_mips_got_entry (data, pltgot, ent);
13268       printf (_(" Lazy resolver\n"));
13269       if (data
13270           && (byte_get (data + ent - pltgot, addr_size)
13271               >> (addr_size * 8 - 1)) != 0)
13272         {
13273           ent = print_mips_got_entry (data, pltgot, ent);
13274           printf (_(" Module pointer (GNU extension)\n"));
13275         }
13276       printf ("\n");
13277
13278       if (ent < local_end)
13279         {
13280           printf (_(" Local entries:\n"));
13281           printf ("  %*s %10s %*s\n",
13282                   addr_size * 2, _("Address"), _("Access"),
13283                   addr_size * 2, _("Initial"));
13284           while (ent < local_end)
13285             {
13286               ent = print_mips_got_entry (data, pltgot, ent);
13287               printf ("\n");
13288             }
13289           printf ("\n");
13290         }
13291
13292       if (gotsym < symtabno)
13293         {
13294           int sym_width;
13295
13296           printf (_(" Global entries:\n"));
13297           printf ("  %*s %10s %*s %*s %-7s %3s %s\n",
13298                   addr_size * 2, _("Address"),
13299                   _("Access"),
13300                   addr_size * 2, _("Initial"),
13301                   addr_size * 2, _("Sym.Val."),
13302                   _("Type"),
13303                   /* Note for translators: "Ndx" = abbreviated form of "Index".  */
13304                   _("Ndx"), _("Name"));
13305
13306           sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
13307           for (i = gotsym; i < symtabno; i++)
13308             {
13309               Elf_Internal_Sym * psym;
13310
13311               psym = dynamic_symbols + i;
13312               ent = print_mips_got_entry (data, pltgot, ent);
13313               printf (" ");
13314               print_vma (psym->st_value, LONG_HEX);
13315               printf (" %-7s %3s ",
13316                       get_symbol_type (ELF_ST_TYPE (psym->st_info)),
13317                       get_symbol_index_type (psym->st_shndx));
13318               if (VALID_DYNAMIC_NAME (psym->st_name))
13319                 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
13320               else
13321                 printf (_("<corrupt: %14ld>"), psym->st_name);
13322               printf ("\n");
13323             }
13324           printf ("\n");
13325         }
13326
13327       if (data)
13328         free (data);
13329     }
13330
13331   if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
13332     {
13333       bfd_vma ent, end;
13334       size_t offset, rel_offset;
13335       unsigned long count, i;
13336       unsigned char * data;
13337       int addr_size, sym_width;
13338       Elf_Internal_Rela * rels;
13339
13340       rel_offset = offset_from_vma (file, jmprel, pltrelsz);
13341       if (pltrel == DT_RELA)
13342         {
13343           if (!slurp_rela_relocs (file, rel_offset, pltrelsz, &rels, &count))
13344             return 0;
13345         }
13346       else
13347         {
13348           if (!slurp_rel_relocs (file, rel_offset, pltrelsz, &rels, &count))
13349             return 0;
13350         }
13351
13352       ent = mips_pltgot;
13353       addr_size = (is_32bit_elf ? 4 : 8);
13354       end = mips_pltgot + (2 + count) * addr_size;
13355
13356       offset = offset_from_vma (file, mips_pltgot, end - mips_pltgot);
13357       data = (unsigned char *) get_data (NULL, file, offset, end - mips_pltgot,
13358                                          1, _("Procedure Linkage Table data"));
13359       if (data == NULL)
13360         return 0;
13361
13362       printf ("\nPLT GOT:\n\n");
13363       printf (_(" Reserved entries:\n"));
13364       printf (_("  %*s %*s Purpose\n"),
13365               addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
13366       ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
13367       printf (_(" PLT lazy resolver\n"));
13368       ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
13369       printf (_(" Module pointer\n"));
13370       printf ("\n");
13371
13372       printf (_(" Entries:\n"));
13373       printf ("  %*s %*s %*s %-7s %3s %s\n",
13374               addr_size * 2, _("Address"),
13375               addr_size * 2, _("Initial"),
13376               addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
13377       sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
13378       for (i = 0; i < count; i++)
13379         {
13380           Elf_Internal_Sym * psym;
13381
13382           psym = dynamic_symbols + get_reloc_symindex (rels[i].r_info);
13383           ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
13384           printf (" ");
13385           print_vma (psym->st_value, LONG_HEX);
13386           printf (" %-7s %3s ",
13387                   get_symbol_type (ELF_ST_TYPE (psym->st_info)),
13388                   get_symbol_index_type (psym->st_shndx));
13389           if (VALID_DYNAMIC_NAME (psym->st_name))
13390             print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
13391           else
13392             printf (_("<corrupt: %14ld>"), psym->st_name);
13393           printf ("\n");
13394         }
13395       printf ("\n");
13396
13397       if (data)
13398         free (data);
13399       free (rels);
13400     }
13401
13402   return 1;
13403 }
13404
13405 static int
13406 process_nds32_specific (FILE * file)
13407 {
13408   Elf_Internal_Shdr *sect = NULL;
13409
13410   sect = find_section (".nds32_e_flags");
13411   if (sect != NULL)
13412     {
13413       unsigned int *flag;
13414
13415       printf ("\nNDS32 elf flags section:\n");
13416       flag = get_data (NULL, file, sect->sh_offset, 1,
13417                        sect->sh_size, _("NDS32 elf flags section"));
13418
13419       switch ((*flag) & 0x3)
13420         {
13421         case 0:
13422           printf ("(VEC_SIZE):\tNo entry.\n");
13423           break;
13424         case 1:
13425           printf ("(VEC_SIZE):\t4 bytes\n");
13426           break;
13427         case 2:
13428           printf ("(VEC_SIZE):\t16 bytes\n");
13429           break;
13430         case 3:
13431           printf ("(VEC_SIZE):\treserved\n");
13432           break;
13433         }
13434     }
13435
13436   return TRUE;
13437 }
13438
13439 static int
13440 process_gnu_liblist (FILE * file)
13441 {
13442   Elf_Internal_Shdr * section;
13443   Elf_Internal_Shdr * string_sec;
13444   Elf32_External_Lib * elib;
13445   char * strtab;
13446   size_t strtab_size;
13447   size_t cnt;
13448   unsigned i;
13449
13450   if (! do_arch)
13451     return 0;
13452
13453   for (i = 0, section = section_headers;
13454        i < elf_header.e_shnum;
13455        i++, section++)
13456     {
13457       switch (section->sh_type)
13458         {
13459         case SHT_GNU_LIBLIST:
13460           if (section->sh_link >= elf_header.e_shnum)
13461             break;
13462
13463           elib = (Elf32_External_Lib *)
13464               get_data (NULL, file, section->sh_offset, 1, section->sh_size,
13465                         _("liblist section data"));
13466
13467           if (elib == NULL)
13468             break;
13469           string_sec = section_headers + section->sh_link;
13470
13471           strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
13472                                       string_sec->sh_size,
13473                                       _("liblist string table"));
13474           if (strtab == NULL
13475               || section->sh_entsize != sizeof (Elf32_External_Lib))
13476             {
13477               free (elib);
13478               free (strtab);
13479               break;
13480             }
13481           strtab_size = string_sec->sh_size;
13482
13483           printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
13484                   SECTION_NAME (section),
13485                   (unsigned long) (section->sh_size / sizeof (Elf32_External_Lib)));
13486
13487           puts (_("     Library              Time Stamp          Checksum   Version Flags"));
13488
13489           for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
13490                ++cnt)
13491             {
13492               Elf32_Lib liblist;
13493               time_t atime;
13494               char timebuf[20];
13495               struct tm * tmp;
13496
13497               liblist.l_name = BYTE_GET (elib[cnt].l_name);
13498               atime = BYTE_GET (elib[cnt].l_time_stamp);
13499               liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
13500               liblist.l_version = BYTE_GET (elib[cnt].l_version);
13501               liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
13502
13503               tmp = gmtime (&atime);
13504               snprintf (timebuf, sizeof (timebuf),
13505                         "%04u-%02u-%02uT%02u:%02u:%02u",
13506                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
13507                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
13508
13509               printf ("%3lu: ", (unsigned long) cnt);
13510               if (do_wide)
13511                 printf ("%-20s", liblist.l_name < strtab_size
13512                         ? strtab + liblist.l_name : _("<corrupt>"));
13513               else
13514                 printf ("%-20.20s", liblist.l_name < strtab_size
13515                         ? strtab + liblist.l_name : _("<corrupt>"));
13516               printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
13517                       liblist.l_version, liblist.l_flags);
13518             }
13519
13520           free (elib);
13521           free (strtab);
13522         }
13523     }
13524
13525   return 1;
13526 }
13527
13528 static const char *
13529 get_note_type (unsigned e_type)
13530 {
13531   static char buff[64];
13532
13533   if (elf_header.e_type == ET_CORE)
13534     switch (e_type)
13535       {
13536       case NT_AUXV:
13537         return _("NT_AUXV (auxiliary vector)");
13538       case NT_PRSTATUS:
13539         return _("NT_PRSTATUS (prstatus structure)");
13540       case NT_FPREGSET:
13541         return _("NT_FPREGSET (floating point registers)");
13542       case NT_PRPSINFO:
13543         return _("NT_PRPSINFO (prpsinfo structure)");
13544       case NT_TASKSTRUCT:
13545         return _("NT_TASKSTRUCT (task structure)");
13546       case NT_PRXFPREG:
13547         return _("NT_PRXFPREG (user_xfpregs structure)");
13548       case NT_PPC_VMX:
13549         return _("NT_PPC_VMX (ppc Altivec registers)");
13550       case NT_PPC_VSX:
13551         return _("NT_PPC_VSX (ppc VSX registers)");
13552       case NT_386_TLS:
13553         return _("NT_386_TLS (x86 TLS information)");
13554       case NT_386_IOPERM:
13555         return _("NT_386_IOPERM (x86 I/O permissions)");
13556       case NT_X86_XSTATE:
13557         return _("NT_X86_XSTATE (x86 XSAVE extended state)");
13558       case NT_S390_HIGH_GPRS:
13559         return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
13560       case NT_S390_TIMER:
13561         return _("NT_S390_TIMER (s390 timer register)");
13562       case NT_S390_TODCMP:
13563         return _("NT_S390_TODCMP (s390 TOD comparator register)");
13564       case NT_S390_TODPREG:
13565         return _("NT_S390_TODPREG (s390 TOD programmable register)");
13566       case NT_S390_CTRS:
13567         return _("NT_S390_CTRS (s390 control registers)");
13568       case NT_S390_PREFIX:
13569         return _("NT_S390_PREFIX (s390 prefix register)");
13570       case NT_S390_LAST_BREAK:
13571         return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
13572       case NT_S390_SYSTEM_CALL:
13573         return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
13574       case NT_S390_TDB:
13575         return _("NT_S390_TDB (s390 transaction diagnostic block)");
13576       case NT_ARM_VFP:
13577         return _("NT_ARM_VFP (arm VFP registers)");
13578       case NT_ARM_TLS:
13579         return _("NT_ARM_TLS (AArch TLS registers)");
13580       case NT_ARM_HW_BREAK:
13581         return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
13582       case NT_ARM_HW_WATCH:
13583         return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
13584       case NT_PSTATUS:
13585         return _("NT_PSTATUS (pstatus structure)");
13586       case NT_FPREGS:
13587         return _("NT_FPREGS (floating point registers)");
13588       case NT_PSINFO:
13589         return _("NT_PSINFO (psinfo structure)");
13590       case NT_LWPSTATUS:
13591         return _("NT_LWPSTATUS (lwpstatus_t structure)");
13592       case NT_LWPSINFO:
13593         return _("NT_LWPSINFO (lwpsinfo_t structure)");
13594       case NT_WIN32PSTATUS:
13595         return _("NT_WIN32PSTATUS (win32_pstatus structure)");
13596       case NT_SIGINFO:
13597         return _("NT_SIGINFO (siginfo_t data)");
13598       case NT_FILE:
13599         return _("NT_FILE (mapped files)");
13600       default:
13601         break;
13602       }
13603   else
13604     switch (e_type)
13605       {
13606       case NT_VERSION:
13607         return _("NT_VERSION (version)");
13608       case NT_ARCH:
13609         return _("NT_ARCH (architecture)");
13610       default:
13611         break;
13612       }
13613
13614   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
13615   return buff;
13616 }
13617
13618 static int
13619 print_core_note (Elf_Internal_Note *pnote)
13620 {
13621   unsigned int addr_size = is_32bit_elf ? 4 : 8;
13622   bfd_vma count, page_size;
13623   unsigned char *descdata, *filenames, *descend;
13624
13625   if (pnote->type != NT_FILE)
13626     return 1;
13627
13628 #ifndef BFD64
13629   if (!is_32bit_elf)
13630     {
13631       printf (_("    Cannot decode 64-bit note in 32-bit build\n"));
13632       /* Still "successful".  */
13633       return 1;
13634     }
13635 #endif
13636
13637   if (pnote->descsz < 2 * addr_size)
13638     {
13639       printf (_("    Malformed note - too short for header\n"));
13640       return 0;
13641     }
13642
13643   descdata = (unsigned char *) pnote->descdata;
13644   descend = descdata + pnote->descsz;
13645
13646   if (descdata[pnote->descsz - 1] != '\0')
13647     {
13648       printf (_("    Malformed note - does not end with \\0\n"));
13649       return 0;
13650     }
13651
13652   count = byte_get (descdata, addr_size);
13653   descdata += addr_size;
13654
13655   page_size = byte_get (descdata, addr_size);
13656   descdata += addr_size;
13657
13658   if (pnote->descsz < 2 * addr_size + count * 3 * addr_size)
13659     {
13660       printf (_("    Malformed note - too short for supplied file count\n"));
13661       return 0;
13662     }
13663
13664   printf (_("    Page size: "));
13665   print_vma (page_size, DEC);
13666   printf ("\n");
13667
13668   printf (_("    %*s%*s%*s\n"),
13669           (int) (2 + 2 * addr_size), _("Start"),
13670           (int) (4 + 2 * addr_size), _("End"),
13671           (int) (4 + 2 * addr_size), _("Page Offset"));
13672   filenames = descdata + count * 3 * addr_size;
13673   while (--count > 0)
13674     {
13675       bfd_vma start, end, file_ofs;
13676
13677       if (filenames == descend)
13678         {
13679           printf (_("    Malformed note - filenames end too early\n"));
13680           return 0;
13681         }
13682
13683       start = byte_get (descdata, addr_size);
13684       descdata += addr_size;
13685       end = byte_get (descdata, addr_size);
13686       descdata += addr_size;
13687       file_ofs = byte_get (descdata, addr_size);
13688       descdata += addr_size;
13689
13690       printf ("    ");
13691       print_vma (start, FULL_HEX);
13692       printf ("  ");
13693       print_vma (end, FULL_HEX);
13694       printf ("  ");
13695       print_vma (file_ofs, FULL_HEX);
13696       printf ("\n        %s\n", filenames);
13697
13698       filenames += 1 + strlen ((char *) filenames);
13699     }
13700
13701   return 1;
13702 }
13703
13704 static const char *
13705 get_gnu_elf_note_type (unsigned e_type)
13706 {
13707   static char buff[64];
13708
13709   switch (e_type)
13710     {
13711     case NT_GNU_ABI_TAG:
13712       return _("NT_GNU_ABI_TAG (ABI version tag)");
13713     case NT_GNU_HWCAP:
13714       return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
13715     case NT_GNU_BUILD_ID:
13716       return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
13717     case NT_GNU_GOLD_VERSION:
13718       return _("NT_GNU_GOLD_VERSION (gold version)");
13719     default:
13720       break;
13721     }
13722
13723   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
13724   return buff;
13725 }
13726
13727 static int
13728 print_gnu_note (Elf_Internal_Note *pnote)
13729 {
13730   switch (pnote->type)
13731     {
13732     case NT_GNU_BUILD_ID:
13733       {
13734         unsigned long i;
13735
13736         printf (_("    Build ID: "));
13737         for (i = 0; i < pnote->descsz; ++i)
13738           printf ("%02x", pnote->descdata[i] & 0xff);
13739         printf ("\n");
13740       }
13741       break;
13742
13743     case NT_GNU_ABI_TAG:
13744       {
13745         unsigned long os, major, minor, subminor;
13746         const char *osname;
13747
13748         os = byte_get ((unsigned char *) pnote->descdata, 4);
13749         major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
13750         minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
13751         subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
13752
13753         switch (os)
13754           {
13755           case GNU_ABI_TAG_LINUX:
13756             osname = "Linux";
13757             break;
13758           case GNU_ABI_TAG_HURD:
13759             osname = "Hurd";
13760             break;
13761           case GNU_ABI_TAG_SOLARIS:
13762             osname = "Solaris";
13763             break;
13764           case GNU_ABI_TAG_FREEBSD:
13765             osname = "FreeBSD";
13766             break;
13767           case GNU_ABI_TAG_NETBSD:
13768             osname = "NetBSD";
13769             break;
13770           default:
13771             osname = "Unknown";
13772             break;
13773           }
13774
13775         printf (_("    OS: %s, ABI: %ld.%ld.%ld\n"), osname,
13776                 major, minor, subminor);
13777       }
13778       break;
13779
13780     case NT_GNU_GOLD_VERSION:
13781       {
13782         unsigned long i;
13783
13784         printf (_("    Version: "));
13785         for (i = 0; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
13786           printf ("%c", pnote->descdata[i]);
13787         printf ("\n");
13788       }
13789       break;
13790     }
13791
13792   return 1;
13793 }
13794
13795 static const char *
13796 get_netbsd_elfcore_note_type (unsigned e_type)
13797 {
13798   static char buff[64];
13799
13800   if (e_type == NT_NETBSDCORE_PROCINFO)
13801     {
13802       /* NetBSD core "procinfo" structure.  */
13803       return _("NetBSD procinfo structure");
13804     }
13805
13806   /* As of Jan 2002 there are no other machine-independent notes
13807      defined for NetBSD core files.  If the note type is less
13808      than the start of the machine-dependent note types, we don't
13809      understand it.  */
13810
13811   if (e_type < NT_NETBSDCORE_FIRSTMACH)
13812     {
13813       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
13814       return buff;
13815     }
13816
13817   switch (elf_header.e_machine)
13818     {
13819     /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
13820        and PT_GETFPREGS == mach+2.  */
13821
13822     case EM_OLD_ALPHA:
13823     case EM_ALPHA:
13824     case EM_SPARC:
13825     case EM_SPARC32PLUS:
13826     case EM_SPARCV9:
13827       switch (e_type)
13828         {
13829         case NT_NETBSDCORE_FIRSTMACH + 0:
13830           return _("PT_GETREGS (reg structure)");
13831         case NT_NETBSDCORE_FIRSTMACH + 2:
13832           return _("PT_GETFPREGS (fpreg structure)");
13833         default:
13834           break;
13835         }
13836       break;
13837
13838     /* On all other arch's, PT_GETREGS == mach+1 and
13839        PT_GETFPREGS == mach+3.  */
13840     default:
13841       switch (e_type)
13842         {
13843         case NT_NETBSDCORE_FIRSTMACH + 1:
13844           return _("PT_GETREGS (reg structure)");
13845         case NT_NETBSDCORE_FIRSTMACH + 3:
13846           return _("PT_GETFPREGS (fpreg structure)");
13847         default:
13848           break;
13849         }
13850     }
13851
13852   snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
13853             e_type - NT_NETBSDCORE_FIRSTMACH);
13854   return buff;
13855 }
13856
13857 static const char *
13858 get_stapsdt_note_type (unsigned e_type)
13859 {
13860   static char buff[64];
13861
13862   switch (e_type)
13863     {
13864     case NT_STAPSDT:
13865       return _("NT_STAPSDT (SystemTap probe descriptors)");
13866
13867     default:
13868       break;
13869     }
13870
13871   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
13872   return buff;
13873 }
13874
13875 static int
13876 print_stapsdt_note (Elf_Internal_Note *pnote)
13877 {
13878   int addr_size = is_32bit_elf ? 4 : 8;
13879   char *data = pnote->descdata;
13880   char *data_end = pnote->descdata + pnote->descsz;
13881   bfd_vma pc, base_addr, semaphore;
13882   char *provider, *probe, *arg_fmt;
13883
13884   pc = byte_get ((unsigned char *) data, addr_size);
13885   data += addr_size;
13886   base_addr = byte_get ((unsigned char *) data, addr_size);
13887   data += addr_size;
13888   semaphore = byte_get ((unsigned char *) data, addr_size);
13889   data += addr_size;
13890
13891   provider = data;
13892   data += strlen (data) + 1;
13893   probe = data;
13894   data += strlen (data) + 1;
13895   arg_fmt = data;
13896   data += strlen (data) + 1;
13897
13898   printf (_("    Provider: %s\n"), provider);
13899   printf (_("    Name: %s\n"), probe);
13900   printf (_("    Location: "));
13901   print_vma (pc, FULL_HEX);
13902   printf (_(", Base: "));
13903   print_vma (base_addr, FULL_HEX);
13904   printf (_(", Semaphore: "));
13905   print_vma (semaphore, FULL_HEX);
13906   printf ("\n");
13907   printf (_("    Arguments: %s\n"), arg_fmt);
13908
13909   return data == data_end;
13910 }
13911
13912 static const char *
13913 get_ia64_vms_note_type (unsigned e_type)
13914 {
13915   static char buff[64];
13916
13917   switch (e_type)
13918     {
13919     case NT_VMS_MHD:
13920       return _("NT_VMS_MHD (module header)");
13921     case NT_VMS_LNM:
13922       return _("NT_VMS_LNM (language name)");
13923     case NT_VMS_SRC:
13924       return _("NT_VMS_SRC (source files)");
13925     case NT_VMS_TITLE:
13926       return "NT_VMS_TITLE";
13927     case NT_VMS_EIDC:
13928       return _("NT_VMS_EIDC (consistency check)");
13929     case NT_VMS_FPMODE:
13930       return _("NT_VMS_FPMODE (FP mode)");
13931     case NT_VMS_LINKTIME:
13932       return "NT_VMS_LINKTIME";
13933     case NT_VMS_IMGNAM:
13934       return _("NT_VMS_IMGNAM (image name)");
13935     case NT_VMS_IMGID:
13936       return _("NT_VMS_IMGID (image id)");
13937     case NT_VMS_LINKID:
13938       return _("NT_VMS_LINKID (link id)");
13939     case NT_VMS_IMGBID:
13940       return _("NT_VMS_IMGBID (build id)");
13941     case NT_VMS_GSTNAM:
13942       return _("NT_VMS_GSTNAM (sym table name)");
13943     case NT_VMS_ORIG_DYN:
13944       return "NT_VMS_ORIG_DYN";
13945     case NT_VMS_PATCHTIME:
13946       return "NT_VMS_PATCHTIME";
13947     default:
13948       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
13949       return buff;
13950     }
13951 }
13952
13953 static int
13954 print_ia64_vms_note (Elf_Internal_Note * pnote)
13955 {
13956   switch (pnote->type)
13957     {
13958     case NT_VMS_MHD:
13959       if (pnote->descsz > 36)
13960         {
13961           size_t l = strlen (pnote->descdata + 34);
13962           printf (_("    Creation date  : %.17s\n"), pnote->descdata);
13963           printf (_("    Last patch date: %.17s\n"), pnote->descdata + 17);
13964           printf (_("    Module name    : %s\n"), pnote->descdata + 34);
13965           printf (_("    Module version : %s\n"), pnote->descdata + 34 + l + 1);
13966         }
13967       else
13968         printf (_("    Invalid size\n"));
13969       break;
13970     case NT_VMS_LNM:
13971       printf (_("   Language: %s\n"), pnote->descdata);
13972       break;
13973 #ifdef BFD64
13974     case NT_VMS_FPMODE:
13975       printf (_("   Floating Point mode: "));
13976       printf ("0x%016" BFD_VMA_FMT "x\n",
13977               (bfd_vma)byte_get ((unsigned char *)pnote->descdata, 8));
13978       break;
13979     case NT_VMS_LINKTIME:
13980       printf (_("   Link time: "));
13981       print_vms_time
13982         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
13983       printf ("\n");
13984       break;
13985     case NT_VMS_PATCHTIME:
13986       printf (_("   Patch time: "));
13987       print_vms_time
13988         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
13989       printf ("\n");
13990       break;
13991     case NT_VMS_ORIG_DYN:
13992       printf (_("   Major id: %u,  minor id: %u\n"),
13993               (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
13994               (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
13995       printf (_("   Last modified  : "));
13996       print_vms_time
13997         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
13998       printf (_("\n   Link flags  : "));
13999       printf ("0x%016" BFD_VMA_FMT "x\n",
14000               (bfd_vma)byte_get ((unsigned char *)pnote->descdata + 16, 8));
14001       printf (_("   Header flags: 0x%08x\n"),
14002               (unsigned)byte_get ((unsigned char *)pnote->descdata + 24, 4));
14003       printf (_("   Image id    : %s\n"), pnote->descdata + 32);
14004       break;
14005 #endif
14006     case NT_VMS_IMGNAM:
14007       printf (_("    Image name: %s\n"), pnote->descdata);
14008       break;
14009     case NT_VMS_GSTNAM:
14010       printf (_("    Global symbol table name: %s\n"), pnote->descdata);
14011       break;
14012     case NT_VMS_IMGID:
14013       printf (_("    Image id: %s\n"), pnote->descdata);
14014       break;
14015     case NT_VMS_LINKID:
14016       printf (_("    Linker id: %s\n"), pnote->descdata);
14017       break;
14018     default:
14019       break;
14020     }
14021   return 1;
14022 }
14023
14024 /* Note that by the ELF standard, the name field is already null byte
14025    terminated, and namesz includes the terminating null byte.
14026    I.E. the value of namesz for the name "FSF" is 4.
14027
14028    If the value of namesz is zero, there is no name present.  */
14029 static int
14030 process_note (Elf_Internal_Note * pnote)
14031 {
14032   const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
14033   const char * nt;
14034
14035   if (pnote->namesz == 0)
14036     /* If there is no note name, then use the default set of
14037        note type strings.  */
14038     nt = get_note_type (pnote->type);
14039
14040   else if (const_strneq (pnote->namedata, "GNU"))
14041     /* GNU-specific object file notes.  */
14042     nt = get_gnu_elf_note_type (pnote->type);
14043
14044   else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
14045     /* NetBSD-specific core file notes.  */
14046     nt = get_netbsd_elfcore_note_type (pnote->type);
14047
14048   else if (strneq (pnote->namedata, "SPU/", 4))
14049     {
14050       /* SPU-specific core file notes.  */
14051       nt = pnote->namedata + 4;
14052       name = "SPU";
14053     }
14054
14055   else if (const_strneq (pnote->namedata, "IPF/VMS"))
14056     /* VMS/ia64-specific file notes.  */
14057     nt = get_ia64_vms_note_type (pnote->type);
14058
14059   else if (const_strneq (pnote->namedata, "stapsdt"))
14060     nt = get_stapsdt_note_type (pnote->type);
14061
14062   else
14063     /* Don't recognize this note name; just use the default set of
14064        note type strings.  */
14065     nt = get_note_type (pnote->type);
14066
14067   printf ("  %-20s 0x%08lx\t%s\n", name, pnote->descsz, nt);
14068
14069   if (const_strneq (pnote->namedata, "IPF/VMS"))
14070     return print_ia64_vms_note (pnote);
14071   else if (const_strneq (pnote->namedata, "GNU"))
14072     return print_gnu_note (pnote);
14073   else if (const_strneq (pnote->namedata, "stapsdt"))
14074     return print_stapsdt_note (pnote);
14075   else if (const_strneq (pnote->namedata, "CORE"))
14076     return print_core_note (pnote);
14077   else
14078     return 1;
14079 }
14080
14081
14082 static int
14083 process_corefile_note_segment (FILE * file, bfd_vma offset, bfd_vma length)
14084 {
14085   Elf_External_Note * pnotes;
14086   Elf_External_Note * external;
14087   int res = 1;
14088
14089   if (length <= 0)
14090     return 0;
14091
14092   pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
14093                                            _("notes"));
14094   if (pnotes == NULL)
14095     return 0;
14096
14097   external = pnotes;
14098
14099   printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
14100           (unsigned long) offset, (unsigned long) length);
14101   printf (_("  %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
14102
14103   while ((char *) external < (char *) pnotes + length)
14104     {
14105       Elf_Internal_Note inote;
14106       size_t min_notesz;
14107       char *next;
14108       char * temp = NULL;
14109       size_t data_remaining = ((char *) pnotes + length) - (char *) external;
14110
14111       if (!is_ia64_vms ())
14112         {
14113           /* PR binutils/15191
14114              Make sure that there is enough data to read.  */
14115           min_notesz = offsetof (Elf_External_Note, name);
14116           if (data_remaining < min_notesz)
14117             {
14118               warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
14119                     (int) data_remaining);
14120               break;
14121             }
14122           inote.type     = BYTE_GET (external->type);
14123           inote.namesz   = BYTE_GET (external->namesz);
14124           inote.namedata = external->name;
14125           inote.descsz   = BYTE_GET (external->descsz);
14126           inote.descdata = inote.namedata + align_power (inote.namesz, 2);
14127           inote.descpos  = offset + (inote.descdata - (char *) pnotes);
14128           next = inote.descdata + align_power (inote.descsz, 2);
14129         }
14130       else
14131         {
14132           Elf64_External_VMS_Note *vms_external;
14133
14134           /* PR binutils/15191
14135              Make sure that there is enough data to read.  */
14136           min_notesz = offsetof (Elf64_External_VMS_Note, name);
14137           if (data_remaining < min_notesz)
14138             {
14139               warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
14140                     (int) data_remaining);
14141               break;
14142             }
14143
14144           vms_external = (Elf64_External_VMS_Note *) external;
14145           inote.type     = BYTE_GET (vms_external->type);
14146           inote.namesz   = BYTE_GET (vms_external->namesz);
14147           inote.namedata = vms_external->name;
14148           inote.descsz   = BYTE_GET (vms_external->descsz);
14149           inote.descdata = inote.namedata + align_power (inote.namesz, 3);
14150           inote.descpos  = offset + (inote.descdata - (char *) pnotes);
14151           next = inote.descdata + align_power (inote.descsz, 3);
14152         }
14153
14154       if (inote.descdata < (char *) external + min_notesz
14155           || next < (char *) external + min_notesz
14156           || data_remaining < (size_t)(next - (char *) external))
14157         {
14158           warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
14159                 (unsigned long) ((char *) external - (char *) pnotes));
14160           warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx\n"),
14161                 inote.type, inote.namesz, inote.descsz);
14162           break;
14163         }
14164
14165       external = (Elf_External_Note *) next;
14166
14167       /* Verify that name is null terminated.  It appears that at least
14168          one version of Linux (RedHat 6.0) generates corefiles that don't
14169          comply with the ELF spec by failing to include the null byte in
14170          namesz.  */
14171       if (inote.namedata[inote.namesz - 1] != '\0')
14172         {
14173           temp = (char *) malloc (inote.namesz + 1);
14174
14175           if (temp == NULL)
14176             {
14177               error (_("Out of memory\n"));
14178               res = 0;
14179               break;
14180             }
14181
14182           strncpy (temp, inote.namedata, inote.namesz);
14183           temp[inote.namesz] = 0;
14184
14185           /* warn (_("'%s' NOTE name not properly null terminated\n"), temp);  */
14186           inote.namedata = temp;
14187         }
14188
14189       res &= process_note (& inote);
14190
14191       if (temp != NULL)
14192         {
14193           free (temp);
14194           temp = NULL;
14195         }
14196     }
14197
14198   free (pnotes);
14199
14200   return res;
14201 }
14202
14203 static int
14204 process_corefile_note_segments (FILE * file)
14205 {
14206   Elf_Internal_Phdr * segment;
14207   unsigned int i;
14208   int res = 1;
14209
14210   if (! get_program_headers (file))
14211       return 0;
14212
14213   for (i = 0, segment = program_headers;
14214        i < elf_header.e_phnum;
14215        i++, segment++)
14216     {
14217       if (segment->p_type == PT_NOTE)
14218         res &= process_corefile_note_segment (file,
14219                                               (bfd_vma) segment->p_offset,
14220                                               (bfd_vma) segment->p_filesz);
14221     }
14222
14223   return res;
14224 }
14225
14226 static int
14227 process_note_sections (FILE * file)
14228 {
14229   Elf_Internal_Shdr * section;
14230   unsigned long i;
14231   int n = 0;
14232   int res = 1;
14233
14234   for (i = 0, section = section_headers;
14235        i < elf_header.e_shnum && section != NULL;
14236        i++, section++)
14237     if (section->sh_type == SHT_NOTE)
14238       {
14239         res &= process_corefile_note_segment (file,
14240                                               (bfd_vma) section->sh_offset,
14241                                               (bfd_vma) section->sh_size);
14242         n++;
14243       }
14244
14245   if (n == 0)
14246     /* Try processing NOTE segments instead.  */
14247     return process_corefile_note_segments (file);
14248
14249   return res;
14250 }
14251
14252 static int
14253 process_notes (FILE * file)
14254 {
14255   /* If we have not been asked to display the notes then do nothing.  */
14256   if (! do_notes)
14257     return 1;
14258
14259   if (elf_header.e_type != ET_CORE)
14260     return process_note_sections (file);
14261
14262   /* No program headers means no NOTE segment.  */
14263   if (elf_header.e_phnum > 0)
14264     return process_corefile_note_segments (file);
14265
14266   printf (_("No note segments present in the core file.\n"));
14267   return 1;
14268 }
14269
14270 static int
14271 process_arch_specific (FILE * file)
14272 {
14273   if (! do_arch)
14274     return 1;
14275
14276   switch (elf_header.e_machine)
14277     {
14278     case EM_ARM:
14279       return process_arm_specific (file);
14280     case EM_MIPS:
14281     case EM_MIPS_RS3_LE:
14282       return process_mips_specific (file);
14283       break;
14284     case EM_NDS32:
14285       return process_nds32_specific (file);
14286       break;
14287     case EM_PPC:
14288       return process_power_specific (file);
14289       break;
14290     case EM_SPARC:
14291     case EM_SPARC32PLUS:
14292     case EM_SPARCV9:
14293       return process_sparc_specific (file);
14294       break;
14295     case EM_TI_C6000:
14296       return process_tic6x_specific (file);
14297       break;
14298     case EM_MSP430:
14299       return process_msp430x_specific (file);
14300     default:
14301       break;
14302     }
14303   return 1;
14304 }
14305
14306 static int
14307 get_file_header (FILE * file)
14308 {
14309   /* Read in the identity array.  */
14310   if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
14311     return 0;
14312
14313   /* Determine how to read the rest of the header.  */
14314   switch (elf_header.e_ident[EI_DATA])
14315     {
14316     default: /* fall through */
14317     case ELFDATANONE: /* fall through */
14318     case ELFDATA2LSB:
14319       byte_get = byte_get_little_endian;
14320       byte_put = byte_put_little_endian;
14321       break;
14322     case ELFDATA2MSB:
14323       byte_get = byte_get_big_endian;
14324       byte_put = byte_put_big_endian;
14325       break;
14326     }
14327
14328   /* For now we only support 32 bit and 64 bit ELF files.  */
14329   is_32bit_elf = (elf_header.e_ident[EI_CLASS] != ELFCLASS64);
14330
14331   /* Read in the rest of the header.  */
14332   if (is_32bit_elf)
14333     {
14334       Elf32_External_Ehdr ehdr32;
14335
14336       if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
14337         return 0;
14338
14339       elf_header.e_type      = BYTE_GET (ehdr32.e_type);
14340       elf_header.e_machine   = BYTE_GET (ehdr32.e_machine);
14341       elf_header.e_version   = BYTE_GET (ehdr32.e_version);
14342       elf_header.e_entry     = BYTE_GET (ehdr32.e_entry);
14343       elf_header.e_phoff     = BYTE_GET (ehdr32.e_phoff);
14344       elf_header.e_shoff     = BYTE_GET (ehdr32.e_shoff);
14345       elf_header.e_flags     = BYTE_GET (ehdr32.e_flags);
14346       elf_header.e_ehsize    = BYTE_GET (ehdr32.e_ehsize);
14347       elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
14348       elf_header.e_phnum     = BYTE_GET (ehdr32.e_phnum);
14349       elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
14350       elf_header.e_shnum     = BYTE_GET (ehdr32.e_shnum);
14351       elf_header.e_shstrndx  = BYTE_GET (ehdr32.e_shstrndx);
14352     }
14353   else
14354     {
14355       Elf64_External_Ehdr ehdr64;
14356
14357       /* If we have been compiled with sizeof (bfd_vma) == 4, then
14358          we will not be able to cope with the 64bit data found in
14359          64 ELF files.  Detect this now and abort before we start
14360          overwriting things.  */
14361       if (sizeof (bfd_vma) < 8)
14362         {
14363           error (_("This instance of readelf has been built without support for a\n\
14364 64 bit data type and so it cannot read 64 bit ELF files.\n"));
14365           return 0;
14366         }
14367
14368       if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
14369         return 0;
14370
14371       elf_header.e_type      = BYTE_GET (ehdr64.e_type);
14372       elf_header.e_machine   = BYTE_GET (ehdr64.e_machine);
14373       elf_header.e_version   = BYTE_GET (ehdr64.e_version);
14374       elf_header.e_entry     = BYTE_GET (ehdr64.e_entry);
14375       elf_header.e_phoff     = BYTE_GET (ehdr64.e_phoff);
14376       elf_header.e_shoff     = BYTE_GET (ehdr64.e_shoff);
14377       elf_header.e_flags     = BYTE_GET (ehdr64.e_flags);
14378       elf_header.e_ehsize    = BYTE_GET (ehdr64.e_ehsize);
14379       elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
14380       elf_header.e_phnum     = BYTE_GET (ehdr64.e_phnum);
14381       elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
14382       elf_header.e_shnum     = BYTE_GET (ehdr64.e_shnum);
14383       elf_header.e_shstrndx  = BYTE_GET (ehdr64.e_shstrndx);
14384     }
14385
14386   if (elf_header.e_shoff)
14387     {
14388       /* There may be some extensions in the first section header.  Don't
14389          bomb if we can't read it.  */
14390       if (is_32bit_elf)
14391         get_32bit_section_headers (file, 1);
14392       else
14393         get_64bit_section_headers (file, 1);
14394     }
14395
14396   return 1;
14397 }
14398
14399 /* Process one ELF object file according to the command line options.
14400    This file may actually be stored in an archive.  The file is
14401    positioned at the start of the ELF object.  */
14402
14403 static int
14404 process_object (char * file_name, FILE * file)
14405 {
14406   unsigned int i;
14407
14408   if (! get_file_header (file))
14409     {
14410       error (_("%s: Failed to read file header\n"), file_name);
14411       return 1;
14412     }
14413
14414   /* Initialise per file variables.  */
14415   for (i = ARRAY_SIZE (version_info); i--;)
14416     version_info[i] = 0;
14417
14418   for (i = ARRAY_SIZE (dynamic_info); i--;)
14419     dynamic_info[i] = 0;
14420   dynamic_info_DT_GNU_HASH = 0;
14421
14422   /* Process the file.  */
14423   if (show_name)
14424     printf (_("\nFile: %s\n"), file_name);
14425
14426   /* Initialise the dump_sects array from the cmdline_dump_sects array.
14427      Note we do this even if cmdline_dump_sects is empty because we
14428      must make sure that the dump_sets array is zeroed out before each
14429      object file is processed.  */
14430   if (num_dump_sects > num_cmdline_dump_sects)
14431     memset (dump_sects, 0, num_dump_sects * sizeof (* dump_sects));
14432
14433   if (num_cmdline_dump_sects > 0)
14434     {
14435       if (num_dump_sects == 0)
14436         /* A sneaky way of allocating the dump_sects array.  */
14437         request_dump_bynumber (num_cmdline_dump_sects, 0);
14438
14439       assert (num_dump_sects >= num_cmdline_dump_sects);
14440       memcpy (dump_sects, cmdline_dump_sects,
14441               num_cmdline_dump_sects * sizeof (* dump_sects));
14442     }
14443
14444   if (! process_file_header ())
14445     return 1;
14446
14447   if (! process_section_headers (file))
14448     {
14449       /* Without loaded section headers we cannot process lots of
14450          things.  */
14451       do_unwind = do_version = do_dump = do_arch = 0;
14452
14453       if (! do_using_dynamic)
14454         do_syms = do_dyn_syms = do_reloc = 0;
14455     }
14456
14457   if (! process_section_groups (file))
14458     {
14459       /* Without loaded section groups we cannot process unwind.  */
14460       do_unwind = 0;
14461     }
14462
14463   if (process_program_headers (file))
14464     process_dynamic_section (file);
14465
14466   process_relocs (file);
14467
14468   process_unwind (file);
14469
14470   process_symbol_table (file);
14471
14472   process_syminfo (file);
14473
14474   process_version_sections (file);
14475
14476   process_section_contents (file);
14477
14478   process_notes (file);
14479
14480   process_gnu_liblist (file);
14481
14482   process_arch_specific (file);
14483
14484   if (program_headers)
14485     {
14486       free (program_headers);
14487       program_headers = NULL;
14488     }
14489
14490   if (section_headers)
14491     {
14492       free (section_headers);
14493       section_headers = NULL;
14494     }
14495
14496   if (string_table)
14497     {
14498       free (string_table);
14499       string_table = NULL;
14500       string_table_length = 0;
14501     }
14502
14503   if (dynamic_strings)
14504     {
14505       free (dynamic_strings);
14506       dynamic_strings = NULL;
14507       dynamic_strings_length = 0;
14508     }
14509
14510   if (dynamic_symbols)
14511     {
14512       free (dynamic_symbols);
14513       dynamic_symbols = NULL;
14514       num_dynamic_syms = 0;
14515     }
14516
14517   if (dynamic_syminfo)
14518     {
14519       free (dynamic_syminfo);
14520       dynamic_syminfo = NULL;
14521     }
14522
14523   if (dynamic_section)
14524     {
14525       free (dynamic_section);
14526       dynamic_section = NULL;
14527     }
14528
14529   if (section_headers_groups)
14530     {
14531       free (section_headers_groups);
14532       section_headers_groups = NULL;
14533     }
14534
14535   if (section_groups)
14536     {
14537       struct group_list * g;
14538       struct group_list * next;
14539
14540       for (i = 0; i < group_count; i++)
14541         {
14542           for (g = section_groups [i].root; g != NULL; g = next)
14543             {
14544               next = g->next;
14545               free (g);
14546             }
14547         }
14548
14549       free (section_groups);
14550       section_groups = NULL;
14551     }
14552
14553   free_debug_memory ();
14554
14555   return 0;
14556 }
14557
14558 /* Process an ELF archive.
14559    On entry the file is positioned just after the ARMAG string.  */
14560
14561 static int
14562 process_archive (char * file_name, FILE * file, bfd_boolean is_thin_archive)
14563 {
14564   struct archive_info arch;
14565   struct archive_info nested_arch;
14566   size_t got;
14567   int ret;
14568
14569   show_name = 1;
14570
14571   /* The ARCH structure is used to hold information about this archive.  */
14572   arch.file_name = NULL;
14573   arch.file = NULL;
14574   arch.index_array = NULL;
14575   arch.sym_table = NULL;
14576   arch.longnames = NULL;
14577
14578   /* The NESTED_ARCH structure is used as a single-item cache of information
14579      about a nested archive (when members of a thin archive reside within
14580      another regular archive file).  */
14581   nested_arch.file_name = NULL;
14582   nested_arch.file = NULL;
14583   nested_arch.index_array = NULL;
14584   nested_arch.sym_table = NULL;
14585   nested_arch.longnames = NULL;
14586
14587   if (setup_archive (&arch, file_name, file, is_thin_archive, do_archive_index) != 0)
14588     {
14589       ret = 1;
14590       goto out;
14591     }
14592
14593   if (do_archive_index)
14594     {
14595       if (arch.sym_table == NULL)
14596         error (_("%s: unable to dump the index as none was found\n"), file_name);
14597       else
14598         {
14599           unsigned int i, l;
14600           unsigned long current_pos;
14601
14602           printf (_("Index of archive %s: (%ld entries, 0x%lx bytes in the symbol table)\n"),
14603                   file_name, (long) arch.index_num, arch.sym_size);
14604           current_pos = ftell (file);
14605
14606           for (i = l = 0; i < arch.index_num; i++)
14607             {
14608               if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
14609                 {
14610                   char * member_name;
14611
14612                   member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
14613
14614                   if (member_name != NULL)
14615                     {
14616                       char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
14617
14618                       if (qualified_name != NULL)
14619                         {
14620                           printf (_("Contents of binary %s at offset "), qualified_name);
14621                           (void) print_vma (arch.index_array[i], PREFIX_HEX);
14622                           putchar ('\n');
14623                           free (qualified_name);
14624                         }
14625                     }
14626                 }
14627
14628               if (l >= arch.sym_size)
14629                 {
14630                   error (_("%s: end of the symbol table reached before the end of the index\n"),
14631                          file_name);
14632                   break;
14633                 }
14634               printf ("\t%s\n", arch.sym_table + l);
14635               l += strlen (arch.sym_table + l) + 1;
14636             }
14637
14638           if (arch.uses_64bit_indicies)
14639             l = (l + 7) & ~ 7;
14640           else
14641             l += l & 1;
14642
14643           if (l < arch.sym_size)
14644             error (_("%s: %ld bytes remain in the symbol table, but without corresponding entries in the index table\n"),
14645                    file_name, arch.sym_size - l);
14646
14647           if (fseek (file, current_pos, SEEK_SET) != 0)
14648             {
14649               error (_("%s: failed to seek back to start of object files in the archive\n"), file_name);
14650               ret = 1;
14651               goto out;
14652             }
14653         }
14654
14655       if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
14656           && !do_segments && !do_header && !do_dump && !do_version
14657           && !do_histogram && !do_debugging && !do_arch && !do_notes
14658           && !do_section_groups && !do_dyn_syms)
14659         {
14660           ret = 0; /* Archive index only.  */
14661           goto out;
14662         }
14663     }
14664
14665   ret = 0;
14666
14667   while (1)
14668     {
14669       char * name;
14670       size_t namelen;
14671       char * qualified_name;
14672
14673       /* Read the next archive header.  */
14674       if (fseek (file, arch.next_arhdr_offset, SEEK_SET) != 0)
14675         {
14676           error (_("%s: failed to seek to next archive header\n"), file_name);
14677           return 1;
14678         }
14679       got = fread (&arch.arhdr, 1, sizeof arch.arhdr, file);
14680       if (got != sizeof arch.arhdr)
14681         {
14682           if (got == 0)
14683             break;
14684           error (_("%s: failed to read archive header\n"), file_name);
14685           ret = 1;
14686           break;
14687         }
14688       if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
14689         {
14690           error (_("%s: did not find a valid archive header\n"), arch.file_name);
14691           ret = 1;
14692           break;
14693         }
14694
14695       arch.next_arhdr_offset += sizeof arch.arhdr;
14696
14697       archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
14698       if (archive_file_size & 01)
14699         ++archive_file_size;
14700
14701       name = get_archive_member_name (&arch, &nested_arch);
14702       if (name == NULL)
14703         {
14704           error (_("%s: bad archive file name\n"), file_name);
14705           ret = 1;
14706           break;
14707         }
14708       namelen = strlen (name);
14709
14710       qualified_name = make_qualified_name (&arch, &nested_arch, name);
14711       if (qualified_name == NULL)
14712         {
14713           error (_("%s: bad archive file name\n"), file_name);
14714           ret = 1;
14715           break;
14716         }
14717
14718       if (is_thin_archive && arch.nested_member_origin == 0)
14719         {
14720           /* This is a proxy for an external member of a thin archive.  */
14721           FILE * member_file;
14722           char * member_file_name = adjust_relative_path (file_name, name, namelen);
14723           if (member_file_name == NULL)
14724             {
14725               ret = 1;
14726               break;
14727             }
14728
14729           member_file = fopen (member_file_name, "rb");
14730           if (member_file == NULL)
14731             {
14732               error (_("Input file '%s' is not readable.\n"), member_file_name);
14733               free (member_file_name);
14734               ret = 1;
14735               break;
14736             }
14737
14738           archive_file_offset = arch.nested_member_origin;
14739
14740           ret |= process_object (qualified_name, member_file);
14741
14742           fclose (member_file);
14743           free (member_file_name);
14744         }
14745       else if (is_thin_archive)
14746         {
14747           /* PR 15140: Allow for corrupt thin archives.  */
14748           if (nested_arch.file == NULL)
14749             {
14750               error (_("%s: contains corrupt thin archive: %s\n"),
14751                      file_name, name);
14752               ret = 1;
14753               break;
14754             }
14755
14756           /* This is a proxy for a member of a nested archive.  */
14757           archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
14758
14759           /* The nested archive file will have been opened and setup by
14760              get_archive_member_name.  */
14761           if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
14762             {
14763               error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
14764               ret = 1;
14765               break;
14766             }
14767
14768           ret |= process_object (qualified_name, nested_arch.file);
14769         }
14770       else
14771         {
14772           archive_file_offset = arch.next_arhdr_offset;
14773           arch.next_arhdr_offset += archive_file_size;
14774
14775           ret |= process_object (qualified_name, file);
14776         }
14777
14778       if (dump_sects != NULL)
14779         {
14780           free (dump_sects);
14781           dump_sects = NULL;
14782           num_dump_sects = 0;
14783         }
14784
14785       free (qualified_name);
14786     }
14787
14788  out:
14789   if (nested_arch.file != NULL)
14790     fclose (nested_arch.file);
14791   release_archive (&nested_arch);
14792   release_archive (&arch);
14793
14794   return ret;
14795 }
14796
14797 static int
14798 process_file (char * file_name)
14799 {
14800   FILE * file;
14801   struct stat statbuf;
14802   char armag[SARMAG];
14803   int ret;
14804
14805   if (stat (file_name, &statbuf) < 0)
14806     {
14807       if (errno == ENOENT)
14808         error (_("'%s': No such file\n"), file_name);
14809       else
14810         error (_("Could not locate '%s'.  System error message: %s\n"),
14811                file_name, strerror (errno));
14812       return 1;
14813     }
14814
14815   if (! S_ISREG (statbuf.st_mode))
14816     {
14817       error (_("'%s' is not an ordinary file\n"), file_name);
14818       return 1;
14819     }
14820
14821   file = fopen (file_name, "rb");
14822   if (file == NULL)
14823     {
14824       error (_("Input file '%s' is not readable.\n"), file_name);
14825       return 1;
14826     }
14827
14828   if (fread (armag, SARMAG, 1, file) != 1)
14829     {
14830       error (_("%s: Failed to read file's magic number\n"), file_name);
14831       fclose (file);
14832       return 1;
14833     }
14834
14835   if (memcmp (armag, ARMAG, SARMAG) == 0)
14836     ret = process_archive (file_name, file, FALSE);
14837   else if (memcmp (armag, ARMAGT, SARMAG) == 0)
14838     ret = process_archive (file_name, file, TRUE);
14839   else
14840     {
14841       if (do_archive_index)
14842         error (_("File %s is not an archive so its index cannot be displayed.\n"),
14843                file_name);
14844
14845       rewind (file);
14846       archive_file_size = archive_file_offset = 0;
14847       ret = process_object (file_name, file);
14848     }
14849
14850   fclose (file);
14851
14852   return ret;
14853 }
14854
14855 #ifdef SUPPORT_DISASSEMBLY
14856 /* Needed by the i386 disassembler.  For extra credit, someone could
14857    fix this so that we insert symbolic addresses here, esp for GOT/PLT
14858    symbols.  */
14859
14860 void
14861 print_address (unsigned int addr, FILE * outfile)
14862 {
14863   fprintf (outfile,"0x%8.8x", addr);
14864 }
14865
14866 /* Needed by the i386 disassembler.  */
14867 void
14868 db_task_printsym (unsigned int addr)
14869 {
14870   print_address (addr, stderr);
14871 }
14872 #endif
14873
14874 int
14875 main (int argc, char ** argv)
14876 {
14877   int err;
14878
14879 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
14880   setlocale (LC_MESSAGES, "");
14881 #endif
14882 #if defined (HAVE_SETLOCALE)
14883   setlocale (LC_CTYPE, "");
14884 #endif
14885   bindtextdomain (PACKAGE, LOCALEDIR);
14886   textdomain (PACKAGE);
14887
14888   expandargv (&argc, &argv);
14889
14890   parse_args (argc, argv);
14891
14892   if (num_dump_sects > 0)
14893     {
14894       /* Make a copy of the dump_sects array.  */
14895       cmdline_dump_sects = (dump_type *)
14896           malloc (num_dump_sects * sizeof (* dump_sects));
14897       if (cmdline_dump_sects == NULL)
14898         error (_("Out of memory allocating dump request table.\n"));
14899       else
14900         {
14901           memcpy (cmdline_dump_sects, dump_sects,
14902                   num_dump_sects * sizeof (* dump_sects));
14903           num_cmdline_dump_sects = num_dump_sects;
14904         }
14905     }
14906
14907   if (optind < (argc - 1))
14908     show_name = 1;
14909
14910   err = 0;
14911   while (optind < argc)
14912     err |= process_file (argv[optind++]);
14913
14914   if (dump_sects != NULL)
14915     free (dump_sects);
14916   if (cmdline_dump_sects != NULL)
14917     free (cmdline_dump_sects);
14918
14919   return err;
14920 }