* elf32-rl78.c (rl78_elf_merge_private_bfd_data): Complain if G10
[external/binutils.git] / binutils / readelf.c
1 /* readelf.c -- display contents of an ELF format file
2    Copyright 1998-2013 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/nios2.h"
135 #include "elf/or32.h"
136 #include "elf/pj.h"
137 #include "elf/ppc.h"
138 #include "elf/ppc64.h"
139 #include "elf/rl78.h"
140 #include "elf/rx.h"
141 #include "elf/s390.h"
142 #include "elf/score.h"
143 #include "elf/sh.h"
144 #include "elf/sparc.h"
145 #include "elf/spu.h"
146 #include "elf/tic6x.h"
147 #include "elf/tilegx.h"
148 #include "elf/tilepro.h"
149 #include "elf/v850.h"
150 #include "elf/vax.h"
151 #include "elf/x86-64.h"
152 #include "elf/xc16x.h"
153 #include "elf/xgate.h"
154 #include "elf/xstormy16.h"
155 #include "elf/xtensa.h"
156
157 #include "getopt.h"
158 #include "libiberty.h"
159 #include "safe-ctype.h"
160 #include "filenames.h"
161
162 #ifndef offsetof
163 #define offsetof(TYPE, MEMBER) ((size_t) &(((TYPE *) 0)->MEMBER))
164 #endif
165
166 char * program_name = "readelf";
167 static long archive_file_offset;
168 static unsigned long archive_file_size;
169 static unsigned long dynamic_addr;
170 static bfd_size_type dynamic_size;
171 static unsigned int dynamic_nent;
172 static char * dynamic_strings;
173 static unsigned long dynamic_strings_length;
174 static char * string_table;
175 static unsigned long string_table_length;
176 static unsigned long num_dynamic_syms;
177 static Elf_Internal_Sym * dynamic_symbols;
178 static Elf_Internal_Syminfo * dynamic_syminfo;
179 static unsigned long dynamic_syminfo_offset;
180 static unsigned int dynamic_syminfo_nent;
181 static char program_interpreter[PATH_MAX];
182 static bfd_vma dynamic_info[DT_ENCODING];
183 static bfd_vma dynamic_info_DT_GNU_HASH;
184 static bfd_vma version_info[16];
185 static Elf_Internal_Ehdr elf_header;
186 static Elf_Internal_Shdr * section_headers;
187 static Elf_Internal_Phdr * program_headers;
188 static Elf_Internal_Dyn *  dynamic_section;
189 static Elf_Internal_Shdr * symtab_shndx_hdr;
190 static int show_name;
191 static int do_dynamic;
192 static int do_syms;
193 static int do_dyn_syms;
194 static int do_reloc;
195 static int do_sections;
196 static int do_section_groups;
197 static int do_section_details;
198 static int do_segments;
199 static int do_unwind;
200 static int do_using_dynamic;
201 static int do_header;
202 static int do_dump;
203 static int do_version;
204 static int do_histogram;
205 static int do_debugging;
206 static int do_arch;
207 static int do_notes;
208 static int do_archive_index;
209 static int is_32bit_elf;
210
211 struct group_list
212 {
213   struct group_list * next;
214   unsigned int section_index;
215 };
216
217 struct group
218 {
219   struct group_list * root;
220   unsigned int group_index;
221 };
222
223 static size_t group_count;
224 static struct group * section_groups;
225 static struct group ** section_headers_groups;
226
227
228 /* Flag bits indicating particular types of dump.  */
229 #define HEX_DUMP        (1 << 0)        /* The -x command line switch.  */
230 #define DISASS_DUMP     (1 << 1)        /* The -i command line switch.  */
231 #define DEBUG_DUMP      (1 << 2)        /* The -w command line switch.  */
232 #define STRING_DUMP     (1 << 3)        /* The -p command line switch.  */
233 #define RELOC_DUMP      (1 << 4)        /* The -R command line switch.  */
234
235 typedef unsigned char dump_type;
236
237 /* A linked list of the section names for which dumps were requested.  */
238 struct dump_list_entry
239 {
240   char * name;
241   dump_type type;
242   struct dump_list_entry * next;
243 };
244 static struct dump_list_entry * dump_sects_byname;
245
246 /* A dynamic array of flags indicating for which sections a dump
247    has been requested via command line switches.  */
248 static dump_type *   cmdline_dump_sects = NULL;
249 static unsigned int  num_cmdline_dump_sects = 0;
250
251 /* A dynamic array of flags indicating for which sections a dump of
252    some kind has been requested.  It is reset on a per-object file
253    basis and then initialised from the cmdline_dump_sects array,
254    the results of interpreting the -w switch, and the
255    dump_sects_byname list.  */
256 static dump_type *   dump_sects = NULL;
257 static unsigned int  num_dump_sects = 0;
258
259
260 /* How to print a vma value.  */
261 typedef enum print_mode
262 {
263   HEX,
264   DEC,
265   DEC_5,
266   UNSIGNED,
267   PREFIX_HEX,
268   FULL_HEX,
269   LONG_HEX
270 }
271 print_mode;
272
273 #define UNKNOWN -1
274
275 #define SECTION_NAME(X)                                         \
276   ((X) == NULL ? _("<none>")                                    \
277    : string_table == NULL ? _("<no-name>")                      \
278    : ((X)->sh_name >= string_table_length ? _("<corrupt>")      \
279   : string_table + (X)->sh_name))
280
281 #define DT_VERSIONTAGIDX(tag)   (DT_VERNEEDNUM - (tag)) /* Reverse order!  */
282
283 #define GET_ELF_SYMBOLS(file, section, sym_count)                       \
284   (is_32bit_elf ? get_32bit_elf_symbols (file, section, sym_count)      \
285    : get_64bit_elf_symbols (file, section, sym_count))
286
287 #define VALID_DYNAMIC_NAME(offset)      ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
288 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
289    already been called and verified that the string exists.  */
290 #define GET_DYNAMIC_NAME(offset)        (dynamic_strings + offset)
291
292 #define REMOVE_ARCH_BITS(ADDR)                  \
293   do                                            \
294     {                                           \
295       if (elf_header.e_machine == EM_ARM)       \
296         (ADDR) &= ~1;                           \
297     }                                           \
298   while (0)
299 \f
300 /* Retrieve NMEMB structures, each SIZE bytes long from FILE starting at OFFSET.
301    Put the retrieved data into VAR, if it is not NULL.  Otherwise allocate a buffer
302    using malloc and fill that.  In either case return the pointer to the start of
303    the retrieved data or NULL if something went wrong.  If something does go wrong
304    emit an error message using REASON as part of the context.  */
305
306 static void *
307 get_data (void * var, FILE * file, long offset, size_t size, size_t nmemb,
308           const char * reason)
309 {
310   void * mvar;
311
312   if (size == 0 || nmemb == 0)
313     return NULL;
314
315   if (fseek (file, archive_file_offset + offset, SEEK_SET))
316     {
317       error (_("Unable to seek to 0x%lx for %s\n"),
318              (unsigned long) archive_file_offset + offset, reason);
319       return NULL;
320     }
321
322   mvar = var;
323   if (mvar == NULL)
324     {
325       /* Check for overflow.  */
326       if (nmemb < (~(size_t) 0 - 1) / size)
327         /* + 1 so that we can '\0' terminate invalid string table sections.  */
328         mvar = malloc (size * nmemb + 1);
329
330       if (mvar == NULL)
331         {
332           error (_("Out of memory allocating 0x%lx bytes for %s\n"),
333                  (unsigned long)(size * nmemb), reason);
334           return NULL;
335         }
336
337       ((char *) mvar)[size * nmemb] = '\0';
338     }
339
340   if (fread (mvar, size, nmemb, file) != nmemb)
341     {
342       error (_("Unable to read in 0x%lx bytes of %s\n"),
343              (unsigned long)(size * nmemb), reason);
344       if (mvar != var)
345         free (mvar);
346       return NULL;
347     }
348
349   return mvar;
350 }
351
352 /* Print a VMA value.  */
353
354 static int
355 print_vma (bfd_vma vma, print_mode mode)
356 {
357   int nc = 0;
358
359   switch (mode)
360     {
361     case FULL_HEX:
362       nc = printf ("0x");
363       /* Drop through.  */
364
365     case LONG_HEX:
366 #ifdef BFD64
367       if (is_32bit_elf)
368         return nc + printf ("%8.8" BFD_VMA_FMT "x", vma);
369 #endif
370       printf_vma (vma);
371       return nc + 16;
372
373     case DEC_5:
374       if (vma <= 99999)
375         return printf ("%5" BFD_VMA_FMT "d", vma);
376       /* Drop through.  */
377
378     case PREFIX_HEX:
379       nc = printf ("0x");
380       /* Drop through.  */
381
382     case HEX:
383       return nc + printf ("%" BFD_VMA_FMT "x", vma);
384
385     case DEC:
386       return printf ("%" BFD_VMA_FMT "d", vma);
387
388     case UNSIGNED:
389       return printf ("%" BFD_VMA_FMT "u", vma);
390     }
391   return 0;
392 }
393
394 /* Display a symbol on stdout.  Handles the display of control characters and
395    multibye characters (assuming the host environment supports them).
396
397    Display at most abs(WIDTH) characters, truncating as necessary, unless do_wide is true.
398
399    If WIDTH is negative then ensure that the output is at least (- WIDTH) characters,
400    padding as necessary.
401
402    Returns the number of emitted characters.  */
403
404 static unsigned int
405 print_symbol (int width, const char *symbol)
406 {
407   bfd_boolean extra_padding = FALSE;
408   int num_printed = 0;
409 #ifdef HAVE_MBSTATE_T
410   mbstate_t state;
411 #endif
412   int width_remaining;
413
414   if (width < 0)
415     {
416       /* Keep the width positive.  This also helps.  */
417       width = - width;
418       extra_padding = TRUE;
419     }  
420
421   if (do_wide)
422     /* Set the remaining width to a very large value.
423        This simplifies the code below.  */
424     width_remaining = INT_MAX;
425   else
426     width_remaining = width;
427
428 #ifdef HAVE_MBSTATE_T
429   /* Initialise the multibyte conversion state.  */
430   memset (& state, 0, sizeof (state));
431 #endif
432
433   while (width_remaining)
434     {
435       size_t  n;
436       const char c = *symbol++;
437
438       if (c == 0)
439         break;
440
441       /* Do not print control characters directly as they can affect terminal
442          settings.  Such characters usually appear in the names generated
443          by the assembler for local labels.  */
444       if (ISCNTRL (c))
445         {
446           if (width_remaining < 2)
447             break;
448
449           printf ("^%c", c + 0x40);
450           width_remaining -= 2;
451           num_printed += 2;
452         }
453       else if (ISPRINT (c))
454         {
455           putchar (c);
456           width_remaining --;
457           num_printed ++;
458         }
459       else
460         {
461 #ifdef HAVE_MBSTATE_T
462           wchar_t w;
463 #endif
464           /* Let printf do the hard work of displaying multibyte characters.  */
465           printf ("%.1s", symbol - 1);
466           width_remaining --;
467           num_printed ++;
468
469 #ifdef HAVE_MBSTATE_T
470           /* Try to find out how many bytes made up the character that was
471              just printed.  Advance the symbol pointer past the bytes that
472              were displayed.  */
473           n = mbrtowc (& w, symbol - 1, MB_CUR_MAX, & state);
474 #else
475           n = 1;
476 #endif
477           if (n != (size_t) -1 && n != (size_t) -2 && n > 0)
478             symbol += (n - 1);
479         }
480     }
481
482   if (extra_padding && num_printed < width)
483     {
484       /* Fill in the remaining spaces.  */
485       printf ("%-*s", width - num_printed, " ");
486       num_printed = width;
487     }
488
489   return num_printed;
490 }
491
492 /* Return a pointer to section NAME, or NULL if no such section exists.  */
493
494 static Elf_Internal_Shdr *
495 find_section (const char * name)
496 {
497   unsigned int i;
498
499   for (i = 0; i < elf_header.e_shnum; i++)
500     if (streq (SECTION_NAME (section_headers + i), name))
501       return section_headers + i;
502
503   return NULL;
504 }
505
506 /* Return a pointer to a section containing ADDR, or NULL if no such
507    section exists.  */
508
509 static Elf_Internal_Shdr *
510 find_section_by_address (bfd_vma addr)
511 {
512   unsigned int i;
513
514   for (i = 0; i < elf_header.e_shnum; i++)
515     {
516       Elf_Internal_Shdr *sec = section_headers + i;
517       if (addr >= sec->sh_addr && addr < sec->sh_addr + sec->sh_size)
518         return sec;
519     }
520
521   return NULL;
522 }
523
524 /* Return a pointer to section NAME, or NULL if no such section exists,
525    restricted to the list of sections given in SET.  */
526
527 static Elf_Internal_Shdr *
528 find_section_in_set (const char * name, unsigned int * set)
529 {
530   unsigned int i;
531
532   if (set != NULL)
533     {
534       while ((i = *set++) > 0)
535         if (streq (SECTION_NAME (section_headers + i), name))
536           return section_headers + i;
537     }
538
539   return find_section (name);
540 }
541
542 /* Read an unsigned LEB128 encoded value from p.  Set *PLEN to the number of
543    bytes read.  */
544
545 static inline unsigned long
546 read_uleb128 (unsigned char *data,
547               unsigned int *length_return,
548               const unsigned char * const end)
549 {
550   return read_leb128 (data, length_return, FALSE, end);
551 }
552
553 /* Return true if the current file is for IA-64 machine and OpenVMS ABI.
554    This OS has so many departures from the ELF standard that we test it at
555    many places.  */
556
557 static inline int
558 is_ia64_vms (void)
559 {
560   return elf_header.e_machine == EM_IA_64
561     && elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS;
562 }
563
564 /* Guess the relocation size commonly used by the specific machines.  */
565
566 static int
567 guess_is_rela (unsigned int e_machine)
568 {
569   switch (e_machine)
570     {
571       /* Targets that use REL relocations.  */
572     case EM_386:
573     case EM_486:
574     case EM_960:
575     case EM_ARM:
576     case EM_D10V:
577     case EM_CYGNUS_D10V:
578     case EM_DLX:
579     case EM_MIPS:
580     case EM_MIPS_RS3_LE:
581     case EM_CYGNUS_M32R:
582     case EM_OPENRISC:
583     case EM_OR32:
584     case EM_SCORE:
585     case EM_XGATE:
586       return FALSE;
587
588       /* Targets that use RELA relocations.  */
589     case EM_68K:
590     case EM_860:
591     case EM_AARCH64:
592     case EM_ADAPTEVA_EPIPHANY:
593     case EM_ALPHA:
594     case EM_ALTERA_NIOS2:
595     case EM_AVR:
596     case EM_AVR_OLD:
597     case EM_BLACKFIN:
598     case EM_CR16:
599     case EM_CRIS:
600     case EM_CRX:
601     case EM_D30V:
602     case EM_CYGNUS_D30V:
603     case EM_FR30:
604     case EM_CYGNUS_FR30:
605     case EM_CYGNUS_FRV:
606     case EM_H8S:
607     case EM_H8_300:
608     case EM_H8_300H:
609     case EM_IA_64:
610     case EM_IP2K:
611     case EM_IP2K_OLD:
612     case EM_IQ2000:
613     case EM_LATTICEMICO32:
614     case EM_M32C_OLD:
615     case EM_M32C:
616     case EM_M32R:
617     case EM_MCORE:
618     case EM_CYGNUS_MEP:
619     case EM_METAG:
620     case EM_MMIX:
621     case EM_MN10200:
622     case EM_CYGNUS_MN10200:
623     case EM_MN10300:
624     case EM_CYGNUS_MN10300:
625     case EM_MOXIE:
626     case EM_MSP430:
627     case EM_MSP430_OLD:
628     case EM_MT:
629     case EM_NIOS32:
630     case EM_PPC64:
631     case EM_PPC:
632     case EM_RL78:
633     case EM_RX:
634     case EM_S390:
635     case EM_S390_OLD:
636     case EM_SH:
637     case EM_SPARC:
638     case EM_SPARC32PLUS:
639     case EM_SPARCV9:
640     case EM_SPU:
641     case EM_TI_C6000:
642     case EM_TILEGX:
643     case EM_TILEPRO:
644     case EM_V800:
645     case EM_V850:
646     case EM_CYGNUS_V850:
647     case EM_VAX:
648     case EM_X86_64:
649     case EM_L1OM:
650     case EM_K1OM:
651     case EM_XSTORMY16:
652     case EM_XTENSA:
653     case EM_XTENSA_OLD:
654     case EM_MICROBLAZE:
655     case EM_MICROBLAZE_OLD:
656       return TRUE;
657
658     case EM_68HC05:
659     case EM_68HC08:
660     case EM_68HC11:
661     case EM_68HC16:
662     case EM_FX66:
663     case EM_ME16:
664     case EM_MMA:
665     case EM_NCPU:
666     case EM_NDR1:
667     case EM_PCP:
668     case EM_ST100:
669     case EM_ST19:
670     case EM_ST7:
671     case EM_ST9PLUS:
672     case EM_STARCORE:
673     case EM_SVX:
674     case EM_TINYJ:
675     default:
676       warn (_("Don't know about relocations on this machine architecture\n"));
677       return FALSE;
678     }
679 }
680
681 static int
682 slurp_rela_relocs (FILE * file,
683                    unsigned long rel_offset,
684                    unsigned long rel_size,
685                    Elf_Internal_Rela ** relasp,
686                    unsigned long * nrelasp)
687 {
688   Elf_Internal_Rela * relas;
689   unsigned long nrelas;
690   unsigned int i;
691
692   if (is_32bit_elf)
693     {
694       Elf32_External_Rela * erelas;
695
696       erelas = (Elf32_External_Rela *) get_data (NULL, file, rel_offset, 1,
697                                                  rel_size, _("32-bit relocation data"));
698       if (!erelas)
699         return 0;
700
701       nrelas = rel_size / sizeof (Elf32_External_Rela);
702
703       relas = (Elf_Internal_Rela *) cmalloc (nrelas,
704                                              sizeof (Elf_Internal_Rela));
705
706       if (relas == NULL)
707         {
708           free (erelas);
709           error (_("out of memory parsing relocs\n"));
710           return 0;
711         }
712
713       for (i = 0; i < nrelas; i++)
714         {
715           relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
716           relas[i].r_info   = BYTE_GET (erelas[i].r_info);
717           relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
718         }
719
720       free (erelas);
721     }
722   else
723     {
724       Elf64_External_Rela * erelas;
725
726       erelas = (Elf64_External_Rela *) get_data (NULL, file, rel_offset, 1,
727                                                  rel_size, _("64-bit relocation data"));
728       if (!erelas)
729         return 0;
730
731       nrelas = rel_size / sizeof (Elf64_External_Rela);
732
733       relas = (Elf_Internal_Rela *) cmalloc (nrelas,
734                                              sizeof (Elf_Internal_Rela));
735
736       if (relas == NULL)
737         {
738           free (erelas);
739           error (_("out of memory parsing relocs\n"));
740           return 0;
741         }
742
743       for (i = 0; i < nrelas; i++)
744         {
745           relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
746           relas[i].r_info   = BYTE_GET (erelas[i].r_info);
747           relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
748
749           /* The #ifdef BFD64 below is to prevent a compile time
750              warning.  We know that if we do not have a 64 bit data
751              type that we will never execute this code anyway.  */
752 #ifdef BFD64
753           if (elf_header.e_machine == EM_MIPS
754               && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
755             {
756               /* In little-endian objects, r_info isn't really a
757                  64-bit little-endian value: it has a 32-bit
758                  little-endian symbol index followed by four
759                  individual byte fields.  Reorder INFO
760                  accordingly.  */
761               bfd_vma inf = relas[i].r_info;
762               inf = (((inf & 0xffffffff) << 32)
763                       | ((inf >> 56) & 0xff)
764                       | ((inf >> 40) & 0xff00)
765                       | ((inf >> 24) & 0xff0000)
766                       | ((inf >> 8) & 0xff000000));
767               relas[i].r_info = inf;
768             }
769 #endif /* BFD64 */
770         }
771
772       free (erelas);
773     }
774   *relasp = relas;
775   *nrelasp = nrelas;
776   return 1;
777 }
778
779 static int
780 slurp_rel_relocs (FILE * file,
781                   unsigned long rel_offset,
782                   unsigned long rel_size,
783                   Elf_Internal_Rela ** relsp,
784                   unsigned long * nrelsp)
785 {
786   Elf_Internal_Rela * rels;
787   unsigned long nrels;
788   unsigned int i;
789
790   if (is_32bit_elf)
791     {
792       Elf32_External_Rel * erels;
793
794       erels = (Elf32_External_Rel *) get_data (NULL, file, rel_offset, 1,
795                                                rel_size, _("32-bit relocation data"));
796       if (!erels)
797         return 0;
798
799       nrels = rel_size / sizeof (Elf32_External_Rel);
800
801       rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
802
803       if (rels == NULL)
804         {
805           free (erels);
806           error (_("out of memory parsing relocs\n"));
807           return 0;
808         }
809
810       for (i = 0; i < nrels; i++)
811         {
812           rels[i].r_offset = BYTE_GET (erels[i].r_offset);
813           rels[i].r_info   = BYTE_GET (erels[i].r_info);
814           rels[i].r_addend = 0;
815         }
816
817       free (erels);
818     }
819   else
820     {
821       Elf64_External_Rel * erels;
822
823       erels = (Elf64_External_Rel *) get_data (NULL, file, rel_offset, 1,
824                                                rel_size, _("64-bit relocation data"));
825       if (!erels)
826         return 0;
827
828       nrels = rel_size / sizeof (Elf64_External_Rel);
829
830       rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
831
832       if (rels == NULL)
833         {
834           free (erels);
835           error (_("out of memory parsing relocs\n"));
836           return 0;
837         }
838
839       for (i = 0; i < nrels; i++)
840         {
841           rels[i].r_offset = BYTE_GET (erels[i].r_offset);
842           rels[i].r_info   = BYTE_GET (erels[i].r_info);
843           rels[i].r_addend = 0;
844
845           /* The #ifdef BFD64 below is to prevent a compile time
846              warning.  We know that if we do not have a 64 bit data
847              type that we will never execute this code anyway.  */
848 #ifdef BFD64
849           if (elf_header.e_machine == EM_MIPS
850               && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
851             {
852               /* In little-endian objects, r_info isn't really a
853                  64-bit little-endian value: it has a 32-bit
854                  little-endian symbol index followed by four
855                  individual byte fields.  Reorder INFO
856                  accordingly.  */
857               bfd_vma inf = rels[i].r_info;
858               inf = (((inf & 0xffffffff) << 32)
859                      | ((inf >> 56) & 0xff)
860                      | ((inf >> 40) & 0xff00)
861                      | ((inf >> 24) & 0xff0000)
862                      | ((inf >> 8) & 0xff000000));
863               rels[i].r_info = inf;
864             }
865 #endif /* BFD64 */
866         }
867
868       free (erels);
869     }
870   *relsp = rels;
871   *nrelsp = nrels;
872   return 1;
873 }
874
875 /* Returns the reloc type extracted from the reloc info field.  */
876
877 static unsigned int
878 get_reloc_type (bfd_vma reloc_info)
879 {
880   if (is_32bit_elf)
881     return ELF32_R_TYPE (reloc_info);
882
883   switch (elf_header.e_machine)
884     {
885     case EM_MIPS:
886       /* Note: We assume that reloc_info has already been adjusted for us.  */
887       return ELF64_MIPS_R_TYPE (reloc_info);
888
889     case EM_SPARCV9:
890       return ELF64_R_TYPE_ID (reloc_info);
891
892     default:
893       return ELF64_R_TYPE (reloc_info);
894     }
895 }
896
897 /* Return the symbol index extracted from the reloc info field.  */
898
899 static bfd_vma
900 get_reloc_symindex (bfd_vma reloc_info)
901 {
902   return is_32bit_elf ? ELF32_R_SYM (reloc_info) : ELF64_R_SYM (reloc_info);
903 }
904
905 static inline bfd_boolean
906 uses_msp430x_relocs (void)
907 {
908   return
909     elf_header.e_machine == EM_MSP430 /* Paranoia.  */
910     /* GCC uses osabi == ELFOSBI_STANDALONE.  */
911     && (((elf_header.e_flags & EF_MSP430_MACH) == E_MSP430_MACH_MSP430X)
912         /* TI compiler uses ELFOSABI_NONE.  */
913         || (elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE));
914 }
915
916 /* Display the contents of the relocation data found at the specified
917    offset.  */
918
919 static void
920 dump_relocations (FILE * file,
921                   unsigned long rel_offset,
922                   unsigned long rel_size,
923                   Elf_Internal_Sym * symtab,
924                   unsigned long nsyms,
925                   char * strtab,
926                   unsigned long strtablen,
927                   int is_rela)
928 {
929   unsigned int i;
930   Elf_Internal_Rela * rels;
931
932   if (is_rela == UNKNOWN)
933     is_rela = guess_is_rela (elf_header.e_machine);
934
935   if (is_rela)
936     {
937       if (!slurp_rela_relocs (file, rel_offset, rel_size, &rels, &rel_size))
938         return;
939     }
940   else
941     {
942       if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
943         return;
944     }
945
946   if (is_32bit_elf)
947     {
948       if (is_rela)
949         {
950           if (do_wide)
951             printf (_(" Offset     Info    Type                Sym. Value  Symbol's Name + Addend\n"));
952           else
953             printf (_(" Offset     Info    Type            Sym.Value  Sym. Name + Addend\n"));
954         }
955       else
956         {
957           if (do_wide)
958             printf (_(" Offset     Info    Type                Sym. Value  Symbol's Name\n"));
959           else
960             printf (_(" Offset     Info    Type            Sym.Value  Sym. Name\n"));
961         }
962     }
963   else
964     {
965       if (is_rela)
966         {
967           if (do_wide)
968             printf (_("    Offset             Info             Type               Symbol's Value  Symbol's Name + Addend\n"));
969           else
970             printf (_("  Offset          Info           Type           Sym. Value    Sym. Name + Addend\n"));
971         }
972       else
973         {
974           if (do_wide)
975             printf (_("    Offset             Info             Type               Symbol's Value  Symbol's Name\n"));
976           else
977             printf (_("  Offset          Info           Type           Sym. Value    Sym. Name\n"));
978         }
979     }
980
981   for (i = 0; i < rel_size; i++)
982     {
983       const char * rtype;
984       bfd_vma offset;
985       bfd_vma inf;
986       bfd_vma symtab_index;
987       bfd_vma type;
988
989       offset = rels[i].r_offset;
990       inf    = rels[i].r_info;
991
992       type = get_reloc_type (inf);
993       symtab_index = get_reloc_symindex  (inf);
994
995       if (is_32bit_elf)
996         {
997           printf ("%8.8lx  %8.8lx ",
998                   (unsigned long) offset & 0xffffffff,
999                   (unsigned long) inf & 0xffffffff);
1000         }
1001       else
1002         {
1003 #if BFD_HOST_64BIT_LONG
1004           printf (do_wide
1005                   ? "%16.16lx  %16.16lx "
1006                   : "%12.12lx  %12.12lx ",
1007                   offset, inf);
1008 #elif BFD_HOST_64BIT_LONG_LONG
1009 #ifndef __MSVCRT__
1010           printf (do_wide
1011                   ? "%16.16llx  %16.16llx "
1012                   : "%12.12llx  %12.12llx ",
1013                   offset, inf);
1014 #else
1015           printf (do_wide
1016                   ? "%16.16I64x  %16.16I64x "
1017                   : "%12.12I64x  %12.12I64x ",
1018                   offset, inf);
1019 #endif
1020 #else
1021           printf (do_wide
1022                   ? "%8.8lx%8.8lx  %8.8lx%8.8lx "
1023                   : "%4.4lx%8.8lx  %4.4lx%8.8lx ",
1024                   _bfd_int64_high (offset),
1025                   _bfd_int64_low (offset),
1026                   _bfd_int64_high (inf),
1027                   _bfd_int64_low (inf));
1028 #endif
1029         }
1030
1031       switch (elf_header.e_machine)
1032         {
1033         default:
1034           rtype = NULL;
1035           break;
1036
1037         case EM_AARCH64:
1038           rtype = elf_aarch64_reloc_type (type);
1039           break;
1040
1041         case EM_M32R:
1042         case EM_CYGNUS_M32R:
1043           rtype = elf_m32r_reloc_type (type);
1044           break;
1045
1046         case EM_386:
1047         case EM_486:
1048           rtype = elf_i386_reloc_type (type);
1049           break;
1050
1051         case EM_68HC11:
1052         case EM_68HC12:
1053           rtype = elf_m68hc11_reloc_type (type);
1054           break;
1055
1056         case EM_68K:
1057           rtype = elf_m68k_reloc_type (type);
1058           break;
1059
1060         case EM_960:
1061           rtype = elf_i960_reloc_type (type);
1062           break;
1063
1064         case EM_AVR:
1065         case EM_AVR_OLD:
1066           rtype = elf_avr_reloc_type (type);
1067           break;
1068
1069         case EM_OLD_SPARCV9:
1070         case EM_SPARC32PLUS:
1071         case EM_SPARCV9:
1072         case EM_SPARC:
1073           rtype = elf_sparc_reloc_type (type);
1074           break;
1075
1076         case EM_SPU:
1077           rtype = elf_spu_reloc_type (type);
1078           break;
1079
1080         case EM_V800:
1081           rtype = v800_reloc_type (type);
1082           break;
1083         case EM_V850:
1084         case EM_CYGNUS_V850:
1085           rtype = v850_reloc_type (type);
1086           break;
1087
1088         case EM_D10V:
1089         case EM_CYGNUS_D10V:
1090           rtype = elf_d10v_reloc_type (type);
1091           break;
1092
1093         case EM_D30V:
1094         case EM_CYGNUS_D30V:
1095           rtype = elf_d30v_reloc_type (type);
1096           break;
1097
1098         case EM_DLX:
1099           rtype = elf_dlx_reloc_type (type);
1100           break;
1101
1102         case EM_SH:
1103           rtype = elf_sh_reloc_type (type);
1104           break;
1105
1106         case EM_MN10300:
1107         case EM_CYGNUS_MN10300:
1108           rtype = elf_mn10300_reloc_type (type);
1109           break;
1110
1111         case EM_MN10200:
1112         case EM_CYGNUS_MN10200:
1113           rtype = elf_mn10200_reloc_type (type);
1114           break;
1115
1116         case EM_FR30:
1117         case EM_CYGNUS_FR30:
1118           rtype = elf_fr30_reloc_type (type);
1119           break;
1120
1121         case EM_CYGNUS_FRV:
1122           rtype = elf_frv_reloc_type (type);
1123           break;
1124
1125         case EM_MCORE:
1126           rtype = elf_mcore_reloc_type (type);
1127           break;
1128
1129         case EM_MMIX:
1130           rtype = elf_mmix_reloc_type (type);
1131           break;
1132
1133         case EM_MOXIE:
1134           rtype = elf_moxie_reloc_type (type);
1135           break;
1136
1137         case EM_MSP430:
1138           if (uses_msp430x_relocs ())
1139             {
1140               rtype = elf_msp430x_reloc_type (type);
1141               break;
1142             }
1143         case EM_MSP430_OLD:
1144           rtype = elf_msp430_reloc_type (type);
1145           break;
1146
1147         case EM_PPC:
1148           rtype = elf_ppc_reloc_type (type);
1149           break;
1150
1151         case EM_PPC64:
1152           rtype = elf_ppc64_reloc_type (type);
1153           break;
1154
1155         case EM_MIPS:
1156         case EM_MIPS_RS3_LE:
1157           rtype = elf_mips_reloc_type (type);
1158           break;
1159
1160         case EM_ALPHA:
1161           rtype = elf_alpha_reloc_type (type);
1162           break;
1163
1164         case EM_ARM:
1165           rtype = elf_arm_reloc_type (type);
1166           break;
1167
1168         case EM_ARC:
1169           rtype = elf_arc_reloc_type (type);
1170           break;
1171
1172         case EM_PARISC:
1173           rtype = elf_hppa_reloc_type (type);
1174           break;
1175
1176         case EM_H8_300:
1177         case EM_H8_300H:
1178         case EM_H8S:
1179           rtype = elf_h8_reloc_type (type);
1180           break;
1181
1182         case EM_OPENRISC:
1183         case EM_OR32:
1184           rtype = elf_or32_reloc_type (type);
1185           break;
1186
1187         case EM_PJ:
1188         case EM_PJ_OLD:
1189           rtype = elf_pj_reloc_type (type);
1190           break;
1191         case EM_IA_64:
1192           rtype = elf_ia64_reloc_type (type);
1193           break;
1194
1195         case EM_CRIS:
1196           rtype = elf_cris_reloc_type (type);
1197           break;
1198
1199         case EM_860:
1200           rtype = elf_i860_reloc_type (type);
1201           break;
1202
1203         case EM_X86_64:
1204         case EM_L1OM:
1205         case EM_K1OM:
1206           rtype = elf_x86_64_reloc_type (type);
1207           break;
1208
1209         case EM_S370:
1210           rtype = i370_reloc_type (type);
1211           break;
1212
1213         case EM_S390_OLD:
1214         case EM_S390:
1215           rtype = elf_s390_reloc_type (type);
1216           break;
1217
1218         case EM_SCORE:
1219           rtype = elf_score_reloc_type (type);
1220           break;
1221
1222         case EM_XSTORMY16:
1223           rtype = elf_xstormy16_reloc_type (type);
1224           break;
1225
1226         case EM_CRX:
1227           rtype = elf_crx_reloc_type (type);
1228           break;
1229
1230         case EM_VAX:
1231           rtype = elf_vax_reloc_type (type);
1232           break;
1233
1234         case EM_ADAPTEVA_EPIPHANY:
1235           rtype = elf_epiphany_reloc_type (type);
1236           break;
1237
1238         case EM_IP2K:
1239         case EM_IP2K_OLD:
1240           rtype = elf_ip2k_reloc_type (type);
1241           break;
1242
1243         case EM_IQ2000:
1244           rtype = elf_iq2000_reloc_type (type);
1245           break;
1246
1247         case EM_XTENSA_OLD:
1248         case EM_XTENSA:
1249           rtype = elf_xtensa_reloc_type (type);
1250           break;
1251
1252         case EM_LATTICEMICO32:
1253           rtype = elf_lm32_reloc_type (type);
1254           break;
1255
1256         case EM_M32C_OLD:
1257         case EM_M32C:
1258           rtype = elf_m32c_reloc_type (type);
1259           break;
1260
1261         case EM_MT:
1262           rtype = elf_mt_reloc_type (type);
1263           break;
1264
1265         case EM_BLACKFIN:
1266           rtype = elf_bfin_reloc_type (type);
1267           break;
1268
1269         case EM_CYGNUS_MEP:
1270           rtype = elf_mep_reloc_type (type);
1271           break;
1272
1273         case EM_CR16:
1274           rtype = elf_cr16_reloc_type (type);
1275           break;
1276
1277         case EM_MICROBLAZE:
1278         case EM_MICROBLAZE_OLD:
1279           rtype = elf_microblaze_reloc_type (type);
1280           break;
1281
1282         case EM_RL78:
1283           rtype = elf_rl78_reloc_type (type);
1284           break;
1285
1286         case EM_RX:
1287           rtype = elf_rx_reloc_type (type);
1288           break;
1289
1290         case EM_METAG:
1291           rtype = elf_metag_reloc_type (type);
1292           break;
1293
1294         case EM_XC16X:
1295         case EM_C166:
1296           rtype = elf_xc16x_reloc_type (type);
1297           break;
1298
1299         case EM_TI_C6000:
1300           rtype = elf_tic6x_reloc_type (type);
1301           break;
1302
1303         case EM_TILEGX:
1304           rtype = elf_tilegx_reloc_type (type);
1305           break;
1306
1307         case EM_TILEPRO:
1308           rtype = elf_tilepro_reloc_type (type);
1309           break;
1310
1311         case EM_XGATE:
1312           rtype = elf_xgate_reloc_type (type);
1313           break;
1314
1315         case EM_ALTERA_NIOS2:
1316           rtype = elf_nios2_reloc_type (type);
1317           break;
1318         }
1319
1320       if (rtype == NULL)
1321         printf (_("unrecognized: %-7lx"), (unsigned long) type & 0xffffffff);
1322       else
1323         printf (do_wide ? "%-22.22s" : "%-17.17s", rtype);
1324
1325       if (elf_header.e_machine == EM_ALPHA
1326           && rtype != NULL
1327           && streq (rtype, "R_ALPHA_LITUSE")
1328           && is_rela)
1329         {
1330           switch (rels[i].r_addend)
1331             {
1332             case LITUSE_ALPHA_ADDR:   rtype = "ADDR";   break;
1333             case LITUSE_ALPHA_BASE:   rtype = "BASE";   break;
1334             case LITUSE_ALPHA_BYTOFF: rtype = "BYTOFF"; break;
1335             case LITUSE_ALPHA_JSR:    rtype = "JSR";    break;
1336             case LITUSE_ALPHA_TLSGD:  rtype = "TLSGD";  break;
1337             case LITUSE_ALPHA_TLSLDM: rtype = "TLSLDM"; break;
1338             case LITUSE_ALPHA_JSRDIRECT: rtype = "JSRDIRECT"; break;
1339             default: rtype = NULL;
1340             }
1341           if (rtype)
1342             printf (" (%s)", rtype);
1343           else
1344             {
1345               putchar (' ');
1346               printf (_("<unknown addend: %lx>"),
1347                       (unsigned long) rels[i].r_addend);
1348             }
1349         }
1350       else if (symtab_index)
1351         {
1352           if (symtab == NULL || symtab_index >= nsyms)
1353             printf (_(" bad symbol index: %08lx"), (unsigned long) symtab_index);
1354           else
1355             {
1356               Elf_Internal_Sym * psym;
1357
1358               psym = symtab + symtab_index;
1359
1360               printf (" ");
1361
1362               if (ELF_ST_TYPE (psym->st_info) == STT_GNU_IFUNC)
1363                 {
1364                   const char * name;
1365                   unsigned int len;
1366                   unsigned int width = is_32bit_elf ? 8 : 14;
1367
1368                   /* Relocations against GNU_IFUNC symbols do not use the value
1369                      of the symbol as the address to relocate against.  Instead
1370                      they invoke the function named by the symbol and use its
1371                      result as the address for relocation.
1372
1373                      To indicate this to the user, do not display the value of
1374                      the symbol in the "Symbols's Value" field.  Instead show
1375                      its name followed by () as a hint that the symbol is
1376                      invoked.  */
1377
1378                   if (strtab == NULL
1379                       || psym->st_name == 0
1380                       || psym->st_name >= strtablen)
1381                     name = "??";
1382                   else
1383                     name = strtab + psym->st_name;
1384
1385                   len = print_symbol (width, name);
1386                   printf ("()%-*s", len <= width ? (width + 1) - len : 1, " ");
1387                 }
1388               else
1389                 {
1390                   print_vma (psym->st_value, LONG_HEX);
1391
1392                   printf (is_32bit_elf ? "   " : " ");
1393                 }
1394
1395               if (psym->st_name == 0)
1396                 {
1397                   const char * sec_name = "<null>";
1398                   char name_buf[40];
1399
1400                   if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1401                     {
1402                       if (psym->st_shndx < elf_header.e_shnum)
1403                         sec_name
1404                           = SECTION_NAME (section_headers + psym->st_shndx);
1405                       else if (psym->st_shndx == SHN_ABS)
1406                         sec_name = "ABS";
1407                       else if (psym->st_shndx == SHN_COMMON)
1408                         sec_name = "COMMON";
1409                       else if ((elf_header.e_machine == EM_MIPS
1410                                 && psym->st_shndx == SHN_MIPS_SCOMMON)
1411                                || (elf_header.e_machine == EM_TI_C6000
1412                                    && psym->st_shndx == SHN_TIC6X_SCOMMON))
1413                         sec_name = "SCOMMON";
1414                       else if (elf_header.e_machine == EM_MIPS
1415                                && psym->st_shndx == SHN_MIPS_SUNDEFINED)
1416                         sec_name = "SUNDEF";
1417                       else if ((elf_header.e_machine == EM_X86_64
1418                                 || elf_header.e_machine == EM_L1OM
1419                                 || elf_header.e_machine == EM_K1OM)
1420                                && psym->st_shndx == SHN_X86_64_LCOMMON)
1421                         sec_name = "LARGE_COMMON";
1422                       else if (elf_header.e_machine == EM_IA_64
1423                                && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
1424                                && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1425                         sec_name = "ANSI_COM";
1426                       else if (is_ia64_vms ()
1427                                && psym->st_shndx == SHN_IA_64_VMS_SYMVEC)
1428                         sec_name = "VMS_SYMVEC";
1429                       else
1430                         {
1431                           sprintf (name_buf, "<section 0x%x>",
1432                                    (unsigned int) psym->st_shndx);
1433                           sec_name = name_buf;
1434                         }
1435                     }
1436                   print_symbol (22, sec_name);
1437                 }
1438               else if (strtab == NULL)
1439                 printf (_("<string table index: %3ld>"), psym->st_name);
1440               else if (psym->st_name >= strtablen)
1441                 printf (_("<corrupt string table index: %3ld>"), psym->st_name);
1442               else
1443                 print_symbol (22, strtab + psym->st_name);
1444
1445               if (is_rela)
1446                 {
1447                   bfd_signed_vma off = rels[i].r_addend;
1448
1449                   if (off < 0)
1450                     printf (" - %" BFD_VMA_FMT "x", - off);
1451                   else
1452                     printf (" + %" BFD_VMA_FMT "x", off);
1453                 }
1454             }
1455         }
1456       else if (is_rela)
1457         {
1458           bfd_signed_vma off = rels[i].r_addend;
1459
1460           printf ("%*c", is_32bit_elf ? 12 : 20, ' ');
1461           if (off < 0)
1462             printf ("-%" BFD_VMA_FMT "x", - off);
1463           else
1464             printf ("%" BFD_VMA_FMT "x", off);
1465         }
1466
1467       if (elf_header.e_machine == EM_SPARCV9
1468           && rtype != NULL
1469           && streq (rtype, "R_SPARC_OLO10"))
1470         printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf));
1471
1472       putchar ('\n');
1473
1474 #ifdef BFD64
1475       if (! is_32bit_elf && elf_header.e_machine == EM_MIPS)
1476         {
1477           bfd_vma type2 = ELF64_MIPS_R_TYPE2 (inf);
1478           bfd_vma type3 = ELF64_MIPS_R_TYPE3 (inf);
1479           const char * rtype2 = elf_mips_reloc_type (type2);
1480           const char * rtype3 = elf_mips_reloc_type (type3);
1481
1482           printf ("                    Type2: ");
1483
1484           if (rtype2 == NULL)
1485             printf (_("unrecognized: %-7lx"),
1486                     (unsigned long) type2 & 0xffffffff);
1487           else
1488             printf ("%-17.17s", rtype2);
1489
1490           printf ("\n                    Type3: ");
1491
1492           if (rtype3 == NULL)
1493             printf (_("unrecognized: %-7lx"),
1494                     (unsigned long) type3 & 0xffffffff);
1495           else
1496             printf ("%-17.17s", rtype3);
1497
1498           putchar ('\n');
1499         }
1500 #endif /* BFD64 */
1501     }
1502
1503   free (rels);
1504 }
1505
1506 static const char *
1507 get_mips_dynamic_type (unsigned long type)
1508 {
1509   switch (type)
1510     {
1511     case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1512     case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1513     case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1514     case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1515     case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1516     case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1517     case DT_MIPS_MSYM: return "MIPS_MSYM";
1518     case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1519     case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1520     case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1521     case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1522     case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1523     case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1524     case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1525     case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1526     case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1527     case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1528     case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1529     case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1530     case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1531     case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1532     case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1533     case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1534     case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1535     case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1536     case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1537     case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1538     case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1539     case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1540     case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1541     case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1542     case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1543     case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1544     case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1545     case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1546     case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1547     case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1548     case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1549     case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1550     case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1551     case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1552     case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1553     case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1554     case DT_MIPS_PLTGOT: return "MIPS_PLTGOT";
1555     case DT_MIPS_RWPLT: return "MIPS_RWPLT";
1556     default:
1557       return NULL;
1558     }
1559 }
1560
1561 static const char *
1562 get_sparc64_dynamic_type (unsigned long type)
1563 {
1564   switch (type)
1565     {
1566     case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1567     default:
1568       return NULL;
1569     }
1570 }
1571
1572 static const char *
1573 get_ppc_dynamic_type (unsigned long type)
1574 {
1575   switch (type)
1576     {
1577     case DT_PPC_GOT:    return "PPC_GOT";
1578     case DT_PPC_TLSOPT: return "PPC_TLSOPT";
1579     default:
1580       return NULL;
1581     }
1582 }
1583
1584 static const char *
1585 get_ppc64_dynamic_type (unsigned long type)
1586 {
1587   switch (type)
1588     {
1589     case DT_PPC64_GLINK:  return "PPC64_GLINK";
1590     case DT_PPC64_OPD:    return "PPC64_OPD";
1591     case DT_PPC64_OPDSZ:  return "PPC64_OPDSZ";
1592     case DT_PPC64_TLSOPT: return "PPC64_TLSOPT";
1593     default:
1594       return NULL;
1595     }
1596 }
1597
1598 static const char *
1599 get_parisc_dynamic_type (unsigned long type)
1600 {
1601   switch (type)
1602     {
1603     case DT_HP_LOAD_MAP:        return "HP_LOAD_MAP";
1604     case DT_HP_DLD_FLAGS:       return "HP_DLD_FLAGS";
1605     case DT_HP_DLD_HOOK:        return "HP_DLD_HOOK";
1606     case DT_HP_UX10_INIT:       return "HP_UX10_INIT";
1607     case DT_HP_UX10_INITSZ:     return "HP_UX10_INITSZ";
1608     case DT_HP_PREINIT:         return "HP_PREINIT";
1609     case DT_HP_PREINITSZ:       return "HP_PREINITSZ";
1610     case DT_HP_NEEDED:          return "HP_NEEDED";
1611     case DT_HP_TIME_STAMP:      return "HP_TIME_STAMP";
1612     case DT_HP_CHECKSUM:        return "HP_CHECKSUM";
1613     case DT_HP_GST_SIZE:        return "HP_GST_SIZE";
1614     case DT_HP_GST_VERSION:     return "HP_GST_VERSION";
1615     case DT_HP_GST_HASHVAL:     return "HP_GST_HASHVAL";
1616     case DT_HP_EPLTREL:         return "HP_GST_EPLTREL";
1617     case DT_HP_EPLTRELSZ:       return "HP_GST_EPLTRELSZ";
1618     case DT_HP_FILTERED:        return "HP_FILTERED";
1619     case DT_HP_FILTER_TLS:      return "HP_FILTER_TLS";
1620     case DT_HP_COMPAT_FILTERED: return "HP_COMPAT_FILTERED";
1621     case DT_HP_LAZYLOAD:        return "HP_LAZYLOAD";
1622     case DT_HP_BIND_NOW_COUNT:  return "HP_BIND_NOW_COUNT";
1623     case DT_PLT:                return "PLT";
1624     case DT_PLT_SIZE:           return "PLT_SIZE";
1625     case DT_DLT:                return "DLT";
1626     case DT_DLT_SIZE:           return "DLT_SIZE";
1627     default:
1628       return NULL;
1629     }
1630 }
1631
1632 static const char *
1633 get_ia64_dynamic_type (unsigned long type)
1634 {
1635   switch (type)
1636     {
1637     case DT_IA_64_PLT_RESERVE:         return "IA_64_PLT_RESERVE";
1638     case DT_IA_64_VMS_SUBTYPE:         return "VMS_SUBTYPE";
1639     case DT_IA_64_VMS_IMGIOCNT:        return "VMS_IMGIOCNT";
1640     case DT_IA_64_VMS_LNKFLAGS:        return "VMS_LNKFLAGS";
1641     case DT_IA_64_VMS_VIR_MEM_BLK_SIZ: return "VMS_VIR_MEM_BLK_SIZ";
1642     case DT_IA_64_VMS_IDENT:           return "VMS_IDENT";
1643     case DT_IA_64_VMS_NEEDED_IDENT:    return "VMS_NEEDED_IDENT";
1644     case DT_IA_64_VMS_IMG_RELA_CNT:    return "VMS_IMG_RELA_CNT";
1645     case DT_IA_64_VMS_SEG_RELA_CNT:    return "VMS_SEG_RELA_CNT";
1646     case DT_IA_64_VMS_FIXUP_RELA_CNT:  return "VMS_FIXUP_RELA_CNT";
1647     case DT_IA_64_VMS_FIXUP_NEEDED:    return "VMS_FIXUP_NEEDED";
1648     case DT_IA_64_VMS_SYMVEC_CNT:      return "VMS_SYMVEC_CNT";
1649     case DT_IA_64_VMS_XLATED:          return "VMS_XLATED";
1650     case DT_IA_64_VMS_STACKSIZE:       return "VMS_STACKSIZE";
1651     case DT_IA_64_VMS_UNWINDSZ:        return "VMS_UNWINDSZ";
1652     case DT_IA_64_VMS_UNWIND_CODSEG:   return "VMS_UNWIND_CODSEG";
1653     case DT_IA_64_VMS_UNWIND_INFOSEG:  return "VMS_UNWIND_INFOSEG";
1654     case DT_IA_64_VMS_LINKTIME:        return "VMS_LINKTIME";
1655     case DT_IA_64_VMS_SEG_NO:          return "VMS_SEG_NO";
1656     case DT_IA_64_VMS_SYMVEC_OFFSET:   return "VMS_SYMVEC_OFFSET";
1657     case DT_IA_64_VMS_SYMVEC_SEG:      return "VMS_SYMVEC_SEG";
1658     case DT_IA_64_VMS_UNWIND_OFFSET:   return "VMS_UNWIND_OFFSET";
1659     case DT_IA_64_VMS_UNWIND_SEG:      return "VMS_UNWIND_SEG";
1660     case DT_IA_64_VMS_STRTAB_OFFSET:   return "VMS_STRTAB_OFFSET";
1661     case DT_IA_64_VMS_SYSVER_OFFSET:   return "VMS_SYSVER_OFFSET";
1662     case DT_IA_64_VMS_IMG_RELA_OFF:    return "VMS_IMG_RELA_OFF";
1663     case DT_IA_64_VMS_SEG_RELA_OFF:    return "VMS_SEG_RELA_OFF";
1664     case DT_IA_64_VMS_FIXUP_RELA_OFF:  return "VMS_FIXUP_RELA_OFF";
1665     case DT_IA_64_VMS_PLTGOT_OFFSET:   return "VMS_PLTGOT_OFFSET";
1666     case DT_IA_64_VMS_PLTGOT_SEG:      return "VMS_PLTGOT_SEG";
1667     case DT_IA_64_VMS_FPMODE:          return "VMS_FPMODE";
1668     default:
1669       return NULL;
1670     }
1671 }
1672
1673 static const char *
1674 get_alpha_dynamic_type (unsigned long type)
1675 {
1676   switch (type)
1677     {
1678     case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
1679     default:
1680       return NULL;
1681     }
1682 }
1683
1684 static const char *
1685 get_score_dynamic_type (unsigned long type)
1686 {
1687   switch (type)
1688     {
1689     case DT_SCORE_BASE_ADDRESS: return "SCORE_BASE_ADDRESS";
1690     case DT_SCORE_LOCAL_GOTNO:  return "SCORE_LOCAL_GOTNO";
1691     case DT_SCORE_SYMTABNO:     return "SCORE_SYMTABNO";
1692     case DT_SCORE_GOTSYM:       return "SCORE_GOTSYM";
1693     case DT_SCORE_UNREFEXTNO:   return "SCORE_UNREFEXTNO";
1694     case DT_SCORE_HIPAGENO:     return "SCORE_HIPAGENO";
1695     default:
1696       return NULL;
1697     }
1698 }
1699
1700 static const char *
1701 get_tic6x_dynamic_type (unsigned long type)
1702 {
1703   switch (type)
1704     {
1705     case DT_C6000_GSYM_OFFSET: return "C6000_GSYM_OFFSET";
1706     case DT_C6000_GSTR_OFFSET: return "C6000_GSTR_OFFSET";
1707     case DT_C6000_DSBT_BASE:   return "C6000_DSBT_BASE";
1708     case DT_C6000_DSBT_SIZE:   return "C6000_DSBT_SIZE";
1709     case DT_C6000_PREEMPTMAP:  return "C6000_PREEMPTMAP";
1710     case DT_C6000_DSBT_INDEX:  return "C6000_DSBT_INDEX";
1711     default:
1712       return NULL;
1713     }
1714 }
1715
1716 static const char *
1717 get_nios2_dynamic_type (unsigned long type)
1718 {
1719   switch (type)
1720     {
1721     case DT_NIOS2_GP: return "NIOS2_GP";
1722     default:
1723       return NULL;
1724     }
1725 }
1726
1727 static const char *
1728 get_dynamic_type (unsigned long type)
1729 {
1730   static char buff[64];
1731
1732   switch (type)
1733     {
1734     case DT_NULL:       return "NULL";
1735     case DT_NEEDED:     return "NEEDED";
1736     case DT_PLTRELSZ:   return "PLTRELSZ";
1737     case DT_PLTGOT:     return "PLTGOT";
1738     case DT_HASH:       return "HASH";
1739     case DT_STRTAB:     return "STRTAB";
1740     case DT_SYMTAB:     return "SYMTAB";
1741     case DT_RELA:       return "RELA";
1742     case DT_RELASZ:     return "RELASZ";
1743     case DT_RELAENT:    return "RELAENT";
1744     case DT_STRSZ:      return "STRSZ";
1745     case DT_SYMENT:     return "SYMENT";
1746     case DT_INIT:       return "INIT";
1747     case DT_FINI:       return "FINI";
1748     case DT_SONAME:     return "SONAME";
1749     case DT_RPATH:      return "RPATH";
1750     case DT_SYMBOLIC:   return "SYMBOLIC";
1751     case DT_REL:        return "REL";
1752     case DT_RELSZ:      return "RELSZ";
1753     case DT_RELENT:     return "RELENT";
1754     case DT_PLTREL:     return "PLTREL";
1755     case DT_DEBUG:      return "DEBUG";
1756     case DT_TEXTREL:    return "TEXTREL";
1757     case DT_JMPREL:     return "JMPREL";
1758     case DT_BIND_NOW:   return "BIND_NOW";
1759     case DT_INIT_ARRAY: return "INIT_ARRAY";
1760     case DT_FINI_ARRAY: return "FINI_ARRAY";
1761     case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
1762     case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
1763     case DT_RUNPATH:    return "RUNPATH";
1764     case DT_FLAGS:      return "FLAGS";
1765
1766     case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1767     case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
1768
1769     case DT_CHECKSUM:   return "CHECKSUM";
1770     case DT_PLTPADSZ:   return "PLTPADSZ";
1771     case DT_MOVEENT:    return "MOVEENT";
1772     case DT_MOVESZ:     return "MOVESZ";
1773     case DT_FEATURE:    return "FEATURE";
1774     case DT_POSFLAG_1:  return "POSFLAG_1";
1775     case DT_SYMINSZ:    return "SYMINSZ";
1776     case DT_SYMINENT:   return "SYMINENT"; /* aka VALRNGHI */
1777
1778     case DT_ADDRRNGLO:  return "ADDRRNGLO";
1779     case DT_CONFIG:     return "CONFIG";
1780     case DT_DEPAUDIT:   return "DEPAUDIT";
1781     case DT_AUDIT:      return "AUDIT";
1782     case DT_PLTPAD:     return "PLTPAD";
1783     case DT_MOVETAB:    return "MOVETAB";
1784     case DT_SYMINFO:    return "SYMINFO"; /* aka ADDRRNGHI */
1785
1786     case DT_VERSYM:     return "VERSYM";
1787
1788     case DT_TLSDESC_GOT: return "TLSDESC_GOT";
1789     case DT_TLSDESC_PLT: return "TLSDESC_PLT";
1790     case DT_RELACOUNT:  return "RELACOUNT";
1791     case DT_RELCOUNT:   return "RELCOUNT";
1792     case DT_FLAGS_1:    return "FLAGS_1";
1793     case DT_VERDEF:     return "VERDEF";
1794     case DT_VERDEFNUM:  return "VERDEFNUM";
1795     case DT_VERNEED:    return "VERNEED";
1796     case DT_VERNEEDNUM: return "VERNEEDNUM";
1797
1798     case DT_AUXILIARY:  return "AUXILIARY";
1799     case DT_USED:       return "USED";
1800     case DT_FILTER:     return "FILTER";
1801
1802     case DT_GNU_PRELINKED: return "GNU_PRELINKED";
1803     case DT_GNU_CONFLICT: return "GNU_CONFLICT";
1804     case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
1805     case DT_GNU_LIBLIST: return "GNU_LIBLIST";
1806     case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
1807     case DT_GNU_HASH:   return "GNU_HASH";
1808
1809     default:
1810       if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
1811         {
1812           const char * result;
1813
1814           switch (elf_header.e_machine)
1815             {
1816             case EM_MIPS:
1817             case EM_MIPS_RS3_LE:
1818               result = get_mips_dynamic_type (type);
1819               break;
1820             case EM_SPARCV9:
1821               result = get_sparc64_dynamic_type (type);
1822               break;
1823             case EM_PPC:
1824               result = get_ppc_dynamic_type (type);
1825               break;
1826             case EM_PPC64:
1827               result = get_ppc64_dynamic_type (type);
1828               break;
1829             case EM_IA_64:
1830               result = get_ia64_dynamic_type (type);
1831               break;
1832             case EM_ALPHA:
1833               result = get_alpha_dynamic_type (type);
1834               break;
1835             case EM_SCORE:
1836               result = get_score_dynamic_type (type);
1837               break;
1838             case EM_TI_C6000:
1839               result = get_tic6x_dynamic_type (type);
1840               break;
1841             case EM_ALTERA_NIOS2:
1842               result = get_nios2_dynamic_type (type);
1843               break;
1844             default:
1845               result = NULL;
1846               break;
1847             }
1848
1849           if (result != NULL)
1850             return result;
1851
1852           snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
1853         }
1854       else if (((type >= DT_LOOS) && (type <= DT_HIOS))
1855                || (elf_header.e_machine == EM_PARISC
1856                    && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
1857         {
1858           const char * result;
1859
1860           switch (elf_header.e_machine)
1861             {
1862             case EM_PARISC:
1863               result = get_parisc_dynamic_type (type);
1864               break;
1865             case EM_IA_64:
1866               result = get_ia64_dynamic_type (type);
1867               break;
1868             default:
1869               result = NULL;
1870               break;
1871             }
1872
1873           if (result != NULL)
1874             return result;
1875
1876           snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
1877                     type);
1878         }
1879       else
1880         snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
1881
1882       return buff;
1883     }
1884 }
1885
1886 static char *
1887 get_file_type (unsigned e_type)
1888 {
1889   static char buff[32];
1890
1891   switch (e_type)
1892     {
1893     case ET_NONE:       return _("NONE (None)");
1894     case ET_REL:        return _("REL (Relocatable file)");
1895     case ET_EXEC:       return _("EXEC (Executable file)");
1896     case ET_DYN:        return _("DYN (Shared object file)");
1897     case ET_CORE:       return _("CORE (Core file)");
1898
1899     default:
1900       if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
1901         snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
1902       else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
1903         snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
1904       else
1905         snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
1906       return buff;
1907     }
1908 }
1909
1910 static char *
1911 get_machine_name (unsigned e_machine)
1912 {
1913   static char buff[64]; /* XXX */
1914
1915   switch (e_machine)
1916     {
1917     case EM_NONE:               return _("None");
1918     case EM_AARCH64:            return "AArch64";
1919     case EM_M32:                return "WE32100";
1920     case EM_SPARC:              return "Sparc";
1921     case EM_SPU:                return "SPU";
1922     case EM_386:                return "Intel 80386";
1923     case EM_68K:                return "MC68000";
1924     case EM_88K:                return "MC88000";
1925     case EM_486:                return "Intel 80486";
1926     case EM_860:                return "Intel 80860";
1927     case EM_MIPS:               return "MIPS R3000";
1928     case EM_S370:               return "IBM System/370";
1929     case EM_MIPS_RS3_LE:        return "MIPS R4000 big-endian";
1930     case EM_OLD_SPARCV9:        return "Sparc v9 (old)";
1931     case EM_PARISC:             return "HPPA";
1932     case EM_PPC_OLD:            return "Power PC (old)";
1933     case EM_SPARC32PLUS:        return "Sparc v8+" ;
1934     case EM_960:                return "Intel 90860";
1935     case EM_PPC:                return "PowerPC";
1936     case EM_PPC64:              return "PowerPC64";
1937     case EM_FR20:               return "Fujitsu FR20";
1938     case EM_RH32:               return "TRW RH32";
1939     case EM_MCORE:              return "MCORE";
1940     case EM_ARM:                return "ARM";
1941     case EM_OLD_ALPHA:          return "Digital Alpha (old)";
1942     case EM_SH:                 return "Renesas / SuperH SH";
1943     case EM_SPARCV9:            return "Sparc v9";
1944     case EM_TRICORE:            return "Siemens Tricore";
1945     case EM_ARC:                return "ARC";
1946     case EM_H8_300:             return "Renesas H8/300";
1947     case EM_H8_300H:            return "Renesas H8/300H";
1948     case EM_H8S:                return "Renesas H8S";
1949     case EM_H8_500:             return "Renesas H8/500";
1950     case EM_IA_64:              return "Intel IA-64";
1951     case EM_MIPS_X:             return "Stanford MIPS-X";
1952     case EM_COLDFIRE:           return "Motorola Coldfire";
1953     case EM_ALPHA:              return "Alpha";
1954     case EM_CYGNUS_D10V:
1955     case EM_D10V:               return "d10v";
1956     case EM_CYGNUS_D30V:
1957     case EM_D30V:               return "d30v";
1958     case EM_CYGNUS_M32R:
1959     case EM_M32R:               return "Renesas M32R (formerly Mitsubishi M32r)";
1960     case EM_CYGNUS_V850:
1961     case EM_V800:               return "Renesas V850 (using RH850 ABI)";
1962     case EM_V850:               return "Renesas V850";
1963     case EM_CYGNUS_MN10300:
1964     case EM_MN10300:            return "mn10300";
1965     case EM_CYGNUS_MN10200:
1966     case EM_MN10200:            return "mn10200";
1967     case EM_MOXIE:              return "Moxie";
1968     case EM_CYGNUS_FR30:
1969     case EM_FR30:               return "Fujitsu FR30";
1970     case EM_CYGNUS_FRV:         return "Fujitsu FR-V";
1971     case EM_PJ_OLD:
1972     case EM_PJ:                 return "picoJava";
1973     case EM_MMA:                return "Fujitsu Multimedia Accelerator";
1974     case EM_PCP:                return "Siemens PCP";
1975     case EM_NCPU:               return "Sony nCPU embedded RISC processor";
1976     case EM_NDR1:               return "Denso NDR1 microprocesspr";
1977     case EM_STARCORE:           return "Motorola Star*Core processor";
1978     case EM_ME16:               return "Toyota ME16 processor";
1979     case EM_ST100:              return "STMicroelectronics ST100 processor";
1980     case EM_TINYJ:              return "Advanced Logic Corp. TinyJ embedded processor";
1981     case EM_PDSP:               return "Sony DSP processor";
1982     case EM_PDP10:              return "Digital Equipment Corp. PDP-10";
1983     case EM_PDP11:              return "Digital Equipment Corp. PDP-11";
1984     case EM_FX66:               return "Siemens FX66 microcontroller";
1985     case EM_ST9PLUS:            return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1986     case EM_ST7:                return "STMicroelectronics ST7 8-bit microcontroller";
1987     case EM_68HC16:             return "Motorola MC68HC16 Microcontroller";
1988     case EM_68HC12:             return "Motorola MC68HC12 Microcontroller";
1989     case EM_68HC11:             return "Motorola MC68HC11 Microcontroller";
1990     case EM_68HC08:             return "Motorola MC68HC08 Microcontroller";
1991     case EM_68HC05:             return "Motorola MC68HC05 Microcontroller";
1992     case EM_SVX:                return "Silicon Graphics SVx";
1993     case EM_ST19:               return "STMicroelectronics ST19 8-bit microcontroller";
1994     case EM_VAX:                return "Digital VAX";
1995     case EM_AVR_OLD:
1996     case EM_AVR:                return "Atmel AVR 8-bit microcontroller";
1997     case EM_CRIS:               return "Axis Communications 32-bit embedded processor";
1998     case EM_JAVELIN:            return "Infineon Technologies 32-bit embedded cpu";
1999     case EM_FIREPATH:           return "Element 14 64-bit DSP processor";
2000     case EM_ZSP:                return "LSI Logic's 16-bit DSP processor";
2001     case EM_MMIX:               return "Donald Knuth's educational 64-bit processor";
2002     case EM_HUANY:              return "Harvard Universitys's machine-independent object format";
2003     case EM_PRISM:              return "Vitesse Prism";
2004     case EM_X86_64:             return "Advanced Micro Devices X86-64";
2005     case EM_L1OM:               return "Intel L1OM";
2006     case EM_K1OM:               return "Intel K1OM";
2007     case EM_S390_OLD:
2008     case EM_S390:               return "IBM S/390";
2009     case EM_SCORE:              return "SUNPLUS S+Core";
2010     case EM_XSTORMY16:          return "Sanyo XStormy16 CPU core";
2011     case EM_OPENRISC:
2012     case EM_OR32:               return "OpenRISC";
2013     case EM_ARC_A5:             return "ARC International ARCompact processor";
2014     case EM_CRX:                return "National Semiconductor CRX microprocessor";
2015     case EM_ADAPTEVA_EPIPHANY:  return "Adapteva EPIPHANY";
2016     case EM_DLX:                return "OpenDLX";
2017     case EM_IP2K_OLD:
2018     case EM_IP2K:               return "Ubicom IP2xxx 8-bit microcontrollers";
2019     case EM_IQ2000:             return "Vitesse IQ2000";
2020     case EM_XTENSA_OLD:
2021     case EM_XTENSA:             return "Tensilica Xtensa Processor";
2022     case EM_VIDEOCORE:          return "Alphamosaic VideoCore processor";
2023     case EM_TMM_GPP:            return "Thompson Multimedia General Purpose Processor";
2024     case EM_NS32K:              return "National Semiconductor 32000 series";
2025     case EM_TPC:                return "Tenor Network TPC processor";
2026     case EM_ST200:              return "STMicroelectronics ST200 microcontroller";
2027     case EM_MAX:                return "MAX Processor";
2028     case EM_CR:                 return "National Semiconductor CompactRISC";
2029     case EM_F2MC16:             return "Fujitsu F2MC16";
2030     case EM_MSP430:             return "Texas Instruments msp430 microcontroller";
2031     case EM_LATTICEMICO32:      return "Lattice Mico32";
2032     case EM_M32C_OLD:
2033     case EM_M32C:               return "Renesas M32c";
2034     case EM_MT:                 return "Morpho Techologies MT processor";
2035     case EM_BLACKFIN:           return "Analog Devices Blackfin";
2036     case EM_SE_C33:             return "S1C33 Family of Seiko Epson processors";
2037     case EM_SEP:                return "Sharp embedded microprocessor";
2038     case EM_ARCA:               return "Arca RISC microprocessor";
2039     case EM_UNICORE:            return "Unicore";
2040     case EM_EXCESS:             return "eXcess 16/32/64-bit configurable embedded CPU";
2041     case EM_DXP:                return "Icera Semiconductor Inc. Deep Execution Processor";
2042     case EM_NIOS32:             return "Altera Nios";
2043     case EM_ALTERA_NIOS2:       return "Altera Nios II";
2044     case EM_C166:
2045     case EM_XC16X:              return "Infineon Technologies xc16x";
2046     case EM_M16C:               return "Renesas M16C series microprocessors";
2047     case EM_DSPIC30F:           return "Microchip Technology dsPIC30F Digital Signal Controller";
2048     case EM_CE:                 return "Freescale Communication Engine RISC core";
2049     case EM_TSK3000:            return "Altium TSK3000 core";
2050     case EM_RS08:               return "Freescale RS08 embedded processor";
2051     case EM_ECOG2:              return "Cyan Technology eCOG2 microprocessor";
2052     case EM_DSP24:              return "New Japan Radio (NJR) 24-bit DSP Processor";
2053     case EM_VIDEOCORE3:         return "Broadcom VideoCore III processor";
2054     case EM_SE_C17:             return "Seiko Epson C17 family";
2055     case EM_TI_C6000:           return "Texas Instruments TMS320C6000 DSP family";
2056     case EM_TI_C2000:           return "Texas Instruments TMS320C2000 DSP family";
2057     case EM_TI_C5500:           return "Texas Instruments TMS320C55x DSP family";
2058     case EM_MMDSP_PLUS:         return "STMicroelectronics 64bit VLIW Data Signal Processor";
2059     case EM_CYPRESS_M8C:        return "Cypress M8C microprocessor";
2060     case EM_R32C:               return "Renesas R32C series microprocessors";
2061     case EM_TRIMEDIA:           return "NXP Semiconductors TriMedia architecture family";
2062     case EM_QDSP6:              return "QUALCOMM DSP6 Processor";
2063     case EM_8051:               return "Intel 8051 and variants";
2064     case EM_STXP7X:             return "STMicroelectronics STxP7x family";
2065     case EM_NDS32:              return "Andes Technology compact code size embedded RISC processor family";
2066     case EM_ECOG1X:             return "Cyan Technology eCOG1X family";
2067     case EM_MAXQ30:             return "Dallas Semiconductor MAXQ30 Core microcontrollers";
2068     case EM_XIMO16:             return "New Japan Radio (NJR) 16-bit DSP Processor";
2069     case EM_MANIK:              return "M2000 Reconfigurable RISC Microprocessor";
2070     case EM_CRAYNV2:            return "Cray Inc. NV2 vector architecture";
2071     case EM_CYGNUS_MEP:         return "Toshiba MeP Media Engine";
2072     case EM_CR16:
2073     case EM_MICROBLAZE:
2074     case EM_MICROBLAZE_OLD:     return "Xilinx MicroBlaze";
2075     case EM_RL78:               return "Renesas RL78";
2076     case EM_RX:                 return "Renesas RX";
2077     case EM_METAG:              return "Imagination Technologies Meta processor architecture";
2078     case EM_MCST_ELBRUS:        return "MCST Elbrus general purpose hardware architecture";
2079     case EM_ECOG16:             return "Cyan Technology eCOG16 family";
2080     case EM_ETPU:               return "Freescale Extended Time Processing Unit";
2081     case EM_SLE9X:              return "Infineon Technologies SLE9X core";
2082     case EM_AVR32:              return "Atmel Corporation 32-bit microprocessor family";
2083     case EM_STM8:               return "STMicroeletronics STM8 8-bit microcontroller";
2084     case EM_TILE64:             return "Tilera TILE64 multicore architecture family";
2085     case EM_TILEPRO:            return "Tilera TILEPro multicore architecture family";
2086     case EM_TILEGX:             return "Tilera TILE-Gx multicore architecture family";
2087     case EM_CUDA:               return "NVIDIA CUDA architecture";
2088     case EM_XGATE:              return "Motorola XGATE embedded processor";
2089     default:
2090       snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
2091       return buff;
2092     }
2093 }
2094
2095 static void
2096 decode_ARM_machine_flags (unsigned e_flags, char buf[])
2097 {
2098   unsigned eabi;
2099   int unknown = 0;
2100
2101   eabi = EF_ARM_EABI_VERSION (e_flags);
2102   e_flags &= ~ EF_ARM_EABIMASK;
2103
2104   /* Handle "generic" ARM flags.  */
2105   if (e_flags & EF_ARM_RELEXEC)
2106     {
2107       strcat (buf, ", relocatable executable");
2108       e_flags &= ~ EF_ARM_RELEXEC;
2109     }
2110
2111   if (e_flags & EF_ARM_HASENTRY)
2112     {
2113       strcat (buf, ", has entry point");
2114       e_flags &= ~ EF_ARM_HASENTRY;
2115     }
2116
2117   /* Now handle EABI specific flags.  */
2118   switch (eabi)
2119     {
2120     default:
2121       strcat (buf, ", <unrecognized EABI>");
2122       if (e_flags)
2123         unknown = 1;
2124       break;
2125
2126     case EF_ARM_EABI_VER1:
2127       strcat (buf, ", Version1 EABI");
2128       while (e_flags)
2129         {
2130           unsigned flag;
2131
2132           /* Process flags one bit at a time.  */
2133           flag = e_flags & - e_flags;
2134           e_flags &= ~ flag;
2135
2136           switch (flag)
2137             {
2138             case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK.  */
2139               strcat (buf, ", sorted symbol tables");
2140               break;
2141
2142             default:
2143               unknown = 1;
2144               break;
2145             }
2146         }
2147       break;
2148
2149     case EF_ARM_EABI_VER2:
2150       strcat (buf, ", Version2 EABI");
2151       while (e_flags)
2152         {
2153           unsigned flag;
2154
2155           /* Process flags one bit at a time.  */
2156           flag = e_flags & - e_flags;
2157           e_flags &= ~ flag;
2158
2159           switch (flag)
2160             {
2161             case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK.  */
2162               strcat (buf, ", sorted symbol tables");
2163               break;
2164
2165             case EF_ARM_DYNSYMSUSESEGIDX:
2166               strcat (buf, ", dynamic symbols use segment index");
2167               break;
2168
2169             case EF_ARM_MAPSYMSFIRST:
2170               strcat (buf, ", mapping symbols precede others");
2171               break;
2172
2173             default:
2174               unknown = 1;
2175               break;
2176             }
2177         }
2178       break;
2179
2180     case EF_ARM_EABI_VER3:
2181       strcat (buf, ", Version3 EABI");
2182       break;
2183
2184     case EF_ARM_EABI_VER4:
2185       strcat (buf, ", Version4 EABI");
2186       while (e_flags)
2187         {
2188           unsigned flag;
2189
2190           /* Process flags one bit at a time.  */
2191           flag = e_flags & - e_flags;
2192           e_flags &= ~ flag;
2193
2194           switch (flag)
2195             {
2196             case EF_ARM_BE8:
2197               strcat (buf, ", BE8");
2198               break;
2199
2200             case EF_ARM_LE8:
2201               strcat (buf, ", LE8");
2202               break;
2203
2204             default:
2205               unknown = 1;
2206               break;
2207             }
2208       break;
2209         }
2210       break;
2211
2212     case EF_ARM_EABI_VER5:
2213       strcat (buf, ", Version5 EABI");
2214       while (e_flags)
2215         {
2216           unsigned flag;
2217
2218           /* Process flags one bit at a time.  */
2219           flag = e_flags & - e_flags;
2220           e_flags &= ~ flag;
2221
2222           switch (flag)
2223             {
2224             case EF_ARM_BE8:
2225               strcat (buf, ", BE8");
2226               break;
2227
2228             case EF_ARM_LE8:
2229               strcat (buf, ", LE8");
2230               break;
2231
2232             case EF_ARM_ABI_FLOAT_SOFT: /* Conflicts with EF_ARM_SOFT_FLOAT.  */
2233               strcat (buf, ", soft-float ABI");
2234               break;
2235
2236             case EF_ARM_ABI_FLOAT_HARD: /* Conflicts with EF_ARM_VFP_FLOAT.  */
2237               strcat (buf, ", hard-float ABI");
2238               break;
2239
2240             default:
2241               unknown = 1;
2242               break;
2243             }
2244         }
2245       break;
2246
2247     case EF_ARM_EABI_UNKNOWN:
2248       strcat (buf, ", GNU EABI");
2249       while (e_flags)
2250         {
2251           unsigned flag;
2252
2253           /* Process flags one bit at a time.  */
2254           flag = e_flags & - e_flags;
2255           e_flags &= ~ flag;
2256
2257           switch (flag)
2258             {
2259             case EF_ARM_INTERWORK:
2260               strcat (buf, ", interworking enabled");
2261               break;
2262
2263             case EF_ARM_APCS_26:
2264               strcat (buf, ", uses APCS/26");
2265               break;
2266
2267             case EF_ARM_APCS_FLOAT:
2268               strcat (buf, ", uses APCS/float");
2269               break;
2270
2271             case EF_ARM_PIC:
2272               strcat (buf, ", position independent");
2273               break;
2274
2275             case EF_ARM_ALIGN8:
2276               strcat (buf, ", 8 bit structure alignment");
2277               break;
2278
2279             case EF_ARM_NEW_ABI:
2280               strcat (buf, ", uses new ABI");
2281               break;
2282
2283             case EF_ARM_OLD_ABI:
2284               strcat (buf, ", uses old ABI");
2285               break;
2286
2287             case EF_ARM_SOFT_FLOAT:
2288               strcat (buf, ", software FP");
2289               break;
2290
2291             case EF_ARM_VFP_FLOAT:
2292               strcat (buf, ", VFP");
2293               break;
2294
2295             case EF_ARM_MAVERICK_FLOAT:
2296               strcat (buf, ", Maverick FP");
2297               break;
2298
2299             default:
2300               unknown = 1;
2301               break;
2302             }
2303         }
2304     }
2305
2306   if (unknown)
2307     strcat (buf,_(", <unknown>"));
2308 }
2309
2310 static char *
2311 get_machine_flags (unsigned e_flags, unsigned e_machine)
2312 {
2313   static char buf[1024];
2314
2315   buf[0] = '\0';
2316
2317   if (e_flags)
2318     {
2319       switch (e_machine)
2320         {
2321         default:
2322           break;
2323
2324         case EM_ARM:
2325           decode_ARM_machine_flags (e_flags, buf);
2326           break;
2327
2328         case EM_BLACKFIN:
2329           if (e_flags & EF_BFIN_PIC)
2330             strcat (buf, ", PIC");
2331
2332           if (e_flags & EF_BFIN_FDPIC)
2333             strcat (buf, ", FDPIC");
2334
2335           if (e_flags & EF_BFIN_CODE_IN_L1)
2336             strcat (buf, ", code in L1");
2337
2338           if (e_flags & EF_BFIN_DATA_IN_L1)
2339             strcat (buf, ", data in L1");
2340
2341           break;
2342
2343         case EM_CYGNUS_FRV:
2344           switch (e_flags & EF_FRV_CPU_MASK)
2345             {
2346             case EF_FRV_CPU_GENERIC:
2347               break;
2348
2349             default:
2350               strcat (buf, ", fr???");
2351               break;
2352
2353             case EF_FRV_CPU_FR300:
2354               strcat (buf, ", fr300");
2355               break;
2356
2357             case EF_FRV_CPU_FR400:
2358               strcat (buf, ", fr400");
2359               break;
2360             case EF_FRV_CPU_FR405:
2361               strcat (buf, ", fr405");
2362               break;
2363
2364             case EF_FRV_CPU_FR450:
2365               strcat (buf, ", fr450");
2366               break;
2367
2368             case EF_FRV_CPU_FR500:
2369               strcat (buf, ", fr500");
2370               break;
2371             case EF_FRV_CPU_FR550:
2372               strcat (buf, ", fr550");
2373               break;
2374
2375             case EF_FRV_CPU_SIMPLE:
2376               strcat (buf, ", simple");
2377               break;
2378             case EF_FRV_CPU_TOMCAT:
2379               strcat (buf, ", tomcat");
2380               break;
2381             }
2382           break;
2383
2384         case EM_68K:
2385           if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
2386             strcat (buf, ", m68000");
2387           else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
2388             strcat (buf, ", cpu32");
2389           else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
2390             strcat (buf, ", fido_a");
2391           else
2392             {
2393               char const * isa = _("unknown");
2394               char const * mac = _("unknown mac");
2395               char const * additional = NULL;
2396
2397               switch (e_flags & EF_M68K_CF_ISA_MASK)
2398                 {
2399                 case EF_M68K_CF_ISA_A_NODIV:
2400                   isa = "A";
2401                   additional = ", nodiv";
2402                   break;
2403                 case EF_M68K_CF_ISA_A:
2404                   isa = "A";
2405                   break;
2406                 case EF_M68K_CF_ISA_A_PLUS:
2407                   isa = "A+";
2408                   break;
2409                 case EF_M68K_CF_ISA_B_NOUSP:
2410                   isa = "B";
2411                   additional = ", nousp";
2412                   break;
2413                 case EF_M68K_CF_ISA_B:
2414                   isa = "B";
2415                   break;
2416                 case EF_M68K_CF_ISA_C:
2417                   isa = "C";
2418                   break;
2419                 case EF_M68K_CF_ISA_C_NODIV:
2420                   isa = "C";
2421                   additional = ", nodiv";
2422                   break;
2423                 }
2424               strcat (buf, ", cf, isa ");
2425               strcat (buf, isa);
2426               if (additional)
2427                 strcat (buf, additional);
2428               if (e_flags & EF_M68K_CF_FLOAT)
2429                 strcat (buf, ", float");
2430               switch (e_flags & EF_M68K_CF_MAC_MASK)
2431                 {
2432                 case 0:
2433                   mac = NULL;
2434                   break;
2435                 case EF_M68K_CF_MAC:
2436                   mac = "mac";
2437                   break;
2438                 case EF_M68K_CF_EMAC:
2439                   mac = "emac";
2440                   break;
2441                 case EF_M68K_CF_EMAC_B:
2442                   mac = "emac_b";
2443                   break;
2444                 }
2445               if (mac)
2446                 {
2447                   strcat (buf, ", ");
2448                   strcat (buf, mac);
2449                 }
2450             }
2451           break;
2452
2453         case EM_PPC:
2454           if (e_flags & EF_PPC_EMB)
2455             strcat (buf, ", emb");
2456
2457           if (e_flags & EF_PPC_RELOCATABLE)
2458             strcat (buf, _(", relocatable"));
2459
2460           if (e_flags & EF_PPC_RELOCATABLE_LIB)
2461             strcat (buf, _(", relocatable-lib"));
2462           break;
2463
2464         case EM_V800:
2465           if ((e_flags & EF_RH850_ABI) == EF_RH850_ABI)
2466             strcat (buf, ", RH850 ABI");
2467             
2468           if (e_flags & EF_V800_850E3)
2469             strcat (buf, ", V3 architecture");
2470
2471           if ((e_flags & (EF_RH850_FPU_DOUBLE | EF_RH850_FPU_SINGLE)) == 0)
2472             strcat (buf, ", FPU not used");
2473
2474           if ((e_flags & (EF_RH850_REGMODE22 | EF_RH850_REGMODE32)) == 0)
2475             strcat (buf, ", regmode: COMMON");
2476
2477           if ((e_flags & (EF_RH850_GP_FIX | EF_RH850_GP_NOFIX)) == 0)
2478             strcat (buf, ", r4 not used");
2479
2480           if ((e_flags & (EF_RH850_EP_FIX | EF_RH850_EP_NOFIX)) == 0)
2481             strcat (buf, ", r30 not used");
2482
2483           if ((e_flags & (EF_RH850_TP_FIX | EF_RH850_TP_NOFIX)) == 0)
2484             strcat (buf, ", r5 not used");
2485
2486           if ((e_flags & (EF_RH850_REG2_RESERVE | EF_RH850_REG2_NORESERVE)) == 0)
2487             strcat (buf, ", r2 not used");
2488
2489           for (e_flags &= 0xFFFF; e_flags; e_flags &= ~ (e_flags & - e_flags))
2490             {
2491               switch (e_flags & - e_flags)
2492                 {
2493                 case EF_RH850_FPU_DOUBLE: strcat (buf, ", double precision FPU"); break;
2494                 case EF_RH850_FPU_SINGLE: strcat (buf, ", single precision FPU"); break;
2495                 case EF_RH850_SIMD: strcat (buf, ", SIMD"); break;
2496                 case EF_RH850_CACHE: strcat (buf, ", CACHE"); break;
2497                 case EF_RH850_MMU: strcat (buf, ", MMU"); break;
2498                 case EF_RH850_REGMODE22: strcat (buf, ", regmode:22"); break;
2499                 case EF_RH850_REGMODE32: strcat (buf, ", regmode:23"); break;
2500                 case EF_RH850_DATA_ALIGN8: strcat (buf, ", 8-byte alignment"); break;
2501                 case EF_RH850_GP_FIX: strcat (buf, ", r4 fixed"); break;
2502                 case EF_RH850_GP_NOFIX: strcat (buf, ", r4 free"); break;
2503                 case EF_RH850_EP_FIX: strcat (buf, ", r30 fixed"); break;
2504                 case EF_RH850_EP_NOFIX: strcat (buf, ", r30 free"); break;
2505                 case EF_RH850_TP_FIX: strcat (buf, ", r5 fixed"); break;
2506                 case EF_RH850_TP_NOFIX: strcat (buf, ", r5 free"); break;
2507                 case EF_RH850_REG2_RESERVE: strcat (buf, ", r2 fixed"); break;
2508                 case EF_RH850_REG2_NORESERVE: strcat (buf, ", r2 free"); break;
2509                 default: break;
2510                 }
2511             }
2512           break;
2513
2514         case EM_V850:
2515         case EM_CYGNUS_V850:
2516           switch (e_flags & EF_V850_ARCH)
2517             {
2518             case E_V850E3V5_ARCH:
2519               strcat (buf, ", v850e3v5");
2520               break;
2521             case E_V850E2V3_ARCH:
2522               strcat (buf, ", v850e2v3");
2523               break;
2524             case E_V850E2_ARCH:
2525               strcat (buf, ", v850e2");
2526               break;
2527             case E_V850E1_ARCH:
2528               strcat (buf, ", v850e1");
2529               break;
2530             case E_V850E_ARCH:
2531               strcat (buf, ", v850e");
2532               break;
2533             case E_V850_ARCH:
2534               strcat (buf, ", v850");
2535               break;
2536             default:
2537               strcat (buf, _(", unknown v850 architecture variant"));
2538               break;
2539             }
2540           break;
2541
2542         case EM_M32R:
2543         case EM_CYGNUS_M32R:
2544           if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
2545             strcat (buf, ", m32r");
2546           break;
2547
2548         case EM_MIPS:
2549         case EM_MIPS_RS3_LE:
2550           if (e_flags & EF_MIPS_NOREORDER)
2551             strcat (buf, ", noreorder");
2552
2553           if (e_flags & EF_MIPS_PIC)
2554             strcat (buf, ", pic");
2555
2556           if (e_flags & EF_MIPS_CPIC)
2557             strcat (buf, ", cpic");
2558
2559           if (e_flags & EF_MIPS_UCODE)
2560             strcat (buf, ", ugen_reserved");
2561
2562           if (e_flags & EF_MIPS_ABI2)
2563             strcat (buf, ", abi2");
2564
2565           if (e_flags & EF_MIPS_OPTIONS_FIRST)
2566             strcat (buf, ", odk first");
2567
2568           if (e_flags & EF_MIPS_32BITMODE)
2569             strcat (buf, ", 32bitmode");
2570
2571           if (e_flags & EF_MIPS_NAN2008)
2572             strcat (buf, ", nan2008");
2573
2574           switch ((e_flags & EF_MIPS_MACH))
2575             {
2576             case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
2577             case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
2578             case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
2579             case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
2580             case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
2581             case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
2582             case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
2583             case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
2584             case E_MIPS_MACH_SB1:  strcat (buf, ", sb1");  break;
2585             case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
2586             case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break;
2587             case E_MIPS_MACH_LS2F: strcat (buf, ", loongson-2f"); break;
2588             case E_MIPS_MACH_LS3A: strcat (buf, ", loongson-3a"); break;
2589             case E_MIPS_MACH_OCTEON: strcat (buf, ", octeon"); break;
2590             case E_MIPS_MACH_OCTEON2: strcat (buf, ", octeon2"); break;
2591             case E_MIPS_MACH_XLR:  strcat (buf, ", xlr"); break;
2592             case 0:
2593             /* We simply ignore the field in this case to avoid confusion:
2594                MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
2595                extension.  */
2596               break;
2597             default: strcat (buf, _(", unknown CPU")); break;
2598             }
2599
2600           switch ((e_flags & EF_MIPS_ABI))
2601             {
2602             case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
2603             case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
2604             case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
2605             case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
2606             case 0:
2607             /* We simply ignore the field in this case to avoid confusion:
2608                MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
2609                This means it is likely to be an o32 file, but not for
2610                sure.  */
2611               break;
2612             default: strcat (buf, _(", unknown ABI")); break;
2613             }
2614
2615           if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
2616             strcat (buf, ", mdmx");
2617
2618           if (e_flags & EF_MIPS_ARCH_ASE_M16)
2619             strcat (buf, ", mips16");
2620
2621           if (e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
2622             strcat (buf, ", micromips");
2623
2624           switch ((e_flags & EF_MIPS_ARCH))
2625             {
2626             case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
2627             case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
2628             case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
2629             case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
2630             case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
2631             case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
2632             case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
2633             case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
2634             case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
2635             default: strcat (buf, _(", unknown ISA")); break;
2636             }
2637           break;
2638
2639         case EM_SH:
2640           switch ((e_flags & EF_SH_MACH_MASK))
2641             {
2642             case EF_SH1: strcat (buf, ", sh1"); break;
2643             case EF_SH2: strcat (buf, ", sh2"); break;
2644             case EF_SH3: strcat (buf, ", sh3"); break;
2645             case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
2646             case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
2647             case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
2648             case EF_SH3E: strcat (buf, ", sh3e"); break;
2649             case EF_SH4: strcat (buf, ", sh4"); break;
2650             case EF_SH5: strcat (buf, ", sh5"); break;
2651             case EF_SH2E: strcat (buf, ", sh2e"); break;
2652             case EF_SH4A: strcat (buf, ", sh4a"); break;
2653             case EF_SH2A: strcat (buf, ", sh2a"); break;
2654             case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
2655             case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
2656             case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
2657             case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
2658             case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
2659             case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
2660             case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
2661             case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
2662             case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
2663             default: strcat (buf, _(", unknown ISA")); break;
2664             }
2665
2666           if (e_flags & EF_SH_PIC)
2667             strcat (buf, ", pic");
2668
2669           if (e_flags & EF_SH_FDPIC)
2670             strcat (buf, ", fdpic");
2671           break;
2672
2673         case EM_SPARCV9:
2674           if (e_flags & EF_SPARC_32PLUS)
2675             strcat (buf, ", v8+");
2676
2677           if (e_flags & EF_SPARC_SUN_US1)
2678             strcat (buf, ", ultrasparcI");
2679
2680           if (e_flags & EF_SPARC_SUN_US3)
2681             strcat (buf, ", ultrasparcIII");
2682
2683           if (e_flags & EF_SPARC_HAL_R1)
2684             strcat (buf, ", halr1");
2685
2686           if (e_flags & EF_SPARC_LEDATA)
2687             strcat (buf, ", ledata");
2688
2689           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
2690             strcat (buf, ", tso");
2691
2692           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
2693             strcat (buf, ", pso");
2694
2695           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
2696             strcat (buf, ", rmo");
2697           break;
2698
2699         case EM_PARISC:
2700           switch (e_flags & EF_PARISC_ARCH)
2701             {
2702             case EFA_PARISC_1_0:
2703               strcpy (buf, ", PA-RISC 1.0");
2704               break;
2705             case EFA_PARISC_1_1:
2706               strcpy (buf, ", PA-RISC 1.1");
2707               break;
2708             case EFA_PARISC_2_0:
2709               strcpy (buf, ", PA-RISC 2.0");
2710               break;
2711             default:
2712               break;
2713             }
2714           if (e_flags & EF_PARISC_TRAPNIL)
2715             strcat (buf, ", trapnil");
2716           if (e_flags & EF_PARISC_EXT)
2717             strcat (buf, ", ext");
2718           if (e_flags & EF_PARISC_LSB)
2719             strcat (buf, ", lsb");
2720           if (e_flags & EF_PARISC_WIDE)
2721             strcat (buf, ", wide");
2722           if (e_flags & EF_PARISC_NO_KABP)
2723             strcat (buf, ", no kabp");
2724           if (e_flags & EF_PARISC_LAZYSWAP)
2725             strcat (buf, ", lazyswap");
2726           break;
2727
2728         case EM_PJ:
2729         case EM_PJ_OLD:
2730           if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
2731             strcat (buf, ", new calling convention");
2732
2733           if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
2734             strcat (buf, ", gnu calling convention");
2735           break;
2736
2737         case EM_IA_64:
2738           if ((e_flags & EF_IA_64_ABI64))
2739             strcat (buf, ", 64-bit");
2740           else
2741             strcat (buf, ", 32-bit");
2742           if ((e_flags & EF_IA_64_REDUCEDFP))
2743             strcat (buf, ", reduced fp model");
2744           if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
2745             strcat (buf, ", no function descriptors, constant gp");
2746           else if ((e_flags & EF_IA_64_CONS_GP))
2747             strcat (buf, ", constant gp");
2748           if ((e_flags & EF_IA_64_ABSOLUTE))
2749             strcat (buf, ", absolute");
2750           if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
2751             {
2752               if ((e_flags & EF_IA_64_VMS_LINKAGES))
2753                 strcat (buf, ", vms_linkages");
2754               switch ((e_flags & EF_IA_64_VMS_COMCOD))
2755                 {
2756                 case EF_IA_64_VMS_COMCOD_SUCCESS:
2757                   break;
2758                 case EF_IA_64_VMS_COMCOD_WARNING:
2759                   strcat (buf, ", warning");
2760                   break;
2761                 case EF_IA_64_VMS_COMCOD_ERROR:
2762                   strcat (buf, ", error");
2763                   break;
2764                 case EF_IA_64_VMS_COMCOD_ABORT:
2765                   strcat (buf, ", abort");
2766                   break;
2767                 default:
2768                   abort ();
2769                 }
2770             }
2771           break;
2772
2773         case EM_VAX:
2774           if ((e_flags & EF_VAX_NONPIC))
2775             strcat (buf, ", non-PIC");
2776           if ((e_flags & EF_VAX_DFLOAT))
2777             strcat (buf, ", D-Float");
2778           if ((e_flags & EF_VAX_GFLOAT))
2779             strcat (buf, ", G-Float");
2780           break;
2781
2782         case EM_RL78:
2783           if (e_flags & E_FLAG_RL78_G10)
2784             strcat (buf, ", G10");
2785           break;
2786           
2787         case EM_RX:
2788           if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
2789             strcat (buf, ", 64-bit doubles");
2790           if (e_flags & E_FLAG_RX_DSP)
2791             strcat (buf, ", dsp");
2792           if (e_flags & E_FLAG_RX_PID)
2793             strcat (buf, ", pid");        
2794           if (e_flags & E_FLAG_RX_ABI)
2795             strcat (buf, ", RX ABI");
2796           break;
2797
2798         case EM_S390:
2799           if (e_flags & EF_S390_HIGH_GPRS)
2800             strcat (buf, ", highgprs");
2801           break;
2802
2803         case EM_TI_C6000:
2804           if ((e_flags & EF_C6000_REL))
2805             strcat (buf, ", relocatable module");
2806           break;
2807
2808         case EM_MSP430:
2809           strcat (buf, _(": architecture variant: "));
2810           switch (e_flags & EF_MSP430_MACH)
2811             {
2812             case E_MSP430_MACH_MSP430x11: strcat (buf, "MSP430x11"); break;
2813             case E_MSP430_MACH_MSP430x11x1 : strcat (buf, "MSP430x11x1 "); break;
2814             case E_MSP430_MACH_MSP430x12: strcat (buf, "MSP430x12"); break;
2815             case E_MSP430_MACH_MSP430x13: strcat (buf, "MSP430x13"); break;
2816             case E_MSP430_MACH_MSP430x14: strcat (buf, "MSP430x14"); break;
2817             case E_MSP430_MACH_MSP430x15: strcat (buf, "MSP430x15"); break;
2818             case E_MSP430_MACH_MSP430x16: strcat (buf, "MSP430x16"); break;
2819             case E_MSP430_MACH_MSP430x31: strcat (buf, "MSP430x31"); break;
2820             case E_MSP430_MACH_MSP430x32: strcat (buf, "MSP430x32"); break;
2821             case E_MSP430_MACH_MSP430x33: strcat (buf, "MSP430x33"); break;
2822             case E_MSP430_MACH_MSP430x41: strcat (buf, "MSP430x41"); break;
2823             case E_MSP430_MACH_MSP430x42: strcat (buf, "MSP430x42"); break;
2824             case E_MSP430_MACH_MSP430x43: strcat (buf, "MSP430x43"); break;
2825             case E_MSP430_MACH_MSP430x44: strcat (buf, "MSP430x44"); break;
2826             case E_MSP430_MACH_MSP430X  : strcat (buf, "MSP430X"); break;
2827             default:
2828               strcat (buf, _(": unknown")); break;
2829             }
2830
2831           if (e_flags & ~ EF_MSP430_MACH)
2832             strcat (buf, _(": unknown extra flag bits also present"));
2833         }
2834     }
2835
2836   return buf;
2837 }
2838
2839 static const char *
2840 get_osabi_name (unsigned int osabi)
2841 {
2842   static char buff[32];
2843
2844   switch (osabi)
2845     {
2846     case ELFOSABI_NONE:         return "UNIX - System V";
2847     case ELFOSABI_HPUX:         return "UNIX - HP-UX";
2848     case ELFOSABI_NETBSD:       return "UNIX - NetBSD";
2849     case ELFOSABI_GNU:          return "UNIX - GNU";
2850     case ELFOSABI_SOLARIS:      return "UNIX - Solaris";
2851     case ELFOSABI_AIX:          return "UNIX - AIX";
2852     case ELFOSABI_IRIX:         return "UNIX - IRIX";
2853     case ELFOSABI_FREEBSD:      return "UNIX - FreeBSD";
2854     case ELFOSABI_TRU64:        return "UNIX - TRU64";
2855     case ELFOSABI_MODESTO:      return "Novell - Modesto";
2856     case ELFOSABI_OPENBSD:      return "UNIX - OpenBSD";
2857     case ELFOSABI_OPENVMS:      return "VMS - OpenVMS";
2858     case ELFOSABI_NSK:          return "HP - Non-Stop Kernel";
2859     case ELFOSABI_AROS:         return "AROS";
2860     case ELFOSABI_FENIXOS:      return "FenixOS";
2861     default:
2862       if (osabi >= 64)
2863         switch (elf_header.e_machine)
2864           {
2865           case EM_ARM:
2866             switch (osabi)
2867               {
2868               case ELFOSABI_ARM:        return "ARM";
2869               default:
2870                 break;
2871               }
2872             break;
2873
2874           case EM_MSP430:
2875           case EM_MSP430_OLD:
2876             switch (osabi)
2877               {
2878               case ELFOSABI_STANDALONE: return _("Standalone App");
2879               default:
2880                 break;
2881               }
2882             break;
2883
2884           case EM_TI_C6000:
2885             switch (osabi)
2886               {
2887               case ELFOSABI_C6000_ELFABI:       return _("Bare-metal C6000");
2888               case ELFOSABI_C6000_LINUX:        return "Linux C6000";
2889               default:
2890                 break;
2891               }
2892             break;
2893
2894           default:
2895             break;
2896           }
2897       snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
2898       return buff;
2899     }
2900 }
2901
2902 static const char *
2903 get_aarch64_segment_type (unsigned long type)
2904 {
2905   switch (type)
2906     {
2907     case PT_AARCH64_ARCHEXT:
2908       return "AARCH64_ARCHEXT";
2909     default:
2910       break;
2911     }
2912
2913   return NULL;
2914 }
2915
2916 static const char *
2917 get_arm_segment_type (unsigned long type)
2918 {
2919   switch (type)
2920     {
2921     case PT_ARM_EXIDX:
2922       return "EXIDX";
2923     default:
2924       break;
2925     }
2926
2927   return NULL;
2928 }
2929
2930 static const char *
2931 get_mips_segment_type (unsigned long type)
2932 {
2933   switch (type)
2934     {
2935     case PT_MIPS_REGINFO:
2936       return "REGINFO";
2937     case PT_MIPS_RTPROC:
2938       return "RTPROC";
2939     case PT_MIPS_OPTIONS:
2940       return "OPTIONS";
2941     default:
2942       break;
2943     }
2944
2945   return NULL;
2946 }
2947
2948 static const char *
2949 get_parisc_segment_type (unsigned long type)
2950 {
2951   switch (type)
2952     {
2953     case PT_HP_TLS:             return "HP_TLS";
2954     case PT_HP_CORE_NONE:       return "HP_CORE_NONE";
2955     case PT_HP_CORE_VERSION:    return "HP_CORE_VERSION";
2956     case PT_HP_CORE_KERNEL:     return "HP_CORE_KERNEL";
2957     case PT_HP_CORE_COMM:       return "HP_CORE_COMM";
2958     case PT_HP_CORE_PROC:       return "HP_CORE_PROC";
2959     case PT_HP_CORE_LOADABLE:   return "HP_CORE_LOADABLE";
2960     case PT_HP_CORE_STACK:      return "HP_CORE_STACK";
2961     case PT_HP_CORE_SHM:        return "HP_CORE_SHM";
2962     case PT_HP_CORE_MMF:        return "HP_CORE_MMF";
2963     case PT_HP_PARALLEL:        return "HP_PARALLEL";
2964     case PT_HP_FASTBIND:        return "HP_FASTBIND";
2965     case PT_HP_OPT_ANNOT:       return "HP_OPT_ANNOT";
2966     case PT_HP_HSL_ANNOT:       return "HP_HSL_ANNOT";
2967     case PT_HP_STACK:           return "HP_STACK";
2968     case PT_HP_CORE_UTSNAME:    return "HP_CORE_UTSNAME";
2969     case PT_PARISC_ARCHEXT:     return "PARISC_ARCHEXT";
2970     case PT_PARISC_UNWIND:      return "PARISC_UNWIND";
2971     case PT_PARISC_WEAKORDER:   return "PARISC_WEAKORDER";
2972     default:
2973       break;
2974     }
2975
2976   return NULL;
2977 }
2978
2979 static const char *
2980 get_ia64_segment_type (unsigned long type)
2981 {
2982   switch (type)
2983     {
2984     case PT_IA_64_ARCHEXT:      return "IA_64_ARCHEXT";
2985     case PT_IA_64_UNWIND:       return "IA_64_UNWIND";
2986     case PT_HP_TLS:             return "HP_TLS";
2987     case PT_IA_64_HP_OPT_ANOT:  return "HP_OPT_ANNOT";
2988     case PT_IA_64_HP_HSL_ANOT:  return "HP_HSL_ANNOT";
2989     case PT_IA_64_HP_STACK:     return "HP_STACK";
2990     default:
2991       break;
2992     }
2993
2994   return NULL;
2995 }
2996
2997 static const char *
2998 get_tic6x_segment_type (unsigned long type)
2999 {
3000   switch (type)
3001     {
3002     case PT_C6000_PHATTR:       return "C6000_PHATTR";
3003     default:
3004       break;
3005     }
3006
3007   return NULL;
3008 }
3009
3010 static const char *
3011 get_segment_type (unsigned long p_type)
3012 {
3013   static char buff[32];
3014
3015   switch (p_type)
3016     {
3017     case PT_NULL:       return "NULL";
3018     case PT_LOAD:       return "LOAD";
3019     case PT_DYNAMIC:    return "DYNAMIC";
3020     case PT_INTERP:     return "INTERP";
3021     case PT_NOTE:       return "NOTE";
3022     case PT_SHLIB:      return "SHLIB";
3023     case PT_PHDR:       return "PHDR";
3024     case PT_TLS:        return "TLS";
3025
3026     case PT_GNU_EH_FRAME:
3027                         return "GNU_EH_FRAME";
3028     case PT_GNU_STACK:  return "GNU_STACK";
3029     case PT_GNU_RELRO:  return "GNU_RELRO";
3030
3031     default:
3032       if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
3033         {
3034           const char * result;
3035
3036           switch (elf_header.e_machine)
3037             {
3038             case EM_AARCH64:
3039               result = get_aarch64_segment_type (p_type);
3040               break;
3041             case EM_ARM:
3042               result = get_arm_segment_type (p_type);
3043               break;
3044             case EM_MIPS:
3045             case EM_MIPS_RS3_LE:
3046               result = get_mips_segment_type (p_type);
3047               break;
3048             case EM_PARISC:
3049               result = get_parisc_segment_type (p_type);
3050               break;
3051             case EM_IA_64:
3052               result = get_ia64_segment_type (p_type);
3053               break;
3054             case EM_TI_C6000:
3055               result = get_tic6x_segment_type (p_type);
3056               break;
3057             default:
3058               result = NULL;
3059               break;
3060             }
3061
3062           if (result != NULL)
3063             return result;
3064
3065           sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
3066         }
3067       else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
3068         {
3069           const char * result;
3070
3071           switch (elf_header.e_machine)
3072             {
3073             case EM_PARISC:
3074               result = get_parisc_segment_type (p_type);
3075               break;
3076             case EM_IA_64:
3077               result = get_ia64_segment_type (p_type);
3078               break;
3079             default:
3080               result = NULL;
3081               break;
3082             }
3083
3084           if (result != NULL)
3085             return result;
3086
3087           sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
3088         }
3089       else
3090         snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
3091
3092       return buff;
3093     }
3094 }
3095
3096 static const char *
3097 get_mips_section_type_name (unsigned int sh_type)
3098 {
3099   switch (sh_type)
3100     {
3101     case SHT_MIPS_LIBLIST:       return "MIPS_LIBLIST";
3102     case SHT_MIPS_MSYM:          return "MIPS_MSYM";
3103     case SHT_MIPS_CONFLICT:      return "MIPS_CONFLICT";
3104     case SHT_MIPS_GPTAB:         return "MIPS_GPTAB";
3105     case SHT_MIPS_UCODE:         return "MIPS_UCODE";
3106     case SHT_MIPS_DEBUG:         return "MIPS_DEBUG";
3107     case SHT_MIPS_REGINFO:       return "MIPS_REGINFO";
3108     case SHT_MIPS_PACKAGE:       return "MIPS_PACKAGE";
3109     case SHT_MIPS_PACKSYM:       return "MIPS_PACKSYM";
3110     case SHT_MIPS_RELD:          return "MIPS_RELD";
3111     case SHT_MIPS_IFACE:         return "MIPS_IFACE";
3112     case SHT_MIPS_CONTENT:       return "MIPS_CONTENT";
3113     case SHT_MIPS_OPTIONS:       return "MIPS_OPTIONS";
3114     case SHT_MIPS_SHDR:          return "MIPS_SHDR";
3115     case SHT_MIPS_FDESC:         return "MIPS_FDESC";
3116     case SHT_MIPS_EXTSYM:        return "MIPS_EXTSYM";
3117     case SHT_MIPS_DENSE:         return "MIPS_DENSE";
3118     case SHT_MIPS_PDESC:         return "MIPS_PDESC";
3119     case SHT_MIPS_LOCSYM:        return "MIPS_LOCSYM";
3120     case SHT_MIPS_AUXSYM:        return "MIPS_AUXSYM";
3121     case SHT_MIPS_OPTSYM:        return "MIPS_OPTSYM";
3122     case SHT_MIPS_LOCSTR:        return "MIPS_LOCSTR";
3123     case SHT_MIPS_LINE:          return "MIPS_LINE";
3124     case SHT_MIPS_RFDESC:        return "MIPS_RFDESC";
3125     case SHT_MIPS_DELTASYM:      return "MIPS_DELTASYM";
3126     case SHT_MIPS_DELTAINST:     return "MIPS_DELTAINST";
3127     case SHT_MIPS_DELTACLASS:    return "MIPS_DELTACLASS";
3128     case SHT_MIPS_DWARF:         return "MIPS_DWARF";
3129     case SHT_MIPS_DELTADECL:     return "MIPS_DELTADECL";
3130     case SHT_MIPS_SYMBOL_LIB:    return "MIPS_SYMBOL_LIB";
3131     case SHT_MIPS_EVENTS:        return "MIPS_EVENTS";
3132     case SHT_MIPS_TRANSLATE:     return "MIPS_TRANSLATE";
3133     case SHT_MIPS_PIXIE:         return "MIPS_PIXIE";
3134     case SHT_MIPS_XLATE:         return "MIPS_XLATE";
3135     case SHT_MIPS_XLATE_DEBUG:   return "MIPS_XLATE_DEBUG";
3136     case SHT_MIPS_WHIRL:         return "MIPS_WHIRL";
3137     case SHT_MIPS_EH_REGION:     return "MIPS_EH_REGION";
3138     case SHT_MIPS_XLATE_OLD:     return "MIPS_XLATE_OLD";
3139     case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
3140     default:
3141       break;
3142     }
3143   return NULL;
3144 }
3145
3146 static const char *
3147 get_parisc_section_type_name (unsigned int sh_type)
3148 {
3149   switch (sh_type)
3150     {
3151     case SHT_PARISC_EXT:        return "PARISC_EXT";
3152     case SHT_PARISC_UNWIND:     return "PARISC_UNWIND";
3153     case SHT_PARISC_DOC:        return "PARISC_DOC";
3154     case SHT_PARISC_ANNOT:      return "PARISC_ANNOT";
3155     case SHT_PARISC_SYMEXTN:    return "PARISC_SYMEXTN";
3156     case SHT_PARISC_STUBS:      return "PARISC_STUBS";
3157     case SHT_PARISC_DLKM:       return "PARISC_DLKM";
3158     default:
3159       break;
3160     }
3161   return NULL;
3162 }
3163
3164 static const char *
3165 get_ia64_section_type_name (unsigned int sh_type)
3166 {
3167   /* If the top 8 bits are 0x78 the next 8 are the os/abi ID.  */
3168   if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
3169     return get_osabi_name ((sh_type & 0x00FF0000) >> 16);
3170
3171   switch (sh_type)
3172     {
3173     case SHT_IA_64_EXT:                return "IA_64_EXT";
3174     case SHT_IA_64_UNWIND:             return "IA_64_UNWIND";
3175     case SHT_IA_64_PRIORITY_INIT:      return "IA_64_PRIORITY_INIT";
3176     case SHT_IA_64_VMS_TRACE:          return "VMS_TRACE";
3177     case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
3178     case SHT_IA_64_VMS_DEBUG:          return "VMS_DEBUG";
3179     case SHT_IA_64_VMS_DEBUG_STR:      return "VMS_DEBUG_STR";
3180     case SHT_IA_64_VMS_LINKAGES:       return "VMS_LINKAGES";
3181     case SHT_IA_64_VMS_SYMBOL_VECTOR:  return "VMS_SYMBOL_VECTOR";
3182     case SHT_IA_64_VMS_FIXUP:          return "VMS_FIXUP";
3183     default:
3184       break;
3185     }
3186   return NULL;
3187 }
3188
3189 static const char *
3190 get_x86_64_section_type_name (unsigned int sh_type)
3191 {
3192   switch (sh_type)
3193     {
3194     case SHT_X86_64_UNWIND:     return "X86_64_UNWIND";
3195     default:
3196       break;
3197     }
3198   return NULL;
3199 }
3200
3201 static const char *
3202 get_aarch64_section_type_name (unsigned int sh_type)
3203 {
3204   switch (sh_type)
3205     {
3206     case SHT_AARCH64_ATTRIBUTES:
3207       return "AARCH64_ATTRIBUTES";
3208     default:
3209       break;
3210     }
3211   return NULL;
3212 }
3213
3214 static const char *
3215 get_arm_section_type_name (unsigned int sh_type)
3216 {
3217   switch (sh_type)
3218     {
3219     case SHT_ARM_EXIDX:           return "ARM_EXIDX";
3220     case SHT_ARM_PREEMPTMAP:      return "ARM_PREEMPTMAP";
3221     case SHT_ARM_ATTRIBUTES:      return "ARM_ATTRIBUTES";
3222     case SHT_ARM_DEBUGOVERLAY:    return "ARM_DEBUGOVERLAY";
3223     case SHT_ARM_OVERLAYSECTION:  return "ARM_OVERLAYSECTION";
3224     default:
3225       break;
3226     }
3227   return NULL;
3228 }
3229
3230 static const char *
3231 get_tic6x_section_type_name (unsigned int sh_type)
3232 {
3233   switch (sh_type)
3234     {
3235     case SHT_C6000_UNWIND:
3236       return "C6000_UNWIND";
3237     case SHT_C6000_PREEMPTMAP:
3238       return "C6000_PREEMPTMAP";
3239     case SHT_C6000_ATTRIBUTES:
3240       return "C6000_ATTRIBUTES";
3241     case SHT_TI_ICODE:
3242       return "TI_ICODE";
3243     case SHT_TI_XREF:
3244       return "TI_XREF";
3245     case SHT_TI_HANDLER:
3246       return "TI_HANDLER";
3247     case SHT_TI_INITINFO:
3248       return "TI_INITINFO";
3249     case SHT_TI_PHATTRS:
3250       return "TI_PHATTRS";
3251     default:
3252       break;
3253     }
3254   return NULL;
3255 }
3256
3257 static const char *
3258 get_msp430x_section_type_name (unsigned int sh_type)
3259 {
3260   switch (sh_type)
3261     {
3262     case SHT_MSP430_SEC_FLAGS:   return "MSP430_SEC_FLAGS";
3263     case SHT_MSP430_SYM_ALIASES: return "MSP430_SYM_ALIASES";
3264     case SHT_MSP430_ATTRIBUTES:  return "MSP430_ATTRIBUTES";
3265     default: return NULL;
3266     }
3267 }
3268
3269 static const char *
3270 get_section_type_name (unsigned int sh_type)
3271 {
3272   static char buff[32];
3273
3274   switch (sh_type)
3275     {
3276     case SHT_NULL:              return "NULL";
3277     case SHT_PROGBITS:          return "PROGBITS";
3278     case SHT_SYMTAB:            return "SYMTAB";
3279     case SHT_STRTAB:            return "STRTAB";
3280     case SHT_RELA:              return "RELA";
3281     case SHT_HASH:              return "HASH";
3282     case SHT_DYNAMIC:           return "DYNAMIC";
3283     case SHT_NOTE:              return "NOTE";
3284     case SHT_NOBITS:            return "NOBITS";
3285     case SHT_REL:               return "REL";
3286     case SHT_SHLIB:             return "SHLIB";
3287     case SHT_DYNSYM:            return "DYNSYM";
3288     case SHT_INIT_ARRAY:        return "INIT_ARRAY";
3289     case SHT_FINI_ARRAY:        return "FINI_ARRAY";
3290     case SHT_PREINIT_ARRAY:     return "PREINIT_ARRAY";
3291     case SHT_GNU_HASH:          return "GNU_HASH";
3292     case SHT_GROUP:             return "GROUP";
3293     case SHT_SYMTAB_SHNDX:      return "SYMTAB SECTION INDICIES";
3294     case SHT_GNU_verdef:        return "VERDEF";
3295     case SHT_GNU_verneed:       return "VERNEED";
3296     case SHT_GNU_versym:        return "VERSYM";
3297     case 0x6ffffff0:            return "VERSYM";
3298     case 0x6ffffffc:            return "VERDEF";
3299     case 0x7ffffffd:            return "AUXILIARY";
3300     case 0x7fffffff:            return "FILTER";
3301     case SHT_GNU_LIBLIST:       return "GNU_LIBLIST";
3302
3303     default:
3304       if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
3305         {
3306           const char * result;
3307
3308           switch (elf_header.e_machine)
3309             {
3310             case EM_MIPS:
3311             case EM_MIPS_RS3_LE:
3312               result = get_mips_section_type_name (sh_type);
3313               break;
3314             case EM_PARISC:
3315               result = get_parisc_section_type_name (sh_type);
3316               break;
3317             case EM_IA_64:
3318               result = get_ia64_section_type_name (sh_type);
3319               break;
3320             case EM_X86_64:
3321             case EM_L1OM:
3322             case EM_K1OM:
3323               result = get_x86_64_section_type_name (sh_type);
3324               break;
3325             case EM_AARCH64:
3326               result = get_aarch64_section_type_name (sh_type);
3327               break;
3328             case EM_ARM:
3329               result = get_arm_section_type_name (sh_type);
3330               break;
3331             case EM_TI_C6000:
3332               result = get_tic6x_section_type_name (sh_type);
3333               break;
3334             case EM_MSP430:
3335               result = get_msp430x_section_type_name (sh_type);
3336               break;
3337             default:
3338               result = NULL;
3339               break;
3340             }
3341
3342           if (result != NULL)
3343             return result;
3344
3345           sprintf (buff, "LOPROC+%x", sh_type - SHT_LOPROC);
3346         }
3347       else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
3348         {
3349           const char * result;
3350
3351           switch (elf_header.e_machine)
3352             {
3353             case EM_IA_64:
3354               result = get_ia64_section_type_name (sh_type);
3355               break;
3356             default:
3357               result = NULL;
3358               break;
3359             }
3360
3361           if (result != NULL)
3362             return result;
3363
3364           sprintf (buff, "LOOS+%x", sh_type - SHT_LOOS);
3365         }
3366       else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
3367         sprintf (buff, "LOUSER+%x", sh_type - SHT_LOUSER);
3368       else
3369         /* This message is probably going to be displayed in a 15
3370            character wide field, so put the hex value first.  */
3371         snprintf (buff, sizeof (buff), _("%08x: <unknown>"), sh_type);
3372
3373       return buff;
3374     }
3375 }
3376
3377 #define OPTION_DEBUG_DUMP       512
3378 #define OPTION_DYN_SYMS         513
3379 #define OPTION_DWARF_DEPTH      514
3380 #define OPTION_DWARF_START      515
3381 #define OPTION_DWARF_CHECK      516
3382
3383 static struct option options[] =
3384 {
3385   {"all",              no_argument, 0, 'a'},
3386   {"file-header",      no_argument, 0, 'h'},
3387   {"program-headers",  no_argument, 0, 'l'},
3388   {"headers",          no_argument, 0, 'e'},
3389   {"histogram",        no_argument, 0, 'I'},
3390   {"segments",         no_argument, 0, 'l'},
3391   {"sections",         no_argument, 0, 'S'},
3392   {"section-headers",  no_argument, 0, 'S'},
3393   {"section-groups",   no_argument, 0, 'g'},
3394   {"section-details",  no_argument, 0, 't'},
3395   {"full-section-name",no_argument, 0, 'N'},
3396   {"symbols",          no_argument, 0, 's'},
3397   {"syms",             no_argument, 0, 's'},
3398   {"dyn-syms",         no_argument, 0, OPTION_DYN_SYMS},
3399   {"relocs",           no_argument, 0, 'r'},
3400   {"notes",            no_argument, 0, 'n'},
3401   {"dynamic",          no_argument, 0, 'd'},
3402   {"arch-specific",    no_argument, 0, 'A'},
3403   {"version-info",     no_argument, 0, 'V'},
3404   {"use-dynamic",      no_argument, 0, 'D'},
3405   {"unwind",           no_argument, 0, 'u'},
3406   {"archive-index",    no_argument, 0, 'c'},
3407   {"hex-dump",         required_argument, 0, 'x'},
3408   {"relocated-dump",   required_argument, 0, 'R'},
3409   {"string-dump",      required_argument, 0, 'p'},
3410 #ifdef SUPPORT_DISASSEMBLY
3411   {"instruction-dump", required_argument, 0, 'i'},
3412 #endif
3413   {"debug-dump",       optional_argument, 0, OPTION_DEBUG_DUMP},
3414
3415   {"dwarf-depth",      required_argument, 0, OPTION_DWARF_DEPTH},
3416   {"dwarf-start",      required_argument, 0, OPTION_DWARF_START},
3417   {"dwarf-check",      no_argument, 0, OPTION_DWARF_CHECK},
3418
3419   {"version",          no_argument, 0, 'v'},
3420   {"wide",             no_argument, 0, 'W'},
3421   {"help",             no_argument, 0, 'H'},
3422   {0,                  no_argument, 0, 0}
3423 };
3424
3425 static void
3426 usage (FILE * stream)
3427 {
3428   fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
3429   fprintf (stream, _(" Display information about the contents of ELF format files\n"));
3430   fprintf (stream, _(" Options are:\n\
3431   -a --all               Equivalent to: -h -l -S -s -r -d -V -A -I\n\
3432   -h --file-header       Display the ELF file header\n\
3433   -l --program-headers   Display the program headers\n\
3434      --segments          An alias for --program-headers\n\
3435   -S --section-headers   Display the sections' header\n\
3436      --sections          An alias for --section-headers\n\
3437   -g --section-groups    Display the section groups\n\
3438   -t --section-details   Display the section details\n\
3439   -e --headers           Equivalent to: -h -l -S\n\
3440   -s --syms              Display the symbol table\n\
3441      --symbols           An alias for --syms\n\
3442   --dyn-syms             Display the dynamic symbol table\n\
3443   -n --notes             Display the core notes (if present)\n\
3444   -r --relocs            Display the relocations (if present)\n\
3445   -u --unwind            Display the unwind info (if present)\n\
3446   -d --dynamic           Display the dynamic section (if present)\n\
3447   -V --version-info      Display the version sections (if present)\n\
3448   -A --arch-specific     Display architecture specific information (if any)\n\
3449   -c --archive-index     Display the symbol/file index in an archive\n\
3450   -D --use-dynamic       Use the dynamic section info when displaying symbols\n\
3451   -x --hex-dump=<number|name>\n\
3452                          Dump the contents of section <number|name> as bytes\n\
3453   -p --string-dump=<number|name>\n\
3454                          Dump the contents of section <number|name> as strings\n\
3455   -R --relocated-dump=<number|name>\n\
3456                          Dump the contents of section <number|name> as relocated bytes\n\
3457   -w[lLiaprmfFsoRt] or\n\
3458   --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
3459                =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
3460                =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
3461                =addr,=cu_index]\n\
3462                          Display the contents of DWARF2 debug sections\n"));
3463   fprintf (stream, _("\
3464   --dwarf-depth=N        Do not display DIEs at depth N or greater\n\
3465   --dwarf-start=N        Display DIEs starting with N, at the same depth\n\
3466                          or deeper\n"));
3467 #ifdef SUPPORT_DISASSEMBLY
3468   fprintf (stream, _("\
3469   -i --instruction-dump=<number|name>\n\
3470                          Disassemble the contents of section <number|name>\n"));
3471 #endif
3472   fprintf (stream, _("\
3473   -I --histogram         Display histogram of bucket list lengths\n\
3474   -W --wide              Allow output width to exceed 80 characters\n\
3475   @<file>                Read options from <file>\n\
3476   -H --help              Display this information\n\
3477   -v --version           Display the version number of readelf\n"));
3478
3479   if (REPORT_BUGS_TO[0] && stream == stdout)
3480     fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
3481
3482   exit (stream == stdout ? 0 : 1);
3483 }
3484
3485 /* Record the fact that the user wants the contents of section number
3486    SECTION to be displayed using the method(s) encoded as flags bits
3487    in TYPE.  Note, TYPE can be zero if we are creating the array for
3488    the first time.  */
3489
3490 static void
3491 request_dump_bynumber (unsigned int section, dump_type type)
3492 {
3493   if (section >= num_dump_sects)
3494     {
3495       dump_type * new_dump_sects;
3496
3497       new_dump_sects = (dump_type *) calloc (section + 1,
3498                                              sizeof (* dump_sects));
3499
3500       if (new_dump_sects == NULL)
3501         error (_("Out of memory allocating dump request table.\n"));
3502       else
3503         {
3504           /* Copy current flag settings.  */
3505           memcpy (new_dump_sects, dump_sects, num_dump_sects * sizeof (* dump_sects));
3506
3507           free (dump_sects);
3508
3509           dump_sects = new_dump_sects;
3510           num_dump_sects = section + 1;
3511         }
3512     }
3513
3514   if (dump_sects)
3515     dump_sects[section] |= type;
3516
3517   return;
3518 }
3519
3520 /* Request a dump by section name.  */
3521
3522 static void
3523 request_dump_byname (const char * section, dump_type type)
3524 {
3525   struct dump_list_entry * new_request;
3526
3527   new_request = (struct dump_list_entry *)
3528       malloc (sizeof (struct dump_list_entry));
3529   if (!new_request)
3530     error (_("Out of memory allocating dump request table.\n"));
3531
3532   new_request->name = strdup (section);
3533   if (!new_request->name)
3534     error (_("Out of memory allocating dump request table.\n"));
3535
3536   new_request->type = type;
3537
3538   new_request->next = dump_sects_byname;
3539   dump_sects_byname = new_request;
3540 }
3541
3542 static inline void
3543 request_dump (dump_type type)
3544 {
3545   int section;
3546   char * cp;
3547
3548   do_dump++;
3549   section = strtoul (optarg, & cp, 0);
3550
3551   if (! *cp && section >= 0)
3552     request_dump_bynumber (section, type);
3553   else
3554     request_dump_byname (optarg, type);
3555 }
3556
3557
3558 static void
3559 parse_args (int argc, char ** argv)
3560 {
3561   int c;
3562
3563   if (argc < 2)
3564     usage (stderr);
3565
3566   while ((c = getopt_long
3567           (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:", options, NULL)) != EOF)
3568     {
3569       switch (c)
3570         {
3571         case 0:
3572           /* Long options.  */
3573           break;
3574         case 'H':
3575           usage (stdout);
3576           break;
3577
3578         case 'a':
3579           do_syms++;
3580           do_reloc++;
3581           do_unwind++;
3582           do_dynamic++;
3583           do_header++;
3584           do_sections++;
3585           do_section_groups++;
3586           do_segments++;
3587           do_version++;
3588           do_histogram++;
3589           do_arch++;
3590           do_notes++;
3591           break;
3592         case 'g':
3593           do_section_groups++;
3594           break;
3595         case 't':
3596         case 'N':
3597           do_sections++;
3598           do_section_details++;
3599           break;
3600         case 'e':
3601           do_header++;
3602           do_sections++;
3603           do_segments++;
3604           break;
3605         case 'A':
3606           do_arch++;
3607           break;
3608         case 'D':
3609           do_using_dynamic++;
3610           break;
3611         case 'r':
3612           do_reloc++;
3613           break;
3614         case 'u':
3615           do_unwind++;
3616           break;
3617         case 'h':
3618           do_header++;
3619           break;
3620         case 'l':
3621           do_segments++;
3622           break;
3623         case 's':
3624           do_syms++;
3625           break;
3626         case 'S':
3627           do_sections++;
3628           break;
3629         case 'd':
3630           do_dynamic++;
3631           break;
3632         case 'I':
3633           do_histogram++;
3634           break;
3635         case 'n':
3636           do_notes++;
3637           break;
3638         case 'c':
3639           do_archive_index++;
3640           break;
3641         case 'x':
3642           request_dump (HEX_DUMP);
3643           break;
3644         case 'p':
3645           request_dump (STRING_DUMP);
3646           break;
3647         case 'R':
3648           request_dump (RELOC_DUMP);
3649           break;
3650         case 'w':
3651           do_dump++;
3652           if (optarg == 0)
3653             {
3654               do_debugging = 1;
3655               dwarf_select_sections_all ();
3656             }
3657           else
3658             {
3659               do_debugging = 0;
3660               dwarf_select_sections_by_letters (optarg);
3661             }
3662           break;
3663         case OPTION_DEBUG_DUMP:
3664           do_dump++;
3665           if (optarg == 0)
3666             do_debugging = 1;
3667           else
3668             {
3669               do_debugging = 0;
3670               dwarf_select_sections_by_names (optarg);
3671             }
3672           break;
3673         case OPTION_DWARF_DEPTH:
3674           {
3675             char *cp;
3676
3677             dwarf_cutoff_level = strtoul (optarg, & cp, 0);
3678           }
3679           break;
3680         case OPTION_DWARF_START:
3681           {
3682             char *cp;
3683
3684             dwarf_start_die = strtoul (optarg, & cp, 0);
3685           }
3686           break;
3687         case OPTION_DWARF_CHECK:
3688           dwarf_check = 1;
3689           break;
3690         case OPTION_DYN_SYMS:
3691           do_dyn_syms++;
3692           break;
3693 #ifdef SUPPORT_DISASSEMBLY
3694         case 'i':
3695           request_dump (DISASS_DUMP);
3696           break;
3697 #endif
3698         case 'v':
3699           print_version (program_name);
3700           break;
3701         case 'V':
3702           do_version++;
3703           break;
3704         case 'W':
3705           do_wide++;
3706           break;
3707         default:
3708           /* xgettext:c-format */
3709           error (_("Invalid option '-%c'\n"), c);
3710           /* Drop through.  */
3711         case '?':
3712           usage (stderr);
3713         }
3714     }
3715
3716   if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
3717       && !do_segments && !do_header && !do_dump && !do_version
3718       && !do_histogram && !do_debugging && !do_arch && !do_notes
3719       && !do_section_groups && !do_archive_index
3720       && !do_dyn_syms)
3721     usage (stderr);
3722   else if (argc < 3)
3723     {
3724       warn (_("Nothing to do.\n"));
3725       usage (stderr);
3726     }
3727 }
3728
3729 static const char *
3730 get_elf_class (unsigned int elf_class)
3731 {
3732   static char buff[32];
3733
3734   switch (elf_class)
3735     {
3736     case ELFCLASSNONE: return _("none");
3737     case ELFCLASS32:   return "ELF32";
3738     case ELFCLASS64:   return "ELF64";
3739     default:
3740       snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
3741       return buff;
3742     }
3743 }
3744
3745 static const char *
3746 get_data_encoding (unsigned int encoding)
3747 {
3748   static char buff[32];
3749
3750   switch (encoding)
3751     {
3752     case ELFDATANONE: return _("none");
3753     case ELFDATA2LSB: return _("2's complement, little endian");
3754     case ELFDATA2MSB: return _("2's complement, big endian");
3755     default:
3756       snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
3757       return buff;
3758     }
3759 }
3760
3761 /* Decode the data held in 'elf_header'.  */
3762
3763 static int
3764 process_file_header (void)
3765 {
3766   if (   elf_header.e_ident[EI_MAG0] != ELFMAG0
3767       || elf_header.e_ident[EI_MAG1] != ELFMAG1
3768       || elf_header.e_ident[EI_MAG2] != ELFMAG2
3769       || elf_header.e_ident[EI_MAG3] != ELFMAG3)
3770     {
3771       error
3772         (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
3773       return 0;
3774     }
3775
3776   init_dwarf_regnames (elf_header.e_machine);
3777
3778   if (do_header)
3779     {
3780       int i;
3781
3782       printf (_("ELF Header:\n"));
3783       printf (_("  Magic:   "));
3784       for (i = 0; i < EI_NIDENT; i++)
3785         printf ("%2.2x ", elf_header.e_ident[i]);
3786       printf ("\n");
3787       printf (_("  Class:                             %s\n"),
3788               get_elf_class (elf_header.e_ident[EI_CLASS]));
3789       printf (_("  Data:                              %s\n"),
3790               get_data_encoding (elf_header.e_ident[EI_DATA]));
3791       printf (_("  Version:                           %d %s\n"),
3792               elf_header.e_ident[EI_VERSION],
3793               (elf_header.e_ident[EI_VERSION] == EV_CURRENT
3794                ? "(current)"
3795                : (elf_header.e_ident[EI_VERSION] != EV_NONE
3796                   ? _("<unknown: %lx>")
3797                   : "")));
3798       printf (_("  OS/ABI:                            %s\n"),
3799               get_osabi_name (elf_header.e_ident[EI_OSABI]));
3800       printf (_("  ABI Version:                       %d\n"),
3801               elf_header.e_ident[EI_ABIVERSION]);
3802       printf (_("  Type:                              %s\n"),
3803               get_file_type (elf_header.e_type));
3804       printf (_("  Machine:                           %s\n"),
3805               get_machine_name (elf_header.e_machine));
3806       printf (_("  Version:                           0x%lx\n"),
3807               (unsigned long) elf_header.e_version);
3808
3809       printf (_("  Entry point address:               "));
3810       print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
3811       printf (_("\n  Start of program headers:          "));
3812       print_vma ((bfd_vma) elf_header.e_phoff, DEC);
3813       printf (_(" (bytes into file)\n  Start of section headers:          "));
3814       print_vma ((bfd_vma) elf_header.e_shoff, DEC);
3815       printf (_(" (bytes into file)\n"));
3816
3817       printf (_("  Flags:                             0x%lx%s\n"),
3818               (unsigned long) elf_header.e_flags,
3819               get_machine_flags (elf_header.e_flags, elf_header.e_machine));
3820       printf (_("  Size of this header:               %ld (bytes)\n"),
3821               (long) elf_header.e_ehsize);
3822       printf (_("  Size of program headers:           %ld (bytes)\n"),
3823               (long) elf_header.e_phentsize);
3824       printf (_("  Number of program headers:         %ld"),
3825               (long) elf_header.e_phnum);
3826       if (section_headers != NULL
3827           && elf_header.e_phnum == PN_XNUM
3828           && section_headers[0].sh_info != 0)
3829         printf (" (%ld)", (long) section_headers[0].sh_info);
3830       putc ('\n', stdout);
3831       printf (_("  Size of section headers:           %ld (bytes)\n"),
3832               (long) elf_header.e_shentsize);
3833       printf (_("  Number of section headers:         %ld"),
3834               (long) elf_header.e_shnum);
3835       if (section_headers != NULL && elf_header.e_shnum == SHN_UNDEF)
3836         printf (" (%ld)", (long) section_headers[0].sh_size);
3837       putc ('\n', stdout);
3838       printf (_("  Section header string table index: %ld"),
3839               (long) elf_header.e_shstrndx);
3840       if (section_headers != NULL
3841           && elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
3842         printf (" (%u)", section_headers[0].sh_link);
3843       else if (elf_header.e_shstrndx != SHN_UNDEF
3844                && elf_header.e_shstrndx >= elf_header.e_shnum)
3845         printf (_(" <corrupt: out of range>"));
3846       putc ('\n', stdout);
3847     }
3848
3849   if (section_headers != NULL)
3850     {
3851       if (elf_header.e_phnum == PN_XNUM
3852           && section_headers[0].sh_info != 0)
3853         elf_header.e_phnum = section_headers[0].sh_info;
3854       if (elf_header.e_shnum == SHN_UNDEF)
3855         elf_header.e_shnum = section_headers[0].sh_size;
3856       if (elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
3857         elf_header.e_shstrndx = section_headers[0].sh_link;
3858       else if (elf_header.e_shstrndx >= elf_header.e_shnum)
3859         elf_header.e_shstrndx = SHN_UNDEF;
3860       free (section_headers);
3861       section_headers = NULL;
3862     }
3863
3864   return 1;
3865 }
3866
3867
3868 static int
3869 get_32bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
3870 {
3871   Elf32_External_Phdr * phdrs;
3872   Elf32_External_Phdr * external;
3873   Elf_Internal_Phdr *   internal;
3874   unsigned int i;
3875
3876   phdrs = (Elf32_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
3877                                             elf_header.e_phentsize,
3878                                             elf_header.e_phnum,
3879                                             _("program headers"));
3880   if (!phdrs)
3881     return 0;
3882
3883   for (i = 0, internal = pheaders, external = phdrs;
3884        i < elf_header.e_phnum;
3885        i++, internal++, external++)
3886     {
3887       internal->p_type   = BYTE_GET (external->p_type);
3888       internal->p_offset = BYTE_GET (external->p_offset);
3889       internal->p_vaddr  = BYTE_GET (external->p_vaddr);
3890       internal->p_paddr  = BYTE_GET (external->p_paddr);
3891       internal->p_filesz = BYTE_GET (external->p_filesz);
3892       internal->p_memsz  = BYTE_GET (external->p_memsz);
3893       internal->p_flags  = BYTE_GET (external->p_flags);
3894       internal->p_align  = BYTE_GET (external->p_align);
3895     }
3896
3897   free (phdrs);
3898
3899   return 1;
3900 }
3901
3902 static int
3903 get_64bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
3904 {
3905   Elf64_External_Phdr * phdrs;
3906   Elf64_External_Phdr * external;
3907   Elf_Internal_Phdr *   internal;
3908   unsigned int i;
3909
3910   phdrs = (Elf64_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
3911                                             elf_header.e_phentsize,
3912                                             elf_header.e_phnum,
3913                                             _("program headers"));
3914   if (!phdrs)
3915     return 0;
3916
3917   for (i = 0, internal = pheaders, external = phdrs;
3918        i < elf_header.e_phnum;
3919        i++, internal++, external++)
3920     {
3921       internal->p_type   = BYTE_GET (external->p_type);
3922       internal->p_flags  = BYTE_GET (external->p_flags);
3923       internal->p_offset = BYTE_GET (external->p_offset);
3924       internal->p_vaddr  = BYTE_GET (external->p_vaddr);
3925       internal->p_paddr  = BYTE_GET (external->p_paddr);
3926       internal->p_filesz = BYTE_GET (external->p_filesz);
3927       internal->p_memsz  = BYTE_GET (external->p_memsz);
3928       internal->p_align  = BYTE_GET (external->p_align);
3929     }
3930
3931   free (phdrs);
3932
3933   return 1;
3934 }
3935
3936 /* Returns 1 if the program headers were read into `program_headers'.  */
3937
3938 static int
3939 get_program_headers (FILE * file)
3940 {
3941   Elf_Internal_Phdr * phdrs;
3942
3943   /* Check cache of prior read.  */
3944   if (program_headers != NULL)
3945     return 1;
3946
3947   phdrs = (Elf_Internal_Phdr *) cmalloc (elf_header.e_phnum,
3948                                          sizeof (Elf_Internal_Phdr));
3949
3950   if (phdrs == NULL)
3951     {
3952       error (_("Out of memory\n"));
3953       return 0;
3954     }
3955
3956   if (is_32bit_elf
3957       ? get_32bit_program_headers (file, phdrs)
3958       : get_64bit_program_headers (file, phdrs))
3959     {
3960       program_headers = phdrs;
3961       return 1;
3962     }
3963
3964   free (phdrs);
3965   return 0;
3966 }
3967
3968 /* Returns 1 if the program headers were loaded.  */
3969
3970 static int
3971 process_program_headers (FILE * file)
3972 {
3973   Elf_Internal_Phdr * segment;
3974   unsigned int i;
3975
3976   if (elf_header.e_phnum == 0)
3977     {
3978       /* PR binutils/12467.  */
3979       if (elf_header.e_phoff != 0)
3980         warn (_("possibly corrupt ELF header - it has a non-zero program"
3981                 " header offset, but no program headers"));
3982       else if (do_segments)
3983         printf (_("\nThere are no program headers in this file.\n"));
3984       return 0;
3985     }
3986
3987   if (do_segments && !do_header)
3988     {
3989       printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
3990       printf (_("Entry point "));
3991       print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
3992       printf (_("\nThere are %d program headers, starting at offset "),
3993               elf_header.e_phnum);
3994       print_vma ((bfd_vma) elf_header.e_phoff, DEC);
3995       printf ("\n");
3996     }
3997
3998   if (! get_program_headers (file))
3999       return 0;
4000
4001   if (do_segments)
4002     {
4003       if (elf_header.e_phnum > 1)
4004         printf (_("\nProgram Headers:\n"));
4005       else
4006         printf (_("\nProgram Headers:\n"));
4007
4008       if (is_32bit_elf)
4009         printf
4010           (_("  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align\n"));
4011       else if (do_wide)
4012         printf
4013           (_("  Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align\n"));
4014       else
4015         {
4016           printf
4017             (_("  Type           Offset             VirtAddr           PhysAddr\n"));
4018           printf
4019             (_("                 FileSiz            MemSiz              Flags  Align\n"));
4020         }
4021     }
4022
4023   dynamic_addr = 0;
4024   dynamic_size = 0;
4025
4026   for (i = 0, segment = program_headers;
4027        i < elf_header.e_phnum;
4028        i++, segment++)
4029     {
4030       if (do_segments)
4031         {
4032           printf ("  %-14.14s ", get_segment_type (segment->p_type));
4033
4034           if (is_32bit_elf)
4035             {
4036               printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4037               printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
4038               printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
4039               printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
4040               printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
4041               printf ("%c%c%c ",
4042                       (segment->p_flags & PF_R ? 'R' : ' '),
4043                       (segment->p_flags & PF_W ? 'W' : ' '),
4044                       (segment->p_flags & PF_X ? 'E' : ' '));
4045               printf ("%#lx", (unsigned long) segment->p_align);
4046             }
4047           else if (do_wide)
4048             {
4049               if ((unsigned long) segment->p_offset == segment->p_offset)
4050                 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4051               else
4052                 {
4053                   print_vma (segment->p_offset, FULL_HEX);
4054                   putchar (' ');
4055                 }
4056
4057               print_vma (segment->p_vaddr, FULL_HEX);
4058               putchar (' ');
4059               print_vma (segment->p_paddr, FULL_HEX);
4060               putchar (' ');
4061
4062               if ((unsigned long) segment->p_filesz == segment->p_filesz)
4063                 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
4064               else
4065                 {
4066                   print_vma (segment->p_filesz, FULL_HEX);
4067                   putchar (' ');
4068                 }
4069
4070               if ((unsigned long) segment->p_memsz == segment->p_memsz)
4071                 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
4072               else
4073                 {
4074                   print_vma (segment->p_memsz, FULL_HEX);
4075                 }
4076
4077               printf (" %c%c%c ",
4078                       (segment->p_flags & PF_R ? 'R' : ' '),
4079                       (segment->p_flags & PF_W ? 'W' : ' '),
4080                       (segment->p_flags & PF_X ? 'E' : ' '));
4081
4082               if ((unsigned long) segment->p_align == segment->p_align)
4083                 printf ("%#lx", (unsigned long) segment->p_align);
4084               else
4085                 {
4086                   print_vma (segment->p_align, PREFIX_HEX);
4087                 }
4088             }
4089           else
4090             {
4091               print_vma (segment->p_offset, FULL_HEX);
4092               putchar (' ');
4093               print_vma (segment->p_vaddr, FULL_HEX);
4094               putchar (' ');
4095               print_vma (segment->p_paddr, FULL_HEX);
4096               printf ("\n                 ");
4097               print_vma (segment->p_filesz, FULL_HEX);
4098               putchar (' ');
4099               print_vma (segment->p_memsz, FULL_HEX);
4100               printf ("  %c%c%c    ",
4101                       (segment->p_flags & PF_R ? 'R' : ' '),
4102                       (segment->p_flags & PF_W ? 'W' : ' '),
4103                       (segment->p_flags & PF_X ? 'E' : ' '));
4104               print_vma (segment->p_align, HEX);
4105             }
4106         }
4107
4108       switch (segment->p_type)
4109         {
4110         case PT_DYNAMIC:
4111           if (dynamic_addr)
4112             error (_("more than one dynamic segment\n"));
4113
4114           /* By default, assume that the .dynamic section is the first
4115              section in the DYNAMIC segment.  */
4116           dynamic_addr = segment->p_offset;
4117           dynamic_size = segment->p_filesz;
4118
4119           /* Try to locate the .dynamic section. If there is
4120              a section header table, we can easily locate it.  */
4121           if (section_headers != NULL)
4122             {
4123               Elf_Internal_Shdr * sec;
4124
4125               sec = find_section (".dynamic");
4126               if (sec == NULL || sec->sh_size == 0)
4127                 {
4128                   /* A corresponding .dynamic section is expected, but on
4129                      IA-64/OpenVMS it is OK for it to be missing.  */
4130                   if (!is_ia64_vms ())
4131                     error (_("no .dynamic section in the dynamic segment\n"));
4132                   break;
4133                 }
4134
4135               if (sec->sh_type == SHT_NOBITS)
4136                 {
4137                   dynamic_size = 0;
4138                   break;
4139                 }
4140
4141               dynamic_addr = sec->sh_offset;
4142               dynamic_size = sec->sh_size;
4143
4144               if (dynamic_addr < segment->p_offset
4145                   || dynamic_addr > segment->p_offset + segment->p_filesz)
4146                 warn (_("the .dynamic section is not contained"
4147                         " within the dynamic segment\n"));
4148               else if (dynamic_addr > segment->p_offset)
4149                 warn (_("the .dynamic section is not the first section"
4150                         " in the dynamic segment.\n"));
4151             }
4152           break;
4153
4154         case PT_INTERP:
4155           if (fseek (file, archive_file_offset + (long) segment->p_offset,
4156                      SEEK_SET))
4157             error (_("Unable to find program interpreter name\n"));
4158           else
4159             {
4160               char fmt [32];
4161               int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX);
4162
4163               if (ret >= (int) sizeof (fmt) || ret < 0)
4164                 error (_("Internal error: failed to create format string to display program interpreter\n"));
4165
4166               program_interpreter[0] = 0;
4167               if (fscanf (file, fmt, program_interpreter) <= 0)
4168                 error (_("Unable to read program interpreter name\n"));
4169
4170               if (do_segments)
4171                 printf (_("\n      [Requesting program interpreter: %s]"),
4172                     program_interpreter);
4173             }
4174           break;
4175         }
4176
4177       if (do_segments)
4178         putc ('\n', stdout);
4179     }
4180
4181   if (do_segments && section_headers != NULL && string_table != NULL)
4182     {
4183       printf (_("\n Section to Segment mapping:\n"));
4184       printf (_("  Segment Sections...\n"));
4185
4186       for (i = 0; i < elf_header.e_phnum; i++)
4187         {
4188           unsigned int j;
4189           Elf_Internal_Shdr * section;
4190
4191           segment = program_headers + i;
4192           section = section_headers + 1;
4193
4194           printf ("   %2.2d     ", i);
4195
4196           for (j = 1; j < elf_header.e_shnum; j++, section++)
4197             {
4198               if (!ELF_TBSS_SPECIAL (section, segment)
4199                   && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
4200                 printf ("%s ", SECTION_NAME (section));
4201             }
4202
4203           putc ('\n',stdout);
4204         }
4205     }
4206
4207   return 1;
4208 }
4209
4210
4211 /* Find the file offset corresponding to VMA by using the program headers.  */
4212
4213 static long
4214 offset_from_vma (FILE * file, bfd_vma vma, bfd_size_type size)
4215 {
4216   Elf_Internal_Phdr * seg;
4217
4218   if (! get_program_headers (file))
4219     {
4220       warn (_("Cannot interpret virtual addresses without program headers.\n"));
4221       return (long) vma;
4222     }
4223
4224   for (seg = program_headers;
4225        seg < program_headers + elf_header.e_phnum;
4226        ++seg)
4227     {
4228       if (seg->p_type != PT_LOAD)
4229         continue;
4230
4231       if (vma >= (seg->p_vaddr & -seg->p_align)
4232           && vma + size <= seg->p_vaddr + seg->p_filesz)
4233         return vma - seg->p_vaddr + seg->p_offset;
4234     }
4235
4236   warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
4237         (unsigned long) vma);
4238   return (long) vma;
4239 }
4240
4241
4242 static int
4243 get_32bit_section_headers (FILE * file, unsigned int num)
4244 {
4245   Elf32_External_Shdr * shdrs;
4246   Elf_Internal_Shdr *   internal;
4247   unsigned int i;
4248
4249   shdrs = (Elf32_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
4250                                             elf_header.e_shentsize, num,
4251                                             _("section headers"));
4252   if (!shdrs)
4253     return 0;
4254
4255   section_headers = (Elf_Internal_Shdr *) cmalloc (num,
4256                                                    sizeof (Elf_Internal_Shdr));
4257
4258   if (section_headers == NULL)
4259     {
4260       error (_("Out of memory\n"));
4261       return 0;
4262     }
4263
4264   for (i = 0, internal = section_headers;
4265        i < num;
4266        i++, internal++)
4267     {
4268       internal->sh_name      = BYTE_GET (shdrs[i].sh_name);
4269       internal->sh_type      = BYTE_GET (shdrs[i].sh_type);
4270       internal->sh_flags     = BYTE_GET (shdrs[i].sh_flags);
4271       internal->sh_addr      = BYTE_GET (shdrs[i].sh_addr);
4272       internal->sh_offset    = BYTE_GET (shdrs[i].sh_offset);
4273       internal->sh_size      = BYTE_GET (shdrs[i].sh_size);
4274       internal->sh_link      = BYTE_GET (shdrs[i].sh_link);
4275       internal->sh_info      = BYTE_GET (shdrs[i].sh_info);
4276       internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
4277       internal->sh_entsize   = BYTE_GET (shdrs[i].sh_entsize);
4278     }
4279
4280   free (shdrs);
4281
4282   return 1;
4283 }
4284
4285 static int
4286 get_64bit_section_headers (FILE * file, unsigned int num)
4287 {
4288   Elf64_External_Shdr * shdrs;
4289   Elf_Internal_Shdr *   internal;
4290   unsigned int i;
4291
4292   shdrs = (Elf64_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
4293                                             elf_header.e_shentsize, num,
4294                                             _("section headers"));
4295   if (!shdrs)
4296     return 0;
4297
4298   section_headers = (Elf_Internal_Shdr *) cmalloc (num,
4299                                                    sizeof (Elf_Internal_Shdr));
4300
4301   if (section_headers == NULL)
4302     {
4303       error (_("Out of memory\n"));
4304       return 0;
4305     }
4306
4307   for (i = 0, internal = section_headers;
4308        i < num;
4309        i++, internal++)
4310     {
4311       internal->sh_name      = BYTE_GET (shdrs[i].sh_name);
4312       internal->sh_type      = BYTE_GET (shdrs[i].sh_type);
4313       internal->sh_flags     = BYTE_GET (shdrs[i].sh_flags);
4314       internal->sh_addr      = BYTE_GET (shdrs[i].sh_addr);
4315       internal->sh_size      = BYTE_GET (shdrs[i].sh_size);
4316       internal->sh_entsize   = BYTE_GET (shdrs[i].sh_entsize);
4317       internal->sh_link      = BYTE_GET (shdrs[i].sh_link);
4318       internal->sh_info      = BYTE_GET (shdrs[i].sh_info);
4319       internal->sh_offset    = BYTE_GET (shdrs[i].sh_offset);
4320       internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
4321     }
4322
4323   free (shdrs);
4324
4325   return 1;
4326 }
4327
4328 static Elf_Internal_Sym *
4329 get_32bit_elf_symbols (FILE * file,
4330                        Elf_Internal_Shdr * section,
4331                        unsigned long * num_syms_return)
4332 {
4333   unsigned long number = 0;
4334   Elf32_External_Sym * esyms = NULL;
4335   Elf_External_Sym_Shndx * shndx = NULL;
4336   Elf_Internal_Sym * isyms = NULL;
4337   Elf_Internal_Sym * psym;
4338   unsigned int j;
4339
4340   /* Run some sanity checks first.  */
4341   if (section->sh_entsize == 0)
4342     {
4343       error (_("sh_entsize is zero\n"));
4344       goto exit_point;
4345     }
4346
4347   number = section->sh_size / section->sh_entsize;
4348
4349   if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
4350     {
4351       error (_("Invalid sh_entsize\n"));
4352       goto exit_point;
4353     }
4354
4355   esyms = (Elf32_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
4356                                            section->sh_size, _("symbols"));
4357   if (esyms == NULL)
4358     goto exit_point;
4359
4360   shndx = NULL;
4361   if (symtab_shndx_hdr != NULL
4362       && (symtab_shndx_hdr->sh_link
4363           == (unsigned long) (section - section_headers)))
4364     {
4365       shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
4366                                                    symtab_shndx_hdr->sh_offset,
4367                                                    1, symtab_shndx_hdr->sh_size,
4368                                                    _("symbol table section indicies"));
4369       if (shndx == NULL)
4370         goto exit_point;
4371     }
4372
4373   isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
4374
4375   if (isyms == NULL)
4376     {
4377       error (_("Out of memory\n"));
4378       goto exit_point;
4379     }
4380
4381   for (j = 0, psym = isyms; j < number; j++, psym++)
4382     {
4383       psym->st_name  = BYTE_GET (esyms[j].st_name);
4384       psym->st_value = BYTE_GET (esyms[j].st_value);
4385       psym->st_size  = BYTE_GET (esyms[j].st_size);
4386       psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
4387       if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
4388         psym->st_shndx
4389           = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
4390       else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
4391         psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
4392       psym->st_info  = BYTE_GET (esyms[j].st_info);
4393       psym->st_other = BYTE_GET (esyms[j].st_other);
4394     }
4395
4396  exit_point:
4397   if (shndx != NULL)
4398     free (shndx);
4399   if (esyms != NULL)
4400     free (esyms);
4401
4402   if (num_syms_return != NULL)
4403     * num_syms_return = isyms == NULL ? 0 : number;
4404
4405   return isyms;
4406 }
4407
4408 static Elf_Internal_Sym *
4409 get_64bit_elf_symbols (FILE * file,
4410                        Elf_Internal_Shdr * section,
4411                        unsigned long * num_syms_return)
4412 {
4413   unsigned long number = 0;
4414   Elf64_External_Sym * esyms = NULL;
4415   Elf_External_Sym_Shndx * shndx = NULL;
4416   Elf_Internal_Sym * isyms = NULL;
4417   Elf_Internal_Sym * psym;
4418   unsigned int j;
4419
4420   /* Run some sanity checks first.  */
4421   if (section->sh_entsize == 0)
4422     {
4423       error (_("sh_entsize is zero\n"));
4424       goto exit_point;
4425     }
4426
4427   number = section->sh_size / section->sh_entsize;
4428
4429   if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
4430     {
4431       error (_("Invalid sh_entsize\n"));
4432       goto exit_point;
4433     }
4434
4435   esyms = (Elf64_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
4436                                            section->sh_size, _("symbols"));
4437   if (!esyms)
4438     goto exit_point;
4439
4440   if (symtab_shndx_hdr != NULL
4441       && (symtab_shndx_hdr->sh_link
4442           == (unsigned long) (section - section_headers)))
4443     {
4444       shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
4445                                                    symtab_shndx_hdr->sh_offset,
4446                                                    1, symtab_shndx_hdr->sh_size,
4447                                                    _("symbol table section indicies"));
4448       if (shndx == NULL)
4449         goto exit_point;
4450     }
4451
4452   isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
4453
4454   if (isyms == NULL)
4455     {
4456       error (_("Out of memory\n"));
4457       goto exit_point;
4458     }
4459
4460   for (j = 0, psym = isyms; j < number; j++, psym++)
4461     {
4462       psym->st_name  = BYTE_GET (esyms[j].st_name);
4463       psym->st_info  = BYTE_GET (esyms[j].st_info);
4464       psym->st_other = BYTE_GET (esyms[j].st_other);
4465       psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
4466
4467       if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
4468         psym->st_shndx
4469           = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
4470       else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
4471         psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
4472
4473       psym->st_value = BYTE_GET (esyms[j].st_value);
4474       psym->st_size  = BYTE_GET (esyms[j].st_size);
4475     }
4476
4477  exit_point:
4478   if (shndx != NULL)
4479     free (shndx);
4480   if (esyms != NULL)
4481     free (esyms);
4482
4483   if (num_syms_return != NULL)
4484     * num_syms_return = isyms == NULL ? 0 : number;
4485
4486   return isyms;
4487 }
4488
4489 static const char *
4490 get_elf_section_flags (bfd_vma sh_flags)
4491 {
4492   static char buff[1024];
4493   char * p = buff;
4494   int field_size = is_32bit_elf ? 8 : 16;
4495   int sindex;
4496   int size = sizeof (buff) - (field_size + 4 + 1);
4497   bfd_vma os_flags = 0;
4498   bfd_vma proc_flags = 0;
4499   bfd_vma unknown_flags = 0;
4500   static const struct
4501     {
4502       const char * str;
4503       int len;
4504     }
4505   flags [] =
4506     {
4507       /*  0 */ { STRING_COMMA_LEN ("WRITE") },
4508       /*  1 */ { STRING_COMMA_LEN ("ALLOC") },
4509       /*  2 */ { STRING_COMMA_LEN ("EXEC") },
4510       /*  3 */ { STRING_COMMA_LEN ("MERGE") },
4511       /*  4 */ { STRING_COMMA_LEN ("STRINGS") },
4512       /*  5 */ { STRING_COMMA_LEN ("INFO LINK") },
4513       /*  6 */ { STRING_COMMA_LEN ("LINK ORDER") },
4514       /*  7 */ { STRING_COMMA_LEN ("OS NONCONF") },
4515       /*  8 */ { STRING_COMMA_LEN ("GROUP") },
4516       /*  9 */ { STRING_COMMA_LEN ("TLS") },
4517       /* IA-64 specific.  */
4518       /* 10 */ { STRING_COMMA_LEN ("SHORT") },
4519       /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
4520       /* IA-64 OpenVMS specific.  */
4521       /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
4522       /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
4523       /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
4524       /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
4525       /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
4526       /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
4527       /* Generic.  */
4528       /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
4529       /* SPARC specific.  */
4530       /* 19 */ { STRING_COMMA_LEN ("ORDERED") }
4531     };
4532
4533   if (do_section_details)
4534     {
4535       sprintf (buff, "[%*.*lx]: ",
4536                field_size, field_size, (unsigned long) sh_flags);
4537       p += field_size + 4;
4538     }
4539
4540   while (sh_flags)
4541     {
4542       bfd_vma flag;
4543
4544       flag = sh_flags & - sh_flags;
4545       sh_flags &= ~ flag;
4546
4547       if (do_section_details)
4548         {
4549           switch (flag)
4550             {
4551             case SHF_WRITE:             sindex = 0; break;
4552             case SHF_ALLOC:             sindex = 1; break;
4553             case SHF_EXECINSTR:         sindex = 2; break;
4554             case SHF_MERGE:             sindex = 3; break;
4555             case SHF_STRINGS:           sindex = 4; break;
4556             case SHF_INFO_LINK:         sindex = 5; break;
4557             case SHF_LINK_ORDER:        sindex = 6; break;
4558             case SHF_OS_NONCONFORMING:  sindex = 7; break;
4559             case SHF_GROUP:             sindex = 8; break;
4560             case SHF_TLS:               sindex = 9; break;
4561             case SHF_EXCLUDE:           sindex = 18; break;
4562
4563             default:
4564               sindex = -1;
4565               switch (elf_header.e_machine)
4566                 {
4567                 case EM_IA_64:
4568                   if (flag == SHF_IA_64_SHORT)
4569                     sindex = 10;
4570                   else if (flag == SHF_IA_64_NORECOV)
4571                     sindex = 11;
4572 #ifdef BFD64
4573                   else if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
4574                     switch (flag)
4575                       {
4576                       case SHF_IA_64_VMS_GLOBAL:      sindex = 12; break;
4577                       case SHF_IA_64_VMS_OVERLAID:    sindex = 13; break;
4578                       case SHF_IA_64_VMS_SHARED:      sindex = 14; break;
4579                       case SHF_IA_64_VMS_VECTOR:      sindex = 15; break;
4580                       case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
4581                       case SHF_IA_64_VMS_PROTECTED:   sindex = 17; break;
4582                       default:                        break;
4583                       }
4584 #endif
4585                   break;
4586
4587                 case EM_386:
4588                 case EM_486:
4589                 case EM_X86_64:
4590                 case EM_L1OM:
4591                 case EM_K1OM:
4592                 case EM_OLD_SPARCV9:
4593                 case EM_SPARC32PLUS:
4594                 case EM_SPARCV9:
4595                 case EM_SPARC:
4596                   if (flag == SHF_ORDERED)
4597                     sindex = 19;
4598                   break;
4599                 default:
4600                   break;
4601                 }
4602             }
4603
4604           if (sindex != -1)
4605             {
4606               if (p != buff + field_size + 4)
4607                 {
4608                   if (size < (10 + 2))
4609                     abort ();
4610                   size -= 2;
4611                   *p++ = ',';
4612                   *p++ = ' ';
4613                 }
4614
4615               size -= flags [sindex].len;
4616               p = stpcpy (p, flags [sindex].str);
4617             }
4618           else if (flag & SHF_MASKOS)
4619             os_flags |= flag;
4620           else if (flag & SHF_MASKPROC)
4621             proc_flags |= flag;
4622           else
4623             unknown_flags |= flag;
4624         }
4625       else
4626         {
4627           switch (flag)
4628             {
4629             case SHF_WRITE:             *p = 'W'; break;
4630             case SHF_ALLOC:             *p = 'A'; break;
4631             case SHF_EXECINSTR:         *p = 'X'; break;
4632             case SHF_MERGE:             *p = 'M'; break;
4633             case SHF_STRINGS:           *p = 'S'; break;
4634             case SHF_INFO_LINK:         *p = 'I'; break;
4635             case SHF_LINK_ORDER:        *p = 'L'; break;
4636             case SHF_OS_NONCONFORMING:  *p = 'O'; break;
4637             case SHF_GROUP:             *p = 'G'; break;
4638             case SHF_TLS:               *p = 'T'; break;
4639             case SHF_EXCLUDE:           *p = 'E'; break;
4640
4641             default:
4642               if ((elf_header.e_machine == EM_X86_64
4643                    || elf_header.e_machine == EM_L1OM
4644                    || elf_header.e_machine == EM_K1OM)
4645                   && flag == SHF_X86_64_LARGE)
4646                 *p = 'l';
4647               else if (flag & SHF_MASKOS)
4648                 {
4649                   *p = 'o';
4650                   sh_flags &= ~ SHF_MASKOS;
4651                 }
4652               else if (flag & SHF_MASKPROC)
4653                 {
4654                   *p = 'p';
4655                   sh_flags &= ~ SHF_MASKPROC;
4656                 }
4657               else
4658                 *p = 'x';
4659               break;
4660             }
4661           p++;
4662         }
4663     }
4664
4665   if (do_section_details)
4666     {
4667       if (os_flags)
4668         {
4669           size -= 5 + field_size;
4670           if (p != buff + field_size + 4)
4671             {
4672               if (size < (2 + 1))
4673                 abort ();
4674               size -= 2;
4675               *p++ = ',';
4676               *p++ = ' ';
4677             }
4678           sprintf (p, "OS (%*.*lx)", field_size, field_size,
4679                    (unsigned long) os_flags);
4680           p += 5 + field_size;
4681         }
4682       if (proc_flags)
4683         {
4684           size -= 7 + field_size;
4685           if (p != buff + field_size + 4)
4686             {
4687               if (size < (2 + 1))
4688                 abort ();
4689               size -= 2;
4690               *p++ = ',';
4691               *p++ = ' ';
4692             }
4693           sprintf (p, "PROC (%*.*lx)", field_size, field_size,
4694                    (unsigned long) proc_flags);
4695           p += 7 + field_size;
4696         }
4697       if (unknown_flags)
4698         {
4699           size -= 10 + field_size;
4700           if (p != buff + field_size + 4)
4701             {
4702               if (size < (2 + 1))
4703                 abort ();
4704               size -= 2;
4705               *p++ = ',';
4706               *p++ = ' ';
4707             }
4708           sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
4709                    (unsigned long) unknown_flags);
4710           p += 10 + field_size;
4711         }
4712     }
4713
4714   *p = '\0';
4715   return buff;
4716 }
4717
4718 static int
4719 process_section_headers (FILE * file)
4720 {
4721   Elf_Internal_Shdr * section;
4722   unsigned int i;
4723
4724   section_headers = NULL;
4725
4726   if (elf_header.e_shnum == 0)
4727     {
4728       /* PR binutils/12467.  */
4729       if (elf_header.e_shoff != 0)
4730         warn (_("possibly corrupt ELF file header - it has a non-zero"
4731                 " section header offset, but no section headers\n"));
4732       else if (do_sections)
4733         printf (_("\nThere are no sections in this file.\n"));
4734
4735       return 1;
4736     }
4737
4738   if (do_sections && !do_header)
4739     printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
4740             elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
4741
4742   if (is_32bit_elf)
4743     {
4744       if (! get_32bit_section_headers (file, elf_header.e_shnum))
4745         return 0;
4746     }
4747   else if (! get_64bit_section_headers (file, elf_header.e_shnum))
4748     return 0;
4749
4750   /* Read in the string table, so that we have names to display.  */
4751   if (elf_header.e_shstrndx != SHN_UNDEF
4752        && elf_header.e_shstrndx < elf_header.e_shnum)
4753     {
4754       section = section_headers + elf_header.e_shstrndx;
4755
4756       if (section->sh_size != 0)
4757         {
4758           string_table = (char *) get_data (NULL, file, section->sh_offset,
4759                                             1, section->sh_size,
4760                                             _("string table"));
4761
4762           string_table_length = string_table != NULL ? section->sh_size : 0;
4763         }
4764     }
4765
4766   /* Scan the sections for the dynamic symbol table
4767      and dynamic string table and debug sections.  */
4768   dynamic_symbols = NULL;
4769   dynamic_strings = NULL;
4770   dynamic_syminfo = NULL;
4771   symtab_shndx_hdr = NULL;
4772
4773   eh_addr_size = is_32bit_elf ? 4 : 8;
4774   switch (elf_header.e_machine)
4775     {
4776     case EM_MIPS:
4777     case EM_MIPS_RS3_LE:
4778       /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
4779          FDE addresses.  However, the ABI also has a semi-official ILP32
4780          variant for which the normal FDE address size rules apply.
4781
4782          GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
4783          section, where XX is the size of longs in bits.  Unfortunately,
4784          earlier compilers provided no way of distinguishing ILP32 objects
4785          from LP64 objects, so if there's any doubt, we should assume that
4786          the official LP64 form is being used.  */
4787       if ((elf_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
4788           && find_section (".gcc_compiled_long32") == NULL)
4789         eh_addr_size = 8;
4790       break;
4791
4792     case EM_H8_300:
4793     case EM_H8_300H:
4794       switch (elf_header.e_flags & EF_H8_MACH)
4795         {
4796         case E_H8_MACH_H8300:
4797         case E_H8_MACH_H8300HN:
4798         case E_H8_MACH_H8300SN:
4799         case E_H8_MACH_H8300SXN:
4800           eh_addr_size = 2;
4801           break;
4802         case E_H8_MACH_H8300H:
4803         case E_H8_MACH_H8300S:
4804         case E_H8_MACH_H8300SX:
4805           eh_addr_size = 4;
4806           break;
4807         }
4808       break;
4809
4810     case EM_M32C_OLD:
4811     case EM_M32C:
4812       switch (elf_header.e_flags & EF_M32C_CPU_MASK)
4813         {
4814         case EF_M32C_CPU_M16C:
4815           eh_addr_size = 2;
4816           break;
4817         }
4818       break;
4819     }
4820
4821 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
4822   do                                                                        \
4823     {                                                                       \
4824       bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64;      \
4825       if (section->sh_entsize != expected_entsize)                          \
4826         {                                                               \
4827           error (_("Section %d has invalid sh_entsize of %" BFD_VMA_FMT "x\n"), \
4828                  i, section->sh_entsize);       \
4829           error (_("(Using the expected size of %d for the rest of this dump)\n"), \
4830                    (int) expected_entsize); \
4831           section->sh_entsize = expected_entsize;                       \
4832         } \
4833     }                                                                       \
4834   while (0)
4835
4836 #define CHECK_ENTSIZE(section, i, type)                                 \
4837   CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type),         \
4838                         sizeof (Elf64_External_##type))
4839
4840   for (i = 0, section = section_headers;
4841        i < elf_header.e_shnum;
4842        i++, section++)
4843     {
4844       char * name = SECTION_NAME (section);
4845
4846       if (section->sh_type == SHT_DYNSYM)
4847         {
4848           if (dynamic_symbols != NULL)
4849             {
4850               error (_("File contains multiple dynamic symbol tables\n"));
4851               continue;
4852             }
4853
4854           CHECK_ENTSIZE (section, i, Sym);
4855           dynamic_symbols = GET_ELF_SYMBOLS (file, section, & num_dynamic_syms);
4856         }
4857       else if (section->sh_type == SHT_STRTAB
4858                && streq (name, ".dynstr"))
4859         {
4860           if (dynamic_strings != NULL)
4861             {
4862               error (_("File contains multiple dynamic string tables\n"));
4863               continue;
4864             }
4865
4866           dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
4867                                                1, section->sh_size,
4868                                                _("dynamic strings"));
4869           dynamic_strings_length = dynamic_strings == NULL ? 0 : section->sh_size;
4870         }
4871       else if (section->sh_type == SHT_SYMTAB_SHNDX)
4872         {
4873           if (symtab_shndx_hdr != NULL)
4874             {
4875               error (_("File contains multiple symtab shndx tables\n"));
4876               continue;
4877             }
4878           symtab_shndx_hdr = section;
4879         }
4880       else if (section->sh_type == SHT_SYMTAB)
4881         CHECK_ENTSIZE (section, i, Sym);
4882       else if (section->sh_type == SHT_GROUP)
4883         CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
4884       else if (section->sh_type == SHT_REL)
4885         CHECK_ENTSIZE (section, i, Rel);
4886       else if (section->sh_type == SHT_RELA)
4887         CHECK_ENTSIZE (section, i, Rela);
4888       else if ((do_debugging || do_debug_info || do_debug_abbrevs
4889                 || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
4890                 || do_debug_aranges || do_debug_frames || do_debug_macinfo
4891                 || do_debug_str || do_debug_loc || do_debug_ranges
4892                 || do_debug_addr || do_debug_cu_index)
4893                && (const_strneq (name, ".debug_")
4894                    || const_strneq (name, ".zdebug_")))
4895         {
4896           if (name[1] == 'z')
4897             name += sizeof (".zdebug_") - 1;
4898           else
4899             name += sizeof (".debug_") - 1;
4900
4901           if (do_debugging
4902               || (do_debug_info     && const_strneq (name, "info"))
4903               || (do_debug_info     && const_strneq (name, "types"))
4904               || (do_debug_abbrevs  && const_strneq (name, "abbrev"))
4905               || (do_debug_lines    && strcmp (name, "line") == 0)
4906               || (do_debug_lines    && const_strneq (name, "line."))
4907               || (do_debug_pubnames && const_strneq (name, "pubnames"))
4908               || (do_debug_pubtypes && const_strneq (name, "pubtypes"))
4909               || (do_debug_aranges  && const_strneq (name, "aranges"))
4910               || (do_debug_ranges   && const_strneq (name, "ranges"))
4911               || (do_debug_frames   && const_strneq (name, "frame"))
4912               || (do_debug_macinfo  && const_strneq (name, "macinfo"))
4913               || (do_debug_macinfo  && const_strneq (name, "macro"))
4914               || (do_debug_str      && const_strneq (name, "str"))
4915               || (do_debug_loc      && const_strneq (name, "loc"))
4916               || (do_debug_addr     && const_strneq (name, "addr"))
4917               || (do_debug_cu_index && const_strneq (name, "cu_index"))
4918               || (do_debug_cu_index && const_strneq (name, "tu_index"))
4919               )
4920             request_dump_bynumber (i, DEBUG_DUMP);
4921         }
4922       /* Linkonce section to be combined with .debug_info at link time.  */
4923       else if ((do_debugging || do_debug_info)
4924                && const_strneq (name, ".gnu.linkonce.wi."))
4925         request_dump_bynumber (i, DEBUG_DUMP);
4926       else if (do_debug_frames && streq (name, ".eh_frame"))
4927         request_dump_bynumber (i, DEBUG_DUMP);
4928       else if (do_gdb_index && streq (name, ".gdb_index"))
4929         request_dump_bynumber (i, DEBUG_DUMP);
4930       /* Trace sections for Itanium VMS.  */
4931       else if ((do_debugging || do_trace_info || do_trace_abbrevs
4932                 || do_trace_aranges)
4933                && const_strneq (name, ".trace_"))
4934         {
4935           name += sizeof (".trace_") - 1;
4936
4937           if (do_debugging
4938               || (do_trace_info     && streq (name, "info"))
4939               || (do_trace_abbrevs  && streq (name, "abbrev"))
4940               || (do_trace_aranges  && streq (name, "aranges"))
4941               )
4942             request_dump_bynumber (i, DEBUG_DUMP);
4943         }
4944
4945     }
4946
4947   if (! do_sections)
4948     return 1;
4949
4950   if (elf_header.e_shnum > 1)
4951     printf (_("\nSection Headers:\n"));
4952   else
4953     printf (_("\nSection Header:\n"));
4954
4955   if (is_32bit_elf)
4956     {
4957       if (do_section_details)
4958         {
4959           printf (_("  [Nr] Name\n"));
4960           printf (_("       Type            Addr     Off    Size   ES   Lk Inf Al\n"));
4961         }
4962       else
4963         printf
4964           (_("  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al\n"));
4965     }
4966   else if (do_wide)
4967     {
4968       if (do_section_details)
4969         {
4970           printf (_("  [Nr] Name\n"));
4971           printf (_("       Type            Address          Off    Size   ES   Lk Inf Al\n"));
4972         }
4973       else
4974         printf
4975           (_("  [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al\n"));
4976     }
4977   else
4978     {
4979       if (do_section_details)
4980         {
4981           printf (_("  [Nr] Name\n"));
4982           printf (_("       Type              Address          Offset            Link\n"));
4983           printf (_("       Size              EntSize          Info              Align\n"));
4984         }
4985       else
4986         {
4987           printf (_("  [Nr] Name              Type             Address           Offset\n"));
4988           printf (_("       Size              EntSize          Flags  Link  Info  Align\n"));
4989         }
4990     }
4991
4992   if (do_section_details)
4993     printf (_("       Flags\n"));
4994
4995   for (i = 0, section = section_headers;
4996        i < elf_header.e_shnum;
4997        i++, section++)
4998     {
4999       printf ("  [%2u] ", i);
5000       if (do_section_details)
5001         {
5002           print_symbol (INT_MAX, SECTION_NAME (section));
5003           printf ("\n      ");
5004         }
5005       else
5006         {
5007           print_symbol (-17, SECTION_NAME (section));
5008         }
5009       
5010       printf (do_wide ? " %-15s " : " %-15.15s ",
5011               get_section_type_name (section->sh_type));
5012       
5013       if (is_32bit_elf)
5014         {
5015           const char * link_too_big = NULL;
5016
5017           print_vma (section->sh_addr, LONG_HEX);
5018
5019           printf ( " %6.6lx %6.6lx %2.2lx",
5020                    (unsigned long) section->sh_offset,
5021                    (unsigned long) section->sh_size,
5022                    (unsigned long) section->sh_entsize);
5023
5024           if (do_section_details)
5025             fputs ("  ", stdout);
5026           else
5027             printf (" %3s ", get_elf_section_flags (section->sh_flags));
5028
5029           if (section->sh_link >= elf_header.e_shnum)
5030             {
5031               link_too_big = "";
5032               /* The sh_link value is out of range.  Normally this indicates
5033                  an error but it can have special values in Solaris binaries.  */
5034               switch (elf_header.e_machine)
5035                 {
5036                 case EM_386:
5037                 case EM_486:
5038                 case EM_X86_64:
5039                 case EM_L1OM:
5040                 case EM_K1OM:
5041                 case EM_OLD_SPARCV9:
5042                 case EM_SPARC32PLUS:
5043                 case EM_SPARCV9:
5044                 case EM_SPARC:
5045                   if (section->sh_link == (SHN_BEFORE & 0xffff))
5046                     link_too_big = "BEFORE";
5047                   else if (section->sh_link == (SHN_AFTER & 0xffff))
5048                     link_too_big = "AFTER";
5049                   break;
5050                 default:
5051                   break;
5052                 }
5053             }
5054
5055           if (do_section_details)
5056             {
5057               if (link_too_big != NULL && * link_too_big)
5058                 printf ("<%s> ", link_too_big);
5059               else
5060                 printf ("%2u ", section->sh_link);
5061               printf ("%3u %2lu\n", section->sh_info,
5062                       (unsigned long) section->sh_addralign);
5063             }
5064           else
5065             printf ("%2u %3u %2lu\n",
5066                     section->sh_link,
5067                     section->sh_info,
5068                     (unsigned long) section->sh_addralign);
5069
5070           if (link_too_big && ! * link_too_big)
5071             warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
5072                   i, section->sh_link);
5073         }
5074       else if (do_wide)
5075         {
5076           print_vma (section->sh_addr, LONG_HEX);
5077
5078           if ((long) section->sh_offset == section->sh_offset)
5079             printf (" %6.6lx", (unsigned long) section->sh_offset);
5080           else
5081             {
5082               putchar (' ');
5083               print_vma (section->sh_offset, LONG_HEX);
5084             }
5085
5086           if ((unsigned long) section->sh_size == section->sh_size)
5087             printf (" %6.6lx", (unsigned long) section->sh_size);
5088           else
5089             {
5090               putchar (' ');
5091               print_vma (section->sh_size, LONG_HEX);
5092             }
5093
5094           if ((unsigned long) section->sh_entsize == section->sh_entsize)
5095             printf (" %2.2lx", (unsigned long) section->sh_entsize);
5096           else
5097             {
5098               putchar (' ');
5099               print_vma (section->sh_entsize, LONG_HEX);
5100             }
5101
5102           if (do_section_details)
5103             fputs ("  ", stdout);
5104           else
5105             printf (" %3s ", get_elf_section_flags (section->sh_flags));
5106
5107           printf ("%2u %3u ", section->sh_link, section->sh_info);
5108
5109           if ((unsigned long) section->sh_addralign == section->sh_addralign)
5110             printf ("%2lu\n", (unsigned long) section->sh_addralign);
5111           else
5112             {
5113               print_vma (section->sh_addralign, DEC);
5114               putchar ('\n');
5115             }
5116         }
5117       else if (do_section_details)
5118         {
5119           printf ("       %-15.15s  ",
5120                   get_section_type_name (section->sh_type));
5121           print_vma (section->sh_addr, LONG_HEX);
5122           if ((long) section->sh_offset == section->sh_offset)
5123             printf ("  %16.16lx", (unsigned long) section->sh_offset);
5124           else
5125             {
5126               printf ("  ");
5127               print_vma (section->sh_offset, LONG_HEX);
5128             }
5129           printf ("  %u\n       ", section->sh_link);
5130           print_vma (section->sh_size, LONG_HEX);
5131           putchar (' ');
5132           print_vma (section->sh_entsize, LONG_HEX);
5133
5134           printf ("  %-16u  %lu\n",
5135                   section->sh_info,
5136                   (unsigned long) section->sh_addralign);
5137         }
5138       else
5139         {
5140           putchar (' ');
5141           print_vma (section->sh_addr, LONG_HEX);
5142           if ((long) section->sh_offset == section->sh_offset)
5143             printf ("  %8.8lx", (unsigned long) section->sh_offset);
5144           else
5145             {
5146               printf ("  ");
5147               print_vma (section->sh_offset, LONG_HEX);
5148             }
5149           printf ("\n       ");
5150           print_vma (section->sh_size, LONG_HEX);
5151           printf ("  ");
5152           print_vma (section->sh_entsize, LONG_HEX);
5153
5154           printf (" %3s ", get_elf_section_flags (section->sh_flags));
5155
5156           printf ("     %2u   %3u     %lu\n",
5157                   section->sh_link,
5158                   section->sh_info,
5159                   (unsigned long) section->sh_addralign);
5160         }
5161
5162       if (do_section_details)
5163         printf ("       %s\n", get_elf_section_flags (section->sh_flags));
5164     }
5165
5166   if (!do_section_details)
5167     {
5168       if (elf_header.e_machine == EM_X86_64
5169           || elf_header.e_machine == EM_L1OM
5170           || elf_header.e_machine == EM_K1OM)
5171         printf (_("Key to Flags:\n\
5172   W (write), A (alloc), X (execute), M (merge), S (strings), l (large)\n\
5173   I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)\n\
5174   O (extra OS processing required) o (OS specific), p (processor specific)\n"));
5175       else
5176         printf (_("Key to Flags:\n\
5177   W (write), A (alloc), X (execute), M (merge), S (strings)\n\
5178   I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)\n\
5179   O (extra OS processing required) o (OS specific), p (processor specific)\n"));
5180     }   
5181
5182   return 1;
5183 }
5184
5185 static const char *
5186 get_group_flags (unsigned int flags)
5187 {
5188   static char buff[32];
5189   switch (flags)
5190     {
5191     case 0:
5192       return "";
5193
5194     case GRP_COMDAT:
5195       return "COMDAT ";
5196
5197    default:
5198       snprintf (buff, sizeof (buff), _("[<unknown>: 0x%x] "), flags);
5199       break;
5200     }
5201   return buff;
5202 }
5203
5204 static int
5205 process_section_groups (FILE * file)
5206 {
5207   Elf_Internal_Shdr * section;
5208   unsigned int i;
5209   struct group * group;
5210   Elf_Internal_Shdr * symtab_sec;
5211   Elf_Internal_Shdr * strtab_sec;
5212   Elf_Internal_Sym * symtab;
5213   unsigned long num_syms;
5214   char * strtab;
5215   size_t strtab_size;
5216
5217   /* Don't process section groups unless needed.  */
5218   if (!do_unwind && !do_section_groups)
5219     return 1;
5220
5221   if (elf_header.e_shnum == 0)
5222     {
5223       if (do_section_groups)
5224         printf (_("\nThere are no sections to group in this file.\n"));
5225
5226       return 1;
5227     }
5228
5229   if (section_headers == NULL)
5230     {
5231       error (_("Section headers are not available!\n"));
5232       /* PR 13622: This can happen with a corrupt ELF header.  */
5233       return 0;
5234     }
5235
5236   section_headers_groups = (struct group **) calloc (elf_header.e_shnum,
5237                                                      sizeof (struct group *));
5238
5239   if (section_headers_groups == NULL)
5240     {
5241       error (_("Out of memory\n"));
5242       return 0;
5243     }
5244
5245   /* Scan the sections for the group section.  */
5246   group_count = 0;
5247   for (i = 0, section = section_headers;
5248        i < elf_header.e_shnum;
5249        i++, section++)
5250     if (section->sh_type == SHT_GROUP)
5251       group_count++;
5252
5253   if (group_count == 0)
5254     {
5255       if (do_section_groups)
5256         printf (_("\nThere are no section groups in this file.\n"));
5257
5258       return 1;
5259     }
5260
5261   section_groups = (struct group *) calloc (group_count, sizeof (struct group));
5262
5263   if (section_groups == NULL)
5264     {
5265       error (_("Out of memory\n"));
5266       return 0;
5267     }
5268
5269   symtab_sec = NULL;
5270   strtab_sec = NULL;
5271   symtab = NULL;
5272   num_syms = 0;
5273   strtab = NULL;
5274   strtab_size = 0;
5275   for (i = 0, section = section_headers, group = section_groups;
5276        i < elf_header.e_shnum;
5277        i++, section++)
5278     {
5279       if (section->sh_type == SHT_GROUP)
5280         {
5281           char * name = SECTION_NAME (section);
5282           char * group_name;
5283           unsigned char * start;
5284           unsigned char * indices;
5285           unsigned int entry, j, size;
5286           Elf_Internal_Shdr * sec;
5287           Elf_Internal_Sym * sym;
5288
5289           /* Get the symbol table.  */
5290           if (section->sh_link >= elf_header.e_shnum
5291               || ((sec = section_headers + section->sh_link)->sh_type
5292                   != SHT_SYMTAB))
5293             {
5294               error (_("Bad sh_link in group section `%s'\n"), name);
5295               continue;
5296             }
5297
5298           if (symtab_sec != sec)
5299             {
5300               symtab_sec = sec;
5301               if (symtab)
5302                 free (symtab);
5303               symtab = GET_ELF_SYMBOLS (file, symtab_sec, & num_syms);
5304             }
5305
5306           if (symtab == NULL)
5307             {
5308               error (_("Corrupt header in group section `%s'\n"), name);
5309               continue;
5310             }
5311
5312           if (section->sh_info >= num_syms)
5313             {
5314               error (_("Bad sh_info in group section `%s'\n"), name);
5315               continue;
5316             }
5317
5318           sym = symtab + section->sh_info;
5319
5320           if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
5321             {
5322               if (sym->st_shndx == 0
5323                   || sym->st_shndx >= elf_header.e_shnum)
5324                 {
5325                   error (_("Bad sh_info in group section `%s'\n"), name);
5326                   continue;
5327                 }
5328
5329               group_name = SECTION_NAME (section_headers + sym->st_shndx);
5330               strtab_sec = NULL;
5331               if (strtab)
5332                 free (strtab);
5333               strtab = NULL;
5334               strtab_size = 0;
5335             }
5336           else
5337             {
5338               /* Get the string table.  */
5339               if (symtab_sec->sh_link >= elf_header.e_shnum)
5340                 {
5341                   strtab_sec = NULL;
5342                   if (strtab)
5343                     free (strtab);
5344                   strtab = NULL;
5345                   strtab_size = 0;
5346                 }
5347               else if (strtab_sec
5348                        != (sec = section_headers + symtab_sec->sh_link))
5349                 {
5350                   strtab_sec = sec;
5351                   if (strtab)
5352                     free (strtab);
5353                   strtab = (char *) get_data (NULL, file, strtab_sec->sh_offset,
5354                                               1, strtab_sec->sh_size,
5355                                               _("string table"));
5356                   strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
5357                 }
5358               group_name = sym->st_name < strtab_size
5359                 ? strtab + sym->st_name : _("<corrupt>");
5360             }
5361
5362           start = (unsigned char *) get_data (NULL, file, section->sh_offset,
5363                                               1, section->sh_size,
5364                                               _("section data"));
5365           if (start == NULL)
5366             continue;
5367
5368           indices = start;
5369           size = (section->sh_size / section->sh_entsize) - 1;
5370           entry = byte_get (indices, 4);
5371           indices += 4;
5372
5373           if (do_section_groups)
5374             {
5375               printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
5376                       get_group_flags (entry), i, name, group_name, size);
5377
5378               printf (_("   [Index]    Name\n"));
5379             }
5380
5381           group->group_index = i;
5382
5383           for (j = 0; j < size; j++)
5384             {
5385               struct group_list * g;
5386
5387               entry = byte_get (indices, 4);
5388               indices += 4;
5389
5390               if (entry >= elf_header.e_shnum)
5391                 {
5392                   error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
5393                          entry, i, elf_header.e_shnum - 1);
5394                   continue;
5395                 }
5396
5397               if (section_headers_groups [entry] != NULL)
5398                 {
5399                   if (entry)
5400                     {
5401                       error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
5402                              entry, i,
5403                              section_headers_groups [entry]->group_index);
5404                       continue;
5405                     }
5406                   else
5407                     {
5408                       /* Intel C/C++ compiler may put section 0 in a
5409                          section group. We just warn it the first time
5410                          and ignore it afterwards.  */
5411                       static int warned = 0;
5412                       if (!warned)
5413                         {
5414                           error (_("section 0 in group section [%5u]\n"),
5415                                  section_headers_groups [entry]->group_index);
5416                           warned++;
5417                         }
5418                     }
5419                 }
5420
5421               section_headers_groups [entry] = group;
5422
5423               if (do_section_groups)
5424                 {
5425                   sec = section_headers + entry;
5426                   printf ("   [%5u]   %s\n", entry, SECTION_NAME (sec));
5427                 }
5428
5429               g = (struct group_list *) xmalloc (sizeof (struct group_list));
5430               g->section_index = entry;
5431               g->next = group->root;
5432               group->root = g;
5433             }
5434
5435           if (start)
5436             free (start);
5437
5438           group++;
5439         }
5440     }
5441
5442   if (symtab)
5443     free (symtab);
5444   if (strtab)
5445     free (strtab);
5446   return 1;
5447 }
5448
5449 /* Data used to display dynamic fixups.  */
5450
5451 struct ia64_vms_dynfixup
5452 {
5453   bfd_vma needed_ident;         /* Library ident number.  */
5454   bfd_vma needed;               /* Index in the dstrtab of the library name.  */
5455   bfd_vma fixup_needed;         /* Index of the library.  */
5456   bfd_vma fixup_rela_cnt;       /* Number of fixups.  */
5457   bfd_vma fixup_rela_off;       /* Fixups offset in the dynamic segment.  */
5458 };
5459
5460 /* Data used to display dynamic relocations.  */
5461
5462 struct ia64_vms_dynimgrela
5463 {
5464   bfd_vma img_rela_cnt;         /* Number of relocations.  */
5465   bfd_vma img_rela_off;         /* Reloc offset in the dynamic segment.  */
5466 };
5467
5468 /* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
5469    library).  */
5470
5471 static void
5472 dump_ia64_vms_dynamic_fixups (FILE *file, struct ia64_vms_dynfixup *fixup,
5473                               const char *strtab, unsigned int strtab_sz)
5474 {
5475   Elf64_External_VMS_IMAGE_FIXUP *imfs;
5476   long i;
5477   const char *lib_name;
5478
5479   imfs = get_data (NULL, file, dynamic_addr + fixup->fixup_rela_off,
5480                    1, fixup->fixup_rela_cnt * sizeof (*imfs),
5481                    _("dynamic section image fixups"));
5482   if (!imfs)
5483     return;
5484
5485   if (fixup->needed < strtab_sz)
5486     lib_name = strtab + fixup->needed;
5487   else
5488     {
5489       warn ("corrupt library name index of 0x%lx found in dynamic entry",
5490             (unsigned long) fixup->needed);
5491       lib_name = "???";
5492     }
5493   printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
5494           (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
5495   printf
5496     (_("Seg Offset           Type                             SymVec DataType\n"));
5497
5498   for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
5499     {
5500       unsigned int type;
5501       const char *rtype;
5502
5503       printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
5504       printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
5505       type = BYTE_GET (imfs [i].type);
5506       rtype = elf_ia64_reloc_type (type);
5507       if (rtype == NULL)
5508         printf (" 0x%08x                       ", type);
5509       else
5510         printf (" %-32s ", rtype);
5511       printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
5512       printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
5513     }
5514
5515   free (imfs);
5516 }
5517
5518 /* Display IA-64 OpenVMS dynamic relocations (used to relocate an image).  */
5519
5520 static void
5521 dump_ia64_vms_dynamic_relocs (FILE *file, struct ia64_vms_dynimgrela *imgrela)
5522 {
5523   Elf64_External_VMS_IMAGE_RELA *imrs;
5524   long i;
5525
5526   imrs = get_data (NULL, file, dynamic_addr + imgrela->img_rela_off,
5527                    1, imgrela->img_rela_cnt * sizeof (*imrs),
5528                    _("dynamic section image relocations"));
5529   if (!imrs)
5530     return;
5531
5532   printf (_("\nImage relocs\n"));
5533   printf
5534     (_("Seg Offset   Type                            Addend            Seg Sym Off\n"));
5535
5536   for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
5537     {
5538       unsigned int type;
5539       const char *rtype;
5540
5541       printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
5542       printf ("%08" BFD_VMA_FMT "x ",
5543               (bfd_vma) BYTE_GET (imrs [i].rela_offset));
5544       type = BYTE_GET (imrs [i].type);
5545       rtype = elf_ia64_reloc_type (type);
5546       if (rtype == NULL)
5547         printf ("0x%08x                      ", type);
5548       else
5549         printf ("%-31s ", rtype);
5550       print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
5551       printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
5552       printf ("%08" BFD_VMA_FMT "x\n",
5553               (bfd_vma) BYTE_GET (imrs [i].sym_offset));
5554     }
5555
5556   free (imrs);
5557 }
5558
5559 /* Display IA-64 OpenVMS dynamic relocations and fixups.  */
5560
5561 static int
5562 process_ia64_vms_dynamic_relocs (FILE *file)
5563 {
5564   struct ia64_vms_dynfixup fixup;
5565   struct ia64_vms_dynimgrela imgrela;
5566   Elf_Internal_Dyn *entry;
5567   int res = 0;
5568   bfd_vma strtab_off = 0;
5569   bfd_vma strtab_sz = 0;
5570   char *strtab = NULL;
5571
5572   memset (&fixup, 0, sizeof (fixup));
5573   memset (&imgrela, 0, sizeof (imgrela));
5574
5575   /* Note: the order of the entries is specified by the OpenVMS specs.  */
5576   for (entry = dynamic_section;
5577        entry < dynamic_section + dynamic_nent;
5578        entry++)
5579     {
5580       switch (entry->d_tag)
5581         {
5582         case DT_IA_64_VMS_STRTAB_OFFSET:
5583           strtab_off = entry->d_un.d_val;
5584           break;
5585         case DT_STRSZ:
5586           strtab_sz = entry->d_un.d_val;
5587           if (strtab == NULL)
5588             strtab = get_data (NULL, file, dynamic_addr + strtab_off,
5589                                1, strtab_sz, _("dynamic string section"));
5590           break;
5591
5592         case DT_IA_64_VMS_NEEDED_IDENT:
5593           fixup.needed_ident = entry->d_un.d_val;
5594           break;
5595         case DT_NEEDED:
5596           fixup.needed = entry->d_un.d_val;
5597           break;
5598         case DT_IA_64_VMS_FIXUP_NEEDED:
5599           fixup.fixup_needed = entry->d_un.d_val;
5600           break;
5601         case DT_IA_64_VMS_FIXUP_RELA_CNT:
5602           fixup.fixup_rela_cnt = entry->d_un.d_val;
5603           break;
5604         case DT_IA_64_VMS_FIXUP_RELA_OFF:
5605           fixup.fixup_rela_off = entry->d_un.d_val;
5606           res++;
5607           dump_ia64_vms_dynamic_fixups (file, &fixup, strtab, strtab_sz);
5608           break;
5609
5610         case DT_IA_64_VMS_IMG_RELA_CNT:
5611           imgrela.img_rela_cnt = entry->d_un.d_val;
5612           break;
5613         case DT_IA_64_VMS_IMG_RELA_OFF:
5614           imgrela.img_rela_off = entry->d_un.d_val;
5615           res++;
5616           dump_ia64_vms_dynamic_relocs (file, &imgrela);
5617           break;
5618
5619         default:
5620           break;
5621         }
5622     }
5623
5624   if (strtab != NULL)
5625     free (strtab);
5626
5627   return res;
5628 }
5629
5630 static struct
5631 {
5632   const char * name;
5633   int reloc;
5634   int size;
5635   int rela;
5636 } dynamic_relocations [] =
5637 {
5638     { "REL", DT_REL, DT_RELSZ, FALSE },
5639     { "RELA", DT_RELA, DT_RELASZ, TRUE },
5640     { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
5641 };
5642
5643 /* Process the reloc section.  */
5644
5645 static int
5646 process_relocs (FILE * file)
5647 {
5648   unsigned long rel_size;
5649   unsigned long rel_offset;
5650
5651
5652   if (!do_reloc)
5653     return 1;
5654
5655   if (do_using_dynamic)
5656     {
5657       int is_rela;
5658       const char * name;
5659       int has_dynamic_reloc;
5660       unsigned int i;
5661
5662       has_dynamic_reloc = 0;
5663
5664       for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
5665         {
5666           is_rela = dynamic_relocations [i].rela;
5667           name = dynamic_relocations [i].name;
5668           rel_size = dynamic_info [dynamic_relocations [i].size];
5669           rel_offset = dynamic_info [dynamic_relocations [i].reloc];
5670
5671           has_dynamic_reloc |= rel_size;
5672
5673           if (is_rela == UNKNOWN)
5674             {
5675               if (dynamic_relocations [i].reloc == DT_JMPREL)
5676                 switch (dynamic_info[DT_PLTREL])
5677                   {
5678                   case DT_REL:
5679                     is_rela = FALSE;
5680                     break;
5681                   case DT_RELA:
5682                     is_rela = TRUE;
5683                     break;
5684                   }
5685             }
5686
5687           if (rel_size)
5688             {
5689               printf
5690                 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
5691                  name, rel_offset, rel_size);
5692
5693               dump_relocations (file,
5694                                 offset_from_vma (file, rel_offset, rel_size),
5695                                 rel_size,
5696                                 dynamic_symbols, num_dynamic_syms,
5697                                 dynamic_strings, dynamic_strings_length, is_rela);
5698             }
5699         }
5700
5701       if (is_ia64_vms ())
5702         has_dynamic_reloc |= process_ia64_vms_dynamic_relocs (file);
5703
5704       if (! has_dynamic_reloc)
5705         printf (_("\nThere are no dynamic relocations in this file.\n"));
5706     }
5707   else
5708     {
5709       Elf_Internal_Shdr * section;
5710       unsigned long i;
5711       int found = 0;
5712
5713       for (i = 0, section = section_headers;
5714            i < elf_header.e_shnum;
5715            i++, section++)
5716         {
5717           if (   section->sh_type != SHT_RELA
5718               && section->sh_type != SHT_REL)
5719             continue;
5720
5721           rel_offset = section->sh_offset;
5722           rel_size   = section->sh_size;
5723
5724           if (rel_size)
5725             {
5726               Elf_Internal_Shdr * strsec;
5727               int is_rela;
5728
5729               printf (_("\nRelocation section "));
5730
5731               if (string_table == NULL)
5732                 printf ("%d", section->sh_name);
5733               else
5734                 printf ("'%s'", SECTION_NAME (section));
5735
5736               printf (_(" at offset 0x%lx contains %lu entries:\n"),
5737                  rel_offset, (unsigned long) (rel_size / section->sh_entsize));
5738
5739               is_rela = section->sh_type == SHT_RELA;
5740
5741               if (section->sh_link != 0
5742                   && section->sh_link < elf_header.e_shnum)
5743                 {
5744                   Elf_Internal_Shdr * symsec;
5745                   Elf_Internal_Sym *  symtab;
5746                   unsigned long nsyms;
5747                   unsigned long strtablen = 0;
5748                   char * strtab = NULL;
5749
5750                   symsec = section_headers + section->sh_link;
5751                   if (symsec->sh_type != SHT_SYMTAB
5752                       && symsec->sh_type != SHT_DYNSYM)
5753                     continue;
5754
5755                   symtab = GET_ELF_SYMBOLS (file, symsec, & nsyms);
5756
5757                   if (symtab == NULL)
5758                     continue;
5759
5760                   if (symsec->sh_link != 0
5761                       && symsec->sh_link < elf_header.e_shnum)
5762                     {
5763                       strsec = section_headers + symsec->sh_link;
5764
5765                       strtab = (char *) get_data (NULL, file, strsec->sh_offset,
5766                                                   1, strsec->sh_size,
5767                                                   _("string table"));
5768                       strtablen = strtab == NULL ? 0 : strsec->sh_size;
5769                     }
5770
5771                   dump_relocations (file, rel_offset, rel_size,
5772                                     symtab, nsyms, strtab, strtablen, is_rela);
5773                   if (strtab)
5774                     free (strtab);
5775                   free (symtab);
5776                 }
5777               else
5778                 dump_relocations (file, rel_offset, rel_size,
5779                                   NULL, 0, NULL, 0, is_rela);
5780
5781               found = 1;
5782             }
5783         }
5784
5785       if (! found)
5786         printf (_("\nThere are no relocations in this file.\n"));
5787     }
5788
5789   return 1;
5790 }
5791
5792 /* Process the unwind section.  */
5793
5794 #include "unwind-ia64.h"
5795
5796 /* An absolute address consists of a section and an offset.  If the
5797    section is NULL, the offset itself is the address, otherwise, the
5798    address equals to LOAD_ADDRESS(section) + offset.  */
5799
5800 struct absaddr
5801   {
5802     unsigned short section;
5803     bfd_vma offset;
5804   };
5805
5806 #define ABSADDR(a) \
5807   ((a).section \
5808    ? section_headers [(a).section].sh_addr + (a).offset \
5809    : (a).offset)
5810
5811 struct ia64_unw_table_entry
5812   {
5813     struct absaddr start;
5814     struct absaddr end;
5815     struct absaddr info;
5816   };
5817
5818 struct ia64_unw_aux_info
5819   {
5820
5821     struct ia64_unw_table_entry *table; /* Unwind table.  */
5822     unsigned long table_len;    /* Length of unwind table.  */
5823     unsigned char * info;       /* Unwind info.  */
5824     unsigned long info_size;    /* Size of unwind info.  */
5825     bfd_vma info_addr;          /* starting address of unwind info.  */
5826     bfd_vma seg_base;           /* Starting address of segment.  */
5827     Elf_Internal_Sym * symtab;  /* The symbol table.  */
5828     unsigned long nsyms;        /* Number of symbols.  */
5829     char * strtab;              /* The string table.  */
5830     unsigned long strtab_size;  /* Size of string table.  */
5831   };
5832
5833 static void
5834 find_symbol_for_address (Elf_Internal_Sym * symtab,
5835                          unsigned long nsyms,
5836                          const char * strtab,
5837                          unsigned long strtab_size,
5838                          struct absaddr addr,
5839                          const char ** symname,
5840                          bfd_vma * offset)
5841 {
5842   bfd_vma dist = 0x100000;
5843   Elf_Internal_Sym * sym;
5844   Elf_Internal_Sym * best = NULL;
5845   unsigned long i;
5846
5847   REMOVE_ARCH_BITS (addr.offset);
5848
5849   for (i = 0, sym = symtab; i < nsyms; ++i, ++sym)
5850     {
5851       bfd_vma value = sym->st_value;
5852
5853       REMOVE_ARCH_BITS (value);
5854
5855       if (ELF_ST_TYPE (sym->st_info) == STT_FUNC
5856           && sym->st_name != 0
5857           && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
5858           && addr.offset >= value
5859           && addr.offset - value < dist)
5860         {
5861           best = sym;
5862           dist = addr.offset - value;
5863           if (!dist)
5864             break;
5865         }
5866     }
5867
5868   if (best)
5869     {
5870       *symname = (best->st_name >= strtab_size
5871                   ? _("<corrupt>") : strtab + best->st_name);
5872       *offset = dist;
5873       return;
5874     }
5875
5876   *symname = NULL;
5877   *offset = addr.offset;
5878 }
5879
5880 static void
5881 dump_ia64_unwind (struct ia64_unw_aux_info * aux)
5882 {
5883   struct ia64_unw_table_entry * tp;
5884   int in_body;
5885
5886   for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
5887     {
5888       bfd_vma stamp;
5889       bfd_vma offset;
5890       const unsigned char * dp;
5891       const unsigned char * head;
5892       const char * procname;
5893
5894       find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
5895                                aux->strtab_size, tp->start, &procname, &offset);
5896
5897       fputs ("\n<", stdout);
5898
5899       if (procname)
5900         {
5901           fputs (procname, stdout);
5902
5903           if (offset)
5904             printf ("+%lx", (unsigned long) offset);
5905         }
5906
5907       fputs (">: [", stdout);
5908       print_vma (tp->start.offset, PREFIX_HEX);
5909       fputc ('-', stdout);
5910       print_vma (tp->end.offset, PREFIX_HEX);
5911       printf ("], info at +0x%lx\n",
5912               (unsigned long) (tp->info.offset - aux->seg_base));
5913
5914       head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
5915       stamp = byte_get ((unsigned char *) head, sizeof (stamp));
5916
5917       printf ("  v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
5918               (unsigned) UNW_VER (stamp),
5919               (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
5920               UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
5921               UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
5922               (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
5923
5924       if (UNW_VER (stamp) != 1)
5925         {
5926           printf (_("\tUnknown version.\n"));
5927           continue;
5928         }
5929
5930       in_body = 0;
5931       for (dp = head + 8; dp < head + 8 + eh_addr_size * UNW_LENGTH (stamp);)
5932         dp = unw_decode (dp, in_body, & in_body);
5933     }
5934 }
5935
5936 static int
5937 slurp_ia64_unwind_table (FILE * file,
5938                          struct ia64_unw_aux_info * aux,
5939                          Elf_Internal_Shdr * sec)
5940 {
5941   unsigned long size, nrelas, i;
5942   Elf_Internal_Phdr * seg;
5943   struct ia64_unw_table_entry * tep;
5944   Elf_Internal_Shdr * relsec;
5945   Elf_Internal_Rela * rela;
5946   Elf_Internal_Rela * rp;
5947   unsigned char * table;
5948   unsigned char * tp;
5949   Elf_Internal_Sym * sym;
5950   const char * relname;
5951
5952   /* First, find the starting address of the segment that includes
5953      this section: */
5954
5955   if (elf_header.e_phnum)
5956     {
5957       if (! get_program_headers (file))
5958           return 0;
5959
5960       for (seg = program_headers;
5961            seg < program_headers + elf_header.e_phnum;
5962            ++seg)
5963         {
5964           if (seg->p_type != PT_LOAD)
5965             continue;
5966
5967           if (sec->sh_addr >= seg->p_vaddr
5968               && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
5969             {
5970               aux->seg_base = seg->p_vaddr;
5971               break;
5972             }
5973         }
5974     }
5975
5976   /* Second, build the unwind table from the contents of the unwind section:  */
5977   size = sec->sh_size;
5978   table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
5979                                       _("unwind table"));
5980   if (!table)
5981     return 0;
5982
5983   aux->table = (struct ia64_unw_table_entry *)
5984       xcmalloc (size / (3 * eh_addr_size), sizeof (aux->table[0]));
5985   tep = aux->table;
5986   for (tp = table; tp < table + size; ++tep)
5987     {
5988       tep->start.section = SHN_UNDEF;
5989       tep->end.section   = SHN_UNDEF;
5990       tep->info.section  = SHN_UNDEF;
5991       tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
5992       tep->end.offset   = byte_get (tp, eh_addr_size); tp += eh_addr_size;
5993       tep->info.offset  = byte_get (tp, eh_addr_size); tp += eh_addr_size;
5994       tep->start.offset += aux->seg_base;
5995       tep->end.offset   += aux->seg_base;
5996       tep->info.offset  += aux->seg_base;
5997     }
5998   free (table);
5999
6000   /* Third, apply any relocations to the unwind table:  */
6001   for (relsec = section_headers;
6002        relsec < section_headers + elf_header.e_shnum;
6003        ++relsec)
6004     {
6005       if (relsec->sh_type != SHT_RELA
6006           || relsec->sh_info >= elf_header.e_shnum
6007           || section_headers + relsec->sh_info != sec)
6008         continue;
6009
6010       if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
6011                               & rela, & nrelas))
6012         return 0;
6013
6014       for (rp = rela; rp < rela + nrelas; ++rp)
6015         {
6016           relname = elf_ia64_reloc_type (get_reloc_type (rp->r_info));
6017           sym = aux->symtab + get_reloc_symindex (rp->r_info);
6018
6019           if (! const_strneq (relname, "R_IA64_SEGREL"))
6020             {
6021               warn (_("Skipping unexpected relocation type %s\n"), relname);
6022               continue;
6023             }
6024
6025           i = rp->r_offset / (3 * eh_addr_size);
6026
6027           switch (rp->r_offset/eh_addr_size % 3)
6028             {
6029             case 0:
6030               aux->table[i].start.section = sym->st_shndx;
6031               aux->table[i].start.offset  = rp->r_addend + sym->st_value;
6032               break;
6033             case 1:
6034               aux->table[i].end.section   = sym->st_shndx;
6035               aux->table[i].end.offset    = rp->r_addend + sym->st_value;
6036               break;
6037             case 2:
6038               aux->table[i].info.section  = sym->st_shndx;
6039               aux->table[i].info.offset   = rp->r_addend + sym->st_value;
6040               break;
6041             default:
6042               break;
6043             }
6044         }
6045
6046       free (rela);
6047     }
6048
6049   aux->table_len = size / (3 * eh_addr_size);
6050   return 1;
6051 }
6052
6053 static void
6054 ia64_process_unwind (FILE * file)
6055 {
6056   Elf_Internal_Shdr * sec;
6057   Elf_Internal_Shdr * unwsec = NULL;
6058   Elf_Internal_Shdr * strsec;
6059   unsigned long i, unwcount = 0, unwstart = 0;
6060   struct ia64_unw_aux_info aux;
6061
6062   memset (& aux, 0, sizeof (aux));
6063
6064   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
6065     {
6066       if (sec->sh_type == SHT_SYMTAB
6067           && sec->sh_link < elf_header.e_shnum)
6068         {
6069           aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
6070
6071           strsec = section_headers + sec->sh_link;
6072           assert (aux.strtab == NULL);
6073           aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
6074                                           1, strsec->sh_size,
6075                                           _("string table"));
6076           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
6077         }
6078       else if (sec->sh_type == SHT_IA_64_UNWIND)
6079         unwcount++;
6080     }
6081
6082   if (!unwcount)
6083     printf (_("\nThere are no unwind sections in this file.\n"));
6084
6085   while (unwcount-- > 0)
6086     {
6087       char * suffix;
6088       size_t len, len2;
6089
6090       for (i = unwstart, sec = section_headers + unwstart;
6091            i < elf_header.e_shnum; ++i, ++sec)
6092         if (sec->sh_type == SHT_IA_64_UNWIND)
6093           {
6094             unwsec = sec;
6095             break;
6096           }
6097
6098       unwstart = i + 1;
6099       len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
6100
6101       if ((unwsec->sh_flags & SHF_GROUP) != 0)
6102         {
6103           /* We need to find which section group it is in.  */
6104           struct group_list * g = section_headers_groups [i]->root;
6105
6106           for (; g != NULL; g = g->next)
6107             {
6108               sec = section_headers + g->section_index;
6109
6110               if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
6111                 break;
6112             }
6113
6114           if (g == NULL)
6115             i = elf_header.e_shnum;
6116         }
6117       else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
6118         {
6119           /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO.  */
6120           len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
6121           suffix = SECTION_NAME (unwsec) + len;
6122           for (i = 0, sec = section_headers; i < elf_header.e_shnum;
6123                ++i, ++sec)
6124             if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
6125                 && streq (SECTION_NAME (sec) + len2, suffix))
6126               break;
6127         }
6128       else
6129         {
6130           /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
6131              .IA_64.unwind or BAR -> .IA_64.unwind_info.  */
6132           len = sizeof (ELF_STRING_ia64_unwind) - 1;
6133           len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
6134           suffix = "";
6135           if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
6136             suffix = SECTION_NAME (unwsec) + len;
6137           for (i = 0, sec = section_headers; i < elf_header.e_shnum;
6138                ++i, ++sec)
6139             if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
6140                 && streq (SECTION_NAME (sec) + len2, suffix))
6141               break;
6142         }
6143
6144       if (i == elf_header.e_shnum)
6145         {
6146           printf (_("\nCould not find unwind info section for "));
6147
6148           if (string_table == NULL)
6149             printf ("%d", unwsec->sh_name);
6150           else
6151             printf (_("'%s'"), SECTION_NAME (unwsec));
6152         }
6153       else
6154         {
6155           aux.info_addr = sec->sh_addr;
6156           aux.info = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1,
6157                                                  sec->sh_size,
6158                                                  _("unwind info"));
6159           aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
6160
6161           printf (_("\nUnwind section "));
6162
6163           if (string_table == NULL)
6164             printf ("%d", unwsec->sh_name);
6165           else
6166             printf (_("'%s'"), SECTION_NAME (unwsec));
6167
6168           printf (_(" at offset 0x%lx contains %lu entries:\n"),
6169                   (unsigned long) unwsec->sh_offset,
6170                   (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
6171
6172           (void) slurp_ia64_unwind_table (file, & aux, unwsec);
6173
6174           if (aux.table_len > 0)
6175             dump_ia64_unwind (& aux);
6176
6177           if (aux.table)
6178             free ((char *) aux.table);
6179           if (aux.info)
6180             free ((char *) aux.info);
6181           aux.table = NULL;
6182           aux.info = NULL;
6183         }
6184     }
6185
6186   if (aux.symtab)
6187     free (aux.symtab);
6188   if (aux.strtab)
6189     free ((char *) aux.strtab);
6190 }
6191
6192 struct hppa_unw_table_entry
6193   {
6194     struct absaddr start;
6195     struct absaddr end;
6196     unsigned int Cannot_unwind:1;                       /* 0 */
6197     unsigned int Millicode:1;                   /* 1 */
6198     unsigned int Millicode_save_sr0:1;          /* 2 */
6199     unsigned int Region_description:2;          /* 3..4 */
6200     unsigned int reserved1:1;                   /* 5 */
6201     unsigned int Entry_SR:1;                    /* 6 */
6202     unsigned int Entry_FR:4;     /* number saved */     /* 7..10 */
6203     unsigned int Entry_GR:5;     /* number saved */     /* 11..15 */
6204     unsigned int Args_stored:1;                 /* 16 */
6205     unsigned int Variable_Frame:1;                      /* 17 */
6206     unsigned int Separate_Package_Body:1;               /* 18 */
6207     unsigned int Frame_Extension_Millicode:1;   /* 19 */
6208     unsigned int Stack_Overflow_Check:1;                /* 20 */
6209     unsigned int Two_Instruction_SP_Increment:1;        /* 21 */
6210     unsigned int Ada_Region:1;                  /* 22 */
6211     unsigned int cxx_info:1;                    /* 23 */
6212     unsigned int cxx_try_catch:1;                       /* 24 */
6213     unsigned int sched_entry_seq:1;                     /* 25 */
6214     unsigned int reserved2:1;                   /* 26 */
6215     unsigned int Save_SP:1;                             /* 27 */
6216     unsigned int Save_RP:1;                             /* 28 */
6217     unsigned int Save_MRP_in_frame:1;           /* 29 */
6218     unsigned int extn_ptr_defined:1;            /* 30 */
6219     unsigned int Cleanup_defined:1;                     /* 31 */
6220
6221     unsigned int MPE_XL_interrupt_marker:1;             /* 0 */
6222     unsigned int HP_UX_interrupt_marker:1;              /* 1 */
6223     unsigned int Large_frame:1;                 /* 2 */
6224     unsigned int Pseudo_SP_Set:1;                       /* 3 */
6225     unsigned int reserved4:1;                   /* 4 */
6226     unsigned int Total_frame_size:27;           /* 5..31 */
6227   };
6228
6229 struct hppa_unw_aux_info
6230   {
6231     struct hppa_unw_table_entry *table; /* Unwind table.  */
6232     unsigned long table_len;    /* Length of unwind table.  */
6233     bfd_vma seg_base;           /* Starting address of segment.  */
6234     Elf_Internal_Sym * symtab;  /* The symbol table.  */
6235     unsigned long nsyms;        /* Number of symbols.  */
6236     char * strtab;              /* The string table.  */
6237     unsigned long strtab_size;  /* Size of string table.  */
6238   };
6239
6240 static void
6241 dump_hppa_unwind (struct hppa_unw_aux_info * aux)
6242 {
6243   struct hppa_unw_table_entry * tp;
6244
6245   for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
6246     {
6247       bfd_vma offset;
6248       const char * procname;
6249
6250       find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
6251                                aux->strtab_size, tp->start, &procname,
6252                                &offset);
6253
6254       fputs ("\n<", stdout);
6255
6256       if (procname)
6257         {
6258           fputs (procname, stdout);
6259
6260           if (offset)
6261             printf ("+%lx", (unsigned long) offset);
6262         }
6263
6264       fputs (">: [", stdout);
6265       print_vma (tp->start.offset, PREFIX_HEX);
6266       fputc ('-', stdout);
6267       print_vma (tp->end.offset, PREFIX_HEX);
6268       printf ("]\n\t");
6269
6270 #define PF(_m) if (tp->_m) printf (#_m " ");
6271 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
6272       PF(Cannot_unwind);
6273       PF(Millicode);
6274       PF(Millicode_save_sr0);
6275       /* PV(Region_description);  */
6276       PF(Entry_SR);
6277       PV(Entry_FR);
6278       PV(Entry_GR);
6279       PF(Args_stored);
6280       PF(Variable_Frame);
6281       PF(Separate_Package_Body);
6282       PF(Frame_Extension_Millicode);
6283       PF(Stack_Overflow_Check);
6284       PF(Two_Instruction_SP_Increment);
6285       PF(Ada_Region);
6286       PF(cxx_info);
6287       PF(cxx_try_catch);
6288       PF(sched_entry_seq);
6289       PF(Save_SP);
6290       PF(Save_RP);
6291       PF(Save_MRP_in_frame);
6292       PF(extn_ptr_defined);
6293       PF(Cleanup_defined);
6294       PF(MPE_XL_interrupt_marker);
6295       PF(HP_UX_interrupt_marker);
6296       PF(Large_frame);
6297       PF(Pseudo_SP_Set);
6298       PV(Total_frame_size);
6299 #undef PF
6300 #undef PV
6301     }
6302
6303   printf ("\n");
6304 }
6305
6306 static int
6307 slurp_hppa_unwind_table (FILE * file,
6308                          struct hppa_unw_aux_info * aux,
6309                          Elf_Internal_Shdr * sec)
6310 {
6311   unsigned long size, unw_ent_size, nentries, nrelas, i;
6312   Elf_Internal_Phdr * seg;
6313   struct hppa_unw_table_entry * tep;
6314   Elf_Internal_Shdr * relsec;
6315   Elf_Internal_Rela * rela;
6316   Elf_Internal_Rela * rp;
6317   unsigned char * table;
6318   unsigned char * tp;
6319   Elf_Internal_Sym * sym;
6320   const char * relname;
6321
6322   /* First, find the starting address of the segment that includes
6323      this section.  */
6324
6325   if (elf_header.e_phnum)
6326     {
6327       if (! get_program_headers (file))
6328         return 0;
6329
6330       for (seg = program_headers;
6331            seg < program_headers + elf_header.e_phnum;
6332            ++seg)
6333         {
6334           if (seg->p_type != PT_LOAD)
6335             continue;
6336
6337           if (sec->sh_addr >= seg->p_vaddr
6338               && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
6339             {
6340               aux->seg_base = seg->p_vaddr;
6341               break;
6342             }
6343         }
6344     }
6345
6346   /* Second, build the unwind table from the contents of the unwind
6347      section.  */
6348   size = sec->sh_size;
6349   table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
6350                                       _("unwind table"));
6351   if (!table)
6352     return 0;
6353
6354   unw_ent_size = 16;
6355   nentries = size / unw_ent_size;
6356   size = unw_ent_size * nentries;
6357
6358   tep = aux->table = (struct hppa_unw_table_entry *)
6359       xcmalloc (nentries, sizeof (aux->table[0]));
6360
6361   for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
6362     {
6363       unsigned int tmp1, tmp2;
6364
6365       tep->start.section = SHN_UNDEF;
6366       tep->end.section   = SHN_UNDEF;
6367
6368       tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
6369       tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
6370       tmp1 = byte_get ((unsigned char *) tp + 8, 4);
6371       tmp2 = byte_get ((unsigned char *) tp + 12, 4);
6372
6373       tep->start.offset += aux->seg_base;
6374       tep->end.offset   += aux->seg_base;
6375
6376       tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
6377       tep->Millicode = (tmp1 >> 30) & 0x1;
6378       tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
6379       tep->Region_description = (tmp1 >> 27) & 0x3;
6380       tep->reserved1 = (tmp1 >> 26) & 0x1;
6381       tep->Entry_SR = (tmp1 >> 25) & 0x1;
6382       tep->Entry_FR = (tmp1 >> 21) & 0xf;
6383       tep->Entry_GR = (tmp1 >> 16) & 0x1f;
6384       tep->Args_stored = (tmp1 >> 15) & 0x1;
6385       tep->Variable_Frame = (tmp1 >> 14) & 0x1;
6386       tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
6387       tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
6388       tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
6389       tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
6390       tep->Ada_Region = (tmp1 >> 9) & 0x1;
6391       tep->cxx_info = (tmp1 >> 8) & 0x1;
6392       tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
6393       tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
6394       tep->reserved2 = (tmp1 >> 5) & 0x1;
6395       tep->Save_SP = (tmp1 >> 4) & 0x1;
6396       tep->Save_RP = (tmp1 >> 3) & 0x1;
6397       tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
6398       tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
6399       tep->Cleanup_defined = tmp1 & 0x1;
6400
6401       tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
6402       tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
6403       tep->Large_frame = (tmp2 >> 29) & 0x1;
6404       tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
6405       tep->reserved4 = (tmp2 >> 27) & 0x1;
6406       tep->Total_frame_size = tmp2 & 0x7ffffff;
6407     }
6408   free (table);
6409
6410   /* Third, apply any relocations to the unwind table.  */
6411   for (relsec = section_headers;
6412        relsec < section_headers + elf_header.e_shnum;
6413        ++relsec)
6414     {
6415       if (relsec->sh_type != SHT_RELA
6416           || relsec->sh_info >= elf_header.e_shnum
6417           || section_headers + relsec->sh_info != sec)
6418         continue;
6419
6420       if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
6421                               & rela, & nrelas))
6422         return 0;
6423
6424       for (rp = rela; rp < rela + nrelas; ++rp)
6425         {
6426           relname = elf_hppa_reloc_type (get_reloc_type (rp->r_info));
6427           sym = aux->symtab + get_reloc_symindex (rp->r_info);
6428
6429           /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64.  */
6430           if (! const_strneq (relname, "R_PARISC_SEGREL"))
6431             {
6432               warn (_("Skipping unexpected relocation type %s\n"), relname);
6433               continue;
6434             }
6435
6436           i = rp->r_offset / unw_ent_size;
6437
6438           switch ((rp->r_offset % unw_ent_size) / eh_addr_size)
6439             {
6440             case 0:
6441               aux->table[i].start.section = sym->st_shndx;
6442               aux->table[i].start.offset  = sym->st_value + rp->r_addend;
6443               break;
6444             case 1:
6445               aux->table[i].end.section   = sym->st_shndx;
6446               aux->table[i].end.offset    = sym->st_value + rp->r_addend;
6447               break;
6448             default:
6449               break;
6450             }
6451         }
6452
6453       free (rela);
6454     }
6455
6456   aux->table_len = nentries;
6457
6458   return 1;
6459 }
6460
6461 static void
6462 hppa_process_unwind (FILE * file)
6463 {
6464   struct hppa_unw_aux_info aux;
6465   Elf_Internal_Shdr * unwsec = NULL;
6466   Elf_Internal_Shdr * strsec;
6467   Elf_Internal_Shdr * sec;
6468   unsigned long i;
6469
6470   if (string_table == NULL)
6471     return;
6472
6473   memset (& aux, 0, sizeof (aux));
6474
6475   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
6476     {
6477       if (sec->sh_type == SHT_SYMTAB
6478           && sec->sh_link < elf_header.e_shnum)
6479         {
6480           aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
6481
6482           strsec = section_headers + sec->sh_link;
6483           assert (aux.strtab == NULL);
6484           aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
6485                                           1, strsec->sh_size,
6486                                           _("string table"));
6487           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
6488         }
6489       else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
6490         unwsec = sec;
6491     }
6492
6493   if (!unwsec)
6494     printf (_("\nThere are no unwind sections in this file.\n"));
6495
6496   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
6497     {
6498       if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
6499         {
6500           printf (_("\nUnwind section "));
6501           printf (_("'%s'"), SECTION_NAME (sec));
6502
6503           printf (_(" at offset 0x%lx contains %lu entries:\n"),
6504                   (unsigned long) sec->sh_offset,
6505                   (unsigned long) (sec->sh_size / (2 * eh_addr_size + 8)));
6506
6507           slurp_hppa_unwind_table (file, &aux, sec);
6508           if (aux.table_len > 0)
6509             dump_hppa_unwind (&aux);
6510
6511           if (aux.table)
6512             free ((char *) aux.table);
6513           aux.table = NULL;
6514         }
6515     }
6516
6517   if (aux.symtab)
6518     free (aux.symtab);
6519   if (aux.strtab)
6520     free ((char *) aux.strtab);
6521 }
6522
6523 struct arm_section
6524 {
6525   unsigned char *      data;            /* The unwind data.  */
6526   Elf_Internal_Shdr *  sec;             /* The cached unwind section header.  */
6527   Elf_Internal_Rela *  rela;            /* The cached relocations for this section.  */
6528   unsigned long        nrelas;          /* The number of relocations.  */
6529   unsigned int         rel_type;        /* REL or RELA ?  */
6530   Elf_Internal_Rela *  next_rela;       /* Cyclic pointer to the next reloc to process.  */
6531 };
6532
6533 struct arm_unw_aux_info
6534 {
6535   FILE *              file;             /* The file containing the unwind sections.  */
6536   Elf_Internal_Sym *  symtab;           /* The file's symbol table.  */
6537   unsigned long       nsyms;            /* Number of symbols.  */
6538   char *              strtab;           /* The file's string table.  */
6539   unsigned long       strtab_size;      /* Size of string table.  */
6540 };
6541
6542 static const char *
6543 arm_print_vma_and_name (struct arm_unw_aux_info *aux,
6544                         bfd_vma fn, struct absaddr addr)
6545 {
6546   const char *procname;
6547   bfd_vma sym_offset;
6548
6549   if (addr.section == SHN_UNDEF)
6550     addr.offset = fn;
6551
6552   find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
6553                            aux->strtab_size, addr, &procname,
6554                            &sym_offset);
6555
6556   print_vma (fn, PREFIX_HEX);
6557
6558   if (procname)
6559     {
6560       fputs (" <", stdout);
6561       fputs (procname, stdout);
6562
6563       if (sym_offset)
6564         printf ("+0x%lx", (unsigned long) sym_offset);
6565       fputc ('>', stdout);
6566     }
6567
6568   return procname;
6569 }
6570
6571 static void
6572 arm_free_section (struct arm_section *arm_sec)
6573 {
6574   if (arm_sec->data != NULL)
6575     free (arm_sec->data);
6576
6577   if (arm_sec->rela != NULL)
6578     free (arm_sec->rela);
6579 }
6580
6581 /* 1) If SEC does not match the one cached in ARM_SEC, then free the current
6582       cached section and install SEC instead.
6583    2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
6584       and return its valued in * WORDP, relocating if necessary.
6585    3) Update the NEXT_RELA field in ARM_SEC and store the section index and
6586       relocation's offset in ADDR.
6587    4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
6588       into the string table of the symbol associated with the reloc.  If no
6589       reloc was applied store -1 there.
6590    5) Return TRUE upon success, FALSE otherwise.  */
6591
6592 static bfd_boolean
6593 get_unwind_section_word (struct arm_unw_aux_info *  aux,
6594                          struct arm_section *       arm_sec,
6595                          Elf_Internal_Shdr *        sec,
6596                          bfd_vma                    word_offset,
6597                          unsigned int *             wordp,
6598                          struct absaddr *           addr,
6599                          bfd_vma *                  sym_name)
6600 {
6601   Elf_Internal_Rela *rp;
6602   Elf_Internal_Sym *sym;
6603   const char * relname;
6604   unsigned int word;
6605   bfd_boolean wrapped;
6606
6607   addr->section = SHN_UNDEF;
6608   addr->offset = 0;
6609
6610   if (sym_name != NULL)
6611     *sym_name = (bfd_vma) -1;
6612
6613   /* If necessary, update the section cache.  */
6614   if (sec != arm_sec->sec)
6615     {
6616       Elf_Internal_Shdr *relsec;
6617
6618       arm_free_section (arm_sec);
6619
6620       arm_sec->sec = sec;
6621       arm_sec->data = get_data (NULL, aux->file, sec->sh_offset, 1,
6622                                 sec->sh_size, _("unwind data"));
6623       arm_sec->rela = NULL;
6624       arm_sec->nrelas = 0;
6625
6626       for (relsec = section_headers;
6627            relsec < section_headers + elf_header.e_shnum;
6628            ++relsec)
6629         {
6630           if (relsec->sh_info >= elf_header.e_shnum
6631               || section_headers + relsec->sh_info != sec
6632               /* PR 15745: Check the section type as well.  */
6633               || (relsec->sh_type != SHT_REL
6634                   && relsec->sh_type != SHT_RELA))
6635             continue;
6636
6637           arm_sec->rel_type = relsec->sh_type;
6638           if (relsec->sh_type == SHT_REL)
6639             {
6640               if (!slurp_rel_relocs (aux->file, relsec->sh_offset,
6641                                      relsec->sh_size,
6642                                      & arm_sec->rela, & arm_sec->nrelas))
6643                 return FALSE;
6644             }
6645           else /* relsec->sh_type == SHT_RELA */
6646             {
6647               if (!slurp_rela_relocs (aux->file, relsec->sh_offset,
6648                                       relsec->sh_size,
6649                                       & arm_sec->rela, & arm_sec->nrelas))
6650                 return FALSE;
6651             }
6652           break;
6653         }
6654
6655       arm_sec->next_rela = arm_sec->rela;
6656     }
6657
6658   /* If there is no unwind data we can do nothing.  */
6659   if (arm_sec->data == NULL)
6660     return FALSE;
6661
6662   /* Get the word at the required offset.  */
6663   word = byte_get (arm_sec->data + word_offset, 4);
6664
6665   /* Look through the relocs to find the one that applies to the provided offset.  */
6666   wrapped = FALSE;
6667   for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
6668     {
6669       bfd_vma prelval, offset;
6670
6671       if (rp->r_offset > word_offset && !wrapped)
6672         {
6673           rp = arm_sec->rela;
6674           wrapped = TRUE;
6675         }
6676       if (rp->r_offset > word_offset)
6677         break;
6678
6679       if (rp->r_offset & 3)
6680         {
6681           warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
6682                 (unsigned long) rp->r_offset);
6683           continue;
6684         }
6685
6686       if (rp->r_offset < word_offset)
6687         continue;
6688
6689       sym = aux->symtab + ELF32_R_SYM (rp->r_info);
6690
6691       if (arm_sec->rel_type == SHT_REL)
6692         {
6693           offset = word & 0x7fffffff;
6694           if (offset & 0x40000000)
6695             offset |= ~ (bfd_vma) 0x7fffffff;
6696         }
6697       else if (arm_sec->rel_type == SHT_RELA)
6698         offset = rp->r_addend;
6699       else
6700         abort ();
6701
6702       offset += sym->st_value;
6703       prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
6704
6705       /* Check that we are processing the expected reloc type.  */
6706       if (elf_header.e_machine == EM_ARM)
6707         {
6708           relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
6709
6710           if (streq (relname, "R_ARM_NONE"))
6711               continue;
6712           
6713           if (! streq (relname, "R_ARM_PREL31"))
6714             {
6715               warn (_("Skipping unexpected relocation type %s\n"), relname);
6716               continue;
6717             }
6718         }
6719       else if (elf_header.e_machine == EM_TI_C6000)
6720         {
6721           relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
6722           
6723           if (streq (relname, "R_C6000_NONE"))
6724             continue;
6725
6726           if (! streq (relname, "R_C6000_PREL31"))
6727             {
6728               warn (_("Skipping unexpected relocation type %s\n"), relname);
6729               continue;
6730             }
6731
6732           prelval >>= 1;
6733         }
6734       else
6735         /* This function currently only supports ARM and TI unwinders.  */
6736         abort ();
6737
6738       word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
6739       addr->section = sym->st_shndx;
6740       addr->offset = offset;
6741       if (sym_name)
6742         * sym_name = sym->st_name;
6743       break;
6744     }
6745
6746   *wordp = word;
6747   arm_sec->next_rela = rp;
6748
6749   return TRUE;
6750 }
6751
6752 static const char *tic6x_unwind_regnames[16] =
6753 {
6754   "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3", 
6755   "A14", "A13", "A12", "A11", "A10", 
6756   "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
6757 };
6758
6759 static void
6760 decode_tic6x_unwind_regmask (unsigned int mask)
6761 {
6762   int i;
6763
6764   for (i = 12; mask; mask >>= 1, i--)
6765     {
6766       if (mask & 1)
6767         {
6768           fputs (tic6x_unwind_regnames[i], stdout);
6769           if (mask > 1)
6770             fputs (", ", stdout);
6771         }
6772     }
6773 }
6774
6775 #define ADVANCE                                                 \
6776   if (remaining == 0 && more_words)                             \
6777     {                                                           \
6778       data_offset += 4;                                         \
6779       if (! get_unwind_section_word (aux, data_arm_sec, data_sec,       \
6780                                      data_offset, & word, & addr, NULL))        \
6781         return;                                                 \
6782       remaining = 4;                                            \
6783       more_words--;                                             \
6784     }                                                           \
6785
6786 #define GET_OP(OP)                      \
6787   ADVANCE;                              \
6788   if (remaining)                        \
6789     {                                   \
6790       remaining--;                      \
6791       (OP) = word >> 24;                \
6792       word <<= 8;                       \
6793     }                                   \
6794   else                                  \
6795     {                                   \
6796       printf (_("[Truncated opcode]\n"));       \
6797       return;                           \
6798     }                                   \
6799   printf ("0x%02x ", OP)
6800
6801 static void
6802 decode_arm_unwind_bytecode (struct arm_unw_aux_info *aux,
6803                             unsigned int word, unsigned int remaining,
6804                             unsigned int more_words,
6805                             bfd_vma data_offset, Elf_Internal_Shdr *data_sec,
6806                             struct arm_section *data_arm_sec)
6807 {
6808   struct absaddr addr;
6809
6810   /* Decode the unwinding instructions.  */
6811   while (1)
6812     {
6813       unsigned int op, op2;
6814
6815       ADVANCE;
6816       if (remaining == 0)
6817         break;
6818       remaining--;
6819       op = word >> 24;
6820       word <<= 8;
6821
6822       printf ("  0x%02x ", op);
6823
6824       if ((op & 0xc0) == 0x00)
6825         {
6826           int offset = ((op & 0x3f) << 2) + 4;
6827
6828           printf ("     vsp = vsp + %d", offset);
6829         }
6830       else if ((op & 0xc0) == 0x40)
6831         {
6832           int offset = ((op & 0x3f) << 2) + 4;
6833
6834           printf ("     vsp = vsp - %d", offset);
6835         }
6836       else if ((op & 0xf0) == 0x80)
6837         {
6838           GET_OP (op2);
6839           if (op == 0x80 && op2 == 0)
6840             printf (_("Refuse to unwind"));
6841           else
6842             {
6843               unsigned int mask = ((op & 0x0f) << 8) | op2;
6844               int first = 1;
6845               int i;
6846
6847               printf ("pop {");
6848               for (i = 0; i < 12; i++)
6849                 if (mask & (1 << i))
6850                   {
6851                     if (first)
6852                       first = 0;
6853                     else
6854                       printf (", ");
6855                     printf ("r%d", 4 + i);
6856                   }
6857               printf ("}");
6858             }
6859         }
6860       else if ((op & 0xf0) == 0x90)
6861         {
6862           if (op == 0x9d || op == 0x9f)
6863             printf (_("     [Reserved]"));
6864           else
6865             printf ("     vsp = r%d", op & 0x0f);
6866         }
6867       else if ((op & 0xf0) == 0xa0)
6868         {
6869           int end = 4 + (op & 0x07);
6870           int first = 1;
6871           int i;
6872
6873           printf ("     pop {");
6874           for (i = 4; i <= end; i++)
6875             {
6876               if (first)
6877                 first = 0;
6878               else
6879                 printf (", ");
6880               printf ("r%d", i);
6881             }
6882           if (op & 0x08)
6883             {
6884               if (!first)
6885                 printf (", ");
6886               printf ("r14");
6887             }
6888           printf ("}");
6889         }
6890       else if (op == 0xb0)
6891         printf (_("     finish"));
6892       else if (op == 0xb1)
6893         {
6894           GET_OP (op2);
6895           if (op2 == 0 || (op2 & 0xf0) != 0)
6896             printf (_("[Spare]"));
6897           else
6898             {
6899               unsigned int mask = op2 & 0x0f;
6900               int first = 1;
6901               int i;
6902
6903               printf ("pop {");
6904               for (i = 0; i < 12; i++)
6905                 if (mask & (1 << i))
6906                   {
6907                     if (first)
6908                       first = 0;
6909                     else
6910                       printf (", ");
6911                     printf ("r%d", i);
6912                   }
6913               printf ("}");
6914             }
6915         }
6916       else if (op == 0xb2)
6917         {
6918           unsigned char buf[9];
6919           unsigned int i, len;
6920           unsigned long offset;
6921
6922           for (i = 0; i < sizeof (buf); i++)
6923             {
6924               GET_OP (buf[i]);
6925               if ((buf[i] & 0x80) == 0)
6926                 break;
6927             }
6928           assert (i < sizeof (buf));
6929           offset = read_uleb128 (buf, &len, buf + i + 1);
6930           assert (len == i + 1);
6931           offset = offset * 4 + 0x204;
6932           printf ("vsp = vsp + %ld", offset);
6933         }
6934       else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
6935         {
6936           unsigned int first, last;
6937
6938           GET_OP (op2);
6939           first = op2 >> 4;
6940           last = op2 & 0x0f;
6941           if (op == 0xc8)
6942             first = first + 16;
6943           printf ("pop {D%d", first);
6944           if (last)
6945             printf ("-D%d", first + last);
6946           printf ("}");
6947         }
6948       else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
6949         {
6950           unsigned int count = op & 0x07;
6951
6952           printf ("pop {D8");
6953           if (count)
6954             printf ("-D%d", 8 + count);
6955           printf ("}");
6956         }
6957       else if (op >= 0xc0 && op <= 0xc5)
6958         {
6959           unsigned int count = op & 0x07;
6960
6961           printf ("     pop {wR10");
6962           if (count)
6963             printf ("-wR%d", 10 + count);
6964           printf ("}");
6965         }
6966       else if (op == 0xc6)
6967         {
6968           unsigned int first, last;
6969
6970           GET_OP (op2);
6971           first = op2 >> 4;
6972           last = op2 & 0x0f;
6973           printf ("pop {wR%d", first);
6974           if (last)
6975             printf ("-wR%d", first + last);
6976           printf ("}");
6977         }
6978       else if (op == 0xc7)
6979         {
6980           GET_OP (op2);
6981           if (op2 == 0 || (op2 & 0xf0) != 0)
6982             printf (_("[Spare]"));
6983           else
6984             {
6985               unsigned int mask = op2 & 0x0f;
6986               int first = 1;
6987               int i;
6988
6989               printf ("pop {");
6990               for (i = 0; i < 4; i++)
6991                 if (mask & (1 << i))
6992                   {
6993                     if (first)
6994                       first = 0;
6995                     else
6996                       printf (", ");
6997                     printf ("wCGR%d", i);
6998                   }
6999               printf ("}");
7000             }
7001         }
7002       else
7003         printf (_("     [unsupported opcode]"));
7004       printf ("\n");
7005     }
7006 }
7007
7008 static void
7009 decode_tic6x_unwind_bytecode (struct arm_unw_aux_info *aux,
7010                             unsigned int word, unsigned int remaining,
7011                             unsigned int more_words,
7012                             bfd_vma data_offset, Elf_Internal_Shdr *data_sec,
7013                             struct arm_section *data_arm_sec)
7014 {
7015   struct absaddr addr;
7016
7017   /* Decode the unwinding instructions.  */
7018   while (1)
7019     {
7020       unsigned int op, op2;
7021
7022       ADVANCE;
7023       if (remaining == 0)
7024         break;
7025       remaining--;
7026       op = word >> 24;
7027       word <<= 8;
7028
7029       printf ("  0x%02x ", op);
7030
7031       if ((op & 0xc0) == 0x00)
7032         {
7033           int offset = ((op & 0x3f) << 3) + 8;
7034           printf ("     sp = sp + %d", offset);
7035         }
7036       else if ((op & 0xc0) == 0x80)
7037         {
7038           GET_OP (op2);
7039           if (op == 0x80 && op2 == 0)
7040             printf (_("Refuse to unwind"));
7041           else
7042             {
7043               unsigned int mask = ((op & 0x1f) << 8) | op2;
7044               if (op & 0x20)
7045                 printf ("pop compact {");
7046               else
7047                 printf ("pop {");
7048
7049               decode_tic6x_unwind_regmask (mask);
7050               printf("}");
7051             }
7052         }
7053       else if ((op & 0xf0) == 0xc0)
7054         {
7055           unsigned int reg;
7056           unsigned int nregs;
7057           unsigned int i;
7058           const char *name;
7059           struct
7060           {
7061               unsigned int offset;
7062               unsigned int reg;
7063           } regpos[16];
7064
7065           /* Scan entire instruction first so that GET_OP output is not
7066              interleaved with disassembly.  */
7067           nregs = 0;
7068           for (i = 0; nregs < (op & 0xf); i++)
7069             {
7070               GET_OP (op2);
7071               reg = op2 >> 4;
7072               if (reg != 0xf)
7073                 {
7074                   regpos[nregs].offset = i * 2;
7075                   regpos[nregs].reg = reg;
7076                   nregs++;
7077                 }
7078
7079               reg = op2 & 0xf;
7080               if (reg != 0xf)
7081                 {
7082                   regpos[nregs].offset = i * 2 + 1;
7083                   regpos[nregs].reg = reg;
7084                   nregs++;
7085                 }
7086             }
7087
7088           printf (_("pop frame {"));
7089           reg = nregs - 1;
7090           for (i = i * 2; i > 0; i--)
7091             {
7092               if (regpos[reg].offset == i - 1)
7093                 {
7094                   name = tic6x_unwind_regnames[regpos[reg].reg];
7095                   if (reg > 0)
7096                     reg--;
7097                 }
7098               else
7099                 name = _("[pad]");
7100
7101               fputs (name, stdout);
7102               if (i > 1)
7103                 printf (", ");
7104             }
7105
7106           printf ("}");
7107         }
7108       else if (op == 0xd0)
7109         printf ("     MOV FP, SP");
7110       else if (op == 0xd1)
7111         printf ("     __c6xabi_pop_rts");
7112       else if (op == 0xd2)
7113         {
7114           unsigned char buf[9];
7115           unsigned int i, len;
7116           unsigned long offset;
7117
7118           for (i = 0; i < sizeof (buf); i++)
7119             {
7120               GET_OP (buf[i]);
7121               if ((buf[i] & 0x80) == 0)
7122                 break;
7123             }
7124           assert (i < sizeof (buf));
7125           offset = read_uleb128 (buf, &len, buf + i + 1);
7126           assert (len == i + 1);
7127           offset = offset * 8 + 0x408;
7128           printf (_("sp = sp + %ld"), offset);
7129         }
7130       else if ((op & 0xf0) == 0xe0)
7131         {
7132           if ((op & 0x0f) == 7)
7133             printf ("     RETURN");
7134           else
7135             printf ("     MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
7136         }
7137       else
7138         {
7139           printf (_("     [unsupported opcode]"));
7140         }
7141       putchar ('\n');
7142     }
7143 }
7144
7145 static bfd_vma
7146 arm_expand_prel31 (bfd_vma word, bfd_vma where)
7147 {
7148   bfd_vma offset;
7149
7150   offset = word & 0x7fffffff;
7151   if (offset & 0x40000000)
7152     offset |= ~ (bfd_vma) 0x7fffffff;
7153
7154   if (elf_header.e_machine == EM_TI_C6000)
7155     offset <<= 1;
7156
7157   return offset + where;
7158 }
7159
7160 static void
7161 decode_arm_unwind (struct arm_unw_aux_info *  aux,
7162                    unsigned int               word,
7163                    unsigned int               remaining,
7164                    bfd_vma                    data_offset,
7165                    Elf_Internal_Shdr *        data_sec,
7166                    struct arm_section *       data_arm_sec)
7167 {
7168   int per_index;
7169   unsigned int more_words = 0;
7170   struct absaddr addr;
7171   bfd_vma sym_name = (bfd_vma) -1;
7172
7173   if (remaining == 0)
7174     {
7175       /* Fetch the first word.
7176          Note - when decoding an object file the address extracted
7177          here will always be 0.  So we also pass in the sym_name
7178          parameter so that we can find the symbol associated with
7179          the personality routine.  */
7180       if (! get_unwind_section_word (aux, data_arm_sec, data_sec, data_offset,
7181                                      & word, & addr, & sym_name))
7182         return;
7183
7184       remaining = 4;
7185     }
7186
7187   if ((word & 0x80000000) == 0)
7188     {
7189       /* Expand prel31 for personality routine.  */
7190       bfd_vma fn;
7191       const char *procname;
7192
7193       fn = arm_expand_prel31 (word, data_sec->sh_addr + data_offset);
7194       printf (_("  Personality routine: "));
7195       if (fn == 0
7196           && addr.section == SHN_UNDEF && addr.offset == 0
7197           && sym_name != (bfd_vma) -1 && sym_name < aux->strtab_size)
7198         {
7199           procname = aux->strtab + sym_name;
7200           print_vma (fn, PREFIX_HEX);
7201           if (procname)
7202             {
7203               fputs (" <", stdout);
7204               fputs (procname, stdout);
7205               fputc ('>', stdout);
7206             }
7207         }
7208       else
7209         procname = arm_print_vma_and_name (aux, fn, addr);
7210       fputc ('\n', stdout);
7211
7212       /* The GCC personality routines use the standard compact
7213          encoding, starting with one byte giving the number of
7214          words.  */
7215       if (procname != NULL
7216           && (const_strneq (procname, "__gcc_personality_v0")
7217               || const_strneq (procname, "__gxx_personality_v0")
7218               || const_strneq (procname, "__gcj_personality_v0")
7219               || const_strneq (procname, "__gnu_objc_personality_v0")))
7220         {
7221           remaining = 0;
7222           more_words = 1;
7223           ADVANCE;
7224           if (!remaining)
7225             {
7226               printf (_("  [Truncated data]\n"));
7227               return;
7228             }
7229           more_words = word >> 24;
7230           word <<= 8;
7231           remaining--;
7232           per_index = -1;
7233         }
7234       else
7235         return;
7236     }
7237   else
7238     {
7239       /* ARM EHABI Section 6.3:
7240          
7241          An exception-handling table entry for the compact model looks like:
7242          
7243            31 30-28 27-24 23-0
7244            -- ----- ----- ----
7245             1   0   index Data for personalityRoutine[index]    */
7246
7247       if (elf_header.e_machine == EM_ARM
7248           && (word & 0x70000000))
7249         warn (_("Corrupt ARM compact model table entry: %x \n"), word);
7250
7251       per_index = (word >> 24) & 0x7f;
7252       printf (_("  Compact model index: %d\n"), per_index);
7253       if (per_index == 0)
7254         {
7255           more_words = 0;
7256           word <<= 8;
7257           remaining--;
7258         }
7259       else if (per_index < 3)
7260         {
7261           more_words = (word >> 16) & 0xff;
7262           word <<= 16;
7263           remaining -= 2;
7264         }
7265     }
7266
7267   switch (elf_header.e_machine)
7268     {
7269     case EM_ARM:
7270       if (per_index < 3)
7271         {
7272           decode_arm_unwind_bytecode (aux, word, remaining, more_words,
7273                                       data_offset, data_sec, data_arm_sec);
7274         }
7275       else
7276         {
7277           warn (_("Unknown ARM compact model index encountered\n"));
7278           printf (_("  [reserved]\n"));
7279         }
7280       break;
7281
7282     case EM_TI_C6000:
7283       if (per_index < 3)
7284         {
7285           decode_tic6x_unwind_bytecode (aux, word, remaining, more_words,
7286                                         data_offset, data_sec, data_arm_sec);
7287         }
7288       else if (per_index < 5)
7289         {
7290           if (((word >> 17) & 0x7f) == 0x7f)
7291             printf (_("  Restore stack from frame pointer\n"));
7292           else
7293             printf (_("  Stack increment %d\n"), (word >> 14) & 0x1fc);
7294           printf (_("  Registers restored: "));
7295           if (per_index == 4)
7296             printf (" (compact) ");
7297           decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
7298           putchar ('\n');
7299           printf (_("  Return register: %s\n"),
7300                   tic6x_unwind_regnames[word & 0xf]);
7301         }
7302       else
7303         printf (_("  [reserved (%d)]\n"), per_index);
7304       break;
7305
7306     default:
7307       error (_("Unsupported architecture type %d encountered when decoding unwind table"),
7308              elf_header.e_machine);
7309     }
7310
7311   /* Decode the descriptors.  Not implemented.  */
7312 }
7313
7314 static void
7315 dump_arm_unwind (struct arm_unw_aux_info *aux, Elf_Internal_Shdr *exidx_sec)
7316 {
7317   struct arm_section exidx_arm_sec, extab_arm_sec;
7318   unsigned int i, exidx_len;
7319
7320   memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
7321   memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
7322   exidx_len = exidx_sec->sh_size / 8;
7323
7324   for (i = 0; i < exidx_len; i++)
7325     {
7326       unsigned int exidx_fn, exidx_entry;
7327       struct absaddr fn_addr, entry_addr;
7328       bfd_vma fn;
7329
7330       fputc ('\n', stdout);
7331
7332       if (! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
7333                                      8 * i, & exidx_fn, & fn_addr, NULL)
7334           || ! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
7335                                         8 * i + 4, & exidx_entry, & entry_addr, NULL))
7336         {
7337           arm_free_section (& exidx_arm_sec);
7338           arm_free_section (& extab_arm_sec);
7339           return;
7340         }
7341
7342       /* ARM EHABI, Section 5:
7343          An index table entry consists of 2 words.
7344          The first word contains a prel31 offset to the start of a function, with bit 31 clear.  */
7345       if (exidx_fn & 0x80000000)
7346         warn (_("corrupt index table entry: %x\n"), exidx_fn);
7347
7348       fn = arm_expand_prel31 (exidx_fn, exidx_sec->sh_addr + 8 * i);
7349
7350       arm_print_vma_and_name (aux, fn, fn_addr);
7351       fputs (": ", stdout);
7352
7353       if (exidx_entry == 1)
7354         {
7355           print_vma (exidx_entry, PREFIX_HEX);
7356           fputs (" [cantunwind]\n", stdout);
7357         }
7358       else if (exidx_entry & 0x80000000)
7359         {
7360           print_vma (exidx_entry, PREFIX_HEX);
7361           fputc ('\n', stdout);
7362           decode_arm_unwind (aux, exidx_entry, 4, 0, NULL, NULL);
7363         }
7364       else
7365         {
7366           bfd_vma table, table_offset = 0;
7367           Elf_Internal_Shdr *table_sec;
7368
7369           fputs ("@", stdout);
7370           table = arm_expand_prel31 (exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
7371           print_vma (table, PREFIX_HEX);
7372           printf ("\n");
7373
7374           /* Locate the matching .ARM.extab.  */
7375           if (entry_addr.section != SHN_UNDEF
7376               && entry_addr.section < elf_header.e_shnum)
7377             {
7378               table_sec = section_headers + entry_addr.section;
7379               table_offset = entry_addr.offset;
7380             }
7381           else
7382             {
7383               table_sec = find_section_by_address (table);
7384               if (table_sec != NULL)
7385                 table_offset = table - table_sec->sh_addr;
7386             }
7387           if (table_sec == NULL)
7388             {
7389               warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
7390                     (unsigned long) table);
7391               continue;
7392             }
7393           decode_arm_unwind (aux, 0, 0, table_offset, table_sec,
7394                              &extab_arm_sec);
7395         }
7396     }
7397
7398   printf ("\n");
7399
7400   arm_free_section (&exidx_arm_sec);
7401   arm_free_section (&extab_arm_sec);
7402 }
7403
7404 /* Used for both ARM and C6X unwinding tables.  */
7405
7406 static void
7407 arm_process_unwind (FILE *file)
7408 {
7409   struct arm_unw_aux_info aux;
7410   Elf_Internal_Shdr *unwsec = NULL;
7411   Elf_Internal_Shdr *strsec;
7412   Elf_Internal_Shdr *sec;
7413   unsigned long i;
7414   unsigned int sec_type;
7415
7416   switch (elf_header.e_machine)
7417     {
7418     case EM_ARM:
7419       sec_type = SHT_ARM_EXIDX;
7420       break;
7421
7422     case EM_TI_C6000:
7423       sec_type = SHT_C6000_UNWIND;
7424       break;
7425
7426     default: 
7427       error (_("Unsupported architecture type %d encountered when processing unwind table"),
7428              elf_header.e_machine);
7429       return;
7430     }
7431
7432   if (string_table == NULL)
7433     return;
7434
7435   memset (& aux, 0, sizeof (aux));
7436   aux.file = file;
7437
7438   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7439     {
7440       if (sec->sh_type == SHT_SYMTAB && sec->sh_link < elf_header.e_shnum)
7441         {
7442           aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
7443
7444           strsec = section_headers + sec->sh_link;
7445           assert (aux.strtab == NULL);
7446           aux.strtab = get_data (NULL, file, strsec->sh_offset,
7447                                  1, strsec->sh_size, _("string table"));
7448           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7449         }
7450       else if (sec->sh_type == sec_type)
7451         unwsec = sec;
7452     }
7453
7454   if (unwsec == NULL)
7455     printf (_("\nThere are no unwind sections in this file.\n"));
7456   else
7457     for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7458       {
7459         if (sec->sh_type == sec_type)
7460           {
7461             printf (_("\nUnwind table index '%s' at offset 0x%lx contains %lu entries:\n"),
7462                     SECTION_NAME (sec),
7463                     (unsigned long) sec->sh_offset,
7464                     (unsigned long) (sec->sh_size / (2 * eh_addr_size)));
7465
7466             dump_arm_unwind (&aux, sec);
7467           }
7468       }
7469
7470   if (aux.symtab)
7471     free (aux.symtab);
7472   if (aux.strtab)
7473     free ((char *) aux.strtab);
7474 }
7475
7476 static void
7477 process_unwind (FILE * file)
7478 {
7479   struct unwind_handler
7480   {
7481     int machtype;
7482     void (* handler)(FILE *);
7483   } handlers[] =
7484   {
7485     { EM_ARM, arm_process_unwind },
7486     { EM_IA_64, ia64_process_unwind },
7487     { EM_PARISC, hppa_process_unwind },
7488     { EM_TI_C6000, arm_process_unwind },
7489     { 0, 0 }
7490   };
7491   int i;
7492
7493   if (!do_unwind)
7494     return;
7495
7496   for (i = 0; handlers[i].handler != NULL; i++)
7497     if (elf_header.e_machine == handlers[i].machtype)
7498       {
7499         handlers[i].handler (file);
7500         return;
7501       }
7502
7503   printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
7504           get_machine_name (elf_header.e_machine));
7505 }
7506
7507 static void
7508 dynamic_section_mips_val (Elf_Internal_Dyn * entry)
7509 {
7510   switch (entry->d_tag)
7511     {
7512     case DT_MIPS_FLAGS:
7513       if (entry->d_un.d_val == 0)
7514         printf (_("NONE"));
7515       else
7516         {
7517           static const char * opts[] =
7518           {
7519             "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
7520             "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
7521             "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
7522             "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
7523             "RLD_ORDER_SAFE"
7524           };
7525           unsigned int cnt;
7526           int first = 1;
7527
7528           for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
7529             if (entry->d_un.d_val & (1 << cnt))
7530               {
7531                 printf ("%s%s", first ? "" : " ", opts[cnt]);
7532                 first = 0;
7533               }
7534         }
7535       break;
7536
7537     case DT_MIPS_IVERSION:
7538       if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
7539         printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry->d_un.d_val));
7540       else
7541         printf (_("<corrupt: %" BFD_VMA_FMT "d>"), entry->d_un.d_ptr);
7542       break;
7543
7544     case DT_MIPS_TIME_STAMP:
7545       {
7546         char timebuf[20];
7547         struct tm * tmp;
7548
7549         time_t atime = entry->d_un.d_val;
7550         tmp = gmtime (&atime);
7551         snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
7552                   tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
7553                   tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
7554         printf (_("Time Stamp: %s"), timebuf);
7555       }
7556       break;
7557
7558     case DT_MIPS_RLD_VERSION:
7559     case DT_MIPS_LOCAL_GOTNO:
7560     case DT_MIPS_CONFLICTNO:
7561     case DT_MIPS_LIBLISTNO:
7562     case DT_MIPS_SYMTABNO:
7563     case DT_MIPS_UNREFEXTNO:
7564     case DT_MIPS_HIPAGENO:
7565     case DT_MIPS_DELTA_CLASS_NO:
7566     case DT_MIPS_DELTA_INSTANCE_NO:
7567     case DT_MIPS_DELTA_RELOC_NO:
7568     case DT_MIPS_DELTA_SYM_NO:
7569     case DT_MIPS_DELTA_CLASSSYM_NO:
7570     case DT_MIPS_COMPACT_SIZE:
7571       print_vma (entry->d_un.d_ptr, DEC);
7572       break;
7573
7574     default:
7575       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
7576     }
7577     putchar ('\n');
7578 }
7579
7580 static void
7581 dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
7582 {
7583   switch (entry->d_tag)
7584     {
7585     case DT_HP_DLD_FLAGS:
7586       {
7587         static struct
7588         {
7589           long int bit;
7590           const char * str;
7591         }
7592         flags[] =
7593         {
7594           { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
7595           { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
7596           { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
7597           { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
7598           { DT_HP_BIND_NOW, "HP_BIND_NOW" },
7599           { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
7600           { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
7601           { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
7602           { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
7603           { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
7604           { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
7605           { DT_HP_GST, "HP_GST" },
7606           { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
7607           { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
7608           { DT_HP_NODELETE, "HP_NODELETE" },
7609           { DT_HP_GROUP, "HP_GROUP" },
7610           { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
7611         };
7612         int first = 1;
7613         size_t cnt;
7614         bfd_vma val = entry->d_un.d_val;
7615
7616         for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
7617           if (val & flags[cnt].bit)
7618             {
7619               if (! first)
7620                 putchar (' ');
7621               fputs (flags[cnt].str, stdout);
7622               first = 0;
7623               val ^= flags[cnt].bit;
7624             }
7625
7626         if (val != 0 || first)
7627           {
7628             if (! first)
7629               putchar (' ');
7630             print_vma (val, HEX);
7631           }
7632       }
7633       break;
7634
7635     default:
7636       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
7637       break;
7638     }
7639   putchar ('\n');
7640 }
7641
7642 #ifdef BFD64
7643
7644 /* VMS vs Unix time offset and factor.  */
7645
7646 #define VMS_EPOCH_OFFSET 35067168000000000LL
7647 #define VMS_GRANULARITY_FACTOR 10000000
7648
7649 /* Display a VMS time in a human readable format.  */
7650
7651 static void
7652 print_vms_time (bfd_int64_t vmstime)
7653 {
7654   struct tm *tm;
7655   time_t unxtime;
7656
7657   unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
7658   tm = gmtime (&unxtime);
7659   printf ("%04u-%02u-%02uT%02u:%02u:%02u",
7660           tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
7661           tm->tm_hour, tm->tm_min, tm->tm_sec);
7662 }
7663 #endif /* BFD64 */
7664
7665 static void
7666 dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
7667 {
7668   switch (entry->d_tag)
7669     {
7670     case DT_IA_64_PLT_RESERVE:
7671       /* First 3 slots reserved.  */
7672       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
7673       printf (" -- ");
7674       print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
7675       break;
7676
7677     case DT_IA_64_VMS_LINKTIME:
7678 #ifdef BFD64
7679       print_vms_time (entry->d_un.d_val);
7680 #endif
7681       break;
7682
7683     case DT_IA_64_VMS_LNKFLAGS:
7684       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
7685       if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
7686         printf (" CALL_DEBUG");
7687       if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
7688         printf (" NOP0BUFS");
7689       if (entry->d_un.d_val & VMS_LF_P0IMAGE)
7690         printf (" P0IMAGE");
7691       if (entry->d_un.d_val & VMS_LF_MKTHREADS)
7692         printf (" MKTHREADS");
7693       if (entry->d_un.d_val & VMS_LF_UPCALLS)
7694         printf (" UPCALLS");
7695       if (entry->d_un.d_val & VMS_LF_IMGSTA)
7696         printf (" IMGSTA");
7697       if (entry->d_un.d_val & VMS_LF_INITIALIZE)
7698         printf (" INITIALIZE");
7699       if (entry->d_un.d_val & VMS_LF_MAIN)
7700         printf (" MAIN");
7701       if (entry->d_un.d_val & VMS_LF_EXE_INIT)
7702         printf (" EXE_INIT");
7703       if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
7704         printf (" TBK_IN_IMG");
7705       if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
7706         printf (" DBG_IN_IMG");
7707       if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
7708         printf (" TBK_IN_DSF");
7709       if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
7710         printf (" DBG_IN_DSF");
7711       if (entry->d_un.d_val & VMS_LF_SIGNATURES)
7712         printf (" SIGNATURES");
7713       if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
7714         printf (" REL_SEG_OFF");
7715       break;
7716
7717     default:
7718       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
7719       break;
7720     }
7721   putchar ('\n');
7722 }
7723
7724 static int
7725 get_32bit_dynamic_section (FILE * file)
7726 {
7727   Elf32_External_Dyn * edyn;
7728   Elf32_External_Dyn * ext;
7729   Elf_Internal_Dyn * entry;
7730
7731   edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
7732                                           dynamic_size, _("dynamic section"));
7733   if (!edyn)
7734     return 0;
7735
7736 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
7737    might not have the luxury of section headers.  Look for the DT_NULL
7738    terminator to determine the number of entries.  */
7739   for (ext = edyn, dynamic_nent = 0;
7740        (char *) ext < (char *) edyn + dynamic_size;
7741        ext++)
7742     {
7743       dynamic_nent++;
7744       if (BYTE_GET (ext->d_tag) == DT_NULL)
7745         break;
7746     }
7747
7748   dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
7749                                                   sizeof (* entry));
7750   if (dynamic_section == NULL)
7751     {
7752       error (_("Out of memory\n"));
7753       free (edyn);
7754       return 0;
7755     }
7756
7757   for (ext = edyn, entry = dynamic_section;
7758        entry < dynamic_section + dynamic_nent;
7759        ext++, entry++)
7760     {
7761       entry->d_tag      = BYTE_GET (ext->d_tag);
7762       entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
7763     }
7764
7765   free (edyn);
7766
7767   return 1;
7768 }
7769
7770 static int
7771 get_64bit_dynamic_section (FILE * file)
7772 {
7773   Elf64_External_Dyn * edyn;
7774   Elf64_External_Dyn * ext;
7775   Elf_Internal_Dyn * entry;
7776
7777   edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
7778                                           dynamic_size, _("dynamic section"));
7779   if (!edyn)
7780     return 0;
7781
7782 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
7783    might not have the luxury of section headers.  Look for the DT_NULL
7784    terminator to determine the number of entries.  */
7785   for (ext = edyn, dynamic_nent = 0;
7786        (char *) ext < (char *) edyn + dynamic_size;
7787        ext++)
7788     {
7789       dynamic_nent++;
7790       if (BYTE_GET (ext->d_tag) == DT_NULL)
7791         break;
7792     }
7793
7794   dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
7795                                                   sizeof (* entry));
7796   if (dynamic_section == NULL)
7797     {
7798       error (_("Out of memory\n"));
7799       free (edyn);
7800       return 0;
7801     }
7802
7803   for (ext = edyn, entry = dynamic_section;
7804        entry < dynamic_section + dynamic_nent;
7805        ext++, entry++)
7806     {
7807       entry->d_tag      = BYTE_GET (ext->d_tag);
7808       entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
7809     }
7810
7811   free (edyn);
7812
7813   return 1;
7814 }
7815
7816 static void
7817 print_dynamic_flags (bfd_vma flags)
7818 {
7819   int first = 1;
7820
7821   while (flags)
7822     {
7823       bfd_vma flag;
7824
7825       flag = flags & - flags;
7826       flags &= ~ flag;
7827
7828       if (first)
7829         first = 0;
7830       else
7831         putc (' ', stdout);
7832
7833       switch (flag)
7834         {
7835         case DF_ORIGIN:         fputs ("ORIGIN", stdout); break;
7836         case DF_SYMBOLIC:       fputs ("SYMBOLIC", stdout); break;
7837         case DF_TEXTREL:        fputs ("TEXTREL", stdout); break;
7838         case DF_BIND_NOW:       fputs ("BIND_NOW", stdout); break;
7839         case DF_STATIC_TLS:     fputs ("STATIC_TLS", stdout); break;
7840         default:                fputs (_("unknown"), stdout); break;
7841         }
7842     }
7843   puts ("");
7844 }
7845
7846 /* Parse and display the contents of the dynamic section.  */
7847
7848 static int
7849 process_dynamic_section (FILE * file)
7850 {
7851   Elf_Internal_Dyn * entry;
7852
7853   if (dynamic_size == 0)
7854     {
7855       if (do_dynamic)
7856         printf (_("\nThere is no dynamic section in this file.\n"));
7857
7858       return 1;
7859     }
7860
7861   if (is_32bit_elf)
7862     {
7863       if (! get_32bit_dynamic_section (file))
7864         return 0;
7865     }
7866   else if (! get_64bit_dynamic_section (file))
7867     return 0;
7868
7869   /* Find the appropriate symbol table.  */
7870   if (dynamic_symbols == NULL)
7871     {
7872       for (entry = dynamic_section;
7873            entry < dynamic_section + dynamic_nent;
7874            ++entry)
7875         {
7876           Elf_Internal_Shdr section;
7877
7878           if (entry->d_tag != DT_SYMTAB)
7879             continue;
7880
7881           dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
7882
7883           /* Since we do not know how big the symbol table is,
7884              we default to reading in the entire file (!) and
7885              processing that.  This is overkill, I know, but it
7886              should work.  */
7887           section.sh_offset = offset_from_vma (file, entry->d_un.d_val, 0);
7888
7889           if (archive_file_offset != 0)
7890             section.sh_size = archive_file_size - section.sh_offset;
7891           else
7892             {
7893               if (fseek (file, 0, SEEK_END))
7894                 error (_("Unable to seek to end of file!\n"));
7895
7896               section.sh_size = ftell (file) - section.sh_offset;
7897             }
7898
7899           if (is_32bit_elf)
7900             section.sh_entsize = sizeof (Elf32_External_Sym);
7901           else
7902             section.sh_entsize = sizeof (Elf64_External_Sym);
7903
7904           dynamic_symbols = GET_ELF_SYMBOLS (file, &section, & num_dynamic_syms);
7905           if (num_dynamic_syms < 1)
7906             {
7907               error (_("Unable to determine the number of symbols to load\n"));
7908               continue;
7909             }
7910         }
7911     }
7912
7913   /* Similarly find a string table.  */
7914   if (dynamic_strings == NULL)
7915     {
7916       for (entry = dynamic_section;
7917            entry < dynamic_section + dynamic_nent;
7918            ++entry)
7919         {
7920           unsigned long offset;
7921           long str_tab_len;
7922
7923           if (entry->d_tag != DT_STRTAB)
7924             continue;
7925
7926           dynamic_info[DT_STRTAB] = entry->d_un.d_val;
7927
7928           /* Since we do not know how big the string table is,
7929              we default to reading in the entire file (!) and
7930              processing that.  This is overkill, I know, but it
7931              should work.  */
7932
7933           offset = offset_from_vma (file, entry->d_un.d_val, 0);
7934
7935           if (archive_file_offset != 0)
7936             str_tab_len = archive_file_size - offset;
7937           else
7938             {
7939               if (fseek (file, 0, SEEK_END))
7940                 error (_("Unable to seek to end of file\n"));
7941               str_tab_len = ftell (file) - offset;
7942             }
7943
7944           if (str_tab_len < 1)
7945             {
7946               error
7947                 (_("Unable to determine the length of the dynamic string table\n"));
7948               continue;
7949             }
7950
7951           dynamic_strings = (char *) get_data (NULL, file, offset, 1,
7952                                                str_tab_len,
7953                                                _("dynamic string table"));
7954           dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
7955           break;
7956         }
7957     }
7958
7959   /* And find the syminfo section if available.  */
7960   if (dynamic_syminfo == NULL)
7961     {
7962       unsigned long syminsz = 0;
7963
7964       for (entry = dynamic_section;
7965            entry < dynamic_section + dynamic_nent;
7966            ++entry)
7967         {
7968           if (entry->d_tag == DT_SYMINENT)
7969             {
7970               /* Note: these braces are necessary to avoid a syntax
7971                  error from the SunOS4 C compiler.  */
7972               assert (sizeof (Elf_External_Syminfo) == entry->d_un.d_val);
7973             }
7974           else if (entry->d_tag == DT_SYMINSZ)
7975             syminsz = entry->d_un.d_val;
7976           else if (entry->d_tag == DT_SYMINFO)
7977             dynamic_syminfo_offset = offset_from_vma (file, entry->d_un.d_val,
7978                                                       syminsz);
7979         }
7980
7981       if (dynamic_syminfo_offset != 0 && syminsz != 0)
7982         {
7983           Elf_External_Syminfo * extsyminfo;
7984           Elf_External_Syminfo * extsym;
7985           Elf_Internal_Syminfo * syminfo;
7986
7987           /* There is a syminfo section.  Read the data.  */
7988           extsyminfo = (Elf_External_Syminfo *)
7989               get_data (NULL, file, dynamic_syminfo_offset, 1, syminsz,
7990                         _("symbol information"));
7991           if (!extsyminfo)
7992             return 0;
7993
7994           dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
7995           if (dynamic_syminfo == NULL)
7996             {
7997               error (_("Out of memory\n"));
7998               return 0;
7999             }
8000
8001           dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
8002           for (syminfo = dynamic_syminfo, extsym = extsyminfo;
8003                syminfo < dynamic_syminfo + dynamic_syminfo_nent;
8004                ++syminfo, ++extsym)
8005             {
8006               syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
8007               syminfo->si_flags = BYTE_GET (extsym->si_flags);
8008             }
8009
8010           free (extsyminfo);
8011         }
8012     }
8013
8014   if (do_dynamic && dynamic_addr)
8015     printf (_("\nDynamic section at offset 0x%lx contains %u entries:\n"),
8016             dynamic_addr, dynamic_nent);
8017   if (do_dynamic)
8018     printf (_("  Tag        Type                         Name/Value\n"));
8019
8020   for (entry = dynamic_section;
8021        entry < dynamic_section + dynamic_nent;
8022        entry++)
8023     {
8024       if (do_dynamic)
8025         {
8026           const char * dtype;
8027
8028           putchar (' ');
8029           print_vma (entry->d_tag, FULL_HEX);
8030           dtype = get_dynamic_type (entry->d_tag);
8031           printf (" (%s)%*s", dtype,
8032                   ((is_32bit_elf ? 27 : 19)
8033                    - (int) strlen (dtype)),
8034                   " ");
8035         }
8036
8037       switch (entry->d_tag)
8038         {
8039         case DT_FLAGS:
8040           if (do_dynamic)
8041             print_dynamic_flags (entry->d_un.d_val);
8042           break;
8043
8044         case DT_AUXILIARY:
8045         case DT_FILTER:
8046         case DT_CONFIG:
8047         case DT_DEPAUDIT:
8048         case DT_AUDIT:
8049           if (do_dynamic)
8050             {
8051               switch (entry->d_tag)
8052                 {
8053                 case DT_AUXILIARY:
8054                   printf (_("Auxiliary library"));
8055                   break;
8056
8057                 case DT_FILTER:
8058                   printf (_("Filter library"));
8059                   break;
8060
8061                 case DT_CONFIG:
8062                   printf (_("Configuration file"));
8063                   break;
8064
8065                 case DT_DEPAUDIT:
8066                   printf (_("Dependency audit library"));
8067                   break;
8068
8069                 case DT_AUDIT:
8070                   printf (_("Audit library"));
8071                   break;
8072                 }
8073
8074               if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
8075                 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
8076               else
8077                 {
8078                   printf (": ");
8079                   print_vma (entry->d_un.d_val, PREFIX_HEX);
8080                   putchar ('\n');
8081                 }
8082             }
8083           break;
8084
8085         case DT_FEATURE:
8086           if (do_dynamic)
8087             {
8088               printf (_("Flags:"));
8089
8090               if (entry->d_un.d_val == 0)
8091                 printf (_(" None\n"));
8092               else
8093                 {
8094                   unsigned long int val = entry->d_un.d_val;
8095
8096                   if (val & DTF_1_PARINIT)
8097                     {
8098                       printf (" PARINIT");
8099                       val ^= DTF_1_PARINIT;
8100                     }
8101                   if (val & DTF_1_CONFEXP)
8102                     {
8103                       printf (" CONFEXP");
8104                       val ^= DTF_1_CONFEXP;
8105                     }
8106                   if (val != 0)
8107                     printf (" %lx", val);
8108                   puts ("");
8109                 }
8110             }
8111           break;
8112
8113         case DT_POSFLAG_1:
8114           if (do_dynamic)
8115             {
8116               printf (_("Flags:"));
8117
8118               if (entry->d_un.d_val == 0)
8119                 printf (_(" None\n"));
8120               else
8121                 {
8122                   unsigned long int val = entry->d_un.d_val;
8123
8124                   if (val & DF_P1_LAZYLOAD)
8125                     {
8126                       printf (" LAZYLOAD");
8127                       val ^= DF_P1_LAZYLOAD;
8128                     }
8129                   if (val & DF_P1_GROUPPERM)
8130                     {
8131                       printf (" GROUPPERM");
8132                       val ^= DF_P1_GROUPPERM;
8133                     }
8134                   if (val != 0)
8135                     printf (" %lx", val);
8136                   puts ("");
8137                 }
8138             }
8139           break;
8140
8141         case DT_FLAGS_1:
8142           if (do_dynamic)
8143             {
8144               printf (_("Flags:"));
8145               if (entry->d_un.d_val == 0)
8146                 printf (_(" None\n"));
8147               else
8148                 {
8149                   unsigned long int val = entry->d_un.d_val;
8150
8151                   if (val & DF_1_NOW)
8152                     {
8153                       printf (" NOW");
8154                       val ^= DF_1_NOW;
8155                     }
8156                   if (val & DF_1_GLOBAL)
8157                     {
8158                       printf (" GLOBAL");
8159                       val ^= DF_1_GLOBAL;
8160                     }
8161                   if (val & DF_1_GROUP)
8162                     {
8163                       printf (" GROUP");
8164                       val ^= DF_1_GROUP;
8165                     }
8166                   if (val & DF_1_NODELETE)
8167                     {
8168                       printf (" NODELETE");
8169                       val ^= DF_1_NODELETE;
8170                     }
8171                   if (val & DF_1_LOADFLTR)
8172                     {
8173                       printf (" LOADFLTR");
8174                       val ^= DF_1_LOADFLTR;
8175                     }
8176                   if (val & DF_1_INITFIRST)
8177                     {
8178                       printf (" INITFIRST");
8179                       val ^= DF_1_INITFIRST;
8180                     }
8181                   if (val & DF_1_NOOPEN)
8182                     {
8183                       printf (" NOOPEN");
8184                       val ^= DF_1_NOOPEN;
8185                     }
8186                   if (val & DF_1_ORIGIN)
8187                     {
8188                       printf (" ORIGIN");
8189                       val ^= DF_1_ORIGIN;
8190                     }
8191                   if (val & DF_1_DIRECT)
8192                     {
8193                       printf (" DIRECT");
8194                       val ^= DF_1_DIRECT;
8195                     }
8196                   if (val & DF_1_TRANS)
8197                     {
8198                       printf (" TRANS");
8199                       val ^= DF_1_TRANS;
8200                     }
8201                   if (val & DF_1_INTERPOSE)
8202                     {
8203                       printf (" INTERPOSE");
8204                       val ^= DF_1_INTERPOSE;
8205                     }
8206                   if (val & DF_1_NODEFLIB)
8207                     {
8208                       printf (" NODEFLIB");
8209                       val ^= DF_1_NODEFLIB;
8210                     }
8211                   if (val & DF_1_NODUMP)
8212                     {
8213                       printf (" NODUMP");
8214                       val ^= DF_1_NODUMP;
8215                     }
8216                   if (val & DF_1_CONFALT)
8217                     {
8218                       printf (" CONFALT");
8219                       val ^= DF_1_CONFALT;
8220                     }
8221                   if (val & DF_1_ENDFILTEE)
8222                     {
8223                       printf (" ENDFILTEE");
8224                       val ^= DF_1_ENDFILTEE;
8225                     }
8226                   if (val & DF_1_DISPRELDNE)
8227                     {
8228                       printf (" DISPRELDNE");
8229                       val ^= DF_1_DISPRELDNE;
8230                     }
8231                   if (val & DF_1_DISPRELPND)
8232                     {
8233                       printf (" DISPRELPND");
8234                       val ^= DF_1_DISPRELPND;
8235                     }
8236                   if (val & DF_1_NODIRECT)
8237                     {
8238                       printf (" NODIRECT");
8239                       val ^= DF_1_NODIRECT;
8240                     }
8241                   if (val & DF_1_IGNMULDEF)
8242                     {
8243                       printf (" IGNMULDEF");
8244                       val ^= DF_1_IGNMULDEF;
8245                     }
8246                   if (val & DF_1_NOKSYMS)
8247                     {
8248                       printf (" NOKSYMS");
8249                       val ^= DF_1_NOKSYMS;
8250                     }
8251                   if (val & DF_1_NOHDR)
8252                     {
8253                       printf (" NOHDR");
8254                       val ^= DF_1_NOHDR;
8255                     }
8256                   if (val & DF_1_EDITED)
8257                     {
8258                       printf (" EDITED");
8259                       val ^= DF_1_EDITED;
8260                     }
8261                   if (val & DF_1_NORELOC)
8262                     {
8263                       printf (" NORELOC");
8264                       val ^= DF_1_NORELOC;
8265                     }
8266                   if (val & DF_1_SYMINTPOSE)
8267                     {
8268                       printf (" SYMINTPOSE");
8269                       val ^= DF_1_SYMINTPOSE;
8270                     }
8271                   if (val & DF_1_GLOBAUDIT)
8272                     {
8273                       printf (" GLOBAUDIT");
8274                       val ^= DF_1_GLOBAUDIT;
8275                     }
8276                   if (val & DF_1_SINGLETON)
8277                     {
8278                       printf (" SINGLETON");
8279                       val ^= DF_1_SINGLETON;
8280                     }
8281                   if (val != 0)
8282                     printf (" %lx", val);
8283                   puts ("");
8284                 }
8285             }
8286           break;
8287
8288         case DT_PLTREL:
8289           dynamic_info[entry->d_tag] = entry->d_un.d_val;
8290           if (do_dynamic)
8291             puts (get_dynamic_type (entry->d_un.d_val));
8292           break;
8293
8294         case DT_NULL    :
8295         case DT_NEEDED  :
8296         case DT_PLTGOT  :
8297         case DT_HASH    :
8298         case DT_STRTAB  :
8299         case DT_SYMTAB  :
8300         case DT_RELA    :
8301         case DT_INIT    :
8302         case DT_FINI    :
8303         case DT_SONAME  :
8304         case DT_RPATH   :
8305         case DT_SYMBOLIC:
8306         case DT_REL     :
8307         case DT_DEBUG   :
8308         case DT_TEXTREL :
8309         case DT_JMPREL  :
8310         case DT_RUNPATH :
8311           dynamic_info[entry->d_tag] = entry->d_un.d_val;
8312
8313           if (do_dynamic)
8314             {
8315               char * name;
8316
8317               if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
8318                 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
8319               else
8320                 name = NULL;
8321
8322               if (name)
8323                 {
8324                   switch (entry->d_tag)
8325                     {
8326                     case DT_NEEDED:
8327                       printf (_("Shared library: [%s]"), name);
8328
8329                       if (streq (name, program_interpreter))
8330                         printf (_(" program interpreter"));
8331                       break;
8332
8333                     case DT_SONAME:
8334                       printf (_("Library soname: [%s]"), name);
8335                       break;
8336
8337                     case DT_RPATH:
8338                       printf (_("Library rpath: [%s]"), name);
8339                       break;
8340
8341                     case DT_RUNPATH:
8342                       printf (_("Library runpath: [%s]"), name);
8343                       break;
8344
8345                     default:
8346                       print_vma (entry->d_un.d_val, PREFIX_HEX);
8347                       break;
8348                     }
8349                 }
8350               else
8351                 print_vma (entry->d_un.d_val, PREFIX_HEX);
8352
8353               putchar ('\n');
8354             }
8355           break;
8356
8357         case DT_PLTRELSZ:
8358         case DT_RELASZ  :
8359         case DT_STRSZ   :
8360         case DT_RELSZ   :
8361         case DT_RELAENT :
8362         case DT_SYMENT  :
8363         case DT_RELENT  :
8364           dynamic_info[entry->d_tag] = entry->d_un.d_val;
8365         case DT_PLTPADSZ:
8366         case DT_MOVEENT :
8367         case DT_MOVESZ  :
8368         case DT_INIT_ARRAYSZ:
8369         case DT_FINI_ARRAYSZ:
8370         case DT_GNU_CONFLICTSZ:
8371         case DT_GNU_LIBLISTSZ:
8372           if (do_dynamic)
8373             {
8374               print_vma (entry->d_un.d_val, UNSIGNED);
8375               printf (_(" (bytes)\n"));
8376             }
8377           break;
8378
8379         case DT_VERDEFNUM:
8380         case DT_VERNEEDNUM:
8381         case DT_RELACOUNT:
8382         case DT_RELCOUNT:
8383           if (do_dynamic)
8384             {
8385               print_vma (entry->d_un.d_val, UNSIGNED);
8386               putchar ('\n');
8387             }
8388           break;
8389
8390         case DT_SYMINSZ:
8391         case DT_SYMINENT:
8392         case DT_SYMINFO:
8393         case DT_USED:
8394         case DT_INIT_ARRAY:
8395         case DT_FINI_ARRAY:
8396           if (do_dynamic)
8397             {
8398               if (entry->d_tag == DT_USED
8399                   && VALID_DYNAMIC_NAME (entry->d_un.d_val))
8400                 {
8401                   char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
8402
8403                   if (*name)
8404                     {
8405                       printf (_("Not needed object: [%s]\n"), name);
8406                       break;
8407                     }
8408                 }
8409
8410               print_vma (entry->d_un.d_val, PREFIX_HEX);
8411               putchar ('\n');
8412             }
8413           break;
8414
8415         case DT_BIND_NOW:
8416           /* The value of this entry is ignored.  */
8417           if (do_dynamic)
8418             putchar ('\n');
8419           break;
8420
8421         case DT_GNU_PRELINKED:
8422           if (do_dynamic)
8423             {
8424               struct tm * tmp;
8425               time_t atime = entry->d_un.d_val;
8426
8427               tmp = gmtime (&atime);
8428               printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
8429                       tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
8430                       tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
8431
8432             }
8433           break;
8434
8435         case DT_GNU_HASH:
8436           dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
8437           if (do_dynamic)
8438             {
8439               print_vma (entry->d_un.d_val, PREFIX_HEX);
8440               putchar ('\n');
8441             }
8442           break;
8443
8444         default:
8445           if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
8446             version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
8447               entry->d_un.d_val;
8448
8449           if (do_dynamic)
8450             {
8451               switch (elf_header.e_machine)
8452                 {
8453                 case EM_MIPS:
8454                 case EM_MIPS_RS3_LE:
8455                   dynamic_section_mips_val (entry);
8456                   break;
8457                 case EM_PARISC:
8458                   dynamic_section_parisc_val (entry);
8459                   break;
8460                 case EM_IA_64:
8461                   dynamic_section_ia64_val (entry);
8462                   break;
8463                 default:
8464                   print_vma (entry->d_un.d_val, PREFIX_HEX);
8465                   putchar ('\n');
8466                 }
8467             }
8468           break;
8469         }
8470     }
8471
8472   return 1;
8473 }
8474
8475 static char *
8476 get_ver_flags (unsigned int flags)
8477 {
8478   static char buff[32];
8479
8480   buff[0] = 0;
8481
8482   if (flags == 0)
8483     return _("none");
8484
8485   if (flags & VER_FLG_BASE)
8486     strcat (buff, "BASE ");
8487
8488   if (flags & VER_FLG_WEAK)
8489     {
8490       if (flags & VER_FLG_BASE)
8491         strcat (buff, "| ");
8492
8493       strcat (buff, "WEAK ");
8494     }
8495
8496   if (flags & VER_FLG_INFO)
8497     {
8498       if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
8499         strcat (buff, "| ");
8500
8501       strcat (buff, "INFO ");
8502     }
8503
8504   if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
8505     strcat (buff, _("| <unknown>"));
8506
8507   return buff;
8508 }
8509
8510 /* Display the contents of the version sections.  */
8511
8512 static int
8513 process_version_sections (FILE * file)
8514 {
8515   Elf_Internal_Shdr * section;
8516   unsigned i;
8517   int found = 0;
8518
8519   if (! do_version)
8520     return 1;
8521
8522   for (i = 0, section = section_headers;
8523        i < elf_header.e_shnum;
8524        i++, section++)
8525     {
8526       switch (section->sh_type)
8527         {
8528         case SHT_GNU_verdef:
8529           {
8530             Elf_External_Verdef * edefs;
8531             unsigned int idx;
8532             unsigned int cnt;
8533             char * endbuf;
8534
8535             found = 1;
8536
8537             printf
8538               (_("\nVersion definition section '%s' contains %u entries:\n"),
8539                SECTION_NAME (section), section->sh_info);
8540
8541             printf (_("  Addr: 0x"));
8542             printf_vma (section->sh_addr);
8543             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
8544                     (unsigned long) section->sh_offset, section->sh_link,
8545                     section->sh_link < elf_header.e_shnum
8546                     ? SECTION_NAME (section_headers + section->sh_link)
8547                     : _("<corrupt>"));
8548
8549             edefs = (Elf_External_Verdef *)
8550                 get_data (NULL, file, section->sh_offset, 1,section->sh_size,
8551                           _("version definition section"));
8552             if (!edefs)
8553               break;
8554             endbuf = (char *) edefs + section->sh_size;
8555
8556             for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
8557               {
8558                 char * vstart;
8559                 Elf_External_Verdef * edef;
8560                 Elf_Internal_Verdef ent;
8561                 Elf_External_Verdaux * eaux;
8562                 Elf_Internal_Verdaux aux;
8563                 int j;
8564                 int isum;
8565
8566                 /* Check for very large indicies.  */
8567                 if (idx > (size_t) (endbuf - (char *) edefs))
8568                   break;
8569
8570                 vstart = ((char *) edefs) + idx;
8571                 if (vstart + sizeof (*edef) > endbuf)
8572                   break;
8573
8574                 edef = (Elf_External_Verdef *) vstart;
8575
8576                 ent.vd_version = BYTE_GET (edef->vd_version);
8577                 ent.vd_flags   = BYTE_GET (edef->vd_flags);
8578                 ent.vd_ndx     = BYTE_GET (edef->vd_ndx);
8579                 ent.vd_cnt     = BYTE_GET (edef->vd_cnt);
8580                 ent.vd_hash    = BYTE_GET (edef->vd_hash);
8581                 ent.vd_aux     = BYTE_GET (edef->vd_aux);
8582                 ent.vd_next    = BYTE_GET (edef->vd_next);
8583
8584                 printf (_("  %#06x: Rev: %d  Flags: %s"),
8585                         idx, ent.vd_version, get_ver_flags (ent.vd_flags));
8586
8587                 printf (_("  Index: %d  Cnt: %d  "),
8588                         ent.vd_ndx, ent.vd_cnt);
8589
8590                 /* Check for overflow.  */
8591                 if (ent.vd_aux > (size_t) (endbuf - vstart))
8592                   break;
8593
8594                 vstart += ent.vd_aux;
8595
8596                 eaux = (Elf_External_Verdaux *) vstart;
8597
8598                 aux.vda_name = BYTE_GET (eaux->vda_name);
8599                 aux.vda_next = BYTE_GET (eaux->vda_next);
8600
8601                 if (VALID_DYNAMIC_NAME (aux.vda_name))
8602                   printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
8603                 else
8604                   printf (_("Name index: %ld\n"), aux.vda_name);
8605
8606                 isum = idx + ent.vd_aux;
8607
8608                 for (j = 1; j < ent.vd_cnt; j++)
8609                   {
8610                     /* Check for overflow.  */
8611                     if (aux.vda_next > (size_t) (endbuf - vstart))
8612                       break;
8613
8614                     isum   += aux.vda_next;
8615                     vstart += aux.vda_next;
8616
8617                     eaux = (Elf_External_Verdaux *) vstart;
8618                     if (vstart + sizeof (*eaux) > endbuf)
8619                       break;
8620
8621                     aux.vda_name = BYTE_GET (eaux->vda_name);
8622                     aux.vda_next = BYTE_GET (eaux->vda_next);
8623
8624                     if (VALID_DYNAMIC_NAME (aux.vda_name))
8625                       printf (_("  %#06x: Parent %d: %s\n"),
8626                               isum, j, GET_DYNAMIC_NAME (aux.vda_name));
8627                     else
8628                       printf (_("  %#06x: Parent %d, name index: %ld\n"),
8629                               isum, j, aux.vda_name);
8630                   }
8631
8632                 if (j < ent.vd_cnt)
8633                   printf (_("  Version def aux past end of section\n"));
8634
8635                 idx += ent.vd_next;
8636               }
8637
8638             if (cnt < section->sh_info)
8639               printf (_("  Version definition past end of section\n"));
8640
8641             free (edefs);
8642           }
8643           break;
8644
8645         case SHT_GNU_verneed:
8646           {
8647             Elf_External_Verneed * eneed;
8648             unsigned int idx;
8649             unsigned int cnt;
8650             char * endbuf;
8651
8652             found = 1;
8653
8654             printf (_("\nVersion needs section '%s' contains %u entries:\n"),
8655                     SECTION_NAME (section), section->sh_info);
8656
8657             printf (_(" Addr: 0x"));
8658             printf_vma (section->sh_addr);
8659             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
8660                     (unsigned long) section->sh_offset, section->sh_link,
8661                     section->sh_link < elf_header.e_shnum
8662                     ? SECTION_NAME (section_headers + section->sh_link)
8663                     : _("<corrupt>"));
8664
8665             eneed = (Elf_External_Verneed *) get_data (NULL, file,
8666                                                        section->sh_offset, 1,
8667                                                        section->sh_size,
8668                                                        _("Version Needs section"));
8669             if (!eneed)
8670               break;
8671             endbuf = (char *) eneed + section->sh_size;
8672
8673             for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
8674               {
8675                 Elf_External_Verneed * entry;
8676                 Elf_Internal_Verneed ent;
8677                 int j;
8678                 int isum;
8679                 char * vstart;
8680
8681                 if (idx > (size_t) (endbuf - (char *) eneed))
8682                   break;
8683
8684                 vstart = ((char *) eneed) + idx;
8685                 if (vstart + sizeof (*entry) > endbuf)
8686                   break;
8687
8688                 entry = (Elf_External_Verneed *) vstart;
8689
8690                 ent.vn_version = BYTE_GET (entry->vn_version);
8691                 ent.vn_cnt     = BYTE_GET (entry->vn_cnt);
8692                 ent.vn_file    = BYTE_GET (entry->vn_file);
8693                 ent.vn_aux     = BYTE_GET (entry->vn_aux);
8694                 ent.vn_next    = BYTE_GET (entry->vn_next);
8695
8696                 printf (_("  %#06x: Version: %d"), idx, ent.vn_version);
8697
8698                 if (VALID_DYNAMIC_NAME (ent.vn_file))
8699                   printf (_("  File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
8700                 else
8701                   printf (_("  File: %lx"), ent.vn_file);
8702
8703                 printf (_("  Cnt: %d\n"), ent.vn_cnt);
8704
8705                 /* Check for overflow.  */
8706                 if (ent.vn_aux > (size_t) (endbuf - vstart))
8707                   break;
8708
8709                 vstart += ent.vn_aux;
8710
8711                 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
8712                   {
8713                     Elf_External_Vernaux * eaux;
8714                     Elf_Internal_Vernaux aux;
8715
8716                     if (vstart + sizeof (*eaux) > endbuf)
8717                       break;
8718                     eaux = (Elf_External_Vernaux *) vstart;
8719
8720                     aux.vna_hash  = BYTE_GET (eaux->vna_hash);
8721                     aux.vna_flags = BYTE_GET (eaux->vna_flags);
8722                     aux.vna_other = BYTE_GET (eaux->vna_other);
8723                     aux.vna_name  = BYTE_GET (eaux->vna_name);
8724                     aux.vna_next  = BYTE_GET (eaux->vna_next);
8725
8726                     if (VALID_DYNAMIC_NAME (aux.vna_name))
8727                       printf (_("  %#06x:   Name: %s"),
8728                               isum, GET_DYNAMIC_NAME (aux.vna_name));
8729                     else
8730                       printf (_("  %#06x:   Name index: %lx"),
8731                               isum, aux.vna_name);
8732
8733                     printf (_("  Flags: %s  Version: %d\n"),
8734                             get_ver_flags (aux.vna_flags), aux.vna_other);
8735
8736                     /* Check for overflow.  */
8737                     if (aux.vna_next > (size_t) (endbuf - vstart))
8738                       break;
8739
8740                     isum   += aux.vna_next;
8741                     vstart += aux.vna_next;
8742                   }
8743
8744                 if (j < ent.vn_cnt)
8745                   warn (_("Missing Version Needs auxillary information\n"));
8746
8747                 idx += ent.vn_next;
8748               }
8749
8750             if (cnt < section->sh_info)
8751               warn (_("Missing Version Needs information\n"));
8752
8753             free (eneed);
8754           }
8755           break;
8756
8757         case SHT_GNU_versym:
8758           {
8759             Elf_Internal_Shdr * link_section;
8760             int total;
8761             int cnt;
8762             unsigned char * edata;
8763             unsigned short * data;
8764             char * strtab;
8765             Elf_Internal_Sym * symbols;
8766             Elf_Internal_Shdr * string_sec;
8767             unsigned long num_syms;
8768             long off;
8769
8770             if (section->sh_link >= elf_header.e_shnum)
8771               break;
8772
8773             link_section = section_headers + section->sh_link;
8774             total = section->sh_size / sizeof (Elf_External_Versym);
8775
8776             if (link_section->sh_link >= elf_header.e_shnum)
8777               break;
8778
8779             found = 1;
8780
8781             symbols = GET_ELF_SYMBOLS (file, link_section, & num_syms);
8782             if (symbols == NULL)
8783               break;
8784
8785             string_sec = section_headers + link_section->sh_link;
8786
8787             strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
8788                                         string_sec->sh_size,
8789                                         _("version string table"));
8790             if (!strtab)
8791               {
8792                 free (symbols);
8793                 break;
8794               }
8795
8796             printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
8797                     SECTION_NAME (section), total);
8798
8799             printf (_(" Addr: "));
8800             printf_vma (section->sh_addr);
8801             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
8802                     (unsigned long) section->sh_offset, section->sh_link,
8803                     SECTION_NAME (link_section));
8804
8805             off = offset_from_vma (file,
8806                                    version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
8807                                    total * sizeof (short));
8808             edata = (unsigned char *) get_data (NULL, file, off, total,
8809                                                 sizeof (short),
8810                                                 _("version symbol data"));
8811             if (!edata)
8812               {
8813                 free (strtab);
8814                 free (symbols);
8815                 break;
8816               }
8817
8818             data = (short unsigned int *) cmalloc (total, sizeof (short));
8819
8820             for (cnt = total; cnt --;)
8821               data[cnt] = byte_get (edata + cnt * sizeof (short),
8822                                     sizeof (short));
8823
8824             free (edata);
8825
8826             for (cnt = 0; cnt < total; cnt += 4)
8827               {
8828                 int j, nn;
8829                 int check_def, check_need;
8830                 char * name;
8831
8832                 printf ("  %03x:", cnt);
8833
8834                 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
8835                   switch (data[cnt + j])
8836                     {
8837                     case 0:
8838                       fputs (_("   0 (*local*)    "), stdout);
8839                       break;
8840
8841                     case 1:
8842                       fputs (_("   1 (*global*)   "), stdout);
8843                       break;
8844
8845                     default:
8846                       nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
8847                                    data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
8848
8849                       /* If this index value is greater than the size of the symbols
8850                          array, break to avoid an out-of-bounds read.  */
8851                       if ((unsigned long)(cnt + j) >= num_syms)
8852                         {
8853                           warn (_("invalid index into symbol array\n"));
8854                           break;
8855                         }
8856
8857                       check_def = 1;
8858                       check_need = 1;
8859                       if (symbols[cnt + j].st_shndx >= elf_header.e_shnum
8860                           || section_headers[symbols[cnt + j].st_shndx].sh_type
8861                              != SHT_NOBITS)
8862                         {
8863                           if (symbols[cnt + j].st_shndx == SHN_UNDEF)
8864                             check_def = 0;
8865                           else
8866                             check_need = 0;
8867                         }
8868
8869                       if (check_need
8870                           && version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
8871                         {
8872                           Elf_Internal_Verneed ivn;
8873                           unsigned long offset;
8874
8875                           offset = offset_from_vma
8876                             (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
8877                              sizeof (Elf_External_Verneed));
8878
8879                           do
8880                             {
8881                               Elf_Internal_Vernaux ivna;
8882                               Elf_External_Verneed evn;
8883                               Elf_External_Vernaux evna;
8884                               unsigned long a_off;
8885
8886                               if (get_data (&evn, file, offset, sizeof (evn), 1,
8887                                             _("version need")) == NULL)
8888                                 break;
8889                               
8890                               ivn.vn_aux  = BYTE_GET (evn.vn_aux);
8891                               ivn.vn_next = BYTE_GET (evn.vn_next);
8892
8893                               a_off = offset + ivn.vn_aux;
8894
8895                               do
8896                                 {
8897                                   if (get_data (&evna, file, a_off, sizeof (evna),
8898                                                 1, _("version need aux (2)")) == NULL)
8899                                     {
8900                                       ivna.vna_next  = 0;
8901                                       ivna.vna_other = 0;
8902                                     }
8903                                   else
8904                                     {
8905                                       ivna.vna_next  = BYTE_GET (evna.vna_next);
8906                                       ivna.vna_other = BYTE_GET (evna.vna_other);
8907                                     }
8908
8909                                   a_off += ivna.vna_next;
8910                                 }
8911                               while (ivna.vna_other != data[cnt + j]
8912                                      && ivna.vna_next != 0);
8913
8914                               if (ivna.vna_other == data[cnt + j])
8915                                 {
8916                                   ivna.vna_name = BYTE_GET (evna.vna_name);
8917
8918                                   if (ivna.vna_name >= string_sec->sh_size)
8919                                     name = _("*invalid*");
8920                                   else
8921                                     name = strtab + ivna.vna_name;
8922                                   nn += printf ("(%s%-*s",
8923                                                 name,
8924                                                 12 - (int) strlen (name),
8925                                                 ")");
8926                                   check_def = 0;
8927                                   break;
8928                                 }
8929
8930                               offset += ivn.vn_next;
8931                             }
8932                           while (ivn.vn_next);
8933                         }
8934
8935                       if (check_def && data[cnt + j] != 0x8001
8936                           && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
8937                         {
8938                           Elf_Internal_Verdef ivd;
8939                           Elf_External_Verdef evd;
8940                           unsigned long offset;
8941
8942                           offset = offset_from_vma
8943                             (file, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
8944                              sizeof evd);
8945
8946                           do
8947                             {
8948                               if (get_data (&evd, file, offset, sizeof (evd), 1,
8949                                             _("version def")) == NULL)
8950                                 {
8951                                   ivd.vd_next = 0;
8952                                   ivd.vd_ndx  = 0;
8953                                 }
8954                               else
8955                                 {
8956                                   ivd.vd_next = BYTE_GET (evd.vd_next);
8957                                   ivd.vd_ndx  = BYTE_GET (evd.vd_ndx);
8958                                 }
8959
8960                               offset += ivd.vd_next;
8961                             }
8962                           while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
8963                                  && ivd.vd_next != 0);
8964
8965                           if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
8966                             {
8967                               Elf_External_Verdaux evda;
8968                               Elf_Internal_Verdaux ivda;
8969
8970                               ivd.vd_aux = BYTE_GET (evd.vd_aux);
8971
8972                               if (get_data (&evda, file,
8973                                             offset - ivd.vd_next + ivd.vd_aux,
8974                                             sizeof (evda), 1,
8975                                             _("version def aux")) == NULL)
8976                                 break;
8977
8978                               ivda.vda_name = BYTE_GET (evda.vda_name);
8979
8980                               if (ivda.vda_name >= string_sec->sh_size)
8981                                 name = _("*invalid*");
8982                               else
8983                                 name = strtab + ivda.vda_name;
8984                               nn += printf ("(%s%-*s",
8985                                             name,
8986                                             12 - (int) strlen (name),
8987                                             ")");
8988                             }
8989                         }
8990
8991                       if (nn < 18)
8992                         printf ("%*c", 18 - nn, ' ');
8993                     }
8994
8995                 putchar ('\n');
8996               }
8997
8998             free (data);
8999             free (strtab);
9000             free (symbols);
9001           }
9002           break;
9003
9004         default:
9005           break;
9006         }
9007     }
9008
9009   if (! found)
9010     printf (_("\nNo version information found in this file.\n"));
9011
9012   return 1;
9013 }
9014
9015 static const char *
9016 get_symbol_binding (unsigned int binding)
9017 {
9018   static char buff[32];
9019
9020   switch (binding)
9021     {
9022     case STB_LOCAL:     return "LOCAL";
9023     case STB_GLOBAL:    return "GLOBAL";
9024     case STB_WEAK:      return "WEAK";
9025     default:
9026       if (binding >= STB_LOPROC && binding <= STB_HIPROC)
9027         snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
9028                   binding);
9029       else if (binding >= STB_LOOS && binding <= STB_HIOS)
9030         {
9031           if (binding == STB_GNU_UNIQUE
9032               && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
9033                   /* GNU is still using the default value 0.  */
9034                   || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
9035             return "UNIQUE";
9036           snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
9037         }
9038       else
9039         snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
9040       return buff;
9041     }
9042 }
9043
9044 static const char *
9045 get_symbol_type (unsigned int type)
9046 {
9047   static char buff[32];
9048
9049   switch (type)
9050     {
9051     case STT_NOTYPE:    return "NOTYPE";
9052     case STT_OBJECT:    return "OBJECT";
9053     case STT_FUNC:      return "FUNC";
9054     case STT_SECTION:   return "SECTION";
9055     case STT_FILE:      return "FILE";
9056     case STT_COMMON:    return "COMMON";
9057     case STT_TLS:       return "TLS";
9058     case STT_RELC:      return "RELC";
9059     case STT_SRELC:     return "SRELC";
9060     default:
9061       if (type >= STT_LOPROC && type <= STT_HIPROC)
9062         {
9063           if (elf_header.e_machine == EM_ARM)
9064             {
9065               if (type == STT_ARM_TFUNC)
9066                 return "THUMB_FUNC";
9067               if (type == STT_ARM_16BIT)
9068                 return "THUMB_LABEL";
9069             }
9070
9071           if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
9072             return "REGISTER";
9073
9074           if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
9075             return "PARISC_MILLI";
9076
9077           snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
9078         }
9079       else if (type >= STT_LOOS && type <= STT_HIOS)
9080         {
9081           if (elf_header.e_machine == EM_PARISC)
9082             {
9083               if (type == STT_HP_OPAQUE)
9084                 return "HP_OPAQUE";
9085               if (type == STT_HP_STUB)
9086                 return "HP_STUB";
9087             }
9088
9089           if (type == STT_GNU_IFUNC
9090               && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
9091                   || elf_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD
9092                   /* GNU is still using the default value 0.  */
9093                   || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
9094             return "IFUNC";
9095
9096           snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
9097         }
9098       else
9099         snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
9100       return buff;
9101     }
9102 }
9103
9104 static const char *
9105 get_symbol_visibility (unsigned int visibility)
9106 {
9107   switch (visibility)
9108     {
9109     case STV_DEFAULT:   return "DEFAULT";
9110     case STV_INTERNAL:  return "INTERNAL";
9111     case STV_HIDDEN:    return "HIDDEN";
9112     case STV_PROTECTED: return "PROTECTED";
9113     default: abort ();
9114     }
9115 }
9116
9117 static const char *
9118 get_mips_symbol_other (unsigned int other)
9119 {
9120   switch (other)
9121     {
9122     case STO_OPTIONAL:
9123       return "OPTIONAL";
9124     case STO_MIPS_PLT:
9125       return "MIPS PLT";
9126     case STO_MIPS_PIC:
9127       return "MIPS PIC";
9128     case STO_MICROMIPS:
9129       return "MICROMIPS";
9130     case STO_MICROMIPS | STO_MIPS_PIC:
9131       return "MICROMIPS, MIPS PIC";
9132     case STO_MIPS16:
9133       return "MIPS16";
9134     default:
9135       return NULL;
9136     }
9137 }
9138
9139 static const char *
9140 get_ia64_symbol_other (unsigned int other)
9141 {
9142   if (is_ia64_vms ())
9143     {
9144       static char res[32];
9145
9146       res[0] = 0;
9147
9148       /* Function types is for images and .STB files only.  */
9149       switch (elf_header.e_type)
9150         {
9151         case ET_DYN:
9152         case ET_EXEC:
9153           switch (VMS_ST_FUNC_TYPE (other))
9154             {
9155             case VMS_SFT_CODE_ADDR:
9156               strcat (res, " CA");
9157               break;
9158             case VMS_SFT_SYMV_IDX:
9159               strcat (res, " VEC");
9160               break;
9161             case VMS_SFT_FD:
9162               strcat (res, " FD");
9163               break;
9164             case VMS_SFT_RESERVE:
9165               strcat (res, " RSV");
9166               break;
9167             default:
9168               abort ();
9169             }
9170           break;
9171         default:
9172           break;
9173         }
9174       switch (VMS_ST_LINKAGE (other))
9175         {
9176         case VMS_STL_IGNORE:
9177           strcat (res, " IGN");
9178           break;
9179         case VMS_STL_RESERVE:
9180           strcat (res, " RSV");
9181           break;
9182         case VMS_STL_STD:
9183           strcat (res, " STD");
9184           break;
9185         case VMS_STL_LNK:
9186           strcat (res, " LNK");
9187           break;
9188         default:
9189           abort ();
9190         }
9191
9192       if (res[0] != 0)
9193         return res + 1;
9194       else
9195         return res;
9196     }
9197   return NULL;
9198 }
9199
9200 static const char *
9201 get_symbol_other (unsigned int other)
9202 {
9203   const char * result = NULL;
9204   static char buff [32];
9205
9206   if (other == 0)
9207     return "";
9208
9209   switch (elf_header.e_machine)
9210     {
9211     case EM_MIPS:
9212       result = get_mips_symbol_other (other);
9213       break;
9214     case EM_IA_64:
9215       result = get_ia64_symbol_other (other);
9216       break;
9217     default:
9218       break;
9219     }
9220
9221   if (result)
9222     return result;
9223
9224   snprintf (buff, sizeof buff, _("<other>: %x"), other);
9225   return buff;
9226 }
9227
9228 static const char *
9229 get_symbol_index_type (unsigned int type)
9230 {
9231   static char buff[32];
9232
9233   switch (type)
9234     {
9235     case SHN_UNDEF:     return "UND";
9236     case SHN_ABS:       return "ABS";
9237     case SHN_COMMON:    return "COM";
9238     default:
9239       if (type == SHN_IA_64_ANSI_COMMON
9240           && elf_header.e_machine == EM_IA_64
9241           && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
9242         return "ANSI_COM";
9243       else if ((elf_header.e_machine == EM_X86_64
9244                 || elf_header.e_machine == EM_L1OM
9245                 || elf_header.e_machine == EM_K1OM)
9246                && type == SHN_X86_64_LCOMMON)
9247         return "LARGE_COM";
9248       else if ((type == SHN_MIPS_SCOMMON
9249                 && elf_header.e_machine == EM_MIPS)
9250                || (type == SHN_TIC6X_SCOMMON
9251                    && elf_header.e_machine == EM_TI_C6000))
9252         return "SCOM";
9253       else if (type == SHN_MIPS_SUNDEFINED
9254                && elf_header.e_machine == EM_MIPS)
9255         return "SUND";
9256       else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
9257         sprintf (buff, "PRC[0x%04x]", type & 0xffff);
9258       else if (type >= SHN_LOOS && type <= SHN_HIOS)
9259         sprintf (buff, "OS [0x%04x]", type & 0xffff);
9260       else if (type >= SHN_LORESERVE)
9261         sprintf (buff, "RSV[0x%04x]", type & 0xffff);
9262       else if (type >= elf_header.e_shnum)
9263         sprintf (buff, "bad section index[%3d]", type);
9264       else
9265         sprintf (buff, "%3d", type);
9266       break;
9267     }
9268
9269   return buff;
9270 }
9271
9272 static bfd_vma *
9273 get_dynamic_data (FILE * file, unsigned int number, unsigned int ent_size)
9274 {
9275   unsigned char * e_data;
9276   bfd_vma * i_data;
9277
9278   e_data = (unsigned char *) cmalloc (number, ent_size);
9279
9280   if (e_data == NULL)
9281     {
9282       error (_("Out of memory\n"));
9283       return NULL;
9284     }
9285
9286   if (fread (e_data, ent_size, number, file) != number)
9287     {
9288       error (_("Unable to read in dynamic data\n"));
9289       return NULL;
9290     }
9291
9292   i_data = (bfd_vma *) cmalloc (number, sizeof (*i_data));
9293
9294   if (i_data == NULL)
9295     {
9296       error (_("Out of memory\n"));
9297       free (e_data);
9298       return NULL;
9299     }
9300
9301   while (number--)
9302     i_data[number] = byte_get (e_data + number * ent_size, ent_size);
9303
9304   free (e_data);
9305
9306   return i_data;
9307 }
9308
9309 static void
9310 print_dynamic_symbol (bfd_vma si, unsigned long hn)
9311 {
9312   Elf_Internal_Sym * psym;
9313   int n;
9314
9315   psym = dynamic_symbols + si;
9316
9317   n = print_vma (si, DEC_5);
9318   if (n < 5)
9319     fputs ("     " + n, stdout);
9320   printf (" %3lu: ", hn);
9321   print_vma (psym->st_value, LONG_HEX);
9322   putchar (' ');
9323   print_vma (psym->st_size, DEC_5);
9324
9325   printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
9326   printf (" %-6s",  get_symbol_binding (ELF_ST_BIND (psym->st_info)));
9327   printf (" %-7s",  get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
9328   /* Check to see if any other bits in the st_other field are set.
9329      Note - displaying this information disrupts the layout of the
9330      table being generated, but for the moment this case is very
9331      rare.  */
9332   if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
9333     printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
9334   printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
9335   if (VALID_DYNAMIC_NAME (psym->st_name))
9336     print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
9337   else
9338     printf (_(" <corrupt: %14ld>"), psym->st_name);
9339   putchar ('\n');
9340 }
9341
9342 /* Dump the symbol table.  */
9343 static int
9344 process_symbol_table (FILE * file)
9345 {
9346   Elf_Internal_Shdr * section;
9347   bfd_vma nbuckets = 0;
9348   bfd_vma nchains = 0;
9349   bfd_vma * buckets = NULL;
9350   bfd_vma * chains = NULL;
9351   bfd_vma ngnubuckets = 0;
9352   bfd_vma * gnubuckets = NULL;
9353   bfd_vma * gnuchains = NULL;
9354   bfd_vma gnusymidx = 0;
9355
9356   if (!do_syms && !do_dyn_syms && !do_histogram)
9357     return 1;
9358
9359   if (dynamic_info[DT_HASH]
9360       && (do_histogram
9361           || (do_using_dynamic
9362               && !do_dyn_syms
9363               && dynamic_strings != NULL)))
9364     {
9365       unsigned char nb[8];
9366       unsigned char nc[8];
9367       int hash_ent_size = 4;
9368
9369       if ((elf_header.e_machine == EM_ALPHA
9370            || elf_header.e_machine == EM_S390
9371            || elf_header.e_machine == EM_S390_OLD)
9372           && elf_header.e_ident[EI_CLASS] == ELFCLASS64)
9373         hash_ent_size = 8;
9374
9375       if (fseek (file,
9376                  (archive_file_offset
9377                   + offset_from_vma (file, dynamic_info[DT_HASH],
9378                                      sizeof nb + sizeof nc)),
9379                  SEEK_SET))
9380         {
9381           error (_("Unable to seek to start of dynamic information\n"));
9382           goto no_hash;
9383         }
9384
9385       if (fread (nb, hash_ent_size, 1, file) != 1)
9386         {
9387           error (_("Failed to read in number of buckets\n"));
9388           goto no_hash;
9389         }
9390
9391       if (fread (nc, hash_ent_size, 1, file) != 1)
9392         {
9393           error (_("Failed to read in number of chains\n"));
9394           goto no_hash;
9395         }
9396
9397       nbuckets = byte_get (nb, hash_ent_size);
9398       nchains  = byte_get (nc, hash_ent_size);
9399
9400       buckets = get_dynamic_data (file, nbuckets, hash_ent_size);
9401       chains  = get_dynamic_data (file, nchains, hash_ent_size);
9402
9403     no_hash:
9404       if (buckets == NULL || chains == NULL)
9405         {
9406           if (do_using_dynamic)
9407             return 0;
9408           free (buckets);
9409           free (chains);
9410           buckets = NULL;
9411           chains = NULL;
9412           nbuckets = 0;
9413           nchains = 0;
9414         }
9415     }
9416
9417   if (dynamic_info_DT_GNU_HASH
9418       && (do_histogram
9419           || (do_using_dynamic
9420               && !do_dyn_syms
9421               && dynamic_strings != NULL)))
9422     {
9423       unsigned char nb[16];
9424       bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
9425       bfd_vma buckets_vma;
9426
9427       if (fseek (file,
9428                  (archive_file_offset
9429                   + offset_from_vma (file, dynamic_info_DT_GNU_HASH,
9430                                      sizeof nb)),
9431                  SEEK_SET))
9432         {
9433           error (_("Unable to seek to start of dynamic information\n"));
9434           goto no_gnu_hash;
9435         }
9436
9437       if (fread (nb, 16, 1, file) != 1)
9438         {
9439           error (_("Failed to read in number of buckets\n"));
9440           goto no_gnu_hash;
9441         }
9442
9443       ngnubuckets = byte_get (nb, 4);
9444       gnusymidx = byte_get (nb + 4, 4);
9445       bitmaskwords = byte_get (nb + 8, 4);
9446       buckets_vma = dynamic_info_DT_GNU_HASH + 16;
9447       if (is_32bit_elf)
9448         buckets_vma += bitmaskwords * 4;
9449       else
9450         buckets_vma += bitmaskwords * 8;
9451
9452       if (fseek (file,
9453                  (archive_file_offset
9454                   + offset_from_vma (file, buckets_vma, 4)),
9455                  SEEK_SET))
9456         {
9457           error (_("Unable to seek to start of dynamic information\n"));
9458           goto no_gnu_hash;
9459         }
9460
9461       gnubuckets = get_dynamic_data (file, ngnubuckets, 4);
9462
9463       if (gnubuckets == NULL)
9464         goto no_gnu_hash;
9465
9466       for (i = 0; i < ngnubuckets; i++)
9467         if (gnubuckets[i] != 0)
9468           {
9469             if (gnubuckets[i] < gnusymidx)
9470               return 0;
9471
9472             if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
9473               maxchain = gnubuckets[i];
9474           }
9475
9476       if (maxchain == 0xffffffff)
9477         goto no_gnu_hash;
9478
9479       maxchain -= gnusymidx;
9480
9481       if (fseek (file,
9482                  (archive_file_offset
9483                   + offset_from_vma (file, buckets_vma
9484                                            + 4 * (ngnubuckets + maxchain), 4)),
9485                  SEEK_SET))
9486         {
9487           error (_("Unable to seek to start of dynamic information\n"));
9488           goto no_gnu_hash;
9489         }
9490
9491       do
9492         {
9493           if (fread (nb, 4, 1, file) != 1)
9494             {
9495               error (_("Failed to determine last chain length\n"));
9496               goto no_gnu_hash;
9497             }
9498
9499           if (maxchain + 1 == 0)
9500             goto no_gnu_hash;
9501
9502           ++maxchain;
9503         }
9504       while ((byte_get (nb, 4) & 1) == 0);
9505
9506       if (fseek (file,
9507                  (archive_file_offset
9508                   + offset_from_vma (file, buckets_vma + 4 * ngnubuckets, 4)),
9509                  SEEK_SET))
9510         {
9511           error (_("Unable to seek to start of dynamic information\n"));
9512           goto no_gnu_hash;
9513         }
9514
9515       gnuchains = get_dynamic_data (file, maxchain, 4);
9516
9517     no_gnu_hash:
9518       if (gnuchains == NULL)
9519         {
9520           free (gnubuckets);
9521           gnubuckets = NULL;
9522           ngnubuckets = 0;
9523           if (do_using_dynamic)
9524             return 0;
9525         }
9526     }
9527
9528   if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
9529       && do_syms
9530       && do_using_dynamic
9531       && dynamic_strings != NULL)
9532     {
9533       unsigned long hn;
9534
9535       if (dynamic_info[DT_HASH])
9536         {
9537           bfd_vma si;
9538
9539           printf (_("\nSymbol table for image:\n"));
9540           if (is_32bit_elf)
9541             printf (_("  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"));
9542           else
9543             printf (_("  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"));
9544
9545           for (hn = 0; hn < nbuckets; hn++)
9546             {
9547               if (! buckets[hn])
9548                 continue;
9549
9550               for (si = buckets[hn]; si < nchains && si > 0; si = chains[si])
9551                 print_dynamic_symbol (si, hn);
9552             }
9553         }
9554
9555       if (dynamic_info_DT_GNU_HASH)
9556         {
9557           printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
9558           if (is_32bit_elf)
9559             printf (_("  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"));
9560           else
9561             printf (_("  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"));
9562
9563           for (hn = 0; hn < ngnubuckets; ++hn)
9564             if (gnubuckets[hn] != 0)
9565               {
9566                 bfd_vma si = gnubuckets[hn];
9567                 bfd_vma off = si - gnusymidx;
9568
9569                 do
9570                   {
9571                     print_dynamic_symbol (si, hn);
9572                     si++;
9573                   }
9574                 while ((gnuchains[off++] & 1) == 0);
9575               }
9576         }
9577     }
9578   else if (do_dyn_syms || (do_syms && !do_using_dynamic))
9579     {
9580       unsigned int i;
9581
9582       for (i = 0, section = section_headers;
9583            i < elf_header.e_shnum;
9584            i++, section++)
9585         {
9586           unsigned int si;
9587           char * strtab = NULL;
9588           unsigned long int strtab_size = 0;
9589           Elf_Internal_Sym * symtab;
9590           Elf_Internal_Sym * psym;
9591           unsigned long num_syms;
9592
9593           if ((section->sh_type != SHT_SYMTAB
9594                && section->sh_type != SHT_DYNSYM)
9595               || (!do_syms
9596                   && section->sh_type == SHT_SYMTAB))
9597             continue;
9598
9599           if (section->sh_entsize == 0)
9600             {
9601               printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
9602                       SECTION_NAME (section));
9603               continue;
9604             }
9605
9606           printf (_("\nSymbol table '%s' contains %lu entries:\n"),
9607                   SECTION_NAME (section),
9608                   (unsigned long) (section->sh_size / section->sh_entsize));
9609
9610           if (is_32bit_elf)
9611             printf (_("   Num:    Value  Size Type    Bind   Vis      Ndx Name\n"));
9612           else
9613             printf (_("   Num:    Value          Size Type    Bind   Vis      Ndx Name\n"));
9614
9615           symtab = GET_ELF_SYMBOLS (file, section, & num_syms);
9616           if (symtab == NULL)
9617             continue;
9618
9619           if (section->sh_link == elf_header.e_shstrndx)
9620             {
9621               strtab = string_table;
9622               strtab_size = string_table_length;
9623             }
9624           else if (section->sh_link < elf_header.e_shnum)
9625             {
9626               Elf_Internal_Shdr * string_sec;
9627
9628               string_sec = section_headers + section->sh_link;
9629
9630               strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
9631                                           1, string_sec->sh_size,
9632                                           _("string table"));
9633               strtab_size = strtab != NULL ? string_sec->sh_size : 0;
9634             }
9635
9636           for (si = 0, psym = symtab; si < num_syms; si++, psym++)
9637             {
9638               printf ("%6d: ", si);
9639               print_vma (psym->st_value, LONG_HEX);
9640               putchar (' ');
9641               print_vma (psym->st_size, DEC_5);
9642               printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
9643               printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
9644               printf (" %-7s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
9645               /* Check to see if any other bits in the st_other field are set.
9646                  Note - displaying this information disrupts the layout of the
9647                  table being generated, but for the moment this case is very rare.  */
9648               if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
9649                 printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
9650               printf (" %4s ", get_symbol_index_type (psym->st_shndx));
9651               print_symbol (25, psym->st_name < strtab_size
9652                             ? strtab + psym->st_name : _("<corrupt>"));
9653
9654               if (section->sh_type == SHT_DYNSYM
9655                   && version_info[DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
9656                 {
9657                   unsigned char data[2];
9658                   unsigned short vers_data;
9659                   unsigned long offset;
9660                   int is_nobits;
9661                   int check_def;
9662
9663                   offset = offset_from_vma
9664                     (file, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
9665                      sizeof data + si * sizeof (vers_data));
9666
9667                   if (get_data (&data, file, offset + si * sizeof (vers_data),
9668                                 sizeof (data), 1, _("version data")) == NULL)
9669                     break;
9670
9671                   vers_data = byte_get (data, 2);
9672
9673                   is_nobits = (psym->st_shndx < elf_header.e_shnum
9674                                && section_headers[psym->st_shndx].sh_type
9675                                   == SHT_NOBITS);
9676
9677                   check_def = (psym->st_shndx != SHN_UNDEF);
9678
9679                   if ((vers_data & VERSYM_HIDDEN) || vers_data > 1)
9680                     {
9681                       if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)]
9682                           && (is_nobits || ! check_def))
9683                         {
9684                           Elf_External_Verneed evn;
9685                           Elf_Internal_Verneed ivn;
9686                           Elf_Internal_Vernaux ivna;
9687
9688                           /* We must test both.  */
9689                           offset = offset_from_vma
9690                             (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
9691                              sizeof evn);
9692
9693                           do
9694                             {
9695                               unsigned long vna_off;
9696
9697                               if (get_data (&evn, file, offset, sizeof (evn), 1,
9698                                             _("version need")) == NULL)
9699                                 {
9700                                   ivna.vna_next = 0;
9701                                   ivna.vna_other = 0;
9702                                   ivna.vna_name = 0;
9703                                   break;
9704                                 }
9705
9706                               ivn.vn_aux  = BYTE_GET (evn.vn_aux);
9707                               ivn.vn_next = BYTE_GET (evn.vn_next);
9708
9709                               vna_off = offset + ivn.vn_aux;
9710
9711                               do
9712                                 {
9713                                   Elf_External_Vernaux evna;
9714
9715                                   if (get_data (&evna, file, vna_off,
9716                                                 sizeof (evna), 1,
9717                                                 _("version need aux (3)")) == NULL)
9718                                     {
9719                                       ivna.vna_next = 0;
9720                                       ivna.vna_other = 0;
9721                                       ivna.vna_name = 0;
9722                                     }
9723                                   else
9724                                     {
9725                                       ivna.vna_other = BYTE_GET (evna.vna_other);
9726                                       ivna.vna_next  = BYTE_GET (evna.vna_next);
9727                                       ivna.vna_name  = BYTE_GET (evna.vna_name);
9728                                     }
9729
9730                                   vna_off += ivna.vna_next;
9731                                 }
9732                               while (ivna.vna_other != vers_data
9733                                      && ivna.vna_next != 0);
9734
9735                               if (ivna.vna_other == vers_data)
9736                                 break;
9737
9738                               offset += ivn.vn_next;
9739                             }
9740                           while (ivn.vn_next != 0);
9741
9742                           if (ivna.vna_other == vers_data)
9743                             {
9744                               printf ("@%s (%d)",
9745                                       ivna.vna_name < strtab_size
9746                                       ? strtab + ivna.vna_name : _("<corrupt>"),
9747                                       ivna.vna_other);
9748                               check_def = 0;
9749                             }
9750                           else if (! is_nobits)
9751                             error (_("bad dynamic symbol\n"));
9752                           else
9753                             check_def = 1;
9754                         }
9755
9756                       if (check_def)
9757                         {
9758                           if (vers_data != 0x8001
9759                               && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
9760                             {
9761                               Elf_Internal_Verdef ivd;
9762                               Elf_Internal_Verdaux ivda;
9763                               Elf_External_Verdaux evda;
9764                               unsigned long off;
9765
9766                               off = offset_from_vma
9767                                 (file,
9768                                  version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
9769                                  sizeof (Elf_External_Verdef));
9770
9771                               do
9772                                 {
9773                                   Elf_External_Verdef evd;
9774
9775                                   if (get_data (&evd, file, off, sizeof (evd),
9776                                                 1, _("version def")) == NULL)
9777                                     {
9778                                       ivd.vd_ndx = 0;
9779                                       ivd.vd_aux = 0;
9780                                       ivd.vd_next = 0;
9781                                     }
9782                                   else
9783                                     {
9784                                       ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
9785                                       ivd.vd_aux = BYTE_GET (evd.vd_aux);
9786                                       ivd.vd_next = BYTE_GET (evd.vd_next);
9787                                     }
9788
9789                                   off += ivd.vd_next;
9790                                 }
9791                               while (ivd.vd_ndx != (vers_data & VERSYM_VERSION)
9792                                      && ivd.vd_next != 0);
9793
9794                               off -= ivd.vd_next;
9795                               off += ivd.vd_aux;
9796
9797                               if (get_data (&evda, file, off, sizeof (evda),
9798                                             1, _("version def aux")) == NULL)
9799                                 break;
9800
9801                               ivda.vda_name = BYTE_GET (evda.vda_name);
9802
9803                               if (psym->st_name != ivda.vda_name)
9804                                 printf ((vers_data & VERSYM_HIDDEN)
9805                                         ? "@%s" : "@@%s",
9806                                         ivda.vda_name < strtab_size
9807                                         ? strtab + ivda.vda_name : _("<corrupt>"));
9808                             }
9809                         }
9810                     }
9811                 }
9812
9813               putchar ('\n');
9814             }
9815
9816           free (symtab);
9817           if (strtab != string_table)
9818             free (strtab);
9819         }
9820     }
9821   else if (do_syms)
9822     printf
9823       (_("\nDynamic symbol information is not available for displaying symbols.\n"));
9824
9825   if (do_histogram && buckets != NULL)
9826     {
9827       unsigned long * lengths;
9828       unsigned long * counts;
9829       unsigned long hn;
9830       bfd_vma si;
9831       unsigned long maxlength = 0;
9832       unsigned long nzero_counts = 0;
9833       unsigned long nsyms = 0;
9834
9835       printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
9836               (unsigned long) nbuckets);
9837       printf (_(" Length  Number     %% of total  Coverage\n"));
9838
9839       lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
9840       if (lengths == NULL)
9841         {
9842           error (_("Out of memory\n"));
9843           return 0;
9844         }
9845       for (hn = 0; hn < nbuckets; ++hn)
9846         {
9847           for (si = buckets[hn]; si > 0 && si < nchains; si = chains[si])
9848             {
9849               ++nsyms;
9850               if (maxlength < ++lengths[hn])
9851                 ++maxlength;
9852             }
9853         }
9854
9855       counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
9856       if (counts == NULL)
9857         {
9858           error (_("Out of memory\n"));
9859           return 0;
9860         }
9861
9862       for (hn = 0; hn < nbuckets; ++hn)
9863         ++counts[lengths[hn]];
9864
9865       if (nbuckets > 0)
9866         {
9867           unsigned long i;
9868           printf ("      0  %-10lu (%5.1f%%)\n",
9869                   counts[0], (counts[0] * 100.0) / nbuckets);
9870           for (i = 1; i <= maxlength; ++i)
9871             {
9872               nzero_counts += counts[i] * i;
9873               printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
9874                       i, counts[i], (counts[i] * 100.0) / nbuckets,
9875                       (nzero_counts * 100.0) / nsyms);
9876             }
9877         }
9878
9879       free (counts);
9880       free (lengths);
9881     }
9882
9883   if (buckets != NULL)
9884     {
9885       free (buckets);
9886       free (chains);
9887     }
9888
9889   if (do_histogram && gnubuckets != NULL)
9890     {
9891       unsigned long * lengths;
9892       unsigned long * counts;
9893       unsigned long hn;
9894       unsigned long maxlength = 0;
9895       unsigned long nzero_counts = 0;
9896       unsigned long nsyms = 0;
9897
9898       lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
9899       if (lengths == NULL)
9900         {
9901           error (_("Out of memory\n"));
9902           return 0;
9903         }
9904
9905       printf (_("\nHistogram for `.gnu.hash' bucket list length (total of %lu buckets):\n"),
9906               (unsigned long) ngnubuckets);
9907       printf (_(" Length  Number     %% of total  Coverage\n"));
9908
9909       for (hn = 0; hn < ngnubuckets; ++hn)
9910         if (gnubuckets[hn] != 0)
9911           {
9912             bfd_vma off, length = 1;
9913
9914             for (off = gnubuckets[hn] - gnusymidx;
9915                  (gnuchains[off] & 1) == 0; ++off)
9916               ++length;
9917             lengths[hn] = length;
9918             if (length > maxlength)
9919               maxlength = length;
9920             nsyms += length;
9921           }
9922
9923       counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
9924       if (counts == NULL)
9925         {
9926           error (_("Out of memory\n"));
9927           return 0;
9928         }
9929
9930       for (hn = 0; hn < ngnubuckets; ++hn)
9931         ++counts[lengths[hn]];
9932
9933       if (ngnubuckets > 0)
9934         {
9935           unsigned long j;
9936           printf ("      0  %-10lu (%5.1f%%)\n",
9937                   counts[0], (counts[0] * 100.0) / ngnubuckets);
9938           for (j = 1; j <= maxlength; ++j)
9939             {
9940               nzero_counts += counts[j] * j;
9941               printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
9942                       j, counts[j], (counts[j] * 100.0) / ngnubuckets,
9943                       (nzero_counts * 100.0) / nsyms);
9944             }
9945         }
9946
9947       free (counts);
9948       free (lengths);
9949       free (gnubuckets);
9950       free (gnuchains);
9951     }
9952
9953   return 1;
9954 }
9955
9956 static int
9957 process_syminfo (FILE * file ATTRIBUTE_UNUSED)
9958 {
9959   unsigned int i;
9960
9961   if (dynamic_syminfo == NULL
9962       || !do_dynamic)
9963     /* No syminfo, this is ok.  */
9964     return 1;
9965
9966   /* There better should be a dynamic symbol section.  */
9967   if (dynamic_symbols == NULL || dynamic_strings == NULL)
9968     return 0;
9969
9970   if (dynamic_addr)
9971     printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
9972             dynamic_syminfo_offset, dynamic_syminfo_nent);
9973
9974   printf (_(" Num: Name                           BoundTo     Flags\n"));
9975   for (i = 0; i < dynamic_syminfo_nent; ++i)
9976     {
9977       unsigned short int flags = dynamic_syminfo[i].si_flags;
9978
9979       printf ("%4d: ", i);
9980       if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
9981         print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
9982       else
9983         printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
9984       putchar (' ');
9985
9986       switch (dynamic_syminfo[i].si_boundto)
9987         {
9988         case SYMINFO_BT_SELF:
9989           fputs ("SELF       ", stdout);
9990           break;
9991         case SYMINFO_BT_PARENT:
9992           fputs ("PARENT     ", stdout);
9993           break;
9994         default:
9995           if (dynamic_syminfo[i].si_boundto > 0
9996               && dynamic_syminfo[i].si_boundto < dynamic_nent
9997               && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
9998             {
9999               print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
10000               putchar (' ' );
10001             }
10002           else
10003             printf ("%-10d ", dynamic_syminfo[i].si_boundto);
10004           break;
10005         }
10006
10007       if (flags & SYMINFO_FLG_DIRECT)
10008         printf (" DIRECT");
10009       if (flags & SYMINFO_FLG_PASSTHRU)
10010         printf (" PASSTHRU");
10011       if (flags & SYMINFO_FLG_COPY)
10012         printf (" COPY");
10013       if (flags & SYMINFO_FLG_LAZYLOAD)
10014         printf (" LAZYLOAD");
10015
10016       puts ("");
10017     }
10018
10019   return 1;
10020 }
10021
10022 /* Check to see if the given reloc needs to be handled in a target specific
10023    manner.  If so then process the reloc and return TRUE otherwise return
10024    FALSE.  */
10025
10026 static bfd_boolean
10027 target_specific_reloc_handling (Elf_Internal_Rela * reloc,
10028                                 unsigned char *     start,
10029                                 Elf_Internal_Sym *  symtab)
10030 {
10031   unsigned int reloc_type = get_reloc_type (reloc->r_info);
10032
10033   switch (elf_header.e_machine)
10034     {
10035     case EM_MSP430:
10036     case EM_MSP430_OLD:
10037       {
10038         static Elf_Internal_Sym * saved_sym = NULL;
10039
10040         switch (reloc_type)
10041           {
10042           case 10: /* R_MSP430_SYM_DIFF */
10043             if (uses_msp430x_relocs ())
10044               break;
10045           case 21: /* R_MSP430X_SYM_DIFF */
10046             saved_sym = symtab + get_reloc_symindex (reloc->r_info);
10047             return TRUE;
10048
10049           case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
10050           case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
10051             goto handle_sym_diff;
10052             
10053           case 5: /* R_MSP430_16_BYTE */
10054           case 9: /* R_MSP430_8 */
10055             if (uses_msp430x_relocs ())
10056               break;
10057             goto handle_sym_diff;
10058
10059           case 2: /* R_MSP430_ABS16 */
10060           case 15: /* R_MSP430X_ABS16 */
10061             if (! uses_msp430x_relocs ())
10062               break;
10063             goto handle_sym_diff;
10064             
10065           handle_sym_diff:
10066             if (saved_sym != NULL)
10067               {
10068                 bfd_vma value;
10069
10070                 value = reloc->r_addend
10071                   + (symtab[get_reloc_symindex (reloc->r_info)].st_value
10072                      - saved_sym->st_value);
10073
10074                 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
10075
10076                 saved_sym = NULL;
10077                 return TRUE;
10078               }
10079             break;
10080
10081           default:
10082             if (saved_sym != NULL)
10083               error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc"));
10084             break;
10085           }
10086         break;
10087       }
10088
10089     case EM_MN10300:
10090     case EM_CYGNUS_MN10300:
10091       {
10092         static Elf_Internal_Sym * saved_sym = NULL;
10093
10094         switch (reloc_type)
10095           {
10096           case 34: /* R_MN10300_ALIGN */
10097             return TRUE;
10098           case 33: /* R_MN10300_SYM_DIFF */
10099             saved_sym = symtab + get_reloc_symindex (reloc->r_info);
10100             return TRUE;
10101           case 1: /* R_MN10300_32 */
10102           case 2: /* R_MN10300_16 */
10103             if (saved_sym != NULL)
10104               {
10105                 bfd_vma value;
10106
10107                 value = reloc->r_addend
10108                   + (symtab[get_reloc_symindex (reloc->r_info)].st_value
10109                      - saved_sym->st_value);
10110
10111                 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
10112
10113                 saved_sym = NULL;
10114                 return TRUE;
10115               }
10116             break;
10117           default:
10118             if (saved_sym != NULL)
10119               error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc"));
10120             break;
10121           }
10122         break;
10123       }
10124     }
10125
10126   return FALSE;
10127 }
10128
10129 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
10130    DWARF debug sections.  This is a target specific test.  Note - we do not
10131    go through the whole including-target-headers-multiple-times route, (as
10132    we have already done with <elf/h8.h>) because this would become very
10133    messy and even then this function would have to contain target specific
10134    information (the names of the relocs instead of their numeric values).
10135    FIXME: This is not the correct way to solve this problem.  The proper way
10136    is to have target specific reloc sizing and typing functions created by
10137    the reloc-macros.h header, in the same way that it already creates the
10138    reloc naming functions.  */
10139
10140 static bfd_boolean
10141 is_32bit_abs_reloc (unsigned int reloc_type)
10142 {
10143   switch (elf_header.e_machine)
10144     {
10145     case EM_386:
10146     case EM_486:
10147       return reloc_type == 1; /* R_386_32.  */
10148     case EM_68K:
10149       return reloc_type == 1; /* R_68K_32.  */
10150     case EM_860:
10151       return reloc_type == 1; /* R_860_32.  */
10152     case EM_960:
10153       return reloc_type == 2; /* R_960_32.  */
10154     case EM_AARCH64:
10155       return reloc_type == 258; /* R_AARCH64_ABS32 */
10156     case EM_ALPHA:
10157       return reloc_type == 1; /* R_ALPHA_REFLONG.  */
10158     case EM_ARC:
10159       return reloc_type == 1; /* R_ARC_32.  */
10160     case EM_ARM:
10161       return reloc_type == 2; /* R_ARM_ABS32 */
10162     case EM_AVR_OLD:
10163     case EM_AVR:
10164       return reloc_type == 1;
10165     case EM_ADAPTEVA_EPIPHANY:
10166       return reloc_type == 3;
10167     case EM_BLACKFIN:
10168       return reloc_type == 0x12; /* R_byte4_data.  */
10169     case EM_CRIS:
10170       return reloc_type == 3; /* R_CRIS_32.  */
10171     case EM_CR16:
10172       return reloc_type == 3; /* R_CR16_NUM32.  */
10173     case EM_CRX:
10174       return reloc_type == 15; /* R_CRX_NUM32.  */
10175     case EM_CYGNUS_FRV:
10176       return reloc_type == 1;
10177     case EM_CYGNUS_D10V:
10178     case EM_D10V:
10179       return reloc_type == 6; /* R_D10V_32.  */
10180     case EM_CYGNUS_D30V:
10181     case EM_D30V:
10182       return reloc_type == 12; /* R_D30V_32_NORMAL.  */
10183     case EM_DLX:
10184       return reloc_type == 3; /* R_DLX_RELOC_32.  */
10185     case EM_CYGNUS_FR30:
10186     case EM_FR30:
10187       return reloc_type == 3; /* R_FR30_32.  */
10188     case EM_H8S:
10189     case EM_H8_300:
10190     case EM_H8_300H:
10191       return reloc_type == 1; /* R_H8_DIR32.  */
10192     case EM_IA_64:
10193       return reloc_type == 0x65; /* R_IA64_SECREL32LSB.  */
10194     case EM_IP2K_OLD:
10195     case EM_IP2K:
10196       return reloc_type == 2; /* R_IP2K_32.  */
10197     case EM_IQ2000:
10198       return reloc_type == 2; /* R_IQ2000_32.  */
10199     case EM_LATTICEMICO32:
10200       return reloc_type == 3; /* R_LM32_32.  */
10201     case EM_M32C_OLD:
10202     case EM_M32C:
10203       return reloc_type == 3; /* R_M32C_32.  */
10204     case EM_M32R:
10205       return reloc_type == 34; /* R_M32R_32_RELA.  */
10206     case EM_MCORE:
10207       return reloc_type == 1; /* R_MCORE_ADDR32.  */
10208     case EM_CYGNUS_MEP:
10209       return reloc_type == 4; /* R_MEP_32.  */
10210     case EM_METAG:
10211       return reloc_type == 2; /* R_METAG_ADDR32.  */
10212     case EM_MICROBLAZE:
10213       return reloc_type == 1; /* R_MICROBLAZE_32.  */
10214     case EM_MIPS:
10215       return reloc_type == 2; /* R_MIPS_32.  */
10216     case EM_MMIX:
10217       return reloc_type == 4; /* R_MMIX_32.  */
10218     case EM_CYGNUS_MN10200:
10219     case EM_MN10200:
10220       return reloc_type == 1; /* R_MN10200_32.  */
10221     case EM_CYGNUS_MN10300:
10222     case EM_MN10300:
10223       return reloc_type == 1; /* R_MN10300_32.  */
10224     case EM_MOXIE:
10225       return reloc_type == 1; /* R_MOXIE_32.  */
10226     case EM_MSP430_OLD:
10227     case EM_MSP430:
10228       return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32.  */
10229     case EM_MT:
10230       return reloc_type == 2; /* R_MT_32.  */
10231     case EM_ALTERA_NIOS2:
10232       return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32.  */
10233     case EM_NIOS32:
10234       return reloc_type == 1; /* R_NIOS_32.  */
10235     case EM_OPENRISC:
10236     case EM_OR32:
10237       return reloc_type == 1; /* R_OR32_32.  */
10238     case EM_PARISC:
10239       return (reloc_type == 1 /* R_PARISC_DIR32.  */
10240               || reloc_type == 41); /* R_PARISC_SECREL32.  */
10241     case EM_PJ:
10242     case EM_PJ_OLD:
10243       return reloc_type == 1; /* R_PJ_DATA_DIR32.  */
10244     case EM_PPC64:
10245       return reloc_type == 1; /* R_PPC64_ADDR32.  */
10246     case EM_PPC:
10247       return reloc_type == 1; /* R_PPC_ADDR32.  */
10248     case EM_RL78:
10249       return reloc_type == 1; /* R_RL78_DIR32.  */
10250     case EM_RX:
10251       return reloc_type == 1; /* R_RX_DIR32.  */
10252     case EM_S370:
10253       return reloc_type == 1; /* R_I370_ADDR31.  */
10254     case EM_S390_OLD:
10255     case EM_S390:
10256       return reloc_type == 4; /* R_S390_32.  */
10257     case EM_SCORE:
10258       return reloc_type == 8; /* R_SCORE_ABS32.  */
10259     case EM_SH:
10260       return reloc_type == 1; /* R_SH_DIR32.  */
10261     case EM_SPARC32PLUS:
10262     case EM_SPARCV9:
10263     case EM_SPARC:
10264       return reloc_type == 3 /* R_SPARC_32.  */
10265         || reloc_type == 23; /* R_SPARC_UA32.  */
10266     case EM_SPU:
10267       return reloc_type == 6; /* R_SPU_ADDR32 */
10268     case EM_TI_C6000:
10269       return reloc_type == 1; /* R_C6000_ABS32.  */
10270     case EM_TILEGX:
10271       return reloc_type == 2; /* R_TILEGX_32.  */
10272     case EM_TILEPRO:
10273       return reloc_type == 1; /* R_TILEPRO_32.  */
10274     case EM_CYGNUS_V850:
10275     case EM_V850:
10276       return reloc_type == 6; /* R_V850_ABS32.  */
10277     case EM_V800:
10278       return reloc_type == 0x33; /* R_V810_WORD.  */
10279     case EM_VAX:
10280       return reloc_type == 1; /* R_VAX_32.  */
10281     case EM_X86_64:
10282     case EM_L1OM:
10283     case EM_K1OM:
10284       return reloc_type == 10; /* R_X86_64_32.  */
10285     case EM_XC16X:
10286     case EM_C166:
10287       return reloc_type == 3; /* R_XC16C_ABS_32.  */
10288     case EM_XGATE:
10289       return reloc_type == 4; /* R_XGATE_32.  */
10290     case EM_XSTORMY16:
10291       return reloc_type == 1; /* R_XSTROMY16_32.  */
10292     case EM_XTENSA_OLD:
10293     case EM_XTENSA:
10294       return reloc_type == 1; /* R_XTENSA_32.  */
10295     default:
10296       error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
10297              elf_header.e_machine);
10298       abort ();
10299     }
10300 }
10301
10302 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
10303    a 32-bit pc-relative RELA relocation used in DWARF debug sections.  */
10304
10305 static bfd_boolean
10306 is_32bit_pcrel_reloc (unsigned int reloc_type)
10307 {
10308   switch (elf_header.e_machine)
10309     {
10310     case EM_386:
10311     case EM_486:
10312       return reloc_type == 2;  /* R_386_PC32.  */
10313     case EM_68K:
10314       return reloc_type == 4;  /* R_68K_PC32.  */
10315     case EM_AARCH64:
10316       return reloc_type == 261; /* R_AARCH64_PREL32 */
10317     case EM_ADAPTEVA_EPIPHANY:
10318       return reloc_type == 6;
10319     case EM_ALPHA:
10320       return reloc_type == 10; /* R_ALPHA_SREL32.  */
10321     case EM_ARM:
10322       return reloc_type == 3;  /* R_ARM_REL32 */
10323     case EM_MICROBLAZE:
10324       return reloc_type == 2;  /* R_MICROBLAZE_32_PCREL.  */
10325     case EM_PARISC:
10326       return reloc_type == 9;  /* R_PARISC_PCREL32.  */
10327     case EM_PPC:
10328       return reloc_type == 26; /* R_PPC_REL32.  */
10329     case EM_PPC64:
10330       return reloc_type == 26; /* R_PPC64_REL32.  */
10331     case EM_S390_OLD:
10332     case EM_S390:
10333       return reloc_type == 5;  /* R_390_PC32.  */
10334     case EM_SH:
10335       return reloc_type == 2;  /* R_SH_REL32.  */
10336     case EM_SPARC32PLUS:
10337     case EM_SPARCV9:
10338     case EM_SPARC:
10339       return reloc_type == 6;  /* R_SPARC_DISP32.  */
10340     case EM_SPU:
10341       return reloc_type == 13; /* R_SPU_REL32.  */
10342     case EM_TILEGX:
10343       return reloc_type == 6; /* R_TILEGX_32_PCREL.  */
10344     case EM_TILEPRO:
10345       return reloc_type == 4; /* R_TILEPRO_32_PCREL.  */
10346     case EM_X86_64:
10347     case EM_L1OM:
10348     case EM_K1OM:
10349       return reloc_type == 2;  /* R_X86_64_PC32.  */
10350     case EM_XTENSA_OLD:
10351     case EM_XTENSA:
10352       return reloc_type == 14; /* R_XTENSA_32_PCREL.  */
10353     default:
10354       /* Do not abort or issue an error message here.  Not all targets use
10355          pc-relative 32-bit relocs in their DWARF debug information and we
10356          have already tested for target coverage in is_32bit_abs_reloc.  A
10357          more helpful warning message will be generated by apply_relocations
10358          anyway, so just return.  */
10359       return FALSE;
10360     }
10361 }
10362
10363 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
10364    a 64-bit absolute RELA relocation used in DWARF debug sections.  */
10365
10366 static bfd_boolean
10367 is_64bit_abs_reloc (unsigned int reloc_type)
10368 {
10369   switch (elf_header.e_machine)
10370     {
10371     case EM_AARCH64:
10372       return reloc_type == 257; /* R_AARCH64_ABS64.  */
10373     case EM_ALPHA:
10374       return reloc_type == 2; /* R_ALPHA_REFQUAD.  */
10375     case EM_IA_64:
10376       return reloc_type == 0x27; /* R_IA64_DIR64LSB.  */
10377     case EM_PARISC:
10378       return reloc_type == 80; /* R_PARISC_DIR64.  */
10379     case EM_PPC64:
10380       return reloc_type == 38; /* R_PPC64_ADDR64.  */
10381     case EM_SPARC32PLUS:
10382     case EM_SPARCV9:
10383     case EM_SPARC:
10384       return reloc_type == 54; /* R_SPARC_UA64.  */
10385     case EM_X86_64:
10386     case EM_L1OM:
10387     case EM_K1OM:
10388       return reloc_type == 1; /* R_X86_64_64.  */
10389     case EM_S390_OLD:
10390     case EM_S390:
10391       return reloc_type == 22;  /* R_S390_64.  */
10392     case EM_TILEGX:
10393       return reloc_type == 1; /* R_TILEGX_64.  */
10394     case EM_MIPS:
10395       return reloc_type == 18;  /* R_MIPS_64.  */
10396     default:
10397       return FALSE;
10398     }
10399 }
10400
10401 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
10402    a 64-bit pc-relative RELA relocation used in DWARF debug sections.  */
10403
10404 static bfd_boolean
10405 is_64bit_pcrel_reloc (unsigned int reloc_type)
10406 {
10407   switch (elf_header.e_machine)
10408     {
10409     case EM_AARCH64:
10410       return reloc_type == 260; /* R_AARCH64_PREL64.  */
10411     case EM_ALPHA:
10412       return reloc_type == 11; /* R_ALPHA_SREL64.  */
10413     case EM_IA_64:
10414       return reloc_type == 0x4f; /* R_IA64_PCREL64LSB.  */
10415     case EM_PARISC:
10416       return reloc_type == 72; /* R_PARISC_PCREL64.  */
10417     case EM_PPC64:
10418       return reloc_type == 44; /* R_PPC64_REL64.  */
10419     case EM_SPARC32PLUS:
10420     case EM_SPARCV9:
10421     case EM_SPARC:
10422       return reloc_type == 46; /* R_SPARC_DISP64.  */
10423     case EM_X86_64:
10424     case EM_L1OM:
10425     case EM_K1OM:
10426       return reloc_type == 24; /* R_X86_64_PC64.  */
10427     case EM_S390_OLD:
10428     case EM_S390:
10429       return reloc_type == 23;  /* R_S390_PC64.  */
10430     case EM_TILEGX:
10431       return reloc_type == 5;  /* R_TILEGX_64_PCREL.  */
10432     default:
10433       return FALSE;
10434     }
10435 }
10436
10437 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
10438    a 24-bit absolute RELA relocation used in DWARF debug sections.  */
10439
10440 static bfd_boolean
10441 is_24bit_abs_reloc (unsigned int reloc_type)
10442 {
10443   switch (elf_header.e_machine)
10444     {
10445     case EM_CYGNUS_MN10200:
10446     case EM_MN10200:
10447       return reloc_type == 4; /* R_MN10200_24.  */
10448     default:
10449       return FALSE;
10450     }
10451 }
10452
10453 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
10454    a 16-bit absolute RELA relocation used in DWARF debug sections.  */
10455
10456 static bfd_boolean
10457 is_16bit_abs_reloc (unsigned int reloc_type)
10458 {
10459   switch (elf_header.e_machine)
10460     {
10461     case EM_AVR_OLD:
10462     case EM_AVR:
10463       return reloc_type == 4; /* R_AVR_16.  */
10464     case EM_ADAPTEVA_EPIPHANY:
10465       return reloc_type == 5;
10466     case EM_CYGNUS_D10V:
10467     case EM_D10V:
10468       return reloc_type == 3; /* R_D10V_16.  */
10469     case EM_H8S:
10470     case EM_H8_300:
10471     case EM_H8_300H:
10472       return reloc_type == R_H8_DIR16;
10473     case EM_IP2K_OLD:
10474     case EM_IP2K:
10475       return reloc_type == 1; /* R_IP2K_16.  */
10476     case EM_M32C_OLD:
10477     case EM_M32C:
10478       return reloc_type == 1; /* R_M32C_16 */
10479     case EM_MSP430:
10480       if (uses_msp430x_relocs ())
10481         return reloc_type == 2; /* R_MSP430_ABS16.  */
10482     case EM_MSP430_OLD:
10483       return reloc_type == 5; /* R_MSP430_16_BYTE.  */
10484     case EM_ALTERA_NIOS2:
10485       return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16.  */
10486     case EM_NIOS32:
10487       return reloc_type == 9; /* R_NIOS_16.  */
10488     case EM_TI_C6000:
10489       return reloc_type == 2; /* R_C6000_ABS16.  */
10490     case EM_XC16X:
10491     case EM_C166:
10492       return reloc_type == 2; /* R_XC16C_ABS_16.  */
10493     case EM_CYGNUS_MN10200:
10494     case EM_MN10200:
10495       return reloc_type == 2; /* R_MN10200_16.  */
10496     case EM_CYGNUS_MN10300:
10497     case EM_MN10300:
10498       return reloc_type == 2; /* R_MN10300_16.  */
10499     case EM_XGATE:
10500       return reloc_type == 3; /* R_XGATE_16.  */
10501     default:
10502       return FALSE;
10503     }
10504 }
10505
10506 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
10507    relocation entries (possibly formerly used for SHT_GROUP sections).  */
10508
10509 static bfd_boolean
10510 is_none_reloc (unsigned int reloc_type)
10511 {
10512   switch (elf_header.e_machine)
10513     {
10514     case EM_68K:     /* R_68K_NONE.  */
10515     case EM_386:     /* R_386_NONE.  */
10516     case EM_SPARC32PLUS:
10517     case EM_SPARCV9:
10518     case EM_SPARC:   /* R_SPARC_NONE.  */
10519     case EM_MIPS:    /* R_MIPS_NONE.  */
10520     case EM_PARISC:  /* R_PARISC_NONE.  */
10521     case EM_ALPHA:   /* R_ALPHA_NONE.  */
10522     case EM_ADAPTEVA_EPIPHANY:
10523     case EM_PPC:     /* R_PPC_NONE.  */
10524     case EM_PPC64:   /* R_PPC64_NONE.  */
10525     case EM_ARM:     /* R_ARM_NONE.  */
10526     case EM_IA_64:   /* R_IA64_NONE.  */
10527     case EM_SH:      /* R_SH_NONE.  */
10528     case EM_S390_OLD:
10529     case EM_S390:    /* R_390_NONE.  */
10530     case EM_CRIS:    /* R_CRIS_NONE.  */
10531     case EM_X86_64:  /* R_X86_64_NONE.  */
10532     case EM_L1OM:    /* R_X86_64_NONE.  */
10533     case EM_K1OM:    /* R_X86_64_NONE.  */
10534     case EM_MN10300: /* R_MN10300_NONE.  */
10535     case EM_MOXIE:   /* R_MOXIE_NONE.  */
10536     case EM_M32R:    /* R_M32R_NONE.  */
10537     case EM_TI_C6000:/* R_C6000_NONE.  */
10538     case EM_TILEGX:  /* R_TILEGX_NONE.  */
10539     case EM_TILEPRO: /* R_TILEPRO_NONE.  */
10540     case EM_XC16X:
10541     case EM_C166:    /* R_XC16X_NONE.  */
10542     case EM_ALTERA_NIOS2: /* R_NIOS2_NONE.  */
10543     case EM_NIOS32:  /* R_NIOS_NONE.  */
10544       return reloc_type == 0;
10545     case EM_AARCH64:
10546       return reloc_type == 0 || reloc_type == 256;
10547     case EM_XTENSA_OLD:
10548     case EM_XTENSA:
10549       return (reloc_type == 0      /* R_XTENSA_NONE.  */
10550               || reloc_type == 17  /* R_XTENSA_DIFF8.  */
10551               || reloc_type == 18  /* R_XTENSA_DIFF16.  */
10552               || reloc_type == 19  /* R_XTENSA_DIFF32.  */);
10553     case EM_METAG:
10554       return reloc_type == 3; /* R_METAG_NONE.  */
10555     }
10556   return FALSE;
10557 }
10558
10559 /* Apply relocations to a section.
10560    Note: So far support has been added only for those relocations
10561    which can be found in debug sections.
10562    FIXME: Add support for more relocations ?  */
10563
10564 static void
10565 apply_relocations (void * file,
10566                    Elf_Internal_Shdr * section,
10567                    unsigned char * start)
10568 {
10569   Elf_Internal_Shdr * relsec;
10570   unsigned char * end = start + section->sh_size;
10571
10572   if (elf_header.e_type != ET_REL)
10573     return;
10574
10575   /* Find the reloc section associated with the section.  */
10576   for (relsec = section_headers;
10577        relsec < section_headers + elf_header.e_shnum;
10578        ++relsec)
10579     {
10580       bfd_boolean is_rela;
10581       unsigned long num_relocs;
10582       Elf_Internal_Rela * relocs;
10583       Elf_Internal_Rela * rp;
10584       Elf_Internal_Shdr * symsec;
10585       Elf_Internal_Sym * symtab;
10586       unsigned long num_syms;
10587       Elf_Internal_Sym * sym;
10588
10589       if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
10590           || relsec->sh_info >= elf_header.e_shnum
10591           || section_headers + relsec->sh_info != section
10592           || relsec->sh_size == 0
10593           || relsec->sh_link >= elf_header.e_shnum)
10594         continue;
10595
10596       is_rela = relsec->sh_type == SHT_RELA;
10597
10598       if (is_rela)
10599         {
10600           if (!slurp_rela_relocs ((FILE *) file, relsec->sh_offset,
10601                                   relsec->sh_size, & relocs, & num_relocs))
10602             return;
10603         }
10604       else
10605         {
10606           if (!slurp_rel_relocs ((FILE *) file, relsec->sh_offset,
10607                                  relsec->sh_size, & relocs, & num_relocs))
10608             return;
10609         }
10610
10611       /* SH uses RELA but uses in place value instead of the addend field.  */
10612       if (elf_header.e_machine == EM_SH)
10613         is_rela = FALSE;
10614
10615       symsec = section_headers + relsec->sh_link;
10616       symtab = GET_ELF_SYMBOLS ((FILE *) file, symsec, & num_syms);
10617
10618       for (rp = relocs; rp < relocs + num_relocs; ++rp)
10619         {
10620           bfd_vma         addend;
10621           unsigned int    reloc_type;
10622           unsigned int    reloc_size;
10623           unsigned char * rloc;
10624           unsigned long   sym_index;
10625
10626           reloc_type = get_reloc_type (rp->r_info);
10627
10628           if (target_specific_reloc_handling (rp, start, symtab))
10629             continue;
10630           else if (is_none_reloc (reloc_type))
10631             continue;
10632           else if (is_32bit_abs_reloc (reloc_type)
10633                    || is_32bit_pcrel_reloc (reloc_type))
10634             reloc_size = 4;
10635           else if (is_64bit_abs_reloc (reloc_type)
10636                    || is_64bit_pcrel_reloc (reloc_type))
10637             reloc_size = 8;
10638           else if (is_24bit_abs_reloc (reloc_type))
10639             reloc_size = 3;
10640           else if (is_16bit_abs_reloc (reloc_type))
10641             reloc_size = 2;
10642           else
10643             {
10644               warn (_("unable to apply unsupported reloc type %d to section %s\n"),
10645                     reloc_type, SECTION_NAME (section));
10646               continue;
10647             }
10648
10649           rloc = start + rp->r_offset;
10650           if ((rloc + reloc_size) > end || (rloc < start))
10651             {
10652               warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
10653                     (unsigned long) rp->r_offset,
10654                     SECTION_NAME (section));
10655               continue;
10656             }
10657
10658           sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
10659           if (sym_index >= num_syms)
10660             {
10661               warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
10662                     sym_index, SECTION_NAME (section));
10663               continue;
10664             }
10665           sym = symtab + sym_index;
10666
10667           /* If the reloc has a symbol associated with it,
10668              make sure that it is of an appropriate type.
10669
10670              Relocations against symbols without type can happen.
10671              Gcc -feliminate-dwarf2-dups may generate symbols
10672              without type for debug info.
10673
10674              Icc generates relocations against function symbols
10675              instead of local labels.
10676
10677              Relocations against object symbols can happen, eg when
10678              referencing a global array.  For an example of this see
10679              the _clz.o binary in libgcc.a.  */
10680           if (sym != symtab
10681               && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
10682             {
10683               warn (_("skipping unexpected symbol type %s in %ld'th relocation in section %s\n"),
10684                     get_symbol_type (ELF_ST_TYPE (sym->st_info)),
10685                     (long int)(rp - relocs),
10686                     SECTION_NAME (relsec));
10687               continue;
10688             }
10689
10690           addend = 0;
10691           if (is_rela)
10692             addend += rp->r_addend;
10693           /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
10694              partial_inplace.  */
10695           if (!is_rela
10696               || (elf_header.e_machine == EM_XTENSA
10697                   && reloc_type == 1)
10698               || ((elf_header.e_machine == EM_PJ
10699                    || elf_header.e_machine == EM_PJ_OLD)
10700                   && reloc_type == 1)
10701               || ((elf_header.e_machine == EM_D30V
10702                    || elf_header.e_machine == EM_CYGNUS_D30V)
10703                   && reloc_type == 12))
10704             addend += byte_get (rloc, reloc_size);
10705
10706           if (is_32bit_pcrel_reloc (reloc_type)
10707               || is_64bit_pcrel_reloc (reloc_type))
10708             {
10709               /* On HPPA, all pc-relative relocations are biased by 8.  */
10710               if (elf_header.e_machine == EM_PARISC)
10711                 addend -= 8;
10712               byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
10713                         reloc_size);
10714             }
10715           else
10716             byte_put (rloc, addend + sym->st_value, reloc_size);
10717         }
10718
10719       free (symtab);
10720       free (relocs);
10721       break;
10722     }
10723 }
10724
10725 #ifdef SUPPORT_DISASSEMBLY
10726 static int
10727 disassemble_section (Elf_Internal_Shdr * section, FILE * file)
10728 {
10729   printf (_("\nAssembly dump of section %s\n"),
10730           SECTION_NAME (section));
10731
10732   /* XXX -- to be done --- XXX */
10733
10734   return 1;
10735 }
10736 #endif
10737
10738 /* Reads in the contents of SECTION from FILE, returning a pointer
10739    to a malloc'ed buffer or NULL if something went wrong.  */
10740
10741 static char *
10742 get_section_contents (Elf_Internal_Shdr * section, FILE * file)
10743 {
10744   bfd_size_type num_bytes;
10745
10746   num_bytes = section->sh_size;
10747
10748   if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
10749     {
10750       printf (_("\nSection '%s' has no data to dump.\n"),
10751               SECTION_NAME (section));
10752       return NULL;
10753     }
10754
10755   return  (char *) get_data (NULL, file, section->sh_offset, 1, num_bytes,
10756                              _("section contents"));
10757 }
10758
10759
10760 static void
10761 dump_section_as_strings (Elf_Internal_Shdr * section, FILE * file)
10762 {
10763   Elf_Internal_Shdr * relsec;
10764   bfd_size_type num_bytes;
10765   char * data;
10766   char * end;
10767   char * start;
10768   char * name = SECTION_NAME (section);
10769   bfd_boolean some_strings_shown;
10770
10771   start = get_section_contents (section, file);
10772   if (start == NULL)
10773     return;
10774
10775   printf (_("\nString dump of section '%s':\n"), name);
10776
10777   /* If the section being dumped has relocations against it the user might
10778      be expecting these relocations to have been applied.  Check for this
10779      case and issue a warning message in order to avoid confusion.
10780      FIXME: Maybe we ought to have an option that dumps a section with
10781      relocs applied ?  */
10782   for (relsec = section_headers;
10783        relsec < section_headers + elf_header.e_shnum;
10784        ++relsec)
10785     {
10786       if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
10787           || relsec->sh_info >= elf_header.e_shnum
10788           || section_headers + relsec->sh_info != section
10789           || relsec->sh_size == 0
10790           || relsec->sh_link >= elf_header.e_shnum)
10791         continue;
10792
10793       printf (_("  Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
10794       break;
10795     }
10796
10797   num_bytes = section->sh_size;
10798   data = start;
10799   end  = start + num_bytes;
10800   some_strings_shown = FALSE;
10801
10802   while (data < end)
10803     {
10804       while (!ISPRINT (* data))
10805         if (++ data >= end)
10806           break;
10807
10808       if (data < end)
10809         {
10810 #ifndef __MSVCRT__
10811           /* PR 11128: Use two separate invocations in order to work
10812              around bugs in the Solaris 8 implementation of printf.  */
10813           printf ("  [%6tx]  ", data - start);
10814           printf ("%s\n", data);
10815 #else
10816           printf ("  [%6Ix]  %s\n", (size_t) (data - start), data);
10817 #endif
10818           data += strlen (data);
10819           some_strings_shown = TRUE;
10820         }
10821     }
10822
10823   if (! some_strings_shown)
10824     printf (_("  No strings found in this section."));
10825
10826   free (start);
10827
10828   putchar ('\n');
10829 }
10830
10831 static void
10832 dump_section_as_bytes (Elf_Internal_Shdr * section,
10833                        FILE * file,
10834                        bfd_boolean relocate)
10835 {
10836   Elf_Internal_Shdr * relsec;
10837   bfd_size_type bytes;
10838   bfd_vma addr;
10839   unsigned char * data;
10840   unsigned char * start;
10841
10842   start = (unsigned char *) get_section_contents (section, file);
10843   if (start == NULL)
10844     return;
10845
10846   printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section));
10847
10848   if (relocate)
10849     {
10850       apply_relocations (file, section, start);
10851     }
10852   else
10853     {
10854       /* If the section being dumped has relocations against it the user might
10855          be expecting these relocations to have been applied.  Check for this
10856          case and issue a warning message in order to avoid confusion.
10857          FIXME: Maybe we ought to have an option that dumps a section with
10858          relocs applied ?  */
10859       for (relsec = section_headers;
10860            relsec < section_headers + elf_header.e_shnum;
10861            ++relsec)
10862         {
10863           if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
10864               || relsec->sh_info >= elf_header.e_shnum
10865               || section_headers + relsec->sh_info != section
10866               || relsec->sh_size == 0
10867               || relsec->sh_link >= elf_header.e_shnum)
10868             continue;
10869
10870           printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
10871           break;
10872         }
10873     }
10874
10875   addr = section->sh_addr;
10876   bytes = section->sh_size;
10877   data = start;
10878
10879   while (bytes)
10880     {
10881       int j;
10882       int k;
10883       int lbytes;
10884
10885       lbytes = (bytes > 16 ? 16 : bytes);
10886
10887       printf ("  0x%8.8lx ", (unsigned long) addr);
10888
10889       for (j = 0; j < 16; j++)
10890         {
10891           if (j < lbytes)
10892             printf ("%2.2x", data[j]);
10893           else
10894             printf ("  ");
10895
10896           if ((j & 3) == 3)
10897             printf (" ");
10898         }
10899
10900       for (j = 0; j < lbytes; j++)
10901         {
10902           k = data[j];
10903           if (k >= ' ' && k < 0x7f)
10904             printf ("%c", k);
10905           else
10906             printf (".");
10907         }
10908
10909       putchar ('\n');
10910
10911       data  += lbytes;
10912       addr  += lbytes;
10913       bytes -= lbytes;
10914     }
10915
10916   free (start);
10917
10918   putchar ('\n');
10919 }
10920
10921 /* Uncompresses a section that was compressed using zlib, in place.  */
10922
10923 static int
10924 uncompress_section_contents (unsigned char **buffer ATTRIBUTE_UNUSED,
10925                              dwarf_size_type *size ATTRIBUTE_UNUSED)
10926 {
10927 #ifndef HAVE_ZLIB_H
10928   return FALSE;
10929 #else
10930   dwarf_size_type compressed_size = *size;
10931   unsigned char * compressed_buffer = *buffer;
10932   dwarf_size_type uncompressed_size;
10933   unsigned char * uncompressed_buffer;
10934   z_stream strm;
10935   int rc;
10936   dwarf_size_type header_size = 12;
10937
10938   /* Read the zlib header.  In this case, it should be "ZLIB" followed
10939      by the uncompressed section size, 8 bytes in big-endian order.  */
10940   if (compressed_size < header_size
10941       || ! streq ((char *) compressed_buffer, "ZLIB"))
10942     return 0;
10943
10944   uncompressed_size = compressed_buffer[4]; uncompressed_size <<= 8;
10945   uncompressed_size += compressed_buffer[5]; uncompressed_size <<= 8;
10946   uncompressed_size += compressed_buffer[6]; uncompressed_size <<= 8;
10947   uncompressed_size += compressed_buffer[7]; uncompressed_size <<= 8;
10948   uncompressed_size += compressed_buffer[8]; uncompressed_size <<= 8;
10949   uncompressed_size += compressed_buffer[9]; uncompressed_size <<= 8;
10950   uncompressed_size += compressed_buffer[10]; uncompressed_size <<= 8;
10951   uncompressed_size += compressed_buffer[11];
10952
10953   /* It is possible the section consists of several compressed
10954      buffers concatenated together, so we uncompress in a loop.  */
10955   strm.zalloc = NULL;
10956   strm.zfree = NULL;
10957   strm.opaque = NULL;
10958   strm.avail_in = compressed_size - header_size;
10959   strm.next_in = (Bytef *) compressed_buffer + header_size;
10960   strm.avail_out = uncompressed_size;
10961   uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
10962
10963   rc = inflateInit (& strm);
10964   while (strm.avail_in > 0)
10965     {
10966       if (rc != Z_OK)
10967         goto fail;
10968       strm.next_out = ((Bytef *) uncompressed_buffer
10969                        + (uncompressed_size - strm.avail_out));
10970       rc = inflate (&strm, Z_FINISH);
10971       if (rc != Z_STREAM_END)
10972         goto fail;
10973       rc = inflateReset (& strm);
10974     }
10975   rc = inflateEnd (& strm);
10976   if (rc != Z_OK
10977       || strm.avail_out != 0)
10978     goto fail;
10979
10980   free (compressed_buffer);
10981   *buffer = uncompressed_buffer;
10982   *size = uncompressed_size;
10983   return 1;
10984
10985  fail:
10986   free (uncompressed_buffer);
10987   /* Indicate decompression failure.  */
10988   *buffer = NULL;
10989   return 0;
10990 #endif  /* HAVE_ZLIB_H */
10991 }
10992
10993 static int
10994 load_specific_debug_section (enum dwarf_section_display_enum debug,
10995                              Elf_Internal_Shdr * sec, void * file)
10996 {
10997   struct dwarf_section * section = &debug_displays [debug].section;
10998   char buf [64];
10999
11000   /* If it is already loaded, do nothing.  */
11001   if (section->start != NULL)
11002     return 1;
11003
11004   snprintf (buf, sizeof (buf), _("%s section data"), section->name);
11005   section->address = sec->sh_addr;
11006   section->start = (unsigned char *) get_data (NULL, (FILE *) file,
11007                                                sec->sh_offset, 1,
11008                                                sec->sh_size, buf);
11009   if (section->start == NULL)
11010     section->size = 0;
11011   else
11012     {
11013       section->size = sec->sh_size;
11014       if (uncompress_section_contents (&section->start, &section->size))
11015         sec->sh_size = section->size;
11016     }
11017
11018   if (section->start == NULL)
11019     return 0;
11020
11021   if (debug_displays [debug].relocate)
11022     apply_relocations ((FILE *) file, sec, section->start);
11023
11024   return 1;
11025 }
11026
11027 /* If this is not NULL, load_debug_section will only look for sections
11028    within the list of sections given here.  */
11029 unsigned int *section_subset = NULL;
11030
11031 int
11032 load_debug_section (enum dwarf_section_display_enum debug, void * file)
11033 {
11034   struct dwarf_section * section = &debug_displays [debug].section;
11035   Elf_Internal_Shdr * sec;
11036
11037   /* Locate the debug section.  */
11038   sec = find_section_in_set (section->uncompressed_name, section_subset);
11039   if (sec != NULL)
11040     section->name = section->uncompressed_name;
11041   else
11042     {
11043       sec = find_section_in_set (section->compressed_name, section_subset);
11044       if (sec != NULL)
11045         section->name = section->compressed_name;
11046     }
11047   if (sec == NULL)
11048     return 0;
11049
11050   /* If we're loading from a subset of sections, and we've loaded
11051      a section matching this name before, it's likely that it's a
11052      different one.  */
11053   if (section_subset != NULL)
11054     free_debug_section (debug);
11055
11056   return load_specific_debug_section (debug, sec, (FILE *) file);
11057 }
11058
11059 void
11060 free_debug_section (enum dwarf_section_display_enum debug)
11061 {
11062   struct dwarf_section * section = &debug_displays [debug].section;
11063
11064   if (section->start == NULL)
11065     return;
11066
11067   free ((char *) section->start);
11068   section->start = NULL;
11069   section->address = 0;
11070   section->size = 0;
11071 }
11072
11073 static int
11074 display_debug_section (int shndx, Elf_Internal_Shdr * section, FILE * file)
11075 {
11076   char * name = SECTION_NAME (section);
11077   bfd_size_type length;
11078   int result = 1;
11079   int i;
11080
11081   length = section->sh_size;
11082   if (length == 0)
11083     {
11084       printf (_("\nSection '%s' has no debugging data.\n"), name);
11085       return 0;
11086     }
11087   if (section->sh_type == SHT_NOBITS)
11088     {
11089       /* There is no point in dumping the contents of a debugging section
11090          which has the NOBITS type - the bits in the file will be random.
11091          This can happen when a file containing a .eh_frame section is
11092          stripped with the --only-keep-debug command line option.  */
11093       printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"), name);
11094       return 0;
11095     }
11096
11097   if (const_strneq (name, ".gnu.linkonce.wi."))
11098     name = ".debug_info";
11099
11100   /* See if we know how to display the contents of this section.  */
11101   for (i = 0; i < max; i++)
11102     if (streq (debug_displays[i].section.uncompressed_name, name)
11103         || (i == line && const_strneq (name, ".debug_line."))
11104         || streq (debug_displays[i].section.compressed_name, name))
11105       {
11106         struct dwarf_section * sec = &debug_displays [i].section;
11107         int secondary = (section != find_section (name));
11108
11109         if (secondary)
11110           free_debug_section ((enum dwarf_section_display_enum) i);
11111
11112         if (i == line && const_strneq (name, ".debug_line."))
11113           sec->name = name;
11114         else if (streq (sec->uncompressed_name, name))
11115           sec->name = sec->uncompressed_name;
11116         else
11117           sec->name = sec->compressed_name;
11118         if (load_specific_debug_section ((enum dwarf_section_display_enum) i,
11119                                          section, file))
11120           {
11121             /* If this debug section is part of a CU/TU set in a .dwp file,
11122                restrict load_debug_section to the sections in that set.  */
11123             section_subset = find_cu_tu_set (file, shndx);
11124
11125             result &= debug_displays[i].display (sec, file);
11126
11127             section_subset = NULL;
11128
11129             if (secondary || (i != info && i != abbrev))
11130               free_debug_section ((enum dwarf_section_display_enum) i);
11131           }
11132
11133         break;
11134       }
11135
11136   if (i == max)
11137     {
11138       printf (_("Unrecognized debug section: %s\n"), name);
11139       result = 0;
11140     }
11141
11142   return result;
11143 }
11144
11145 /* Set DUMP_SECTS for all sections where dumps were requested
11146    based on section name.  */
11147
11148 static void
11149 initialise_dumps_byname (void)
11150 {
11151   struct dump_list_entry * cur;
11152
11153   for (cur = dump_sects_byname; cur; cur = cur->next)
11154     {
11155       unsigned int i;
11156       int any;
11157
11158       for (i = 0, any = 0; i < elf_header.e_shnum; i++)
11159         if (streq (SECTION_NAME (section_headers + i), cur->name))
11160           {
11161             request_dump_bynumber (i, cur->type);
11162             any = 1;
11163           }
11164
11165       if (!any)
11166         warn (_("Section '%s' was not dumped because it does not exist!\n"),
11167               cur->name);
11168     }
11169 }
11170
11171 static void
11172 process_section_contents (FILE * file)
11173 {
11174   Elf_Internal_Shdr * section;
11175   unsigned int i;
11176
11177   if (! do_dump)
11178     return;
11179
11180   initialise_dumps_byname ();
11181
11182   for (i = 0, section = section_headers;
11183        i < elf_header.e_shnum && i < num_dump_sects;
11184        i++, section++)
11185     {
11186 #ifdef SUPPORT_DISASSEMBLY
11187       if (dump_sects[i] & DISASS_DUMP)
11188         disassemble_section (section, file);
11189 #endif
11190       if (dump_sects[i] & HEX_DUMP)
11191         dump_section_as_bytes (section, file, FALSE);
11192
11193       if (dump_sects[i] & RELOC_DUMP)
11194         dump_section_as_bytes (section, file, TRUE);
11195
11196       if (dump_sects[i] & STRING_DUMP)
11197         dump_section_as_strings (section, file);
11198
11199       if (dump_sects[i] & DEBUG_DUMP)
11200         display_debug_section (i, section, file);
11201     }
11202
11203   /* Check to see if the user requested a
11204      dump of a section that does not exist.  */
11205   while (i++ < num_dump_sects)
11206     if (dump_sects[i])
11207       warn (_("Section %d was not dumped because it does not exist!\n"), i);
11208 }
11209
11210 static void
11211 process_mips_fpe_exception (int mask)
11212 {
11213   if (mask)
11214     {
11215       int first = 1;
11216       if (mask & OEX_FPU_INEX)
11217         fputs ("INEX", stdout), first = 0;
11218       if (mask & OEX_FPU_UFLO)
11219         printf ("%sUFLO", first ? "" : "|"), first = 0;
11220       if (mask & OEX_FPU_OFLO)
11221         printf ("%sOFLO", first ? "" : "|"), first = 0;
11222       if (mask & OEX_FPU_DIV0)
11223         printf ("%sDIV0", first ? "" : "|"), first = 0;
11224       if (mask & OEX_FPU_INVAL)
11225         printf ("%sINVAL", first ? "" : "|");
11226     }
11227   else
11228     fputs ("0", stdout);
11229 }
11230
11231 /* Display's the value of TAG at location P.  If TAG is
11232    greater than 0 it is assumed to be an unknown tag, and
11233    a message is printed to this effect.  Otherwise it is
11234    assumed that a message has already been printed.
11235
11236    If the bottom bit of TAG is set it assumed to have a
11237    string value, otherwise it is assumed to have an integer
11238    value.
11239
11240    Returns an updated P pointing to the first unread byte
11241    beyond the end of TAG's value.
11242
11243    Reads at or beyond END will not be made.  */
11244
11245 static unsigned char *
11246 display_tag_value (int tag,
11247                    unsigned char * p,
11248                    const unsigned char * const end)
11249 {
11250   unsigned long val;
11251
11252   if (tag > 0)
11253     printf ("  Tag_unknown_%d: ", tag);
11254
11255   if (p >= end)
11256     {
11257       warn (_("corrupt tag\n"));
11258     }
11259   else if (tag & 1)
11260     {
11261       /* FIXME: we could read beyond END here.  */
11262       printf ("\"%s\"\n", p);
11263       p += strlen ((char *) p) + 1;
11264     }
11265   else
11266     {
11267       unsigned int len;
11268
11269       val = read_uleb128 (p, &len, end);
11270       p += len;
11271       printf ("%ld (0x%lx)\n", val, val);
11272     }
11273
11274   return p;
11275 }
11276
11277 /* ARM EABI attributes section.  */
11278 typedef struct
11279 {
11280   int tag;
11281   const char * name;
11282   /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup.  */
11283   int type;
11284   const char ** table;
11285 } arm_attr_public_tag;
11286
11287 static const char * arm_attr_tag_CPU_arch[] =
11288   {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
11289    "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8"};
11290 static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
11291 static const char * arm_attr_tag_THUMB_ISA_use[] =
11292   {"No", "Thumb-1", "Thumb-2"};
11293 static const char * arm_attr_tag_FP_arch[] =
11294   {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
11295    "FP for ARMv8"};
11296 static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
11297 static const char * arm_attr_tag_Advanced_SIMD_arch[] =
11298   {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8"};
11299 static const char * arm_attr_tag_PCS_config[] =
11300   {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
11301    "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
11302 static const char * arm_attr_tag_ABI_PCS_R9_use[] =
11303   {"V6", "SB", "TLS", "Unused"};
11304 static const char * arm_attr_tag_ABI_PCS_RW_data[] =
11305   {"Absolute", "PC-relative", "SB-relative", "None"};
11306 static const char * arm_attr_tag_ABI_PCS_RO_data[] =
11307   {"Absolute", "PC-relative", "None"};
11308 static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
11309   {"None", "direct", "GOT-indirect"};
11310 static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
11311   {"None", "??? 1", "2", "??? 3", "4"};
11312 static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
11313 static const char * arm_attr_tag_ABI_FP_denormal[] =
11314   {"Unused", "Needed", "Sign only"};
11315 static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
11316 static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
11317 static const char * arm_attr_tag_ABI_FP_number_model[] =
11318   {"Unused", "Finite", "RTABI", "IEEE 754"};
11319 static const char * arm_attr_tag_ABI_enum_size[] =
11320   {"Unused", "small", "int", "forced to int"};
11321 static const char * arm_attr_tag_ABI_HardFP_use[] =
11322   {"As Tag_FP_arch", "SP only", "DP only", "SP and DP"};
11323 static const char * arm_attr_tag_ABI_VFP_args[] =
11324   {"AAPCS", "VFP registers", "custom"};
11325 static const char * arm_attr_tag_ABI_WMMX_args[] =
11326   {"AAPCS", "WMMX registers", "custom"};
11327 static const char * arm_attr_tag_ABI_optimization_goals[] =
11328   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
11329     "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
11330 static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
11331   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
11332     "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
11333 static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
11334 static const char * arm_attr_tag_FP_HP_extension[] =
11335   {"Not Allowed", "Allowed"};
11336 static const char * arm_attr_tag_ABI_FP_16bit_format[] =
11337   {"None", "IEEE 754", "Alternative Format"};
11338 static const char * arm_attr_tag_MPextension_use[] =
11339   {"Not Allowed", "Allowed"};
11340 static const char * arm_attr_tag_DIV_use[] =
11341   {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
11342     "Allowed in v7-A with integer division extension"};
11343 static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
11344 static const char * arm_attr_tag_Virtualization_use[] =
11345   {"Not Allowed", "TrustZone", "Virtualization Extensions",
11346     "TrustZone and Virtualization Extensions"};
11347 static const char * arm_attr_tag_MPextension_use_legacy[] =
11348   {"Not Allowed", "Allowed"};
11349
11350 #define LOOKUP(id, name) \
11351   {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
11352 static arm_attr_public_tag arm_attr_public_tags[] =
11353 {
11354   {4, "CPU_raw_name", 1, NULL},
11355   {5, "CPU_name", 1, NULL},
11356   LOOKUP(6, CPU_arch),
11357   {7, "CPU_arch_profile", 0, NULL},
11358   LOOKUP(8, ARM_ISA_use),
11359   LOOKUP(9, THUMB_ISA_use),
11360   LOOKUP(10, FP_arch),
11361   LOOKUP(11, WMMX_arch),
11362   LOOKUP(12, Advanced_SIMD_arch),
11363   LOOKUP(13, PCS_config),
11364   LOOKUP(14, ABI_PCS_R9_use),
11365   LOOKUP(15, ABI_PCS_RW_data),
11366   LOOKUP(16, ABI_PCS_RO_data),
11367   LOOKUP(17, ABI_PCS_GOT_use),
11368   LOOKUP(18, ABI_PCS_wchar_t),
11369   LOOKUP(19, ABI_FP_rounding),
11370   LOOKUP(20, ABI_FP_denormal),
11371   LOOKUP(21, ABI_FP_exceptions),
11372   LOOKUP(22, ABI_FP_user_exceptions),
11373   LOOKUP(23, ABI_FP_number_model),
11374   {24, "ABI_align_needed", 0, NULL},
11375   {25, "ABI_align_preserved", 0, NULL},
11376   LOOKUP(26, ABI_enum_size),
11377   LOOKUP(27, ABI_HardFP_use),
11378   LOOKUP(28, ABI_VFP_args),
11379   LOOKUP(29, ABI_WMMX_args),
11380   LOOKUP(30, ABI_optimization_goals),
11381   LOOKUP(31, ABI_FP_optimization_goals),
11382   {32, "compatibility", 0, NULL},
11383   LOOKUP(34, CPU_unaligned_access),
11384   LOOKUP(36, FP_HP_extension),
11385   LOOKUP(38, ABI_FP_16bit_format),
11386   LOOKUP(42, MPextension_use),
11387   LOOKUP(44, DIV_use),
11388   {64, "nodefaults", 0, NULL},
11389   {65, "also_compatible_with", 0, NULL},
11390   LOOKUP(66, T2EE_use),
11391   {67, "conformance", 1, NULL},
11392   LOOKUP(68, Virtualization_use),
11393   LOOKUP(70, MPextension_use_legacy)
11394 };
11395 #undef LOOKUP
11396
11397 static unsigned char *
11398 display_arm_attribute (unsigned char * p,
11399                        const unsigned char * const end)
11400 {
11401   int tag;
11402   unsigned int len;
11403   int val;
11404   arm_attr_public_tag * attr;
11405   unsigned i;
11406   int type;
11407
11408   tag = read_uleb128 (p, &len, end);
11409   p += len;
11410   attr = NULL;
11411   for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
11412     {
11413       if (arm_attr_public_tags[i].tag == tag)
11414         {
11415           attr = &arm_attr_public_tags[i];
11416           break;
11417         }
11418     }
11419
11420   if (attr)
11421     {
11422       printf ("  Tag_%s: ", attr->name);
11423       switch (attr->type)
11424         {
11425         case 0:
11426           switch (tag)
11427             {
11428             case 7: /* Tag_CPU_arch_profile.  */
11429               val = read_uleb128 (p, &len, end);
11430               p += len;
11431               switch (val)
11432                 {
11433                 case 0: printf (_("None\n")); break;
11434                 case 'A': printf (_("Application\n")); break;
11435                 case 'R': printf (_("Realtime\n")); break;
11436                 case 'M': printf (_("Microcontroller\n")); break;
11437                 case 'S': printf (_("Application or Realtime\n")); break;
11438                 default: printf ("??? (%d)\n", val); break;
11439                 }
11440               break;
11441
11442             case 24: /* Tag_align_needed.  */
11443               val = read_uleb128 (p, &len, end);
11444               p += len;
11445               switch (val)
11446                 {
11447                 case 0: printf (_("None\n")); break;
11448                 case 1: printf (_("8-byte\n")); break;
11449                 case 2: printf (_("4-byte\n")); break;
11450                 case 3: printf ("??? 3\n"); break;
11451                 default:
11452                   if (val <= 12)
11453                     printf (_("8-byte and up to %d-byte extended\n"),
11454                             1 << val);
11455                   else
11456                     printf ("??? (%d)\n", val);
11457                   break;
11458                 }
11459               break;
11460
11461             case 25: /* Tag_align_preserved.  */
11462               val = read_uleb128 (p, &len, end);
11463               p += len;
11464               switch (val)
11465                 {
11466                 case 0: printf (_("None\n")); break;
11467                 case 1: printf (_("8-byte, except leaf SP\n")); break;
11468                 case 2: printf (_("8-byte\n")); break;
11469                 case 3: printf ("??? 3\n"); break;
11470                 default:
11471                   if (val <= 12)
11472                     printf (_("8-byte and up to %d-byte extended\n"),
11473                             1 << val);
11474                   else
11475                     printf ("??? (%d)\n", val);
11476                   break;
11477                 }
11478               break;
11479
11480             case 32: /* Tag_compatibility.  */
11481               val = read_uleb128 (p, &len, end);
11482               p += len;
11483               printf (_("flag = %d, vendor = %s\n"), val, p);
11484               p += strlen ((char *) p) + 1;
11485               break;
11486
11487             case 64: /* Tag_nodefaults.  */
11488               p++;
11489               printf (_("True\n"));
11490               break;
11491
11492             case 65: /* Tag_also_compatible_with.  */
11493               val = read_uleb128 (p, &len, end);
11494               p += len;
11495               if (val == 6 /* Tag_CPU_arch.  */)
11496                 {
11497                   val = read_uleb128 (p, &len, end);
11498                   p += len;
11499                   if ((unsigned int)val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
11500                     printf ("??? (%d)\n", val);
11501                   else
11502                     printf ("%s\n", arm_attr_tag_CPU_arch[val]);
11503                 }
11504               else
11505                 printf ("???\n");
11506               while (*(p++) != '\0' /* NUL terminator.  */);
11507               break;
11508
11509             default:
11510               abort ();
11511             }
11512           return p;
11513
11514         case 1:
11515           return display_tag_value (-1, p, end);
11516         case 2:
11517           return display_tag_value (0, p, end);
11518
11519         default:
11520           assert (attr->type & 0x80);
11521           val = read_uleb128 (p, &len, end);
11522           p += len;
11523           type = attr->type & 0x7f;
11524           if (val >= type)
11525             printf ("??? (%d)\n", val);
11526           else
11527             printf ("%s\n", attr->table[val]);
11528           return p;
11529         }
11530     }
11531
11532   return display_tag_value (tag, p, end);
11533 }
11534
11535 static unsigned char *
11536 display_gnu_attribute (unsigned char * p,
11537                        unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const),
11538                        const unsigned char * const end)
11539 {
11540   int tag;
11541   unsigned int len;
11542   int val;
11543
11544   tag = read_uleb128 (p, &len, end);
11545   p += len;
11546
11547   /* Tag_compatibility is the only generic GNU attribute defined at
11548      present.  */
11549   if (tag == 32)
11550     {
11551       val = read_uleb128 (p, &len, end);
11552       p += len;
11553       if (p == end)
11554         {
11555           printf (_("flag = %d, vendor = <corrupt>\n"), val);
11556           warn (_("corrupt vendor attribute\n"));
11557         }
11558       else
11559         {
11560           printf (_("flag = %d, vendor = %s\n"), val, p);
11561           p += strlen ((char *) p) + 1;
11562         }
11563       return p;
11564     }
11565
11566   if ((tag & 2) == 0 && display_proc_gnu_attribute)
11567     return display_proc_gnu_attribute (p, tag, end);
11568
11569   return display_tag_value (tag, p, end);
11570 }
11571
11572 static unsigned char *
11573 display_power_gnu_attribute (unsigned char * p,
11574                              int tag,
11575                              const unsigned char * const end)
11576 {
11577   unsigned int len;
11578   int val;
11579
11580   if (tag == Tag_GNU_Power_ABI_FP)
11581     {
11582       val = read_uleb128 (p, &len, end);
11583       p += len;
11584       printf ("  Tag_GNU_Power_ABI_FP: ");
11585
11586       switch (val)
11587         {
11588         case 0:
11589           printf (_("Hard or soft float\n"));
11590           break;
11591         case 1:
11592           printf (_("Hard float\n"));
11593           break;
11594         case 2:
11595           printf (_("Soft float\n"));
11596           break;
11597         case 3:
11598           printf (_("Single-precision hard float\n"));
11599           break;
11600         default:
11601           printf ("??? (%d)\n", val);
11602           break;
11603         }
11604       return p;
11605    }
11606
11607   if (tag == Tag_GNU_Power_ABI_Vector)
11608     {
11609       val = read_uleb128 (p, &len, end);
11610       p += len;
11611       printf ("  Tag_GNU_Power_ABI_Vector: ");
11612       switch (val)
11613         {
11614         case 0:
11615           printf (_("Any\n"));
11616           break;
11617         case 1:
11618           printf (_("Generic\n"));
11619           break;
11620         case 2:
11621           printf ("AltiVec\n");
11622           break;
11623         case 3:
11624           printf ("SPE\n");
11625           break;
11626         default:
11627           printf ("??? (%d)\n", val);
11628           break;
11629         }
11630       return p;
11631    }
11632
11633   if (tag == Tag_GNU_Power_ABI_Struct_Return)
11634     {
11635       if (p == end)
11636         {
11637           warn (_("corrupt Tag_GNU_Power_ABI_Struct_Return"));
11638           return p;
11639         }
11640                    
11641       val = read_uleb128 (p, &len, end);
11642       p += len;
11643       printf ("  Tag_GNU_Power_ABI_Struct_Return: ");
11644       switch (val)
11645        {
11646        case 0:
11647          printf (_("Any\n"));
11648          break;
11649        case 1:
11650          printf ("r3/r4\n");
11651          break;
11652        case 2:
11653          printf (_("Memory\n"));
11654          break;
11655        default:
11656          printf ("??? (%d)\n", val);
11657          break;
11658        }
11659       return p;
11660     }
11661
11662   return display_tag_value (tag & 1, p, end);
11663 }
11664
11665 static void
11666 display_sparc_hwcaps (int mask)
11667 {
11668   if (mask)
11669     {
11670       int first = 1;
11671       if (mask & ELF_SPARC_HWCAP_MUL32)
11672         fputs ("mul32", stdout), first = 0;
11673       if (mask & ELF_SPARC_HWCAP_DIV32)
11674         printf ("%sdiv32", first ? "" : "|"), first = 0;
11675       if (mask & ELF_SPARC_HWCAP_FSMULD)
11676         printf ("%sfsmuld", first ? "" : "|"), first = 0;
11677       if (mask & ELF_SPARC_HWCAP_V8PLUS)
11678         printf ("%sv8plus", first ? "" : "|"), first = 0;
11679       if (mask & ELF_SPARC_HWCAP_POPC)
11680         printf ("%spopc", first ? "" : "|"), first = 0;
11681       if (mask & ELF_SPARC_HWCAP_VIS)
11682         printf ("%svis", first ? "" : "|"), first = 0;
11683       if (mask & ELF_SPARC_HWCAP_VIS2)
11684         printf ("%svis2", first ? "" : "|"), first = 0;
11685       if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
11686         printf ("%sASIBlkInit", first ? "" : "|"), first = 0;
11687       if (mask & ELF_SPARC_HWCAP_FMAF)
11688         printf ("%sfmaf", first ? "" : "|"), first = 0;
11689       if (mask & ELF_SPARC_HWCAP_VIS3)
11690         printf ("%svis3", first ? "" : "|"), first = 0;
11691       if (mask & ELF_SPARC_HWCAP_HPC)
11692         printf ("%shpc", first ? "" : "|"), first = 0;
11693       if (mask & ELF_SPARC_HWCAP_RANDOM)
11694         printf ("%srandom", first ? "" : "|"), first = 0;
11695       if (mask & ELF_SPARC_HWCAP_TRANS)
11696         printf ("%strans", first ? "" : "|"), first = 0;
11697       if (mask & ELF_SPARC_HWCAP_FJFMAU)
11698         printf ("%sfjfmau", first ? "" : "|"), first = 0;
11699       if (mask & ELF_SPARC_HWCAP_IMA)
11700         printf ("%sima", first ? "" : "|"), first = 0;
11701       if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
11702         printf ("%scspare", first ? "" : "|"), first = 0;
11703     }
11704   else
11705     fputc('0', stdout);
11706   fputc('\n', stdout);
11707 }
11708
11709 static unsigned char *
11710 display_sparc_gnu_attribute (unsigned char * p,
11711                              int tag,
11712                              const unsigned char * const end)
11713 {
11714   if (tag == Tag_GNU_Sparc_HWCAPS)
11715     {
11716       unsigned int len;
11717       int val;
11718
11719       val = read_uleb128 (p, &len, end);
11720       p += len;
11721       printf ("  Tag_GNU_Sparc_HWCAPS: ");
11722       display_sparc_hwcaps (val);
11723       return p;
11724    }
11725
11726   return display_tag_value (tag, p, end);
11727 }
11728
11729 static unsigned char *
11730 display_mips_gnu_attribute (unsigned char * p,
11731                             int tag,
11732                             const unsigned char * const end)
11733 {
11734   if (tag == Tag_GNU_MIPS_ABI_FP)
11735     {
11736       unsigned int len;
11737       int val;
11738
11739       val = read_uleb128 (p, &len, end);
11740       p += len;
11741       printf ("  Tag_GNU_MIPS_ABI_FP: ");
11742
11743       switch (val)
11744         {
11745         case Val_GNU_MIPS_ABI_FP_ANY:
11746           printf (_("Hard or soft float\n"));
11747           break;
11748         case Val_GNU_MIPS_ABI_FP_DOUBLE:
11749           printf (_("Hard float (double precision)\n"));
11750           break;
11751         case Val_GNU_MIPS_ABI_FP_SINGLE:
11752           printf (_("Hard float (single precision)\n"));
11753           break;
11754         case Val_GNU_MIPS_ABI_FP_SOFT:
11755           printf (_("Soft float\n"));
11756           break;
11757         case Val_GNU_MIPS_ABI_FP_64:
11758           printf (_("Hard float (MIPS32r2 64-bit FPU)\n"));
11759           break;
11760         default:
11761           printf ("??? (%d)\n", val);
11762           break;
11763         }
11764       return p;
11765    }
11766
11767   return display_tag_value (tag & 1, p, end);
11768 }
11769
11770 static unsigned char *
11771 display_tic6x_attribute (unsigned char * p,
11772                          const unsigned char * const end)
11773 {
11774   int tag;
11775   unsigned int len;
11776   int val;
11777
11778   tag = read_uleb128 (p, &len, end);
11779   p += len;
11780
11781   switch (tag)
11782     {
11783     case Tag_ISA:
11784       val = read_uleb128 (p, &len, end);
11785       p += len;
11786       printf ("  Tag_ISA: ");
11787
11788       switch (val)
11789         {
11790         case C6XABI_Tag_ISA_none:
11791           printf (_("None\n"));
11792           break;
11793         case C6XABI_Tag_ISA_C62X:
11794           printf ("C62x\n");
11795           break;
11796         case C6XABI_Tag_ISA_C67X:
11797           printf ("C67x\n");
11798           break;
11799         case C6XABI_Tag_ISA_C67XP:
11800           printf ("C67x+\n");
11801           break;
11802         case C6XABI_Tag_ISA_C64X:
11803           printf ("C64x\n");
11804           break;
11805         case C6XABI_Tag_ISA_C64XP:
11806           printf ("C64x+\n");
11807           break;
11808         case C6XABI_Tag_ISA_C674X:
11809           printf ("C674x\n");
11810           break;
11811         default:
11812           printf ("??? (%d)\n", val);
11813           break;
11814         }
11815       return p;
11816
11817     case Tag_ABI_wchar_t:
11818       val = read_uleb128 (p, &len, end);
11819       p += len;
11820       printf ("  Tag_ABI_wchar_t: ");
11821       switch (val)
11822         {
11823         case 0:
11824           printf (_("Not used\n"));
11825           break;
11826         case 1:
11827           printf (_("2 bytes\n"));
11828           break;
11829         case 2:
11830           printf (_("4 bytes\n"));
11831           break;
11832         default:
11833           printf ("??? (%d)\n", val);
11834           break;
11835         }
11836       return p;
11837
11838     case Tag_ABI_stack_align_needed:
11839       val = read_uleb128 (p, &len, end);
11840       p += len;
11841       printf ("  Tag_ABI_stack_align_needed: ");
11842       switch (val)
11843         {
11844         case 0:
11845           printf (_("8-byte\n"));
11846           break;
11847         case 1:
11848           printf (_("16-byte\n"));
11849           break;
11850         default:
11851           printf ("??? (%d)\n", val);
11852           break;
11853         }
11854       return p;
11855
11856     case Tag_ABI_stack_align_preserved:
11857       val = read_uleb128 (p, &len, end);
11858       p += len;
11859       printf ("  Tag_ABI_stack_align_preserved: ");
11860       switch (val)
11861         {
11862         case 0:
11863           printf (_("8-byte\n"));
11864           break;
11865         case 1:
11866           printf (_("16-byte\n"));
11867           break;
11868         default:
11869           printf ("??? (%d)\n", val);
11870           break;
11871         }
11872       return p;
11873
11874     case Tag_ABI_DSBT:
11875       val = read_uleb128 (p, &len, end);
11876       p += len;
11877       printf ("  Tag_ABI_DSBT: ");
11878       switch (val)
11879         {
11880         case 0:
11881           printf (_("DSBT addressing not used\n"));
11882           break;
11883         case 1:
11884           printf (_("DSBT addressing used\n"));
11885           break;
11886         default:
11887           printf ("??? (%d)\n", val);
11888           break;
11889         }
11890       return p;
11891
11892     case Tag_ABI_PID:
11893       val = read_uleb128 (p, &len, end);
11894       p += len;
11895       printf ("  Tag_ABI_PID: ");
11896       switch (val)
11897         {
11898         case 0:
11899           printf (_("Data addressing position-dependent\n"));
11900           break;
11901         case 1:
11902           printf (_("Data addressing position-independent, GOT near DP\n"));
11903           break;
11904         case 2:
11905           printf (_("Data addressing position-independent, GOT far from DP\n"));
11906           break;
11907         default:
11908           printf ("??? (%d)\n", val);
11909           break;
11910         }
11911       return p;
11912
11913     case Tag_ABI_PIC:
11914       val = read_uleb128 (p, &len, end);
11915       p += len;
11916       printf ("  Tag_ABI_PIC: ");
11917       switch (val)
11918         {
11919         case 0:
11920           printf (_("Code addressing position-dependent\n"));
11921           break;
11922         case 1:
11923           printf (_("Code addressing position-independent\n"));
11924           break;
11925         default:
11926           printf ("??? (%d)\n", val);
11927           break;
11928         }
11929       return p;
11930
11931     case Tag_ABI_array_object_alignment:
11932       val = read_uleb128 (p, &len, end);
11933       p += len;
11934       printf ("  Tag_ABI_array_object_alignment: ");
11935       switch (val)
11936         {
11937         case 0:
11938           printf (_("8-byte\n"));
11939           break;
11940         case 1:
11941           printf (_("4-byte\n"));
11942           break;
11943         case 2:
11944           printf (_("16-byte\n"));
11945           break;
11946         default:
11947           printf ("??? (%d)\n", val);
11948           break;
11949         }
11950       return p;
11951
11952     case Tag_ABI_array_object_align_expected:
11953       val = read_uleb128 (p, &len, end);
11954       p += len;
11955       printf ("  Tag_ABI_array_object_align_expected: ");
11956       switch (val)
11957         {
11958         case 0:
11959           printf (_("8-byte\n"));
11960           break;
11961         case 1:
11962           printf (_("4-byte\n"));
11963           break;
11964         case 2:
11965           printf (_("16-byte\n"));
11966           break;
11967         default:
11968           printf ("??? (%d)\n", val);
11969           break;
11970         }
11971       return p;
11972
11973     case Tag_ABI_compatibility:
11974       val = read_uleb128 (p, &len, end);
11975       p += len;
11976       printf ("  Tag_ABI_compatibility: ");
11977       printf (_("flag = %d, vendor = %s\n"), val, p);
11978       p += strlen ((char *) p) + 1;
11979       return p;
11980
11981     case Tag_ABI_conformance:
11982       printf ("  Tag_ABI_conformance: ");
11983       printf ("\"%s\"\n", p);
11984       p += strlen ((char *) p) + 1;
11985       return p;
11986     }
11987
11988   return display_tag_value (tag, p, end);
11989 }
11990
11991 static void
11992 display_raw_attribute (unsigned char * p, unsigned char * end)
11993 {
11994   unsigned long addr = 0;
11995   size_t bytes = end - p;
11996
11997   while (bytes)
11998     {
11999       int j;
12000       int k;
12001       int lbytes = (bytes > 16 ? 16 : bytes);
12002
12003       printf ("  0x%8.8lx ", addr);
12004
12005       for (j = 0; j < 16; j++)
12006         {
12007           if (j < lbytes)
12008             printf ("%2.2x", p[j]);
12009           else
12010             printf ("  ");
12011
12012           if ((j & 3) == 3)
12013             printf (" ");
12014         }
12015
12016       for (j = 0; j < lbytes; j++)
12017         {
12018           k = p[j];
12019           if (k >= ' ' && k < 0x7f)
12020             printf ("%c", k);
12021           else
12022             printf (".");
12023         }
12024
12025       putchar ('\n');
12026
12027       p  += lbytes;
12028       bytes -= lbytes;
12029       addr += lbytes;
12030     }
12031
12032   putchar ('\n');
12033 }
12034
12035 static unsigned char *
12036 display_msp430x_attribute (unsigned char * p,
12037                            const unsigned char * const end)
12038 {
12039   unsigned int len;
12040   int val;
12041   int tag;
12042
12043   tag = read_uleb128 (p, & len, end);
12044   p += len;
12045   
12046   switch (tag)
12047     {
12048     case OFBA_MSPABI_Tag_ISA:
12049       val = read_uleb128 (p, &len, end);
12050       p += len;
12051       printf ("  Tag_ISA: ");
12052       switch (val)
12053         {
12054         case 0: printf (_("None\n")); break;
12055         case 1: printf (_("MSP430\n")); break;
12056         case 2: printf (_("MSP430X\n")); break;
12057         default: printf ("??? (%d)\n", val); break;
12058         }
12059       break;
12060
12061     case OFBA_MSPABI_Tag_Code_Model:
12062       val = read_uleb128 (p, &len, end);
12063       p += len;
12064       printf ("  Tag_Code_Model: ");
12065       switch (val)
12066         {
12067         case 0: printf (_("None\n")); break;
12068         case 1: printf (_("Small\n")); break;
12069         case 2: printf (_("Large\n")); break;
12070         default: printf ("??? (%d)\n", val); break;
12071         }
12072       break;
12073
12074     case OFBA_MSPABI_Tag_Data_Model:
12075       val = read_uleb128 (p, &len, end);
12076       p += len;
12077       printf ("  Tag_Data_Model: ");
12078       switch (val)
12079         {
12080         case 0: printf (_("None\n")); break;
12081         case 1: printf (_("Small\n")); break;
12082         case 2: printf (_("Large\n")); break;
12083         case 3: printf (_("Restricted Large\n")); break;
12084         default: printf ("??? (%d)\n", val); break;
12085         }
12086       break;
12087
12088     default:
12089       printf (_("  <unknown tag %d>: "), tag);
12090
12091       if (tag & 1)
12092         {
12093           printf ("\"%s\"\n", p);
12094           p += strlen ((char *) p) + 1;
12095         }
12096       else
12097         {
12098           val = read_uleb128 (p, &len, end);
12099           p += len;
12100           printf ("%d (0x%x)\n", val, val);
12101         }
12102       break;
12103    }
12104
12105   return p;
12106 }
12107
12108 static int
12109 process_attributes (FILE * file,
12110                     const char * public_name,
12111                     unsigned int proc_type,
12112                     unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
12113                     unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const))
12114 {
12115   Elf_Internal_Shdr * sect;
12116   unsigned char * contents;
12117   unsigned char * p;
12118   unsigned char * end;
12119   bfd_vma section_len;
12120   bfd_vma len;
12121   unsigned i;
12122
12123   /* Find the section header so that we get the size.  */
12124   for (i = 0, sect = section_headers;
12125        i < elf_header.e_shnum;
12126        i++, sect++)
12127     {
12128       if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
12129         continue;
12130
12131       contents = (unsigned char *) get_data (NULL, file, sect->sh_offset, 1,
12132                                              sect->sh_size, _("attributes"));
12133       if (contents == NULL)
12134         continue;
12135
12136       p = contents;
12137       if (*p == 'A')
12138         {
12139           len = sect->sh_size - 1;
12140           p++;
12141
12142           while (len > 0)
12143             {
12144               int namelen;
12145               bfd_boolean public_section;
12146               bfd_boolean gnu_section;
12147
12148               section_len = byte_get (p, 4);
12149               p += 4;
12150
12151               if (section_len > len)
12152                 {
12153                   printf (_("ERROR: Bad section length (%d > %d)\n"),
12154                           (int) section_len, (int) len);
12155                   section_len = len;
12156                 }
12157
12158               len -= section_len;
12159               printf (_("Attribute Section: %s\n"), p);
12160
12161               if (public_name && streq ((char *) p, public_name))
12162                 public_section = TRUE;
12163               else
12164                 public_section = FALSE;
12165
12166               if (streq ((char *) p, "gnu"))
12167                 gnu_section = TRUE;
12168               else
12169                 gnu_section = FALSE;
12170
12171               namelen = strlen ((char *) p) + 1;
12172               p += namelen;
12173               section_len -= namelen + 4;
12174
12175               while (section_len > 0)
12176                 {
12177                   int tag = *(p++);
12178                   int val;
12179                   bfd_vma size;
12180
12181                   size = byte_get (p, 4);
12182                   if (size > section_len)
12183                     {
12184                       printf (_("ERROR: Bad subsection length (%d > %d)\n"),
12185                               (int) size, (int) section_len);
12186                       size = section_len;
12187                     }
12188
12189                   section_len -= size;
12190                   end = p + size - 1;
12191                   p += 4;
12192
12193                   switch (tag)
12194                     {
12195                     case 1:
12196                       printf (_("File Attributes\n"));
12197                       break;
12198                     case 2:
12199                       printf (_("Section Attributes:"));
12200                       goto do_numlist;
12201                     case 3:
12202                       printf (_("Symbol Attributes:"));
12203                     do_numlist:
12204                       for (;;)
12205                         {
12206                           unsigned int j;
12207
12208                           val = read_uleb128 (p, &j, end);
12209                           p += j;
12210                           if (val == 0)
12211                             break;
12212                           printf (" %d", val);
12213                         }
12214                       printf ("\n");
12215                       break;
12216                     default:
12217                       printf (_("Unknown tag: %d\n"), tag);
12218                       public_section = FALSE;
12219                       break;
12220                     }
12221
12222                   if (public_section)
12223                     {
12224                       while (p < end)
12225                         p = display_pub_attribute (p, end);
12226                     }
12227                   else if (gnu_section)
12228                     {
12229                       while (p < end)
12230                         p = display_gnu_attribute (p,
12231                                                    display_proc_gnu_attribute,
12232                                                    end);
12233                     }
12234                   else
12235                     {
12236                       printf (_("  Unknown section contexts\n"));
12237                       display_raw_attribute (p, end);
12238                       p = end;
12239                     }
12240                 }
12241             }
12242         }
12243       else
12244         printf (_("Unknown format '%c'\n"), *p);
12245
12246       free (contents);
12247     }
12248   return 1;
12249 }
12250
12251 static int
12252 process_arm_specific (FILE * file)
12253 {
12254   return process_attributes (file, "aeabi", SHT_ARM_ATTRIBUTES,
12255                              display_arm_attribute, NULL);
12256 }
12257
12258 static int
12259 process_power_specific (FILE * file)
12260 {
12261   return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
12262                              display_power_gnu_attribute);
12263 }
12264
12265 static int
12266 process_sparc_specific (FILE * file)
12267 {
12268   return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
12269                              display_sparc_gnu_attribute);
12270 }
12271
12272 static int
12273 process_tic6x_specific (FILE * file)
12274 {
12275   return process_attributes (file, "c6xabi", SHT_C6000_ATTRIBUTES,
12276                              display_tic6x_attribute, NULL);
12277 }
12278
12279 static int
12280 process_msp430x_specific (FILE * file)
12281 {
12282   return process_attributes (file, "mspabi", SHT_MSP430_ATTRIBUTES,
12283                              display_msp430x_attribute, NULL);
12284 }
12285
12286 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
12287    Print the Address, Access and Initial fields of an entry at VMA ADDR
12288    and return the VMA of the next entry.  */
12289
12290 static bfd_vma
12291 print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
12292 {
12293   printf ("  ");
12294   print_vma (addr, LONG_HEX);
12295   printf (" ");
12296   if (addr < pltgot + 0xfff0)
12297     printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
12298   else
12299     printf ("%10s", "");
12300   printf (" ");
12301   if (data == NULL)
12302     printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
12303   else
12304     {
12305       bfd_vma entry;
12306
12307       entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
12308       print_vma (entry, LONG_HEX);
12309     }
12310   return addr + (is_32bit_elf ? 4 : 8);
12311 }
12312
12313 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
12314    PLTGOT.  Print the Address and Initial fields of an entry at VMA
12315    ADDR and return the VMA of the next entry.  */
12316
12317 static bfd_vma
12318 print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
12319 {
12320   printf ("  ");
12321   print_vma (addr, LONG_HEX);
12322   printf (" ");
12323   if (data == NULL)
12324     printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
12325   else
12326     {
12327       bfd_vma entry;
12328
12329       entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
12330       print_vma (entry, LONG_HEX);
12331     }
12332   return addr + (is_32bit_elf ? 4 : 8);
12333 }
12334
12335 static int
12336 process_mips_specific (FILE * file)
12337 {
12338   Elf_Internal_Dyn * entry;
12339   size_t liblist_offset = 0;
12340   size_t liblistno = 0;
12341   size_t conflictsno = 0;
12342   size_t options_offset = 0;
12343   size_t conflicts_offset = 0;
12344   size_t pltrelsz = 0;
12345   size_t pltrel = 0;
12346   bfd_vma pltgot = 0;
12347   bfd_vma mips_pltgot = 0;
12348   bfd_vma jmprel = 0;
12349   bfd_vma local_gotno = 0;
12350   bfd_vma gotsym = 0;
12351   bfd_vma symtabno = 0;
12352
12353   process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
12354                       display_mips_gnu_attribute);
12355
12356   /* We have a lot of special sections.  Thanks SGI!  */
12357   if (dynamic_section == NULL)
12358     /* No information available.  */
12359     return 0;
12360
12361   for (entry = dynamic_section; entry->d_tag != DT_NULL; ++entry)
12362     switch (entry->d_tag)
12363       {
12364       case DT_MIPS_LIBLIST:
12365         liblist_offset
12366           = offset_from_vma (file, entry->d_un.d_val,
12367                              liblistno * sizeof (Elf32_External_Lib));
12368         break;
12369       case DT_MIPS_LIBLISTNO:
12370         liblistno = entry->d_un.d_val;
12371         break;
12372       case DT_MIPS_OPTIONS:
12373         options_offset = offset_from_vma (file, entry->d_un.d_val, 0);
12374         break;
12375       case DT_MIPS_CONFLICT:
12376         conflicts_offset
12377           = offset_from_vma (file, entry->d_un.d_val,
12378                              conflictsno * sizeof (Elf32_External_Conflict));
12379         break;
12380       case DT_MIPS_CONFLICTNO:
12381         conflictsno = entry->d_un.d_val;
12382         break;
12383       case DT_PLTGOT:
12384         pltgot = entry->d_un.d_ptr;
12385         break;
12386       case DT_MIPS_LOCAL_GOTNO:
12387         local_gotno = entry->d_un.d_val;
12388         break;
12389       case DT_MIPS_GOTSYM:
12390         gotsym = entry->d_un.d_val;
12391         break;
12392       case DT_MIPS_SYMTABNO:
12393         symtabno = entry->d_un.d_val;
12394         break;
12395       case DT_MIPS_PLTGOT:
12396         mips_pltgot = entry->d_un.d_ptr;
12397         break;
12398       case DT_PLTREL:
12399         pltrel = entry->d_un.d_val;
12400         break;
12401       case DT_PLTRELSZ:
12402         pltrelsz = entry->d_un.d_val;
12403         break;
12404       case DT_JMPREL:
12405         jmprel = entry->d_un.d_ptr;
12406         break;
12407       default:
12408         break;
12409       }
12410
12411   if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
12412     {
12413       Elf32_External_Lib * elib;
12414       size_t cnt;
12415
12416       elib = (Elf32_External_Lib *) get_data (NULL, file, liblist_offset,
12417                                               liblistno,
12418                                               sizeof (Elf32_External_Lib),
12419                                               _("liblist section data"));
12420       if (elib)
12421         {
12422           printf (_("\nSection '.liblist' contains %lu entries:\n"),
12423                   (unsigned long) liblistno);
12424           fputs (_("     Library              Time Stamp          Checksum   Version Flags\n"),
12425                  stdout);
12426
12427           for (cnt = 0; cnt < liblistno; ++cnt)
12428             {
12429               Elf32_Lib liblist;
12430               time_t atime;
12431               char timebuf[20];
12432               struct tm * tmp;
12433
12434               liblist.l_name = BYTE_GET (elib[cnt].l_name);
12435               atime = BYTE_GET (elib[cnt].l_time_stamp);
12436               liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
12437               liblist.l_version = BYTE_GET (elib[cnt].l_version);
12438               liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
12439
12440               tmp = gmtime (&atime);
12441               snprintf (timebuf, sizeof (timebuf),
12442                         "%04u-%02u-%02uT%02u:%02u:%02u",
12443                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
12444                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
12445
12446               printf ("%3lu: ", (unsigned long) cnt);
12447               if (VALID_DYNAMIC_NAME (liblist.l_name))
12448                 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
12449               else
12450                 printf (_("<corrupt: %9ld>"), liblist.l_name);
12451               printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
12452                       liblist.l_version);
12453
12454               if (liblist.l_flags == 0)
12455                 puts (_(" NONE"));
12456               else
12457                 {
12458                   static const struct
12459                   {
12460                     const char * name;
12461                     int bit;
12462                   }
12463                   l_flags_vals[] =
12464                   {
12465                     { " EXACT_MATCH", LL_EXACT_MATCH },
12466                     { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
12467                     { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
12468                     { " EXPORTS", LL_EXPORTS },
12469                     { " DELAY_LOAD", LL_DELAY_LOAD },
12470                     { " DELTA", LL_DELTA }
12471                   };
12472                   int flags = liblist.l_flags;
12473                   size_t fcnt;
12474
12475                   for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
12476                     if ((flags & l_flags_vals[fcnt].bit) != 0)
12477                       {
12478                         fputs (l_flags_vals[fcnt].name, stdout);
12479                         flags ^= l_flags_vals[fcnt].bit;
12480                       }
12481                   if (flags != 0)
12482                     printf (" %#x", (unsigned int) flags);
12483
12484                   puts ("");
12485                 }
12486             }
12487
12488           free (elib);
12489         }
12490     }
12491
12492   if (options_offset != 0)
12493     {
12494       Elf_External_Options * eopt;
12495       Elf_Internal_Shdr * sect = section_headers;
12496       Elf_Internal_Options * iopt;
12497       Elf_Internal_Options * option;
12498       size_t offset;
12499       int cnt;
12500
12501       /* Find the section header so that we get the size.  */
12502       while (sect->sh_type != SHT_MIPS_OPTIONS)
12503         ++sect;
12504
12505       eopt = (Elf_External_Options *) get_data (NULL, file, options_offset, 1,
12506                                                 sect->sh_size, _("options"));
12507       if (eopt)
12508         {
12509           iopt = (Elf_Internal_Options *)
12510               cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
12511           if (iopt == NULL)
12512             {
12513               error (_("Out of memory\n"));
12514               return 0;
12515             }
12516
12517           offset = cnt = 0;
12518           option = iopt;
12519
12520           while (offset < sect->sh_size)
12521             {
12522               Elf_External_Options * eoption;
12523
12524               eoption = (Elf_External_Options *) ((char *) eopt + offset);
12525
12526               option->kind = BYTE_GET (eoption->kind);
12527               option->size = BYTE_GET (eoption->size);
12528               option->section = BYTE_GET (eoption->section);
12529               option->info = BYTE_GET (eoption->info);
12530
12531               offset += option->size;
12532
12533               ++option;
12534               ++cnt;
12535             }
12536
12537           printf (_("\nSection '%s' contains %d entries:\n"),
12538                   SECTION_NAME (sect), cnt);
12539
12540           option = iopt;
12541
12542           while (cnt-- > 0)
12543             {
12544               size_t len;
12545
12546               switch (option->kind)
12547                 {
12548                 case ODK_NULL:
12549                   /* This shouldn't happen.  */
12550                   printf (" NULL       %d %lx", option->section, option->info);
12551                   break;
12552                 case ODK_REGINFO:
12553                   printf (" REGINFO    ");
12554                   if (elf_header.e_machine == EM_MIPS)
12555                     {
12556                       /* 32bit form.  */
12557                       Elf32_External_RegInfo * ereg;
12558                       Elf32_RegInfo reginfo;
12559
12560                       ereg = (Elf32_External_RegInfo *) (option + 1);
12561                       reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
12562                       reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
12563                       reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
12564                       reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
12565                       reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
12566                       reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
12567
12568                       printf ("GPR %08lx  GP 0x%lx\n",
12569                               reginfo.ri_gprmask,
12570                               (unsigned long) reginfo.ri_gp_value);
12571                       printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
12572                               reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
12573                               reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
12574                     }
12575                   else
12576                     {
12577                       /* 64 bit form.  */
12578                       Elf64_External_RegInfo * ereg;
12579                       Elf64_Internal_RegInfo reginfo;
12580
12581                       ereg = (Elf64_External_RegInfo *) (option + 1);
12582                       reginfo.ri_gprmask    = BYTE_GET (ereg->ri_gprmask);
12583                       reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
12584                       reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
12585                       reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
12586                       reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
12587                       reginfo.ri_gp_value   = BYTE_GET (ereg->ri_gp_value);
12588
12589                       printf ("GPR %08lx  GP 0x",
12590                               reginfo.ri_gprmask);
12591                       printf_vma (reginfo.ri_gp_value);
12592                       printf ("\n");
12593
12594                       printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
12595                               reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
12596                               reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
12597                     }
12598                   ++option;
12599                   continue;
12600                 case ODK_EXCEPTIONS:
12601                   fputs (" EXCEPTIONS fpe_min(", stdout);
12602                   process_mips_fpe_exception (option->info & OEX_FPU_MIN);
12603                   fputs (") fpe_max(", stdout);
12604                   process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
12605                   fputs (")", stdout);
12606
12607                   if (option->info & OEX_PAGE0)
12608                     fputs (" PAGE0", stdout);
12609                   if (option->info & OEX_SMM)
12610                     fputs (" SMM", stdout);
12611                   if (option->info & OEX_FPDBUG)
12612                     fputs (" FPDBUG", stdout);
12613                   if (option->info & OEX_DISMISS)
12614                     fputs (" DISMISS", stdout);
12615                   break;
12616                 case ODK_PAD:
12617                   fputs (" PAD       ", stdout);
12618                   if (option->info & OPAD_PREFIX)
12619                     fputs (" PREFIX", stdout);
12620                   if (option->info & OPAD_POSTFIX)
12621                     fputs (" POSTFIX", stdout);
12622                   if (option->info & OPAD_SYMBOL)
12623                     fputs (" SYMBOL", stdout);
12624                   break;
12625                 case ODK_HWPATCH:
12626                   fputs (" HWPATCH   ", stdout);
12627                   if (option->info & OHW_R4KEOP)
12628                     fputs (" R4KEOP", stdout);
12629                   if (option->info & OHW_R8KPFETCH)
12630                     fputs (" R8KPFETCH", stdout);
12631                   if (option->info & OHW_R5KEOP)
12632                     fputs (" R5KEOP", stdout);
12633                   if (option->info & OHW_R5KCVTL)
12634                     fputs (" R5KCVTL", stdout);
12635                   break;
12636                 case ODK_FILL:
12637                   fputs (" FILL       ", stdout);
12638                   /* XXX Print content of info word?  */
12639                   break;
12640                 case ODK_TAGS:
12641                   fputs (" TAGS       ", stdout);
12642                   /* XXX Print content of info word?  */
12643                   break;
12644                 case ODK_HWAND:
12645                   fputs (" HWAND     ", stdout);
12646                   if (option->info & OHWA0_R4KEOP_CHECKED)
12647                     fputs (" R4KEOP_CHECKED", stdout);
12648                   if (option->info & OHWA0_R4KEOP_CLEAN)
12649                     fputs (" R4KEOP_CLEAN", stdout);
12650                   break;
12651                 case ODK_HWOR:
12652                   fputs (" HWOR      ", stdout);
12653                   if (option->info & OHWA0_R4KEOP_CHECKED)
12654                     fputs (" R4KEOP_CHECKED", stdout);
12655                   if (option->info & OHWA0_R4KEOP_CLEAN)
12656                     fputs (" R4KEOP_CLEAN", stdout);
12657                   break;
12658                 case ODK_GP_GROUP:
12659                   printf (" GP_GROUP  %#06lx  self-contained %#06lx",
12660                           option->info & OGP_GROUP,
12661                           (option->info & OGP_SELF) >> 16);
12662                   break;
12663                 case ODK_IDENT:
12664                   printf (" IDENT     %#06lx  self-contained %#06lx",
12665                           option->info & OGP_GROUP,
12666                           (option->info & OGP_SELF) >> 16);
12667                   break;
12668                 default:
12669                   /* This shouldn't happen.  */
12670                   printf (" %3d ???     %d %lx",
12671                           option->kind, option->section, option->info);
12672                   break;
12673                 }
12674
12675               len = sizeof (* eopt);
12676               while (len < option->size)
12677                 if (((char *) option)[len] >= ' '
12678                     && ((char *) option)[len] < 0x7f)
12679                   printf ("%c", ((char *) option)[len++]);
12680                 else
12681                   printf ("\\%03o", ((char *) option)[len++]);
12682
12683               fputs ("\n", stdout);
12684               ++option;
12685             }
12686
12687           free (eopt);
12688         }
12689     }
12690
12691   if (conflicts_offset != 0 && conflictsno != 0)
12692     {
12693       Elf32_Conflict * iconf;
12694       size_t cnt;
12695
12696       if (dynamic_symbols == NULL)
12697         {
12698           error (_("conflict list found without a dynamic symbol table\n"));
12699           return 0;
12700         }
12701
12702       iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
12703       if (iconf == NULL)
12704         {
12705           error (_("Out of memory\n"));
12706           return 0;
12707         }
12708
12709       if (is_32bit_elf)
12710         {
12711           Elf32_External_Conflict * econf32;
12712
12713           econf32 = (Elf32_External_Conflict *)
12714               get_data (NULL, file, conflicts_offset, conflictsno,
12715                         sizeof (* econf32), _("conflict"));
12716           if (!econf32)
12717             return 0;
12718
12719           for (cnt = 0; cnt < conflictsno; ++cnt)
12720             iconf[cnt] = BYTE_GET (econf32[cnt]);
12721
12722           free (econf32);
12723         }
12724       else
12725         {
12726           Elf64_External_Conflict * econf64;
12727
12728           econf64 = (Elf64_External_Conflict *)
12729               get_data (NULL, file, conflicts_offset, conflictsno,
12730                         sizeof (* econf64), _("conflict"));
12731           if (!econf64)
12732             return 0;
12733
12734           for (cnt = 0; cnt < conflictsno; ++cnt)
12735             iconf[cnt] = BYTE_GET (econf64[cnt]);
12736
12737           free (econf64);
12738         }
12739
12740       printf (_("\nSection '.conflict' contains %lu entries:\n"),
12741               (unsigned long) conflictsno);
12742       puts (_("  Num:    Index       Value  Name"));
12743
12744       for (cnt = 0; cnt < conflictsno; ++cnt)
12745         {
12746           Elf_Internal_Sym * psym = & dynamic_symbols[iconf[cnt]];
12747
12748           printf ("%5lu: %8lu  ", (unsigned long) cnt, iconf[cnt]);
12749           print_vma (psym->st_value, FULL_HEX);
12750           putchar (' ');
12751           if (VALID_DYNAMIC_NAME (psym->st_name))
12752             print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
12753           else
12754             printf (_("<corrupt: %14ld>"), psym->st_name);
12755           putchar ('\n');
12756         }
12757
12758       free (iconf);
12759     }
12760
12761   if (pltgot != 0 && local_gotno != 0)
12762     {
12763       bfd_vma ent, local_end, global_end;
12764       size_t i, offset;
12765       unsigned char * data;
12766       int addr_size;
12767
12768       ent = pltgot;
12769       addr_size = (is_32bit_elf ? 4 : 8);
12770       local_end = pltgot + local_gotno * addr_size;
12771       global_end = local_end + (symtabno - gotsym) * addr_size;
12772
12773       offset = offset_from_vma (file, pltgot, global_end - pltgot);
12774       data = (unsigned char *) get_data (NULL, file, offset,
12775                                          global_end - pltgot, 1,
12776                                          _("Global Offset Table data"));
12777       if (data == NULL)
12778         return 0;
12779
12780       printf (_("\nPrimary GOT:\n"));
12781       printf (_(" Canonical gp value: "));
12782       print_vma (pltgot + 0x7ff0, LONG_HEX);
12783       printf ("\n\n");
12784
12785       printf (_(" Reserved entries:\n"));
12786       printf (_("  %*s %10s %*s Purpose\n"),
12787               addr_size * 2, _("Address"), _("Access"),
12788               addr_size * 2, _("Initial"));
12789       ent = print_mips_got_entry (data, pltgot, ent);
12790       printf (_(" Lazy resolver\n"));
12791       if (data
12792           && (byte_get (data + ent - pltgot, addr_size)
12793               >> (addr_size * 8 - 1)) != 0)
12794         {
12795           ent = print_mips_got_entry (data, pltgot, ent);
12796           printf (_(" Module pointer (GNU extension)\n"));
12797         }
12798       printf ("\n");
12799
12800       if (ent < local_end)
12801         {
12802           printf (_(" Local entries:\n"));
12803           printf ("  %*s %10s %*s\n",
12804                   addr_size * 2, _("Address"), _("Access"),
12805                   addr_size * 2, _("Initial"));
12806           while (ent < local_end)
12807             {
12808               ent = print_mips_got_entry (data, pltgot, ent);
12809               printf ("\n");
12810             }
12811           printf ("\n");
12812         }
12813
12814       if (gotsym < symtabno)
12815         {
12816           int sym_width;
12817
12818           printf (_(" Global entries:\n"));
12819           printf ("  %*s %10s %*s %*s %-7s %3s %s\n",
12820                   addr_size * 2, _("Address"),
12821                   _("Access"),
12822                   addr_size * 2, _("Initial"),
12823                   addr_size * 2, _("Sym.Val."),
12824                   _("Type"),
12825                   /* Note for translators: "Ndx" = abbreviated form of "Index".  */
12826                   _("Ndx"), _("Name"));
12827           
12828           sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
12829           for (i = gotsym; i < symtabno; i++)
12830             {
12831               Elf_Internal_Sym * psym;
12832
12833               psym = dynamic_symbols + i;
12834               ent = print_mips_got_entry (data, pltgot, ent);
12835               printf (" ");
12836               print_vma (psym->st_value, LONG_HEX);
12837               printf (" %-7s %3s ",
12838                       get_symbol_type (ELF_ST_TYPE (psym->st_info)),
12839                       get_symbol_index_type (psym->st_shndx));
12840               if (VALID_DYNAMIC_NAME (psym->st_name))
12841                 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
12842               else
12843                 printf (_("<corrupt: %14ld>"), psym->st_name);
12844               printf ("\n");
12845             }
12846           printf ("\n");
12847         }
12848
12849       if (data)
12850         free (data);
12851     }
12852
12853   if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
12854     {
12855       bfd_vma ent, end;
12856       size_t offset, rel_offset;
12857       unsigned long count, i;
12858       unsigned char * data;
12859       int addr_size, sym_width;
12860       Elf_Internal_Rela * rels;
12861
12862       rel_offset = offset_from_vma (file, jmprel, pltrelsz);
12863       if (pltrel == DT_RELA)
12864         {
12865           if (!slurp_rela_relocs (file, rel_offset, pltrelsz, &rels, &count))
12866             return 0;
12867         }
12868       else
12869         {
12870           if (!slurp_rel_relocs (file, rel_offset, pltrelsz, &rels, &count))
12871             return 0;
12872         }
12873
12874       ent = mips_pltgot;
12875       addr_size = (is_32bit_elf ? 4 : 8);
12876       end = mips_pltgot + (2 + count) * addr_size;
12877
12878       offset = offset_from_vma (file, mips_pltgot, end - mips_pltgot);
12879       data = (unsigned char *) get_data (NULL, file, offset, end - mips_pltgot,
12880                                          1, _("Procedure Linkage Table data"));
12881       if (data == NULL)
12882         return 0;
12883
12884       printf ("\nPLT GOT:\n\n");
12885       printf (_(" Reserved entries:\n"));
12886       printf (_("  %*s %*s Purpose\n"),
12887               addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
12888       ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
12889       printf (_(" PLT lazy resolver\n"));
12890       ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
12891       printf (_(" Module pointer\n"));
12892       printf ("\n");
12893
12894       printf (_(" Entries:\n"));
12895       printf ("  %*s %*s %*s %-7s %3s %s\n",
12896               addr_size * 2, _("Address"),
12897               addr_size * 2, _("Initial"),
12898               addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
12899       sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
12900       for (i = 0; i < count; i++)
12901         {
12902           Elf_Internal_Sym * psym;
12903
12904           psym = dynamic_symbols + get_reloc_symindex (rels[i].r_info);
12905           ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
12906           printf (" ");
12907           print_vma (psym->st_value, LONG_HEX);
12908           printf (" %-7s %3s ",
12909                   get_symbol_type (ELF_ST_TYPE (psym->st_info)),
12910                   get_symbol_index_type (psym->st_shndx));
12911           if (VALID_DYNAMIC_NAME (psym->st_name))
12912             print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
12913           else
12914             printf (_("<corrupt: %14ld>"), psym->st_name);
12915           printf ("\n");
12916         }
12917       printf ("\n");
12918
12919       if (data)
12920         free (data);
12921       free (rels);
12922     }
12923
12924   return 1;
12925 }
12926
12927 static int
12928 process_gnu_liblist (FILE * file)
12929 {
12930   Elf_Internal_Shdr * section;
12931   Elf_Internal_Shdr * string_sec;
12932   Elf32_External_Lib * elib;
12933   char * strtab;
12934   size_t strtab_size;
12935   size_t cnt;
12936   unsigned i;
12937
12938   if (! do_arch)
12939     return 0;
12940
12941   for (i = 0, section = section_headers;
12942        i < elf_header.e_shnum;
12943        i++, section++)
12944     {
12945       switch (section->sh_type)
12946         {
12947         case SHT_GNU_LIBLIST:
12948           if (section->sh_link >= elf_header.e_shnum)
12949             break;
12950
12951           elib = (Elf32_External_Lib *)
12952               get_data (NULL, file, section->sh_offset, 1, section->sh_size,
12953                         _("liblist section data"));
12954
12955           if (elib == NULL)
12956             break;
12957           string_sec = section_headers + section->sh_link;
12958
12959           strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
12960                                       string_sec->sh_size,
12961                                       _("liblist string table"));
12962           if (strtab == NULL
12963               || section->sh_entsize != sizeof (Elf32_External_Lib))
12964             {
12965               free (elib);
12966               free (strtab);
12967               break;
12968             }
12969           strtab_size = string_sec->sh_size;
12970
12971           printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
12972                   SECTION_NAME (section),
12973                   (unsigned long) (section->sh_size / sizeof (Elf32_External_Lib)));
12974
12975           puts (_("     Library              Time Stamp          Checksum   Version Flags"));
12976
12977           for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
12978                ++cnt)
12979             {
12980               Elf32_Lib liblist;
12981               time_t atime;
12982               char timebuf[20];
12983               struct tm * tmp;
12984
12985               liblist.l_name = BYTE_GET (elib[cnt].l_name);
12986               atime = BYTE_GET (elib[cnt].l_time_stamp);
12987               liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
12988               liblist.l_version = BYTE_GET (elib[cnt].l_version);
12989               liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
12990
12991               tmp = gmtime (&atime);
12992               snprintf (timebuf, sizeof (timebuf),
12993                         "%04u-%02u-%02uT%02u:%02u:%02u",
12994                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
12995                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
12996
12997               printf ("%3lu: ", (unsigned long) cnt);
12998               if (do_wide)
12999                 printf ("%-20s", liblist.l_name < strtab_size
13000                         ? strtab + liblist.l_name : _("<corrupt>"));
13001               else
13002                 printf ("%-20.20s", liblist.l_name < strtab_size
13003                         ? strtab + liblist.l_name : _("<corrupt>"));
13004               printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
13005                       liblist.l_version, liblist.l_flags);
13006             }
13007
13008           free (elib);
13009           free (strtab);
13010         }
13011     }
13012
13013   return 1;
13014 }
13015
13016 static const char *
13017 get_note_type (unsigned e_type)
13018 {
13019   static char buff[64];
13020
13021   if (elf_header.e_type == ET_CORE)
13022     switch (e_type)
13023       {
13024       case NT_AUXV:
13025         return _("NT_AUXV (auxiliary vector)");
13026       case NT_PRSTATUS:
13027         return _("NT_PRSTATUS (prstatus structure)");
13028       case NT_FPREGSET:
13029         return _("NT_FPREGSET (floating point registers)");
13030       case NT_PRPSINFO:
13031         return _("NT_PRPSINFO (prpsinfo structure)");
13032       case NT_TASKSTRUCT:
13033         return _("NT_TASKSTRUCT (task structure)");
13034       case NT_PRXFPREG:
13035         return _("NT_PRXFPREG (user_xfpregs structure)");
13036       case NT_PPC_VMX:
13037         return _("NT_PPC_VMX (ppc Altivec registers)");
13038       case NT_PPC_VSX:
13039         return _("NT_PPC_VSX (ppc VSX registers)");
13040       case NT_386_TLS:
13041         return _("NT_386_TLS (x86 TLS information)");
13042       case NT_386_IOPERM:
13043         return _("NT_386_IOPERM (x86 I/O permissions)");
13044       case NT_X86_XSTATE:
13045         return _("NT_X86_XSTATE (x86 XSAVE extended state)");
13046       case NT_S390_HIGH_GPRS:
13047         return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
13048       case NT_S390_TIMER:
13049         return _("NT_S390_TIMER (s390 timer register)");
13050       case NT_S390_TODCMP:
13051         return _("NT_S390_TODCMP (s390 TOD comparator register)");
13052       case NT_S390_TODPREG:
13053         return _("NT_S390_TODPREG (s390 TOD programmable register)");
13054       case NT_S390_CTRS:
13055         return _("NT_S390_CTRS (s390 control registers)");
13056       case NT_S390_PREFIX:
13057         return _("NT_S390_PREFIX (s390 prefix register)");
13058       case NT_S390_LAST_BREAK:
13059         return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
13060       case NT_S390_SYSTEM_CALL:
13061         return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
13062       case NT_S390_TDB:
13063         return _("NT_S390_TDB (s390 transaction diagnostic block)");
13064       case NT_ARM_VFP:
13065         return _("NT_ARM_VFP (arm VFP registers)");
13066       case NT_ARM_TLS:
13067         return _("NT_ARM_TLS (AArch TLS registers)");
13068       case NT_ARM_HW_BREAK:
13069         return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
13070       case NT_ARM_HW_WATCH:
13071         return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
13072       case NT_PSTATUS:
13073         return _("NT_PSTATUS (pstatus structure)");
13074       case NT_FPREGS:
13075         return _("NT_FPREGS (floating point registers)");
13076       case NT_PSINFO:
13077         return _("NT_PSINFO (psinfo structure)");
13078       case NT_LWPSTATUS:
13079         return _("NT_LWPSTATUS (lwpstatus_t structure)");
13080       case NT_LWPSINFO:
13081         return _("NT_LWPSINFO (lwpsinfo_t structure)");
13082       case NT_WIN32PSTATUS:
13083         return _("NT_WIN32PSTATUS (win32_pstatus structure)");
13084       case NT_SIGINFO:
13085         return _("NT_SIGINFO (siginfo_t data)");
13086       case NT_FILE:
13087         return _("NT_FILE (mapped files)");
13088       default:
13089         break;
13090       }
13091   else
13092     switch (e_type)
13093       {
13094       case NT_VERSION:
13095         return _("NT_VERSION (version)");
13096       case NT_ARCH:
13097         return _("NT_ARCH (architecture)");
13098       default:
13099         break;
13100       }
13101
13102   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
13103   return buff;
13104 }
13105
13106 static int
13107 print_core_note (Elf_Internal_Note *pnote)
13108 {
13109   unsigned int addr_size = is_32bit_elf ? 4 : 8;
13110   bfd_vma count, page_size;
13111   unsigned char *descdata, *filenames, *descend;
13112
13113   if (pnote->type != NT_FILE)
13114     return 1;
13115
13116 #ifndef BFD64
13117   if (!is_32bit_elf)
13118     {
13119       printf (_("    Cannot decode 64-bit note in 32-bit build\n"));
13120       /* Still "successful".  */
13121       return 1;
13122     }
13123 #endif
13124
13125   if (pnote->descsz < 2 * addr_size)
13126     {
13127       printf (_("    Malformed note - too short for header\n"));
13128       return 0;
13129     }
13130
13131   descdata = (unsigned char *) pnote->descdata;
13132   descend = descdata + pnote->descsz;
13133
13134   if (descdata[pnote->descsz - 1] != '\0')
13135     {
13136       printf (_("    Malformed note - does not end with \\0\n"));
13137       return 0;
13138     }
13139
13140   count = byte_get (descdata, addr_size);
13141   descdata += addr_size;
13142
13143   page_size = byte_get (descdata, addr_size);
13144   descdata += addr_size;
13145
13146   if (pnote->descsz < 2 * addr_size + count * 3 * addr_size)
13147     {
13148       printf (_("    Malformed note - too short for supplied file count\n"));
13149       return 0;
13150     }
13151
13152   printf (_("    Page size: "));
13153   print_vma (page_size, DEC);
13154   printf ("\n");
13155
13156   printf (_("    %*s%*s%*s\n"),
13157           (int) (2 + 2 * addr_size), _("Start"),
13158           (int) (4 + 2 * addr_size), _("End"),
13159           (int) (4 + 2 * addr_size), _("Page Offset"));
13160   filenames = descdata + count * 3 * addr_size;
13161   while (--count > 0)
13162     {
13163       bfd_vma start, end, file_ofs;
13164
13165       if (filenames == descend)
13166         {
13167           printf (_("    Malformed note - filenames end too early\n"));
13168           return 0;
13169         }
13170
13171       start = byte_get (descdata, addr_size);
13172       descdata += addr_size;
13173       end = byte_get (descdata, addr_size);
13174       descdata += addr_size;
13175       file_ofs = byte_get (descdata, addr_size);
13176       descdata += addr_size;
13177
13178       printf ("    ");
13179       print_vma (start, FULL_HEX);
13180       printf ("  ");
13181       print_vma (end, FULL_HEX);
13182       printf ("  ");
13183       print_vma (file_ofs, FULL_HEX);
13184       printf ("\n        %s\n", filenames);
13185
13186       filenames += 1 + strlen ((char *) filenames);
13187     }
13188
13189   return 1;
13190 }
13191
13192 static const char *
13193 get_gnu_elf_note_type (unsigned e_type)
13194 {
13195   static char buff[64];
13196
13197   switch (e_type)
13198     {
13199     case NT_GNU_ABI_TAG:
13200       return _("NT_GNU_ABI_TAG (ABI version tag)");
13201     case NT_GNU_HWCAP:
13202       return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
13203     case NT_GNU_BUILD_ID:
13204       return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
13205     case NT_GNU_GOLD_VERSION:
13206       return _("NT_GNU_GOLD_VERSION (gold version)");
13207     default:
13208       break;
13209     }
13210
13211   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
13212   return buff;
13213 }
13214
13215 static int
13216 print_gnu_note (Elf_Internal_Note *pnote)
13217 {
13218   switch (pnote->type)
13219     {
13220     case NT_GNU_BUILD_ID:
13221       {
13222         unsigned long i;
13223
13224         printf (_("    Build ID: "));
13225         for (i = 0; i < pnote->descsz; ++i)
13226           printf ("%02x", pnote->descdata[i] & 0xff);
13227         printf ("\n");
13228       }
13229       break;
13230
13231     case NT_GNU_ABI_TAG:
13232       {
13233         unsigned long os, major, minor, subminor;
13234         const char *osname;
13235
13236         os = byte_get ((unsigned char *) pnote->descdata, 4);
13237         major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
13238         minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
13239         subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
13240
13241         switch (os)
13242           {
13243           case GNU_ABI_TAG_LINUX:
13244             osname = "Linux";
13245             break;
13246           case GNU_ABI_TAG_HURD:
13247             osname = "Hurd";
13248             break;
13249           case GNU_ABI_TAG_SOLARIS:
13250             osname = "Solaris";
13251             break;
13252           case GNU_ABI_TAG_FREEBSD:
13253             osname = "FreeBSD";
13254             break;
13255           case GNU_ABI_TAG_NETBSD:
13256             osname = "NetBSD";
13257             break;
13258           default:
13259             osname = "Unknown";
13260             break;
13261           }
13262
13263         printf (_("    OS: %s, ABI: %ld.%ld.%ld\n"), osname,
13264                 major, minor, subminor);
13265       }
13266       break;
13267     }
13268
13269   return 1;
13270 }
13271
13272 static const char *
13273 get_netbsd_elfcore_note_type (unsigned e_type)
13274 {
13275   static char buff[64];
13276
13277   if (e_type == NT_NETBSDCORE_PROCINFO)
13278     {
13279       /* NetBSD core "procinfo" structure.  */
13280       return _("NetBSD procinfo structure");
13281     }
13282
13283   /* As of Jan 2002 there are no other machine-independent notes
13284      defined for NetBSD core files.  If the note type is less
13285      than the start of the machine-dependent note types, we don't
13286      understand it.  */
13287
13288   if (e_type < NT_NETBSDCORE_FIRSTMACH)
13289     {
13290       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
13291       return buff;
13292     }
13293
13294   switch (elf_header.e_machine)
13295     {
13296     /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
13297        and PT_GETFPREGS == mach+2.  */
13298
13299     case EM_OLD_ALPHA:
13300     case EM_ALPHA:
13301     case EM_SPARC:
13302     case EM_SPARC32PLUS:
13303     case EM_SPARCV9:
13304       switch (e_type)
13305         {
13306         case NT_NETBSDCORE_FIRSTMACH + 0:
13307           return _("PT_GETREGS (reg structure)");
13308         case NT_NETBSDCORE_FIRSTMACH + 2:
13309           return _("PT_GETFPREGS (fpreg structure)");
13310         default:
13311           break;
13312         }
13313       break;
13314
13315     /* On all other arch's, PT_GETREGS == mach+1 and
13316        PT_GETFPREGS == mach+3.  */
13317     default:
13318       switch (e_type)
13319         {
13320         case NT_NETBSDCORE_FIRSTMACH + 1:
13321           return _("PT_GETREGS (reg structure)");
13322         case NT_NETBSDCORE_FIRSTMACH + 3:
13323           return _("PT_GETFPREGS (fpreg structure)");
13324         default:
13325           break;
13326         }
13327     }
13328
13329   snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
13330             e_type - NT_NETBSDCORE_FIRSTMACH);
13331   return buff;
13332 }
13333
13334 static const char *
13335 get_stapsdt_note_type (unsigned e_type)
13336 {
13337   static char buff[64];
13338
13339   switch (e_type)
13340     {
13341     case NT_STAPSDT:
13342       return _("NT_STAPSDT (SystemTap probe descriptors)");
13343
13344     default:
13345       break;
13346     }
13347
13348   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
13349   return buff;
13350 }
13351
13352 static int
13353 print_stapsdt_note (Elf_Internal_Note *pnote)
13354 {
13355   int addr_size = is_32bit_elf ? 4 : 8;
13356   char *data = pnote->descdata;
13357   char *data_end = pnote->descdata + pnote->descsz;
13358   bfd_vma pc, base_addr, semaphore;
13359   char *provider, *probe, *arg_fmt;
13360
13361   pc = byte_get ((unsigned char *) data, addr_size);
13362   data += addr_size;
13363   base_addr = byte_get ((unsigned char *) data, addr_size);
13364   data += addr_size;
13365   semaphore = byte_get ((unsigned char *) data, addr_size);
13366   data += addr_size;
13367
13368   provider = data;
13369   data += strlen (data) + 1;
13370   probe = data;
13371   data += strlen (data) + 1;
13372   arg_fmt = data;
13373   data += strlen (data) + 1;
13374
13375   printf (_("    Provider: %s\n"), provider);
13376   printf (_("    Name: %s\n"), probe);
13377   printf (_("    Location: "));
13378   print_vma (pc, FULL_HEX);
13379   printf (_(", Base: "));
13380   print_vma (base_addr, FULL_HEX);
13381   printf (_(", Semaphore: "));
13382   print_vma (semaphore, FULL_HEX);
13383   printf ("\n");
13384   printf (_("    Arguments: %s\n"), arg_fmt);
13385
13386   return data == data_end;
13387 }
13388
13389 static const char *
13390 get_ia64_vms_note_type (unsigned e_type)
13391 {
13392   static char buff[64];
13393
13394   switch (e_type)
13395     {
13396     case NT_VMS_MHD:
13397       return _("NT_VMS_MHD (module header)");
13398     case NT_VMS_LNM:
13399       return _("NT_VMS_LNM (language name)");
13400     case NT_VMS_SRC:
13401       return _("NT_VMS_SRC (source files)");
13402     case NT_VMS_TITLE:
13403       return "NT_VMS_TITLE";
13404     case NT_VMS_EIDC:
13405       return _("NT_VMS_EIDC (consistency check)");
13406     case NT_VMS_FPMODE:
13407       return _("NT_VMS_FPMODE (FP mode)");
13408     case NT_VMS_LINKTIME:
13409       return "NT_VMS_LINKTIME";
13410     case NT_VMS_IMGNAM:
13411       return _("NT_VMS_IMGNAM (image name)");
13412     case NT_VMS_IMGID:
13413       return _("NT_VMS_IMGID (image id)");
13414     case NT_VMS_LINKID:
13415       return _("NT_VMS_LINKID (link id)");
13416     case NT_VMS_IMGBID:
13417       return _("NT_VMS_IMGBID (build id)");
13418     case NT_VMS_GSTNAM:
13419       return _("NT_VMS_GSTNAM (sym table name)");
13420     case NT_VMS_ORIG_DYN:
13421       return "NT_VMS_ORIG_DYN";
13422     case NT_VMS_PATCHTIME:
13423       return "NT_VMS_PATCHTIME";
13424     default:
13425       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
13426       return buff;
13427     }
13428 }
13429
13430 static int
13431 print_ia64_vms_note (Elf_Internal_Note * pnote)
13432 {
13433   switch (pnote->type)
13434     {
13435     case NT_VMS_MHD:
13436       if (pnote->descsz > 36)
13437         {
13438           size_t l = strlen (pnote->descdata + 34);
13439           printf (_("    Creation date  : %.17s\n"), pnote->descdata);
13440           printf (_("    Last patch date: %.17s\n"), pnote->descdata + 17);
13441           printf (_("    Module name    : %s\n"), pnote->descdata + 34);
13442           printf (_("    Module version : %s\n"), pnote->descdata + 34 + l + 1);
13443         }
13444       else
13445         printf (_("    Invalid size\n"));
13446       break;
13447     case NT_VMS_LNM:
13448       printf (_("   Language: %s\n"), pnote->descdata);
13449       break;
13450 #ifdef BFD64
13451     case NT_VMS_FPMODE:
13452       printf (_("   Floating Point mode: "));
13453       printf ("0x%016" BFD_VMA_FMT "x\n",
13454               (bfd_vma)byte_get ((unsigned char *)pnote->descdata, 8));
13455       break;
13456     case NT_VMS_LINKTIME:
13457       printf (_("   Link time: "));
13458       print_vms_time
13459         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
13460       printf ("\n");
13461       break;
13462     case NT_VMS_PATCHTIME:
13463       printf (_("   Patch time: "));
13464       print_vms_time
13465         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
13466       printf ("\n");
13467       break;
13468     case NT_VMS_ORIG_DYN:
13469       printf (_("   Major id: %u,  minor id: %u\n"),
13470               (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
13471               (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
13472       printf (_("   Last modified  : "));
13473       print_vms_time
13474         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
13475       printf (_("\n   Link flags  : "));
13476       printf ("0x%016" BFD_VMA_FMT "x\n",
13477               (bfd_vma)byte_get ((unsigned char *)pnote->descdata + 16, 8));
13478       printf (_("   Header flags: 0x%08x\n"),
13479               (unsigned)byte_get ((unsigned char *)pnote->descdata + 24, 4));
13480       printf (_("   Image id    : %s\n"), pnote->descdata + 32);
13481       break;
13482 #endif
13483     case NT_VMS_IMGNAM:
13484       printf (_("    Image name: %s\n"), pnote->descdata);
13485       break;
13486     case NT_VMS_GSTNAM:
13487       printf (_("    Global symbol table name: %s\n"), pnote->descdata);
13488       break;
13489     case NT_VMS_IMGID:
13490       printf (_("    Image id: %s\n"), pnote->descdata);
13491       break;
13492     case NT_VMS_LINKID:
13493       printf (_("    Linker id: %s\n"), pnote->descdata);
13494       break;
13495     default:
13496       break;
13497     }
13498   return 1;
13499 }
13500
13501 /* Note that by the ELF standard, the name field is already null byte
13502    terminated, and namesz includes the terminating null byte.
13503    I.E. the value of namesz for the name "FSF" is 4.
13504
13505    If the value of namesz is zero, there is no name present.  */
13506 static int
13507 process_note (Elf_Internal_Note * pnote)
13508 {
13509   const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
13510   const char * nt;
13511
13512   if (pnote->namesz == 0)
13513     /* If there is no note name, then use the default set of
13514        note type strings.  */
13515     nt = get_note_type (pnote->type);
13516
13517   else if (const_strneq (pnote->namedata, "GNU"))
13518     /* GNU-specific object file notes.  */
13519     nt = get_gnu_elf_note_type (pnote->type);
13520
13521   else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
13522     /* NetBSD-specific core file notes.  */
13523     nt = get_netbsd_elfcore_note_type (pnote->type);
13524
13525   else if (strneq (pnote->namedata, "SPU/", 4))
13526     {
13527       /* SPU-specific core file notes.  */
13528       nt = pnote->namedata + 4;
13529       name = "SPU";
13530     }
13531
13532   else if (const_strneq (pnote->namedata, "IPF/VMS"))
13533     /* VMS/ia64-specific file notes.  */
13534     nt = get_ia64_vms_note_type (pnote->type);
13535
13536   else if (const_strneq (pnote->namedata, "stapsdt"))
13537     nt = get_stapsdt_note_type (pnote->type);
13538
13539   else
13540     /* Don't recognize this note name; just use the default set of
13541        note type strings.  */
13542     nt = get_note_type (pnote->type);
13543
13544   printf ("  %-20s 0x%08lx\t%s\n", name, pnote->descsz, nt);
13545
13546   if (const_strneq (pnote->namedata, "IPF/VMS"))
13547     return print_ia64_vms_note (pnote);
13548   else if (const_strneq (pnote->namedata, "GNU"))
13549     return print_gnu_note (pnote);
13550   else if (const_strneq (pnote->namedata, "stapsdt"))
13551     return print_stapsdt_note (pnote);
13552   else if (const_strneq (pnote->namedata, "CORE"))
13553     return print_core_note (pnote);
13554   else
13555     return 1;
13556 }
13557
13558
13559 static int
13560 process_corefile_note_segment (FILE * file, bfd_vma offset, bfd_vma length)
13561 {
13562   Elf_External_Note * pnotes;
13563   Elf_External_Note * external;
13564   int res = 1;
13565
13566   if (length <= 0)
13567     return 0;
13568
13569   pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
13570                                            _("notes"));
13571   if (pnotes == NULL)
13572     return 0;
13573
13574   external = pnotes;
13575
13576   printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
13577           (unsigned long) offset, (unsigned long) length);
13578   printf (_("  %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
13579
13580   while ((char *) external < (char *) pnotes + length)
13581     {
13582       Elf_Internal_Note inote;
13583       size_t min_notesz;
13584       char *next;
13585       char * temp = NULL;
13586       size_t data_remaining = ((char *) pnotes + length) - (char *) external;
13587
13588       if (!is_ia64_vms ())
13589         {
13590           /* PR binutils/15191
13591              Make sure that there is enough data to read.  */
13592           min_notesz = offsetof (Elf_External_Note, name);
13593           if (data_remaining < min_notesz)
13594             {
13595               warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
13596                     (int) data_remaining);
13597               break;
13598             }
13599           inote.type     = BYTE_GET (external->type);
13600           inote.namesz   = BYTE_GET (external->namesz);
13601           inote.namedata = external->name;
13602           inote.descsz   = BYTE_GET (external->descsz);
13603           inote.descdata = inote.namedata + align_power (inote.namesz, 2);
13604           inote.descpos  = offset + (inote.descdata - (char *) pnotes);
13605           next = inote.descdata + align_power (inote.descsz, 2);
13606         }
13607       else
13608         {
13609           Elf64_External_VMS_Note *vms_external;
13610
13611           /* PR binutils/15191
13612              Make sure that there is enough data to read.  */
13613           min_notesz = offsetof (Elf64_External_VMS_Note, name);
13614           if (data_remaining < min_notesz)
13615             {
13616               warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
13617                     (int) data_remaining);
13618               break;
13619             }
13620
13621           vms_external = (Elf64_External_VMS_Note *) external;
13622           inote.type     = BYTE_GET (vms_external->type);
13623           inote.namesz   = BYTE_GET (vms_external->namesz);
13624           inote.namedata = vms_external->name;
13625           inote.descsz   = BYTE_GET (vms_external->descsz);
13626           inote.descdata = inote.namedata + align_power (inote.namesz, 3);
13627           inote.descpos  = offset + (inote.descdata - (char *) pnotes);
13628           next = inote.descdata + align_power (inote.descsz, 3);
13629         }
13630
13631       if (inote.descdata < (char *) external + min_notesz
13632           || next < (char *) external + min_notesz
13633           || data_remaining < (size_t)(next - (char *) external))
13634         {
13635           warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
13636                 (unsigned long) ((char *) external - (char *) pnotes));
13637           warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx\n"),
13638                 inote.type, inote.namesz, inote.descsz);
13639           break;
13640         }
13641
13642       external = (Elf_External_Note *) next;
13643
13644       /* Verify that name is null terminated.  It appears that at least
13645          one version of Linux (RedHat 6.0) generates corefiles that don't
13646          comply with the ELF spec by failing to include the null byte in
13647          namesz.  */
13648       if (inote.namedata[inote.namesz - 1] != '\0')
13649         {
13650           temp = (char *) malloc (inote.namesz + 1);
13651
13652           if (temp == NULL)
13653             {
13654               error (_("Out of memory\n"));
13655               res = 0;
13656               break;
13657             }
13658
13659           strncpy (temp, inote.namedata, inote.namesz);
13660           temp[inote.namesz] = 0;
13661
13662           /* warn (_("'%s' NOTE name not properly null terminated\n"), temp);  */
13663           inote.namedata = temp;
13664         }
13665
13666       res &= process_note (& inote);
13667
13668       if (temp != NULL)
13669         {
13670           free (temp);
13671           temp = NULL;
13672         }
13673     }
13674
13675   free (pnotes);
13676
13677   return res;
13678 }
13679
13680 static int
13681 process_corefile_note_segments (FILE * file)
13682 {
13683   Elf_Internal_Phdr * segment;
13684   unsigned int i;
13685   int res = 1;
13686
13687   if (! get_program_headers (file))
13688       return 0;
13689
13690   for (i = 0, segment = program_headers;
13691        i < elf_header.e_phnum;
13692        i++, segment++)
13693     {
13694       if (segment->p_type == PT_NOTE)
13695         res &= process_corefile_note_segment (file,
13696                                               (bfd_vma) segment->p_offset,
13697                                               (bfd_vma) segment->p_filesz);
13698     }
13699
13700   return res;
13701 }
13702
13703 static int
13704 process_note_sections (FILE * file)
13705 {
13706   Elf_Internal_Shdr * section;
13707   unsigned long i;
13708   int res = 1;
13709
13710   for (i = 0, section = section_headers;
13711        i < elf_header.e_shnum && section != NULL;
13712        i++, section++)
13713     if (section->sh_type == SHT_NOTE)
13714       res &= process_corefile_note_segment (file,
13715                                             (bfd_vma) section->sh_offset,
13716                                             (bfd_vma) section->sh_size);
13717
13718   return res;
13719 }
13720
13721 static int
13722 process_notes (FILE * file)
13723 {
13724   /* If we have not been asked to display the notes then do nothing.  */
13725   if (! do_notes)
13726     return 1;
13727
13728   if (elf_header.e_type != ET_CORE)
13729     return process_note_sections (file);
13730
13731   /* No program headers means no NOTE segment.  */
13732   if (elf_header.e_phnum > 0)
13733     return process_corefile_note_segments (file);
13734
13735   printf (_("No note segments present in the core file.\n"));
13736   return 1;
13737 }
13738
13739 static int
13740 process_arch_specific (FILE * file)
13741 {
13742   if (! do_arch)
13743     return 1;
13744
13745   switch (elf_header.e_machine)
13746     {
13747     case EM_ARM:
13748       return process_arm_specific (file);
13749     case EM_MIPS:
13750     case EM_MIPS_RS3_LE:
13751       return process_mips_specific (file);
13752       break;
13753     case EM_PPC:
13754       return process_power_specific (file);
13755       break;
13756     case EM_SPARC:
13757     case EM_SPARC32PLUS:
13758     case EM_SPARCV9:
13759       return process_sparc_specific (file);
13760       break;
13761     case EM_TI_C6000:
13762       return process_tic6x_specific (file);
13763       break;
13764     case EM_MSP430:
13765       return process_msp430x_specific (file);
13766     default:
13767       break;
13768     }
13769   return 1;
13770 }
13771
13772 static int
13773 get_file_header (FILE * file)
13774 {
13775   /* Read in the identity array.  */
13776   if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
13777     return 0;
13778
13779   /* Determine how to read the rest of the header.  */
13780   switch (elf_header.e_ident[EI_DATA])
13781     {
13782     default: /* fall through */
13783     case ELFDATANONE: /* fall through */
13784     case ELFDATA2LSB:
13785       byte_get = byte_get_little_endian;
13786       byte_put = byte_put_little_endian;
13787       break;
13788     case ELFDATA2MSB:
13789       byte_get = byte_get_big_endian;
13790       byte_put = byte_put_big_endian;
13791       break;
13792     }
13793
13794   /* For now we only support 32 bit and 64 bit ELF files.  */
13795   is_32bit_elf = (elf_header.e_ident[EI_CLASS] != ELFCLASS64);
13796
13797   /* Read in the rest of the header.  */
13798   if (is_32bit_elf)
13799     {
13800       Elf32_External_Ehdr ehdr32;
13801
13802       if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
13803         return 0;
13804
13805       elf_header.e_type      = BYTE_GET (ehdr32.e_type);
13806       elf_header.e_machine   = BYTE_GET (ehdr32.e_machine);
13807       elf_header.e_version   = BYTE_GET (ehdr32.e_version);
13808       elf_header.e_entry     = BYTE_GET (ehdr32.e_entry);
13809       elf_header.e_phoff     = BYTE_GET (ehdr32.e_phoff);
13810       elf_header.e_shoff     = BYTE_GET (ehdr32.e_shoff);
13811       elf_header.e_flags     = BYTE_GET (ehdr32.e_flags);
13812       elf_header.e_ehsize    = BYTE_GET (ehdr32.e_ehsize);
13813       elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
13814       elf_header.e_phnum     = BYTE_GET (ehdr32.e_phnum);
13815       elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
13816       elf_header.e_shnum     = BYTE_GET (ehdr32.e_shnum);
13817       elf_header.e_shstrndx  = BYTE_GET (ehdr32.e_shstrndx);
13818     }
13819   else
13820     {
13821       Elf64_External_Ehdr ehdr64;
13822
13823       /* If we have been compiled with sizeof (bfd_vma) == 4, then
13824          we will not be able to cope with the 64bit data found in
13825          64 ELF files.  Detect this now and abort before we start
13826          overwriting things.  */
13827       if (sizeof (bfd_vma) < 8)
13828         {
13829           error (_("This instance of readelf has been built without support for a\n\
13830 64 bit data type and so it cannot read 64 bit ELF files.\n"));
13831           return 0;
13832         }
13833
13834       if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
13835         return 0;
13836
13837       elf_header.e_type      = BYTE_GET (ehdr64.e_type);
13838       elf_header.e_machine   = BYTE_GET (ehdr64.e_machine);
13839       elf_header.e_version   = BYTE_GET (ehdr64.e_version);
13840       elf_header.e_entry     = BYTE_GET (ehdr64.e_entry);
13841       elf_header.e_phoff     = BYTE_GET (ehdr64.e_phoff);
13842       elf_header.e_shoff     = BYTE_GET (ehdr64.e_shoff);
13843       elf_header.e_flags     = BYTE_GET (ehdr64.e_flags);
13844       elf_header.e_ehsize    = BYTE_GET (ehdr64.e_ehsize);
13845       elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
13846       elf_header.e_phnum     = BYTE_GET (ehdr64.e_phnum);
13847       elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
13848       elf_header.e_shnum     = BYTE_GET (ehdr64.e_shnum);
13849       elf_header.e_shstrndx  = BYTE_GET (ehdr64.e_shstrndx);
13850     }
13851
13852   if (elf_header.e_shoff)
13853     {
13854       /* There may be some extensions in the first section header.  Don't
13855          bomb if we can't read it.  */
13856       if (is_32bit_elf)
13857         get_32bit_section_headers (file, 1);
13858       else
13859         get_64bit_section_headers (file, 1);
13860     }
13861
13862   return 1;
13863 }
13864
13865 /* Process one ELF object file according to the command line options.
13866    This file may actually be stored in an archive.  The file is
13867    positioned at the start of the ELF object.  */
13868
13869 static int
13870 process_object (char * file_name, FILE * file)
13871 {
13872   unsigned int i;
13873
13874   if (! get_file_header (file))
13875     {
13876       error (_("%s: Failed to read file header\n"), file_name);
13877       return 1;
13878     }
13879
13880   /* Initialise per file variables.  */
13881   for (i = ARRAY_SIZE (version_info); i--;)
13882     version_info[i] = 0;
13883
13884   for (i = ARRAY_SIZE (dynamic_info); i--;)
13885     dynamic_info[i] = 0;
13886   dynamic_info_DT_GNU_HASH = 0;
13887
13888   /* Process the file.  */
13889   if (show_name)
13890     printf (_("\nFile: %s\n"), file_name);
13891
13892   /* Initialise the dump_sects array from the cmdline_dump_sects array.
13893      Note we do this even if cmdline_dump_sects is empty because we
13894      must make sure that the dump_sets array is zeroed out before each
13895      object file is processed.  */
13896   if (num_dump_sects > num_cmdline_dump_sects)
13897     memset (dump_sects, 0, num_dump_sects * sizeof (* dump_sects));
13898
13899   if (num_cmdline_dump_sects > 0)
13900     {
13901       if (num_dump_sects == 0)
13902         /* A sneaky way of allocating the dump_sects array.  */
13903         request_dump_bynumber (num_cmdline_dump_sects, 0);
13904
13905       assert (num_dump_sects >= num_cmdline_dump_sects);
13906       memcpy (dump_sects, cmdline_dump_sects,
13907               num_cmdline_dump_sects * sizeof (* dump_sects));
13908     }
13909
13910   if (! process_file_header ())
13911     return 1;
13912
13913   if (! process_section_headers (file))
13914     {
13915       /* Without loaded section headers we cannot process lots of
13916          things.  */
13917       do_unwind = do_version = do_dump = do_arch = 0;
13918
13919       if (! do_using_dynamic)
13920         do_syms = do_dyn_syms = do_reloc = 0;
13921     }
13922
13923   if (! process_section_groups (file))
13924     {
13925       /* Without loaded section groups we cannot process unwind.  */
13926       do_unwind = 0;
13927     }
13928
13929   if (process_program_headers (file))
13930     process_dynamic_section (file);
13931
13932   process_relocs (file);
13933
13934   process_unwind (file);
13935
13936   process_symbol_table (file);
13937
13938   process_syminfo (file);
13939
13940   process_version_sections (file);
13941
13942   process_section_contents (file);
13943
13944   process_notes (file);
13945
13946   process_gnu_liblist (file);
13947
13948   process_arch_specific (file);
13949
13950   if (program_headers)
13951     {
13952       free (program_headers);
13953       program_headers = NULL;
13954     }
13955
13956   if (section_headers)
13957     {
13958       free (section_headers);
13959       section_headers = NULL;
13960     }
13961
13962   if (string_table)
13963     {
13964       free (string_table);
13965       string_table = NULL;
13966       string_table_length = 0;
13967     }
13968
13969   if (dynamic_strings)
13970     {
13971       free (dynamic_strings);
13972       dynamic_strings = NULL;
13973       dynamic_strings_length = 0;
13974     }
13975
13976   if (dynamic_symbols)
13977     {
13978       free (dynamic_symbols);
13979       dynamic_symbols = NULL;
13980       num_dynamic_syms = 0;
13981     }
13982
13983   if (dynamic_syminfo)
13984     {
13985       free (dynamic_syminfo);
13986       dynamic_syminfo = NULL;
13987     }
13988
13989   if (dynamic_section)
13990     {
13991       free (dynamic_section);
13992       dynamic_section = NULL;
13993     }
13994
13995   if (section_headers_groups)
13996     {
13997       free (section_headers_groups);
13998       section_headers_groups = NULL;
13999     }
14000
14001   if (section_groups)
14002     {
14003       struct group_list * g;
14004       struct group_list * next;
14005
14006       for (i = 0; i < group_count; i++)
14007         {
14008           for (g = section_groups [i].root; g != NULL; g = next)
14009             {
14010               next = g->next;
14011               free (g);
14012             }
14013         }
14014
14015       free (section_groups);
14016       section_groups = NULL;
14017     }
14018
14019   free_debug_memory ();
14020
14021   return 0;
14022 }
14023
14024 /* Process an ELF archive.
14025    On entry the file is positioned just after the ARMAG string.  */
14026
14027 static int
14028 process_archive (char * file_name, FILE * file, bfd_boolean is_thin_archive)
14029 {
14030   struct archive_info arch;
14031   struct archive_info nested_arch;
14032   size_t got;
14033   int ret;
14034
14035   show_name = 1;
14036
14037   /* The ARCH structure is used to hold information about this archive.  */
14038   arch.file_name = NULL;
14039   arch.file = NULL;
14040   arch.index_array = NULL;
14041   arch.sym_table = NULL;
14042   arch.longnames = NULL;
14043
14044   /* The NESTED_ARCH structure is used as a single-item cache of information
14045      about a nested archive (when members of a thin archive reside within
14046      another regular archive file).  */
14047   nested_arch.file_name = NULL;
14048   nested_arch.file = NULL;
14049   nested_arch.index_array = NULL;
14050   nested_arch.sym_table = NULL;
14051   nested_arch.longnames = NULL;
14052
14053   if (setup_archive (&arch, file_name, file, is_thin_archive, do_archive_index) != 0)
14054     {
14055       ret = 1;
14056       goto out;
14057     }
14058
14059   if (do_archive_index)
14060     {
14061       if (arch.sym_table == NULL)
14062         error (_("%s: unable to dump the index as none was found\n"), file_name);
14063       else
14064         {
14065           unsigned int i, l;
14066           unsigned long current_pos;
14067
14068           printf (_("Index of archive %s: (%ld entries, 0x%lx bytes in the symbol table)\n"),
14069                   file_name, (long) arch.index_num, arch.sym_size);
14070           current_pos = ftell (file);
14071
14072           for (i = l = 0; i < arch.index_num; i++)
14073             {
14074               if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
14075                 {
14076                   char * member_name;
14077
14078                   member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
14079
14080                   if (member_name != NULL)
14081                     {
14082                       char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
14083
14084                       if (qualified_name != NULL)
14085                         {
14086                           printf (_("Contents of binary %s at offset "), qualified_name);
14087                           (void) print_vma (arch.index_array[i], PREFIX_HEX);
14088                           putchar ('\n');
14089                           free (qualified_name);
14090                         }
14091                     }
14092                 }
14093
14094               if (l >= arch.sym_size)
14095                 {
14096                   error (_("%s: end of the symbol table reached before the end of the index\n"),
14097                          file_name);
14098                   break;
14099                 }
14100               printf ("\t%s\n", arch.sym_table + l);
14101               l += strlen (arch.sym_table + l) + 1;
14102             }
14103
14104           if (arch.uses_64bit_indicies)
14105             l = (l + 7) & ~ 7;
14106           else
14107             l += l & 1;
14108
14109           if (l < arch.sym_size)
14110             error (_("%s: %ld bytes remain in the symbol table, but without corresponding entries in the index table\n"),
14111                    file_name, arch.sym_size - l);
14112
14113           if (fseek (file, current_pos, SEEK_SET) != 0)
14114             {
14115               error (_("%s: failed to seek back to start of object files in the archive\n"), file_name);
14116               ret = 1;
14117               goto out;
14118             }
14119         }
14120
14121       if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
14122           && !do_segments && !do_header && !do_dump && !do_version
14123           && !do_histogram && !do_debugging && !do_arch && !do_notes
14124           && !do_section_groups && !do_dyn_syms)
14125         {
14126           ret = 0; /* Archive index only.  */
14127           goto out;
14128         }
14129     }
14130
14131   ret = 0;
14132
14133   while (1)
14134     {
14135       char * name;
14136       size_t namelen;
14137       char * qualified_name;
14138
14139       /* Read the next archive header.  */
14140       if (fseek (file, arch.next_arhdr_offset, SEEK_SET) != 0)
14141         {
14142           error (_("%s: failed to seek to next archive header\n"), file_name);
14143           return 1;
14144         }
14145       got = fread (&arch.arhdr, 1, sizeof arch.arhdr, file);
14146       if (got != sizeof arch.arhdr)
14147         {
14148           if (got == 0)
14149             break;
14150           error (_("%s: failed to read archive header\n"), file_name);
14151           ret = 1;
14152           break;
14153         }
14154       if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
14155         {
14156           error (_("%s: did not find a valid archive header\n"), arch.file_name);
14157           ret = 1;
14158           break;
14159         }
14160
14161       arch.next_arhdr_offset += sizeof arch.arhdr;
14162
14163       archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
14164       if (archive_file_size & 01)
14165         ++archive_file_size;
14166
14167       name = get_archive_member_name (&arch, &nested_arch);
14168       if (name == NULL)
14169         {
14170           error (_("%s: bad archive file name\n"), file_name);
14171           ret = 1;
14172           break;
14173         }
14174       namelen = strlen (name);
14175
14176       qualified_name = make_qualified_name (&arch, &nested_arch, name);
14177       if (qualified_name == NULL)
14178         {
14179           error (_("%s: bad archive file name\n"), file_name);
14180           ret = 1;
14181           break;
14182         }
14183
14184       if (is_thin_archive && arch.nested_member_origin == 0)
14185         {
14186           /* This is a proxy for an external member of a thin archive.  */
14187           FILE * member_file;
14188           char * member_file_name = adjust_relative_path (file_name, name, namelen);
14189           if (member_file_name == NULL)
14190             {
14191               ret = 1;
14192               break;
14193             }
14194
14195           member_file = fopen (member_file_name, "rb");
14196           if (member_file == NULL)
14197             {
14198               error (_("Input file '%s' is not readable.\n"), member_file_name);
14199               free (member_file_name);
14200               ret = 1;
14201               break;
14202             }
14203
14204           archive_file_offset = arch.nested_member_origin;
14205
14206           ret |= process_object (qualified_name, member_file);
14207
14208           fclose (member_file);
14209           free (member_file_name);
14210         }
14211       else if (is_thin_archive)
14212         {
14213           /* PR 15140: Allow for corrupt thin archives.  */
14214           if (nested_arch.file == NULL)
14215             {
14216               error (_("%s: contains corrupt thin archive: %s\n"),
14217                      file_name, name);
14218               ret = 1;
14219               break;
14220             }
14221
14222           /* This is a proxy for a member of a nested archive.  */
14223           archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
14224
14225           /* The nested archive file will have been opened and setup by
14226              get_archive_member_name.  */
14227           if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
14228             {
14229               error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
14230               ret = 1;
14231               break;
14232             }
14233
14234           ret |= process_object (qualified_name, nested_arch.file);
14235         }
14236       else
14237         {
14238           archive_file_offset = arch.next_arhdr_offset;
14239           arch.next_arhdr_offset += archive_file_size;
14240
14241           ret |= process_object (qualified_name, file);
14242         }
14243
14244       if (dump_sects != NULL)
14245         {
14246           free (dump_sects);
14247           dump_sects = NULL;
14248           num_dump_sects = 0;
14249         }
14250
14251       free (qualified_name);
14252     }
14253
14254  out:
14255   if (nested_arch.file != NULL)
14256     fclose (nested_arch.file);
14257   release_archive (&nested_arch);
14258   release_archive (&arch);
14259
14260   return ret;
14261 }
14262
14263 static int
14264 process_file (char * file_name)
14265 {
14266   FILE * file;
14267   struct stat statbuf;
14268   char armag[SARMAG];
14269   int ret;
14270
14271   if (stat (file_name, &statbuf) < 0)
14272     {
14273       if (errno == ENOENT)
14274         error (_("'%s': No such file\n"), file_name);
14275       else
14276         error (_("Could not locate '%s'.  System error message: %s\n"),
14277                file_name, strerror (errno));
14278       return 1;
14279     }
14280
14281   if (! S_ISREG (statbuf.st_mode))
14282     {
14283       error (_("'%s' is not an ordinary file\n"), file_name);
14284       return 1;
14285     }
14286
14287   file = fopen (file_name, "rb");
14288   if (file == NULL)
14289     {
14290       error (_("Input file '%s' is not readable.\n"), file_name);
14291       return 1;
14292     }
14293
14294   if (fread (armag, SARMAG, 1, file) != 1)
14295     {
14296       error (_("%s: Failed to read file's magic number\n"), file_name);
14297       fclose (file);
14298       return 1;
14299     }
14300
14301   if (memcmp (armag, ARMAG, SARMAG) == 0)
14302     ret = process_archive (file_name, file, FALSE);
14303   else if (memcmp (armag, ARMAGT, SARMAG) == 0)
14304     ret = process_archive (file_name, file, TRUE);
14305   else
14306     {
14307       if (do_archive_index)
14308         error (_("File %s is not an archive so its index cannot be displayed.\n"),
14309                file_name);
14310
14311       rewind (file);
14312       archive_file_size = archive_file_offset = 0;
14313       ret = process_object (file_name, file);
14314     }
14315
14316   fclose (file);
14317
14318   return ret;
14319 }
14320
14321 #ifdef SUPPORT_DISASSEMBLY
14322 /* Needed by the i386 disassembler.  For extra credit, someone could
14323    fix this so that we insert symbolic addresses here, esp for GOT/PLT
14324    symbols.  */
14325
14326 void
14327 print_address (unsigned int addr, FILE * outfile)
14328 {
14329   fprintf (outfile,"0x%8.8x", addr);
14330 }
14331
14332 /* Needed by the i386 disassembler.  */
14333 void
14334 db_task_printsym (unsigned int addr)
14335 {
14336   print_address (addr, stderr);
14337 }
14338 #endif
14339
14340 int
14341 main (int argc, char ** argv)
14342 {
14343   int err;
14344
14345 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
14346   setlocale (LC_MESSAGES, "");
14347 #endif
14348 #if defined (HAVE_SETLOCALE)
14349   setlocale (LC_CTYPE, "");
14350 #endif
14351   bindtextdomain (PACKAGE, LOCALEDIR);
14352   textdomain (PACKAGE);
14353
14354   expandargv (&argc, &argv);
14355
14356   parse_args (argc, argv);
14357
14358   if (num_dump_sects > 0)
14359     {
14360       /* Make a copy of the dump_sects array.  */
14361       cmdline_dump_sects = (dump_type *)
14362           malloc (num_dump_sects * sizeof (* dump_sects));
14363       if (cmdline_dump_sects == NULL)
14364         error (_("Out of memory allocating dump request table.\n"));
14365       else
14366         {
14367           memcpy (cmdline_dump_sects, dump_sects,
14368                   num_dump_sects * sizeof (* dump_sects));
14369           num_cmdline_dump_sects = num_dump_sects;
14370         }
14371     }
14372
14373   if (optind < (argc - 1))
14374     show_name = 1;
14375
14376   err = 0;
14377   while (optind < argc)
14378     err |= process_file (argv[optind++]);
14379
14380   if (dump_sects != NULL)
14381     free (dump_sects);
14382   if (cmdline_dump_sects != NULL)
14383     free (cmdline_dump_sects);
14384
14385   return err;
14386 }