d85786e28a1be907cce6f1838a3214a26f677b18
[platform/upstream/binutils.git] / binutils / readelf.c
1 /* readelf.c -- display contents of an ELF format file
2    Copyright (C) 1998-2014 Free Software Foundation, Inc.
3
4    Originally developed by Eric Youngdale <eric@andante.jic.com>
5    Modifications by Nick Clifton <nickc@redhat.com>
6
7    This file is part of GNU Binutils.
8
9    This program is free software; you can redistribute it and/or modify
10    it under the terms of the GNU General Public License as published by
11    the Free Software Foundation; either version 3 of the License, or
12    (at your option) any later version.
13
14    This program is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17    GNU General Public License for more details.
18
19    You should have received a copy of the GNU General Public License
20    along with this program; if not, write to the Free Software
21    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
22    02110-1301, USA.  */
23 \f
24 /* The difference between readelf and objdump:
25
26   Both programs are capable of displaying the contents of ELF format files,
27   so why does the binutils project have two file dumpers ?
28
29   The reason is that objdump sees an ELF file through a BFD filter of the
30   world; if BFD has a bug where, say, it disagrees about a machine constant
31   in e_flags, then the odds are good that it will remain internally
32   consistent.  The linker sees it the BFD way, objdump sees it the BFD way,
33   GAS sees it the BFD way.  There was need for a tool to go find out what
34   the file actually says.
35
36   This is why the readelf program does not link against the BFD library - it
37   exists as an independent program to help verify the correct working of BFD.
38
39   There is also the case that readelf can provide more information about an
40   ELF file than is provided by objdump.  In particular it can display DWARF
41   debugging information which (at the moment) objdump cannot.  */
42 \f
43 #include "sysdep.h"
44 #include <assert.h>
45 #include <time.h>
46 #ifdef HAVE_ZLIB_H
47 #include <zlib.h>
48 #endif
49 #ifdef HAVE_WCHAR_H
50 #include <wchar.h>
51 #endif
52
53 #if __GNUC__ >= 2
54 /* Define BFD64 here, even if our default architecture is 32 bit ELF
55    as this will allow us to read in and parse 64bit and 32bit ELF files.
56    Only do this if we believe that the compiler can support a 64 bit
57    data type.  For now we only rely on GCC being able to do this.  */
58 #define BFD64
59 #endif
60
61 #include "bfd.h"
62 #include "bucomm.h"
63 #include "elfcomm.h"
64 #include "dwarf.h"
65
66 #include "elf/common.h"
67 #include "elf/external.h"
68 #include "elf/internal.h"
69
70
71 /* Included here, before RELOC_MACROS_GEN_FUNC is defined, so that
72    we can obtain the H8 reloc numbers.  We need these for the
73    get_reloc_size() function.  We include h8.h again after defining
74    RELOC_MACROS_GEN_FUNC so that we get the naming function as well.  */
75
76 #include "elf/h8.h"
77 #undef _ELF_H8_H
78
79 /* Undo the effects of #including reloc-macros.h.  */
80
81 #undef START_RELOC_NUMBERS
82 #undef RELOC_NUMBER
83 #undef FAKE_RELOC
84 #undef EMPTY_RELOC
85 #undef END_RELOC_NUMBERS
86 #undef _RELOC_MACROS_H
87
88 /* The following headers use the elf/reloc-macros.h file to
89    automatically generate relocation recognition functions
90    such as elf_mips_reloc_type()  */
91
92 #define RELOC_MACROS_GEN_FUNC
93
94 #include "elf/aarch64.h"
95 #include "elf/alpha.h"
96 #include "elf/arc.h"
97 #include "elf/arm.h"
98 #include "elf/avr.h"
99 #include "elf/bfin.h"
100 #include "elf/cr16.h"
101 #include "elf/cris.h"
102 #include "elf/crx.h"
103 #include "elf/d10v.h"
104 #include "elf/d30v.h"
105 #include "elf/dlx.h"
106 #include "elf/epiphany.h"
107 #include "elf/fr30.h"
108 #include "elf/frv.h"
109 #include "elf/h8.h"
110 #include "elf/hppa.h"
111 #include "elf/i386.h"
112 #include "elf/i370.h"
113 #include "elf/i860.h"
114 #include "elf/i960.h"
115 #include "elf/ia64.h"
116 #include "elf/ip2k.h"
117 #include "elf/lm32.h"
118 #include "elf/iq2000.h"
119 #include "elf/m32c.h"
120 #include "elf/m32r.h"
121 #include "elf/m68k.h"
122 #include "elf/m68hc11.h"
123 #include "elf/mcore.h"
124 #include "elf/mep.h"
125 #include "elf/metag.h"
126 #include "elf/microblaze.h"
127 #include "elf/mips.h"
128 #include "elf/mmix.h"
129 #include "elf/mn10200.h"
130 #include "elf/mn10300.h"
131 #include "elf/moxie.h"
132 #include "elf/mt.h"
133 #include "elf/msp430.h"
134 #include "elf/nds32.h"
135 #include "elf/nios2.h"
136 #include "elf/or1k.h"
137 #include "elf/pj.h"
138 #include "elf/ppc.h"
139 #include "elf/ppc64.h"
140 #include "elf/rl78.h"
141 #include "elf/rx.h"
142 #include "elf/s390.h"
143 #include "elf/score.h"
144 #include "elf/sh.h"
145 #include "elf/sparc.h"
146 #include "elf/spu.h"
147 #include "elf/tic6x.h"
148 #include "elf/tilegx.h"
149 #include "elf/tilepro.h"
150 #include "elf/v850.h"
151 #include "elf/vax.h"
152 #include "elf/x86-64.h"
153 #include "elf/xc16x.h"
154 #include "elf/xgate.h"
155 #include "elf/xstormy16.h"
156 #include "elf/xtensa.h"
157
158 #include "getopt.h"
159 #include "libiberty.h"
160 #include "safe-ctype.h"
161 #include "filenames.h"
162
163 #ifndef offsetof
164 #define offsetof(TYPE, MEMBER) ((size_t) &(((TYPE *) 0)->MEMBER))
165 #endif
166
167 char * program_name = "readelf";
168 static long archive_file_offset;
169 static unsigned long archive_file_size;
170 static unsigned long dynamic_addr;
171 static bfd_size_type dynamic_size;
172 static unsigned int dynamic_nent;
173 static char * dynamic_strings;
174 static unsigned long dynamic_strings_length;
175 static char * string_table;
176 static unsigned long string_table_length;
177 static unsigned long num_dynamic_syms;
178 static Elf_Internal_Sym * dynamic_symbols;
179 static Elf_Internal_Syminfo * dynamic_syminfo;
180 static unsigned long dynamic_syminfo_offset;
181 static unsigned int dynamic_syminfo_nent;
182 static char program_interpreter[PATH_MAX];
183 static bfd_vma dynamic_info[DT_ENCODING];
184 static bfd_vma dynamic_info_DT_GNU_HASH;
185 static bfd_vma version_info[16];
186 static Elf_Internal_Ehdr elf_header;
187 static Elf_Internal_Shdr * section_headers;
188 static Elf_Internal_Phdr * program_headers;
189 static Elf_Internal_Dyn *  dynamic_section;
190 static Elf_Internal_Shdr * symtab_shndx_hdr;
191 static int show_name;
192 static int do_dynamic;
193 static int do_syms;
194 static int do_dyn_syms;
195 static int do_reloc;
196 static int do_sections;
197 static int do_section_groups;
198 static int do_section_details;
199 static int do_segments;
200 static int do_unwind;
201 static int do_using_dynamic;
202 static int do_header;
203 static int do_dump;
204 static int do_version;
205 static int do_histogram;
206 static int do_debugging;
207 static int do_arch;
208 static int do_notes;
209 static int do_archive_index;
210 static int is_32bit_elf;
211
212 struct group_list
213 {
214   struct group_list * next;
215   unsigned int section_index;
216 };
217
218 struct group
219 {
220   struct group_list * root;
221   unsigned int group_index;
222 };
223
224 static size_t group_count;
225 static struct group * section_groups;
226 static struct group ** section_headers_groups;
227
228
229 /* Flag bits indicating particular types of dump.  */
230 #define HEX_DUMP        (1 << 0)        /* The -x command line switch.  */
231 #define DISASS_DUMP     (1 << 1)        /* The -i command line switch.  */
232 #define DEBUG_DUMP      (1 << 2)        /* The -w command line switch.  */
233 #define STRING_DUMP     (1 << 3)        /* The -p command line switch.  */
234 #define RELOC_DUMP      (1 << 4)        /* The -R command line switch.  */
235
236 typedef unsigned char dump_type;
237
238 /* A linked list of the section names for which dumps were requested.  */
239 struct dump_list_entry
240 {
241   char * name;
242   dump_type type;
243   struct dump_list_entry * next;
244 };
245 static struct dump_list_entry * dump_sects_byname;
246
247 /* A dynamic array of flags indicating for which sections a dump
248    has been requested via command line switches.  */
249 static dump_type *   cmdline_dump_sects = NULL;
250 static unsigned int  num_cmdline_dump_sects = 0;
251
252 /* A dynamic array of flags indicating for which sections a dump of
253    some kind has been requested.  It is reset on a per-object file
254    basis and then initialised from the cmdline_dump_sects array,
255    the results of interpreting the -w switch, and the
256    dump_sects_byname list.  */
257 static dump_type *   dump_sects = NULL;
258 static unsigned int  num_dump_sects = 0;
259
260
261 /* How to print a vma value.  */
262 typedef enum print_mode
263 {
264   HEX,
265   DEC,
266   DEC_5,
267   UNSIGNED,
268   PREFIX_HEX,
269   FULL_HEX,
270   LONG_HEX
271 }
272 print_mode;
273
274 #define UNKNOWN -1
275
276 #define SECTION_NAME(X)                                         \
277   ((X) == NULL ? _("<none>")                                    \
278    : string_table == NULL ? _("<no-name>")                      \
279    : ((X)->sh_name >= string_table_length ? _("<corrupt>")      \
280   : string_table + (X)->sh_name))
281
282 #define DT_VERSIONTAGIDX(tag)   (DT_VERNEEDNUM - (tag)) /* Reverse order!  */
283
284 #define GET_ELF_SYMBOLS(file, section, sym_count)                       \
285   (is_32bit_elf ? get_32bit_elf_symbols (file, section, sym_count)      \
286    : get_64bit_elf_symbols (file, section, sym_count))
287
288 #define VALID_DYNAMIC_NAME(offset)      ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
289 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
290    already been called and verified that the string exists.  */
291 #define GET_DYNAMIC_NAME(offset)        (dynamic_strings + offset)
292
293 #define REMOVE_ARCH_BITS(ADDR)                  \
294   do                                            \
295     {                                           \
296       if (elf_header.e_machine == EM_ARM)       \
297         (ADDR) &= ~1;                           \
298     }                                           \
299   while (0)
300 \f
301 /* Retrieve NMEMB structures, each SIZE bytes long from FILE starting at OFFSET.
302    Put the retrieved data into VAR, if it is not NULL.  Otherwise allocate a buffer
303    using malloc and fill that.  In either case return the pointer to the start of
304    the retrieved data or NULL if something went wrong.  If something does go wrong
305    emit an error message using REASON as part of the context.  */
306
307 static void *
308 get_data (void * var, FILE * file, long offset, size_t size, size_t nmemb,
309           const char * reason)
310 {
311   void * mvar;
312
313   if (size == 0 || nmemb == 0)
314     return NULL;
315
316   if (fseek (file, archive_file_offset + offset, SEEK_SET))
317     {
318       error (_("Unable to seek to 0x%lx for %s\n"),
319              (unsigned long) archive_file_offset + offset, reason);
320       return NULL;
321     }
322
323   mvar = var;
324   if (mvar == NULL)
325     {
326       /* Check for overflow.  */
327       if (nmemb < (~(size_t) 0 - 1) / size)
328         /* + 1 so that we can '\0' terminate invalid string table sections.  */
329         mvar = malloc (size * nmemb + 1);
330
331       if (mvar == NULL)
332         {
333           error (_("Out of memory allocating 0x%lx bytes for %s\n"),
334                  (unsigned long)(size * nmemb), reason);
335           return NULL;
336         }
337
338       ((char *) mvar)[size * nmemb] = '\0';
339     }
340
341   if (fread (mvar, size, nmemb, file) != nmemb)
342     {
343       error (_("Unable to read in 0x%lx bytes of %s\n"),
344              (unsigned long)(size * nmemb), reason);
345       if (mvar != var)
346         free (mvar);
347       return NULL;
348     }
349
350   return mvar;
351 }
352
353 /* Print a VMA value.  */
354
355 static int
356 print_vma (bfd_vma vma, print_mode mode)
357 {
358   int nc = 0;
359
360   switch (mode)
361     {
362     case FULL_HEX:
363       nc = printf ("0x");
364       /* Drop through.  */
365
366     case LONG_HEX:
367 #ifdef BFD64
368       if (is_32bit_elf)
369         return nc + printf ("%8.8" BFD_VMA_FMT "x", vma);
370 #endif
371       printf_vma (vma);
372       return nc + 16;
373
374     case DEC_5:
375       if (vma <= 99999)
376         return printf ("%5" BFD_VMA_FMT "d", vma);
377       /* Drop through.  */
378
379     case PREFIX_HEX:
380       nc = printf ("0x");
381       /* Drop through.  */
382
383     case HEX:
384       return nc + printf ("%" BFD_VMA_FMT "x", vma);
385
386     case DEC:
387       return printf ("%" BFD_VMA_FMT "d", vma);
388
389     case UNSIGNED:
390       return printf ("%" BFD_VMA_FMT "u", vma);
391     }
392   return 0;
393 }
394
395 /* Display a symbol on stdout.  Handles the display of control characters and
396    multibye characters (assuming the host environment supports them).
397
398    Display at most abs(WIDTH) characters, truncating as necessary, unless do_wide is true.
399
400    If WIDTH is negative then ensure that the output is at least (- WIDTH) characters,
401    padding as necessary.
402
403    Returns the number of emitted characters.  */
404
405 static unsigned int
406 print_symbol (int width, const char *symbol)
407 {
408   bfd_boolean extra_padding = FALSE;
409   int num_printed = 0;
410 #ifdef HAVE_MBSTATE_T
411   mbstate_t state;
412 #endif
413   int width_remaining;
414
415   if (width < 0)
416     {
417       /* Keep the width positive.  This also helps.  */
418       width = - width;
419       extra_padding = TRUE;
420     }
421
422   if (do_wide)
423     /* Set the remaining width to a very large value.
424        This simplifies the code below.  */
425     width_remaining = INT_MAX;
426   else
427     width_remaining = width;
428
429 #ifdef HAVE_MBSTATE_T
430   /* Initialise the multibyte conversion state.  */
431   memset (& state, 0, sizeof (state));
432 #endif
433
434   while (width_remaining)
435     {
436       size_t  n;
437       const char c = *symbol++;
438
439       if (c == 0)
440         break;
441
442       /* Do not print control characters directly as they can affect terminal
443          settings.  Such characters usually appear in the names generated
444          by the assembler for local labels.  */
445       if (ISCNTRL (c))
446         {
447           if (width_remaining < 2)
448             break;
449
450           printf ("^%c", c + 0x40);
451           width_remaining -= 2;
452           num_printed += 2;
453         }
454       else if (ISPRINT (c))
455         {
456           putchar (c);
457           width_remaining --;
458           num_printed ++;
459         }
460       else
461         {
462 #ifdef HAVE_MBSTATE_T
463           wchar_t w;
464 #endif
465           /* Let printf do the hard work of displaying multibyte characters.  */
466           printf ("%.1s", symbol - 1);
467           width_remaining --;
468           num_printed ++;
469
470 #ifdef HAVE_MBSTATE_T
471           /* Try to find out how many bytes made up the character that was
472              just printed.  Advance the symbol pointer past the bytes that
473              were displayed.  */
474           n = mbrtowc (& w, symbol - 1, MB_CUR_MAX, & state);
475 #else
476           n = 1;
477 #endif
478           if (n != (size_t) -1 && n != (size_t) -2 && n > 0)
479             symbol += (n - 1);
480         }
481     }
482
483   if (extra_padding && num_printed < width)
484     {
485       /* Fill in the remaining spaces.  */
486       printf ("%-*s", width - num_printed, " ");
487       num_printed = width;
488     }
489
490   return num_printed;
491 }
492
493 /* Return a pointer to section NAME, or NULL if no such section exists.  */
494
495 static Elf_Internal_Shdr *
496 find_section (const char * name)
497 {
498   unsigned int i;
499
500   for (i = 0; i < elf_header.e_shnum; i++)
501     if (streq (SECTION_NAME (section_headers + i), name))
502       return section_headers + i;
503
504   return NULL;
505 }
506
507 /* Return a pointer to a section containing ADDR, or NULL if no such
508    section exists.  */
509
510 static Elf_Internal_Shdr *
511 find_section_by_address (bfd_vma addr)
512 {
513   unsigned int i;
514
515   for (i = 0; i < elf_header.e_shnum; i++)
516     {
517       Elf_Internal_Shdr *sec = section_headers + i;
518       if (addr >= sec->sh_addr && addr < sec->sh_addr + sec->sh_size)
519         return sec;
520     }
521
522   return NULL;
523 }
524
525 /* Return a pointer to section NAME, or NULL if no such section exists,
526    restricted to the list of sections given in SET.  */
527
528 static Elf_Internal_Shdr *
529 find_section_in_set (const char * name, unsigned int * set)
530 {
531   unsigned int i;
532
533   if (set != NULL)
534     {
535       while ((i = *set++) > 0)
536         if (streq (SECTION_NAME (section_headers + i), name))
537           return section_headers + i;
538     }
539
540   return find_section (name);
541 }
542
543 /* Read an unsigned LEB128 encoded value from p.  Set *PLEN to the number of
544    bytes read.  */
545
546 static inline unsigned long
547 read_uleb128 (unsigned char *data,
548               unsigned int *length_return,
549               const unsigned char * const end)
550 {
551   return read_leb128 (data, length_return, FALSE, end);
552 }
553
554 /* Return true if the current file is for IA-64 machine and OpenVMS ABI.
555    This OS has so many departures from the ELF standard that we test it at
556    many places.  */
557
558 static inline int
559 is_ia64_vms (void)
560 {
561   return elf_header.e_machine == EM_IA_64
562     && elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS;
563 }
564
565 /* Guess the relocation size commonly used by the specific machines.  */
566
567 static int
568 guess_is_rela (unsigned int e_machine)
569 {
570   switch (e_machine)
571     {
572       /* Targets that use REL relocations.  */
573     case EM_386:
574     case EM_486:
575     case EM_960:
576     case EM_ARM:
577     case EM_D10V:
578     case EM_CYGNUS_D10V:
579     case EM_DLX:
580     case EM_MIPS:
581     case EM_MIPS_RS3_LE:
582     case EM_CYGNUS_M32R:
583     case EM_SCORE:
584     case EM_XGATE:
585       return FALSE;
586
587       /* Targets that use RELA relocations.  */
588     case EM_68K:
589     case EM_860:
590     case EM_AARCH64:
591     case EM_ADAPTEVA_EPIPHANY:
592     case EM_ALPHA:
593     case EM_ALTERA_NIOS2:
594     case EM_AVR:
595     case EM_AVR_OLD:
596     case EM_BLACKFIN:
597     case EM_CR16:
598     case EM_CRIS:
599     case EM_CRX:
600     case EM_D30V:
601     case EM_CYGNUS_D30V:
602     case EM_FR30:
603     case EM_CYGNUS_FR30:
604     case EM_CYGNUS_FRV:
605     case EM_H8S:
606     case EM_H8_300:
607     case EM_H8_300H:
608     case EM_IA_64:
609     case EM_IP2K:
610     case EM_IP2K_OLD:
611     case EM_IQ2000:
612     case EM_LATTICEMICO32:
613     case EM_M32C_OLD:
614     case EM_M32C:
615     case EM_M32R:
616     case EM_MCORE:
617     case EM_CYGNUS_MEP:
618     case EM_METAG:
619     case EM_MMIX:
620     case EM_MN10200:
621     case EM_CYGNUS_MN10200:
622     case EM_MN10300:
623     case EM_CYGNUS_MN10300:
624     case EM_MOXIE:
625     case EM_MSP430:
626     case EM_MSP430_OLD:
627     case EM_MT:
628     case EM_NDS32:
629     case EM_NIOS32:
630     case EM_OR1K:
631     case EM_PPC64:
632     case EM_PPC:
633     case EM_RL78:
634     case EM_RX:
635     case EM_S390:
636     case EM_S390_OLD:
637     case EM_SH:
638     case EM_SPARC:
639     case EM_SPARC32PLUS:
640     case EM_SPARCV9:
641     case EM_SPU:
642     case EM_TI_C6000:
643     case EM_TILEGX:
644     case EM_TILEPRO:
645     case EM_V800:
646     case EM_V850:
647     case EM_CYGNUS_V850:
648     case EM_VAX:
649     case EM_X86_64:
650     case EM_L1OM:
651     case EM_K1OM:
652     case EM_XSTORMY16:
653     case EM_XTENSA:
654     case EM_XTENSA_OLD:
655     case EM_MICROBLAZE:
656     case EM_MICROBLAZE_OLD:
657       return TRUE;
658
659     case EM_68HC05:
660     case EM_68HC08:
661     case EM_68HC11:
662     case EM_68HC16:
663     case EM_FX66:
664     case EM_ME16:
665     case EM_MMA:
666     case EM_NCPU:
667     case EM_NDR1:
668     case EM_PCP:
669     case EM_ST100:
670     case EM_ST19:
671     case EM_ST7:
672     case EM_ST9PLUS:
673     case EM_STARCORE:
674     case EM_SVX:
675     case EM_TINYJ:
676     default:
677       warn (_("Don't know about relocations on this machine architecture\n"));
678       return FALSE;
679     }
680 }
681
682 static int
683 slurp_rela_relocs (FILE * file,
684                    unsigned long rel_offset,
685                    unsigned long rel_size,
686                    Elf_Internal_Rela ** relasp,
687                    unsigned long * nrelasp)
688 {
689   Elf_Internal_Rela * relas;
690   unsigned long nrelas;
691   unsigned int i;
692
693   if (is_32bit_elf)
694     {
695       Elf32_External_Rela * erelas;
696
697       erelas = (Elf32_External_Rela *) get_data (NULL, file, rel_offset, 1,
698                                                  rel_size, _("32-bit relocation data"));
699       if (!erelas)
700         return 0;
701
702       nrelas = rel_size / sizeof (Elf32_External_Rela);
703
704       relas = (Elf_Internal_Rela *) cmalloc (nrelas,
705                                              sizeof (Elf_Internal_Rela));
706
707       if (relas == NULL)
708         {
709           free (erelas);
710           error (_("out of memory parsing relocs\n"));
711           return 0;
712         }
713
714       for (i = 0; i < nrelas; i++)
715         {
716           relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
717           relas[i].r_info   = BYTE_GET (erelas[i].r_info);
718           relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
719         }
720
721       free (erelas);
722     }
723   else
724     {
725       Elf64_External_Rela * erelas;
726
727       erelas = (Elf64_External_Rela *) get_data (NULL, file, rel_offset, 1,
728                                                  rel_size, _("64-bit relocation data"));
729       if (!erelas)
730         return 0;
731
732       nrelas = rel_size / sizeof (Elf64_External_Rela);
733
734       relas = (Elf_Internal_Rela *) cmalloc (nrelas,
735                                              sizeof (Elf_Internal_Rela));
736
737       if (relas == NULL)
738         {
739           free (erelas);
740           error (_("out of memory parsing relocs\n"));
741           return 0;
742         }
743
744       for (i = 0; i < nrelas; i++)
745         {
746           relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
747           relas[i].r_info   = BYTE_GET (erelas[i].r_info);
748           relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
749
750           /* The #ifdef BFD64 below is to prevent a compile time
751              warning.  We know that if we do not have a 64 bit data
752              type that we will never execute this code anyway.  */
753 #ifdef BFD64
754           if (elf_header.e_machine == EM_MIPS
755               && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
756             {
757               /* In little-endian objects, r_info isn't really a
758                  64-bit little-endian value: it has a 32-bit
759                  little-endian symbol index followed by four
760                  individual byte fields.  Reorder INFO
761                  accordingly.  */
762               bfd_vma inf = relas[i].r_info;
763               inf = (((inf & 0xffffffff) << 32)
764                       | ((inf >> 56) & 0xff)
765                       | ((inf >> 40) & 0xff00)
766                       | ((inf >> 24) & 0xff0000)
767                       | ((inf >> 8) & 0xff000000));
768               relas[i].r_info = inf;
769             }
770 #endif /* BFD64 */
771         }
772
773       free (erelas);
774     }
775   *relasp = relas;
776   *nrelasp = nrelas;
777   return 1;
778 }
779
780 static int
781 slurp_rel_relocs (FILE * file,
782                   unsigned long rel_offset,
783                   unsigned long rel_size,
784                   Elf_Internal_Rela ** relsp,
785                   unsigned long * nrelsp)
786 {
787   Elf_Internal_Rela * rels;
788   unsigned long nrels;
789   unsigned int i;
790
791   if (is_32bit_elf)
792     {
793       Elf32_External_Rel * erels;
794
795       erels = (Elf32_External_Rel *) get_data (NULL, file, rel_offset, 1,
796                                                rel_size, _("32-bit relocation data"));
797       if (!erels)
798         return 0;
799
800       nrels = rel_size / sizeof (Elf32_External_Rel);
801
802       rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
803
804       if (rels == NULL)
805         {
806           free (erels);
807           error (_("out of memory parsing relocs\n"));
808           return 0;
809         }
810
811       for (i = 0; i < nrels; i++)
812         {
813           rels[i].r_offset = BYTE_GET (erels[i].r_offset);
814           rels[i].r_info   = BYTE_GET (erels[i].r_info);
815           rels[i].r_addend = 0;
816         }
817
818       free (erels);
819     }
820   else
821     {
822       Elf64_External_Rel * erels;
823
824       erels = (Elf64_External_Rel *) get_data (NULL, file, rel_offset, 1,
825                                                rel_size, _("64-bit relocation data"));
826       if (!erels)
827         return 0;
828
829       nrels = rel_size / sizeof (Elf64_External_Rel);
830
831       rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
832
833       if (rels == NULL)
834         {
835           free (erels);
836           error (_("out of memory parsing relocs\n"));
837           return 0;
838         }
839
840       for (i = 0; i < nrels; i++)
841         {
842           rels[i].r_offset = BYTE_GET (erels[i].r_offset);
843           rels[i].r_info   = BYTE_GET (erels[i].r_info);
844           rels[i].r_addend = 0;
845
846           /* The #ifdef BFD64 below is to prevent a compile time
847              warning.  We know that if we do not have a 64 bit data
848              type that we will never execute this code anyway.  */
849 #ifdef BFD64
850           if (elf_header.e_machine == EM_MIPS
851               && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
852             {
853               /* In little-endian objects, r_info isn't really a
854                  64-bit little-endian value: it has a 32-bit
855                  little-endian symbol index followed by four
856                  individual byte fields.  Reorder INFO
857                  accordingly.  */
858               bfd_vma inf = rels[i].r_info;
859               inf = (((inf & 0xffffffff) << 32)
860                      | ((inf >> 56) & 0xff)
861                      | ((inf >> 40) & 0xff00)
862                      | ((inf >> 24) & 0xff0000)
863                      | ((inf >> 8) & 0xff000000));
864               rels[i].r_info = inf;
865             }
866 #endif /* BFD64 */
867         }
868
869       free (erels);
870     }
871   *relsp = rels;
872   *nrelsp = nrels;
873   return 1;
874 }
875
876 /* Returns the reloc type extracted from the reloc info field.  */
877
878 static unsigned int
879 get_reloc_type (bfd_vma reloc_info)
880 {
881   if (is_32bit_elf)
882     return ELF32_R_TYPE (reloc_info);
883
884   switch (elf_header.e_machine)
885     {
886     case EM_MIPS:
887       /* Note: We assume that reloc_info has already been adjusted for us.  */
888       return ELF64_MIPS_R_TYPE (reloc_info);
889
890     case EM_SPARCV9:
891       return ELF64_R_TYPE_ID (reloc_info);
892
893     default:
894       return ELF64_R_TYPE (reloc_info);
895     }
896 }
897
898 /* Return the symbol index extracted from the reloc info field.  */
899
900 static bfd_vma
901 get_reloc_symindex (bfd_vma reloc_info)
902 {
903   return is_32bit_elf ? ELF32_R_SYM (reloc_info) : ELF64_R_SYM (reloc_info);
904 }
905
906 static inline bfd_boolean
907 uses_msp430x_relocs (void)
908 {
909   return
910     elf_header.e_machine == EM_MSP430 /* Paranoia.  */
911     /* GCC uses osabi == ELFOSBI_STANDALONE.  */
912     && (((elf_header.e_flags & EF_MSP430_MACH) == E_MSP430_MACH_MSP430X)
913         /* TI compiler uses ELFOSABI_NONE.  */
914         || (elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE));
915 }
916
917 /* Display the contents of the relocation data found at the specified
918    offset.  */
919
920 static void
921 dump_relocations (FILE * file,
922                   unsigned long rel_offset,
923                   unsigned long rel_size,
924                   Elf_Internal_Sym * symtab,
925                   unsigned long nsyms,
926                   char * strtab,
927                   unsigned long strtablen,
928                   int is_rela)
929 {
930   unsigned int i;
931   Elf_Internal_Rela * rels;
932
933   if (is_rela == UNKNOWN)
934     is_rela = guess_is_rela (elf_header.e_machine);
935
936   if (is_rela)
937     {
938       if (!slurp_rela_relocs (file, rel_offset, rel_size, &rels, &rel_size))
939         return;
940     }
941   else
942     {
943       if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
944         return;
945     }
946
947   if (is_32bit_elf)
948     {
949       if (is_rela)
950         {
951           if (do_wide)
952             printf (_(" Offset     Info    Type                Sym. Value  Symbol's Name + Addend\n"));
953           else
954             printf (_(" Offset     Info    Type            Sym.Value  Sym. Name + Addend\n"));
955         }
956       else
957         {
958           if (do_wide)
959             printf (_(" Offset     Info    Type                Sym. Value  Symbol's Name\n"));
960           else
961             printf (_(" Offset     Info    Type            Sym.Value  Sym. Name\n"));
962         }
963     }
964   else
965     {
966       if (is_rela)
967         {
968           if (do_wide)
969             printf (_("    Offset             Info             Type               Symbol's Value  Symbol's Name + Addend\n"));
970           else
971             printf (_("  Offset          Info           Type           Sym. Value    Sym. Name + Addend\n"));
972         }
973       else
974         {
975           if (do_wide)
976             printf (_("    Offset             Info             Type               Symbol's Value  Symbol's Name\n"));
977           else
978             printf (_("  Offset          Info           Type           Sym. Value    Sym. Name\n"));
979         }
980     }
981
982   for (i = 0; i < rel_size; i++)
983     {
984       const char * rtype;
985       bfd_vma offset;
986       bfd_vma inf;
987       bfd_vma symtab_index;
988       bfd_vma type;
989
990       offset = rels[i].r_offset;
991       inf    = rels[i].r_info;
992
993       type = get_reloc_type (inf);
994       symtab_index = get_reloc_symindex  (inf);
995
996       if (is_32bit_elf)
997         {
998           printf ("%8.8lx  %8.8lx ",
999                   (unsigned long) offset & 0xffffffff,
1000                   (unsigned long) inf & 0xffffffff);
1001         }
1002       else
1003         {
1004 #if BFD_HOST_64BIT_LONG
1005           printf (do_wide
1006                   ? "%16.16lx  %16.16lx "
1007                   : "%12.12lx  %12.12lx ",
1008                   offset, inf);
1009 #elif BFD_HOST_64BIT_LONG_LONG
1010 #ifndef __MSVCRT__
1011           printf (do_wide
1012                   ? "%16.16llx  %16.16llx "
1013                   : "%12.12llx  %12.12llx ",
1014                   offset, inf);
1015 #else
1016           printf (do_wide
1017                   ? "%16.16I64x  %16.16I64x "
1018                   : "%12.12I64x  %12.12I64x ",
1019                   offset, inf);
1020 #endif
1021 #else
1022           printf (do_wide
1023                   ? "%8.8lx%8.8lx  %8.8lx%8.8lx "
1024                   : "%4.4lx%8.8lx  %4.4lx%8.8lx ",
1025                   _bfd_int64_high (offset),
1026                   _bfd_int64_low (offset),
1027                   _bfd_int64_high (inf),
1028                   _bfd_int64_low (inf));
1029 #endif
1030         }
1031
1032       switch (elf_header.e_machine)
1033         {
1034         default:
1035           rtype = NULL;
1036           break;
1037
1038         case EM_AARCH64:
1039           rtype = elf_aarch64_reloc_type (type);
1040           break;
1041
1042         case EM_M32R:
1043         case EM_CYGNUS_M32R:
1044           rtype = elf_m32r_reloc_type (type);
1045           break;
1046
1047         case EM_386:
1048         case EM_486:
1049           rtype = elf_i386_reloc_type (type);
1050           break;
1051
1052         case EM_68HC11:
1053         case EM_68HC12:
1054           rtype = elf_m68hc11_reloc_type (type);
1055           break;
1056
1057         case EM_68K:
1058           rtype = elf_m68k_reloc_type (type);
1059           break;
1060
1061         case EM_960:
1062           rtype = elf_i960_reloc_type (type);
1063           break;
1064
1065         case EM_AVR:
1066         case EM_AVR_OLD:
1067           rtype = elf_avr_reloc_type (type);
1068           break;
1069
1070         case EM_OLD_SPARCV9:
1071         case EM_SPARC32PLUS:
1072         case EM_SPARCV9:
1073         case EM_SPARC:
1074           rtype = elf_sparc_reloc_type (type);
1075           break;
1076
1077         case EM_SPU:
1078           rtype = elf_spu_reloc_type (type);
1079           break;
1080
1081         case EM_V800:
1082           rtype = v800_reloc_type (type);
1083           break;
1084         case EM_V850:
1085         case EM_CYGNUS_V850:
1086           rtype = v850_reloc_type (type);
1087           break;
1088
1089         case EM_D10V:
1090         case EM_CYGNUS_D10V:
1091           rtype = elf_d10v_reloc_type (type);
1092           break;
1093
1094         case EM_D30V:
1095         case EM_CYGNUS_D30V:
1096           rtype = elf_d30v_reloc_type (type);
1097           break;
1098
1099         case EM_DLX:
1100           rtype = elf_dlx_reloc_type (type);
1101           break;
1102
1103         case EM_SH:
1104           rtype = elf_sh_reloc_type (type);
1105           break;
1106
1107         case EM_MN10300:
1108         case EM_CYGNUS_MN10300:
1109           rtype = elf_mn10300_reloc_type (type);
1110           break;
1111
1112         case EM_MN10200:
1113         case EM_CYGNUS_MN10200:
1114           rtype = elf_mn10200_reloc_type (type);
1115           break;
1116
1117         case EM_FR30:
1118         case EM_CYGNUS_FR30:
1119           rtype = elf_fr30_reloc_type (type);
1120           break;
1121
1122         case EM_CYGNUS_FRV:
1123           rtype = elf_frv_reloc_type (type);
1124           break;
1125
1126         case EM_MCORE:
1127           rtype = elf_mcore_reloc_type (type);
1128           break;
1129
1130         case EM_MMIX:
1131           rtype = elf_mmix_reloc_type (type);
1132           break;
1133
1134         case EM_MOXIE:
1135           rtype = elf_moxie_reloc_type (type);
1136           break;
1137
1138         case EM_MSP430:
1139           if (uses_msp430x_relocs ())
1140             {
1141               rtype = elf_msp430x_reloc_type (type);
1142               break;
1143             }
1144         case EM_MSP430_OLD:
1145           rtype = elf_msp430_reloc_type (type);
1146           break;
1147
1148         case EM_NDS32:
1149           rtype = elf_nds32_reloc_type (type);
1150           break;
1151
1152         case EM_PPC:
1153           rtype = elf_ppc_reloc_type (type);
1154           break;
1155
1156         case EM_PPC64:
1157           rtype = elf_ppc64_reloc_type (type);
1158           break;
1159
1160         case EM_MIPS:
1161         case EM_MIPS_RS3_LE:
1162           rtype = elf_mips_reloc_type (type);
1163           break;
1164
1165         case EM_ALPHA:
1166           rtype = elf_alpha_reloc_type (type);
1167           break;
1168
1169         case EM_ARM:
1170           rtype = elf_arm_reloc_type (type);
1171           break;
1172
1173         case EM_ARC:
1174           rtype = elf_arc_reloc_type (type);
1175           break;
1176
1177         case EM_PARISC:
1178           rtype = elf_hppa_reloc_type (type);
1179           break;
1180
1181         case EM_H8_300:
1182         case EM_H8_300H:
1183         case EM_H8S:
1184           rtype = elf_h8_reloc_type (type);
1185           break;
1186
1187         case EM_OR1K:
1188           rtype = elf_or1k_reloc_type (type);
1189           break;
1190
1191         case EM_PJ:
1192         case EM_PJ_OLD:
1193           rtype = elf_pj_reloc_type (type);
1194           break;
1195         case EM_IA_64:
1196           rtype = elf_ia64_reloc_type (type);
1197           break;
1198
1199         case EM_CRIS:
1200           rtype = elf_cris_reloc_type (type);
1201           break;
1202
1203         case EM_860:
1204           rtype = elf_i860_reloc_type (type);
1205           break;
1206
1207         case EM_X86_64:
1208         case EM_L1OM:
1209         case EM_K1OM:
1210           rtype = elf_x86_64_reloc_type (type);
1211           break;
1212
1213         case EM_S370:
1214           rtype = i370_reloc_type (type);
1215           break;
1216
1217         case EM_S390_OLD:
1218         case EM_S390:
1219           rtype = elf_s390_reloc_type (type);
1220           break;
1221
1222         case EM_SCORE:
1223           rtype = elf_score_reloc_type (type);
1224           break;
1225
1226         case EM_XSTORMY16:
1227           rtype = elf_xstormy16_reloc_type (type);
1228           break;
1229
1230         case EM_CRX:
1231           rtype = elf_crx_reloc_type (type);
1232           break;
1233
1234         case EM_VAX:
1235           rtype = elf_vax_reloc_type (type);
1236           break;
1237
1238         case EM_ADAPTEVA_EPIPHANY:
1239           rtype = elf_epiphany_reloc_type (type);
1240           break;
1241
1242         case EM_IP2K:
1243         case EM_IP2K_OLD:
1244           rtype = elf_ip2k_reloc_type (type);
1245           break;
1246
1247         case EM_IQ2000:
1248           rtype = elf_iq2000_reloc_type (type);
1249           break;
1250
1251         case EM_XTENSA_OLD:
1252         case EM_XTENSA:
1253           rtype = elf_xtensa_reloc_type (type);
1254           break;
1255
1256         case EM_LATTICEMICO32:
1257           rtype = elf_lm32_reloc_type (type);
1258           break;
1259
1260         case EM_M32C_OLD:
1261         case EM_M32C:
1262           rtype = elf_m32c_reloc_type (type);
1263           break;
1264
1265         case EM_MT:
1266           rtype = elf_mt_reloc_type (type);
1267           break;
1268
1269         case EM_BLACKFIN:
1270           rtype = elf_bfin_reloc_type (type);
1271           break;
1272
1273         case EM_CYGNUS_MEP:
1274           rtype = elf_mep_reloc_type (type);
1275           break;
1276
1277         case EM_CR16:
1278           rtype = elf_cr16_reloc_type (type);
1279           break;
1280
1281         case EM_MICROBLAZE:
1282         case EM_MICROBLAZE_OLD:
1283           rtype = elf_microblaze_reloc_type (type);
1284           break;
1285
1286         case EM_RL78:
1287           rtype = elf_rl78_reloc_type (type);
1288           break;
1289
1290         case EM_RX:
1291           rtype = elf_rx_reloc_type (type);
1292           break;
1293
1294         case EM_METAG:
1295           rtype = elf_metag_reloc_type (type);
1296           break;
1297
1298         case EM_XC16X:
1299         case EM_C166:
1300           rtype = elf_xc16x_reloc_type (type);
1301           break;
1302
1303         case EM_TI_C6000:
1304           rtype = elf_tic6x_reloc_type (type);
1305           break;
1306
1307         case EM_TILEGX:
1308           rtype = elf_tilegx_reloc_type (type);
1309           break;
1310
1311         case EM_TILEPRO:
1312           rtype = elf_tilepro_reloc_type (type);
1313           break;
1314
1315         case EM_XGATE:
1316           rtype = elf_xgate_reloc_type (type);
1317           break;
1318
1319         case EM_ALTERA_NIOS2:
1320           rtype = elf_nios2_reloc_type (type);
1321           break;
1322         }
1323
1324       if (rtype == NULL)
1325         printf (_("unrecognized: %-7lx"), (unsigned long) type & 0xffffffff);
1326       else
1327         printf (do_wide ? "%-22.22s" : "%-17.17s", rtype);
1328
1329       if (elf_header.e_machine == EM_ALPHA
1330           && rtype != NULL
1331           && streq (rtype, "R_ALPHA_LITUSE")
1332           && is_rela)
1333         {
1334           switch (rels[i].r_addend)
1335             {
1336             case LITUSE_ALPHA_ADDR:   rtype = "ADDR";   break;
1337             case LITUSE_ALPHA_BASE:   rtype = "BASE";   break;
1338             case LITUSE_ALPHA_BYTOFF: rtype = "BYTOFF"; break;
1339             case LITUSE_ALPHA_JSR:    rtype = "JSR";    break;
1340             case LITUSE_ALPHA_TLSGD:  rtype = "TLSGD";  break;
1341             case LITUSE_ALPHA_TLSLDM: rtype = "TLSLDM"; break;
1342             case LITUSE_ALPHA_JSRDIRECT: rtype = "JSRDIRECT"; break;
1343             default: rtype = NULL;
1344             }
1345           if (rtype)
1346             printf (" (%s)", rtype);
1347           else
1348             {
1349               putchar (' ');
1350               printf (_("<unknown addend: %lx>"),
1351                       (unsigned long) rels[i].r_addend);
1352             }
1353         }
1354       else if (symtab_index)
1355         {
1356           if (symtab == NULL || symtab_index >= nsyms)
1357             printf (_(" bad symbol index: %08lx"), (unsigned long) symtab_index);
1358           else
1359             {
1360               Elf_Internal_Sym * psym;
1361
1362               psym = symtab + symtab_index;
1363
1364               printf (" ");
1365
1366               if (ELF_ST_TYPE (psym->st_info) == STT_GNU_IFUNC)
1367                 {
1368                   const char * name;
1369                   unsigned int len;
1370                   unsigned int width = is_32bit_elf ? 8 : 14;
1371
1372                   /* Relocations against GNU_IFUNC symbols do not use the value
1373                      of the symbol as the address to relocate against.  Instead
1374                      they invoke the function named by the symbol and use its
1375                      result as the address for relocation.
1376
1377                      To indicate this to the user, do not display the value of
1378                      the symbol in the "Symbols's Value" field.  Instead show
1379                      its name followed by () as a hint that the symbol is
1380                      invoked.  */
1381
1382                   if (strtab == NULL
1383                       || psym->st_name == 0
1384                       || psym->st_name >= strtablen)
1385                     name = "??";
1386                   else
1387                     name = strtab + psym->st_name;
1388
1389                   len = print_symbol (width, name);
1390                   printf ("()%-*s", len <= width ? (width + 1) - len : 1, " ");
1391                 }
1392               else
1393                 {
1394                   print_vma (psym->st_value, LONG_HEX);
1395
1396                   printf (is_32bit_elf ? "   " : " ");
1397                 }
1398
1399               if (psym->st_name == 0)
1400                 {
1401                   const char * sec_name = "<null>";
1402                   char name_buf[40];
1403
1404                   if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1405                     {
1406                       if (psym->st_shndx < elf_header.e_shnum)
1407                         sec_name
1408                           = SECTION_NAME (section_headers + psym->st_shndx);
1409                       else if (psym->st_shndx == SHN_ABS)
1410                         sec_name = "ABS";
1411                       else if (psym->st_shndx == SHN_COMMON)
1412                         sec_name = "COMMON";
1413                       else if ((elf_header.e_machine == EM_MIPS
1414                                 && psym->st_shndx == SHN_MIPS_SCOMMON)
1415                                || (elf_header.e_machine == EM_TI_C6000
1416                                    && psym->st_shndx == SHN_TIC6X_SCOMMON))
1417                         sec_name = "SCOMMON";
1418                       else if (elf_header.e_machine == EM_MIPS
1419                                && psym->st_shndx == SHN_MIPS_SUNDEFINED)
1420                         sec_name = "SUNDEF";
1421                       else if ((elf_header.e_machine == EM_X86_64
1422                                 || elf_header.e_machine == EM_L1OM
1423                                 || elf_header.e_machine == EM_K1OM)
1424                                && psym->st_shndx == SHN_X86_64_LCOMMON)
1425                         sec_name = "LARGE_COMMON";
1426                       else if (elf_header.e_machine == EM_IA_64
1427                                && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
1428                                && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1429                         sec_name = "ANSI_COM";
1430                       else if (is_ia64_vms ()
1431                                && psym->st_shndx == SHN_IA_64_VMS_SYMVEC)
1432                         sec_name = "VMS_SYMVEC";
1433                       else
1434                         {
1435                           sprintf (name_buf, "<section 0x%x>",
1436                                    (unsigned int) psym->st_shndx);
1437                           sec_name = name_buf;
1438                         }
1439                     }
1440                   print_symbol (22, sec_name);
1441                 }
1442               else if (strtab == NULL)
1443                 printf (_("<string table index: %3ld>"), psym->st_name);
1444               else if (psym->st_name >= strtablen)
1445                 printf (_("<corrupt string table index: %3ld>"), psym->st_name);
1446               else
1447                 print_symbol (22, strtab + psym->st_name);
1448
1449               if (is_rela)
1450                 {
1451                   bfd_signed_vma off = rels[i].r_addend;
1452
1453                   if (off < 0)
1454                     printf (" - %" BFD_VMA_FMT "x", - off);
1455                   else
1456                     printf (" + %" BFD_VMA_FMT "x", off);
1457                 }
1458             }
1459         }
1460       else if (is_rela)
1461         {
1462           bfd_signed_vma off = rels[i].r_addend;
1463
1464           printf ("%*c", is_32bit_elf ? 12 : 20, ' ');
1465           if (off < 0)
1466             printf ("-%" BFD_VMA_FMT "x", - off);
1467           else
1468             printf ("%" BFD_VMA_FMT "x", off);
1469         }
1470
1471       if (elf_header.e_machine == EM_SPARCV9
1472           && rtype != NULL
1473           && streq (rtype, "R_SPARC_OLO10"))
1474         printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf));
1475
1476       putchar ('\n');
1477
1478 #ifdef BFD64
1479       if (! is_32bit_elf && elf_header.e_machine == EM_MIPS)
1480         {
1481           bfd_vma type2 = ELF64_MIPS_R_TYPE2 (inf);
1482           bfd_vma type3 = ELF64_MIPS_R_TYPE3 (inf);
1483           const char * rtype2 = elf_mips_reloc_type (type2);
1484           const char * rtype3 = elf_mips_reloc_type (type3);
1485
1486           printf ("                    Type2: ");
1487
1488           if (rtype2 == NULL)
1489             printf (_("unrecognized: %-7lx"),
1490                     (unsigned long) type2 & 0xffffffff);
1491           else
1492             printf ("%-17.17s", rtype2);
1493
1494           printf ("\n                    Type3: ");
1495
1496           if (rtype3 == NULL)
1497             printf (_("unrecognized: %-7lx"),
1498                     (unsigned long) type3 & 0xffffffff);
1499           else
1500             printf ("%-17.17s", rtype3);
1501
1502           putchar ('\n');
1503         }
1504 #endif /* BFD64 */
1505     }
1506
1507   free (rels);
1508 }
1509
1510 static const char *
1511 get_mips_dynamic_type (unsigned long type)
1512 {
1513   switch (type)
1514     {
1515     case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1516     case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1517     case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1518     case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1519     case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1520     case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1521     case DT_MIPS_MSYM: return "MIPS_MSYM";
1522     case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1523     case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1524     case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1525     case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1526     case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1527     case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1528     case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1529     case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1530     case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1531     case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1532     case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1533     case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1534     case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1535     case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1536     case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1537     case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1538     case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1539     case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1540     case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1541     case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1542     case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1543     case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1544     case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1545     case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1546     case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1547     case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1548     case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1549     case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1550     case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1551     case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1552     case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1553     case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1554     case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1555     case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1556     case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1557     case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1558     case DT_MIPS_PLTGOT: return "MIPS_PLTGOT";
1559     case DT_MIPS_RWPLT: return "MIPS_RWPLT";
1560     default:
1561       return NULL;
1562     }
1563 }
1564
1565 static const char *
1566 get_sparc64_dynamic_type (unsigned long type)
1567 {
1568   switch (type)
1569     {
1570     case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1571     default:
1572       return NULL;
1573     }
1574 }
1575
1576 static const char *
1577 get_ppc_dynamic_type (unsigned long type)
1578 {
1579   switch (type)
1580     {
1581     case DT_PPC_GOT:    return "PPC_GOT";
1582     case DT_PPC_OPT:    return "PPC_OPT";
1583     default:
1584       return NULL;
1585     }
1586 }
1587
1588 static const char *
1589 get_ppc64_dynamic_type (unsigned long type)
1590 {
1591   switch (type)
1592     {
1593     case DT_PPC64_GLINK:  return "PPC64_GLINK";
1594     case DT_PPC64_OPD:    return "PPC64_OPD";
1595     case DT_PPC64_OPDSZ:  return "PPC64_OPDSZ";
1596     case DT_PPC64_OPT:    return "PPC64_OPT";
1597     default:
1598       return NULL;
1599     }
1600 }
1601
1602 static const char *
1603 get_parisc_dynamic_type (unsigned long type)
1604 {
1605   switch (type)
1606     {
1607     case DT_HP_LOAD_MAP:        return "HP_LOAD_MAP";
1608     case DT_HP_DLD_FLAGS:       return "HP_DLD_FLAGS";
1609     case DT_HP_DLD_HOOK:        return "HP_DLD_HOOK";
1610     case DT_HP_UX10_INIT:       return "HP_UX10_INIT";
1611     case DT_HP_UX10_INITSZ:     return "HP_UX10_INITSZ";
1612     case DT_HP_PREINIT:         return "HP_PREINIT";
1613     case DT_HP_PREINITSZ:       return "HP_PREINITSZ";
1614     case DT_HP_NEEDED:          return "HP_NEEDED";
1615     case DT_HP_TIME_STAMP:      return "HP_TIME_STAMP";
1616     case DT_HP_CHECKSUM:        return "HP_CHECKSUM";
1617     case DT_HP_GST_SIZE:        return "HP_GST_SIZE";
1618     case DT_HP_GST_VERSION:     return "HP_GST_VERSION";
1619     case DT_HP_GST_HASHVAL:     return "HP_GST_HASHVAL";
1620     case DT_HP_EPLTREL:         return "HP_GST_EPLTREL";
1621     case DT_HP_EPLTRELSZ:       return "HP_GST_EPLTRELSZ";
1622     case DT_HP_FILTERED:        return "HP_FILTERED";
1623     case DT_HP_FILTER_TLS:      return "HP_FILTER_TLS";
1624     case DT_HP_COMPAT_FILTERED: return "HP_COMPAT_FILTERED";
1625     case DT_HP_LAZYLOAD:        return "HP_LAZYLOAD";
1626     case DT_HP_BIND_NOW_COUNT:  return "HP_BIND_NOW_COUNT";
1627     case DT_PLT:                return "PLT";
1628     case DT_PLT_SIZE:           return "PLT_SIZE";
1629     case DT_DLT:                return "DLT";
1630     case DT_DLT_SIZE:           return "DLT_SIZE";
1631     default:
1632       return NULL;
1633     }
1634 }
1635
1636 static const char *
1637 get_ia64_dynamic_type (unsigned long type)
1638 {
1639   switch (type)
1640     {
1641     case DT_IA_64_PLT_RESERVE:         return "IA_64_PLT_RESERVE";
1642     case DT_IA_64_VMS_SUBTYPE:         return "VMS_SUBTYPE";
1643     case DT_IA_64_VMS_IMGIOCNT:        return "VMS_IMGIOCNT";
1644     case DT_IA_64_VMS_LNKFLAGS:        return "VMS_LNKFLAGS";
1645     case DT_IA_64_VMS_VIR_MEM_BLK_SIZ: return "VMS_VIR_MEM_BLK_SIZ";
1646     case DT_IA_64_VMS_IDENT:           return "VMS_IDENT";
1647     case DT_IA_64_VMS_NEEDED_IDENT:    return "VMS_NEEDED_IDENT";
1648     case DT_IA_64_VMS_IMG_RELA_CNT:    return "VMS_IMG_RELA_CNT";
1649     case DT_IA_64_VMS_SEG_RELA_CNT:    return "VMS_SEG_RELA_CNT";
1650     case DT_IA_64_VMS_FIXUP_RELA_CNT:  return "VMS_FIXUP_RELA_CNT";
1651     case DT_IA_64_VMS_FIXUP_NEEDED:    return "VMS_FIXUP_NEEDED";
1652     case DT_IA_64_VMS_SYMVEC_CNT:      return "VMS_SYMVEC_CNT";
1653     case DT_IA_64_VMS_XLATED:          return "VMS_XLATED";
1654     case DT_IA_64_VMS_STACKSIZE:       return "VMS_STACKSIZE";
1655     case DT_IA_64_VMS_UNWINDSZ:        return "VMS_UNWINDSZ";
1656     case DT_IA_64_VMS_UNWIND_CODSEG:   return "VMS_UNWIND_CODSEG";
1657     case DT_IA_64_VMS_UNWIND_INFOSEG:  return "VMS_UNWIND_INFOSEG";
1658     case DT_IA_64_VMS_LINKTIME:        return "VMS_LINKTIME";
1659     case DT_IA_64_VMS_SEG_NO:          return "VMS_SEG_NO";
1660     case DT_IA_64_VMS_SYMVEC_OFFSET:   return "VMS_SYMVEC_OFFSET";
1661     case DT_IA_64_VMS_SYMVEC_SEG:      return "VMS_SYMVEC_SEG";
1662     case DT_IA_64_VMS_UNWIND_OFFSET:   return "VMS_UNWIND_OFFSET";
1663     case DT_IA_64_VMS_UNWIND_SEG:      return "VMS_UNWIND_SEG";
1664     case DT_IA_64_VMS_STRTAB_OFFSET:   return "VMS_STRTAB_OFFSET";
1665     case DT_IA_64_VMS_SYSVER_OFFSET:   return "VMS_SYSVER_OFFSET";
1666     case DT_IA_64_VMS_IMG_RELA_OFF:    return "VMS_IMG_RELA_OFF";
1667     case DT_IA_64_VMS_SEG_RELA_OFF:    return "VMS_SEG_RELA_OFF";
1668     case DT_IA_64_VMS_FIXUP_RELA_OFF:  return "VMS_FIXUP_RELA_OFF";
1669     case DT_IA_64_VMS_PLTGOT_OFFSET:   return "VMS_PLTGOT_OFFSET";
1670     case DT_IA_64_VMS_PLTGOT_SEG:      return "VMS_PLTGOT_SEG";
1671     case DT_IA_64_VMS_FPMODE:          return "VMS_FPMODE";
1672     default:
1673       return NULL;
1674     }
1675 }
1676
1677 static const char *
1678 get_alpha_dynamic_type (unsigned long type)
1679 {
1680   switch (type)
1681     {
1682     case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
1683     default:
1684       return NULL;
1685     }
1686 }
1687
1688 static const char *
1689 get_score_dynamic_type (unsigned long type)
1690 {
1691   switch (type)
1692     {
1693     case DT_SCORE_BASE_ADDRESS: return "SCORE_BASE_ADDRESS";
1694     case DT_SCORE_LOCAL_GOTNO:  return "SCORE_LOCAL_GOTNO";
1695     case DT_SCORE_SYMTABNO:     return "SCORE_SYMTABNO";
1696     case DT_SCORE_GOTSYM:       return "SCORE_GOTSYM";
1697     case DT_SCORE_UNREFEXTNO:   return "SCORE_UNREFEXTNO";
1698     case DT_SCORE_HIPAGENO:     return "SCORE_HIPAGENO";
1699     default:
1700       return NULL;
1701     }
1702 }
1703
1704 static const char *
1705 get_tic6x_dynamic_type (unsigned long type)
1706 {
1707   switch (type)
1708     {
1709     case DT_C6000_GSYM_OFFSET: return "C6000_GSYM_OFFSET";
1710     case DT_C6000_GSTR_OFFSET: return "C6000_GSTR_OFFSET";
1711     case DT_C6000_DSBT_BASE:   return "C6000_DSBT_BASE";
1712     case DT_C6000_DSBT_SIZE:   return "C6000_DSBT_SIZE";
1713     case DT_C6000_PREEMPTMAP:  return "C6000_PREEMPTMAP";
1714     case DT_C6000_DSBT_INDEX:  return "C6000_DSBT_INDEX";
1715     default:
1716       return NULL;
1717     }
1718 }
1719
1720 static const char *
1721 get_nios2_dynamic_type (unsigned long type)
1722 {
1723   switch (type)
1724     {
1725     case DT_NIOS2_GP: return "NIOS2_GP";
1726     default:
1727       return NULL;
1728     }
1729 }
1730
1731 static const char *
1732 get_dynamic_type (unsigned long type)
1733 {
1734   static char buff[64];
1735
1736   switch (type)
1737     {
1738     case DT_NULL:       return "NULL";
1739     case DT_NEEDED:     return "NEEDED";
1740     case DT_PLTRELSZ:   return "PLTRELSZ";
1741     case DT_PLTGOT:     return "PLTGOT";
1742     case DT_HASH:       return "HASH";
1743     case DT_STRTAB:     return "STRTAB";
1744     case DT_SYMTAB:     return "SYMTAB";
1745     case DT_RELA:       return "RELA";
1746     case DT_RELASZ:     return "RELASZ";
1747     case DT_RELAENT:    return "RELAENT";
1748     case DT_STRSZ:      return "STRSZ";
1749     case DT_SYMENT:     return "SYMENT";
1750     case DT_INIT:       return "INIT";
1751     case DT_FINI:       return "FINI";
1752     case DT_SONAME:     return "SONAME";
1753     case DT_RPATH:      return "RPATH";
1754     case DT_SYMBOLIC:   return "SYMBOLIC";
1755     case DT_REL:        return "REL";
1756     case DT_RELSZ:      return "RELSZ";
1757     case DT_RELENT:     return "RELENT";
1758     case DT_PLTREL:     return "PLTREL";
1759     case DT_DEBUG:      return "DEBUG";
1760     case DT_TEXTREL:    return "TEXTREL";
1761     case DT_JMPREL:     return "JMPREL";
1762     case DT_BIND_NOW:   return "BIND_NOW";
1763     case DT_INIT_ARRAY: return "INIT_ARRAY";
1764     case DT_FINI_ARRAY: return "FINI_ARRAY";
1765     case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
1766     case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
1767     case DT_RUNPATH:    return "RUNPATH";
1768     case DT_FLAGS:      return "FLAGS";
1769
1770     case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1771     case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
1772
1773     case DT_CHECKSUM:   return "CHECKSUM";
1774     case DT_PLTPADSZ:   return "PLTPADSZ";
1775     case DT_MOVEENT:    return "MOVEENT";
1776     case DT_MOVESZ:     return "MOVESZ";
1777     case DT_FEATURE:    return "FEATURE";
1778     case DT_POSFLAG_1:  return "POSFLAG_1";
1779     case DT_SYMINSZ:    return "SYMINSZ";
1780     case DT_SYMINENT:   return "SYMINENT"; /* aka VALRNGHI */
1781
1782     case DT_ADDRRNGLO:  return "ADDRRNGLO";
1783     case DT_CONFIG:     return "CONFIG";
1784     case DT_DEPAUDIT:   return "DEPAUDIT";
1785     case DT_AUDIT:      return "AUDIT";
1786     case DT_PLTPAD:     return "PLTPAD";
1787     case DT_MOVETAB:    return "MOVETAB";
1788     case DT_SYMINFO:    return "SYMINFO"; /* aka ADDRRNGHI */
1789
1790     case DT_VERSYM:     return "VERSYM";
1791
1792     case DT_TLSDESC_GOT: return "TLSDESC_GOT";
1793     case DT_TLSDESC_PLT: return "TLSDESC_PLT";
1794     case DT_RELACOUNT:  return "RELACOUNT";
1795     case DT_RELCOUNT:   return "RELCOUNT";
1796     case DT_FLAGS_1:    return "FLAGS_1";
1797     case DT_VERDEF:     return "VERDEF";
1798     case DT_VERDEFNUM:  return "VERDEFNUM";
1799     case DT_VERNEED:    return "VERNEED";
1800     case DT_VERNEEDNUM: return "VERNEEDNUM";
1801
1802     case DT_AUXILIARY:  return "AUXILIARY";
1803     case DT_USED:       return "USED";
1804     case DT_FILTER:     return "FILTER";
1805
1806     case DT_GNU_PRELINKED: return "GNU_PRELINKED";
1807     case DT_GNU_CONFLICT: return "GNU_CONFLICT";
1808     case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
1809     case DT_GNU_LIBLIST: return "GNU_LIBLIST";
1810     case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
1811     case DT_GNU_HASH:   return "GNU_HASH";
1812
1813     default:
1814       if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
1815         {
1816           const char * result;
1817
1818           switch (elf_header.e_machine)
1819             {
1820             case EM_MIPS:
1821             case EM_MIPS_RS3_LE:
1822               result = get_mips_dynamic_type (type);
1823               break;
1824             case EM_SPARCV9:
1825               result = get_sparc64_dynamic_type (type);
1826               break;
1827             case EM_PPC:
1828               result = get_ppc_dynamic_type (type);
1829               break;
1830             case EM_PPC64:
1831               result = get_ppc64_dynamic_type (type);
1832               break;
1833             case EM_IA_64:
1834               result = get_ia64_dynamic_type (type);
1835               break;
1836             case EM_ALPHA:
1837               result = get_alpha_dynamic_type (type);
1838               break;
1839             case EM_SCORE:
1840               result = get_score_dynamic_type (type);
1841               break;
1842             case EM_TI_C6000:
1843               result = get_tic6x_dynamic_type (type);
1844               break;
1845             case EM_ALTERA_NIOS2:
1846               result = get_nios2_dynamic_type (type);
1847               break;
1848             default:
1849               result = NULL;
1850               break;
1851             }
1852
1853           if (result != NULL)
1854             return result;
1855
1856           snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
1857         }
1858       else if (((type >= DT_LOOS) && (type <= DT_HIOS))
1859                || (elf_header.e_machine == EM_PARISC
1860                    && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
1861         {
1862           const char * result;
1863
1864           switch (elf_header.e_machine)
1865             {
1866             case EM_PARISC:
1867               result = get_parisc_dynamic_type (type);
1868               break;
1869             case EM_IA_64:
1870               result = get_ia64_dynamic_type (type);
1871               break;
1872             default:
1873               result = NULL;
1874               break;
1875             }
1876
1877           if (result != NULL)
1878             return result;
1879
1880           snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
1881                     type);
1882         }
1883       else
1884         snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
1885
1886       return buff;
1887     }
1888 }
1889
1890 static char *
1891 get_file_type (unsigned e_type)
1892 {
1893   static char buff[32];
1894
1895   switch (e_type)
1896     {
1897     case ET_NONE:       return _("NONE (None)");
1898     case ET_REL:        return _("REL (Relocatable file)");
1899     case ET_EXEC:       return _("EXEC (Executable file)");
1900     case ET_DYN:        return _("DYN (Shared object file)");
1901     case ET_CORE:       return _("CORE (Core file)");
1902
1903     default:
1904       if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
1905         snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
1906       else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
1907         snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
1908       else
1909         snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
1910       return buff;
1911     }
1912 }
1913
1914 static char *
1915 get_machine_name (unsigned e_machine)
1916 {
1917   static char buff[64]; /* XXX */
1918
1919   switch (e_machine)
1920     {
1921     case EM_NONE:               return _("None");
1922     case EM_AARCH64:            return "AArch64";
1923     case EM_M32:                return "WE32100";
1924     case EM_SPARC:              return "Sparc";
1925     case EM_SPU:                return "SPU";
1926     case EM_386:                return "Intel 80386";
1927     case EM_68K:                return "MC68000";
1928     case EM_88K:                return "MC88000";
1929     case EM_486:                return "Intel 80486";
1930     case EM_860:                return "Intel 80860";
1931     case EM_MIPS:               return "MIPS R3000";
1932     case EM_S370:               return "IBM System/370";
1933     case EM_MIPS_RS3_LE:        return "MIPS R4000 big-endian";
1934     case EM_OLD_SPARCV9:        return "Sparc v9 (old)";
1935     case EM_PARISC:             return "HPPA";
1936     case EM_PPC_OLD:            return "Power PC (old)";
1937     case EM_SPARC32PLUS:        return "Sparc v8+" ;
1938     case EM_960:                return "Intel 90860";
1939     case EM_PPC:                return "PowerPC";
1940     case EM_PPC64:              return "PowerPC64";
1941     case EM_FR20:               return "Fujitsu FR20";
1942     case EM_RH32:               return "TRW RH32";
1943     case EM_MCORE:              return "MCORE";
1944     case EM_ARM:                return "ARM";
1945     case EM_OLD_ALPHA:          return "Digital Alpha (old)";
1946     case EM_SH:                 return "Renesas / SuperH SH";
1947     case EM_SPARCV9:            return "Sparc v9";
1948     case EM_TRICORE:            return "Siemens Tricore";
1949     case EM_ARC:                return "ARC";
1950     case EM_H8_300:             return "Renesas H8/300";
1951     case EM_H8_300H:            return "Renesas H8/300H";
1952     case EM_H8S:                return "Renesas H8S";
1953     case EM_H8_500:             return "Renesas H8/500";
1954     case EM_IA_64:              return "Intel IA-64";
1955     case EM_MIPS_X:             return "Stanford MIPS-X";
1956     case EM_COLDFIRE:           return "Motorola Coldfire";
1957     case EM_ALPHA:              return "Alpha";
1958     case EM_CYGNUS_D10V:
1959     case EM_D10V:               return "d10v";
1960     case EM_CYGNUS_D30V:
1961     case EM_D30V:               return "d30v";
1962     case EM_CYGNUS_M32R:
1963     case EM_M32R:               return "Renesas M32R (formerly Mitsubishi M32r)";
1964     case EM_CYGNUS_V850:
1965     case EM_V800:               return "Renesas V850 (using RH850 ABI)";
1966     case EM_V850:               return "Renesas V850";
1967     case EM_CYGNUS_MN10300:
1968     case EM_MN10300:            return "mn10300";
1969     case EM_CYGNUS_MN10200:
1970     case EM_MN10200:            return "mn10200";
1971     case EM_MOXIE:              return "Moxie";
1972     case EM_CYGNUS_FR30:
1973     case EM_FR30:               return "Fujitsu FR30";
1974     case EM_CYGNUS_FRV:         return "Fujitsu FR-V";
1975     case EM_PJ_OLD:
1976     case EM_PJ:                 return "picoJava";
1977     case EM_MMA:                return "Fujitsu Multimedia Accelerator";
1978     case EM_PCP:                return "Siemens PCP";
1979     case EM_NCPU:               return "Sony nCPU embedded RISC processor";
1980     case EM_NDR1:               return "Denso NDR1 microprocesspr";
1981     case EM_STARCORE:           return "Motorola Star*Core processor";
1982     case EM_ME16:               return "Toyota ME16 processor";
1983     case EM_ST100:              return "STMicroelectronics ST100 processor";
1984     case EM_TINYJ:              return "Advanced Logic Corp. TinyJ embedded processor";
1985     case EM_PDSP:               return "Sony DSP processor";
1986     case EM_PDP10:              return "Digital Equipment Corp. PDP-10";
1987     case EM_PDP11:              return "Digital Equipment Corp. PDP-11";
1988     case EM_FX66:               return "Siemens FX66 microcontroller";
1989     case EM_ST9PLUS:            return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1990     case EM_ST7:                return "STMicroelectronics ST7 8-bit microcontroller";
1991     case EM_68HC16:             return "Motorola MC68HC16 Microcontroller";
1992     case EM_68HC12:             return "Motorola MC68HC12 Microcontroller";
1993     case EM_68HC11:             return "Motorola MC68HC11 Microcontroller";
1994     case EM_68HC08:             return "Motorola MC68HC08 Microcontroller";
1995     case EM_68HC05:             return "Motorola MC68HC05 Microcontroller";
1996     case EM_SVX:                return "Silicon Graphics SVx";
1997     case EM_ST19:               return "STMicroelectronics ST19 8-bit microcontroller";
1998     case EM_VAX:                return "Digital VAX";
1999     case EM_AVR_OLD:
2000     case EM_AVR:                return "Atmel AVR 8-bit microcontroller";
2001     case EM_CRIS:               return "Axis Communications 32-bit embedded processor";
2002     case EM_JAVELIN:            return "Infineon Technologies 32-bit embedded cpu";
2003     case EM_FIREPATH:           return "Element 14 64-bit DSP processor";
2004     case EM_ZSP:                return "LSI Logic's 16-bit DSP processor";
2005     case EM_MMIX:               return "Donald Knuth's educational 64-bit processor";
2006     case EM_HUANY:              return "Harvard Universitys's machine-independent object format";
2007     case EM_PRISM:              return "Vitesse Prism";
2008     case EM_X86_64:             return "Advanced Micro Devices X86-64";
2009     case EM_L1OM:               return "Intel L1OM";
2010     case EM_K1OM:               return "Intel K1OM";
2011     case EM_S390_OLD:
2012     case EM_S390:               return "IBM S/390";
2013     case EM_SCORE:              return "SUNPLUS S+Core";
2014     case EM_XSTORMY16:          return "Sanyo XStormy16 CPU core";
2015     case EM_OR1K:               return "OpenRISC 1000";
2016     case EM_ARC_A5:             return "ARC International ARCompact processor";
2017     case EM_CRX:                return "National Semiconductor CRX microprocessor";
2018     case EM_ADAPTEVA_EPIPHANY:  return "Adapteva EPIPHANY";
2019     case EM_DLX:                return "OpenDLX";
2020     case EM_IP2K_OLD:
2021     case EM_IP2K:               return "Ubicom IP2xxx 8-bit microcontrollers";
2022     case EM_IQ2000:             return "Vitesse IQ2000";
2023     case EM_XTENSA_OLD:
2024     case EM_XTENSA:             return "Tensilica Xtensa Processor";
2025     case EM_VIDEOCORE:          return "Alphamosaic VideoCore processor";
2026     case EM_TMM_GPP:            return "Thompson Multimedia General Purpose Processor";
2027     case EM_NS32K:              return "National Semiconductor 32000 series";
2028     case EM_TPC:                return "Tenor Network TPC processor";
2029     case EM_ST200:              return "STMicroelectronics ST200 microcontroller";
2030     case EM_MAX:                return "MAX Processor";
2031     case EM_CR:                 return "National Semiconductor CompactRISC";
2032     case EM_F2MC16:             return "Fujitsu F2MC16";
2033     case EM_MSP430:             return "Texas Instruments msp430 microcontroller";
2034     case EM_LATTICEMICO32:      return "Lattice Mico32";
2035     case EM_M32C_OLD:
2036     case EM_M32C:               return "Renesas M32c";
2037     case EM_MT:                 return "Morpho Techologies MT processor";
2038     case EM_BLACKFIN:           return "Analog Devices Blackfin";
2039     case EM_SE_C33:             return "S1C33 Family of Seiko Epson processors";
2040     case EM_SEP:                return "Sharp embedded microprocessor";
2041     case EM_ARCA:               return "Arca RISC microprocessor";
2042     case EM_UNICORE:            return "Unicore";
2043     case EM_EXCESS:             return "eXcess 16/32/64-bit configurable embedded CPU";
2044     case EM_DXP:                return "Icera Semiconductor Inc. Deep Execution Processor";
2045     case EM_NIOS32:             return "Altera Nios";
2046     case EM_ALTERA_NIOS2:       return "Altera Nios II";
2047     case EM_C166:
2048     case EM_XC16X:              return "Infineon Technologies xc16x";
2049     case EM_M16C:               return "Renesas M16C series microprocessors";
2050     case EM_DSPIC30F:           return "Microchip Technology dsPIC30F Digital Signal Controller";
2051     case EM_CE:                 return "Freescale Communication Engine RISC core";
2052     case EM_TSK3000:            return "Altium TSK3000 core";
2053     case EM_RS08:               return "Freescale RS08 embedded processor";
2054     case EM_ECOG2:              return "Cyan Technology eCOG2 microprocessor";
2055     case EM_DSP24:              return "New Japan Radio (NJR) 24-bit DSP Processor";
2056     case EM_VIDEOCORE3:         return "Broadcom VideoCore III processor";
2057     case EM_SE_C17:             return "Seiko Epson C17 family";
2058     case EM_TI_C6000:           return "Texas Instruments TMS320C6000 DSP family";
2059     case EM_TI_C2000:           return "Texas Instruments TMS320C2000 DSP family";
2060     case EM_TI_C5500:           return "Texas Instruments TMS320C55x DSP family";
2061     case EM_MMDSP_PLUS:         return "STMicroelectronics 64bit VLIW Data Signal Processor";
2062     case EM_CYPRESS_M8C:        return "Cypress M8C microprocessor";
2063     case EM_R32C:               return "Renesas R32C series microprocessors";
2064     case EM_TRIMEDIA:           return "NXP Semiconductors TriMedia architecture family";
2065     case EM_QDSP6:              return "QUALCOMM DSP6 Processor";
2066     case EM_8051:               return "Intel 8051 and variants";
2067     case EM_STXP7X:             return "STMicroelectronics STxP7x family";
2068     case EM_NDS32:              return "Andes Technology compact code size embedded RISC processor family";
2069     case EM_ECOG1X:             return "Cyan Technology eCOG1X family";
2070     case EM_MAXQ30:             return "Dallas Semiconductor MAXQ30 Core microcontrollers";
2071     case EM_XIMO16:             return "New Japan Radio (NJR) 16-bit DSP Processor";
2072     case EM_MANIK:              return "M2000 Reconfigurable RISC Microprocessor";
2073     case EM_CRAYNV2:            return "Cray Inc. NV2 vector architecture";
2074     case EM_CYGNUS_MEP:         return "Toshiba MeP Media Engine";
2075     case EM_CR16:
2076     case EM_MICROBLAZE:
2077     case EM_MICROBLAZE_OLD:     return "Xilinx MicroBlaze";
2078     case EM_RL78:               return "Renesas RL78";
2079     case EM_RX:                 return "Renesas RX";
2080     case EM_METAG:              return "Imagination Technologies Meta processor architecture";
2081     case EM_MCST_ELBRUS:        return "MCST Elbrus general purpose hardware architecture";
2082     case EM_ECOG16:             return "Cyan Technology eCOG16 family";
2083     case EM_ETPU:               return "Freescale Extended Time Processing Unit";
2084     case EM_SLE9X:              return "Infineon Technologies SLE9X core";
2085     case EM_AVR32:              return "Atmel Corporation 32-bit microprocessor family";
2086     case EM_STM8:               return "STMicroeletronics STM8 8-bit microcontroller";
2087     case EM_TILE64:             return "Tilera TILE64 multicore architecture family";
2088     case EM_TILEPRO:            return "Tilera TILEPro multicore architecture family";
2089     case EM_TILEGX:             return "Tilera TILE-Gx multicore architecture family";
2090     case EM_CUDA:               return "NVIDIA CUDA architecture";
2091     case EM_XGATE:              return "Motorola XGATE embedded processor";
2092     default:
2093       snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
2094       return buff;
2095     }
2096 }
2097
2098 static void
2099 decode_ARM_machine_flags (unsigned e_flags, char buf[])
2100 {
2101   unsigned eabi;
2102   int unknown = 0;
2103
2104   eabi = EF_ARM_EABI_VERSION (e_flags);
2105   e_flags &= ~ EF_ARM_EABIMASK;
2106
2107   /* Handle "generic" ARM flags.  */
2108   if (e_flags & EF_ARM_RELEXEC)
2109     {
2110       strcat (buf, ", relocatable executable");
2111       e_flags &= ~ EF_ARM_RELEXEC;
2112     }
2113
2114   if (e_flags & EF_ARM_HASENTRY)
2115     {
2116       strcat (buf, ", has entry point");
2117       e_flags &= ~ EF_ARM_HASENTRY;
2118     }
2119
2120   /* Now handle EABI specific flags.  */
2121   switch (eabi)
2122     {
2123     default:
2124       strcat (buf, ", <unrecognized EABI>");
2125       if (e_flags)
2126         unknown = 1;
2127       break;
2128
2129     case EF_ARM_EABI_VER1:
2130       strcat (buf, ", Version1 EABI");
2131       while (e_flags)
2132         {
2133           unsigned flag;
2134
2135           /* Process flags one bit at a time.  */
2136           flag = e_flags & - e_flags;
2137           e_flags &= ~ flag;
2138
2139           switch (flag)
2140             {
2141             case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK.  */
2142               strcat (buf, ", sorted symbol tables");
2143               break;
2144
2145             default:
2146               unknown = 1;
2147               break;
2148             }
2149         }
2150       break;
2151
2152     case EF_ARM_EABI_VER2:
2153       strcat (buf, ", Version2 EABI");
2154       while (e_flags)
2155         {
2156           unsigned flag;
2157
2158           /* Process flags one bit at a time.  */
2159           flag = e_flags & - e_flags;
2160           e_flags &= ~ flag;
2161
2162           switch (flag)
2163             {
2164             case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK.  */
2165               strcat (buf, ", sorted symbol tables");
2166               break;
2167
2168             case EF_ARM_DYNSYMSUSESEGIDX:
2169               strcat (buf, ", dynamic symbols use segment index");
2170               break;
2171
2172             case EF_ARM_MAPSYMSFIRST:
2173               strcat (buf, ", mapping symbols precede others");
2174               break;
2175
2176             default:
2177               unknown = 1;
2178               break;
2179             }
2180         }
2181       break;
2182
2183     case EF_ARM_EABI_VER3:
2184       strcat (buf, ", Version3 EABI");
2185       break;
2186
2187     case EF_ARM_EABI_VER4:
2188       strcat (buf, ", Version4 EABI");
2189       while (e_flags)
2190         {
2191           unsigned flag;
2192
2193           /* Process flags one bit at a time.  */
2194           flag = e_flags & - e_flags;
2195           e_flags &= ~ flag;
2196
2197           switch (flag)
2198             {
2199             case EF_ARM_BE8:
2200               strcat (buf, ", BE8");
2201               break;
2202
2203             case EF_ARM_LE8:
2204               strcat (buf, ", LE8");
2205               break;
2206
2207             default:
2208               unknown = 1;
2209               break;
2210             }
2211       break;
2212         }
2213       break;
2214
2215     case EF_ARM_EABI_VER5:
2216       strcat (buf, ", Version5 EABI");
2217       while (e_flags)
2218         {
2219           unsigned flag;
2220
2221           /* Process flags one bit at a time.  */
2222           flag = e_flags & - e_flags;
2223           e_flags &= ~ flag;
2224
2225           switch (flag)
2226             {
2227             case EF_ARM_BE8:
2228               strcat (buf, ", BE8");
2229               break;
2230
2231             case EF_ARM_LE8:
2232               strcat (buf, ", LE8");
2233               break;
2234
2235             case EF_ARM_ABI_FLOAT_SOFT: /* Conflicts with EF_ARM_SOFT_FLOAT.  */
2236               strcat (buf, ", soft-float ABI");
2237               break;
2238
2239             case EF_ARM_ABI_FLOAT_HARD: /* Conflicts with EF_ARM_VFP_FLOAT.  */
2240               strcat (buf, ", hard-float ABI");
2241               break;
2242
2243             default:
2244               unknown = 1;
2245               break;
2246             }
2247         }
2248       break;
2249
2250     case EF_ARM_EABI_UNKNOWN:
2251       strcat (buf, ", GNU EABI");
2252       while (e_flags)
2253         {
2254           unsigned flag;
2255
2256           /* Process flags one bit at a time.  */
2257           flag = e_flags & - e_flags;
2258           e_flags &= ~ flag;
2259
2260           switch (flag)
2261             {
2262             case EF_ARM_INTERWORK:
2263               strcat (buf, ", interworking enabled");
2264               break;
2265
2266             case EF_ARM_APCS_26:
2267               strcat (buf, ", uses APCS/26");
2268               break;
2269
2270             case EF_ARM_APCS_FLOAT:
2271               strcat (buf, ", uses APCS/float");
2272               break;
2273
2274             case EF_ARM_PIC:
2275               strcat (buf, ", position independent");
2276               break;
2277
2278             case EF_ARM_ALIGN8:
2279               strcat (buf, ", 8 bit structure alignment");
2280               break;
2281
2282             case EF_ARM_NEW_ABI:
2283               strcat (buf, ", uses new ABI");
2284               break;
2285
2286             case EF_ARM_OLD_ABI:
2287               strcat (buf, ", uses old ABI");
2288               break;
2289
2290             case EF_ARM_SOFT_FLOAT:
2291               strcat (buf, ", software FP");
2292               break;
2293
2294             case EF_ARM_VFP_FLOAT:
2295               strcat (buf, ", VFP");
2296               break;
2297
2298             case EF_ARM_MAVERICK_FLOAT:
2299               strcat (buf, ", Maverick FP");
2300               break;
2301
2302             default:
2303               unknown = 1;
2304               break;
2305             }
2306         }
2307     }
2308
2309   if (unknown)
2310     strcat (buf,_(", <unknown>"));
2311 }
2312
2313 static void
2314 decode_NDS32_machine_flags (unsigned e_flags, char buf[], size_t size)
2315 {
2316   unsigned abi;
2317   unsigned arch;
2318   unsigned config;
2319   unsigned version;
2320   int has_fpu = 0;
2321   int r = 0;
2322
2323   static const char *ABI_STRINGS[] =
2324   {
2325     "ABI v0", /* use r5 as return register; only used in N1213HC */
2326     "ABI v1", /* use r0 as return register */
2327     "ABI v2", /* use r0 as return register and don't reserve 24 bytes for arguments */
2328     "ABI v2fp", /* for FPU */
2329     "AABI"
2330   };
2331   static const char *VER_STRINGS[] =
2332   {
2333     "Andes ELF V1.3 or older",
2334     "Andes ELF V1.3.1",
2335     "Andes ELF V1.4"
2336   };
2337   static const char *ARCH_STRINGS[] =
2338   {
2339     "",
2340     "Andes Star v1.0",
2341     "Andes Star v2.0",
2342     "Andes Star v3.0",
2343     "Andes Star v3.0m"
2344   };
2345
2346   abi = EF_NDS_ABI & e_flags;
2347   arch = EF_NDS_ARCH & e_flags;
2348   config = EF_NDS_INST & e_flags;
2349   version = EF_NDS32_ELF_VERSION & e_flags;
2350
2351   memset (buf, 0, size);
2352
2353   switch (abi)
2354     {
2355     case E_NDS_ABI_V0:
2356     case E_NDS_ABI_V1:
2357     case E_NDS_ABI_V2:
2358     case E_NDS_ABI_V2FP:
2359     case E_NDS_ABI_AABI:
2360       /* In case there are holes in the array.  */
2361       r += snprintf (buf + r, size - r, ", %s", ABI_STRINGS[abi >> EF_NDS_ABI_SHIFT]);
2362       break;
2363
2364     default:
2365       r += snprintf (buf + r, size - r, ", <unrecognized ABI>");
2366       break;
2367     }
2368
2369   switch (version)
2370     {
2371     case E_NDS32_ELF_VER_1_2:
2372     case E_NDS32_ELF_VER_1_3:
2373     case E_NDS32_ELF_VER_1_4:
2374       r += snprintf (buf + r, size - r, ", %s", VER_STRINGS[version >> EF_NDS32_ELF_VERSION_SHIFT]);
2375       break;
2376
2377     default:
2378       r += snprintf (buf + r, size - r, ", <unrecognized ELF version number>");
2379       break;
2380     }
2381
2382   if (E_NDS_ABI_V0 == abi)
2383     {
2384       /* OLD ABI; only used in N1213HC, has performance extension 1.  */
2385       r += snprintf (buf + r, size - r, ", Andes Star v1.0, N1213HC, MAC, PERF1");
2386       if (arch == E_NDS_ARCH_STAR_V1_0)
2387         r += snprintf (buf + r, size -r, ", 16b"); /* has 16-bit instructions */
2388       return;
2389     }
2390
2391   switch (arch)
2392     {
2393     case E_NDS_ARCH_STAR_V1_0:
2394     case E_NDS_ARCH_STAR_V2_0:
2395     case E_NDS_ARCH_STAR_V3_0:
2396     case E_NDS_ARCH_STAR_V3_M:
2397       r += snprintf (buf + r, size - r, ", %s", ARCH_STRINGS[arch >> EF_NDS_ARCH_SHIFT]);
2398       break;
2399
2400     default:
2401       r += snprintf (buf + r, size - r, ", <unrecognized architecture>");
2402       /* ARCH version determines how the e_flags are interpreted.
2403          If it is unknown, we cannot proceed.  */
2404       return;
2405     }
2406
2407   /* Newer ABI; Now handle architecture specific flags.  */
2408   if (arch == E_NDS_ARCH_STAR_V1_0)
2409     {
2410       if (config & E_NDS32_HAS_MFUSR_PC_INST)
2411         r += snprintf (buf + r, size -r, ", MFUSR_PC");
2412
2413       if (!(config & E_NDS32_HAS_NO_MAC_INST))
2414         r += snprintf (buf + r, size -r, ", MAC");
2415
2416       if (config & E_NDS32_HAS_DIV_INST)
2417         r += snprintf (buf + r, size -r, ", DIV");
2418
2419       if (config & E_NDS32_HAS_16BIT_INST)
2420         r += snprintf (buf + r, size -r, ", 16b");
2421     }
2422   else
2423     {
2424       if (config & E_NDS32_HAS_MFUSR_PC_INST)
2425         {
2426           if (version <= E_NDS32_ELF_VER_1_3)
2427             r += snprintf (buf + r, size -r, ", [B8]");
2428           else
2429             r += snprintf (buf + r, size -r, ", EX9");
2430         }
2431
2432       if (config & E_NDS32_HAS_MAC_DX_INST)
2433         r += snprintf (buf + r, size -r, ", MAC_DX");
2434
2435       if (config & E_NDS32_HAS_DIV_DX_INST)
2436         r += snprintf (buf + r, size -r, ", DIV_DX");
2437
2438       if (config & E_NDS32_HAS_16BIT_INST)
2439         {
2440           if (version <= E_NDS32_ELF_VER_1_3)
2441             r += snprintf (buf + r, size -r, ", 16b");
2442           else
2443             r += snprintf (buf + r, size -r, ", IFC");
2444         }
2445     }
2446
2447   if (config & E_NDS32_HAS_EXT_INST)
2448     r += snprintf (buf + r, size -r, ", PERF1");
2449
2450   if (config & E_NDS32_HAS_EXT2_INST)
2451     r += snprintf (buf + r, size -r, ", PERF2");
2452
2453   if (config & E_NDS32_HAS_FPU_INST)
2454     {
2455       has_fpu = 1;
2456       r += snprintf (buf + r, size -r, ", FPU_SP");
2457     }
2458
2459   if (config & E_NDS32_HAS_FPU_DP_INST)
2460     {
2461       has_fpu = 1;
2462       r += snprintf (buf + r, size -r, ", FPU_DP");
2463     }
2464
2465   if (config & E_NDS32_HAS_FPU_MAC_INST)
2466     {
2467       has_fpu = 1;
2468       r += snprintf (buf + r, size -r, ", FPU_MAC");
2469     }
2470
2471   if (has_fpu)
2472     {
2473       switch ((config & E_NDS32_FPU_REG_CONF) >> E_NDS32_FPU_REG_CONF_SHIFT)
2474         {
2475         case E_NDS32_FPU_REG_8SP_4DP:
2476           r += snprintf (buf + r, size -r, ", FPU_REG:8/4");
2477           break;
2478         case E_NDS32_FPU_REG_16SP_8DP:
2479           r += snprintf (buf + r, size -r, ", FPU_REG:16/8");
2480           break;
2481         case E_NDS32_FPU_REG_32SP_16DP:
2482           r += snprintf (buf + r, size -r, ", FPU_REG:32/16");
2483           break;
2484         case E_NDS32_FPU_REG_32SP_32DP:
2485           r += snprintf (buf + r, size -r, ", FPU_REG:32/32");
2486           break;
2487         }
2488     }
2489
2490   if (config & E_NDS32_HAS_AUDIO_INST)
2491     r += snprintf (buf + r, size -r, ", AUDIO");
2492
2493   if (config & E_NDS32_HAS_STRING_INST)
2494     r += snprintf (buf + r, size -r, ", STR");
2495
2496   if (config & E_NDS32_HAS_REDUCED_REGS)
2497     r += snprintf (buf + r, size -r, ", 16REG");
2498
2499   if (config & E_NDS32_HAS_VIDEO_INST)
2500     {
2501       if (version <= E_NDS32_ELF_VER_1_3)
2502         r += snprintf (buf + r, size -r, ", VIDEO");
2503       else
2504         r += snprintf (buf + r, size -r, ", SATURATION");
2505     }
2506
2507   if (config & E_NDS32_HAS_ENCRIPT_INST)
2508     r += snprintf (buf + r, size -r, ", ENCRP");
2509
2510   if (config & E_NDS32_HAS_L2C_INST)
2511     r += snprintf (buf + r, size -r, ", L2C");
2512 }
2513
2514 static char *
2515 get_machine_flags (unsigned e_flags, unsigned e_machine)
2516 {
2517   static char buf[1024];
2518
2519   buf[0] = '\0';
2520
2521   if (e_flags)
2522     {
2523       switch (e_machine)
2524         {
2525         default:
2526           break;
2527
2528         case EM_ARM:
2529           decode_ARM_machine_flags (e_flags, buf);
2530           break;
2531
2532         case EM_BLACKFIN:
2533           if (e_flags & EF_BFIN_PIC)
2534             strcat (buf, ", PIC");
2535
2536           if (e_flags & EF_BFIN_FDPIC)
2537             strcat (buf, ", FDPIC");
2538
2539           if (e_flags & EF_BFIN_CODE_IN_L1)
2540             strcat (buf, ", code in L1");
2541
2542           if (e_flags & EF_BFIN_DATA_IN_L1)
2543             strcat (buf, ", data in L1");
2544
2545           break;
2546
2547         case EM_CYGNUS_FRV:
2548           switch (e_flags & EF_FRV_CPU_MASK)
2549             {
2550             case EF_FRV_CPU_GENERIC:
2551               break;
2552
2553             default:
2554               strcat (buf, ", fr???");
2555               break;
2556
2557             case EF_FRV_CPU_FR300:
2558               strcat (buf, ", fr300");
2559               break;
2560
2561             case EF_FRV_CPU_FR400:
2562               strcat (buf, ", fr400");
2563               break;
2564             case EF_FRV_CPU_FR405:
2565               strcat (buf, ", fr405");
2566               break;
2567
2568             case EF_FRV_CPU_FR450:
2569               strcat (buf, ", fr450");
2570               break;
2571
2572             case EF_FRV_CPU_FR500:
2573               strcat (buf, ", fr500");
2574               break;
2575             case EF_FRV_CPU_FR550:
2576               strcat (buf, ", fr550");
2577               break;
2578
2579             case EF_FRV_CPU_SIMPLE:
2580               strcat (buf, ", simple");
2581               break;
2582             case EF_FRV_CPU_TOMCAT:
2583               strcat (buf, ", tomcat");
2584               break;
2585             }
2586           break;
2587
2588         case EM_68K:
2589           if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
2590             strcat (buf, ", m68000");
2591           else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
2592             strcat (buf, ", cpu32");
2593           else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
2594             strcat (buf, ", fido_a");
2595           else
2596             {
2597               char const * isa = _("unknown");
2598               char const * mac = _("unknown mac");
2599               char const * additional = NULL;
2600
2601               switch (e_flags & EF_M68K_CF_ISA_MASK)
2602                 {
2603                 case EF_M68K_CF_ISA_A_NODIV:
2604                   isa = "A";
2605                   additional = ", nodiv";
2606                   break;
2607                 case EF_M68K_CF_ISA_A:
2608                   isa = "A";
2609                   break;
2610                 case EF_M68K_CF_ISA_A_PLUS:
2611                   isa = "A+";
2612                   break;
2613                 case EF_M68K_CF_ISA_B_NOUSP:
2614                   isa = "B";
2615                   additional = ", nousp";
2616                   break;
2617                 case EF_M68K_CF_ISA_B:
2618                   isa = "B";
2619                   break;
2620                 case EF_M68K_CF_ISA_C:
2621                   isa = "C";
2622                   break;
2623                 case EF_M68K_CF_ISA_C_NODIV:
2624                   isa = "C";
2625                   additional = ", nodiv";
2626                   break;
2627                 }
2628               strcat (buf, ", cf, isa ");
2629               strcat (buf, isa);
2630               if (additional)
2631                 strcat (buf, additional);
2632               if (e_flags & EF_M68K_CF_FLOAT)
2633                 strcat (buf, ", float");
2634               switch (e_flags & EF_M68K_CF_MAC_MASK)
2635                 {
2636                 case 0:
2637                   mac = NULL;
2638                   break;
2639                 case EF_M68K_CF_MAC:
2640                   mac = "mac";
2641                   break;
2642                 case EF_M68K_CF_EMAC:
2643                   mac = "emac";
2644                   break;
2645                 case EF_M68K_CF_EMAC_B:
2646                   mac = "emac_b";
2647                   break;
2648                 }
2649               if (mac)
2650                 {
2651                   strcat (buf, ", ");
2652                   strcat (buf, mac);
2653                 }
2654             }
2655           break;
2656
2657         case EM_PPC:
2658           if (e_flags & EF_PPC_EMB)
2659             strcat (buf, ", emb");
2660
2661           if (e_flags & EF_PPC_RELOCATABLE)
2662             strcat (buf, _(", relocatable"));
2663
2664           if (e_flags & EF_PPC_RELOCATABLE_LIB)
2665             strcat (buf, _(", relocatable-lib"));
2666           break;
2667
2668         case EM_PPC64:
2669           if (e_flags & EF_PPC64_ABI)
2670             {
2671               char abi[] = ", abiv0";
2672
2673               abi[6] += e_flags & EF_PPC64_ABI;
2674               strcat (buf, abi);
2675             }
2676           break;
2677
2678         case EM_V800:
2679           if ((e_flags & EF_RH850_ABI) == EF_RH850_ABI)
2680             strcat (buf, ", RH850 ABI");
2681
2682           if (e_flags & EF_V800_850E3)
2683             strcat (buf, ", V3 architecture");
2684
2685           if ((e_flags & (EF_RH850_FPU_DOUBLE | EF_RH850_FPU_SINGLE)) == 0)
2686             strcat (buf, ", FPU not used");
2687
2688           if ((e_flags & (EF_RH850_REGMODE22 | EF_RH850_REGMODE32)) == 0)
2689             strcat (buf, ", regmode: COMMON");
2690
2691           if ((e_flags & (EF_RH850_GP_FIX | EF_RH850_GP_NOFIX)) == 0)
2692             strcat (buf, ", r4 not used");
2693
2694           if ((e_flags & (EF_RH850_EP_FIX | EF_RH850_EP_NOFIX)) == 0)
2695             strcat (buf, ", r30 not used");
2696
2697           if ((e_flags & (EF_RH850_TP_FIX | EF_RH850_TP_NOFIX)) == 0)
2698             strcat (buf, ", r5 not used");
2699
2700           if ((e_flags & (EF_RH850_REG2_RESERVE | EF_RH850_REG2_NORESERVE)) == 0)
2701             strcat (buf, ", r2 not used");
2702
2703           for (e_flags &= 0xFFFF; e_flags; e_flags &= ~ (e_flags & - e_flags))
2704             {
2705               switch (e_flags & - e_flags)
2706                 {
2707                 case EF_RH850_FPU_DOUBLE: strcat (buf, ", double precision FPU"); break;
2708                 case EF_RH850_FPU_SINGLE: strcat (buf, ", single precision FPU"); break;
2709                 case EF_RH850_SIMD: strcat (buf, ", SIMD"); break;
2710                 case EF_RH850_CACHE: strcat (buf, ", CACHE"); break;
2711                 case EF_RH850_MMU: strcat (buf, ", MMU"); break;
2712                 case EF_RH850_REGMODE22: strcat (buf, ", regmode:22"); break;
2713                 case EF_RH850_REGMODE32: strcat (buf, ", regmode:23"); break;
2714                 case EF_RH850_DATA_ALIGN8: strcat (buf, ", 8-byte alignment"); break;
2715                 case EF_RH850_GP_FIX: strcat (buf, ", r4 fixed"); break;
2716                 case EF_RH850_GP_NOFIX: strcat (buf, ", r4 free"); break;
2717                 case EF_RH850_EP_FIX: strcat (buf, ", r30 fixed"); break;
2718                 case EF_RH850_EP_NOFIX: strcat (buf, ", r30 free"); break;
2719                 case EF_RH850_TP_FIX: strcat (buf, ", r5 fixed"); break;
2720                 case EF_RH850_TP_NOFIX: strcat (buf, ", r5 free"); break;
2721                 case EF_RH850_REG2_RESERVE: strcat (buf, ", r2 fixed"); break;
2722                 case EF_RH850_REG2_NORESERVE: strcat (buf, ", r2 free"); break;
2723                 default: break;
2724                 }
2725             }
2726           break;
2727
2728         case EM_V850:
2729         case EM_CYGNUS_V850:
2730           switch (e_flags & EF_V850_ARCH)
2731             {
2732             case E_V850E3V5_ARCH:
2733               strcat (buf, ", v850e3v5");
2734               break;
2735             case E_V850E2V3_ARCH:
2736               strcat (buf, ", v850e2v3");
2737               break;
2738             case E_V850E2_ARCH:
2739               strcat (buf, ", v850e2");
2740               break;
2741             case E_V850E1_ARCH:
2742               strcat (buf, ", v850e1");
2743               break;
2744             case E_V850E_ARCH:
2745               strcat (buf, ", v850e");
2746               break;
2747             case E_V850_ARCH:
2748               strcat (buf, ", v850");
2749               break;
2750             default:
2751               strcat (buf, _(", unknown v850 architecture variant"));
2752               break;
2753             }
2754           break;
2755
2756         case EM_M32R:
2757         case EM_CYGNUS_M32R:
2758           if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
2759             strcat (buf, ", m32r");
2760           break;
2761
2762         case EM_MIPS:
2763         case EM_MIPS_RS3_LE:
2764           if (e_flags & EF_MIPS_NOREORDER)
2765             strcat (buf, ", noreorder");
2766
2767           if (e_flags & EF_MIPS_PIC)
2768             strcat (buf, ", pic");
2769
2770           if (e_flags & EF_MIPS_CPIC)
2771             strcat (buf, ", cpic");
2772
2773           if (e_flags & EF_MIPS_UCODE)
2774             strcat (buf, ", ugen_reserved");
2775
2776           if (e_flags & EF_MIPS_ABI2)
2777             strcat (buf, ", abi2");
2778
2779           if (e_flags & EF_MIPS_OPTIONS_FIRST)
2780             strcat (buf, ", odk first");
2781
2782           if (e_flags & EF_MIPS_32BITMODE)
2783             strcat (buf, ", 32bitmode");
2784
2785           if (e_flags & EF_MIPS_NAN2008)
2786             strcat (buf, ", nan2008");
2787
2788           if (e_flags & EF_MIPS_FP64)
2789             strcat (buf, ", fp64");
2790
2791           switch ((e_flags & EF_MIPS_MACH))
2792             {
2793             case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
2794             case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
2795             case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
2796             case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
2797             case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
2798             case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
2799             case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
2800             case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
2801             case E_MIPS_MACH_SB1:  strcat (buf, ", sb1");  break;
2802             case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
2803             case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break;
2804             case E_MIPS_MACH_LS2F: strcat (buf, ", loongson-2f"); break;
2805             case E_MIPS_MACH_LS3A: strcat (buf, ", loongson-3a"); break;
2806             case E_MIPS_MACH_OCTEON: strcat (buf, ", octeon"); break;
2807             case E_MIPS_MACH_OCTEON2: strcat (buf, ", octeon2"); break;
2808             case E_MIPS_MACH_OCTEON3: strcat (buf, ", octeon3"); break;
2809             case E_MIPS_MACH_XLR:  strcat (buf, ", xlr"); break;
2810             case 0:
2811             /* We simply ignore the field in this case to avoid confusion:
2812                MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
2813                extension.  */
2814               break;
2815             default: strcat (buf, _(", unknown CPU")); break;
2816             }
2817
2818           switch ((e_flags & EF_MIPS_ABI))
2819             {
2820             case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
2821             case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
2822             case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
2823             case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
2824             case 0:
2825             /* We simply ignore the field in this case to avoid confusion:
2826                MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
2827                This means it is likely to be an o32 file, but not for
2828                sure.  */
2829               break;
2830             default: strcat (buf, _(", unknown ABI")); break;
2831             }
2832
2833           if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
2834             strcat (buf, ", mdmx");
2835
2836           if (e_flags & EF_MIPS_ARCH_ASE_M16)
2837             strcat (buf, ", mips16");
2838
2839           if (e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
2840             strcat (buf, ", micromips");
2841
2842           switch ((e_flags & EF_MIPS_ARCH))
2843             {
2844             case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
2845             case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
2846             case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
2847             case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
2848             case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
2849             case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
2850             case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
2851             case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
2852             case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
2853             default: strcat (buf, _(", unknown ISA")); break;
2854             }
2855           break;
2856
2857         case EM_NDS32:
2858           decode_NDS32_machine_flags (e_flags, buf, sizeof buf);
2859           break;
2860
2861         case EM_SH:
2862           switch ((e_flags & EF_SH_MACH_MASK))
2863             {
2864             case EF_SH1: strcat (buf, ", sh1"); break;
2865             case EF_SH2: strcat (buf, ", sh2"); break;
2866             case EF_SH3: strcat (buf, ", sh3"); break;
2867             case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
2868             case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
2869             case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
2870             case EF_SH3E: strcat (buf, ", sh3e"); break;
2871             case EF_SH4: strcat (buf, ", sh4"); break;
2872             case EF_SH5: strcat (buf, ", sh5"); break;
2873             case EF_SH2E: strcat (buf, ", sh2e"); break;
2874             case EF_SH4A: strcat (buf, ", sh4a"); break;
2875             case EF_SH2A: strcat (buf, ", sh2a"); break;
2876             case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
2877             case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
2878             case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
2879             case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
2880             case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
2881             case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
2882             case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
2883             case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
2884             case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
2885             default: strcat (buf, _(", unknown ISA")); break;
2886             }
2887
2888           if (e_flags & EF_SH_PIC)
2889             strcat (buf, ", pic");
2890
2891           if (e_flags & EF_SH_FDPIC)
2892             strcat (buf, ", fdpic");
2893           break;
2894           
2895         case EM_OR1K:
2896           if (e_flags & EF_OR1K_NODELAY)
2897             strcat (buf, ", no delay");
2898           break;
2899
2900         case EM_SPARCV9:
2901           if (e_flags & EF_SPARC_32PLUS)
2902             strcat (buf, ", v8+");
2903
2904           if (e_flags & EF_SPARC_SUN_US1)
2905             strcat (buf, ", ultrasparcI");
2906
2907           if (e_flags & EF_SPARC_SUN_US3)
2908             strcat (buf, ", ultrasparcIII");
2909
2910           if (e_flags & EF_SPARC_HAL_R1)
2911             strcat (buf, ", halr1");
2912
2913           if (e_flags & EF_SPARC_LEDATA)
2914             strcat (buf, ", ledata");
2915
2916           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
2917             strcat (buf, ", tso");
2918
2919           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
2920             strcat (buf, ", pso");
2921
2922           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
2923             strcat (buf, ", rmo");
2924           break;
2925
2926         case EM_PARISC:
2927           switch (e_flags & EF_PARISC_ARCH)
2928             {
2929             case EFA_PARISC_1_0:
2930               strcpy (buf, ", PA-RISC 1.0");
2931               break;
2932             case EFA_PARISC_1_1:
2933               strcpy (buf, ", PA-RISC 1.1");
2934               break;
2935             case EFA_PARISC_2_0:
2936               strcpy (buf, ", PA-RISC 2.0");
2937               break;
2938             default:
2939               break;
2940             }
2941           if (e_flags & EF_PARISC_TRAPNIL)
2942             strcat (buf, ", trapnil");
2943           if (e_flags & EF_PARISC_EXT)
2944             strcat (buf, ", ext");
2945           if (e_flags & EF_PARISC_LSB)
2946             strcat (buf, ", lsb");
2947           if (e_flags & EF_PARISC_WIDE)
2948             strcat (buf, ", wide");
2949           if (e_flags & EF_PARISC_NO_KABP)
2950             strcat (buf, ", no kabp");
2951           if (e_flags & EF_PARISC_LAZYSWAP)
2952             strcat (buf, ", lazyswap");
2953           break;
2954
2955         case EM_PJ:
2956         case EM_PJ_OLD:
2957           if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
2958             strcat (buf, ", new calling convention");
2959
2960           if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
2961             strcat (buf, ", gnu calling convention");
2962           break;
2963
2964         case EM_IA_64:
2965           if ((e_flags & EF_IA_64_ABI64))
2966             strcat (buf, ", 64-bit");
2967           else
2968             strcat (buf, ", 32-bit");
2969           if ((e_flags & EF_IA_64_REDUCEDFP))
2970             strcat (buf, ", reduced fp model");
2971           if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
2972             strcat (buf, ", no function descriptors, constant gp");
2973           else if ((e_flags & EF_IA_64_CONS_GP))
2974             strcat (buf, ", constant gp");
2975           if ((e_flags & EF_IA_64_ABSOLUTE))
2976             strcat (buf, ", absolute");
2977           if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
2978             {
2979               if ((e_flags & EF_IA_64_VMS_LINKAGES))
2980                 strcat (buf, ", vms_linkages");
2981               switch ((e_flags & EF_IA_64_VMS_COMCOD))
2982                 {
2983                 case EF_IA_64_VMS_COMCOD_SUCCESS:
2984                   break;
2985                 case EF_IA_64_VMS_COMCOD_WARNING:
2986                   strcat (buf, ", warning");
2987                   break;
2988                 case EF_IA_64_VMS_COMCOD_ERROR:
2989                   strcat (buf, ", error");
2990                   break;
2991                 case EF_IA_64_VMS_COMCOD_ABORT:
2992                   strcat (buf, ", abort");
2993                   break;
2994                 default:
2995                   abort ();
2996                 }
2997             }
2998           break;
2999
3000         case EM_VAX:
3001           if ((e_flags & EF_VAX_NONPIC))
3002             strcat (buf, ", non-PIC");
3003           if ((e_flags & EF_VAX_DFLOAT))
3004             strcat (buf, ", D-Float");
3005           if ((e_flags & EF_VAX_GFLOAT))
3006             strcat (buf, ", G-Float");
3007           break;
3008
3009         case EM_RL78:
3010           if (e_flags & E_FLAG_RL78_G10)
3011             strcat (buf, ", G10");
3012           if (e_flags & E_FLAG_RL78_64BIT_DOUBLES)
3013             strcat (buf, ", 64-bit doubles");
3014           break;
3015
3016         case EM_RX:
3017           if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
3018             strcat (buf, ", 64-bit doubles");
3019           if (e_flags & E_FLAG_RX_DSP)
3020             strcat (buf, ", dsp");
3021           if (e_flags & E_FLAG_RX_PID)
3022             strcat (buf, ", pid");
3023           if (e_flags & E_FLAG_RX_ABI)
3024             strcat (buf, ", RX ABI");
3025           break;
3026
3027         case EM_S390:
3028           if (e_flags & EF_S390_HIGH_GPRS)
3029             strcat (buf, ", highgprs");
3030           break;
3031
3032         case EM_TI_C6000:
3033           if ((e_flags & EF_C6000_REL))
3034             strcat (buf, ", relocatable module");
3035           break;
3036
3037         case EM_MSP430:
3038           strcat (buf, _(": architecture variant: "));
3039           switch (e_flags & EF_MSP430_MACH)
3040             {
3041             case E_MSP430_MACH_MSP430x11: strcat (buf, "MSP430x11"); break;
3042             case E_MSP430_MACH_MSP430x11x1 : strcat (buf, "MSP430x11x1 "); break;
3043             case E_MSP430_MACH_MSP430x12: strcat (buf, "MSP430x12"); break;
3044             case E_MSP430_MACH_MSP430x13: strcat (buf, "MSP430x13"); break;
3045             case E_MSP430_MACH_MSP430x14: strcat (buf, "MSP430x14"); break;
3046             case E_MSP430_MACH_MSP430x15: strcat (buf, "MSP430x15"); break;
3047             case E_MSP430_MACH_MSP430x16: strcat (buf, "MSP430x16"); break;
3048             case E_MSP430_MACH_MSP430x31: strcat (buf, "MSP430x31"); break;
3049             case E_MSP430_MACH_MSP430x32: strcat (buf, "MSP430x32"); break;
3050             case E_MSP430_MACH_MSP430x33: strcat (buf, "MSP430x33"); break;
3051             case E_MSP430_MACH_MSP430x41: strcat (buf, "MSP430x41"); break;
3052             case E_MSP430_MACH_MSP430x42: strcat (buf, "MSP430x42"); break;
3053             case E_MSP430_MACH_MSP430x43: strcat (buf, "MSP430x43"); break;
3054             case E_MSP430_MACH_MSP430x44: strcat (buf, "MSP430x44"); break;
3055             case E_MSP430_MACH_MSP430X  : strcat (buf, "MSP430X"); break;
3056             default:
3057               strcat (buf, _(": unknown")); break;
3058             }
3059
3060           if (e_flags & ~ EF_MSP430_MACH)
3061             strcat (buf, _(": unknown extra flag bits also present"));
3062         }
3063     }
3064
3065   return buf;
3066 }
3067
3068 static const char *
3069 get_osabi_name (unsigned int osabi)
3070 {
3071   static char buff[32];
3072
3073   switch (osabi)
3074     {
3075     case ELFOSABI_NONE:         return "UNIX - System V";
3076     case ELFOSABI_HPUX:         return "UNIX - HP-UX";
3077     case ELFOSABI_NETBSD:       return "UNIX - NetBSD";
3078     case ELFOSABI_GNU:          return "UNIX - GNU";
3079     case ELFOSABI_SOLARIS:      return "UNIX - Solaris";
3080     case ELFOSABI_AIX:          return "UNIX - AIX";
3081     case ELFOSABI_IRIX:         return "UNIX - IRIX";
3082     case ELFOSABI_FREEBSD:      return "UNIX - FreeBSD";
3083     case ELFOSABI_TRU64:        return "UNIX - TRU64";
3084     case ELFOSABI_MODESTO:      return "Novell - Modesto";
3085     case ELFOSABI_OPENBSD:      return "UNIX - OpenBSD";
3086     case ELFOSABI_OPENVMS:      return "VMS - OpenVMS";
3087     case ELFOSABI_NSK:          return "HP - Non-Stop Kernel";
3088     case ELFOSABI_AROS:         return "AROS";
3089     case ELFOSABI_FENIXOS:      return "FenixOS";
3090     default:
3091       if (osabi >= 64)
3092         switch (elf_header.e_machine)
3093           {
3094           case EM_ARM:
3095             switch (osabi)
3096               {
3097               case ELFOSABI_ARM:        return "ARM";
3098               default:
3099                 break;
3100               }
3101             break;
3102
3103           case EM_MSP430:
3104           case EM_MSP430_OLD:
3105             switch (osabi)
3106               {
3107               case ELFOSABI_STANDALONE: return _("Standalone App");
3108               default:
3109                 break;
3110               }
3111             break;
3112
3113           case EM_TI_C6000:
3114             switch (osabi)
3115               {
3116               case ELFOSABI_C6000_ELFABI:       return _("Bare-metal C6000");
3117               case ELFOSABI_C6000_LINUX:        return "Linux C6000";
3118               default:
3119                 break;
3120               }
3121             break;
3122
3123           default:
3124             break;
3125           }
3126       snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
3127       return buff;
3128     }
3129 }
3130
3131 static const char *
3132 get_aarch64_segment_type (unsigned long type)
3133 {
3134   switch (type)
3135     {
3136     case PT_AARCH64_ARCHEXT:
3137       return "AARCH64_ARCHEXT";
3138     default:
3139       break;
3140     }
3141
3142   return NULL;
3143 }
3144
3145 static const char *
3146 get_arm_segment_type (unsigned long type)
3147 {
3148   switch (type)
3149     {
3150     case PT_ARM_EXIDX:
3151       return "EXIDX";
3152     default:
3153       break;
3154     }
3155
3156   return NULL;
3157 }
3158
3159 static const char *
3160 get_mips_segment_type (unsigned long type)
3161 {
3162   switch (type)
3163     {
3164     case PT_MIPS_REGINFO:
3165       return "REGINFO";
3166     case PT_MIPS_RTPROC:
3167       return "RTPROC";
3168     case PT_MIPS_OPTIONS:
3169       return "OPTIONS";
3170     default:
3171       break;
3172     }
3173
3174   return NULL;
3175 }
3176
3177 static const char *
3178 get_parisc_segment_type (unsigned long type)
3179 {
3180   switch (type)
3181     {
3182     case PT_HP_TLS:             return "HP_TLS";
3183     case PT_HP_CORE_NONE:       return "HP_CORE_NONE";
3184     case PT_HP_CORE_VERSION:    return "HP_CORE_VERSION";
3185     case PT_HP_CORE_KERNEL:     return "HP_CORE_KERNEL";
3186     case PT_HP_CORE_COMM:       return "HP_CORE_COMM";
3187     case PT_HP_CORE_PROC:       return "HP_CORE_PROC";
3188     case PT_HP_CORE_LOADABLE:   return "HP_CORE_LOADABLE";
3189     case PT_HP_CORE_STACK:      return "HP_CORE_STACK";
3190     case PT_HP_CORE_SHM:        return "HP_CORE_SHM";
3191     case PT_HP_CORE_MMF:        return "HP_CORE_MMF";
3192     case PT_HP_PARALLEL:        return "HP_PARALLEL";
3193     case PT_HP_FASTBIND:        return "HP_FASTBIND";
3194     case PT_HP_OPT_ANNOT:       return "HP_OPT_ANNOT";
3195     case PT_HP_HSL_ANNOT:       return "HP_HSL_ANNOT";
3196     case PT_HP_STACK:           return "HP_STACK";
3197     case PT_HP_CORE_UTSNAME:    return "HP_CORE_UTSNAME";
3198     case PT_PARISC_ARCHEXT:     return "PARISC_ARCHEXT";
3199     case PT_PARISC_UNWIND:      return "PARISC_UNWIND";
3200     case PT_PARISC_WEAKORDER:   return "PARISC_WEAKORDER";
3201     default:
3202       break;
3203     }
3204
3205   return NULL;
3206 }
3207
3208 static const char *
3209 get_ia64_segment_type (unsigned long type)
3210 {
3211   switch (type)
3212     {
3213     case PT_IA_64_ARCHEXT:      return "IA_64_ARCHEXT";
3214     case PT_IA_64_UNWIND:       return "IA_64_UNWIND";
3215     case PT_HP_TLS:             return "HP_TLS";
3216     case PT_IA_64_HP_OPT_ANOT:  return "HP_OPT_ANNOT";
3217     case PT_IA_64_HP_HSL_ANOT:  return "HP_HSL_ANNOT";
3218     case PT_IA_64_HP_STACK:     return "HP_STACK";
3219     default:
3220       break;
3221     }
3222
3223   return NULL;
3224 }
3225
3226 static const char *
3227 get_tic6x_segment_type (unsigned long type)
3228 {
3229   switch (type)
3230     {
3231     case PT_C6000_PHATTR:       return "C6000_PHATTR";
3232     default:
3233       break;
3234     }
3235
3236   return NULL;
3237 }
3238
3239 static const char *
3240 get_segment_type (unsigned long p_type)
3241 {
3242   static char buff[32];
3243
3244   switch (p_type)
3245     {
3246     case PT_NULL:       return "NULL";
3247     case PT_LOAD:       return "LOAD";
3248     case PT_DYNAMIC:    return "DYNAMIC";
3249     case PT_INTERP:     return "INTERP";
3250     case PT_NOTE:       return "NOTE";
3251     case PT_SHLIB:      return "SHLIB";
3252     case PT_PHDR:       return "PHDR";
3253     case PT_TLS:        return "TLS";
3254
3255     case PT_GNU_EH_FRAME:
3256                         return "GNU_EH_FRAME";
3257     case PT_GNU_STACK:  return "GNU_STACK";
3258     case PT_GNU_RELRO:  return "GNU_RELRO";
3259
3260     default:
3261       if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
3262         {
3263           const char * result;
3264
3265           switch (elf_header.e_machine)
3266             {
3267             case EM_AARCH64:
3268               result = get_aarch64_segment_type (p_type);
3269               break;
3270             case EM_ARM:
3271               result = get_arm_segment_type (p_type);
3272               break;
3273             case EM_MIPS:
3274             case EM_MIPS_RS3_LE:
3275               result = get_mips_segment_type (p_type);
3276               break;
3277             case EM_PARISC:
3278               result = get_parisc_segment_type (p_type);
3279               break;
3280             case EM_IA_64:
3281               result = get_ia64_segment_type (p_type);
3282               break;
3283             case EM_TI_C6000:
3284               result = get_tic6x_segment_type (p_type);
3285               break;
3286             default:
3287               result = NULL;
3288               break;
3289             }
3290
3291           if (result != NULL)
3292             return result;
3293
3294           sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
3295         }
3296       else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
3297         {
3298           const char * result;
3299
3300           switch (elf_header.e_machine)
3301             {
3302             case EM_PARISC:
3303               result = get_parisc_segment_type (p_type);
3304               break;
3305             case EM_IA_64:
3306               result = get_ia64_segment_type (p_type);
3307               break;
3308             default:
3309               result = NULL;
3310               break;
3311             }
3312
3313           if (result != NULL)
3314             return result;
3315
3316           sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
3317         }
3318       else
3319         snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
3320
3321       return buff;
3322     }
3323 }
3324
3325 static const char *
3326 get_mips_section_type_name (unsigned int sh_type)
3327 {
3328   switch (sh_type)
3329     {
3330     case SHT_MIPS_LIBLIST:       return "MIPS_LIBLIST";
3331     case SHT_MIPS_MSYM:          return "MIPS_MSYM";
3332     case SHT_MIPS_CONFLICT:      return "MIPS_CONFLICT";
3333     case SHT_MIPS_GPTAB:         return "MIPS_GPTAB";
3334     case SHT_MIPS_UCODE:         return "MIPS_UCODE";
3335     case SHT_MIPS_DEBUG:         return "MIPS_DEBUG";
3336     case SHT_MIPS_REGINFO:       return "MIPS_REGINFO";
3337     case SHT_MIPS_PACKAGE:       return "MIPS_PACKAGE";
3338     case SHT_MIPS_PACKSYM:       return "MIPS_PACKSYM";
3339     case SHT_MIPS_RELD:          return "MIPS_RELD";
3340     case SHT_MIPS_IFACE:         return "MIPS_IFACE";
3341     case SHT_MIPS_CONTENT:       return "MIPS_CONTENT";
3342     case SHT_MIPS_OPTIONS:       return "MIPS_OPTIONS";
3343     case SHT_MIPS_SHDR:          return "MIPS_SHDR";
3344     case SHT_MIPS_FDESC:         return "MIPS_FDESC";
3345     case SHT_MIPS_EXTSYM:        return "MIPS_EXTSYM";
3346     case SHT_MIPS_DENSE:         return "MIPS_DENSE";
3347     case SHT_MIPS_PDESC:         return "MIPS_PDESC";
3348     case SHT_MIPS_LOCSYM:        return "MIPS_LOCSYM";
3349     case SHT_MIPS_AUXSYM:        return "MIPS_AUXSYM";
3350     case SHT_MIPS_OPTSYM:        return "MIPS_OPTSYM";
3351     case SHT_MIPS_LOCSTR:        return "MIPS_LOCSTR";
3352     case SHT_MIPS_LINE:          return "MIPS_LINE";
3353     case SHT_MIPS_RFDESC:        return "MIPS_RFDESC";
3354     case SHT_MIPS_DELTASYM:      return "MIPS_DELTASYM";
3355     case SHT_MIPS_DELTAINST:     return "MIPS_DELTAINST";
3356     case SHT_MIPS_DELTACLASS:    return "MIPS_DELTACLASS";
3357     case SHT_MIPS_DWARF:         return "MIPS_DWARF";
3358     case SHT_MIPS_DELTADECL:     return "MIPS_DELTADECL";
3359     case SHT_MIPS_SYMBOL_LIB:    return "MIPS_SYMBOL_LIB";
3360     case SHT_MIPS_EVENTS:        return "MIPS_EVENTS";
3361     case SHT_MIPS_TRANSLATE:     return "MIPS_TRANSLATE";
3362     case SHT_MIPS_PIXIE:         return "MIPS_PIXIE";
3363     case SHT_MIPS_XLATE:         return "MIPS_XLATE";
3364     case SHT_MIPS_XLATE_DEBUG:   return "MIPS_XLATE_DEBUG";
3365     case SHT_MIPS_WHIRL:         return "MIPS_WHIRL";
3366     case SHT_MIPS_EH_REGION:     return "MIPS_EH_REGION";
3367     case SHT_MIPS_XLATE_OLD:     return "MIPS_XLATE_OLD";
3368     case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
3369     default:
3370       break;
3371     }
3372   return NULL;
3373 }
3374
3375 static const char *
3376 get_parisc_section_type_name (unsigned int sh_type)
3377 {
3378   switch (sh_type)
3379     {
3380     case SHT_PARISC_EXT:        return "PARISC_EXT";
3381     case SHT_PARISC_UNWIND:     return "PARISC_UNWIND";
3382     case SHT_PARISC_DOC:        return "PARISC_DOC";
3383     case SHT_PARISC_ANNOT:      return "PARISC_ANNOT";
3384     case SHT_PARISC_SYMEXTN:    return "PARISC_SYMEXTN";
3385     case SHT_PARISC_STUBS:      return "PARISC_STUBS";
3386     case SHT_PARISC_DLKM:       return "PARISC_DLKM";
3387     default:
3388       break;
3389     }
3390   return NULL;
3391 }
3392
3393 static const char *
3394 get_ia64_section_type_name (unsigned int sh_type)
3395 {
3396   /* If the top 8 bits are 0x78 the next 8 are the os/abi ID.  */
3397   if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
3398     return get_osabi_name ((sh_type & 0x00FF0000) >> 16);
3399
3400   switch (sh_type)
3401     {
3402     case SHT_IA_64_EXT:                return "IA_64_EXT";
3403     case SHT_IA_64_UNWIND:             return "IA_64_UNWIND";
3404     case SHT_IA_64_PRIORITY_INIT:      return "IA_64_PRIORITY_INIT";
3405     case SHT_IA_64_VMS_TRACE:          return "VMS_TRACE";
3406     case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
3407     case SHT_IA_64_VMS_DEBUG:          return "VMS_DEBUG";
3408     case SHT_IA_64_VMS_DEBUG_STR:      return "VMS_DEBUG_STR";
3409     case SHT_IA_64_VMS_LINKAGES:       return "VMS_LINKAGES";
3410     case SHT_IA_64_VMS_SYMBOL_VECTOR:  return "VMS_SYMBOL_VECTOR";
3411     case SHT_IA_64_VMS_FIXUP:          return "VMS_FIXUP";
3412     default:
3413       break;
3414     }
3415   return NULL;
3416 }
3417
3418 static const char *
3419 get_x86_64_section_type_name (unsigned int sh_type)
3420 {
3421   switch (sh_type)
3422     {
3423     case SHT_X86_64_UNWIND:     return "X86_64_UNWIND";
3424     default:
3425       break;
3426     }
3427   return NULL;
3428 }
3429
3430 static const char *
3431 get_aarch64_section_type_name (unsigned int sh_type)
3432 {
3433   switch (sh_type)
3434     {
3435     case SHT_AARCH64_ATTRIBUTES:
3436       return "AARCH64_ATTRIBUTES";
3437     default:
3438       break;
3439     }
3440   return NULL;
3441 }
3442
3443 static const char *
3444 get_arm_section_type_name (unsigned int sh_type)
3445 {
3446   switch (sh_type)
3447     {
3448     case SHT_ARM_EXIDX:           return "ARM_EXIDX";
3449     case SHT_ARM_PREEMPTMAP:      return "ARM_PREEMPTMAP";
3450     case SHT_ARM_ATTRIBUTES:      return "ARM_ATTRIBUTES";
3451     case SHT_ARM_DEBUGOVERLAY:    return "ARM_DEBUGOVERLAY";
3452     case SHT_ARM_OVERLAYSECTION:  return "ARM_OVERLAYSECTION";
3453     default:
3454       break;
3455     }
3456   return NULL;
3457 }
3458
3459 static const char *
3460 get_tic6x_section_type_name (unsigned int sh_type)
3461 {
3462   switch (sh_type)
3463     {
3464     case SHT_C6000_UNWIND:
3465       return "C6000_UNWIND";
3466     case SHT_C6000_PREEMPTMAP:
3467       return "C6000_PREEMPTMAP";
3468     case SHT_C6000_ATTRIBUTES:
3469       return "C6000_ATTRIBUTES";
3470     case SHT_TI_ICODE:
3471       return "TI_ICODE";
3472     case SHT_TI_XREF:
3473       return "TI_XREF";
3474     case SHT_TI_HANDLER:
3475       return "TI_HANDLER";
3476     case SHT_TI_INITINFO:
3477       return "TI_INITINFO";
3478     case SHT_TI_PHATTRS:
3479       return "TI_PHATTRS";
3480     default:
3481       break;
3482     }
3483   return NULL;
3484 }
3485
3486 static const char *
3487 get_msp430x_section_type_name (unsigned int sh_type)
3488 {
3489   switch (sh_type)
3490     {
3491     case SHT_MSP430_SEC_FLAGS:   return "MSP430_SEC_FLAGS";
3492     case SHT_MSP430_SYM_ALIASES: return "MSP430_SYM_ALIASES";
3493     case SHT_MSP430_ATTRIBUTES:  return "MSP430_ATTRIBUTES";
3494     default: return NULL;
3495     }
3496 }
3497
3498 static const char *
3499 get_section_type_name (unsigned int sh_type)
3500 {
3501   static char buff[32];
3502
3503   switch (sh_type)
3504     {
3505     case SHT_NULL:              return "NULL";
3506     case SHT_PROGBITS:          return "PROGBITS";
3507     case SHT_SYMTAB:            return "SYMTAB";
3508     case SHT_STRTAB:            return "STRTAB";
3509     case SHT_RELA:              return "RELA";
3510     case SHT_HASH:              return "HASH";
3511     case SHT_DYNAMIC:           return "DYNAMIC";
3512     case SHT_NOTE:              return "NOTE";
3513     case SHT_NOBITS:            return "NOBITS";
3514     case SHT_REL:               return "REL";
3515     case SHT_SHLIB:             return "SHLIB";
3516     case SHT_DYNSYM:            return "DYNSYM";
3517     case SHT_INIT_ARRAY:        return "INIT_ARRAY";
3518     case SHT_FINI_ARRAY:        return "FINI_ARRAY";
3519     case SHT_PREINIT_ARRAY:     return "PREINIT_ARRAY";
3520     case SHT_GNU_HASH:          return "GNU_HASH";
3521     case SHT_GROUP:             return "GROUP";
3522     case SHT_SYMTAB_SHNDX:      return "SYMTAB SECTION INDICIES";
3523     case SHT_GNU_verdef:        return "VERDEF";
3524     case SHT_GNU_verneed:       return "VERNEED";
3525     case SHT_GNU_versym:        return "VERSYM";
3526     case 0x6ffffff0:            return "VERSYM";
3527     case 0x6ffffffc:            return "VERDEF";
3528     case 0x7ffffffd:            return "AUXILIARY";
3529     case 0x7fffffff:            return "FILTER";
3530     case SHT_GNU_LIBLIST:       return "GNU_LIBLIST";
3531
3532     default:
3533       if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
3534         {
3535           const char * result;
3536
3537           switch (elf_header.e_machine)
3538             {
3539             case EM_MIPS:
3540             case EM_MIPS_RS3_LE:
3541               result = get_mips_section_type_name (sh_type);
3542               break;
3543             case EM_PARISC:
3544               result = get_parisc_section_type_name (sh_type);
3545               break;
3546             case EM_IA_64:
3547               result = get_ia64_section_type_name (sh_type);
3548               break;
3549             case EM_X86_64:
3550             case EM_L1OM:
3551             case EM_K1OM:
3552               result = get_x86_64_section_type_name (sh_type);
3553               break;
3554             case EM_AARCH64:
3555               result = get_aarch64_section_type_name (sh_type);
3556               break;
3557             case EM_ARM:
3558               result = get_arm_section_type_name (sh_type);
3559               break;
3560             case EM_TI_C6000:
3561               result = get_tic6x_section_type_name (sh_type);
3562               break;
3563             case EM_MSP430:
3564               result = get_msp430x_section_type_name (sh_type);
3565               break;
3566             default:
3567               result = NULL;
3568               break;
3569             }
3570
3571           if (result != NULL)
3572             return result;
3573
3574           sprintf (buff, "LOPROC+%x", sh_type - SHT_LOPROC);
3575         }
3576       else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
3577         {
3578           const char * result;
3579
3580           switch (elf_header.e_machine)
3581             {
3582             case EM_IA_64:
3583               result = get_ia64_section_type_name (sh_type);
3584               break;
3585             default:
3586               result = NULL;
3587               break;
3588             }
3589
3590           if (result != NULL)
3591             return result;
3592
3593           sprintf (buff, "LOOS+%x", sh_type - SHT_LOOS);
3594         }
3595       else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
3596         sprintf (buff, "LOUSER+%x", sh_type - SHT_LOUSER);
3597       else
3598         /* This message is probably going to be displayed in a 15
3599            character wide field, so put the hex value first.  */
3600         snprintf (buff, sizeof (buff), _("%08x: <unknown>"), sh_type);
3601
3602       return buff;
3603     }
3604 }
3605
3606 #define OPTION_DEBUG_DUMP       512
3607 #define OPTION_DYN_SYMS         513
3608 #define OPTION_DWARF_DEPTH      514
3609 #define OPTION_DWARF_START      515
3610 #define OPTION_DWARF_CHECK      516
3611
3612 static struct option options[] =
3613 {
3614   {"all",              no_argument, 0, 'a'},
3615   {"file-header",      no_argument, 0, 'h'},
3616   {"program-headers",  no_argument, 0, 'l'},
3617   {"headers",          no_argument, 0, 'e'},
3618   {"histogram",        no_argument, 0, 'I'},
3619   {"segments",         no_argument, 0, 'l'},
3620   {"sections",         no_argument, 0, 'S'},
3621   {"section-headers",  no_argument, 0, 'S'},
3622   {"section-groups",   no_argument, 0, 'g'},
3623   {"section-details",  no_argument, 0, 't'},
3624   {"full-section-name",no_argument, 0, 'N'},
3625   {"symbols",          no_argument, 0, 's'},
3626   {"syms",             no_argument, 0, 's'},
3627   {"dyn-syms",         no_argument, 0, OPTION_DYN_SYMS},
3628   {"relocs",           no_argument, 0, 'r'},
3629   {"notes",            no_argument, 0, 'n'},
3630   {"dynamic",          no_argument, 0, 'd'},
3631   {"arch-specific",    no_argument, 0, 'A'},
3632   {"version-info",     no_argument, 0, 'V'},
3633   {"use-dynamic",      no_argument, 0, 'D'},
3634   {"unwind",           no_argument, 0, 'u'},
3635   {"archive-index",    no_argument, 0, 'c'},
3636   {"hex-dump",         required_argument, 0, 'x'},
3637   {"relocated-dump",   required_argument, 0, 'R'},
3638   {"string-dump",      required_argument, 0, 'p'},
3639 #ifdef SUPPORT_DISASSEMBLY
3640   {"instruction-dump", required_argument, 0, 'i'},
3641 #endif
3642   {"debug-dump",       optional_argument, 0, OPTION_DEBUG_DUMP},
3643
3644   {"dwarf-depth",      required_argument, 0, OPTION_DWARF_DEPTH},
3645   {"dwarf-start",      required_argument, 0, OPTION_DWARF_START},
3646   {"dwarf-check",      no_argument, 0, OPTION_DWARF_CHECK},
3647
3648   {"version",          no_argument, 0, 'v'},
3649   {"wide",             no_argument, 0, 'W'},
3650   {"help",             no_argument, 0, 'H'},
3651   {0,                  no_argument, 0, 0}
3652 };
3653
3654 static void
3655 usage (FILE * stream)
3656 {
3657   fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
3658   fprintf (stream, _(" Display information about the contents of ELF format files\n"));
3659   fprintf (stream, _(" Options are:\n\
3660   -a --all               Equivalent to: -h -l -S -s -r -d -V -A -I\n\
3661   -h --file-header       Display the ELF file header\n\
3662   -l --program-headers   Display the program headers\n\
3663      --segments          An alias for --program-headers\n\
3664   -S --section-headers   Display the sections' header\n\
3665      --sections          An alias for --section-headers\n\
3666   -g --section-groups    Display the section groups\n\
3667   -t --section-details   Display the section details\n\
3668   -e --headers           Equivalent to: -h -l -S\n\
3669   -s --syms              Display the symbol table\n\
3670      --symbols           An alias for --syms\n\
3671   --dyn-syms             Display the dynamic symbol table\n\
3672   -n --notes             Display the core notes (if present)\n\
3673   -r --relocs            Display the relocations (if present)\n\
3674   -u --unwind            Display the unwind info (if present)\n\
3675   -d --dynamic           Display the dynamic section (if present)\n\
3676   -V --version-info      Display the version sections (if present)\n\
3677   -A --arch-specific     Display architecture specific information (if any)\n\
3678   -c --archive-index     Display the symbol/file index in an archive\n\
3679   -D --use-dynamic       Use the dynamic section info when displaying symbols\n\
3680   -x --hex-dump=<number|name>\n\
3681                          Dump the contents of section <number|name> as bytes\n\
3682   -p --string-dump=<number|name>\n\
3683                          Dump the contents of section <number|name> as strings\n\
3684   -R --relocated-dump=<number|name>\n\
3685                          Dump the contents of section <number|name> as relocated bytes\n\
3686   -w[lLiaprmfFsoRt] or\n\
3687   --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
3688                =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
3689                =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
3690                =addr,=cu_index]\n\
3691                          Display the contents of DWARF2 debug sections\n"));
3692   fprintf (stream, _("\
3693   --dwarf-depth=N        Do not display DIEs at depth N or greater\n\
3694   --dwarf-start=N        Display DIEs starting with N, at the same depth\n\
3695                          or deeper\n"));
3696 #ifdef SUPPORT_DISASSEMBLY
3697   fprintf (stream, _("\
3698   -i --instruction-dump=<number|name>\n\
3699                          Disassemble the contents of section <number|name>\n"));
3700 #endif
3701   fprintf (stream, _("\
3702   -I --histogram         Display histogram of bucket list lengths\n\
3703   -W --wide              Allow output width to exceed 80 characters\n\
3704   @<file>                Read options from <file>\n\
3705   -H --help              Display this information\n\
3706   -v --version           Display the version number of readelf\n"));
3707
3708   if (REPORT_BUGS_TO[0] && stream == stdout)
3709     fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
3710
3711   exit (stream == stdout ? 0 : 1);
3712 }
3713
3714 /* Record the fact that the user wants the contents of section number
3715    SECTION to be displayed using the method(s) encoded as flags bits
3716    in TYPE.  Note, TYPE can be zero if we are creating the array for
3717    the first time.  */
3718
3719 static void
3720 request_dump_bynumber (unsigned int section, dump_type type)
3721 {
3722   if (section >= num_dump_sects)
3723     {
3724       dump_type * new_dump_sects;
3725
3726       new_dump_sects = (dump_type *) calloc (section + 1,
3727                                              sizeof (* dump_sects));
3728
3729       if (new_dump_sects == NULL)
3730         error (_("Out of memory allocating dump request table.\n"));
3731       else
3732         {
3733           /* Copy current flag settings.  */
3734           memcpy (new_dump_sects, dump_sects, num_dump_sects * sizeof (* dump_sects));
3735
3736           free (dump_sects);
3737
3738           dump_sects = new_dump_sects;
3739           num_dump_sects = section + 1;
3740         }
3741     }
3742
3743   if (dump_sects)
3744     dump_sects[section] |= type;
3745
3746   return;
3747 }
3748
3749 /* Request a dump by section name.  */
3750
3751 static void
3752 request_dump_byname (const char * section, dump_type type)
3753 {
3754   struct dump_list_entry * new_request;
3755
3756   new_request = (struct dump_list_entry *)
3757       malloc (sizeof (struct dump_list_entry));
3758   if (!new_request)
3759     error (_("Out of memory allocating dump request table.\n"));
3760
3761   new_request->name = strdup (section);
3762   if (!new_request->name)
3763     error (_("Out of memory allocating dump request table.\n"));
3764
3765   new_request->type = type;
3766
3767   new_request->next = dump_sects_byname;
3768   dump_sects_byname = new_request;
3769 }
3770
3771 static inline void
3772 request_dump (dump_type type)
3773 {
3774   int section;
3775   char * cp;
3776
3777   do_dump++;
3778   section = strtoul (optarg, & cp, 0);
3779
3780   if (! *cp && section >= 0)
3781     request_dump_bynumber (section, type);
3782   else
3783     request_dump_byname (optarg, type);
3784 }
3785
3786
3787 static void
3788 parse_args (int argc, char ** argv)
3789 {
3790   int c;
3791
3792   if (argc < 2)
3793     usage (stderr);
3794
3795   while ((c = getopt_long
3796           (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:", options, NULL)) != EOF)
3797     {
3798       switch (c)
3799         {
3800         case 0:
3801           /* Long options.  */
3802           break;
3803         case 'H':
3804           usage (stdout);
3805           break;
3806
3807         case 'a':
3808           do_syms++;
3809           do_reloc++;
3810           do_unwind++;
3811           do_dynamic++;
3812           do_header++;
3813           do_sections++;
3814           do_section_groups++;
3815           do_segments++;
3816           do_version++;
3817           do_histogram++;
3818           do_arch++;
3819           do_notes++;
3820           break;
3821         case 'g':
3822           do_section_groups++;
3823           break;
3824         case 't':
3825         case 'N':
3826           do_sections++;
3827           do_section_details++;
3828           break;
3829         case 'e':
3830           do_header++;
3831           do_sections++;
3832           do_segments++;
3833           break;
3834         case 'A':
3835           do_arch++;
3836           break;
3837         case 'D':
3838           do_using_dynamic++;
3839           break;
3840         case 'r':
3841           do_reloc++;
3842           break;
3843         case 'u':
3844           do_unwind++;
3845           break;
3846         case 'h':
3847           do_header++;
3848           break;
3849         case 'l':
3850           do_segments++;
3851           break;
3852         case 's':
3853           do_syms++;
3854           break;
3855         case 'S':
3856           do_sections++;
3857           break;
3858         case 'd':
3859           do_dynamic++;
3860           break;
3861         case 'I':
3862           do_histogram++;
3863           break;
3864         case 'n':
3865           do_notes++;
3866           break;
3867         case 'c':
3868           do_archive_index++;
3869           break;
3870         case 'x':
3871           request_dump (HEX_DUMP);
3872           break;
3873         case 'p':
3874           request_dump (STRING_DUMP);
3875           break;
3876         case 'R':
3877           request_dump (RELOC_DUMP);
3878           break;
3879         case 'w':
3880           do_dump++;
3881           if (optarg == 0)
3882             {
3883               do_debugging = 1;
3884               dwarf_select_sections_all ();
3885             }
3886           else
3887             {
3888               do_debugging = 0;
3889               dwarf_select_sections_by_letters (optarg);
3890             }
3891           break;
3892         case OPTION_DEBUG_DUMP:
3893           do_dump++;
3894           if (optarg == 0)
3895             do_debugging = 1;
3896           else
3897             {
3898               do_debugging = 0;
3899               dwarf_select_sections_by_names (optarg);
3900             }
3901           break;
3902         case OPTION_DWARF_DEPTH:
3903           {
3904             char *cp;
3905
3906             dwarf_cutoff_level = strtoul (optarg, & cp, 0);
3907           }
3908           break;
3909         case OPTION_DWARF_START:
3910           {
3911             char *cp;
3912
3913             dwarf_start_die = strtoul (optarg, & cp, 0);
3914           }
3915           break;
3916         case OPTION_DWARF_CHECK:
3917           dwarf_check = 1;
3918           break;
3919         case OPTION_DYN_SYMS:
3920           do_dyn_syms++;
3921           break;
3922 #ifdef SUPPORT_DISASSEMBLY
3923         case 'i':
3924           request_dump (DISASS_DUMP);
3925           break;
3926 #endif
3927         case 'v':
3928           print_version (program_name);
3929           break;
3930         case 'V':
3931           do_version++;
3932           break;
3933         case 'W':
3934           do_wide++;
3935           break;
3936         default:
3937           /* xgettext:c-format */
3938           error (_("Invalid option '-%c'\n"), c);
3939           /* Drop through.  */
3940         case '?':
3941           usage (stderr);
3942         }
3943     }
3944
3945   if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
3946       && !do_segments && !do_header && !do_dump && !do_version
3947       && !do_histogram && !do_debugging && !do_arch && !do_notes
3948       && !do_section_groups && !do_archive_index
3949       && !do_dyn_syms)
3950     usage (stderr);
3951   else if (argc < 3)
3952     {
3953       warn (_("Nothing to do.\n"));
3954       usage (stderr);
3955     }
3956 }
3957
3958 static const char *
3959 get_elf_class (unsigned int elf_class)
3960 {
3961   static char buff[32];
3962
3963   switch (elf_class)
3964     {
3965     case ELFCLASSNONE: return _("none");
3966     case ELFCLASS32:   return "ELF32";
3967     case ELFCLASS64:   return "ELF64";
3968     default:
3969       snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
3970       return buff;
3971     }
3972 }
3973
3974 static const char *
3975 get_data_encoding (unsigned int encoding)
3976 {
3977   static char buff[32];
3978
3979   switch (encoding)
3980     {
3981     case ELFDATANONE: return _("none");
3982     case ELFDATA2LSB: return _("2's complement, little endian");
3983     case ELFDATA2MSB: return _("2's complement, big endian");
3984     default:
3985       snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
3986       return buff;
3987     }
3988 }
3989
3990 /* Decode the data held in 'elf_header'.  */
3991
3992 static int
3993 process_file_header (void)
3994 {
3995   if (   elf_header.e_ident[EI_MAG0] != ELFMAG0
3996       || elf_header.e_ident[EI_MAG1] != ELFMAG1
3997       || elf_header.e_ident[EI_MAG2] != ELFMAG2
3998       || elf_header.e_ident[EI_MAG3] != ELFMAG3)
3999     {
4000       error
4001         (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
4002       return 0;
4003     }
4004
4005   init_dwarf_regnames (elf_header.e_machine);
4006
4007   if (do_header)
4008     {
4009       int i;
4010
4011       printf (_("ELF Header:\n"));
4012       printf (_("  Magic:   "));
4013       for (i = 0; i < EI_NIDENT; i++)
4014         printf ("%2.2x ", elf_header.e_ident[i]);
4015       printf ("\n");
4016       printf (_("  Class:                             %s\n"),
4017               get_elf_class (elf_header.e_ident[EI_CLASS]));
4018       printf (_("  Data:                              %s\n"),
4019               get_data_encoding (elf_header.e_ident[EI_DATA]));
4020       printf (_("  Version:                           %d %s\n"),
4021               elf_header.e_ident[EI_VERSION],
4022               (elf_header.e_ident[EI_VERSION] == EV_CURRENT
4023                ? "(current)"
4024                : (elf_header.e_ident[EI_VERSION] != EV_NONE
4025                   ? _("<unknown: %lx>")
4026                   : "")));
4027       printf (_("  OS/ABI:                            %s\n"),
4028               get_osabi_name (elf_header.e_ident[EI_OSABI]));
4029       printf (_("  ABI Version:                       %d\n"),
4030               elf_header.e_ident[EI_ABIVERSION]);
4031       printf (_("  Type:                              %s\n"),
4032               get_file_type (elf_header.e_type));
4033       printf (_("  Machine:                           %s\n"),
4034               get_machine_name (elf_header.e_machine));
4035       printf (_("  Version:                           0x%lx\n"),
4036               (unsigned long) elf_header.e_version);
4037
4038       printf (_("  Entry point address:               "));
4039       print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4040       printf (_("\n  Start of program headers:          "));
4041       print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4042       printf (_(" (bytes into file)\n  Start of section headers:          "));
4043       print_vma ((bfd_vma) elf_header.e_shoff, DEC);
4044       printf (_(" (bytes into file)\n"));
4045
4046       printf (_("  Flags:                             0x%lx%s\n"),
4047               (unsigned long) elf_header.e_flags,
4048               get_machine_flags (elf_header.e_flags, elf_header.e_machine));
4049       printf (_("  Size of this header:               %ld (bytes)\n"),
4050               (long) elf_header.e_ehsize);
4051       printf (_("  Size of program headers:           %ld (bytes)\n"),
4052               (long) elf_header.e_phentsize);
4053       printf (_("  Number of program headers:         %ld"),
4054               (long) elf_header.e_phnum);
4055       if (section_headers != NULL
4056           && elf_header.e_phnum == PN_XNUM
4057           && section_headers[0].sh_info != 0)
4058         printf (" (%ld)", (long) section_headers[0].sh_info);
4059       putc ('\n', stdout);
4060       printf (_("  Size of section headers:           %ld (bytes)\n"),
4061               (long) elf_header.e_shentsize);
4062       printf (_("  Number of section headers:         %ld"),
4063               (long) elf_header.e_shnum);
4064       if (section_headers != NULL && elf_header.e_shnum == SHN_UNDEF)
4065         printf (" (%ld)", (long) section_headers[0].sh_size);
4066       putc ('\n', stdout);
4067       printf (_("  Section header string table index: %ld"),
4068               (long) elf_header.e_shstrndx);
4069       if (section_headers != NULL
4070           && elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
4071         printf (" (%u)", section_headers[0].sh_link);
4072       else if (elf_header.e_shstrndx != SHN_UNDEF
4073                && elf_header.e_shstrndx >= elf_header.e_shnum)
4074         printf (_(" <corrupt: out of range>"));
4075       putc ('\n', stdout);
4076     }
4077
4078   if (section_headers != NULL)
4079     {
4080       if (elf_header.e_phnum == PN_XNUM
4081           && section_headers[0].sh_info != 0)
4082         elf_header.e_phnum = section_headers[0].sh_info;
4083       if (elf_header.e_shnum == SHN_UNDEF)
4084         elf_header.e_shnum = section_headers[0].sh_size;
4085       if (elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
4086         elf_header.e_shstrndx = section_headers[0].sh_link;
4087       else if (elf_header.e_shstrndx >= elf_header.e_shnum)
4088         elf_header.e_shstrndx = SHN_UNDEF;
4089       free (section_headers);
4090       section_headers = NULL;
4091     }
4092
4093   return 1;
4094 }
4095
4096
4097 static int
4098 get_32bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
4099 {
4100   Elf32_External_Phdr * phdrs;
4101   Elf32_External_Phdr * external;
4102   Elf_Internal_Phdr *   internal;
4103   unsigned int i;
4104
4105   phdrs = (Elf32_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
4106                                             elf_header.e_phentsize,
4107                                             elf_header.e_phnum,
4108                                             _("program headers"));
4109   if (!phdrs)
4110     return 0;
4111
4112   for (i = 0, internal = pheaders, external = phdrs;
4113        i < elf_header.e_phnum;
4114        i++, internal++, external++)
4115     {
4116       internal->p_type   = BYTE_GET (external->p_type);
4117       internal->p_offset = BYTE_GET (external->p_offset);
4118       internal->p_vaddr  = BYTE_GET (external->p_vaddr);
4119       internal->p_paddr  = BYTE_GET (external->p_paddr);
4120       internal->p_filesz = BYTE_GET (external->p_filesz);
4121       internal->p_memsz  = BYTE_GET (external->p_memsz);
4122       internal->p_flags  = BYTE_GET (external->p_flags);
4123       internal->p_align  = BYTE_GET (external->p_align);
4124     }
4125
4126   free (phdrs);
4127
4128   return 1;
4129 }
4130
4131 static int
4132 get_64bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
4133 {
4134   Elf64_External_Phdr * phdrs;
4135   Elf64_External_Phdr * external;
4136   Elf_Internal_Phdr *   internal;
4137   unsigned int i;
4138
4139   phdrs = (Elf64_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
4140                                             elf_header.e_phentsize,
4141                                             elf_header.e_phnum,
4142                                             _("program headers"));
4143   if (!phdrs)
4144     return 0;
4145
4146   for (i = 0, internal = pheaders, external = phdrs;
4147        i < elf_header.e_phnum;
4148        i++, internal++, external++)
4149     {
4150       internal->p_type   = BYTE_GET (external->p_type);
4151       internal->p_flags  = BYTE_GET (external->p_flags);
4152       internal->p_offset = BYTE_GET (external->p_offset);
4153       internal->p_vaddr  = BYTE_GET (external->p_vaddr);
4154       internal->p_paddr  = BYTE_GET (external->p_paddr);
4155       internal->p_filesz = BYTE_GET (external->p_filesz);
4156       internal->p_memsz  = BYTE_GET (external->p_memsz);
4157       internal->p_align  = BYTE_GET (external->p_align);
4158     }
4159
4160   free (phdrs);
4161
4162   return 1;
4163 }
4164
4165 /* Returns 1 if the program headers were read into `program_headers'.  */
4166
4167 static int
4168 get_program_headers (FILE * file)
4169 {
4170   Elf_Internal_Phdr * phdrs;
4171
4172   /* Check cache of prior read.  */
4173   if (program_headers != NULL)
4174     return 1;
4175
4176   phdrs = (Elf_Internal_Phdr *) cmalloc (elf_header.e_phnum,
4177                                          sizeof (Elf_Internal_Phdr));
4178
4179   if (phdrs == NULL)
4180     {
4181       error (_("Out of memory\n"));
4182       return 0;
4183     }
4184
4185   if (is_32bit_elf
4186       ? get_32bit_program_headers (file, phdrs)
4187       : get_64bit_program_headers (file, phdrs))
4188     {
4189       program_headers = phdrs;
4190       return 1;
4191     }
4192
4193   free (phdrs);
4194   return 0;
4195 }
4196
4197 /* Returns 1 if the program headers were loaded.  */
4198
4199 static int
4200 process_program_headers (FILE * file)
4201 {
4202   Elf_Internal_Phdr * segment;
4203   unsigned int i;
4204
4205   if (elf_header.e_phnum == 0)
4206     {
4207       /* PR binutils/12467.  */
4208       if (elf_header.e_phoff != 0)
4209         warn (_("possibly corrupt ELF header - it has a non-zero program"
4210                 " header offset, but no program headers"));
4211       else if (do_segments)
4212         printf (_("\nThere are no program headers in this file.\n"));
4213       return 0;
4214     }
4215
4216   if (do_segments && !do_header)
4217     {
4218       printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
4219       printf (_("Entry point "));
4220       print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4221       printf (_("\nThere are %d program headers, starting at offset "),
4222               elf_header.e_phnum);
4223       print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4224       printf ("\n");
4225     }
4226
4227   if (! get_program_headers (file))
4228       return 0;
4229
4230   if (do_segments)
4231     {
4232       if (elf_header.e_phnum > 1)
4233         printf (_("\nProgram Headers:\n"));
4234       else
4235         printf (_("\nProgram Headers:\n"));
4236
4237       if (is_32bit_elf)
4238         printf
4239           (_("  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align\n"));
4240       else if (do_wide)
4241         printf
4242           (_("  Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align\n"));
4243       else
4244         {
4245           printf
4246             (_("  Type           Offset             VirtAddr           PhysAddr\n"));
4247           printf
4248             (_("                 FileSiz            MemSiz              Flags  Align\n"));
4249         }
4250     }
4251
4252   dynamic_addr = 0;
4253   dynamic_size = 0;
4254
4255   for (i = 0, segment = program_headers;
4256        i < elf_header.e_phnum;
4257        i++, segment++)
4258     {
4259       if (do_segments)
4260         {
4261           printf ("  %-14.14s ", get_segment_type (segment->p_type));
4262
4263           if (is_32bit_elf)
4264             {
4265               printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4266               printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
4267               printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
4268               printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
4269               printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
4270               printf ("%c%c%c ",
4271                       (segment->p_flags & PF_R ? 'R' : ' '),
4272                       (segment->p_flags & PF_W ? 'W' : ' '),
4273                       (segment->p_flags & PF_X ? 'E' : ' '));
4274               printf ("%#lx", (unsigned long) segment->p_align);
4275             }
4276           else if (do_wide)
4277             {
4278               if ((unsigned long) segment->p_offset == segment->p_offset)
4279                 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4280               else
4281                 {
4282                   print_vma (segment->p_offset, FULL_HEX);
4283                   putchar (' ');
4284                 }
4285
4286               print_vma (segment->p_vaddr, FULL_HEX);
4287               putchar (' ');
4288               print_vma (segment->p_paddr, FULL_HEX);
4289               putchar (' ');
4290
4291               if ((unsigned long) segment->p_filesz == segment->p_filesz)
4292                 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
4293               else
4294                 {
4295                   print_vma (segment->p_filesz, FULL_HEX);
4296                   putchar (' ');
4297                 }
4298
4299               if ((unsigned long) segment->p_memsz == segment->p_memsz)
4300                 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
4301               else
4302                 {
4303                   print_vma (segment->p_memsz, FULL_HEX);
4304                 }
4305
4306               printf (" %c%c%c ",
4307                       (segment->p_flags & PF_R ? 'R' : ' '),
4308                       (segment->p_flags & PF_W ? 'W' : ' '),
4309                       (segment->p_flags & PF_X ? 'E' : ' '));
4310
4311               if ((unsigned long) segment->p_align == segment->p_align)
4312                 printf ("%#lx", (unsigned long) segment->p_align);
4313               else
4314                 {
4315                   print_vma (segment->p_align, PREFIX_HEX);
4316                 }
4317             }
4318           else
4319             {
4320               print_vma (segment->p_offset, FULL_HEX);
4321               putchar (' ');
4322               print_vma (segment->p_vaddr, FULL_HEX);
4323               putchar (' ');
4324               print_vma (segment->p_paddr, FULL_HEX);
4325               printf ("\n                 ");
4326               print_vma (segment->p_filesz, FULL_HEX);
4327               putchar (' ');
4328               print_vma (segment->p_memsz, FULL_HEX);
4329               printf ("  %c%c%c    ",
4330                       (segment->p_flags & PF_R ? 'R' : ' '),
4331                       (segment->p_flags & PF_W ? 'W' : ' '),
4332                       (segment->p_flags & PF_X ? 'E' : ' '));
4333               print_vma (segment->p_align, HEX);
4334             }
4335         }
4336
4337       switch (segment->p_type)
4338         {
4339         case PT_DYNAMIC:
4340           if (dynamic_addr)
4341             error (_("more than one dynamic segment\n"));
4342
4343           /* By default, assume that the .dynamic section is the first
4344              section in the DYNAMIC segment.  */
4345           dynamic_addr = segment->p_offset;
4346           dynamic_size = segment->p_filesz;
4347
4348           /* Try to locate the .dynamic section. If there is
4349              a section header table, we can easily locate it.  */
4350           if (section_headers != NULL)
4351             {
4352               Elf_Internal_Shdr * sec;
4353
4354               sec = find_section (".dynamic");
4355               if (sec == NULL || sec->sh_size == 0)
4356                 {
4357                   /* A corresponding .dynamic section is expected, but on
4358                      IA-64/OpenVMS it is OK for it to be missing.  */
4359                   if (!is_ia64_vms ())
4360                     error (_("no .dynamic section in the dynamic segment\n"));
4361                   break;
4362                 }
4363
4364               if (sec->sh_type == SHT_NOBITS)
4365                 {
4366                   dynamic_size = 0;
4367                   break;
4368                 }
4369
4370               dynamic_addr = sec->sh_offset;
4371               dynamic_size = sec->sh_size;
4372
4373               if (dynamic_addr < segment->p_offset
4374                   || dynamic_addr > segment->p_offset + segment->p_filesz)
4375                 warn (_("the .dynamic section is not contained"
4376                         " within the dynamic segment\n"));
4377               else if (dynamic_addr > segment->p_offset)
4378                 warn (_("the .dynamic section is not the first section"
4379                         " in the dynamic segment.\n"));
4380             }
4381           break;
4382
4383         case PT_INTERP:
4384           if (fseek (file, archive_file_offset + (long) segment->p_offset,
4385                      SEEK_SET))
4386             error (_("Unable to find program interpreter name\n"));
4387           else
4388             {
4389               char fmt [32];
4390               int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX);
4391
4392               if (ret >= (int) sizeof (fmt) || ret < 0)
4393                 error (_("Internal error: failed to create format string to display program interpreter\n"));
4394
4395               program_interpreter[0] = 0;
4396               if (fscanf (file, fmt, program_interpreter) <= 0)
4397                 error (_("Unable to read program interpreter name\n"));
4398
4399               if (do_segments)
4400                 printf (_("\n      [Requesting program interpreter: %s]"),
4401                     program_interpreter);
4402             }
4403           break;
4404         }
4405
4406       if (do_segments)
4407         putc ('\n', stdout);
4408     }
4409
4410   if (do_segments && section_headers != NULL && string_table != NULL)
4411     {
4412       printf (_("\n Section to Segment mapping:\n"));
4413       printf (_("  Segment Sections...\n"));
4414
4415       for (i = 0; i < elf_header.e_phnum; i++)
4416         {
4417           unsigned int j;
4418           Elf_Internal_Shdr * section;
4419
4420           segment = program_headers + i;
4421           section = section_headers + 1;
4422
4423           printf ("   %2.2d     ", i);
4424
4425           for (j = 1; j < elf_header.e_shnum; j++, section++)
4426             {
4427               if (!ELF_TBSS_SPECIAL (section, segment)
4428                   && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
4429                 printf ("%s ", SECTION_NAME (section));
4430             }
4431
4432           putc ('\n',stdout);
4433         }
4434     }
4435
4436   return 1;
4437 }
4438
4439
4440 /* Find the file offset corresponding to VMA by using the program headers.  */
4441
4442 static long
4443 offset_from_vma (FILE * file, bfd_vma vma, bfd_size_type size)
4444 {
4445   Elf_Internal_Phdr * seg;
4446
4447   if (! get_program_headers (file))
4448     {
4449       warn (_("Cannot interpret virtual addresses without program headers.\n"));
4450       return (long) vma;
4451     }
4452
4453   for (seg = program_headers;
4454        seg < program_headers + elf_header.e_phnum;
4455        ++seg)
4456     {
4457       if (seg->p_type != PT_LOAD)
4458         continue;
4459
4460       if (vma >= (seg->p_vaddr & -seg->p_align)
4461           && vma + size <= seg->p_vaddr + seg->p_filesz)
4462         return vma - seg->p_vaddr + seg->p_offset;
4463     }
4464
4465   warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
4466         (unsigned long) vma);
4467   return (long) vma;
4468 }
4469
4470
4471 static int
4472 get_32bit_section_headers (FILE * file, unsigned int num)
4473 {
4474   Elf32_External_Shdr * shdrs;
4475   Elf_Internal_Shdr *   internal;
4476   unsigned int i;
4477
4478   shdrs = (Elf32_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
4479                                             elf_header.e_shentsize, num,
4480                                             _("section headers"));
4481   if (!shdrs)
4482     return 0;
4483
4484   section_headers = (Elf_Internal_Shdr *) cmalloc (num,
4485                                                    sizeof (Elf_Internal_Shdr));
4486
4487   if (section_headers == NULL)
4488     {
4489       error (_("Out of memory\n"));
4490       return 0;
4491     }
4492
4493   for (i = 0, internal = section_headers;
4494        i < num;
4495        i++, internal++)
4496     {
4497       internal->sh_name      = BYTE_GET (shdrs[i].sh_name);
4498       internal->sh_type      = BYTE_GET (shdrs[i].sh_type);
4499       internal->sh_flags     = BYTE_GET (shdrs[i].sh_flags);
4500       internal->sh_addr      = BYTE_GET (shdrs[i].sh_addr);
4501       internal->sh_offset    = BYTE_GET (shdrs[i].sh_offset);
4502       internal->sh_size      = BYTE_GET (shdrs[i].sh_size);
4503       internal->sh_link      = BYTE_GET (shdrs[i].sh_link);
4504       internal->sh_info      = BYTE_GET (shdrs[i].sh_info);
4505       internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
4506       internal->sh_entsize   = BYTE_GET (shdrs[i].sh_entsize);
4507     }
4508
4509   free (shdrs);
4510
4511   return 1;
4512 }
4513
4514 static int
4515 get_64bit_section_headers (FILE * file, unsigned int num)
4516 {
4517   Elf64_External_Shdr * shdrs;
4518   Elf_Internal_Shdr *   internal;
4519   unsigned int i;
4520
4521   shdrs = (Elf64_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
4522                                             elf_header.e_shentsize, num,
4523                                             _("section headers"));
4524   if (!shdrs)
4525     return 0;
4526
4527   section_headers = (Elf_Internal_Shdr *) cmalloc (num,
4528                                                    sizeof (Elf_Internal_Shdr));
4529
4530   if (section_headers == NULL)
4531     {
4532       error (_("Out of memory\n"));
4533       return 0;
4534     }
4535
4536   for (i = 0, internal = section_headers;
4537        i < num;
4538        i++, internal++)
4539     {
4540       internal->sh_name      = BYTE_GET (shdrs[i].sh_name);
4541       internal->sh_type      = BYTE_GET (shdrs[i].sh_type);
4542       internal->sh_flags     = BYTE_GET (shdrs[i].sh_flags);
4543       internal->sh_addr      = BYTE_GET (shdrs[i].sh_addr);
4544       internal->sh_size      = BYTE_GET (shdrs[i].sh_size);
4545       internal->sh_entsize   = BYTE_GET (shdrs[i].sh_entsize);
4546       internal->sh_link      = BYTE_GET (shdrs[i].sh_link);
4547       internal->sh_info      = BYTE_GET (shdrs[i].sh_info);
4548       internal->sh_offset    = BYTE_GET (shdrs[i].sh_offset);
4549       internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
4550     }
4551
4552   free (shdrs);
4553
4554   return 1;
4555 }
4556
4557 static Elf_Internal_Sym *
4558 get_32bit_elf_symbols (FILE * file,
4559                        Elf_Internal_Shdr * section,
4560                        unsigned long * num_syms_return)
4561 {
4562   unsigned long number = 0;
4563   Elf32_External_Sym * esyms = NULL;
4564   Elf_External_Sym_Shndx * shndx = NULL;
4565   Elf_Internal_Sym * isyms = NULL;
4566   Elf_Internal_Sym * psym;
4567   unsigned int j;
4568
4569   /* Run some sanity checks first.  */
4570   if (section->sh_entsize == 0)
4571     {
4572       error (_("sh_entsize is zero\n"));
4573       goto exit_point;
4574     }
4575
4576   number = section->sh_size / section->sh_entsize;
4577
4578   if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
4579     {
4580       error (_("Invalid sh_entsize\n"));
4581       goto exit_point;
4582     }
4583
4584   esyms = (Elf32_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
4585                                            section->sh_size, _("symbols"));
4586   if (esyms == NULL)
4587     goto exit_point;
4588
4589   shndx = NULL;
4590   if (symtab_shndx_hdr != NULL
4591       && (symtab_shndx_hdr->sh_link
4592           == (unsigned long) (section - section_headers)))
4593     {
4594       shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
4595                                                    symtab_shndx_hdr->sh_offset,
4596                                                    1, symtab_shndx_hdr->sh_size,
4597                                                    _("symbol table section indicies"));
4598       if (shndx == NULL)
4599         goto exit_point;
4600     }
4601
4602   isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
4603
4604   if (isyms == NULL)
4605     {
4606       error (_("Out of memory\n"));
4607       goto exit_point;
4608     }
4609
4610   for (j = 0, psym = isyms; j < number; j++, psym++)
4611     {
4612       psym->st_name  = BYTE_GET (esyms[j].st_name);
4613       psym->st_value = BYTE_GET (esyms[j].st_value);
4614       psym->st_size  = BYTE_GET (esyms[j].st_size);
4615       psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
4616       if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
4617         psym->st_shndx
4618           = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
4619       else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
4620         psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
4621       psym->st_info  = BYTE_GET (esyms[j].st_info);
4622       psym->st_other = BYTE_GET (esyms[j].st_other);
4623     }
4624
4625  exit_point:
4626   if (shndx != NULL)
4627     free (shndx);
4628   if (esyms != NULL)
4629     free (esyms);
4630
4631   if (num_syms_return != NULL)
4632     * num_syms_return = isyms == NULL ? 0 : number;
4633
4634   return isyms;
4635 }
4636
4637 static Elf_Internal_Sym *
4638 get_64bit_elf_symbols (FILE * file,
4639                        Elf_Internal_Shdr * section,
4640                        unsigned long * num_syms_return)
4641 {
4642   unsigned long number = 0;
4643   Elf64_External_Sym * esyms = NULL;
4644   Elf_External_Sym_Shndx * shndx = NULL;
4645   Elf_Internal_Sym * isyms = NULL;
4646   Elf_Internal_Sym * psym;
4647   unsigned int j;
4648
4649   /* Run some sanity checks first.  */
4650   if (section->sh_entsize == 0)
4651     {
4652       error (_("sh_entsize is zero\n"));
4653       goto exit_point;
4654     }
4655
4656   number = section->sh_size / section->sh_entsize;
4657
4658   if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
4659     {
4660       error (_("Invalid sh_entsize\n"));
4661       goto exit_point;
4662     }
4663
4664   esyms = (Elf64_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
4665                                            section->sh_size, _("symbols"));
4666   if (!esyms)
4667     goto exit_point;
4668
4669   if (symtab_shndx_hdr != NULL
4670       && (symtab_shndx_hdr->sh_link
4671           == (unsigned long) (section - section_headers)))
4672     {
4673       shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
4674                                                    symtab_shndx_hdr->sh_offset,
4675                                                    1, symtab_shndx_hdr->sh_size,
4676                                                    _("symbol table section indicies"));
4677       if (shndx == NULL)
4678         goto exit_point;
4679     }
4680
4681   isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
4682
4683   if (isyms == NULL)
4684     {
4685       error (_("Out of memory\n"));
4686       goto exit_point;
4687     }
4688
4689   for (j = 0, psym = isyms; j < number; j++, psym++)
4690     {
4691       psym->st_name  = BYTE_GET (esyms[j].st_name);
4692       psym->st_info  = BYTE_GET (esyms[j].st_info);
4693       psym->st_other = BYTE_GET (esyms[j].st_other);
4694       psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
4695
4696       if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
4697         psym->st_shndx
4698           = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
4699       else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
4700         psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
4701
4702       psym->st_value = BYTE_GET (esyms[j].st_value);
4703       psym->st_size  = BYTE_GET (esyms[j].st_size);
4704     }
4705
4706  exit_point:
4707   if (shndx != NULL)
4708     free (shndx);
4709   if (esyms != NULL)
4710     free (esyms);
4711
4712   if (num_syms_return != NULL)
4713     * num_syms_return = isyms == NULL ? 0 : number;
4714
4715   return isyms;
4716 }
4717
4718 static const char *
4719 get_elf_section_flags (bfd_vma sh_flags)
4720 {
4721   static char buff[1024];
4722   char * p = buff;
4723   int field_size = is_32bit_elf ? 8 : 16;
4724   int sindex;
4725   int size = sizeof (buff) - (field_size + 4 + 1);
4726   bfd_vma os_flags = 0;
4727   bfd_vma proc_flags = 0;
4728   bfd_vma unknown_flags = 0;
4729   static const struct
4730     {
4731       const char * str;
4732       int len;
4733     }
4734   flags [] =
4735     {
4736       /*  0 */ { STRING_COMMA_LEN ("WRITE") },
4737       /*  1 */ { STRING_COMMA_LEN ("ALLOC") },
4738       /*  2 */ { STRING_COMMA_LEN ("EXEC") },
4739       /*  3 */ { STRING_COMMA_LEN ("MERGE") },
4740       /*  4 */ { STRING_COMMA_LEN ("STRINGS") },
4741       /*  5 */ { STRING_COMMA_LEN ("INFO LINK") },
4742       /*  6 */ { STRING_COMMA_LEN ("LINK ORDER") },
4743       /*  7 */ { STRING_COMMA_LEN ("OS NONCONF") },
4744       /*  8 */ { STRING_COMMA_LEN ("GROUP") },
4745       /*  9 */ { STRING_COMMA_LEN ("TLS") },
4746       /* IA-64 specific.  */
4747       /* 10 */ { STRING_COMMA_LEN ("SHORT") },
4748       /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
4749       /* IA-64 OpenVMS specific.  */
4750       /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
4751       /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
4752       /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
4753       /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
4754       /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
4755       /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
4756       /* Generic.  */
4757       /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
4758       /* SPARC specific.  */
4759       /* 19 */ { STRING_COMMA_LEN ("ORDERED") }
4760     };
4761
4762   if (do_section_details)
4763     {
4764       sprintf (buff, "[%*.*lx]: ",
4765                field_size, field_size, (unsigned long) sh_flags);
4766       p += field_size + 4;
4767     }
4768
4769   while (sh_flags)
4770     {
4771       bfd_vma flag;
4772
4773       flag = sh_flags & - sh_flags;
4774       sh_flags &= ~ flag;
4775
4776       if (do_section_details)
4777         {
4778           switch (flag)
4779             {
4780             case SHF_WRITE:             sindex = 0; break;
4781             case SHF_ALLOC:             sindex = 1; break;
4782             case SHF_EXECINSTR:         sindex = 2; break;
4783             case SHF_MERGE:             sindex = 3; break;
4784             case SHF_STRINGS:           sindex = 4; break;
4785             case SHF_INFO_LINK:         sindex = 5; break;
4786             case SHF_LINK_ORDER:        sindex = 6; break;
4787             case SHF_OS_NONCONFORMING:  sindex = 7; break;
4788             case SHF_GROUP:             sindex = 8; break;
4789             case SHF_TLS:               sindex = 9; break;
4790             case SHF_EXCLUDE:           sindex = 18; break;
4791
4792             default:
4793               sindex = -1;
4794               switch (elf_header.e_machine)
4795                 {
4796                 case EM_IA_64:
4797                   if (flag == SHF_IA_64_SHORT)
4798                     sindex = 10;
4799                   else if (flag == SHF_IA_64_NORECOV)
4800                     sindex = 11;
4801 #ifdef BFD64
4802                   else if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
4803                     switch (flag)
4804                       {
4805                       case SHF_IA_64_VMS_GLOBAL:      sindex = 12; break;
4806                       case SHF_IA_64_VMS_OVERLAID:    sindex = 13; break;
4807                       case SHF_IA_64_VMS_SHARED:      sindex = 14; break;
4808                       case SHF_IA_64_VMS_VECTOR:      sindex = 15; break;
4809                       case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
4810                       case SHF_IA_64_VMS_PROTECTED:   sindex = 17; break;
4811                       default:                        break;
4812                       }
4813 #endif
4814                   break;
4815
4816                 case EM_386:
4817                 case EM_486:
4818                 case EM_X86_64:
4819                 case EM_L1OM:
4820                 case EM_K1OM:
4821                 case EM_OLD_SPARCV9:
4822                 case EM_SPARC32PLUS:
4823                 case EM_SPARCV9:
4824                 case EM_SPARC:
4825                   if (flag == SHF_ORDERED)
4826                     sindex = 19;
4827                   break;
4828                 default:
4829                   break;
4830                 }
4831             }
4832
4833           if (sindex != -1)
4834             {
4835               if (p != buff + field_size + 4)
4836                 {
4837                   if (size < (10 + 2))
4838                     abort ();
4839                   size -= 2;
4840                   *p++ = ',';
4841                   *p++ = ' ';
4842                 }
4843
4844               size -= flags [sindex].len;
4845               p = stpcpy (p, flags [sindex].str);
4846             }
4847           else if (flag & SHF_MASKOS)
4848             os_flags |= flag;
4849           else if (flag & SHF_MASKPROC)
4850             proc_flags |= flag;
4851           else
4852             unknown_flags |= flag;
4853         }
4854       else
4855         {
4856           switch (flag)
4857             {
4858             case SHF_WRITE:             *p = 'W'; break;
4859             case SHF_ALLOC:             *p = 'A'; break;
4860             case SHF_EXECINSTR:         *p = 'X'; break;
4861             case SHF_MERGE:             *p = 'M'; break;
4862             case SHF_STRINGS:           *p = 'S'; break;
4863             case SHF_INFO_LINK:         *p = 'I'; break;
4864             case SHF_LINK_ORDER:        *p = 'L'; break;
4865             case SHF_OS_NONCONFORMING:  *p = 'O'; break;
4866             case SHF_GROUP:             *p = 'G'; break;
4867             case SHF_TLS:               *p = 'T'; break;
4868             case SHF_EXCLUDE:           *p = 'E'; break;
4869
4870             default:
4871               if ((elf_header.e_machine == EM_X86_64
4872                    || elf_header.e_machine == EM_L1OM
4873                    || elf_header.e_machine == EM_K1OM)
4874                   && flag == SHF_X86_64_LARGE)
4875                 *p = 'l';
4876               else if (flag & SHF_MASKOS)
4877                 {
4878                   *p = 'o';
4879                   sh_flags &= ~ SHF_MASKOS;
4880                 }
4881               else if (flag & SHF_MASKPROC)
4882                 {
4883                   *p = 'p';
4884                   sh_flags &= ~ SHF_MASKPROC;
4885                 }
4886               else
4887                 *p = 'x';
4888               break;
4889             }
4890           p++;
4891         }
4892     }
4893
4894   if (do_section_details)
4895     {
4896       if (os_flags)
4897         {
4898           size -= 5 + field_size;
4899           if (p != buff + field_size + 4)
4900             {
4901               if (size < (2 + 1))
4902                 abort ();
4903               size -= 2;
4904               *p++ = ',';
4905               *p++ = ' ';
4906             }
4907           sprintf (p, "OS (%*.*lx)", field_size, field_size,
4908                    (unsigned long) os_flags);
4909           p += 5 + field_size;
4910         }
4911       if (proc_flags)
4912         {
4913           size -= 7 + field_size;
4914           if (p != buff + field_size + 4)
4915             {
4916               if (size < (2 + 1))
4917                 abort ();
4918               size -= 2;
4919               *p++ = ',';
4920               *p++ = ' ';
4921             }
4922           sprintf (p, "PROC (%*.*lx)", field_size, field_size,
4923                    (unsigned long) proc_flags);
4924           p += 7 + field_size;
4925         }
4926       if (unknown_flags)
4927         {
4928           size -= 10 + field_size;
4929           if (p != buff + field_size + 4)
4930             {
4931               if (size < (2 + 1))
4932                 abort ();
4933               size -= 2;
4934               *p++ = ',';
4935               *p++ = ' ';
4936             }
4937           sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
4938                    (unsigned long) unknown_flags);
4939           p += 10 + field_size;
4940         }
4941     }
4942
4943   *p = '\0';
4944   return buff;
4945 }
4946
4947 static int
4948 process_section_headers (FILE * file)
4949 {
4950   Elf_Internal_Shdr * section;
4951   unsigned int i;
4952
4953   section_headers = NULL;
4954
4955   if (elf_header.e_shnum == 0)
4956     {
4957       /* PR binutils/12467.  */
4958       if (elf_header.e_shoff != 0)
4959         warn (_("possibly corrupt ELF file header - it has a non-zero"
4960                 " section header offset, but no section headers\n"));
4961       else if (do_sections)
4962         printf (_("\nThere are no sections in this file.\n"));
4963
4964       return 1;
4965     }
4966
4967   if (do_sections && !do_header)
4968     printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
4969             elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
4970
4971   if (is_32bit_elf)
4972     {
4973       if (! get_32bit_section_headers (file, elf_header.e_shnum))
4974         return 0;
4975     }
4976   else if (! get_64bit_section_headers (file, elf_header.e_shnum))
4977     return 0;
4978
4979   /* Read in the string table, so that we have names to display.  */
4980   if (elf_header.e_shstrndx != SHN_UNDEF
4981        && elf_header.e_shstrndx < elf_header.e_shnum)
4982     {
4983       section = section_headers + elf_header.e_shstrndx;
4984
4985       if (section->sh_size != 0)
4986         {
4987           string_table = (char *) get_data (NULL, file, section->sh_offset,
4988                                             1, section->sh_size,
4989                                             _("string table"));
4990
4991           string_table_length = string_table != NULL ? section->sh_size : 0;
4992         }
4993     }
4994
4995   /* Scan the sections for the dynamic symbol table
4996      and dynamic string table and debug sections.  */
4997   dynamic_symbols = NULL;
4998   dynamic_strings = NULL;
4999   dynamic_syminfo = NULL;
5000   symtab_shndx_hdr = NULL;
5001
5002   eh_addr_size = is_32bit_elf ? 4 : 8;
5003   switch (elf_header.e_machine)
5004     {
5005     case EM_MIPS:
5006     case EM_MIPS_RS3_LE:
5007       /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
5008          FDE addresses.  However, the ABI also has a semi-official ILP32
5009          variant for which the normal FDE address size rules apply.
5010
5011          GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
5012          section, where XX is the size of longs in bits.  Unfortunately,
5013          earlier compilers provided no way of distinguishing ILP32 objects
5014          from LP64 objects, so if there's any doubt, we should assume that
5015          the official LP64 form is being used.  */
5016       if ((elf_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
5017           && find_section (".gcc_compiled_long32") == NULL)
5018         eh_addr_size = 8;
5019       break;
5020
5021     case EM_H8_300:
5022     case EM_H8_300H:
5023       switch (elf_header.e_flags & EF_H8_MACH)
5024         {
5025         case E_H8_MACH_H8300:
5026         case E_H8_MACH_H8300HN:
5027         case E_H8_MACH_H8300SN:
5028         case E_H8_MACH_H8300SXN:
5029           eh_addr_size = 2;
5030           break;
5031         case E_H8_MACH_H8300H:
5032         case E_H8_MACH_H8300S:
5033         case E_H8_MACH_H8300SX:
5034           eh_addr_size = 4;
5035           break;
5036         }
5037       break;
5038
5039     case EM_M32C_OLD:
5040     case EM_M32C:
5041       switch (elf_header.e_flags & EF_M32C_CPU_MASK)
5042         {
5043         case EF_M32C_CPU_M16C:
5044           eh_addr_size = 2;
5045           break;
5046         }
5047       break;
5048     }
5049
5050 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
5051   do                                                                        \
5052     {                                                                       \
5053       bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64;      \
5054       if (section->sh_entsize != expected_entsize)                          \
5055         {                                                               \
5056           error (_("Section %d has invalid sh_entsize of %" BFD_VMA_FMT "x\n"), \
5057                  i, section->sh_entsize);       \
5058           error (_("(Using the expected size of %d for the rest of this dump)\n"), \
5059                    (int) expected_entsize); \
5060           section->sh_entsize = expected_entsize;                       \
5061         } \
5062     }                                                                       \
5063   while (0)
5064
5065 #define CHECK_ENTSIZE(section, i, type)                                 \
5066   CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type),         \
5067                         sizeof (Elf64_External_##type))
5068
5069   for (i = 0, section = section_headers;
5070        i < elf_header.e_shnum;
5071        i++, section++)
5072     {
5073       char * name = SECTION_NAME (section);
5074
5075       if (section->sh_type == SHT_DYNSYM)
5076         {
5077           if (dynamic_symbols != NULL)
5078             {
5079               error (_("File contains multiple dynamic symbol tables\n"));
5080               continue;
5081             }
5082
5083           CHECK_ENTSIZE (section, i, Sym);
5084           dynamic_symbols = GET_ELF_SYMBOLS (file, section, & num_dynamic_syms);
5085         }
5086       else if (section->sh_type == SHT_STRTAB
5087                && streq (name, ".dynstr"))
5088         {
5089           if (dynamic_strings != NULL)
5090             {
5091               error (_("File contains multiple dynamic string tables\n"));
5092               continue;
5093             }
5094
5095           dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
5096                                                1, section->sh_size,
5097                                                _("dynamic strings"));
5098           dynamic_strings_length = dynamic_strings == NULL ? 0 : section->sh_size;
5099         }
5100       else if (section->sh_type == SHT_SYMTAB_SHNDX)
5101         {
5102           if (symtab_shndx_hdr != NULL)
5103             {
5104               error (_("File contains multiple symtab shndx tables\n"));
5105               continue;
5106             }
5107           symtab_shndx_hdr = section;
5108         }
5109       else if (section->sh_type == SHT_SYMTAB)
5110         CHECK_ENTSIZE (section, i, Sym);
5111       else if (section->sh_type == SHT_GROUP)
5112         CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
5113       else if (section->sh_type == SHT_REL)
5114         CHECK_ENTSIZE (section, i, Rel);
5115       else if (section->sh_type == SHT_RELA)
5116         CHECK_ENTSIZE (section, i, Rela);
5117       else if ((do_debugging || do_debug_info || do_debug_abbrevs
5118                 || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
5119                 || do_debug_aranges || do_debug_frames || do_debug_macinfo
5120                 || do_debug_str || do_debug_loc || do_debug_ranges
5121                 || do_debug_addr || do_debug_cu_index)
5122                && (const_strneq (name, ".debug_")
5123                    || const_strneq (name, ".zdebug_")))
5124         {
5125           if (name[1] == 'z')
5126             name += sizeof (".zdebug_") - 1;
5127           else
5128             name += sizeof (".debug_") - 1;
5129
5130           if (do_debugging
5131               || (do_debug_info     && const_strneq (name, "info"))
5132               || (do_debug_info     && const_strneq (name, "types"))
5133               || (do_debug_abbrevs  && const_strneq (name, "abbrev"))
5134               || (do_debug_lines    && strcmp (name, "line") == 0)
5135               || (do_debug_lines    && const_strneq (name, "line."))
5136               || (do_debug_pubnames && const_strneq (name, "pubnames"))
5137               || (do_debug_pubtypes && const_strneq (name, "pubtypes"))
5138               || (do_debug_pubnames && const_strneq (name, "gnu_pubnames"))
5139               || (do_debug_pubtypes && const_strneq (name, "gnu_pubtypes"))
5140               || (do_debug_aranges  && const_strneq (name, "aranges"))
5141               || (do_debug_ranges   && const_strneq (name, "ranges"))
5142               || (do_debug_frames   && const_strneq (name, "frame"))
5143               || (do_debug_macinfo  && const_strneq (name, "macinfo"))
5144               || (do_debug_macinfo  && const_strneq (name, "macro"))
5145               || (do_debug_str      && const_strneq (name, "str"))
5146               || (do_debug_loc      && const_strneq (name, "loc"))
5147               || (do_debug_addr     && const_strneq (name, "addr"))
5148               || (do_debug_cu_index && const_strneq (name, "cu_index"))
5149               || (do_debug_cu_index && const_strneq (name, "tu_index"))
5150               )
5151             request_dump_bynumber (i, DEBUG_DUMP);
5152         }
5153       /* Linkonce section to be combined with .debug_info at link time.  */
5154       else if ((do_debugging || do_debug_info)
5155                && const_strneq (name, ".gnu.linkonce.wi."))
5156         request_dump_bynumber (i, DEBUG_DUMP);
5157       else if (do_debug_frames && streq (name, ".eh_frame"))
5158         request_dump_bynumber (i, DEBUG_DUMP);
5159       else if (do_gdb_index && streq (name, ".gdb_index"))
5160         request_dump_bynumber (i, DEBUG_DUMP);
5161       /* Trace sections for Itanium VMS.  */
5162       else if ((do_debugging || do_trace_info || do_trace_abbrevs
5163                 || do_trace_aranges)
5164                && const_strneq (name, ".trace_"))
5165         {
5166           name += sizeof (".trace_") - 1;
5167
5168           if (do_debugging
5169               || (do_trace_info     && streq (name, "info"))
5170               || (do_trace_abbrevs  && streq (name, "abbrev"))
5171               || (do_trace_aranges  && streq (name, "aranges"))
5172               )
5173             request_dump_bynumber (i, DEBUG_DUMP);
5174         }
5175
5176     }
5177
5178   if (! do_sections)
5179     return 1;
5180
5181   if (elf_header.e_shnum > 1)
5182     printf (_("\nSection Headers:\n"));
5183   else
5184     printf (_("\nSection Header:\n"));
5185
5186   if (is_32bit_elf)
5187     {
5188       if (do_section_details)
5189         {
5190           printf (_("  [Nr] Name\n"));
5191           printf (_("       Type            Addr     Off    Size   ES   Lk Inf Al\n"));
5192         }
5193       else
5194         printf
5195           (_("  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al\n"));
5196     }
5197   else if (do_wide)
5198     {
5199       if (do_section_details)
5200         {
5201           printf (_("  [Nr] Name\n"));
5202           printf (_("       Type            Address          Off    Size   ES   Lk Inf Al\n"));
5203         }
5204       else
5205         printf
5206           (_("  [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al\n"));
5207     }
5208   else
5209     {
5210       if (do_section_details)
5211         {
5212           printf (_("  [Nr] Name\n"));
5213           printf (_("       Type              Address          Offset            Link\n"));
5214           printf (_("       Size              EntSize          Info              Align\n"));
5215         }
5216       else
5217         {
5218           printf (_("  [Nr] Name              Type             Address           Offset\n"));
5219           printf (_("       Size              EntSize          Flags  Link  Info  Align\n"));
5220         }
5221     }
5222
5223   if (do_section_details)
5224     printf (_("       Flags\n"));
5225
5226   for (i = 0, section = section_headers;
5227        i < elf_header.e_shnum;
5228        i++, section++)
5229     {
5230       printf ("  [%2u] ", i);
5231       if (do_section_details)
5232         {
5233           print_symbol (INT_MAX, SECTION_NAME (section));
5234           printf ("\n      ");
5235         }
5236       else
5237         {
5238           print_symbol (-17, SECTION_NAME (section));
5239         }
5240
5241       printf (do_wide ? " %-15s " : " %-15.15s ",
5242               get_section_type_name (section->sh_type));
5243
5244       if (is_32bit_elf)
5245         {
5246           const char * link_too_big = NULL;
5247
5248           print_vma (section->sh_addr, LONG_HEX);
5249
5250           printf ( " %6.6lx %6.6lx %2.2lx",
5251                    (unsigned long) section->sh_offset,
5252                    (unsigned long) section->sh_size,
5253                    (unsigned long) section->sh_entsize);
5254
5255           if (do_section_details)
5256             fputs ("  ", stdout);
5257           else
5258             printf (" %3s ", get_elf_section_flags (section->sh_flags));
5259
5260           if (section->sh_link >= elf_header.e_shnum)
5261             {
5262               link_too_big = "";
5263               /* The sh_link value is out of range.  Normally this indicates
5264                  an error but it can have special values in Solaris binaries.  */
5265               switch (elf_header.e_machine)
5266                 {
5267                 case EM_386:
5268                 case EM_486:
5269                 case EM_X86_64:
5270                 case EM_L1OM:
5271                 case EM_K1OM:
5272                 case EM_OLD_SPARCV9:
5273                 case EM_SPARC32PLUS:
5274                 case EM_SPARCV9:
5275                 case EM_SPARC:
5276                   if (section->sh_link == (SHN_BEFORE & 0xffff))
5277                     link_too_big = "BEFORE";
5278                   else if (section->sh_link == (SHN_AFTER & 0xffff))
5279                     link_too_big = "AFTER";
5280                   break;
5281                 default:
5282                   break;
5283                 }
5284             }
5285
5286           if (do_section_details)
5287             {
5288               if (link_too_big != NULL && * link_too_big)
5289                 printf ("<%s> ", link_too_big);
5290               else
5291                 printf ("%2u ", section->sh_link);
5292               printf ("%3u %2lu\n", section->sh_info,
5293                       (unsigned long) section->sh_addralign);
5294             }
5295           else
5296             printf ("%2u %3u %2lu\n",
5297                     section->sh_link,
5298                     section->sh_info,
5299                     (unsigned long) section->sh_addralign);
5300
5301           if (link_too_big && ! * link_too_big)
5302             warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
5303                   i, section->sh_link);
5304         }
5305       else if (do_wide)
5306         {
5307           print_vma (section->sh_addr, LONG_HEX);
5308
5309           if ((long) section->sh_offset == section->sh_offset)
5310             printf (" %6.6lx", (unsigned long) section->sh_offset);
5311           else
5312             {
5313               putchar (' ');
5314               print_vma (section->sh_offset, LONG_HEX);
5315             }
5316
5317           if ((unsigned long) section->sh_size == section->sh_size)
5318             printf (" %6.6lx", (unsigned long) section->sh_size);
5319           else
5320             {
5321               putchar (' ');
5322               print_vma (section->sh_size, LONG_HEX);
5323             }
5324
5325           if ((unsigned long) section->sh_entsize == section->sh_entsize)
5326             printf (" %2.2lx", (unsigned long) section->sh_entsize);
5327           else
5328             {
5329               putchar (' ');
5330               print_vma (section->sh_entsize, LONG_HEX);
5331             }
5332
5333           if (do_section_details)
5334             fputs ("  ", stdout);
5335           else
5336             printf (" %3s ", get_elf_section_flags (section->sh_flags));
5337
5338           printf ("%2u %3u ", section->sh_link, section->sh_info);
5339
5340           if ((unsigned long) section->sh_addralign == section->sh_addralign)
5341             printf ("%2lu\n", (unsigned long) section->sh_addralign);
5342           else
5343             {
5344               print_vma (section->sh_addralign, DEC);
5345               putchar ('\n');
5346             }
5347         }
5348       else if (do_section_details)
5349         {
5350           printf ("       %-15.15s  ",
5351                   get_section_type_name (section->sh_type));
5352           print_vma (section->sh_addr, LONG_HEX);
5353           if ((long) section->sh_offset == section->sh_offset)
5354             printf ("  %16.16lx", (unsigned long) section->sh_offset);
5355           else
5356             {
5357               printf ("  ");
5358               print_vma (section->sh_offset, LONG_HEX);
5359             }
5360           printf ("  %u\n       ", section->sh_link);
5361           print_vma (section->sh_size, LONG_HEX);
5362           putchar (' ');
5363           print_vma (section->sh_entsize, LONG_HEX);
5364
5365           printf ("  %-16u  %lu\n",
5366                   section->sh_info,
5367                   (unsigned long) section->sh_addralign);
5368         }
5369       else
5370         {
5371           putchar (' ');
5372           print_vma (section->sh_addr, LONG_HEX);
5373           if ((long) section->sh_offset == section->sh_offset)
5374             printf ("  %8.8lx", (unsigned long) section->sh_offset);
5375           else
5376             {
5377               printf ("  ");
5378               print_vma (section->sh_offset, LONG_HEX);
5379             }
5380           printf ("\n       ");
5381           print_vma (section->sh_size, LONG_HEX);
5382           printf ("  ");
5383           print_vma (section->sh_entsize, LONG_HEX);
5384
5385           printf (" %3s ", get_elf_section_flags (section->sh_flags));
5386
5387           printf ("     %2u   %3u     %lu\n",
5388                   section->sh_link,
5389                   section->sh_info,
5390                   (unsigned long) section->sh_addralign);
5391         }
5392
5393       if (do_section_details)
5394         printf ("       %s\n", get_elf_section_flags (section->sh_flags));
5395     }
5396
5397   if (!do_section_details)
5398     {
5399       if (elf_header.e_machine == EM_X86_64
5400           || elf_header.e_machine == EM_L1OM
5401           || elf_header.e_machine == EM_K1OM)
5402         printf (_("Key to Flags:\n\
5403   W (write), A (alloc), X (execute), M (merge), S (strings), l (large)\n\
5404   I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)\n\
5405   O (extra OS processing required) o (OS specific), p (processor specific)\n"));
5406       else
5407         printf (_("Key to Flags:\n\
5408   W (write), A (alloc), X (execute), M (merge), S (strings)\n\
5409   I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)\n\
5410   O (extra OS processing required) o (OS specific), p (processor specific)\n"));
5411     }
5412
5413   return 1;
5414 }
5415
5416 static const char *
5417 get_group_flags (unsigned int flags)
5418 {
5419   static char buff[32];
5420   switch (flags)
5421     {
5422     case 0:
5423       return "";
5424
5425     case GRP_COMDAT:
5426       return "COMDAT ";
5427
5428    default:
5429       snprintf (buff, sizeof (buff), _("[<unknown>: 0x%x] "), flags);
5430       break;
5431     }
5432   return buff;
5433 }
5434
5435 static int
5436 process_section_groups (FILE * file)
5437 {
5438   Elf_Internal_Shdr * section;
5439   unsigned int i;
5440   struct group * group;
5441   Elf_Internal_Shdr * symtab_sec;
5442   Elf_Internal_Shdr * strtab_sec;
5443   Elf_Internal_Sym * symtab;
5444   unsigned long num_syms;
5445   char * strtab;
5446   size_t strtab_size;
5447
5448   /* Don't process section groups unless needed.  */
5449   if (!do_unwind && !do_section_groups)
5450     return 1;
5451
5452   if (elf_header.e_shnum == 0)
5453     {
5454       if (do_section_groups)
5455         printf (_("\nThere are no sections to group in this file.\n"));
5456
5457       return 1;
5458     }
5459
5460   if (section_headers == NULL)
5461     {
5462       error (_("Section headers are not available!\n"));
5463       /* PR 13622: This can happen with a corrupt ELF header.  */
5464       return 0;
5465     }
5466
5467   section_headers_groups = (struct group **) calloc (elf_header.e_shnum,
5468                                                      sizeof (struct group *));
5469
5470   if (section_headers_groups == NULL)
5471     {
5472       error (_("Out of memory\n"));
5473       return 0;
5474     }
5475
5476   /* Scan the sections for the group section.  */
5477   group_count = 0;
5478   for (i = 0, section = section_headers;
5479        i < elf_header.e_shnum;
5480        i++, section++)
5481     if (section->sh_type == SHT_GROUP)
5482       group_count++;
5483
5484   if (group_count == 0)
5485     {
5486       if (do_section_groups)
5487         printf (_("\nThere are no section groups in this file.\n"));
5488
5489       return 1;
5490     }
5491
5492   section_groups = (struct group *) calloc (group_count, sizeof (struct group));
5493
5494   if (section_groups == NULL)
5495     {
5496       error (_("Out of memory\n"));
5497       return 0;
5498     }
5499
5500   symtab_sec = NULL;
5501   strtab_sec = NULL;
5502   symtab = NULL;
5503   num_syms = 0;
5504   strtab = NULL;
5505   strtab_size = 0;
5506   for (i = 0, section = section_headers, group = section_groups;
5507        i < elf_header.e_shnum;
5508        i++, section++)
5509     {
5510       if (section->sh_type == SHT_GROUP)
5511         {
5512           char * name = SECTION_NAME (section);
5513           char * group_name;
5514           unsigned char * start;
5515           unsigned char * indices;
5516           unsigned int entry, j, size;
5517           Elf_Internal_Shdr * sec;
5518           Elf_Internal_Sym * sym;
5519
5520           /* Get the symbol table.  */
5521           if (section->sh_link >= elf_header.e_shnum
5522               || ((sec = section_headers + section->sh_link)->sh_type
5523                   != SHT_SYMTAB))
5524             {
5525               error (_("Bad sh_link in group section `%s'\n"), name);
5526               continue;
5527             }
5528
5529           if (symtab_sec != sec)
5530             {
5531               symtab_sec = sec;
5532               if (symtab)
5533                 free (symtab);
5534               symtab = GET_ELF_SYMBOLS (file, symtab_sec, & num_syms);
5535             }
5536
5537           if (symtab == NULL)
5538             {
5539               error (_("Corrupt header in group section `%s'\n"), name);
5540               continue;
5541             }
5542
5543           if (section->sh_info >= num_syms)
5544             {
5545               error (_("Bad sh_info in group section `%s'\n"), name);
5546               continue;
5547             }
5548
5549           sym = symtab + section->sh_info;
5550
5551           if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
5552             {
5553               if (sym->st_shndx == 0
5554                   || sym->st_shndx >= elf_header.e_shnum)
5555                 {
5556                   error (_("Bad sh_info in group section `%s'\n"), name);
5557                   continue;
5558                 }
5559
5560               group_name = SECTION_NAME (section_headers + sym->st_shndx);
5561               strtab_sec = NULL;
5562               if (strtab)
5563                 free (strtab);
5564               strtab = NULL;
5565               strtab_size = 0;
5566             }
5567           else
5568             {
5569               /* Get the string table.  */
5570               if (symtab_sec->sh_link >= elf_header.e_shnum)
5571                 {
5572                   strtab_sec = NULL;
5573                   if (strtab)
5574                     free (strtab);
5575                   strtab = NULL;
5576                   strtab_size = 0;
5577                 }
5578               else if (strtab_sec
5579                        != (sec = section_headers + symtab_sec->sh_link))
5580                 {
5581                   strtab_sec = sec;
5582                   if (strtab)
5583                     free (strtab);
5584                   strtab = (char *) get_data (NULL, file, strtab_sec->sh_offset,
5585                                               1, strtab_sec->sh_size,
5586                                               _("string table"));
5587                   strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
5588                 }
5589               group_name = sym->st_name < strtab_size
5590                 ? strtab + sym->st_name : _("<corrupt>");
5591             }
5592
5593           start = (unsigned char *) get_data (NULL, file, section->sh_offset,
5594                                               1, section->sh_size,
5595                                               _("section data"));
5596           if (start == NULL)
5597             continue;
5598
5599           indices = start;
5600           size = (section->sh_size / section->sh_entsize) - 1;
5601           entry = byte_get (indices, 4);
5602           indices += 4;
5603
5604           if (do_section_groups)
5605             {
5606               printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
5607                       get_group_flags (entry), i, name, group_name, size);
5608
5609               printf (_("   [Index]    Name\n"));
5610             }
5611
5612           group->group_index = i;
5613
5614           for (j = 0; j < size; j++)
5615             {
5616               struct group_list * g;
5617
5618               entry = byte_get (indices, 4);
5619               indices += 4;
5620
5621               if (entry >= elf_header.e_shnum)
5622                 {
5623                   error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
5624                          entry, i, elf_header.e_shnum - 1);
5625                   continue;
5626                 }
5627
5628               if (section_headers_groups [entry] != NULL)
5629                 {
5630                   if (entry)
5631                     {
5632                       error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
5633                              entry, i,
5634                              section_headers_groups [entry]->group_index);
5635                       continue;
5636                     }
5637                   else
5638                     {
5639                       /* Intel C/C++ compiler may put section 0 in a
5640                          section group. We just warn it the first time
5641                          and ignore it afterwards.  */
5642                       static int warned = 0;
5643                       if (!warned)
5644                         {
5645                           error (_("section 0 in group section [%5u]\n"),
5646                                  section_headers_groups [entry]->group_index);
5647                           warned++;
5648                         }
5649                     }
5650                 }
5651
5652               section_headers_groups [entry] = group;
5653
5654               if (do_section_groups)
5655                 {
5656                   sec = section_headers + entry;
5657                   printf ("   [%5u]   %s\n", entry, SECTION_NAME (sec));
5658                 }
5659
5660               g = (struct group_list *) xmalloc (sizeof (struct group_list));
5661               g->section_index = entry;
5662               g->next = group->root;
5663               group->root = g;
5664             }
5665
5666           if (start)
5667             free (start);
5668
5669           group++;
5670         }
5671     }
5672
5673   if (symtab)
5674     free (symtab);
5675   if (strtab)
5676     free (strtab);
5677   return 1;
5678 }
5679
5680 /* Data used to display dynamic fixups.  */
5681
5682 struct ia64_vms_dynfixup
5683 {
5684   bfd_vma needed_ident;         /* Library ident number.  */
5685   bfd_vma needed;               /* Index in the dstrtab of the library name.  */
5686   bfd_vma fixup_needed;         /* Index of the library.  */
5687   bfd_vma fixup_rela_cnt;       /* Number of fixups.  */
5688   bfd_vma fixup_rela_off;       /* Fixups offset in the dynamic segment.  */
5689 };
5690
5691 /* Data used to display dynamic relocations.  */
5692
5693 struct ia64_vms_dynimgrela
5694 {
5695   bfd_vma img_rela_cnt;         /* Number of relocations.  */
5696   bfd_vma img_rela_off;         /* Reloc offset in the dynamic segment.  */
5697 };
5698
5699 /* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
5700    library).  */
5701
5702 static void
5703 dump_ia64_vms_dynamic_fixups (FILE *file, struct ia64_vms_dynfixup *fixup,
5704                               const char *strtab, unsigned int strtab_sz)
5705 {
5706   Elf64_External_VMS_IMAGE_FIXUP *imfs;
5707   long i;
5708   const char *lib_name;
5709
5710   imfs = get_data (NULL, file, dynamic_addr + fixup->fixup_rela_off,
5711                    1, fixup->fixup_rela_cnt * sizeof (*imfs),
5712                    _("dynamic section image fixups"));
5713   if (!imfs)
5714     return;
5715
5716   if (fixup->needed < strtab_sz)
5717     lib_name = strtab + fixup->needed;
5718   else
5719     {
5720       warn ("corrupt library name index of 0x%lx found in dynamic entry",
5721             (unsigned long) fixup->needed);
5722       lib_name = "???";
5723     }
5724   printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
5725           (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
5726   printf
5727     (_("Seg Offset           Type                             SymVec DataType\n"));
5728
5729   for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
5730     {
5731       unsigned int type;
5732       const char *rtype;
5733
5734       printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
5735       printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
5736       type = BYTE_GET (imfs [i].type);
5737       rtype = elf_ia64_reloc_type (type);
5738       if (rtype == NULL)
5739         printf (" 0x%08x                       ", type);
5740       else
5741         printf (" %-32s ", rtype);
5742       printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
5743       printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
5744     }
5745
5746   free (imfs);
5747 }
5748
5749 /* Display IA-64 OpenVMS dynamic relocations (used to relocate an image).  */
5750
5751 static void
5752 dump_ia64_vms_dynamic_relocs (FILE *file, struct ia64_vms_dynimgrela *imgrela)
5753 {
5754   Elf64_External_VMS_IMAGE_RELA *imrs;
5755   long i;
5756
5757   imrs = get_data (NULL, file, dynamic_addr + imgrela->img_rela_off,
5758                    1, imgrela->img_rela_cnt * sizeof (*imrs),
5759                    _("dynamic section image relocations"));
5760   if (!imrs)
5761     return;
5762
5763   printf (_("\nImage relocs\n"));
5764   printf
5765     (_("Seg Offset   Type                            Addend            Seg Sym Off\n"));
5766
5767   for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
5768     {
5769       unsigned int type;
5770       const char *rtype;
5771
5772       printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
5773       printf ("%08" BFD_VMA_FMT "x ",
5774               (bfd_vma) BYTE_GET (imrs [i].rela_offset));
5775       type = BYTE_GET (imrs [i].type);
5776       rtype = elf_ia64_reloc_type (type);
5777       if (rtype == NULL)
5778         printf ("0x%08x                      ", type);
5779       else
5780         printf ("%-31s ", rtype);
5781       print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
5782       printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
5783       printf ("%08" BFD_VMA_FMT "x\n",
5784               (bfd_vma) BYTE_GET (imrs [i].sym_offset));
5785     }
5786
5787   free (imrs);
5788 }
5789
5790 /* Display IA-64 OpenVMS dynamic relocations and fixups.  */
5791
5792 static int
5793 process_ia64_vms_dynamic_relocs (FILE *file)
5794 {
5795   struct ia64_vms_dynfixup fixup;
5796   struct ia64_vms_dynimgrela imgrela;
5797   Elf_Internal_Dyn *entry;
5798   int res = 0;
5799   bfd_vma strtab_off = 0;
5800   bfd_vma strtab_sz = 0;
5801   char *strtab = NULL;
5802
5803   memset (&fixup, 0, sizeof (fixup));
5804   memset (&imgrela, 0, sizeof (imgrela));
5805
5806   /* Note: the order of the entries is specified by the OpenVMS specs.  */
5807   for (entry = dynamic_section;
5808        entry < dynamic_section + dynamic_nent;
5809        entry++)
5810     {
5811       switch (entry->d_tag)
5812         {
5813         case DT_IA_64_VMS_STRTAB_OFFSET:
5814           strtab_off = entry->d_un.d_val;
5815           break;
5816         case DT_STRSZ:
5817           strtab_sz = entry->d_un.d_val;
5818           if (strtab == NULL)
5819             strtab = get_data (NULL, file, dynamic_addr + strtab_off,
5820                                1, strtab_sz, _("dynamic string section"));
5821           break;
5822
5823         case DT_IA_64_VMS_NEEDED_IDENT:
5824           fixup.needed_ident = entry->d_un.d_val;
5825           break;
5826         case DT_NEEDED:
5827           fixup.needed = entry->d_un.d_val;
5828           break;
5829         case DT_IA_64_VMS_FIXUP_NEEDED:
5830           fixup.fixup_needed = entry->d_un.d_val;
5831           break;
5832         case DT_IA_64_VMS_FIXUP_RELA_CNT:
5833           fixup.fixup_rela_cnt = entry->d_un.d_val;
5834           break;
5835         case DT_IA_64_VMS_FIXUP_RELA_OFF:
5836           fixup.fixup_rela_off = entry->d_un.d_val;
5837           res++;
5838           dump_ia64_vms_dynamic_fixups (file, &fixup, strtab, strtab_sz);
5839           break;
5840
5841         case DT_IA_64_VMS_IMG_RELA_CNT:
5842           imgrela.img_rela_cnt = entry->d_un.d_val;
5843           break;
5844         case DT_IA_64_VMS_IMG_RELA_OFF:
5845           imgrela.img_rela_off = entry->d_un.d_val;
5846           res++;
5847           dump_ia64_vms_dynamic_relocs (file, &imgrela);
5848           break;
5849
5850         default:
5851           break;
5852         }
5853     }
5854
5855   if (strtab != NULL)
5856     free (strtab);
5857
5858   return res;
5859 }
5860
5861 static struct
5862 {
5863   const char * name;
5864   int reloc;
5865   int size;
5866   int rela;
5867 } dynamic_relocations [] =
5868 {
5869     { "REL", DT_REL, DT_RELSZ, FALSE },
5870     { "RELA", DT_RELA, DT_RELASZ, TRUE },
5871     { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
5872 };
5873
5874 /* Process the reloc section.  */
5875
5876 static int
5877 process_relocs (FILE * file)
5878 {
5879   unsigned long rel_size;
5880   unsigned long rel_offset;
5881
5882
5883   if (!do_reloc)
5884     return 1;
5885
5886   if (do_using_dynamic)
5887     {
5888       int is_rela;
5889       const char * name;
5890       int has_dynamic_reloc;
5891       unsigned int i;
5892
5893       has_dynamic_reloc = 0;
5894
5895       for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
5896         {
5897           is_rela = dynamic_relocations [i].rela;
5898           name = dynamic_relocations [i].name;
5899           rel_size = dynamic_info [dynamic_relocations [i].size];
5900           rel_offset = dynamic_info [dynamic_relocations [i].reloc];
5901
5902           has_dynamic_reloc |= rel_size;
5903
5904           if (is_rela == UNKNOWN)
5905             {
5906               if (dynamic_relocations [i].reloc == DT_JMPREL)
5907                 switch (dynamic_info[DT_PLTREL])
5908                   {
5909                   case DT_REL:
5910                     is_rela = FALSE;
5911                     break;
5912                   case DT_RELA:
5913                     is_rela = TRUE;
5914                     break;
5915                   }
5916             }
5917
5918           if (rel_size)
5919             {
5920               printf
5921                 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
5922                  name, rel_offset, rel_size);
5923
5924               dump_relocations (file,
5925                                 offset_from_vma (file, rel_offset, rel_size),
5926                                 rel_size,
5927                                 dynamic_symbols, num_dynamic_syms,
5928                                 dynamic_strings, dynamic_strings_length, is_rela);
5929             }
5930         }
5931
5932       if (is_ia64_vms ())
5933         has_dynamic_reloc |= process_ia64_vms_dynamic_relocs (file);
5934
5935       if (! has_dynamic_reloc)
5936         printf (_("\nThere are no dynamic relocations in this file.\n"));
5937     }
5938   else
5939     {
5940       Elf_Internal_Shdr * section;
5941       unsigned long i;
5942       int found = 0;
5943
5944       for (i = 0, section = section_headers;
5945            i < elf_header.e_shnum;
5946            i++, section++)
5947         {
5948           if (   section->sh_type != SHT_RELA
5949               && section->sh_type != SHT_REL)
5950             continue;
5951
5952           rel_offset = section->sh_offset;
5953           rel_size   = section->sh_size;
5954
5955           if (rel_size)
5956             {
5957               Elf_Internal_Shdr * strsec;
5958               int is_rela;
5959
5960               printf (_("\nRelocation section "));
5961
5962               if (string_table == NULL)
5963                 printf ("%d", section->sh_name);
5964               else
5965                 printf ("'%s'", SECTION_NAME (section));
5966
5967               printf (_(" at offset 0x%lx contains %lu entries:\n"),
5968                  rel_offset, (unsigned long) (rel_size / section->sh_entsize));
5969
5970               is_rela = section->sh_type == SHT_RELA;
5971
5972               if (section->sh_link != 0
5973                   && section->sh_link < elf_header.e_shnum)
5974                 {
5975                   Elf_Internal_Shdr * symsec;
5976                   Elf_Internal_Sym *  symtab;
5977                   unsigned long nsyms;
5978                   unsigned long strtablen = 0;
5979                   char * strtab = NULL;
5980
5981                   symsec = section_headers + section->sh_link;
5982                   if (symsec->sh_type != SHT_SYMTAB
5983                       && symsec->sh_type != SHT_DYNSYM)
5984                     continue;
5985
5986                   symtab = GET_ELF_SYMBOLS (file, symsec, & nsyms);
5987
5988                   if (symtab == NULL)
5989                     continue;
5990
5991                   if (symsec->sh_link != 0
5992                       && symsec->sh_link < elf_header.e_shnum)
5993                     {
5994                       strsec = section_headers + symsec->sh_link;
5995
5996                       strtab = (char *) get_data (NULL, file, strsec->sh_offset,
5997                                                   1, strsec->sh_size,
5998                                                   _("string table"));
5999                       strtablen = strtab == NULL ? 0 : strsec->sh_size;
6000                     }
6001
6002                   dump_relocations (file, rel_offset, rel_size,
6003                                     symtab, nsyms, strtab, strtablen, is_rela);
6004                   if (strtab)
6005                     free (strtab);
6006                   free (symtab);
6007                 }
6008               else
6009                 dump_relocations (file, rel_offset, rel_size,
6010                                   NULL, 0, NULL, 0, is_rela);
6011
6012               found = 1;
6013             }
6014         }
6015
6016       if (! found)
6017         printf (_("\nThere are no relocations in this file.\n"));
6018     }
6019
6020   return 1;
6021 }
6022
6023 /* Process the unwind section.  */
6024
6025 #include "unwind-ia64.h"
6026
6027 /* An absolute address consists of a section and an offset.  If the
6028    section is NULL, the offset itself is the address, otherwise, the
6029    address equals to LOAD_ADDRESS(section) + offset.  */
6030
6031 struct absaddr
6032   {
6033     unsigned short section;
6034     bfd_vma offset;
6035   };
6036
6037 #define ABSADDR(a) \
6038   ((a).section \
6039    ? section_headers [(a).section].sh_addr + (a).offset \
6040    : (a).offset)
6041
6042 struct ia64_unw_table_entry
6043   {
6044     struct absaddr start;
6045     struct absaddr end;
6046     struct absaddr info;
6047   };
6048
6049 struct ia64_unw_aux_info
6050   {
6051
6052     struct ia64_unw_table_entry *table; /* Unwind table.  */
6053     unsigned long table_len;    /* Length of unwind table.  */
6054     unsigned char * info;       /* Unwind info.  */
6055     unsigned long info_size;    /* Size of unwind info.  */
6056     bfd_vma info_addr;          /* starting address of unwind info.  */
6057     bfd_vma seg_base;           /* Starting address of segment.  */
6058     Elf_Internal_Sym * symtab;  /* The symbol table.  */
6059     unsigned long nsyms;        /* Number of symbols.  */
6060     char * strtab;              /* The string table.  */
6061     unsigned long strtab_size;  /* Size of string table.  */
6062   };
6063
6064 static void
6065 find_symbol_for_address (Elf_Internal_Sym * symtab,
6066                          unsigned long nsyms,
6067                          const char * strtab,
6068                          unsigned long strtab_size,
6069                          struct absaddr addr,
6070                          const char ** symname,
6071                          bfd_vma * offset)
6072 {
6073   bfd_vma dist = 0x100000;
6074   Elf_Internal_Sym * sym;
6075   Elf_Internal_Sym * best = NULL;
6076   unsigned long i;
6077
6078   REMOVE_ARCH_BITS (addr.offset);
6079
6080   for (i = 0, sym = symtab; i < nsyms; ++i, ++sym)
6081     {
6082       bfd_vma value = sym->st_value;
6083
6084       REMOVE_ARCH_BITS (value);
6085
6086       if (ELF_ST_TYPE (sym->st_info) == STT_FUNC
6087           && sym->st_name != 0
6088           && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
6089           && addr.offset >= value
6090           && addr.offset - value < dist)
6091         {
6092           best = sym;
6093           dist = addr.offset - value;
6094           if (!dist)
6095             break;
6096         }
6097     }
6098
6099   if (best)
6100     {
6101       *symname = (best->st_name >= strtab_size
6102                   ? _("<corrupt>") : strtab + best->st_name);
6103       *offset = dist;
6104       return;
6105     }
6106
6107   *symname = NULL;
6108   *offset = addr.offset;
6109 }
6110
6111 static void
6112 dump_ia64_unwind (struct ia64_unw_aux_info * aux)
6113 {
6114   struct ia64_unw_table_entry * tp;
6115   int in_body;
6116
6117   for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
6118     {
6119       bfd_vma stamp;
6120       bfd_vma offset;
6121       const unsigned char * dp;
6122       const unsigned char * head;
6123       const char * procname;
6124
6125       find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
6126                                aux->strtab_size, tp->start, &procname, &offset);
6127
6128       fputs ("\n<", stdout);
6129
6130       if (procname)
6131         {
6132           fputs (procname, stdout);
6133
6134           if (offset)
6135             printf ("+%lx", (unsigned long) offset);
6136         }
6137
6138       fputs (">: [", stdout);
6139       print_vma (tp->start.offset, PREFIX_HEX);
6140       fputc ('-', stdout);
6141       print_vma (tp->end.offset, PREFIX_HEX);
6142       printf ("], info at +0x%lx\n",
6143               (unsigned long) (tp->info.offset - aux->seg_base));
6144
6145       head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
6146       stamp = byte_get ((unsigned char *) head, sizeof (stamp));
6147
6148       printf ("  v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
6149               (unsigned) UNW_VER (stamp),
6150               (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
6151               UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
6152               UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
6153               (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
6154
6155       if (UNW_VER (stamp) != 1)
6156         {
6157           printf (_("\tUnknown version.\n"));
6158           continue;
6159         }
6160
6161       in_body = 0;
6162       for (dp = head + 8; dp < head + 8 + eh_addr_size * UNW_LENGTH (stamp);)
6163         dp = unw_decode (dp, in_body, & in_body);
6164     }
6165 }
6166
6167 static int
6168 slurp_ia64_unwind_table (FILE * file,
6169                          struct ia64_unw_aux_info * aux,
6170                          Elf_Internal_Shdr * sec)
6171 {
6172   unsigned long size, nrelas, i;
6173   Elf_Internal_Phdr * seg;
6174   struct ia64_unw_table_entry * tep;
6175   Elf_Internal_Shdr * relsec;
6176   Elf_Internal_Rela * rela;
6177   Elf_Internal_Rela * rp;
6178   unsigned char * table;
6179   unsigned char * tp;
6180   Elf_Internal_Sym * sym;
6181   const char * relname;
6182
6183   /* First, find the starting address of the segment that includes
6184      this section: */
6185
6186   if (elf_header.e_phnum)
6187     {
6188       if (! get_program_headers (file))
6189           return 0;
6190
6191       for (seg = program_headers;
6192            seg < program_headers + elf_header.e_phnum;
6193            ++seg)
6194         {
6195           if (seg->p_type != PT_LOAD)
6196             continue;
6197
6198           if (sec->sh_addr >= seg->p_vaddr
6199               && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
6200             {
6201               aux->seg_base = seg->p_vaddr;
6202               break;
6203             }
6204         }
6205     }
6206
6207   /* Second, build the unwind table from the contents of the unwind section:  */
6208   size = sec->sh_size;
6209   table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
6210                                       _("unwind table"));
6211   if (!table)
6212     return 0;
6213
6214   aux->table = (struct ia64_unw_table_entry *)
6215       xcmalloc (size / (3 * eh_addr_size), sizeof (aux->table[0]));
6216   tep = aux->table;
6217   for (tp = table; tp < table + size; ++tep)
6218     {
6219       tep->start.section = SHN_UNDEF;
6220       tep->end.section   = SHN_UNDEF;
6221       tep->info.section  = SHN_UNDEF;
6222       tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
6223       tep->end.offset   = byte_get (tp, eh_addr_size); tp += eh_addr_size;
6224       tep->info.offset  = byte_get (tp, eh_addr_size); tp += eh_addr_size;
6225       tep->start.offset += aux->seg_base;
6226       tep->end.offset   += aux->seg_base;
6227       tep->info.offset  += aux->seg_base;
6228     }
6229   free (table);
6230
6231   /* Third, apply any relocations to the unwind table:  */
6232   for (relsec = section_headers;
6233        relsec < section_headers + elf_header.e_shnum;
6234        ++relsec)
6235     {
6236       if (relsec->sh_type != SHT_RELA
6237           || relsec->sh_info >= elf_header.e_shnum
6238           || section_headers + relsec->sh_info != sec)
6239         continue;
6240
6241       if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
6242                               & rela, & nrelas))
6243         return 0;
6244
6245       for (rp = rela; rp < rela + nrelas; ++rp)
6246         {
6247           relname = elf_ia64_reloc_type (get_reloc_type (rp->r_info));
6248           sym = aux->symtab + get_reloc_symindex (rp->r_info);
6249
6250           if (! const_strneq (relname, "R_IA64_SEGREL"))
6251             {
6252               warn (_("Skipping unexpected relocation type %s\n"), relname);
6253               continue;
6254             }
6255
6256           i = rp->r_offset / (3 * eh_addr_size);
6257
6258           switch (rp->r_offset/eh_addr_size % 3)
6259             {
6260             case 0:
6261               aux->table[i].start.section = sym->st_shndx;
6262               aux->table[i].start.offset  = rp->r_addend + sym->st_value;
6263               break;
6264             case 1:
6265               aux->table[i].end.section   = sym->st_shndx;
6266               aux->table[i].end.offset    = rp->r_addend + sym->st_value;
6267               break;
6268             case 2:
6269               aux->table[i].info.section  = sym->st_shndx;
6270               aux->table[i].info.offset   = rp->r_addend + sym->st_value;
6271               break;
6272             default:
6273               break;
6274             }
6275         }
6276
6277       free (rela);
6278     }
6279
6280   aux->table_len = size / (3 * eh_addr_size);
6281   return 1;
6282 }
6283
6284 static void
6285 ia64_process_unwind (FILE * file)
6286 {
6287   Elf_Internal_Shdr * sec;
6288   Elf_Internal_Shdr * unwsec = NULL;
6289   Elf_Internal_Shdr * strsec;
6290   unsigned long i, unwcount = 0, unwstart = 0;
6291   struct ia64_unw_aux_info aux;
6292
6293   memset (& aux, 0, sizeof (aux));
6294
6295   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
6296     {
6297       if (sec->sh_type == SHT_SYMTAB
6298           && sec->sh_link < elf_header.e_shnum)
6299         {
6300           aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
6301
6302           strsec = section_headers + sec->sh_link;
6303           assert (aux.strtab == NULL);
6304           aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
6305                                           1, strsec->sh_size,
6306                                           _("string table"));
6307           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
6308         }
6309       else if (sec->sh_type == SHT_IA_64_UNWIND)
6310         unwcount++;
6311     }
6312
6313   if (!unwcount)
6314     printf (_("\nThere are no unwind sections in this file.\n"));
6315
6316   while (unwcount-- > 0)
6317     {
6318       char * suffix;
6319       size_t len, len2;
6320
6321       for (i = unwstart, sec = section_headers + unwstart;
6322            i < elf_header.e_shnum; ++i, ++sec)
6323         if (sec->sh_type == SHT_IA_64_UNWIND)
6324           {
6325             unwsec = sec;
6326             break;
6327           }
6328
6329       unwstart = i + 1;
6330       len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
6331
6332       if ((unwsec->sh_flags & SHF_GROUP) != 0)
6333         {
6334           /* We need to find which section group it is in.  */
6335           struct group_list * g = section_headers_groups [i]->root;
6336
6337           for (; g != NULL; g = g->next)
6338             {
6339               sec = section_headers + g->section_index;
6340
6341               if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
6342                 break;
6343             }
6344
6345           if (g == NULL)
6346             i = elf_header.e_shnum;
6347         }
6348       else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
6349         {
6350           /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO.  */
6351           len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
6352           suffix = SECTION_NAME (unwsec) + len;
6353           for (i = 0, sec = section_headers; i < elf_header.e_shnum;
6354                ++i, ++sec)
6355             if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
6356                 && streq (SECTION_NAME (sec) + len2, suffix))
6357               break;
6358         }
6359       else
6360         {
6361           /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
6362              .IA_64.unwind or BAR -> .IA_64.unwind_info.  */
6363           len = sizeof (ELF_STRING_ia64_unwind) - 1;
6364           len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
6365           suffix = "";
6366           if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
6367             suffix = SECTION_NAME (unwsec) + len;
6368           for (i = 0, sec = section_headers; i < elf_header.e_shnum;
6369                ++i, ++sec)
6370             if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
6371                 && streq (SECTION_NAME (sec) + len2, suffix))
6372               break;
6373         }
6374
6375       if (i == elf_header.e_shnum)
6376         {
6377           printf (_("\nCould not find unwind info section for "));
6378
6379           if (string_table == NULL)
6380             printf ("%d", unwsec->sh_name);
6381           else
6382             printf (_("'%s'"), SECTION_NAME (unwsec));
6383         }
6384       else
6385         {
6386           aux.info_addr = sec->sh_addr;
6387           aux.info = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1,
6388                                                  sec->sh_size,
6389                                                  _("unwind info"));
6390           aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
6391
6392           printf (_("\nUnwind section "));
6393
6394           if (string_table == NULL)
6395             printf ("%d", unwsec->sh_name);
6396           else
6397             printf (_("'%s'"), SECTION_NAME (unwsec));
6398
6399           printf (_(" at offset 0x%lx contains %lu entries:\n"),
6400                   (unsigned long) unwsec->sh_offset,
6401                   (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
6402
6403           (void) slurp_ia64_unwind_table (file, & aux, unwsec);
6404
6405           if (aux.table_len > 0)
6406             dump_ia64_unwind (& aux);
6407
6408           if (aux.table)
6409             free ((char *) aux.table);
6410           if (aux.info)
6411             free ((char *) aux.info);
6412           aux.table = NULL;
6413           aux.info = NULL;
6414         }
6415     }
6416
6417   if (aux.symtab)
6418     free (aux.symtab);
6419   if (aux.strtab)
6420     free ((char *) aux.strtab);
6421 }
6422
6423 struct hppa_unw_table_entry
6424   {
6425     struct absaddr start;
6426     struct absaddr end;
6427     unsigned int Cannot_unwind:1;                       /* 0 */
6428     unsigned int Millicode:1;                   /* 1 */
6429     unsigned int Millicode_save_sr0:1;          /* 2 */
6430     unsigned int Region_description:2;          /* 3..4 */
6431     unsigned int reserved1:1;                   /* 5 */
6432     unsigned int Entry_SR:1;                    /* 6 */
6433     unsigned int Entry_FR:4;     /* number saved */     /* 7..10 */
6434     unsigned int Entry_GR:5;     /* number saved */     /* 11..15 */
6435     unsigned int Args_stored:1;                 /* 16 */
6436     unsigned int Variable_Frame:1;                      /* 17 */
6437     unsigned int Separate_Package_Body:1;               /* 18 */
6438     unsigned int Frame_Extension_Millicode:1;   /* 19 */
6439     unsigned int Stack_Overflow_Check:1;                /* 20 */
6440     unsigned int Two_Instruction_SP_Increment:1;        /* 21 */
6441     unsigned int Ada_Region:1;                  /* 22 */
6442     unsigned int cxx_info:1;                    /* 23 */
6443     unsigned int cxx_try_catch:1;                       /* 24 */
6444     unsigned int sched_entry_seq:1;                     /* 25 */
6445     unsigned int reserved2:1;                   /* 26 */
6446     unsigned int Save_SP:1;                             /* 27 */
6447     unsigned int Save_RP:1;                             /* 28 */
6448     unsigned int Save_MRP_in_frame:1;           /* 29 */
6449     unsigned int extn_ptr_defined:1;            /* 30 */
6450     unsigned int Cleanup_defined:1;                     /* 31 */
6451
6452     unsigned int MPE_XL_interrupt_marker:1;             /* 0 */
6453     unsigned int HP_UX_interrupt_marker:1;              /* 1 */
6454     unsigned int Large_frame:1;                 /* 2 */
6455     unsigned int Pseudo_SP_Set:1;                       /* 3 */
6456     unsigned int reserved4:1;                   /* 4 */
6457     unsigned int Total_frame_size:27;           /* 5..31 */
6458   };
6459
6460 struct hppa_unw_aux_info
6461   {
6462     struct hppa_unw_table_entry *table; /* Unwind table.  */
6463     unsigned long table_len;    /* Length of unwind table.  */
6464     bfd_vma seg_base;           /* Starting address of segment.  */
6465     Elf_Internal_Sym * symtab;  /* The symbol table.  */
6466     unsigned long nsyms;        /* Number of symbols.  */
6467     char * strtab;              /* The string table.  */
6468     unsigned long strtab_size;  /* Size of string table.  */
6469   };
6470
6471 static void
6472 dump_hppa_unwind (struct hppa_unw_aux_info * aux)
6473 {
6474   struct hppa_unw_table_entry * tp;
6475
6476   for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
6477     {
6478       bfd_vma offset;
6479       const char * procname;
6480
6481       find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
6482                                aux->strtab_size, tp->start, &procname,
6483                                &offset);
6484
6485       fputs ("\n<", stdout);
6486
6487       if (procname)
6488         {
6489           fputs (procname, stdout);
6490
6491           if (offset)
6492             printf ("+%lx", (unsigned long) offset);
6493         }
6494
6495       fputs (">: [", stdout);
6496       print_vma (tp->start.offset, PREFIX_HEX);
6497       fputc ('-', stdout);
6498       print_vma (tp->end.offset, PREFIX_HEX);
6499       printf ("]\n\t");
6500
6501 #define PF(_m) if (tp->_m) printf (#_m " ");
6502 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
6503       PF(Cannot_unwind);
6504       PF(Millicode);
6505       PF(Millicode_save_sr0);
6506       /* PV(Region_description);  */
6507       PF(Entry_SR);
6508       PV(Entry_FR);
6509       PV(Entry_GR);
6510       PF(Args_stored);
6511       PF(Variable_Frame);
6512       PF(Separate_Package_Body);
6513       PF(Frame_Extension_Millicode);
6514       PF(Stack_Overflow_Check);
6515       PF(Two_Instruction_SP_Increment);
6516       PF(Ada_Region);
6517       PF(cxx_info);
6518       PF(cxx_try_catch);
6519       PF(sched_entry_seq);
6520       PF(Save_SP);
6521       PF(Save_RP);
6522       PF(Save_MRP_in_frame);
6523       PF(extn_ptr_defined);
6524       PF(Cleanup_defined);
6525       PF(MPE_XL_interrupt_marker);
6526       PF(HP_UX_interrupt_marker);
6527       PF(Large_frame);
6528       PF(Pseudo_SP_Set);
6529       PV(Total_frame_size);
6530 #undef PF
6531 #undef PV
6532     }
6533
6534   printf ("\n");
6535 }
6536
6537 static int
6538 slurp_hppa_unwind_table (FILE * file,
6539                          struct hppa_unw_aux_info * aux,
6540                          Elf_Internal_Shdr * sec)
6541 {
6542   unsigned long size, unw_ent_size, nentries, nrelas, i;
6543   Elf_Internal_Phdr * seg;
6544   struct hppa_unw_table_entry * tep;
6545   Elf_Internal_Shdr * relsec;
6546   Elf_Internal_Rela * rela;
6547   Elf_Internal_Rela * rp;
6548   unsigned char * table;
6549   unsigned char * tp;
6550   Elf_Internal_Sym * sym;
6551   const char * relname;
6552
6553   /* First, find the starting address of the segment that includes
6554      this section.  */
6555
6556   if (elf_header.e_phnum)
6557     {
6558       if (! get_program_headers (file))
6559         return 0;
6560
6561       for (seg = program_headers;
6562            seg < program_headers + elf_header.e_phnum;
6563            ++seg)
6564         {
6565           if (seg->p_type != PT_LOAD)
6566             continue;
6567
6568           if (sec->sh_addr >= seg->p_vaddr
6569               && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
6570             {
6571               aux->seg_base = seg->p_vaddr;
6572               break;
6573             }
6574         }
6575     }
6576
6577   /* Second, build the unwind table from the contents of the unwind
6578      section.  */
6579   size = sec->sh_size;
6580   table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
6581                                       _("unwind table"));
6582   if (!table)
6583     return 0;
6584
6585   unw_ent_size = 16;
6586   nentries = size / unw_ent_size;
6587   size = unw_ent_size * nentries;
6588
6589   tep = aux->table = (struct hppa_unw_table_entry *)
6590       xcmalloc (nentries, sizeof (aux->table[0]));
6591
6592   for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
6593     {
6594       unsigned int tmp1, tmp2;
6595
6596       tep->start.section = SHN_UNDEF;
6597       tep->end.section   = SHN_UNDEF;
6598
6599       tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
6600       tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
6601       tmp1 = byte_get ((unsigned char *) tp + 8, 4);
6602       tmp2 = byte_get ((unsigned char *) tp + 12, 4);
6603
6604       tep->start.offset += aux->seg_base;
6605       tep->end.offset   += aux->seg_base;
6606
6607       tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
6608       tep->Millicode = (tmp1 >> 30) & 0x1;
6609       tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
6610       tep->Region_description = (tmp1 >> 27) & 0x3;
6611       tep->reserved1 = (tmp1 >> 26) & 0x1;
6612       tep->Entry_SR = (tmp1 >> 25) & 0x1;
6613       tep->Entry_FR = (tmp1 >> 21) & 0xf;
6614       tep->Entry_GR = (tmp1 >> 16) & 0x1f;
6615       tep->Args_stored = (tmp1 >> 15) & 0x1;
6616       tep->Variable_Frame = (tmp1 >> 14) & 0x1;
6617       tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
6618       tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
6619       tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
6620       tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
6621       tep->Ada_Region = (tmp1 >> 9) & 0x1;
6622       tep->cxx_info = (tmp1 >> 8) & 0x1;
6623       tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
6624       tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
6625       tep->reserved2 = (tmp1 >> 5) & 0x1;
6626       tep->Save_SP = (tmp1 >> 4) & 0x1;
6627       tep->Save_RP = (tmp1 >> 3) & 0x1;
6628       tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
6629       tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
6630       tep->Cleanup_defined = tmp1 & 0x1;
6631
6632       tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
6633       tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
6634       tep->Large_frame = (tmp2 >> 29) & 0x1;
6635       tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
6636       tep->reserved4 = (tmp2 >> 27) & 0x1;
6637       tep->Total_frame_size = tmp2 & 0x7ffffff;
6638     }
6639   free (table);
6640
6641   /* Third, apply any relocations to the unwind table.  */
6642   for (relsec = section_headers;
6643        relsec < section_headers + elf_header.e_shnum;
6644        ++relsec)
6645     {
6646       if (relsec->sh_type != SHT_RELA
6647           || relsec->sh_info >= elf_header.e_shnum
6648           || section_headers + relsec->sh_info != sec)
6649         continue;
6650
6651       if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
6652                               & rela, & nrelas))
6653         return 0;
6654
6655       for (rp = rela; rp < rela + nrelas; ++rp)
6656         {
6657           relname = elf_hppa_reloc_type (get_reloc_type (rp->r_info));
6658           sym = aux->symtab + get_reloc_symindex (rp->r_info);
6659
6660           /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64.  */
6661           if (! const_strneq (relname, "R_PARISC_SEGREL"))
6662             {
6663               warn (_("Skipping unexpected relocation type %s\n"), relname);
6664               continue;
6665             }
6666
6667           i = rp->r_offset / unw_ent_size;
6668
6669           switch ((rp->r_offset % unw_ent_size) / eh_addr_size)
6670             {
6671             case 0:
6672               aux->table[i].start.section = sym->st_shndx;
6673               aux->table[i].start.offset  = sym->st_value + rp->r_addend;
6674               break;
6675             case 1:
6676               aux->table[i].end.section   = sym->st_shndx;
6677               aux->table[i].end.offset    = sym->st_value + rp->r_addend;
6678               break;
6679             default:
6680               break;
6681             }
6682         }
6683
6684       free (rela);
6685     }
6686
6687   aux->table_len = nentries;
6688
6689   return 1;
6690 }
6691
6692 static void
6693 hppa_process_unwind (FILE * file)
6694 {
6695   struct hppa_unw_aux_info aux;
6696   Elf_Internal_Shdr * unwsec = NULL;
6697   Elf_Internal_Shdr * strsec;
6698   Elf_Internal_Shdr * sec;
6699   unsigned long i;
6700
6701   if (string_table == NULL)
6702     return;
6703
6704   memset (& aux, 0, sizeof (aux));
6705
6706   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
6707     {
6708       if (sec->sh_type == SHT_SYMTAB
6709           && sec->sh_link < elf_header.e_shnum)
6710         {
6711           aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
6712
6713           strsec = section_headers + sec->sh_link;
6714           assert (aux.strtab == NULL);
6715           aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
6716                                           1, strsec->sh_size,
6717                                           _("string table"));
6718           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
6719         }
6720       else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
6721         unwsec = sec;
6722     }
6723
6724   if (!unwsec)
6725     printf (_("\nThere are no unwind sections in this file.\n"));
6726
6727   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
6728     {
6729       if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
6730         {
6731           printf (_("\nUnwind section "));
6732           printf (_("'%s'"), SECTION_NAME (sec));
6733
6734           printf (_(" at offset 0x%lx contains %lu entries:\n"),
6735                   (unsigned long) sec->sh_offset,
6736                   (unsigned long) (sec->sh_size / (2 * eh_addr_size + 8)));
6737
6738           slurp_hppa_unwind_table (file, &aux, sec);
6739           if (aux.table_len > 0)
6740             dump_hppa_unwind (&aux);
6741
6742           if (aux.table)
6743             free ((char *) aux.table);
6744           aux.table = NULL;
6745         }
6746     }
6747
6748   if (aux.symtab)
6749     free (aux.symtab);
6750   if (aux.strtab)
6751     free ((char *) aux.strtab);
6752 }
6753
6754 struct arm_section
6755 {
6756   unsigned char *      data;            /* The unwind data.  */
6757   Elf_Internal_Shdr *  sec;             /* The cached unwind section header.  */
6758   Elf_Internal_Rela *  rela;            /* The cached relocations for this section.  */
6759   unsigned long        nrelas;          /* The number of relocations.  */
6760   unsigned int         rel_type;        /* REL or RELA ?  */
6761   Elf_Internal_Rela *  next_rela;       /* Cyclic pointer to the next reloc to process.  */
6762 };
6763
6764 struct arm_unw_aux_info
6765 {
6766   FILE *              file;             /* The file containing the unwind sections.  */
6767   Elf_Internal_Sym *  symtab;           /* The file's symbol table.  */
6768   unsigned long       nsyms;            /* Number of symbols.  */
6769   char *              strtab;           /* The file's string table.  */
6770   unsigned long       strtab_size;      /* Size of string table.  */
6771 };
6772
6773 static const char *
6774 arm_print_vma_and_name (struct arm_unw_aux_info *aux,
6775                         bfd_vma fn, struct absaddr addr)
6776 {
6777   const char *procname;
6778   bfd_vma sym_offset;
6779
6780   if (addr.section == SHN_UNDEF)
6781     addr.offset = fn;
6782
6783   find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
6784                            aux->strtab_size, addr, &procname,
6785                            &sym_offset);
6786
6787   print_vma (fn, PREFIX_HEX);
6788
6789   if (procname)
6790     {
6791       fputs (" <", stdout);
6792       fputs (procname, stdout);
6793
6794       if (sym_offset)
6795         printf ("+0x%lx", (unsigned long) sym_offset);
6796       fputc ('>', stdout);
6797     }
6798
6799   return procname;
6800 }
6801
6802 static void
6803 arm_free_section (struct arm_section *arm_sec)
6804 {
6805   if (arm_sec->data != NULL)
6806     free (arm_sec->data);
6807
6808   if (arm_sec->rela != NULL)
6809     free (arm_sec->rela);
6810 }
6811
6812 /* 1) If SEC does not match the one cached in ARM_SEC, then free the current
6813       cached section and install SEC instead.
6814    2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
6815       and return its valued in * WORDP, relocating if necessary.
6816    3) Update the NEXT_RELA field in ARM_SEC and store the section index and
6817       relocation's offset in ADDR.
6818    4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
6819       into the string table of the symbol associated with the reloc.  If no
6820       reloc was applied store -1 there.
6821    5) Return TRUE upon success, FALSE otherwise.  */
6822
6823 static bfd_boolean
6824 get_unwind_section_word (struct arm_unw_aux_info *  aux,
6825                          struct arm_section *       arm_sec,
6826                          Elf_Internal_Shdr *        sec,
6827                          bfd_vma                    word_offset,
6828                          unsigned int *             wordp,
6829                          struct absaddr *           addr,
6830                          bfd_vma *                  sym_name)
6831 {
6832   Elf_Internal_Rela *rp;
6833   Elf_Internal_Sym *sym;
6834   const char * relname;
6835   unsigned int word;
6836   bfd_boolean wrapped;
6837
6838   addr->section = SHN_UNDEF;
6839   addr->offset = 0;
6840
6841   if (sym_name != NULL)
6842     *sym_name = (bfd_vma) -1;
6843
6844   /* If necessary, update the section cache.  */
6845   if (sec != arm_sec->sec)
6846     {
6847       Elf_Internal_Shdr *relsec;
6848
6849       arm_free_section (arm_sec);
6850
6851       arm_sec->sec = sec;
6852       arm_sec->data = get_data (NULL, aux->file, sec->sh_offset, 1,
6853                                 sec->sh_size, _("unwind data"));
6854       arm_sec->rela = NULL;
6855       arm_sec->nrelas = 0;
6856
6857       for (relsec = section_headers;
6858            relsec < section_headers + elf_header.e_shnum;
6859            ++relsec)
6860         {
6861           if (relsec->sh_info >= elf_header.e_shnum
6862               || section_headers + relsec->sh_info != sec
6863               /* PR 15745: Check the section type as well.  */
6864               || (relsec->sh_type != SHT_REL
6865                   && relsec->sh_type != SHT_RELA))
6866             continue;
6867
6868           arm_sec->rel_type = relsec->sh_type;
6869           if (relsec->sh_type == SHT_REL)
6870             {
6871               if (!slurp_rel_relocs (aux->file, relsec->sh_offset,
6872                                      relsec->sh_size,
6873                                      & arm_sec->rela, & arm_sec->nrelas))
6874                 return FALSE;
6875             }
6876           else /* relsec->sh_type == SHT_RELA */
6877             {
6878               if (!slurp_rela_relocs (aux->file, relsec->sh_offset,
6879                                       relsec->sh_size,
6880                                       & arm_sec->rela, & arm_sec->nrelas))
6881                 return FALSE;
6882             }
6883           break;
6884         }
6885
6886       arm_sec->next_rela = arm_sec->rela;
6887     }
6888
6889   /* If there is no unwind data we can do nothing.  */
6890   if (arm_sec->data == NULL)
6891     return FALSE;
6892
6893   /* Get the word at the required offset.  */
6894   word = byte_get (arm_sec->data + word_offset, 4);
6895
6896   /* Look through the relocs to find the one that applies to the provided offset.  */
6897   wrapped = FALSE;
6898   for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
6899     {
6900       bfd_vma prelval, offset;
6901
6902       if (rp->r_offset > word_offset && !wrapped)
6903         {
6904           rp = arm_sec->rela;
6905           wrapped = TRUE;
6906         }
6907       if (rp->r_offset > word_offset)
6908         break;
6909
6910       if (rp->r_offset & 3)
6911         {
6912           warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
6913                 (unsigned long) rp->r_offset);
6914           continue;
6915         }
6916
6917       if (rp->r_offset < word_offset)
6918         continue;
6919
6920       sym = aux->symtab + ELF32_R_SYM (rp->r_info);
6921
6922       if (arm_sec->rel_type == SHT_REL)
6923         {
6924           offset = word & 0x7fffffff;
6925           if (offset & 0x40000000)
6926             offset |= ~ (bfd_vma) 0x7fffffff;
6927         }
6928       else if (arm_sec->rel_type == SHT_RELA)
6929         offset = rp->r_addend;
6930       else
6931         abort ();
6932
6933       offset += sym->st_value;
6934       prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
6935
6936       /* Check that we are processing the expected reloc type.  */
6937       if (elf_header.e_machine == EM_ARM)
6938         {
6939           relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
6940
6941           if (streq (relname, "R_ARM_NONE"))
6942               continue;
6943
6944           if (! streq (relname, "R_ARM_PREL31"))
6945             {
6946               warn (_("Skipping unexpected relocation type %s\n"), relname);
6947               continue;
6948             }
6949         }
6950       else if (elf_header.e_machine == EM_TI_C6000)
6951         {
6952           relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
6953
6954           if (streq (relname, "R_C6000_NONE"))
6955             continue;
6956
6957           if (! streq (relname, "R_C6000_PREL31"))
6958             {
6959               warn (_("Skipping unexpected relocation type %s\n"), relname);
6960               continue;
6961             }
6962
6963           prelval >>= 1;
6964         }
6965       else
6966         /* This function currently only supports ARM and TI unwinders.  */
6967         abort ();
6968
6969       word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
6970       addr->section = sym->st_shndx;
6971       addr->offset = offset;
6972       if (sym_name)
6973         * sym_name = sym->st_name;
6974       break;
6975     }
6976
6977   *wordp = word;
6978   arm_sec->next_rela = rp;
6979
6980   return TRUE;
6981 }
6982
6983 static const char *tic6x_unwind_regnames[16] =
6984 {
6985   "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
6986   "A14", "A13", "A12", "A11", "A10",
6987   "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
6988 };
6989
6990 static void
6991 decode_tic6x_unwind_regmask (unsigned int mask)
6992 {
6993   int i;
6994
6995   for (i = 12; mask; mask >>= 1, i--)
6996     {
6997       if (mask & 1)
6998         {
6999           fputs (tic6x_unwind_regnames[i], stdout);
7000           if (mask > 1)
7001             fputs (", ", stdout);
7002         }
7003     }
7004 }
7005
7006 #define ADVANCE                                                 \
7007   if (remaining == 0 && more_words)                             \
7008     {                                                           \
7009       data_offset += 4;                                         \
7010       if (! get_unwind_section_word (aux, data_arm_sec, data_sec,       \
7011                                      data_offset, & word, & addr, NULL))        \
7012         return;                                                 \
7013       remaining = 4;                                            \
7014       more_words--;                                             \
7015     }                                                           \
7016
7017 #define GET_OP(OP)                      \
7018   ADVANCE;                              \
7019   if (remaining)                        \
7020     {                                   \
7021       remaining--;                      \
7022       (OP) = word >> 24;                \
7023       word <<= 8;                       \
7024     }                                   \
7025   else                                  \
7026     {                                   \
7027       printf (_("[Truncated opcode]\n"));       \
7028       return;                           \
7029     }                                   \
7030   printf ("0x%02x ", OP)
7031
7032 static void
7033 decode_arm_unwind_bytecode (struct arm_unw_aux_info *aux,
7034                             unsigned int word, unsigned int remaining,
7035                             unsigned int more_words,
7036                             bfd_vma data_offset, Elf_Internal_Shdr *data_sec,
7037                             struct arm_section *data_arm_sec)
7038 {
7039   struct absaddr addr;
7040
7041   /* Decode the unwinding instructions.  */
7042   while (1)
7043     {
7044       unsigned int op, op2;
7045
7046       ADVANCE;
7047       if (remaining == 0)
7048         break;
7049       remaining--;
7050       op = word >> 24;
7051       word <<= 8;
7052
7053       printf ("  0x%02x ", op);
7054
7055       if ((op & 0xc0) == 0x00)
7056         {
7057           int offset = ((op & 0x3f) << 2) + 4;
7058
7059           printf ("     vsp = vsp + %d", offset);
7060         }
7061       else if ((op & 0xc0) == 0x40)
7062         {
7063           int offset = ((op & 0x3f) << 2) + 4;
7064
7065           printf ("     vsp = vsp - %d", offset);
7066         }
7067       else if ((op & 0xf0) == 0x80)
7068         {
7069           GET_OP (op2);
7070           if (op == 0x80 && op2 == 0)
7071             printf (_("Refuse to unwind"));
7072           else
7073             {
7074               unsigned int mask = ((op & 0x0f) << 8) | op2;
7075               int first = 1;
7076               int i;
7077
7078               printf ("pop {");
7079               for (i = 0; i < 12; i++)
7080                 if (mask & (1 << i))
7081                   {
7082                     if (first)
7083                       first = 0;
7084                     else
7085                       printf (", ");
7086                     printf ("r%d", 4 + i);
7087                   }
7088               printf ("}");
7089             }
7090         }
7091       else if ((op & 0xf0) == 0x90)
7092         {
7093           if (op == 0x9d || op == 0x9f)
7094             printf (_("     [Reserved]"));
7095           else
7096             printf ("     vsp = r%d", op & 0x0f);
7097         }
7098       else if ((op & 0xf0) == 0xa0)
7099         {
7100           int end = 4 + (op & 0x07);
7101           int first = 1;
7102           int i;
7103
7104           printf ("     pop {");
7105           for (i = 4; i <= end; i++)
7106             {
7107               if (first)
7108                 first = 0;
7109               else
7110                 printf (", ");
7111               printf ("r%d", i);
7112             }
7113           if (op & 0x08)
7114             {
7115               if (!first)
7116                 printf (", ");
7117               printf ("r14");
7118             }
7119           printf ("}");
7120         }
7121       else if (op == 0xb0)
7122         printf (_("     finish"));
7123       else if (op == 0xb1)
7124         {
7125           GET_OP (op2);
7126           if (op2 == 0 || (op2 & 0xf0) != 0)
7127             printf (_("[Spare]"));
7128           else
7129             {
7130               unsigned int mask = op2 & 0x0f;
7131               int first = 1;
7132               int i;
7133
7134               printf ("pop {");
7135               for (i = 0; i < 12; i++)
7136                 if (mask & (1 << i))
7137                   {
7138                     if (first)
7139                       first = 0;
7140                     else
7141                       printf (", ");
7142                     printf ("r%d", i);
7143                   }
7144               printf ("}");
7145             }
7146         }
7147       else if (op == 0xb2)
7148         {
7149           unsigned char buf[9];
7150           unsigned int i, len;
7151           unsigned long offset;
7152
7153           for (i = 0; i < sizeof (buf); i++)
7154             {
7155               GET_OP (buf[i]);
7156               if ((buf[i] & 0x80) == 0)
7157                 break;
7158             }
7159           assert (i < sizeof (buf));
7160           offset = read_uleb128 (buf, &len, buf + i + 1);
7161           assert (len == i + 1);
7162           offset = offset * 4 + 0x204;
7163           printf ("vsp = vsp + %ld", offset);
7164         }
7165       else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
7166         {
7167           unsigned int first, last;
7168
7169           GET_OP (op2);
7170           first = op2 >> 4;
7171           last = op2 & 0x0f;
7172           if (op == 0xc8)
7173             first = first + 16;
7174           printf ("pop {D%d", first);
7175           if (last)
7176             printf ("-D%d", first + last);
7177           printf ("}");
7178         }
7179       else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
7180         {
7181           unsigned int count = op & 0x07;
7182
7183           printf ("pop {D8");
7184           if (count)
7185             printf ("-D%d", 8 + count);
7186           printf ("}");
7187         }
7188       else if (op >= 0xc0 && op <= 0xc5)
7189         {
7190           unsigned int count = op & 0x07;
7191
7192           printf ("     pop {wR10");
7193           if (count)
7194             printf ("-wR%d", 10 + count);
7195           printf ("}");
7196         }
7197       else if (op == 0xc6)
7198         {
7199           unsigned int first, last;
7200
7201           GET_OP (op2);
7202           first = op2 >> 4;
7203           last = op2 & 0x0f;
7204           printf ("pop {wR%d", first);
7205           if (last)
7206             printf ("-wR%d", first + last);
7207           printf ("}");
7208         }
7209       else if (op == 0xc7)
7210         {
7211           GET_OP (op2);
7212           if (op2 == 0 || (op2 & 0xf0) != 0)
7213             printf (_("[Spare]"));
7214           else
7215             {
7216               unsigned int mask = op2 & 0x0f;
7217               int first = 1;
7218               int i;
7219
7220               printf ("pop {");
7221               for (i = 0; i < 4; i++)
7222                 if (mask & (1 << i))
7223                   {
7224                     if (first)
7225                       first = 0;
7226                     else
7227                       printf (", ");
7228                     printf ("wCGR%d", i);
7229                   }
7230               printf ("}");
7231             }
7232         }
7233       else
7234         printf (_("     [unsupported opcode]"));
7235       printf ("\n");
7236     }
7237 }
7238
7239 static void
7240 decode_tic6x_unwind_bytecode (struct arm_unw_aux_info *aux,
7241                             unsigned int word, unsigned int remaining,
7242                             unsigned int more_words,
7243                             bfd_vma data_offset, Elf_Internal_Shdr *data_sec,
7244                             struct arm_section *data_arm_sec)
7245 {
7246   struct absaddr addr;
7247
7248   /* Decode the unwinding instructions.  */
7249   while (1)
7250     {
7251       unsigned int op, op2;
7252
7253       ADVANCE;
7254       if (remaining == 0)
7255         break;
7256       remaining--;
7257       op = word >> 24;
7258       word <<= 8;
7259
7260       printf ("  0x%02x ", op);
7261
7262       if ((op & 0xc0) == 0x00)
7263         {
7264           int offset = ((op & 0x3f) << 3) + 8;
7265           printf ("     sp = sp + %d", offset);
7266         }
7267       else if ((op & 0xc0) == 0x80)
7268         {
7269           GET_OP (op2);
7270           if (op == 0x80 && op2 == 0)
7271             printf (_("Refuse to unwind"));
7272           else
7273             {
7274               unsigned int mask = ((op & 0x1f) << 8) | op2;
7275               if (op & 0x20)
7276                 printf ("pop compact {");
7277               else
7278                 printf ("pop {");
7279
7280               decode_tic6x_unwind_regmask (mask);
7281               printf("}");
7282             }
7283         }
7284       else if ((op & 0xf0) == 0xc0)
7285         {
7286           unsigned int reg;
7287           unsigned int nregs;
7288           unsigned int i;
7289           const char *name;
7290           struct
7291           {
7292               unsigned int offset;
7293               unsigned int reg;
7294           } regpos[16];
7295
7296           /* Scan entire instruction first so that GET_OP output is not
7297              interleaved with disassembly.  */
7298           nregs = 0;
7299           for (i = 0; nregs < (op & 0xf); i++)
7300             {
7301               GET_OP (op2);
7302               reg = op2 >> 4;
7303               if (reg != 0xf)
7304                 {
7305                   regpos[nregs].offset = i * 2;
7306                   regpos[nregs].reg = reg;
7307                   nregs++;
7308                 }
7309
7310               reg = op2 & 0xf;
7311               if (reg != 0xf)
7312                 {
7313                   regpos[nregs].offset = i * 2 + 1;
7314                   regpos[nregs].reg = reg;
7315                   nregs++;
7316                 }
7317             }
7318
7319           printf (_("pop frame {"));
7320           reg = nregs - 1;
7321           for (i = i * 2; i > 0; i--)
7322             {
7323               if (regpos[reg].offset == i - 1)
7324                 {
7325                   name = tic6x_unwind_regnames[regpos[reg].reg];
7326                   if (reg > 0)
7327                     reg--;
7328                 }
7329               else
7330                 name = _("[pad]");
7331
7332               fputs (name, stdout);
7333               if (i > 1)
7334                 printf (", ");
7335             }
7336
7337           printf ("}");
7338         }
7339       else if (op == 0xd0)
7340         printf ("     MOV FP, SP");
7341       else if (op == 0xd1)
7342         printf ("     __c6xabi_pop_rts");
7343       else if (op == 0xd2)
7344         {
7345           unsigned char buf[9];
7346           unsigned int i, len;
7347           unsigned long offset;
7348
7349           for (i = 0; i < sizeof (buf); i++)
7350             {
7351               GET_OP (buf[i]);
7352               if ((buf[i] & 0x80) == 0)
7353                 break;
7354             }
7355           assert (i < sizeof (buf));
7356           offset = read_uleb128 (buf, &len, buf + i + 1);
7357           assert (len == i + 1);
7358           offset = offset * 8 + 0x408;
7359           printf (_("sp = sp + %ld"), offset);
7360         }
7361       else if ((op & 0xf0) == 0xe0)
7362         {
7363           if ((op & 0x0f) == 7)
7364             printf ("     RETURN");
7365           else
7366             printf ("     MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
7367         }
7368       else
7369         {
7370           printf (_("     [unsupported opcode]"));
7371         }
7372       putchar ('\n');
7373     }
7374 }
7375
7376 static bfd_vma
7377 arm_expand_prel31 (bfd_vma word, bfd_vma where)
7378 {
7379   bfd_vma offset;
7380
7381   offset = word & 0x7fffffff;
7382   if (offset & 0x40000000)
7383     offset |= ~ (bfd_vma) 0x7fffffff;
7384
7385   if (elf_header.e_machine == EM_TI_C6000)
7386     offset <<= 1;
7387
7388   return offset + where;
7389 }
7390
7391 static void
7392 decode_arm_unwind (struct arm_unw_aux_info *  aux,
7393                    unsigned int               word,
7394                    unsigned int               remaining,
7395                    bfd_vma                    data_offset,
7396                    Elf_Internal_Shdr *        data_sec,
7397                    struct arm_section *       data_arm_sec)
7398 {
7399   int per_index;
7400   unsigned int more_words = 0;
7401   struct absaddr addr;
7402   bfd_vma sym_name = (bfd_vma) -1;
7403
7404   if (remaining == 0)
7405     {
7406       /* Fetch the first word.
7407          Note - when decoding an object file the address extracted
7408          here will always be 0.  So we also pass in the sym_name
7409          parameter so that we can find the symbol associated with
7410          the personality routine.  */
7411       if (! get_unwind_section_word (aux, data_arm_sec, data_sec, data_offset,
7412                                      & word, & addr, & sym_name))
7413         return;
7414
7415       remaining = 4;
7416     }
7417
7418   if ((word & 0x80000000) == 0)
7419     {
7420       /* Expand prel31 for personality routine.  */
7421       bfd_vma fn;
7422       const char *procname;
7423
7424       fn = arm_expand_prel31 (word, data_sec->sh_addr + data_offset);
7425       printf (_("  Personality routine: "));
7426       if (fn == 0
7427           && addr.section == SHN_UNDEF && addr.offset == 0
7428           && sym_name != (bfd_vma) -1 && sym_name < aux->strtab_size)
7429         {
7430           procname = aux->strtab + sym_name;
7431           print_vma (fn, PREFIX_HEX);
7432           if (procname)
7433             {
7434               fputs (" <", stdout);
7435               fputs (procname, stdout);
7436               fputc ('>', stdout);
7437             }
7438         }
7439       else
7440         procname = arm_print_vma_and_name (aux, fn, addr);
7441       fputc ('\n', stdout);
7442
7443       /* The GCC personality routines use the standard compact
7444          encoding, starting with one byte giving the number of
7445          words.  */
7446       if (procname != NULL
7447           && (const_strneq (procname, "__gcc_personality_v0")
7448               || const_strneq (procname, "__gxx_personality_v0")
7449               || const_strneq (procname, "__gcj_personality_v0")
7450               || const_strneq (procname, "__gnu_objc_personality_v0")))
7451         {
7452           remaining = 0;
7453           more_words = 1;
7454           ADVANCE;
7455           if (!remaining)
7456             {
7457               printf (_("  [Truncated data]\n"));
7458               return;
7459             }
7460           more_words = word >> 24;
7461           word <<= 8;
7462           remaining--;
7463           per_index = -1;
7464         }
7465       else
7466         return;
7467     }
7468   else
7469     {
7470       /* ARM EHABI Section 6.3:
7471
7472          An exception-handling table entry for the compact model looks like:
7473
7474            31 30-28 27-24 23-0
7475            -- ----- ----- ----
7476             1   0   index Data for personalityRoutine[index]    */
7477
7478       if (elf_header.e_machine == EM_ARM
7479           && (word & 0x70000000))
7480         warn (_("Corrupt ARM compact model table entry: %x \n"), word);
7481
7482       per_index = (word >> 24) & 0x7f;
7483       printf (_("  Compact model index: %d\n"), per_index);
7484       if (per_index == 0)
7485         {
7486           more_words = 0;
7487           word <<= 8;
7488           remaining--;
7489         }
7490       else if (per_index < 3)
7491         {
7492           more_words = (word >> 16) & 0xff;
7493           word <<= 16;
7494           remaining -= 2;
7495         }
7496     }
7497
7498   switch (elf_header.e_machine)
7499     {
7500     case EM_ARM:
7501       if (per_index < 3)
7502         {
7503           decode_arm_unwind_bytecode (aux, word, remaining, more_words,
7504                                       data_offset, data_sec, data_arm_sec);
7505         }
7506       else
7507         {
7508           warn (_("Unknown ARM compact model index encountered\n"));
7509           printf (_("  [reserved]\n"));
7510         }
7511       break;
7512
7513     case EM_TI_C6000:
7514       if (per_index < 3)
7515         {
7516           decode_tic6x_unwind_bytecode (aux, word, remaining, more_words,
7517                                         data_offset, data_sec, data_arm_sec);
7518         }
7519       else if (per_index < 5)
7520         {
7521           if (((word >> 17) & 0x7f) == 0x7f)
7522             printf (_("  Restore stack from frame pointer\n"));
7523           else
7524             printf (_("  Stack increment %d\n"), (word >> 14) & 0x1fc);
7525           printf (_("  Registers restored: "));
7526           if (per_index == 4)
7527             printf (" (compact) ");
7528           decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
7529           putchar ('\n');
7530           printf (_("  Return register: %s\n"),
7531                   tic6x_unwind_regnames[word & 0xf]);
7532         }
7533       else
7534         printf (_("  [reserved (%d)]\n"), per_index);
7535       break;
7536
7537     default:
7538       error (_("Unsupported architecture type %d encountered when decoding unwind table"),
7539              elf_header.e_machine);
7540     }
7541
7542   /* Decode the descriptors.  Not implemented.  */
7543 }
7544
7545 static void
7546 dump_arm_unwind (struct arm_unw_aux_info *aux, Elf_Internal_Shdr *exidx_sec)
7547 {
7548   struct arm_section exidx_arm_sec, extab_arm_sec;
7549   unsigned int i, exidx_len;
7550
7551   memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
7552   memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
7553   exidx_len = exidx_sec->sh_size / 8;
7554
7555   for (i = 0; i < exidx_len; i++)
7556     {
7557       unsigned int exidx_fn, exidx_entry;
7558       struct absaddr fn_addr, entry_addr;
7559       bfd_vma fn;
7560
7561       fputc ('\n', stdout);
7562
7563       if (! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
7564                                      8 * i, & exidx_fn, & fn_addr, NULL)
7565           || ! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
7566                                         8 * i + 4, & exidx_entry, & entry_addr, NULL))
7567         {
7568           arm_free_section (& exidx_arm_sec);
7569           arm_free_section (& extab_arm_sec);
7570           return;
7571         }
7572
7573       /* ARM EHABI, Section 5:
7574          An index table entry consists of 2 words.
7575          The first word contains a prel31 offset to the start of a function, with bit 31 clear.  */
7576       if (exidx_fn & 0x80000000)
7577         warn (_("corrupt index table entry: %x\n"), exidx_fn);
7578
7579       fn = arm_expand_prel31 (exidx_fn, exidx_sec->sh_addr + 8 * i);
7580
7581       arm_print_vma_and_name (aux, fn, fn_addr);
7582       fputs (": ", stdout);
7583
7584       if (exidx_entry == 1)
7585         {
7586           print_vma (exidx_entry, PREFIX_HEX);
7587           fputs (" [cantunwind]\n", stdout);
7588         }
7589       else if (exidx_entry & 0x80000000)
7590         {
7591           print_vma (exidx_entry, PREFIX_HEX);
7592           fputc ('\n', stdout);
7593           decode_arm_unwind (aux, exidx_entry, 4, 0, NULL, NULL);
7594         }
7595       else
7596         {
7597           bfd_vma table, table_offset = 0;
7598           Elf_Internal_Shdr *table_sec;
7599
7600           fputs ("@", stdout);
7601           table = arm_expand_prel31 (exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
7602           print_vma (table, PREFIX_HEX);
7603           printf ("\n");
7604
7605           /* Locate the matching .ARM.extab.  */
7606           if (entry_addr.section != SHN_UNDEF
7607               && entry_addr.section < elf_header.e_shnum)
7608             {
7609               table_sec = section_headers + entry_addr.section;
7610               table_offset = entry_addr.offset;
7611             }
7612           else
7613             {
7614               table_sec = find_section_by_address (table);
7615               if (table_sec != NULL)
7616                 table_offset = table - table_sec->sh_addr;
7617             }
7618           if (table_sec == NULL)
7619             {
7620               warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
7621                     (unsigned long) table);
7622               continue;
7623             }
7624           decode_arm_unwind (aux, 0, 0, table_offset, table_sec,
7625                              &extab_arm_sec);
7626         }
7627     }
7628
7629   printf ("\n");
7630
7631   arm_free_section (&exidx_arm_sec);
7632   arm_free_section (&extab_arm_sec);
7633 }
7634
7635 /* Used for both ARM and C6X unwinding tables.  */
7636
7637 static void
7638 arm_process_unwind (FILE *file)
7639 {
7640   struct arm_unw_aux_info aux;
7641   Elf_Internal_Shdr *unwsec = NULL;
7642   Elf_Internal_Shdr *strsec;
7643   Elf_Internal_Shdr *sec;
7644   unsigned long i;
7645   unsigned int sec_type;
7646
7647   switch (elf_header.e_machine)
7648     {
7649     case EM_ARM:
7650       sec_type = SHT_ARM_EXIDX;
7651       break;
7652
7653     case EM_TI_C6000:
7654       sec_type = SHT_C6000_UNWIND;
7655       break;
7656
7657     default:
7658       error (_("Unsupported architecture type %d encountered when processing unwind table"),
7659              elf_header.e_machine);
7660       return;
7661     }
7662
7663   if (string_table == NULL)
7664     return;
7665
7666   memset (& aux, 0, sizeof (aux));
7667   aux.file = file;
7668
7669   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7670     {
7671       if (sec->sh_type == SHT_SYMTAB && sec->sh_link < elf_header.e_shnum)
7672         {
7673           aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
7674
7675           strsec = section_headers + sec->sh_link;
7676           assert (aux.strtab == NULL);
7677           aux.strtab = get_data (NULL, file, strsec->sh_offset,
7678                                  1, strsec->sh_size, _("string table"));
7679           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7680         }
7681       else if (sec->sh_type == sec_type)
7682         unwsec = sec;
7683     }
7684
7685   if (unwsec == NULL)
7686     printf (_("\nThere are no unwind sections in this file.\n"));
7687   else
7688     for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7689       {
7690         if (sec->sh_type == sec_type)
7691           {
7692             printf (_("\nUnwind table index '%s' at offset 0x%lx contains %lu entries:\n"),
7693                     SECTION_NAME (sec),
7694                     (unsigned long) sec->sh_offset,
7695                     (unsigned long) (sec->sh_size / (2 * eh_addr_size)));
7696
7697             dump_arm_unwind (&aux, sec);
7698           }
7699       }
7700
7701   if (aux.symtab)
7702     free (aux.symtab);
7703   if (aux.strtab)
7704     free ((char *) aux.strtab);
7705 }
7706
7707 static void
7708 process_unwind (FILE * file)
7709 {
7710   struct unwind_handler
7711   {
7712     int machtype;
7713     void (* handler)(FILE *);
7714   } handlers[] =
7715   {
7716     { EM_ARM, arm_process_unwind },
7717     { EM_IA_64, ia64_process_unwind },
7718     { EM_PARISC, hppa_process_unwind },
7719     { EM_TI_C6000, arm_process_unwind },
7720     { 0, 0 }
7721   };
7722   int i;
7723
7724   if (!do_unwind)
7725     return;
7726
7727   for (i = 0; handlers[i].handler != NULL; i++)
7728     if (elf_header.e_machine == handlers[i].machtype)
7729       {
7730         handlers[i].handler (file);
7731         return;
7732       }
7733
7734   printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
7735           get_machine_name (elf_header.e_machine));
7736 }
7737
7738 static void
7739 dynamic_section_mips_val (Elf_Internal_Dyn * entry)
7740 {
7741   switch (entry->d_tag)
7742     {
7743     case DT_MIPS_FLAGS:
7744       if (entry->d_un.d_val == 0)
7745         printf (_("NONE"));
7746       else
7747         {
7748           static const char * opts[] =
7749           {
7750             "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
7751             "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
7752             "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
7753             "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
7754             "RLD_ORDER_SAFE"
7755           };
7756           unsigned int cnt;
7757           int first = 1;
7758
7759           for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
7760             if (entry->d_un.d_val & (1 << cnt))
7761               {
7762                 printf ("%s%s", first ? "" : " ", opts[cnt]);
7763                 first = 0;
7764               }
7765         }
7766       break;
7767
7768     case DT_MIPS_IVERSION:
7769       if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
7770         printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry->d_un.d_val));
7771       else
7772         printf (_("<corrupt: %" BFD_VMA_FMT "d>"), entry->d_un.d_ptr);
7773       break;
7774
7775     case DT_MIPS_TIME_STAMP:
7776       {
7777         char timebuf[20];
7778         struct tm * tmp;
7779
7780         time_t atime = entry->d_un.d_val;
7781         tmp = gmtime (&atime);
7782         snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
7783                   tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
7784                   tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
7785         printf (_("Time Stamp: %s"), timebuf);
7786       }
7787       break;
7788
7789     case DT_MIPS_RLD_VERSION:
7790     case DT_MIPS_LOCAL_GOTNO:
7791     case DT_MIPS_CONFLICTNO:
7792     case DT_MIPS_LIBLISTNO:
7793     case DT_MIPS_SYMTABNO:
7794     case DT_MIPS_UNREFEXTNO:
7795     case DT_MIPS_HIPAGENO:
7796     case DT_MIPS_DELTA_CLASS_NO:
7797     case DT_MIPS_DELTA_INSTANCE_NO:
7798     case DT_MIPS_DELTA_RELOC_NO:
7799     case DT_MIPS_DELTA_SYM_NO:
7800     case DT_MIPS_DELTA_CLASSSYM_NO:
7801     case DT_MIPS_COMPACT_SIZE:
7802       print_vma (entry->d_un.d_ptr, DEC);
7803       break;
7804
7805     default:
7806       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
7807     }
7808     putchar ('\n');
7809 }
7810
7811 static void
7812 dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
7813 {
7814   switch (entry->d_tag)
7815     {
7816     case DT_HP_DLD_FLAGS:
7817       {
7818         static struct
7819         {
7820           long int bit;
7821           const char * str;
7822         }
7823         flags[] =
7824         {
7825           { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
7826           { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
7827           { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
7828           { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
7829           { DT_HP_BIND_NOW, "HP_BIND_NOW" },
7830           { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
7831           { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
7832           { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
7833           { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
7834           { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
7835           { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
7836           { DT_HP_GST, "HP_GST" },
7837           { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
7838           { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
7839           { DT_HP_NODELETE, "HP_NODELETE" },
7840           { DT_HP_GROUP, "HP_GROUP" },
7841           { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
7842         };
7843         int first = 1;
7844         size_t cnt;
7845         bfd_vma val = entry->d_un.d_val;
7846
7847         for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
7848           if (val & flags[cnt].bit)
7849             {
7850               if (! first)
7851                 putchar (' ');
7852               fputs (flags[cnt].str, stdout);
7853               first = 0;
7854               val ^= flags[cnt].bit;
7855             }
7856
7857         if (val != 0 || first)
7858           {
7859             if (! first)
7860               putchar (' ');
7861             print_vma (val, HEX);
7862           }
7863       }
7864       break;
7865
7866     default:
7867       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
7868       break;
7869     }
7870   putchar ('\n');
7871 }
7872
7873 #ifdef BFD64
7874
7875 /* VMS vs Unix time offset and factor.  */
7876
7877 #define VMS_EPOCH_OFFSET 35067168000000000LL
7878 #define VMS_GRANULARITY_FACTOR 10000000
7879
7880 /* Display a VMS time in a human readable format.  */
7881
7882 static void
7883 print_vms_time (bfd_int64_t vmstime)
7884 {
7885   struct tm *tm;
7886   time_t unxtime;
7887
7888   unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
7889   tm = gmtime (&unxtime);
7890   printf ("%04u-%02u-%02uT%02u:%02u:%02u",
7891           tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
7892           tm->tm_hour, tm->tm_min, tm->tm_sec);
7893 }
7894 #endif /* BFD64 */
7895
7896 static void
7897 dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
7898 {
7899   switch (entry->d_tag)
7900     {
7901     case DT_IA_64_PLT_RESERVE:
7902       /* First 3 slots reserved.  */
7903       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
7904       printf (" -- ");
7905       print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
7906       break;
7907
7908     case DT_IA_64_VMS_LINKTIME:
7909 #ifdef BFD64
7910       print_vms_time (entry->d_un.d_val);
7911 #endif
7912       break;
7913
7914     case DT_IA_64_VMS_LNKFLAGS:
7915       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
7916       if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
7917         printf (" CALL_DEBUG");
7918       if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
7919         printf (" NOP0BUFS");
7920       if (entry->d_un.d_val & VMS_LF_P0IMAGE)
7921         printf (" P0IMAGE");
7922       if (entry->d_un.d_val & VMS_LF_MKTHREADS)
7923         printf (" MKTHREADS");
7924       if (entry->d_un.d_val & VMS_LF_UPCALLS)
7925         printf (" UPCALLS");
7926       if (entry->d_un.d_val & VMS_LF_IMGSTA)
7927         printf (" IMGSTA");
7928       if (entry->d_un.d_val & VMS_LF_INITIALIZE)
7929         printf (" INITIALIZE");
7930       if (entry->d_un.d_val & VMS_LF_MAIN)
7931         printf (" MAIN");
7932       if (entry->d_un.d_val & VMS_LF_EXE_INIT)
7933         printf (" EXE_INIT");
7934       if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
7935         printf (" TBK_IN_IMG");
7936       if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
7937         printf (" DBG_IN_IMG");
7938       if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
7939         printf (" TBK_IN_DSF");
7940       if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
7941         printf (" DBG_IN_DSF");
7942       if (entry->d_un.d_val & VMS_LF_SIGNATURES)
7943         printf (" SIGNATURES");
7944       if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
7945         printf (" REL_SEG_OFF");
7946       break;
7947
7948     default:
7949       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
7950       break;
7951     }
7952   putchar ('\n');
7953 }
7954
7955 static int
7956 get_32bit_dynamic_section (FILE * file)
7957 {
7958   Elf32_External_Dyn * edyn;
7959   Elf32_External_Dyn * ext;
7960   Elf_Internal_Dyn * entry;
7961
7962   edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
7963                                           dynamic_size, _("dynamic section"));
7964   if (!edyn)
7965     return 0;
7966
7967 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
7968    might not have the luxury of section headers.  Look for the DT_NULL
7969    terminator to determine the number of entries.  */
7970   for (ext = edyn, dynamic_nent = 0;
7971        (char *) ext < (char *) edyn + dynamic_size;
7972        ext++)
7973     {
7974       dynamic_nent++;
7975       if (BYTE_GET (ext->d_tag) == DT_NULL)
7976         break;
7977     }
7978
7979   dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
7980                                                   sizeof (* entry));
7981   if (dynamic_section == NULL)
7982     {
7983       error (_("Out of memory\n"));
7984       free (edyn);
7985       return 0;
7986     }
7987
7988   for (ext = edyn, entry = dynamic_section;
7989        entry < dynamic_section + dynamic_nent;
7990        ext++, entry++)
7991     {
7992       entry->d_tag      = BYTE_GET (ext->d_tag);
7993       entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
7994     }
7995
7996   free (edyn);
7997
7998   return 1;
7999 }
8000
8001 static int
8002 get_64bit_dynamic_section (FILE * file)
8003 {
8004   Elf64_External_Dyn * edyn;
8005   Elf64_External_Dyn * ext;
8006   Elf_Internal_Dyn * entry;
8007
8008   edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
8009                                           dynamic_size, _("dynamic section"));
8010   if (!edyn)
8011     return 0;
8012
8013 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
8014    might not have the luxury of section headers.  Look for the DT_NULL
8015    terminator to determine the number of entries.  */
8016   for (ext = edyn, dynamic_nent = 0;
8017        (char *) ext < (char *) edyn + dynamic_size;
8018        ext++)
8019     {
8020       dynamic_nent++;
8021       if (BYTE_GET (ext->d_tag) == DT_NULL)
8022         break;
8023     }
8024
8025   dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
8026                                                   sizeof (* entry));
8027   if (dynamic_section == NULL)
8028     {
8029       error (_("Out of memory\n"));
8030       free (edyn);
8031       return 0;
8032     }
8033
8034   for (ext = edyn, entry = dynamic_section;
8035        entry < dynamic_section + dynamic_nent;
8036        ext++, entry++)
8037     {
8038       entry->d_tag      = BYTE_GET (ext->d_tag);
8039       entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
8040     }
8041
8042   free (edyn);
8043
8044   return 1;
8045 }
8046
8047 static void
8048 print_dynamic_flags (bfd_vma flags)
8049 {
8050   int first = 1;
8051
8052   while (flags)
8053     {
8054       bfd_vma flag;
8055
8056       flag = flags & - flags;
8057       flags &= ~ flag;
8058
8059       if (first)
8060         first = 0;
8061       else
8062         putc (' ', stdout);
8063
8064       switch (flag)
8065         {
8066         case DF_ORIGIN:         fputs ("ORIGIN", stdout); break;
8067         case DF_SYMBOLIC:       fputs ("SYMBOLIC", stdout); break;
8068         case DF_TEXTREL:        fputs ("TEXTREL", stdout); break;
8069         case DF_BIND_NOW:       fputs ("BIND_NOW", stdout); break;
8070         case DF_STATIC_TLS:     fputs ("STATIC_TLS", stdout); break;
8071         default:                fputs (_("unknown"), stdout); break;
8072         }
8073     }
8074   puts ("");
8075 }
8076
8077 /* Parse and display the contents of the dynamic section.  */
8078
8079 static int
8080 process_dynamic_section (FILE * file)
8081 {
8082   Elf_Internal_Dyn * entry;
8083
8084   if (dynamic_size == 0)
8085     {
8086       if (do_dynamic)
8087         printf (_("\nThere is no dynamic section in this file.\n"));
8088
8089       return 1;
8090     }
8091
8092   if (is_32bit_elf)
8093     {
8094       if (! get_32bit_dynamic_section (file))
8095         return 0;
8096     }
8097   else if (! get_64bit_dynamic_section (file))
8098     return 0;
8099
8100   /* Find the appropriate symbol table.  */
8101   if (dynamic_symbols == NULL)
8102     {
8103       for (entry = dynamic_section;
8104            entry < dynamic_section + dynamic_nent;
8105            ++entry)
8106         {
8107           Elf_Internal_Shdr section;
8108
8109           if (entry->d_tag != DT_SYMTAB)
8110             continue;
8111
8112           dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
8113
8114           /* Since we do not know how big the symbol table is,
8115              we default to reading in the entire file (!) and
8116              processing that.  This is overkill, I know, but it
8117              should work.  */
8118           section.sh_offset = offset_from_vma (file, entry->d_un.d_val, 0);
8119
8120           if (archive_file_offset != 0)
8121             section.sh_size = archive_file_size - section.sh_offset;
8122           else
8123             {
8124               if (fseek (file, 0, SEEK_END))
8125                 error (_("Unable to seek to end of file!\n"));
8126
8127               section.sh_size = ftell (file) - section.sh_offset;
8128             }
8129
8130           if (is_32bit_elf)
8131             section.sh_entsize = sizeof (Elf32_External_Sym);
8132           else
8133             section.sh_entsize = sizeof (Elf64_External_Sym);
8134
8135           dynamic_symbols = GET_ELF_SYMBOLS (file, &section, & num_dynamic_syms);
8136           if (num_dynamic_syms < 1)
8137             {
8138               error (_("Unable to determine the number of symbols to load\n"));
8139               continue;
8140             }
8141         }
8142     }
8143
8144   /* Similarly find a string table.  */
8145   if (dynamic_strings == NULL)
8146     {
8147       for (entry = dynamic_section;
8148            entry < dynamic_section + dynamic_nent;
8149            ++entry)
8150         {
8151           unsigned long offset;
8152           long str_tab_len;
8153
8154           if (entry->d_tag != DT_STRTAB)
8155             continue;
8156
8157           dynamic_info[DT_STRTAB] = entry->d_un.d_val;
8158
8159           /* Since we do not know how big the string table is,
8160              we default to reading in the entire file (!) and
8161              processing that.  This is overkill, I know, but it
8162              should work.  */
8163
8164           offset = offset_from_vma (file, entry->d_un.d_val, 0);
8165
8166           if (archive_file_offset != 0)
8167             str_tab_len = archive_file_size - offset;
8168           else
8169             {
8170               if (fseek (file, 0, SEEK_END))
8171                 error (_("Unable to seek to end of file\n"));
8172               str_tab_len = ftell (file) - offset;
8173             }
8174
8175           if (str_tab_len < 1)
8176             {
8177               error
8178                 (_("Unable to determine the length of the dynamic string table\n"));
8179               continue;
8180             }
8181
8182           dynamic_strings = (char *) get_data (NULL, file, offset, 1,
8183                                                str_tab_len,
8184                                                _("dynamic string table"));
8185           dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
8186           break;
8187         }
8188     }
8189
8190   /* And find the syminfo section if available.  */
8191   if (dynamic_syminfo == NULL)
8192     {
8193       unsigned long syminsz = 0;
8194
8195       for (entry = dynamic_section;
8196            entry < dynamic_section + dynamic_nent;
8197            ++entry)
8198         {
8199           if (entry->d_tag == DT_SYMINENT)
8200             {
8201               /* Note: these braces are necessary to avoid a syntax
8202                  error from the SunOS4 C compiler.  */
8203               assert (sizeof (Elf_External_Syminfo) == entry->d_un.d_val);
8204             }
8205           else if (entry->d_tag == DT_SYMINSZ)
8206             syminsz = entry->d_un.d_val;
8207           else if (entry->d_tag == DT_SYMINFO)
8208             dynamic_syminfo_offset = offset_from_vma (file, entry->d_un.d_val,
8209                                                       syminsz);
8210         }
8211
8212       if (dynamic_syminfo_offset != 0 && syminsz != 0)
8213         {
8214           Elf_External_Syminfo * extsyminfo;
8215           Elf_External_Syminfo * extsym;
8216           Elf_Internal_Syminfo * syminfo;
8217
8218           /* There is a syminfo section.  Read the data.  */
8219           extsyminfo = (Elf_External_Syminfo *)
8220               get_data (NULL, file, dynamic_syminfo_offset, 1, syminsz,
8221                         _("symbol information"));
8222           if (!extsyminfo)
8223             return 0;
8224
8225           dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
8226           if (dynamic_syminfo == NULL)
8227             {
8228               error (_("Out of memory\n"));
8229               return 0;
8230             }
8231
8232           dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
8233           for (syminfo = dynamic_syminfo, extsym = extsyminfo;
8234                syminfo < dynamic_syminfo + dynamic_syminfo_nent;
8235                ++syminfo, ++extsym)
8236             {
8237               syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
8238               syminfo->si_flags = BYTE_GET (extsym->si_flags);
8239             }
8240
8241           free (extsyminfo);
8242         }
8243     }
8244
8245   if (do_dynamic && dynamic_addr)
8246     printf (_("\nDynamic section at offset 0x%lx contains %u entries:\n"),
8247             dynamic_addr, dynamic_nent);
8248   if (do_dynamic)
8249     printf (_("  Tag        Type                         Name/Value\n"));
8250
8251   for (entry = dynamic_section;
8252        entry < dynamic_section + dynamic_nent;
8253        entry++)
8254     {
8255       if (do_dynamic)
8256         {
8257           const char * dtype;
8258
8259           putchar (' ');
8260           print_vma (entry->d_tag, FULL_HEX);
8261           dtype = get_dynamic_type (entry->d_tag);
8262           printf (" (%s)%*s", dtype,
8263                   ((is_32bit_elf ? 27 : 19)
8264                    - (int) strlen (dtype)),
8265                   " ");
8266         }
8267
8268       switch (entry->d_tag)
8269         {
8270         case DT_FLAGS:
8271           if (do_dynamic)
8272             print_dynamic_flags (entry->d_un.d_val);
8273           break;
8274
8275         case DT_AUXILIARY:
8276         case DT_FILTER:
8277         case DT_CONFIG:
8278         case DT_DEPAUDIT:
8279         case DT_AUDIT:
8280           if (do_dynamic)
8281             {
8282               switch (entry->d_tag)
8283                 {
8284                 case DT_AUXILIARY:
8285                   printf (_("Auxiliary library"));
8286                   break;
8287
8288                 case DT_FILTER:
8289                   printf (_("Filter library"));
8290                   break;
8291
8292                 case DT_CONFIG:
8293                   printf (_("Configuration file"));
8294                   break;
8295
8296                 case DT_DEPAUDIT:
8297                   printf (_("Dependency audit library"));
8298                   break;
8299
8300                 case DT_AUDIT:
8301                   printf (_("Audit library"));
8302                   break;
8303                 }
8304
8305               if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
8306                 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
8307               else
8308                 {
8309                   printf (": ");
8310                   print_vma (entry->d_un.d_val, PREFIX_HEX);
8311                   putchar ('\n');
8312                 }
8313             }
8314           break;
8315
8316         case DT_FEATURE:
8317           if (do_dynamic)
8318             {
8319               printf (_("Flags:"));
8320
8321               if (entry->d_un.d_val == 0)
8322                 printf (_(" None\n"));
8323               else
8324                 {
8325                   unsigned long int val = entry->d_un.d_val;
8326
8327                   if (val & DTF_1_PARINIT)
8328                     {
8329                       printf (" PARINIT");
8330                       val ^= DTF_1_PARINIT;
8331                     }
8332                   if (val & DTF_1_CONFEXP)
8333                     {
8334                       printf (" CONFEXP");
8335                       val ^= DTF_1_CONFEXP;
8336                     }
8337                   if (val != 0)
8338                     printf (" %lx", val);
8339                   puts ("");
8340                 }
8341             }
8342           break;
8343
8344         case DT_POSFLAG_1:
8345           if (do_dynamic)
8346             {
8347               printf (_("Flags:"));
8348
8349               if (entry->d_un.d_val == 0)
8350                 printf (_(" None\n"));
8351               else
8352                 {
8353                   unsigned long int val = entry->d_un.d_val;
8354
8355                   if (val & DF_P1_LAZYLOAD)
8356                     {
8357                       printf (" LAZYLOAD");
8358                       val ^= DF_P1_LAZYLOAD;
8359                     }
8360                   if (val & DF_P1_GROUPPERM)
8361                     {
8362                       printf (" GROUPPERM");
8363                       val ^= DF_P1_GROUPPERM;
8364                     }
8365                   if (val != 0)
8366                     printf (" %lx", val);
8367                   puts ("");
8368                 }
8369             }
8370           break;
8371
8372         case DT_FLAGS_1:
8373           if (do_dynamic)
8374             {
8375               printf (_("Flags:"));
8376               if (entry->d_un.d_val == 0)
8377                 printf (_(" None\n"));
8378               else
8379                 {
8380                   unsigned long int val = entry->d_un.d_val;
8381
8382                   if (val & DF_1_NOW)
8383                     {
8384                       printf (" NOW");
8385                       val ^= DF_1_NOW;
8386                     }
8387                   if (val & DF_1_GLOBAL)
8388                     {
8389                       printf (" GLOBAL");
8390                       val ^= DF_1_GLOBAL;
8391                     }
8392                   if (val & DF_1_GROUP)
8393                     {
8394                       printf (" GROUP");
8395                       val ^= DF_1_GROUP;
8396                     }
8397                   if (val & DF_1_NODELETE)
8398                     {
8399                       printf (" NODELETE");
8400                       val ^= DF_1_NODELETE;
8401                     }
8402                   if (val & DF_1_LOADFLTR)
8403                     {
8404                       printf (" LOADFLTR");
8405                       val ^= DF_1_LOADFLTR;
8406                     }
8407                   if (val & DF_1_INITFIRST)
8408                     {
8409                       printf (" INITFIRST");
8410                       val ^= DF_1_INITFIRST;
8411                     }
8412                   if (val & DF_1_NOOPEN)
8413                     {
8414                       printf (" NOOPEN");
8415                       val ^= DF_1_NOOPEN;
8416                     }
8417                   if (val & DF_1_ORIGIN)
8418                     {
8419                       printf (" ORIGIN");
8420                       val ^= DF_1_ORIGIN;
8421                     }
8422                   if (val & DF_1_DIRECT)
8423                     {
8424                       printf (" DIRECT");
8425                       val ^= DF_1_DIRECT;
8426                     }
8427                   if (val & DF_1_TRANS)
8428                     {
8429                       printf (" TRANS");
8430                       val ^= DF_1_TRANS;
8431                     }
8432                   if (val & DF_1_INTERPOSE)
8433                     {
8434                       printf (" INTERPOSE");
8435                       val ^= DF_1_INTERPOSE;
8436                     }
8437                   if (val & DF_1_NODEFLIB)
8438                     {
8439                       printf (" NODEFLIB");
8440                       val ^= DF_1_NODEFLIB;
8441                     }
8442                   if (val & DF_1_NODUMP)
8443                     {
8444                       printf (" NODUMP");
8445                       val ^= DF_1_NODUMP;
8446                     }
8447                   if (val & DF_1_CONFALT)
8448                     {
8449                       printf (" CONFALT");
8450                       val ^= DF_1_CONFALT;
8451                     }
8452                   if (val & DF_1_ENDFILTEE)
8453                     {
8454                       printf (" ENDFILTEE");
8455                       val ^= DF_1_ENDFILTEE;
8456                     }
8457                   if (val & DF_1_DISPRELDNE)
8458                     {
8459                       printf (" DISPRELDNE");
8460                       val ^= DF_1_DISPRELDNE;
8461                     }
8462                   if (val & DF_1_DISPRELPND)
8463                     {
8464                       printf (" DISPRELPND");
8465                       val ^= DF_1_DISPRELPND;
8466                     }
8467                   if (val & DF_1_NODIRECT)
8468                     {
8469                       printf (" NODIRECT");
8470                       val ^= DF_1_NODIRECT;
8471                     }
8472                   if (val & DF_1_IGNMULDEF)
8473                     {
8474                       printf (" IGNMULDEF");
8475                       val ^= DF_1_IGNMULDEF;
8476                     }
8477                   if (val & DF_1_NOKSYMS)
8478                     {
8479                       printf (" NOKSYMS");
8480                       val ^= DF_1_NOKSYMS;
8481                     }
8482                   if (val & DF_1_NOHDR)
8483                     {
8484                       printf (" NOHDR");
8485                       val ^= DF_1_NOHDR;
8486                     }
8487                   if (val & DF_1_EDITED)
8488                     {
8489                       printf (" EDITED");
8490                       val ^= DF_1_EDITED;
8491                     }
8492                   if (val & DF_1_NORELOC)
8493                     {
8494                       printf (" NORELOC");
8495                       val ^= DF_1_NORELOC;
8496                     }
8497                   if (val & DF_1_SYMINTPOSE)
8498                     {
8499                       printf (" SYMINTPOSE");
8500                       val ^= DF_1_SYMINTPOSE;
8501                     }
8502                   if (val & DF_1_GLOBAUDIT)
8503                     {
8504                       printf (" GLOBAUDIT");
8505                       val ^= DF_1_GLOBAUDIT;
8506                     }
8507                   if (val & DF_1_SINGLETON)
8508                     {
8509                       printf (" SINGLETON");
8510                       val ^= DF_1_SINGLETON;
8511                     }
8512                   if (val != 0)
8513                     printf (" %lx", val);
8514                   puts ("");
8515                 }
8516             }
8517           break;
8518
8519         case DT_PLTREL:
8520           dynamic_info[entry->d_tag] = entry->d_un.d_val;
8521           if (do_dynamic)
8522             puts (get_dynamic_type (entry->d_un.d_val));
8523           break;
8524
8525         case DT_NULL    :
8526         case DT_NEEDED  :
8527         case DT_PLTGOT  :
8528         case DT_HASH    :
8529         case DT_STRTAB  :
8530         case DT_SYMTAB  :
8531         case DT_RELA    :
8532         case DT_INIT    :
8533         case DT_FINI    :
8534         case DT_SONAME  :
8535         case DT_RPATH   :
8536         case DT_SYMBOLIC:
8537         case DT_REL     :
8538         case DT_DEBUG   :
8539         case DT_TEXTREL :
8540         case DT_JMPREL  :
8541         case DT_RUNPATH :
8542           dynamic_info[entry->d_tag] = entry->d_un.d_val;
8543
8544           if (do_dynamic)
8545             {
8546               char * name;
8547
8548               if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
8549                 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
8550               else
8551                 name = NULL;
8552
8553               if (name)
8554                 {
8555                   switch (entry->d_tag)
8556                     {
8557                     case DT_NEEDED:
8558                       printf (_("Shared library: [%s]"), name);
8559
8560                       if (streq (name, program_interpreter))
8561                         printf (_(" program interpreter"));
8562                       break;
8563
8564                     case DT_SONAME:
8565                       printf (_("Library soname: [%s]"), name);
8566                       break;
8567
8568                     case DT_RPATH:
8569                       printf (_("Library rpath: [%s]"), name);
8570                       break;
8571
8572                     case DT_RUNPATH:
8573                       printf (_("Library runpath: [%s]"), name);
8574                       break;
8575
8576                     default:
8577                       print_vma (entry->d_un.d_val, PREFIX_HEX);
8578                       break;
8579                     }
8580                 }
8581               else
8582                 print_vma (entry->d_un.d_val, PREFIX_HEX);
8583
8584               putchar ('\n');
8585             }
8586           break;
8587
8588         case DT_PLTRELSZ:
8589         case DT_RELASZ  :
8590         case DT_STRSZ   :
8591         case DT_RELSZ   :
8592         case DT_RELAENT :
8593         case DT_SYMENT  :
8594         case DT_RELENT  :
8595           dynamic_info[entry->d_tag] = entry->d_un.d_val;
8596         case DT_PLTPADSZ:
8597         case DT_MOVEENT :
8598         case DT_MOVESZ  :
8599         case DT_INIT_ARRAYSZ:
8600         case DT_FINI_ARRAYSZ:
8601         case DT_GNU_CONFLICTSZ:
8602         case DT_GNU_LIBLISTSZ:
8603           if (do_dynamic)
8604             {
8605               print_vma (entry->d_un.d_val, UNSIGNED);
8606               printf (_(" (bytes)\n"));
8607             }
8608           break;
8609
8610         case DT_VERDEFNUM:
8611         case DT_VERNEEDNUM:
8612         case DT_RELACOUNT:
8613         case DT_RELCOUNT:
8614           if (do_dynamic)
8615             {
8616               print_vma (entry->d_un.d_val, UNSIGNED);
8617               putchar ('\n');
8618             }
8619           break;
8620
8621         case DT_SYMINSZ:
8622         case DT_SYMINENT:
8623         case DT_SYMINFO:
8624         case DT_USED:
8625         case DT_INIT_ARRAY:
8626         case DT_FINI_ARRAY:
8627           if (do_dynamic)
8628             {
8629               if (entry->d_tag == DT_USED
8630                   && VALID_DYNAMIC_NAME (entry->d_un.d_val))
8631                 {
8632                   char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
8633
8634                   if (*name)
8635                     {
8636                       printf (_("Not needed object: [%s]\n"), name);
8637                       break;
8638                     }
8639                 }
8640
8641               print_vma (entry->d_un.d_val, PREFIX_HEX);
8642               putchar ('\n');
8643             }
8644           break;
8645
8646         case DT_BIND_NOW:
8647           /* The value of this entry is ignored.  */
8648           if (do_dynamic)
8649             putchar ('\n');
8650           break;
8651
8652         case DT_GNU_PRELINKED:
8653           if (do_dynamic)
8654             {
8655               struct tm * tmp;
8656               time_t atime = entry->d_un.d_val;
8657
8658               tmp = gmtime (&atime);
8659               printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
8660                       tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
8661                       tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
8662
8663             }
8664           break;
8665
8666         case DT_GNU_HASH:
8667           dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
8668           if (do_dynamic)
8669             {
8670               print_vma (entry->d_un.d_val, PREFIX_HEX);
8671               putchar ('\n');
8672             }
8673           break;
8674
8675         default:
8676           if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
8677             version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
8678               entry->d_un.d_val;
8679
8680           if (do_dynamic)
8681             {
8682               switch (elf_header.e_machine)
8683                 {
8684                 case EM_MIPS:
8685                 case EM_MIPS_RS3_LE:
8686                   dynamic_section_mips_val (entry);
8687                   break;
8688                 case EM_PARISC:
8689                   dynamic_section_parisc_val (entry);
8690                   break;
8691                 case EM_IA_64:
8692                   dynamic_section_ia64_val (entry);
8693                   break;
8694                 default:
8695                   print_vma (entry->d_un.d_val, PREFIX_HEX);
8696                   putchar ('\n');
8697                 }
8698             }
8699           break;
8700         }
8701     }
8702
8703   return 1;
8704 }
8705
8706 static char *
8707 get_ver_flags (unsigned int flags)
8708 {
8709   static char buff[32];
8710
8711   buff[0] = 0;
8712
8713   if (flags == 0)
8714     return _("none");
8715
8716   if (flags & VER_FLG_BASE)
8717     strcat (buff, "BASE ");
8718
8719   if (flags & VER_FLG_WEAK)
8720     {
8721       if (flags & VER_FLG_BASE)
8722         strcat (buff, "| ");
8723
8724       strcat (buff, "WEAK ");
8725     }
8726
8727   if (flags & VER_FLG_INFO)
8728     {
8729       if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
8730         strcat (buff, "| ");
8731
8732       strcat (buff, "INFO ");
8733     }
8734
8735   if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
8736     strcat (buff, _("| <unknown>"));
8737
8738   return buff;
8739 }
8740
8741 /* Display the contents of the version sections.  */
8742
8743 static int
8744 process_version_sections (FILE * file)
8745 {
8746   Elf_Internal_Shdr * section;
8747   unsigned i;
8748   int found = 0;
8749
8750   if (! do_version)
8751     return 1;
8752
8753   for (i = 0, section = section_headers;
8754        i < elf_header.e_shnum;
8755        i++, section++)
8756     {
8757       switch (section->sh_type)
8758         {
8759         case SHT_GNU_verdef:
8760           {
8761             Elf_External_Verdef * edefs;
8762             unsigned int idx;
8763             unsigned int cnt;
8764             char * endbuf;
8765
8766             found = 1;
8767
8768             printf
8769               (_("\nVersion definition section '%s' contains %u entries:\n"),
8770                SECTION_NAME (section), section->sh_info);
8771
8772             printf (_("  Addr: 0x"));
8773             printf_vma (section->sh_addr);
8774             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
8775                     (unsigned long) section->sh_offset, section->sh_link,
8776                     section->sh_link < elf_header.e_shnum
8777                     ? SECTION_NAME (section_headers + section->sh_link)
8778                     : _("<corrupt>"));
8779
8780             edefs = (Elf_External_Verdef *)
8781                 get_data (NULL, file, section->sh_offset, 1,section->sh_size,
8782                           _("version definition section"));
8783             if (!edefs)
8784               break;
8785             endbuf = (char *) edefs + section->sh_size;
8786
8787             for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
8788               {
8789                 char * vstart;
8790                 Elf_External_Verdef * edef;
8791                 Elf_Internal_Verdef ent;
8792                 Elf_External_Verdaux * eaux;
8793                 Elf_Internal_Verdaux aux;
8794                 int j;
8795                 int isum;
8796
8797                 /* Check for very large indicies.  */
8798                 if (idx > (size_t) (endbuf - (char *) edefs))
8799                   break;
8800
8801                 vstart = ((char *) edefs) + idx;
8802                 if (vstart + sizeof (*edef) > endbuf)
8803                   break;
8804
8805                 edef = (Elf_External_Verdef *) vstart;
8806
8807                 ent.vd_version = BYTE_GET (edef->vd_version);
8808                 ent.vd_flags   = BYTE_GET (edef->vd_flags);
8809                 ent.vd_ndx     = BYTE_GET (edef->vd_ndx);
8810                 ent.vd_cnt     = BYTE_GET (edef->vd_cnt);
8811                 ent.vd_hash    = BYTE_GET (edef->vd_hash);
8812                 ent.vd_aux     = BYTE_GET (edef->vd_aux);
8813                 ent.vd_next    = BYTE_GET (edef->vd_next);
8814
8815                 printf (_("  %#06x: Rev: %d  Flags: %s"),
8816                         idx, ent.vd_version, get_ver_flags (ent.vd_flags));
8817
8818                 printf (_("  Index: %d  Cnt: %d  "),
8819                         ent.vd_ndx, ent.vd_cnt);
8820
8821                 /* Check for overflow.  */
8822                 if (ent.vd_aux > (size_t) (endbuf - vstart))
8823                   break;
8824
8825                 vstart += ent.vd_aux;
8826
8827                 eaux = (Elf_External_Verdaux *) vstart;
8828
8829                 aux.vda_name = BYTE_GET (eaux->vda_name);
8830                 aux.vda_next = BYTE_GET (eaux->vda_next);
8831
8832                 if (VALID_DYNAMIC_NAME (aux.vda_name))
8833                   printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
8834                 else
8835                   printf (_("Name index: %ld\n"), aux.vda_name);
8836
8837                 isum = idx + ent.vd_aux;
8838
8839                 for (j = 1; j < ent.vd_cnt; j++)
8840                   {
8841                     /* Check for overflow.  */
8842                     if (aux.vda_next > (size_t) (endbuf - vstart))
8843                       break;
8844
8845                     isum   += aux.vda_next;
8846                     vstart += aux.vda_next;
8847
8848                     eaux = (Elf_External_Verdaux *) vstart;
8849                     if (vstart + sizeof (*eaux) > endbuf)
8850                       break;
8851
8852                     aux.vda_name = BYTE_GET (eaux->vda_name);
8853                     aux.vda_next = BYTE_GET (eaux->vda_next);
8854
8855                     if (VALID_DYNAMIC_NAME (aux.vda_name))
8856                       printf (_("  %#06x: Parent %d: %s\n"),
8857                               isum, j, GET_DYNAMIC_NAME (aux.vda_name));
8858                     else
8859                       printf (_("  %#06x: Parent %d, name index: %ld\n"),
8860                               isum, j, aux.vda_name);
8861                   }
8862
8863                 if (j < ent.vd_cnt)
8864                   printf (_("  Version def aux past end of section\n"));
8865
8866                 idx += ent.vd_next;
8867               }
8868
8869             if (cnt < section->sh_info)
8870               printf (_("  Version definition past end of section\n"));
8871
8872             free (edefs);
8873           }
8874           break;
8875
8876         case SHT_GNU_verneed:
8877           {
8878             Elf_External_Verneed * eneed;
8879             unsigned int idx;
8880             unsigned int cnt;
8881             char * endbuf;
8882
8883             found = 1;
8884
8885             printf (_("\nVersion needs section '%s' contains %u entries:\n"),
8886                     SECTION_NAME (section), section->sh_info);
8887
8888             printf (_(" Addr: 0x"));
8889             printf_vma (section->sh_addr);
8890             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
8891                     (unsigned long) section->sh_offset, section->sh_link,
8892                     section->sh_link < elf_header.e_shnum
8893                     ? SECTION_NAME (section_headers + section->sh_link)
8894                     : _("<corrupt>"));
8895
8896             eneed = (Elf_External_Verneed *) get_data (NULL, file,
8897                                                        section->sh_offset, 1,
8898                                                        section->sh_size,
8899                                                        _("Version Needs section"));
8900             if (!eneed)
8901               break;
8902             endbuf = (char *) eneed + section->sh_size;
8903
8904             for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
8905               {
8906                 Elf_External_Verneed * entry;
8907                 Elf_Internal_Verneed ent;
8908                 int j;
8909                 int isum;
8910                 char * vstart;
8911
8912                 if (idx > (size_t) (endbuf - (char *) eneed))
8913                   break;
8914
8915                 vstart = ((char *) eneed) + idx;
8916                 if (vstart + sizeof (*entry) > endbuf)
8917                   break;
8918
8919                 entry = (Elf_External_Verneed *) vstart;
8920
8921                 ent.vn_version = BYTE_GET (entry->vn_version);
8922                 ent.vn_cnt     = BYTE_GET (entry->vn_cnt);
8923                 ent.vn_file    = BYTE_GET (entry->vn_file);
8924                 ent.vn_aux     = BYTE_GET (entry->vn_aux);
8925                 ent.vn_next    = BYTE_GET (entry->vn_next);
8926
8927                 printf (_("  %#06x: Version: %d"), idx, ent.vn_version);
8928
8929                 if (VALID_DYNAMIC_NAME (ent.vn_file))
8930                   printf (_("  File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
8931                 else
8932                   printf (_("  File: %lx"), ent.vn_file);
8933
8934                 printf (_("  Cnt: %d\n"), ent.vn_cnt);
8935
8936                 /* Check for overflow.  */
8937                 if (ent.vn_aux > (size_t) (endbuf - vstart))
8938                   break;
8939
8940                 vstart += ent.vn_aux;
8941
8942                 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
8943                   {
8944                     Elf_External_Vernaux * eaux;
8945                     Elf_Internal_Vernaux aux;
8946
8947                     if (vstart + sizeof (*eaux) > endbuf)
8948                       break;
8949                     eaux = (Elf_External_Vernaux *) vstart;
8950
8951                     aux.vna_hash  = BYTE_GET (eaux->vna_hash);
8952                     aux.vna_flags = BYTE_GET (eaux->vna_flags);
8953                     aux.vna_other = BYTE_GET (eaux->vna_other);
8954                     aux.vna_name  = BYTE_GET (eaux->vna_name);
8955                     aux.vna_next  = BYTE_GET (eaux->vna_next);
8956
8957                     if (VALID_DYNAMIC_NAME (aux.vna_name))
8958                       printf (_("  %#06x:   Name: %s"),
8959                               isum, GET_DYNAMIC_NAME (aux.vna_name));
8960                     else
8961                       printf (_("  %#06x:   Name index: %lx"),
8962                               isum, aux.vna_name);
8963
8964                     printf (_("  Flags: %s  Version: %d\n"),
8965                             get_ver_flags (aux.vna_flags), aux.vna_other);
8966
8967                     /* Check for overflow.  */
8968                     if (aux.vna_next > (size_t) (endbuf - vstart))
8969                       break;
8970
8971                     isum   += aux.vna_next;
8972                     vstart += aux.vna_next;
8973                   }
8974
8975                 if (j < ent.vn_cnt)
8976                   warn (_("Missing Version Needs auxillary information\n"));
8977
8978                 if (ent.vn_next == 0 && cnt < section->sh_info - 1)
8979                   {
8980                     warn (_("Corrupt Version Needs structure - offset to next structure is zero with entries still left to be processed\n"));
8981                     cnt = section->sh_info;
8982                     break;
8983                   }
8984                 idx += ent.vn_next;
8985               }
8986
8987             if (cnt < section->sh_info)
8988               warn (_("Missing Version Needs information\n"));
8989
8990             free (eneed);
8991           }
8992           break;
8993
8994         case SHT_GNU_versym:
8995           {
8996             Elf_Internal_Shdr * link_section;
8997             int total;
8998             int cnt;
8999             unsigned char * edata;
9000             unsigned short * data;
9001             char * strtab;
9002             Elf_Internal_Sym * symbols;
9003             Elf_Internal_Shdr * string_sec;
9004             unsigned long num_syms;
9005             long off;
9006
9007             if (section->sh_link >= elf_header.e_shnum)
9008               break;
9009
9010             link_section = section_headers + section->sh_link;
9011             total = section->sh_size / sizeof (Elf_External_Versym);
9012
9013             if (link_section->sh_link >= elf_header.e_shnum)
9014               break;
9015
9016             found = 1;
9017
9018             symbols = GET_ELF_SYMBOLS (file, link_section, & num_syms);
9019             if (symbols == NULL)
9020               break;
9021
9022             string_sec = section_headers + link_section->sh_link;
9023
9024             strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
9025                                         string_sec->sh_size,
9026                                         _("version string table"));
9027             if (!strtab)
9028               {
9029                 free (symbols);
9030                 break;
9031               }
9032
9033             printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
9034                     SECTION_NAME (section), total);
9035
9036             printf (_(" Addr: "));
9037             printf_vma (section->sh_addr);
9038             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
9039                     (unsigned long) section->sh_offset, section->sh_link,
9040                     SECTION_NAME (link_section));
9041
9042             off = offset_from_vma (file,
9043                                    version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
9044                                    total * sizeof (short));
9045             edata = (unsigned char *) get_data (NULL, file, off, total,
9046                                                 sizeof (short),
9047                                                 _("version symbol data"));
9048             if (!edata)
9049               {
9050                 free (strtab);
9051                 free (symbols);
9052                 break;
9053               }
9054
9055             data = (short unsigned int *) cmalloc (total, sizeof (short));
9056
9057             for (cnt = total; cnt --;)
9058               data[cnt] = byte_get (edata + cnt * sizeof (short),
9059                                     sizeof (short));
9060
9061             free (edata);
9062
9063             for (cnt = 0; cnt < total; cnt += 4)
9064               {
9065                 int j, nn;
9066                 int check_def, check_need;
9067                 char * name;
9068
9069                 printf ("  %03x:", cnt);
9070
9071                 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
9072                   switch (data[cnt + j])
9073                     {
9074                     case 0:
9075                       fputs (_("   0 (*local*)    "), stdout);
9076                       break;
9077
9078                     case 1:
9079                       fputs (_("   1 (*global*)   "), stdout);
9080                       break;
9081
9082                     default:
9083                       nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
9084                                    data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
9085
9086                       /* If this index value is greater than the size of the symbols
9087                          array, break to avoid an out-of-bounds read.  */
9088                       if ((unsigned long)(cnt + j) >= num_syms)
9089                         {
9090                           warn (_("invalid index into symbol array\n"));
9091                           break;
9092                         }
9093
9094                       check_def = 1;
9095                       check_need = 1;
9096                       if (symbols[cnt + j].st_shndx >= elf_header.e_shnum
9097                           || section_headers[symbols[cnt + j].st_shndx].sh_type
9098                              != SHT_NOBITS)
9099                         {
9100                           if (symbols[cnt + j].st_shndx == SHN_UNDEF)
9101                             check_def = 0;
9102                           else
9103                             check_need = 0;
9104                         }
9105
9106                       if (check_need
9107                           && version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
9108                         {
9109                           Elf_Internal_Verneed ivn;
9110                           unsigned long offset;
9111
9112                           offset = offset_from_vma
9113                             (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
9114                              sizeof (Elf_External_Verneed));
9115
9116                           do
9117                             {
9118                               Elf_Internal_Vernaux ivna;
9119                               Elf_External_Verneed evn;
9120                               Elf_External_Vernaux evna;
9121                               unsigned long a_off;
9122
9123                               if (get_data (&evn, file, offset, sizeof (evn), 1,
9124                                             _("version need")) == NULL)
9125                                 break;
9126
9127                               ivn.vn_aux  = BYTE_GET (evn.vn_aux);
9128                               ivn.vn_next = BYTE_GET (evn.vn_next);
9129
9130                               a_off = offset + ivn.vn_aux;
9131
9132                               do
9133                                 {
9134                                   if (get_data (&evna, file, a_off, sizeof (evna),
9135                                                 1, _("version need aux (2)")) == NULL)
9136                                     {
9137                                       ivna.vna_next  = 0;
9138                                       ivna.vna_other = 0;
9139                                     }
9140                                   else
9141                                     {
9142                                       ivna.vna_next  = BYTE_GET (evna.vna_next);
9143                                       ivna.vna_other = BYTE_GET (evna.vna_other);
9144                                     }
9145
9146                                   a_off += ivna.vna_next;
9147                                 }
9148                               while (ivna.vna_other != data[cnt + j]
9149                                      && ivna.vna_next != 0);
9150
9151                               if (ivna.vna_other == data[cnt + j])
9152                                 {
9153                                   ivna.vna_name = BYTE_GET (evna.vna_name);
9154
9155                                   if (ivna.vna_name >= string_sec->sh_size)
9156                                     name = _("*invalid*");
9157                                   else
9158                                     name = strtab + ivna.vna_name;
9159                                   nn += printf ("(%s%-*s",
9160                                                 name,
9161                                                 12 - (int) strlen (name),
9162                                                 ")");
9163                                   check_def = 0;
9164                                   break;
9165                                 }
9166
9167                               offset += ivn.vn_next;
9168                             }
9169                           while (ivn.vn_next);
9170                         }
9171
9172                       if (check_def && data[cnt + j] != 0x8001
9173                           && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
9174                         {
9175                           Elf_Internal_Verdef ivd;
9176                           Elf_External_Verdef evd;
9177                           unsigned long offset;
9178
9179                           offset = offset_from_vma
9180                             (file, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
9181                              sizeof evd);
9182
9183                           do
9184                             {
9185                               if (get_data (&evd, file, offset, sizeof (evd), 1,
9186                                             _("version def")) == NULL)
9187                                 {
9188                                   ivd.vd_next = 0;
9189                                   ivd.vd_ndx  = 0;
9190                                 }
9191                               else
9192                                 {
9193                                   ivd.vd_next = BYTE_GET (evd.vd_next);
9194                                   ivd.vd_ndx  = BYTE_GET (evd.vd_ndx);
9195                                 }
9196
9197                               offset += ivd.vd_next;
9198                             }
9199                           while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
9200                                  && ivd.vd_next != 0);
9201
9202                           if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
9203                             {
9204                               Elf_External_Verdaux evda;
9205                               Elf_Internal_Verdaux ivda;
9206
9207                               ivd.vd_aux = BYTE_GET (evd.vd_aux);
9208
9209                               if (get_data (&evda, file,
9210                                             offset - ivd.vd_next + ivd.vd_aux,
9211                                             sizeof (evda), 1,
9212                                             _("version def aux")) == NULL)
9213                                 break;
9214
9215                               ivda.vda_name = BYTE_GET (evda.vda_name);
9216
9217                               if (ivda.vda_name >= string_sec->sh_size)
9218                                 name = _("*invalid*");
9219                               else
9220                                 name = strtab + ivda.vda_name;
9221                               nn += printf ("(%s%-*s",
9222                                             name,
9223                                             12 - (int) strlen (name),
9224                                             ")");
9225                             }
9226                         }
9227
9228                       if (nn < 18)
9229                         printf ("%*c", 18 - nn, ' ');
9230                     }
9231
9232                 putchar ('\n');
9233               }
9234
9235             free (data);
9236             free (strtab);
9237             free (symbols);
9238           }
9239           break;
9240
9241         default:
9242           break;
9243         }
9244     }
9245
9246   if (! found)
9247     printf (_("\nNo version information found in this file.\n"));
9248
9249   return 1;
9250 }
9251
9252 static const char *
9253 get_symbol_binding (unsigned int binding)
9254 {
9255   static char buff[32];
9256
9257   switch (binding)
9258     {
9259     case STB_LOCAL:     return "LOCAL";
9260     case STB_GLOBAL:    return "GLOBAL";
9261     case STB_WEAK:      return "WEAK";
9262     default:
9263       if (binding >= STB_LOPROC && binding <= STB_HIPROC)
9264         snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
9265                   binding);
9266       else if (binding >= STB_LOOS && binding <= STB_HIOS)
9267         {
9268           if (binding == STB_GNU_UNIQUE
9269               && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
9270                   /* GNU is still using the default value 0.  */
9271                   || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
9272             return "UNIQUE";
9273           snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
9274         }
9275       else
9276         snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
9277       return buff;
9278     }
9279 }
9280
9281 static const char *
9282 get_symbol_type (unsigned int type)
9283 {
9284   static char buff[32];
9285
9286   switch (type)
9287     {
9288     case STT_NOTYPE:    return "NOTYPE";
9289     case STT_OBJECT:    return "OBJECT";
9290     case STT_FUNC:      return "FUNC";
9291     case STT_SECTION:   return "SECTION";
9292     case STT_FILE:      return "FILE";
9293     case STT_COMMON:    return "COMMON";
9294     case STT_TLS:       return "TLS";
9295     case STT_RELC:      return "RELC";
9296     case STT_SRELC:     return "SRELC";
9297     default:
9298       if (type >= STT_LOPROC && type <= STT_HIPROC)
9299         {
9300           if (elf_header.e_machine == EM_ARM)
9301             {
9302               if (type == STT_ARM_TFUNC)
9303                 return "THUMB_FUNC";
9304               if (type == STT_ARM_16BIT)
9305                 return "THUMB_LABEL";
9306             }
9307
9308           if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
9309             return "REGISTER";
9310
9311           if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
9312             return "PARISC_MILLI";
9313
9314           snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
9315         }
9316       else if (type >= STT_LOOS && type <= STT_HIOS)
9317         {
9318           if (elf_header.e_machine == EM_PARISC)
9319             {
9320               if (type == STT_HP_OPAQUE)
9321                 return "HP_OPAQUE";
9322               if (type == STT_HP_STUB)
9323                 return "HP_STUB";
9324             }
9325
9326           if (type == STT_GNU_IFUNC
9327               && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
9328                   || elf_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD
9329                   /* GNU is still using the default value 0.  */
9330                   || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
9331             return "IFUNC";
9332
9333           snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
9334         }
9335       else
9336         snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
9337       return buff;
9338     }
9339 }
9340
9341 static const char *
9342 get_symbol_visibility (unsigned int visibility)
9343 {
9344   switch (visibility)
9345     {
9346     case STV_DEFAULT:   return "DEFAULT";
9347     case STV_INTERNAL:  return "INTERNAL";
9348     case STV_HIDDEN:    return "HIDDEN";
9349     case STV_PROTECTED: return "PROTECTED";
9350     default: abort ();
9351     }
9352 }
9353
9354 static const char *
9355 get_mips_symbol_other (unsigned int other)
9356 {
9357   switch (other)
9358     {
9359     case STO_OPTIONAL:
9360       return "OPTIONAL";
9361     case STO_MIPS_PLT:
9362       return "MIPS PLT";
9363     case STO_MIPS_PIC:
9364       return "MIPS PIC";
9365     case STO_MICROMIPS:
9366       return "MICROMIPS";
9367     case STO_MICROMIPS | STO_MIPS_PIC:
9368       return "MICROMIPS, MIPS PIC";
9369     case STO_MIPS16:
9370       return "MIPS16";
9371     default:
9372       return NULL;
9373     }
9374 }
9375
9376 static const char *
9377 get_ia64_symbol_other (unsigned int other)
9378 {
9379   if (is_ia64_vms ())
9380     {
9381       static char res[32];
9382
9383       res[0] = 0;
9384
9385       /* Function types is for images and .STB files only.  */
9386       switch (elf_header.e_type)
9387         {
9388         case ET_DYN:
9389         case ET_EXEC:
9390           switch (VMS_ST_FUNC_TYPE (other))
9391             {
9392             case VMS_SFT_CODE_ADDR:
9393               strcat (res, " CA");
9394               break;
9395             case VMS_SFT_SYMV_IDX:
9396               strcat (res, " VEC");
9397               break;
9398             case VMS_SFT_FD:
9399               strcat (res, " FD");
9400               break;
9401             case VMS_SFT_RESERVE:
9402               strcat (res, " RSV");
9403               break;
9404             default:
9405               abort ();
9406             }
9407           break;
9408         default:
9409           break;
9410         }
9411       switch (VMS_ST_LINKAGE (other))
9412         {
9413         case VMS_STL_IGNORE:
9414           strcat (res, " IGN");
9415           break;
9416         case VMS_STL_RESERVE:
9417           strcat (res, " RSV");
9418           break;
9419         case VMS_STL_STD:
9420           strcat (res, " STD");
9421           break;
9422         case VMS_STL_LNK:
9423           strcat (res, " LNK");
9424           break;
9425         default:
9426           abort ();
9427         }
9428
9429       if (res[0] != 0)
9430         return res + 1;
9431       else
9432         return res;
9433     }
9434   return NULL;
9435 }
9436
9437 static const char *
9438 get_ppc64_symbol_other (unsigned int other)
9439 {
9440   if (PPC64_LOCAL_ENTRY_OFFSET (other) != 0)
9441     {
9442       static char buf[32];
9443       snprintf (buf, sizeof buf, _("<localentry>: %d"),
9444                 PPC64_LOCAL_ENTRY_OFFSET (other));
9445       return buf;
9446     }
9447   return NULL;
9448 }
9449
9450 static const char *
9451 get_symbol_other (unsigned int other)
9452 {
9453   const char * result = NULL;
9454   static char buff [32];
9455
9456   if (other == 0)
9457     return "";
9458
9459   switch (elf_header.e_machine)
9460     {
9461     case EM_MIPS:
9462       result = get_mips_symbol_other (other);
9463       break;
9464     case EM_IA_64:
9465       result = get_ia64_symbol_other (other);
9466       break;
9467     case EM_PPC64:
9468       result = get_ppc64_symbol_other (other);
9469       break;
9470     default:
9471       break;
9472     }
9473
9474   if (result)
9475     return result;
9476
9477   snprintf (buff, sizeof buff, _("<other>: %x"), other);
9478   return buff;
9479 }
9480
9481 static const char *
9482 get_symbol_index_type (unsigned int type)
9483 {
9484   static char buff[32];
9485
9486   switch (type)
9487     {
9488     case SHN_UNDEF:     return "UND";
9489     case SHN_ABS:       return "ABS";
9490     case SHN_COMMON:    return "COM";
9491     default:
9492       if (type == SHN_IA_64_ANSI_COMMON
9493           && elf_header.e_machine == EM_IA_64
9494           && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
9495         return "ANSI_COM";
9496       else if ((elf_header.e_machine == EM_X86_64
9497                 || elf_header.e_machine == EM_L1OM
9498                 || elf_header.e_machine == EM_K1OM)
9499                && type == SHN_X86_64_LCOMMON)
9500         return "LARGE_COM";
9501       else if ((type == SHN_MIPS_SCOMMON
9502                 && elf_header.e_machine == EM_MIPS)
9503                || (type == SHN_TIC6X_SCOMMON
9504                    && elf_header.e_machine == EM_TI_C6000))
9505         return "SCOM";
9506       else if (type == SHN_MIPS_SUNDEFINED
9507                && elf_header.e_machine == EM_MIPS)
9508         return "SUND";
9509       else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
9510         sprintf (buff, "PRC[0x%04x]", type & 0xffff);
9511       else if (type >= SHN_LOOS && type <= SHN_HIOS)
9512         sprintf (buff, "OS [0x%04x]", type & 0xffff);
9513       else if (type >= SHN_LORESERVE)
9514         sprintf (buff, "RSV[0x%04x]", type & 0xffff);
9515       else if (type >= elf_header.e_shnum)
9516         sprintf (buff, "bad section index[%3d]", type);
9517       else
9518         sprintf (buff, "%3d", type);
9519       break;
9520     }
9521
9522   return buff;
9523 }
9524
9525 static bfd_vma *
9526 get_dynamic_data (FILE * file, unsigned int number, unsigned int ent_size)
9527 {
9528   unsigned char * e_data;
9529   bfd_vma * i_data;
9530
9531   e_data = (unsigned char *) cmalloc (number, ent_size);
9532
9533   if (e_data == NULL)
9534     {
9535       error (_("Out of memory\n"));
9536       return NULL;
9537     }
9538
9539   if (fread (e_data, ent_size, number, file) != number)
9540     {
9541       error (_("Unable to read in dynamic data\n"));
9542       return NULL;
9543     }
9544
9545   i_data = (bfd_vma *) cmalloc (number, sizeof (*i_data));
9546
9547   if (i_data == NULL)
9548     {
9549       error (_("Out of memory\n"));
9550       free (e_data);
9551       return NULL;
9552     }
9553
9554   while (number--)
9555     i_data[number] = byte_get (e_data + number * ent_size, ent_size);
9556
9557   free (e_data);
9558
9559   return i_data;
9560 }
9561
9562 static void
9563 print_dynamic_symbol (bfd_vma si, unsigned long hn)
9564 {
9565   Elf_Internal_Sym * psym;
9566   int n;
9567
9568   psym = dynamic_symbols + si;
9569
9570   n = print_vma (si, DEC_5);
9571   if (n < 5)
9572     fputs (&"     "[n], stdout);
9573   printf (" %3lu: ", hn);
9574   print_vma (psym->st_value, LONG_HEX);
9575   putchar (' ');
9576   print_vma (psym->st_size, DEC_5);
9577
9578   printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
9579   printf (" %-6s",  get_symbol_binding (ELF_ST_BIND (psym->st_info)));
9580   printf (" %-7s",  get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
9581   /* Check to see if any other bits in the st_other field are set.
9582      Note - displaying this information disrupts the layout of the
9583      table being generated, but for the moment this case is very
9584      rare.  */
9585   if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
9586     printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
9587   printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
9588   if (VALID_DYNAMIC_NAME (psym->st_name))
9589     print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
9590   else
9591     printf (_(" <corrupt: %14ld>"), psym->st_name);
9592   putchar ('\n');
9593 }
9594
9595 /* Dump the symbol table.  */
9596 static int
9597 process_symbol_table (FILE * file)
9598 {
9599   Elf_Internal_Shdr * section;
9600   bfd_vma nbuckets = 0;
9601   bfd_vma nchains = 0;
9602   bfd_vma * buckets = NULL;
9603   bfd_vma * chains = NULL;
9604   bfd_vma ngnubuckets = 0;
9605   bfd_vma * gnubuckets = NULL;
9606   bfd_vma * gnuchains = NULL;
9607   bfd_vma gnusymidx = 0;
9608
9609   if (!do_syms && !do_dyn_syms && !do_histogram)
9610     return 1;
9611
9612   if (dynamic_info[DT_HASH]
9613       && (do_histogram
9614           || (do_using_dynamic
9615               && !do_dyn_syms
9616               && dynamic_strings != NULL)))
9617     {
9618       unsigned char nb[8];
9619       unsigned char nc[8];
9620       int hash_ent_size = 4;
9621
9622       if ((elf_header.e_machine == EM_ALPHA
9623            || elf_header.e_machine == EM_S390
9624            || elf_header.e_machine == EM_S390_OLD)
9625           && elf_header.e_ident[EI_CLASS] == ELFCLASS64)
9626         hash_ent_size = 8;
9627
9628       if (fseek (file,
9629                  (archive_file_offset
9630                   + offset_from_vma (file, dynamic_info[DT_HASH],
9631                                      sizeof nb + sizeof nc)),
9632                  SEEK_SET))
9633         {
9634           error (_("Unable to seek to start of dynamic information\n"));
9635           goto no_hash;
9636         }
9637
9638       if (fread (nb, hash_ent_size, 1, file) != 1)
9639         {
9640           error (_("Failed to read in number of buckets\n"));
9641           goto no_hash;
9642         }
9643
9644       if (fread (nc, hash_ent_size, 1, file) != 1)
9645         {
9646           error (_("Failed to read in number of chains\n"));
9647           goto no_hash;
9648         }
9649
9650       nbuckets = byte_get (nb, hash_ent_size);
9651       nchains  = byte_get (nc, hash_ent_size);
9652
9653       buckets = get_dynamic_data (file, nbuckets, hash_ent_size);
9654       chains  = get_dynamic_data (file, nchains, hash_ent_size);
9655
9656     no_hash:
9657       if (buckets == NULL || chains == NULL)
9658         {
9659           if (do_using_dynamic)
9660             return 0;
9661           free (buckets);
9662           free (chains);
9663           buckets = NULL;
9664           chains = NULL;
9665           nbuckets = 0;
9666           nchains = 0;
9667         }
9668     }
9669
9670   if (dynamic_info_DT_GNU_HASH
9671       && (do_histogram
9672           || (do_using_dynamic
9673               && !do_dyn_syms
9674               && dynamic_strings != NULL)))
9675     {
9676       unsigned char nb[16];
9677       bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
9678       bfd_vma buckets_vma;
9679
9680       if (fseek (file,
9681                  (archive_file_offset
9682                   + offset_from_vma (file, dynamic_info_DT_GNU_HASH,
9683                                      sizeof nb)),
9684                  SEEK_SET))
9685         {
9686           error (_("Unable to seek to start of dynamic information\n"));
9687           goto no_gnu_hash;
9688         }
9689
9690       if (fread (nb, 16, 1, file) != 1)
9691         {
9692           error (_("Failed to read in number of buckets\n"));
9693           goto no_gnu_hash;
9694         }
9695
9696       ngnubuckets = byte_get (nb, 4);
9697       gnusymidx = byte_get (nb + 4, 4);
9698       bitmaskwords = byte_get (nb + 8, 4);
9699       buckets_vma = dynamic_info_DT_GNU_HASH + 16;
9700       if (is_32bit_elf)
9701         buckets_vma += bitmaskwords * 4;
9702       else
9703         buckets_vma += bitmaskwords * 8;
9704
9705       if (fseek (file,
9706                  (archive_file_offset
9707                   + offset_from_vma (file, buckets_vma, 4)),
9708                  SEEK_SET))
9709         {
9710           error (_("Unable to seek to start of dynamic information\n"));
9711           goto no_gnu_hash;
9712         }
9713
9714       gnubuckets = get_dynamic_data (file, ngnubuckets, 4);
9715
9716       if (gnubuckets == NULL)
9717         goto no_gnu_hash;
9718
9719       for (i = 0; i < ngnubuckets; i++)
9720         if (gnubuckets[i] != 0)
9721           {
9722             if (gnubuckets[i] < gnusymidx)
9723               return 0;
9724
9725             if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
9726               maxchain = gnubuckets[i];
9727           }
9728
9729       if (maxchain == 0xffffffff)
9730         goto no_gnu_hash;
9731
9732       maxchain -= gnusymidx;
9733
9734       if (fseek (file,
9735                  (archive_file_offset
9736                   + offset_from_vma (file, buckets_vma
9737                                            + 4 * (ngnubuckets + maxchain), 4)),
9738                  SEEK_SET))
9739         {
9740           error (_("Unable to seek to start of dynamic information\n"));
9741           goto no_gnu_hash;
9742         }
9743
9744       do
9745         {
9746           if (fread (nb, 4, 1, file) != 1)
9747             {
9748               error (_("Failed to determine last chain length\n"));
9749               goto no_gnu_hash;
9750             }
9751
9752           if (maxchain + 1 == 0)
9753             goto no_gnu_hash;
9754
9755           ++maxchain;
9756         }
9757       while ((byte_get (nb, 4) & 1) == 0);
9758
9759       if (fseek (file,
9760                  (archive_file_offset
9761                   + offset_from_vma (file, buckets_vma + 4 * ngnubuckets, 4)),
9762                  SEEK_SET))
9763         {
9764           error (_("Unable to seek to start of dynamic information\n"));
9765           goto no_gnu_hash;
9766         }
9767
9768       gnuchains = get_dynamic_data (file, maxchain, 4);
9769
9770     no_gnu_hash:
9771       if (gnuchains == NULL)
9772         {
9773           free (gnubuckets);
9774           gnubuckets = NULL;
9775           ngnubuckets = 0;
9776           if (do_using_dynamic)
9777             return 0;
9778         }
9779     }
9780
9781   if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
9782       && do_syms
9783       && do_using_dynamic
9784       && dynamic_strings != NULL)
9785     {
9786       unsigned long hn;
9787
9788       if (dynamic_info[DT_HASH])
9789         {
9790           bfd_vma si;
9791
9792           printf (_("\nSymbol table for image:\n"));
9793           if (is_32bit_elf)
9794             printf (_("  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"));
9795           else
9796             printf (_("  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"));
9797
9798           for (hn = 0; hn < nbuckets; hn++)
9799             {
9800               if (! buckets[hn])
9801                 continue;
9802
9803               for (si = buckets[hn]; si < nchains && si > 0; si = chains[si])
9804                 print_dynamic_symbol (si, hn);
9805             }
9806         }
9807
9808       if (dynamic_info_DT_GNU_HASH)
9809         {
9810           printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
9811           if (is_32bit_elf)
9812             printf (_("  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"));
9813           else
9814             printf (_("  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"));
9815
9816           for (hn = 0; hn < ngnubuckets; ++hn)
9817             if (gnubuckets[hn] != 0)
9818               {
9819                 bfd_vma si = gnubuckets[hn];
9820                 bfd_vma off = si - gnusymidx;
9821
9822                 do
9823                   {
9824                     print_dynamic_symbol (si, hn);
9825                     si++;
9826                   }
9827                 while ((gnuchains[off++] & 1) == 0);
9828               }
9829         }
9830     }
9831   else if (do_dyn_syms || (do_syms && !do_using_dynamic))
9832     {
9833       unsigned int i;
9834
9835       for (i = 0, section = section_headers;
9836            i < elf_header.e_shnum;
9837            i++, section++)
9838         {
9839           unsigned int si;
9840           char * strtab = NULL;
9841           unsigned long int strtab_size = 0;
9842           Elf_Internal_Sym * symtab;
9843           Elf_Internal_Sym * psym;
9844           unsigned long num_syms;
9845
9846           if ((section->sh_type != SHT_SYMTAB
9847                && section->sh_type != SHT_DYNSYM)
9848               || (!do_syms
9849                   && section->sh_type == SHT_SYMTAB))
9850             continue;
9851
9852           if (section->sh_entsize == 0)
9853             {
9854               printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
9855                       SECTION_NAME (section));
9856               continue;
9857             }
9858
9859           printf (_("\nSymbol table '%s' contains %lu entries:\n"),
9860                   SECTION_NAME (section),
9861                   (unsigned long) (section->sh_size / section->sh_entsize));
9862
9863           if (is_32bit_elf)
9864             printf (_("   Num:    Value  Size Type    Bind   Vis      Ndx Name\n"));
9865           else
9866             printf (_("   Num:    Value          Size Type    Bind   Vis      Ndx Name\n"));
9867
9868           symtab = GET_ELF_SYMBOLS (file, section, & num_syms);
9869           if (symtab == NULL)
9870             continue;
9871
9872           if (section->sh_link == elf_header.e_shstrndx)
9873             {
9874               strtab = string_table;
9875               strtab_size = string_table_length;
9876             }
9877           else if (section->sh_link < elf_header.e_shnum)
9878             {
9879               Elf_Internal_Shdr * string_sec;
9880
9881               string_sec = section_headers + section->sh_link;
9882
9883               strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
9884                                           1, string_sec->sh_size,
9885                                           _("string table"));
9886               strtab_size = strtab != NULL ? string_sec->sh_size : 0;
9887             }
9888
9889           for (si = 0, psym = symtab; si < num_syms; si++, psym++)
9890             {
9891               printf ("%6d: ", si);
9892               print_vma (psym->st_value, LONG_HEX);
9893               putchar (' ');
9894               print_vma (psym->st_size, DEC_5);
9895               printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
9896               printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
9897               printf (" %-7s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
9898               /* Check to see if any other bits in the st_other field are set.
9899                  Note - displaying this information disrupts the layout of the
9900                  table being generated, but for the moment this case is very rare.  */
9901               if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
9902                 printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
9903               printf (" %4s ", get_symbol_index_type (psym->st_shndx));
9904               print_symbol (25, psym->st_name < strtab_size
9905                             ? strtab + psym->st_name : _("<corrupt>"));
9906
9907               if (section->sh_type == SHT_DYNSYM
9908                   && version_info[DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
9909                 {
9910                   unsigned char data[2];
9911                   unsigned short vers_data;
9912                   unsigned long offset;
9913                   int is_nobits;
9914                   int check_def;
9915
9916                   offset = offset_from_vma
9917                     (file, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
9918                      sizeof data + si * sizeof (vers_data));
9919
9920                   if (get_data (&data, file, offset + si * sizeof (vers_data),
9921                                 sizeof (data), 1, _("version data")) == NULL)
9922                     break;
9923
9924                   vers_data = byte_get (data, 2);
9925
9926                   is_nobits = (psym->st_shndx < elf_header.e_shnum
9927                                && section_headers[psym->st_shndx].sh_type
9928                                   == SHT_NOBITS);
9929
9930                   check_def = (psym->st_shndx != SHN_UNDEF);
9931
9932                   if ((vers_data & VERSYM_HIDDEN) || vers_data > 1)
9933                     {
9934                       if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)]
9935                           && (is_nobits || ! check_def))
9936                         {
9937                           Elf_External_Verneed evn;
9938                           Elf_Internal_Verneed ivn;
9939                           Elf_Internal_Vernaux ivna;
9940
9941                           /* We must test both.  */
9942                           offset = offset_from_vma
9943                             (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
9944                              sizeof evn);
9945
9946                           do
9947                             {
9948                               unsigned long vna_off;
9949
9950                               if (get_data (&evn, file, offset, sizeof (evn), 1,
9951                                             _("version need")) == NULL)
9952                                 {
9953                                   ivna.vna_next = 0;
9954                                   ivna.vna_other = 0;
9955                                   ivna.vna_name = 0;
9956                                   break;
9957                                 }
9958
9959                               ivn.vn_aux  = BYTE_GET (evn.vn_aux);
9960                               ivn.vn_next = BYTE_GET (evn.vn_next);
9961
9962                               vna_off = offset + ivn.vn_aux;
9963
9964                               do
9965                                 {
9966                                   Elf_External_Vernaux evna;
9967
9968                                   if (get_data (&evna, file, vna_off,
9969                                                 sizeof (evna), 1,
9970                                                 _("version need aux (3)")) == NULL)
9971                                     {
9972                                       ivna.vna_next = 0;
9973                                       ivna.vna_other = 0;
9974                                       ivna.vna_name = 0;
9975                                     }
9976                                   else
9977                                     {
9978                                       ivna.vna_other = BYTE_GET (evna.vna_other);
9979                                       ivna.vna_next  = BYTE_GET (evna.vna_next);
9980                                       ivna.vna_name  = BYTE_GET (evna.vna_name);
9981                                     }
9982
9983                                   vna_off += ivna.vna_next;
9984                                 }
9985                               while (ivna.vna_other != vers_data
9986                                      && ivna.vna_next != 0);
9987
9988                               if (ivna.vna_other == vers_data)
9989                                 break;
9990
9991                               offset += ivn.vn_next;
9992                             }
9993                           while (ivn.vn_next != 0);
9994
9995                           if (ivna.vna_other == vers_data)
9996                             {
9997                               printf ("@%s (%d)",
9998                                       ivna.vna_name < strtab_size
9999                                       ? strtab + ivna.vna_name : _("<corrupt>"),
10000                                       ivna.vna_other);
10001                               check_def = 0;
10002                             }
10003                           else if (! is_nobits)
10004                             error (_("bad dynamic symbol\n"));
10005                           else
10006                             check_def = 1;
10007                         }
10008
10009                       if (check_def)
10010                         {
10011                           if (vers_data != 0x8001
10012                               && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10013                             {
10014                               Elf_Internal_Verdef ivd;
10015                               Elf_Internal_Verdaux ivda;
10016                               Elf_External_Verdaux evda;
10017                               unsigned long off;
10018
10019                               off = offset_from_vma
10020                                 (file,
10021                                  version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10022                                  sizeof (Elf_External_Verdef));
10023
10024                               do
10025                                 {
10026                                   Elf_External_Verdef evd;
10027
10028                                   if (get_data (&evd, file, off, sizeof (evd),
10029                                                 1, _("version def")) == NULL)
10030                                     {
10031                                       ivd.vd_ndx = 0;
10032                                       ivd.vd_aux = 0;
10033                                       ivd.vd_next = 0;
10034                                     }
10035                                   else
10036                                     {
10037                                       ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
10038                                       ivd.vd_aux = BYTE_GET (evd.vd_aux);
10039                                       ivd.vd_next = BYTE_GET (evd.vd_next);
10040                                     }
10041
10042                                   off += ivd.vd_next;
10043                                 }
10044                               while (ivd.vd_ndx != (vers_data & VERSYM_VERSION)
10045                                      && ivd.vd_next != 0);
10046
10047                               off -= ivd.vd_next;
10048                               off += ivd.vd_aux;
10049
10050                               if (get_data (&evda, file, off, sizeof (evda),
10051                                             1, _("version def aux")) == NULL)
10052                                 break;
10053
10054                               ivda.vda_name = BYTE_GET (evda.vda_name);
10055
10056                               if (psym->st_name != ivda.vda_name)
10057                                 printf ((vers_data & VERSYM_HIDDEN)
10058                                         ? "@%s" : "@@%s",
10059                                         ivda.vda_name < strtab_size
10060                                         ? strtab + ivda.vda_name : _("<corrupt>"));
10061                             }
10062                         }
10063                     }
10064                 }
10065
10066               putchar ('\n');
10067             }
10068
10069           free (symtab);
10070           if (strtab != string_table)
10071             free (strtab);
10072         }
10073     }
10074   else if (do_syms)
10075     printf
10076       (_("\nDynamic symbol information is not available for displaying symbols.\n"));
10077
10078   if (do_histogram && buckets != NULL)
10079     {
10080       unsigned long * lengths;
10081       unsigned long * counts;
10082       unsigned long hn;
10083       bfd_vma si;
10084       unsigned long maxlength = 0;
10085       unsigned long nzero_counts = 0;
10086       unsigned long nsyms = 0;
10087
10088       printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
10089               (unsigned long) nbuckets);
10090       printf (_(" Length  Number     %% of total  Coverage\n"));
10091
10092       lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
10093       if (lengths == NULL)
10094         {
10095           error (_("Out of memory\n"));
10096           return 0;
10097         }
10098       for (hn = 0; hn < nbuckets; ++hn)
10099         {
10100           for (si = buckets[hn]; si > 0 && si < nchains; si = chains[si])
10101             {
10102               ++nsyms;
10103               if (maxlength < ++lengths[hn])
10104                 ++maxlength;
10105             }
10106         }
10107
10108       counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
10109       if (counts == NULL)
10110         {
10111           free (lengths);
10112           error (_("Out of memory\n"));
10113           return 0;
10114         }
10115
10116       for (hn = 0; hn < nbuckets; ++hn)
10117         ++counts[lengths[hn]];
10118
10119       if (nbuckets > 0)
10120         {
10121           unsigned long i;
10122           printf ("      0  %-10lu (%5.1f%%)\n",
10123                   counts[0], (counts[0] * 100.0) / nbuckets);
10124           for (i = 1; i <= maxlength; ++i)
10125             {
10126               nzero_counts += counts[i] * i;
10127               printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
10128                       i, counts[i], (counts[i] * 100.0) / nbuckets,
10129                       (nzero_counts * 100.0) / nsyms);
10130             }
10131         }
10132
10133       free (counts);
10134       free (lengths);
10135     }
10136
10137   if (buckets != NULL)
10138     {
10139       free (buckets);
10140       free (chains);
10141     }
10142
10143   if (do_histogram && gnubuckets != NULL)
10144     {
10145       unsigned long * lengths;
10146       unsigned long * counts;
10147       unsigned long hn;
10148       unsigned long maxlength = 0;
10149       unsigned long nzero_counts = 0;
10150       unsigned long nsyms = 0;
10151
10152       lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
10153       if (lengths == NULL)
10154         {
10155           error (_("Out of memory\n"));
10156           return 0;
10157         }
10158
10159       printf (_("\nHistogram for `.gnu.hash' bucket list length (total of %lu buckets):\n"),
10160               (unsigned long) ngnubuckets);
10161       printf (_(" Length  Number     %% of total  Coverage\n"));
10162
10163       for (hn = 0; hn < ngnubuckets; ++hn)
10164         if (gnubuckets[hn] != 0)
10165           {
10166             bfd_vma off, length = 1;
10167
10168             for (off = gnubuckets[hn] - gnusymidx;
10169                  (gnuchains[off] & 1) == 0; ++off)
10170               ++length;
10171             lengths[hn] = length;
10172             if (length > maxlength)
10173               maxlength = length;
10174             nsyms += length;
10175           }
10176
10177       counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
10178       if (counts == NULL)
10179         {
10180           free (lengths);
10181           error (_("Out of memory\n"));
10182           return 0;
10183         }
10184
10185       for (hn = 0; hn < ngnubuckets; ++hn)
10186         ++counts[lengths[hn]];
10187
10188       if (ngnubuckets > 0)
10189         {
10190           unsigned long j;
10191           printf ("      0  %-10lu (%5.1f%%)\n",
10192                   counts[0], (counts[0] * 100.0) / ngnubuckets);
10193           for (j = 1; j <= maxlength; ++j)
10194             {
10195               nzero_counts += counts[j] * j;
10196               printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
10197                       j, counts[j], (counts[j] * 100.0) / ngnubuckets,
10198                       (nzero_counts * 100.0) / nsyms);
10199             }
10200         }
10201
10202       free (counts);
10203       free (lengths);
10204       free (gnubuckets);
10205       free (gnuchains);
10206     }
10207
10208   return 1;
10209 }
10210
10211 static int
10212 process_syminfo (FILE * file ATTRIBUTE_UNUSED)
10213 {
10214   unsigned int i;
10215
10216   if (dynamic_syminfo == NULL
10217       || !do_dynamic)
10218     /* No syminfo, this is ok.  */
10219     return 1;
10220
10221   /* There better should be a dynamic symbol section.  */
10222   if (dynamic_symbols == NULL || dynamic_strings == NULL)
10223     return 0;
10224
10225   if (dynamic_addr)
10226     printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
10227             dynamic_syminfo_offset, dynamic_syminfo_nent);
10228
10229   printf (_(" Num: Name                           BoundTo     Flags\n"));
10230   for (i = 0; i < dynamic_syminfo_nent; ++i)
10231     {
10232       unsigned short int flags = dynamic_syminfo[i].si_flags;
10233
10234       printf ("%4d: ", i);
10235       if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
10236         print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
10237       else
10238         printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
10239       putchar (' ');
10240
10241       switch (dynamic_syminfo[i].si_boundto)
10242         {
10243         case SYMINFO_BT_SELF:
10244           fputs ("SELF       ", stdout);
10245           break;
10246         case SYMINFO_BT_PARENT:
10247           fputs ("PARENT     ", stdout);
10248           break;
10249         default:
10250           if (dynamic_syminfo[i].si_boundto > 0
10251               && dynamic_syminfo[i].si_boundto < dynamic_nent
10252               && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
10253             {
10254               print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
10255               putchar (' ' );
10256             }
10257           else
10258             printf ("%-10d ", dynamic_syminfo[i].si_boundto);
10259           break;
10260         }
10261
10262       if (flags & SYMINFO_FLG_DIRECT)
10263         printf (" DIRECT");
10264       if (flags & SYMINFO_FLG_PASSTHRU)
10265         printf (" PASSTHRU");
10266       if (flags & SYMINFO_FLG_COPY)
10267         printf (" COPY");
10268       if (flags & SYMINFO_FLG_LAZYLOAD)
10269         printf (" LAZYLOAD");
10270
10271       puts ("");
10272     }
10273
10274   return 1;
10275 }
10276
10277 /* Check to see if the given reloc needs to be handled in a target specific
10278    manner.  If so then process the reloc and return TRUE otherwise return
10279    FALSE.  */
10280
10281 static bfd_boolean
10282 target_specific_reloc_handling (Elf_Internal_Rela * reloc,
10283                                 unsigned char *     start,
10284                                 Elf_Internal_Sym *  symtab)
10285 {
10286   unsigned int reloc_type = get_reloc_type (reloc->r_info);
10287
10288   switch (elf_header.e_machine)
10289     {
10290     case EM_MSP430:
10291     case EM_MSP430_OLD:
10292       {
10293         static Elf_Internal_Sym * saved_sym = NULL;
10294
10295         switch (reloc_type)
10296           {
10297           case 10: /* R_MSP430_SYM_DIFF */
10298             if (uses_msp430x_relocs ())
10299               break;
10300           case 21: /* R_MSP430X_SYM_DIFF */
10301             saved_sym = symtab + get_reloc_symindex (reloc->r_info);
10302             return TRUE;
10303
10304           case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
10305           case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
10306             goto handle_sym_diff;
10307
10308           case 5: /* R_MSP430_16_BYTE */
10309           case 9: /* R_MSP430_8 */
10310             if (uses_msp430x_relocs ())
10311               break;
10312             goto handle_sym_diff;
10313
10314           case 2: /* R_MSP430_ABS16 */
10315           case 15: /* R_MSP430X_ABS16 */
10316             if (! uses_msp430x_relocs ())
10317               break;
10318             goto handle_sym_diff;
10319
10320           handle_sym_diff:
10321             if (saved_sym != NULL)
10322               {
10323                 bfd_vma value;
10324
10325                 value = reloc->r_addend
10326                   + (symtab[get_reloc_symindex (reloc->r_info)].st_value
10327                      - saved_sym->st_value);
10328
10329                 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
10330
10331                 saved_sym = NULL;
10332                 return TRUE;
10333               }
10334             break;
10335
10336           default:
10337             if (saved_sym != NULL)
10338               error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc"));
10339             break;
10340           }
10341         break;
10342       }
10343
10344     case EM_MN10300:
10345     case EM_CYGNUS_MN10300:
10346       {
10347         static Elf_Internal_Sym * saved_sym = NULL;
10348
10349         switch (reloc_type)
10350           {
10351           case 34: /* R_MN10300_ALIGN */
10352             return TRUE;
10353           case 33: /* R_MN10300_SYM_DIFF */
10354             saved_sym = symtab + get_reloc_symindex (reloc->r_info);
10355             return TRUE;
10356           case 1: /* R_MN10300_32 */
10357           case 2: /* R_MN10300_16 */
10358             if (saved_sym != NULL)
10359               {
10360                 bfd_vma value;
10361
10362                 value = reloc->r_addend
10363                   + (symtab[get_reloc_symindex (reloc->r_info)].st_value
10364                      - saved_sym->st_value);
10365
10366                 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
10367
10368                 saved_sym = NULL;
10369                 return TRUE;
10370               }
10371             break;
10372           default:
10373             if (saved_sym != NULL)
10374               error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc"));
10375             break;
10376           }
10377         break;
10378       }
10379     }
10380
10381   return FALSE;
10382 }
10383
10384 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
10385    DWARF debug sections.  This is a target specific test.  Note - we do not
10386    go through the whole including-target-headers-multiple-times route, (as
10387    we have already done with <elf/h8.h>) because this would become very
10388    messy and even then this function would have to contain target specific
10389    information (the names of the relocs instead of their numeric values).
10390    FIXME: This is not the correct way to solve this problem.  The proper way
10391    is to have target specific reloc sizing and typing functions created by
10392    the reloc-macros.h header, in the same way that it already creates the
10393    reloc naming functions.  */
10394
10395 static bfd_boolean
10396 is_32bit_abs_reloc (unsigned int reloc_type)
10397 {
10398   switch (elf_header.e_machine)
10399     {
10400     case EM_386:
10401     case EM_486:
10402       return reloc_type == 1; /* R_386_32.  */
10403     case EM_68K:
10404       return reloc_type == 1; /* R_68K_32.  */
10405     case EM_860:
10406       return reloc_type == 1; /* R_860_32.  */
10407     case EM_960:
10408       return reloc_type == 2; /* R_960_32.  */
10409     case EM_AARCH64:
10410       return reloc_type == 258; /* R_AARCH64_ABS32 */
10411     case EM_ALPHA:
10412       return reloc_type == 1; /* R_ALPHA_REFLONG.  */
10413     case EM_ARC:
10414       return reloc_type == 1; /* R_ARC_32.  */
10415     case EM_ARM:
10416       return reloc_type == 2; /* R_ARM_ABS32 */
10417     case EM_AVR_OLD:
10418     case EM_AVR:
10419       return reloc_type == 1;
10420     case EM_ADAPTEVA_EPIPHANY:
10421       return reloc_type == 3;
10422     case EM_BLACKFIN:
10423       return reloc_type == 0x12; /* R_byte4_data.  */
10424     case EM_CRIS:
10425       return reloc_type == 3; /* R_CRIS_32.  */
10426     case EM_CR16:
10427       return reloc_type == 3; /* R_CR16_NUM32.  */
10428     case EM_CRX:
10429       return reloc_type == 15; /* R_CRX_NUM32.  */
10430     case EM_CYGNUS_FRV:
10431       return reloc_type == 1;
10432     case EM_CYGNUS_D10V:
10433     case EM_D10V:
10434       return reloc_type == 6; /* R_D10V_32.  */
10435     case EM_CYGNUS_D30V:
10436     case EM_D30V:
10437       return reloc_type == 12; /* R_D30V_32_NORMAL.  */
10438     case EM_DLX:
10439       return reloc_type == 3; /* R_DLX_RELOC_32.  */
10440     case EM_CYGNUS_FR30:
10441     case EM_FR30:
10442       return reloc_type == 3; /* R_FR30_32.  */
10443     case EM_H8S:
10444     case EM_H8_300:
10445     case EM_H8_300H:
10446       return reloc_type == 1; /* R_H8_DIR32.  */
10447     case EM_IA_64:
10448       return reloc_type == 0x65; /* R_IA64_SECREL32LSB.  */
10449     case EM_IP2K_OLD:
10450     case EM_IP2K:
10451       return reloc_type == 2; /* R_IP2K_32.  */
10452     case EM_IQ2000:
10453       return reloc_type == 2; /* R_IQ2000_32.  */
10454     case EM_LATTICEMICO32:
10455       return reloc_type == 3; /* R_LM32_32.  */
10456     case EM_M32C_OLD:
10457     case EM_M32C:
10458       return reloc_type == 3; /* R_M32C_32.  */
10459     case EM_M32R:
10460       return reloc_type == 34; /* R_M32R_32_RELA.  */
10461     case EM_MCORE:
10462       return reloc_type == 1; /* R_MCORE_ADDR32.  */
10463     case EM_CYGNUS_MEP:
10464       return reloc_type == 4; /* R_MEP_32.  */
10465     case EM_METAG:
10466       return reloc_type == 2; /* R_METAG_ADDR32.  */
10467     case EM_MICROBLAZE:
10468       return reloc_type == 1; /* R_MICROBLAZE_32.  */
10469     case EM_MIPS:
10470       return reloc_type == 2; /* R_MIPS_32.  */
10471     case EM_MMIX:
10472       return reloc_type == 4; /* R_MMIX_32.  */
10473     case EM_CYGNUS_MN10200:
10474     case EM_MN10200:
10475       return reloc_type == 1; /* R_MN10200_32.  */
10476     case EM_CYGNUS_MN10300:
10477     case EM_MN10300:
10478       return reloc_type == 1; /* R_MN10300_32.  */
10479     case EM_MOXIE:
10480       return reloc_type == 1; /* R_MOXIE_32.  */
10481     case EM_MSP430_OLD:
10482     case EM_MSP430:
10483       return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32.  */
10484     case EM_MT:
10485       return reloc_type == 2; /* R_MT_32.  */
10486     case EM_NDS32:
10487       return reloc_type == 20; /* R_NDS32_RELA.  */
10488     case EM_ALTERA_NIOS2:
10489       return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32.  */
10490     case EM_NIOS32:
10491       return reloc_type == 1; /* R_NIOS_32.  */
10492     case EM_OR1K:
10493       return reloc_type == 1; /* R_OR1K_32.  */
10494     case EM_PARISC:
10495       return (reloc_type == 1 /* R_PARISC_DIR32.  */
10496               || reloc_type == 41); /* R_PARISC_SECREL32.  */
10497     case EM_PJ:
10498     case EM_PJ_OLD:
10499       return reloc_type == 1; /* R_PJ_DATA_DIR32.  */
10500     case EM_PPC64:
10501       return reloc_type == 1; /* R_PPC64_ADDR32.  */
10502     case EM_PPC:
10503       return reloc_type == 1; /* R_PPC_ADDR32.  */
10504     case EM_RL78:
10505       return reloc_type == 1; /* R_RL78_DIR32.  */
10506     case EM_RX:
10507       return reloc_type == 1; /* R_RX_DIR32.  */
10508     case EM_S370:
10509       return reloc_type == 1; /* R_I370_ADDR31.  */
10510     case EM_S390_OLD:
10511     case EM_S390:
10512       return reloc_type == 4; /* R_S390_32.  */
10513     case EM_SCORE:
10514       return reloc_type == 8; /* R_SCORE_ABS32.  */
10515     case EM_SH:
10516       return reloc_type == 1; /* R_SH_DIR32.  */
10517     case EM_SPARC32PLUS:
10518     case EM_SPARCV9:
10519     case EM_SPARC:
10520       return reloc_type == 3 /* R_SPARC_32.  */
10521         || reloc_type == 23; /* R_SPARC_UA32.  */
10522     case EM_SPU:
10523       return reloc_type == 6; /* R_SPU_ADDR32 */
10524     case EM_TI_C6000:
10525       return reloc_type == 1; /* R_C6000_ABS32.  */
10526     case EM_TILEGX:
10527       return reloc_type == 2; /* R_TILEGX_32.  */
10528     case EM_TILEPRO:
10529       return reloc_type == 1; /* R_TILEPRO_32.  */
10530     case EM_CYGNUS_V850:
10531     case EM_V850:
10532       return reloc_type == 6; /* R_V850_ABS32.  */
10533     case EM_V800:
10534       return reloc_type == 0x33; /* R_V810_WORD.  */
10535     case EM_VAX:
10536       return reloc_type == 1; /* R_VAX_32.  */
10537     case EM_X86_64:
10538     case EM_L1OM:
10539     case EM_K1OM:
10540       return reloc_type == 10; /* R_X86_64_32.  */
10541     case EM_XC16X:
10542     case EM_C166:
10543       return reloc_type == 3; /* R_XC16C_ABS_32.  */
10544     case EM_XGATE:
10545       return reloc_type == 4; /* R_XGATE_32.  */
10546     case EM_XSTORMY16:
10547       return reloc_type == 1; /* R_XSTROMY16_32.  */
10548     case EM_XTENSA_OLD:
10549     case EM_XTENSA:
10550       return reloc_type == 1; /* R_XTENSA_32.  */
10551     default:
10552       error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
10553              elf_header.e_machine);
10554       abort ();
10555     }
10556 }
10557
10558 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
10559    a 32-bit pc-relative RELA relocation used in DWARF debug sections.  */
10560
10561 static bfd_boolean
10562 is_32bit_pcrel_reloc (unsigned int reloc_type)
10563 {
10564   switch (elf_header.e_machine)
10565     {
10566     case EM_386:
10567     case EM_486:
10568       return reloc_type == 2;  /* R_386_PC32.  */
10569     case EM_68K:
10570       return reloc_type == 4;  /* R_68K_PC32.  */
10571     case EM_AARCH64:
10572       return reloc_type == 261; /* R_AARCH64_PREL32 */
10573     case EM_ADAPTEVA_EPIPHANY:
10574       return reloc_type == 6;
10575     case EM_ALPHA:
10576       return reloc_type == 10; /* R_ALPHA_SREL32.  */
10577     case EM_ARM:
10578       return reloc_type == 3;  /* R_ARM_REL32 */
10579     case EM_MICROBLAZE:
10580       return reloc_type == 2;  /* R_MICROBLAZE_32_PCREL.  */
10581     case EM_OR1K:
10582       return reloc_type == 9; /* R_OR1K_32_PCREL.  */
10583     case EM_PARISC:
10584       return reloc_type == 9;  /* R_PARISC_PCREL32.  */
10585     case EM_PPC:
10586       return reloc_type == 26; /* R_PPC_REL32.  */
10587     case EM_PPC64:
10588       return reloc_type == 26; /* R_PPC64_REL32.  */
10589     case EM_S390_OLD:
10590     case EM_S390:
10591       return reloc_type == 5;  /* R_390_PC32.  */
10592     case EM_SH:
10593       return reloc_type == 2;  /* R_SH_REL32.  */
10594     case EM_SPARC32PLUS:
10595     case EM_SPARCV9:
10596     case EM_SPARC:
10597       return reloc_type == 6;  /* R_SPARC_DISP32.  */
10598     case EM_SPU:
10599       return reloc_type == 13; /* R_SPU_REL32.  */
10600     case EM_TILEGX:
10601       return reloc_type == 6; /* R_TILEGX_32_PCREL.  */
10602     case EM_TILEPRO:
10603       return reloc_type == 4; /* R_TILEPRO_32_PCREL.  */
10604     case EM_X86_64:
10605     case EM_L1OM:
10606     case EM_K1OM:
10607       return reloc_type == 2;  /* R_X86_64_PC32.  */
10608     case EM_XTENSA_OLD:
10609     case EM_XTENSA:
10610       return reloc_type == 14; /* R_XTENSA_32_PCREL.  */
10611     default:
10612       /* Do not abort or issue an error message here.  Not all targets use
10613          pc-relative 32-bit relocs in their DWARF debug information and we
10614          have already tested for target coverage in is_32bit_abs_reloc.  A
10615          more helpful warning message will be generated by apply_relocations
10616          anyway, so just return.  */
10617       return FALSE;
10618     }
10619 }
10620
10621 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
10622    a 64-bit absolute RELA relocation used in DWARF debug sections.  */
10623
10624 static bfd_boolean
10625 is_64bit_abs_reloc (unsigned int reloc_type)
10626 {
10627   switch (elf_header.e_machine)
10628     {
10629     case EM_AARCH64:
10630       return reloc_type == 257; /* R_AARCH64_ABS64.  */
10631     case EM_ALPHA:
10632       return reloc_type == 2; /* R_ALPHA_REFQUAD.  */
10633     case EM_IA_64:
10634       return reloc_type == 0x27; /* R_IA64_DIR64LSB.  */
10635     case EM_PARISC:
10636       return reloc_type == 80; /* R_PARISC_DIR64.  */
10637     case EM_PPC64:
10638       return reloc_type == 38; /* R_PPC64_ADDR64.  */
10639     case EM_SPARC32PLUS:
10640     case EM_SPARCV9:
10641     case EM_SPARC:
10642       return reloc_type == 54; /* R_SPARC_UA64.  */
10643     case EM_X86_64:
10644     case EM_L1OM:
10645     case EM_K1OM:
10646       return reloc_type == 1; /* R_X86_64_64.  */
10647     case EM_S390_OLD:
10648     case EM_S390:
10649       return reloc_type == 22;  /* R_S390_64.  */
10650     case EM_TILEGX:
10651       return reloc_type == 1; /* R_TILEGX_64.  */
10652     case EM_MIPS:
10653       return reloc_type == 18;  /* R_MIPS_64.  */
10654     default:
10655       return FALSE;
10656     }
10657 }
10658
10659 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
10660    a 64-bit pc-relative RELA relocation used in DWARF debug sections.  */
10661
10662 static bfd_boolean
10663 is_64bit_pcrel_reloc (unsigned int reloc_type)
10664 {
10665   switch (elf_header.e_machine)
10666     {
10667     case EM_AARCH64:
10668       return reloc_type == 260; /* R_AARCH64_PREL64.  */
10669     case EM_ALPHA:
10670       return reloc_type == 11; /* R_ALPHA_SREL64.  */
10671     case EM_IA_64:
10672       return reloc_type == 0x4f; /* R_IA64_PCREL64LSB.  */
10673     case EM_PARISC:
10674       return reloc_type == 72; /* R_PARISC_PCREL64.  */
10675     case EM_PPC64:
10676       return reloc_type == 44; /* R_PPC64_REL64.  */
10677     case EM_SPARC32PLUS:
10678     case EM_SPARCV9:
10679     case EM_SPARC:
10680       return reloc_type == 46; /* R_SPARC_DISP64.  */
10681     case EM_X86_64:
10682     case EM_L1OM:
10683     case EM_K1OM:
10684       return reloc_type == 24; /* R_X86_64_PC64.  */
10685     case EM_S390_OLD:
10686     case EM_S390:
10687       return reloc_type == 23;  /* R_S390_PC64.  */
10688     case EM_TILEGX:
10689       return reloc_type == 5;  /* R_TILEGX_64_PCREL.  */
10690     default:
10691       return FALSE;
10692     }
10693 }
10694
10695 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
10696    a 24-bit absolute RELA relocation used in DWARF debug sections.  */
10697
10698 static bfd_boolean
10699 is_24bit_abs_reloc (unsigned int reloc_type)
10700 {
10701   switch (elf_header.e_machine)
10702     {
10703     case EM_CYGNUS_MN10200:
10704     case EM_MN10200:
10705       return reloc_type == 4; /* R_MN10200_24.  */
10706     default:
10707       return FALSE;
10708     }
10709 }
10710
10711 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
10712    a 16-bit absolute RELA relocation used in DWARF debug sections.  */
10713
10714 static bfd_boolean
10715 is_16bit_abs_reloc (unsigned int reloc_type)
10716 {
10717   switch (elf_header.e_machine)
10718     {
10719     case EM_AVR_OLD:
10720     case EM_AVR:
10721       return reloc_type == 4; /* R_AVR_16.  */
10722     case EM_ADAPTEVA_EPIPHANY:
10723       return reloc_type == 5;
10724     case EM_CYGNUS_D10V:
10725     case EM_D10V:
10726       return reloc_type == 3; /* R_D10V_16.  */
10727     case EM_H8S:
10728     case EM_H8_300:
10729     case EM_H8_300H:
10730       return reloc_type == R_H8_DIR16;
10731     case EM_IP2K_OLD:
10732     case EM_IP2K:
10733       return reloc_type == 1; /* R_IP2K_16.  */
10734     case EM_M32C_OLD:
10735     case EM_M32C:
10736       return reloc_type == 1; /* R_M32C_16 */
10737     case EM_MSP430:
10738       if (uses_msp430x_relocs ())
10739         return reloc_type == 2; /* R_MSP430_ABS16.  */
10740     case EM_MSP430_OLD:
10741       return reloc_type == 5; /* R_MSP430_16_BYTE.  */
10742     case EM_NDS32:
10743       return reloc_type == 19; /* R_NDS32_RELA.  */
10744     case EM_ALTERA_NIOS2:
10745       return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16.  */
10746     case EM_NIOS32:
10747       return reloc_type == 9; /* R_NIOS_16.  */
10748     case EM_OR1K:
10749       return reloc_type == 2; /* R_OR1K_16.  */
10750     case EM_TI_C6000:
10751       return reloc_type == 2; /* R_C6000_ABS16.  */
10752     case EM_XC16X:
10753     case EM_C166:
10754       return reloc_type == 2; /* R_XC16C_ABS_16.  */
10755     case EM_CYGNUS_MN10200:
10756     case EM_MN10200:
10757       return reloc_type == 2; /* R_MN10200_16.  */
10758     case EM_CYGNUS_MN10300:
10759     case EM_MN10300:
10760       return reloc_type == 2; /* R_MN10300_16.  */
10761     case EM_XGATE:
10762       return reloc_type == 3; /* R_XGATE_16.  */
10763     default:
10764       return FALSE;
10765     }
10766 }
10767
10768 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
10769    relocation entries (possibly formerly used for SHT_GROUP sections).  */
10770
10771 static bfd_boolean
10772 is_none_reloc (unsigned int reloc_type)
10773 {
10774   switch (elf_header.e_machine)
10775     {
10776     case EM_68K:     /* R_68K_NONE.  */
10777     case EM_386:     /* R_386_NONE.  */
10778     case EM_SPARC32PLUS:
10779     case EM_SPARCV9:
10780     case EM_SPARC:   /* R_SPARC_NONE.  */
10781     case EM_MIPS:    /* R_MIPS_NONE.  */
10782     case EM_PARISC:  /* R_PARISC_NONE.  */
10783     case EM_ALPHA:   /* R_ALPHA_NONE.  */
10784     case EM_ADAPTEVA_EPIPHANY:
10785     case EM_PPC:     /* R_PPC_NONE.  */
10786     case EM_PPC64:   /* R_PPC64_NONE.  */
10787     case EM_ARM:     /* R_ARM_NONE.  */
10788     case EM_IA_64:   /* R_IA64_NONE.  */
10789     case EM_SH:      /* R_SH_NONE.  */
10790     case EM_S390_OLD:
10791     case EM_S390:    /* R_390_NONE.  */
10792     case EM_CRIS:    /* R_CRIS_NONE.  */
10793     case EM_X86_64:  /* R_X86_64_NONE.  */
10794     case EM_L1OM:    /* R_X86_64_NONE.  */
10795     case EM_K1OM:    /* R_X86_64_NONE.  */
10796     case EM_MN10300: /* R_MN10300_NONE.  */
10797     case EM_MOXIE:   /* R_MOXIE_NONE.  */
10798     case EM_M32R:    /* R_M32R_NONE.  */
10799     case EM_TI_C6000:/* R_C6000_NONE.  */
10800     case EM_TILEGX:  /* R_TILEGX_NONE.  */
10801     case EM_TILEPRO: /* R_TILEPRO_NONE.  */
10802     case EM_XC16X:
10803     case EM_C166:    /* R_XC16X_NONE.  */
10804     case EM_ALTERA_NIOS2: /* R_NIOS2_NONE.  */
10805     case EM_NIOS32:  /* R_NIOS_NONE.  */
10806     case EM_OR1K:    /* R_OR1K_NONE. */
10807       return reloc_type == 0;
10808     case EM_AARCH64:
10809       return reloc_type == 0 || reloc_type == 256;
10810     case EM_NDS32:
10811       return (reloc_type == 0       /* R_XTENSA_NONE.  */
10812               || reloc_type == 204  /* R_NDS32_DIFF8.  */
10813               || reloc_type == 205  /* R_NDS32_DIFF16.  */
10814               || reloc_type == 206  /* R_NDS32_DIFF32.  */
10815               || reloc_type == 207  /* R_NDS32_ULEB128.  */);
10816     case EM_XTENSA_OLD:
10817     case EM_XTENSA:
10818       return (reloc_type == 0      /* R_XTENSA_NONE.  */
10819               || reloc_type == 17  /* R_XTENSA_DIFF8.  */
10820               || reloc_type == 18  /* R_XTENSA_DIFF16.  */
10821               || reloc_type == 19  /* R_XTENSA_DIFF32.  */);
10822     case EM_METAG:
10823       return reloc_type == 3; /* R_METAG_NONE.  */
10824     }
10825   return FALSE;
10826 }
10827
10828 /* Apply relocations to a section.
10829    Note: So far support has been added only for those relocations
10830    which can be found in debug sections.
10831    FIXME: Add support for more relocations ?  */
10832
10833 static void
10834 apply_relocations (void * file,
10835                    Elf_Internal_Shdr * section,
10836                    unsigned char * start)
10837 {
10838   Elf_Internal_Shdr * relsec;
10839   unsigned char * end = start + section->sh_size;
10840
10841   if (elf_header.e_type != ET_REL)
10842     return;
10843
10844   /* Find the reloc section associated with the section.  */
10845   for (relsec = section_headers;
10846        relsec < section_headers + elf_header.e_shnum;
10847        ++relsec)
10848     {
10849       bfd_boolean is_rela;
10850       unsigned long num_relocs;
10851       Elf_Internal_Rela * relocs;
10852       Elf_Internal_Rela * rp;
10853       Elf_Internal_Shdr * symsec;
10854       Elf_Internal_Sym * symtab;
10855       unsigned long num_syms;
10856       Elf_Internal_Sym * sym;
10857
10858       if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
10859           || relsec->sh_info >= elf_header.e_shnum
10860           || section_headers + relsec->sh_info != section
10861           || relsec->sh_size == 0
10862           || relsec->sh_link >= elf_header.e_shnum)
10863         continue;
10864
10865       is_rela = relsec->sh_type == SHT_RELA;
10866
10867       if (is_rela)
10868         {
10869           if (!slurp_rela_relocs ((FILE *) file, relsec->sh_offset,
10870                                   relsec->sh_size, & relocs, & num_relocs))
10871             return;
10872         }
10873       else
10874         {
10875           if (!slurp_rel_relocs ((FILE *) file, relsec->sh_offset,
10876                                  relsec->sh_size, & relocs, & num_relocs))
10877             return;
10878         }
10879
10880       /* SH uses RELA but uses in place value instead of the addend field.  */
10881       if (elf_header.e_machine == EM_SH)
10882         is_rela = FALSE;
10883
10884       symsec = section_headers + relsec->sh_link;
10885       symtab = GET_ELF_SYMBOLS ((FILE *) file, symsec, & num_syms);
10886
10887       for (rp = relocs; rp < relocs + num_relocs; ++rp)
10888         {
10889           bfd_vma         addend;
10890           unsigned int    reloc_type;
10891           unsigned int    reloc_size;
10892           unsigned char * rloc;
10893           unsigned long   sym_index;
10894
10895           reloc_type = get_reloc_type (rp->r_info);
10896
10897           if (target_specific_reloc_handling (rp, start, symtab))
10898             continue;
10899           else if (is_none_reloc (reloc_type))
10900             continue;
10901           else if (is_32bit_abs_reloc (reloc_type)
10902                    || is_32bit_pcrel_reloc (reloc_type))
10903             reloc_size = 4;
10904           else if (is_64bit_abs_reloc (reloc_type)
10905                    || is_64bit_pcrel_reloc (reloc_type))
10906             reloc_size = 8;
10907           else if (is_24bit_abs_reloc (reloc_type))
10908             reloc_size = 3;
10909           else if (is_16bit_abs_reloc (reloc_type))
10910             reloc_size = 2;
10911           else
10912             {
10913               warn (_("unable to apply unsupported reloc type %d to section %s\n"),
10914                     reloc_type, SECTION_NAME (section));
10915               continue;
10916             }
10917
10918           rloc = start + rp->r_offset;
10919           if ((rloc + reloc_size) > end || (rloc < start))
10920             {
10921               warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
10922                     (unsigned long) rp->r_offset,
10923                     SECTION_NAME (section));
10924               continue;
10925             }
10926
10927           sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
10928           if (sym_index >= num_syms)
10929             {
10930               warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
10931                     sym_index, SECTION_NAME (section));
10932               continue;
10933             }
10934           sym = symtab + sym_index;
10935
10936           /* If the reloc has a symbol associated with it,
10937              make sure that it is of an appropriate type.
10938
10939              Relocations against symbols without type can happen.
10940              Gcc -feliminate-dwarf2-dups may generate symbols
10941              without type for debug info.
10942
10943              Icc generates relocations against function symbols
10944              instead of local labels.
10945
10946              Relocations against object symbols can happen, eg when
10947              referencing a global array.  For an example of this see
10948              the _clz.o binary in libgcc.a.  */
10949           if (sym != symtab
10950               && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
10951             {
10952               warn (_("skipping unexpected symbol type %s in %ld'th relocation in section %s\n"),
10953                     get_symbol_type (ELF_ST_TYPE (sym->st_info)),
10954                     (long int)(rp - relocs),
10955                     SECTION_NAME (relsec));
10956               continue;
10957             }
10958
10959           addend = 0;
10960           if (is_rela)
10961             addend += rp->r_addend;
10962           /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
10963              partial_inplace.  */
10964           if (!is_rela
10965               || (elf_header.e_machine == EM_XTENSA
10966                   && reloc_type == 1)
10967               || ((elf_header.e_machine == EM_PJ
10968                    || elf_header.e_machine == EM_PJ_OLD)
10969                   && reloc_type == 1)
10970               || ((elf_header.e_machine == EM_D30V
10971                    || elf_header.e_machine == EM_CYGNUS_D30V)
10972                   && reloc_type == 12))
10973             addend += byte_get (rloc, reloc_size);
10974
10975           if (is_32bit_pcrel_reloc (reloc_type)
10976               || is_64bit_pcrel_reloc (reloc_type))
10977             {
10978               /* On HPPA, all pc-relative relocations are biased by 8.  */
10979               if (elf_header.e_machine == EM_PARISC)
10980                 addend -= 8;
10981               byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
10982                         reloc_size);
10983             }
10984           else
10985             byte_put (rloc, addend + sym->st_value, reloc_size);
10986         }
10987
10988       free (symtab);
10989       free (relocs);
10990       break;
10991     }
10992 }
10993
10994 #ifdef SUPPORT_DISASSEMBLY
10995 static int
10996 disassemble_section (Elf_Internal_Shdr * section, FILE * file)
10997 {
10998   printf (_("\nAssembly dump of section %s\n"),
10999           SECTION_NAME (section));
11000
11001   /* XXX -- to be done --- XXX */
11002
11003   return 1;
11004 }
11005 #endif
11006
11007 /* Reads in the contents of SECTION from FILE, returning a pointer
11008    to a malloc'ed buffer or NULL if something went wrong.  */
11009
11010 static char *
11011 get_section_contents (Elf_Internal_Shdr * section, FILE * file)
11012 {
11013   bfd_size_type num_bytes;
11014
11015   num_bytes = section->sh_size;
11016
11017   if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
11018     {
11019       printf (_("\nSection '%s' has no data to dump.\n"),
11020               SECTION_NAME (section));
11021       return NULL;
11022     }
11023
11024   return  (char *) get_data (NULL, file, section->sh_offset, 1, num_bytes,
11025                              _("section contents"));
11026 }
11027
11028
11029 static void
11030 dump_section_as_strings (Elf_Internal_Shdr * section, FILE * file)
11031 {
11032   Elf_Internal_Shdr * relsec;
11033   bfd_size_type num_bytes;
11034   char * data;
11035   char * end;
11036   char * start;
11037   char * name = SECTION_NAME (section);
11038   bfd_boolean some_strings_shown;
11039
11040   start = get_section_contents (section, file);
11041   if (start == NULL)
11042     return;
11043
11044   printf (_("\nString dump of section '%s':\n"), name);
11045
11046   /* If the section being dumped has relocations against it the user might
11047      be expecting these relocations to have been applied.  Check for this
11048      case and issue a warning message in order to avoid confusion.
11049      FIXME: Maybe we ought to have an option that dumps a section with
11050      relocs applied ?  */
11051   for (relsec = section_headers;
11052        relsec < section_headers + elf_header.e_shnum;
11053        ++relsec)
11054     {
11055       if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
11056           || relsec->sh_info >= elf_header.e_shnum
11057           || section_headers + relsec->sh_info != section
11058           || relsec->sh_size == 0
11059           || relsec->sh_link >= elf_header.e_shnum)
11060         continue;
11061
11062       printf (_("  Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
11063       break;
11064     }
11065
11066   num_bytes = section->sh_size;
11067   data = start;
11068   end  = start + num_bytes;
11069   some_strings_shown = FALSE;
11070
11071   while (data < end)
11072     {
11073       while (!ISPRINT (* data))
11074         if (++ data >= end)
11075           break;
11076
11077       if (data < end)
11078         {
11079 #ifndef __MSVCRT__
11080           /* PR 11128: Use two separate invocations in order to work
11081              around bugs in the Solaris 8 implementation of printf.  */
11082           printf ("  [%6tx]  ", data - start);
11083           printf ("%s\n", data);
11084 #else
11085           printf ("  [%6Ix]  %s\n", (size_t) (data - start), data);
11086 #endif
11087           data += strlen (data);
11088           some_strings_shown = TRUE;
11089         }
11090     }
11091
11092   if (! some_strings_shown)
11093     printf (_("  No strings found in this section."));
11094
11095   free (start);
11096
11097   putchar ('\n');
11098 }
11099
11100 static void
11101 dump_section_as_bytes (Elf_Internal_Shdr * section,
11102                        FILE * file,
11103                        bfd_boolean relocate)
11104 {
11105   Elf_Internal_Shdr * relsec;
11106   bfd_size_type bytes;
11107   bfd_vma addr;
11108   unsigned char * data;
11109   unsigned char * start;
11110
11111   start = (unsigned char *) get_section_contents (section, file);
11112   if (start == NULL)
11113     return;
11114
11115   printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section));
11116
11117   if (relocate)
11118     {
11119       apply_relocations (file, section, start);
11120     }
11121   else
11122     {
11123       /* If the section being dumped has relocations against it the user might
11124          be expecting these relocations to have been applied.  Check for this
11125          case and issue a warning message in order to avoid confusion.
11126          FIXME: Maybe we ought to have an option that dumps a section with
11127          relocs applied ?  */
11128       for (relsec = section_headers;
11129            relsec < section_headers + elf_header.e_shnum;
11130            ++relsec)
11131         {
11132           if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
11133               || relsec->sh_info >= elf_header.e_shnum
11134               || section_headers + relsec->sh_info != section
11135               || relsec->sh_size == 0
11136               || relsec->sh_link >= elf_header.e_shnum)
11137             continue;
11138
11139           printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
11140           break;
11141         }
11142     }
11143
11144   addr = section->sh_addr;
11145   bytes = section->sh_size;
11146   data = start;
11147
11148   while (bytes)
11149     {
11150       int j;
11151       int k;
11152       int lbytes;
11153
11154       lbytes = (bytes > 16 ? 16 : bytes);
11155
11156       printf ("  0x%8.8lx ", (unsigned long) addr);
11157
11158       for (j = 0; j < 16; j++)
11159         {
11160           if (j < lbytes)
11161             printf ("%2.2x", data[j]);
11162           else
11163             printf ("  ");
11164
11165           if ((j & 3) == 3)
11166             printf (" ");
11167         }
11168
11169       for (j = 0; j < lbytes; j++)
11170         {
11171           k = data[j];
11172           if (k >= ' ' && k < 0x7f)
11173             printf ("%c", k);
11174           else
11175             printf (".");
11176         }
11177
11178       putchar ('\n');
11179
11180       data  += lbytes;
11181       addr  += lbytes;
11182       bytes -= lbytes;
11183     }
11184
11185   free (start);
11186
11187   putchar ('\n');
11188 }
11189
11190 /* Uncompresses a section that was compressed using zlib, in place.  */
11191
11192 static int
11193 uncompress_section_contents (unsigned char **buffer ATTRIBUTE_UNUSED,
11194                              dwarf_size_type *size ATTRIBUTE_UNUSED)
11195 {
11196 #ifndef HAVE_ZLIB_H
11197   return FALSE;
11198 #else
11199   dwarf_size_type compressed_size = *size;
11200   unsigned char * compressed_buffer = *buffer;
11201   dwarf_size_type uncompressed_size;
11202   unsigned char * uncompressed_buffer;
11203   z_stream strm;
11204   int rc;
11205   dwarf_size_type header_size = 12;
11206
11207   /* Read the zlib header.  In this case, it should be "ZLIB" followed
11208      by the uncompressed section size, 8 bytes in big-endian order.  */
11209   if (compressed_size < header_size
11210       || ! streq ((char *) compressed_buffer, "ZLIB"))
11211     return 0;
11212
11213   uncompressed_size = compressed_buffer[4]; uncompressed_size <<= 8;
11214   uncompressed_size += compressed_buffer[5]; uncompressed_size <<= 8;
11215   uncompressed_size += compressed_buffer[6]; uncompressed_size <<= 8;
11216   uncompressed_size += compressed_buffer[7]; uncompressed_size <<= 8;
11217   uncompressed_size += compressed_buffer[8]; uncompressed_size <<= 8;
11218   uncompressed_size += compressed_buffer[9]; uncompressed_size <<= 8;
11219   uncompressed_size += compressed_buffer[10]; uncompressed_size <<= 8;
11220   uncompressed_size += compressed_buffer[11];
11221
11222   /* It is possible the section consists of several compressed
11223      buffers concatenated together, so we uncompress in a loop.  */
11224   strm.zalloc = NULL;
11225   strm.zfree = NULL;
11226   strm.opaque = NULL;
11227   strm.avail_in = compressed_size - header_size;
11228   strm.next_in = (Bytef *) compressed_buffer + header_size;
11229   strm.avail_out = uncompressed_size;
11230   uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
11231
11232   rc = inflateInit (& strm);
11233   while (strm.avail_in > 0)
11234     {
11235       if (rc != Z_OK)
11236         goto fail;
11237       strm.next_out = ((Bytef *) uncompressed_buffer
11238                        + (uncompressed_size - strm.avail_out));
11239       rc = inflate (&strm, Z_FINISH);
11240       if (rc != Z_STREAM_END)
11241         goto fail;
11242       rc = inflateReset (& strm);
11243     }
11244   rc = inflateEnd (& strm);
11245   if (rc != Z_OK
11246       || strm.avail_out != 0)
11247     goto fail;
11248
11249   free (compressed_buffer);
11250   *buffer = uncompressed_buffer;
11251   *size = uncompressed_size;
11252   return 1;
11253
11254  fail:
11255   free (uncompressed_buffer);
11256   /* Indicate decompression failure.  */
11257   *buffer = NULL;
11258   return 0;
11259 #endif  /* HAVE_ZLIB_H */
11260 }
11261
11262 static int
11263 load_specific_debug_section (enum dwarf_section_display_enum debug,
11264                              Elf_Internal_Shdr * sec, void * file)
11265 {
11266   struct dwarf_section * section = &debug_displays [debug].section;
11267   char buf [64];
11268
11269   /* If it is already loaded, do nothing.  */
11270   if (section->start != NULL)
11271     return 1;
11272
11273   snprintf (buf, sizeof (buf), _("%s section data"), section->name);
11274   section->address = sec->sh_addr;
11275   section->start = (unsigned char *) get_data (NULL, (FILE *) file,
11276                                                sec->sh_offset, 1,
11277                                                sec->sh_size, buf);
11278   if (section->start == NULL)
11279     section->size = 0;
11280   else
11281     {
11282       section->size = sec->sh_size;
11283       if (uncompress_section_contents (&section->start, &section->size))
11284         sec->sh_size = section->size;
11285     }
11286
11287   if (section->start == NULL)
11288     return 0;
11289
11290   if (debug_displays [debug].relocate)
11291     apply_relocations ((FILE *) file, sec, section->start);
11292
11293   return 1;
11294 }
11295
11296 /* If this is not NULL, load_debug_section will only look for sections
11297    within the list of sections given here.  */
11298 unsigned int *section_subset = NULL;
11299
11300 int
11301 load_debug_section (enum dwarf_section_display_enum debug, void * file)
11302 {
11303   struct dwarf_section * section = &debug_displays [debug].section;
11304   Elf_Internal_Shdr * sec;
11305
11306   /* Locate the debug section.  */
11307   sec = find_section_in_set (section->uncompressed_name, section_subset);
11308   if (sec != NULL)
11309     section->name = section->uncompressed_name;
11310   else
11311     {
11312       sec = find_section_in_set (section->compressed_name, section_subset);
11313       if (sec != NULL)
11314         section->name = section->compressed_name;
11315     }
11316   if (sec == NULL)
11317     return 0;
11318
11319   /* If we're loading from a subset of sections, and we've loaded
11320      a section matching this name before, it's likely that it's a
11321      different one.  */
11322   if (section_subset != NULL)
11323     free_debug_section (debug);
11324
11325   return load_specific_debug_section (debug, sec, (FILE *) file);
11326 }
11327
11328 void
11329 free_debug_section (enum dwarf_section_display_enum debug)
11330 {
11331   struct dwarf_section * section = &debug_displays [debug].section;
11332
11333   if (section->start == NULL)
11334     return;
11335
11336   free ((char *) section->start);
11337   section->start = NULL;
11338   section->address = 0;
11339   section->size = 0;
11340 }
11341
11342 static int
11343 display_debug_section (int shndx, Elf_Internal_Shdr * section, FILE * file)
11344 {
11345   char * name = SECTION_NAME (section);
11346   bfd_size_type length;
11347   int result = 1;
11348   int i;
11349
11350   length = section->sh_size;
11351   if (length == 0)
11352     {
11353       printf (_("\nSection '%s' has no debugging data.\n"), name);
11354       return 0;
11355     }
11356   if (section->sh_type == SHT_NOBITS)
11357     {
11358       /* There is no point in dumping the contents of a debugging section
11359          which has the NOBITS type - the bits in the file will be random.
11360          This can happen when a file containing a .eh_frame section is
11361          stripped with the --only-keep-debug command line option.  */
11362       printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"), name);
11363       return 0;
11364     }
11365
11366   if (const_strneq (name, ".gnu.linkonce.wi."))
11367     name = ".debug_info";
11368
11369   /* See if we know how to display the contents of this section.  */
11370   for (i = 0; i < max; i++)
11371     if (streq (debug_displays[i].section.uncompressed_name, name)
11372         || (i == line && const_strneq (name, ".debug_line."))
11373         || streq (debug_displays[i].section.compressed_name, name))
11374       {
11375         struct dwarf_section * sec = &debug_displays [i].section;
11376         int secondary = (section != find_section (name));
11377
11378         if (secondary)
11379           free_debug_section ((enum dwarf_section_display_enum) i);
11380
11381         if (i == line && const_strneq (name, ".debug_line."))
11382           sec->name = name;
11383         else if (streq (sec->uncompressed_name, name))
11384           sec->name = sec->uncompressed_name;
11385         else
11386           sec->name = sec->compressed_name;
11387         if (load_specific_debug_section ((enum dwarf_section_display_enum) i,
11388                                          section, file))
11389           {
11390             /* If this debug section is part of a CU/TU set in a .dwp file,
11391                restrict load_debug_section to the sections in that set.  */
11392             section_subset = find_cu_tu_set (file, shndx);
11393
11394             result &= debug_displays[i].display (sec, file);
11395
11396             section_subset = NULL;
11397
11398             if (secondary || (i != info && i != abbrev))
11399               free_debug_section ((enum dwarf_section_display_enum) i);
11400           }
11401
11402         break;
11403       }
11404
11405   if (i == max)
11406     {
11407       printf (_("Unrecognized debug section: %s\n"), name);
11408       result = 0;
11409     }
11410
11411   return result;
11412 }
11413
11414 /* Set DUMP_SECTS for all sections where dumps were requested
11415    based on section name.  */
11416
11417 static void
11418 initialise_dumps_byname (void)
11419 {
11420   struct dump_list_entry * cur;
11421
11422   for (cur = dump_sects_byname; cur; cur = cur->next)
11423     {
11424       unsigned int i;
11425       int any;
11426
11427       for (i = 0, any = 0; i < elf_header.e_shnum; i++)
11428         if (streq (SECTION_NAME (section_headers + i), cur->name))
11429           {
11430             request_dump_bynumber (i, cur->type);
11431             any = 1;
11432           }
11433
11434       if (!any)
11435         warn (_("Section '%s' was not dumped because it does not exist!\n"),
11436               cur->name);
11437     }
11438 }
11439
11440 static void
11441 process_section_contents (FILE * file)
11442 {
11443   Elf_Internal_Shdr * section;
11444   unsigned int i;
11445
11446   if (! do_dump)
11447     return;
11448
11449   initialise_dumps_byname ();
11450
11451   for (i = 0, section = section_headers;
11452        i < elf_header.e_shnum && i < num_dump_sects;
11453        i++, section++)
11454     {
11455 #ifdef SUPPORT_DISASSEMBLY
11456       if (dump_sects[i] & DISASS_DUMP)
11457         disassemble_section (section, file);
11458 #endif
11459       if (dump_sects[i] & HEX_DUMP)
11460         dump_section_as_bytes (section, file, FALSE);
11461
11462       if (dump_sects[i] & RELOC_DUMP)
11463         dump_section_as_bytes (section, file, TRUE);
11464
11465       if (dump_sects[i] & STRING_DUMP)
11466         dump_section_as_strings (section, file);
11467
11468       if (dump_sects[i] & DEBUG_DUMP)
11469         display_debug_section (i, section, file);
11470     }
11471
11472   /* Check to see if the user requested a
11473      dump of a section that does not exist.  */
11474   while (i++ < num_dump_sects)
11475     if (dump_sects[i])
11476       warn (_("Section %d was not dumped because it does not exist!\n"), i);
11477 }
11478
11479 static void
11480 process_mips_fpe_exception (int mask)
11481 {
11482   if (mask)
11483     {
11484       int first = 1;
11485       if (mask & OEX_FPU_INEX)
11486         fputs ("INEX", stdout), first = 0;
11487       if (mask & OEX_FPU_UFLO)
11488         printf ("%sUFLO", first ? "" : "|"), first = 0;
11489       if (mask & OEX_FPU_OFLO)
11490         printf ("%sOFLO", first ? "" : "|"), first = 0;
11491       if (mask & OEX_FPU_DIV0)
11492         printf ("%sDIV0", first ? "" : "|"), first = 0;
11493       if (mask & OEX_FPU_INVAL)
11494         printf ("%sINVAL", first ? "" : "|");
11495     }
11496   else
11497     fputs ("0", stdout);
11498 }
11499
11500 /* Display's the value of TAG at location P.  If TAG is
11501    greater than 0 it is assumed to be an unknown tag, and
11502    a message is printed to this effect.  Otherwise it is
11503    assumed that a message has already been printed.
11504
11505    If the bottom bit of TAG is set it assumed to have a
11506    string value, otherwise it is assumed to have an integer
11507    value.
11508
11509    Returns an updated P pointing to the first unread byte
11510    beyond the end of TAG's value.
11511
11512    Reads at or beyond END will not be made.  */
11513
11514 static unsigned char *
11515 display_tag_value (int tag,
11516                    unsigned char * p,
11517                    const unsigned char * const end)
11518 {
11519   unsigned long val;
11520
11521   if (tag > 0)
11522     printf ("  Tag_unknown_%d: ", tag);
11523
11524   if (p >= end)
11525     {
11526       warn (_("corrupt tag\n"));
11527     }
11528   else if (tag & 1)
11529     {
11530       /* FIXME: we could read beyond END here.  */
11531       printf ("\"%s\"\n", p);
11532       p += strlen ((char *) p) + 1;
11533     }
11534   else
11535     {
11536       unsigned int len;
11537
11538       val = read_uleb128 (p, &len, end);
11539       p += len;
11540       printf ("%ld (0x%lx)\n", val, val);
11541     }
11542
11543   return p;
11544 }
11545
11546 /* ARM EABI attributes section.  */
11547 typedef struct
11548 {
11549   int tag;
11550   const char * name;
11551   /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup.  */
11552   int type;
11553   const char ** table;
11554 } arm_attr_public_tag;
11555
11556 static const char * arm_attr_tag_CPU_arch[] =
11557   {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
11558    "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8"};
11559 static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
11560 static const char * arm_attr_tag_THUMB_ISA_use[] =
11561   {"No", "Thumb-1", "Thumb-2"};
11562 static const char * arm_attr_tag_FP_arch[] =
11563   {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
11564    "FP for ARMv8"};
11565 static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
11566 static const char * arm_attr_tag_Advanced_SIMD_arch[] =
11567   {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8"};
11568 static const char * arm_attr_tag_PCS_config[] =
11569   {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
11570    "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
11571 static const char * arm_attr_tag_ABI_PCS_R9_use[] =
11572   {"V6", "SB", "TLS", "Unused"};
11573 static const char * arm_attr_tag_ABI_PCS_RW_data[] =
11574   {"Absolute", "PC-relative", "SB-relative", "None"};
11575 static const char * arm_attr_tag_ABI_PCS_RO_data[] =
11576   {"Absolute", "PC-relative", "None"};
11577 static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
11578   {"None", "direct", "GOT-indirect"};
11579 static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
11580   {"None", "??? 1", "2", "??? 3", "4"};
11581 static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
11582 static const char * arm_attr_tag_ABI_FP_denormal[] =
11583   {"Unused", "Needed", "Sign only"};
11584 static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
11585 static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
11586 static const char * arm_attr_tag_ABI_FP_number_model[] =
11587   {"Unused", "Finite", "RTABI", "IEEE 754"};
11588 static const char * arm_attr_tag_ABI_enum_size[] =
11589   {"Unused", "small", "int", "forced to int"};
11590 static const char * arm_attr_tag_ABI_HardFP_use[] =
11591   {"As Tag_FP_arch", "SP only", "DP only", "SP and DP"};
11592 static const char * arm_attr_tag_ABI_VFP_args[] =
11593   {"AAPCS", "VFP registers", "custom"};
11594 static const char * arm_attr_tag_ABI_WMMX_args[] =
11595   {"AAPCS", "WMMX registers", "custom"};
11596 static const char * arm_attr_tag_ABI_optimization_goals[] =
11597   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
11598     "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
11599 static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
11600   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
11601     "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
11602 static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
11603 static const char * arm_attr_tag_FP_HP_extension[] =
11604   {"Not Allowed", "Allowed"};
11605 static const char * arm_attr_tag_ABI_FP_16bit_format[] =
11606   {"None", "IEEE 754", "Alternative Format"};
11607 static const char * arm_attr_tag_MPextension_use[] =
11608   {"Not Allowed", "Allowed"};
11609 static const char * arm_attr_tag_DIV_use[] =
11610   {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
11611     "Allowed in v7-A with integer division extension"};
11612 static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
11613 static const char * arm_attr_tag_Virtualization_use[] =
11614   {"Not Allowed", "TrustZone", "Virtualization Extensions",
11615     "TrustZone and Virtualization Extensions"};
11616 static const char * arm_attr_tag_MPextension_use_legacy[] =
11617   {"Not Allowed", "Allowed"};
11618
11619 #define LOOKUP(id, name) \
11620   {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
11621 static arm_attr_public_tag arm_attr_public_tags[] =
11622 {
11623   {4, "CPU_raw_name", 1, NULL},
11624   {5, "CPU_name", 1, NULL},
11625   LOOKUP(6, CPU_arch),
11626   {7, "CPU_arch_profile", 0, NULL},
11627   LOOKUP(8, ARM_ISA_use),
11628   LOOKUP(9, THUMB_ISA_use),
11629   LOOKUP(10, FP_arch),
11630   LOOKUP(11, WMMX_arch),
11631   LOOKUP(12, Advanced_SIMD_arch),
11632   LOOKUP(13, PCS_config),
11633   LOOKUP(14, ABI_PCS_R9_use),
11634   LOOKUP(15, ABI_PCS_RW_data),
11635   LOOKUP(16, ABI_PCS_RO_data),
11636   LOOKUP(17, ABI_PCS_GOT_use),
11637   LOOKUP(18, ABI_PCS_wchar_t),
11638   LOOKUP(19, ABI_FP_rounding),
11639   LOOKUP(20, ABI_FP_denormal),
11640   LOOKUP(21, ABI_FP_exceptions),
11641   LOOKUP(22, ABI_FP_user_exceptions),
11642   LOOKUP(23, ABI_FP_number_model),
11643   {24, "ABI_align_needed", 0, NULL},
11644   {25, "ABI_align_preserved", 0, NULL},
11645   LOOKUP(26, ABI_enum_size),
11646   LOOKUP(27, ABI_HardFP_use),
11647   LOOKUP(28, ABI_VFP_args),
11648   LOOKUP(29, ABI_WMMX_args),
11649   LOOKUP(30, ABI_optimization_goals),
11650   LOOKUP(31, ABI_FP_optimization_goals),
11651   {32, "compatibility", 0, NULL},
11652   LOOKUP(34, CPU_unaligned_access),
11653   LOOKUP(36, FP_HP_extension),
11654   LOOKUP(38, ABI_FP_16bit_format),
11655   LOOKUP(42, MPextension_use),
11656   LOOKUP(44, DIV_use),
11657   {64, "nodefaults", 0, NULL},
11658   {65, "also_compatible_with", 0, NULL},
11659   LOOKUP(66, T2EE_use),
11660   {67, "conformance", 1, NULL},
11661   LOOKUP(68, Virtualization_use),
11662   LOOKUP(70, MPextension_use_legacy)
11663 };
11664 #undef LOOKUP
11665
11666 static unsigned char *
11667 display_arm_attribute (unsigned char * p,
11668                        const unsigned char * const end)
11669 {
11670   int tag;
11671   unsigned int len;
11672   int val;
11673   arm_attr_public_tag * attr;
11674   unsigned i;
11675   int type;
11676
11677   tag = read_uleb128 (p, &len, end);
11678   p += len;
11679   attr = NULL;
11680   for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
11681     {
11682       if (arm_attr_public_tags[i].tag == tag)
11683         {
11684           attr = &arm_attr_public_tags[i];
11685           break;
11686         }
11687     }
11688
11689   if (attr)
11690     {
11691       printf ("  Tag_%s: ", attr->name);
11692       switch (attr->type)
11693         {
11694         case 0:
11695           switch (tag)
11696             {
11697             case 7: /* Tag_CPU_arch_profile.  */
11698               val = read_uleb128 (p, &len, end);
11699               p += len;
11700               switch (val)
11701                 {
11702                 case 0: printf (_("None\n")); break;
11703                 case 'A': printf (_("Application\n")); break;
11704                 case 'R': printf (_("Realtime\n")); break;
11705                 case 'M': printf (_("Microcontroller\n")); break;
11706                 case 'S': printf (_("Application or Realtime\n")); break;
11707                 default: printf ("??? (%d)\n", val); break;
11708                 }
11709               break;
11710
11711             case 24: /* Tag_align_needed.  */
11712               val = read_uleb128 (p, &len, end);
11713               p += len;
11714               switch (val)
11715                 {
11716                 case 0: printf (_("None\n")); break;
11717                 case 1: printf (_("8-byte\n")); break;
11718                 case 2: printf (_("4-byte\n")); break;
11719                 case 3: printf ("??? 3\n"); break;
11720                 default:
11721                   if (val <= 12)
11722                     printf (_("8-byte and up to %d-byte extended\n"),
11723                             1 << val);
11724                   else
11725                     printf ("??? (%d)\n", val);
11726                   break;
11727                 }
11728               break;
11729
11730             case 25: /* Tag_align_preserved.  */
11731               val = read_uleb128 (p, &len, end);
11732               p += len;
11733               switch (val)
11734                 {
11735                 case 0: printf (_("None\n")); break;
11736                 case 1: printf (_("8-byte, except leaf SP\n")); break;
11737                 case 2: printf (_("8-byte\n")); break;
11738                 case 3: printf ("??? 3\n"); break;
11739                 default:
11740                   if (val <= 12)
11741                     printf (_("8-byte and up to %d-byte extended\n"),
11742                             1 << val);
11743                   else
11744                     printf ("??? (%d)\n", val);
11745                   break;
11746                 }
11747               break;
11748
11749             case 32: /* Tag_compatibility.  */
11750               val = read_uleb128 (p, &len, end);
11751               p += len;
11752               printf (_("flag = %d, vendor = %s\n"), val, p);
11753               p += strlen ((char *) p) + 1;
11754               break;
11755
11756             case 64: /* Tag_nodefaults.  */
11757               p++;
11758               printf (_("True\n"));
11759               break;
11760
11761             case 65: /* Tag_also_compatible_with.  */
11762               val = read_uleb128 (p, &len, end);
11763               p += len;
11764               if (val == 6 /* Tag_CPU_arch.  */)
11765                 {
11766                   val = read_uleb128 (p, &len, end);
11767                   p += len;
11768                   if ((unsigned int)val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
11769                     printf ("??? (%d)\n", val);
11770                   else
11771                     printf ("%s\n", arm_attr_tag_CPU_arch[val]);
11772                 }
11773               else
11774                 printf ("???\n");
11775               while (*(p++) != '\0' /* NUL terminator.  */);
11776               break;
11777
11778             default:
11779               abort ();
11780             }
11781           return p;
11782
11783         case 1:
11784           return display_tag_value (-1, p, end);
11785         case 2:
11786           return display_tag_value (0, p, end);
11787
11788         default:
11789           assert (attr->type & 0x80);
11790           val = read_uleb128 (p, &len, end);
11791           p += len;
11792           type = attr->type & 0x7f;
11793           if (val >= type)
11794             printf ("??? (%d)\n", val);
11795           else
11796             printf ("%s\n", attr->table[val]);
11797           return p;
11798         }
11799     }
11800
11801   return display_tag_value (tag, p, end);
11802 }
11803
11804 static unsigned char *
11805 display_gnu_attribute (unsigned char * p,
11806                        unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const),
11807                        const unsigned char * const end)
11808 {
11809   int tag;
11810   unsigned int len;
11811   int val;
11812
11813   tag = read_uleb128 (p, &len, end);
11814   p += len;
11815
11816   /* Tag_compatibility is the only generic GNU attribute defined at
11817      present.  */
11818   if (tag == 32)
11819     {
11820       val = read_uleb128 (p, &len, end);
11821       p += len;
11822       if (p == end)
11823         {
11824           printf (_("flag = %d, vendor = <corrupt>\n"), val);
11825           warn (_("corrupt vendor attribute\n"));
11826         }
11827       else
11828         {
11829           printf (_("flag = %d, vendor = %s\n"), val, p);
11830           p += strlen ((char *) p) + 1;
11831         }
11832       return p;
11833     }
11834
11835   if ((tag & 2) == 0 && display_proc_gnu_attribute)
11836     return display_proc_gnu_attribute (p, tag, end);
11837
11838   return display_tag_value (tag, p, end);
11839 }
11840
11841 static unsigned char *
11842 display_power_gnu_attribute (unsigned char * p,
11843                              int tag,
11844                              const unsigned char * const end)
11845 {
11846   unsigned int len;
11847   int val;
11848
11849   if (tag == Tag_GNU_Power_ABI_FP)
11850     {
11851       val = read_uleb128 (p, &len, end);
11852       p += len;
11853       printf ("  Tag_GNU_Power_ABI_FP: ");
11854
11855       switch (val)
11856         {
11857         case 0:
11858           printf (_("Hard or soft float\n"));
11859           break;
11860         case 1:
11861           printf (_("Hard float\n"));
11862           break;
11863         case 2:
11864           printf (_("Soft float\n"));
11865           break;
11866         case 3:
11867           printf (_("Single-precision hard float\n"));
11868           break;
11869         default:
11870           printf ("??? (%d)\n", val);
11871           break;
11872         }
11873       return p;
11874    }
11875
11876   if (tag == Tag_GNU_Power_ABI_Vector)
11877     {
11878       val = read_uleb128 (p, &len, end);
11879       p += len;
11880       printf ("  Tag_GNU_Power_ABI_Vector: ");
11881       switch (val)
11882         {
11883         case 0:
11884           printf (_("Any\n"));
11885           break;
11886         case 1:
11887           printf (_("Generic\n"));
11888           break;
11889         case 2:
11890           printf ("AltiVec\n");
11891           break;
11892         case 3:
11893           printf ("SPE\n");
11894           break;
11895         default:
11896           printf ("??? (%d)\n", val);
11897           break;
11898         }
11899       return p;
11900    }
11901
11902   if (tag == Tag_GNU_Power_ABI_Struct_Return)
11903     {
11904       if (p == end)
11905         {
11906           warn (_("corrupt Tag_GNU_Power_ABI_Struct_Return"));
11907           return p;
11908         }
11909
11910       val = read_uleb128 (p, &len, end);
11911       p += len;
11912       printf ("  Tag_GNU_Power_ABI_Struct_Return: ");
11913       switch (val)
11914        {
11915        case 0:
11916          printf (_("Any\n"));
11917          break;
11918        case 1:
11919          printf ("r3/r4\n");
11920          break;
11921        case 2:
11922          printf (_("Memory\n"));
11923          break;
11924        default:
11925          printf ("??? (%d)\n", val);
11926          break;
11927        }
11928       return p;
11929     }
11930
11931   return display_tag_value (tag & 1, p, end);
11932 }
11933
11934 static void
11935 display_sparc_hwcaps (int mask)
11936 {
11937   if (mask)
11938     {
11939       int first = 1;
11940       if (mask & ELF_SPARC_HWCAP_MUL32)
11941         fputs ("mul32", stdout), first = 0;
11942       if (mask & ELF_SPARC_HWCAP_DIV32)
11943         printf ("%sdiv32", first ? "" : "|"), first = 0;
11944       if (mask & ELF_SPARC_HWCAP_FSMULD)
11945         printf ("%sfsmuld", first ? "" : "|"), first = 0;
11946       if (mask & ELF_SPARC_HWCAP_V8PLUS)
11947         printf ("%sv8plus", first ? "" : "|"), first = 0;
11948       if (mask & ELF_SPARC_HWCAP_POPC)
11949         printf ("%spopc", first ? "" : "|"), first = 0;
11950       if (mask & ELF_SPARC_HWCAP_VIS)
11951         printf ("%svis", first ? "" : "|"), first = 0;
11952       if (mask & ELF_SPARC_HWCAP_VIS2)
11953         printf ("%svis2", first ? "" : "|"), first = 0;
11954       if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
11955         printf ("%sASIBlkInit", first ? "" : "|"), first = 0;
11956       if (mask & ELF_SPARC_HWCAP_FMAF)
11957         printf ("%sfmaf", first ? "" : "|"), first = 0;
11958       if (mask & ELF_SPARC_HWCAP_VIS3)
11959         printf ("%svis3", first ? "" : "|"), first = 0;
11960       if (mask & ELF_SPARC_HWCAP_HPC)
11961         printf ("%shpc", first ? "" : "|"), first = 0;
11962       if (mask & ELF_SPARC_HWCAP_RANDOM)
11963         printf ("%srandom", first ? "" : "|"), first = 0;
11964       if (mask & ELF_SPARC_HWCAP_TRANS)
11965         printf ("%strans", first ? "" : "|"), first = 0;
11966       if (mask & ELF_SPARC_HWCAP_FJFMAU)
11967         printf ("%sfjfmau", first ? "" : "|"), first = 0;
11968       if (mask & ELF_SPARC_HWCAP_IMA)
11969         printf ("%sima", first ? "" : "|"), first = 0;
11970       if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
11971         printf ("%scspare", first ? "" : "|"), first = 0;
11972     }
11973   else
11974     fputc('0', stdout);
11975   fputc('\n', stdout);
11976 }
11977
11978 static unsigned char *
11979 display_sparc_gnu_attribute (unsigned char * p,
11980                              int tag,
11981                              const unsigned char * const end)
11982 {
11983   if (tag == Tag_GNU_Sparc_HWCAPS)
11984     {
11985       unsigned int len;
11986       int val;
11987
11988       val = read_uleb128 (p, &len, end);
11989       p += len;
11990       printf ("  Tag_GNU_Sparc_HWCAPS: ");
11991       display_sparc_hwcaps (val);
11992       return p;
11993    }
11994
11995   return display_tag_value (tag, p, end);
11996 }
11997
11998 static unsigned char *
11999 display_mips_gnu_attribute (unsigned char * p,
12000                             int tag,
12001                             const unsigned char * const end)
12002 {
12003   if (tag == Tag_GNU_MIPS_ABI_FP)
12004     {
12005       unsigned int len;
12006       int val;
12007
12008       val = read_uleb128 (p, &len, end);
12009       p += len;
12010       printf ("  Tag_GNU_MIPS_ABI_FP: ");
12011
12012       switch (val)
12013         {
12014         case Val_GNU_MIPS_ABI_FP_ANY:
12015           printf (_("Hard or soft float\n"));
12016           break;
12017         case Val_GNU_MIPS_ABI_FP_DOUBLE:
12018           printf (_("Hard float (double precision)\n"));
12019           break;
12020         case Val_GNU_MIPS_ABI_FP_SINGLE:
12021           printf (_("Hard float (single precision)\n"));
12022           break;
12023         case Val_GNU_MIPS_ABI_FP_SOFT:
12024           printf (_("Soft float\n"));
12025           break;
12026         case Val_GNU_MIPS_ABI_FP_64:
12027           printf (_("Hard float (MIPS32r2 64-bit FPU)\n"));
12028           break;
12029         default:
12030           printf ("??? (%d)\n", val);
12031           break;
12032         }
12033       return p;
12034    }
12035
12036   if (tag == Tag_GNU_MIPS_ABI_MSA)
12037     {
12038       unsigned int len;
12039       int val;
12040
12041       val = read_uleb128 (p, &len, end);
12042       p += len;
12043       printf ("  Tag_GNU_MIPS_ABI_MSA: ");
12044
12045       switch (val)
12046         {
12047         case Val_GNU_MIPS_ABI_MSA_ANY:
12048           printf (_("Any MSA or not\n"));
12049           break;
12050         case Val_GNU_MIPS_ABI_MSA_128:
12051           printf (_("128-bit MSA\n"));
12052           break;
12053         default:
12054           printf ("??? (%d)\n", val);
12055           break;
12056         }
12057       return p;
12058     }
12059
12060   return display_tag_value (tag & 1, p, end);
12061 }
12062
12063 static unsigned char *
12064 display_tic6x_attribute (unsigned char * p,
12065                          const unsigned char * const end)
12066 {
12067   int tag;
12068   unsigned int len;
12069   int val;
12070
12071   tag = read_uleb128 (p, &len, end);
12072   p += len;
12073
12074   switch (tag)
12075     {
12076     case Tag_ISA:
12077       val = read_uleb128 (p, &len, end);
12078       p += len;
12079       printf ("  Tag_ISA: ");
12080
12081       switch (val)
12082         {
12083         case C6XABI_Tag_ISA_none:
12084           printf (_("None\n"));
12085           break;
12086         case C6XABI_Tag_ISA_C62X:
12087           printf ("C62x\n");
12088           break;
12089         case C6XABI_Tag_ISA_C67X:
12090           printf ("C67x\n");
12091           break;
12092         case C6XABI_Tag_ISA_C67XP:
12093           printf ("C67x+\n");
12094           break;
12095         case C6XABI_Tag_ISA_C64X:
12096           printf ("C64x\n");
12097           break;
12098         case C6XABI_Tag_ISA_C64XP:
12099           printf ("C64x+\n");
12100           break;
12101         case C6XABI_Tag_ISA_C674X:
12102           printf ("C674x\n");
12103           break;
12104         default:
12105           printf ("??? (%d)\n", val);
12106           break;
12107         }
12108       return p;
12109
12110     case Tag_ABI_wchar_t:
12111       val = read_uleb128 (p, &len, end);
12112       p += len;
12113       printf ("  Tag_ABI_wchar_t: ");
12114       switch (val)
12115         {
12116         case 0:
12117           printf (_("Not used\n"));
12118           break;
12119         case 1:
12120           printf (_("2 bytes\n"));
12121           break;
12122         case 2:
12123           printf (_("4 bytes\n"));
12124           break;
12125         default:
12126           printf ("??? (%d)\n", val);
12127           break;
12128         }
12129       return p;
12130
12131     case Tag_ABI_stack_align_needed:
12132       val = read_uleb128 (p, &len, end);
12133       p += len;
12134       printf ("  Tag_ABI_stack_align_needed: ");
12135       switch (val)
12136         {
12137         case 0:
12138           printf (_("8-byte\n"));
12139           break;
12140         case 1:
12141           printf (_("16-byte\n"));
12142           break;
12143         default:
12144           printf ("??? (%d)\n", val);
12145           break;
12146         }
12147       return p;
12148
12149     case Tag_ABI_stack_align_preserved:
12150       val = read_uleb128 (p, &len, end);
12151       p += len;
12152       printf ("  Tag_ABI_stack_align_preserved: ");
12153       switch (val)
12154         {
12155         case 0:
12156           printf (_("8-byte\n"));
12157           break;
12158         case 1:
12159           printf (_("16-byte\n"));
12160           break;
12161         default:
12162           printf ("??? (%d)\n", val);
12163           break;
12164         }
12165       return p;
12166
12167     case Tag_ABI_DSBT:
12168       val = read_uleb128 (p, &len, end);
12169       p += len;
12170       printf ("  Tag_ABI_DSBT: ");
12171       switch (val)
12172         {
12173         case 0:
12174           printf (_("DSBT addressing not used\n"));
12175           break;
12176         case 1:
12177           printf (_("DSBT addressing used\n"));
12178           break;
12179         default:
12180           printf ("??? (%d)\n", val);
12181           break;
12182         }
12183       return p;
12184
12185     case Tag_ABI_PID:
12186       val = read_uleb128 (p, &len, end);
12187       p += len;
12188       printf ("  Tag_ABI_PID: ");
12189       switch (val)
12190         {
12191         case 0:
12192           printf (_("Data addressing position-dependent\n"));
12193           break;
12194         case 1:
12195           printf (_("Data addressing position-independent, GOT near DP\n"));
12196           break;
12197         case 2:
12198           printf (_("Data addressing position-independent, GOT far from DP\n"));
12199           break;
12200         default:
12201           printf ("??? (%d)\n", val);
12202           break;
12203         }
12204       return p;
12205
12206     case Tag_ABI_PIC:
12207       val = read_uleb128 (p, &len, end);
12208       p += len;
12209       printf ("  Tag_ABI_PIC: ");
12210       switch (val)
12211         {
12212         case 0:
12213           printf (_("Code addressing position-dependent\n"));
12214           break;
12215         case 1:
12216           printf (_("Code addressing position-independent\n"));
12217           break;
12218         default:
12219           printf ("??? (%d)\n", val);
12220           break;
12221         }
12222       return p;
12223
12224     case Tag_ABI_array_object_alignment:
12225       val = read_uleb128 (p, &len, end);
12226       p += len;
12227       printf ("  Tag_ABI_array_object_alignment: ");
12228       switch (val)
12229         {
12230         case 0:
12231           printf (_("8-byte\n"));
12232           break;
12233         case 1:
12234           printf (_("4-byte\n"));
12235           break;
12236         case 2:
12237           printf (_("16-byte\n"));
12238           break;
12239         default:
12240           printf ("??? (%d)\n", val);
12241           break;
12242         }
12243       return p;
12244
12245     case Tag_ABI_array_object_align_expected:
12246       val = read_uleb128 (p, &len, end);
12247       p += len;
12248       printf ("  Tag_ABI_array_object_align_expected: ");
12249       switch (val)
12250         {
12251         case 0:
12252           printf (_("8-byte\n"));
12253           break;
12254         case 1:
12255           printf (_("4-byte\n"));
12256           break;
12257         case 2:
12258           printf (_("16-byte\n"));
12259           break;
12260         default:
12261           printf ("??? (%d)\n", val);
12262           break;
12263         }
12264       return p;
12265
12266     case Tag_ABI_compatibility:
12267       val = read_uleb128 (p, &len, end);
12268       p += len;
12269       printf ("  Tag_ABI_compatibility: ");
12270       printf (_("flag = %d, vendor = %s\n"), val, p);
12271       p += strlen ((char *) p) + 1;
12272       return p;
12273
12274     case Tag_ABI_conformance:
12275       printf ("  Tag_ABI_conformance: ");
12276       printf ("\"%s\"\n", p);
12277       p += strlen ((char *) p) + 1;
12278       return p;
12279     }
12280
12281   return display_tag_value (tag, p, end);
12282 }
12283
12284 static void
12285 display_raw_attribute (unsigned char * p, unsigned char * end)
12286 {
12287   unsigned long addr = 0;
12288   size_t bytes = end - p;
12289
12290   while (bytes)
12291     {
12292       int j;
12293       int k;
12294       int lbytes = (bytes > 16 ? 16 : bytes);
12295
12296       printf ("  0x%8.8lx ", addr);
12297
12298       for (j = 0; j < 16; j++)
12299         {
12300           if (j < lbytes)
12301             printf ("%2.2x", p[j]);
12302           else
12303             printf ("  ");
12304
12305           if ((j & 3) == 3)
12306             printf (" ");
12307         }
12308
12309       for (j = 0; j < lbytes; j++)
12310         {
12311           k = p[j];
12312           if (k >= ' ' && k < 0x7f)
12313             printf ("%c", k);
12314           else
12315             printf (".");
12316         }
12317
12318       putchar ('\n');
12319
12320       p  += lbytes;
12321       bytes -= lbytes;
12322       addr += lbytes;
12323     }
12324
12325   putchar ('\n');
12326 }
12327
12328 static unsigned char *
12329 display_msp430x_attribute (unsigned char * p,
12330                            const unsigned char * const end)
12331 {
12332   unsigned int len;
12333   int val;
12334   int tag;
12335
12336   tag = read_uleb128 (p, & len, end);
12337   p += len;
12338
12339   switch (tag)
12340     {
12341     case OFBA_MSPABI_Tag_ISA:
12342       val = read_uleb128 (p, &len, end);
12343       p += len;
12344       printf ("  Tag_ISA: ");
12345       switch (val)
12346         {
12347         case 0: printf (_("None\n")); break;
12348         case 1: printf (_("MSP430\n")); break;
12349         case 2: printf (_("MSP430X\n")); break;
12350         default: printf ("??? (%d)\n", val); break;
12351         }
12352       break;
12353
12354     case OFBA_MSPABI_Tag_Code_Model:
12355       val = read_uleb128 (p, &len, end);
12356       p += len;
12357       printf ("  Tag_Code_Model: ");
12358       switch (val)
12359         {
12360         case 0: printf (_("None\n")); break;
12361         case 1: printf (_("Small\n")); break;
12362         case 2: printf (_("Large\n")); break;
12363         default: printf ("??? (%d)\n", val); break;
12364         }
12365       break;
12366
12367     case OFBA_MSPABI_Tag_Data_Model:
12368       val = read_uleb128 (p, &len, end);
12369       p += len;
12370       printf ("  Tag_Data_Model: ");
12371       switch (val)
12372         {
12373         case 0: printf (_("None\n")); break;
12374         case 1: printf (_("Small\n")); break;
12375         case 2: printf (_("Large\n")); break;
12376         case 3: printf (_("Restricted Large\n")); break;
12377         default: printf ("??? (%d)\n", val); break;
12378         }
12379       break;
12380
12381     default:
12382       printf (_("  <unknown tag %d>: "), tag);
12383
12384       if (tag & 1)
12385         {
12386           printf ("\"%s\"\n", p);
12387           p += strlen ((char *) p) + 1;
12388         }
12389       else
12390         {
12391           val = read_uleb128 (p, &len, end);
12392           p += len;
12393           printf ("%d (0x%x)\n", val, val);
12394         }
12395       break;
12396    }
12397
12398   return p;
12399 }
12400
12401 static int
12402 process_attributes (FILE * file,
12403                     const char * public_name,
12404                     unsigned int proc_type,
12405                     unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
12406                     unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const))
12407 {
12408   Elf_Internal_Shdr * sect;
12409   unsigned char * contents;
12410   unsigned char * p;
12411   unsigned char * end;
12412   bfd_vma section_len;
12413   bfd_vma len;
12414   unsigned i;
12415
12416   /* Find the section header so that we get the size.  */
12417   for (i = 0, sect = section_headers;
12418        i < elf_header.e_shnum;
12419        i++, sect++)
12420     {
12421       if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
12422         continue;
12423
12424       contents = (unsigned char *) get_data (NULL, file, sect->sh_offset, 1,
12425                                              sect->sh_size, _("attributes"));
12426       if (contents == NULL)
12427         continue;
12428
12429       p = contents;
12430       if (*p == 'A')
12431         {
12432           len = sect->sh_size - 1;
12433           p++;
12434
12435           while (len > 0)
12436             {
12437               unsigned int namelen;
12438               bfd_boolean public_section;
12439               bfd_boolean gnu_section;
12440
12441               section_len = byte_get (p, 4);
12442               p += 4;
12443
12444               if (section_len > len)
12445                 {
12446                   error (_("Length of attribute (%u) greater than length of section (%u)\n"),
12447                           (unsigned) section_len, (unsigned) len);
12448                   section_len = len;
12449                 }
12450
12451               len -= section_len;
12452               section_len -= 4;
12453
12454               namelen = strnlen ((char *) p, section_len) + 1;
12455               if (namelen == 0 || namelen >= section_len)
12456                 {
12457                   error (_("Corrupt attribute section name\n"));
12458                   break;
12459                 }
12460
12461               printf (_("Attribute Section: %s\n"), p);
12462
12463               if (public_name && streq ((char *) p, public_name))
12464                 public_section = TRUE;
12465               else
12466                 public_section = FALSE;
12467
12468               if (streq ((char *) p, "gnu"))
12469                 gnu_section = TRUE;
12470               else
12471                 gnu_section = FALSE;
12472
12473               p += namelen;
12474               section_len -= namelen;
12475               while (section_len > 0)
12476                 {
12477                   int tag = *(p++);
12478                   int val;
12479                   bfd_vma size;
12480
12481                   size = byte_get (p, 4);
12482                   if (size > section_len)
12483                     {
12484                       error (_("Bad subsection length (%u > %u)\n"),
12485                               (unsigned) size, (unsigned) section_len);
12486                       size = section_len;
12487                     }
12488
12489                   section_len -= size;
12490                   end = p + size - 1;
12491                   p += 4;
12492
12493                   switch (tag)
12494                     {
12495                     case 1:
12496                       printf (_("File Attributes\n"));
12497                       break;
12498                     case 2:
12499                       printf (_("Section Attributes:"));
12500                       goto do_numlist;
12501                     case 3:
12502                       printf (_("Symbol Attributes:"));
12503                     do_numlist:
12504                       for (;;)
12505                         {
12506                           unsigned int j;
12507
12508                           val = read_uleb128 (p, &j, end);
12509                           p += j;
12510                           if (val == 0)
12511                             break;
12512                           printf (" %d", val);
12513                         }
12514                       printf ("\n");
12515                       break;
12516                     default:
12517                       printf (_("Unknown tag: %d\n"), tag);
12518                       public_section = FALSE;
12519                       break;
12520                     }
12521
12522                   if (public_section)
12523                     {
12524                       while (p < end)
12525                         p = display_pub_attribute (p, end);
12526                     }
12527                   else if (gnu_section)
12528                     {
12529                       while (p < end)
12530                         p = display_gnu_attribute (p,
12531                                                    display_proc_gnu_attribute,
12532                                                    end);
12533                     }
12534                   else
12535                     {
12536                       printf (_("  Unknown section contexts\n"));
12537                       display_raw_attribute (p, end);
12538                       p = end;
12539                     }
12540                 }
12541             }
12542         }
12543       else
12544         printf (_("Unknown format '%c' (%d)\n"), *p, *p);
12545
12546       free (contents);
12547     }
12548   return 1;
12549 }
12550
12551 static int
12552 process_arm_specific (FILE * file)
12553 {
12554   return process_attributes (file, "aeabi", SHT_ARM_ATTRIBUTES,
12555                              display_arm_attribute, NULL);
12556 }
12557
12558 static int
12559 process_power_specific (FILE * file)
12560 {
12561   return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
12562                              display_power_gnu_attribute);
12563 }
12564
12565 static int
12566 process_sparc_specific (FILE * file)
12567 {
12568   return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
12569                              display_sparc_gnu_attribute);
12570 }
12571
12572 static int
12573 process_tic6x_specific (FILE * file)
12574 {
12575   return process_attributes (file, "c6xabi", SHT_C6000_ATTRIBUTES,
12576                              display_tic6x_attribute, NULL);
12577 }
12578
12579 static int
12580 process_msp430x_specific (FILE * file)
12581 {
12582   return process_attributes (file, "mspabi", SHT_MSP430_ATTRIBUTES,
12583                              display_msp430x_attribute, NULL);
12584 }
12585
12586 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
12587    Print the Address, Access and Initial fields of an entry at VMA ADDR
12588    and return the VMA of the next entry.  */
12589
12590 static bfd_vma
12591 print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
12592 {
12593   printf ("  ");
12594   print_vma (addr, LONG_HEX);
12595   printf (" ");
12596   if (addr < pltgot + 0xfff0)
12597     printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
12598   else
12599     printf ("%10s", "");
12600   printf (" ");
12601   if (data == NULL)
12602     printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
12603   else
12604     {
12605       bfd_vma entry;
12606
12607       entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
12608       print_vma (entry, LONG_HEX);
12609     }
12610   return addr + (is_32bit_elf ? 4 : 8);
12611 }
12612
12613 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
12614    PLTGOT.  Print the Address and Initial fields of an entry at VMA
12615    ADDR and return the VMA of the next entry.  */
12616
12617 static bfd_vma
12618 print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
12619 {
12620   printf ("  ");
12621   print_vma (addr, LONG_HEX);
12622   printf (" ");
12623   if (data == NULL)
12624     printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
12625   else
12626     {
12627       bfd_vma entry;
12628
12629       entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
12630       print_vma (entry, LONG_HEX);
12631     }
12632   return addr + (is_32bit_elf ? 4 : 8);
12633 }
12634
12635 static int
12636 process_mips_specific (FILE * file)
12637 {
12638   Elf_Internal_Dyn * entry;
12639   size_t liblist_offset = 0;
12640   size_t liblistno = 0;
12641   size_t conflictsno = 0;
12642   size_t options_offset = 0;
12643   size_t conflicts_offset = 0;
12644   size_t pltrelsz = 0;
12645   size_t pltrel = 0;
12646   bfd_vma pltgot = 0;
12647   bfd_vma mips_pltgot = 0;
12648   bfd_vma jmprel = 0;
12649   bfd_vma local_gotno = 0;
12650   bfd_vma gotsym = 0;
12651   bfd_vma symtabno = 0;
12652
12653   process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
12654                       display_mips_gnu_attribute);
12655
12656   /* We have a lot of special sections.  Thanks SGI!  */
12657   if (dynamic_section == NULL)
12658     /* No information available.  */
12659     return 0;
12660
12661   for (entry = dynamic_section; entry->d_tag != DT_NULL; ++entry)
12662     switch (entry->d_tag)
12663       {
12664       case DT_MIPS_LIBLIST:
12665         liblist_offset
12666           = offset_from_vma (file, entry->d_un.d_val,
12667                              liblistno * sizeof (Elf32_External_Lib));
12668         break;
12669       case DT_MIPS_LIBLISTNO:
12670         liblistno = entry->d_un.d_val;
12671         break;
12672       case DT_MIPS_OPTIONS:
12673         options_offset = offset_from_vma (file, entry->d_un.d_val, 0);
12674         break;
12675       case DT_MIPS_CONFLICT:
12676         conflicts_offset
12677           = offset_from_vma (file, entry->d_un.d_val,
12678                              conflictsno * sizeof (Elf32_External_Conflict));
12679         break;
12680       case DT_MIPS_CONFLICTNO:
12681         conflictsno = entry->d_un.d_val;
12682         break;
12683       case DT_PLTGOT:
12684         pltgot = entry->d_un.d_ptr;
12685         break;
12686       case DT_MIPS_LOCAL_GOTNO:
12687         local_gotno = entry->d_un.d_val;
12688         break;
12689       case DT_MIPS_GOTSYM:
12690         gotsym = entry->d_un.d_val;
12691         break;
12692       case DT_MIPS_SYMTABNO:
12693         symtabno = entry->d_un.d_val;
12694         break;
12695       case DT_MIPS_PLTGOT:
12696         mips_pltgot = entry->d_un.d_ptr;
12697         break;
12698       case DT_PLTREL:
12699         pltrel = entry->d_un.d_val;
12700         break;
12701       case DT_PLTRELSZ:
12702         pltrelsz = entry->d_un.d_val;
12703         break;
12704       case DT_JMPREL:
12705         jmprel = entry->d_un.d_ptr;
12706         break;
12707       default:
12708         break;
12709       }
12710
12711   if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
12712     {
12713       Elf32_External_Lib * elib;
12714       size_t cnt;
12715
12716       elib = (Elf32_External_Lib *) get_data (NULL, file, liblist_offset,
12717                                               liblistno,
12718                                               sizeof (Elf32_External_Lib),
12719                                               _("liblist section data"));
12720       if (elib)
12721         {
12722           printf (_("\nSection '.liblist' contains %lu entries:\n"),
12723                   (unsigned long) liblistno);
12724           fputs (_("     Library              Time Stamp          Checksum   Version Flags\n"),
12725                  stdout);
12726
12727           for (cnt = 0; cnt < liblistno; ++cnt)
12728             {
12729               Elf32_Lib liblist;
12730               time_t atime;
12731               char timebuf[20];
12732               struct tm * tmp;
12733
12734               liblist.l_name = BYTE_GET (elib[cnt].l_name);
12735               atime = BYTE_GET (elib[cnt].l_time_stamp);
12736               liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
12737               liblist.l_version = BYTE_GET (elib[cnt].l_version);
12738               liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
12739
12740               tmp = gmtime (&atime);
12741               snprintf (timebuf, sizeof (timebuf),
12742                         "%04u-%02u-%02uT%02u:%02u:%02u",
12743                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
12744                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
12745
12746               printf ("%3lu: ", (unsigned long) cnt);
12747               if (VALID_DYNAMIC_NAME (liblist.l_name))
12748                 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
12749               else
12750                 printf (_("<corrupt: %9ld>"), liblist.l_name);
12751               printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
12752                       liblist.l_version);
12753
12754               if (liblist.l_flags == 0)
12755                 puts (_(" NONE"));
12756               else
12757                 {
12758                   static const struct
12759                   {
12760                     const char * name;
12761                     int bit;
12762                   }
12763                   l_flags_vals[] =
12764                   {
12765                     { " EXACT_MATCH", LL_EXACT_MATCH },
12766                     { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
12767                     { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
12768                     { " EXPORTS", LL_EXPORTS },
12769                     { " DELAY_LOAD", LL_DELAY_LOAD },
12770                     { " DELTA", LL_DELTA }
12771                   };
12772                   int flags = liblist.l_flags;
12773                   size_t fcnt;
12774
12775                   for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
12776                     if ((flags & l_flags_vals[fcnt].bit) != 0)
12777                       {
12778                         fputs (l_flags_vals[fcnt].name, stdout);
12779                         flags ^= l_flags_vals[fcnt].bit;
12780                       }
12781                   if (flags != 0)
12782                     printf (" %#x", (unsigned int) flags);
12783
12784                   puts ("");
12785                 }
12786             }
12787
12788           free (elib);
12789         }
12790     }
12791
12792   if (options_offset != 0)
12793     {
12794       Elf_External_Options * eopt;
12795       Elf_Internal_Shdr * sect = section_headers;
12796       Elf_Internal_Options * iopt;
12797       Elf_Internal_Options * option;
12798       size_t offset;
12799       int cnt;
12800
12801       /* Find the section header so that we get the size.  */
12802       while (sect->sh_type != SHT_MIPS_OPTIONS)
12803         ++sect;
12804
12805       eopt = (Elf_External_Options *) get_data (NULL, file, options_offset, 1,
12806                                                 sect->sh_size, _("options"));
12807       if (eopt)
12808         {
12809           iopt = (Elf_Internal_Options *)
12810               cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
12811           if (iopt == NULL)
12812             {
12813               error (_("Out of memory\n"));
12814               return 0;
12815             }
12816
12817           offset = cnt = 0;
12818           option = iopt;
12819
12820           while (offset < sect->sh_size)
12821             {
12822               Elf_External_Options * eoption;
12823
12824               eoption = (Elf_External_Options *) ((char *) eopt + offset);
12825
12826               option->kind = BYTE_GET (eoption->kind);
12827               option->size = BYTE_GET (eoption->size);
12828               option->section = BYTE_GET (eoption->section);
12829               option->info = BYTE_GET (eoption->info);
12830
12831               offset += option->size;
12832
12833               ++option;
12834               ++cnt;
12835             }
12836
12837           printf (_("\nSection '%s' contains %d entries:\n"),
12838                   SECTION_NAME (sect), cnt);
12839
12840           option = iopt;
12841
12842           while (cnt-- > 0)
12843             {
12844               size_t len;
12845
12846               switch (option->kind)
12847                 {
12848                 case ODK_NULL:
12849                   /* This shouldn't happen.  */
12850                   printf (" NULL       %d %lx", option->section, option->info);
12851                   break;
12852                 case ODK_REGINFO:
12853                   printf (" REGINFO    ");
12854                   if (elf_header.e_machine == EM_MIPS)
12855                     {
12856                       /* 32bit form.  */
12857                       Elf32_External_RegInfo * ereg;
12858                       Elf32_RegInfo reginfo;
12859
12860                       ereg = (Elf32_External_RegInfo *) (option + 1);
12861                       reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
12862                       reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
12863                       reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
12864                       reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
12865                       reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
12866                       reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
12867
12868                       printf ("GPR %08lx  GP 0x%lx\n",
12869                               reginfo.ri_gprmask,
12870                               (unsigned long) reginfo.ri_gp_value);
12871                       printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
12872                               reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
12873                               reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
12874                     }
12875                   else
12876                     {
12877                       /* 64 bit form.  */
12878                       Elf64_External_RegInfo * ereg;
12879                       Elf64_Internal_RegInfo reginfo;
12880
12881                       ereg = (Elf64_External_RegInfo *) (option + 1);
12882                       reginfo.ri_gprmask    = BYTE_GET (ereg->ri_gprmask);
12883                       reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
12884                       reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
12885                       reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
12886                       reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
12887                       reginfo.ri_gp_value   = BYTE_GET (ereg->ri_gp_value);
12888
12889                       printf ("GPR %08lx  GP 0x",
12890                               reginfo.ri_gprmask);
12891                       printf_vma (reginfo.ri_gp_value);
12892                       printf ("\n");
12893
12894                       printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
12895                               reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
12896                               reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
12897                     }
12898                   ++option;
12899                   continue;
12900                 case ODK_EXCEPTIONS:
12901                   fputs (" EXCEPTIONS fpe_min(", stdout);
12902                   process_mips_fpe_exception (option->info & OEX_FPU_MIN);
12903                   fputs (") fpe_max(", stdout);
12904                   process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
12905                   fputs (")", stdout);
12906
12907                   if (option->info & OEX_PAGE0)
12908                     fputs (" PAGE0", stdout);
12909                   if (option->info & OEX_SMM)
12910                     fputs (" SMM", stdout);
12911                   if (option->info & OEX_FPDBUG)
12912                     fputs (" FPDBUG", stdout);
12913                   if (option->info & OEX_DISMISS)
12914                     fputs (" DISMISS", stdout);
12915                   break;
12916                 case ODK_PAD:
12917                   fputs (" PAD       ", stdout);
12918                   if (option->info & OPAD_PREFIX)
12919                     fputs (" PREFIX", stdout);
12920                   if (option->info & OPAD_POSTFIX)
12921                     fputs (" POSTFIX", stdout);
12922                   if (option->info & OPAD_SYMBOL)
12923                     fputs (" SYMBOL", stdout);
12924                   break;
12925                 case ODK_HWPATCH:
12926                   fputs (" HWPATCH   ", stdout);
12927                   if (option->info & OHW_R4KEOP)
12928                     fputs (" R4KEOP", stdout);
12929                   if (option->info & OHW_R8KPFETCH)
12930                     fputs (" R8KPFETCH", stdout);
12931                   if (option->info & OHW_R5KEOP)
12932                     fputs (" R5KEOP", stdout);
12933                   if (option->info & OHW_R5KCVTL)
12934                     fputs (" R5KCVTL", stdout);
12935                   break;
12936                 case ODK_FILL:
12937                   fputs (" FILL       ", stdout);
12938                   /* XXX Print content of info word?  */
12939                   break;
12940                 case ODK_TAGS:
12941                   fputs (" TAGS       ", stdout);
12942                   /* XXX Print content of info word?  */
12943                   break;
12944                 case ODK_HWAND:
12945                   fputs (" HWAND     ", stdout);
12946                   if (option->info & OHWA0_R4KEOP_CHECKED)
12947                     fputs (" R4KEOP_CHECKED", stdout);
12948                   if (option->info & OHWA0_R4KEOP_CLEAN)
12949                     fputs (" R4KEOP_CLEAN", stdout);
12950                   break;
12951                 case ODK_HWOR:
12952                   fputs (" HWOR      ", stdout);
12953                   if (option->info & OHWA0_R4KEOP_CHECKED)
12954                     fputs (" R4KEOP_CHECKED", stdout);
12955                   if (option->info & OHWA0_R4KEOP_CLEAN)
12956                     fputs (" R4KEOP_CLEAN", stdout);
12957                   break;
12958                 case ODK_GP_GROUP:
12959                   printf (" GP_GROUP  %#06lx  self-contained %#06lx",
12960                           option->info & OGP_GROUP,
12961                           (option->info & OGP_SELF) >> 16);
12962                   break;
12963                 case ODK_IDENT:
12964                   printf (" IDENT     %#06lx  self-contained %#06lx",
12965                           option->info & OGP_GROUP,
12966                           (option->info & OGP_SELF) >> 16);
12967                   break;
12968                 default:
12969                   /* This shouldn't happen.  */
12970                   printf (" %3d ???     %d %lx",
12971                           option->kind, option->section, option->info);
12972                   break;
12973                 }
12974
12975               len = sizeof (* eopt);
12976               while (len < option->size)
12977                 if (((char *) option)[len] >= ' '
12978                     && ((char *) option)[len] < 0x7f)
12979                   printf ("%c", ((char *) option)[len++]);
12980                 else
12981                   printf ("\\%03o", ((char *) option)[len++]);
12982
12983               fputs ("\n", stdout);
12984               ++option;
12985             }
12986
12987           free (eopt);
12988         }
12989     }
12990
12991   if (conflicts_offset != 0 && conflictsno != 0)
12992     {
12993       Elf32_Conflict * iconf;
12994       size_t cnt;
12995
12996       if (dynamic_symbols == NULL)
12997         {
12998           error (_("conflict list found without a dynamic symbol table\n"));
12999           return 0;
13000         }
13001
13002       iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
13003       if (iconf == NULL)
13004         {
13005           error (_("Out of memory\n"));
13006           return 0;
13007         }
13008
13009       if (is_32bit_elf)
13010         {
13011           Elf32_External_Conflict * econf32;
13012
13013           econf32 = (Elf32_External_Conflict *)
13014               get_data (NULL, file, conflicts_offset, conflictsno,
13015                         sizeof (* econf32), _("conflict"));
13016           if (!econf32)
13017             return 0;
13018
13019           for (cnt = 0; cnt < conflictsno; ++cnt)
13020             iconf[cnt] = BYTE_GET (econf32[cnt]);
13021
13022           free (econf32);
13023         }
13024       else
13025         {
13026           Elf64_External_Conflict * econf64;
13027
13028           econf64 = (Elf64_External_Conflict *)
13029               get_data (NULL, file, conflicts_offset, conflictsno,
13030                         sizeof (* econf64), _("conflict"));
13031           if (!econf64)
13032             return 0;
13033
13034           for (cnt = 0; cnt < conflictsno; ++cnt)
13035             iconf[cnt] = BYTE_GET (econf64[cnt]);
13036
13037           free (econf64);
13038         }
13039
13040       printf (_("\nSection '.conflict' contains %lu entries:\n"),
13041               (unsigned long) conflictsno);
13042       puts (_("  Num:    Index       Value  Name"));
13043
13044       for (cnt = 0; cnt < conflictsno; ++cnt)
13045         {
13046           Elf_Internal_Sym * psym = & dynamic_symbols[iconf[cnt]];
13047
13048           printf ("%5lu: %8lu  ", (unsigned long) cnt, iconf[cnt]);
13049           print_vma (psym->st_value, FULL_HEX);
13050           putchar (' ');
13051           if (VALID_DYNAMIC_NAME (psym->st_name))
13052             print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
13053           else
13054             printf (_("<corrupt: %14ld>"), psym->st_name);
13055           putchar ('\n');
13056         }
13057
13058       free (iconf);
13059     }
13060
13061   if (pltgot != 0 && local_gotno != 0)
13062     {
13063       bfd_vma ent, local_end, global_end;
13064       size_t i, offset;
13065       unsigned char * data;
13066       int addr_size;
13067
13068       ent = pltgot;
13069       addr_size = (is_32bit_elf ? 4 : 8);
13070       local_end = pltgot + local_gotno * addr_size;
13071       global_end = local_end + (symtabno - gotsym) * addr_size;
13072
13073       offset = offset_from_vma (file, pltgot, global_end - pltgot);
13074       data = (unsigned char *) get_data (NULL, file, offset,
13075                                          global_end - pltgot, 1,
13076                                          _("Global Offset Table data"));
13077       if (data == NULL)
13078         return 0;
13079
13080       printf (_("\nPrimary GOT:\n"));
13081       printf (_(" Canonical gp value: "));
13082       print_vma (pltgot + 0x7ff0, LONG_HEX);
13083       printf ("\n\n");
13084
13085       printf (_(" Reserved entries:\n"));
13086       printf (_("  %*s %10s %*s Purpose\n"),
13087               addr_size * 2, _("Address"), _("Access"),
13088               addr_size * 2, _("Initial"));
13089       ent = print_mips_got_entry (data, pltgot, ent);
13090       printf (_(" Lazy resolver\n"));
13091       if (data
13092           && (byte_get (data + ent - pltgot, addr_size)
13093               >> (addr_size * 8 - 1)) != 0)
13094         {
13095           ent = print_mips_got_entry (data, pltgot, ent);
13096           printf (_(" Module pointer (GNU extension)\n"));
13097         }
13098       printf ("\n");
13099
13100       if (ent < local_end)
13101         {
13102           printf (_(" Local entries:\n"));
13103           printf ("  %*s %10s %*s\n",
13104                   addr_size * 2, _("Address"), _("Access"),
13105                   addr_size * 2, _("Initial"));
13106           while (ent < local_end)
13107             {
13108               ent = print_mips_got_entry (data, pltgot, ent);
13109               printf ("\n");
13110             }
13111           printf ("\n");
13112         }
13113
13114       if (gotsym < symtabno)
13115         {
13116           int sym_width;
13117
13118           printf (_(" Global entries:\n"));
13119           printf ("  %*s %10s %*s %*s %-7s %3s %s\n",
13120                   addr_size * 2, _("Address"),
13121                   _("Access"),
13122                   addr_size * 2, _("Initial"),
13123                   addr_size * 2, _("Sym.Val."),
13124                   _("Type"),
13125                   /* Note for translators: "Ndx" = abbreviated form of "Index".  */
13126                   _("Ndx"), _("Name"));
13127
13128           sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
13129           for (i = gotsym; i < symtabno; i++)
13130             {
13131               Elf_Internal_Sym * psym;
13132
13133               psym = dynamic_symbols + i;
13134               ent = print_mips_got_entry (data, pltgot, ent);
13135               printf (" ");
13136               print_vma (psym->st_value, LONG_HEX);
13137               printf (" %-7s %3s ",
13138                       get_symbol_type (ELF_ST_TYPE (psym->st_info)),
13139                       get_symbol_index_type (psym->st_shndx));
13140               if (VALID_DYNAMIC_NAME (psym->st_name))
13141                 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
13142               else
13143                 printf (_("<corrupt: %14ld>"), psym->st_name);
13144               printf ("\n");
13145             }
13146           printf ("\n");
13147         }
13148
13149       if (data)
13150         free (data);
13151     }
13152
13153   if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
13154     {
13155       bfd_vma ent, end;
13156       size_t offset, rel_offset;
13157       unsigned long count, i;
13158       unsigned char * data;
13159       int addr_size, sym_width;
13160       Elf_Internal_Rela * rels;
13161
13162       rel_offset = offset_from_vma (file, jmprel, pltrelsz);
13163       if (pltrel == DT_RELA)
13164         {
13165           if (!slurp_rela_relocs (file, rel_offset, pltrelsz, &rels, &count))
13166             return 0;
13167         }
13168       else
13169         {
13170           if (!slurp_rel_relocs (file, rel_offset, pltrelsz, &rels, &count))
13171             return 0;
13172         }
13173
13174       ent = mips_pltgot;
13175       addr_size = (is_32bit_elf ? 4 : 8);
13176       end = mips_pltgot + (2 + count) * addr_size;
13177
13178       offset = offset_from_vma (file, mips_pltgot, end - mips_pltgot);
13179       data = (unsigned char *) get_data (NULL, file, offset, end - mips_pltgot,
13180                                          1, _("Procedure Linkage Table data"));
13181       if (data == NULL)
13182         return 0;
13183
13184       printf ("\nPLT GOT:\n\n");
13185       printf (_(" Reserved entries:\n"));
13186       printf (_("  %*s %*s Purpose\n"),
13187               addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
13188       ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
13189       printf (_(" PLT lazy resolver\n"));
13190       ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
13191       printf (_(" Module pointer\n"));
13192       printf ("\n");
13193
13194       printf (_(" Entries:\n"));
13195       printf ("  %*s %*s %*s %-7s %3s %s\n",
13196               addr_size * 2, _("Address"),
13197               addr_size * 2, _("Initial"),
13198               addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
13199       sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
13200       for (i = 0; i < count; i++)
13201         {
13202           Elf_Internal_Sym * psym;
13203
13204           psym = dynamic_symbols + get_reloc_symindex (rels[i].r_info);
13205           ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
13206           printf (" ");
13207           print_vma (psym->st_value, LONG_HEX);
13208           printf (" %-7s %3s ",
13209                   get_symbol_type (ELF_ST_TYPE (psym->st_info)),
13210                   get_symbol_index_type (psym->st_shndx));
13211           if (VALID_DYNAMIC_NAME (psym->st_name))
13212             print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
13213           else
13214             printf (_("<corrupt: %14ld>"), psym->st_name);
13215           printf ("\n");
13216         }
13217       printf ("\n");
13218
13219       if (data)
13220         free (data);
13221       free (rels);
13222     }
13223
13224   return 1;
13225 }
13226
13227 static int
13228 process_nds32_specific (FILE * file)
13229 {
13230   Elf_Internal_Shdr *sect = NULL;
13231
13232   sect = find_section (".nds32_e_flags");
13233   if (sect != NULL)
13234     {
13235       unsigned int *flag;
13236
13237       printf ("\nNDS32 elf flags section:\n");
13238       flag = get_data (NULL, file, sect->sh_offset, 1,
13239                        sect->sh_size, _("NDS32 elf flags section"));
13240
13241       switch ((*flag) & 0x3)
13242         {
13243         case 0:
13244           printf ("(VEC_SIZE):\tNo entry.\n");
13245           break;
13246         case 1:
13247           printf ("(VEC_SIZE):\t4 bytes\n");
13248           break;
13249         case 2:
13250           printf ("(VEC_SIZE):\t16 bytes\n");
13251           break;
13252         case 3:
13253           printf ("(VEC_SIZE):\treserved\n");
13254           break;
13255         }
13256     }
13257
13258   return TRUE;
13259 }
13260
13261 static int
13262 process_gnu_liblist (FILE * file)
13263 {
13264   Elf_Internal_Shdr * section;
13265   Elf_Internal_Shdr * string_sec;
13266   Elf32_External_Lib * elib;
13267   char * strtab;
13268   size_t strtab_size;
13269   size_t cnt;
13270   unsigned i;
13271
13272   if (! do_arch)
13273     return 0;
13274
13275   for (i = 0, section = section_headers;
13276        i < elf_header.e_shnum;
13277        i++, section++)
13278     {
13279       switch (section->sh_type)
13280         {
13281         case SHT_GNU_LIBLIST:
13282           if (section->sh_link >= elf_header.e_shnum)
13283             break;
13284
13285           elib = (Elf32_External_Lib *)
13286               get_data (NULL, file, section->sh_offset, 1, section->sh_size,
13287                         _("liblist section data"));
13288
13289           if (elib == NULL)
13290             break;
13291           string_sec = section_headers + section->sh_link;
13292
13293           strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
13294                                       string_sec->sh_size,
13295                                       _("liblist string table"));
13296           if (strtab == NULL
13297               || section->sh_entsize != sizeof (Elf32_External_Lib))
13298             {
13299               free (elib);
13300               free (strtab);
13301               break;
13302             }
13303           strtab_size = string_sec->sh_size;
13304
13305           printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
13306                   SECTION_NAME (section),
13307                   (unsigned long) (section->sh_size / sizeof (Elf32_External_Lib)));
13308
13309           puts (_("     Library              Time Stamp          Checksum   Version Flags"));
13310
13311           for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
13312                ++cnt)
13313             {
13314               Elf32_Lib liblist;
13315               time_t atime;
13316               char timebuf[20];
13317               struct tm * tmp;
13318
13319               liblist.l_name = BYTE_GET (elib[cnt].l_name);
13320               atime = BYTE_GET (elib[cnt].l_time_stamp);
13321               liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
13322               liblist.l_version = BYTE_GET (elib[cnt].l_version);
13323               liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
13324
13325               tmp = gmtime (&atime);
13326               snprintf (timebuf, sizeof (timebuf),
13327                         "%04u-%02u-%02uT%02u:%02u:%02u",
13328                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
13329                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
13330
13331               printf ("%3lu: ", (unsigned long) cnt);
13332               if (do_wide)
13333                 printf ("%-20s", liblist.l_name < strtab_size
13334                         ? strtab + liblist.l_name : _("<corrupt>"));
13335               else
13336                 printf ("%-20.20s", liblist.l_name < strtab_size
13337                         ? strtab + liblist.l_name : _("<corrupt>"));
13338               printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
13339                       liblist.l_version, liblist.l_flags);
13340             }
13341
13342           free (elib);
13343           free (strtab);
13344         }
13345     }
13346
13347   return 1;
13348 }
13349
13350 static const char *
13351 get_note_type (unsigned e_type)
13352 {
13353   static char buff[64];
13354
13355   if (elf_header.e_type == ET_CORE)
13356     switch (e_type)
13357       {
13358       case NT_AUXV:
13359         return _("NT_AUXV (auxiliary vector)");
13360       case NT_PRSTATUS:
13361         return _("NT_PRSTATUS (prstatus structure)");
13362       case NT_FPREGSET:
13363         return _("NT_FPREGSET (floating point registers)");
13364       case NT_PRPSINFO:
13365         return _("NT_PRPSINFO (prpsinfo structure)");
13366       case NT_TASKSTRUCT:
13367         return _("NT_TASKSTRUCT (task structure)");
13368       case NT_PRXFPREG:
13369         return _("NT_PRXFPREG (user_xfpregs structure)");
13370       case NT_PPC_VMX:
13371         return _("NT_PPC_VMX (ppc Altivec registers)");
13372       case NT_PPC_VSX:
13373         return _("NT_PPC_VSX (ppc VSX registers)");
13374       case NT_386_TLS:
13375         return _("NT_386_TLS (x86 TLS information)");
13376       case NT_386_IOPERM:
13377         return _("NT_386_IOPERM (x86 I/O permissions)");
13378       case NT_X86_XSTATE:
13379         return _("NT_X86_XSTATE (x86 XSAVE extended state)");
13380       case NT_S390_HIGH_GPRS:
13381         return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
13382       case NT_S390_TIMER:
13383         return _("NT_S390_TIMER (s390 timer register)");
13384       case NT_S390_TODCMP:
13385         return _("NT_S390_TODCMP (s390 TOD comparator register)");
13386       case NT_S390_TODPREG:
13387         return _("NT_S390_TODPREG (s390 TOD programmable register)");
13388       case NT_S390_CTRS:
13389         return _("NT_S390_CTRS (s390 control registers)");
13390       case NT_S390_PREFIX:
13391         return _("NT_S390_PREFIX (s390 prefix register)");
13392       case NT_S390_LAST_BREAK:
13393         return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
13394       case NT_S390_SYSTEM_CALL:
13395         return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
13396       case NT_S390_TDB:
13397         return _("NT_S390_TDB (s390 transaction diagnostic block)");
13398       case NT_ARM_VFP:
13399         return _("NT_ARM_VFP (arm VFP registers)");
13400       case NT_ARM_TLS:
13401         return _("NT_ARM_TLS (AArch TLS registers)");
13402       case NT_ARM_HW_BREAK:
13403         return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
13404       case NT_ARM_HW_WATCH:
13405         return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
13406       case NT_PSTATUS:
13407         return _("NT_PSTATUS (pstatus structure)");
13408       case NT_FPREGS:
13409         return _("NT_FPREGS (floating point registers)");
13410       case NT_PSINFO:
13411         return _("NT_PSINFO (psinfo structure)");
13412       case NT_LWPSTATUS:
13413         return _("NT_LWPSTATUS (lwpstatus_t structure)");
13414       case NT_LWPSINFO:
13415         return _("NT_LWPSINFO (lwpsinfo_t structure)");
13416       case NT_WIN32PSTATUS:
13417         return _("NT_WIN32PSTATUS (win32_pstatus structure)");
13418       case NT_SIGINFO:
13419         return _("NT_SIGINFO (siginfo_t data)");
13420       case NT_FILE:
13421         return _("NT_FILE (mapped files)");
13422       default:
13423         break;
13424       }
13425   else
13426     switch (e_type)
13427       {
13428       case NT_VERSION:
13429         return _("NT_VERSION (version)");
13430       case NT_ARCH:
13431         return _("NT_ARCH (architecture)");
13432       default:
13433         break;
13434       }
13435
13436   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
13437   return buff;
13438 }
13439
13440 static int
13441 print_core_note (Elf_Internal_Note *pnote)
13442 {
13443   unsigned int addr_size = is_32bit_elf ? 4 : 8;
13444   bfd_vma count, page_size;
13445   unsigned char *descdata, *filenames, *descend;
13446
13447   if (pnote->type != NT_FILE)
13448     return 1;
13449
13450 #ifndef BFD64
13451   if (!is_32bit_elf)
13452     {
13453       printf (_("    Cannot decode 64-bit note in 32-bit build\n"));
13454       /* Still "successful".  */
13455       return 1;
13456     }
13457 #endif
13458
13459   if (pnote->descsz < 2 * addr_size)
13460     {
13461       printf (_("    Malformed note - too short for header\n"));
13462       return 0;
13463     }
13464
13465   descdata = (unsigned char *) pnote->descdata;
13466   descend = descdata + pnote->descsz;
13467
13468   if (descdata[pnote->descsz - 1] != '\0')
13469     {
13470       printf (_("    Malformed note - does not end with \\0\n"));
13471       return 0;
13472     }
13473
13474   count = byte_get (descdata, addr_size);
13475   descdata += addr_size;
13476
13477   page_size = byte_get (descdata, addr_size);
13478   descdata += addr_size;
13479
13480   if (pnote->descsz < 2 * addr_size + count * 3 * addr_size)
13481     {
13482       printf (_("    Malformed note - too short for supplied file count\n"));
13483       return 0;
13484     }
13485
13486   printf (_("    Page size: "));
13487   print_vma (page_size, DEC);
13488   printf ("\n");
13489
13490   printf (_("    %*s%*s%*s\n"),
13491           (int) (2 + 2 * addr_size), _("Start"),
13492           (int) (4 + 2 * addr_size), _("End"),
13493           (int) (4 + 2 * addr_size), _("Page Offset"));
13494   filenames = descdata + count * 3 * addr_size;
13495   while (--count > 0)
13496     {
13497       bfd_vma start, end, file_ofs;
13498
13499       if (filenames == descend)
13500         {
13501           printf (_("    Malformed note - filenames end too early\n"));
13502           return 0;
13503         }
13504
13505       start = byte_get (descdata, addr_size);
13506       descdata += addr_size;
13507       end = byte_get (descdata, addr_size);
13508       descdata += addr_size;
13509       file_ofs = byte_get (descdata, addr_size);
13510       descdata += addr_size;
13511
13512       printf ("    ");
13513       print_vma (start, FULL_HEX);
13514       printf ("  ");
13515       print_vma (end, FULL_HEX);
13516       printf ("  ");
13517       print_vma (file_ofs, FULL_HEX);
13518       printf ("\n        %s\n", filenames);
13519
13520       filenames += 1 + strlen ((char *) filenames);
13521     }
13522
13523   return 1;
13524 }
13525
13526 static const char *
13527 get_gnu_elf_note_type (unsigned e_type)
13528 {
13529   static char buff[64];
13530
13531   switch (e_type)
13532     {
13533     case NT_GNU_ABI_TAG:
13534       return _("NT_GNU_ABI_TAG (ABI version tag)");
13535     case NT_GNU_HWCAP:
13536       return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
13537     case NT_GNU_BUILD_ID:
13538       return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
13539     case NT_GNU_GOLD_VERSION:
13540       return _("NT_GNU_GOLD_VERSION (gold version)");
13541     default:
13542       break;
13543     }
13544
13545   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
13546   return buff;
13547 }
13548
13549 static int
13550 print_gnu_note (Elf_Internal_Note *pnote)
13551 {
13552   switch (pnote->type)
13553     {
13554     case NT_GNU_BUILD_ID:
13555       {
13556         unsigned long i;
13557
13558         printf (_("    Build ID: "));
13559         for (i = 0; i < pnote->descsz; ++i)
13560           printf ("%02x", pnote->descdata[i] & 0xff);
13561         printf ("\n");
13562       }
13563       break;
13564
13565     case NT_GNU_ABI_TAG:
13566       {
13567         unsigned long os, major, minor, subminor;
13568         const char *osname;
13569
13570         os = byte_get ((unsigned char *) pnote->descdata, 4);
13571         major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
13572         minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
13573         subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
13574
13575         switch (os)
13576           {
13577           case GNU_ABI_TAG_LINUX:
13578             osname = "Linux";
13579             break;
13580           case GNU_ABI_TAG_HURD:
13581             osname = "Hurd";
13582             break;
13583           case GNU_ABI_TAG_SOLARIS:
13584             osname = "Solaris";
13585             break;
13586           case GNU_ABI_TAG_FREEBSD:
13587             osname = "FreeBSD";
13588             break;
13589           case GNU_ABI_TAG_NETBSD:
13590             osname = "NetBSD";
13591             break;
13592           default:
13593             osname = "Unknown";
13594             break;
13595           }
13596
13597         printf (_("    OS: %s, ABI: %ld.%ld.%ld\n"), osname,
13598                 major, minor, subminor);
13599       }
13600       break;
13601
13602     case NT_GNU_GOLD_VERSION:
13603       {
13604         unsigned long i;
13605
13606         printf (_("    Version: "));
13607         for (i = 0; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
13608           printf ("%c", pnote->descdata[i]);
13609         printf ("\n");
13610       }
13611       break;
13612     }
13613
13614   return 1;
13615 }
13616
13617 static const char *
13618 get_netbsd_elfcore_note_type (unsigned e_type)
13619 {
13620   static char buff[64];
13621
13622   if (e_type == NT_NETBSDCORE_PROCINFO)
13623     {
13624       /* NetBSD core "procinfo" structure.  */
13625       return _("NetBSD procinfo structure");
13626     }
13627
13628   /* As of Jan 2002 there are no other machine-independent notes
13629      defined for NetBSD core files.  If the note type is less
13630      than the start of the machine-dependent note types, we don't
13631      understand it.  */
13632
13633   if (e_type < NT_NETBSDCORE_FIRSTMACH)
13634     {
13635       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
13636       return buff;
13637     }
13638
13639   switch (elf_header.e_machine)
13640     {
13641     /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
13642        and PT_GETFPREGS == mach+2.  */
13643
13644     case EM_OLD_ALPHA:
13645     case EM_ALPHA:
13646     case EM_SPARC:
13647     case EM_SPARC32PLUS:
13648     case EM_SPARCV9:
13649       switch (e_type)
13650         {
13651         case NT_NETBSDCORE_FIRSTMACH + 0:
13652           return _("PT_GETREGS (reg structure)");
13653         case NT_NETBSDCORE_FIRSTMACH + 2:
13654           return _("PT_GETFPREGS (fpreg structure)");
13655         default:
13656           break;
13657         }
13658       break;
13659
13660     /* On all other arch's, PT_GETREGS == mach+1 and
13661        PT_GETFPREGS == mach+3.  */
13662     default:
13663       switch (e_type)
13664         {
13665         case NT_NETBSDCORE_FIRSTMACH + 1:
13666           return _("PT_GETREGS (reg structure)");
13667         case NT_NETBSDCORE_FIRSTMACH + 3:
13668           return _("PT_GETFPREGS (fpreg structure)");
13669         default:
13670           break;
13671         }
13672     }
13673
13674   snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
13675             e_type - NT_NETBSDCORE_FIRSTMACH);
13676   return buff;
13677 }
13678
13679 static const char *
13680 get_stapsdt_note_type (unsigned e_type)
13681 {
13682   static char buff[64];
13683
13684   switch (e_type)
13685     {
13686     case NT_STAPSDT:
13687       return _("NT_STAPSDT (SystemTap probe descriptors)");
13688
13689     default:
13690       break;
13691     }
13692
13693   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
13694   return buff;
13695 }
13696
13697 static int
13698 print_stapsdt_note (Elf_Internal_Note *pnote)
13699 {
13700   int addr_size = is_32bit_elf ? 4 : 8;
13701   char *data = pnote->descdata;
13702   char *data_end = pnote->descdata + pnote->descsz;
13703   bfd_vma pc, base_addr, semaphore;
13704   char *provider, *probe, *arg_fmt;
13705
13706   pc = byte_get ((unsigned char *) data, addr_size);
13707   data += addr_size;
13708   base_addr = byte_get ((unsigned char *) data, addr_size);
13709   data += addr_size;
13710   semaphore = byte_get ((unsigned char *) data, addr_size);
13711   data += addr_size;
13712
13713   provider = data;
13714   data += strlen (data) + 1;
13715   probe = data;
13716   data += strlen (data) + 1;
13717   arg_fmt = data;
13718   data += strlen (data) + 1;
13719
13720   printf (_("    Provider: %s\n"), provider);
13721   printf (_("    Name: %s\n"), probe);
13722   printf (_("    Location: "));
13723   print_vma (pc, FULL_HEX);
13724   printf (_(", Base: "));
13725   print_vma (base_addr, FULL_HEX);
13726   printf (_(", Semaphore: "));
13727   print_vma (semaphore, FULL_HEX);
13728   printf ("\n");
13729   printf (_("    Arguments: %s\n"), arg_fmt);
13730
13731   return data == data_end;
13732 }
13733
13734 static const char *
13735 get_ia64_vms_note_type (unsigned e_type)
13736 {
13737   static char buff[64];
13738
13739   switch (e_type)
13740     {
13741     case NT_VMS_MHD:
13742       return _("NT_VMS_MHD (module header)");
13743     case NT_VMS_LNM:
13744       return _("NT_VMS_LNM (language name)");
13745     case NT_VMS_SRC:
13746       return _("NT_VMS_SRC (source files)");
13747     case NT_VMS_TITLE:
13748       return "NT_VMS_TITLE";
13749     case NT_VMS_EIDC:
13750       return _("NT_VMS_EIDC (consistency check)");
13751     case NT_VMS_FPMODE:
13752       return _("NT_VMS_FPMODE (FP mode)");
13753     case NT_VMS_LINKTIME:
13754       return "NT_VMS_LINKTIME";
13755     case NT_VMS_IMGNAM:
13756       return _("NT_VMS_IMGNAM (image name)");
13757     case NT_VMS_IMGID:
13758       return _("NT_VMS_IMGID (image id)");
13759     case NT_VMS_LINKID:
13760       return _("NT_VMS_LINKID (link id)");
13761     case NT_VMS_IMGBID:
13762       return _("NT_VMS_IMGBID (build id)");
13763     case NT_VMS_GSTNAM:
13764       return _("NT_VMS_GSTNAM (sym table name)");
13765     case NT_VMS_ORIG_DYN:
13766       return "NT_VMS_ORIG_DYN";
13767     case NT_VMS_PATCHTIME:
13768       return "NT_VMS_PATCHTIME";
13769     default:
13770       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
13771       return buff;
13772     }
13773 }
13774
13775 static int
13776 print_ia64_vms_note (Elf_Internal_Note * pnote)
13777 {
13778   switch (pnote->type)
13779     {
13780     case NT_VMS_MHD:
13781       if (pnote->descsz > 36)
13782         {
13783           size_t l = strlen (pnote->descdata + 34);
13784           printf (_("    Creation date  : %.17s\n"), pnote->descdata);
13785           printf (_("    Last patch date: %.17s\n"), pnote->descdata + 17);
13786           printf (_("    Module name    : %s\n"), pnote->descdata + 34);
13787           printf (_("    Module version : %s\n"), pnote->descdata + 34 + l + 1);
13788         }
13789       else
13790         printf (_("    Invalid size\n"));
13791       break;
13792     case NT_VMS_LNM:
13793       printf (_("   Language: %s\n"), pnote->descdata);
13794       break;
13795 #ifdef BFD64
13796     case NT_VMS_FPMODE:
13797       printf (_("   Floating Point mode: "));
13798       printf ("0x%016" BFD_VMA_FMT "x\n",
13799               (bfd_vma)byte_get ((unsigned char *)pnote->descdata, 8));
13800       break;
13801     case NT_VMS_LINKTIME:
13802       printf (_("   Link time: "));
13803       print_vms_time
13804         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
13805       printf ("\n");
13806       break;
13807     case NT_VMS_PATCHTIME:
13808       printf (_("   Patch time: "));
13809       print_vms_time
13810         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
13811       printf ("\n");
13812       break;
13813     case NT_VMS_ORIG_DYN:
13814       printf (_("   Major id: %u,  minor id: %u\n"),
13815               (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
13816               (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
13817       printf (_("   Last modified  : "));
13818       print_vms_time
13819         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
13820       printf (_("\n   Link flags  : "));
13821       printf ("0x%016" BFD_VMA_FMT "x\n",
13822               (bfd_vma)byte_get ((unsigned char *)pnote->descdata + 16, 8));
13823       printf (_("   Header flags: 0x%08x\n"),
13824               (unsigned)byte_get ((unsigned char *)pnote->descdata + 24, 4));
13825       printf (_("   Image id    : %s\n"), pnote->descdata + 32);
13826       break;
13827 #endif
13828     case NT_VMS_IMGNAM:
13829       printf (_("    Image name: %s\n"), pnote->descdata);
13830       break;
13831     case NT_VMS_GSTNAM:
13832       printf (_("    Global symbol table name: %s\n"), pnote->descdata);
13833       break;
13834     case NT_VMS_IMGID:
13835       printf (_("    Image id: %s\n"), pnote->descdata);
13836       break;
13837     case NT_VMS_LINKID:
13838       printf (_("    Linker id: %s\n"), pnote->descdata);
13839       break;
13840     default:
13841       break;
13842     }
13843   return 1;
13844 }
13845
13846 /* Note that by the ELF standard, the name field is already null byte
13847    terminated, and namesz includes the terminating null byte.
13848    I.E. the value of namesz for the name "FSF" is 4.
13849
13850    If the value of namesz is zero, there is no name present.  */
13851 static int
13852 process_note (Elf_Internal_Note * pnote)
13853 {
13854   const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
13855   const char * nt;
13856
13857   if (pnote->namesz == 0)
13858     /* If there is no note name, then use the default set of
13859        note type strings.  */
13860     nt = get_note_type (pnote->type);
13861
13862   else if (const_strneq (pnote->namedata, "GNU"))
13863     /* GNU-specific object file notes.  */
13864     nt = get_gnu_elf_note_type (pnote->type);
13865
13866   else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
13867     /* NetBSD-specific core file notes.  */
13868     nt = get_netbsd_elfcore_note_type (pnote->type);
13869
13870   else if (strneq (pnote->namedata, "SPU/", 4))
13871     {
13872       /* SPU-specific core file notes.  */
13873       nt = pnote->namedata + 4;
13874       name = "SPU";
13875     }
13876
13877   else if (const_strneq (pnote->namedata, "IPF/VMS"))
13878     /* VMS/ia64-specific file notes.  */
13879     nt = get_ia64_vms_note_type (pnote->type);
13880
13881   else if (const_strneq (pnote->namedata, "stapsdt"))
13882     nt = get_stapsdt_note_type (pnote->type);
13883
13884   else
13885     /* Don't recognize this note name; just use the default set of
13886        note type strings.  */
13887     nt = get_note_type (pnote->type);
13888
13889   printf ("  %-20s 0x%08lx\t%s\n", name, pnote->descsz, nt);
13890
13891   if (const_strneq (pnote->namedata, "IPF/VMS"))
13892     return print_ia64_vms_note (pnote);
13893   else if (const_strneq (pnote->namedata, "GNU"))
13894     return print_gnu_note (pnote);
13895   else if (const_strneq (pnote->namedata, "stapsdt"))
13896     return print_stapsdt_note (pnote);
13897   else if (const_strneq (pnote->namedata, "CORE"))
13898     return print_core_note (pnote);
13899   else
13900     return 1;
13901 }
13902
13903
13904 static int
13905 process_corefile_note_segment (FILE * file, bfd_vma offset, bfd_vma length)
13906 {
13907   Elf_External_Note * pnotes;
13908   Elf_External_Note * external;
13909   int res = 1;
13910
13911   if (length <= 0)
13912     return 0;
13913
13914   pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
13915                                            _("notes"));
13916   if (pnotes == NULL)
13917     return 0;
13918
13919   external = pnotes;
13920
13921   printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
13922           (unsigned long) offset, (unsigned long) length);
13923   printf (_("  %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
13924
13925   while ((char *) external < (char *) pnotes + length)
13926     {
13927       Elf_Internal_Note inote;
13928       size_t min_notesz;
13929       char *next;
13930       char * temp = NULL;
13931       size_t data_remaining = ((char *) pnotes + length) - (char *) external;
13932
13933       if (!is_ia64_vms ())
13934         {
13935           /* PR binutils/15191
13936              Make sure that there is enough data to read.  */
13937           min_notesz = offsetof (Elf_External_Note, name);
13938           if (data_remaining < min_notesz)
13939             {
13940               warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
13941                     (int) data_remaining);
13942               break;
13943             }
13944           inote.type     = BYTE_GET (external->type);
13945           inote.namesz   = BYTE_GET (external->namesz);
13946           inote.namedata = external->name;
13947           inote.descsz   = BYTE_GET (external->descsz);
13948           inote.descdata = inote.namedata + align_power (inote.namesz, 2);
13949           inote.descpos  = offset + (inote.descdata - (char *) pnotes);
13950           next = inote.descdata + align_power (inote.descsz, 2);
13951         }
13952       else
13953         {
13954           Elf64_External_VMS_Note *vms_external;
13955
13956           /* PR binutils/15191
13957              Make sure that there is enough data to read.  */
13958           min_notesz = offsetof (Elf64_External_VMS_Note, name);
13959           if (data_remaining < min_notesz)
13960             {
13961               warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
13962                     (int) data_remaining);
13963               break;
13964             }
13965
13966           vms_external = (Elf64_External_VMS_Note *) external;
13967           inote.type     = BYTE_GET (vms_external->type);
13968           inote.namesz   = BYTE_GET (vms_external->namesz);
13969           inote.namedata = vms_external->name;
13970           inote.descsz   = BYTE_GET (vms_external->descsz);
13971           inote.descdata = inote.namedata + align_power (inote.namesz, 3);
13972           inote.descpos  = offset + (inote.descdata - (char *) pnotes);
13973           next = inote.descdata + align_power (inote.descsz, 3);
13974         }
13975
13976       if (inote.descdata < (char *) external + min_notesz
13977           || next < (char *) external + min_notesz
13978           || data_remaining < (size_t)(next - (char *) external))
13979         {
13980           warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
13981                 (unsigned long) ((char *) external - (char *) pnotes));
13982           warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx\n"),
13983                 inote.type, inote.namesz, inote.descsz);
13984           break;
13985         }
13986
13987       external = (Elf_External_Note *) next;
13988
13989       /* Verify that name is null terminated.  It appears that at least
13990          one version of Linux (RedHat 6.0) generates corefiles that don't
13991          comply with the ELF spec by failing to include the null byte in
13992          namesz.  */
13993       if (inote.namedata[inote.namesz - 1] != '\0')
13994         {
13995           temp = (char *) malloc (inote.namesz + 1);
13996
13997           if (temp == NULL)
13998             {
13999               error (_("Out of memory\n"));
14000               res = 0;
14001               break;
14002             }
14003
14004           strncpy (temp, inote.namedata, inote.namesz);
14005           temp[inote.namesz] = 0;
14006
14007           /* warn (_("'%s' NOTE name not properly null terminated\n"), temp);  */
14008           inote.namedata = temp;
14009         }
14010
14011       res &= process_note (& inote);
14012
14013       if (temp != NULL)
14014         {
14015           free (temp);
14016           temp = NULL;
14017         }
14018     }
14019
14020   free (pnotes);
14021
14022   return res;
14023 }
14024
14025 static int
14026 process_corefile_note_segments (FILE * file)
14027 {
14028   Elf_Internal_Phdr * segment;
14029   unsigned int i;
14030   int res = 1;
14031
14032   if (! get_program_headers (file))
14033       return 0;
14034
14035   for (i = 0, segment = program_headers;
14036        i < elf_header.e_phnum;
14037        i++, segment++)
14038     {
14039       if (segment->p_type == PT_NOTE)
14040         res &= process_corefile_note_segment (file,
14041                                               (bfd_vma) segment->p_offset,
14042                                               (bfd_vma) segment->p_filesz);
14043     }
14044
14045   return res;
14046 }
14047
14048 static int
14049 process_note_sections (FILE * file)
14050 {
14051   Elf_Internal_Shdr * section;
14052   unsigned long i;
14053   int n = 0;
14054   int res = 1;
14055
14056   for (i = 0, section = section_headers;
14057        i < elf_header.e_shnum && section != NULL;
14058        i++, section++)
14059     if (section->sh_type == SHT_NOTE)
14060       {
14061         res &= process_corefile_note_segment (file,
14062                                               (bfd_vma) section->sh_offset,
14063                                               (bfd_vma) section->sh_size);
14064         n++;
14065       }
14066
14067   if (n == 0)
14068     /* Try processing NOTE segments instead.  */
14069     return process_corefile_note_segments (file);
14070
14071   return res;
14072 }
14073
14074 static int
14075 process_notes (FILE * file)
14076 {
14077   /* If we have not been asked to display the notes then do nothing.  */
14078   if (! do_notes)
14079     return 1;
14080
14081   if (elf_header.e_type != ET_CORE)
14082     return process_note_sections (file);
14083
14084   /* No program headers means no NOTE segment.  */
14085   if (elf_header.e_phnum > 0)
14086     return process_corefile_note_segments (file);
14087
14088   printf (_("No note segments present in the core file.\n"));
14089   return 1;
14090 }
14091
14092 static int
14093 process_arch_specific (FILE * file)
14094 {
14095   if (! do_arch)
14096     return 1;
14097
14098   switch (elf_header.e_machine)
14099     {
14100     case EM_ARM:
14101       return process_arm_specific (file);
14102     case EM_MIPS:
14103     case EM_MIPS_RS3_LE:
14104       return process_mips_specific (file);
14105       break;
14106     case EM_NDS32:
14107       return process_nds32_specific (file);
14108       break;
14109     case EM_PPC:
14110       return process_power_specific (file);
14111       break;
14112     case EM_SPARC:
14113     case EM_SPARC32PLUS:
14114     case EM_SPARCV9:
14115       return process_sparc_specific (file);
14116       break;
14117     case EM_TI_C6000:
14118       return process_tic6x_specific (file);
14119       break;
14120     case EM_MSP430:
14121       return process_msp430x_specific (file);
14122     default:
14123       break;
14124     }
14125   return 1;
14126 }
14127
14128 static int
14129 get_file_header (FILE * file)
14130 {
14131   /* Read in the identity array.  */
14132   if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
14133     return 0;
14134
14135   /* Determine how to read the rest of the header.  */
14136   switch (elf_header.e_ident[EI_DATA])
14137     {
14138     default: /* fall through */
14139     case ELFDATANONE: /* fall through */
14140     case ELFDATA2LSB:
14141       byte_get = byte_get_little_endian;
14142       byte_put = byte_put_little_endian;
14143       break;
14144     case ELFDATA2MSB:
14145       byte_get = byte_get_big_endian;
14146       byte_put = byte_put_big_endian;
14147       break;
14148     }
14149
14150   /* For now we only support 32 bit and 64 bit ELF files.  */
14151   is_32bit_elf = (elf_header.e_ident[EI_CLASS] != ELFCLASS64);
14152
14153   /* Read in the rest of the header.  */
14154   if (is_32bit_elf)
14155     {
14156       Elf32_External_Ehdr ehdr32;
14157
14158       if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
14159         return 0;
14160
14161       elf_header.e_type      = BYTE_GET (ehdr32.e_type);
14162       elf_header.e_machine   = BYTE_GET (ehdr32.e_machine);
14163       elf_header.e_version   = BYTE_GET (ehdr32.e_version);
14164       elf_header.e_entry     = BYTE_GET (ehdr32.e_entry);
14165       elf_header.e_phoff     = BYTE_GET (ehdr32.e_phoff);
14166       elf_header.e_shoff     = BYTE_GET (ehdr32.e_shoff);
14167       elf_header.e_flags     = BYTE_GET (ehdr32.e_flags);
14168       elf_header.e_ehsize    = BYTE_GET (ehdr32.e_ehsize);
14169       elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
14170       elf_header.e_phnum     = BYTE_GET (ehdr32.e_phnum);
14171       elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
14172       elf_header.e_shnum     = BYTE_GET (ehdr32.e_shnum);
14173       elf_header.e_shstrndx  = BYTE_GET (ehdr32.e_shstrndx);
14174     }
14175   else
14176     {
14177       Elf64_External_Ehdr ehdr64;
14178
14179       /* If we have been compiled with sizeof (bfd_vma) == 4, then
14180          we will not be able to cope with the 64bit data found in
14181          64 ELF files.  Detect this now and abort before we start
14182          overwriting things.  */
14183       if (sizeof (bfd_vma) < 8)
14184         {
14185           error (_("This instance of readelf has been built without support for a\n\
14186 64 bit data type and so it cannot read 64 bit ELF files.\n"));
14187           return 0;
14188         }
14189
14190       if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
14191         return 0;
14192
14193       elf_header.e_type      = BYTE_GET (ehdr64.e_type);
14194       elf_header.e_machine   = BYTE_GET (ehdr64.e_machine);
14195       elf_header.e_version   = BYTE_GET (ehdr64.e_version);
14196       elf_header.e_entry     = BYTE_GET (ehdr64.e_entry);
14197       elf_header.e_phoff     = BYTE_GET (ehdr64.e_phoff);
14198       elf_header.e_shoff     = BYTE_GET (ehdr64.e_shoff);
14199       elf_header.e_flags     = BYTE_GET (ehdr64.e_flags);
14200       elf_header.e_ehsize    = BYTE_GET (ehdr64.e_ehsize);
14201       elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
14202       elf_header.e_phnum     = BYTE_GET (ehdr64.e_phnum);
14203       elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
14204       elf_header.e_shnum     = BYTE_GET (ehdr64.e_shnum);
14205       elf_header.e_shstrndx  = BYTE_GET (ehdr64.e_shstrndx);
14206     }
14207
14208   if (elf_header.e_shoff)
14209     {
14210       /* There may be some extensions in the first section header.  Don't
14211          bomb if we can't read it.  */
14212       if (is_32bit_elf)
14213         get_32bit_section_headers (file, 1);
14214       else
14215         get_64bit_section_headers (file, 1);
14216     }
14217
14218   return 1;
14219 }
14220
14221 /* Process one ELF object file according to the command line options.
14222    This file may actually be stored in an archive.  The file is
14223    positioned at the start of the ELF object.  */
14224
14225 static int
14226 process_object (char * file_name, FILE * file)
14227 {
14228   unsigned int i;
14229
14230   if (! get_file_header (file))
14231     {
14232       error (_("%s: Failed to read file header\n"), file_name);
14233       return 1;
14234     }
14235
14236   /* Initialise per file variables.  */
14237   for (i = ARRAY_SIZE (version_info); i--;)
14238     version_info[i] = 0;
14239
14240   for (i = ARRAY_SIZE (dynamic_info); i--;)
14241     dynamic_info[i] = 0;
14242   dynamic_info_DT_GNU_HASH = 0;
14243
14244   /* Process the file.  */
14245   if (show_name)
14246     printf (_("\nFile: %s\n"), file_name);
14247
14248   /* Initialise the dump_sects array from the cmdline_dump_sects array.
14249      Note we do this even if cmdline_dump_sects is empty because we
14250      must make sure that the dump_sets array is zeroed out before each
14251      object file is processed.  */
14252   if (num_dump_sects > num_cmdline_dump_sects)
14253     memset (dump_sects, 0, num_dump_sects * sizeof (* dump_sects));
14254
14255   if (num_cmdline_dump_sects > 0)
14256     {
14257       if (num_dump_sects == 0)
14258         /* A sneaky way of allocating the dump_sects array.  */
14259         request_dump_bynumber (num_cmdline_dump_sects, 0);
14260
14261       assert (num_dump_sects >= num_cmdline_dump_sects);
14262       memcpy (dump_sects, cmdline_dump_sects,
14263               num_cmdline_dump_sects * sizeof (* dump_sects));
14264     }
14265
14266   if (! process_file_header ())
14267     return 1;
14268
14269   if (! process_section_headers (file))
14270     {
14271       /* Without loaded section headers we cannot process lots of
14272          things.  */
14273       do_unwind = do_version = do_dump = do_arch = 0;
14274
14275       if (! do_using_dynamic)
14276         do_syms = do_dyn_syms = do_reloc = 0;
14277     }
14278
14279   if (! process_section_groups (file))
14280     {
14281       /* Without loaded section groups we cannot process unwind.  */
14282       do_unwind = 0;
14283     }
14284
14285   if (process_program_headers (file))
14286     process_dynamic_section (file);
14287
14288   process_relocs (file);
14289
14290   process_unwind (file);
14291
14292   process_symbol_table (file);
14293
14294   process_syminfo (file);
14295
14296   process_version_sections (file);
14297
14298   process_section_contents (file);
14299
14300   process_notes (file);
14301
14302   process_gnu_liblist (file);
14303
14304   process_arch_specific (file);
14305
14306   if (program_headers)
14307     {
14308       free (program_headers);
14309       program_headers = NULL;
14310     }
14311
14312   if (section_headers)
14313     {
14314       free (section_headers);
14315       section_headers = NULL;
14316     }
14317
14318   if (string_table)
14319     {
14320       free (string_table);
14321       string_table = NULL;
14322       string_table_length = 0;
14323     }
14324
14325   if (dynamic_strings)
14326     {
14327       free (dynamic_strings);
14328       dynamic_strings = NULL;
14329       dynamic_strings_length = 0;
14330     }
14331
14332   if (dynamic_symbols)
14333     {
14334       free (dynamic_symbols);
14335       dynamic_symbols = NULL;
14336       num_dynamic_syms = 0;
14337     }
14338
14339   if (dynamic_syminfo)
14340     {
14341       free (dynamic_syminfo);
14342       dynamic_syminfo = NULL;
14343     }
14344
14345   if (dynamic_section)
14346     {
14347       free (dynamic_section);
14348       dynamic_section = NULL;
14349     }
14350
14351   if (section_headers_groups)
14352     {
14353       free (section_headers_groups);
14354       section_headers_groups = NULL;
14355     }
14356
14357   if (section_groups)
14358     {
14359       struct group_list * g;
14360       struct group_list * next;
14361
14362       for (i = 0; i < group_count; i++)
14363         {
14364           for (g = section_groups [i].root; g != NULL; g = next)
14365             {
14366               next = g->next;
14367               free (g);
14368             }
14369         }
14370
14371       free (section_groups);
14372       section_groups = NULL;
14373     }
14374
14375   free_debug_memory ();
14376
14377   return 0;
14378 }
14379
14380 /* Process an ELF archive.
14381    On entry the file is positioned just after the ARMAG string.  */
14382
14383 static int
14384 process_archive (char * file_name, FILE * file, bfd_boolean is_thin_archive)
14385 {
14386   struct archive_info arch;
14387   struct archive_info nested_arch;
14388   size_t got;
14389   int ret;
14390
14391   show_name = 1;
14392
14393   /* The ARCH structure is used to hold information about this archive.  */
14394   arch.file_name = NULL;
14395   arch.file = NULL;
14396   arch.index_array = NULL;
14397   arch.sym_table = NULL;
14398   arch.longnames = NULL;
14399
14400   /* The NESTED_ARCH structure is used as a single-item cache of information
14401      about a nested archive (when members of a thin archive reside within
14402      another regular archive file).  */
14403   nested_arch.file_name = NULL;
14404   nested_arch.file = NULL;
14405   nested_arch.index_array = NULL;
14406   nested_arch.sym_table = NULL;
14407   nested_arch.longnames = NULL;
14408
14409   if (setup_archive (&arch, file_name, file, is_thin_archive, do_archive_index) != 0)
14410     {
14411       ret = 1;
14412       goto out;
14413     }
14414
14415   if (do_archive_index)
14416     {
14417       if (arch.sym_table == NULL)
14418         error (_("%s: unable to dump the index as none was found\n"), file_name);
14419       else
14420         {
14421           unsigned int i, l;
14422           unsigned long current_pos;
14423
14424           printf (_("Index of archive %s: (%ld entries, 0x%lx bytes in the symbol table)\n"),
14425                   file_name, (long) arch.index_num, arch.sym_size);
14426           current_pos = ftell (file);
14427
14428           for (i = l = 0; i < arch.index_num; i++)
14429             {
14430               if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
14431                 {
14432                   char * member_name;
14433
14434                   member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
14435
14436                   if (member_name != NULL)
14437                     {
14438                       char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
14439
14440                       if (qualified_name != NULL)
14441                         {
14442                           printf (_("Contents of binary %s at offset "), qualified_name);
14443                           (void) print_vma (arch.index_array[i], PREFIX_HEX);
14444                           putchar ('\n');
14445                           free (qualified_name);
14446                         }
14447                     }
14448                 }
14449
14450               if (l >= arch.sym_size)
14451                 {
14452                   error (_("%s: end of the symbol table reached before the end of the index\n"),
14453                          file_name);
14454                   break;
14455                 }
14456               printf ("\t%s\n", arch.sym_table + l);
14457               l += strlen (arch.sym_table + l) + 1;
14458             }
14459
14460           if (arch.uses_64bit_indicies)
14461             l = (l + 7) & ~ 7;
14462           else
14463             l += l & 1;
14464
14465           if (l < arch.sym_size)
14466             error (_("%s: %ld bytes remain in the symbol table, but without corresponding entries in the index table\n"),
14467                    file_name, arch.sym_size - l);
14468
14469           if (fseek (file, current_pos, SEEK_SET) != 0)
14470             {
14471               error (_("%s: failed to seek back to start of object files in the archive\n"), file_name);
14472               ret = 1;
14473               goto out;
14474             }
14475         }
14476
14477       if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
14478           && !do_segments && !do_header && !do_dump && !do_version
14479           && !do_histogram && !do_debugging && !do_arch && !do_notes
14480           && !do_section_groups && !do_dyn_syms)
14481         {
14482           ret = 0; /* Archive index only.  */
14483           goto out;
14484         }
14485     }
14486
14487   ret = 0;
14488
14489   while (1)
14490     {
14491       char * name;
14492       size_t namelen;
14493       char * qualified_name;
14494
14495       /* Read the next archive header.  */
14496       if (fseek (file, arch.next_arhdr_offset, SEEK_SET) != 0)
14497         {
14498           error (_("%s: failed to seek to next archive header\n"), file_name);
14499           return 1;
14500         }
14501       got = fread (&arch.arhdr, 1, sizeof arch.arhdr, file);
14502       if (got != sizeof arch.arhdr)
14503         {
14504           if (got == 0)
14505             break;
14506           error (_("%s: failed to read archive header\n"), file_name);
14507           ret = 1;
14508           break;
14509         }
14510       if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
14511         {
14512           error (_("%s: did not find a valid archive header\n"), arch.file_name);
14513           ret = 1;
14514           break;
14515         }
14516
14517       arch.next_arhdr_offset += sizeof arch.arhdr;
14518
14519       archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
14520       if (archive_file_size & 01)
14521         ++archive_file_size;
14522
14523       name = get_archive_member_name (&arch, &nested_arch);
14524       if (name == NULL)
14525         {
14526           error (_("%s: bad archive file name\n"), file_name);
14527           ret = 1;
14528           break;
14529         }
14530       namelen = strlen (name);
14531
14532       qualified_name = make_qualified_name (&arch, &nested_arch, name);
14533       if (qualified_name == NULL)
14534         {
14535           error (_("%s: bad archive file name\n"), file_name);
14536           ret = 1;
14537           break;
14538         }
14539
14540       if (is_thin_archive && arch.nested_member_origin == 0)
14541         {
14542           /* This is a proxy for an external member of a thin archive.  */
14543           FILE * member_file;
14544           char * member_file_name = adjust_relative_path (file_name, name, namelen);
14545           if (member_file_name == NULL)
14546             {
14547               ret = 1;
14548               break;
14549             }
14550
14551           member_file = fopen (member_file_name, "rb");
14552           if (member_file == NULL)
14553             {
14554               error (_("Input file '%s' is not readable.\n"), member_file_name);
14555               free (member_file_name);
14556               ret = 1;
14557               break;
14558             }
14559
14560           archive_file_offset = arch.nested_member_origin;
14561
14562           ret |= process_object (qualified_name, member_file);
14563
14564           fclose (member_file);
14565           free (member_file_name);
14566         }
14567       else if (is_thin_archive)
14568         {
14569           /* PR 15140: Allow for corrupt thin archives.  */
14570           if (nested_arch.file == NULL)
14571             {
14572               error (_("%s: contains corrupt thin archive: %s\n"),
14573                      file_name, name);
14574               ret = 1;
14575               break;
14576             }
14577
14578           /* This is a proxy for a member of a nested archive.  */
14579           archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
14580
14581           /* The nested archive file will have been opened and setup by
14582              get_archive_member_name.  */
14583           if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
14584             {
14585               error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
14586               ret = 1;
14587               break;
14588             }
14589
14590           ret |= process_object (qualified_name, nested_arch.file);
14591         }
14592       else
14593         {
14594           archive_file_offset = arch.next_arhdr_offset;
14595           arch.next_arhdr_offset += archive_file_size;
14596
14597           ret |= process_object (qualified_name, file);
14598         }
14599
14600       if (dump_sects != NULL)
14601         {
14602           free (dump_sects);
14603           dump_sects = NULL;
14604           num_dump_sects = 0;
14605         }
14606
14607       free (qualified_name);
14608     }
14609
14610  out:
14611   if (nested_arch.file != NULL)
14612     fclose (nested_arch.file);
14613   release_archive (&nested_arch);
14614   release_archive (&arch);
14615
14616   return ret;
14617 }
14618
14619 static int
14620 process_file (char * file_name)
14621 {
14622   FILE * file;
14623   struct stat statbuf;
14624   char armag[SARMAG];
14625   int ret;
14626
14627   if (stat (file_name, &statbuf) < 0)
14628     {
14629       if (errno == ENOENT)
14630         error (_("'%s': No such file\n"), file_name);
14631       else
14632         error (_("Could not locate '%s'.  System error message: %s\n"),
14633                file_name, strerror (errno));
14634       return 1;
14635     }
14636
14637   if (! S_ISREG (statbuf.st_mode))
14638     {
14639       error (_("'%s' is not an ordinary file\n"), file_name);
14640       return 1;
14641     }
14642
14643   file = fopen (file_name, "rb");
14644   if (file == NULL)
14645     {
14646       error (_("Input file '%s' is not readable.\n"), file_name);
14647       return 1;
14648     }
14649
14650   if (fread (armag, SARMAG, 1, file) != 1)
14651     {
14652       error (_("%s: Failed to read file's magic number\n"), file_name);
14653       fclose (file);
14654       return 1;
14655     }
14656
14657   if (memcmp (armag, ARMAG, SARMAG) == 0)
14658     ret = process_archive (file_name, file, FALSE);
14659   else if (memcmp (armag, ARMAGT, SARMAG) == 0)
14660     ret = process_archive (file_name, file, TRUE);
14661   else
14662     {
14663       if (do_archive_index)
14664         error (_("File %s is not an archive so its index cannot be displayed.\n"),
14665                file_name);
14666
14667       rewind (file);
14668       archive_file_size = archive_file_offset = 0;
14669       ret = process_object (file_name, file);
14670     }
14671
14672   fclose (file);
14673
14674   return ret;
14675 }
14676
14677 #ifdef SUPPORT_DISASSEMBLY
14678 /* Needed by the i386 disassembler.  For extra credit, someone could
14679    fix this so that we insert symbolic addresses here, esp for GOT/PLT
14680    symbols.  */
14681
14682 void
14683 print_address (unsigned int addr, FILE * outfile)
14684 {
14685   fprintf (outfile,"0x%8.8x", addr);
14686 }
14687
14688 /* Needed by the i386 disassembler.  */
14689 void
14690 db_task_printsym (unsigned int addr)
14691 {
14692   print_address (addr, stderr);
14693 }
14694 #endif
14695
14696 int
14697 main (int argc, char ** argv)
14698 {
14699   int err;
14700
14701 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
14702   setlocale (LC_MESSAGES, "");
14703 #endif
14704 #if defined (HAVE_SETLOCALE)
14705   setlocale (LC_CTYPE, "");
14706 #endif
14707   bindtextdomain (PACKAGE, LOCALEDIR);
14708   textdomain (PACKAGE);
14709
14710   expandargv (&argc, &argv);
14711
14712   parse_args (argc, argv);
14713
14714   if (num_dump_sects > 0)
14715     {
14716       /* Make a copy of the dump_sects array.  */
14717       cmdline_dump_sects = (dump_type *)
14718           malloc (num_dump_sects * sizeof (* dump_sects));
14719       if (cmdline_dump_sects == NULL)
14720         error (_("Out of memory allocating dump request table.\n"));
14721       else
14722         {
14723           memcpy (cmdline_dump_sects, dump_sects,
14724                   num_dump_sects * sizeof (* dump_sects));
14725           num_cmdline_dump_sects = num_dump_sects;
14726         }
14727     }
14728
14729   if (optind < (argc - 1))
14730     show_name = 1;
14731
14732   err = 0;
14733   while (optind < argc)
14734     err |= process_file (argv[optind++]);
14735
14736   if (dump_sects != NULL)
14737     free (dump_sects);
14738   if (cmdline_dump_sects != NULL)
14739     free (cmdline_dump_sects);
14740
14741   return err;
14742 }