PR binutils/12855
[platform/upstream/binutils.git] / binutils / readelf.c
1 /* readelf.c -- display contents of an ELF format file
2    Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
3    2008, 2009, 2010, 2011
4    Free Software Foundation, Inc.
5
6    Originally developed by Eric Youngdale <eric@andante.jic.com>
7    Modifications by Nick Clifton <nickc@redhat.com>
8
9    This file is part of GNU Binutils.
10
11    This program is free software; you can redistribute it and/or modify
12    it under the terms of the GNU General Public License as published by
13    the Free Software Foundation; either version 3 of the License, or
14    (at your option) any later version.
15
16    This program is distributed in the hope that it will be useful,
17    but WITHOUT ANY WARRANTY; without even the implied warranty of
18    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19    GNU General Public License for more details.
20
21    You should have received a copy of the GNU General Public License
22    along with this program; if not, write to the Free Software
23    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
24    02110-1301, USA.  */
25 \f
26 /* The difference between readelf and objdump:
27
28   Both programs are capable of displaying the contents of ELF format files,
29   so why does the binutils project have two file dumpers ?
30
31   The reason is that objdump sees an ELF file through a BFD filter of the
32   world; if BFD has a bug where, say, it disagrees about a machine constant
33   in e_flags, then the odds are good that it will remain internally
34   consistent.  The linker sees it the BFD way, objdump sees it the BFD way,
35   GAS sees it the BFD way.  There was need for a tool to go find out what
36   the file actually says.
37
38   This is why the readelf program does not link against the BFD library - it
39   exists as an independent program to help verify the correct working of BFD.
40
41   There is also the case that readelf can provide more information about an
42   ELF file than is provided by objdump.  In particular it can display DWARF
43   debugging information which (at the moment) objdump cannot.  */
44 \f
45 #include "config.h"
46 #include "sysdep.h"
47 #include <assert.h>
48 #include <sys/stat.h>
49 #include <time.h>
50 #ifdef HAVE_ZLIB_H
51 #include <zlib.h>
52 #endif
53
54 #if __GNUC__ >= 2
55 /* Define BFD64 here, even if our default architecture is 32 bit ELF
56    as this will allow us to read in and parse 64bit and 32bit ELF files.
57    Only do this if we believe that the compiler can support a 64 bit
58    data type.  For now we only rely on GCC being able to do this.  */
59 #define BFD64
60 #endif
61
62 #include "bfd.h"
63 #include "bucomm.h"
64 #include "elfcomm.h"
65 #include "dwarf.h"
66
67 #include "elf/common.h"
68 #include "elf/external.h"
69 #include "elf/internal.h"
70
71
72 /* Included here, before RELOC_MACROS_GEN_FUNC is defined, so that
73    we can obtain the H8 reloc numbers.  We need these for the
74    get_reloc_size() function.  We include h8.h again after defining
75    RELOC_MACROS_GEN_FUNC so that we get the naming function as well.  */
76
77 #include "elf/h8.h"
78 #undef _ELF_H8_H
79
80 /* Undo the effects of #including reloc-macros.h.  */
81
82 #undef START_RELOC_NUMBERS
83 #undef RELOC_NUMBER
84 #undef FAKE_RELOC
85 #undef EMPTY_RELOC
86 #undef END_RELOC_NUMBERS
87 #undef _RELOC_MACROS_H
88
89 /* The following headers use the elf/reloc-macros.h file to
90    automatically generate relocation recognition functions
91    such as elf_mips_reloc_type()  */
92
93 #define RELOC_MACROS_GEN_FUNC
94
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/fr30.h"
107 #include "elf/frv.h"
108 #include "elf/h8.h"
109 #include "elf/hppa.h"
110 #include "elf/i386.h"
111 #include "elf/i370.h"
112 #include "elf/i860.h"
113 #include "elf/i960.h"
114 #include "elf/ia64.h"
115 #include "elf/ip2k.h"
116 #include "elf/lm32.h"
117 #include "elf/iq2000.h"
118 #include "elf/m32c.h"
119 #include "elf/m32r.h"
120 #include "elf/m68k.h"
121 #include "elf/m68hc11.h"
122 #include "elf/mcore.h"
123 #include "elf/mep.h"
124 #include "elf/microblaze.h"
125 #include "elf/mips.h"
126 #include "elf/mmix.h"
127 #include "elf/mn10200.h"
128 #include "elf/mn10300.h"
129 #include "elf/moxie.h"
130 #include "elf/mt.h"
131 #include "elf/msp430.h"
132 #include "elf/or32.h"
133 #include "elf/pj.h"
134 #include "elf/ppc.h"
135 #include "elf/ppc64.h"
136 #include "elf/rx.h"
137 #include "elf/s390.h"
138 #include "elf/score.h"
139 #include "elf/sh.h"
140 #include "elf/sparc.h"
141 #include "elf/spu.h"
142 #include "elf/tic6x.h"
143 #include "elf/v850.h"
144 #include "elf/vax.h"
145 #include "elf/x86-64.h"
146 #include "elf/xc16x.h"
147 #include "elf/xstormy16.h"
148 #include "elf/xtensa.h"
149
150 #include "getopt.h"
151 #include "libiberty.h"
152 #include "safe-ctype.h"
153 #include "filenames.h"
154
155 char * program_name = "readelf";
156 static long archive_file_offset;
157 static unsigned long archive_file_size;
158 static unsigned long dynamic_addr;
159 static bfd_size_type dynamic_size;
160 static unsigned int dynamic_nent;
161 static char * dynamic_strings;
162 static unsigned long dynamic_strings_length;
163 static char * string_table;
164 static unsigned long string_table_length;
165 static unsigned long num_dynamic_syms;
166 static Elf_Internal_Sym * dynamic_symbols;
167 static Elf_Internal_Syminfo * dynamic_syminfo;
168 static unsigned long dynamic_syminfo_offset;
169 static unsigned int dynamic_syminfo_nent;
170 static char program_interpreter[PATH_MAX];
171 static bfd_vma dynamic_info[DT_ENCODING];
172 static bfd_vma dynamic_info_DT_GNU_HASH;
173 static bfd_vma version_info[16];
174 static Elf_Internal_Ehdr elf_header;
175 static Elf_Internal_Shdr * section_headers;
176 static Elf_Internal_Phdr * program_headers;
177 static Elf_Internal_Dyn *  dynamic_section;
178 static Elf_Internal_Shdr * symtab_shndx_hdr;
179 static int show_name;
180 static int do_dynamic;
181 static int do_syms;
182 static int do_dyn_syms;
183 static int do_reloc;
184 static int do_sections;
185 static int do_section_groups;
186 static int do_section_details;
187 static int do_segments;
188 static int do_unwind;
189 static int do_using_dynamic;
190 static int do_header;
191 static int do_dump;
192 static int do_version;
193 static int do_histogram;
194 static int do_debugging;
195 static int do_arch;
196 static int do_notes;
197 static int do_archive_index;
198 static int is_32bit_elf;
199
200 struct group_list
201 {
202   struct group_list * next;
203   unsigned int section_index;
204 };
205
206 struct group
207 {
208   struct group_list * root;
209   unsigned int group_index;
210 };
211
212 static size_t group_count;
213 static struct group * section_groups;
214 static struct group ** section_headers_groups;
215
216
217 /* Flag bits indicating particular types of dump.  */
218 #define HEX_DUMP        (1 << 0)        /* The -x command line switch.  */
219 #define DISASS_DUMP     (1 << 1)        /* The -i command line switch.  */
220 #define DEBUG_DUMP      (1 << 2)        /* The -w command line switch.  */
221 #define STRING_DUMP     (1 << 3)        /* The -p command line switch.  */
222 #define RELOC_DUMP      (1 << 4)        /* The -R command line switch.  */
223
224 typedef unsigned char dump_type;
225
226 /* A linked list of the section names for which dumps were requested.  */
227 struct dump_list_entry
228 {
229   char * name;
230   dump_type type;
231   struct dump_list_entry * next;
232 };
233 static struct dump_list_entry * dump_sects_byname;
234
235 /* A dynamic array of flags indicating for which sections a dump
236    has been requested via command line switches.  */
237 static dump_type *   cmdline_dump_sects = NULL;
238 static unsigned int  num_cmdline_dump_sects = 0;
239
240 /* A dynamic array of flags indicating for which sections a dump of
241    some kind has been requested.  It is reset on a per-object file
242    basis and then initialised from the cmdline_dump_sects array,
243    the results of interpreting the -w switch, and the
244    dump_sects_byname list.  */
245 static dump_type *   dump_sects = NULL;
246 static unsigned int  num_dump_sects = 0;
247
248
249 /* How to print a vma value.  */
250 typedef enum print_mode
251 {
252   HEX,
253   DEC,
254   DEC_5,
255   UNSIGNED,
256   PREFIX_HEX,
257   FULL_HEX,
258   LONG_HEX
259 }
260 print_mode;
261
262 #define UNKNOWN -1
263
264 #define SECTION_NAME(X)                                         \
265   ((X) == NULL ? _("<none>")                                    \
266    : string_table == NULL ? _("<no-name>")                      \
267    : ((X)->sh_name >= string_table_length ? _("<corrupt>")      \
268   : string_table + (X)->sh_name))
269
270 #define DT_VERSIONTAGIDX(tag)   (DT_VERNEEDNUM - (tag)) /* Reverse order!  */
271
272 #define GET_ELF_SYMBOLS(file, section)                  \
273   (is_32bit_elf ? get_32bit_elf_symbols (file, section) \
274    : get_64bit_elf_symbols (file, section))
275
276 #define VALID_DYNAMIC_NAME(offset)      ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
277 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
278    already been called and verified that the string exists.  */
279 #define GET_DYNAMIC_NAME(offset)        (dynamic_strings + offset)
280
281 #define REMOVE_ARCH_BITS(ADDR)                  \
282   do                                            \
283     {                                           \
284       if (elf_header.e_machine == EM_ARM)       \
285         (ADDR) &= ~1;                           \
286     }                                           \
287   while (0)
288 \f
289 /* Retrieve NMEMB structures, each SIZE bytes long from FILE starting at OFFSET.
290    Put the retrieved data into VAR, if it is not NULL.  Otherwise allocate a buffer
291    using malloc and fill that.  In either case return the pointer to the start of
292    the retrieved data or NULL if something went wrong.  If something does go wrong
293    emit an error message using REASON as part of the context.  */
294
295 static void *
296 get_data (void * var, FILE * file, long offset, size_t size, size_t nmemb,
297           const char * reason)
298 {
299   void * mvar;
300
301   if (size == 0 || nmemb == 0)
302     return NULL;
303
304   if (fseek (file, archive_file_offset + offset, SEEK_SET))
305     {
306       error (_("Unable to seek to 0x%lx for %s\n"),
307              (unsigned long) archive_file_offset + offset, reason);
308       return NULL;
309     }
310
311   mvar = var;
312   if (mvar == NULL)
313     {
314       /* Check for overflow.  */
315       if (nmemb < (~(size_t) 0 - 1) / size)
316         /* + 1 so that we can '\0' terminate invalid string table sections.  */
317         mvar = malloc (size * nmemb + 1);
318
319       if (mvar == NULL)
320         {
321           error (_("Out of memory allocating 0x%lx bytes for %s\n"),
322                  (unsigned long)(size * nmemb), reason);
323           return NULL;
324         }
325
326       ((char *) mvar)[size * nmemb] = '\0';
327     }
328
329   if (fread (mvar, size, nmemb, file) != nmemb)
330     {
331       error (_("Unable to read in 0x%lx bytes of %s\n"),
332              (unsigned long)(size * nmemb), reason);
333       if (mvar != var)
334         free (mvar);
335       return NULL;
336     }
337
338   return mvar;
339 }
340
341 /* Print a VMA value.  */
342
343 static int
344 print_vma (bfd_vma vma, print_mode mode)
345 {
346   int nc = 0;
347
348   switch (mode)
349     {
350     case FULL_HEX:
351       nc = printf ("0x");
352       /* Drop through.  */
353
354     case LONG_HEX:
355 #ifdef BFD64
356       if (is_32bit_elf)
357         return nc + printf ("%8.8" BFD_VMA_FMT "x", vma);
358 #endif
359       printf_vma (vma);
360       return nc + 16;
361
362     case DEC_5:
363       if (vma <= 99999)
364         return printf ("%5" BFD_VMA_FMT "d", vma);
365       /* Drop through.  */
366
367     case PREFIX_HEX:
368       nc = printf ("0x");
369       /* Drop through.  */
370
371     case HEX:
372       return nc + printf ("%" BFD_VMA_FMT "x", vma);
373
374     case DEC:
375       return printf ("%" BFD_VMA_FMT "d", vma);
376
377     case UNSIGNED:
378       return printf ("%" BFD_VMA_FMT "u", vma);
379     }
380   return 0;
381 }
382
383 /* Display a symbol on stdout.  Handles the display of non-printing characters.
384
385    If DO_WIDE is not true then format the symbol to be at most WIDTH characters,
386    truncating as necessary.  If WIDTH is negative then format the string to be
387    exactly - WIDTH characters, truncating or padding as necessary.
388
389    Returns the number of emitted characters.  */
390
391 static unsigned int
392 print_symbol (int width, const char *symbol)
393 {
394   const char *c;
395   bfd_boolean extra_padding = FALSE;
396   unsigned int num_printed = 0;
397
398   if (do_wide)
399     {
400       /* Set the width to a very large value.  This simplifies the
401          code below.  */
402       width = INT_MAX;
403     }
404   else if (width < 0)
405     {
406       /* Keep the width positive.  This also helps.  */
407       width = - width;
408       extra_padding = TRUE;
409     }
410
411   while (width)
412     {
413       int len;
414
415       c = symbol;
416
417       /* Look for non-printing symbols inside the symbol's name.
418          This test is triggered in particular by the names generated
419          by the assembler for local labels.  */
420       while (ISPRINT (*c))
421         c++;
422
423       len = c - symbol;
424
425       if (len)
426         {
427           if (len > width)
428             len = width;
429
430           printf ("%.*s", len, symbol);
431
432           width -= len;
433           num_printed += len;
434         }
435
436       if (*c == 0 || width == 0)
437         break;
438
439       /* Now display the non-printing character, if
440          there is room left in which to dipslay it.  */
441       if ((unsigned char) *c < 32)
442         {
443           if (width < 2)
444             break;
445
446           printf ("^%c", *c + 0x40);
447
448           width -= 2;
449           num_printed += 2;
450         }
451       else
452         {
453           if (width < 6)
454             break;
455
456           printf ("<0x%.2x>", (unsigned char) *c);
457
458           width -= 6;
459           num_printed += 6;
460         }
461
462       symbol = c + 1;
463     }
464
465   if (extra_padding && width > 0)
466     {
467       /* Fill in the remaining spaces.  */
468       printf ("%-*s", width, " ");
469       num_printed += 2;
470     }
471
472   return num_printed;
473 }
474
475 /* Return a pointer to section NAME, or NULL if no such section exists.  */
476
477 static Elf_Internal_Shdr *
478 find_section (const char * name)
479 {
480   unsigned int i;
481
482   for (i = 0; i < elf_header.e_shnum; i++)
483     if (streq (SECTION_NAME (section_headers + i), name))
484       return section_headers + i;
485
486   return NULL;
487 }
488
489 /* Return a pointer to a section containing ADDR, or NULL if no such
490    section exists.  */
491
492 static Elf_Internal_Shdr *
493 find_section_by_address (bfd_vma addr)
494 {
495   unsigned int i;
496
497   for (i = 0; i < elf_header.e_shnum; i++)
498     {
499       Elf_Internal_Shdr *sec = section_headers + i;
500       if (addr >= sec->sh_addr && addr < sec->sh_addr + sec->sh_size)
501         return sec;
502     }
503
504   return NULL;
505 }
506
507 /* Read an unsigned LEB128 encoded value from p.  Set *PLEN to the number of
508    bytes read.  */
509
510 static unsigned long
511 read_uleb128 (unsigned char *data, unsigned int *length_return)
512 {
513   return read_leb128 (data, length_return, 0);
514 }
515
516 /* Return true if the current file is for IA-64 machine and OpenVMS ABI.
517    This OS has so many departures from the ELF standard that we test it at
518    many places.  */
519
520 static inline int
521 is_ia64_vms (void)
522 {
523   return elf_header.e_machine == EM_IA_64
524     && elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS;
525 }
526
527 /* Guess the relocation size commonly used by the specific machines.  */
528
529 static int
530 guess_is_rela (unsigned int e_machine)
531 {
532   switch (e_machine)
533     {
534       /* Targets that use REL relocations.  */
535     case EM_386:
536     case EM_486:
537     case EM_960:
538     case EM_ARM:
539     case EM_D10V:
540     case EM_CYGNUS_D10V:
541     case EM_DLX:
542     case EM_MIPS:
543     case EM_MIPS_RS3_LE:
544     case EM_CYGNUS_M32R:
545     case EM_OPENRISC:
546     case EM_OR32:
547     case EM_SCORE:
548       return FALSE;
549
550       /* Targets that use RELA relocations.  */
551     case EM_68K:
552     case EM_860:
553     case EM_ALPHA:
554     case EM_ALTERA_NIOS2:
555     case EM_AVR:
556     case EM_AVR_OLD:
557     case EM_BLACKFIN:
558     case EM_CR16:
559     case EM_CR16_OLD:
560     case EM_CRIS:
561     case EM_CRX:
562     case EM_D30V:
563     case EM_CYGNUS_D30V:
564     case EM_FR30:
565     case EM_CYGNUS_FR30:
566     case EM_CYGNUS_FRV:
567     case EM_H8S:
568     case EM_H8_300:
569     case EM_H8_300H:
570     case EM_IA_64:
571     case EM_IP2K:
572     case EM_IP2K_OLD:
573     case EM_IQ2000:
574     case EM_LATTICEMICO32:
575     case EM_M32C_OLD:
576     case EM_M32C:
577     case EM_M32R:
578     case EM_MCORE:
579     case EM_CYGNUS_MEP:
580     case EM_MMIX:
581     case EM_MN10200:
582     case EM_CYGNUS_MN10200:
583     case EM_MN10300:
584     case EM_CYGNUS_MN10300:
585     case EM_MOXIE:
586     case EM_MSP430:
587     case EM_MSP430_OLD:
588     case EM_MT:
589     case EM_NIOS32:
590     case EM_PPC64:
591     case EM_PPC:
592     case EM_RX:
593     case EM_S390:
594     case EM_S390_OLD:
595     case EM_SH:
596     case EM_SPARC:
597     case EM_SPARC32PLUS:
598     case EM_SPARCV9:
599     case EM_SPU:
600     case EM_TI_C6000:
601     case EM_V850:
602     case EM_CYGNUS_V850:
603     case EM_VAX:
604     case EM_X86_64:
605     case EM_L1OM:
606     case EM_XSTORMY16:
607     case EM_XTENSA:
608     case EM_XTENSA_OLD:
609     case EM_MICROBLAZE:
610     case EM_MICROBLAZE_OLD:
611       return TRUE;
612
613     case EM_68HC05:
614     case EM_68HC08:
615     case EM_68HC11:
616     case EM_68HC16:
617     case EM_FX66:
618     case EM_ME16:
619     case EM_MMA:
620     case EM_NCPU:
621     case EM_NDR1:
622     case EM_PCP:
623     case EM_ST100:
624     case EM_ST19:
625     case EM_ST7:
626     case EM_ST9PLUS:
627     case EM_STARCORE:
628     case EM_SVX:
629     case EM_TINYJ:
630     default:
631       warn (_("Don't know about relocations on this machine architecture\n"));
632       return FALSE;
633     }
634 }
635
636 static int
637 slurp_rela_relocs (FILE * file,
638                    unsigned long rel_offset,
639                    unsigned long rel_size,
640                    Elf_Internal_Rela ** relasp,
641                    unsigned long * nrelasp)
642 {
643   Elf_Internal_Rela * relas;
644   unsigned long nrelas;
645   unsigned int i;
646
647   if (is_32bit_elf)
648     {
649       Elf32_External_Rela * erelas;
650
651       erelas = (Elf32_External_Rela *) get_data (NULL, file, rel_offset, 1,
652                                                  rel_size, _("relocs"));
653       if (!erelas)
654         return 0;
655
656       nrelas = rel_size / sizeof (Elf32_External_Rela);
657
658       relas = (Elf_Internal_Rela *) cmalloc (nrelas,
659                                              sizeof (Elf_Internal_Rela));
660
661       if (relas == NULL)
662         {
663           free (erelas);
664           error (_("out of memory parsing relocs\n"));
665           return 0;
666         }
667
668       for (i = 0; i < nrelas; i++)
669         {
670           relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
671           relas[i].r_info   = BYTE_GET (erelas[i].r_info);
672           relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
673         }
674
675       free (erelas);
676     }
677   else
678     {
679       Elf64_External_Rela * erelas;
680
681       erelas = (Elf64_External_Rela *) get_data (NULL, file, rel_offset, 1,
682                                                  rel_size, _("relocs"));
683       if (!erelas)
684         return 0;
685
686       nrelas = rel_size / sizeof (Elf64_External_Rela);
687
688       relas = (Elf_Internal_Rela *) cmalloc (nrelas,
689                                              sizeof (Elf_Internal_Rela));
690
691       if (relas == NULL)
692         {
693           free (erelas);
694           error (_("out of memory parsing relocs\n"));
695           return 0;
696         }
697
698       for (i = 0; i < nrelas; i++)
699         {
700           relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
701           relas[i].r_info   = BYTE_GET (erelas[i].r_info);
702           relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
703
704           /* The #ifdef BFD64 below is to prevent a compile time
705              warning.  We know that if we do not have a 64 bit data
706              type that we will never execute this code anyway.  */
707 #ifdef BFD64
708           if (elf_header.e_machine == EM_MIPS
709               && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
710             {
711               /* In little-endian objects, r_info isn't really a
712                  64-bit little-endian value: it has a 32-bit
713                  little-endian symbol index followed by four
714                  individual byte fields.  Reorder INFO
715                  accordingly.  */
716               bfd_vma inf = relas[i].r_info;
717               inf = (((inf & 0xffffffff) << 32)
718                       | ((inf >> 56) & 0xff)
719                       | ((inf >> 40) & 0xff00)
720                       | ((inf >> 24) & 0xff0000)
721                       | ((inf >> 8) & 0xff000000));
722               relas[i].r_info = inf;
723             }
724 #endif /* BFD64 */
725         }
726
727       free (erelas);
728     }
729   *relasp = relas;
730   *nrelasp = nrelas;
731   return 1;
732 }
733
734 static int
735 slurp_rel_relocs (FILE * file,
736                   unsigned long rel_offset,
737                   unsigned long rel_size,
738                   Elf_Internal_Rela ** relsp,
739                   unsigned long * nrelsp)
740 {
741   Elf_Internal_Rela * rels;
742   unsigned long nrels;
743   unsigned int i;
744
745   if (is_32bit_elf)
746     {
747       Elf32_External_Rel * erels;
748
749       erels = (Elf32_External_Rel *) get_data (NULL, file, rel_offset, 1,
750                                                rel_size, _("relocs"));
751       if (!erels)
752         return 0;
753
754       nrels = rel_size / sizeof (Elf32_External_Rel);
755
756       rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
757
758       if (rels == NULL)
759         {
760           free (erels);
761           error (_("out of memory parsing relocs\n"));
762           return 0;
763         }
764
765       for (i = 0; i < nrels; i++)
766         {
767           rels[i].r_offset = BYTE_GET (erels[i].r_offset);
768           rels[i].r_info   = BYTE_GET (erels[i].r_info);
769           rels[i].r_addend = 0;
770         }
771
772       free (erels);
773     }
774   else
775     {
776       Elf64_External_Rel * erels;
777
778       erels = (Elf64_External_Rel *) get_data (NULL, file, rel_offset, 1,
779                                                rel_size, _("relocs"));
780       if (!erels)
781         return 0;
782
783       nrels = rel_size / sizeof (Elf64_External_Rel);
784
785       rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
786
787       if (rels == NULL)
788         {
789           free (erels);
790           error (_("out of memory parsing relocs\n"));
791           return 0;
792         }
793
794       for (i = 0; i < nrels; i++)
795         {
796           rels[i].r_offset = BYTE_GET (erels[i].r_offset);
797           rels[i].r_info   = BYTE_GET (erels[i].r_info);
798           rels[i].r_addend = 0;
799
800           /* The #ifdef BFD64 below is to prevent a compile time
801              warning.  We know that if we do not have a 64 bit data
802              type that we will never execute this code anyway.  */
803 #ifdef BFD64
804           if (elf_header.e_machine == EM_MIPS
805               && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
806             {
807               /* In little-endian objects, r_info isn't really a
808                  64-bit little-endian value: it has a 32-bit
809                  little-endian symbol index followed by four
810                  individual byte fields.  Reorder INFO
811                  accordingly.  */
812               bfd_vma inf = rels[i].r_info;
813               inf = (((inf & 0xffffffff) << 32)
814                      | ((inf >> 56) & 0xff)
815                      | ((inf >> 40) & 0xff00)
816                      | ((inf >> 24) & 0xff0000)
817                      | ((inf >> 8) & 0xff000000));
818               rels[i].r_info = inf;
819             }
820 #endif /* BFD64 */
821         }
822
823       free (erels);
824     }
825   *relsp = rels;
826   *nrelsp = nrels;
827   return 1;
828 }
829
830 /* Returns the reloc type extracted from the reloc info field.  */
831
832 static unsigned int
833 get_reloc_type (bfd_vma reloc_info)
834 {
835   if (is_32bit_elf)
836     return ELF32_R_TYPE (reloc_info);
837
838   switch (elf_header.e_machine)
839     {
840     case EM_MIPS:
841       /* Note: We assume that reloc_info has already been adjusted for us.  */
842       return ELF64_MIPS_R_TYPE (reloc_info);
843
844     case EM_SPARCV9:
845       return ELF64_R_TYPE_ID (reloc_info);
846
847     default:
848       return ELF64_R_TYPE (reloc_info);
849     }
850 }
851
852 /* Return the symbol index extracted from the reloc info field.  */
853
854 static bfd_vma
855 get_reloc_symindex (bfd_vma reloc_info)
856 {
857   return is_32bit_elf ? ELF32_R_SYM (reloc_info) : ELF64_R_SYM (reloc_info);
858 }
859
860 /* Display the contents of the relocation data found at the specified
861    offset.  */
862
863 static void
864 dump_relocations (FILE * file,
865                   unsigned long rel_offset,
866                   unsigned long rel_size,
867                   Elf_Internal_Sym * symtab,
868                   unsigned long nsyms,
869                   char * strtab,
870                   unsigned long strtablen,
871                   int is_rela)
872 {
873   unsigned int i;
874   Elf_Internal_Rela * rels;
875
876   if (is_rela == UNKNOWN)
877     is_rela = guess_is_rela (elf_header.e_machine);
878
879   if (is_rela)
880     {
881       if (!slurp_rela_relocs (file, rel_offset, rel_size, &rels, &rel_size))
882         return;
883     }
884   else
885     {
886       if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
887         return;
888     }
889
890   if (is_32bit_elf)
891     {
892       if (is_rela)
893         {
894           if (do_wide)
895             printf (_(" Offset     Info    Type                Sym. Value  Symbol's Name + Addend\n"));
896           else
897             printf (_(" Offset     Info    Type            Sym.Value  Sym. Name + Addend\n"));
898         }
899       else
900         {
901           if (do_wide)
902             printf (_(" Offset     Info    Type                Sym. Value  Symbol's Name\n"));
903           else
904             printf (_(" Offset     Info    Type            Sym.Value  Sym. Name\n"));
905         }
906     }
907   else
908     {
909       if (is_rela)
910         {
911           if (do_wide)
912             printf (_("    Offset             Info             Type               Symbol's Value  Symbol's Name + Addend\n"));
913           else
914             printf (_("  Offset          Info           Type           Sym. Value    Sym. Name + Addend\n"));
915         }
916       else
917         {
918           if (do_wide)
919             printf (_("    Offset             Info             Type               Symbol's Value  Symbol's Name\n"));
920           else
921             printf (_("  Offset          Info           Type           Sym. Value    Sym. Name\n"));
922         }
923     }
924
925   for (i = 0; i < rel_size; i++)
926     {
927       const char * rtype;
928       bfd_vma offset;
929       bfd_vma inf;
930       bfd_vma symtab_index;
931       bfd_vma type;
932
933       offset = rels[i].r_offset;
934       inf    = rels[i].r_info;
935
936       type = get_reloc_type (inf);
937       symtab_index = get_reloc_symindex  (inf);
938
939       if (is_32bit_elf)
940         {
941           printf ("%8.8lx  %8.8lx ",
942                   (unsigned long) offset & 0xffffffff,
943                   (unsigned long) inf & 0xffffffff);
944         }
945       else
946         {
947 #if BFD_HOST_64BIT_LONG
948           printf (do_wide
949                   ? "%16.16lx  %16.16lx "
950                   : "%12.12lx  %12.12lx ",
951                   offset, inf);
952 #elif BFD_HOST_64BIT_LONG_LONG
953 #ifndef __MSVCRT__
954           printf (do_wide
955                   ? "%16.16llx  %16.16llx "
956                   : "%12.12llx  %12.12llx ",
957                   offset, inf);
958 #else
959           printf (do_wide
960                   ? "%16.16I64x  %16.16I64x "
961                   : "%12.12I64x  %12.12I64x ",
962                   offset, inf);
963 #endif
964 #else
965           printf (do_wide
966                   ? "%8.8lx%8.8lx  %8.8lx%8.8lx "
967                   : "%4.4lx%8.8lx  %4.4lx%8.8lx ",
968                   _bfd_int64_high (offset),
969                   _bfd_int64_low (offset),
970                   _bfd_int64_high (inf),
971                   _bfd_int64_low (inf));
972 #endif
973         }
974
975       switch (elf_header.e_machine)
976         {
977         default:
978           rtype = NULL;
979           break;
980
981         case EM_M32R:
982         case EM_CYGNUS_M32R:
983           rtype = elf_m32r_reloc_type (type);
984           break;
985
986         case EM_386:
987         case EM_486:
988           rtype = elf_i386_reloc_type (type);
989           break;
990
991         case EM_68HC11:
992         case EM_68HC12:
993           rtype = elf_m68hc11_reloc_type (type);
994           break;
995
996         case EM_68K:
997           rtype = elf_m68k_reloc_type (type);
998           break;
999
1000         case EM_960:
1001           rtype = elf_i960_reloc_type (type);
1002           break;
1003
1004         case EM_AVR:
1005         case EM_AVR_OLD:
1006           rtype = elf_avr_reloc_type (type);
1007           break;
1008
1009         case EM_OLD_SPARCV9:
1010         case EM_SPARC32PLUS:
1011         case EM_SPARCV9:
1012         case EM_SPARC:
1013           rtype = elf_sparc_reloc_type (type);
1014           break;
1015
1016         case EM_SPU:
1017           rtype = elf_spu_reloc_type (type);
1018           break;
1019
1020         case EM_V850:
1021         case EM_CYGNUS_V850:
1022           rtype = v850_reloc_type (type);
1023           break;
1024
1025         case EM_D10V:
1026         case EM_CYGNUS_D10V:
1027           rtype = elf_d10v_reloc_type (type);
1028           break;
1029
1030         case EM_D30V:
1031         case EM_CYGNUS_D30V:
1032           rtype = elf_d30v_reloc_type (type);
1033           break;
1034
1035         case EM_DLX:
1036           rtype = elf_dlx_reloc_type (type);
1037           break;
1038
1039         case EM_SH:
1040           rtype = elf_sh_reloc_type (type);
1041           break;
1042
1043         case EM_MN10300:
1044         case EM_CYGNUS_MN10300:
1045           rtype = elf_mn10300_reloc_type (type);
1046           break;
1047
1048         case EM_MN10200:
1049         case EM_CYGNUS_MN10200:
1050           rtype = elf_mn10200_reloc_type (type);
1051           break;
1052
1053         case EM_FR30:
1054         case EM_CYGNUS_FR30:
1055           rtype = elf_fr30_reloc_type (type);
1056           break;
1057
1058         case EM_CYGNUS_FRV:
1059           rtype = elf_frv_reloc_type (type);
1060           break;
1061
1062         case EM_MCORE:
1063           rtype = elf_mcore_reloc_type (type);
1064           break;
1065
1066         case EM_MMIX:
1067           rtype = elf_mmix_reloc_type (type);
1068           break;
1069
1070         case EM_MOXIE:
1071           rtype = elf_moxie_reloc_type (type);
1072           break;
1073
1074         case EM_MSP430:
1075         case EM_MSP430_OLD:
1076           rtype = elf_msp430_reloc_type (type);
1077           break;
1078
1079         case EM_PPC:
1080           rtype = elf_ppc_reloc_type (type);
1081           break;
1082
1083         case EM_PPC64:
1084           rtype = elf_ppc64_reloc_type (type);
1085           break;
1086
1087         case EM_MIPS:
1088         case EM_MIPS_RS3_LE:
1089           rtype = elf_mips_reloc_type (type);
1090           break;
1091
1092         case EM_ALPHA:
1093           rtype = elf_alpha_reloc_type (type);
1094           break;
1095
1096         case EM_ARM:
1097           rtype = elf_arm_reloc_type (type);
1098           break;
1099
1100         case EM_ARC:
1101           rtype = elf_arc_reloc_type (type);
1102           break;
1103
1104         case EM_PARISC:
1105           rtype = elf_hppa_reloc_type (type);
1106           break;
1107
1108         case EM_H8_300:
1109         case EM_H8_300H:
1110         case EM_H8S:
1111           rtype = elf_h8_reloc_type (type);
1112           break;
1113
1114         case EM_OPENRISC:
1115         case EM_OR32:
1116           rtype = elf_or32_reloc_type (type);
1117           break;
1118
1119         case EM_PJ:
1120         case EM_PJ_OLD:
1121           rtype = elf_pj_reloc_type (type);
1122           break;
1123         case EM_IA_64:
1124           rtype = elf_ia64_reloc_type (type);
1125           break;
1126
1127         case EM_CRIS:
1128           rtype = elf_cris_reloc_type (type);
1129           break;
1130
1131         case EM_860:
1132           rtype = elf_i860_reloc_type (type);
1133           break;
1134
1135         case EM_X86_64:
1136         case EM_L1OM:
1137           rtype = elf_x86_64_reloc_type (type);
1138           break;
1139
1140         case EM_S370:
1141           rtype = i370_reloc_type (type);
1142           break;
1143
1144         case EM_S390_OLD:
1145         case EM_S390:
1146           rtype = elf_s390_reloc_type (type);
1147           break;
1148
1149         case EM_SCORE:
1150           rtype = elf_score_reloc_type (type);
1151           break;
1152
1153         case EM_XSTORMY16:
1154           rtype = elf_xstormy16_reloc_type (type);
1155           break;
1156
1157         case EM_CRX:
1158           rtype = elf_crx_reloc_type (type);
1159           break;
1160
1161         case EM_VAX:
1162           rtype = elf_vax_reloc_type (type);
1163           break;
1164
1165         case EM_IP2K:
1166         case EM_IP2K_OLD:
1167           rtype = elf_ip2k_reloc_type (type);
1168           break;
1169
1170         case EM_IQ2000:
1171           rtype = elf_iq2000_reloc_type (type);
1172           break;
1173
1174         case EM_XTENSA_OLD:
1175         case EM_XTENSA:
1176           rtype = elf_xtensa_reloc_type (type);
1177           break;
1178
1179         case EM_LATTICEMICO32:
1180           rtype = elf_lm32_reloc_type (type);
1181           break;
1182
1183         case EM_M32C_OLD:
1184         case EM_M32C:
1185           rtype = elf_m32c_reloc_type (type);
1186           break;
1187
1188         case EM_MT:
1189           rtype = elf_mt_reloc_type (type);
1190           break;
1191
1192         case EM_BLACKFIN:
1193           rtype = elf_bfin_reloc_type (type);
1194           break;
1195
1196         case EM_CYGNUS_MEP:
1197           rtype = elf_mep_reloc_type (type);
1198           break;
1199
1200         case EM_CR16:
1201         case EM_CR16_OLD:
1202           rtype = elf_cr16_reloc_type (type);
1203           break;
1204
1205         case EM_MICROBLAZE:
1206         case EM_MICROBLAZE_OLD:
1207           rtype = elf_microblaze_reloc_type (type);
1208           break;
1209
1210         case EM_RX:
1211           rtype = elf_rx_reloc_type (type);
1212           break;
1213
1214         case EM_XC16X:
1215         case EM_C166:
1216           rtype = elf_xc16x_reloc_type (type);
1217           break;
1218
1219         case EM_TI_C6000:
1220           rtype = elf_tic6x_reloc_type (type);
1221           break;
1222         }
1223
1224       if (rtype == NULL)
1225         printf (_("unrecognized: %-7lx"), (unsigned long) type & 0xffffffff);
1226       else
1227         printf (do_wide ? "%-22.22s" : "%-17.17s", rtype);
1228
1229       if (elf_header.e_machine == EM_ALPHA
1230           && rtype != NULL
1231           && streq (rtype, "R_ALPHA_LITUSE")
1232           && is_rela)
1233         {
1234           switch (rels[i].r_addend)
1235             {
1236             case LITUSE_ALPHA_ADDR:   rtype = "ADDR";   break;
1237             case LITUSE_ALPHA_BASE:   rtype = "BASE";   break;
1238             case LITUSE_ALPHA_BYTOFF: rtype = "BYTOFF"; break;
1239             case LITUSE_ALPHA_JSR:    rtype = "JSR";    break;
1240             case LITUSE_ALPHA_TLSGD:  rtype = "TLSGD";  break;
1241             case LITUSE_ALPHA_TLSLDM: rtype = "TLSLDM"; break;
1242             case LITUSE_ALPHA_JSRDIRECT: rtype = "JSRDIRECT"; break;
1243             default: rtype = NULL;
1244             }
1245           if (rtype)
1246             printf (" (%s)", rtype);
1247           else
1248             {
1249               putchar (' ');
1250               printf (_("<unknown addend: %lx>"),
1251                       (unsigned long) rels[i].r_addend);
1252             }
1253         }
1254       else if (symtab_index)
1255         {
1256           if (symtab == NULL || symtab_index >= nsyms)
1257             printf (_(" bad symbol index: %08lx"), (unsigned long) symtab_index);
1258           else
1259             {
1260               Elf_Internal_Sym * psym;
1261
1262               psym = symtab + symtab_index;
1263
1264               printf (" ");
1265
1266               if (ELF_ST_TYPE (psym->st_info) == STT_GNU_IFUNC)
1267                 {
1268                   const char * name;
1269                   unsigned int len;
1270                   unsigned int width = is_32bit_elf ? 8 : 14;
1271
1272                   /* Relocations against GNU_IFUNC symbols do not use the value
1273                      of the symbol as the address to relocate against.  Instead
1274                      they invoke the function named by the symbol and use its
1275                      result as the address for relocation.
1276
1277                      To indicate this to the user, do not display the value of
1278                      the symbol in the "Symbols's Value" field.  Instead show
1279                      its name followed by () as a hint that the symbol is
1280                      invoked.  */
1281
1282                   if (strtab == NULL
1283                       || psym->st_name == 0
1284                       || psym->st_name >= strtablen)
1285                     name = "??";
1286                   else
1287                     name = strtab + psym->st_name;
1288
1289                   len = print_symbol (width, name);
1290                   printf ("()%-*s", len <= width ? (width + 1) - len : 1, " ");
1291                 }
1292               else
1293                 {
1294                   print_vma (psym->st_value, LONG_HEX);
1295
1296                   printf (is_32bit_elf ? "   " : " ");
1297                 }
1298
1299               if (psym->st_name == 0)
1300                 {
1301                   const char * sec_name = "<null>";
1302                   char name_buf[40];
1303
1304                   if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1305                     {
1306                       if (psym->st_shndx < elf_header.e_shnum)
1307                         sec_name
1308                           = SECTION_NAME (section_headers + psym->st_shndx);
1309                       else if (psym->st_shndx == SHN_ABS)
1310                         sec_name = "ABS";
1311                       else if (psym->st_shndx == SHN_COMMON)
1312                         sec_name = "COMMON";
1313                       else if ((elf_header.e_machine == EM_MIPS
1314                                 && psym->st_shndx == SHN_MIPS_SCOMMON)
1315                                || (elf_header.e_machine == EM_TI_C6000
1316                                    && psym->st_shndx == SHN_TIC6X_SCOMMON))
1317                         sec_name = "SCOMMON";
1318                       else if (elf_header.e_machine == EM_MIPS
1319                                && psym->st_shndx == SHN_MIPS_SUNDEFINED)
1320                         sec_name = "SUNDEF";
1321                       else if ((elf_header.e_machine == EM_X86_64
1322                                 || elf_header.e_machine == EM_L1OM)
1323                                && psym->st_shndx == SHN_X86_64_LCOMMON)
1324                         sec_name = "LARGE_COMMON";
1325                       else if (elf_header.e_machine == EM_IA_64
1326                                && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
1327                                && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1328                         sec_name = "ANSI_COM";
1329                       else if (is_ia64_vms ()
1330                                && psym->st_shndx == SHN_IA_64_VMS_SYMVEC)
1331                         sec_name = "VMS_SYMVEC";
1332                       else
1333                         {
1334                           sprintf (name_buf, "<section 0x%x>",
1335                                    (unsigned int) psym->st_shndx);
1336                           sec_name = name_buf;
1337                         }
1338                     }
1339                   print_symbol (22, sec_name);
1340                 }
1341               else if (strtab == NULL)
1342                 printf (_("<string table index: %3ld>"), psym->st_name);
1343               else if (psym->st_name >= strtablen)
1344                 printf (_("<corrupt string table index: %3ld>"), psym->st_name);
1345               else
1346                 print_symbol (22, strtab + psym->st_name);
1347
1348               if (is_rela)
1349                 {
1350                   bfd_signed_vma off = rels[i].r_addend;
1351
1352                   if (off < 0)
1353                     printf (" - %" BFD_VMA_FMT "x", - off);
1354                   else
1355                     printf (" + %" BFD_VMA_FMT "x", off);
1356                 }
1357             }
1358         }
1359       else if (is_rela)
1360         {
1361           printf ("%*c", is_32bit_elf ?
1362                   (do_wide ? 34 : 28) : (do_wide ? 26 : 20), ' ');
1363           print_vma (rels[i].r_addend, LONG_HEX);
1364         }
1365
1366       if (elf_header.e_machine == EM_SPARCV9
1367           && rtype != NULL
1368           && streq (rtype, "R_SPARC_OLO10"))
1369         printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf));
1370
1371       putchar ('\n');
1372
1373 #ifdef BFD64
1374       if (! is_32bit_elf && elf_header.e_machine == EM_MIPS)
1375         {
1376           bfd_vma type2 = ELF64_MIPS_R_TYPE2 (inf);
1377           bfd_vma type3 = ELF64_MIPS_R_TYPE3 (inf);
1378           const char * rtype2 = elf_mips_reloc_type (type2);
1379           const char * rtype3 = elf_mips_reloc_type (type3);
1380
1381           printf ("                    Type2: ");
1382
1383           if (rtype2 == NULL)
1384             printf (_("unrecognized: %-7lx"),
1385                     (unsigned long) type2 & 0xffffffff);
1386           else
1387             printf ("%-17.17s", rtype2);
1388
1389           printf ("\n                    Type3: ");
1390
1391           if (rtype3 == NULL)
1392             printf (_("unrecognized: %-7lx"),
1393                     (unsigned long) type3 & 0xffffffff);
1394           else
1395             printf ("%-17.17s", rtype3);
1396
1397           putchar ('\n');
1398         }
1399 #endif /* BFD64 */
1400     }
1401
1402   free (rels);
1403 }
1404
1405 static const char *
1406 get_mips_dynamic_type (unsigned long type)
1407 {
1408   switch (type)
1409     {
1410     case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1411     case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1412     case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1413     case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1414     case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1415     case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1416     case DT_MIPS_MSYM: return "MIPS_MSYM";
1417     case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1418     case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1419     case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1420     case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1421     case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1422     case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1423     case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1424     case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1425     case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1426     case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1427     case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1428     case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1429     case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1430     case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1431     case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1432     case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1433     case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1434     case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1435     case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1436     case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1437     case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1438     case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1439     case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1440     case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1441     case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1442     case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1443     case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1444     case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1445     case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1446     case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1447     case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1448     case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1449     case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1450     case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1451     case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1452     case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1453     case DT_MIPS_PLTGOT: return "MIPS_PLTGOT";
1454     case DT_MIPS_RWPLT: return "MIPS_RWPLT";
1455     default:
1456       return NULL;
1457     }
1458 }
1459
1460 static const char *
1461 get_sparc64_dynamic_type (unsigned long type)
1462 {
1463   switch (type)
1464     {
1465     case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1466     default:
1467       return NULL;
1468     }
1469 }
1470
1471 static const char *
1472 get_ppc_dynamic_type (unsigned long type)
1473 {
1474   switch (type)
1475     {
1476     case DT_PPC_GOT:    return "PPC_GOT";
1477     case DT_PPC_TLSOPT: return "PPC_TLSOPT";
1478     default:
1479       return NULL;
1480     }
1481 }
1482
1483 static const char *
1484 get_ppc64_dynamic_type (unsigned long type)
1485 {
1486   switch (type)
1487     {
1488     case DT_PPC64_GLINK:  return "PPC64_GLINK";
1489     case DT_PPC64_OPD:    return "PPC64_OPD";
1490     case DT_PPC64_OPDSZ:  return "PPC64_OPDSZ";
1491     case DT_PPC64_TLSOPT: return "PPC64_TLSOPT";
1492     default:
1493       return NULL;
1494     }
1495 }
1496
1497 static const char *
1498 get_parisc_dynamic_type (unsigned long type)
1499 {
1500   switch (type)
1501     {
1502     case DT_HP_LOAD_MAP:        return "HP_LOAD_MAP";
1503     case DT_HP_DLD_FLAGS:       return "HP_DLD_FLAGS";
1504     case DT_HP_DLD_HOOK:        return "HP_DLD_HOOK";
1505     case DT_HP_UX10_INIT:       return "HP_UX10_INIT";
1506     case DT_HP_UX10_INITSZ:     return "HP_UX10_INITSZ";
1507     case DT_HP_PREINIT:         return "HP_PREINIT";
1508     case DT_HP_PREINITSZ:       return "HP_PREINITSZ";
1509     case DT_HP_NEEDED:          return "HP_NEEDED";
1510     case DT_HP_TIME_STAMP:      return "HP_TIME_STAMP";
1511     case DT_HP_CHECKSUM:        return "HP_CHECKSUM";
1512     case DT_HP_GST_SIZE:        return "HP_GST_SIZE";
1513     case DT_HP_GST_VERSION:     return "HP_GST_VERSION";
1514     case DT_HP_GST_HASHVAL:     return "HP_GST_HASHVAL";
1515     case DT_HP_EPLTREL:         return "HP_GST_EPLTREL";
1516     case DT_HP_EPLTRELSZ:       return "HP_GST_EPLTRELSZ";
1517     case DT_HP_FILTERED:        return "HP_FILTERED";
1518     case DT_HP_FILTER_TLS:      return "HP_FILTER_TLS";
1519     case DT_HP_COMPAT_FILTERED: return "HP_COMPAT_FILTERED";
1520     case DT_HP_LAZYLOAD:        return "HP_LAZYLOAD";
1521     case DT_HP_BIND_NOW_COUNT:  return "HP_BIND_NOW_COUNT";
1522     case DT_PLT:                return "PLT";
1523     case DT_PLT_SIZE:           return "PLT_SIZE";
1524     case DT_DLT:                return "DLT";
1525     case DT_DLT_SIZE:           return "DLT_SIZE";
1526     default:
1527       return NULL;
1528     }
1529 }
1530
1531 static const char *
1532 get_ia64_dynamic_type (unsigned long type)
1533 {
1534   switch (type)
1535     {
1536     case DT_IA_64_PLT_RESERVE:         return "IA_64_PLT_RESERVE";
1537     case DT_IA_64_VMS_SUBTYPE:         return "VMS_SUBTYPE";
1538     case DT_IA_64_VMS_IMGIOCNT:        return "VMS_IMGIOCNT";
1539     case DT_IA_64_VMS_LNKFLAGS:        return "VMS_LNKFLAGS";
1540     case DT_IA_64_VMS_VIR_MEM_BLK_SIZ: return "VMS_VIR_MEM_BLK_SIZ";
1541     case DT_IA_64_VMS_IDENT:           return "VMS_IDENT";
1542     case DT_IA_64_VMS_NEEDED_IDENT:    return "VMS_NEEDED_IDENT";
1543     case DT_IA_64_VMS_IMG_RELA_CNT:    return "VMS_IMG_RELA_CNT";
1544     case DT_IA_64_VMS_SEG_RELA_CNT:    return "VMS_SEG_RELA_CNT";
1545     case DT_IA_64_VMS_FIXUP_RELA_CNT:  return "VMS_FIXUP_RELA_CNT";
1546     case DT_IA_64_VMS_FIXUP_NEEDED:    return "VMS_FIXUP_NEEDED";
1547     case DT_IA_64_VMS_SYMVEC_CNT:      return "VMS_SYMVEC_CNT";
1548     case DT_IA_64_VMS_XLATED:          return "VMS_XLATED";
1549     case DT_IA_64_VMS_STACKSIZE:       return "VMS_STACKSIZE";
1550     case DT_IA_64_VMS_UNWINDSZ:        return "VMS_UNWINDSZ";
1551     case DT_IA_64_VMS_UNWIND_CODSEG:   return "VMS_UNWIND_CODSEG";
1552     case DT_IA_64_VMS_UNWIND_INFOSEG:  return "VMS_UNWIND_INFOSEG";
1553     case DT_IA_64_VMS_LINKTIME:        return "VMS_LINKTIME";
1554     case DT_IA_64_VMS_SEG_NO:          return "VMS_SEG_NO";
1555     case DT_IA_64_VMS_SYMVEC_OFFSET:   return "VMS_SYMVEC_OFFSET";
1556     case DT_IA_64_VMS_SYMVEC_SEG:      return "VMS_SYMVEC_SEG";
1557     case DT_IA_64_VMS_UNWIND_OFFSET:   return "VMS_UNWIND_OFFSET";
1558     case DT_IA_64_VMS_UNWIND_SEG:      return "VMS_UNWIND_SEG";
1559     case DT_IA_64_VMS_STRTAB_OFFSET:   return "VMS_STRTAB_OFFSET";
1560     case DT_IA_64_VMS_SYSVER_OFFSET:   return "VMS_SYSVER_OFFSET";
1561     case DT_IA_64_VMS_IMG_RELA_OFF:    return "VMS_IMG_RELA_OFF";
1562     case DT_IA_64_VMS_SEG_RELA_OFF:    return "VMS_SEG_RELA_OFF";
1563     case DT_IA_64_VMS_FIXUP_RELA_OFF:  return "VMS_FIXUP_RELA_OFF";
1564     case DT_IA_64_VMS_PLTGOT_OFFSET:   return "VMS_PLTGOT_OFFSET";
1565     case DT_IA_64_VMS_PLTGOT_SEG:      return "VMS_PLTGOT_SEG";
1566     case DT_IA_64_VMS_FPMODE:          return "VMS_FPMODE";
1567     default:
1568       return NULL;
1569     }
1570 }
1571
1572 static const char *
1573 get_alpha_dynamic_type (unsigned long type)
1574 {
1575   switch (type)
1576     {
1577     case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
1578     default:
1579       return NULL;
1580     }
1581 }
1582
1583 static const char *
1584 get_score_dynamic_type (unsigned long type)
1585 {
1586   switch (type)
1587     {
1588     case DT_SCORE_BASE_ADDRESS: return "SCORE_BASE_ADDRESS";
1589     case DT_SCORE_LOCAL_GOTNO:  return "SCORE_LOCAL_GOTNO";
1590     case DT_SCORE_SYMTABNO:     return "SCORE_SYMTABNO";
1591     case DT_SCORE_GOTSYM:       return "SCORE_GOTSYM";
1592     case DT_SCORE_UNREFEXTNO:   return "SCORE_UNREFEXTNO";
1593     case DT_SCORE_HIPAGENO:     return "SCORE_HIPAGENO";
1594     default:
1595       return NULL;
1596     }
1597 }
1598
1599 static const char *
1600 get_tic6x_dynamic_type (unsigned long type)
1601 {
1602   switch (type)
1603     {
1604     case DT_C6000_GSYM_OFFSET: return "C6000_GSYM_OFFSET";
1605     case DT_C6000_GSTR_OFFSET: return "C6000_GSTR_OFFSET";
1606     case DT_C6000_DSBT_BASE:   return "C6000_DSBT_BASE";
1607     case DT_C6000_DSBT_SIZE:   return "C6000_DSBT_SIZE";
1608     case DT_C6000_PREEMPTMAP:  return "C6000_PREEMPTMAP";
1609     case DT_C6000_DSBT_INDEX:  return "C6000_DSBT_INDEX";
1610     default:
1611       return NULL;
1612     }
1613 }
1614
1615 static const char *
1616 get_dynamic_type (unsigned long type)
1617 {
1618   static char buff[64];
1619
1620   switch (type)
1621     {
1622     case DT_NULL:       return "NULL";
1623     case DT_NEEDED:     return "NEEDED";
1624     case DT_PLTRELSZ:   return "PLTRELSZ";
1625     case DT_PLTGOT:     return "PLTGOT";
1626     case DT_HASH:       return "HASH";
1627     case DT_STRTAB:     return "STRTAB";
1628     case DT_SYMTAB:     return "SYMTAB";
1629     case DT_RELA:       return "RELA";
1630     case DT_RELASZ:     return "RELASZ";
1631     case DT_RELAENT:    return "RELAENT";
1632     case DT_STRSZ:      return "STRSZ";
1633     case DT_SYMENT:     return "SYMENT";
1634     case DT_INIT:       return "INIT";
1635     case DT_FINI:       return "FINI";
1636     case DT_SONAME:     return "SONAME";
1637     case DT_RPATH:      return "RPATH";
1638     case DT_SYMBOLIC:   return "SYMBOLIC";
1639     case DT_REL:        return "REL";
1640     case DT_RELSZ:      return "RELSZ";
1641     case DT_RELENT:     return "RELENT";
1642     case DT_PLTREL:     return "PLTREL";
1643     case DT_DEBUG:      return "DEBUG";
1644     case DT_TEXTREL:    return "TEXTREL";
1645     case DT_JMPREL:     return "JMPREL";
1646     case DT_BIND_NOW:   return "BIND_NOW";
1647     case DT_INIT_ARRAY: return "INIT_ARRAY";
1648     case DT_FINI_ARRAY: return "FINI_ARRAY";
1649     case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
1650     case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
1651     case DT_RUNPATH:    return "RUNPATH";
1652     case DT_FLAGS:      return "FLAGS";
1653
1654     case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1655     case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
1656
1657     case DT_CHECKSUM:   return "CHECKSUM";
1658     case DT_PLTPADSZ:   return "PLTPADSZ";
1659     case DT_MOVEENT:    return "MOVEENT";
1660     case DT_MOVESZ:     return "MOVESZ";
1661     case DT_FEATURE:    return "FEATURE";
1662     case DT_POSFLAG_1:  return "POSFLAG_1";
1663     case DT_SYMINSZ:    return "SYMINSZ";
1664     case DT_SYMINENT:   return "SYMINENT"; /* aka VALRNGHI */
1665
1666     case DT_ADDRRNGLO:  return "ADDRRNGLO";
1667     case DT_CONFIG:     return "CONFIG";
1668     case DT_DEPAUDIT:   return "DEPAUDIT";
1669     case DT_AUDIT:      return "AUDIT";
1670     case DT_PLTPAD:     return "PLTPAD";
1671     case DT_MOVETAB:    return "MOVETAB";
1672     case DT_SYMINFO:    return "SYMINFO"; /* aka ADDRRNGHI */
1673
1674     case DT_VERSYM:     return "VERSYM";
1675
1676     case DT_TLSDESC_GOT: return "TLSDESC_GOT";
1677     case DT_TLSDESC_PLT: return "TLSDESC_PLT";
1678     case DT_RELACOUNT:  return "RELACOUNT";
1679     case DT_RELCOUNT:   return "RELCOUNT";
1680     case DT_FLAGS_1:    return "FLAGS_1";
1681     case DT_VERDEF:     return "VERDEF";
1682     case DT_VERDEFNUM:  return "VERDEFNUM";
1683     case DT_VERNEED:    return "VERNEED";
1684     case DT_VERNEEDNUM: return "VERNEEDNUM";
1685
1686     case DT_AUXILIARY:  return "AUXILIARY";
1687     case DT_USED:       return "USED";
1688     case DT_FILTER:     return "FILTER";
1689
1690     case DT_GNU_PRELINKED: return "GNU_PRELINKED";
1691     case DT_GNU_CONFLICT: return "GNU_CONFLICT";
1692     case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
1693     case DT_GNU_LIBLIST: return "GNU_LIBLIST";
1694     case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
1695     case DT_GNU_HASH:   return "GNU_HASH";
1696
1697     default:
1698       if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
1699         {
1700           const char * result;
1701
1702           switch (elf_header.e_machine)
1703             {
1704             case EM_MIPS:
1705             case EM_MIPS_RS3_LE:
1706               result = get_mips_dynamic_type (type);
1707               break;
1708             case EM_SPARCV9:
1709               result = get_sparc64_dynamic_type (type);
1710               break;
1711             case EM_PPC:
1712               result = get_ppc_dynamic_type (type);
1713               break;
1714             case EM_PPC64:
1715               result = get_ppc64_dynamic_type (type);
1716               break;
1717             case EM_IA_64:
1718               result = get_ia64_dynamic_type (type);
1719               break;
1720             case EM_ALPHA:
1721               result = get_alpha_dynamic_type (type);
1722               break;
1723             case EM_SCORE:
1724               result = get_score_dynamic_type (type);
1725               break;
1726             case EM_TI_C6000:
1727               result = get_tic6x_dynamic_type (type);
1728               break;
1729             default:
1730               result = NULL;
1731               break;
1732             }
1733
1734           if (result != NULL)
1735             return result;
1736
1737           snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
1738         }
1739       else if (((type >= DT_LOOS) && (type <= DT_HIOS))
1740                || (elf_header.e_machine == EM_PARISC
1741                    && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
1742         {
1743           const char * result;
1744
1745           switch (elf_header.e_machine)
1746             {
1747             case EM_PARISC:
1748               result = get_parisc_dynamic_type (type);
1749               break;
1750             case EM_IA_64:
1751               result = get_ia64_dynamic_type (type);
1752               break;
1753             default:
1754               result = NULL;
1755               break;
1756             }
1757
1758           if (result != NULL)
1759             return result;
1760
1761           snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
1762                     type);
1763         }
1764       else
1765         snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
1766
1767       return buff;
1768     }
1769 }
1770
1771 static char *
1772 get_file_type (unsigned e_type)
1773 {
1774   static char buff[32];
1775
1776   switch (e_type)
1777     {
1778     case ET_NONE:       return _("NONE (None)");
1779     case ET_REL:        return _("REL (Relocatable file)");
1780     case ET_EXEC:       return _("EXEC (Executable file)");
1781     case ET_DYN:        return _("DYN (Shared object file)");
1782     case ET_CORE:       return _("CORE (Core file)");
1783
1784     default:
1785       if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
1786         snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
1787       else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
1788         snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
1789       else
1790         snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
1791       return buff;
1792     }
1793 }
1794
1795 static char *
1796 get_machine_name (unsigned e_machine)
1797 {
1798   static char buff[64]; /* XXX */
1799
1800   switch (e_machine)
1801     {
1802     case EM_NONE:               return _("None");
1803     case EM_M32:                return "WE32100";
1804     case EM_SPARC:              return "Sparc";
1805     case EM_SPU:                return "SPU";
1806     case EM_386:                return "Intel 80386";
1807     case EM_68K:                return "MC68000";
1808     case EM_88K:                return "MC88000";
1809     case EM_486:                return "Intel 80486";
1810     case EM_860:                return "Intel 80860";
1811     case EM_MIPS:               return "MIPS R3000";
1812     case EM_S370:               return "IBM System/370";
1813     case EM_MIPS_RS3_LE:        return "MIPS R4000 big-endian";
1814     case EM_OLD_SPARCV9:        return "Sparc v9 (old)";
1815     case EM_PARISC:             return "HPPA";
1816     case EM_PPC_OLD:            return "Power PC (old)";
1817     case EM_SPARC32PLUS:        return "Sparc v8+" ;
1818     case EM_960:                return "Intel 90860";
1819     case EM_PPC:                return "PowerPC";
1820     case EM_PPC64:              return "PowerPC64";
1821     case EM_V800:               return "NEC V800";
1822     case EM_FR20:               return "Fujitsu FR20";
1823     case EM_RH32:               return "TRW RH32";
1824     case EM_MCORE:              return "MCORE";
1825     case EM_ARM:                return "ARM";
1826     case EM_OLD_ALPHA:          return "Digital Alpha (old)";
1827     case EM_SH:                 return "Renesas / SuperH SH";
1828     case EM_SPARCV9:            return "Sparc v9";
1829     case EM_TRICORE:            return "Siemens Tricore";
1830     case EM_ARC:                return "ARC";
1831     case EM_H8_300:             return "Renesas H8/300";
1832     case EM_H8_300H:            return "Renesas H8/300H";
1833     case EM_H8S:                return "Renesas H8S";
1834     case EM_H8_500:             return "Renesas H8/500";
1835     case EM_IA_64:              return "Intel IA-64";
1836     case EM_MIPS_X:             return "Stanford MIPS-X";
1837     case EM_COLDFIRE:           return "Motorola Coldfire";
1838     case EM_68HC12:             return "Motorola M68HC12";
1839     case EM_ALPHA:              return "Alpha";
1840     case EM_CYGNUS_D10V:
1841     case EM_D10V:               return "d10v";
1842     case EM_CYGNUS_D30V:
1843     case EM_D30V:               return "d30v";
1844     case EM_CYGNUS_M32R:
1845     case EM_M32R:               return "Renesas M32R (formerly Mitsubishi M32r)";
1846     case EM_CYGNUS_V850:
1847     case EM_V850:               return "Renesas v850";
1848     case EM_CYGNUS_MN10300:
1849     case EM_MN10300:            return "mn10300";
1850     case EM_CYGNUS_MN10200:
1851     case EM_MN10200:            return "mn10200";
1852     case EM_MOXIE:              return "Moxie";
1853     case EM_CYGNUS_FR30:
1854     case EM_FR30:               return "Fujitsu FR30";
1855     case EM_CYGNUS_FRV:         return "Fujitsu FR-V";
1856     case EM_PJ_OLD:
1857     case EM_PJ:                 return "picoJava";
1858     case EM_MMA:                return "Fujitsu Multimedia Accelerator";
1859     case EM_PCP:                return "Siemens PCP";
1860     case EM_NCPU:               return "Sony nCPU embedded RISC processor";
1861     case EM_NDR1:               return "Denso NDR1 microprocesspr";
1862     case EM_STARCORE:           return "Motorola Star*Core processor";
1863     case EM_ME16:               return "Toyota ME16 processor";
1864     case EM_ST100:              return "STMicroelectronics ST100 processor";
1865     case EM_TINYJ:              return "Advanced Logic Corp. TinyJ embedded processor";
1866     case EM_PDSP:               return "Sony DSP processor";
1867     case EM_PDP10:              return "Digital Equipment Corp. PDP-10";
1868     case EM_PDP11:              return "Digital Equipment Corp. PDP-11";
1869     case EM_FX66:               return "Siemens FX66 microcontroller";
1870     case EM_ST9PLUS:            return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1871     case EM_ST7:                return "STMicroelectronics ST7 8-bit microcontroller";
1872     case EM_68HC16:             return "Motorola MC68HC16 Microcontroller";
1873     case EM_68HC11:             return "Motorola MC68HC11 Microcontroller";
1874     case EM_68HC08:             return "Motorola MC68HC08 Microcontroller";
1875     case EM_68HC05:             return "Motorola MC68HC05 Microcontroller";
1876     case EM_SVX:                return "Silicon Graphics SVx";
1877     case EM_ST19:               return "STMicroelectronics ST19 8-bit microcontroller";
1878     case EM_VAX:                return "Digital VAX";
1879     case EM_AVR_OLD:
1880     case EM_AVR:                return "Atmel AVR 8-bit microcontroller";
1881     case EM_CRIS:               return "Axis Communications 32-bit embedded processor";
1882     case EM_JAVELIN:            return "Infineon Technologies 32-bit embedded cpu";
1883     case EM_FIREPATH:           return "Element 14 64-bit DSP processor";
1884     case EM_ZSP:                return "LSI Logic's 16-bit DSP processor";
1885     case EM_MMIX:               return "Donald Knuth's educational 64-bit processor";
1886     case EM_HUANY:              return "Harvard Universitys's machine-independent object format";
1887     case EM_PRISM:              return "Vitesse Prism";
1888     case EM_X86_64:             return "Advanced Micro Devices X86-64";
1889     case EM_L1OM:               return "Intel L1OM";
1890     case EM_S390_OLD:
1891     case EM_S390:               return "IBM S/390";
1892     case EM_SCORE:              return "SUNPLUS S+Core";
1893     case EM_XSTORMY16:          return "Sanyo XStormy16 CPU core";
1894     case EM_OPENRISC:
1895     case EM_OR32:               return "OpenRISC";
1896     case EM_ARC_A5:             return "ARC International ARCompact processor";
1897     case EM_CRX:                return "National Semiconductor CRX microprocessor";
1898     case EM_DLX:                return "OpenDLX";
1899     case EM_IP2K_OLD:
1900     case EM_IP2K:               return "Ubicom IP2xxx 8-bit microcontrollers";
1901     case EM_IQ2000:             return "Vitesse IQ2000";
1902     case EM_XTENSA_OLD:
1903     case EM_XTENSA:             return "Tensilica Xtensa Processor";
1904     case EM_VIDEOCORE:          return "Alphamosaic VideoCore processor";
1905     case EM_TMM_GPP:            return "Thompson Multimedia General Purpose Processor";
1906     case EM_NS32K:              return "National Semiconductor 32000 series";
1907     case EM_TPC:                return "Tenor Network TPC processor";
1908     case EM_ST200:              return "STMicroelectronics ST200 microcontroller";
1909     case EM_MAX:                return "MAX Processor";
1910     case EM_CR:                 return "National Semiconductor CompactRISC";
1911     case EM_F2MC16:             return "Fujitsu F2MC16";
1912     case EM_MSP430:             return "Texas Instruments msp430 microcontroller";
1913     case EM_LATTICEMICO32:      return "Lattice Mico32";
1914     case EM_M32C_OLD:
1915     case EM_M32C:               return "Renesas M32c";
1916     case EM_MT:                 return "Morpho Techologies MT processor";
1917     case EM_BLACKFIN:           return "Analog Devices Blackfin";
1918     case EM_SE_C33:             return "S1C33 Family of Seiko Epson processors";
1919     case EM_SEP:                return "Sharp embedded microprocessor";
1920     case EM_ARCA:               return "Arca RISC microprocessor";
1921     case EM_UNICORE:            return "Unicore";
1922     case EM_EXCESS:             return "eXcess 16/32/64-bit configurable embedded CPU";
1923     case EM_DXP:                return "Icera Semiconductor Inc. Deep Execution Processor";
1924     case EM_NIOS32:             return "Altera Nios";
1925     case EM_ALTERA_NIOS2:       return "Altera Nios II";
1926     case EM_C166:
1927     case EM_XC16X:              return "Infineon Technologies xc16x";
1928     case EM_M16C:               return "Renesas M16C series microprocessors";
1929     case EM_DSPIC30F:           return "Microchip Technology dsPIC30F Digital Signal Controller";
1930     case EM_CE:                 return "Freescale Communication Engine RISC core";
1931     case EM_TSK3000:            return "Altium TSK3000 core";
1932     case EM_RS08:               return "Freescale RS08 embedded processor";
1933     case EM_ECOG2:              return "Cyan Technology eCOG2 microprocessor";
1934     case EM_DSP24:              return "New Japan Radio (NJR) 24-bit DSP Processor";
1935     case EM_VIDEOCORE3:         return "Broadcom VideoCore III processor";
1936     case EM_SE_C17:             return "Seiko Epson C17 family";
1937     case EM_TI_C6000:           return "Texas Instruments TMS320C6000 DSP family";
1938     case EM_TI_C2000:           return "Texas Instruments TMS320C2000 DSP family";
1939     case EM_TI_C5500:           return "Texas Instruments TMS320C55x DSP family";
1940     case EM_MMDSP_PLUS:         return "STMicroelectronics 64bit VLIW Data Signal Processor";
1941     case EM_CYPRESS_M8C:        return "Cypress M8C microprocessor";
1942     case EM_R32C:               return "Renesas R32C series microprocessors";
1943     case EM_TRIMEDIA:           return "NXP Semiconductors TriMedia architecture family";
1944     case EM_QDSP6:              return "QUALCOMM DSP6 Processor";
1945     case EM_8051:               return "Intel 8051 and variants";
1946     case EM_STXP7X:             return "STMicroelectronics STxP7x family";
1947     case EM_NDS32:              return "Andes Technology compact code size embedded RISC processor family";
1948     case EM_ECOG1X:             return "Cyan Technology eCOG1X family";
1949     case EM_MAXQ30:             return "Dallas Semiconductor MAXQ30 Core microcontrollers";
1950     case EM_XIMO16:             return "New Japan Radio (NJR) 16-bit DSP Processor";
1951     case EM_MANIK:              return "M2000 Reconfigurable RISC Microprocessor";
1952     case EM_CRAYNV2:            return "Cray Inc. NV2 vector architecture";
1953     case EM_CYGNUS_MEP:         return "Toshiba MeP Media Engine";
1954     case EM_CR16:
1955     case EM_CR16_OLD:           return "National Semiconductor's CR16";
1956     case EM_MICROBLAZE:         return "Xilinx MicroBlaze";
1957     case EM_MICROBLAZE_OLD:     return "Xilinx MicroBlaze";
1958     case EM_RX:                 return "Renesas RX";
1959     case EM_METAG:              return "Imagination Technologies META processor architecture";
1960     case EM_MCST_ELBRUS:        return "MCST Elbrus general purpose hardware architecture";
1961     case EM_ECOG16:             return "Cyan Technology eCOG16 family";
1962     case EM_ETPU:               return "Freescale Extended Time Processing Unit";
1963     case EM_SLE9X:              return "Infineon Technologies SLE9X core";
1964     case EM_AVR32:              return "Atmel Corporation 32-bit microprocessor family";
1965     case EM_STM8:               return "STMicroeletronics STM8 8-bit microcontroller";
1966     case EM_TILE64:             return "Tilera TILE64 multicore architecture family";
1967     case EM_TILEPRO:            return "Tilera TILEPro multicore architecture family";
1968     case EM_CUDA:               return "NVIDIA CUDA architecture";
1969     default:
1970       snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
1971       return buff;
1972     }
1973 }
1974
1975 static void
1976 decode_ARM_machine_flags (unsigned e_flags, char buf[])
1977 {
1978   unsigned eabi;
1979   int unknown = 0;
1980
1981   eabi = EF_ARM_EABI_VERSION (e_flags);
1982   e_flags &= ~ EF_ARM_EABIMASK;
1983
1984   /* Handle "generic" ARM flags.  */
1985   if (e_flags & EF_ARM_RELEXEC)
1986     {
1987       strcat (buf, ", relocatable executable");
1988       e_flags &= ~ EF_ARM_RELEXEC;
1989     }
1990
1991   if (e_flags & EF_ARM_HASENTRY)
1992     {
1993       strcat (buf, ", has entry point");
1994       e_flags &= ~ EF_ARM_HASENTRY;
1995     }
1996
1997   /* Now handle EABI specific flags.  */
1998   switch (eabi)
1999     {
2000     default:
2001       strcat (buf, ", <unrecognized EABI>");
2002       if (e_flags)
2003         unknown = 1;
2004       break;
2005
2006     case EF_ARM_EABI_VER1:
2007       strcat (buf, ", Version1 EABI");
2008       while (e_flags)
2009         {
2010           unsigned flag;
2011
2012           /* Process flags one bit at a time.  */
2013           flag = e_flags & - e_flags;
2014           e_flags &= ~ flag;
2015
2016           switch (flag)
2017             {
2018             case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK.  */
2019               strcat (buf, ", sorted symbol tables");
2020               break;
2021
2022             default:
2023               unknown = 1;
2024               break;
2025             }
2026         }
2027       break;
2028
2029     case EF_ARM_EABI_VER2:
2030       strcat (buf, ", Version2 EABI");
2031       while (e_flags)
2032         {
2033           unsigned flag;
2034
2035           /* Process flags one bit at a time.  */
2036           flag = e_flags & - e_flags;
2037           e_flags &= ~ flag;
2038
2039           switch (flag)
2040             {
2041             case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK.  */
2042               strcat (buf, ", sorted symbol tables");
2043               break;
2044
2045             case EF_ARM_DYNSYMSUSESEGIDX:
2046               strcat (buf, ", dynamic symbols use segment index");
2047               break;
2048
2049             case EF_ARM_MAPSYMSFIRST:
2050               strcat (buf, ", mapping symbols precede others");
2051               break;
2052
2053             default:
2054               unknown = 1;
2055               break;
2056             }
2057         }
2058       break;
2059
2060     case EF_ARM_EABI_VER3:
2061       strcat (buf, ", Version3 EABI");
2062       break;
2063
2064     case EF_ARM_EABI_VER4:
2065       strcat (buf, ", Version4 EABI");
2066       goto eabi;
2067
2068     case EF_ARM_EABI_VER5:
2069       strcat (buf, ", Version5 EABI");
2070     eabi:
2071       while (e_flags)
2072         {
2073           unsigned flag;
2074
2075           /* Process flags one bit at a time.  */
2076           flag = e_flags & - e_flags;
2077           e_flags &= ~ flag;
2078
2079           switch (flag)
2080             {
2081             case EF_ARM_BE8:
2082               strcat (buf, ", BE8");
2083               break;
2084
2085             case EF_ARM_LE8:
2086               strcat (buf, ", LE8");
2087               break;
2088
2089             default:
2090               unknown = 1;
2091               break;
2092             }
2093         }
2094       break;
2095
2096     case EF_ARM_EABI_UNKNOWN:
2097       strcat (buf, ", GNU EABI");
2098       while (e_flags)
2099         {
2100           unsigned flag;
2101
2102           /* Process flags one bit at a time.  */
2103           flag = e_flags & - e_flags;
2104           e_flags &= ~ flag;
2105
2106           switch (flag)
2107             {
2108             case EF_ARM_INTERWORK:
2109               strcat (buf, ", interworking enabled");
2110               break;
2111
2112             case EF_ARM_APCS_26:
2113               strcat (buf, ", uses APCS/26");
2114               break;
2115
2116             case EF_ARM_APCS_FLOAT:
2117               strcat (buf, ", uses APCS/float");
2118               break;
2119
2120             case EF_ARM_PIC:
2121               strcat (buf, ", position independent");
2122               break;
2123
2124             case EF_ARM_ALIGN8:
2125               strcat (buf, ", 8 bit structure alignment");
2126               break;
2127
2128             case EF_ARM_NEW_ABI:
2129               strcat (buf, ", uses new ABI");
2130               break;
2131
2132             case EF_ARM_OLD_ABI:
2133               strcat (buf, ", uses old ABI");
2134               break;
2135
2136             case EF_ARM_SOFT_FLOAT:
2137               strcat (buf, ", software FP");
2138               break;
2139
2140             case EF_ARM_VFP_FLOAT:
2141               strcat (buf, ", VFP");
2142               break;
2143
2144             case EF_ARM_MAVERICK_FLOAT:
2145               strcat (buf, ", Maverick FP");
2146               break;
2147
2148             default:
2149               unknown = 1;
2150               break;
2151             }
2152         }
2153     }
2154
2155   if (unknown)
2156     strcat (buf,_(", <unknown>"));
2157 }
2158
2159 static char *
2160 get_machine_flags (unsigned e_flags, unsigned e_machine)
2161 {
2162   static char buf[1024];
2163
2164   buf[0] = '\0';
2165
2166   if (e_flags)
2167     {
2168       switch (e_machine)
2169         {
2170         default:
2171           break;
2172
2173         case EM_ARM:
2174           decode_ARM_machine_flags (e_flags, buf);
2175           break;
2176
2177         case EM_BLACKFIN:
2178           if (e_flags & EF_BFIN_PIC)
2179             strcat (buf, ", PIC");
2180
2181           if (e_flags & EF_BFIN_FDPIC)
2182             strcat (buf, ", FDPIC");
2183
2184           if (e_flags & EF_BFIN_CODE_IN_L1)
2185             strcat (buf, ", code in L1");
2186
2187           if (e_flags & EF_BFIN_DATA_IN_L1)
2188             strcat (buf, ", data in L1");
2189
2190           break;
2191
2192         case EM_CYGNUS_FRV:
2193           switch (e_flags & EF_FRV_CPU_MASK)
2194             {
2195             case EF_FRV_CPU_GENERIC:
2196               break;
2197
2198             default:
2199               strcat (buf, ", fr???");
2200               break;
2201
2202             case EF_FRV_CPU_FR300:
2203               strcat (buf, ", fr300");
2204               break;
2205
2206             case EF_FRV_CPU_FR400:
2207               strcat (buf, ", fr400");
2208               break;
2209             case EF_FRV_CPU_FR405:
2210               strcat (buf, ", fr405");
2211               break;
2212
2213             case EF_FRV_CPU_FR450:
2214               strcat (buf, ", fr450");
2215               break;
2216
2217             case EF_FRV_CPU_FR500:
2218               strcat (buf, ", fr500");
2219               break;
2220             case EF_FRV_CPU_FR550:
2221               strcat (buf, ", fr550");
2222               break;
2223
2224             case EF_FRV_CPU_SIMPLE:
2225               strcat (buf, ", simple");
2226               break;
2227             case EF_FRV_CPU_TOMCAT:
2228               strcat (buf, ", tomcat");
2229               break;
2230             }
2231           break;
2232
2233         case EM_68K:
2234           if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
2235             strcat (buf, ", m68000");
2236           else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
2237             strcat (buf, ", cpu32");
2238           else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
2239             strcat (buf, ", fido_a");
2240           else
2241             {
2242               char const * isa = _("unknown");
2243               char const * mac = _("unknown mac");
2244               char const * additional = NULL;
2245
2246               switch (e_flags & EF_M68K_CF_ISA_MASK)
2247                 {
2248                 case EF_M68K_CF_ISA_A_NODIV:
2249                   isa = "A";
2250                   additional = ", nodiv";
2251                   break;
2252                 case EF_M68K_CF_ISA_A:
2253                   isa = "A";
2254                   break;
2255                 case EF_M68K_CF_ISA_A_PLUS:
2256                   isa = "A+";
2257                   break;
2258                 case EF_M68K_CF_ISA_B_NOUSP:
2259                   isa = "B";
2260                   additional = ", nousp";
2261                   break;
2262                 case EF_M68K_CF_ISA_B:
2263                   isa = "B";
2264                   break;
2265                 case EF_M68K_CF_ISA_C:
2266                   isa = "C";
2267                   break;
2268                 case EF_M68K_CF_ISA_C_NODIV:
2269                   isa = "C";
2270                   additional = ", nodiv";
2271                   break;
2272                 }
2273               strcat (buf, ", cf, isa ");
2274               strcat (buf, isa);
2275               if (additional)
2276                 strcat (buf, additional);
2277               if (e_flags & EF_M68K_CF_FLOAT)
2278                 strcat (buf, ", float");
2279               switch (e_flags & EF_M68K_CF_MAC_MASK)
2280                 {
2281                 case 0:
2282                   mac = NULL;
2283                   break;
2284                 case EF_M68K_CF_MAC:
2285                   mac = "mac";
2286                   break;
2287                 case EF_M68K_CF_EMAC:
2288                   mac = "emac";
2289                   break;
2290                 case EF_M68K_CF_EMAC_B:
2291                   mac = "emac_b";
2292                   break;
2293                 }
2294               if (mac)
2295                 {
2296                   strcat (buf, ", ");
2297                   strcat (buf, mac);
2298                 }
2299             }
2300           break;
2301
2302         case EM_PPC:
2303           if (e_flags & EF_PPC_EMB)
2304             strcat (buf, ", emb");
2305
2306           if (e_flags & EF_PPC_RELOCATABLE)
2307             strcat (buf, _(", relocatable"));
2308
2309           if (e_flags & EF_PPC_RELOCATABLE_LIB)
2310             strcat (buf, _(", relocatable-lib"));
2311           break;
2312
2313         case EM_V850:
2314         case EM_CYGNUS_V850:
2315           switch (e_flags & EF_V850_ARCH)
2316             {
2317             case E_V850E2V3_ARCH:
2318               strcat (buf, ", v850e2v3");
2319               break;
2320             case E_V850E2_ARCH:
2321               strcat (buf, ", v850e2");
2322               break;
2323             case E_V850E1_ARCH:
2324               strcat (buf, ", v850e1");
2325               break;
2326             case E_V850E_ARCH:
2327               strcat (buf, ", v850e");
2328               break;
2329             case E_V850_ARCH:
2330               strcat (buf, ", v850");
2331               break;
2332             default:
2333               strcat (buf, _(", unknown v850 architecture variant"));
2334               break;
2335             }
2336           break;
2337
2338         case EM_M32R:
2339         case EM_CYGNUS_M32R:
2340           if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
2341             strcat (buf, ", m32r");
2342           break;
2343
2344         case EM_MIPS:
2345         case EM_MIPS_RS3_LE:
2346           if (e_flags & EF_MIPS_NOREORDER)
2347             strcat (buf, ", noreorder");
2348
2349           if (e_flags & EF_MIPS_PIC)
2350             strcat (buf, ", pic");
2351
2352           if (e_flags & EF_MIPS_CPIC)
2353             strcat (buf, ", cpic");
2354
2355           if (e_flags & EF_MIPS_UCODE)
2356             strcat (buf, ", ugen_reserved");
2357
2358           if (e_flags & EF_MIPS_ABI2)
2359             strcat (buf, ", abi2");
2360
2361           if (e_flags & EF_MIPS_OPTIONS_FIRST)
2362             strcat (buf, ", odk first");
2363
2364           if (e_flags & EF_MIPS_32BITMODE)
2365             strcat (buf, ", 32bitmode");
2366
2367           switch ((e_flags & EF_MIPS_MACH))
2368             {
2369             case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
2370             case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
2371             case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
2372             case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
2373             case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
2374             case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
2375             case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
2376             case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
2377             case E_MIPS_MACH_SB1:  strcat (buf, ", sb1");  break;
2378             case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
2379             case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break;
2380             case E_MIPS_MACH_LS2F: strcat (buf, ", loongson-2f"); break;
2381             case E_MIPS_MACH_LS3A: strcat (buf, ", loongson-3a"); break;
2382             case E_MIPS_MACH_OCTEON: strcat (buf, ", octeon"); break;
2383             case E_MIPS_MACH_OCTEON2: strcat (buf, ", octeon2"); break;
2384             case E_MIPS_MACH_XLR:  strcat (buf, ", xlr"); break;
2385             case 0:
2386             /* We simply ignore the field in this case to avoid confusion:
2387                MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
2388                extension.  */
2389               break;
2390             default: strcat (buf, _(", unknown CPU")); break;
2391             }
2392
2393           switch ((e_flags & EF_MIPS_ABI))
2394             {
2395             case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
2396             case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
2397             case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
2398             case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
2399             case 0:
2400             /* We simply ignore the field in this case to avoid confusion:
2401                MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
2402                This means it is likely to be an o32 file, but not for
2403                sure.  */
2404               break;
2405             default: strcat (buf, _(", unknown ABI")); break;
2406             }
2407
2408           if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
2409             strcat (buf, ", mdmx");
2410
2411           if (e_flags & EF_MIPS_ARCH_ASE_M16)
2412             strcat (buf, ", mips16");
2413
2414           switch ((e_flags & EF_MIPS_ARCH))
2415             {
2416             case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
2417             case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
2418             case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
2419             case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
2420             case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
2421             case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
2422             case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
2423             case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
2424             case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
2425             default: strcat (buf, _(", unknown ISA")); break;
2426             }
2427
2428           if (e_flags & EF_SH_PIC)
2429             strcat (buf, ", pic");
2430
2431           if (e_flags & EF_SH_FDPIC)
2432             strcat (buf, ", fdpic");
2433           break;
2434
2435         case EM_SH:
2436           switch ((e_flags & EF_SH_MACH_MASK))
2437             {
2438             case EF_SH1: strcat (buf, ", sh1"); break;
2439             case EF_SH2: strcat (buf, ", sh2"); break;
2440             case EF_SH3: strcat (buf, ", sh3"); break;
2441             case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
2442             case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
2443             case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
2444             case EF_SH3E: strcat (buf, ", sh3e"); break;
2445             case EF_SH4: strcat (buf, ", sh4"); break;
2446             case EF_SH5: strcat (buf, ", sh5"); break;
2447             case EF_SH2E: strcat (buf, ", sh2e"); break;
2448             case EF_SH4A: strcat (buf, ", sh4a"); break;
2449             case EF_SH2A: strcat (buf, ", sh2a"); break;
2450             case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
2451             case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
2452             case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
2453             case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
2454             case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
2455             case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
2456             case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
2457             case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
2458             case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
2459             default: strcat (buf, _(", unknown ISA")); break;
2460             }
2461
2462           break;
2463
2464         case EM_SPARCV9:
2465           if (e_flags & EF_SPARC_32PLUS)
2466             strcat (buf, ", v8+");
2467
2468           if (e_flags & EF_SPARC_SUN_US1)
2469             strcat (buf, ", ultrasparcI");
2470
2471           if (e_flags & EF_SPARC_SUN_US3)
2472             strcat (buf, ", ultrasparcIII");
2473
2474           if (e_flags & EF_SPARC_HAL_R1)
2475             strcat (buf, ", halr1");
2476
2477           if (e_flags & EF_SPARC_LEDATA)
2478             strcat (buf, ", ledata");
2479
2480           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
2481             strcat (buf, ", tso");
2482
2483           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
2484             strcat (buf, ", pso");
2485
2486           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
2487             strcat (buf, ", rmo");
2488           break;
2489
2490         case EM_PARISC:
2491           switch (e_flags & EF_PARISC_ARCH)
2492             {
2493             case EFA_PARISC_1_0:
2494               strcpy (buf, ", PA-RISC 1.0");
2495               break;
2496             case EFA_PARISC_1_1:
2497               strcpy (buf, ", PA-RISC 1.1");
2498               break;
2499             case EFA_PARISC_2_0:
2500               strcpy (buf, ", PA-RISC 2.0");
2501               break;
2502             default:
2503               break;
2504             }
2505           if (e_flags & EF_PARISC_TRAPNIL)
2506             strcat (buf, ", trapnil");
2507           if (e_flags & EF_PARISC_EXT)
2508             strcat (buf, ", ext");
2509           if (e_flags & EF_PARISC_LSB)
2510             strcat (buf, ", lsb");
2511           if (e_flags & EF_PARISC_WIDE)
2512             strcat (buf, ", wide");
2513           if (e_flags & EF_PARISC_NO_KABP)
2514             strcat (buf, ", no kabp");
2515           if (e_flags & EF_PARISC_LAZYSWAP)
2516             strcat (buf, ", lazyswap");
2517           break;
2518
2519         case EM_PJ:
2520         case EM_PJ_OLD:
2521           if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
2522             strcat (buf, ", new calling convention");
2523
2524           if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
2525             strcat (buf, ", gnu calling convention");
2526           break;
2527
2528         case EM_IA_64:
2529           if ((e_flags & EF_IA_64_ABI64))
2530             strcat (buf, ", 64-bit");
2531           else
2532             strcat (buf, ", 32-bit");
2533           if ((e_flags & EF_IA_64_REDUCEDFP))
2534             strcat (buf, ", reduced fp model");
2535           if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
2536             strcat (buf, ", no function descriptors, constant gp");
2537           else if ((e_flags & EF_IA_64_CONS_GP))
2538             strcat (buf, ", constant gp");
2539           if ((e_flags & EF_IA_64_ABSOLUTE))
2540             strcat (buf, ", absolute");
2541           if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
2542             {
2543               if ((e_flags & EF_IA_64_VMS_LINKAGES))
2544                 strcat (buf, ", vms_linkages");
2545               switch ((e_flags & EF_IA_64_VMS_COMCOD))
2546                 {
2547                 case EF_IA_64_VMS_COMCOD_SUCCESS:
2548                   break;
2549                 case EF_IA_64_VMS_COMCOD_WARNING:
2550                   strcat (buf, ", warning");
2551                   break;
2552                 case EF_IA_64_VMS_COMCOD_ERROR:
2553                   strcat (buf, ", error");
2554                   break;
2555                 case EF_IA_64_VMS_COMCOD_ABORT:
2556                   strcat (buf, ", abort");
2557                   break;
2558                 default:
2559                   abort ();
2560                 }
2561             }
2562           break;
2563
2564         case EM_VAX:
2565           if ((e_flags & EF_VAX_NONPIC))
2566             strcat (buf, ", non-PIC");
2567           if ((e_flags & EF_VAX_DFLOAT))
2568             strcat (buf, ", D-Float");
2569           if ((e_flags & EF_VAX_GFLOAT))
2570             strcat (buf, ", G-Float");
2571           break;
2572
2573         case EM_RX:
2574           if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
2575             strcat (buf, ", 64-bit doubles");
2576           if (e_flags & E_FLAG_RX_DSP)
2577             strcat (buf, ", dsp");
2578
2579         case EM_S390:
2580           if (e_flags & EF_S390_HIGH_GPRS)
2581             strcat (buf, ", highgprs");
2582
2583         case EM_TI_C6000:
2584           if ((e_flags & EF_C6000_REL))
2585             strcat (buf, ", relocatable module");
2586         }
2587     }
2588
2589   return buf;
2590 }
2591
2592 static const char *
2593 get_osabi_name (unsigned int osabi)
2594 {
2595   static char buff[32];
2596
2597   switch (osabi)
2598     {
2599     case ELFOSABI_NONE:         return "UNIX - System V";
2600     case ELFOSABI_HPUX:         return "UNIX - HP-UX";
2601     case ELFOSABI_NETBSD:       return "UNIX - NetBSD";
2602     case ELFOSABI_LINUX:        return "UNIX - Linux";
2603     case ELFOSABI_HURD:         return "GNU/Hurd";
2604     case ELFOSABI_SOLARIS:      return "UNIX - Solaris";
2605     case ELFOSABI_AIX:          return "UNIX - AIX";
2606     case ELFOSABI_IRIX:         return "UNIX - IRIX";
2607     case ELFOSABI_FREEBSD:      return "UNIX - FreeBSD";
2608     case ELFOSABI_TRU64:        return "UNIX - TRU64";
2609     case ELFOSABI_MODESTO:      return "Novell - Modesto";
2610     case ELFOSABI_OPENBSD:      return "UNIX - OpenBSD";
2611     case ELFOSABI_OPENVMS:      return "VMS - OpenVMS";
2612     case ELFOSABI_NSK:          return "HP - Non-Stop Kernel";
2613     case ELFOSABI_AROS:         return "AROS";
2614     case ELFOSABI_FENIXOS:      return "FenixOS";
2615     default:
2616       if (osabi >= 64)
2617         switch (elf_header.e_machine)
2618           {
2619           case EM_ARM:
2620             switch (osabi)
2621               {
2622               case ELFOSABI_ARM:        return "ARM";
2623               default:
2624                 break;
2625               }
2626             break;
2627
2628           case EM_MSP430:
2629           case EM_MSP430_OLD:
2630             switch (osabi)
2631               {
2632               case ELFOSABI_STANDALONE: return _("Standalone App");
2633               default:
2634                 break;
2635               }
2636             break;
2637
2638           case EM_TI_C6000:
2639             switch (osabi)
2640               {
2641               case ELFOSABI_C6000_ELFABI:       return _("Bare-metal C6000");
2642               case ELFOSABI_C6000_LINUX:        return "Linux C6000";
2643               default:
2644                 break;
2645               }
2646             break;
2647
2648           default:
2649             break;
2650           }
2651       snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
2652       return buff;
2653     }
2654 }
2655
2656 static const char *
2657 get_arm_segment_type (unsigned long type)
2658 {
2659   switch (type)
2660     {
2661     case PT_ARM_EXIDX:
2662       return "EXIDX";
2663     default:
2664       break;
2665     }
2666
2667   return NULL;
2668 }
2669
2670 static const char *
2671 get_mips_segment_type (unsigned long type)
2672 {
2673   switch (type)
2674     {
2675     case PT_MIPS_REGINFO:
2676       return "REGINFO";
2677     case PT_MIPS_RTPROC:
2678       return "RTPROC";
2679     case PT_MIPS_OPTIONS:
2680       return "OPTIONS";
2681     default:
2682       break;
2683     }
2684
2685   return NULL;
2686 }
2687
2688 static const char *
2689 get_parisc_segment_type (unsigned long type)
2690 {
2691   switch (type)
2692     {
2693     case PT_HP_TLS:             return "HP_TLS";
2694     case PT_HP_CORE_NONE:       return "HP_CORE_NONE";
2695     case PT_HP_CORE_VERSION:    return "HP_CORE_VERSION";
2696     case PT_HP_CORE_KERNEL:     return "HP_CORE_KERNEL";
2697     case PT_HP_CORE_COMM:       return "HP_CORE_COMM";
2698     case PT_HP_CORE_PROC:       return "HP_CORE_PROC";
2699     case PT_HP_CORE_LOADABLE:   return "HP_CORE_LOADABLE";
2700     case PT_HP_CORE_STACK:      return "HP_CORE_STACK";
2701     case PT_HP_CORE_SHM:        return "HP_CORE_SHM";
2702     case PT_HP_CORE_MMF:        return "HP_CORE_MMF";
2703     case PT_HP_PARALLEL:        return "HP_PARALLEL";
2704     case PT_HP_FASTBIND:        return "HP_FASTBIND";
2705     case PT_HP_OPT_ANNOT:       return "HP_OPT_ANNOT";
2706     case PT_HP_HSL_ANNOT:       return "HP_HSL_ANNOT";
2707     case PT_HP_STACK:           return "HP_STACK";
2708     case PT_HP_CORE_UTSNAME:    return "HP_CORE_UTSNAME";
2709     case PT_PARISC_ARCHEXT:     return "PARISC_ARCHEXT";
2710     case PT_PARISC_UNWIND:      return "PARISC_UNWIND";
2711     case PT_PARISC_WEAKORDER:   return "PARISC_WEAKORDER";
2712     default:
2713       break;
2714     }
2715
2716   return NULL;
2717 }
2718
2719 static const char *
2720 get_ia64_segment_type (unsigned long type)
2721 {
2722   switch (type)
2723     {
2724     case PT_IA_64_ARCHEXT:      return "IA_64_ARCHEXT";
2725     case PT_IA_64_UNWIND:       return "IA_64_UNWIND";
2726     case PT_HP_TLS:             return "HP_TLS";
2727     case PT_IA_64_HP_OPT_ANOT:  return "HP_OPT_ANNOT";
2728     case PT_IA_64_HP_HSL_ANOT:  return "HP_HSL_ANNOT";
2729     case PT_IA_64_HP_STACK:     return "HP_STACK";
2730     default:
2731       break;
2732     }
2733
2734   return NULL;
2735 }
2736
2737 static const char *
2738 get_tic6x_segment_type (unsigned long type)
2739 {
2740   switch (type)
2741     {
2742     case PT_C6000_PHATTR:       return "C6000_PHATTR";
2743     default:
2744       break;
2745     }
2746
2747   return NULL;
2748 }
2749
2750 static const char *
2751 get_segment_type (unsigned long p_type)
2752 {
2753   static char buff[32];
2754
2755   switch (p_type)
2756     {
2757     case PT_NULL:       return "NULL";
2758     case PT_LOAD:       return "LOAD";
2759     case PT_DYNAMIC:    return "DYNAMIC";
2760     case PT_INTERP:     return "INTERP";
2761     case PT_NOTE:       return "NOTE";
2762     case PT_SHLIB:      return "SHLIB";
2763     case PT_PHDR:       return "PHDR";
2764     case PT_TLS:        return "TLS";
2765
2766     case PT_GNU_EH_FRAME:
2767                         return "GNU_EH_FRAME";
2768     case PT_GNU_STACK:  return "GNU_STACK";
2769     case PT_GNU_RELRO:  return "GNU_RELRO";
2770
2771     default:
2772       if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
2773         {
2774           const char * result;
2775
2776           switch (elf_header.e_machine)
2777             {
2778             case EM_ARM:
2779               result = get_arm_segment_type (p_type);
2780               break;
2781             case EM_MIPS:
2782             case EM_MIPS_RS3_LE:
2783               result = get_mips_segment_type (p_type);
2784               break;
2785             case EM_PARISC:
2786               result = get_parisc_segment_type (p_type);
2787               break;
2788             case EM_IA_64:
2789               result = get_ia64_segment_type (p_type);
2790               break;
2791             case EM_TI_C6000:
2792               result = get_tic6x_segment_type (p_type);
2793               break;
2794             default:
2795               result = NULL;
2796               break;
2797             }
2798
2799           if (result != NULL)
2800             return result;
2801
2802           sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
2803         }
2804       else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
2805         {
2806           const char * result;
2807
2808           switch (elf_header.e_machine)
2809             {
2810             case EM_PARISC:
2811               result = get_parisc_segment_type (p_type);
2812               break;
2813             case EM_IA_64:
2814               result = get_ia64_segment_type (p_type);
2815               break;
2816             default:
2817               result = NULL;
2818               break;
2819             }
2820
2821           if (result != NULL)
2822             return result;
2823
2824           sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
2825         }
2826       else
2827         snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
2828
2829       return buff;
2830     }
2831 }
2832
2833 static const char *
2834 get_mips_section_type_name (unsigned int sh_type)
2835 {
2836   switch (sh_type)
2837     {
2838     case SHT_MIPS_LIBLIST:       return "MIPS_LIBLIST";
2839     case SHT_MIPS_MSYM:          return "MIPS_MSYM";
2840     case SHT_MIPS_CONFLICT:      return "MIPS_CONFLICT";
2841     case SHT_MIPS_GPTAB:         return "MIPS_GPTAB";
2842     case SHT_MIPS_UCODE:         return "MIPS_UCODE";
2843     case SHT_MIPS_DEBUG:         return "MIPS_DEBUG";
2844     case SHT_MIPS_REGINFO:       return "MIPS_REGINFO";
2845     case SHT_MIPS_PACKAGE:       return "MIPS_PACKAGE";
2846     case SHT_MIPS_PACKSYM:       return "MIPS_PACKSYM";
2847     case SHT_MIPS_RELD:          return "MIPS_RELD";
2848     case SHT_MIPS_IFACE:         return "MIPS_IFACE";
2849     case SHT_MIPS_CONTENT:       return "MIPS_CONTENT";
2850     case SHT_MIPS_OPTIONS:       return "MIPS_OPTIONS";
2851     case SHT_MIPS_SHDR:          return "MIPS_SHDR";
2852     case SHT_MIPS_FDESC:         return "MIPS_FDESC";
2853     case SHT_MIPS_EXTSYM:        return "MIPS_EXTSYM";
2854     case SHT_MIPS_DENSE:         return "MIPS_DENSE";
2855     case SHT_MIPS_PDESC:         return "MIPS_PDESC";
2856     case SHT_MIPS_LOCSYM:        return "MIPS_LOCSYM";
2857     case SHT_MIPS_AUXSYM:        return "MIPS_AUXSYM";
2858     case SHT_MIPS_OPTSYM:        return "MIPS_OPTSYM";
2859     case SHT_MIPS_LOCSTR:        return "MIPS_LOCSTR";
2860     case SHT_MIPS_LINE:          return "MIPS_LINE";
2861     case SHT_MIPS_RFDESC:        return "MIPS_RFDESC";
2862     case SHT_MIPS_DELTASYM:      return "MIPS_DELTASYM";
2863     case SHT_MIPS_DELTAINST:     return "MIPS_DELTAINST";
2864     case SHT_MIPS_DELTACLASS:    return "MIPS_DELTACLASS";
2865     case SHT_MIPS_DWARF:         return "MIPS_DWARF";
2866     case SHT_MIPS_DELTADECL:     return "MIPS_DELTADECL";
2867     case SHT_MIPS_SYMBOL_LIB:    return "MIPS_SYMBOL_LIB";
2868     case SHT_MIPS_EVENTS:        return "MIPS_EVENTS";
2869     case SHT_MIPS_TRANSLATE:     return "MIPS_TRANSLATE";
2870     case SHT_MIPS_PIXIE:         return "MIPS_PIXIE";
2871     case SHT_MIPS_XLATE:         return "MIPS_XLATE";
2872     case SHT_MIPS_XLATE_DEBUG:   return "MIPS_XLATE_DEBUG";
2873     case SHT_MIPS_WHIRL:         return "MIPS_WHIRL";
2874     case SHT_MIPS_EH_REGION:     return "MIPS_EH_REGION";
2875     case SHT_MIPS_XLATE_OLD:     return "MIPS_XLATE_OLD";
2876     case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
2877     default:
2878       break;
2879     }
2880   return NULL;
2881 }
2882
2883 static const char *
2884 get_parisc_section_type_name (unsigned int sh_type)
2885 {
2886   switch (sh_type)
2887     {
2888     case SHT_PARISC_EXT:        return "PARISC_EXT";
2889     case SHT_PARISC_UNWIND:     return "PARISC_UNWIND";
2890     case SHT_PARISC_DOC:        return "PARISC_DOC";
2891     case SHT_PARISC_ANNOT:      return "PARISC_ANNOT";
2892     case SHT_PARISC_SYMEXTN:    return "PARISC_SYMEXTN";
2893     case SHT_PARISC_STUBS:      return "PARISC_STUBS";
2894     case SHT_PARISC_DLKM:       return "PARISC_DLKM";
2895     default:
2896       break;
2897     }
2898   return NULL;
2899 }
2900
2901 static const char *
2902 get_ia64_section_type_name (unsigned int sh_type)
2903 {
2904   /* If the top 8 bits are 0x78 the next 8 are the os/abi ID.  */
2905   if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
2906     return get_osabi_name ((sh_type & 0x00FF0000) >> 16);
2907
2908   switch (sh_type)
2909     {
2910     case SHT_IA_64_EXT:                return "IA_64_EXT";
2911     case SHT_IA_64_UNWIND:             return "IA_64_UNWIND";
2912     case SHT_IA_64_PRIORITY_INIT:      return "IA_64_PRIORITY_INIT";
2913     case SHT_IA_64_VMS_TRACE:          return "VMS_TRACE";
2914     case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
2915     case SHT_IA_64_VMS_DEBUG:          return "VMS_DEBUG";
2916     case SHT_IA_64_VMS_DEBUG_STR:      return "VMS_DEBUG_STR";
2917     case SHT_IA_64_VMS_LINKAGES:       return "VMS_LINKAGES";
2918     case SHT_IA_64_VMS_SYMBOL_VECTOR:  return "VMS_SYMBOL_VECTOR";
2919     case SHT_IA_64_VMS_FIXUP:          return "VMS_FIXUP";
2920     default:
2921       break;
2922     }
2923   return NULL;
2924 }
2925
2926 static const char *
2927 get_x86_64_section_type_name (unsigned int sh_type)
2928 {
2929   switch (sh_type)
2930     {
2931     case SHT_X86_64_UNWIND:     return "X86_64_UNWIND";
2932     default:
2933       break;
2934     }
2935   return NULL;
2936 }
2937
2938 static const char *
2939 get_arm_section_type_name (unsigned int sh_type)
2940 {
2941   switch (sh_type)
2942     {
2943     case SHT_ARM_EXIDX:           return "ARM_EXIDX";
2944     case SHT_ARM_PREEMPTMAP:      return "ARM_PREEMPTMAP";
2945     case SHT_ARM_ATTRIBUTES:      return "ARM_ATTRIBUTES";
2946     case SHT_ARM_DEBUGOVERLAY:    return "ARM_DEBUGOVERLAY";
2947     case SHT_ARM_OVERLAYSECTION:  return "ARM_OVERLAYSECTION";
2948     default:
2949       break;
2950     }
2951   return NULL;
2952 }
2953
2954 static const char *
2955 get_tic6x_section_type_name (unsigned int sh_type)
2956 {
2957   switch (sh_type)
2958     {
2959     case SHT_C6000_UNWIND:
2960       return "C6000_UNWIND";
2961     case SHT_C6000_PREEMPTMAP:
2962       return "C6000_PREEMPTMAP";
2963     case SHT_C6000_ATTRIBUTES:
2964       return "C6000_ATTRIBUTES";
2965     case SHT_TI_ICODE:
2966       return "TI_ICODE";
2967     case SHT_TI_XREF:
2968       return "TI_XREF";
2969     case SHT_TI_HANDLER:
2970       return "TI_HANDLER";
2971     case SHT_TI_INITINFO:
2972       return "TI_INITINFO";
2973     case SHT_TI_PHATTRS:
2974       return "TI_PHATTRS";
2975     default:
2976       break;
2977     }
2978   return NULL;
2979 }
2980
2981 static const char *
2982 get_section_type_name (unsigned int sh_type)
2983 {
2984   static char buff[32];
2985
2986   switch (sh_type)
2987     {
2988     case SHT_NULL:              return "NULL";
2989     case SHT_PROGBITS:          return "PROGBITS";
2990     case SHT_SYMTAB:            return "SYMTAB";
2991     case SHT_STRTAB:            return "STRTAB";
2992     case SHT_RELA:              return "RELA";
2993     case SHT_HASH:              return "HASH";
2994     case SHT_DYNAMIC:           return "DYNAMIC";
2995     case SHT_NOTE:              return "NOTE";
2996     case SHT_NOBITS:            return "NOBITS";
2997     case SHT_REL:               return "REL";
2998     case SHT_SHLIB:             return "SHLIB";
2999     case SHT_DYNSYM:            return "DYNSYM";
3000     case SHT_INIT_ARRAY:        return "INIT_ARRAY";
3001     case SHT_FINI_ARRAY:        return "FINI_ARRAY";
3002     case SHT_PREINIT_ARRAY:     return "PREINIT_ARRAY";
3003     case SHT_GNU_HASH:          return "GNU_HASH";
3004     case SHT_GROUP:             return "GROUP";
3005     case SHT_SYMTAB_SHNDX:      return "SYMTAB SECTION INDICIES";
3006     case SHT_GNU_verdef:        return "VERDEF";
3007     case SHT_GNU_verneed:       return "VERNEED";
3008     case SHT_GNU_versym:        return "VERSYM";
3009     case 0x6ffffff0:            return "VERSYM";
3010     case 0x6ffffffc:            return "VERDEF";
3011     case 0x7ffffffd:            return "AUXILIARY";
3012     case 0x7fffffff:            return "FILTER";
3013     case SHT_GNU_LIBLIST:       return "GNU_LIBLIST";
3014
3015     default:
3016       if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
3017         {
3018           const char * result;
3019
3020           switch (elf_header.e_machine)
3021             {
3022             case EM_MIPS:
3023             case EM_MIPS_RS3_LE:
3024               result = get_mips_section_type_name (sh_type);
3025               break;
3026             case EM_PARISC:
3027               result = get_parisc_section_type_name (sh_type);
3028               break;
3029             case EM_IA_64:
3030               result = get_ia64_section_type_name (sh_type);
3031               break;
3032             case EM_X86_64:
3033             case EM_L1OM:
3034               result = get_x86_64_section_type_name (sh_type);
3035               break;
3036             case EM_ARM:
3037               result = get_arm_section_type_name (sh_type);
3038               break;
3039             case EM_TI_C6000:
3040               result = get_tic6x_section_type_name (sh_type);
3041               break;
3042             default:
3043               result = NULL;
3044               break;
3045             }
3046
3047           if (result != NULL)
3048             return result;
3049
3050           sprintf (buff, "LOPROC+%x", sh_type - SHT_LOPROC);
3051         }
3052       else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
3053         {
3054           const char * result;
3055
3056           switch (elf_header.e_machine)
3057             {
3058             case EM_IA_64:
3059               result = get_ia64_section_type_name (sh_type);
3060               break;
3061             default:
3062               result = NULL;
3063               break;
3064             }
3065
3066           if (result != NULL)
3067             return result;
3068
3069           sprintf (buff, "LOOS+%x", sh_type - SHT_LOOS);
3070         }
3071       else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
3072         sprintf (buff, "LOUSER+%x", sh_type - SHT_LOUSER);
3073       else
3074         snprintf (buff, sizeof (buff), _("<unknown>: %x"), sh_type);
3075
3076       return buff;
3077     }
3078 }
3079
3080 #define OPTION_DEBUG_DUMP       512
3081 #define OPTION_DYN_SYMS         513
3082 #define OPTION_DWARF_DEPTH      514
3083 #define OPTION_DWARF_START      515
3084
3085 static struct option options[] =
3086 {
3087   {"all",              no_argument, 0, 'a'},
3088   {"file-header",      no_argument, 0, 'h'},
3089   {"program-headers",  no_argument, 0, 'l'},
3090   {"headers",          no_argument, 0, 'e'},
3091   {"histogram",        no_argument, 0, 'I'},
3092   {"segments",         no_argument, 0, 'l'},
3093   {"sections",         no_argument, 0, 'S'},
3094   {"section-headers",  no_argument, 0, 'S'},
3095   {"section-groups",   no_argument, 0, 'g'},
3096   {"section-details",  no_argument, 0, 't'},
3097   {"full-section-name",no_argument, 0, 'N'},
3098   {"symbols",          no_argument, 0, 's'},
3099   {"syms",             no_argument, 0, 's'},
3100   {"dyn-syms",         no_argument, 0, OPTION_DYN_SYMS},
3101   {"relocs",           no_argument, 0, 'r'},
3102   {"notes",            no_argument, 0, 'n'},
3103   {"dynamic",          no_argument, 0, 'd'},
3104   {"arch-specific",    no_argument, 0, 'A'},
3105   {"version-info",     no_argument, 0, 'V'},
3106   {"use-dynamic",      no_argument, 0, 'D'},
3107   {"unwind",           no_argument, 0, 'u'},
3108   {"archive-index",    no_argument, 0, 'c'},
3109   {"hex-dump",         required_argument, 0, 'x'},
3110   {"relocated-dump",   required_argument, 0, 'R'},
3111   {"string-dump",      required_argument, 0, 'p'},
3112 #ifdef SUPPORT_DISASSEMBLY
3113   {"instruction-dump", required_argument, 0, 'i'},
3114 #endif
3115   {"debug-dump",       optional_argument, 0, OPTION_DEBUG_DUMP},
3116
3117   {"dwarf-depth",      required_argument, 0, OPTION_DWARF_DEPTH},
3118   {"dwarf-start",      required_argument, 0, OPTION_DWARF_START},
3119
3120   {"version",          no_argument, 0, 'v'},
3121   {"wide",             no_argument, 0, 'W'},
3122   {"help",             no_argument, 0, 'H'},
3123   {0,                  no_argument, 0, 0}
3124 };
3125
3126 static void
3127 usage (FILE * stream)
3128 {
3129   fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
3130   fprintf (stream, _(" Display information about the contents of ELF format files\n"));
3131   fprintf (stream, _(" Options are:\n\
3132   -a --all               Equivalent to: -h -l -S -s -r -d -V -A -I\n\
3133   -h --file-header       Display the ELF file header\n\
3134   -l --program-headers   Display the program headers\n\
3135      --segments          An alias for --program-headers\n\
3136   -S --section-headers   Display the sections' header\n\
3137      --sections          An alias for --section-headers\n\
3138   -g --section-groups    Display the section groups\n\
3139   -t --section-details   Display the section details\n\
3140   -e --headers           Equivalent to: -h -l -S\n\
3141   -s --syms              Display the symbol table\n\
3142      --symbols           An alias for --syms\n\
3143   --dyn-syms             Display the dynamic symbol table\n\
3144   -n --notes             Display the core notes (if present)\n\
3145   -r --relocs            Display the relocations (if present)\n\
3146   -u --unwind            Display the unwind info (if present)\n\
3147   -d --dynamic           Display the dynamic section (if present)\n\
3148   -V --version-info      Display the version sections (if present)\n\
3149   -A --arch-specific     Display architecture specific information (if any).\n\
3150   -c --archive-index     Display the symbol/file index in an archive\n\
3151   -D --use-dynamic       Use the dynamic section info when displaying symbols\n\
3152   -x --hex-dump=<number|name>\n\
3153                          Dump the contents of section <number|name> as bytes\n\
3154   -p --string-dump=<number|name>\n\
3155                          Dump the contents of section <number|name> as strings\n\
3156   -R --relocated-dump=<number|name>\n\
3157                          Dump the contents of section <number|name> as relocated bytes\n\
3158   -w[lLiaprmfFsoRt] or\n\
3159   --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
3160                =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
3161                =gdb_index,=trace_info,=trace_abbrev,=trace_aranges]\n\
3162                          Display the contents of DWARF2 debug sections\n"));
3163   fprintf (stream, _("\
3164   --dwarf-depth=N        Do not display DIEs at depth N or greater\n\
3165   --dwarf-start=N        Display DIEs starting with N, at the same depth\n\
3166                          or deeper\n"));
3167 #ifdef SUPPORT_DISASSEMBLY
3168   fprintf (stream, _("\
3169   -i --instruction-dump=<number|name>\n\
3170                          Disassemble the contents of section <number|name>\n"));
3171 #endif
3172   fprintf (stream, _("\
3173   -I --histogram         Display histogram of bucket list lengths\n\
3174   -W --wide              Allow output width to exceed 80 characters\n\
3175   @<file>                Read options from <file>\n\
3176   -H --help              Display this information\n\
3177   -v --version           Display the version number of readelf\n"));
3178
3179   if (REPORT_BUGS_TO[0] && stream == stdout)
3180     fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
3181
3182   exit (stream == stdout ? 0 : 1);
3183 }
3184
3185 /* Record the fact that the user wants the contents of section number
3186    SECTION to be displayed using the method(s) encoded as flags bits
3187    in TYPE.  Note, TYPE can be zero if we are creating the array for
3188    the first time.  */
3189
3190 static void
3191 request_dump_bynumber (unsigned int section, dump_type type)
3192 {
3193   if (section >= num_dump_sects)
3194     {
3195       dump_type * new_dump_sects;
3196
3197       new_dump_sects = (dump_type *) calloc (section + 1,
3198                                              sizeof (* dump_sects));
3199
3200       if (new_dump_sects == NULL)
3201         error (_("Out of memory allocating dump request table.\n"));
3202       else
3203         {
3204           /* Copy current flag settings.  */
3205           memcpy (new_dump_sects, dump_sects, num_dump_sects * sizeof (* dump_sects));
3206
3207           free (dump_sects);
3208
3209           dump_sects = new_dump_sects;
3210           num_dump_sects = section + 1;
3211         }
3212     }
3213
3214   if (dump_sects)
3215     dump_sects[section] |= type;
3216
3217   return;
3218 }
3219
3220 /* Request a dump by section name.  */
3221
3222 static void
3223 request_dump_byname (const char * section, dump_type type)
3224 {
3225   struct dump_list_entry * new_request;
3226
3227   new_request = (struct dump_list_entry *)
3228       malloc (sizeof (struct dump_list_entry));
3229   if (!new_request)
3230     error (_("Out of memory allocating dump request table.\n"));
3231
3232   new_request->name = strdup (section);
3233   if (!new_request->name)
3234     error (_("Out of memory allocating dump request table.\n"));
3235
3236   new_request->type = type;
3237
3238   new_request->next = dump_sects_byname;
3239   dump_sects_byname = new_request;
3240 }
3241
3242 static inline void
3243 request_dump (dump_type type)
3244 {
3245   int section;
3246   char * cp;
3247
3248   do_dump++;
3249   section = strtoul (optarg, & cp, 0);
3250
3251   if (! *cp && section >= 0)
3252     request_dump_bynumber (section, type);
3253   else
3254     request_dump_byname (optarg, type);
3255 }
3256
3257
3258 static void
3259 parse_args (int argc, char ** argv)
3260 {
3261   int c;
3262
3263   if (argc < 2)
3264     usage (stderr);
3265
3266   while ((c = getopt_long
3267           (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:", options, NULL)) != EOF)
3268     {
3269       switch (c)
3270         {
3271         case 0:
3272           /* Long options.  */
3273           break;
3274         case 'H':
3275           usage (stdout);
3276           break;
3277
3278         case 'a':
3279           do_syms++;
3280           do_reloc++;
3281           do_unwind++;
3282           do_dynamic++;
3283           do_header++;
3284           do_sections++;
3285           do_section_groups++;
3286           do_segments++;
3287           do_version++;
3288           do_histogram++;
3289           do_arch++;
3290           do_notes++;
3291           break;
3292         case 'g':
3293           do_section_groups++;
3294           break;
3295         case 't':
3296         case 'N':
3297           do_sections++;
3298           do_section_details++;
3299           break;
3300         case 'e':
3301           do_header++;
3302           do_sections++;
3303           do_segments++;
3304           break;
3305         case 'A':
3306           do_arch++;
3307           break;
3308         case 'D':
3309           do_using_dynamic++;
3310           break;
3311         case 'r':
3312           do_reloc++;
3313           break;
3314         case 'u':
3315           do_unwind++;
3316           break;
3317         case 'h':
3318           do_header++;
3319           break;
3320         case 'l':
3321           do_segments++;
3322           break;
3323         case 's':
3324           do_syms++;
3325           break;
3326         case 'S':
3327           do_sections++;
3328           break;
3329         case 'd':
3330           do_dynamic++;
3331           break;
3332         case 'I':
3333           do_histogram++;
3334           break;
3335         case 'n':
3336           do_notes++;
3337           break;
3338         case 'c':
3339           do_archive_index++;
3340           break;
3341         case 'x':
3342           request_dump (HEX_DUMP);
3343           break;
3344         case 'p':
3345           request_dump (STRING_DUMP);
3346           break;
3347         case 'R':
3348           request_dump (RELOC_DUMP);
3349           break;
3350         case 'w':
3351           do_dump++;
3352           if (optarg == 0)
3353             {
3354               do_debugging = 1;
3355               dwarf_select_sections_all ();
3356             }
3357           else
3358             {
3359               do_debugging = 0;
3360               dwarf_select_sections_by_letters (optarg);
3361             }
3362           break;
3363         case OPTION_DEBUG_DUMP:
3364           do_dump++;
3365           if (optarg == 0)
3366             do_debugging = 1;
3367           else
3368             {
3369               do_debugging = 0;
3370               dwarf_select_sections_by_names (optarg);
3371             }
3372           break;
3373         case OPTION_DWARF_DEPTH:
3374           {
3375             char *cp;
3376
3377             dwarf_cutoff_level = strtoul (optarg, & cp, 0);
3378           }
3379           break;
3380         case OPTION_DWARF_START:
3381           {
3382             char *cp;
3383
3384             dwarf_start_die = strtoul (optarg, & cp, 0);
3385           }
3386           break;
3387         case OPTION_DYN_SYMS:
3388           do_dyn_syms++;
3389           break;
3390 #ifdef SUPPORT_DISASSEMBLY
3391         case 'i':
3392           request_dump (DISASS_DUMP);
3393           break;
3394 #endif
3395         case 'v':
3396           print_version (program_name);
3397           break;
3398         case 'V':
3399           do_version++;
3400           break;
3401         case 'W':
3402           do_wide++;
3403           break;
3404         default:
3405           /* xgettext:c-format */
3406           error (_("Invalid option '-%c'\n"), c);
3407           /* Drop through.  */
3408         case '?':
3409           usage (stderr);
3410         }
3411     }
3412
3413   if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
3414       && !do_segments && !do_header && !do_dump && !do_version
3415       && !do_histogram && !do_debugging && !do_arch && !do_notes
3416       && !do_section_groups && !do_archive_index
3417       && !do_dyn_syms)
3418     usage (stderr);
3419   else if (argc < 3)
3420     {
3421       warn (_("Nothing to do.\n"));
3422       usage (stderr);
3423     }
3424 }
3425
3426 static const char *
3427 get_elf_class (unsigned int elf_class)
3428 {
3429   static char buff[32];
3430
3431   switch (elf_class)
3432     {
3433     case ELFCLASSNONE: return _("none");
3434     case ELFCLASS32:   return "ELF32";
3435     case ELFCLASS64:   return "ELF64";
3436     default:
3437       snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
3438       return buff;
3439     }
3440 }
3441
3442 static const char *
3443 get_data_encoding (unsigned int encoding)
3444 {
3445   static char buff[32];
3446
3447   switch (encoding)
3448     {
3449     case ELFDATANONE: return _("none");
3450     case ELFDATA2LSB: return _("2's complement, little endian");
3451     case ELFDATA2MSB: return _("2's complement, big endian");
3452     default:
3453       snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
3454       return buff;
3455     }
3456 }
3457
3458 /* Decode the data held in 'elf_header'.  */
3459
3460 static int
3461 process_file_header (void)
3462 {
3463   if (   elf_header.e_ident[EI_MAG0] != ELFMAG0
3464       || elf_header.e_ident[EI_MAG1] != ELFMAG1
3465       || elf_header.e_ident[EI_MAG2] != ELFMAG2
3466       || elf_header.e_ident[EI_MAG3] != ELFMAG3)
3467     {
3468       error
3469         (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
3470       return 0;
3471     }
3472
3473   init_dwarf_regnames (elf_header.e_machine);
3474
3475   if (do_header)
3476     {
3477       int i;
3478
3479       printf (_("ELF Header:\n"));
3480       printf (_("  Magic:   "));
3481       for (i = 0; i < EI_NIDENT; i++)
3482         printf ("%2.2x ", elf_header.e_ident[i]);
3483       printf ("\n");
3484       printf (_("  Class:                             %s\n"),
3485               get_elf_class (elf_header.e_ident[EI_CLASS]));
3486       printf (_("  Data:                              %s\n"),
3487               get_data_encoding (elf_header.e_ident[EI_DATA]));
3488       printf (_("  Version:                           %d %s\n"),
3489               elf_header.e_ident[EI_VERSION],
3490               (elf_header.e_ident[EI_VERSION] == EV_CURRENT
3491                ? "(current)"
3492                : (elf_header.e_ident[EI_VERSION] != EV_NONE
3493                   ? _("<unknown: %lx>")
3494                   : "")));
3495       printf (_("  OS/ABI:                            %s\n"),
3496               get_osabi_name (elf_header.e_ident[EI_OSABI]));
3497       printf (_("  ABI Version:                       %d\n"),
3498               elf_header.e_ident[EI_ABIVERSION]);
3499       printf (_("  Type:                              %s\n"),
3500               get_file_type (elf_header.e_type));
3501       printf (_("  Machine:                           %s\n"),
3502               get_machine_name (elf_header.e_machine));
3503       printf (_("  Version:                           0x%lx\n"),
3504               (unsigned long) elf_header.e_version);
3505
3506       printf (_("  Entry point address:               "));
3507       print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
3508       printf (_("\n  Start of program headers:          "));
3509       print_vma ((bfd_vma) elf_header.e_phoff, DEC);
3510       printf (_(" (bytes into file)\n  Start of section headers:          "));
3511       print_vma ((bfd_vma) elf_header.e_shoff, DEC);
3512       printf (_(" (bytes into file)\n"));
3513
3514       printf (_("  Flags:                             0x%lx%s\n"),
3515               (unsigned long) elf_header.e_flags,
3516               get_machine_flags (elf_header.e_flags, elf_header.e_machine));
3517       printf (_("  Size of this header:               %ld (bytes)\n"),
3518               (long) elf_header.e_ehsize);
3519       printf (_("  Size of program headers:           %ld (bytes)\n"),
3520               (long) elf_header.e_phentsize);
3521       printf (_("  Number of program headers:         %ld"),
3522               (long) elf_header.e_phnum);
3523       if (section_headers != NULL
3524           && elf_header.e_phnum == PN_XNUM
3525           && section_headers[0].sh_info != 0)
3526         printf (" (%ld)", (long) section_headers[0].sh_info);
3527       putc ('\n', stdout);
3528       printf (_("  Size of section headers:           %ld (bytes)\n"),
3529               (long) elf_header.e_shentsize);
3530       printf (_("  Number of section headers:         %ld"),
3531               (long) elf_header.e_shnum);
3532       if (section_headers != NULL && elf_header.e_shnum == SHN_UNDEF)
3533         printf (" (%ld)", (long) section_headers[0].sh_size);
3534       putc ('\n', stdout);
3535       printf (_("  Section header string table index: %ld"),
3536               (long) elf_header.e_shstrndx);
3537       if (section_headers != NULL
3538           && elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
3539         printf (" (%u)", section_headers[0].sh_link);
3540       else if (elf_header.e_shstrndx != SHN_UNDEF
3541                && elf_header.e_shstrndx >= elf_header.e_shnum)
3542         printf (_(" <corrupt: out of range>"));
3543       putc ('\n', stdout);
3544     }
3545
3546   if (section_headers != NULL)
3547     {
3548       if (elf_header.e_phnum == PN_XNUM
3549           && section_headers[0].sh_info != 0)
3550         elf_header.e_phnum = section_headers[0].sh_info;
3551       if (elf_header.e_shnum == SHN_UNDEF)
3552         elf_header.e_shnum = section_headers[0].sh_size;
3553       if (elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
3554         elf_header.e_shstrndx = section_headers[0].sh_link;
3555       else if (elf_header.e_shstrndx >= elf_header.e_shnum)
3556         elf_header.e_shstrndx = SHN_UNDEF;
3557       free (section_headers);
3558       section_headers = NULL;
3559     }
3560
3561   return 1;
3562 }
3563
3564
3565 static int
3566 get_32bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
3567 {
3568   Elf32_External_Phdr * phdrs;
3569   Elf32_External_Phdr * external;
3570   Elf_Internal_Phdr *   internal;
3571   unsigned int i;
3572
3573   phdrs = (Elf32_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
3574                                             elf_header.e_phentsize,
3575                                             elf_header.e_phnum,
3576                                             _("program headers"));
3577   if (!phdrs)
3578     return 0;
3579
3580   for (i = 0, internal = pheaders, external = phdrs;
3581        i < elf_header.e_phnum;
3582        i++, internal++, external++)
3583     {
3584       internal->p_type   = BYTE_GET (external->p_type);
3585       internal->p_offset = BYTE_GET (external->p_offset);
3586       internal->p_vaddr  = BYTE_GET (external->p_vaddr);
3587       internal->p_paddr  = BYTE_GET (external->p_paddr);
3588       internal->p_filesz = BYTE_GET (external->p_filesz);
3589       internal->p_memsz  = BYTE_GET (external->p_memsz);
3590       internal->p_flags  = BYTE_GET (external->p_flags);
3591       internal->p_align  = BYTE_GET (external->p_align);
3592     }
3593
3594   free (phdrs);
3595
3596   return 1;
3597 }
3598
3599 static int
3600 get_64bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
3601 {
3602   Elf64_External_Phdr * phdrs;
3603   Elf64_External_Phdr * external;
3604   Elf_Internal_Phdr *   internal;
3605   unsigned int i;
3606
3607   phdrs = (Elf64_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
3608                                             elf_header.e_phentsize,
3609                                             elf_header.e_phnum,
3610                                             _("program headers"));
3611   if (!phdrs)
3612     return 0;
3613
3614   for (i = 0, internal = pheaders, external = phdrs;
3615        i < elf_header.e_phnum;
3616        i++, internal++, external++)
3617     {
3618       internal->p_type   = BYTE_GET (external->p_type);
3619       internal->p_flags  = BYTE_GET (external->p_flags);
3620       internal->p_offset = BYTE_GET (external->p_offset);
3621       internal->p_vaddr  = BYTE_GET (external->p_vaddr);
3622       internal->p_paddr  = BYTE_GET (external->p_paddr);
3623       internal->p_filesz = BYTE_GET (external->p_filesz);
3624       internal->p_memsz  = BYTE_GET (external->p_memsz);
3625       internal->p_align  = BYTE_GET (external->p_align);
3626     }
3627
3628   free (phdrs);
3629
3630   return 1;
3631 }
3632
3633 /* Returns 1 if the program headers were read into `program_headers'.  */
3634
3635 static int
3636 get_program_headers (FILE * file)
3637 {
3638   Elf_Internal_Phdr * phdrs;
3639
3640   /* Check cache of prior read.  */
3641   if (program_headers != NULL)
3642     return 1;
3643
3644   phdrs = (Elf_Internal_Phdr *) cmalloc (elf_header.e_phnum,
3645                                          sizeof (Elf_Internal_Phdr));
3646
3647   if (phdrs == NULL)
3648     {
3649       error (_("Out of memory\n"));
3650       return 0;
3651     }
3652
3653   if (is_32bit_elf
3654       ? get_32bit_program_headers (file, phdrs)
3655       : get_64bit_program_headers (file, phdrs))
3656     {
3657       program_headers = phdrs;
3658       return 1;
3659     }
3660
3661   free (phdrs);
3662   return 0;
3663 }
3664
3665 /* Returns 1 if the program headers were loaded.  */
3666
3667 static int
3668 process_program_headers (FILE * file)
3669 {
3670   Elf_Internal_Phdr * segment;
3671   unsigned int i;
3672
3673   if (elf_header.e_phnum == 0)
3674     {
3675       /* PR binutils/12467.  */
3676       if (elf_header.e_phoff != 0)
3677         warn (_("possibly corrupt ELF header - it has a non-zero program"
3678                 " header offset, but no program headers"));
3679       else if (do_segments)
3680         printf (_("\nThere are no program headers in this file.\n"));
3681       return 0;
3682     }
3683
3684   if (do_segments && !do_header)
3685     {
3686       printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
3687       printf (_("Entry point "));
3688       print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
3689       printf (_("\nThere are %d program headers, starting at offset "),
3690               elf_header.e_phnum);
3691       print_vma ((bfd_vma) elf_header.e_phoff, DEC);
3692       printf ("\n");
3693     }
3694
3695   if (! get_program_headers (file))
3696       return 0;
3697
3698   if (do_segments)
3699     {
3700       if (elf_header.e_phnum > 1)
3701         printf (_("\nProgram Headers:\n"));
3702       else
3703         printf (_("\nProgram Headers:\n"));
3704
3705       if (is_32bit_elf)
3706         printf
3707           (_("  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align\n"));
3708       else if (do_wide)
3709         printf
3710           (_("  Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align\n"));
3711       else
3712         {
3713           printf
3714             (_("  Type           Offset             VirtAddr           PhysAddr\n"));
3715           printf
3716             (_("                 FileSiz            MemSiz              Flags  Align\n"));
3717         }
3718     }
3719
3720   dynamic_addr = 0;
3721   dynamic_size = 0;
3722
3723   for (i = 0, segment = program_headers;
3724        i < elf_header.e_phnum;
3725        i++, segment++)
3726     {
3727       if (do_segments)
3728         {
3729           printf ("  %-14.14s ", get_segment_type (segment->p_type));
3730
3731           if (is_32bit_elf)
3732             {
3733               printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
3734               printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
3735               printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
3736               printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
3737               printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
3738               printf ("%c%c%c ",
3739                       (segment->p_flags & PF_R ? 'R' : ' '),
3740                       (segment->p_flags & PF_W ? 'W' : ' '),
3741                       (segment->p_flags & PF_X ? 'E' : ' '));
3742               printf ("%#lx", (unsigned long) segment->p_align);
3743             }
3744           else if (do_wide)
3745             {
3746               if ((unsigned long) segment->p_offset == segment->p_offset)
3747                 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
3748               else
3749                 {
3750                   print_vma (segment->p_offset, FULL_HEX);
3751                   putchar (' ');
3752                 }
3753
3754               print_vma (segment->p_vaddr, FULL_HEX);
3755               putchar (' ');
3756               print_vma (segment->p_paddr, FULL_HEX);
3757               putchar (' ');
3758
3759               if ((unsigned long) segment->p_filesz == segment->p_filesz)
3760                 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
3761               else
3762                 {
3763                   print_vma (segment->p_filesz, FULL_HEX);
3764                   putchar (' ');
3765                 }
3766
3767               if ((unsigned long) segment->p_memsz == segment->p_memsz)
3768                 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
3769               else
3770                 {
3771                   print_vma (segment->p_offset, FULL_HEX);
3772                 }
3773
3774               printf (" %c%c%c ",
3775                       (segment->p_flags & PF_R ? 'R' : ' '),
3776                       (segment->p_flags & PF_W ? 'W' : ' '),
3777                       (segment->p_flags & PF_X ? 'E' : ' '));
3778
3779               if ((unsigned long) segment->p_align == segment->p_align)
3780                 printf ("%#lx", (unsigned long) segment->p_align);
3781               else
3782                 {
3783                   print_vma (segment->p_align, PREFIX_HEX);
3784                 }
3785             }
3786           else
3787             {
3788               print_vma (segment->p_offset, FULL_HEX);
3789               putchar (' ');
3790               print_vma (segment->p_vaddr, FULL_HEX);
3791               putchar (' ');
3792               print_vma (segment->p_paddr, FULL_HEX);
3793               printf ("\n                 ");
3794               print_vma (segment->p_filesz, FULL_HEX);
3795               putchar (' ');
3796               print_vma (segment->p_memsz, FULL_HEX);
3797               printf ("  %c%c%c    ",
3798                       (segment->p_flags & PF_R ? 'R' : ' '),
3799                       (segment->p_flags & PF_W ? 'W' : ' '),
3800                       (segment->p_flags & PF_X ? 'E' : ' '));
3801               print_vma (segment->p_align, HEX);
3802             }
3803         }
3804
3805       switch (segment->p_type)
3806         {
3807         case PT_DYNAMIC:
3808           if (dynamic_addr)
3809             error (_("more than one dynamic segment\n"));
3810
3811           /* By default, assume that the .dynamic section is the first
3812              section in the DYNAMIC segment.  */
3813           dynamic_addr = segment->p_offset;
3814           dynamic_size = segment->p_filesz;
3815
3816           /* Try to locate the .dynamic section. If there is
3817              a section header table, we can easily locate it.  */
3818           if (section_headers != NULL)
3819             {
3820               Elf_Internal_Shdr * sec;
3821
3822               sec = find_section (".dynamic");
3823               if (sec == NULL || sec->sh_size == 0)
3824                 {
3825                   /* A corresponding .dynamic section is expected, but on
3826                      IA-64/OpenVMS it is OK for it to be missing.  */
3827                   if (!is_ia64_vms ())
3828                     error (_("no .dynamic section in the dynamic segment\n"));
3829                   break;
3830                 }
3831
3832               if (sec->sh_type == SHT_NOBITS)
3833                 {
3834                   dynamic_size = 0;
3835                   break;
3836                 }
3837
3838               dynamic_addr = sec->sh_offset;
3839               dynamic_size = sec->sh_size;
3840
3841               if (dynamic_addr < segment->p_offset
3842                   || dynamic_addr > segment->p_offset + segment->p_filesz)
3843                 warn (_("the .dynamic section is not contained"
3844                         " within the dynamic segment\n"));
3845               else if (dynamic_addr > segment->p_offset)
3846                 warn (_("the .dynamic section is not the first section"
3847                         " in the dynamic segment.\n"));
3848             }
3849           break;
3850
3851         case PT_INTERP:
3852           if (fseek (file, archive_file_offset + (long) segment->p_offset,
3853                      SEEK_SET))
3854             error (_("Unable to find program interpreter name\n"));
3855           else
3856             {
3857               char fmt [32];
3858               int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX);
3859
3860               if (ret >= (int) sizeof (fmt) || ret < 0)
3861                 error (_("Internal error: failed to create format string to display program interpreter\n"));
3862
3863               program_interpreter[0] = 0;
3864               if (fscanf (file, fmt, program_interpreter) <= 0)
3865                 error (_("Unable to read program interpreter name\n"));
3866
3867               if (do_segments)
3868                 printf (_("\n      [Requesting program interpreter: %s]"),
3869                     program_interpreter);
3870             }
3871           break;
3872         }
3873
3874       if (do_segments)
3875         putc ('\n', stdout);
3876     }
3877
3878   if (do_segments && section_headers != NULL && string_table != NULL)
3879     {
3880       printf (_("\n Section to Segment mapping:\n"));
3881       printf (_("  Segment Sections...\n"));
3882
3883       for (i = 0; i < elf_header.e_phnum; i++)
3884         {
3885           unsigned int j;
3886           Elf_Internal_Shdr * section;
3887
3888           segment = program_headers + i;
3889           section = section_headers + 1;
3890
3891           printf ("   %2.2d     ", i);
3892
3893           for (j = 1; j < elf_header.e_shnum; j++, section++)
3894             {
3895               if (!ELF_TBSS_SPECIAL (section, segment)
3896                   && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
3897                 printf ("%s ", SECTION_NAME (section));
3898             }
3899
3900           putc ('\n',stdout);
3901         }
3902     }
3903
3904   return 1;
3905 }
3906
3907
3908 /* Find the file offset corresponding to VMA by using the program headers.  */
3909
3910 static long
3911 offset_from_vma (FILE * file, bfd_vma vma, bfd_size_type size)
3912 {
3913   Elf_Internal_Phdr * seg;
3914
3915   if (! get_program_headers (file))
3916     {
3917       warn (_("Cannot interpret virtual addresses without program headers.\n"));
3918       return (long) vma;
3919     }
3920
3921   for (seg = program_headers;
3922        seg < program_headers + elf_header.e_phnum;
3923        ++seg)
3924     {
3925       if (seg->p_type != PT_LOAD)
3926         continue;
3927
3928       if (vma >= (seg->p_vaddr & -seg->p_align)
3929           && vma + size <= seg->p_vaddr + seg->p_filesz)
3930         return vma - seg->p_vaddr + seg->p_offset;
3931     }
3932
3933   warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
3934         (unsigned long) vma);
3935   return (long) vma;
3936 }
3937
3938
3939 static int
3940 get_32bit_section_headers (FILE * file, unsigned int num)
3941 {
3942   Elf32_External_Shdr * shdrs;
3943   Elf_Internal_Shdr *   internal;
3944   unsigned int i;
3945
3946   shdrs = (Elf32_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
3947                                             elf_header.e_shentsize, num,
3948                                             _("section headers"));
3949   if (!shdrs)
3950     return 0;
3951
3952   section_headers = (Elf_Internal_Shdr *) cmalloc (num,
3953                                                    sizeof (Elf_Internal_Shdr));
3954
3955   if (section_headers == NULL)
3956     {
3957       error (_("Out of memory\n"));
3958       return 0;
3959     }
3960
3961   for (i = 0, internal = section_headers;
3962        i < num;
3963        i++, internal++)
3964     {
3965       internal->sh_name      = BYTE_GET (shdrs[i].sh_name);
3966       internal->sh_type      = BYTE_GET (shdrs[i].sh_type);
3967       internal->sh_flags     = BYTE_GET (shdrs[i].sh_flags);
3968       internal->sh_addr      = BYTE_GET (shdrs[i].sh_addr);
3969       internal->sh_offset    = BYTE_GET (shdrs[i].sh_offset);
3970       internal->sh_size      = BYTE_GET (shdrs[i].sh_size);
3971       internal->sh_link      = BYTE_GET (shdrs[i].sh_link);
3972       internal->sh_info      = BYTE_GET (shdrs[i].sh_info);
3973       internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
3974       internal->sh_entsize   = BYTE_GET (shdrs[i].sh_entsize);
3975     }
3976
3977   free (shdrs);
3978
3979   return 1;
3980 }
3981
3982 static int
3983 get_64bit_section_headers (FILE * file, unsigned int num)
3984 {
3985   Elf64_External_Shdr * shdrs;
3986   Elf_Internal_Shdr *   internal;
3987   unsigned int i;
3988
3989   shdrs = (Elf64_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
3990                                             elf_header.e_shentsize, num,
3991                                             _("section headers"));
3992   if (!shdrs)
3993     return 0;
3994
3995   section_headers = (Elf_Internal_Shdr *) cmalloc (num,
3996                                                    sizeof (Elf_Internal_Shdr));
3997
3998   if (section_headers == NULL)
3999     {
4000       error (_("Out of memory\n"));
4001       return 0;
4002     }
4003
4004   for (i = 0, internal = section_headers;
4005        i < num;
4006        i++, internal++)
4007     {
4008       internal->sh_name      = BYTE_GET (shdrs[i].sh_name);
4009       internal->sh_type      = BYTE_GET (shdrs[i].sh_type);
4010       internal->sh_flags     = BYTE_GET (shdrs[i].sh_flags);
4011       internal->sh_addr      = BYTE_GET (shdrs[i].sh_addr);
4012       internal->sh_size      = BYTE_GET (shdrs[i].sh_size);
4013       internal->sh_entsize   = BYTE_GET (shdrs[i].sh_entsize);
4014       internal->sh_link      = BYTE_GET (shdrs[i].sh_link);
4015       internal->sh_info      = BYTE_GET (shdrs[i].sh_info);
4016       internal->sh_offset    = BYTE_GET (shdrs[i].sh_offset);
4017       internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
4018     }
4019
4020   free (shdrs);
4021
4022   return 1;
4023 }
4024
4025 static Elf_Internal_Sym *
4026 get_32bit_elf_symbols (FILE * file, Elf_Internal_Shdr * section)
4027 {
4028   unsigned long number;
4029   Elf32_External_Sym * esyms = NULL;
4030   Elf_External_Sym_Shndx * shndx;
4031   Elf_Internal_Sym * isyms = NULL;
4032   Elf_Internal_Sym * psym;
4033   unsigned int j;
4034
4035   /* Run some sanity checks first.  */
4036   if (section->sh_entsize == 0)
4037     {
4038       error (_("sh_entsize is zero\n"));
4039       return NULL;
4040     }
4041
4042   number = section->sh_size / section->sh_entsize;
4043
4044   if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
4045     {
4046       error (_("Invalid sh_entsize\n"));
4047       return NULL;
4048     }
4049
4050   esyms = (Elf32_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
4051                                            section->sh_size, _("symbols"));
4052   if (esyms == NULL)
4053     return NULL;
4054
4055   shndx = NULL;
4056   if (symtab_shndx_hdr != NULL
4057       && (symtab_shndx_hdr->sh_link
4058           == (unsigned long) (section - section_headers)))
4059     {
4060       shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
4061                                                    symtab_shndx_hdr->sh_offset,
4062                                                    1, symtab_shndx_hdr->sh_size,
4063                                                    _("symtab shndx"));
4064       if (shndx == NULL)
4065         goto exit_point;
4066     }
4067
4068   isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
4069
4070   if (isyms == NULL)
4071     {
4072       error (_("Out of memory\n"));
4073       goto exit_point;
4074     }
4075
4076   for (j = 0, psym = isyms; j < number; j++, psym++)
4077     {
4078       psym->st_name  = BYTE_GET (esyms[j].st_name);
4079       psym->st_value = BYTE_GET (esyms[j].st_value);
4080       psym->st_size  = BYTE_GET (esyms[j].st_size);
4081       psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
4082       if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
4083         psym->st_shndx
4084           = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
4085       else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
4086         psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
4087       psym->st_info  = BYTE_GET (esyms[j].st_info);
4088       psym->st_other = BYTE_GET (esyms[j].st_other);
4089     }
4090
4091  exit_point:
4092   if (shndx)
4093     free (shndx);
4094   if (esyms)
4095     free (esyms);
4096
4097   return isyms;
4098 }
4099
4100 static Elf_Internal_Sym *
4101 get_64bit_elf_symbols (FILE * file, Elf_Internal_Shdr * section)
4102 {
4103   unsigned long number;
4104   Elf64_External_Sym * esyms;
4105   Elf_External_Sym_Shndx * shndx;
4106   Elf_Internal_Sym * isyms;
4107   Elf_Internal_Sym * psym;
4108   unsigned int j;
4109
4110   /* Run some sanity checks first.  */
4111   if (section->sh_entsize == 0)
4112     {
4113       error (_("sh_entsize is zero\n"));
4114       return NULL;
4115     }
4116
4117   number = section->sh_size / section->sh_entsize;
4118
4119   if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
4120     {
4121       error (_("Invalid sh_entsize\n"));
4122       return NULL;
4123     }
4124
4125   esyms = (Elf64_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
4126                                            section->sh_size, _("symbols"));
4127   if (!esyms)
4128     return NULL;
4129
4130   shndx = NULL;
4131   if (symtab_shndx_hdr != NULL
4132       && (symtab_shndx_hdr->sh_link
4133           == (unsigned long) (section - section_headers)))
4134     {
4135       shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
4136                                                    symtab_shndx_hdr->sh_offset,
4137                                                    1, symtab_shndx_hdr->sh_size,
4138                                                    _("symtab shndx"));
4139       if (!shndx)
4140         {
4141           free (esyms);
4142           return NULL;
4143         }
4144     }
4145
4146   isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
4147
4148   if (isyms == NULL)
4149     {
4150       error (_("Out of memory\n"));
4151       if (shndx)
4152         free (shndx);
4153       free (esyms);
4154       return NULL;
4155     }
4156
4157   for (j = 0, psym = isyms;
4158        j < number;
4159        j++, psym++)
4160     {
4161       psym->st_name  = BYTE_GET (esyms[j].st_name);
4162       psym->st_info  = BYTE_GET (esyms[j].st_info);
4163       psym->st_other = BYTE_GET (esyms[j].st_other);
4164       psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
4165       if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
4166         psym->st_shndx
4167           = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
4168       else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
4169         psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
4170       psym->st_value = BYTE_GET (esyms[j].st_value);
4171       psym->st_size  = BYTE_GET (esyms[j].st_size);
4172     }
4173
4174   if (shndx)
4175     free (shndx);
4176   free (esyms);
4177
4178   return isyms;
4179 }
4180
4181 static const char *
4182 get_elf_section_flags (bfd_vma sh_flags)
4183 {
4184   static char buff[1024];
4185   char * p = buff;
4186   int field_size = is_32bit_elf ? 8 : 16;
4187   int sindex;
4188   int size = sizeof (buff) - (field_size + 4 + 1);
4189   bfd_vma os_flags = 0;
4190   bfd_vma proc_flags = 0;
4191   bfd_vma unknown_flags = 0;
4192   static const struct
4193     {
4194       const char * str;
4195       int len;
4196     }
4197   flags [] =
4198     {
4199       /*  0 */ { STRING_COMMA_LEN ("WRITE") },
4200       /*  1 */ { STRING_COMMA_LEN ("ALLOC") },
4201       /*  2 */ { STRING_COMMA_LEN ("EXEC") },
4202       /*  3 */ { STRING_COMMA_LEN ("MERGE") },
4203       /*  4 */ { STRING_COMMA_LEN ("STRINGS") },
4204       /*  5 */ { STRING_COMMA_LEN ("INFO LINK") },
4205       /*  6 */ { STRING_COMMA_LEN ("LINK ORDER") },
4206       /*  7 */ { STRING_COMMA_LEN ("OS NONCONF") },
4207       /*  8 */ { STRING_COMMA_LEN ("GROUP") },
4208       /*  9 */ { STRING_COMMA_LEN ("TLS") },
4209       /* IA-64 specific.  */
4210       /* 10 */ { STRING_COMMA_LEN ("SHORT") },
4211       /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
4212       /* IA-64 OpenVMS specific.  */
4213       /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
4214       /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
4215       /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
4216       /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
4217       /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
4218       /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
4219       /* Generic.  */
4220       /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
4221       /* SPARC specific.  */
4222       /* 19 */ { STRING_COMMA_LEN ("ORDERED") }
4223     };
4224
4225   if (do_section_details)
4226     {
4227       sprintf (buff, "[%*.*lx]: ",
4228                field_size, field_size, (unsigned long) sh_flags);
4229       p += field_size + 4;
4230     }
4231
4232   while (sh_flags)
4233     {
4234       bfd_vma flag;
4235
4236       flag = sh_flags & - sh_flags;
4237       sh_flags &= ~ flag;
4238
4239       if (do_section_details)
4240         {
4241           switch (flag)
4242             {
4243             case SHF_WRITE:             sindex = 0; break;
4244             case SHF_ALLOC:             sindex = 1; break;
4245             case SHF_EXECINSTR:         sindex = 2; break;
4246             case SHF_MERGE:             sindex = 3; break;
4247             case SHF_STRINGS:           sindex = 4; break;
4248             case SHF_INFO_LINK:         sindex = 5; break;
4249             case SHF_LINK_ORDER:        sindex = 6; break;
4250             case SHF_OS_NONCONFORMING:  sindex = 7; break;
4251             case SHF_GROUP:             sindex = 8; break;
4252             case SHF_TLS:               sindex = 9; break;
4253             case SHF_EXCLUDE:           sindex = 18; break;
4254
4255             default:
4256               sindex = -1;
4257               switch (elf_header.e_machine)
4258                 {
4259                 case EM_IA_64:
4260                   if (flag == SHF_IA_64_SHORT)
4261                     sindex = 10;
4262                   else if (flag == SHF_IA_64_NORECOV)
4263                     sindex = 11;
4264 #ifdef BFD64
4265                   else if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
4266                     switch (flag)
4267                       {
4268                       case SHF_IA_64_VMS_GLOBAL:      sindex = 12; break;
4269                       case SHF_IA_64_VMS_OVERLAID:    sindex = 13; break;
4270                       case SHF_IA_64_VMS_SHARED:      sindex = 14; break;
4271                       case SHF_IA_64_VMS_VECTOR:      sindex = 15; break;
4272                       case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
4273                       case SHF_IA_64_VMS_PROTECTED:   sindex = 17; break;
4274                       default:                        break;
4275                       }
4276 #endif
4277                   break;
4278
4279                 case EM_386:
4280                 case EM_486:
4281                 case EM_X86_64:
4282                 case EM_L1OM:
4283                 case EM_OLD_SPARCV9:
4284                 case EM_SPARC32PLUS:
4285                 case EM_SPARCV9:
4286                 case EM_SPARC:
4287                   if (flag == SHF_ORDERED)
4288                     sindex = 19;
4289                   break;
4290                 default:
4291                   break;
4292                 }
4293             }
4294
4295           if (sindex != -1)
4296             {
4297               if (p != buff + field_size + 4)
4298                 {
4299                   if (size < (10 + 2))
4300                     abort ();
4301                   size -= 2;
4302                   *p++ = ',';
4303                   *p++ = ' ';
4304                 }
4305
4306               size -= flags [sindex].len;
4307               p = stpcpy (p, flags [sindex].str);
4308             }
4309           else if (flag & SHF_MASKOS)
4310             os_flags |= flag;
4311           else if (flag & SHF_MASKPROC)
4312             proc_flags |= flag;
4313           else
4314             unknown_flags |= flag;
4315         }
4316       else
4317         {
4318           switch (flag)
4319             {
4320             case SHF_WRITE:             *p = 'W'; break;
4321             case SHF_ALLOC:             *p = 'A'; break;
4322             case SHF_EXECINSTR:         *p = 'X'; break;
4323             case SHF_MERGE:             *p = 'M'; break;
4324             case SHF_STRINGS:           *p = 'S'; break;
4325             case SHF_INFO_LINK:         *p = 'I'; break;
4326             case SHF_LINK_ORDER:        *p = 'L'; break;
4327             case SHF_OS_NONCONFORMING:  *p = 'O'; break;
4328             case SHF_GROUP:             *p = 'G'; break;
4329             case SHF_TLS:               *p = 'T'; break;
4330             case SHF_EXCLUDE:           *p = 'E'; break;
4331
4332             default:
4333               if ((elf_header.e_machine == EM_X86_64
4334                    || elf_header.e_machine == EM_L1OM)
4335                   && flag == SHF_X86_64_LARGE)
4336                 *p = 'l';
4337               else if (flag & SHF_MASKOS)
4338                 {
4339                   *p = 'o';
4340                   sh_flags &= ~ SHF_MASKOS;
4341                 }
4342               else if (flag & SHF_MASKPROC)
4343                 {
4344                   *p = 'p';
4345                   sh_flags &= ~ SHF_MASKPROC;
4346                 }
4347               else
4348                 *p = 'x';
4349               break;
4350             }
4351           p++;
4352         }
4353     }
4354
4355   if (do_section_details)
4356     {
4357       if (os_flags)
4358         {
4359           size -= 5 + field_size;
4360           if (p != buff + field_size + 4)
4361             {
4362               if (size < (2 + 1))
4363                 abort ();
4364               size -= 2;
4365               *p++ = ',';
4366               *p++ = ' ';
4367             }
4368           sprintf (p, "OS (%*.*lx)", field_size, field_size,
4369                    (unsigned long) os_flags);
4370           p += 5 + field_size;
4371         }
4372       if (proc_flags)
4373         {
4374           size -= 7 + field_size;
4375           if (p != buff + field_size + 4)
4376             {
4377               if (size < (2 + 1))
4378                 abort ();
4379               size -= 2;
4380               *p++ = ',';
4381               *p++ = ' ';
4382             }
4383           sprintf (p, "PROC (%*.*lx)", field_size, field_size,
4384                    (unsigned long) proc_flags);
4385           p += 7 + field_size;
4386         }
4387       if (unknown_flags)
4388         {
4389           size -= 10 + field_size;
4390           if (p != buff + field_size + 4)
4391             {
4392               if (size < (2 + 1))
4393                 abort ();
4394               size -= 2;
4395               *p++ = ',';
4396               *p++ = ' ';
4397             }
4398           sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
4399                    (unsigned long) unknown_flags);
4400           p += 10 + field_size;
4401         }
4402     }
4403
4404   *p = '\0';
4405   return buff;
4406 }
4407
4408 static int
4409 process_section_headers (FILE * file)
4410 {
4411   Elf_Internal_Shdr * section;
4412   unsigned int i;
4413
4414   section_headers = NULL;
4415
4416   if (elf_header.e_shnum == 0)
4417     {
4418       /* PR binutils/12467.  */
4419       if (elf_header.e_shoff != 0)
4420         warn (_("possibly corrupt ELF file header - it has a non-zero"
4421                 " section header offset, but no section headers\n"));
4422       else if (do_sections)
4423         printf (_("\nThere are no sections in this file.\n"));
4424
4425       return 1;
4426     }
4427
4428   if (do_sections && !do_header)
4429     printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
4430             elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
4431
4432   if (is_32bit_elf)
4433     {
4434       if (! get_32bit_section_headers (file, elf_header.e_shnum))
4435         return 0;
4436     }
4437   else if (! get_64bit_section_headers (file, elf_header.e_shnum))
4438     return 0;
4439
4440   /* Read in the string table, so that we have names to display.  */
4441   if (elf_header.e_shstrndx != SHN_UNDEF
4442        && elf_header.e_shstrndx < elf_header.e_shnum)
4443     {
4444       section = section_headers + elf_header.e_shstrndx;
4445
4446       if (section->sh_size != 0)
4447         {
4448           string_table = (char *) get_data (NULL, file, section->sh_offset,
4449                                             1, section->sh_size,
4450                                             _("string table"));
4451
4452           string_table_length = string_table != NULL ? section->sh_size : 0;
4453         }
4454     }
4455
4456   /* Scan the sections for the dynamic symbol table
4457      and dynamic string table and debug sections.  */
4458   dynamic_symbols = NULL;
4459   dynamic_strings = NULL;
4460   dynamic_syminfo = NULL;
4461   symtab_shndx_hdr = NULL;
4462
4463   eh_addr_size = is_32bit_elf ? 4 : 8;
4464   switch (elf_header.e_machine)
4465     {
4466     case EM_MIPS:
4467     case EM_MIPS_RS3_LE:
4468       /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
4469          FDE addresses.  However, the ABI also has a semi-official ILP32
4470          variant for which the normal FDE address size rules apply.
4471
4472          GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
4473          section, where XX is the size of longs in bits.  Unfortunately,
4474          earlier compilers provided no way of distinguishing ILP32 objects
4475          from LP64 objects, so if there's any doubt, we should assume that
4476          the official LP64 form is being used.  */
4477       if ((elf_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
4478           && find_section (".gcc_compiled_long32") == NULL)
4479         eh_addr_size = 8;
4480       break;
4481
4482     case EM_H8_300:
4483     case EM_H8_300H:
4484       switch (elf_header.e_flags & EF_H8_MACH)
4485         {
4486         case E_H8_MACH_H8300:
4487         case E_H8_MACH_H8300HN:
4488         case E_H8_MACH_H8300SN:
4489         case E_H8_MACH_H8300SXN:
4490           eh_addr_size = 2;
4491           break;
4492         case E_H8_MACH_H8300H:
4493         case E_H8_MACH_H8300S:
4494         case E_H8_MACH_H8300SX:
4495           eh_addr_size = 4;
4496           break;
4497         }
4498       break;
4499
4500     case EM_M32C_OLD:
4501     case EM_M32C:
4502       switch (elf_header.e_flags & EF_M32C_CPU_MASK)
4503         {
4504         case EF_M32C_CPU_M16C:
4505           eh_addr_size = 2;
4506           break;
4507         }
4508       break;
4509     }
4510
4511 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
4512   do                                                                        \
4513     {                                                                       \
4514       size_t expected_entsize                                               \
4515         = is_32bit_elf ? size32 : size64;                                   \
4516       if (section->sh_entsize != expected_entsize)                          \
4517         error (_("Section %d has invalid sh_entsize %lx (expected %lx)\n"), \
4518                i, (unsigned long int) section->sh_entsize,                  \
4519                (unsigned long int) expected_entsize);                       \
4520       section->sh_entsize = expected_entsize;                               \
4521     }                                                                       \
4522   while (0)
4523 #define CHECK_ENTSIZE(section, i, type) \
4524   CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type),         \
4525                         sizeof (Elf64_External_##type))
4526
4527   for (i = 0, section = section_headers;
4528        i < elf_header.e_shnum;
4529        i++, section++)
4530     {
4531       char * name = SECTION_NAME (section);
4532
4533       if (section->sh_type == SHT_DYNSYM)
4534         {
4535           if (dynamic_symbols != NULL)
4536             {
4537               error (_("File contains multiple dynamic symbol tables\n"));
4538               continue;
4539             }
4540
4541           CHECK_ENTSIZE (section, i, Sym);
4542           num_dynamic_syms = section->sh_size / section->sh_entsize;
4543           dynamic_symbols = GET_ELF_SYMBOLS (file, section);
4544         }
4545       else if (section->sh_type == SHT_STRTAB
4546                && streq (name, ".dynstr"))
4547         {
4548           if (dynamic_strings != NULL)
4549             {
4550               error (_("File contains multiple dynamic string tables\n"));
4551               continue;
4552             }
4553
4554           dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
4555                                                1, section->sh_size,
4556                                                _("dynamic strings"));
4557           dynamic_strings_length = dynamic_strings == NULL ? 0 : section->sh_size;
4558         }
4559       else if (section->sh_type == SHT_SYMTAB_SHNDX)
4560         {
4561           if (symtab_shndx_hdr != NULL)
4562             {
4563               error (_("File contains multiple symtab shndx tables\n"));
4564               continue;
4565             }
4566           symtab_shndx_hdr = section;
4567         }
4568       else if (section->sh_type == SHT_SYMTAB)
4569         CHECK_ENTSIZE (section, i, Sym);
4570       else if (section->sh_type == SHT_GROUP)
4571         CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
4572       else if (section->sh_type == SHT_REL)
4573         CHECK_ENTSIZE (section, i, Rel);
4574       else if (section->sh_type == SHT_RELA)
4575         CHECK_ENTSIZE (section, i, Rela);
4576       else if ((do_debugging || do_debug_info || do_debug_abbrevs
4577                 || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
4578                 || do_debug_aranges || do_debug_frames || do_debug_macinfo
4579                 || do_debug_str || do_debug_loc || do_debug_ranges)
4580                && (const_strneq (name, ".debug_")
4581                    || const_strneq (name, ".zdebug_")))
4582         {
4583           if (name[1] == 'z')
4584             name += sizeof (".zdebug_") - 1;
4585           else
4586             name += sizeof (".debug_") - 1;
4587
4588           if (do_debugging
4589               || (do_debug_info     && streq (name, "info"))
4590               || (do_debug_info     && streq (name, "types"))
4591               || (do_debug_abbrevs  && streq (name, "abbrev"))
4592               || (do_debug_lines    && streq (name, "line"))
4593               || (do_debug_pubnames && streq (name, "pubnames"))
4594               || (do_debug_pubtypes && streq (name, "pubtypes"))
4595               || (do_debug_aranges  && streq (name, "aranges"))
4596               || (do_debug_ranges   && streq (name, "ranges"))
4597               || (do_debug_frames   && streq (name, "frame"))
4598               || (do_debug_macinfo  && streq (name, "macinfo"))
4599               || (do_debug_str      && streq (name, "str"))
4600               || (do_debug_loc      && streq (name, "loc"))
4601               )
4602             request_dump_bynumber (i, DEBUG_DUMP);
4603         }
4604       /* Linkonce section to be combined with .debug_info at link time.  */
4605       else if ((do_debugging || do_debug_info)
4606                && const_strneq (name, ".gnu.linkonce.wi."))
4607         request_dump_bynumber (i, DEBUG_DUMP);
4608       else if (do_debug_frames && streq (name, ".eh_frame"))
4609         request_dump_bynumber (i, DEBUG_DUMP);
4610       else if (do_gdb_index && streq (name, ".gdb_index"))
4611         request_dump_bynumber (i, DEBUG_DUMP);
4612       /* Trace sections for Itanium VMS.  */
4613       else if ((do_debugging || do_trace_info || do_trace_abbrevs
4614                 || do_trace_aranges)
4615                && const_strneq (name, ".trace_"))
4616         {
4617           name += sizeof (".trace_") - 1;
4618
4619           if (do_debugging
4620               || (do_trace_info     && streq (name, "info"))
4621               || (do_trace_abbrevs  && streq (name, "abbrev"))
4622               || (do_trace_aranges  && streq (name, "aranges"))
4623               )
4624             request_dump_bynumber (i, DEBUG_DUMP);
4625         }
4626
4627     }
4628
4629   if (! do_sections)
4630     return 1;
4631
4632   if (elf_header.e_shnum > 1)
4633     printf (_("\nSection Headers:\n"));
4634   else
4635     printf (_("\nSection Header:\n"));
4636
4637   if (is_32bit_elf)
4638     {
4639       if (do_section_details)
4640         {
4641           printf (_("  [Nr] Name\n"));
4642           printf (_("       Type            Addr     Off    Size   ES   Lk Inf Al\n"));
4643         }
4644       else
4645         printf
4646           (_("  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al\n"));
4647     }
4648   else if (do_wide)
4649     {
4650       if (do_section_details)
4651         {
4652           printf (_("  [Nr] Name\n"));
4653           printf (_("       Type            Address          Off    Size   ES   Lk Inf Al\n"));
4654         }
4655       else
4656         printf
4657           (_("  [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al\n"));
4658     }
4659   else
4660     {
4661       if (do_section_details)
4662         {
4663           printf (_("  [Nr] Name\n"));
4664           printf (_("       Type              Address          Offset            Link\n"));
4665           printf (_("       Size              EntSize          Info              Align\n"));
4666         }
4667       else
4668         {
4669           printf (_("  [Nr] Name              Type             Address           Offset\n"));
4670           printf (_("       Size              EntSize          Flags  Link  Info  Align\n"));
4671         }
4672     }
4673
4674   if (do_section_details)
4675     printf (_("       Flags\n"));
4676
4677   for (i = 0, section = section_headers;
4678        i < elf_header.e_shnum;
4679        i++, section++)
4680     {
4681       if (do_section_details)
4682         {
4683           printf ("  [%2u] %s\n",
4684                   i,
4685                   SECTION_NAME (section));
4686           if (is_32bit_elf || do_wide)
4687             printf ("       %-15.15s ",
4688                     get_section_type_name (section->sh_type));
4689         }
4690       else
4691         printf ((do_wide ? "  [%2u] %-17s %-15s "
4692                          : "  [%2u] %-17.17s %-15.15s "),
4693                 i,
4694                 SECTION_NAME (section),
4695                 get_section_type_name (section->sh_type));
4696
4697       if (is_32bit_elf)
4698         {
4699           const char * link_too_big = NULL;
4700
4701           print_vma (section->sh_addr, LONG_HEX);
4702
4703           printf ( " %6.6lx %6.6lx %2.2lx",
4704                    (unsigned long) section->sh_offset,
4705                    (unsigned long) section->sh_size,
4706                    (unsigned long) section->sh_entsize);
4707
4708           if (do_section_details)
4709             fputs ("  ", stdout);
4710           else
4711             printf (" %3s ", get_elf_section_flags (section->sh_flags));
4712
4713           if (section->sh_link >= elf_header.e_shnum)
4714             {
4715               link_too_big = "";
4716               /* The sh_link value is out of range.  Normally this indicates
4717                  an error but it can have special values in Solaris binaries.  */
4718               switch (elf_header.e_machine)
4719                 {
4720                 case EM_386:
4721                 case EM_486:
4722                 case EM_X86_64:
4723                 case EM_L1OM:
4724                 case EM_OLD_SPARCV9:
4725                 case EM_SPARC32PLUS:
4726                 case EM_SPARCV9:
4727                 case EM_SPARC:
4728                   if (section->sh_link == (SHN_BEFORE & 0xffff))
4729                     link_too_big = "BEFORE";
4730                   else if (section->sh_link == (SHN_AFTER & 0xffff))
4731                     link_too_big = "AFTER";
4732                   break;
4733                 default:
4734                   break;
4735                 }
4736             }
4737
4738           if (do_section_details)
4739             {
4740               if (link_too_big != NULL && * link_too_big)
4741                 printf ("<%s> ", link_too_big);
4742               else
4743                 printf ("%2u ", section->sh_link);
4744               printf ("%3u %2lu\n", section->sh_info,
4745                       (unsigned long) section->sh_addralign);
4746             }
4747           else
4748             printf ("%2u %3u %2lu\n",
4749                     section->sh_link,
4750                     section->sh_info,
4751                     (unsigned long) section->sh_addralign);
4752
4753           if (link_too_big && ! * link_too_big)
4754             warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
4755                   i, section->sh_link);
4756         }
4757       else if (do_wide)
4758         {
4759           print_vma (section->sh_addr, LONG_HEX);
4760
4761           if ((long) section->sh_offset == section->sh_offset)
4762             printf (" %6.6lx", (unsigned long) section->sh_offset);
4763           else
4764             {
4765               putchar (' ');
4766               print_vma (section->sh_offset, LONG_HEX);
4767             }
4768
4769           if ((unsigned long) section->sh_size == section->sh_size)
4770             printf (" %6.6lx", (unsigned long) section->sh_size);
4771           else
4772             {
4773               putchar (' ');
4774               print_vma (section->sh_size, LONG_HEX);
4775             }
4776
4777           if ((unsigned long) section->sh_entsize == section->sh_entsize)
4778             printf (" %2.2lx", (unsigned long) section->sh_entsize);
4779           else
4780             {
4781               putchar (' ');
4782               print_vma (section->sh_entsize, LONG_HEX);
4783             }
4784
4785           if (do_section_details)
4786             fputs ("  ", stdout);
4787           else
4788             printf (" %3s ", get_elf_section_flags (section->sh_flags));
4789
4790           printf ("%2u %3u ", section->sh_link, section->sh_info);
4791
4792           if ((unsigned long) section->sh_addralign == section->sh_addralign)
4793             printf ("%2lu\n", (unsigned long) section->sh_addralign);
4794           else
4795             {
4796               print_vma (section->sh_addralign, DEC);
4797               putchar ('\n');
4798             }
4799         }
4800       else if (do_section_details)
4801         {
4802           printf ("       %-15.15s  ",
4803                   get_section_type_name (section->sh_type));
4804           print_vma (section->sh_addr, LONG_HEX);
4805           if ((long) section->sh_offset == section->sh_offset)
4806             printf ("  %16.16lx", (unsigned long) section->sh_offset);
4807           else
4808             {
4809               printf ("  ");
4810               print_vma (section->sh_offset, LONG_HEX);
4811             }
4812           printf ("  %u\n       ", section->sh_link);
4813           print_vma (section->sh_size, LONG_HEX);
4814           putchar (' ');
4815           print_vma (section->sh_entsize, LONG_HEX);
4816
4817           printf ("  %-16u  %lu\n",
4818                   section->sh_info,
4819                   (unsigned long) section->sh_addralign);
4820         }
4821       else
4822         {
4823           putchar (' ');
4824           print_vma (section->sh_addr, LONG_HEX);
4825           if ((long) section->sh_offset == section->sh_offset)
4826             printf ("  %8.8lx", (unsigned long) section->sh_offset);
4827           else
4828             {
4829               printf ("  ");
4830               print_vma (section->sh_offset, LONG_HEX);
4831             }
4832           printf ("\n       ");
4833           print_vma (section->sh_size, LONG_HEX);
4834           printf ("  ");
4835           print_vma (section->sh_entsize, LONG_HEX);
4836
4837           printf (" %3s ", get_elf_section_flags (section->sh_flags));
4838
4839           printf ("     %2u   %3u     %lu\n",
4840                   section->sh_link,
4841                   section->sh_info,
4842                   (unsigned long) section->sh_addralign);
4843         }
4844
4845       if (do_section_details)
4846         printf ("       %s\n", get_elf_section_flags (section->sh_flags));
4847     }
4848
4849   if (!do_section_details)
4850     {
4851       if (elf_header.e_machine == EM_X86_64
4852           || elf_header.e_machine == EM_L1OM)
4853         printf (_("Key to Flags:\n\
4854   W (write), A (alloc), X (execute), M (merge), S (strings), l (large)\n\
4855   I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)\n\
4856   O (extra OS processing required) o (OS specific), p (processor specific)\n"));
4857       else
4858         printf (_("Key to Flags:\n\
4859   W (write), A (alloc), X (execute), M (merge), S (strings)\n\
4860   I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)\n\
4861   O (extra OS processing required) o (OS specific), p (processor specific)\n"));
4862     }   
4863
4864   return 1;
4865 }
4866
4867 static const char *
4868 get_group_flags (unsigned int flags)
4869 {
4870   static char buff[32];
4871   switch (flags)
4872     {
4873     case 0:
4874       return "";
4875
4876     case GRP_COMDAT:
4877       return "COMDAT ";
4878
4879    default:
4880       snprintf (buff, sizeof (buff), _("[<unknown>: 0x%x] "), flags);
4881       break;
4882     }
4883   return buff;
4884 }
4885
4886 static int
4887 process_section_groups (FILE * file)
4888 {
4889   Elf_Internal_Shdr * section;
4890   unsigned int i;
4891   struct group * group;
4892   Elf_Internal_Shdr * symtab_sec;
4893   Elf_Internal_Shdr * strtab_sec;
4894   Elf_Internal_Sym * symtab;
4895   char * strtab;
4896   size_t strtab_size;
4897
4898   /* Don't process section groups unless needed.  */
4899   if (!do_unwind && !do_section_groups)
4900     return 1;
4901
4902   if (elf_header.e_shnum == 0)
4903     {
4904       if (do_section_groups)
4905         printf (_("\nThere are no sections to group in this file.\n"));
4906
4907       return 1;
4908     }
4909
4910   if (section_headers == NULL)
4911     {
4912       error (_("Section headers are not available!\n"));
4913       abort ();
4914     }
4915
4916   section_headers_groups = (struct group **) calloc (elf_header.e_shnum,
4917                                                      sizeof (struct group *));
4918
4919   if (section_headers_groups == NULL)
4920     {
4921       error (_("Out of memory\n"));
4922       return 0;
4923     }
4924
4925   /* Scan the sections for the group section.  */
4926   group_count = 0;
4927   for (i = 0, section = section_headers;
4928        i < elf_header.e_shnum;
4929        i++, section++)
4930     if (section->sh_type == SHT_GROUP)
4931       group_count++;
4932
4933   if (group_count == 0)
4934     {
4935       if (do_section_groups)
4936         printf (_("\nThere are no section groups in this file.\n"));
4937
4938       return 1;
4939     }
4940
4941   section_groups = (struct group *) calloc (group_count, sizeof (struct group));
4942
4943   if (section_groups == NULL)
4944     {
4945       error (_("Out of memory\n"));
4946       return 0;
4947     }
4948
4949   symtab_sec = NULL;
4950   strtab_sec = NULL;
4951   symtab = NULL;
4952   strtab = NULL;
4953   strtab_size = 0;
4954   for (i = 0, section = section_headers, group = section_groups;
4955        i < elf_header.e_shnum;
4956        i++, section++)
4957     {
4958       if (section->sh_type == SHT_GROUP)
4959         {
4960           char * name = SECTION_NAME (section);
4961           char * group_name;
4962           unsigned char * start;
4963           unsigned char * indices;
4964           unsigned int entry, j, size;
4965           Elf_Internal_Shdr * sec;
4966           Elf_Internal_Sym * sym;
4967
4968           /* Get the symbol table.  */
4969           if (section->sh_link >= elf_header.e_shnum
4970               || ((sec = section_headers + section->sh_link)->sh_type
4971                   != SHT_SYMTAB))
4972             {
4973               error (_("Bad sh_link in group section `%s'\n"), name);
4974               continue;
4975             }
4976
4977           if (symtab_sec != sec)
4978             {
4979               symtab_sec = sec;
4980               if (symtab)
4981                 free (symtab);
4982               symtab = GET_ELF_SYMBOLS (file, symtab_sec);
4983             }
4984
4985           if (symtab == NULL)
4986             {
4987               error (_("Corrupt header in group section `%s'\n"), name);
4988               continue;
4989             }
4990
4991           sym = symtab + section->sh_info;
4992
4993           if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
4994             {
4995               if (sym->st_shndx == 0
4996                   || sym->st_shndx >= elf_header.e_shnum)
4997                 {
4998                   error (_("Bad sh_info in group section `%s'\n"), name);
4999                   continue;
5000                 }
5001
5002               group_name = SECTION_NAME (section_headers + sym->st_shndx);
5003               strtab_sec = NULL;
5004               if (strtab)
5005                 free (strtab);
5006               strtab = NULL;
5007               strtab_size = 0;
5008             }
5009           else
5010             {
5011               /* Get the string table.  */
5012               if (symtab_sec->sh_link >= elf_header.e_shnum)
5013                 {
5014                   strtab_sec = NULL;
5015                   if (strtab)
5016                     free (strtab);
5017                   strtab = NULL;
5018                   strtab_size = 0;
5019                 }
5020               else if (strtab_sec
5021                        != (sec = section_headers + symtab_sec->sh_link))
5022                 {
5023                   strtab_sec = sec;
5024                   if (strtab)
5025                     free (strtab);
5026                   strtab = (char *) get_data (NULL, file, strtab_sec->sh_offset,
5027                                               1, strtab_sec->sh_size,
5028                                               _("string table"));
5029                   strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
5030                 }
5031               group_name = sym->st_name < strtab_size
5032                 ? strtab + sym->st_name : _("<corrupt>");
5033             }
5034
5035           start = (unsigned char *) get_data (NULL, file, section->sh_offset,
5036                                               1, section->sh_size,
5037                                               _("section data"));
5038           if (start == NULL)
5039             continue;
5040
5041           indices = start;
5042           size = (section->sh_size / section->sh_entsize) - 1;
5043           entry = byte_get (indices, 4);
5044           indices += 4;
5045
5046           if (do_section_groups)
5047             {
5048               printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
5049                       get_group_flags (entry), i, name, group_name, size);
5050
5051               printf (_("   [Index]    Name\n"));
5052             }
5053
5054           group->group_index = i;
5055
5056           for (j = 0; j < size; j++)
5057             {
5058               struct group_list * g;
5059
5060               entry = byte_get (indices, 4);
5061               indices += 4;
5062
5063               if (entry >= elf_header.e_shnum)
5064                 {
5065                   error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
5066                          entry, i, elf_header.e_shnum - 1);
5067                   continue;
5068                 }
5069
5070               if (section_headers_groups [entry] != NULL)
5071                 {
5072                   if (entry)
5073                     {
5074                       error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
5075                              entry, i,
5076                              section_headers_groups [entry]->group_index);
5077                       continue;
5078                     }
5079                   else
5080                     {
5081                       /* Intel C/C++ compiler may put section 0 in a
5082                          section group. We just warn it the first time
5083                          and ignore it afterwards.  */
5084                       static int warned = 0;
5085                       if (!warned)
5086                         {
5087                           error (_("section 0 in group section [%5u]\n"),
5088                                  section_headers_groups [entry]->group_index);
5089                           warned++;
5090                         }
5091                     }
5092                 }
5093
5094               section_headers_groups [entry] = group;
5095
5096               if (do_section_groups)
5097                 {
5098                   sec = section_headers + entry;
5099                   printf ("   [%5u]   %s\n", entry, SECTION_NAME (sec));
5100                 }
5101
5102               g = (struct group_list *) xmalloc (sizeof (struct group_list));
5103               g->section_index = entry;
5104               g->next = group->root;
5105               group->root = g;
5106             }
5107
5108           if (start)
5109             free (start);
5110
5111           group++;
5112         }
5113     }
5114
5115   if (symtab)
5116     free (symtab);
5117   if (strtab)
5118     free (strtab);
5119   return 1;
5120 }
5121
5122 /* Data used to display dynamic fixups.  */
5123
5124 struct ia64_vms_dynfixup
5125 {
5126   bfd_vma needed_ident;         /* Library ident number.  */
5127   bfd_vma needed;               /* Index in the dstrtab of the library name.  */
5128   bfd_vma fixup_needed;         /* Index of the library.  */
5129   bfd_vma fixup_rela_cnt;       /* Number of fixups.  */
5130   bfd_vma fixup_rela_off;       /* Fixups offset in the dynamic segment.  */
5131 };
5132
5133 /* Data used to display dynamic relocations.  */
5134
5135 struct ia64_vms_dynimgrela
5136 {
5137   bfd_vma img_rela_cnt;         /* Number of relocations.  */
5138   bfd_vma img_rela_off;         /* Reloc offset in the dynamic segment.  */
5139 };
5140
5141 /* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
5142    library).  */
5143
5144 static void
5145 dump_ia64_vms_dynamic_fixups (FILE *file, struct ia64_vms_dynfixup *fixup,
5146                               const char *strtab, unsigned int strtab_sz)
5147 {
5148   Elf64_External_VMS_IMAGE_FIXUP *imfs;
5149   long i;
5150   const char *lib_name;
5151
5152   imfs = get_data (NULL, file, dynamic_addr + fixup->fixup_rela_off,
5153                    1, fixup->fixup_rela_cnt * sizeof (*imfs),
5154                    _("dynamic section image fixups"));
5155   if (!imfs)
5156     return;
5157
5158   if (fixup->needed < strtab_sz)
5159     lib_name = strtab + fixup->needed;
5160   else
5161     {
5162       warn ("corrupt library name index of 0x%lx found in dynamic entry",
5163             (unsigned long) fixup->needed);
5164       lib_name = "???";
5165     }
5166   printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
5167           (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
5168   printf
5169     (_("Seg Offset           Type                             SymVec DataType\n"));
5170
5171   for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
5172     {
5173       unsigned int type;
5174       const char *rtype;
5175
5176       printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
5177       printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
5178       type = BYTE_GET (imfs [i].type);
5179       rtype = elf_ia64_reloc_type (type);
5180       if (rtype == NULL)
5181         printf (" 0x%08x                       ", type);
5182       else
5183         printf (" %-32s ", rtype);
5184       printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
5185       printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
5186     }
5187
5188   free (imfs);
5189 }
5190
5191 /* Display IA-64 OpenVMS dynamic relocations (used to relocate an image).  */
5192
5193 static void
5194 dump_ia64_vms_dynamic_relocs (FILE *file, struct ia64_vms_dynimgrela *imgrela)
5195 {
5196   Elf64_External_VMS_IMAGE_RELA *imrs;
5197   long i;
5198
5199   imrs = get_data (NULL, file, dynamic_addr + imgrela->img_rela_off,
5200                    1, imgrela->img_rela_cnt * sizeof (*imrs),
5201                    _("dynamic section image relas"));
5202   if (!imrs)
5203     return;
5204
5205   printf (_("\nImage relocs\n"));
5206   printf
5207     (_("Seg Offset   Type                            Addend            Seg Sym Off\n"));
5208
5209   for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
5210     {
5211       unsigned int type;
5212       const char *rtype;
5213
5214       printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
5215       printf ("%08" BFD_VMA_FMT "x ",
5216               (bfd_vma) BYTE_GET (imrs [i].rela_offset));
5217       type = BYTE_GET (imrs [i].type);
5218       rtype = elf_ia64_reloc_type (type);
5219       if (rtype == NULL)
5220         printf ("0x%08x                      ", type);
5221       else
5222         printf ("%-31s ", rtype);
5223       print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
5224       printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
5225       printf ("%08" BFD_VMA_FMT "x\n",
5226               (bfd_vma) BYTE_GET (imrs [i].sym_offset));
5227     }
5228
5229   free (imrs);
5230 }
5231
5232 /* Display IA-64 OpenVMS dynamic relocations and fixups.  */
5233
5234 static int
5235 process_ia64_vms_dynamic_relocs (FILE *file)
5236 {
5237   struct ia64_vms_dynfixup fixup;
5238   struct ia64_vms_dynimgrela imgrela;
5239   Elf_Internal_Dyn *entry;
5240   int res = 0;
5241   bfd_vma strtab_off = 0;
5242   bfd_vma strtab_sz = 0;
5243   char *strtab = NULL;
5244
5245   memset (&fixup, 0, sizeof (fixup));
5246   memset (&imgrela, 0, sizeof (imgrela));
5247
5248   /* Note: the order of the entries is specified by the OpenVMS specs.  */
5249   for (entry = dynamic_section;
5250        entry < dynamic_section + dynamic_nent;
5251        entry++)
5252     {
5253       switch (entry->d_tag)
5254         {
5255         case DT_IA_64_VMS_STRTAB_OFFSET:
5256           strtab_off = entry->d_un.d_val;
5257           break;
5258         case DT_STRSZ:
5259           strtab_sz = entry->d_un.d_val;
5260           if (strtab == NULL)
5261             strtab = get_data (NULL, file, dynamic_addr + strtab_off,
5262                                1, strtab_sz, _("dynamic string section"));
5263           break;
5264
5265         case DT_IA_64_VMS_NEEDED_IDENT:
5266           fixup.needed_ident = entry->d_un.d_val;
5267           break;
5268         case DT_NEEDED:
5269           fixup.needed = entry->d_un.d_val;
5270           break;
5271         case DT_IA_64_VMS_FIXUP_NEEDED:
5272           fixup.fixup_needed = entry->d_un.d_val;
5273           break;
5274         case DT_IA_64_VMS_FIXUP_RELA_CNT:
5275           fixup.fixup_rela_cnt = entry->d_un.d_val;
5276           break;
5277         case DT_IA_64_VMS_FIXUP_RELA_OFF:
5278           fixup.fixup_rela_off = entry->d_un.d_val;
5279           res++;
5280           dump_ia64_vms_dynamic_fixups (file, &fixup, strtab, strtab_sz);
5281           break;
5282
5283         case DT_IA_64_VMS_IMG_RELA_CNT:
5284           imgrela.img_rela_cnt = entry->d_un.d_val;
5285           break;
5286         case DT_IA_64_VMS_IMG_RELA_OFF:
5287           imgrela.img_rela_off = entry->d_un.d_val;
5288           res++;
5289           dump_ia64_vms_dynamic_relocs (file, &imgrela);
5290           break;
5291
5292         default:
5293           break;
5294         }
5295     }
5296
5297   if (strtab != NULL)
5298     free (strtab);
5299
5300   return res;
5301 }
5302
5303 static struct
5304 {
5305   const char * name;
5306   int reloc;
5307   int size;
5308   int rela;
5309 } dynamic_relocations [] =
5310 {
5311     { "REL", DT_REL, DT_RELSZ, FALSE },
5312     { "RELA", DT_RELA, DT_RELASZ, TRUE },
5313     { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
5314 };
5315
5316 /* Process the reloc section.  */
5317
5318 static int
5319 process_relocs (FILE * file)
5320 {
5321   unsigned long rel_size;
5322   unsigned long rel_offset;
5323
5324
5325   if (!do_reloc)
5326     return 1;
5327
5328   if (do_using_dynamic)
5329     {
5330       int is_rela;
5331       const char * name;
5332       int has_dynamic_reloc;
5333       unsigned int i;
5334
5335       has_dynamic_reloc = 0;
5336
5337       for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
5338         {
5339           is_rela = dynamic_relocations [i].rela;
5340           name = dynamic_relocations [i].name;
5341           rel_size = dynamic_info [dynamic_relocations [i].size];
5342           rel_offset = dynamic_info [dynamic_relocations [i].reloc];
5343
5344           has_dynamic_reloc |= rel_size;
5345
5346           if (is_rela == UNKNOWN)
5347             {
5348               if (dynamic_relocations [i].reloc == DT_JMPREL)
5349                 switch (dynamic_info[DT_PLTREL])
5350                   {
5351                   case DT_REL:
5352                     is_rela = FALSE;
5353                     break;
5354                   case DT_RELA:
5355                     is_rela = TRUE;
5356                     break;
5357                   }
5358             }
5359
5360           if (rel_size)
5361             {
5362               printf
5363                 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
5364                  name, rel_offset, rel_size);
5365
5366               dump_relocations (file,
5367                                 offset_from_vma (file, rel_offset, rel_size),
5368                                 rel_size,
5369                                 dynamic_symbols, num_dynamic_syms,
5370                                 dynamic_strings, dynamic_strings_length, is_rela);
5371             }
5372         }
5373
5374       if (is_ia64_vms ())
5375         has_dynamic_reloc |= process_ia64_vms_dynamic_relocs (file);
5376
5377       if (! has_dynamic_reloc)
5378         printf (_("\nThere are no dynamic relocations in this file.\n"));
5379     }
5380   else
5381     {
5382       Elf_Internal_Shdr * section;
5383       unsigned long i;
5384       int found = 0;
5385
5386       for (i = 0, section = section_headers;
5387            i < elf_header.e_shnum;
5388            i++, section++)
5389         {
5390           if (   section->sh_type != SHT_RELA
5391               && section->sh_type != SHT_REL)
5392             continue;
5393
5394           rel_offset = section->sh_offset;
5395           rel_size   = section->sh_size;
5396
5397           if (rel_size)
5398             {
5399               Elf_Internal_Shdr * strsec;
5400               int is_rela;
5401
5402               printf (_("\nRelocation section "));
5403
5404               if (string_table == NULL)
5405                 printf ("%d", section->sh_name);
5406               else
5407                 printf (_("'%s'"), SECTION_NAME (section));
5408
5409               printf (_(" at offset 0x%lx contains %lu entries:\n"),
5410                  rel_offset, (unsigned long) (rel_size / section->sh_entsize));
5411
5412               is_rela = section->sh_type == SHT_RELA;
5413
5414               if (section->sh_link != 0
5415                   && section->sh_link < elf_header.e_shnum)
5416                 {
5417                   Elf_Internal_Shdr * symsec;
5418                   Elf_Internal_Sym *  symtab;
5419                   unsigned long nsyms;
5420                   unsigned long strtablen = 0;
5421                   char * strtab = NULL;
5422
5423                   symsec = section_headers + section->sh_link;
5424                   if (symsec->sh_type != SHT_SYMTAB
5425                       && symsec->sh_type != SHT_DYNSYM)
5426                     continue;
5427
5428                   nsyms = symsec->sh_size / symsec->sh_entsize;
5429                   symtab = GET_ELF_SYMBOLS (file, symsec);
5430
5431                   if (symtab == NULL)
5432                     continue;
5433
5434                   if (symsec->sh_link != 0
5435                       && symsec->sh_link < elf_header.e_shnum)
5436                     {
5437                       strsec = section_headers + symsec->sh_link;
5438
5439                       strtab = (char *) get_data (NULL, file, strsec->sh_offset,
5440                                                   1, strsec->sh_size,
5441                                                   _("string table"));
5442                       strtablen = strtab == NULL ? 0 : strsec->sh_size;
5443                     }
5444
5445                   dump_relocations (file, rel_offset, rel_size,
5446                                     symtab, nsyms, strtab, strtablen, is_rela);
5447                   if (strtab)
5448                     free (strtab);
5449                   free (symtab);
5450                 }
5451               else
5452                 dump_relocations (file, rel_offset, rel_size,
5453                                   NULL, 0, NULL, 0, is_rela);
5454
5455               found = 1;
5456             }
5457         }
5458
5459       if (! found)
5460         printf (_("\nThere are no relocations in this file.\n"));
5461     }
5462
5463   return 1;
5464 }
5465
5466 /* Process the unwind section.  */
5467
5468 #include "unwind-ia64.h"
5469
5470 /* An absolute address consists of a section and an offset.  If the
5471    section is NULL, the offset itself is the address, otherwise, the
5472    address equals to LOAD_ADDRESS(section) + offset.  */
5473
5474 struct absaddr
5475   {
5476     unsigned short section;
5477     bfd_vma offset;
5478   };
5479
5480 #define ABSADDR(a) \
5481   ((a).section \
5482    ? section_headers [(a).section].sh_addr + (a).offset \
5483    : (a).offset)
5484
5485 struct ia64_unw_table_entry
5486   {
5487     struct absaddr start;
5488     struct absaddr end;
5489     struct absaddr info;
5490   };
5491
5492 struct ia64_unw_aux_info
5493   {
5494
5495     struct ia64_unw_table_entry *table; /* Unwind table.  */
5496     unsigned long table_len;    /* Length of unwind table.  */
5497     unsigned char * info;       /* Unwind info.  */
5498     unsigned long info_size;    /* Size of unwind info.  */
5499     bfd_vma info_addr;          /* starting address of unwind info.  */
5500     bfd_vma seg_base;           /* Starting address of segment.  */
5501     Elf_Internal_Sym * symtab;  /* The symbol table.  */
5502     unsigned long nsyms;        /* Number of symbols.  */
5503     char * strtab;              /* The string table.  */
5504     unsigned long strtab_size;  /* Size of string table.  */
5505   };
5506
5507 static void
5508 find_symbol_for_address (Elf_Internal_Sym * symtab,
5509                          unsigned long nsyms,
5510                          const char * strtab,
5511                          unsigned long strtab_size,
5512                          struct absaddr addr,
5513                          const char ** symname,
5514                          bfd_vma * offset)
5515 {
5516   bfd_vma dist = 0x100000;
5517   Elf_Internal_Sym * sym;
5518   Elf_Internal_Sym * best = NULL;
5519   unsigned long i;
5520
5521   REMOVE_ARCH_BITS (addr.offset);
5522
5523   for (i = 0, sym = symtab; i < nsyms; ++i, ++sym)
5524     {
5525       bfd_vma value = sym->st_value;
5526
5527       REMOVE_ARCH_BITS (value);
5528
5529       if (ELF_ST_TYPE (sym->st_info) == STT_FUNC
5530           && sym->st_name != 0
5531           && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
5532           && addr.offset >= value
5533           && addr.offset - value < dist)
5534         {
5535           best = sym;
5536           dist = addr.offset - value;
5537           if (!dist)
5538             break;
5539         }
5540     }
5541   if (best)
5542     {
5543       *symname = (best->st_name >= strtab_size
5544                   ? _("<corrupt>") : strtab + best->st_name);
5545       *offset = dist;
5546       return;
5547     }
5548   *symname = NULL;
5549   *offset = addr.offset;
5550 }
5551
5552 static void
5553 dump_ia64_unwind (struct ia64_unw_aux_info * aux)
5554 {
5555   struct ia64_unw_table_entry * tp;
5556   int in_body;
5557
5558   for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
5559     {
5560       bfd_vma stamp;
5561       bfd_vma offset;
5562       const unsigned char * dp;
5563       const unsigned char * head;
5564       const char * procname;
5565
5566       find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
5567                                aux->strtab_size, tp->start, &procname, &offset);
5568
5569       fputs ("\n<", stdout);
5570
5571       if (procname)
5572         {
5573           fputs (procname, stdout);
5574
5575           if (offset)
5576             printf ("+%lx", (unsigned long) offset);
5577         }
5578
5579       fputs (">: [", stdout);
5580       print_vma (tp->start.offset, PREFIX_HEX);
5581       fputc ('-', stdout);
5582       print_vma (tp->end.offset, PREFIX_HEX);
5583       printf ("], info at +0x%lx\n",
5584               (unsigned long) (tp->info.offset - aux->seg_base));
5585
5586       head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
5587       stamp = byte_get ((unsigned char *) head, sizeof (stamp));
5588
5589       printf ("  v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
5590               (unsigned) UNW_VER (stamp),
5591               (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
5592               UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
5593               UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
5594               (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
5595
5596       if (UNW_VER (stamp) != 1)
5597         {
5598           printf (_("\tUnknown version.\n"));
5599           continue;
5600         }
5601
5602       in_body = 0;
5603       for (dp = head + 8; dp < head + 8 + eh_addr_size * UNW_LENGTH (stamp);)
5604         dp = unw_decode (dp, in_body, & in_body);
5605     }
5606 }
5607
5608 static int
5609 slurp_ia64_unwind_table (FILE * file,
5610                          struct ia64_unw_aux_info * aux,
5611                          Elf_Internal_Shdr * sec)
5612 {
5613   unsigned long size, nrelas, i;
5614   Elf_Internal_Phdr * seg;
5615   struct ia64_unw_table_entry * tep;
5616   Elf_Internal_Shdr * relsec;
5617   Elf_Internal_Rela * rela;
5618   Elf_Internal_Rela * rp;
5619   unsigned char * table;
5620   unsigned char * tp;
5621   Elf_Internal_Sym * sym;
5622   const char * relname;
5623
5624   /* First, find the starting address of the segment that includes
5625      this section: */
5626
5627   if (elf_header.e_phnum)
5628     {
5629       if (! get_program_headers (file))
5630           return 0;
5631
5632       for (seg = program_headers;
5633            seg < program_headers + elf_header.e_phnum;
5634            ++seg)
5635         {
5636           if (seg->p_type != PT_LOAD)
5637             continue;
5638
5639           if (sec->sh_addr >= seg->p_vaddr
5640               && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
5641             {
5642               aux->seg_base = seg->p_vaddr;
5643               break;
5644             }
5645         }
5646     }
5647
5648   /* Second, build the unwind table from the contents of the unwind section:  */
5649   size = sec->sh_size;
5650   table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
5651                                       _("unwind table"));
5652   if (!table)
5653     return 0;
5654
5655   aux->table = (struct ia64_unw_table_entry *)
5656       xcmalloc (size / (3 * eh_addr_size), sizeof (aux->table[0]));
5657   tep = aux->table;
5658   for (tp = table; tp < table + size; ++tep)
5659     {
5660       tep->start.section = SHN_UNDEF;
5661       tep->end.section   = SHN_UNDEF;
5662       tep->info.section  = SHN_UNDEF;
5663       tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
5664       tep->end.offset   = byte_get (tp, eh_addr_size); tp += eh_addr_size;
5665       tep->info.offset  = byte_get (tp, eh_addr_size); tp += eh_addr_size;
5666       tep->start.offset += aux->seg_base;
5667       tep->end.offset   += aux->seg_base;
5668       tep->info.offset  += aux->seg_base;
5669     }
5670   free (table);
5671
5672   /* Third, apply any relocations to the unwind table:  */
5673   for (relsec = section_headers;
5674        relsec < section_headers + elf_header.e_shnum;
5675        ++relsec)
5676     {
5677       if (relsec->sh_type != SHT_RELA
5678           || relsec->sh_info >= elf_header.e_shnum
5679           || section_headers + relsec->sh_info != sec)
5680         continue;
5681
5682       if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
5683                               & rela, & nrelas))
5684         return 0;
5685
5686       for (rp = rela; rp < rela + nrelas; ++rp)
5687         {
5688           relname = elf_ia64_reloc_type (get_reloc_type (rp->r_info));
5689           sym = aux->symtab + get_reloc_symindex (rp->r_info);
5690
5691           if (! const_strneq (relname, "R_IA64_SEGREL"))
5692             {
5693               warn (_("Skipping unexpected relocation type %s\n"), relname);
5694               continue;
5695             }
5696
5697           i = rp->r_offset / (3 * eh_addr_size);
5698
5699           switch (rp->r_offset/eh_addr_size % 3)
5700             {
5701             case 0:
5702               aux->table[i].start.section = sym->st_shndx;
5703               aux->table[i].start.offset  = rp->r_addend + sym->st_value;
5704               break;
5705             case 1:
5706               aux->table[i].end.section   = sym->st_shndx;
5707               aux->table[i].end.offset    = rp->r_addend + sym->st_value;
5708               break;
5709             case 2:
5710               aux->table[i].info.section  = sym->st_shndx;
5711               aux->table[i].info.offset   = rp->r_addend + sym->st_value;
5712               break;
5713             default:
5714               break;
5715             }
5716         }
5717
5718       free (rela);
5719     }
5720
5721   aux->table_len = size / (3 * eh_addr_size);
5722   return 1;
5723 }
5724
5725 static int
5726 ia64_process_unwind (FILE * file)
5727 {
5728   Elf_Internal_Shdr * sec;
5729   Elf_Internal_Shdr * unwsec = NULL;
5730   Elf_Internal_Shdr * strsec;
5731   unsigned long i, unwcount = 0, unwstart = 0;
5732   struct ia64_unw_aux_info aux;
5733
5734   memset (& aux, 0, sizeof (aux));
5735
5736   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
5737     {
5738       if (sec->sh_type == SHT_SYMTAB
5739           && sec->sh_link < elf_header.e_shnum)
5740         {
5741           aux.nsyms = sec->sh_size / sec->sh_entsize;
5742           aux.symtab = GET_ELF_SYMBOLS (file, sec);
5743
5744           strsec = section_headers + sec->sh_link;
5745           assert (aux.strtab == NULL);
5746           aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
5747                                           1, strsec->sh_size,
5748                                           _("string table"));
5749           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
5750         }
5751       else if (sec->sh_type == SHT_IA_64_UNWIND)
5752         unwcount++;
5753     }
5754
5755   if (!unwcount)
5756     printf (_("\nThere are no unwind sections in this file.\n"));
5757
5758   while (unwcount-- > 0)
5759     {
5760       char * suffix;
5761       size_t len, len2;
5762
5763       for (i = unwstart, sec = section_headers + unwstart;
5764            i < elf_header.e_shnum; ++i, ++sec)
5765         if (sec->sh_type == SHT_IA_64_UNWIND)
5766           {
5767             unwsec = sec;
5768             break;
5769           }
5770
5771       unwstart = i + 1;
5772       len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
5773
5774       if ((unwsec->sh_flags & SHF_GROUP) != 0)
5775         {
5776           /* We need to find which section group it is in.  */
5777           struct group_list * g = section_headers_groups [i]->root;
5778
5779           for (; g != NULL; g = g->next)
5780             {
5781               sec = section_headers + g->section_index;
5782
5783               if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
5784                 break;
5785             }
5786
5787           if (g == NULL)
5788             i = elf_header.e_shnum;
5789         }
5790       else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
5791         {
5792           /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO.  */
5793           len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
5794           suffix = SECTION_NAME (unwsec) + len;
5795           for (i = 0, sec = section_headers; i < elf_header.e_shnum;
5796                ++i, ++sec)
5797             if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
5798                 && streq (SECTION_NAME (sec) + len2, suffix))
5799               break;
5800         }
5801       else
5802         {
5803           /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
5804              .IA_64.unwind or BAR -> .IA_64.unwind_info.  */
5805           len = sizeof (ELF_STRING_ia64_unwind) - 1;
5806           len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
5807           suffix = "";
5808           if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
5809             suffix = SECTION_NAME (unwsec) + len;
5810           for (i = 0, sec = section_headers; i < elf_header.e_shnum;
5811                ++i, ++sec)
5812             if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
5813                 && streq (SECTION_NAME (sec) + len2, suffix))
5814               break;
5815         }
5816
5817       if (i == elf_header.e_shnum)
5818         {
5819           printf (_("\nCould not find unwind info section for "));
5820
5821           if (string_table == NULL)
5822             printf ("%d", unwsec->sh_name);
5823           else
5824             printf (_("'%s'"), SECTION_NAME (unwsec));
5825         }
5826       else
5827         {
5828           aux.info_addr = sec->sh_addr;
5829           aux.info = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1,
5830                                                  sec->sh_size,
5831                                                  _("unwind info"));
5832           aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
5833
5834           printf (_("\nUnwind section "));
5835
5836           if (string_table == NULL)
5837             printf ("%d", unwsec->sh_name);
5838           else
5839             printf (_("'%s'"), SECTION_NAME (unwsec));
5840
5841           printf (_(" at offset 0x%lx contains %lu entries:\n"),
5842                   (unsigned long) unwsec->sh_offset,
5843                   (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
5844
5845           (void) slurp_ia64_unwind_table (file, & aux, unwsec);
5846
5847           if (aux.table_len > 0)
5848             dump_ia64_unwind (& aux);
5849
5850           if (aux.table)
5851             free ((char *) aux.table);
5852           if (aux.info)
5853             free ((char *) aux.info);
5854           aux.table = NULL;
5855           aux.info = NULL;
5856         }
5857     }
5858
5859   if (aux.symtab)
5860     free (aux.symtab);
5861   if (aux.strtab)
5862     free ((char *) aux.strtab);
5863
5864   return 1;
5865 }
5866
5867 struct hppa_unw_table_entry
5868   {
5869     struct absaddr start;
5870     struct absaddr end;
5871     unsigned int Cannot_unwind:1;                       /* 0 */
5872     unsigned int Millicode:1;                   /* 1 */
5873     unsigned int Millicode_save_sr0:1;          /* 2 */
5874     unsigned int Region_description:2;          /* 3..4 */
5875     unsigned int reserved1:1;                   /* 5 */
5876     unsigned int Entry_SR:1;                    /* 6 */
5877     unsigned int Entry_FR:4;     /* number saved */     /* 7..10 */
5878     unsigned int Entry_GR:5;     /* number saved */     /* 11..15 */
5879     unsigned int Args_stored:1;                 /* 16 */
5880     unsigned int Variable_Frame:1;                      /* 17 */
5881     unsigned int Separate_Package_Body:1;               /* 18 */
5882     unsigned int Frame_Extension_Millicode:1;   /* 19 */
5883     unsigned int Stack_Overflow_Check:1;                /* 20 */
5884     unsigned int Two_Instruction_SP_Increment:1;        /* 21 */
5885     unsigned int Ada_Region:1;                  /* 22 */
5886     unsigned int cxx_info:1;                    /* 23 */
5887     unsigned int cxx_try_catch:1;                       /* 24 */
5888     unsigned int sched_entry_seq:1;                     /* 25 */
5889     unsigned int reserved2:1;                   /* 26 */
5890     unsigned int Save_SP:1;                             /* 27 */
5891     unsigned int Save_RP:1;                             /* 28 */
5892     unsigned int Save_MRP_in_frame:1;           /* 29 */
5893     unsigned int extn_ptr_defined:1;            /* 30 */
5894     unsigned int Cleanup_defined:1;                     /* 31 */
5895
5896     unsigned int MPE_XL_interrupt_marker:1;             /* 0 */
5897     unsigned int HP_UX_interrupt_marker:1;              /* 1 */
5898     unsigned int Large_frame:1;                 /* 2 */
5899     unsigned int Pseudo_SP_Set:1;                       /* 3 */
5900     unsigned int reserved4:1;                   /* 4 */
5901     unsigned int Total_frame_size:27;           /* 5..31 */
5902   };
5903
5904 struct hppa_unw_aux_info
5905   {
5906     struct hppa_unw_table_entry *table; /* Unwind table.  */
5907     unsigned long table_len;    /* Length of unwind table.  */
5908     bfd_vma seg_base;           /* Starting address of segment.  */
5909     Elf_Internal_Sym * symtab;  /* The symbol table.  */
5910     unsigned long nsyms;        /* Number of symbols.  */
5911     char * strtab;              /* The string table.  */
5912     unsigned long strtab_size;  /* Size of string table.  */
5913   };
5914
5915 static void
5916 dump_hppa_unwind (struct hppa_unw_aux_info * aux)
5917 {
5918   struct hppa_unw_table_entry * tp;
5919
5920   for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
5921     {
5922       bfd_vma offset;
5923       const char * procname;
5924
5925       find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
5926                                aux->strtab_size, tp->start, &procname,
5927                                &offset);
5928
5929       fputs ("\n<", stdout);
5930
5931       if (procname)
5932         {
5933           fputs (procname, stdout);
5934
5935           if (offset)
5936             printf ("+%lx", (unsigned long) offset);
5937         }
5938
5939       fputs (">: [", stdout);
5940       print_vma (tp->start.offset, PREFIX_HEX);
5941       fputc ('-', stdout);
5942       print_vma (tp->end.offset, PREFIX_HEX);
5943       printf ("]\n\t");
5944
5945 #define PF(_m) if (tp->_m) printf (#_m " ");
5946 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
5947       PF(Cannot_unwind);
5948       PF(Millicode);
5949       PF(Millicode_save_sr0);
5950       /* PV(Region_description);  */
5951       PF(Entry_SR);
5952       PV(Entry_FR);
5953       PV(Entry_GR);
5954       PF(Args_stored);
5955       PF(Variable_Frame);
5956       PF(Separate_Package_Body);
5957       PF(Frame_Extension_Millicode);
5958       PF(Stack_Overflow_Check);
5959       PF(Two_Instruction_SP_Increment);
5960       PF(Ada_Region);
5961       PF(cxx_info);
5962       PF(cxx_try_catch);
5963       PF(sched_entry_seq);
5964       PF(Save_SP);
5965       PF(Save_RP);
5966       PF(Save_MRP_in_frame);
5967       PF(extn_ptr_defined);
5968       PF(Cleanup_defined);
5969       PF(MPE_XL_interrupt_marker);
5970       PF(HP_UX_interrupt_marker);
5971       PF(Large_frame);
5972       PF(Pseudo_SP_Set);
5973       PV(Total_frame_size);
5974 #undef PF
5975 #undef PV
5976     }
5977
5978   printf ("\n");
5979 }
5980
5981 static int
5982 slurp_hppa_unwind_table (FILE * file,
5983                          struct hppa_unw_aux_info * aux,
5984                          Elf_Internal_Shdr * sec)
5985 {
5986   unsigned long size, unw_ent_size, nentries, nrelas, i;
5987   Elf_Internal_Phdr * seg;
5988   struct hppa_unw_table_entry * tep;
5989   Elf_Internal_Shdr * relsec;
5990   Elf_Internal_Rela * rela;
5991   Elf_Internal_Rela * rp;
5992   unsigned char * table;
5993   unsigned char * tp;
5994   Elf_Internal_Sym * sym;
5995   const char * relname;
5996
5997   /* First, find the starting address of the segment that includes
5998      this section.  */
5999
6000   if (elf_header.e_phnum)
6001     {
6002       if (! get_program_headers (file))
6003         return 0;
6004
6005       for (seg = program_headers;
6006            seg < program_headers + elf_header.e_phnum;
6007            ++seg)
6008         {
6009           if (seg->p_type != PT_LOAD)
6010             continue;
6011
6012           if (sec->sh_addr >= seg->p_vaddr
6013               && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
6014             {
6015               aux->seg_base = seg->p_vaddr;
6016               break;
6017             }
6018         }
6019     }
6020
6021   /* Second, build the unwind table from the contents of the unwind
6022      section.  */
6023   size = sec->sh_size;
6024   table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
6025                                       _("unwind table"));
6026   if (!table)
6027     return 0;
6028
6029   unw_ent_size = 16;
6030   nentries = size / unw_ent_size;
6031   size = unw_ent_size * nentries;
6032
6033   tep = aux->table = (struct hppa_unw_table_entry *)
6034       xcmalloc (nentries, sizeof (aux->table[0]));
6035
6036   for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
6037     {
6038       unsigned int tmp1, tmp2;
6039
6040       tep->start.section = SHN_UNDEF;
6041       tep->end.section   = SHN_UNDEF;
6042
6043       tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
6044       tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
6045       tmp1 = byte_get ((unsigned char *) tp + 8, 4);
6046       tmp2 = byte_get ((unsigned char *) tp + 12, 4);
6047
6048       tep->start.offset += aux->seg_base;
6049       tep->end.offset   += aux->seg_base;
6050
6051       tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
6052       tep->Millicode = (tmp1 >> 30) & 0x1;
6053       tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
6054       tep->Region_description = (tmp1 >> 27) & 0x3;
6055       tep->reserved1 = (tmp1 >> 26) & 0x1;
6056       tep->Entry_SR = (tmp1 >> 25) & 0x1;
6057       tep->Entry_FR = (tmp1 >> 21) & 0xf;
6058       tep->Entry_GR = (tmp1 >> 16) & 0x1f;
6059       tep->Args_stored = (tmp1 >> 15) & 0x1;
6060       tep->Variable_Frame = (tmp1 >> 14) & 0x1;
6061       tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
6062       tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
6063       tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
6064       tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
6065       tep->Ada_Region = (tmp1 >> 9) & 0x1;
6066       tep->cxx_info = (tmp1 >> 8) & 0x1;
6067       tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
6068       tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
6069       tep->reserved2 = (tmp1 >> 5) & 0x1;
6070       tep->Save_SP = (tmp1 >> 4) & 0x1;
6071       tep->Save_RP = (tmp1 >> 3) & 0x1;
6072       tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
6073       tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
6074       tep->Cleanup_defined = tmp1 & 0x1;
6075
6076       tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
6077       tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
6078       tep->Large_frame = (tmp2 >> 29) & 0x1;
6079       tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
6080       tep->reserved4 = (tmp2 >> 27) & 0x1;
6081       tep->Total_frame_size = tmp2 & 0x7ffffff;
6082     }
6083   free (table);
6084
6085   /* Third, apply any relocations to the unwind table.  */
6086   for (relsec = section_headers;
6087        relsec < section_headers + elf_header.e_shnum;
6088        ++relsec)
6089     {
6090       if (relsec->sh_type != SHT_RELA
6091           || relsec->sh_info >= elf_header.e_shnum
6092           || section_headers + relsec->sh_info != sec)
6093         continue;
6094
6095       if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
6096                               & rela, & nrelas))
6097         return 0;
6098
6099       for (rp = rela; rp < rela + nrelas; ++rp)
6100         {
6101           relname = elf_hppa_reloc_type (get_reloc_type (rp->r_info));
6102           sym = aux->symtab + get_reloc_symindex (rp->r_info);
6103
6104           /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64.  */
6105           if (! const_strneq (relname, "R_PARISC_SEGREL"))
6106             {
6107               warn (_("Skipping unexpected relocation type %s\n"), relname);
6108               continue;
6109             }
6110
6111           i = rp->r_offset / unw_ent_size;
6112
6113           switch ((rp->r_offset % unw_ent_size) / eh_addr_size)
6114             {
6115             case 0:
6116               aux->table[i].start.section = sym->st_shndx;
6117               aux->table[i].start.offset  = sym->st_value + rp->r_addend;
6118               break;
6119             case 1:
6120               aux->table[i].end.section   = sym->st_shndx;
6121               aux->table[i].end.offset    = sym->st_value + rp->r_addend;
6122               break;
6123             default:
6124               break;
6125             }
6126         }
6127
6128       free (rela);
6129     }
6130
6131   aux->table_len = nentries;
6132
6133   return 1;
6134 }
6135
6136 static int
6137 hppa_process_unwind (FILE * file)
6138 {
6139   struct hppa_unw_aux_info aux;
6140   Elf_Internal_Shdr * unwsec = NULL;
6141   Elf_Internal_Shdr * strsec;
6142   Elf_Internal_Shdr * sec;
6143   unsigned long i;
6144
6145   memset (& aux, 0, sizeof (aux));
6146
6147   if (string_table == NULL)
6148     return 1;
6149
6150   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
6151     {
6152       if (sec->sh_type == SHT_SYMTAB
6153           && sec->sh_link < elf_header.e_shnum)
6154         {
6155           aux.nsyms = sec->sh_size / sec->sh_entsize;
6156           aux.symtab = GET_ELF_SYMBOLS (file, sec);
6157
6158           strsec = section_headers + sec->sh_link;
6159           assert (aux.strtab == NULL);
6160           aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
6161                                           1, strsec->sh_size,
6162                                           _("string table"));
6163           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
6164         }
6165       else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
6166         unwsec = sec;
6167     }
6168
6169   if (!unwsec)
6170     printf (_("\nThere are no unwind sections in this file.\n"));
6171
6172   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
6173     {
6174       if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
6175         {
6176           printf (_("\nUnwind section "));
6177           printf (_("'%s'"), SECTION_NAME (sec));
6178
6179           printf (_(" at offset 0x%lx contains %lu entries:\n"),
6180                   (unsigned long) sec->sh_offset,
6181                   (unsigned long) (sec->sh_size / (2 * eh_addr_size + 8)));
6182
6183           slurp_hppa_unwind_table (file, &aux, sec);
6184           if (aux.table_len > 0)
6185             dump_hppa_unwind (&aux);
6186
6187           if (aux.table)
6188             free ((char *) aux.table);
6189           aux.table = NULL;
6190         }
6191     }
6192
6193   if (aux.symtab)
6194     free (aux.symtab);
6195   if (aux.strtab)
6196     free ((char *) aux.strtab);
6197
6198   return 1;
6199 }
6200
6201 struct arm_section
6202 {
6203   unsigned char *data;
6204
6205   Elf_Internal_Shdr *sec;
6206   Elf_Internal_Rela *rela;
6207   unsigned long nrelas;
6208   unsigned int rel_type;
6209
6210   Elf_Internal_Rela *next_rela;
6211 };
6212
6213 struct arm_unw_aux_info
6214 {
6215   FILE *file;
6216
6217   Elf_Internal_Sym *symtab;     /* The symbol table.  */
6218   unsigned long nsyms;          /* Number of symbols.  */
6219   char *strtab;                 /* The string table.  */
6220   unsigned long strtab_size;    /* Size of string table.  */
6221 };
6222
6223 static const char *
6224 arm_print_vma_and_name (struct arm_unw_aux_info *aux,
6225                         bfd_vma fn, struct absaddr addr)
6226 {
6227   const char *procname;
6228   bfd_vma sym_offset;
6229
6230   if (addr.section == SHN_UNDEF)
6231     addr.offset = fn;
6232
6233   find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
6234                            aux->strtab_size, addr, &procname,
6235                            &sym_offset);
6236
6237   print_vma (fn, PREFIX_HEX);
6238
6239   if (procname)
6240     {
6241       fputs (" <", stdout);
6242       fputs (procname, stdout);
6243
6244       if (sym_offset)
6245         printf ("+0x%lx", (unsigned long) sym_offset);
6246       fputc ('>', stdout);
6247     }
6248
6249   return procname;
6250 }
6251
6252 static void
6253 arm_free_section (struct arm_section *arm_sec)
6254 {
6255   if (arm_sec->data != NULL)
6256     free (arm_sec->data);
6257
6258   if (arm_sec->rela != NULL)
6259     free (arm_sec->rela);
6260 }
6261
6262 static int
6263 arm_section_get_word (struct arm_unw_aux_info *aux,
6264                       struct arm_section *arm_sec,
6265                       Elf_Internal_Shdr *sec, bfd_vma word_offset,
6266                       unsigned int *wordp, struct absaddr *addr)
6267 {
6268   Elf_Internal_Rela *rp;
6269   Elf_Internal_Sym *sym;
6270   const char * relname;
6271   unsigned int word;
6272   bfd_boolean wrapped;
6273
6274   addr->section = SHN_UNDEF;
6275   addr->offset = 0;
6276
6277   if (sec != arm_sec->sec)
6278     {
6279       Elf_Internal_Shdr *relsec;
6280
6281       arm_free_section (arm_sec);
6282
6283       arm_sec->sec = sec;
6284       arm_sec->data = get_data (NULL, aux->file, sec->sh_offset, 1,
6285                                 sec->sh_size, _("unwind data"));
6286       arm_sec->rela = NULL;
6287       arm_sec->nrelas = 0;
6288
6289       for (relsec = section_headers;
6290            relsec < section_headers + elf_header.e_shnum;
6291            ++relsec)
6292         {
6293           if (relsec->sh_info >= elf_header.e_shnum
6294               || section_headers + relsec->sh_info != sec)
6295             continue;
6296
6297           if (relsec->sh_type == SHT_REL)
6298             {
6299               if (!slurp_rel_relocs (aux->file, relsec->sh_offset,
6300                                      relsec->sh_size,
6301                                      & arm_sec->rela, & arm_sec->nrelas))
6302                 return 0;
6303               break;
6304             }
6305           else if (relsec->sh_type == SHT_RELA)
6306             {
6307               if (!slurp_rela_relocs (aux->file, relsec->sh_offset,
6308                                       relsec->sh_size,
6309                                       & arm_sec->rela, & arm_sec->nrelas))
6310                 return 0;
6311               break;
6312             }
6313         }
6314
6315       arm_sec->next_rela = arm_sec->rela;
6316     }
6317
6318   if (arm_sec->data == NULL)
6319     return 0;
6320
6321   word = byte_get (arm_sec->data + word_offset, 4);
6322
6323   wrapped = FALSE;
6324   for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
6325     {
6326       bfd_vma prelval, offset;
6327
6328       if (rp->r_offset > word_offset && !wrapped)
6329         {
6330           rp = arm_sec->rela;
6331           wrapped = TRUE;
6332         }
6333       if (rp->r_offset > word_offset)
6334         break;
6335
6336       if (rp->r_offset & 3)
6337         {
6338           warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
6339                 (unsigned long) rp->r_offset);
6340           continue;
6341         }
6342
6343       if (rp->r_offset < word_offset)
6344         continue;
6345
6346       switch (elf_header.e_machine)
6347         {
6348         case EM_ARM:
6349           relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
6350           break;
6351
6352         case EM_TI_C6000:
6353           relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
6354           break;
6355
6356         default:
6357             abort();
6358         }
6359
6360       if (streq (relname, "R_ARM_NONE")
6361           || streq (relname, "R_C6000_NONE"))
6362         continue;
6363
6364       if (!(streq (relname, "R_ARM_PREL31")
6365             || streq (relname, "R_C6000_PREL31")))
6366         {
6367           warn (_("Skipping unexpected relocation type %s\n"), relname);
6368           continue;
6369         }
6370
6371       sym = aux->symtab + ELF32_R_SYM (rp->r_info);
6372
6373       if (arm_sec->rel_type == SHT_REL)
6374         {
6375           offset = word & 0x7fffffff;
6376           if (offset & 0x40000000)
6377             offset |= ~ (bfd_vma) 0x7fffffff;
6378         }
6379       else
6380         offset = rp->r_addend;
6381
6382       offset += sym->st_value;
6383       prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
6384
6385       if (streq (relname, "R_C6000_PREL31"))
6386         prelval >>= 1;
6387
6388       word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
6389       addr->section = sym->st_shndx;
6390       addr->offset = offset;
6391       break;
6392     }
6393
6394   *wordp = word;
6395   arm_sec->next_rela = rp;
6396
6397   return 1;
6398 }
6399
6400 static const char *tic6x_unwind_regnames[16] = {
6401     "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3", 
6402     "A14", "A13", "A12", "A11", "A10", 
6403     "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"};
6404
6405 static void
6406 decode_tic6x_unwind_regmask (unsigned int mask)
6407 {
6408   int i;
6409
6410   for (i = 12; mask; mask >>= 1, i--)
6411     {
6412       if (mask & 1)
6413         {
6414           fputs (tic6x_unwind_regnames[i], stdout);
6415           if (mask > 1)
6416             fputs (", ", stdout);
6417         }
6418     }
6419 }
6420
6421 #define ADVANCE                                                 \
6422   if (remaining == 0 && more_words)                             \
6423     {                                                           \
6424       data_offset += 4;                                         \
6425       if (!arm_section_get_word (aux, data_arm_sec, data_sec,   \
6426                                  data_offset, &word, &addr))    \
6427         return;                                                 \
6428       remaining = 4;                                            \
6429       more_words--;                                             \
6430     }                                                           \
6431
6432 #define GET_OP(OP)                      \
6433   ADVANCE;                              \
6434   if (remaining)                        \
6435     {                                   \
6436       remaining--;                      \
6437       (OP) = word >> 24;                \
6438       word <<= 8;                       \
6439     }                                   \
6440   else                                  \
6441     {                                   \
6442       printf (_("[Truncated opcode]\n"));       \
6443       return;                           \
6444     }                                   \
6445   printf ("0x%02x ", OP)
6446
6447 static void
6448 decode_arm_unwind_bytecode (struct arm_unw_aux_info *aux,
6449                             unsigned int word, unsigned int remaining,
6450                             unsigned int more_words,
6451                             bfd_vma data_offset, Elf_Internal_Shdr *data_sec,
6452                             struct arm_section *data_arm_sec)
6453 {
6454   struct absaddr addr;
6455
6456   /* Decode the unwinding instructions.  */
6457   while (1)
6458     {
6459       unsigned int op, op2;
6460
6461       ADVANCE;
6462       if (remaining == 0)
6463         break;
6464       remaining--;
6465       op = word >> 24;
6466       word <<= 8;
6467
6468       printf ("  0x%02x ", op);
6469
6470       if ((op & 0xc0) == 0x00)
6471         {
6472           int offset = ((op & 0x3f) << 2) + 4;
6473
6474           printf ("     vsp = vsp + %d", offset);
6475         }
6476       else if ((op & 0xc0) == 0x40)
6477         {
6478           int offset = ((op & 0x3f) << 2) + 4;
6479
6480           printf ("     vsp = vsp - %d", offset);
6481         }
6482       else if ((op & 0xf0) == 0x80)
6483         {
6484           GET_OP (op2);
6485           if (op == 0x80 && op2 == 0)
6486             printf (_("Refuse to unwind"));
6487           else
6488             {
6489               unsigned int mask = ((op & 0x0f) << 8) | op2;
6490               int first = 1;
6491               int i;
6492
6493               printf ("pop {");
6494               for (i = 0; i < 12; i++)
6495                 if (mask & (1 << i))
6496                   {
6497                     if (first)
6498                       first = 0;
6499                     else
6500                       printf (", ");
6501                     printf ("r%d", 4 + i);
6502                   }
6503               printf ("}");
6504             }
6505         }
6506       else if ((op & 0xf0) == 0x90)
6507         {
6508           if (op == 0x9d || op == 0x9f)
6509             printf (_("     [Reserved]"));
6510           else
6511             printf ("     vsp = r%d", op & 0x0f);
6512         }
6513       else if ((op & 0xf0) == 0xa0)
6514         {
6515           int end = 4 + (op & 0x07);
6516           int first = 1;
6517           int i;
6518
6519           printf ("     pop {");
6520           for (i = 4; i <= end; i++)
6521             {
6522               if (first)
6523                 first = 0;
6524               else
6525                 printf (", ");
6526               printf ("r%d", i);
6527             }
6528           if (op & 0x08)
6529             {
6530               if (first)
6531                 printf (", ");
6532               printf ("r14");
6533             }
6534           printf ("}");
6535         }
6536       else if (op == 0xb0)
6537         printf (_("     finish"));
6538       else if (op == 0xb1)
6539         {
6540           GET_OP (op2);
6541           if (op2 == 0 || (op2 & 0xf0) != 0)
6542             printf (_("[Spare]"));
6543           else
6544             {
6545               unsigned int mask = op2 & 0x0f;
6546               int first = 1;
6547               int i;
6548
6549               printf ("pop {");
6550               for (i = 0; i < 12; i++)
6551                 if (mask & (1 << i))
6552                   {
6553                     if (first)
6554                       first = 0;
6555                     else
6556                       printf (", ");
6557                     printf ("r%d", i);
6558                   }
6559               printf ("}");
6560             }
6561         }
6562       else if (op == 0xb2)
6563         {
6564           unsigned char buf[9];
6565           unsigned int i, len;
6566           unsigned long offset;
6567
6568           for (i = 0; i < sizeof (buf); i++)
6569             {
6570               GET_OP (buf[i]);
6571               if ((buf[i] & 0x80) == 0)
6572                 break;
6573             }
6574           assert (i < sizeof (buf));
6575           offset = read_uleb128 (buf, &len);
6576           assert (len == i + 1);
6577           offset = offset * 4 + 0x204;
6578           printf ("vsp = vsp + %ld", offset);
6579         }
6580       else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
6581         {
6582           unsigned int first, last;
6583
6584           GET_OP (op2);
6585           first = op2 >> 4;
6586           last = op2 & 0x0f;
6587           if (op == 0xc8)
6588             first = first + 16;
6589           printf ("pop {D%d", first);
6590           if (last)
6591             printf ("-D%d", first + last);
6592           printf ("}");
6593         }
6594       else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
6595         {
6596           unsigned int count = op & 0x07;
6597
6598           printf ("pop {D8");
6599           if (count)
6600             printf ("-D%d", 8 + count);
6601           printf ("}");
6602         }
6603       else if (op >= 0xc0 && op <= 0xc5)
6604         {
6605           unsigned int count = op & 0x07;
6606
6607           printf ("     pop {wR10");
6608           if (count)
6609             printf ("-wR%d", 10 + count);
6610           printf ("}");
6611         }
6612       else if (op == 0xc6)
6613         {
6614           unsigned int first, last;
6615
6616           GET_OP (op2);
6617           first = op2 >> 4;
6618           last = op2 & 0x0f;
6619           printf ("pop {wR%d", first);
6620           if (last)
6621             printf ("-wR%d", first + last);
6622           printf ("}");
6623         }
6624       else if (op == 0xc7)
6625         {
6626           GET_OP (op2);
6627           if (op2 == 0 || (op2 & 0xf0) != 0)
6628             printf (_("[Spare]"));
6629           else
6630             {
6631               unsigned int mask = op2 & 0x0f;
6632               int first = 1;
6633               int i;
6634
6635               printf ("pop {");
6636               for (i = 0; i < 4; i++)
6637                 if (mask & (1 << i))
6638                   {
6639                     if (first)
6640                       first = 0;
6641                     else
6642                       printf (", ");
6643                     printf ("wCGR%d", i);
6644                   }
6645               printf ("}");
6646             }
6647         }
6648       else
6649         printf (_("     [unsupported opcode]"));
6650       printf ("\n");
6651     }
6652 }
6653
6654 static void
6655 decode_tic6x_unwind_bytecode (struct arm_unw_aux_info *aux,
6656                             unsigned int word, unsigned int remaining,
6657                             unsigned int more_words,
6658                             bfd_vma data_offset, Elf_Internal_Shdr *data_sec,
6659                             struct arm_section *data_arm_sec)
6660 {
6661   struct absaddr addr;
6662
6663   /* Decode the unwinding instructions.  */
6664   while (1)
6665     {
6666       unsigned int op, op2;
6667
6668       ADVANCE;
6669       if (remaining == 0)
6670         break;
6671       remaining--;
6672       op = word >> 24;
6673       word <<= 8;
6674
6675       printf (_("  0x%02x "), op);
6676
6677       if ((op & 0xc0) == 0x00)
6678         {
6679           int offset = ((op & 0x3f) << 3) + 8;
6680           printf (_("     sp = sp + %d"), offset);
6681         }
6682       else if ((op & 0xc0) == 0x80)
6683         {
6684           GET_OP (op2);
6685           if (op == 0x80 && op2 == 0)
6686             printf (_("Refuse to unwind"));
6687           else
6688             {
6689               unsigned int mask = ((op & 0x1f) << 8) | op2;
6690               if (op & 0x20)
6691                 printf ("pop compact {");
6692               else
6693                 printf ("pop {");
6694
6695               decode_tic6x_unwind_regmask (mask);
6696               printf("}");
6697             }
6698         }
6699       else if ((op & 0xf0) == 0xc0)
6700         {
6701           unsigned int reg;
6702           unsigned int nregs;
6703           unsigned int i;
6704           const char *name;
6705           struct {
6706               unsigned int offset;
6707               unsigned int reg;
6708           } regpos[16];
6709
6710           /* Scan entire instruction first so that GET_OP output is not
6711              interleaved with disassembly.  */
6712           nregs = 0;
6713           for (i = 0; nregs < (op & 0xf); i++)
6714             {
6715               GET_OP (op2);
6716               reg = op2 >> 4;
6717               if (reg != 0xf)
6718                 {
6719                   regpos[nregs].offset = i * 2;
6720                   regpos[nregs].reg = reg;
6721                   nregs++;
6722                 }
6723
6724               reg = op2 & 0xf;
6725               if (reg != 0xf)
6726                 {
6727                   regpos[nregs].offset = i * 2 + 1;
6728                   regpos[nregs].reg = reg;
6729                   nregs++;
6730                 }
6731             }
6732
6733           printf (_("pop frame {"));
6734           reg = nregs - 1;
6735           for (i = i * 2; i > 0; i--)
6736             {
6737               if (regpos[reg].offset == i - 1)
6738                 {
6739                   name = tic6x_unwind_regnames[regpos[reg].reg];
6740                   if (reg > 0)
6741                     reg--;
6742                 }
6743               else
6744                 name = _("[pad]");
6745
6746               fputs (name, stdout);
6747               if (i > 1)
6748                 printf (", ");
6749             }
6750
6751           printf ("}");
6752         }
6753       else if (op == 0xd0)
6754         printf ("     MOV FP, SP");
6755       else if (op == 0xd1)
6756         printf ("     __c6xabi_pop_rts");
6757       else if (op == 0xd2)
6758         {
6759           unsigned char buf[9];
6760           unsigned int i, len;
6761           unsigned long offset;
6762           for (i = 0; i < sizeof (buf); i++)
6763             {
6764               GET_OP (buf[i]);
6765               if ((buf[i] & 0x80) == 0)
6766                 break;
6767             }
6768           assert (i < sizeof (buf));
6769           offset = read_uleb128 (buf, &len);
6770           assert (len == i + 1);
6771           offset = offset * 8 + 0x408;
6772           printf (_("sp = sp + %ld"), offset);
6773         }
6774       else if ((op & 0xf0) == 0xe0)
6775         {
6776           if ((op & 0x0f) == 7)
6777             printf ("     RETURN");
6778           else
6779             printf ("     MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
6780         }
6781       else
6782         {
6783           printf (_("     [unsupported opcode]"));
6784         }
6785       putchar ('\n');
6786     }
6787 }
6788
6789 static bfd_vma
6790 expand_prel31 (bfd_vma word, bfd_vma where)
6791 {
6792   bfd_vma offset;
6793
6794   offset = word & 0x7fffffff;
6795   if (offset & 0x40000000)
6796     offset |= ~ (bfd_vma) 0x7fffffff;
6797
6798   if (elf_header.e_machine == EM_TI_C6000)
6799     offset <<= 1;
6800
6801   return offset + where;
6802 }
6803
6804 static void
6805 decode_arm_unwind (struct arm_unw_aux_info *aux,
6806                    unsigned int word, unsigned int remaining,
6807                    bfd_vma data_offset, Elf_Internal_Shdr *data_sec,
6808                    struct arm_section *data_arm_sec)
6809 {
6810   int per_index;
6811   unsigned int more_words = 0;
6812   struct absaddr addr;
6813
6814   if (remaining == 0)
6815     {
6816       /* Fetch the first word.  */
6817       if (!arm_section_get_word (aux, data_arm_sec, data_sec, data_offset,
6818                                  &word, &addr))
6819         return;
6820       remaining = 4;
6821     }
6822
6823   if ((word & 0x80000000) == 0)
6824     {
6825       /* Expand prel31 for personality routine.  */
6826       bfd_vma fn;
6827       const char *procname;
6828
6829       fn = expand_prel31 (word, data_sec->sh_addr + data_offset);
6830       printf (_("  Personality routine: "));
6831       procname = arm_print_vma_and_name (aux, fn, addr);
6832       fputc ('\n', stdout);
6833
6834       /* The GCC personality routines use the standard compact
6835          encoding, starting with one byte giving the number of
6836          words.  */
6837       if (procname != NULL
6838           && (const_strneq (procname, "__gcc_personality_v0")
6839               || const_strneq (procname, "__gxx_personality_v0")
6840               || const_strneq (procname, "__gcj_personality_v0")
6841               || const_strneq (procname, "__gnu_objc_personality_v0")))
6842         {
6843           remaining = 0;
6844           more_words = 1;
6845           ADVANCE;
6846           if (!remaining)
6847             {
6848               printf (_("  [Truncated data]\n"));
6849               return;
6850             }
6851           more_words = word >> 24;
6852           word <<= 8;
6853           remaining--;
6854           per_index = -1;
6855         }
6856       else
6857         return;
6858     }
6859   else
6860     {
6861       
6862       per_index = (word >> 24) & 0x7f;
6863       printf (_("  Compact model %d\n"), per_index);
6864       if (per_index == 0)
6865         {
6866           more_words = 0;
6867           word <<= 8;
6868           remaining--;
6869         }
6870       else if (per_index < 3)
6871         {
6872           more_words = (word >> 16) & 0xff;
6873           word <<= 16;
6874           remaining -= 2;
6875         }
6876     }
6877
6878   switch (elf_header.e_machine)
6879     {
6880     case EM_ARM:
6881       if (per_index < 3)
6882         {
6883           decode_arm_unwind_bytecode (aux, word, remaining, more_words,
6884                                       data_offset, data_sec, data_arm_sec);
6885         }
6886       else
6887         printf ("  [reserved]\n");
6888       break;
6889
6890     case EM_TI_C6000:
6891       if (per_index < 3)
6892         {
6893           decode_tic6x_unwind_bytecode (aux, word, remaining, more_words,
6894                                       data_offset, data_sec, data_arm_sec);
6895         }
6896       else if (per_index < 5)
6897         {
6898           if (((word >> 17) & 0x7f) == 0x7f)
6899             printf (_("  Restore stack from frame pointer\n"));
6900           else
6901             printf (_("  Stack increment %d\n"), (word >> 14) & 0x1fc);
6902           printf (_("  Registers restored: "));
6903           if (per_index == 4)
6904             printf (" (compact) ");
6905           decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
6906           putchar ('\n');
6907           printf (_("  Return register: %s\n"),
6908                   tic6x_unwind_regnames[word & 0xf]);
6909         }
6910       else
6911         printf ("  [reserved]\n");
6912       break;
6913
6914     default:
6915       abort ();
6916     }
6917
6918   /* Decode the descriptors.  Not implemented.  */
6919 }
6920
6921 static void
6922 dump_arm_unwind (struct arm_unw_aux_info *aux, Elf_Internal_Shdr *exidx_sec)
6923 {
6924   struct arm_section exidx_arm_sec, extab_arm_sec;
6925   unsigned int i, exidx_len;
6926
6927   memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
6928   memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
6929   exidx_len = exidx_sec->sh_size / 8;
6930
6931   for (i = 0; i < exidx_len; i++)
6932     {
6933       unsigned int exidx_fn, exidx_entry;
6934       struct absaddr fn_addr, entry_addr;
6935       bfd_vma fn;
6936
6937       fputc ('\n', stdout);
6938
6939       if (!arm_section_get_word (aux, &exidx_arm_sec, exidx_sec,
6940                                  8 * i, &exidx_fn, &fn_addr)
6941           || !arm_section_get_word (aux, &exidx_arm_sec, exidx_sec,
6942                                     8 * i + 4, &exidx_entry, &entry_addr))
6943         {
6944           arm_free_section (&exidx_arm_sec);
6945           arm_free_section (&extab_arm_sec);
6946           return;
6947         }
6948
6949       fn = expand_prel31 (exidx_fn, exidx_sec->sh_addr + 8 * i);
6950
6951       arm_print_vma_and_name (aux, fn, entry_addr);
6952       fputs (": ", stdout);
6953
6954       if (exidx_entry == 1)
6955         {
6956           print_vma (exidx_entry, PREFIX_HEX);
6957           fputs (" [cantunwind]\n", stdout);
6958         }
6959       else if (exidx_entry & 0x80000000)
6960         {
6961           print_vma (exidx_entry, PREFIX_HEX);
6962           fputc ('\n', stdout);
6963           decode_arm_unwind (aux, exidx_entry, 4, 0, NULL, NULL);
6964         }
6965       else
6966         {
6967           bfd_vma table, table_offset = 0;
6968           Elf_Internal_Shdr *table_sec;
6969
6970           fputs ("@", stdout);
6971           table = expand_prel31 (exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
6972           print_vma (table, PREFIX_HEX);
6973           printf ("\n");
6974
6975           /* Locate the matching .ARM.extab.  */
6976           if (entry_addr.section != SHN_UNDEF
6977               && entry_addr.section < elf_header.e_shnum)
6978             {
6979               table_sec = section_headers + entry_addr.section;
6980               table_offset = entry_addr.offset;
6981             }
6982           else
6983             {
6984               table_sec = find_section_by_address (table);
6985               if (table_sec != NULL)
6986                 table_offset = table - table_sec->sh_addr;
6987             }
6988           if (table_sec == NULL)
6989             {
6990               warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
6991                     (unsigned long) table);
6992               continue;
6993             }
6994           decode_arm_unwind (aux, 0, 0, table_offset, table_sec,
6995                              &extab_arm_sec);
6996         }
6997     }
6998
6999   printf ("\n");
7000
7001   arm_free_section (&exidx_arm_sec);
7002   arm_free_section (&extab_arm_sec);
7003 }
7004
7005 /* Used for both ARM and C6X unwinding tables.  */
7006 static int
7007 arm_process_unwind (FILE *file)
7008 {
7009   struct arm_unw_aux_info aux;
7010   Elf_Internal_Shdr *unwsec = NULL;
7011   Elf_Internal_Shdr *strsec;
7012   Elf_Internal_Shdr *sec;
7013   unsigned long i;
7014   unsigned int sec_type;
7015
7016   memset (& aux, 0, sizeof (aux));
7017   aux.file = file;
7018
7019   switch (elf_header.e_machine)
7020     {
7021     case EM_ARM:
7022       sec_type = SHT_ARM_EXIDX;
7023       break;
7024
7025     case EM_TI_C6000:
7026       sec_type = SHT_C6000_UNWIND;
7027       break;
7028
7029     default:
7030         abort();
7031     }
7032
7033   if (string_table == NULL)
7034     return 1;
7035
7036   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7037     {
7038       if (sec->sh_type == SHT_SYMTAB && sec->sh_link < elf_header.e_shnum)
7039         {
7040           aux.nsyms = sec->sh_size / sec->sh_entsize;
7041           aux.symtab = GET_ELF_SYMBOLS (file, sec);
7042
7043           strsec = section_headers + sec->sh_link;
7044           assert (aux.strtab == NULL);
7045           aux.strtab = get_data (NULL, file, strsec->sh_offset,
7046                                  1, strsec->sh_size, _("string table"));
7047           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7048         }
7049       else if (sec->sh_type == sec_type)
7050         unwsec = sec;
7051     }
7052
7053   if (!unwsec)
7054     printf (_("\nThere are no unwind sections in this file.\n"));
7055
7056   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7057     {
7058       if (sec->sh_type == sec_type)
7059         {
7060           printf (_("\nUnwind table index '%s' at offset 0x%lx contains %lu entries:\n"),
7061                   SECTION_NAME (sec),
7062                   (unsigned long) sec->sh_offset,
7063                   (unsigned long) (sec->sh_size / (2 * eh_addr_size)));
7064
7065           dump_arm_unwind (&aux, sec);
7066         }
7067     }
7068
7069   if (aux.symtab)
7070     free (aux.symtab);
7071   if (aux.strtab)
7072     free ((char *) aux.strtab);
7073
7074   return 1;
7075 }
7076
7077 static int
7078 process_unwind (FILE * file)
7079 {
7080   struct unwind_handler
7081   {
7082     int machtype;
7083     int (* handler)(FILE *);
7084   } handlers[] =
7085   {
7086     { EM_ARM, arm_process_unwind },
7087     { EM_IA_64, ia64_process_unwind },
7088     { EM_PARISC, hppa_process_unwind },
7089     { EM_TI_C6000, arm_process_unwind },
7090     { 0, 0 }
7091   };
7092   int i;
7093
7094   if (!do_unwind)
7095     return 1;
7096
7097   for (i = 0; handlers[i].handler != NULL; i++)
7098     if (elf_header.e_machine == handlers[i].machtype)
7099       return handlers[i].handler (file);
7100
7101   printf (_("\nThere are no unwind sections in this file.\n"));
7102   return 1;
7103 }
7104
7105 static void
7106 dynamic_section_mips_val (Elf_Internal_Dyn * entry)
7107 {
7108   switch (entry->d_tag)
7109     {
7110     case DT_MIPS_FLAGS:
7111       if (entry->d_un.d_val == 0)
7112         printf (_("NONE\n"));
7113       else
7114         {
7115           static const char * opts[] =
7116           {
7117             "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
7118             "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
7119             "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
7120             "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
7121             "RLD_ORDER_SAFE"
7122           };
7123           unsigned int cnt;
7124           int first = 1;
7125
7126           for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
7127             if (entry->d_un.d_val & (1 << cnt))
7128               {
7129                 printf ("%s%s", first ? "" : " ", opts[cnt]);
7130                 first = 0;
7131               }
7132           puts ("");
7133         }
7134       break;
7135
7136     case DT_MIPS_IVERSION:
7137       if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
7138         printf (_("Interface Version: %s\n"), GET_DYNAMIC_NAME (entry->d_un.d_val));
7139       else
7140         printf (_("<corrupt: %ld>\n"), (long) entry->d_un.d_ptr);
7141       break;
7142
7143     case DT_MIPS_TIME_STAMP:
7144       {
7145         char timebuf[20];
7146         struct tm * tmp;
7147
7148         time_t atime = entry->d_un.d_val;
7149         tmp = gmtime (&atime);
7150         snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
7151                   tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
7152                   tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
7153         printf (_("Time Stamp: %s\n"), timebuf);
7154       }
7155       break;
7156
7157     case DT_MIPS_RLD_VERSION:
7158     case DT_MIPS_LOCAL_GOTNO:
7159     case DT_MIPS_CONFLICTNO:
7160     case DT_MIPS_LIBLISTNO:
7161     case DT_MIPS_SYMTABNO:
7162     case DT_MIPS_UNREFEXTNO:
7163     case DT_MIPS_HIPAGENO:
7164     case DT_MIPS_DELTA_CLASS_NO:
7165     case DT_MIPS_DELTA_INSTANCE_NO:
7166     case DT_MIPS_DELTA_RELOC_NO:
7167     case DT_MIPS_DELTA_SYM_NO:
7168     case DT_MIPS_DELTA_CLASSSYM_NO:
7169     case DT_MIPS_COMPACT_SIZE:
7170       printf ("%ld\n", (long) entry->d_un.d_ptr);
7171       break;
7172
7173     default:
7174       printf ("%#lx\n", (unsigned long) entry->d_un.d_ptr);
7175     }
7176 }
7177
7178 static void
7179 dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
7180 {
7181   switch (entry->d_tag)
7182     {
7183     case DT_HP_DLD_FLAGS:
7184       {
7185         static struct
7186         {
7187           long int bit;
7188           const char * str;
7189         }
7190         flags[] =
7191         {
7192           { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
7193           { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
7194           { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
7195           { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
7196           { DT_HP_BIND_NOW, "HP_BIND_NOW" },
7197           { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
7198           { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
7199           { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
7200           { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
7201           { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
7202           { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
7203           { DT_HP_GST, "HP_GST" },
7204           { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
7205           { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
7206           { DT_HP_NODELETE, "HP_NODELETE" },
7207           { DT_HP_GROUP, "HP_GROUP" },
7208           { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
7209         };
7210         int first = 1;
7211         size_t cnt;
7212         bfd_vma val = entry->d_un.d_val;
7213
7214         for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
7215           if (val & flags[cnt].bit)
7216             {
7217               if (! first)
7218                 putchar (' ');
7219               fputs (flags[cnt].str, stdout);
7220               first = 0;
7221               val ^= flags[cnt].bit;
7222             }
7223
7224         if (val != 0 || first)
7225           {
7226             if (! first)
7227               putchar (' ');
7228             print_vma (val, HEX);
7229           }
7230       }
7231       break;
7232
7233     default:
7234       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
7235       break;
7236     }
7237   putchar ('\n');
7238 }
7239
7240 #ifdef BFD64
7241
7242 /* VMS vs Unix time offset and factor.  */
7243
7244 #define VMS_EPOCH_OFFSET 35067168000000000LL
7245 #define VMS_GRANULARITY_FACTOR 10000000
7246
7247 /* Display a VMS time in a human readable format.  */
7248
7249 static void
7250 print_vms_time (bfd_int64_t vmstime)
7251 {
7252   struct tm *tm;
7253   time_t unxtime;
7254
7255   unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
7256   tm = gmtime (&unxtime);
7257   printf ("%04u-%02u-%02uT%02u:%02u:%02u",
7258           tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
7259           tm->tm_hour, tm->tm_min, tm->tm_sec);
7260 }
7261 #endif /* BFD64 */
7262
7263 static void
7264 dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
7265 {
7266   switch (entry->d_tag)
7267     {
7268     case DT_IA_64_PLT_RESERVE:
7269       /* First 3 slots reserved.  */
7270       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
7271       printf (" -- ");
7272       print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
7273       break;
7274
7275     case DT_IA_64_VMS_LINKTIME:
7276 #ifdef BFD64
7277       print_vms_time (entry->d_un.d_val);
7278 #endif
7279       break;
7280
7281     case DT_IA_64_VMS_LNKFLAGS:
7282       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
7283       if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
7284         printf (" CALL_DEBUG");
7285       if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
7286         printf (" NOP0BUFS");
7287       if (entry->d_un.d_val & VMS_LF_P0IMAGE)
7288         printf (" P0IMAGE");
7289       if (entry->d_un.d_val & VMS_LF_MKTHREADS)
7290         printf (" MKTHREADS");
7291       if (entry->d_un.d_val & VMS_LF_UPCALLS)
7292         printf (" UPCALLS");
7293       if (entry->d_un.d_val & VMS_LF_IMGSTA)
7294         printf (" IMGSTA");
7295       if (entry->d_un.d_val & VMS_LF_INITIALIZE)
7296         printf (" INITIALIZE");
7297       if (entry->d_un.d_val & VMS_LF_MAIN)
7298         printf (" MAIN");
7299       if (entry->d_un.d_val & VMS_LF_EXE_INIT)
7300         printf (" EXE_INIT");
7301       if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
7302         printf (" TBK_IN_IMG");
7303       if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
7304         printf (" DBG_IN_IMG");
7305       if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
7306         printf (" TBK_IN_DSF");
7307       if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
7308         printf (" DBG_IN_DSF");
7309       if (entry->d_un.d_val & VMS_LF_SIGNATURES)
7310         printf (" SIGNATURES");
7311       if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
7312         printf (" REL_SEG_OFF");
7313       break;
7314
7315     default:
7316       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
7317       break;
7318     }
7319   putchar ('\n');
7320 }
7321
7322 static int
7323 get_32bit_dynamic_section (FILE * file)
7324 {
7325   Elf32_External_Dyn * edyn;
7326   Elf32_External_Dyn * ext;
7327   Elf_Internal_Dyn * entry;
7328
7329   edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
7330                                           dynamic_size, _("dynamic section"));
7331   if (!edyn)
7332     return 0;
7333
7334 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
7335    might not have the luxury of section headers.  Look for the DT_NULL
7336    terminator to determine the number of entries.  */
7337   for (ext = edyn, dynamic_nent = 0;
7338        (char *) ext < (char *) edyn + dynamic_size;
7339        ext++)
7340     {
7341       dynamic_nent++;
7342       if (BYTE_GET (ext->d_tag) == DT_NULL)
7343         break;
7344     }
7345
7346   dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
7347                                                   sizeof (* entry));
7348   if (dynamic_section == NULL)
7349     {
7350       error (_("Out of memory\n"));
7351       free (edyn);
7352       return 0;
7353     }
7354
7355   for (ext = edyn, entry = dynamic_section;
7356        entry < dynamic_section + dynamic_nent;
7357        ext++, entry++)
7358     {
7359       entry->d_tag      = BYTE_GET (ext->d_tag);
7360       entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
7361     }
7362
7363   free (edyn);
7364
7365   return 1;
7366 }
7367
7368 static int
7369 get_64bit_dynamic_section (FILE * file)
7370 {
7371   Elf64_External_Dyn * edyn;
7372   Elf64_External_Dyn * ext;
7373   Elf_Internal_Dyn * entry;
7374
7375   edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
7376                                           dynamic_size, _("dynamic section"));
7377   if (!edyn)
7378     return 0;
7379
7380 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
7381    might not have the luxury of section headers.  Look for the DT_NULL
7382    terminator to determine the number of entries.  */
7383   for (ext = edyn, dynamic_nent = 0;
7384        (char *) ext < (char *) edyn + dynamic_size;
7385        ext++)
7386     {
7387       dynamic_nent++;
7388       if (BYTE_GET (ext->d_tag) == DT_NULL)
7389         break;
7390     }
7391
7392   dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
7393                                                   sizeof (* entry));
7394   if (dynamic_section == NULL)
7395     {
7396       error (_("Out of memory\n"));
7397       free (edyn);
7398       return 0;
7399     }
7400
7401   for (ext = edyn, entry = dynamic_section;
7402        entry < dynamic_section + dynamic_nent;
7403        ext++, entry++)
7404     {
7405       entry->d_tag      = BYTE_GET (ext->d_tag);
7406       entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
7407     }
7408
7409   free (edyn);
7410
7411   return 1;
7412 }
7413
7414 static void
7415 print_dynamic_flags (bfd_vma flags)
7416 {
7417   int first = 1;
7418
7419   while (flags)
7420     {
7421       bfd_vma flag;
7422
7423       flag = flags & - flags;
7424       flags &= ~ flag;
7425
7426       if (first)
7427         first = 0;
7428       else
7429         putc (' ', stdout);
7430
7431       switch (flag)
7432         {
7433         case DF_ORIGIN:         fputs ("ORIGIN", stdout); break;
7434         case DF_SYMBOLIC:       fputs ("SYMBOLIC", stdout); break;
7435         case DF_TEXTREL:        fputs ("TEXTREL", stdout); break;
7436         case DF_BIND_NOW:       fputs ("BIND_NOW", stdout); break;
7437         case DF_STATIC_TLS:     fputs ("STATIC_TLS", stdout); break;
7438         default:                fputs (_("unknown"), stdout); break;
7439         }
7440     }
7441   puts ("");
7442 }
7443
7444 /* Parse and display the contents of the dynamic section.  */
7445
7446 static int
7447 process_dynamic_section (FILE * file)
7448 {
7449   Elf_Internal_Dyn * entry;
7450
7451   if (dynamic_size == 0)
7452     {
7453       if (do_dynamic)
7454         printf (_("\nThere is no dynamic section in this file.\n"));
7455
7456       return 1;
7457     }
7458
7459   if (is_32bit_elf)
7460     {
7461       if (! get_32bit_dynamic_section (file))
7462         return 0;
7463     }
7464   else if (! get_64bit_dynamic_section (file))
7465     return 0;
7466
7467   /* Find the appropriate symbol table.  */
7468   if (dynamic_symbols == NULL)
7469     {
7470       for (entry = dynamic_section;
7471            entry < dynamic_section + dynamic_nent;
7472            ++entry)
7473         {
7474           Elf_Internal_Shdr section;
7475
7476           if (entry->d_tag != DT_SYMTAB)
7477             continue;
7478
7479           dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
7480
7481           /* Since we do not know how big the symbol table is,
7482              we default to reading in the entire file (!) and
7483              processing that.  This is overkill, I know, but it
7484              should work.  */
7485           section.sh_offset = offset_from_vma (file, entry->d_un.d_val, 0);
7486
7487           if (archive_file_offset != 0)
7488             section.sh_size = archive_file_size - section.sh_offset;
7489           else
7490             {
7491               if (fseek (file, 0, SEEK_END))
7492                 error (_("Unable to seek to end of file!\n"));
7493
7494               section.sh_size = ftell (file) - section.sh_offset;
7495             }
7496
7497           if (is_32bit_elf)
7498             section.sh_entsize = sizeof (Elf32_External_Sym);
7499           else
7500             section.sh_entsize = sizeof (Elf64_External_Sym);
7501
7502           num_dynamic_syms = section.sh_size / section.sh_entsize;
7503           if (num_dynamic_syms < 1)
7504             {
7505               error (_("Unable to determine the number of symbols to load\n"));
7506               continue;
7507             }
7508
7509           dynamic_symbols = GET_ELF_SYMBOLS (file, &section);
7510         }
7511     }
7512
7513   /* Similarly find a string table.  */
7514   if (dynamic_strings == NULL)
7515     {
7516       for (entry = dynamic_section;
7517            entry < dynamic_section + dynamic_nent;
7518            ++entry)
7519         {
7520           unsigned long offset;
7521           long str_tab_len;
7522
7523           if (entry->d_tag != DT_STRTAB)
7524             continue;
7525
7526           dynamic_info[DT_STRTAB] = entry->d_un.d_val;
7527
7528           /* Since we do not know how big the string table is,
7529              we default to reading in the entire file (!) and
7530              processing that.  This is overkill, I know, but it
7531              should work.  */
7532
7533           offset = offset_from_vma (file, entry->d_un.d_val, 0);
7534
7535           if (archive_file_offset != 0)
7536             str_tab_len = archive_file_size - offset;
7537           else
7538             {
7539               if (fseek (file, 0, SEEK_END))
7540                 error (_("Unable to seek to end of file\n"));
7541               str_tab_len = ftell (file) - offset;
7542             }
7543
7544           if (str_tab_len < 1)
7545             {
7546               error
7547                 (_("Unable to determine the length of the dynamic string table\n"));
7548               continue;
7549             }
7550
7551           dynamic_strings = (char *) get_data (NULL, file, offset, 1,
7552                                                str_tab_len,
7553                                                _("dynamic string table"));
7554           dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
7555           break;
7556         }
7557     }
7558
7559   /* And find the syminfo section if available.  */
7560   if (dynamic_syminfo == NULL)
7561     {
7562       unsigned long syminsz = 0;
7563
7564       for (entry = dynamic_section;
7565            entry < dynamic_section + dynamic_nent;
7566            ++entry)
7567         {
7568           if (entry->d_tag == DT_SYMINENT)
7569             {
7570               /* Note: these braces are necessary to avoid a syntax
7571                  error from the SunOS4 C compiler.  */
7572               assert (sizeof (Elf_External_Syminfo) == entry->d_un.d_val);
7573             }
7574           else if (entry->d_tag == DT_SYMINSZ)
7575             syminsz = entry->d_un.d_val;
7576           else if (entry->d_tag == DT_SYMINFO)
7577             dynamic_syminfo_offset = offset_from_vma (file, entry->d_un.d_val,
7578                                                       syminsz);
7579         }
7580
7581       if (dynamic_syminfo_offset != 0 && syminsz != 0)
7582         {
7583           Elf_External_Syminfo * extsyminfo;
7584           Elf_External_Syminfo * extsym;
7585           Elf_Internal_Syminfo * syminfo;
7586
7587           /* There is a syminfo section.  Read the data.  */
7588           extsyminfo = (Elf_External_Syminfo *)
7589               get_data (NULL, file, dynamic_syminfo_offset, 1, syminsz,
7590                         _("symbol information"));
7591           if (!extsyminfo)
7592             return 0;
7593
7594           dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
7595           if (dynamic_syminfo == NULL)
7596             {
7597               error (_("Out of memory\n"));
7598               return 0;
7599             }
7600
7601           dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
7602           for (syminfo = dynamic_syminfo, extsym = extsyminfo;
7603                syminfo < dynamic_syminfo + dynamic_syminfo_nent;
7604                ++syminfo, ++extsym)
7605             {
7606               syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
7607               syminfo->si_flags = BYTE_GET (extsym->si_flags);
7608             }
7609
7610           free (extsyminfo);
7611         }
7612     }
7613
7614   if (do_dynamic && dynamic_addr)
7615     printf (_("\nDynamic section at offset 0x%lx contains %u entries:\n"),
7616             dynamic_addr, dynamic_nent);
7617   if (do_dynamic)
7618     printf (_("  Tag        Type                         Name/Value\n"));
7619
7620   for (entry = dynamic_section;
7621        entry < dynamic_section + dynamic_nent;
7622        entry++)
7623     {
7624       if (do_dynamic)
7625         {
7626           const char * dtype;
7627
7628           putchar (' ');
7629           print_vma (entry->d_tag, FULL_HEX);
7630           dtype = get_dynamic_type (entry->d_tag);
7631           printf (" (%s)%*s", dtype,
7632                   ((is_32bit_elf ? 27 : 19)
7633                    - (int) strlen (dtype)),
7634                   " ");
7635         }
7636
7637       switch (entry->d_tag)
7638         {
7639         case DT_FLAGS:
7640           if (do_dynamic)
7641             print_dynamic_flags (entry->d_un.d_val);
7642           break;
7643
7644         case DT_AUXILIARY:
7645         case DT_FILTER:
7646         case DT_CONFIG:
7647         case DT_DEPAUDIT:
7648         case DT_AUDIT:
7649           if (do_dynamic)
7650             {
7651               switch (entry->d_tag)
7652                 {
7653                 case DT_AUXILIARY:
7654                   printf (_("Auxiliary library"));
7655                   break;
7656
7657                 case DT_FILTER:
7658                   printf (_("Filter library"));
7659                   break;
7660
7661                 case DT_CONFIG:
7662                   printf (_("Configuration file"));
7663                   break;
7664
7665                 case DT_DEPAUDIT:
7666                   printf (_("Dependency audit library"));
7667                   break;
7668
7669                 case DT_AUDIT:
7670                   printf (_("Audit library"));
7671                   break;
7672                 }
7673
7674               if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
7675                 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
7676               else
7677                 {
7678                   printf (": ");
7679                   print_vma (entry->d_un.d_val, PREFIX_HEX);
7680                   putchar ('\n');
7681                 }
7682             }
7683           break;
7684
7685         case DT_FEATURE:
7686           if (do_dynamic)
7687             {
7688               printf (_("Flags:"));
7689
7690               if (entry->d_un.d_val == 0)
7691                 printf (_(" None\n"));
7692               else
7693                 {
7694                   unsigned long int val = entry->d_un.d_val;
7695
7696                   if (val & DTF_1_PARINIT)
7697                     {
7698                       printf (" PARINIT");
7699                       val ^= DTF_1_PARINIT;
7700                     }
7701                   if (val & DTF_1_CONFEXP)
7702                     {
7703                       printf (" CONFEXP");
7704                       val ^= DTF_1_CONFEXP;
7705                     }
7706                   if (val != 0)
7707                     printf (" %lx", val);
7708                   puts ("");
7709                 }
7710             }
7711           break;
7712
7713         case DT_POSFLAG_1:
7714           if (do_dynamic)
7715             {
7716               printf (_("Flags:"));
7717
7718               if (entry->d_un.d_val == 0)
7719                 printf (_(" None\n"));
7720               else
7721                 {
7722                   unsigned long int val = entry->d_un.d_val;
7723
7724                   if (val & DF_P1_LAZYLOAD)
7725                     {
7726                       printf (" LAZYLOAD");
7727                       val ^= DF_P1_LAZYLOAD;
7728                     }
7729                   if (val & DF_P1_GROUPPERM)
7730                     {
7731                       printf (" GROUPPERM");
7732                       val ^= DF_P1_GROUPPERM;
7733                     }
7734                   if (val != 0)
7735                     printf (" %lx", val);
7736                   puts ("");
7737                 }
7738             }
7739           break;
7740
7741         case DT_FLAGS_1:
7742           if (do_dynamic)
7743             {
7744               printf (_("Flags:"));
7745               if (entry->d_un.d_val == 0)
7746                 printf (_(" None\n"));
7747               else
7748                 {
7749                   unsigned long int val = entry->d_un.d_val;
7750
7751                   if (val & DF_1_NOW)
7752                     {
7753                       printf (" NOW");
7754                       val ^= DF_1_NOW;
7755                     }
7756                   if (val & DF_1_GLOBAL)
7757                     {
7758                       printf (" GLOBAL");
7759                       val ^= DF_1_GLOBAL;
7760                     }
7761                   if (val & DF_1_GROUP)
7762                     {
7763                       printf (" GROUP");
7764                       val ^= DF_1_GROUP;
7765                     }
7766                   if (val & DF_1_NODELETE)
7767                     {
7768                       printf (" NODELETE");
7769                       val ^= DF_1_NODELETE;
7770                     }
7771                   if (val & DF_1_LOADFLTR)
7772                     {
7773                       printf (" LOADFLTR");
7774                       val ^= DF_1_LOADFLTR;
7775                     }
7776                   if (val & DF_1_INITFIRST)
7777                     {
7778                       printf (" INITFIRST");
7779                       val ^= DF_1_INITFIRST;
7780                     }
7781                   if (val & DF_1_NOOPEN)
7782                     {
7783                       printf (" NOOPEN");
7784                       val ^= DF_1_NOOPEN;
7785                     }
7786                   if (val & DF_1_ORIGIN)
7787                     {
7788                       printf (" ORIGIN");
7789                       val ^= DF_1_ORIGIN;
7790                     }
7791                   if (val & DF_1_DIRECT)
7792                     {
7793                       printf (" DIRECT");
7794                       val ^= DF_1_DIRECT;
7795                     }
7796                   if (val & DF_1_TRANS)
7797                     {
7798                       printf (" TRANS");
7799                       val ^= DF_1_TRANS;
7800                     }
7801                   if (val & DF_1_INTERPOSE)
7802                     {
7803                       printf (" INTERPOSE");
7804                       val ^= DF_1_INTERPOSE;
7805                     }
7806                   if (val & DF_1_NODEFLIB)
7807                     {
7808                       printf (" NODEFLIB");
7809                       val ^= DF_1_NODEFLIB;
7810                     }
7811                   if (val & DF_1_NODUMP)
7812                     {
7813                       printf (" NODUMP");
7814                       val ^= DF_1_NODUMP;
7815                     }
7816                   if (val & DF_1_CONLFAT)
7817                     {
7818                       printf (" CONLFAT");
7819                       val ^= DF_1_CONLFAT;
7820                     }
7821                   if (val != 0)
7822                     printf (" %lx", val);
7823                   puts ("");
7824                 }
7825             }
7826           break;
7827
7828         case DT_PLTREL:
7829           dynamic_info[entry->d_tag] = entry->d_un.d_val;
7830           if (do_dynamic)
7831             puts (get_dynamic_type (entry->d_un.d_val));
7832           break;
7833
7834         case DT_NULL    :
7835         case DT_NEEDED  :
7836         case DT_PLTGOT  :
7837         case DT_HASH    :
7838         case DT_STRTAB  :
7839         case DT_SYMTAB  :
7840         case DT_RELA    :
7841         case DT_INIT    :
7842         case DT_FINI    :
7843         case DT_SONAME  :
7844         case DT_RPATH   :
7845         case DT_SYMBOLIC:
7846         case DT_REL     :
7847         case DT_DEBUG   :
7848         case DT_TEXTREL :
7849         case DT_JMPREL  :
7850         case DT_RUNPATH :
7851           dynamic_info[entry->d_tag] = entry->d_un.d_val;
7852
7853           if (do_dynamic)
7854             {
7855               char * name;
7856
7857               if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
7858                 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
7859               else
7860                 name = NULL;
7861
7862               if (name)
7863                 {
7864                   switch (entry->d_tag)
7865                     {
7866                     case DT_NEEDED:
7867                       printf (_("Shared library: [%s]"), name);
7868
7869                       if (streq (name, program_interpreter))
7870                         printf (_(" program interpreter"));
7871                       break;
7872
7873                     case DT_SONAME:
7874                       printf (_("Library soname: [%s]"), name);
7875                       break;
7876
7877                     case DT_RPATH:
7878                       printf (_("Library rpath: [%s]"), name);
7879                       break;
7880
7881                     case DT_RUNPATH:
7882                       printf (_("Library runpath: [%s]"), name);
7883                       break;
7884
7885                     default:
7886                       print_vma (entry->d_un.d_val, PREFIX_HEX);
7887                       break;
7888                     }
7889                 }
7890               else
7891                 print_vma (entry->d_un.d_val, PREFIX_HEX);
7892
7893               putchar ('\n');
7894             }
7895           break;
7896
7897         case DT_PLTRELSZ:
7898         case DT_RELASZ  :
7899         case DT_STRSZ   :
7900         case DT_RELSZ   :
7901         case DT_RELAENT :
7902         case DT_SYMENT  :
7903         case DT_RELENT  :
7904           dynamic_info[entry->d_tag] = entry->d_un.d_val;
7905         case DT_PLTPADSZ:
7906         case DT_MOVEENT :
7907         case DT_MOVESZ  :
7908         case DT_INIT_ARRAYSZ:
7909         case DT_FINI_ARRAYSZ:
7910         case DT_GNU_CONFLICTSZ:
7911         case DT_GNU_LIBLISTSZ:
7912           if (do_dynamic)
7913             {
7914               print_vma (entry->d_un.d_val, UNSIGNED);
7915               printf (_(" (bytes)\n"));
7916             }
7917           break;
7918
7919         case DT_VERDEFNUM:
7920         case DT_VERNEEDNUM:
7921         case DT_RELACOUNT:
7922         case DT_RELCOUNT:
7923           if (do_dynamic)
7924             {
7925               print_vma (entry->d_un.d_val, UNSIGNED);
7926               putchar ('\n');
7927             }
7928           break;
7929
7930         case DT_SYMINSZ:
7931         case DT_SYMINENT:
7932         case DT_SYMINFO:
7933         case DT_USED:
7934         case DT_INIT_ARRAY:
7935         case DT_FINI_ARRAY:
7936           if (do_dynamic)
7937             {
7938               if (entry->d_tag == DT_USED
7939                   && VALID_DYNAMIC_NAME (entry->d_un.d_val))
7940                 {
7941                   char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
7942
7943                   if (*name)
7944                     {
7945                       printf (_("Not needed object: [%s]\n"), name);
7946                       break;
7947                     }
7948                 }
7949
7950               print_vma (entry->d_un.d_val, PREFIX_HEX);
7951               putchar ('\n');
7952             }
7953           break;
7954
7955         case DT_BIND_NOW:
7956           /* The value of this entry is ignored.  */
7957           if (do_dynamic)
7958             putchar ('\n');
7959           break;
7960
7961         case DT_GNU_PRELINKED:
7962           if (do_dynamic)
7963             {
7964               struct tm * tmp;
7965               time_t atime = entry->d_un.d_val;
7966
7967               tmp = gmtime (&atime);
7968               printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
7969                       tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
7970                       tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
7971
7972             }
7973           break;
7974
7975         case DT_GNU_HASH:
7976           dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
7977           if (do_dynamic)
7978             {
7979               print_vma (entry->d_un.d_val, PREFIX_HEX);
7980               putchar ('\n');
7981             }
7982           break;
7983
7984         default:
7985           if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
7986             version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
7987               entry->d_un.d_val;
7988
7989           if (do_dynamic)
7990             {
7991               switch (elf_header.e_machine)
7992                 {
7993                 case EM_MIPS:
7994                 case EM_MIPS_RS3_LE:
7995                   dynamic_section_mips_val (entry);
7996                   break;
7997                 case EM_PARISC:
7998                   dynamic_section_parisc_val (entry);
7999                   break;
8000                 case EM_IA_64:
8001                   dynamic_section_ia64_val (entry);
8002                   break;
8003                 default:
8004                   print_vma (entry->d_un.d_val, PREFIX_HEX);
8005                   putchar ('\n');
8006                 }
8007             }
8008           break;
8009         }
8010     }
8011
8012   return 1;
8013 }
8014
8015 static char *
8016 get_ver_flags (unsigned int flags)
8017 {
8018   static char buff[32];
8019
8020   buff[0] = 0;
8021
8022   if (flags == 0)
8023     return _("none");
8024
8025   if (flags & VER_FLG_BASE)
8026     strcat (buff, "BASE ");
8027
8028   if (flags & VER_FLG_WEAK)
8029     {
8030       if (flags & VER_FLG_BASE)
8031         strcat (buff, "| ");
8032
8033       strcat (buff, "WEAK ");
8034     }
8035
8036   if (flags & VER_FLG_INFO)
8037     {
8038       if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
8039         strcat (buff, "| ");
8040
8041       strcat (buff, "INFO ");
8042     }
8043
8044   if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
8045     strcat (buff, _("| <unknown>"));
8046
8047   return buff;
8048 }
8049
8050 /* Display the contents of the version sections.  */
8051
8052 static int
8053 process_version_sections (FILE * file)
8054 {
8055   Elf_Internal_Shdr * section;
8056   unsigned i;
8057   int found = 0;
8058
8059   if (! do_version)
8060     return 1;
8061
8062   for (i = 0, section = section_headers;
8063        i < elf_header.e_shnum;
8064        i++, section++)
8065     {
8066       switch (section->sh_type)
8067         {
8068         case SHT_GNU_verdef:
8069           {
8070             Elf_External_Verdef * edefs;
8071             unsigned int idx;
8072             unsigned int cnt;
8073             char * endbuf;
8074
8075             found = 1;
8076
8077             printf
8078               (_("\nVersion definition section '%s' contains %u entries:\n"),
8079                SECTION_NAME (section), section->sh_info);
8080
8081             printf (_("  Addr: 0x"));
8082             printf_vma (section->sh_addr);
8083             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
8084                     (unsigned long) section->sh_offset, section->sh_link,
8085                     section->sh_link < elf_header.e_shnum
8086                     ? SECTION_NAME (section_headers + section->sh_link)
8087                     : _("<corrupt>"));
8088
8089             edefs = (Elf_External_Verdef *)
8090                 get_data (NULL, file, section->sh_offset, 1,section->sh_size,
8091                           _("version definition section"));
8092             if (!edefs)
8093               break;
8094             endbuf = (char *) edefs + section->sh_size;
8095
8096             for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
8097               {
8098                 char * vstart;
8099                 Elf_External_Verdef * edef;
8100                 Elf_Internal_Verdef ent;
8101                 Elf_External_Verdaux * eaux;
8102                 Elf_Internal_Verdaux aux;
8103                 int j;
8104                 int isum;
8105
8106                 /* Check for negative or very large indicies.  */
8107                 if ((unsigned char *) edefs + idx < (unsigned char *) edefs)
8108                   break;
8109
8110                 vstart = ((char *) edefs) + idx;
8111                 if (vstart + sizeof (*edef) > endbuf)
8112                   break;
8113
8114                 edef = (Elf_External_Verdef *) vstart;
8115
8116                 ent.vd_version = BYTE_GET (edef->vd_version);
8117                 ent.vd_flags   = BYTE_GET (edef->vd_flags);
8118                 ent.vd_ndx     = BYTE_GET (edef->vd_ndx);
8119                 ent.vd_cnt     = BYTE_GET (edef->vd_cnt);
8120                 ent.vd_hash    = BYTE_GET (edef->vd_hash);
8121                 ent.vd_aux     = BYTE_GET (edef->vd_aux);
8122                 ent.vd_next    = BYTE_GET (edef->vd_next);
8123
8124                 printf (_("  %#06x: Rev: %d  Flags: %s"),
8125                         idx, ent.vd_version, get_ver_flags (ent.vd_flags));
8126
8127                 printf (_("  Index: %d  Cnt: %d  "),
8128                         ent.vd_ndx, ent.vd_cnt);
8129
8130                 /* Check for overflow.  */
8131                 if ((unsigned char *)(vstart + ent.vd_aux) < (unsigned char *) vstart
8132                     || (unsigned char *)(vstart + ent.vd_aux) > (unsigned char *) endbuf)
8133                   break;
8134
8135                 vstart += ent.vd_aux;
8136
8137                 eaux = (Elf_External_Verdaux *) vstart;
8138
8139                 aux.vda_name = BYTE_GET (eaux->vda_name);
8140                 aux.vda_next = BYTE_GET (eaux->vda_next);
8141
8142                 if (VALID_DYNAMIC_NAME (aux.vda_name))
8143                   printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
8144                 else
8145                   printf (_("Name index: %ld\n"), aux.vda_name);
8146
8147                 isum = idx + ent.vd_aux;
8148
8149                 for (j = 1; j < ent.vd_cnt; j++)
8150                   {
8151                     /* Check for overflow.  */
8152                     if ((unsigned char *)(vstart + aux.vda_next) < (unsigned char *) vstart
8153                         || (unsigned char *)(vstart + aux.vda_next) > (unsigned char *) endbuf)
8154                       break;
8155
8156                     isum   += aux.vda_next;
8157                     vstart += aux.vda_next;
8158
8159                     eaux = (Elf_External_Verdaux *) vstart;
8160                     if (vstart + sizeof (*eaux) > endbuf)
8161                       break;
8162
8163                     aux.vda_name = BYTE_GET (eaux->vda_name);
8164                     aux.vda_next = BYTE_GET (eaux->vda_next);
8165
8166                     if (VALID_DYNAMIC_NAME (aux.vda_name))
8167                       printf (_("  %#06x: Parent %d: %s\n"),
8168                               isum, j, GET_DYNAMIC_NAME (aux.vda_name));
8169                     else
8170                       printf (_("  %#06x: Parent %d, name index: %ld\n"),
8171                               isum, j, aux.vda_name);
8172                   }
8173
8174                 if (j < ent.vd_cnt)
8175                   printf (_("  Version def aux past end of section\n"));
8176
8177                 idx += ent.vd_next;
8178               }
8179
8180             if (cnt < section->sh_info)
8181               printf (_("  Version definition past end of section\n"));
8182
8183             free (edefs);
8184           }
8185           break;
8186
8187         case SHT_GNU_verneed:
8188           {
8189             Elf_External_Verneed * eneed;
8190             unsigned int idx;
8191             unsigned int cnt;
8192             char * endbuf;
8193
8194             found = 1;
8195
8196             printf (_("\nVersion needs section '%s' contains %u entries:\n"),
8197                     SECTION_NAME (section), section->sh_info);
8198
8199             printf (_(" Addr: 0x"));
8200             printf_vma (section->sh_addr);
8201             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
8202                     (unsigned long) section->sh_offset, section->sh_link,
8203                     section->sh_link < elf_header.e_shnum
8204                     ? SECTION_NAME (section_headers + section->sh_link)
8205                     : _("<corrupt>"));
8206
8207             eneed = (Elf_External_Verneed *) get_data (NULL, file,
8208                                                        section->sh_offset, 1,
8209                                                        section->sh_size,
8210                                                        _("version need section"));
8211             if (!eneed)
8212               break;
8213             endbuf = (char *) eneed + section->sh_size;
8214
8215             for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
8216               {
8217                 Elf_External_Verneed * entry;
8218                 Elf_Internal_Verneed ent;
8219                 int j;
8220                 int isum;
8221                 char * vstart;
8222
8223                 if ((unsigned char *) eneed + idx < (unsigned char *) eneed)
8224                   break;
8225
8226                 vstart = ((char *) eneed) + idx;
8227                 if (vstart + sizeof (*entry) > endbuf)
8228                   break;
8229
8230                 entry = (Elf_External_Verneed *) vstart;
8231
8232                 ent.vn_version = BYTE_GET (entry->vn_version);
8233                 ent.vn_cnt     = BYTE_GET (entry->vn_cnt);
8234                 ent.vn_file    = BYTE_GET (entry->vn_file);
8235                 ent.vn_aux     = BYTE_GET (entry->vn_aux);
8236                 ent.vn_next    = BYTE_GET (entry->vn_next);
8237
8238                 printf (_("  %#06x: Version: %d"), idx, ent.vn_version);
8239
8240                 if (VALID_DYNAMIC_NAME (ent.vn_file))
8241                   printf (_("  File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
8242                 else
8243                   printf (_("  File: %lx"), ent.vn_file);
8244
8245                 printf (_("  Cnt: %d\n"), ent.vn_cnt);
8246
8247                 /* Check for overflow.  */
8248                 if ((unsigned char *)(vstart + ent.vn_aux) < (unsigned char *) vstart
8249                     || (unsigned char *)(vstart + ent.vn_aux) > (unsigned char *) endbuf)
8250                   break;
8251
8252                 vstart += ent.vn_aux;
8253
8254                 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
8255                   {
8256                     Elf_External_Vernaux * eaux;
8257                     Elf_Internal_Vernaux aux;
8258
8259                     if (vstart + sizeof (*eaux) > endbuf)
8260                       break;
8261                     eaux = (Elf_External_Vernaux *) vstart;
8262
8263                     aux.vna_hash  = BYTE_GET (eaux->vna_hash);
8264                     aux.vna_flags = BYTE_GET (eaux->vna_flags);
8265                     aux.vna_other = BYTE_GET (eaux->vna_other);
8266                     aux.vna_name  = BYTE_GET (eaux->vna_name);
8267                     aux.vna_next  = BYTE_GET (eaux->vna_next);
8268
8269                     if (VALID_DYNAMIC_NAME (aux.vna_name))
8270                       printf (_("  %#06x:   Name: %s"),
8271                               isum, GET_DYNAMIC_NAME (aux.vna_name));
8272                     else
8273                       printf (_("  %#06x:   Name index: %lx"),
8274                               isum, aux.vna_name);
8275
8276                     printf (_("  Flags: %s  Version: %d\n"),
8277                             get_ver_flags (aux.vna_flags), aux.vna_other);
8278
8279                     /* Check for overflow.  */
8280                     if ((unsigned char *)(vstart + aux.vna_next) < (unsigned char *) vstart
8281                         || (unsigned char *)(vstart + aux.vna_next) > (unsigned char *) endbuf)
8282                       break;
8283
8284                     isum   += aux.vna_next;
8285                     vstart += aux.vna_next;
8286                   }
8287                 if (j < ent.vn_cnt)
8288                   printf (_("  Version need aux past end of section\n"));
8289
8290                 idx += ent.vn_next;
8291               }
8292             if (cnt < section->sh_info)
8293               printf (_("  Version need past end of section\n"));
8294
8295             free (eneed);
8296           }
8297           break;
8298
8299         case SHT_GNU_versym:
8300           {
8301             Elf_Internal_Shdr * link_section;
8302             int total;
8303             int cnt;
8304             unsigned char * edata;
8305             unsigned short * data;
8306             char * strtab;
8307             Elf_Internal_Sym * symbols;
8308             Elf_Internal_Shdr * string_sec;
8309             long off;
8310
8311             if (section->sh_link >= elf_header.e_shnum)
8312               break;
8313
8314             link_section = section_headers + section->sh_link;
8315             total = section->sh_size / sizeof (Elf_External_Versym);
8316
8317             if (link_section->sh_link >= elf_header.e_shnum)
8318               break;
8319
8320             found = 1;
8321
8322             symbols = GET_ELF_SYMBOLS (file, link_section);
8323             if (symbols == NULL)
8324               break;
8325
8326             string_sec = section_headers + link_section->sh_link;
8327
8328             strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
8329                                         string_sec->sh_size,
8330                                         _("version string table"));
8331             if (!strtab)
8332               {
8333                 free (symbols);
8334                 break;
8335               }
8336
8337             printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
8338                     SECTION_NAME (section), total);
8339
8340             printf (_(" Addr: "));
8341             printf_vma (section->sh_addr);
8342             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
8343                     (unsigned long) section->sh_offset, section->sh_link,
8344                     SECTION_NAME (link_section));
8345
8346             off = offset_from_vma (file,
8347                                    version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
8348                                    total * sizeof (short));
8349             edata = (unsigned char *) get_data (NULL, file, off, total,
8350                                                 sizeof (short),
8351                                                 _("version symbol data"));
8352             if (!edata)
8353               {
8354                 free (strtab);
8355                 free (symbols);
8356                 break;
8357               }
8358
8359             data = (short unsigned int *) cmalloc (total, sizeof (short));
8360
8361             for (cnt = total; cnt --;)
8362               data[cnt] = byte_get (edata + cnt * sizeof (short),
8363                                     sizeof (short));
8364
8365             free (edata);
8366
8367             for (cnt = 0; cnt < total; cnt += 4)
8368               {
8369                 int j, nn;
8370                 int check_def, check_need;
8371                 char * name;
8372
8373                 printf ("  %03x:", cnt);
8374
8375                 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
8376                   switch (data[cnt + j])
8377                     {
8378                     case 0:
8379                       fputs (_("   0 (*local*)    "), stdout);
8380                       break;
8381
8382                     case 1:
8383                       fputs (_("   1 (*global*)   "), stdout);
8384                       break;
8385
8386                     default:
8387                       nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
8388                                    data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
8389
8390                       /* If this index value is greater than the size of the symbols
8391                          array, break to avoid an out-of-bounds read,  */
8392                       if ((unsigned long)(cnt + j) >=
8393                          ((unsigned long)link_section->sh_size /
8394                           (unsigned long)link_section->sh_entsize))
8395                         {
8396                           warn (_("invalid index into symbol array\n"));
8397                           break;
8398                         }
8399
8400                       check_def = 1;
8401                       check_need = 1;
8402                       if (symbols[cnt + j].st_shndx >= elf_header.e_shnum
8403                           || section_headers[symbols[cnt + j].st_shndx].sh_type
8404                              != SHT_NOBITS)
8405                         {
8406                           if (symbols[cnt + j].st_shndx == SHN_UNDEF)
8407                             check_def = 0;
8408                           else
8409                             check_need = 0;
8410                         }
8411
8412                       if (check_need
8413                           && version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
8414                         {
8415                           Elf_Internal_Verneed ivn;
8416                           unsigned long offset;
8417
8418                           offset = offset_from_vma
8419                             (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
8420                              sizeof (Elf_External_Verneed));
8421
8422                           do
8423                             {
8424                               Elf_Internal_Vernaux ivna;
8425                               Elf_External_Verneed evn;
8426                               Elf_External_Vernaux evna;
8427                               unsigned long a_off;
8428
8429                               if (get_data (&evn, file, offset, sizeof (evn), 1,
8430                                             _("version need")) == NULL)
8431                                 break;
8432                               
8433                               ivn.vn_aux  = BYTE_GET (evn.vn_aux);
8434                               ivn.vn_next = BYTE_GET (evn.vn_next);
8435
8436                               a_off = offset + ivn.vn_aux;
8437
8438                               do
8439                                 {
8440                                   if (get_data (&evna, file, a_off, sizeof (evna),
8441                                                 1, _("version need aux (2)")) == NULL)
8442                                     {
8443                                       ivna.vna_next  = 0;
8444                                       ivna.vna_other = 0;
8445                                     }
8446                                   else
8447                                     {
8448                                       ivna.vna_next  = BYTE_GET (evna.vna_next);
8449                                       ivna.vna_other = BYTE_GET (evna.vna_other);
8450                                     }
8451
8452                                   a_off += ivna.vna_next;
8453                                 }
8454                               while (ivna.vna_other != data[cnt + j]
8455                                      && ivna.vna_next != 0);
8456
8457                               if (ivna.vna_other == data[cnt + j])
8458                                 {
8459                                   ivna.vna_name = BYTE_GET (evna.vna_name);
8460
8461                                   if (ivna.vna_name >= string_sec->sh_size)
8462                                     name = _("*invalid*");
8463                                   else
8464                                     name = strtab + ivna.vna_name;
8465                                   nn += printf ("(%s%-*s",
8466                                                 name,
8467                                                 12 - (int) strlen (name),
8468                                                 ")");
8469                                   check_def = 0;
8470                                   break;
8471                                 }
8472
8473                               offset += ivn.vn_next;
8474                             }
8475                           while (ivn.vn_next);
8476                         }
8477
8478                       if (check_def && data[cnt + j] != 0x8001
8479                           && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
8480                         {
8481                           Elf_Internal_Verdef ivd;
8482                           Elf_External_Verdef evd;
8483                           unsigned long offset;
8484
8485                           offset = offset_from_vma
8486                             (file, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
8487                              sizeof evd);
8488
8489                           do
8490                             {
8491                               if (get_data (&evd, file, offset, sizeof (evd), 1,
8492                                             _("version def")) == NULL)
8493                                 {
8494                                   ivd.vd_next = 0;
8495                                   ivd.vd_ndx  = 0;
8496                                 }
8497                               else
8498                                 {
8499                                   ivd.vd_next = BYTE_GET (evd.vd_next);
8500                                   ivd.vd_ndx  = BYTE_GET (evd.vd_ndx);
8501                                 }
8502
8503                               offset += ivd.vd_next;
8504                             }
8505                           while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
8506                                  && ivd.vd_next != 0);
8507
8508                           if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
8509                             {
8510                               Elf_External_Verdaux evda;
8511                               Elf_Internal_Verdaux ivda;
8512
8513                               ivd.vd_aux = BYTE_GET (evd.vd_aux);
8514
8515                               if (get_data (&evda, file,
8516                                             offset - ivd.vd_next + ivd.vd_aux,
8517                                             sizeof (evda), 1,
8518                                             _("version def aux")) == NULL)
8519                                 break;
8520
8521                               ivda.vda_name = BYTE_GET (evda.vda_name);
8522
8523                               if (ivda.vda_name >= string_sec->sh_size)
8524                                 name = _("*invalid*");
8525                               else
8526                                 name = strtab + ivda.vda_name;
8527                               nn += printf ("(%s%-*s",
8528                                             name,
8529                                             12 - (int) strlen (name),
8530                                             ")");
8531                             }
8532                         }
8533
8534                       if (nn < 18)
8535                         printf ("%*c", 18 - nn, ' ');
8536                     }
8537
8538                 putchar ('\n');
8539               }
8540
8541             free (data);
8542             free (strtab);
8543             free (symbols);
8544           }
8545           break;
8546
8547         default:
8548           break;
8549         }
8550     }
8551
8552   if (! found)
8553     printf (_("\nNo version information found in this file.\n"));
8554
8555   return 1;
8556 }
8557
8558 static const char *
8559 get_symbol_binding (unsigned int binding)
8560 {
8561   static char buff[32];
8562
8563   switch (binding)
8564     {
8565     case STB_LOCAL:     return "LOCAL";
8566     case STB_GLOBAL:    return "GLOBAL";
8567     case STB_WEAK:      return "WEAK";
8568     default:
8569       if (binding >= STB_LOPROC && binding <= STB_HIPROC)
8570         snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
8571                   binding);
8572       else if (binding >= STB_LOOS && binding <= STB_HIOS)
8573         {
8574           if (binding == STB_GNU_UNIQUE
8575               && (elf_header.e_ident[EI_OSABI] == ELFOSABI_LINUX
8576                   /* GNU/Linux is still using the default value 0.  */
8577                   || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
8578             return "UNIQUE";
8579           snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
8580         }
8581       else
8582         snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
8583       return buff;
8584     }
8585 }
8586
8587 static const char *
8588 get_symbol_type (unsigned int type)
8589 {
8590   static char buff[32];
8591
8592   switch (type)
8593     {
8594     case STT_NOTYPE:    return "NOTYPE";
8595     case STT_OBJECT:    return "OBJECT";
8596     case STT_FUNC:      return "FUNC";
8597     case STT_SECTION:   return "SECTION";
8598     case STT_FILE:      return "FILE";
8599     case STT_COMMON:    return "COMMON";
8600     case STT_TLS:       return "TLS";
8601     case STT_RELC:      return "RELC";
8602     case STT_SRELC:     return "SRELC";
8603     default:
8604       if (type >= STT_LOPROC && type <= STT_HIPROC)
8605         {
8606           if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
8607             return "THUMB_FUNC";
8608
8609           if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
8610             return "REGISTER";
8611
8612           if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
8613             return "PARISC_MILLI";
8614
8615           snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
8616         }
8617       else if (type >= STT_LOOS && type <= STT_HIOS)
8618         {
8619           if (elf_header.e_machine == EM_PARISC)
8620             {
8621               if (type == STT_HP_OPAQUE)
8622                 return "HP_OPAQUE";
8623               if (type == STT_HP_STUB)
8624                 return "HP_STUB";
8625             }
8626
8627           if (type == STT_GNU_IFUNC
8628               && (elf_header.e_ident[EI_OSABI] == ELFOSABI_LINUX
8629                   /* GNU/Linux is still using the default value 0.  */
8630                   || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
8631             return "IFUNC";
8632
8633           snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
8634         }
8635       else
8636         snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
8637       return buff;
8638     }
8639 }
8640
8641 static const char *
8642 get_symbol_visibility (unsigned int visibility)
8643 {
8644   switch (visibility)
8645     {
8646     case STV_DEFAULT:   return "DEFAULT";
8647     case STV_INTERNAL:  return "INTERNAL";
8648     case STV_HIDDEN:    return "HIDDEN";
8649     case STV_PROTECTED: return "PROTECTED";
8650     default: abort ();
8651     }
8652 }
8653
8654 static const char *
8655 get_mips_symbol_other (unsigned int other)
8656 {
8657   switch (other)
8658     {
8659     case STO_OPTIONAL:  return "OPTIONAL";
8660     case STO_MIPS16:    return "MIPS16";
8661     case STO_MIPS_PLT:  return "MIPS PLT";
8662     case STO_MIPS_PIC:  return "MIPS PIC";
8663     default:            return NULL;
8664     }
8665 }
8666
8667 static const char *
8668 get_ia64_symbol_other (unsigned int other)
8669 {
8670   if (is_ia64_vms ())
8671     {
8672       static char res[32];
8673
8674       res[0] = 0;
8675
8676       /* Function types is for images and .STB files only.  */
8677       switch (elf_header.e_type)
8678         {
8679         case ET_DYN:
8680         case ET_EXEC:
8681           switch (VMS_ST_FUNC_TYPE (other))
8682             {
8683             case VMS_SFT_CODE_ADDR:
8684               strcat (res, " CA");
8685               break;
8686             case VMS_SFT_SYMV_IDX:
8687               strcat (res, " VEC");
8688               break;
8689             case VMS_SFT_FD:
8690               strcat (res, " FD");
8691               break;
8692             case VMS_SFT_RESERVE:
8693               strcat (res, " RSV");
8694               break;
8695             default:
8696               abort ();
8697             }
8698           break;
8699         default:
8700           break;
8701         }
8702       switch (VMS_ST_LINKAGE (other))
8703         {
8704         case VMS_STL_IGNORE:
8705           strcat (res, " IGN");
8706           break;
8707         case VMS_STL_RESERVE:
8708           strcat (res, " RSV");
8709           break;
8710         case VMS_STL_STD:
8711           strcat (res, " STD");
8712           break;
8713         case VMS_STL_LNK:
8714           strcat (res, " LNK");
8715           break;
8716         default:
8717           abort ();
8718         }
8719
8720       if (res[0] != 0)
8721         return res + 1;
8722       else
8723         return res;
8724     }
8725   return NULL;
8726 }
8727
8728 static const char *
8729 get_symbol_other (unsigned int other)
8730 {
8731   const char * result = NULL;
8732   static char buff [32];
8733
8734   if (other == 0)
8735     return "";
8736
8737   switch (elf_header.e_machine)
8738     {
8739     case EM_MIPS:
8740       result = get_mips_symbol_other (other);
8741       break;
8742     case EM_IA_64:
8743       result = get_ia64_symbol_other (other);
8744       break;
8745     default:
8746       break;
8747     }
8748
8749   if (result)
8750     return result;
8751
8752   snprintf (buff, sizeof buff, _("<other>: %x"), other);
8753   return buff;
8754 }
8755
8756 static const char *
8757 get_symbol_index_type (unsigned int type)
8758 {
8759   static char buff[32];
8760
8761   switch (type)
8762     {
8763     case SHN_UNDEF:     return "UND";
8764     case SHN_ABS:       return "ABS";
8765     case SHN_COMMON:    return "COM";
8766     default:
8767       if (type == SHN_IA_64_ANSI_COMMON
8768           && elf_header.e_machine == EM_IA_64
8769           && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
8770         return "ANSI_COM";
8771       else if ((elf_header.e_machine == EM_X86_64
8772                 || elf_header.e_machine == EM_L1OM)
8773                && type == SHN_X86_64_LCOMMON)
8774         return "LARGE_COM";
8775       else if ((type == SHN_MIPS_SCOMMON
8776                 && elf_header.e_machine == EM_MIPS)
8777                || (type == SHN_TIC6X_SCOMMON
8778                    && elf_header.e_machine == EM_TI_C6000))
8779         return "SCOM";
8780       else if (type == SHN_MIPS_SUNDEFINED
8781                && elf_header.e_machine == EM_MIPS)
8782         return "SUND";
8783       else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
8784         sprintf (buff, "PRC[0x%04x]", type & 0xffff);
8785       else if (type >= SHN_LOOS && type <= SHN_HIOS)
8786         sprintf (buff, "OS [0x%04x]", type & 0xffff);
8787       else if (type >= SHN_LORESERVE)
8788         sprintf (buff, "RSV[0x%04x]", type & 0xffff);
8789       else
8790         sprintf (buff, "%3d", type);
8791       break;
8792     }
8793
8794   return buff;
8795 }
8796
8797 static bfd_vma *
8798 get_dynamic_data (FILE * file, unsigned int number, unsigned int ent_size)
8799 {
8800   unsigned char * e_data;
8801   bfd_vma * i_data;
8802
8803   e_data = (unsigned char *) cmalloc (number, ent_size);
8804
8805   if (e_data == NULL)
8806     {
8807       error (_("Out of memory\n"));
8808       return NULL;
8809     }
8810
8811   if (fread (e_data, ent_size, number, file) != number)
8812     {
8813       error (_("Unable to read in dynamic data\n"));
8814       return NULL;
8815     }
8816
8817   i_data = (bfd_vma *) cmalloc (number, sizeof (*i_data));
8818
8819   if (i_data == NULL)
8820     {
8821       error (_("Out of memory\n"));
8822       free (e_data);
8823       return NULL;
8824     }
8825
8826   while (number--)
8827     i_data[number] = byte_get (e_data + number * ent_size, ent_size);
8828
8829   free (e_data);
8830
8831   return i_data;
8832 }
8833
8834 static void
8835 print_dynamic_symbol (bfd_vma si, unsigned long hn)
8836 {
8837   Elf_Internal_Sym * psym;
8838   int n;
8839
8840   psym = dynamic_symbols + si;
8841
8842   n = print_vma (si, DEC_5);
8843   if (n < 5)
8844     fputs ("     " + n, stdout);
8845   printf (" %3lu: ", hn);
8846   print_vma (psym->st_value, LONG_HEX);
8847   putchar (' ');
8848   print_vma (psym->st_size, DEC_5);
8849
8850   printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
8851   printf (" %-6s",  get_symbol_binding (ELF_ST_BIND (psym->st_info)));
8852   printf (" %-7s",  get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
8853   /* Check to see if any other bits in the st_other field are set.
8854      Note - displaying this information disrupts the layout of the
8855      table being generated, but for the moment this case is very
8856      rare.  */
8857   if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
8858     printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
8859   printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
8860   if (VALID_DYNAMIC_NAME (psym->st_name))
8861     print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
8862   else
8863     printf (_(" <corrupt: %14ld>"), psym->st_name);
8864   putchar ('\n');
8865 }
8866
8867 /* Dump the symbol table.  */
8868 static int
8869 process_symbol_table (FILE * file)
8870 {
8871   Elf_Internal_Shdr * section;
8872   bfd_vma nbuckets = 0;
8873   bfd_vma nchains = 0;
8874   bfd_vma * buckets = NULL;
8875   bfd_vma * chains = NULL;
8876   bfd_vma ngnubuckets = 0;
8877   bfd_vma * gnubuckets = NULL;
8878   bfd_vma * gnuchains = NULL;
8879   bfd_vma gnusymidx = 0;
8880
8881   if (!do_syms && !do_dyn_syms && !do_histogram)
8882     return 1;
8883
8884   if (dynamic_info[DT_HASH]
8885       && (do_histogram
8886           || (do_using_dynamic
8887               && !do_dyn_syms
8888               && dynamic_strings != NULL)))
8889     {
8890       unsigned char nb[8];
8891       unsigned char nc[8];
8892       int hash_ent_size = 4;
8893
8894       if ((elf_header.e_machine == EM_ALPHA
8895            || elf_header.e_machine == EM_S390
8896            || elf_header.e_machine == EM_S390_OLD)
8897           && elf_header.e_ident[EI_CLASS] == ELFCLASS64)
8898         hash_ent_size = 8;
8899
8900       if (fseek (file,
8901                  (archive_file_offset
8902                   + offset_from_vma (file, dynamic_info[DT_HASH],
8903                                      sizeof nb + sizeof nc)),
8904                  SEEK_SET))
8905         {
8906           error (_("Unable to seek to start of dynamic information\n"));
8907           goto no_hash;
8908         }
8909
8910       if (fread (nb, hash_ent_size, 1, file) != 1)
8911         {
8912           error (_("Failed to read in number of buckets\n"));
8913           goto no_hash;
8914         }
8915
8916       if (fread (nc, hash_ent_size, 1, file) != 1)
8917         {
8918           error (_("Failed to read in number of chains\n"));
8919           goto no_hash;
8920         }
8921
8922       nbuckets = byte_get (nb, hash_ent_size);
8923       nchains  = byte_get (nc, hash_ent_size);
8924
8925       buckets = get_dynamic_data (file, nbuckets, hash_ent_size);
8926       chains  = get_dynamic_data (file, nchains, hash_ent_size);
8927
8928     no_hash:
8929       if (buckets == NULL || chains == NULL)
8930         {
8931           if (do_using_dynamic)
8932             return 0;
8933           free (buckets);
8934           free (chains);
8935           buckets = NULL;
8936           chains = NULL;
8937           nbuckets = 0;
8938           nchains = 0;
8939         }
8940     }
8941
8942   if (dynamic_info_DT_GNU_HASH
8943       && (do_histogram
8944           || (do_using_dynamic
8945               && !do_dyn_syms
8946               && dynamic_strings != NULL)))
8947     {
8948       unsigned char nb[16];
8949       bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
8950       bfd_vma buckets_vma;
8951
8952       if (fseek (file,
8953                  (archive_file_offset
8954                   + offset_from_vma (file, dynamic_info_DT_GNU_HASH,
8955                                      sizeof nb)),
8956                  SEEK_SET))
8957         {
8958           error (_("Unable to seek to start of dynamic information\n"));
8959           goto no_gnu_hash;
8960         }
8961
8962       if (fread (nb, 16, 1, file) != 1)
8963         {
8964           error (_("Failed to read in number of buckets\n"));
8965           goto no_gnu_hash;
8966         }
8967
8968       ngnubuckets = byte_get (nb, 4);
8969       gnusymidx = byte_get (nb + 4, 4);
8970       bitmaskwords = byte_get (nb + 8, 4);
8971       buckets_vma = dynamic_info_DT_GNU_HASH + 16;
8972       if (is_32bit_elf)
8973         buckets_vma += bitmaskwords * 4;
8974       else
8975         buckets_vma += bitmaskwords * 8;
8976
8977       if (fseek (file,
8978                  (archive_file_offset
8979                   + offset_from_vma (file, buckets_vma, 4)),
8980                  SEEK_SET))
8981         {
8982           error (_("Unable to seek to start of dynamic information\n"));
8983           goto no_gnu_hash;
8984         }
8985
8986       gnubuckets = get_dynamic_data (file, ngnubuckets, 4);
8987
8988       if (gnubuckets == NULL)
8989         goto no_gnu_hash;
8990
8991       for (i = 0; i < ngnubuckets; i++)
8992         if (gnubuckets[i] != 0)
8993           {
8994             if (gnubuckets[i] < gnusymidx)
8995               return 0;
8996
8997             if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
8998               maxchain = gnubuckets[i];
8999           }
9000
9001       if (maxchain == 0xffffffff)
9002         goto no_gnu_hash;
9003
9004       maxchain -= gnusymidx;
9005
9006       if (fseek (file,
9007                  (archive_file_offset
9008                   + offset_from_vma (file, buckets_vma
9009                                            + 4 * (ngnubuckets + maxchain), 4)),
9010                  SEEK_SET))
9011         {
9012           error (_("Unable to seek to start of dynamic information\n"));
9013           goto no_gnu_hash;
9014         }
9015
9016       do
9017         {
9018           if (fread (nb, 4, 1, file) != 1)
9019             {
9020               error (_("Failed to determine last chain length\n"));
9021               goto no_gnu_hash;
9022             }
9023
9024           if (maxchain + 1 == 0)
9025             goto no_gnu_hash;
9026
9027           ++maxchain;
9028         }
9029       while ((byte_get (nb, 4) & 1) == 0);
9030
9031       if (fseek (file,
9032                  (archive_file_offset
9033                   + offset_from_vma (file, buckets_vma + 4 * ngnubuckets, 4)),
9034                  SEEK_SET))
9035         {
9036           error (_("Unable to seek to start of dynamic information\n"));
9037           goto no_gnu_hash;
9038         }
9039
9040       gnuchains = get_dynamic_data (file, maxchain, 4);
9041
9042     no_gnu_hash:
9043       if (gnuchains == NULL)
9044         {
9045           free (gnubuckets);
9046           gnubuckets = NULL;
9047           ngnubuckets = 0;
9048           if (do_using_dynamic)
9049             return 0;
9050         }
9051     }
9052
9053   if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
9054       && do_syms
9055       && do_using_dynamic
9056       && dynamic_strings != NULL)
9057     {
9058       unsigned long hn;
9059
9060       if (dynamic_info[DT_HASH])
9061         {
9062           bfd_vma si;
9063
9064           printf (_("\nSymbol table for image:\n"));
9065           if (is_32bit_elf)
9066             printf (_("  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"));
9067           else
9068             printf (_("  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"));
9069
9070           for (hn = 0; hn < nbuckets; hn++)
9071             {
9072               if (! buckets[hn])
9073                 continue;
9074
9075               for (si = buckets[hn]; si < nchains && si > 0; si = chains[si])
9076                 print_dynamic_symbol (si, hn);
9077             }
9078         }
9079
9080       if (dynamic_info_DT_GNU_HASH)
9081         {
9082           printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
9083           if (is_32bit_elf)
9084             printf (_("  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"));
9085           else
9086             printf (_("  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"));
9087
9088           for (hn = 0; hn < ngnubuckets; ++hn)
9089             if (gnubuckets[hn] != 0)
9090               {
9091                 bfd_vma si = gnubuckets[hn];
9092                 bfd_vma off = si - gnusymidx;
9093
9094                 do
9095                   {
9096                     print_dynamic_symbol (si, hn);
9097                     si++;
9098                   }
9099                 while ((gnuchains[off++] & 1) == 0);
9100               }
9101         }
9102     }
9103   else if (do_dyn_syms || (do_syms && !do_using_dynamic))
9104     {
9105       unsigned int i;
9106
9107       for (i = 0, section = section_headers;
9108            i < elf_header.e_shnum;
9109            i++, section++)
9110         {
9111           unsigned int si;
9112           char * strtab = NULL;
9113           unsigned long int strtab_size = 0;
9114           Elf_Internal_Sym * symtab;
9115           Elf_Internal_Sym * psym;
9116
9117           if ((section->sh_type != SHT_SYMTAB
9118                && section->sh_type != SHT_DYNSYM)
9119               || (!do_syms
9120                   && section->sh_type == SHT_SYMTAB))
9121             continue;
9122
9123           if (section->sh_entsize == 0)
9124             {
9125               printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
9126                       SECTION_NAME (section));
9127               continue;
9128             }
9129
9130           printf (_("\nSymbol table '%s' contains %lu entries:\n"),
9131                   SECTION_NAME (section),
9132                   (unsigned long) (section->sh_size / section->sh_entsize));
9133
9134           if (is_32bit_elf)
9135             printf (_("   Num:    Value  Size Type    Bind   Vis      Ndx Name\n"));
9136           else
9137             printf (_("   Num:    Value          Size Type    Bind   Vis      Ndx Name\n"));
9138
9139           symtab = GET_ELF_SYMBOLS (file, section);
9140           if (symtab == NULL)
9141             continue;
9142
9143           if (section->sh_link == elf_header.e_shstrndx)
9144             {
9145               strtab = string_table;
9146               strtab_size = string_table_length;
9147             }
9148           else if (section->sh_link < elf_header.e_shnum)
9149             {
9150               Elf_Internal_Shdr * string_sec;
9151
9152               string_sec = section_headers + section->sh_link;
9153
9154               strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
9155                                           1, string_sec->sh_size,
9156                                           _("string table"));
9157               strtab_size = strtab != NULL ? string_sec->sh_size : 0;
9158             }
9159
9160           for (si = 0, psym = symtab;
9161                si < section->sh_size / section->sh_entsize;
9162                si++, psym++)
9163             {
9164               printf ("%6d: ", si);
9165               print_vma (psym->st_value, LONG_HEX);
9166               putchar (' ');
9167               print_vma (psym->st_size, DEC_5);
9168               printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
9169               printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
9170               printf (" %-7s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
9171               /* Check to see if any other bits in the st_other field are set.
9172                  Note - displaying this information disrupts the layout of the
9173                  table being generated, but for the moment this case is very rare.  */
9174               if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
9175                 printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
9176               printf (" %4s ", get_symbol_index_type (psym->st_shndx));
9177               print_symbol (25, psym->st_name < strtab_size
9178                             ? strtab + psym->st_name : _("<corrupt>"));
9179
9180               if (section->sh_type == SHT_DYNSYM
9181                   && version_info[DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
9182                 {
9183                   unsigned char data[2];
9184                   unsigned short vers_data;
9185                   unsigned long offset;
9186                   int is_nobits;
9187                   int check_def;
9188
9189                   offset = offset_from_vma
9190                     (file, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
9191                      sizeof data + si * sizeof (vers_data));
9192
9193                   if (get_data (&data, file, offset + si * sizeof (vers_data),
9194                                 sizeof (data), 1, _("version data")) == NULL)
9195                     break;
9196
9197                   vers_data = byte_get (data, 2);
9198
9199                   is_nobits = (psym->st_shndx < elf_header.e_shnum
9200                                && section_headers[psym->st_shndx].sh_type
9201                                   == SHT_NOBITS);
9202
9203                   check_def = (psym->st_shndx != SHN_UNDEF);
9204
9205                   if ((vers_data & VERSYM_HIDDEN) || vers_data > 1)
9206                     {
9207                       if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)]
9208                           && (is_nobits || ! check_def))
9209                         {
9210                           Elf_External_Verneed evn;
9211                           Elf_Internal_Verneed ivn;
9212                           Elf_Internal_Vernaux ivna;
9213
9214                           /* We must test both.  */
9215                           offset = offset_from_vma
9216                             (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
9217                              sizeof evn);
9218
9219                           do
9220                             {
9221                               unsigned long vna_off;
9222
9223                               if (get_data (&evn, file, offset, sizeof (evn), 1,
9224                                             _("version need")) == NULL)
9225                                 {
9226                                   ivna.vna_next = 0;
9227                                   ivna.vna_other = 0;
9228                                   ivna.vna_name = 0;
9229                                   break;
9230                                 }
9231
9232                               ivn.vn_aux  = BYTE_GET (evn.vn_aux);
9233                               ivn.vn_next = BYTE_GET (evn.vn_next);
9234
9235                               vna_off = offset + ivn.vn_aux;
9236
9237                               do
9238                                 {
9239                                   Elf_External_Vernaux evna;
9240
9241                                   if (get_data (&evna, file, vna_off,
9242                                                 sizeof (evna), 1,
9243                                                 _("version need aux (3)")) == NULL)
9244                                     {
9245                                       ivna.vna_next = 0;
9246                                       ivna.vna_other = 0;
9247                                       ivna.vna_name = 0;
9248                                     }
9249                                   else
9250                                     {
9251                                       ivna.vna_other = BYTE_GET (evna.vna_other);
9252                                       ivna.vna_next  = BYTE_GET (evna.vna_next);
9253                                       ivna.vna_name  = BYTE_GET (evna.vna_name);
9254                                     }
9255
9256                                   vna_off += ivna.vna_next;
9257                                 }
9258                               while (ivna.vna_other != vers_data
9259                                      && ivna.vna_next != 0);
9260
9261                               if (ivna.vna_other == vers_data)
9262                                 break;
9263
9264                               offset += ivn.vn_next;
9265                             }
9266                           while (ivn.vn_next != 0);
9267
9268                           if (ivna.vna_other == vers_data)
9269                             {
9270                               printf ("@%s (%d)",
9271                                       ivna.vna_name < strtab_size
9272                                       ? strtab + ivna.vna_name : _("<corrupt>"),
9273                                       ivna.vna_other);
9274                               check_def = 0;
9275                             }
9276                           else if (! is_nobits)
9277                             error (_("bad dynamic symbol\n"));
9278                           else
9279                             check_def = 1;
9280                         }
9281
9282                       if (check_def)
9283                         {
9284                           if (vers_data != 0x8001
9285                               && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
9286                             {
9287                               Elf_Internal_Verdef ivd;
9288                               Elf_Internal_Verdaux ivda;
9289                               Elf_External_Verdaux evda;
9290                               unsigned long off;
9291
9292                               off = offset_from_vma
9293                                 (file,
9294                                  version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
9295                                  sizeof (Elf_External_Verdef));
9296
9297                               do
9298                                 {
9299                                   Elf_External_Verdef evd;
9300
9301                                   if (get_data (&evd, file, off, sizeof (evd),
9302                                                 1, _("version def")) == NULL)
9303                                     {
9304                                       ivd.vd_ndx = 0;
9305                                       ivd.vd_aux = 0;
9306                                       ivd.vd_next = 0;
9307                                     }
9308                                   else
9309                                     {
9310                                       ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
9311                                       ivd.vd_aux = BYTE_GET (evd.vd_aux);
9312                                       ivd.vd_next = BYTE_GET (evd.vd_next);
9313                                     }
9314
9315                                   off += ivd.vd_next;
9316                                 }
9317                               while (ivd.vd_ndx != (vers_data & VERSYM_VERSION)
9318                                      && ivd.vd_next != 0);
9319
9320                               off -= ivd.vd_next;
9321                               off += ivd.vd_aux;
9322
9323                               if (get_data (&evda, file, off, sizeof (evda),
9324                                             1, _("version def aux")) == NULL)
9325                                 break;
9326
9327                               ivda.vda_name = BYTE_GET (evda.vda_name);
9328
9329                               if (psym->st_name != ivda.vda_name)
9330                                 printf ((vers_data & VERSYM_HIDDEN)
9331                                         ? "@%s" : "@@%s",
9332                                         ivda.vda_name < strtab_size
9333                                         ? strtab + ivda.vda_name : _("<corrupt>"));
9334                             }
9335                         }
9336                     }
9337                 }
9338
9339               putchar ('\n');
9340             }
9341
9342           free (symtab);
9343           if (strtab != string_table)
9344             free (strtab);
9345         }
9346     }
9347   else if (do_syms)
9348     printf
9349       (_("\nDynamic symbol information is not available for displaying symbols.\n"));
9350
9351   if (do_histogram && buckets != NULL)
9352     {
9353       unsigned long * lengths;
9354       unsigned long * counts;
9355       unsigned long hn;
9356       bfd_vma si;
9357       unsigned long maxlength = 0;
9358       unsigned long nzero_counts = 0;
9359       unsigned long nsyms = 0;
9360
9361       printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
9362               (unsigned long) nbuckets);
9363       printf (_(" Length  Number     %% of total  Coverage\n"));
9364
9365       lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
9366       if (lengths == NULL)
9367         {
9368           error (_("Out of memory\n"));
9369           return 0;
9370         }
9371       for (hn = 0; hn < nbuckets; ++hn)
9372         {
9373           for (si = buckets[hn]; si > 0 && si < nchains; si = chains[si])
9374             {
9375               ++nsyms;
9376               if (maxlength < ++lengths[hn])
9377                 ++maxlength;
9378             }
9379         }
9380
9381       counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
9382       if (counts == NULL)
9383         {
9384           error (_("Out of memory\n"));
9385           return 0;
9386         }
9387
9388       for (hn = 0; hn < nbuckets; ++hn)
9389         ++counts[lengths[hn]];
9390
9391       if (nbuckets > 0)
9392         {
9393           unsigned long i;
9394           printf ("      0  %-10lu (%5.1f%%)\n",
9395                   counts[0], (counts[0] * 100.0) / nbuckets);
9396           for (i = 1; i <= maxlength; ++i)
9397             {
9398               nzero_counts += counts[i] * i;
9399               printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
9400                       i, counts[i], (counts[i] * 100.0) / nbuckets,
9401                       (nzero_counts * 100.0) / nsyms);
9402             }
9403         }
9404
9405       free (counts);
9406       free (lengths);
9407     }
9408
9409   if (buckets != NULL)
9410     {
9411       free (buckets);
9412       free (chains);
9413     }
9414
9415   if (do_histogram && gnubuckets != NULL)
9416     {
9417       unsigned long * lengths;
9418       unsigned long * counts;
9419       unsigned long hn;
9420       unsigned long maxlength = 0;
9421       unsigned long nzero_counts = 0;
9422       unsigned long nsyms = 0;
9423
9424       lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
9425       if (lengths == NULL)
9426         {
9427           error (_("Out of memory\n"));
9428           return 0;
9429         }
9430
9431       printf (_("\nHistogram for `.gnu.hash' bucket list length (total of %lu buckets):\n"),
9432               (unsigned long) ngnubuckets);
9433       printf (_(" Length  Number     %% of total  Coverage\n"));
9434
9435       for (hn = 0; hn < ngnubuckets; ++hn)
9436         if (gnubuckets[hn] != 0)
9437           {
9438             bfd_vma off, length = 1;
9439
9440             for (off = gnubuckets[hn] - gnusymidx;
9441                  (gnuchains[off] & 1) == 0; ++off)
9442               ++length;
9443             lengths[hn] = length;
9444             if (length > maxlength)
9445               maxlength = length;
9446             nsyms += length;
9447           }
9448
9449       counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
9450       if (counts == NULL)
9451         {
9452           error (_("Out of memory\n"));
9453           return 0;
9454         }
9455
9456       for (hn = 0; hn < ngnubuckets; ++hn)
9457         ++counts[lengths[hn]];
9458
9459       if (ngnubuckets > 0)
9460         {
9461           unsigned long j;
9462           printf ("      0  %-10lu (%5.1f%%)\n",
9463                   counts[0], (counts[0] * 100.0) / ngnubuckets);
9464           for (j = 1; j <= maxlength; ++j)
9465             {
9466               nzero_counts += counts[j] * j;
9467               printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
9468                       j, counts[j], (counts[j] * 100.0) / ngnubuckets,
9469                       (nzero_counts * 100.0) / nsyms);
9470             }
9471         }
9472
9473       free (counts);
9474       free (lengths);
9475       free (gnubuckets);
9476       free (gnuchains);
9477     }
9478
9479   return 1;
9480 }
9481
9482 static int
9483 process_syminfo (FILE * file ATTRIBUTE_UNUSED)
9484 {
9485   unsigned int i;
9486
9487   if (dynamic_syminfo == NULL
9488       || !do_dynamic)
9489     /* No syminfo, this is ok.  */
9490     return 1;
9491
9492   /* There better should be a dynamic symbol section.  */
9493   if (dynamic_symbols == NULL || dynamic_strings == NULL)
9494     return 0;
9495
9496   if (dynamic_addr)
9497     printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
9498             dynamic_syminfo_offset, dynamic_syminfo_nent);
9499
9500   printf (_(" Num: Name                           BoundTo     Flags\n"));
9501   for (i = 0; i < dynamic_syminfo_nent; ++i)
9502     {
9503       unsigned short int flags = dynamic_syminfo[i].si_flags;
9504
9505       printf ("%4d: ", i);
9506       if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
9507         print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
9508       else
9509         printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
9510       putchar (' ');
9511
9512       switch (dynamic_syminfo[i].si_boundto)
9513         {
9514         case SYMINFO_BT_SELF:
9515           fputs ("SELF       ", stdout);
9516           break;
9517         case SYMINFO_BT_PARENT:
9518           fputs ("PARENT     ", stdout);
9519           break;
9520         default:
9521           if (dynamic_syminfo[i].si_boundto > 0
9522               && dynamic_syminfo[i].si_boundto < dynamic_nent
9523               && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
9524             {
9525               print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
9526               putchar (' ' );
9527             }
9528           else
9529             printf ("%-10d ", dynamic_syminfo[i].si_boundto);
9530           break;
9531         }
9532
9533       if (flags & SYMINFO_FLG_DIRECT)
9534         printf (" DIRECT");
9535       if (flags & SYMINFO_FLG_PASSTHRU)
9536         printf (" PASSTHRU");
9537       if (flags & SYMINFO_FLG_COPY)
9538         printf (" COPY");
9539       if (flags & SYMINFO_FLG_LAZYLOAD)
9540         printf (" LAZYLOAD");
9541
9542       puts ("");
9543     }
9544
9545   return 1;
9546 }
9547
9548 /* Check to see if the given reloc needs to be handled in a target specific
9549    manner.  If so then process the reloc and return TRUE otherwise return
9550    FALSE.  */
9551
9552 static bfd_boolean
9553 target_specific_reloc_handling (Elf_Internal_Rela * reloc,
9554                                 unsigned char *     start,
9555                                 Elf_Internal_Sym *  symtab)
9556 {
9557   unsigned int reloc_type = get_reloc_type (reloc->r_info);
9558
9559   switch (elf_header.e_machine)
9560     {
9561     case EM_MN10300:
9562     case EM_CYGNUS_MN10300:
9563       {
9564         static Elf_Internal_Sym * saved_sym = NULL;
9565
9566         switch (reloc_type)
9567           {
9568           case 34: /* R_MN10300_ALIGN */
9569             return TRUE;
9570           case 33: /* R_MN10300_SYM_DIFF */
9571             saved_sym = symtab + get_reloc_symindex (reloc->r_info);
9572             return TRUE;
9573           case 1: /* R_MN10300_32 */
9574           case 2: /* R_MN10300_16 */
9575             if (saved_sym != NULL)
9576               {
9577                 bfd_vma value;
9578
9579                 value = reloc->r_addend
9580                   + (symtab[get_reloc_symindex (reloc->r_info)].st_value
9581                      - saved_sym->st_value);
9582
9583                 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
9584
9585                 saved_sym = NULL;
9586                 return TRUE;
9587               }
9588             break;
9589           default:
9590             if (saved_sym != NULL)
9591               error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc"));
9592             break;
9593           }
9594         break;
9595       }
9596     }
9597
9598   return FALSE;
9599 }
9600
9601 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
9602    DWARF debug sections.  This is a target specific test.  Note - we do not
9603    go through the whole including-target-headers-multiple-times route, (as
9604    we have already done with <elf/h8.h>) because this would become very
9605    messy and even then this function would have to contain target specific
9606    information (the names of the relocs instead of their numeric values).
9607    FIXME: This is not the correct way to solve this problem.  The proper way
9608    is to have target specific reloc sizing and typing functions created by
9609    the reloc-macros.h header, in the same way that it already creates the
9610    reloc naming functions.  */
9611
9612 static bfd_boolean
9613 is_32bit_abs_reloc (unsigned int reloc_type)
9614 {
9615   switch (elf_header.e_machine)
9616     {
9617     case EM_386:
9618     case EM_486:
9619       return reloc_type == 1; /* R_386_32.  */
9620     case EM_68K:
9621       return reloc_type == 1; /* R_68K_32.  */
9622     case EM_860:
9623       return reloc_type == 1; /* R_860_32.  */
9624     case EM_960:
9625       return reloc_type == 2; /* R_960_32.  */
9626     case EM_ALPHA:
9627       return reloc_type == 1; /* R_ALPHA_REFLONG.  */
9628     case EM_ARC:
9629       return reloc_type == 1; /* R_ARC_32.  */
9630     case EM_ARM:
9631       return reloc_type == 2; /* R_ARM_ABS32 */
9632     case EM_AVR_OLD:
9633     case EM_AVR:
9634       return reloc_type == 1;
9635     case EM_BLACKFIN:
9636       return reloc_type == 0x12; /* R_byte4_data.  */
9637     case EM_CRIS:
9638       return reloc_type == 3; /* R_CRIS_32.  */
9639     case EM_CR16:
9640     case EM_CR16_OLD:
9641       return reloc_type == 3; /* R_CR16_NUM32.  */
9642     case EM_CRX:
9643       return reloc_type == 15; /* R_CRX_NUM32.  */
9644     case EM_CYGNUS_FRV:
9645       return reloc_type == 1;
9646     case EM_CYGNUS_D10V:
9647     case EM_D10V:
9648       return reloc_type == 6; /* R_D10V_32.  */
9649     case EM_CYGNUS_D30V:
9650     case EM_D30V:
9651       return reloc_type == 12; /* R_D30V_32_NORMAL.  */
9652     case EM_DLX:
9653       return reloc_type == 3; /* R_DLX_RELOC_32.  */
9654     case EM_CYGNUS_FR30:
9655     case EM_FR30:
9656       return reloc_type == 3; /* R_FR30_32.  */
9657     case EM_H8S:
9658     case EM_H8_300:
9659     case EM_H8_300H:
9660       return reloc_type == 1; /* R_H8_DIR32.  */
9661     case EM_IA_64:
9662       return reloc_type == 0x65; /* R_IA64_SECREL32LSB.  */
9663     case EM_IP2K_OLD:
9664     case EM_IP2K:
9665       return reloc_type == 2; /* R_IP2K_32.  */
9666     case EM_IQ2000:
9667       return reloc_type == 2; /* R_IQ2000_32.  */
9668     case EM_LATTICEMICO32:
9669       return reloc_type == 3; /* R_LM32_32.  */
9670     case EM_M32C_OLD:
9671     case EM_M32C:
9672       return reloc_type == 3; /* R_M32C_32.  */
9673     case EM_M32R:
9674       return reloc_type == 34; /* R_M32R_32_RELA.  */
9675     case EM_MCORE:
9676       return reloc_type == 1; /* R_MCORE_ADDR32.  */
9677     case EM_CYGNUS_MEP:
9678       return reloc_type == 4; /* R_MEP_32.  */
9679     case EM_MICROBLAZE:
9680       return reloc_type == 1; /* R_MICROBLAZE_32.  */
9681     case EM_MIPS:
9682       return reloc_type == 2; /* R_MIPS_32.  */
9683     case EM_MMIX:
9684       return reloc_type == 4; /* R_MMIX_32.  */
9685     case EM_CYGNUS_MN10200:
9686     case EM_MN10200:
9687       return reloc_type == 1; /* R_MN10200_32.  */
9688     case EM_CYGNUS_MN10300:
9689     case EM_MN10300:
9690       return reloc_type == 1; /* R_MN10300_32.  */
9691     case EM_MOXIE:
9692       return reloc_type == 1; /* R_MOXIE_32.  */
9693     case EM_MSP430_OLD:
9694     case EM_MSP430:
9695       return reloc_type == 1; /* R_MSP43_32.  */
9696     case EM_MT:
9697       return reloc_type == 2; /* R_MT_32.  */
9698     case EM_ALTERA_NIOS2:
9699     case EM_NIOS32:
9700       return reloc_type == 1; /* R_NIOS_32.  */
9701     case EM_OPENRISC:
9702     case EM_OR32:
9703       return reloc_type == 1; /* R_OR32_32.  */
9704     case EM_PARISC:
9705       return (reloc_type == 1 /* R_PARISC_DIR32.  */
9706               || reloc_type == 41); /* R_PARISC_SECREL32.  */
9707     case EM_PJ:
9708     case EM_PJ_OLD:
9709       return reloc_type == 1; /* R_PJ_DATA_DIR32.  */
9710     case EM_PPC64:
9711       return reloc_type == 1; /* R_PPC64_ADDR32.  */
9712     case EM_PPC:
9713       return reloc_type == 1; /* R_PPC_ADDR32.  */
9714     case EM_RX:
9715       return reloc_type == 1; /* R_RX_DIR32.  */
9716     case EM_S370:
9717       return reloc_type == 1; /* R_I370_ADDR31.  */
9718     case EM_S390_OLD:
9719     case EM_S390:
9720       return reloc_type == 4; /* R_S390_32.  */
9721     case EM_SCORE:
9722       return reloc_type == 8; /* R_SCORE_ABS32.  */
9723     case EM_SH:
9724       return reloc_type == 1; /* R_SH_DIR32.  */
9725     case EM_SPARC32PLUS:
9726     case EM_SPARCV9:
9727     case EM_SPARC:
9728       return reloc_type == 3 /* R_SPARC_32.  */
9729         || reloc_type == 23; /* R_SPARC_UA32.  */
9730     case EM_SPU:
9731       return reloc_type == 6; /* R_SPU_ADDR32 */
9732     case EM_TI_C6000:
9733       return reloc_type == 1; /* R_C6000_ABS32.  */
9734     case EM_CYGNUS_V850:
9735     case EM_V850:
9736       return reloc_type == 6; /* R_V850_ABS32.  */
9737     case EM_VAX:
9738       return reloc_type == 1; /* R_VAX_32.  */
9739     case EM_X86_64:
9740     case EM_L1OM:
9741       return reloc_type == 10; /* R_X86_64_32.  */
9742     case EM_XC16X:
9743     case EM_C166:
9744       return reloc_type == 3; /* R_XC16C_ABS_32.  */
9745     case EM_XSTORMY16:
9746       return reloc_type == 1; /* R_XSTROMY16_32.  */
9747     case EM_XTENSA_OLD:
9748     case EM_XTENSA:
9749       return reloc_type == 1; /* R_XTENSA_32.  */
9750     default:
9751       error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
9752              elf_header.e_machine);
9753       abort ();
9754     }
9755 }
9756
9757 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
9758    a 32-bit pc-relative RELA relocation used in DWARF debug sections.  */
9759
9760 static bfd_boolean
9761 is_32bit_pcrel_reloc (unsigned int reloc_type)
9762 {
9763   switch (elf_header.e_machine)
9764     {
9765     case EM_386:
9766     case EM_486:
9767       return reloc_type == 2;  /* R_386_PC32.  */
9768     case EM_68K:
9769       return reloc_type == 4;  /* R_68K_PC32.  */
9770     case EM_ALPHA:
9771       return reloc_type == 10; /* R_ALPHA_SREL32.  */
9772     case EM_ARM:
9773       return reloc_type == 3;  /* R_ARM_REL32 */
9774     case EM_MICROBLAZE:
9775       return reloc_type == 2;  /* R_MICROBLAZE_32_PCREL.  */
9776     case EM_PARISC:
9777       return reloc_type == 9;  /* R_PARISC_PCREL32.  */
9778     case EM_PPC:
9779       return reloc_type == 26; /* R_PPC_REL32.  */
9780     case EM_PPC64:
9781       return reloc_type == 26; /* R_PPC64_REL32.  */
9782     case EM_S390_OLD:
9783     case EM_S390:
9784       return reloc_type == 5;  /* R_390_PC32.  */
9785     case EM_SH:
9786       return reloc_type == 2;  /* R_SH_REL32.  */
9787     case EM_SPARC32PLUS:
9788     case EM_SPARCV9:
9789     case EM_SPARC:
9790       return reloc_type == 6;  /* R_SPARC_DISP32.  */
9791     case EM_SPU:
9792       return reloc_type == 13; /* R_SPU_REL32.  */
9793     case EM_X86_64:
9794     case EM_L1OM:
9795       return reloc_type == 2;  /* R_X86_64_PC32.  */
9796     case EM_XTENSA_OLD:
9797     case EM_XTENSA:
9798       return reloc_type == 14; /* R_XTENSA_32_PCREL.  */
9799     default:
9800       /* Do not abort or issue an error message here.  Not all targets use
9801          pc-relative 32-bit relocs in their DWARF debug information and we
9802          have already tested for target coverage in is_32bit_abs_reloc.  A
9803          more helpful warning message will be generated by apply_relocations
9804          anyway, so just return.  */
9805       return FALSE;
9806     }
9807 }
9808
9809 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
9810    a 64-bit absolute RELA relocation used in DWARF debug sections.  */
9811
9812 static bfd_boolean
9813 is_64bit_abs_reloc (unsigned int reloc_type)
9814 {
9815   switch (elf_header.e_machine)
9816     {
9817     case EM_ALPHA:
9818       return reloc_type == 2; /* R_ALPHA_REFQUAD.  */
9819     case EM_IA_64:
9820       return reloc_type == 0x27; /* R_IA64_DIR64LSB.  */
9821     case EM_PARISC:
9822       return reloc_type == 80; /* R_PARISC_DIR64.  */
9823     case EM_PPC64:
9824       return reloc_type == 38; /* R_PPC64_ADDR64.  */
9825     case EM_SPARC32PLUS:
9826     case EM_SPARCV9:
9827     case EM_SPARC:
9828       return reloc_type == 54; /* R_SPARC_UA64.  */
9829     case EM_X86_64:
9830     case EM_L1OM:
9831       return reloc_type == 1; /* R_X86_64_64.  */
9832     case EM_S390_OLD:
9833     case EM_S390:
9834       return reloc_type == 22;  /* R_S390_64 */
9835     case EM_MIPS:
9836       return reloc_type == 18;  /* R_MIPS_64 */
9837     default:
9838       return FALSE;
9839     }
9840 }
9841
9842 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
9843    a 64-bit pc-relative RELA relocation used in DWARF debug sections.  */
9844
9845 static bfd_boolean
9846 is_64bit_pcrel_reloc (unsigned int reloc_type)
9847 {
9848   switch (elf_header.e_machine)
9849     {
9850     case EM_ALPHA:
9851       return reloc_type == 11; /* R_ALPHA_SREL64 */
9852     case EM_IA_64:
9853       return reloc_type == 0x4f; /* R_IA64_PCREL64LSB */
9854     case EM_PARISC:
9855       return reloc_type == 72; /* R_PARISC_PCREL64 */
9856     case EM_PPC64:
9857       return reloc_type == 44; /* R_PPC64_REL64 */
9858     case EM_SPARC32PLUS:
9859     case EM_SPARCV9:
9860     case EM_SPARC:
9861       return reloc_type == 46; /* R_SPARC_DISP64 */
9862     case EM_X86_64:
9863     case EM_L1OM:
9864       return reloc_type == 24; /* R_X86_64_PC64 */
9865     case EM_S390_OLD:
9866     case EM_S390:
9867       return reloc_type == 23;  /* R_S390_PC64 */
9868     default:
9869       return FALSE;
9870     }
9871 }
9872
9873 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
9874    a 24-bit absolute RELA relocation used in DWARF debug sections.  */
9875
9876 static bfd_boolean
9877 is_24bit_abs_reloc (unsigned int reloc_type)
9878 {
9879   switch (elf_header.e_machine)
9880     {
9881     case EM_CYGNUS_MN10200:
9882     case EM_MN10200:
9883       return reloc_type == 4; /* R_MN10200_24.  */
9884     default:
9885       return FALSE;
9886     }
9887 }
9888
9889 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
9890    a 16-bit absolute RELA relocation used in DWARF debug sections.  */
9891
9892 static bfd_boolean
9893 is_16bit_abs_reloc (unsigned int reloc_type)
9894 {
9895   switch (elf_header.e_machine)
9896     {
9897     case EM_AVR_OLD:
9898     case EM_AVR:
9899       return reloc_type == 4; /* R_AVR_16.  */
9900     case EM_CYGNUS_D10V:
9901     case EM_D10V:
9902       return reloc_type == 3; /* R_D10V_16.  */
9903     case EM_H8S:
9904     case EM_H8_300:
9905     case EM_H8_300H:
9906       return reloc_type == R_H8_DIR16;
9907     case EM_IP2K_OLD:
9908     case EM_IP2K:
9909       return reloc_type == 1; /* R_IP2K_16.  */
9910     case EM_M32C_OLD:
9911     case EM_M32C:
9912       return reloc_type == 1; /* R_M32C_16 */
9913     case EM_MSP430_OLD:
9914     case EM_MSP430:
9915       return reloc_type == 5; /* R_MSP430_16_BYTE.  */
9916     case EM_ALTERA_NIOS2:
9917     case EM_NIOS32:
9918       return reloc_type == 9; /* R_NIOS_16.  */
9919     case EM_TI_C6000:
9920       return reloc_type == 2; /* R_C6000_ABS16.  */
9921     case EM_XC16X:
9922     case EM_C166:
9923       return reloc_type == 2; /* R_XC16C_ABS_16.  */
9924     default:
9925       return FALSE;
9926     }
9927 }
9928
9929 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
9930    relocation entries (possibly formerly used for SHT_GROUP sections).  */
9931
9932 static bfd_boolean
9933 is_none_reloc (unsigned int reloc_type)
9934 {
9935   switch (elf_header.e_machine)
9936     {
9937     case EM_68K:     /* R_68K_NONE.  */
9938     case EM_386:     /* R_386_NONE.  */
9939     case EM_SPARC32PLUS:
9940     case EM_SPARCV9:
9941     case EM_SPARC:   /* R_SPARC_NONE.  */
9942     case EM_MIPS:    /* R_MIPS_NONE.  */
9943     case EM_PARISC:  /* R_PARISC_NONE.  */
9944     case EM_ALPHA:   /* R_ALPHA_NONE.  */
9945     case EM_PPC:     /* R_PPC_NONE.  */
9946     case EM_PPC64:   /* R_PPC64_NONE.  */
9947     case EM_ARM:     /* R_ARM_NONE.  */
9948     case EM_IA_64:   /* R_IA64_NONE.  */
9949     case EM_SH:      /* R_SH_NONE.  */
9950     case EM_S390_OLD:
9951     case EM_S390:    /* R_390_NONE.  */
9952     case EM_CRIS:    /* R_CRIS_NONE.  */
9953     case EM_X86_64:  /* R_X86_64_NONE.  */
9954     case EM_L1OM:    /* R_X86_64_NONE.  */
9955     case EM_MN10300: /* R_MN10300_NONE.  */
9956     case EM_MOXIE:   /* R_MOXIE_NONE.  */
9957     case EM_M32R:    /* R_M32R_NONE.  */
9958     case EM_TI_C6000:/* R_C6000_NONE.  */
9959     case EM_XC16X:
9960     case EM_C166:    /* R_XC16X_NONE.  */
9961       return reloc_type == 0;
9962     case EM_XTENSA_OLD:
9963     case EM_XTENSA:
9964       return (reloc_type == 0      /* R_XTENSA_NONE.  */
9965               || reloc_type == 17  /* R_XTENSA_DIFF8.  */
9966               || reloc_type == 18  /* R_XTENSA_DIFF16.  */
9967               || reloc_type == 19  /* R_XTENSA_DIFF32.  */);
9968     }
9969   return FALSE;
9970 }
9971
9972 /* Apply relocations to a section.
9973    Note: So far support has been added only for those relocations
9974    which can be found in debug sections.
9975    FIXME: Add support for more relocations ?  */
9976
9977 static void
9978 apply_relocations (void * file,
9979                    Elf_Internal_Shdr * section,
9980                    unsigned char * start)
9981 {
9982   Elf_Internal_Shdr * relsec;
9983   unsigned char * end = start + section->sh_size;
9984
9985   if (elf_header.e_type != ET_REL)
9986     return;
9987
9988   /* Find the reloc section associated with the section.  */
9989   for (relsec = section_headers;
9990        relsec < section_headers + elf_header.e_shnum;
9991        ++relsec)
9992     {
9993       bfd_boolean is_rela;
9994       unsigned long num_relocs;
9995       Elf_Internal_Rela * relocs;
9996       Elf_Internal_Rela * rp;
9997       Elf_Internal_Shdr * symsec;
9998       Elf_Internal_Sym * symtab;
9999       Elf_Internal_Sym * sym;
10000
10001       if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
10002           || relsec->sh_info >= elf_header.e_shnum
10003           || section_headers + relsec->sh_info != section
10004           || relsec->sh_size == 0
10005           || relsec->sh_link >= elf_header.e_shnum)
10006         continue;
10007
10008       is_rela = relsec->sh_type == SHT_RELA;
10009
10010       if (is_rela)
10011         {
10012           if (!slurp_rela_relocs ((FILE *) file, relsec->sh_offset,
10013                                   relsec->sh_size, & relocs, & num_relocs))
10014             return;
10015         }
10016       else
10017         {
10018           if (!slurp_rel_relocs ((FILE *) file, relsec->sh_offset,
10019                                  relsec->sh_size, & relocs, & num_relocs))
10020             return;
10021         }
10022
10023       /* SH uses RELA but uses in place value instead of the addend field.  */
10024       if (elf_header.e_machine == EM_SH)
10025         is_rela = FALSE;
10026
10027       symsec = section_headers + relsec->sh_link;
10028       symtab = GET_ELF_SYMBOLS ((FILE *) file, symsec);
10029
10030       for (rp = relocs; rp < relocs + num_relocs; ++rp)
10031         {
10032           bfd_vma         addend;
10033           unsigned int    reloc_type;
10034           unsigned int    reloc_size;
10035           unsigned char * rloc;
10036
10037           reloc_type = get_reloc_type (rp->r_info);
10038
10039           if (target_specific_reloc_handling (rp, start, symtab))
10040             continue;
10041           else if (is_none_reloc (reloc_type))
10042             continue;
10043           else if (is_32bit_abs_reloc (reloc_type)
10044                    || is_32bit_pcrel_reloc (reloc_type))
10045             reloc_size = 4;
10046           else if (is_64bit_abs_reloc (reloc_type)
10047                    || is_64bit_pcrel_reloc (reloc_type))
10048             reloc_size = 8;
10049           else if (is_24bit_abs_reloc (reloc_type))
10050             reloc_size = 3;
10051           else if (is_16bit_abs_reloc (reloc_type))
10052             reloc_size = 2;
10053           else
10054             {
10055               warn (_("unable to apply unsupported reloc type %d to section %s\n"),
10056                     reloc_type, SECTION_NAME (section));
10057               continue;
10058             }
10059
10060           rloc = start + rp->r_offset;
10061           if ((rloc + reloc_size) > end)
10062             {
10063               warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
10064                     (unsigned long) rp->r_offset,
10065                     SECTION_NAME (section));
10066               continue;
10067             }
10068
10069           sym = symtab + get_reloc_symindex (rp->r_info);
10070
10071           /* If the reloc has a symbol associated with it,
10072              make sure that it is of an appropriate type.
10073
10074              Relocations against symbols without type can happen.
10075              Gcc -feliminate-dwarf2-dups may generate symbols
10076              without type for debug info.
10077
10078              Icc generates relocations against function symbols
10079              instead of local labels.
10080
10081              Relocations against object symbols can happen, eg when
10082              referencing a global array.  For an example of this see
10083              the _clz.o binary in libgcc.a.  */
10084           if (sym != symtab
10085               && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
10086             {
10087               warn (_("skipping unexpected symbol type %s in %ld'th relocation in section %s\n"),
10088                     get_symbol_type (ELF_ST_TYPE (sym->st_info)),
10089                     (long int)(rp - relocs),
10090                     SECTION_NAME (relsec));
10091               continue;
10092             }
10093
10094           addend = 0;
10095           if (is_rela)
10096             addend += rp->r_addend;
10097           /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
10098              partial_inplace.  */
10099           if (!is_rela
10100               || (elf_header.e_machine == EM_XTENSA
10101                   && reloc_type == 1)
10102               || ((elf_header.e_machine == EM_PJ
10103                    || elf_header.e_machine == EM_PJ_OLD)
10104                   && reloc_type == 1)
10105               || ((elf_header.e_machine == EM_D30V
10106                    || elf_header.e_machine == EM_CYGNUS_D30V)
10107                   && reloc_type == 12))
10108             addend += byte_get (rloc, reloc_size);
10109
10110           if (is_32bit_pcrel_reloc (reloc_type)
10111               || is_64bit_pcrel_reloc (reloc_type))
10112             {
10113               /* On HPPA, all pc-relative relocations are biased by 8.  */
10114               if (elf_header.e_machine == EM_PARISC)
10115                 addend -= 8;
10116               byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
10117                         reloc_size);
10118             }
10119           else
10120             byte_put (rloc, addend + sym->st_value, reloc_size);
10121         }
10122
10123       free (symtab);
10124       free (relocs);
10125       break;
10126     }
10127 }
10128
10129 #ifdef SUPPORT_DISASSEMBLY
10130 static int
10131 disassemble_section (Elf_Internal_Shdr * section, FILE * file)
10132 {
10133   printf (_("\nAssembly dump of section %s\n"),
10134           SECTION_NAME (section));
10135
10136   /* XXX -- to be done --- XXX */
10137
10138   return 1;
10139 }
10140 #endif
10141
10142 /* Reads in the contents of SECTION from FILE, returning a pointer
10143    to a malloc'ed buffer or NULL if something went wrong.  */
10144
10145 static char *
10146 get_section_contents (Elf_Internal_Shdr * section, FILE * file)
10147 {
10148   bfd_size_type num_bytes;
10149
10150   num_bytes = section->sh_size;
10151
10152   if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
10153     {
10154       printf (_("\nSection '%s' has no data to dump.\n"),
10155               SECTION_NAME (section));
10156       return NULL;
10157     }
10158
10159   return  (char *) get_data (NULL, file, section->sh_offset, 1, num_bytes,
10160                              _("section contents"));
10161 }
10162
10163
10164 static void
10165 dump_section_as_strings (Elf_Internal_Shdr * section, FILE * file)
10166 {
10167   Elf_Internal_Shdr * relsec;
10168   bfd_size_type num_bytes;
10169   char * data;
10170   char * end;
10171   char * start;
10172   char * name = SECTION_NAME (section);
10173   bfd_boolean some_strings_shown;
10174
10175   start = get_section_contents (section, file);
10176   if (start == NULL)
10177     return;
10178
10179   printf (_("\nString dump of section '%s':\n"), name);
10180
10181   /* If the section being dumped has relocations against it the user might
10182      be expecting these relocations to have been applied.  Check for this
10183      case and issue a warning message in order to avoid confusion.
10184      FIXME: Maybe we ought to have an option that dumps a section with
10185      relocs applied ?  */
10186   for (relsec = section_headers;
10187        relsec < section_headers + elf_header.e_shnum;
10188        ++relsec)
10189     {
10190       if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
10191           || relsec->sh_info >= elf_header.e_shnum
10192           || section_headers + relsec->sh_info != section
10193           || relsec->sh_size == 0
10194           || relsec->sh_link >= elf_header.e_shnum)
10195         continue;
10196
10197       printf (_("  Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
10198       break;
10199     }
10200
10201   num_bytes = section->sh_size;
10202   data = start;
10203   end  = start + num_bytes;
10204   some_strings_shown = FALSE;
10205
10206   while (data < end)
10207     {
10208       while (!ISPRINT (* data))
10209         if (++ data >= end)
10210           break;
10211
10212       if (data < end)
10213         {
10214 #ifndef __MSVCRT__
10215           /* PR 11128: Use two separate invocations in order to work
10216              around bugs in the Solaris 8 implementation of printf.  */
10217           printf ("  [%6tx]  ", data - start);
10218           printf ("%s\n", data);
10219 #else
10220           printf ("  [%6Ix]  %s\n", (size_t) (data - start), data);
10221 #endif
10222           data += strlen (data);
10223           some_strings_shown = TRUE;
10224         }
10225     }
10226
10227   if (! some_strings_shown)
10228     printf (_("  No strings found in this section."));
10229
10230   free (start);
10231
10232   putchar ('\n');
10233 }
10234
10235 static void
10236 dump_section_as_bytes (Elf_Internal_Shdr * section,
10237                        FILE * file,
10238                        bfd_boolean relocate)
10239 {
10240   Elf_Internal_Shdr * relsec;
10241   bfd_size_type bytes;
10242   bfd_vma addr;
10243   unsigned char * data;
10244   unsigned char * start;
10245
10246   start = (unsigned char *) get_section_contents (section, file);
10247   if (start == NULL)
10248     return;
10249
10250   printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section));
10251
10252   if (relocate)
10253     {
10254       apply_relocations (file, section, start);
10255     }
10256   else
10257     {
10258       /* If the section being dumped has relocations against it the user might
10259          be expecting these relocations to have been applied.  Check for this
10260          case and issue a warning message in order to avoid confusion.
10261          FIXME: Maybe we ought to have an option that dumps a section with
10262          relocs applied ?  */
10263       for (relsec = section_headers;
10264            relsec < section_headers + elf_header.e_shnum;
10265            ++relsec)
10266         {
10267           if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
10268               || relsec->sh_info >= elf_header.e_shnum
10269               || section_headers + relsec->sh_info != section
10270               || relsec->sh_size == 0
10271               || relsec->sh_link >= elf_header.e_shnum)
10272             continue;
10273
10274           printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
10275           break;
10276         }
10277     }
10278
10279   addr = section->sh_addr;
10280   bytes = section->sh_size;
10281   data = start;
10282
10283   while (bytes)
10284     {
10285       int j;
10286       int k;
10287       int lbytes;
10288
10289       lbytes = (bytes > 16 ? 16 : bytes);
10290
10291       printf ("  0x%8.8lx ", (unsigned long) addr);
10292
10293       for (j = 0; j < 16; j++)
10294         {
10295           if (j < lbytes)
10296             printf ("%2.2x", data[j]);
10297           else
10298             printf ("  ");
10299
10300           if ((j & 3) == 3)
10301             printf (" ");
10302         }
10303
10304       for (j = 0; j < lbytes; j++)
10305         {
10306           k = data[j];
10307           if (k >= ' ' && k < 0x7f)
10308             printf ("%c", k);
10309           else
10310             printf (".");
10311         }
10312
10313       putchar ('\n');
10314
10315       data  += lbytes;
10316       addr  += lbytes;
10317       bytes -= lbytes;
10318     }
10319
10320   free (start);
10321
10322   putchar ('\n');
10323 }
10324
10325 /* Uncompresses a section that was compressed using zlib, in place.  */
10326
10327 static int
10328 uncompress_section_contents (unsigned char **buffer ATTRIBUTE_UNUSED,
10329                              dwarf_size_type *size ATTRIBUTE_UNUSED)
10330 {
10331 #ifndef HAVE_ZLIB_H
10332   return FALSE;
10333 #else
10334   dwarf_size_type compressed_size = *size;
10335   unsigned char * compressed_buffer = *buffer;
10336   dwarf_size_type uncompressed_size;
10337   unsigned char * uncompressed_buffer;
10338   z_stream strm;
10339   int rc;
10340   dwarf_size_type header_size = 12;
10341
10342   /* Read the zlib header.  In this case, it should be "ZLIB" followed
10343      by the uncompressed section size, 8 bytes in big-endian order.  */
10344   if (compressed_size < header_size
10345       || ! streq ((char *) compressed_buffer, "ZLIB"))
10346     return 0;
10347
10348   uncompressed_size = compressed_buffer[4]; uncompressed_size <<= 8;
10349   uncompressed_size += compressed_buffer[5]; uncompressed_size <<= 8;
10350   uncompressed_size += compressed_buffer[6]; uncompressed_size <<= 8;
10351   uncompressed_size += compressed_buffer[7]; uncompressed_size <<= 8;
10352   uncompressed_size += compressed_buffer[8]; uncompressed_size <<= 8;
10353   uncompressed_size += compressed_buffer[9]; uncompressed_size <<= 8;
10354   uncompressed_size += compressed_buffer[10]; uncompressed_size <<= 8;
10355   uncompressed_size += compressed_buffer[11];
10356
10357   /* It is possible the section consists of several compressed
10358      buffers concatenated together, so we uncompress in a loop.  */
10359   strm.zalloc = NULL;
10360   strm.zfree = NULL;
10361   strm.opaque = NULL;
10362   strm.avail_in = compressed_size - header_size;
10363   strm.next_in = (Bytef *) compressed_buffer + header_size;
10364   strm.avail_out = uncompressed_size;
10365   uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
10366
10367   rc = inflateInit (& strm);
10368   while (strm.avail_in > 0)
10369     {
10370       if (rc != Z_OK)
10371         goto fail;
10372       strm.next_out = ((Bytef *) uncompressed_buffer
10373                        + (uncompressed_size - strm.avail_out));
10374       rc = inflate (&strm, Z_FINISH);
10375       if (rc != Z_STREAM_END)
10376         goto fail;
10377       rc = inflateReset (& strm);
10378     }
10379   rc = inflateEnd (& strm);
10380   if (rc != Z_OK
10381       || strm.avail_out != 0)
10382     goto fail;
10383
10384   free (compressed_buffer);
10385   *buffer = uncompressed_buffer;
10386   *size = uncompressed_size;
10387   return 1;
10388
10389  fail:
10390   free (uncompressed_buffer);
10391   /* Indicate decompression failure.  */
10392   *buffer = NULL;
10393   return 0;
10394 #endif  /* HAVE_ZLIB_H */
10395 }
10396
10397 static int
10398 load_specific_debug_section (enum dwarf_section_display_enum debug,
10399                              Elf_Internal_Shdr * sec, void * file)
10400 {
10401   struct dwarf_section * section = &debug_displays [debug].section;
10402   char buf [64];
10403
10404   /* If it is already loaded, do nothing.  */
10405   if (section->start != NULL)
10406     return 1;
10407
10408   snprintf (buf, sizeof (buf), _("%s section data"), section->name);
10409   section->address = sec->sh_addr;
10410   section->start = (unsigned char *) get_data (NULL, (FILE *) file,
10411                                                sec->sh_offset, 1,
10412                                                sec->sh_size, buf);
10413   if (section->start == NULL)
10414     section->size = 0;
10415   else
10416     {
10417       section->size = sec->sh_size;
10418       if (uncompress_section_contents (&section->start, &section->size))
10419         sec->sh_size = section->size;
10420     }
10421
10422   if (section->start == NULL)
10423     return 0;
10424
10425   if (debug_displays [debug].relocate)
10426     apply_relocations ((FILE *) file, sec, section->start);
10427
10428   return 1;
10429 }
10430
10431 int
10432 load_debug_section (enum dwarf_section_display_enum debug, void * file)
10433 {
10434   struct dwarf_section * section = &debug_displays [debug].section;
10435   Elf_Internal_Shdr * sec;
10436
10437   /* Locate the debug section.  */
10438   sec = find_section (section->uncompressed_name);
10439   if (sec != NULL)
10440     section->name = section->uncompressed_name;
10441   else
10442     {
10443       sec = find_section (section->compressed_name);
10444       if (sec != NULL)
10445         section->name = section->compressed_name;
10446     }
10447   if (sec == NULL)
10448     return 0;
10449
10450   return load_specific_debug_section (debug, sec, (FILE *) file);
10451 }
10452
10453 void
10454 free_debug_section (enum dwarf_section_display_enum debug)
10455 {
10456   struct dwarf_section * section = &debug_displays [debug].section;
10457
10458   if (section->start == NULL)
10459     return;
10460
10461   free ((char *) section->start);
10462   section->start = NULL;
10463   section->address = 0;
10464   section->size = 0;
10465 }
10466
10467 static int
10468 display_debug_section (Elf_Internal_Shdr * section, FILE * file)
10469 {
10470   char * name = SECTION_NAME (section);
10471   bfd_size_type length;
10472   int result = 1;
10473   int i;
10474
10475   length = section->sh_size;
10476   if (length == 0)
10477     {
10478       printf (_("\nSection '%s' has no debugging data.\n"), name);
10479       return 0;
10480     }
10481   if (section->sh_type == SHT_NOBITS)
10482     {
10483       /* There is no point in dumping the contents of a debugging section
10484          which has the NOBITS type - the bits in the file will be random.
10485          This can happen when a file containing a .eh_frame section is
10486          stripped with the --only-keep-debug command line option.  */
10487       printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"), name);
10488       return 0;
10489     }
10490
10491   if (const_strneq (name, ".gnu.linkonce.wi."))
10492     name = ".debug_info";
10493
10494   /* See if we know how to display the contents of this section.  */
10495   for (i = 0; i < max; i++)
10496     if (streq (debug_displays[i].section.uncompressed_name, name)
10497         || streq (debug_displays[i].section.compressed_name, name))
10498       {
10499         struct dwarf_section * sec = &debug_displays [i].section;
10500         int secondary = (section != find_section (name));
10501
10502         if (secondary)
10503           free_debug_section ((enum dwarf_section_display_enum) i);
10504
10505         if (streq (sec->uncompressed_name, name))
10506           sec->name = sec->uncompressed_name;
10507         else
10508           sec->name = sec->compressed_name;
10509         if (load_specific_debug_section ((enum dwarf_section_display_enum) i,
10510                                          section, file))
10511           {
10512             result &= debug_displays[i].display (sec, file);
10513
10514             if (secondary || (i != info && i != abbrev))
10515               free_debug_section ((enum dwarf_section_display_enum) i);
10516           }
10517
10518         break;
10519       }
10520
10521   if (i == max)
10522     {
10523       printf (_("Unrecognized debug section: %s\n"), name);
10524       result = 0;
10525     }
10526
10527   return result;
10528 }
10529
10530 /* Set DUMP_SECTS for all sections where dumps were requested
10531    based on section name.  */
10532
10533 static void
10534 initialise_dumps_byname (void)
10535 {
10536   struct dump_list_entry * cur;
10537
10538   for (cur = dump_sects_byname; cur; cur = cur->next)
10539     {
10540       unsigned int i;
10541       int any;
10542
10543       for (i = 0, any = 0; i < elf_header.e_shnum; i++)
10544         if (streq (SECTION_NAME (section_headers + i), cur->name))
10545           {
10546             request_dump_bynumber (i, cur->type);
10547             any = 1;
10548           }
10549
10550       if (!any)
10551         warn (_("Section '%s' was not dumped because it does not exist!\n"),
10552               cur->name);
10553     }
10554 }
10555
10556 static void
10557 process_section_contents (FILE * file)
10558 {
10559   Elf_Internal_Shdr * section;
10560   unsigned int i;
10561
10562   if (! do_dump)
10563     return;
10564
10565   initialise_dumps_byname ();
10566
10567   for (i = 0, section = section_headers;
10568        i < elf_header.e_shnum && i < num_dump_sects;
10569        i++, section++)
10570     {
10571 #ifdef SUPPORT_DISASSEMBLY
10572       if (dump_sects[i] & DISASS_DUMP)
10573         disassemble_section (section, file);
10574 #endif
10575       if (dump_sects[i] & HEX_DUMP)
10576         dump_section_as_bytes (section, file, FALSE);
10577
10578       if (dump_sects[i] & RELOC_DUMP)
10579         dump_section_as_bytes (section, file, TRUE);
10580
10581       if (dump_sects[i] & STRING_DUMP)
10582         dump_section_as_strings (section, file);
10583
10584       if (dump_sects[i] & DEBUG_DUMP)
10585         display_debug_section (section, file);
10586     }
10587
10588   /* Check to see if the user requested a
10589      dump of a section that does not exist.  */
10590   while (i++ < num_dump_sects)
10591     if (dump_sects[i])
10592       warn (_("Section %d was not dumped because it does not exist!\n"), i);
10593 }
10594
10595 static void
10596 process_mips_fpe_exception (int mask)
10597 {
10598   if (mask)
10599     {
10600       int first = 1;
10601       if (mask & OEX_FPU_INEX)
10602         fputs ("INEX", stdout), first = 0;
10603       if (mask & OEX_FPU_UFLO)
10604         printf ("%sUFLO", first ? "" : "|"), first = 0;
10605       if (mask & OEX_FPU_OFLO)
10606         printf ("%sOFLO", first ? "" : "|"), first = 0;
10607       if (mask & OEX_FPU_DIV0)
10608         printf ("%sDIV0", first ? "" : "|"), first = 0;
10609       if (mask & OEX_FPU_INVAL)
10610         printf ("%sINVAL", first ? "" : "|");
10611     }
10612   else
10613     fputs ("0", stdout);
10614 }
10615
10616 /* ARM EABI attributes section.  */
10617 typedef struct
10618 {
10619   int tag;
10620   const char * name;
10621   /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup.  */
10622   int type;
10623   const char ** table;
10624 } arm_attr_public_tag;
10625
10626 static const char * arm_attr_tag_CPU_arch[] =
10627   {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
10628    "v6K", "v7", "v6-M", "v6S-M", "v7E-M"};
10629 static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
10630 static const char * arm_attr_tag_THUMB_ISA_use[] =
10631   {"No", "Thumb-1", "Thumb-2"};
10632 static const char * arm_attr_tag_FP_arch[] =
10633   {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16"};
10634 static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
10635 static const char * arm_attr_tag_Advanced_SIMD_arch[] =
10636   {"No", "NEONv1", "NEONv1 with Fused-MAC"};
10637 static const char * arm_attr_tag_PCS_config[] =
10638   {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
10639    "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
10640 static const char * arm_attr_tag_ABI_PCS_R9_use[] =
10641   {"V6", "SB", "TLS", "Unused"};
10642 static const char * arm_attr_tag_ABI_PCS_RW_data[] =
10643   {"Absolute", "PC-relative", "SB-relative", "None"};
10644 static const char * arm_attr_tag_ABI_PCS_RO_data[] =
10645   {"Absolute", "PC-relative", "None"};
10646 static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
10647   {"None", "direct", "GOT-indirect"};
10648 static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
10649   {"None", "??? 1", "2", "??? 3", "4"};
10650 static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
10651 static const char * arm_attr_tag_ABI_FP_denormal[] =
10652   {"Unused", "Needed", "Sign only"};
10653 static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
10654 static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
10655 static const char * arm_attr_tag_ABI_FP_number_model[] =
10656   {"Unused", "Finite", "RTABI", "IEEE 754"};
10657 static const char * arm_attr_tag_ABI_enum_size[] =
10658   {"Unused", "small", "int", "forced to int"};
10659 static const char * arm_attr_tag_ABI_HardFP_use[] =
10660   {"As Tag_FP_arch", "SP only", "DP only", "SP and DP"};
10661 static const char * arm_attr_tag_ABI_VFP_args[] =
10662   {"AAPCS", "VFP registers", "custom"};
10663 static const char * arm_attr_tag_ABI_WMMX_args[] =
10664   {"AAPCS", "WMMX registers", "custom"};
10665 static const char * arm_attr_tag_ABI_optimization_goals[] =
10666   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
10667     "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
10668 static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
10669   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
10670     "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
10671 static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
10672 static const char * arm_attr_tag_FP_HP_extension[] =
10673   {"Not Allowed", "Allowed"};
10674 static const char * arm_attr_tag_ABI_FP_16bit_format[] =
10675   {"None", "IEEE 754", "Alternative Format"};
10676 static const char * arm_attr_tag_MPextension_use[] =
10677   {"Not Allowed", "Allowed"};
10678 static const char * arm_attr_tag_DIV_use[] =
10679   {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
10680     "Allowed in v7-A with integer division extension"};
10681 static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
10682 static const char * arm_attr_tag_Virtualization_use[] =
10683   {"Not Allowed", "TrustZone", "Virtualization Extensions",
10684     "TrustZone and Virtualization Extensions"};
10685 static const char * arm_attr_tag_MPextension_use_legacy[] =
10686   {"Not Allowed", "Allowed"};
10687
10688 #define LOOKUP(id, name) \
10689   {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
10690 static arm_attr_public_tag arm_attr_public_tags[] =
10691 {
10692   {4, "CPU_raw_name", 1, NULL},
10693   {5, "CPU_name", 1, NULL},
10694   LOOKUP(6, CPU_arch),
10695   {7, "CPU_arch_profile", 0, NULL},
10696   LOOKUP(8, ARM_ISA_use),
10697   LOOKUP(9, THUMB_ISA_use),
10698   LOOKUP(10, FP_arch),
10699   LOOKUP(11, WMMX_arch),
10700   LOOKUP(12, Advanced_SIMD_arch),
10701   LOOKUP(13, PCS_config),
10702   LOOKUP(14, ABI_PCS_R9_use),
10703   LOOKUP(15, ABI_PCS_RW_data),
10704   LOOKUP(16, ABI_PCS_RO_data),
10705   LOOKUP(17, ABI_PCS_GOT_use),
10706   LOOKUP(18, ABI_PCS_wchar_t),
10707   LOOKUP(19, ABI_FP_rounding),
10708   LOOKUP(20, ABI_FP_denormal),
10709   LOOKUP(21, ABI_FP_exceptions),
10710   LOOKUP(22, ABI_FP_user_exceptions),
10711   LOOKUP(23, ABI_FP_number_model),
10712   {24, "ABI_align_needed", 0, NULL},
10713   {25, "ABI_align_preserved", 0, NULL},
10714   LOOKUP(26, ABI_enum_size),
10715   LOOKUP(27, ABI_HardFP_use),
10716   LOOKUP(28, ABI_VFP_args),
10717   LOOKUP(29, ABI_WMMX_args),
10718   LOOKUP(30, ABI_optimization_goals),
10719   LOOKUP(31, ABI_FP_optimization_goals),
10720   {32, "compatibility", 0, NULL},
10721   LOOKUP(34, CPU_unaligned_access),
10722   LOOKUP(36, FP_HP_extension),
10723   LOOKUP(38, ABI_FP_16bit_format),
10724   LOOKUP(42, MPextension_use),
10725   LOOKUP(44, DIV_use),
10726   {64, "nodefaults", 0, NULL},
10727   {65, "also_compatible_with", 0, NULL},
10728   LOOKUP(66, T2EE_use),
10729   {67, "conformance", 1, NULL},
10730   LOOKUP(68, Virtualization_use),
10731   LOOKUP(70, MPextension_use_legacy)
10732 };
10733 #undef LOOKUP
10734
10735 static unsigned char *
10736 display_arm_attribute (unsigned char * p)
10737 {
10738   int tag;
10739   unsigned int len;
10740   int val;
10741   arm_attr_public_tag * attr;
10742   unsigned i;
10743   int type;
10744
10745   tag = read_uleb128 (p, &len);
10746   p += len;
10747   attr = NULL;
10748   for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
10749     {
10750       if (arm_attr_public_tags[i].tag == tag)
10751         {
10752           attr = &arm_attr_public_tags[i];
10753           break;
10754         }
10755     }
10756
10757   if (attr)
10758     {
10759       printf ("  Tag_%s: ", attr->name);
10760       switch (attr->type)
10761         {
10762         case 0:
10763           switch (tag)
10764             {
10765             case 7: /* Tag_CPU_arch_profile.  */
10766               val = read_uleb128 (p, &len);
10767               p += len;
10768               switch (val)
10769                 {
10770                 case 0: printf (_("None\n")); break;
10771                 case 'A': printf (_("Application\n")); break;
10772                 case 'R': printf (_("Realtime\n")); break;
10773                 case 'M': printf (_("Microcontroller\n")); break;
10774                 case 'S': printf (_("Application or Realtime\n")); break;
10775                 default: printf ("??? (%d)\n", val); break;
10776                 }
10777               break;
10778
10779             case 24: /* Tag_align_needed.  */
10780               val = read_uleb128 (p, &len);
10781               p += len;
10782               switch (val)
10783                 {
10784                 case 0: printf (_("None\n")); break;
10785                 case 1: printf (_("8-byte\n")); break;
10786                 case 2: printf (_("4-byte\n")); break;
10787                 case 3: printf ("??? 3\n"); break;
10788                 default:
10789                   if (val <= 12)
10790                     printf (_("8-byte and up to %d-byte extended\n"),
10791                             1 << val);
10792                   else
10793                     printf ("??? (%d)\n", val);
10794                   break;
10795                 }
10796               break;
10797
10798             case 25: /* Tag_align_preserved.  */
10799               val = read_uleb128 (p, &len);
10800               p += len;
10801               switch (val)
10802                 {
10803                 case 0: printf (_("None\n")); break;
10804                 case 1: printf (_("8-byte, except leaf SP\n")); break;
10805                 case 2: printf (_("8-byte\n")); break;
10806                 case 3: printf ("??? 3\n"); break;
10807                 default:
10808                   if (val <= 12)
10809                     printf (_("8-byte and up to %d-byte extended\n"),
10810                             1 << val);
10811                   else
10812                     printf ("??? (%d)\n", val);
10813                   break;
10814                 }
10815               break;
10816
10817             case 32: /* Tag_compatibility.  */
10818               val = read_uleb128 (p, &len);
10819               p += len;
10820               printf (_("flag = %d, vendor = %s\n"), val, p);
10821               p += strlen ((char *) p) + 1;
10822               break;
10823
10824             case 64: /* Tag_nodefaults.  */
10825               p++;
10826               printf (_("True\n"));
10827               break;
10828
10829             case 65: /* Tag_also_compatible_with.  */
10830               val = read_uleb128 (p, &len);
10831               p += len;
10832               if (val == 6 /* Tag_CPU_arch.  */)
10833                 {
10834                   val = read_uleb128 (p, &len);
10835                   p += len;
10836                   if ((unsigned int)val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
10837                     printf ("??? (%d)\n", val);
10838                   else
10839                     printf ("%s\n", arm_attr_tag_CPU_arch[val]);
10840                 }
10841               else
10842                 printf ("???\n");
10843               while (*(p++) != '\0' /* NUL terminator.  */);
10844               break;
10845
10846             default:
10847               abort ();
10848             }
10849           return p;
10850
10851         case 1:
10852         case 2:
10853           type = attr->type;
10854           break;
10855
10856         default:
10857           assert (attr->type & 0x80);
10858           val = read_uleb128 (p, &len);
10859           p += len;
10860           type = attr->type & 0x7f;
10861           if (val >= type)
10862             printf ("??? (%d)\n", val);
10863           else
10864             printf ("%s\n", attr->table[val]);
10865           return p;
10866         }
10867     }
10868   else
10869     {
10870       if (tag & 1)
10871         type = 1; /* String.  */
10872       else
10873         type = 2; /* uleb128.  */
10874       printf ("  Tag_unknown_%d: ", tag);
10875     }
10876
10877   if (type == 1)
10878     {
10879       printf ("\"%s\"\n", p);
10880       p += strlen ((char *) p) + 1;
10881     }
10882   else
10883     {
10884       val = read_uleb128 (p, &len);
10885       p += len;
10886       printf ("%d (0x%x)\n", val, val);
10887     }
10888
10889   return p;
10890 }
10891
10892 static unsigned char *
10893 display_gnu_attribute (unsigned char * p,
10894                        unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int))
10895 {
10896   int tag;
10897   unsigned int len;
10898   int val;
10899   int type;
10900
10901   tag = read_uleb128 (p, &len);
10902   p += len;
10903
10904   /* Tag_compatibility is the only generic GNU attribute defined at
10905      present.  */
10906   if (tag == 32)
10907     {
10908       val = read_uleb128 (p, &len);
10909       p += len;
10910       printf (_("flag = %d, vendor = %s\n"), val, p);
10911       p += strlen ((char *) p) + 1;
10912       return p;
10913     }
10914
10915   if ((tag & 2) == 0 && display_proc_gnu_attribute)
10916     return display_proc_gnu_attribute (p, tag);
10917
10918   if (tag & 1)
10919     type = 1; /* String.  */
10920   else
10921     type = 2; /* uleb128.  */
10922   printf ("  Tag_unknown_%d: ", tag);
10923
10924   if (type == 1)
10925     {
10926       printf ("\"%s\"\n", p);
10927       p += strlen ((char *) p) + 1;
10928     }
10929   else
10930     {
10931       val = read_uleb128 (p, &len);
10932       p += len;
10933       printf ("%d (0x%x)\n", val, val);
10934     }
10935
10936   return p;
10937 }
10938
10939 static unsigned char *
10940 display_power_gnu_attribute (unsigned char * p, int tag)
10941 {
10942   int type;
10943   unsigned int len;
10944   int val;
10945
10946   if (tag == Tag_GNU_Power_ABI_FP)
10947     {
10948       val = read_uleb128 (p, &len);
10949       p += len;
10950       printf ("  Tag_GNU_Power_ABI_FP: ");
10951
10952       switch (val)
10953         {
10954         case 0:
10955           printf (_("Hard or soft float\n"));
10956           break;
10957         case 1:
10958           printf (_("Hard float\n"));
10959           break;
10960         case 2:
10961           printf (_("Soft float\n"));
10962           break;
10963         case 3:
10964           printf (_("Single-precision hard float\n"));
10965           break;
10966         default:
10967           printf ("??? (%d)\n", val);
10968           break;
10969         }
10970       return p;
10971    }
10972
10973   if (tag == Tag_GNU_Power_ABI_Vector)
10974     {
10975       val = read_uleb128 (p, &len);
10976       p += len;
10977       printf ("  Tag_GNU_Power_ABI_Vector: ");
10978       switch (val)
10979         {
10980         case 0:
10981           printf (_("Any\n"));
10982           break;
10983         case 1:
10984           printf (_("Generic\n"));
10985           break;
10986         case 2:
10987           printf ("AltiVec\n");
10988           break;
10989         case 3:
10990           printf ("SPE\n");
10991           break;
10992         default:
10993           printf ("??? (%d)\n", val);
10994           break;
10995         }
10996       return p;
10997    }
10998
10999   if (tag == Tag_GNU_Power_ABI_Struct_Return)
11000     {
11001       val = read_uleb128 (p, &len);
11002       p += len;
11003       printf ("  Tag_GNU_Power_ABI_Struct_Return: ");
11004       switch (val)
11005        {
11006        case 0:
11007          printf (_("Any\n"));
11008          break;
11009        case 1:
11010          printf ("r3/r4\n");
11011          break;
11012        case 2:
11013          printf (_("Memory\n"));
11014          break;
11015        default:
11016          printf ("??? (%d)\n", val);
11017          break;
11018        }
11019       return p;
11020     }
11021
11022   if (tag & 1)
11023     type = 1; /* String.  */
11024   else
11025     type = 2; /* uleb128.  */
11026   printf ("  Tag_unknown_%d: ", tag);
11027
11028   if (type == 1)
11029     {
11030       printf ("\"%s\"\n", p);
11031       p += strlen ((char *) p) + 1;
11032     }
11033   else
11034     {
11035       val = read_uleb128 (p, &len);
11036       p += len;
11037       printf ("%d (0x%x)\n", val, val);
11038     }
11039
11040   return p;
11041 }
11042
11043 static unsigned char *
11044 display_mips_gnu_attribute (unsigned char * p, int tag)
11045 {
11046   int type;
11047   unsigned int len;
11048   int val;
11049
11050   if (tag == Tag_GNU_MIPS_ABI_FP)
11051     {
11052       val = read_uleb128 (p, &len);
11053       p += len;
11054       printf ("  Tag_GNU_MIPS_ABI_FP: ");
11055
11056       switch (val)
11057         {
11058         case 0:
11059           printf (_("Hard or soft float\n"));
11060           break;
11061         case 1:
11062           printf (_("Hard float (double precision)\n"));
11063           break;
11064         case 2:
11065           printf (_("Hard float (single precision)\n"));
11066           break;
11067         case 3:
11068           printf (_("Soft float\n"));
11069           break;
11070         case 4:
11071           printf (_("Hard float (MIPS32r2 64-bit FPU)\n"));
11072           break;
11073         default:
11074           printf ("??? (%d)\n", val);
11075           break;
11076         }
11077       return p;
11078    }
11079
11080   if (tag & 1)
11081     type = 1; /* String.  */
11082   else
11083     type = 2; /* uleb128.  */
11084   printf ("  Tag_unknown_%d: ", tag);
11085
11086   if (type == 1)
11087     {
11088       printf ("\"%s\"\n", p);
11089       p += strlen ((char *) p) + 1;
11090     }
11091   else
11092     {
11093       val = read_uleb128 (p, &len);
11094       p += len;
11095       printf ("%d (0x%x)\n", val, val);
11096     }
11097
11098   return p;
11099 }
11100
11101 static unsigned char *
11102 display_tic6x_attribute (unsigned char * p)
11103 {
11104   int tag;
11105   unsigned int len;
11106   int val;
11107
11108   tag = read_uleb128 (p, &len);
11109   p += len;
11110
11111   switch (tag)
11112     {
11113     case Tag_ISA:
11114       val = read_uleb128 (p, &len);
11115       p += len;
11116       printf ("  Tag_ISA: ");
11117
11118       switch (val)
11119         {
11120         case C6XABI_Tag_ISA_none:
11121           printf (_("None\n"));
11122           break;
11123         case C6XABI_Tag_ISA_C62X:
11124           printf ("C62x\n");
11125           break;
11126         case C6XABI_Tag_ISA_C67X:
11127           printf ("C67x\n");
11128           break;
11129         case C6XABI_Tag_ISA_C67XP:
11130           printf ("C67x+\n");
11131           break;
11132         case C6XABI_Tag_ISA_C64X:
11133           printf ("C64x\n");
11134           break;
11135         case C6XABI_Tag_ISA_C64XP:
11136           printf ("C64x+\n");
11137           break;
11138         case C6XABI_Tag_ISA_C674X:
11139           printf ("C674x\n");
11140           break;
11141         default:
11142           printf ("??? (%d)\n", val);
11143           break;
11144         }
11145       return p;
11146
11147     case Tag_ABI_wchar_t:
11148       val = read_uleb128 (p, &len);
11149       p += len;
11150       printf ("  Tag_ABI_wchar_t: ");
11151       switch (val)
11152         {
11153         case 0:
11154           printf (_("Not used\n"));
11155           break;
11156         case 1:
11157           printf (_("2 bytes\n"));
11158           break;
11159         case 2:
11160           printf (_("4 bytes\n"));
11161           break;
11162         default:
11163           printf ("??? (%d)\n", val);
11164           break;
11165         }
11166       return p;
11167
11168     case Tag_ABI_stack_align_needed:
11169       val = read_uleb128 (p, &len);
11170       p += len;
11171       printf ("  Tag_ABI_stack_align_needed: ");
11172       switch (val)
11173         {
11174         case 0:
11175           printf (_("8-byte\n"));
11176           break;
11177         case 1:
11178           printf (_("16-byte\n"));
11179           break;
11180         default:
11181           printf ("??? (%d)\n", val);
11182           break;
11183         }
11184       return p;
11185
11186     case Tag_ABI_stack_align_preserved:
11187       val = read_uleb128 (p, &len);
11188       p += len;
11189       printf ("  Tag_ABI_stack_align_preserved: ");
11190       switch (val)
11191         {
11192         case 0:
11193           printf (_("8-byte\n"));
11194           break;
11195         case 1:
11196           printf (_("16-byte\n"));
11197           break;
11198         default:
11199           printf ("??? (%d)\n", val);
11200           break;
11201         }
11202       return p;
11203
11204     case Tag_ABI_DSBT:
11205       val = read_uleb128 (p, &len);
11206       p += len;
11207       printf ("  Tag_ABI_DSBT: ");
11208       switch (val)
11209         {
11210         case 0:
11211           printf (_("DSBT addressing not used\n"));
11212           break;
11213         case 1:
11214           printf (_("DSBT addressing used\n"));
11215           break;
11216         default:
11217           printf ("??? (%d)\n", val);
11218           break;
11219         }
11220       return p;
11221
11222     case Tag_ABI_PID:
11223       val = read_uleb128 (p, &len);
11224       p += len;
11225       printf ("  Tag_ABI_PID: ");
11226       switch (val)
11227         {
11228         case 0:
11229           printf (_("Data addressing position-dependent\n"));
11230           break;
11231         case 1:
11232           printf (_("Data addressing position-independent, GOT near DP\n"));
11233           break;
11234         case 2:
11235           printf (_("Data addressing position-independent, GOT far from DP\n"));
11236           break;
11237         default:
11238           printf ("??? (%d)\n", val);
11239           break;
11240         }
11241       return p;
11242
11243     case Tag_ABI_PIC:
11244       val = read_uleb128 (p, &len);
11245       p += len;
11246       printf ("  Tag_ABI_PIC: ");
11247       switch (val)
11248         {
11249         case 0:
11250           printf (_("Code addressing position-dependent\n"));
11251           break;
11252         case 1:
11253           printf (_("Code addressing position-independent\n"));
11254           break;
11255         default:
11256           printf ("??? (%d)\n", val);
11257           break;
11258         }
11259       return p;
11260
11261     case Tag_ABI_array_object_alignment:
11262       val = read_uleb128 (p, &len);
11263       p += len;
11264       printf ("  Tag_ABI_array_object_alignment: ");
11265       switch (val)
11266         {
11267         case 0:
11268           printf (_("8-byte\n"));
11269           break;
11270         case 1:
11271           printf (_("4-byte\n"));
11272           break;
11273         case 2:
11274           printf (_("16-byte\n"));
11275           break;
11276         default:
11277           printf ("??? (%d)\n", val);
11278           break;
11279         }
11280       return p;
11281
11282     case Tag_ABI_array_object_align_expected:
11283       val = read_uleb128 (p, &len);
11284       p += len;
11285       printf ("  Tag_ABI_array_object_align_expected: ");
11286       switch (val)
11287         {
11288         case 0:
11289           printf (_("8-byte\n"));
11290           break;
11291         case 1:
11292           printf (_("4-byte\n"));
11293           break;
11294         case 2:
11295           printf (_("16-byte\n"));
11296           break;
11297         default:
11298           printf ("??? (%d)\n", val);
11299           break;
11300         }
11301       return p;
11302
11303     case Tag_ABI_compatibility:
11304       val = read_uleb128 (p, &len);
11305       p += len;
11306       printf ("  Tag_ABI_compatibility: ");
11307       printf (_("flag = %d, vendor = %s\n"), val, p);
11308       p += strlen ((char *) p) + 1;
11309       return p;
11310
11311     case Tag_ABI_conformance:
11312       printf ("  Tag_ABI_conformance: ");
11313       printf ("\"%s\"\n", p);
11314       p += strlen ((char *) p) + 1;
11315       return p;
11316     }
11317
11318   printf ("  Tag_unknown_%d: ", tag);
11319
11320   if (tag & 1)
11321     {
11322       printf ("\"%s\"\n", p);
11323       p += strlen ((char *) p) + 1;
11324     }
11325   else
11326     {
11327       val = read_uleb128 (p, &len);
11328       p += len;
11329       printf ("%d (0x%x)\n", val, val);
11330     }
11331
11332   return p;
11333 }
11334
11335 static int
11336 process_attributes (FILE * file,
11337                     const char * public_name,
11338                     unsigned int proc_type,
11339                     unsigned char * (* display_pub_attribute) (unsigned char *),
11340                     unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int))
11341 {
11342   Elf_Internal_Shdr * sect;
11343   unsigned char * contents;
11344   unsigned char * p;
11345   unsigned char * end;
11346   bfd_vma section_len;
11347   bfd_vma len;
11348   unsigned i;
11349
11350   /* Find the section header so that we get the size.  */
11351   for (i = 0, sect = section_headers;
11352        i < elf_header.e_shnum;
11353        i++, sect++)
11354     {
11355       if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
11356         continue;
11357
11358       contents = (unsigned char *) get_data (NULL, file, sect->sh_offset, 1,
11359                                              sect->sh_size, _("attributes"));
11360       if (contents == NULL)
11361         continue;
11362
11363       p = contents;
11364       if (*p == 'A')
11365         {
11366           len = sect->sh_size - 1;
11367           p++;
11368
11369           while (len > 0)
11370             {
11371               int namelen;
11372               bfd_boolean public_section;
11373               bfd_boolean gnu_section;
11374
11375               section_len = byte_get (p, 4);
11376               p += 4;
11377
11378               if (section_len > len)
11379                 {
11380                   printf (_("ERROR: Bad section length (%d > %d)\n"),
11381                           (int) section_len, (int) len);
11382                   section_len = len;
11383                 }
11384
11385               len -= section_len;
11386               printf (_("Attribute Section: %s\n"), p);
11387
11388               if (public_name && streq ((char *) p, public_name))
11389                 public_section = TRUE;
11390               else
11391                 public_section = FALSE;
11392
11393               if (streq ((char *) p, "gnu"))
11394                 gnu_section = TRUE;
11395               else
11396                 gnu_section = FALSE;
11397
11398               namelen = strlen ((char *) p) + 1;
11399               p += namelen;
11400               section_len -= namelen + 4;
11401
11402               while (section_len > 0)
11403                 {
11404                   int tag = *(p++);
11405                   int val;
11406                   bfd_vma size;
11407
11408                   size = byte_get (p, 4);
11409                   if (size > section_len)
11410                     {
11411                       printf (_("ERROR: Bad subsection length (%d > %d)\n"),
11412                               (int) size, (int) section_len);
11413                       size = section_len;
11414                     }
11415
11416                   section_len -= size;
11417                   end = p + size - 1;
11418                   p += 4;
11419
11420                   switch (tag)
11421                     {
11422                     case 1:
11423                       printf (_("File Attributes\n"));
11424                       break;
11425                     case 2:
11426                       printf (_("Section Attributes:"));
11427                       goto do_numlist;
11428                     case 3:
11429                       printf (_("Symbol Attributes:"));
11430                     do_numlist:
11431                       for (;;)
11432                         {
11433                           unsigned int j;
11434
11435                           val = read_uleb128 (p, &j);
11436                           p += j;
11437                           if (val == 0)
11438                             break;
11439                           printf (" %d", val);
11440                         }
11441                       printf ("\n");
11442                       break;
11443                     default:
11444                       printf (_("Unknown tag: %d\n"), tag);
11445                       public_section = FALSE;
11446                       break;
11447                     }
11448
11449                   if (public_section)
11450                     {
11451                       while (p < end)
11452                         p = display_pub_attribute (p);
11453                     }
11454                   else if (gnu_section)
11455                     {
11456                       while (p < end)
11457                         p = display_gnu_attribute (p,
11458                                                    display_proc_gnu_attribute);
11459                     }
11460                   else
11461                     {
11462                       /* ??? Do something sensible, like dump hex.  */
11463                       printf (_("  Unknown section contexts\n"));
11464                       p = end;
11465                     }
11466                 }
11467             }
11468         }
11469       else
11470         printf (_("Unknown format '%c'\n"), *p);
11471
11472       free (contents);
11473     }
11474   return 1;
11475 }
11476
11477 static int
11478 process_arm_specific (FILE * file)
11479 {
11480   return process_attributes (file, "aeabi", SHT_ARM_ATTRIBUTES,
11481                              display_arm_attribute, NULL);
11482 }
11483
11484 static int
11485 process_power_specific (FILE * file)
11486 {
11487   return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
11488                              display_power_gnu_attribute);
11489 }
11490
11491 static int
11492 process_tic6x_specific (FILE * file)
11493 {
11494   return process_attributes (file, "c6xabi", SHT_C6000_ATTRIBUTES,
11495                              display_tic6x_attribute, NULL);
11496 }
11497
11498 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
11499    Print the Address, Access and Initial fields of an entry at VMA ADDR
11500    and return the VMA of the next entry.  */
11501
11502 static bfd_vma
11503 print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
11504 {
11505   printf ("  ");
11506   print_vma (addr, LONG_HEX);
11507   printf (" ");
11508   if (addr < pltgot + 0xfff0)
11509     printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
11510   else
11511     printf ("%10s", "");
11512   printf (" ");
11513   if (data == NULL)
11514     printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
11515   else
11516     {
11517       bfd_vma entry;
11518
11519       entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
11520       print_vma (entry, LONG_HEX);
11521     }
11522   return addr + (is_32bit_elf ? 4 : 8);
11523 }
11524
11525 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
11526    PLTGOT.  Print the Address and Initial fields of an entry at VMA
11527    ADDR and return the VMA of the next entry.  */
11528
11529 static bfd_vma
11530 print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
11531 {
11532   printf ("  ");
11533   print_vma (addr, LONG_HEX);
11534   printf (" ");
11535   if (data == NULL)
11536     printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
11537   else
11538     {
11539       bfd_vma entry;
11540
11541       entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
11542       print_vma (entry, LONG_HEX);
11543     }
11544   return addr + (is_32bit_elf ? 4 : 8);
11545 }
11546
11547 static int
11548 process_mips_specific (FILE * file)
11549 {
11550   Elf_Internal_Dyn * entry;
11551   size_t liblist_offset = 0;
11552   size_t liblistno = 0;
11553   size_t conflictsno = 0;
11554   size_t options_offset = 0;
11555   size_t conflicts_offset = 0;
11556   size_t pltrelsz = 0;
11557   size_t pltrel = 0;
11558   bfd_vma pltgot = 0;
11559   bfd_vma mips_pltgot = 0;
11560   bfd_vma jmprel = 0;
11561   bfd_vma local_gotno = 0;
11562   bfd_vma gotsym = 0;
11563   bfd_vma symtabno = 0;
11564
11565   process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
11566                       display_mips_gnu_attribute);
11567
11568   /* We have a lot of special sections.  Thanks SGI!  */
11569   if (dynamic_section == NULL)
11570     /* No information available.  */
11571     return 0;
11572
11573   for (entry = dynamic_section; entry->d_tag != DT_NULL; ++entry)
11574     switch (entry->d_tag)
11575       {
11576       case DT_MIPS_LIBLIST:
11577         liblist_offset
11578           = offset_from_vma (file, entry->d_un.d_val,
11579                              liblistno * sizeof (Elf32_External_Lib));
11580         break;
11581       case DT_MIPS_LIBLISTNO:
11582         liblistno = entry->d_un.d_val;
11583         break;
11584       case DT_MIPS_OPTIONS:
11585         options_offset = offset_from_vma (file, entry->d_un.d_val, 0);
11586         break;
11587       case DT_MIPS_CONFLICT:
11588         conflicts_offset
11589           = offset_from_vma (file, entry->d_un.d_val,
11590                              conflictsno * sizeof (Elf32_External_Conflict));
11591         break;
11592       case DT_MIPS_CONFLICTNO:
11593         conflictsno = entry->d_un.d_val;
11594         break;
11595       case DT_PLTGOT:
11596         pltgot = entry->d_un.d_ptr;
11597         break;
11598       case DT_MIPS_LOCAL_GOTNO:
11599         local_gotno = entry->d_un.d_val;
11600         break;
11601       case DT_MIPS_GOTSYM:
11602         gotsym = entry->d_un.d_val;
11603         break;
11604       case DT_MIPS_SYMTABNO:
11605         symtabno = entry->d_un.d_val;
11606         break;
11607       case DT_MIPS_PLTGOT:
11608         mips_pltgot = entry->d_un.d_ptr;
11609         break;
11610       case DT_PLTREL:
11611         pltrel = entry->d_un.d_val;
11612         break;
11613       case DT_PLTRELSZ:
11614         pltrelsz = entry->d_un.d_val;
11615         break;
11616       case DT_JMPREL:
11617         jmprel = entry->d_un.d_ptr;
11618         break;
11619       default:
11620         break;
11621       }
11622
11623   if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
11624     {
11625       Elf32_External_Lib * elib;
11626       size_t cnt;
11627
11628       elib = (Elf32_External_Lib *) get_data (NULL, file, liblist_offset,
11629                                               liblistno,
11630                                               sizeof (Elf32_External_Lib),
11631                                               _("liblist"));
11632       if (elib)
11633         {
11634           printf (_("\nSection '.liblist' contains %lu entries:\n"),
11635                   (unsigned long) liblistno);
11636           fputs (_("     Library              Time Stamp          Checksum   Version Flags\n"),
11637                  stdout);
11638
11639           for (cnt = 0; cnt < liblistno; ++cnt)
11640             {
11641               Elf32_Lib liblist;
11642               time_t atime;
11643               char timebuf[20];
11644               struct tm * tmp;
11645
11646               liblist.l_name = BYTE_GET (elib[cnt].l_name);
11647               atime = BYTE_GET (elib[cnt].l_time_stamp);
11648               liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
11649               liblist.l_version = BYTE_GET (elib[cnt].l_version);
11650               liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
11651
11652               tmp = gmtime (&atime);
11653               snprintf (timebuf, sizeof (timebuf),
11654                         "%04u-%02u-%02uT%02u:%02u:%02u",
11655                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
11656                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
11657
11658               printf ("%3lu: ", (unsigned long) cnt);
11659               if (VALID_DYNAMIC_NAME (liblist.l_name))
11660                 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
11661               else
11662                 printf (_("<corrupt: %9ld>"), liblist.l_name);
11663               printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
11664                       liblist.l_version);
11665
11666               if (liblist.l_flags == 0)
11667                 puts (_(" NONE"));
11668               else
11669                 {
11670                   static const struct
11671                   {
11672                     const char * name;
11673                     int bit;
11674                   }
11675                   l_flags_vals[] =
11676                   {
11677                     { " EXACT_MATCH", LL_EXACT_MATCH },
11678                     { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
11679                     { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
11680                     { " EXPORTS", LL_EXPORTS },
11681                     { " DELAY_LOAD", LL_DELAY_LOAD },
11682                     { " DELTA", LL_DELTA }
11683                   };
11684                   int flags = liblist.l_flags;
11685                   size_t fcnt;
11686
11687                   for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
11688                     if ((flags & l_flags_vals[fcnt].bit) != 0)
11689                       {
11690                         fputs (l_flags_vals[fcnt].name, stdout);
11691                         flags ^= l_flags_vals[fcnt].bit;
11692                       }
11693                   if (flags != 0)
11694                     printf (" %#x", (unsigned int) flags);
11695
11696                   puts ("");
11697                 }
11698             }
11699
11700           free (elib);
11701         }
11702     }
11703
11704   if (options_offset != 0)
11705     {
11706       Elf_External_Options * eopt;
11707       Elf_Internal_Shdr * sect = section_headers;
11708       Elf_Internal_Options * iopt;
11709       Elf_Internal_Options * option;
11710       size_t offset;
11711       int cnt;
11712
11713       /* Find the section header so that we get the size.  */
11714       while (sect->sh_type != SHT_MIPS_OPTIONS)
11715         ++sect;
11716
11717       eopt = (Elf_External_Options *) get_data (NULL, file, options_offset, 1,
11718                                                 sect->sh_size, _("options"));
11719       if (eopt)
11720         {
11721           iopt = (Elf_Internal_Options *)
11722               cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
11723           if (iopt == NULL)
11724             {
11725               error (_("Out of memory\n"));
11726               return 0;
11727             }
11728
11729           offset = cnt = 0;
11730           option = iopt;
11731
11732           while (offset < sect->sh_size)
11733             {
11734               Elf_External_Options * eoption;
11735
11736               eoption = (Elf_External_Options *) ((char *) eopt + offset);
11737
11738               option->kind = BYTE_GET (eoption->kind);
11739               option->size = BYTE_GET (eoption->size);
11740               option->section = BYTE_GET (eoption->section);
11741               option->info = BYTE_GET (eoption->info);
11742
11743               offset += option->size;
11744
11745               ++option;
11746               ++cnt;
11747             }
11748
11749           printf (_("\nSection '%s' contains %d entries:\n"),
11750                   SECTION_NAME (sect), cnt);
11751
11752           option = iopt;
11753
11754           while (cnt-- > 0)
11755             {
11756               size_t len;
11757
11758               switch (option->kind)
11759                 {
11760                 case ODK_NULL:
11761                   /* This shouldn't happen.  */
11762                   printf (" NULL       %d %lx", option->section, option->info);
11763                   break;
11764                 case ODK_REGINFO:
11765                   printf (" REGINFO    ");
11766                   if (elf_header.e_machine == EM_MIPS)
11767                     {
11768                       /* 32bit form.  */
11769                       Elf32_External_RegInfo * ereg;
11770                       Elf32_RegInfo reginfo;
11771
11772                       ereg = (Elf32_External_RegInfo *) (option + 1);
11773                       reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
11774                       reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
11775                       reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
11776                       reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
11777                       reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
11778                       reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
11779
11780                       printf ("GPR %08lx  GP 0x%lx\n",
11781                               reginfo.ri_gprmask,
11782                               (unsigned long) reginfo.ri_gp_value);
11783                       printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
11784                               reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
11785                               reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
11786                     }
11787                   else
11788                     {
11789                       /* 64 bit form.  */
11790                       Elf64_External_RegInfo * ereg;
11791                       Elf64_Internal_RegInfo reginfo;
11792
11793                       ereg = (Elf64_External_RegInfo *) (option + 1);
11794                       reginfo.ri_gprmask    = BYTE_GET (ereg->ri_gprmask);
11795                       reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
11796                       reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
11797                       reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
11798                       reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
11799                       reginfo.ri_gp_value   = BYTE_GET (ereg->ri_gp_value);
11800
11801                       printf ("GPR %08lx  GP 0x",
11802                               reginfo.ri_gprmask);
11803                       printf_vma (reginfo.ri_gp_value);
11804                       printf ("\n");
11805
11806                       printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
11807                               reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
11808                               reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
11809                     }
11810                   ++option;
11811                   continue;
11812                 case ODK_EXCEPTIONS:
11813                   fputs (" EXCEPTIONS fpe_min(", stdout);
11814                   process_mips_fpe_exception (option->info & OEX_FPU_MIN);
11815                   fputs (") fpe_max(", stdout);
11816                   process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
11817                   fputs (")", stdout);
11818
11819                   if (option->info & OEX_PAGE0)
11820                     fputs (" PAGE0", stdout);
11821                   if (option->info & OEX_SMM)
11822                     fputs (" SMM", stdout);
11823                   if (option->info & OEX_FPDBUG)
11824                     fputs (" FPDBUG", stdout);
11825                   if (option->info & OEX_DISMISS)
11826                     fputs (" DISMISS", stdout);
11827                   break;
11828                 case ODK_PAD:
11829                   fputs (" PAD       ", stdout);
11830                   if (option->info & OPAD_PREFIX)
11831                     fputs (" PREFIX", stdout);
11832                   if (option->info & OPAD_POSTFIX)
11833                     fputs (" POSTFIX", stdout);
11834                   if (option->info & OPAD_SYMBOL)
11835                     fputs (" SYMBOL", stdout);
11836                   break;
11837                 case ODK_HWPATCH:
11838                   fputs (" HWPATCH   ", stdout);
11839                   if (option->info & OHW_R4KEOP)
11840                     fputs (" R4KEOP", stdout);
11841                   if (option->info & OHW_R8KPFETCH)
11842                     fputs (" R8KPFETCH", stdout);
11843                   if (option->info & OHW_R5KEOP)
11844                     fputs (" R5KEOP", stdout);
11845                   if (option->info & OHW_R5KCVTL)
11846                     fputs (" R5KCVTL", stdout);
11847                   break;
11848                 case ODK_FILL:
11849                   fputs (" FILL       ", stdout);
11850                   /* XXX Print content of info word?  */
11851                   break;
11852                 case ODK_TAGS:
11853                   fputs (" TAGS       ", stdout);
11854                   /* XXX Print content of info word?  */
11855                   break;
11856                 case ODK_HWAND:
11857                   fputs (" HWAND     ", stdout);
11858                   if (option->info & OHWA0_R4KEOP_CHECKED)
11859                     fputs (" R4KEOP_CHECKED", stdout);
11860                   if (option->info & OHWA0_R4KEOP_CLEAN)
11861                     fputs (" R4KEOP_CLEAN", stdout);
11862                   break;
11863                 case ODK_HWOR:
11864                   fputs (" HWOR      ", stdout);
11865                   if (option->info & OHWA0_R4KEOP_CHECKED)
11866                     fputs (" R4KEOP_CHECKED", stdout);
11867                   if (option->info & OHWA0_R4KEOP_CLEAN)
11868                     fputs (" R4KEOP_CLEAN", stdout);
11869                   break;
11870                 case ODK_GP_GROUP:
11871                   printf (" GP_GROUP  %#06lx  self-contained %#06lx",
11872                           option->info & OGP_GROUP,
11873                           (option->info & OGP_SELF) >> 16);
11874                   break;
11875                 case ODK_IDENT:
11876                   printf (" IDENT     %#06lx  self-contained %#06lx",
11877                           option->info & OGP_GROUP,
11878                           (option->info & OGP_SELF) >> 16);
11879                   break;
11880                 default:
11881                   /* This shouldn't happen.  */
11882                   printf (" %3d ???     %d %lx",
11883                           option->kind, option->section, option->info);
11884                   break;
11885                 }
11886
11887               len = sizeof (* eopt);
11888               while (len < option->size)
11889                 if (((char *) option)[len] >= ' '
11890                     && ((char *) option)[len] < 0x7f)
11891                   printf ("%c", ((char *) option)[len++]);
11892                 else
11893                   printf ("\\%03o", ((char *) option)[len++]);
11894
11895               fputs ("\n", stdout);
11896               ++option;
11897             }
11898
11899           free (eopt);
11900         }
11901     }
11902
11903   if (conflicts_offset != 0 && conflictsno != 0)
11904     {
11905       Elf32_Conflict * iconf;
11906       size_t cnt;
11907
11908       if (dynamic_symbols == NULL)
11909         {
11910           error (_("conflict list found without a dynamic symbol table\n"));
11911           return 0;
11912         }
11913
11914       iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
11915       if (iconf == NULL)
11916         {
11917           error (_("Out of memory\n"));
11918           return 0;
11919         }
11920
11921       if (is_32bit_elf)
11922         {
11923           Elf32_External_Conflict * econf32;
11924
11925           econf32 = (Elf32_External_Conflict *)
11926               get_data (NULL, file, conflicts_offset, conflictsno,
11927                         sizeof (* econf32), _("conflict"));
11928           if (!econf32)
11929             return 0;
11930
11931           for (cnt = 0; cnt < conflictsno; ++cnt)
11932             iconf[cnt] = BYTE_GET (econf32[cnt]);
11933
11934           free (econf32);
11935         }
11936       else
11937         {
11938           Elf64_External_Conflict * econf64;
11939
11940           econf64 = (Elf64_External_Conflict *)
11941               get_data (NULL, file, conflicts_offset, conflictsno,
11942                         sizeof (* econf64), _("conflict"));
11943           if (!econf64)
11944             return 0;
11945
11946           for (cnt = 0; cnt < conflictsno; ++cnt)
11947             iconf[cnt] = BYTE_GET (econf64[cnt]);
11948
11949           free (econf64);
11950         }
11951
11952       printf (_("\nSection '.conflict' contains %lu entries:\n"),
11953               (unsigned long) conflictsno);
11954       puts (_("  Num:    Index       Value  Name"));
11955
11956       for (cnt = 0; cnt < conflictsno; ++cnt)
11957         {
11958           Elf_Internal_Sym * psym = & dynamic_symbols[iconf[cnt]];
11959
11960           printf ("%5lu: %8lu  ", (unsigned long) cnt, iconf[cnt]);
11961           print_vma (psym->st_value, FULL_HEX);
11962           putchar (' ');
11963           if (VALID_DYNAMIC_NAME (psym->st_name))
11964             print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
11965           else
11966             printf (_("<corrupt: %14ld>"), psym->st_name);
11967           putchar ('\n');
11968         }
11969
11970       free (iconf);
11971     }
11972
11973   if (pltgot != 0 && local_gotno != 0)
11974     {
11975       bfd_vma ent, local_end, global_end;
11976       size_t i, offset;
11977       unsigned char * data;
11978       int addr_size;
11979
11980       ent = pltgot;
11981       addr_size = (is_32bit_elf ? 4 : 8);
11982       local_end = pltgot + local_gotno * addr_size;
11983       global_end = local_end + (symtabno - gotsym) * addr_size;
11984
11985       offset = offset_from_vma (file, pltgot, global_end - pltgot);
11986       data = (unsigned char *) get_data (NULL, file, offset,
11987                                          global_end - pltgot, 1, _("GOT"));
11988       if (data == NULL)
11989         return 0;
11990
11991       printf (_("\nPrimary GOT:\n"));
11992       printf (_(" Canonical gp value: "));
11993       print_vma (pltgot + 0x7ff0, LONG_HEX);
11994       printf ("\n\n");
11995
11996       printf (_(" Reserved entries:\n"));
11997       printf (_("  %*s %10s %*s Purpose\n"),
11998               addr_size * 2, _("Address"), _("Access"),
11999               addr_size * 2, _("Initial"));
12000       ent = print_mips_got_entry (data, pltgot, ent);
12001       printf (_(" Lazy resolver\n"));
12002       if (data
12003           && (byte_get (data + ent - pltgot, addr_size)
12004               >> (addr_size * 8 - 1)) != 0)
12005         {
12006           ent = print_mips_got_entry (data, pltgot, ent);
12007           printf (_(" Module pointer (GNU extension)\n"));
12008         }
12009       printf ("\n");
12010
12011       if (ent < local_end)
12012         {
12013           printf (_(" Local entries:\n"));
12014           printf ("  %*s %10s %*s\n",
12015                   addr_size * 2, _("Address"), _("Access"),
12016                   addr_size * 2, _("Initial"));
12017           while (ent < local_end)
12018             {
12019               ent = print_mips_got_entry (data, pltgot, ent);
12020               printf ("\n");
12021             }
12022           printf ("\n");
12023         }
12024
12025       if (gotsym < symtabno)
12026         {
12027           int sym_width;
12028
12029           printf (_(" Global entries:\n"));
12030           printf ("  %*s %10s %*s %*s %-7s %3s %s\n",
12031                   addr_size * 2, _("Address"), _("Access"),
12032                   addr_size * 2, _("Initial"),
12033                   addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
12034           sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
12035           for (i = gotsym; i < symtabno; i++)
12036             {
12037               Elf_Internal_Sym * psym;
12038
12039               psym = dynamic_symbols + i;
12040               ent = print_mips_got_entry (data, pltgot, ent);
12041               printf (" ");
12042               print_vma (psym->st_value, LONG_HEX);
12043               printf (" %-7s %3s ",
12044                       get_symbol_type (ELF_ST_TYPE (psym->st_info)),
12045                       get_symbol_index_type (psym->st_shndx));
12046               if (VALID_DYNAMIC_NAME (psym->st_name))
12047                 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
12048               else
12049                 printf (_("<corrupt: %14ld>"), psym->st_name);
12050               printf ("\n");
12051             }
12052           printf ("\n");
12053         }
12054
12055       if (data)
12056         free (data);
12057     }
12058
12059   if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
12060     {
12061       bfd_vma ent, end;
12062       size_t offset, rel_offset;
12063       unsigned long count, i;
12064       unsigned char * data;
12065       int addr_size, sym_width;
12066       Elf_Internal_Rela * rels;
12067
12068       rel_offset = offset_from_vma (file, jmprel, pltrelsz);
12069       if (pltrel == DT_RELA)
12070         {
12071           if (!slurp_rela_relocs (file, rel_offset, pltrelsz, &rels, &count))
12072             return 0;
12073         }
12074       else
12075         {
12076           if (!slurp_rel_relocs (file, rel_offset, pltrelsz, &rels, &count))
12077             return 0;
12078         }
12079
12080       ent = mips_pltgot;
12081       addr_size = (is_32bit_elf ? 4 : 8);
12082       end = mips_pltgot + (2 + count) * addr_size;
12083
12084       offset = offset_from_vma (file, mips_pltgot, end - mips_pltgot);
12085       data = (unsigned char *) get_data (NULL, file, offset, end - mips_pltgot,
12086                                          1, _("PLT GOT"));
12087       if (data == NULL)
12088         return 0;
12089
12090       printf (_("\nPLT GOT:\n\n"));
12091       printf (_(" Reserved entries:\n"));
12092       printf (_("  %*s %*s Purpose\n"),
12093               addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
12094       ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
12095       printf (_(" PLT lazy resolver\n"));
12096       ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
12097       printf (_(" Module pointer\n"));
12098       printf ("\n");
12099
12100       printf (_(" Entries:\n"));
12101       printf ("  %*s %*s %*s %-7s %3s %s\n",
12102               addr_size * 2, _("Address"),
12103               addr_size * 2, _("Initial"),
12104               addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
12105       sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
12106       for (i = 0; i < count; i++)
12107         {
12108           Elf_Internal_Sym * psym;
12109
12110           psym = dynamic_symbols + get_reloc_symindex (rels[i].r_info);
12111           ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
12112           printf (" ");
12113           print_vma (psym->st_value, LONG_HEX);
12114           printf (" %-7s %3s ",
12115                   get_symbol_type (ELF_ST_TYPE (psym->st_info)),
12116                   get_symbol_index_type (psym->st_shndx));
12117           if (VALID_DYNAMIC_NAME (psym->st_name))
12118             print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
12119           else
12120             printf (_("<corrupt: %14ld>"), psym->st_name);
12121           printf ("\n");
12122         }
12123       printf ("\n");
12124
12125       if (data)
12126         free (data);
12127       free (rels);
12128     }
12129
12130   return 1;
12131 }
12132
12133 static int
12134 process_gnu_liblist (FILE * file)
12135 {
12136   Elf_Internal_Shdr * section;
12137   Elf_Internal_Shdr * string_sec;
12138   Elf32_External_Lib * elib;
12139   char * strtab;
12140   size_t strtab_size;
12141   size_t cnt;
12142   unsigned i;
12143
12144   if (! do_arch)
12145     return 0;
12146
12147   for (i = 0, section = section_headers;
12148        i < elf_header.e_shnum;
12149        i++, section++)
12150     {
12151       switch (section->sh_type)
12152         {
12153         case SHT_GNU_LIBLIST:
12154           if (section->sh_link >= elf_header.e_shnum)
12155             break;
12156
12157           elib = (Elf32_External_Lib *)
12158               get_data (NULL, file, section->sh_offset, 1, section->sh_size,
12159                         _("liblist"));
12160
12161           if (elib == NULL)
12162             break;
12163           string_sec = section_headers + section->sh_link;
12164
12165           strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
12166                                       string_sec->sh_size,
12167                                       _("liblist string table"));
12168           if (strtab == NULL
12169               || section->sh_entsize != sizeof (Elf32_External_Lib))
12170             {
12171               free (elib);
12172               free (strtab);
12173               break;
12174             }
12175           strtab_size = string_sec->sh_size;
12176
12177           printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
12178                   SECTION_NAME (section),
12179                   (unsigned long) (section->sh_size / sizeof (Elf32_External_Lib)));
12180
12181           puts (_("     Library              Time Stamp          Checksum   Version Flags"));
12182
12183           for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
12184                ++cnt)
12185             {
12186               Elf32_Lib liblist;
12187               time_t atime;
12188               char timebuf[20];
12189               struct tm * tmp;
12190
12191               liblist.l_name = BYTE_GET (elib[cnt].l_name);
12192               atime = BYTE_GET (elib[cnt].l_time_stamp);
12193               liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
12194               liblist.l_version = BYTE_GET (elib[cnt].l_version);
12195               liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
12196
12197               tmp = gmtime (&atime);
12198               snprintf (timebuf, sizeof (timebuf),
12199                         "%04u-%02u-%02uT%02u:%02u:%02u",
12200                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
12201                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
12202
12203               printf ("%3lu: ", (unsigned long) cnt);
12204               if (do_wide)
12205                 printf ("%-20s", liblist.l_name < strtab_size
12206                         ? strtab + liblist.l_name : _("<corrupt>"));
12207               else
12208                 printf ("%-20.20s", liblist.l_name < strtab_size
12209                         ? strtab + liblist.l_name : _("<corrupt>"));
12210               printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
12211                       liblist.l_version, liblist.l_flags);
12212             }
12213
12214           free (elib);
12215           free (strtab);
12216         }
12217     }
12218
12219   return 1;
12220 }
12221
12222 static const char *
12223 get_note_type (unsigned e_type)
12224 {
12225   static char buff[64];
12226
12227   if (elf_header.e_type == ET_CORE)
12228     switch (e_type)
12229       {
12230       case NT_AUXV:
12231         return _("NT_AUXV (auxiliary vector)");
12232       case NT_PRSTATUS:
12233         return _("NT_PRSTATUS (prstatus structure)");
12234       case NT_FPREGSET:
12235         return _("NT_FPREGSET (floating point registers)");
12236       case NT_PRPSINFO:
12237         return _("NT_PRPSINFO (prpsinfo structure)");
12238       case NT_TASKSTRUCT:
12239         return _("NT_TASKSTRUCT (task structure)");
12240       case NT_PRXFPREG:
12241         return _("NT_PRXFPREG (user_xfpregs structure)");
12242       case NT_PPC_VMX:
12243         return _("NT_PPC_VMX (ppc Altivec registers)");
12244       case NT_PPC_VSX:
12245         return _("NT_PPC_VSX (ppc VSX registers)");
12246       case NT_X86_XSTATE:
12247         return _("NT_X86_XSTATE (x86 XSAVE extended state)");
12248       case NT_S390_HIGH_GPRS:
12249         return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
12250       case NT_S390_TIMER:
12251         return _("NT_S390_TIMER (s390 timer register)");
12252       case NT_S390_TODCMP:
12253         return _("NT_S390_TODCMP (s390 TOD comparator register)");
12254       case NT_S390_TODPREG:
12255         return _("NT_S390_TODPREG (s390 TOD programmable register)");
12256       case NT_S390_CTRS:
12257         return _("NT_S390_CTRS (s390 control registers)");
12258       case NT_S390_PREFIX:
12259         return _("NT_S390_PREFIX (s390 prefix register)");
12260       case NT_PSTATUS:
12261         return _("NT_PSTATUS (pstatus structure)");
12262       case NT_FPREGS:
12263         return _("NT_FPREGS (floating point registers)");
12264       case NT_PSINFO:
12265         return _("NT_PSINFO (psinfo structure)");
12266       case NT_LWPSTATUS:
12267         return _("NT_LWPSTATUS (lwpstatus_t structure)");
12268       case NT_LWPSINFO:
12269         return _("NT_LWPSINFO (lwpsinfo_t structure)");
12270       case NT_WIN32PSTATUS:
12271         return _("NT_WIN32PSTATUS (win32_pstatus structure)");
12272       default:
12273         break;
12274       }
12275   else
12276     switch (e_type)
12277       {
12278       case NT_VERSION:
12279         return _("NT_VERSION (version)");
12280       case NT_ARCH:
12281         return _("NT_ARCH (architecture)");
12282       default:
12283         break;
12284       }
12285
12286   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
12287   return buff;
12288 }
12289
12290 static const char *
12291 get_gnu_elf_note_type (unsigned e_type)
12292 {
12293   static char buff[64];
12294
12295   switch (e_type)
12296     {
12297     case NT_GNU_ABI_TAG:
12298       return _("NT_GNU_ABI_TAG (ABI version tag)");
12299     case NT_GNU_HWCAP:
12300       return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
12301     case NT_GNU_BUILD_ID:
12302       return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
12303     case NT_GNU_GOLD_VERSION:
12304       return _("NT_GNU_GOLD_VERSION (gold version)");
12305     default:
12306       break;
12307     }
12308
12309   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
12310   return buff;
12311 }
12312
12313 static int
12314 print_gnu_note (Elf_Internal_Note *pnote)
12315 {
12316   switch (pnote->type)
12317     {
12318     case NT_GNU_BUILD_ID:
12319       {
12320         unsigned long i;
12321
12322         printf (_("    Build ID: "));
12323         for (i = 0; i < pnote->descsz; ++i)
12324           printf ("%02x", pnote->descdata[i] & 0xff);
12325         printf (_("\n"));
12326       }
12327       break;
12328
12329     case NT_GNU_ABI_TAG:
12330       {
12331         unsigned long os, major, minor, subminor;
12332         const char *osname;
12333
12334         os = byte_get ((unsigned char *) pnote->descdata, 4);
12335         major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
12336         minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
12337         subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
12338
12339         switch (os)
12340           {
12341           case GNU_ABI_TAG_LINUX:
12342             osname = "Linux";
12343             break;
12344           case GNU_ABI_TAG_HURD:
12345             osname = "Hurd";
12346             break;
12347           case GNU_ABI_TAG_SOLARIS:
12348             osname = "Solaris";
12349             break;
12350           case GNU_ABI_TAG_FREEBSD:
12351             osname = "FreeBSD";
12352             break;
12353           case GNU_ABI_TAG_NETBSD:
12354             osname = "NetBSD";
12355             break;
12356           default:
12357             osname = "Unknown";
12358             break;
12359           }
12360
12361         printf (_("    OS: %s, ABI: %ld.%ld.%ld\n"), osname,
12362                 major, minor, subminor);
12363       }
12364       break;
12365     }
12366
12367   return 1;
12368 }
12369
12370 static const char *
12371 get_netbsd_elfcore_note_type (unsigned e_type)
12372 {
12373   static char buff[64];
12374
12375   if (e_type == NT_NETBSDCORE_PROCINFO)
12376     {
12377       /* NetBSD core "procinfo" structure.  */
12378       return _("NetBSD procinfo structure");
12379     }
12380
12381   /* As of Jan 2002 there are no other machine-independent notes
12382      defined for NetBSD core files.  If the note type is less
12383      than the start of the machine-dependent note types, we don't
12384      understand it.  */
12385
12386   if (e_type < NT_NETBSDCORE_FIRSTMACH)
12387     {
12388       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
12389       return buff;
12390     }
12391
12392   switch (elf_header.e_machine)
12393     {
12394     /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
12395        and PT_GETFPREGS == mach+2.  */
12396
12397     case EM_OLD_ALPHA:
12398     case EM_ALPHA:
12399     case EM_SPARC:
12400     case EM_SPARC32PLUS:
12401     case EM_SPARCV9:
12402       switch (e_type)
12403         {
12404         case NT_NETBSDCORE_FIRSTMACH + 0:
12405           return _("PT_GETREGS (reg structure)");
12406         case NT_NETBSDCORE_FIRSTMACH + 2:
12407           return _("PT_GETFPREGS (fpreg structure)");
12408         default:
12409           break;
12410         }
12411       break;
12412
12413     /* On all other arch's, PT_GETREGS == mach+1 and
12414        PT_GETFPREGS == mach+3.  */
12415     default:
12416       switch (e_type)
12417         {
12418         case NT_NETBSDCORE_FIRSTMACH + 1:
12419           return _("PT_GETREGS (reg structure)");
12420         case NT_NETBSDCORE_FIRSTMACH + 3:
12421           return _("PT_GETFPREGS (fpreg structure)");
12422         default:
12423           break;
12424         }
12425     }
12426
12427   snprintf (buff, sizeof (buff), _("PT_FIRSTMACH+%d"),
12428             e_type - NT_NETBSDCORE_FIRSTMACH);
12429   return buff;
12430 }
12431
12432 static const char *
12433 get_stapsdt_note_type (unsigned e_type)
12434 {
12435   static char buff[64];
12436
12437   switch (e_type)
12438     {
12439     case NT_STAPSDT:
12440       return _("NT_STAPSDT (SystemTap probe descriptors)");
12441
12442     default:
12443       break;
12444     }
12445
12446   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
12447   return buff;
12448 }
12449
12450 static int
12451 print_stapsdt_note (Elf_Internal_Note *pnote)
12452 {
12453   int addr_size = is_32bit_elf ? 4 : 8;
12454   char *data = pnote->descdata;
12455   char *data_end = pnote->descdata + pnote->descsz;
12456   bfd_vma pc, base_addr, semaphore;
12457   char *provider, *probe, *arg_fmt;
12458
12459   pc = byte_get ((unsigned char *) data, addr_size);
12460   data += addr_size;
12461   base_addr = byte_get ((unsigned char *) data, addr_size);
12462   data += addr_size;
12463   semaphore = byte_get ((unsigned char *) data, addr_size);
12464   data += addr_size;
12465
12466   provider = data;
12467   data += strlen (data) + 1;
12468   probe = data;
12469   data += strlen (data) + 1;
12470   arg_fmt = data;
12471   data += strlen (data) + 1;
12472
12473   printf (_("    Provider: %s\n"), provider);
12474   printf (_("    Name: %s\n"), probe);
12475   printf (_("    Location: "));
12476   print_vma (pc, FULL_HEX);
12477   printf (_(", Base: "));
12478   print_vma (base_addr, FULL_HEX);
12479   printf (_(", Semaphore: "));
12480   print_vma (semaphore, FULL_HEX);
12481   printf (_("\n"));
12482   printf (_("    Arguments: %s\n"), arg_fmt);
12483
12484   return data == data_end;
12485 }
12486
12487 static const char *
12488 get_ia64_vms_note_type (unsigned e_type)
12489 {
12490   static char buff[64];
12491
12492   switch (e_type)
12493     {
12494     case NT_VMS_MHD:
12495       return _("NT_VMS_MHD (module header)");
12496     case NT_VMS_LNM:
12497       return _("NT_VMS_LNM (language name)");
12498     case NT_VMS_SRC:
12499       return _("NT_VMS_SRC (source files)");
12500     case NT_VMS_TITLE:
12501       return _("NT_VMS_TITLE");
12502     case NT_VMS_EIDC:
12503       return _("NT_VMS_EIDC (consistency check)");
12504     case NT_VMS_FPMODE:
12505       return _("NT_VMS_FPMODE (FP mode)");
12506     case NT_VMS_LINKTIME:
12507       return _("NT_VMS_LINKTIME");
12508     case NT_VMS_IMGNAM:
12509       return _("NT_VMS_IMGNAM (image name)");
12510     case NT_VMS_IMGID:
12511       return _("NT_VMS_IMGID (image id)");
12512     case NT_VMS_LINKID:
12513       return _("NT_VMS_LINKID (link id)");
12514     case NT_VMS_IMGBID:
12515       return _("NT_VMS_IMGBID (build id)");
12516     case NT_VMS_GSTNAM:
12517       return _("NT_VMS_GSTNAM (sym table name)");
12518     case NT_VMS_ORIG_DYN:
12519       return _("NT_VMS_ORIG_DYN");
12520     case NT_VMS_PATCHTIME:
12521       return _("NT_VMS_PATCHTIME");
12522     default:
12523       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
12524       return buff;
12525     }
12526 }
12527
12528 static int
12529 print_ia64_vms_note (Elf_Internal_Note * pnote)
12530 {
12531   switch (pnote->type)
12532     {
12533     case NT_VMS_MHD:
12534       if (pnote->descsz > 36)
12535         {
12536           size_t l = strlen (pnote->descdata + 34);
12537           printf (_("    Creation date  : %.17s\n"), pnote->descdata);
12538           printf (_("    Last patch date: %.17s\n"), pnote->descdata + 17);
12539           printf (_("    Module name    : %s\n"), pnote->descdata + 34);
12540           printf (_("    Module version : %s\n"), pnote->descdata + 34 + l + 1);
12541         }
12542       else
12543         printf (_("    Invalid size\n"));
12544       break;
12545     case NT_VMS_LNM:
12546       printf (_("   Language: %s\n"), pnote->descdata);
12547       break;
12548 #ifdef BFD64
12549     case NT_VMS_FPMODE:
12550       printf (_("   FP mode: 0x%016" BFD_VMA_FMT "x\n"),
12551               (bfd_vma)byte_get ((unsigned char *)pnote->descdata, 8));
12552       break;
12553     case NT_VMS_LINKTIME:
12554       printf (_("   Link time: "));
12555       print_vms_time
12556         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
12557       printf ("\n");
12558       break;
12559     case NT_VMS_PATCHTIME:
12560       printf (_("   Patch time: "));
12561       print_vms_time
12562         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
12563       printf ("\n");
12564       break;
12565     case NT_VMS_ORIG_DYN:
12566       printf (_("   Major id: %u,  minor id: %u\n"),
12567               (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
12568               (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
12569       printf (_("   Manip date  : "));
12570       print_vms_time
12571         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
12572       printf (_("\n"
12573                 "   Link flags  : 0x%016" BFD_VMA_FMT "x\n"),
12574               (bfd_vma)byte_get ((unsigned char *)pnote->descdata + 16, 8));
12575       printf (_("   Header flags: 0x%08x\n"),
12576               (unsigned)byte_get ((unsigned char *)pnote->descdata + 24, 4));
12577       printf (_("   Image id    : %s\n"), pnote->descdata + 32);
12578       break;
12579 #endif
12580     case NT_VMS_IMGNAM:
12581       printf (_("    Image name: %s\n"), pnote->descdata);
12582       break;
12583     case NT_VMS_GSTNAM:
12584       printf (_("    Global symbol table name: %s\n"), pnote->descdata);
12585       break;
12586     case NT_VMS_IMGID:
12587       printf (_("    Image id: %s\n"), pnote->descdata);
12588       break;
12589     case NT_VMS_LINKID:
12590       printf (_("    Linker id: %s\n"), pnote->descdata);
12591       break;
12592     default:
12593       break;
12594     }
12595   return 1;
12596 }
12597
12598 /* Note that by the ELF standard, the name field is already null byte
12599    terminated, and namesz includes the terminating null byte.
12600    I.E. the value of namesz for the name "FSF" is 4.
12601
12602    If the value of namesz is zero, there is no name present.  */
12603 static int
12604 process_note (Elf_Internal_Note * pnote)
12605 {
12606   const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
12607   const char * nt;
12608
12609   if (pnote->namesz == 0)
12610     /* If there is no note name, then use the default set of
12611        note type strings.  */
12612     nt = get_note_type (pnote->type);
12613
12614   else if (const_strneq (pnote->namedata, "GNU"))
12615     /* GNU-specific object file notes.  */
12616     nt = get_gnu_elf_note_type (pnote->type);
12617
12618   else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
12619     /* NetBSD-specific core file notes.  */
12620     nt = get_netbsd_elfcore_note_type (pnote->type);
12621
12622   else if (strneq (pnote->namedata, "SPU/", 4))
12623     {
12624       /* SPU-specific core file notes.  */
12625       nt = pnote->namedata + 4;
12626       name = "SPU";
12627     }
12628
12629   else if (const_strneq (pnote->namedata, "IPF/VMS"))
12630     /* VMS/ia64-specific file notes.  */
12631     nt = get_ia64_vms_note_type (pnote->type);
12632
12633   else if (const_strneq (pnote->namedata, "stapsdt"))
12634     nt = get_stapsdt_note_type (pnote->type);
12635
12636   else
12637     /* Don't recognize this note name; just use the default set of
12638        note type strings.  */
12639     nt = get_note_type (pnote->type);
12640
12641   printf ("  %-20s 0x%08lx\t%s\n", name, pnote->descsz, nt);
12642
12643   if (const_strneq (pnote->namedata, "IPF/VMS"))
12644     return print_ia64_vms_note (pnote);
12645   else if (const_strneq (pnote->namedata, "GNU"))
12646     return print_gnu_note (pnote);
12647   else if (const_strneq (pnote->namedata, "stapsdt"))
12648     return print_stapsdt_note (pnote);
12649   else
12650     return 1;
12651 }
12652
12653
12654 static int
12655 process_corefile_note_segment (FILE * file, bfd_vma offset, bfd_vma length)
12656 {
12657   Elf_External_Note * pnotes;
12658   Elf_External_Note * external;
12659   int res = 1;
12660
12661   if (length <= 0)
12662     return 0;
12663
12664   pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
12665                                            _("notes"));
12666   if (pnotes == NULL)
12667     return 0;
12668
12669   external = pnotes;
12670
12671   printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
12672           (unsigned long) offset, (unsigned long) length);
12673   printf (_("  %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
12674
12675   while (external < (Elf_External_Note *) ((char *) pnotes + length))
12676     {
12677       Elf_External_Note * next;
12678       Elf_Internal_Note inote;
12679       char * temp = NULL;
12680
12681       if (!is_ia64_vms ())
12682         {
12683           inote.type     = BYTE_GET (external->type);
12684           inote.namesz   = BYTE_GET (external->namesz);
12685           inote.namedata = external->name;
12686           inote.descsz   = BYTE_GET (external->descsz);
12687           inote.descdata = inote.namedata + align_power (inote.namesz, 2);
12688           inote.descpos  = offset + (inote.descdata - (char *) pnotes);
12689
12690           next = (Elf_External_Note *) (inote.descdata + align_power (inote.descsz, 2));
12691         }
12692       else
12693         {
12694           Elf64_External_VMS_Note *vms_external;
12695
12696           vms_external = (Elf64_External_VMS_Note *)external;
12697           inote.type     = BYTE_GET (vms_external->type);
12698           inote.namesz   = BYTE_GET (vms_external->namesz);
12699           inote.namedata = vms_external->name;
12700           inote.descsz   = BYTE_GET (vms_external->descsz);
12701           inote.descdata = inote.namedata + align_power (inote.namesz, 3);
12702           inote.descpos  = offset + (inote.descdata - (char *) pnotes);
12703
12704           next = (Elf_External_Note *)
12705             (inote.descdata + align_power (inote.descsz, 3));
12706         }
12707
12708       if (   ((char *) next > ((char *) pnotes) + length)
12709           || ((char *) next <  (char *) pnotes))
12710         {
12711           warn (_("corrupt note found at offset %lx into core notes\n"),
12712                 (unsigned long) ((char *) external - (char *) pnotes));
12713           warn (_(" type: %lx, namesize: %08lx, descsize: %08lx\n"),
12714                 inote.type, inote.namesz, inote.descsz);
12715           break;
12716         }
12717
12718       external = next;
12719
12720       /* Prevent out-of-bounds indexing.  */
12721       if (inote.namedata + inote.namesz >= (char *) pnotes + length
12722           || inote.namedata + inote.namesz < inote.namedata)
12723         {
12724           warn (_("corrupt note found at offset %lx into core notes\n"),
12725                 (unsigned long) ((char *) external - (char *) pnotes));
12726           warn (_(" type: %lx, namesize: %08lx, descsize: %08lx\n"),
12727                 inote.type, inote.namesz, inote.descsz);
12728           break;
12729         }
12730
12731       /* Verify that name is null terminated.  It appears that at least
12732          one version of Linux (RedHat 6.0) generates corefiles that don't
12733          comply with the ELF spec by failing to include the null byte in
12734          namesz.  */
12735       if (inote.namedata[inote.namesz] != '\0')
12736         {
12737           temp = (char *) malloc (inote.namesz + 1);
12738
12739           if (temp == NULL)
12740             {
12741               error (_("Out of memory\n"));
12742               res = 0;
12743               break;
12744             }
12745
12746           strncpy (temp, inote.namedata, inote.namesz);
12747           temp[inote.namesz] = 0;
12748
12749           /* warn (_("'%s' NOTE name not properly null terminated\n"), temp);  */
12750           inote.namedata = temp;
12751         }
12752
12753       res &= process_note (& inote);
12754
12755       if (temp != NULL)
12756         {
12757           free (temp);
12758           temp = NULL;
12759         }
12760     }
12761
12762   free (pnotes);
12763
12764   return res;
12765 }
12766
12767 static int
12768 process_corefile_note_segments (FILE * file)
12769 {
12770   Elf_Internal_Phdr * segment;
12771   unsigned int i;
12772   int res = 1;
12773
12774   if (! get_program_headers (file))
12775       return 0;
12776
12777   for (i = 0, segment = program_headers;
12778        i < elf_header.e_phnum;
12779        i++, segment++)
12780     {
12781       if (segment->p_type == PT_NOTE)
12782         res &= process_corefile_note_segment (file,
12783                                               (bfd_vma) segment->p_offset,
12784                                               (bfd_vma) segment->p_filesz);
12785     }
12786
12787   return res;
12788 }
12789
12790 static int
12791 process_note_sections (FILE * file)
12792 {
12793   Elf_Internal_Shdr * section;
12794   unsigned long i;
12795   int res = 1;
12796
12797   for (i = 0, section = section_headers;
12798        i < elf_header.e_shnum;
12799        i++, section++)
12800     if (section->sh_type == SHT_NOTE)
12801       res &= process_corefile_note_segment (file,
12802                                             (bfd_vma) section->sh_offset,
12803                                             (bfd_vma) section->sh_size);
12804
12805   return res;
12806 }
12807
12808 static int
12809 process_notes (FILE * file)
12810 {
12811   /* If we have not been asked to display the notes then do nothing.  */
12812   if (! do_notes)
12813     return 1;
12814
12815   if (elf_header.e_type != ET_CORE)
12816     return process_note_sections (file);
12817
12818   /* No program headers means no NOTE segment.  */
12819   if (elf_header.e_phnum > 0)
12820     return process_corefile_note_segments (file);
12821
12822   printf (_("No note segments present in the core file.\n"));
12823   return 1;
12824 }
12825
12826 static int
12827 process_arch_specific (FILE * file)
12828 {
12829   if (! do_arch)
12830     return 1;
12831
12832   switch (elf_header.e_machine)
12833     {
12834     case EM_ARM:
12835       return process_arm_specific (file);
12836     case EM_MIPS:
12837     case EM_MIPS_RS3_LE:
12838       return process_mips_specific (file);
12839       break;
12840     case EM_PPC:
12841       return process_power_specific (file);
12842       break;
12843     case EM_TI_C6000:
12844       return process_tic6x_specific (file);
12845       break;
12846     default:
12847       break;
12848     }
12849   return 1;
12850 }
12851
12852 static int
12853 get_file_header (FILE * file)
12854 {
12855   /* Read in the identity array.  */
12856   if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
12857     return 0;
12858
12859   /* Determine how to read the rest of the header.  */
12860   switch (elf_header.e_ident[EI_DATA])
12861     {
12862     default: /* fall through */
12863     case ELFDATANONE: /* fall through */
12864     case ELFDATA2LSB:
12865       byte_get = byte_get_little_endian;
12866       byte_put = byte_put_little_endian;
12867       break;
12868     case ELFDATA2MSB:
12869       byte_get = byte_get_big_endian;
12870       byte_put = byte_put_big_endian;
12871       break;
12872     }
12873
12874   /* For now we only support 32 bit and 64 bit ELF files.  */
12875   is_32bit_elf = (elf_header.e_ident[EI_CLASS] != ELFCLASS64);
12876
12877   /* Read in the rest of the header.  */
12878   if (is_32bit_elf)
12879     {
12880       Elf32_External_Ehdr ehdr32;
12881
12882       if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
12883         return 0;
12884
12885       elf_header.e_type      = BYTE_GET (ehdr32.e_type);
12886       elf_header.e_machine   = BYTE_GET (ehdr32.e_machine);
12887       elf_header.e_version   = BYTE_GET (ehdr32.e_version);
12888       elf_header.e_entry     = BYTE_GET (ehdr32.e_entry);
12889       elf_header.e_phoff     = BYTE_GET (ehdr32.e_phoff);
12890       elf_header.e_shoff     = BYTE_GET (ehdr32.e_shoff);
12891       elf_header.e_flags     = BYTE_GET (ehdr32.e_flags);
12892       elf_header.e_ehsize    = BYTE_GET (ehdr32.e_ehsize);
12893       elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
12894       elf_header.e_phnum     = BYTE_GET (ehdr32.e_phnum);
12895       elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
12896       elf_header.e_shnum     = BYTE_GET (ehdr32.e_shnum);
12897       elf_header.e_shstrndx  = BYTE_GET (ehdr32.e_shstrndx);
12898     }
12899   else
12900     {
12901       Elf64_External_Ehdr ehdr64;
12902
12903       /* If we have been compiled with sizeof (bfd_vma) == 4, then
12904          we will not be able to cope with the 64bit data found in
12905          64 ELF files.  Detect this now and abort before we start
12906          overwriting things.  */
12907       if (sizeof (bfd_vma) < 8)
12908         {
12909           error (_("This instance of readelf has been built without support for a\n\
12910 64 bit data type and so it cannot read 64 bit ELF files.\n"));
12911           return 0;
12912         }
12913
12914       if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
12915         return 0;
12916
12917       elf_header.e_type      = BYTE_GET (ehdr64.e_type);
12918       elf_header.e_machine   = BYTE_GET (ehdr64.e_machine);
12919       elf_header.e_version   = BYTE_GET (ehdr64.e_version);
12920       elf_header.e_entry     = BYTE_GET (ehdr64.e_entry);
12921       elf_header.e_phoff     = BYTE_GET (ehdr64.e_phoff);
12922       elf_header.e_shoff     = BYTE_GET (ehdr64.e_shoff);
12923       elf_header.e_flags     = BYTE_GET (ehdr64.e_flags);
12924       elf_header.e_ehsize    = BYTE_GET (ehdr64.e_ehsize);
12925       elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
12926       elf_header.e_phnum     = BYTE_GET (ehdr64.e_phnum);
12927       elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
12928       elf_header.e_shnum     = BYTE_GET (ehdr64.e_shnum);
12929       elf_header.e_shstrndx  = BYTE_GET (ehdr64.e_shstrndx);
12930     }
12931
12932   if (elf_header.e_shoff)
12933     {
12934       /* There may be some extensions in the first section header.  Don't
12935          bomb if we can't read it.  */
12936       if (is_32bit_elf)
12937         get_32bit_section_headers (file, 1);
12938       else
12939         get_64bit_section_headers (file, 1);
12940     }
12941
12942   return 1;
12943 }
12944
12945 /* Process one ELF object file according to the command line options.
12946    This file may actually be stored in an archive.  The file is
12947    positioned at the start of the ELF object.  */
12948
12949 static int
12950 process_object (char * file_name, FILE * file)
12951 {
12952   unsigned int i;
12953
12954   if (! get_file_header (file))
12955     {
12956       error (_("%s: Failed to read file header\n"), file_name);
12957       return 1;
12958     }
12959
12960   /* Initialise per file variables.  */
12961   for (i = ARRAY_SIZE (version_info); i--;)
12962     version_info[i] = 0;
12963
12964   for (i = ARRAY_SIZE (dynamic_info); i--;)
12965     dynamic_info[i] = 0;
12966   dynamic_info_DT_GNU_HASH = 0;
12967
12968   /* Process the file.  */
12969   if (show_name)
12970     printf (_("\nFile: %s\n"), file_name);
12971
12972   /* Initialise the dump_sects array from the cmdline_dump_sects array.
12973      Note we do this even if cmdline_dump_sects is empty because we
12974      must make sure that the dump_sets array is zeroed out before each
12975      object file is processed.  */
12976   if (num_dump_sects > num_cmdline_dump_sects)
12977     memset (dump_sects, 0, num_dump_sects * sizeof (* dump_sects));
12978
12979   if (num_cmdline_dump_sects > 0)
12980     {
12981       if (num_dump_sects == 0)
12982         /* A sneaky way of allocating the dump_sects array.  */
12983         request_dump_bynumber (num_cmdline_dump_sects, 0);
12984
12985       assert (num_dump_sects >= num_cmdline_dump_sects);
12986       memcpy (dump_sects, cmdline_dump_sects,
12987               num_cmdline_dump_sects * sizeof (* dump_sects));
12988     }
12989
12990   if (! process_file_header ())
12991     return 1;
12992
12993   if (! process_section_headers (file))
12994     {
12995       /* Without loaded section headers we cannot process lots of
12996          things.  */
12997       do_unwind = do_version = do_dump = do_arch = 0;
12998
12999       if (! do_using_dynamic)
13000         do_syms = do_dyn_syms = do_reloc = 0;
13001     }
13002
13003   if (! process_section_groups (file))
13004     {
13005       /* Without loaded section groups we cannot process unwind.  */
13006       do_unwind = 0;
13007     }
13008
13009   if (process_program_headers (file))
13010     process_dynamic_section (file);
13011
13012   process_relocs (file);
13013
13014   process_unwind (file);
13015
13016   process_symbol_table (file);
13017
13018   process_syminfo (file);
13019
13020   process_version_sections (file);
13021
13022   process_section_contents (file);
13023
13024   process_notes (file);
13025
13026   process_gnu_liblist (file);
13027
13028   process_arch_specific (file);
13029
13030   if (program_headers)
13031     {
13032       free (program_headers);
13033       program_headers = NULL;
13034     }
13035
13036   if (section_headers)
13037     {
13038       free (section_headers);
13039       section_headers = NULL;
13040     }
13041
13042   if (string_table)
13043     {
13044       free (string_table);
13045       string_table = NULL;
13046       string_table_length = 0;
13047     }
13048
13049   if (dynamic_strings)
13050     {
13051       free (dynamic_strings);
13052       dynamic_strings = NULL;
13053       dynamic_strings_length = 0;
13054     }
13055
13056   if (dynamic_symbols)
13057     {
13058       free (dynamic_symbols);
13059       dynamic_symbols = NULL;
13060       num_dynamic_syms = 0;
13061     }
13062
13063   if (dynamic_syminfo)
13064     {
13065       free (dynamic_syminfo);
13066       dynamic_syminfo = NULL;
13067     }
13068
13069   if (dynamic_section)
13070     {
13071       free (dynamic_section);
13072       dynamic_section = NULL;
13073     }
13074
13075   if (section_headers_groups)
13076     {
13077       free (section_headers_groups);
13078       section_headers_groups = NULL;
13079     }
13080
13081   if (section_groups)
13082     {
13083       struct group_list * g;
13084       struct group_list * next;
13085
13086       for (i = 0; i < group_count; i++)
13087         {
13088           for (g = section_groups [i].root; g != NULL; g = next)
13089             {
13090               next = g->next;
13091               free (g);
13092             }
13093         }
13094
13095       free (section_groups);
13096       section_groups = NULL;
13097     }
13098
13099   free_debug_memory ();
13100
13101   return 0;
13102 }
13103
13104 /* Process an ELF archive.
13105    On entry the file is positioned just after the ARMAG string.  */
13106
13107 static int
13108 process_archive (char * file_name, FILE * file, bfd_boolean is_thin_archive)
13109 {
13110   struct archive_info arch;
13111   struct archive_info nested_arch;
13112   size_t got;
13113   int ret;
13114
13115   show_name = 1;
13116
13117   /* The ARCH structure is used to hold information about this archive.  */
13118   arch.file_name = NULL;
13119   arch.file = NULL;
13120   arch.index_array = NULL;
13121   arch.sym_table = NULL;
13122   arch.longnames = NULL;
13123
13124   /* The NESTED_ARCH structure is used as a single-item cache of information
13125      about a nested archive (when members of a thin archive reside within
13126      another regular archive file).  */
13127   nested_arch.file_name = NULL;
13128   nested_arch.file = NULL;
13129   nested_arch.index_array = NULL;
13130   nested_arch.sym_table = NULL;
13131   nested_arch.longnames = NULL;
13132
13133   if (setup_archive (&arch, file_name, file, is_thin_archive, do_archive_index) != 0)
13134     {
13135       ret = 1;
13136       goto out;
13137     }
13138
13139   if (do_archive_index)
13140     {
13141       if (arch.sym_table == NULL)
13142         error (_("%s: unable to dump the index as none was found\n"), file_name);
13143       else
13144         {
13145           unsigned int i, l;
13146           unsigned long current_pos;
13147
13148           printf (_("Index of archive %s: (%ld entries, 0x%lx bytes in the symbol table)\n"),
13149                   file_name, arch.index_num, arch.sym_size);
13150           current_pos = ftell (file);
13151
13152           for (i = l = 0; i < arch.index_num; i++)
13153             {
13154               if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
13155                 {
13156                   char * member_name;
13157
13158                   member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
13159
13160                   if (member_name != NULL)
13161                     {
13162                       char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
13163
13164                       if (qualified_name != NULL)
13165                         {
13166                           printf (_("Binary %s contains:\n"), qualified_name);
13167                           free (qualified_name);
13168                         }
13169                     }
13170                 }
13171
13172               if (l >= arch.sym_size)
13173                 {
13174                   error (_("%s: end of the symbol table reached before the end of the index\n"),
13175                          file_name);
13176                   break;
13177                 }
13178               printf ("\t%s\n", arch.sym_table + l);
13179               l += strlen (arch.sym_table + l) + 1;
13180             }
13181
13182           if (l & 01)
13183             ++l;
13184           if (l < arch.sym_size)
13185             error (_("%s: symbols remain in the index symbol table, but without corresponding entries in the index table\n"),
13186                    file_name);
13187
13188           if (fseek (file, current_pos, SEEK_SET) != 0)
13189             {
13190               error (_("%s: failed to seek back to start of object files in the archive\n"), file_name);
13191               ret = 1;
13192               goto out;
13193             }
13194         }
13195
13196       if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
13197           && !do_segments && !do_header && !do_dump && !do_version
13198           && !do_histogram && !do_debugging && !do_arch && !do_notes
13199           && !do_section_groups && !do_dyn_syms)
13200         {
13201           ret = 0; /* Archive index only.  */
13202           goto out;
13203         }
13204     }
13205
13206   ret = 0;
13207
13208   while (1)
13209     {
13210       char * name;
13211       size_t namelen;
13212       char * qualified_name;
13213
13214       /* Read the next archive header.  */
13215       if (fseek (file, arch.next_arhdr_offset, SEEK_SET) != 0)
13216         {
13217           error (_("%s: failed to seek to next archive header\n"), file_name);
13218           return 1;
13219         }
13220       got = fread (&arch.arhdr, 1, sizeof arch.arhdr, file);
13221       if (got != sizeof arch.arhdr)
13222         {
13223           if (got == 0)
13224             break;
13225           error (_("%s: failed to read archive header\n"), file_name);
13226           ret = 1;
13227           break;
13228         }
13229       if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
13230         {
13231           error (_("%s: did not find a valid archive header\n"), arch.file_name);
13232           ret = 1;
13233           break;
13234         }
13235
13236       arch.next_arhdr_offset += sizeof arch.arhdr;
13237
13238       archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
13239       if (archive_file_size & 01)
13240         ++archive_file_size;
13241
13242       name = get_archive_member_name (&arch, &nested_arch);
13243       if (name == NULL)
13244         {
13245           error (_("%s: bad archive file name\n"), file_name);
13246           ret = 1;
13247           break;
13248         }
13249       namelen = strlen (name);
13250
13251       qualified_name = make_qualified_name (&arch, &nested_arch, name);
13252       if (qualified_name == NULL)
13253         {
13254           error (_("%s: bad archive file name\n"), file_name);
13255           ret = 1;
13256           break;
13257         }
13258
13259       if (is_thin_archive && arch.nested_member_origin == 0)
13260         {
13261           /* This is a proxy for an external member of a thin archive.  */
13262           FILE * member_file;
13263           char * member_file_name = adjust_relative_path (file_name, name, namelen);
13264           if (member_file_name == NULL)
13265             {
13266               ret = 1;
13267               break;
13268             }
13269
13270           member_file = fopen (member_file_name, "rb");
13271           if (member_file == NULL)
13272             {
13273               error (_("Input file '%s' is not readable.\n"), member_file_name);
13274               free (member_file_name);
13275               ret = 1;
13276               break;
13277             }
13278
13279           archive_file_offset = arch.nested_member_origin;
13280
13281           ret |= process_object (qualified_name, member_file);
13282
13283           fclose (member_file);
13284           free (member_file_name);
13285         }
13286       else if (is_thin_archive)
13287         {
13288           /* This is a proxy for a member of a nested archive.  */
13289           archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
13290
13291           /* The nested archive file will have been opened and setup by
13292              get_archive_member_name.  */
13293           if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
13294             {
13295               error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
13296               ret = 1;
13297               break;
13298             }
13299
13300           ret |= process_object (qualified_name, nested_arch.file);
13301         }
13302       else
13303         {
13304           archive_file_offset = arch.next_arhdr_offset;
13305           arch.next_arhdr_offset += archive_file_size;
13306
13307           ret |= process_object (qualified_name, file);
13308         }
13309
13310       if (dump_sects != NULL)
13311         {
13312           free (dump_sects);
13313           dump_sects = NULL;
13314           num_dump_sects = 0;
13315         }
13316
13317       free (qualified_name);
13318     }
13319
13320  out:
13321   if (nested_arch.file != NULL)
13322     fclose (nested_arch.file);
13323   release_archive (&nested_arch);
13324   release_archive (&arch);
13325
13326   return ret;
13327 }
13328
13329 static int
13330 process_file (char * file_name)
13331 {
13332   FILE * file;
13333   struct stat statbuf;
13334   char armag[SARMAG];
13335   int ret;
13336
13337   if (stat (file_name, &statbuf) < 0)
13338     {
13339       if (errno == ENOENT)
13340         error (_("'%s': No such file\n"), file_name);
13341       else
13342         error (_("Could not locate '%s'.  System error message: %s\n"),
13343                file_name, strerror (errno));
13344       return 1;
13345     }
13346
13347   if (! S_ISREG (statbuf.st_mode))
13348     {
13349       error (_("'%s' is not an ordinary file\n"), file_name);
13350       return 1;
13351     }
13352
13353   file = fopen (file_name, "rb");
13354   if (file == NULL)
13355     {
13356       error (_("Input file '%s' is not readable.\n"), file_name);
13357       return 1;
13358     }
13359
13360   if (fread (armag, SARMAG, 1, file) != 1)
13361     {
13362       error (_("%s: Failed to read file's magic number\n"), file_name);
13363       fclose (file);
13364       return 1;
13365     }
13366
13367   if (memcmp (armag, ARMAG, SARMAG) == 0)
13368     ret = process_archive (file_name, file, FALSE);
13369   else if (memcmp (armag, ARMAGT, SARMAG) == 0)
13370     ret = process_archive (file_name, file, TRUE);
13371   else
13372     {
13373       if (do_archive_index)
13374         error (_("File %s is not an archive so its index cannot be displayed.\n"),
13375                file_name);
13376
13377       rewind (file);
13378       archive_file_size = archive_file_offset = 0;
13379       ret = process_object (file_name, file);
13380     }
13381
13382   fclose (file);
13383
13384   return ret;
13385 }
13386
13387 #ifdef SUPPORT_DISASSEMBLY
13388 /* Needed by the i386 disassembler.  For extra credit, someone could
13389    fix this so that we insert symbolic addresses here, esp for GOT/PLT
13390    symbols.  */
13391
13392 void
13393 print_address (unsigned int addr, FILE * outfile)
13394 {
13395   fprintf (outfile,"0x%8.8x", addr);
13396 }
13397
13398 /* Needed by the i386 disassembler.  */
13399 void
13400 db_task_printsym (unsigned int addr)
13401 {
13402   print_address (addr, stderr);
13403 }
13404 #endif
13405
13406 int
13407 main (int argc, char ** argv)
13408 {
13409   int err;
13410
13411 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
13412   setlocale (LC_MESSAGES, "");
13413 #endif
13414 #if defined (HAVE_SETLOCALE)
13415   setlocale (LC_CTYPE, "");
13416 #endif
13417   bindtextdomain (PACKAGE, LOCALEDIR);
13418   textdomain (PACKAGE);
13419
13420   expandargv (&argc, &argv);
13421
13422   parse_args (argc, argv);
13423
13424   if (num_dump_sects > 0)
13425     {
13426       /* Make a copy of the dump_sects array.  */
13427       cmdline_dump_sects = (dump_type *)
13428           malloc (num_dump_sects * sizeof (* dump_sects));
13429       if (cmdline_dump_sects == NULL)
13430         error (_("Out of memory allocating dump request table.\n"));
13431       else
13432         {
13433           memcpy (cmdline_dump_sects, dump_sects,
13434                   num_dump_sects * sizeof (* dump_sects));
13435           num_cmdline_dump_sects = num_dump_sects;
13436         }
13437     }
13438
13439   if (optind < (argc - 1))
13440     show_name = 1;
13441
13442   err = 0;
13443   while (optind < argc)
13444     err |= process_file (argv[optind++]);
13445
13446   if (dump_sects != NULL)
13447     free (dump_sects);
13448   if (cmdline_dump_sects != NULL)
13449     free (cmdline_dump_sects);
13450
13451   return err;
13452 }