constify stack.c
[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 && type == STT_ARM_TFUNC)
9301             return "THUMB_FUNC";
9302
9303           if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
9304             return "REGISTER";
9305
9306           if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
9307             return "PARISC_MILLI";
9308
9309           snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
9310         }
9311       else if (type >= STT_LOOS && type <= STT_HIOS)
9312         {
9313           if (elf_header.e_machine == EM_PARISC)
9314             {
9315               if (type == STT_HP_OPAQUE)
9316                 return "HP_OPAQUE";
9317               if (type == STT_HP_STUB)
9318                 return "HP_STUB";
9319             }
9320
9321           if (type == STT_GNU_IFUNC
9322               && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
9323                   || elf_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD
9324                   /* GNU is still using the default value 0.  */
9325                   || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
9326             return "IFUNC";
9327
9328           snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
9329         }
9330       else
9331         snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
9332       return buff;
9333     }
9334 }
9335
9336 static const char *
9337 get_symbol_visibility (unsigned int visibility)
9338 {
9339   switch (visibility)
9340     {
9341     case STV_DEFAULT:   return "DEFAULT";
9342     case STV_INTERNAL:  return "INTERNAL";
9343     case STV_HIDDEN:    return "HIDDEN";
9344     case STV_PROTECTED: return "PROTECTED";
9345     default: abort ();
9346     }
9347 }
9348
9349 static const char *
9350 get_mips_symbol_other (unsigned int other)
9351 {
9352   switch (other)
9353     {
9354     case STO_OPTIONAL:
9355       return "OPTIONAL";
9356     case STO_MIPS_PLT:
9357       return "MIPS PLT";
9358     case STO_MIPS_PIC:
9359       return "MIPS PIC";
9360     case STO_MICROMIPS:
9361       return "MICROMIPS";
9362     case STO_MICROMIPS | STO_MIPS_PIC:
9363       return "MICROMIPS, MIPS PIC";
9364     case STO_MIPS16:
9365       return "MIPS16";
9366     default:
9367       return NULL;
9368     }
9369 }
9370
9371 static const char *
9372 get_ia64_symbol_other (unsigned int other)
9373 {
9374   if (is_ia64_vms ())
9375     {
9376       static char res[32];
9377
9378       res[0] = 0;
9379
9380       /* Function types is for images and .STB files only.  */
9381       switch (elf_header.e_type)
9382         {
9383         case ET_DYN:
9384         case ET_EXEC:
9385           switch (VMS_ST_FUNC_TYPE (other))
9386             {
9387             case VMS_SFT_CODE_ADDR:
9388               strcat (res, " CA");
9389               break;
9390             case VMS_SFT_SYMV_IDX:
9391               strcat (res, " VEC");
9392               break;
9393             case VMS_SFT_FD:
9394               strcat (res, " FD");
9395               break;
9396             case VMS_SFT_RESERVE:
9397               strcat (res, " RSV");
9398               break;
9399             default:
9400               abort ();
9401             }
9402           break;
9403         default:
9404           break;
9405         }
9406       switch (VMS_ST_LINKAGE (other))
9407         {
9408         case VMS_STL_IGNORE:
9409           strcat (res, " IGN");
9410           break;
9411         case VMS_STL_RESERVE:
9412           strcat (res, " RSV");
9413           break;
9414         case VMS_STL_STD:
9415           strcat (res, " STD");
9416           break;
9417         case VMS_STL_LNK:
9418           strcat (res, " LNK");
9419           break;
9420         default:
9421           abort ();
9422         }
9423
9424       if (res[0] != 0)
9425         return res + 1;
9426       else
9427         return res;
9428     }
9429   return NULL;
9430 }
9431
9432 static const char *
9433 get_ppc64_symbol_other (unsigned int other)
9434 {
9435   if (PPC64_LOCAL_ENTRY_OFFSET (other) != 0)
9436     {
9437       static char buf[32];
9438       snprintf (buf, sizeof buf, _("<localentry>: %d"),
9439                 PPC64_LOCAL_ENTRY_OFFSET (other));
9440       return buf;
9441     }
9442   return NULL;
9443 }
9444
9445 static const char *
9446 get_symbol_other (unsigned int other)
9447 {
9448   const char * result = NULL;
9449   static char buff [32];
9450
9451   if (other == 0)
9452     return "";
9453
9454   switch (elf_header.e_machine)
9455     {
9456     case EM_MIPS:
9457       result = get_mips_symbol_other (other);
9458       break;
9459     case EM_IA_64:
9460       result = get_ia64_symbol_other (other);
9461       break;
9462     case EM_PPC64:
9463       result = get_ppc64_symbol_other (other);
9464       break;
9465     default:
9466       break;
9467     }
9468
9469   if (result)
9470     return result;
9471
9472   snprintf (buff, sizeof buff, _("<other>: %x"), other);
9473   return buff;
9474 }
9475
9476 static const char *
9477 get_symbol_index_type (unsigned int type)
9478 {
9479   static char buff[32];
9480
9481   switch (type)
9482     {
9483     case SHN_UNDEF:     return "UND";
9484     case SHN_ABS:       return "ABS";
9485     case SHN_COMMON:    return "COM";
9486     default:
9487       if (type == SHN_IA_64_ANSI_COMMON
9488           && elf_header.e_machine == EM_IA_64
9489           && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
9490         return "ANSI_COM";
9491       else if ((elf_header.e_machine == EM_X86_64
9492                 || elf_header.e_machine == EM_L1OM
9493                 || elf_header.e_machine == EM_K1OM)
9494                && type == SHN_X86_64_LCOMMON)
9495         return "LARGE_COM";
9496       else if ((type == SHN_MIPS_SCOMMON
9497                 && elf_header.e_machine == EM_MIPS)
9498                || (type == SHN_TIC6X_SCOMMON
9499                    && elf_header.e_machine == EM_TI_C6000))
9500         return "SCOM";
9501       else if (type == SHN_MIPS_SUNDEFINED
9502                && elf_header.e_machine == EM_MIPS)
9503         return "SUND";
9504       else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
9505         sprintf (buff, "PRC[0x%04x]", type & 0xffff);
9506       else if (type >= SHN_LOOS && type <= SHN_HIOS)
9507         sprintf (buff, "OS [0x%04x]", type & 0xffff);
9508       else if (type >= SHN_LORESERVE)
9509         sprintf (buff, "RSV[0x%04x]", type & 0xffff);
9510       else if (type >= elf_header.e_shnum)
9511         sprintf (buff, "bad section index[%3d]", type);
9512       else
9513         sprintf (buff, "%3d", type);
9514       break;
9515     }
9516
9517   return buff;
9518 }
9519
9520 static bfd_vma *
9521 get_dynamic_data (FILE * file, unsigned int number, unsigned int ent_size)
9522 {
9523   unsigned char * e_data;
9524   bfd_vma * i_data;
9525
9526   e_data = (unsigned char *) cmalloc (number, ent_size);
9527
9528   if (e_data == NULL)
9529     {
9530       error (_("Out of memory\n"));
9531       return NULL;
9532     }
9533
9534   if (fread (e_data, ent_size, number, file) != number)
9535     {
9536       error (_("Unable to read in dynamic data\n"));
9537       return NULL;
9538     }
9539
9540   i_data = (bfd_vma *) cmalloc (number, sizeof (*i_data));
9541
9542   if (i_data == NULL)
9543     {
9544       error (_("Out of memory\n"));
9545       free (e_data);
9546       return NULL;
9547     }
9548
9549   while (number--)
9550     i_data[number] = byte_get (e_data + number * ent_size, ent_size);
9551
9552   free (e_data);
9553
9554   return i_data;
9555 }
9556
9557 static void
9558 print_dynamic_symbol (bfd_vma si, unsigned long hn)
9559 {
9560   Elf_Internal_Sym * psym;
9561   int n;
9562
9563   psym = dynamic_symbols + si;
9564
9565   n = print_vma (si, DEC_5);
9566   if (n < 5)
9567     fputs (&"     "[n], stdout);
9568   printf (" %3lu: ", hn);
9569   print_vma (psym->st_value, LONG_HEX);
9570   putchar (' ');
9571   print_vma (psym->st_size, DEC_5);
9572
9573   printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
9574   printf (" %-6s",  get_symbol_binding (ELF_ST_BIND (psym->st_info)));
9575   printf (" %-7s",  get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
9576   /* Check to see if any other bits in the st_other field are set.
9577      Note - displaying this information disrupts the layout of the
9578      table being generated, but for the moment this case is very
9579      rare.  */
9580   if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
9581     printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
9582   printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
9583   if (VALID_DYNAMIC_NAME (psym->st_name))
9584     print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
9585   else
9586     printf (_(" <corrupt: %14ld>"), psym->st_name);
9587   putchar ('\n');
9588 }
9589
9590 /* Dump the symbol table.  */
9591 static int
9592 process_symbol_table (FILE * file)
9593 {
9594   Elf_Internal_Shdr * section;
9595   bfd_vma nbuckets = 0;
9596   bfd_vma nchains = 0;
9597   bfd_vma * buckets = NULL;
9598   bfd_vma * chains = NULL;
9599   bfd_vma ngnubuckets = 0;
9600   bfd_vma * gnubuckets = NULL;
9601   bfd_vma * gnuchains = NULL;
9602   bfd_vma gnusymidx = 0;
9603
9604   if (!do_syms && !do_dyn_syms && !do_histogram)
9605     return 1;
9606
9607   if (dynamic_info[DT_HASH]
9608       && (do_histogram
9609           || (do_using_dynamic
9610               && !do_dyn_syms
9611               && dynamic_strings != NULL)))
9612     {
9613       unsigned char nb[8];
9614       unsigned char nc[8];
9615       int hash_ent_size = 4;
9616
9617       if ((elf_header.e_machine == EM_ALPHA
9618            || elf_header.e_machine == EM_S390
9619            || elf_header.e_machine == EM_S390_OLD)
9620           && elf_header.e_ident[EI_CLASS] == ELFCLASS64)
9621         hash_ent_size = 8;
9622
9623       if (fseek (file,
9624                  (archive_file_offset
9625                   + offset_from_vma (file, dynamic_info[DT_HASH],
9626                                      sizeof nb + sizeof nc)),
9627                  SEEK_SET))
9628         {
9629           error (_("Unable to seek to start of dynamic information\n"));
9630           goto no_hash;
9631         }
9632
9633       if (fread (nb, hash_ent_size, 1, file) != 1)
9634         {
9635           error (_("Failed to read in number of buckets\n"));
9636           goto no_hash;
9637         }
9638
9639       if (fread (nc, hash_ent_size, 1, file) != 1)
9640         {
9641           error (_("Failed to read in number of chains\n"));
9642           goto no_hash;
9643         }
9644
9645       nbuckets = byte_get (nb, hash_ent_size);
9646       nchains  = byte_get (nc, hash_ent_size);
9647
9648       buckets = get_dynamic_data (file, nbuckets, hash_ent_size);
9649       chains  = get_dynamic_data (file, nchains, hash_ent_size);
9650
9651     no_hash:
9652       if (buckets == NULL || chains == NULL)
9653         {
9654           if (do_using_dynamic)
9655             return 0;
9656           free (buckets);
9657           free (chains);
9658           buckets = NULL;
9659           chains = NULL;
9660           nbuckets = 0;
9661           nchains = 0;
9662         }
9663     }
9664
9665   if (dynamic_info_DT_GNU_HASH
9666       && (do_histogram
9667           || (do_using_dynamic
9668               && !do_dyn_syms
9669               && dynamic_strings != NULL)))
9670     {
9671       unsigned char nb[16];
9672       bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
9673       bfd_vma buckets_vma;
9674
9675       if (fseek (file,
9676                  (archive_file_offset
9677                   + offset_from_vma (file, dynamic_info_DT_GNU_HASH,
9678                                      sizeof nb)),
9679                  SEEK_SET))
9680         {
9681           error (_("Unable to seek to start of dynamic information\n"));
9682           goto no_gnu_hash;
9683         }
9684
9685       if (fread (nb, 16, 1, file) != 1)
9686         {
9687           error (_("Failed to read in number of buckets\n"));
9688           goto no_gnu_hash;
9689         }
9690
9691       ngnubuckets = byte_get (nb, 4);
9692       gnusymidx = byte_get (nb + 4, 4);
9693       bitmaskwords = byte_get (nb + 8, 4);
9694       buckets_vma = dynamic_info_DT_GNU_HASH + 16;
9695       if (is_32bit_elf)
9696         buckets_vma += bitmaskwords * 4;
9697       else
9698         buckets_vma += bitmaskwords * 8;
9699
9700       if (fseek (file,
9701                  (archive_file_offset
9702                   + offset_from_vma (file, buckets_vma, 4)),
9703                  SEEK_SET))
9704         {
9705           error (_("Unable to seek to start of dynamic information\n"));
9706           goto no_gnu_hash;
9707         }
9708
9709       gnubuckets = get_dynamic_data (file, ngnubuckets, 4);
9710
9711       if (gnubuckets == NULL)
9712         goto no_gnu_hash;
9713
9714       for (i = 0; i < ngnubuckets; i++)
9715         if (gnubuckets[i] != 0)
9716           {
9717             if (gnubuckets[i] < gnusymidx)
9718               return 0;
9719
9720             if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
9721               maxchain = gnubuckets[i];
9722           }
9723
9724       if (maxchain == 0xffffffff)
9725         goto no_gnu_hash;
9726
9727       maxchain -= gnusymidx;
9728
9729       if (fseek (file,
9730                  (archive_file_offset
9731                   + offset_from_vma (file, buckets_vma
9732                                            + 4 * (ngnubuckets + maxchain), 4)),
9733                  SEEK_SET))
9734         {
9735           error (_("Unable to seek to start of dynamic information\n"));
9736           goto no_gnu_hash;
9737         }
9738
9739       do
9740         {
9741           if (fread (nb, 4, 1, file) != 1)
9742             {
9743               error (_("Failed to determine last chain length\n"));
9744               goto no_gnu_hash;
9745             }
9746
9747           if (maxchain + 1 == 0)
9748             goto no_gnu_hash;
9749
9750           ++maxchain;
9751         }
9752       while ((byte_get (nb, 4) & 1) == 0);
9753
9754       if (fseek (file,
9755                  (archive_file_offset
9756                   + offset_from_vma (file, buckets_vma + 4 * ngnubuckets, 4)),
9757                  SEEK_SET))
9758         {
9759           error (_("Unable to seek to start of dynamic information\n"));
9760           goto no_gnu_hash;
9761         }
9762
9763       gnuchains = get_dynamic_data (file, maxchain, 4);
9764
9765     no_gnu_hash:
9766       if (gnuchains == NULL)
9767         {
9768           free (gnubuckets);
9769           gnubuckets = NULL;
9770           ngnubuckets = 0;
9771           if (do_using_dynamic)
9772             return 0;
9773         }
9774     }
9775
9776   if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
9777       && do_syms
9778       && do_using_dynamic
9779       && dynamic_strings != NULL)
9780     {
9781       unsigned long hn;
9782
9783       if (dynamic_info[DT_HASH])
9784         {
9785           bfd_vma si;
9786
9787           printf (_("\nSymbol table for image:\n"));
9788           if (is_32bit_elf)
9789             printf (_("  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"));
9790           else
9791             printf (_("  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"));
9792
9793           for (hn = 0; hn < nbuckets; hn++)
9794             {
9795               if (! buckets[hn])
9796                 continue;
9797
9798               for (si = buckets[hn]; si < nchains && si > 0; si = chains[si])
9799                 print_dynamic_symbol (si, hn);
9800             }
9801         }
9802
9803       if (dynamic_info_DT_GNU_HASH)
9804         {
9805           printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
9806           if (is_32bit_elf)
9807             printf (_("  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"));
9808           else
9809             printf (_("  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"));
9810
9811           for (hn = 0; hn < ngnubuckets; ++hn)
9812             if (gnubuckets[hn] != 0)
9813               {
9814                 bfd_vma si = gnubuckets[hn];
9815                 bfd_vma off = si - gnusymidx;
9816
9817                 do
9818                   {
9819                     print_dynamic_symbol (si, hn);
9820                     si++;
9821                   }
9822                 while ((gnuchains[off++] & 1) == 0);
9823               }
9824         }
9825     }
9826   else if (do_dyn_syms || (do_syms && !do_using_dynamic))
9827     {
9828       unsigned int i;
9829
9830       for (i = 0, section = section_headers;
9831            i < elf_header.e_shnum;
9832            i++, section++)
9833         {
9834           unsigned int si;
9835           char * strtab = NULL;
9836           unsigned long int strtab_size = 0;
9837           Elf_Internal_Sym * symtab;
9838           Elf_Internal_Sym * psym;
9839           unsigned long num_syms;
9840
9841           if ((section->sh_type != SHT_SYMTAB
9842                && section->sh_type != SHT_DYNSYM)
9843               || (!do_syms
9844                   && section->sh_type == SHT_SYMTAB))
9845             continue;
9846
9847           if (section->sh_entsize == 0)
9848             {
9849               printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
9850                       SECTION_NAME (section));
9851               continue;
9852             }
9853
9854           printf (_("\nSymbol table '%s' contains %lu entries:\n"),
9855                   SECTION_NAME (section),
9856                   (unsigned long) (section->sh_size / section->sh_entsize));
9857
9858           if (is_32bit_elf)
9859             printf (_("   Num:    Value  Size Type    Bind   Vis      Ndx Name\n"));
9860           else
9861             printf (_("   Num:    Value          Size Type    Bind   Vis      Ndx Name\n"));
9862
9863           symtab = GET_ELF_SYMBOLS (file, section, & num_syms);
9864           if (symtab == NULL)
9865             continue;
9866
9867           if (section->sh_link == elf_header.e_shstrndx)
9868             {
9869               strtab = string_table;
9870               strtab_size = string_table_length;
9871             }
9872           else if (section->sh_link < elf_header.e_shnum)
9873             {
9874               Elf_Internal_Shdr * string_sec;
9875
9876               string_sec = section_headers + section->sh_link;
9877
9878               strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
9879                                           1, string_sec->sh_size,
9880                                           _("string table"));
9881               strtab_size = strtab != NULL ? string_sec->sh_size : 0;
9882             }
9883
9884           for (si = 0, psym = symtab; si < num_syms; si++, psym++)
9885             {
9886               printf ("%6d: ", si);
9887               print_vma (psym->st_value, LONG_HEX);
9888               putchar (' ');
9889               print_vma (psym->st_size, DEC_5);
9890               printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
9891               printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
9892               printf (" %-7s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
9893               /* Check to see if any other bits in the st_other field are set.
9894                  Note - displaying this information disrupts the layout of the
9895                  table being generated, but for the moment this case is very rare.  */
9896               if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
9897                 printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
9898               printf (" %4s ", get_symbol_index_type (psym->st_shndx));
9899               print_symbol (25, psym->st_name < strtab_size
9900                             ? strtab + psym->st_name : _("<corrupt>"));
9901
9902               if (section->sh_type == SHT_DYNSYM
9903                   && version_info[DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
9904                 {
9905                   unsigned char data[2];
9906                   unsigned short vers_data;
9907                   unsigned long offset;
9908                   int is_nobits;
9909                   int check_def;
9910
9911                   offset = offset_from_vma
9912                     (file, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
9913                      sizeof data + si * sizeof (vers_data));
9914
9915                   if (get_data (&data, file, offset + si * sizeof (vers_data),
9916                                 sizeof (data), 1, _("version data")) == NULL)
9917                     break;
9918
9919                   vers_data = byte_get (data, 2);
9920
9921                   is_nobits = (psym->st_shndx < elf_header.e_shnum
9922                                && section_headers[psym->st_shndx].sh_type
9923                                   == SHT_NOBITS);
9924
9925                   check_def = (psym->st_shndx != SHN_UNDEF);
9926
9927                   if ((vers_data & VERSYM_HIDDEN) || vers_data > 1)
9928                     {
9929                       if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)]
9930                           && (is_nobits || ! check_def))
9931                         {
9932                           Elf_External_Verneed evn;
9933                           Elf_Internal_Verneed ivn;
9934                           Elf_Internal_Vernaux ivna;
9935
9936                           /* We must test both.  */
9937                           offset = offset_from_vma
9938                             (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
9939                              sizeof evn);
9940
9941                           do
9942                             {
9943                               unsigned long vna_off;
9944
9945                               if (get_data (&evn, file, offset, sizeof (evn), 1,
9946                                             _("version need")) == NULL)
9947                                 {
9948                                   ivna.vna_next = 0;
9949                                   ivna.vna_other = 0;
9950                                   ivna.vna_name = 0;
9951                                   break;
9952                                 }
9953
9954                               ivn.vn_aux  = BYTE_GET (evn.vn_aux);
9955                               ivn.vn_next = BYTE_GET (evn.vn_next);
9956
9957                               vna_off = offset + ivn.vn_aux;
9958
9959                               do
9960                                 {
9961                                   Elf_External_Vernaux evna;
9962
9963                                   if (get_data (&evna, file, vna_off,
9964                                                 sizeof (evna), 1,
9965                                                 _("version need aux (3)")) == NULL)
9966                                     {
9967                                       ivna.vna_next = 0;
9968                                       ivna.vna_other = 0;
9969                                       ivna.vna_name = 0;
9970                                     }
9971                                   else
9972                                     {
9973                                       ivna.vna_other = BYTE_GET (evna.vna_other);
9974                                       ivna.vna_next  = BYTE_GET (evna.vna_next);
9975                                       ivna.vna_name  = BYTE_GET (evna.vna_name);
9976                                     }
9977
9978                                   vna_off += ivna.vna_next;
9979                                 }
9980                               while (ivna.vna_other != vers_data
9981                                      && ivna.vna_next != 0);
9982
9983                               if (ivna.vna_other == vers_data)
9984                                 break;
9985
9986                               offset += ivn.vn_next;
9987                             }
9988                           while (ivn.vn_next != 0);
9989
9990                           if (ivna.vna_other == vers_data)
9991                             {
9992                               printf ("@%s (%d)",
9993                                       ivna.vna_name < strtab_size
9994                                       ? strtab + ivna.vna_name : _("<corrupt>"),
9995                                       ivna.vna_other);
9996                               check_def = 0;
9997                             }
9998                           else if (! is_nobits)
9999                             error (_("bad dynamic symbol\n"));
10000                           else
10001                             check_def = 1;
10002                         }
10003
10004                       if (check_def)
10005                         {
10006                           if (vers_data != 0x8001
10007                               && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10008                             {
10009                               Elf_Internal_Verdef ivd;
10010                               Elf_Internal_Verdaux ivda;
10011                               Elf_External_Verdaux evda;
10012                               unsigned long off;
10013
10014                               off = offset_from_vma
10015                                 (file,
10016                                  version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10017                                  sizeof (Elf_External_Verdef));
10018
10019                               do
10020                                 {
10021                                   Elf_External_Verdef evd;
10022
10023                                   if (get_data (&evd, file, off, sizeof (evd),
10024                                                 1, _("version def")) == NULL)
10025                                     {
10026                                       ivd.vd_ndx = 0;
10027                                       ivd.vd_aux = 0;
10028                                       ivd.vd_next = 0;
10029                                     }
10030                                   else
10031                                     {
10032                                       ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
10033                                       ivd.vd_aux = BYTE_GET (evd.vd_aux);
10034                                       ivd.vd_next = BYTE_GET (evd.vd_next);
10035                                     }
10036
10037                                   off += ivd.vd_next;
10038                                 }
10039                               while (ivd.vd_ndx != (vers_data & VERSYM_VERSION)
10040                                      && ivd.vd_next != 0);
10041
10042                               off -= ivd.vd_next;
10043                               off += ivd.vd_aux;
10044
10045                               if (get_data (&evda, file, off, sizeof (evda),
10046                                             1, _("version def aux")) == NULL)
10047                                 break;
10048
10049                               ivda.vda_name = BYTE_GET (evda.vda_name);
10050
10051                               if (psym->st_name != ivda.vda_name)
10052                                 printf ((vers_data & VERSYM_HIDDEN)
10053                                         ? "@%s" : "@@%s",
10054                                         ivda.vda_name < strtab_size
10055                                         ? strtab + ivda.vda_name : _("<corrupt>"));
10056                             }
10057                         }
10058                     }
10059                 }
10060
10061               putchar ('\n');
10062             }
10063
10064           free (symtab);
10065           if (strtab != string_table)
10066             free (strtab);
10067         }
10068     }
10069   else if (do_syms)
10070     printf
10071       (_("\nDynamic symbol information is not available for displaying symbols.\n"));
10072
10073   if (do_histogram && buckets != NULL)
10074     {
10075       unsigned long * lengths;
10076       unsigned long * counts;
10077       unsigned long hn;
10078       bfd_vma si;
10079       unsigned long maxlength = 0;
10080       unsigned long nzero_counts = 0;
10081       unsigned long nsyms = 0;
10082
10083       printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
10084               (unsigned long) nbuckets);
10085       printf (_(" Length  Number     %% of total  Coverage\n"));
10086
10087       lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
10088       if (lengths == NULL)
10089         {
10090           error (_("Out of memory\n"));
10091           return 0;
10092         }
10093       for (hn = 0; hn < nbuckets; ++hn)
10094         {
10095           for (si = buckets[hn]; si > 0 && si < nchains; si = chains[si])
10096             {
10097               ++nsyms;
10098               if (maxlength < ++lengths[hn])
10099                 ++maxlength;
10100             }
10101         }
10102
10103       counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
10104       if (counts == NULL)
10105         {
10106           free (lengths);
10107           error (_("Out of memory\n"));
10108           return 0;
10109         }
10110
10111       for (hn = 0; hn < nbuckets; ++hn)
10112         ++counts[lengths[hn]];
10113
10114       if (nbuckets > 0)
10115         {
10116           unsigned long i;
10117           printf ("      0  %-10lu (%5.1f%%)\n",
10118                   counts[0], (counts[0] * 100.0) / nbuckets);
10119           for (i = 1; i <= maxlength; ++i)
10120             {
10121               nzero_counts += counts[i] * i;
10122               printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
10123                       i, counts[i], (counts[i] * 100.0) / nbuckets,
10124                       (nzero_counts * 100.0) / nsyms);
10125             }
10126         }
10127
10128       free (counts);
10129       free (lengths);
10130     }
10131
10132   if (buckets != NULL)
10133     {
10134       free (buckets);
10135       free (chains);
10136     }
10137
10138   if (do_histogram && gnubuckets != NULL)
10139     {
10140       unsigned long * lengths;
10141       unsigned long * counts;
10142       unsigned long hn;
10143       unsigned long maxlength = 0;
10144       unsigned long nzero_counts = 0;
10145       unsigned long nsyms = 0;
10146
10147       lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
10148       if (lengths == NULL)
10149         {
10150           error (_("Out of memory\n"));
10151           return 0;
10152         }
10153
10154       printf (_("\nHistogram for `.gnu.hash' bucket list length (total of %lu buckets):\n"),
10155               (unsigned long) ngnubuckets);
10156       printf (_(" Length  Number     %% of total  Coverage\n"));
10157
10158       for (hn = 0; hn < ngnubuckets; ++hn)
10159         if (gnubuckets[hn] != 0)
10160           {
10161             bfd_vma off, length = 1;
10162
10163             for (off = gnubuckets[hn] - gnusymidx;
10164                  (gnuchains[off] & 1) == 0; ++off)
10165               ++length;
10166             lengths[hn] = length;
10167             if (length > maxlength)
10168               maxlength = length;
10169             nsyms += length;
10170           }
10171
10172       counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
10173       if (counts == NULL)
10174         {
10175           free (lengths);
10176           error (_("Out of memory\n"));
10177           return 0;
10178         }
10179
10180       for (hn = 0; hn < ngnubuckets; ++hn)
10181         ++counts[lengths[hn]];
10182
10183       if (ngnubuckets > 0)
10184         {
10185           unsigned long j;
10186           printf ("      0  %-10lu (%5.1f%%)\n",
10187                   counts[0], (counts[0] * 100.0) / ngnubuckets);
10188           for (j = 1; j <= maxlength; ++j)
10189             {
10190               nzero_counts += counts[j] * j;
10191               printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
10192                       j, counts[j], (counts[j] * 100.0) / ngnubuckets,
10193                       (nzero_counts * 100.0) / nsyms);
10194             }
10195         }
10196
10197       free (counts);
10198       free (lengths);
10199       free (gnubuckets);
10200       free (gnuchains);
10201     }
10202
10203   return 1;
10204 }
10205
10206 static int
10207 process_syminfo (FILE * file ATTRIBUTE_UNUSED)
10208 {
10209   unsigned int i;
10210
10211   if (dynamic_syminfo == NULL
10212       || !do_dynamic)
10213     /* No syminfo, this is ok.  */
10214     return 1;
10215
10216   /* There better should be a dynamic symbol section.  */
10217   if (dynamic_symbols == NULL || dynamic_strings == NULL)
10218     return 0;
10219
10220   if (dynamic_addr)
10221     printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
10222             dynamic_syminfo_offset, dynamic_syminfo_nent);
10223
10224   printf (_(" Num: Name                           BoundTo     Flags\n"));
10225   for (i = 0; i < dynamic_syminfo_nent; ++i)
10226     {
10227       unsigned short int flags = dynamic_syminfo[i].si_flags;
10228
10229       printf ("%4d: ", i);
10230       if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
10231         print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
10232       else
10233         printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
10234       putchar (' ');
10235
10236       switch (dynamic_syminfo[i].si_boundto)
10237         {
10238         case SYMINFO_BT_SELF:
10239           fputs ("SELF       ", stdout);
10240           break;
10241         case SYMINFO_BT_PARENT:
10242           fputs ("PARENT     ", stdout);
10243           break;
10244         default:
10245           if (dynamic_syminfo[i].si_boundto > 0
10246               && dynamic_syminfo[i].si_boundto < dynamic_nent
10247               && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
10248             {
10249               print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
10250               putchar (' ' );
10251             }
10252           else
10253             printf ("%-10d ", dynamic_syminfo[i].si_boundto);
10254           break;
10255         }
10256
10257       if (flags & SYMINFO_FLG_DIRECT)
10258         printf (" DIRECT");
10259       if (flags & SYMINFO_FLG_PASSTHRU)
10260         printf (" PASSTHRU");
10261       if (flags & SYMINFO_FLG_COPY)
10262         printf (" COPY");
10263       if (flags & SYMINFO_FLG_LAZYLOAD)
10264         printf (" LAZYLOAD");
10265
10266       puts ("");
10267     }
10268
10269   return 1;
10270 }
10271
10272 /* Check to see if the given reloc needs to be handled in a target specific
10273    manner.  If so then process the reloc and return TRUE otherwise return
10274    FALSE.  */
10275
10276 static bfd_boolean
10277 target_specific_reloc_handling (Elf_Internal_Rela * reloc,
10278                                 unsigned char *     start,
10279                                 Elf_Internal_Sym *  symtab)
10280 {
10281   unsigned int reloc_type = get_reloc_type (reloc->r_info);
10282
10283   switch (elf_header.e_machine)
10284     {
10285     case EM_MSP430:
10286     case EM_MSP430_OLD:
10287       {
10288         static Elf_Internal_Sym * saved_sym = NULL;
10289
10290         switch (reloc_type)
10291           {
10292           case 10: /* R_MSP430_SYM_DIFF */
10293             if (uses_msp430x_relocs ())
10294               break;
10295           case 21: /* R_MSP430X_SYM_DIFF */
10296             saved_sym = symtab + get_reloc_symindex (reloc->r_info);
10297             return TRUE;
10298
10299           case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
10300           case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
10301             goto handle_sym_diff;
10302
10303           case 5: /* R_MSP430_16_BYTE */
10304           case 9: /* R_MSP430_8 */
10305             if (uses_msp430x_relocs ())
10306               break;
10307             goto handle_sym_diff;
10308
10309           case 2: /* R_MSP430_ABS16 */
10310           case 15: /* R_MSP430X_ABS16 */
10311             if (! uses_msp430x_relocs ())
10312               break;
10313             goto handle_sym_diff;
10314
10315           handle_sym_diff:
10316             if (saved_sym != NULL)
10317               {
10318                 bfd_vma value;
10319
10320                 value = reloc->r_addend
10321                   + (symtab[get_reloc_symindex (reloc->r_info)].st_value
10322                      - saved_sym->st_value);
10323
10324                 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
10325
10326                 saved_sym = NULL;
10327                 return TRUE;
10328               }
10329             break;
10330
10331           default:
10332             if (saved_sym != NULL)
10333               error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc"));
10334             break;
10335           }
10336         break;
10337       }
10338
10339     case EM_MN10300:
10340     case EM_CYGNUS_MN10300:
10341       {
10342         static Elf_Internal_Sym * saved_sym = NULL;
10343
10344         switch (reloc_type)
10345           {
10346           case 34: /* R_MN10300_ALIGN */
10347             return TRUE;
10348           case 33: /* R_MN10300_SYM_DIFF */
10349             saved_sym = symtab + get_reloc_symindex (reloc->r_info);
10350             return TRUE;
10351           case 1: /* R_MN10300_32 */
10352           case 2: /* R_MN10300_16 */
10353             if (saved_sym != NULL)
10354               {
10355                 bfd_vma value;
10356
10357                 value = reloc->r_addend
10358                   + (symtab[get_reloc_symindex (reloc->r_info)].st_value
10359                      - saved_sym->st_value);
10360
10361                 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
10362
10363                 saved_sym = NULL;
10364                 return TRUE;
10365               }
10366             break;
10367           default:
10368             if (saved_sym != NULL)
10369               error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc"));
10370             break;
10371           }
10372         break;
10373       }
10374     }
10375
10376   return FALSE;
10377 }
10378
10379 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
10380    DWARF debug sections.  This is a target specific test.  Note - we do not
10381    go through the whole including-target-headers-multiple-times route, (as
10382    we have already done with <elf/h8.h>) because this would become very
10383    messy and even then this function would have to contain target specific
10384    information (the names of the relocs instead of their numeric values).
10385    FIXME: This is not the correct way to solve this problem.  The proper way
10386    is to have target specific reloc sizing and typing functions created by
10387    the reloc-macros.h header, in the same way that it already creates the
10388    reloc naming functions.  */
10389
10390 static bfd_boolean
10391 is_32bit_abs_reloc (unsigned int reloc_type)
10392 {
10393   switch (elf_header.e_machine)
10394     {
10395     case EM_386:
10396     case EM_486:
10397       return reloc_type == 1; /* R_386_32.  */
10398     case EM_68K:
10399       return reloc_type == 1; /* R_68K_32.  */
10400     case EM_860:
10401       return reloc_type == 1; /* R_860_32.  */
10402     case EM_960:
10403       return reloc_type == 2; /* R_960_32.  */
10404     case EM_AARCH64:
10405       return reloc_type == 258; /* R_AARCH64_ABS32 */
10406     case EM_ALPHA:
10407       return reloc_type == 1; /* R_ALPHA_REFLONG.  */
10408     case EM_ARC:
10409       return reloc_type == 1; /* R_ARC_32.  */
10410     case EM_ARM:
10411       return reloc_type == 2; /* R_ARM_ABS32 */
10412     case EM_AVR_OLD:
10413     case EM_AVR:
10414       return reloc_type == 1;
10415     case EM_ADAPTEVA_EPIPHANY:
10416       return reloc_type == 3;
10417     case EM_BLACKFIN:
10418       return reloc_type == 0x12; /* R_byte4_data.  */
10419     case EM_CRIS:
10420       return reloc_type == 3; /* R_CRIS_32.  */
10421     case EM_CR16:
10422       return reloc_type == 3; /* R_CR16_NUM32.  */
10423     case EM_CRX:
10424       return reloc_type == 15; /* R_CRX_NUM32.  */
10425     case EM_CYGNUS_FRV:
10426       return reloc_type == 1;
10427     case EM_CYGNUS_D10V:
10428     case EM_D10V:
10429       return reloc_type == 6; /* R_D10V_32.  */
10430     case EM_CYGNUS_D30V:
10431     case EM_D30V:
10432       return reloc_type == 12; /* R_D30V_32_NORMAL.  */
10433     case EM_DLX:
10434       return reloc_type == 3; /* R_DLX_RELOC_32.  */
10435     case EM_CYGNUS_FR30:
10436     case EM_FR30:
10437       return reloc_type == 3; /* R_FR30_32.  */
10438     case EM_H8S:
10439     case EM_H8_300:
10440     case EM_H8_300H:
10441       return reloc_type == 1; /* R_H8_DIR32.  */
10442     case EM_IA_64:
10443       return reloc_type == 0x65; /* R_IA64_SECREL32LSB.  */
10444     case EM_IP2K_OLD:
10445     case EM_IP2K:
10446       return reloc_type == 2; /* R_IP2K_32.  */
10447     case EM_IQ2000:
10448       return reloc_type == 2; /* R_IQ2000_32.  */
10449     case EM_LATTICEMICO32:
10450       return reloc_type == 3; /* R_LM32_32.  */
10451     case EM_M32C_OLD:
10452     case EM_M32C:
10453       return reloc_type == 3; /* R_M32C_32.  */
10454     case EM_M32R:
10455       return reloc_type == 34; /* R_M32R_32_RELA.  */
10456     case EM_MCORE:
10457       return reloc_type == 1; /* R_MCORE_ADDR32.  */
10458     case EM_CYGNUS_MEP:
10459       return reloc_type == 4; /* R_MEP_32.  */
10460     case EM_METAG:
10461       return reloc_type == 2; /* R_METAG_ADDR32.  */
10462     case EM_MICROBLAZE:
10463       return reloc_type == 1; /* R_MICROBLAZE_32.  */
10464     case EM_MIPS:
10465       return reloc_type == 2; /* R_MIPS_32.  */
10466     case EM_MMIX:
10467       return reloc_type == 4; /* R_MMIX_32.  */
10468     case EM_CYGNUS_MN10200:
10469     case EM_MN10200:
10470       return reloc_type == 1; /* R_MN10200_32.  */
10471     case EM_CYGNUS_MN10300:
10472     case EM_MN10300:
10473       return reloc_type == 1; /* R_MN10300_32.  */
10474     case EM_MOXIE:
10475       return reloc_type == 1; /* R_MOXIE_32.  */
10476     case EM_MSP430_OLD:
10477     case EM_MSP430:
10478       return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32.  */
10479     case EM_MT:
10480       return reloc_type == 2; /* R_MT_32.  */
10481     case EM_NDS32:
10482       return reloc_type == 20; /* R_NDS32_RELA.  */
10483     case EM_ALTERA_NIOS2:
10484       return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32.  */
10485     case EM_NIOS32:
10486       return reloc_type == 1; /* R_NIOS_32.  */
10487     case EM_OR1K:
10488       return reloc_type == 1; /* R_OR1K_32.  */
10489     case EM_PARISC:
10490       return (reloc_type == 1 /* R_PARISC_DIR32.  */
10491               || reloc_type == 41); /* R_PARISC_SECREL32.  */
10492     case EM_PJ:
10493     case EM_PJ_OLD:
10494       return reloc_type == 1; /* R_PJ_DATA_DIR32.  */
10495     case EM_PPC64:
10496       return reloc_type == 1; /* R_PPC64_ADDR32.  */
10497     case EM_PPC:
10498       return reloc_type == 1; /* R_PPC_ADDR32.  */
10499     case EM_RL78:
10500       return reloc_type == 1; /* R_RL78_DIR32.  */
10501     case EM_RX:
10502       return reloc_type == 1; /* R_RX_DIR32.  */
10503     case EM_S370:
10504       return reloc_type == 1; /* R_I370_ADDR31.  */
10505     case EM_S390_OLD:
10506     case EM_S390:
10507       return reloc_type == 4; /* R_S390_32.  */
10508     case EM_SCORE:
10509       return reloc_type == 8; /* R_SCORE_ABS32.  */
10510     case EM_SH:
10511       return reloc_type == 1; /* R_SH_DIR32.  */
10512     case EM_SPARC32PLUS:
10513     case EM_SPARCV9:
10514     case EM_SPARC:
10515       return reloc_type == 3 /* R_SPARC_32.  */
10516         || reloc_type == 23; /* R_SPARC_UA32.  */
10517     case EM_SPU:
10518       return reloc_type == 6; /* R_SPU_ADDR32 */
10519     case EM_TI_C6000:
10520       return reloc_type == 1; /* R_C6000_ABS32.  */
10521     case EM_TILEGX:
10522       return reloc_type == 2; /* R_TILEGX_32.  */
10523     case EM_TILEPRO:
10524       return reloc_type == 1; /* R_TILEPRO_32.  */
10525     case EM_CYGNUS_V850:
10526     case EM_V850:
10527       return reloc_type == 6; /* R_V850_ABS32.  */
10528     case EM_V800:
10529       return reloc_type == 0x33; /* R_V810_WORD.  */
10530     case EM_VAX:
10531       return reloc_type == 1; /* R_VAX_32.  */
10532     case EM_X86_64:
10533     case EM_L1OM:
10534     case EM_K1OM:
10535       return reloc_type == 10; /* R_X86_64_32.  */
10536     case EM_XC16X:
10537     case EM_C166:
10538       return reloc_type == 3; /* R_XC16C_ABS_32.  */
10539     case EM_XGATE:
10540       return reloc_type == 4; /* R_XGATE_32.  */
10541     case EM_XSTORMY16:
10542       return reloc_type == 1; /* R_XSTROMY16_32.  */
10543     case EM_XTENSA_OLD:
10544     case EM_XTENSA:
10545       return reloc_type == 1; /* R_XTENSA_32.  */
10546     default:
10547       error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
10548              elf_header.e_machine);
10549       abort ();
10550     }
10551 }
10552
10553 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
10554    a 32-bit pc-relative RELA relocation used in DWARF debug sections.  */
10555
10556 static bfd_boolean
10557 is_32bit_pcrel_reloc (unsigned int reloc_type)
10558 {
10559   switch (elf_header.e_machine)
10560     {
10561     case EM_386:
10562     case EM_486:
10563       return reloc_type == 2;  /* R_386_PC32.  */
10564     case EM_68K:
10565       return reloc_type == 4;  /* R_68K_PC32.  */
10566     case EM_AARCH64:
10567       return reloc_type == 261; /* R_AARCH64_PREL32 */
10568     case EM_ADAPTEVA_EPIPHANY:
10569       return reloc_type == 6;
10570     case EM_ALPHA:
10571       return reloc_type == 10; /* R_ALPHA_SREL32.  */
10572     case EM_ARM:
10573       return reloc_type == 3;  /* R_ARM_REL32 */
10574     case EM_MICROBLAZE:
10575       return reloc_type == 2;  /* R_MICROBLAZE_32_PCREL.  */
10576     case EM_OR1K:
10577       return reloc_type == 9; /* R_OR1K_32_PCREL.  */
10578     case EM_PARISC:
10579       return reloc_type == 9;  /* R_PARISC_PCREL32.  */
10580     case EM_PPC:
10581       return reloc_type == 26; /* R_PPC_REL32.  */
10582     case EM_PPC64:
10583       return reloc_type == 26; /* R_PPC64_REL32.  */
10584     case EM_S390_OLD:
10585     case EM_S390:
10586       return reloc_type == 5;  /* R_390_PC32.  */
10587     case EM_SH:
10588       return reloc_type == 2;  /* R_SH_REL32.  */
10589     case EM_SPARC32PLUS:
10590     case EM_SPARCV9:
10591     case EM_SPARC:
10592       return reloc_type == 6;  /* R_SPARC_DISP32.  */
10593     case EM_SPU:
10594       return reloc_type == 13; /* R_SPU_REL32.  */
10595     case EM_TILEGX:
10596       return reloc_type == 6; /* R_TILEGX_32_PCREL.  */
10597     case EM_TILEPRO:
10598       return reloc_type == 4; /* R_TILEPRO_32_PCREL.  */
10599     case EM_X86_64:
10600     case EM_L1OM:
10601     case EM_K1OM:
10602       return reloc_type == 2;  /* R_X86_64_PC32.  */
10603     case EM_XTENSA_OLD:
10604     case EM_XTENSA:
10605       return reloc_type == 14; /* R_XTENSA_32_PCREL.  */
10606     default:
10607       /* Do not abort or issue an error message here.  Not all targets use
10608          pc-relative 32-bit relocs in their DWARF debug information and we
10609          have already tested for target coverage in is_32bit_abs_reloc.  A
10610          more helpful warning message will be generated by apply_relocations
10611          anyway, so just return.  */
10612       return FALSE;
10613     }
10614 }
10615
10616 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
10617    a 64-bit absolute RELA relocation used in DWARF debug sections.  */
10618
10619 static bfd_boolean
10620 is_64bit_abs_reloc (unsigned int reloc_type)
10621 {
10622   switch (elf_header.e_machine)
10623     {
10624     case EM_AARCH64:
10625       return reloc_type == 257; /* R_AARCH64_ABS64.  */
10626     case EM_ALPHA:
10627       return reloc_type == 2; /* R_ALPHA_REFQUAD.  */
10628     case EM_IA_64:
10629       return reloc_type == 0x27; /* R_IA64_DIR64LSB.  */
10630     case EM_PARISC:
10631       return reloc_type == 80; /* R_PARISC_DIR64.  */
10632     case EM_PPC64:
10633       return reloc_type == 38; /* R_PPC64_ADDR64.  */
10634     case EM_SPARC32PLUS:
10635     case EM_SPARCV9:
10636     case EM_SPARC:
10637       return reloc_type == 54; /* R_SPARC_UA64.  */
10638     case EM_X86_64:
10639     case EM_L1OM:
10640     case EM_K1OM:
10641       return reloc_type == 1; /* R_X86_64_64.  */
10642     case EM_S390_OLD:
10643     case EM_S390:
10644       return reloc_type == 22;  /* R_S390_64.  */
10645     case EM_TILEGX:
10646       return reloc_type == 1; /* R_TILEGX_64.  */
10647     case EM_MIPS:
10648       return reloc_type == 18;  /* R_MIPS_64.  */
10649     default:
10650       return FALSE;
10651     }
10652 }
10653
10654 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
10655    a 64-bit pc-relative RELA relocation used in DWARF debug sections.  */
10656
10657 static bfd_boolean
10658 is_64bit_pcrel_reloc (unsigned int reloc_type)
10659 {
10660   switch (elf_header.e_machine)
10661     {
10662     case EM_AARCH64:
10663       return reloc_type == 260; /* R_AARCH64_PREL64.  */
10664     case EM_ALPHA:
10665       return reloc_type == 11; /* R_ALPHA_SREL64.  */
10666     case EM_IA_64:
10667       return reloc_type == 0x4f; /* R_IA64_PCREL64LSB.  */
10668     case EM_PARISC:
10669       return reloc_type == 72; /* R_PARISC_PCREL64.  */
10670     case EM_PPC64:
10671       return reloc_type == 44; /* R_PPC64_REL64.  */
10672     case EM_SPARC32PLUS:
10673     case EM_SPARCV9:
10674     case EM_SPARC:
10675       return reloc_type == 46; /* R_SPARC_DISP64.  */
10676     case EM_X86_64:
10677     case EM_L1OM:
10678     case EM_K1OM:
10679       return reloc_type == 24; /* R_X86_64_PC64.  */
10680     case EM_S390_OLD:
10681     case EM_S390:
10682       return reloc_type == 23;  /* R_S390_PC64.  */
10683     case EM_TILEGX:
10684       return reloc_type == 5;  /* R_TILEGX_64_PCREL.  */
10685     default:
10686       return FALSE;
10687     }
10688 }
10689
10690 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
10691    a 24-bit absolute RELA relocation used in DWARF debug sections.  */
10692
10693 static bfd_boolean
10694 is_24bit_abs_reloc (unsigned int reloc_type)
10695 {
10696   switch (elf_header.e_machine)
10697     {
10698     case EM_CYGNUS_MN10200:
10699     case EM_MN10200:
10700       return reloc_type == 4; /* R_MN10200_24.  */
10701     default:
10702       return FALSE;
10703     }
10704 }
10705
10706 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
10707    a 16-bit absolute RELA relocation used in DWARF debug sections.  */
10708
10709 static bfd_boolean
10710 is_16bit_abs_reloc (unsigned int reloc_type)
10711 {
10712   switch (elf_header.e_machine)
10713     {
10714     case EM_AVR_OLD:
10715     case EM_AVR:
10716       return reloc_type == 4; /* R_AVR_16.  */
10717     case EM_ADAPTEVA_EPIPHANY:
10718       return reloc_type == 5;
10719     case EM_CYGNUS_D10V:
10720     case EM_D10V:
10721       return reloc_type == 3; /* R_D10V_16.  */
10722     case EM_H8S:
10723     case EM_H8_300:
10724     case EM_H8_300H:
10725       return reloc_type == R_H8_DIR16;
10726     case EM_IP2K_OLD:
10727     case EM_IP2K:
10728       return reloc_type == 1; /* R_IP2K_16.  */
10729     case EM_M32C_OLD:
10730     case EM_M32C:
10731       return reloc_type == 1; /* R_M32C_16 */
10732     case EM_MSP430:
10733       if (uses_msp430x_relocs ())
10734         return reloc_type == 2; /* R_MSP430_ABS16.  */
10735     case EM_MSP430_OLD:
10736       return reloc_type == 5; /* R_MSP430_16_BYTE.  */
10737     case EM_NDS32:
10738       return reloc_type == 19; /* R_NDS32_RELA.  */
10739     case EM_ALTERA_NIOS2:
10740       return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16.  */
10741     case EM_NIOS32:
10742       return reloc_type == 9; /* R_NIOS_16.  */
10743     case EM_OR1K:
10744       return reloc_type == 2; /* R_OR1K_16.  */
10745     case EM_TI_C6000:
10746       return reloc_type == 2; /* R_C6000_ABS16.  */
10747     case EM_XC16X:
10748     case EM_C166:
10749       return reloc_type == 2; /* R_XC16C_ABS_16.  */
10750     case EM_CYGNUS_MN10200:
10751     case EM_MN10200:
10752       return reloc_type == 2; /* R_MN10200_16.  */
10753     case EM_CYGNUS_MN10300:
10754     case EM_MN10300:
10755       return reloc_type == 2; /* R_MN10300_16.  */
10756     case EM_XGATE:
10757       return reloc_type == 3; /* R_XGATE_16.  */
10758     default:
10759       return FALSE;
10760     }
10761 }
10762
10763 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
10764    relocation entries (possibly formerly used for SHT_GROUP sections).  */
10765
10766 static bfd_boolean
10767 is_none_reloc (unsigned int reloc_type)
10768 {
10769   switch (elf_header.e_machine)
10770     {
10771     case EM_68K:     /* R_68K_NONE.  */
10772     case EM_386:     /* R_386_NONE.  */
10773     case EM_SPARC32PLUS:
10774     case EM_SPARCV9:
10775     case EM_SPARC:   /* R_SPARC_NONE.  */
10776     case EM_MIPS:    /* R_MIPS_NONE.  */
10777     case EM_PARISC:  /* R_PARISC_NONE.  */
10778     case EM_ALPHA:   /* R_ALPHA_NONE.  */
10779     case EM_ADAPTEVA_EPIPHANY:
10780     case EM_PPC:     /* R_PPC_NONE.  */
10781     case EM_PPC64:   /* R_PPC64_NONE.  */
10782     case EM_ARM:     /* R_ARM_NONE.  */
10783     case EM_IA_64:   /* R_IA64_NONE.  */
10784     case EM_SH:      /* R_SH_NONE.  */
10785     case EM_S390_OLD:
10786     case EM_S390:    /* R_390_NONE.  */
10787     case EM_CRIS:    /* R_CRIS_NONE.  */
10788     case EM_X86_64:  /* R_X86_64_NONE.  */
10789     case EM_L1OM:    /* R_X86_64_NONE.  */
10790     case EM_K1OM:    /* R_X86_64_NONE.  */
10791     case EM_MN10300: /* R_MN10300_NONE.  */
10792     case EM_MOXIE:   /* R_MOXIE_NONE.  */
10793     case EM_M32R:    /* R_M32R_NONE.  */
10794     case EM_TI_C6000:/* R_C6000_NONE.  */
10795     case EM_TILEGX:  /* R_TILEGX_NONE.  */
10796     case EM_TILEPRO: /* R_TILEPRO_NONE.  */
10797     case EM_XC16X:
10798     case EM_C166:    /* R_XC16X_NONE.  */
10799     case EM_ALTERA_NIOS2: /* R_NIOS2_NONE.  */
10800     case EM_NIOS32:  /* R_NIOS_NONE.  */
10801     case EM_OR1K:    /* R_OR1K_NONE. */
10802       return reloc_type == 0;
10803     case EM_AARCH64:
10804       return reloc_type == 0 || reloc_type == 256;
10805     case EM_NDS32:
10806       return (reloc_type == 0       /* R_XTENSA_NONE.  */
10807               || reloc_type == 204  /* R_NDS32_DIFF8.  */
10808               || reloc_type == 205  /* R_NDS32_DIFF16.  */
10809               || reloc_type == 206  /* R_NDS32_DIFF32.  */
10810               || reloc_type == 207  /* R_NDS32_ULEB128.  */);
10811     case EM_XTENSA_OLD:
10812     case EM_XTENSA:
10813       return (reloc_type == 0      /* R_XTENSA_NONE.  */
10814               || reloc_type == 17  /* R_XTENSA_DIFF8.  */
10815               || reloc_type == 18  /* R_XTENSA_DIFF16.  */
10816               || reloc_type == 19  /* R_XTENSA_DIFF32.  */);
10817     case EM_METAG:
10818       return reloc_type == 3; /* R_METAG_NONE.  */
10819     }
10820   return FALSE;
10821 }
10822
10823 /* Apply relocations to a section.
10824    Note: So far support has been added only for those relocations
10825    which can be found in debug sections.
10826    FIXME: Add support for more relocations ?  */
10827
10828 static void
10829 apply_relocations (void * file,
10830                    Elf_Internal_Shdr * section,
10831                    unsigned char * start)
10832 {
10833   Elf_Internal_Shdr * relsec;
10834   unsigned char * end = start + section->sh_size;
10835
10836   if (elf_header.e_type != ET_REL)
10837     return;
10838
10839   /* Find the reloc section associated with the section.  */
10840   for (relsec = section_headers;
10841        relsec < section_headers + elf_header.e_shnum;
10842        ++relsec)
10843     {
10844       bfd_boolean is_rela;
10845       unsigned long num_relocs;
10846       Elf_Internal_Rela * relocs;
10847       Elf_Internal_Rela * rp;
10848       Elf_Internal_Shdr * symsec;
10849       Elf_Internal_Sym * symtab;
10850       unsigned long num_syms;
10851       Elf_Internal_Sym * sym;
10852
10853       if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
10854           || relsec->sh_info >= elf_header.e_shnum
10855           || section_headers + relsec->sh_info != section
10856           || relsec->sh_size == 0
10857           || relsec->sh_link >= elf_header.e_shnum)
10858         continue;
10859
10860       is_rela = relsec->sh_type == SHT_RELA;
10861
10862       if (is_rela)
10863         {
10864           if (!slurp_rela_relocs ((FILE *) file, relsec->sh_offset,
10865                                   relsec->sh_size, & relocs, & num_relocs))
10866             return;
10867         }
10868       else
10869         {
10870           if (!slurp_rel_relocs ((FILE *) file, relsec->sh_offset,
10871                                  relsec->sh_size, & relocs, & num_relocs))
10872             return;
10873         }
10874
10875       /* SH uses RELA but uses in place value instead of the addend field.  */
10876       if (elf_header.e_machine == EM_SH)
10877         is_rela = FALSE;
10878
10879       symsec = section_headers + relsec->sh_link;
10880       symtab = GET_ELF_SYMBOLS ((FILE *) file, symsec, & num_syms);
10881
10882       for (rp = relocs; rp < relocs + num_relocs; ++rp)
10883         {
10884           bfd_vma         addend;
10885           unsigned int    reloc_type;
10886           unsigned int    reloc_size;
10887           unsigned char * rloc;
10888           unsigned long   sym_index;
10889
10890           reloc_type = get_reloc_type (rp->r_info);
10891
10892           if (target_specific_reloc_handling (rp, start, symtab))
10893             continue;
10894           else if (is_none_reloc (reloc_type))
10895             continue;
10896           else if (is_32bit_abs_reloc (reloc_type)
10897                    || is_32bit_pcrel_reloc (reloc_type))
10898             reloc_size = 4;
10899           else if (is_64bit_abs_reloc (reloc_type)
10900                    || is_64bit_pcrel_reloc (reloc_type))
10901             reloc_size = 8;
10902           else if (is_24bit_abs_reloc (reloc_type))
10903             reloc_size = 3;
10904           else if (is_16bit_abs_reloc (reloc_type))
10905             reloc_size = 2;
10906           else
10907             {
10908               warn (_("unable to apply unsupported reloc type %d to section %s\n"),
10909                     reloc_type, SECTION_NAME (section));
10910               continue;
10911             }
10912
10913           rloc = start + rp->r_offset;
10914           if ((rloc + reloc_size) > end || (rloc < start))
10915             {
10916               warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
10917                     (unsigned long) rp->r_offset,
10918                     SECTION_NAME (section));
10919               continue;
10920             }
10921
10922           sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
10923           if (sym_index >= num_syms)
10924             {
10925               warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
10926                     sym_index, SECTION_NAME (section));
10927               continue;
10928             }
10929           sym = symtab + sym_index;
10930
10931           /* If the reloc has a symbol associated with it,
10932              make sure that it is of an appropriate type.
10933
10934              Relocations against symbols without type can happen.
10935              Gcc -feliminate-dwarf2-dups may generate symbols
10936              without type for debug info.
10937
10938              Icc generates relocations against function symbols
10939              instead of local labels.
10940
10941              Relocations against object symbols can happen, eg when
10942              referencing a global array.  For an example of this see
10943              the _clz.o binary in libgcc.a.  */
10944           if (sym != symtab
10945               && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
10946             {
10947               warn (_("skipping unexpected symbol type %s in %ld'th relocation in section %s\n"),
10948                     get_symbol_type (ELF_ST_TYPE (sym->st_info)),
10949                     (long int)(rp - relocs),
10950                     SECTION_NAME (relsec));
10951               continue;
10952             }
10953
10954           addend = 0;
10955           if (is_rela)
10956             addend += rp->r_addend;
10957           /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
10958              partial_inplace.  */
10959           if (!is_rela
10960               || (elf_header.e_machine == EM_XTENSA
10961                   && reloc_type == 1)
10962               || ((elf_header.e_machine == EM_PJ
10963                    || elf_header.e_machine == EM_PJ_OLD)
10964                   && reloc_type == 1)
10965               || ((elf_header.e_machine == EM_D30V
10966                    || elf_header.e_machine == EM_CYGNUS_D30V)
10967                   && reloc_type == 12))
10968             addend += byte_get (rloc, reloc_size);
10969
10970           if (is_32bit_pcrel_reloc (reloc_type)
10971               || is_64bit_pcrel_reloc (reloc_type))
10972             {
10973               /* On HPPA, all pc-relative relocations are biased by 8.  */
10974               if (elf_header.e_machine == EM_PARISC)
10975                 addend -= 8;
10976               byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
10977                         reloc_size);
10978             }
10979           else
10980             byte_put (rloc, addend + sym->st_value, reloc_size);
10981         }
10982
10983       free (symtab);
10984       free (relocs);
10985       break;
10986     }
10987 }
10988
10989 #ifdef SUPPORT_DISASSEMBLY
10990 static int
10991 disassemble_section (Elf_Internal_Shdr * section, FILE * file)
10992 {
10993   printf (_("\nAssembly dump of section %s\n"),
10994           SECTION_NAME (section));
10995
10996   /* XXX -- to be done --- XXX */
10997
10998   return 1;
10999 }
11000 #endif
11001
11002 /* Reads in the contents of SECTION from FILE, returning a pointer
11003    to a malloc'ed buffer or NULL if something went wrong.  */
11004
11005 static char *
11006 get_section_contents (Elf_Internal_Shdr * section, FILE * file)
11007 {
11008   bfd_size_type num_bytes;
11009
11010   num_bytes = section->sh_size;
11011
11012   if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
11013     {
11014       printf (_("\nSection '%s' has no data to dump.\n"),
11015               SECTION_NAME (section));
11016       return NULL;
11017     }
11018
11019   return  (char *) get_data (NULL, file, section->sh_offset, 1, num_bytes,
11020                              _("section contents"));
11021 }
11022
11023
11024 static void
11025 dump_section_as_strings (Elf_Internal_Shdr * section, FILE * file)
11026 {
11027   Elf_Internal_Shdr * relsec;
11028   bfd_size_type num_bytes;
11029   char * data;
11030   char * end;
11031   char * start;
11032   char * name = SECTION_NAME (section);
11033   bfd_boolean some_strings_shown;
11034
11035   start = get_section_contents (section, file);
11036   if (start == NULL)
11037     return;
11038
11039   printf (_("\nString dump of section '%s':\n"), name);
11040
11041   /* If the section being dumped has relocations against it the user might
11042      be expecting these relocations to have been applied.  Check for this
11043      case and issue a warning message in order to avoid confusion.
11044      FIXME: Maybe we ought to have an option that dumps a section with
11045      relocs applied ?  */
11046   for (relsec = section_headers;
11047        relsec < section_headers + elf_header.e_shnum;
11048        ++relsec)
11049     {
11050       if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
11051           || relsec->sh_info >= elf_header.e_shnum
11052           || section_headers + relsec->sh_info != section
11053           || relsec->sh_size == 0
11054           || relsec->sh_link >= elf_header.e_shnum)
11055         continue;
11056
11057       printf (_("  Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
11058       break;
11059     }
11060
11061   num_bytes = section->sh_size;
11062   data = start;
11063   end  = start + num_bytes;
11064   some_strings_shown = FALSE;
11065
11066   while (data < end)
11067     {
11068       while (!ISPRINT (* data))
11069         if (++ data >= end)
11070           break;
11071
11072       if (data < end)
11073         {
11074 #ifndef __MSVCRT__
11075           /* PR 11128: Use two separate invocations in order to work
11076              around bugs in the Solaris 8 implementation of printf.  */
11077           printf ("  [%6tx]  ", data - start);
11078           printf ("%s\n", data);
11079 #else
11080           printf ("  [%6Ix]  %s\n", (size_t) (data - start), data);
11081 #endif
11082           data += strlen (data);
11083           some_strings_shown = TRUE;
11084         }
11085     }
11086
11087   if (! some_strings_shown)
11088     printf (_("  No strings found in this section."));
11089
11090   free (start);
11091
11092   putchar ('\n');
11093 }
11094
11095 static void
11096 dump_section_as_bytes (Elf_Internal_Shdr * section,
11097                        FILE * file,
11098                        bfd_boolean relocate)
11099 {
11100   Elf_Internal_Shdr * relsec;
11101   bfd_size_type bytes;
11102   bfd_vma addr;
11103   unsigned char * data;
11104   unsigned char * start;
11105
11106   start = (unsigned char *) get_section_contents (section, file);
11107   if (start == NULL)
11108     return;
11109
11110   printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section));
11111
11112   if (relocate)
11113     {
11114       apply_relocations (file, section, start);
11115     }
11116   else
11117     {
11118       /* If the section being dumped has relocations against it the user might
11119          be expecting these relocations to have been applied.  Check for this
11120          case and issue a warning message in order to avoid confusion.
11121          FIXME: Maybe we ought to have an option that dumps a section with
11122          relocs applied ?  */
11123       for (relsec = section_headers;
11124            relsec < section_headers + elf_header.e_shnum;
11125            ++relsec)
11126         {
11127           if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
11128               || relsec->sh_info >= elf_header.e_shnum
11129               || section_headers + relsec->sh_info != section
11130               || relsec->sh_size == 0
11131               || relsec->sh_link >= elf_header.e_shnum)
11132             continue;
11133
11134           printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
11135           break;
11136         }
11137     }
11138
11139   addr = section->sh_addr;
11140   bytes = section->sh_size;
11141   data = start;
11142
11143   while (bytes)
11144     {
11145       int j;
11146       int k;
11147       int lbytes;
11148
11149       lbytes = (bytes > 16 ? 16 : bytes);
11150
11151       printf ("  0x%8.8lx ", (unsigned long) addr);
11152
11153       for (j = 0; j < 16; j++)
11154         {
11155           if (j < lbytes)
11156             printf ("%2.2x", data[j]);
11157           else
11158             printf ("  ");
11159
11160           if ((j & 3) == 3)
11161             printf (" ");
11162         }
11163
11164       for (j = 0; j < lbytes; j++)
11165         {
11166           k = data[j];
11167           if (k >= ' ' && k < 0x7f)
11168             printf ("%c", k);
11169           else
11170             printf (".");
11171         }
11172
11173       putchar ('\n');
11174
11175       data  += lbytes;
11176       addr  += lbytes;
11177       bytes -= lbytes;
11178     }
11179
11180   free (start);
11181
11182   putchar ('\n');
11183 }
11184
11185 /* Uncompresses a section that was compressed using zlib, in place.  */
11186
11187 static int
11188 uncompress_section_contents (unsigned char **buffer ATTRIBUTE_UNUSED,
11189                              dwarf_size_type *size ATTRIBUTE_UNUSED)
11190 {
11191 #ifndef HAVE_ZLIB_H
11192   return FALSE;
11193 #else
11194   dwarf_size_type compressed_size = *size;
11195   unsigned char * compressed_buffer = *buffer;
11196   dwarf_size_type uncompressed_size;
11197   unsigned char * uncompressed_buffer;
11198   z_stream strm;
11199   int rc;
11200   dwarf_size_type header_size = 12;
11201
11202   /* Read the zlib header.  In this case, it should be "ZLIB" followed
11203      by the uncompressed section size, 8 bytes in big-endian order.  */
11204   if (compressed_size < header_size
11205       || ! streq ((char *) compressed_buffer, "ZLIB"))
11206     return 0;
11207
11208   uncompressed_size = compressed_buffer[4]; uncompressed_size <<= 8;
11209   uncompressed_size += compressed_buffer[5]; uncompressed_size <<= 8;
11210   uncompressed_size += compressed_buffer[6]; uncompressed_size <<= 8;
11211   uncompressed_size += compressed_buffer[7]; uncompressed_size <<= 8;
11212   uncompressed_size += compressed_buffer[8]; uncompressed_size <<= 8;
11213   uncompressed_size += compressed_buffer[9]; uncompressed_size <<= 8;
11214   uncompressed_size += compressed_buffer[10]; uncompressed_size <<= 8;
11215   uncompressed_size += compressed_buffer[11];
11216
11217   /* It is possible the section consists of several compressed
11218      buffers concatenated together, so we uncompress in a loop.  */
11219   strm.zalloc = NULL;
11220   strm.zfree = NULL;
11221   strm.opaque = NULL;
11222   strm.avail_in = compressed_size - header_size;
11223   strm.next_in = (Bytef *) compressed_buffer + header_size;
11224   strm.avail_out = uncompressed_size;
11225   uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
11226
11227   rc = inflateInit (& strm);
11228   while (strm.avail_in > 0)
11229     {
11230       if (rc != Z_OK)
11231         goto fail;
11232       strm.next_out = ((Bytef *) uncompressed_buffer
11233                        + (uncompressed_size - strm.avail_out));
11234       rc = inflate (&strm, Z_FINISH);
11235       if (rc != Z_STREAM_END)
11236         goto fail;
11237       rc = inflateReset (& strm);
11238     }
11239   rc = inflateEnd (& strm);
11240   if (rc != Z_OK
11241       || strm.avail_out != 0)
11242     goto fail;
11243
11244   free (compressed_buffer);
11245   *buffer = uncompressed_buffer;
11246   *size = uncompressed_size;
11247   return 1;
11248
11249  fail:
11250   free (uncompressed_buffer);
11251   /* Indicate decompression failure.  */
11252   *buffer = NULL;
11253   return 0;
11254 #endif  /* HAVE_ZLIB_H */
11255 }
11256
11257 static int
11258 load_specific_debug_section (enum dwarf_section_display_enum debug,
11259                              Elf_Internal_Shdr * sec, void * file)
11260 {
11261   struct dwarf_section * section = &debug_displays [debug].section;
11262   char buf [64];
11263
11264   /* If it is already loaded, do nothing.  */
11265   if (section->start != NULL)
11266     return 1;
11267
11268   snprintf (buf, sizeof (buf), _("%s section data"), section->name);
11269   section->address = sec->sh_addr;
11270   section->start = (unsigned char *) get_data (NULL, (FILE *) file,
11271                                                sec->sh_offset, 1,
11272                                                sec->sh_size, buf);
11273   if (section->start == NULL)
11274     section->size = 0;
11275   else
11276     {
11277       section->size = sec->sh_size;
11278       if (uncompress_section_contents (&section->start, &section->size))
11279         sec->sh_size = section->size;
11280     }
11281
11282   if (section->start == NULL)
11283     return 0;
11284
11285   if (debug_displays [debug].relocate)
11286     apply_relocations ((FILE *) file, sec, section->start);
11287
11288   return 1;
11289 }
11290
11291 /* If this is not NULL, load_debug_section will only look for sections
11292    within the list of sections given here.  */
11293 unsigned int *section_subset = NULL;
11294
11295 int
11296 load_debug_section (enum dwarf_section_display_enum debug, void * file)
11297 {
11298   struct dwarf_section * section = &debug_displays [debug].section;
11299   Elf_Internal_Shdr * sec;
11300
11301   /* Locate the debug section.  */
11302   sec = find_section_in_set (section->uncompressed_name, section_subset);
11303   if (sec != NULL)
11304     section->name = section->uncompressed_name;
11305   else
11306     {
11307       sec = find_section_in_set (section->compressed_name, section_subset);
11308       if (sec != NULL)
11309         section->name = section->compressed_name;
11310     }
11311   if (sec == NULL)
11312     return 0;
11313
11314   /* If we're loading from a subset of sections, and we've loaded
11315      a section matching this name before, it's likely that it's a
11316      different one.  */
11317   if (section_subset != NULL)
11318     free_debug_section (debug);
11319
11320   return load_specific_debug_section (debug, sec, (FILE *) file);
11321 }
11322
11323 void
11324 free_debug_section (enum dwarf_section_display_enum debug)
11325 {
11326   struct dwarf_section * section = &debug_displays [debug].section;
11327
11328   if (section->start == NULL)
11329     return;
11330
11331   free ((char *) section->start);
11332   section->start = NULL;
11333   section->address = 0;
11334   section->size = 0;
11335 }
11336
11337 static int
11338 display_debug_section (int shndx, Elf_Internal_Shdr * section, FILE * file)
11339 {
11340   char * name = SECTION_NAME (section);
11341   bfd_size_type length;
11342   int result = 1;
11343   int i;
11344
11345   length = section->sh_size;
11346   if (length == 0)
11347     {
11348       printf (_("\nSection '%s' has no debugging data.\n"), name);
11349       return 0;
11350     }
11351   if (section->sh_type == SHT_NOBITS)
11352     {
11353       /* There is no point in dumping the contents of a debugging section
11354          which has the NOBITS type - the bits in the file will be random.
11355          This can happen when a file containing a .eh_frame section is
11356          stripped with the --only-keep-debug command line option.  */
11357       printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"), name);
11358       return 0;
11359     }
11360
11361   if (const_strneq (name, ".gnu.linkonce.wi."))
11362     name = ".debug_info";
11363
11364   /* See if we know how to display the contents of this section.  */
11365   for (i = 0; i < max; i++)
11366     if (streq (debug_displays[i].section.uncompressed_name, name)
11367         || (i == line && const_strneq (name, ".debug_line."))
11368         || streq (debug_displays[i].section.compressed_name, name))
11369       {
11370         struct dwarf_section * sec = &debug_displays [i].section;
11371         int secondary = (section != find_section (name));
11372
11373         if (secondary)
11374           free_debug_section ((enum dwarf_section_display_enum) i);
11375
11376         if (i == line && const_strneq (name, ".debug_line."))
11377           sec->name = name;
11378         else if (streq (sec->uncompressed_name, name))
11379           sec->name = sec->uncompressed_name;
11380         else
11381           sec->name = sec->compressed_name;
11382         if (load_specific_debug_section ((enum dwarf_section_display_enum) i,
11383                                          section, file))
11384           {
11385             /* If this debug section is part of a CU/TU set in a .dwp file,
11386                restrict load_debug_section to the sections in that set.  */
11387             section_subset = find_cu_tu_set (file, shndx);
11388
11389             result &= debug_displays[i].display (sec, file);
11390
11391             section_subset = NULL;
11392
11393             if (secondary || (i != info && i != abbrev))
11394               free_debug_section ((enum dwarf_section_display_enum) i);
11395           }
11396
11397         break;
11398       }
11399
11400   if (i == max)
11401     {
11402       printf (_("Unrecognized debug section: %s\n"), name);
11403       result = 0;
11404     }
11405
11406   return result;
11407 }
11408
11409 /* Set DUMP_SECTS for all sections where dumps were requested
11410    based on section name.  */
11411
11412 static void
11413 initialise_dumps_byname (void)
11414 {
11415   struct dump_list_entry * cur;
11416
11417   for (cur = dump_sects_byname; cur; cur = cur->next)
11418     {
11419       unsigned int i;
11420       int any;
11421
11422       for (i = 0, any = 0; i < elf_header.e_shnum; i++)
11423         if (streq (SECTION_NAME (section_headers + i), cur->name))
11424           {
11425             request_dump_bynumber (i, cur->type);
11426             any = 1;
11427           }
11428
11429       if (!any)
11430         warn (_("Section '%s' was not dumped because it does not exist!\n"),
11431               cur->name);
11432     }
11433 }
11434
11435 static void
11436 process_section_contents (FILE * file)
11437 {
11438   Elf_Internal_Shdr * section;
11439   unsigned int i;
11440
11441   if (! do_dump)
11442     return;
11443
11444   initialise_dumps_byname ();
11445
11446   for (i = 0, section = section_headers;
11447        i < elf_header.e_shnum && i < num_dump_sects;
11448        i++, section++)
11449     {
11450 #ifdef SUPPORT_DISASSEMBLY
11451       if (dump_sects[i] & DISASS_DUMP)
11452         disassemble_section (section, file);
11453 #endif
11454       if (dump_sects[i] & HEX_DUMP)
11455         dump_section_as_bytes (section, file, FALSE);
11456
11457       if (dump_sects[i] & RELOC_DUMP)
11458         dump_section_as_bytes (section, file, TRUE);
11459
11460       if (dump_sects[i] & STRING_DUMP)
11461         dump_section_as_strings (section, file);
11462
11463       if (dump_sects[i] & DEBUG_DUMP)
11464         display_debug_section (i, section, file);
11465     }
11466
11467   /* Check to see if the user requested a
11468      dump of a section that does not exist.  */
11469   while (i++ < num_dump_sects)
11470     if (dump_sects[i])
11471       warn (_("Section %d was not dumped because it does not exist!\n"), i);
11472 }
11473
11474 static void
11475 process_mips_fpe_exception (int mask)
11476 {
11477   if (mask)
11478     {
11479       int first = 1;
11480       if (mask & OEX_FPU_INEX)
11481         fputs ("INEX", stdout), first = 0;
11482       if (mask & OEX_FPU_UFLO)
11483         printf ("%sUFLO", first ? "" : "|"), first = 0;
11484       if (mask & OEX_FPU_OFLO)
11485         printf ("%sOFLO", first ? "" : "|"), first = 0;
11486       if (mask & OEX_FPU_DIV0)
11487         printf ("%sDIV0", first ? "" : "|"), first = 0;
11488       if (mask & OEX_FPU_INVAL)
11489         printf ("%sINVAL", first ? "" : "|");
11490     }
11491   else
11492     fputs ("0", stdout);
11493 }
11494
11495 /* Display's the value of TAG at location P.  If TAG is
11496    greater than 0 it is assumed to be an unknown tag, and
11497    a message is printed to this effect.  Otherwise it is
11498    assumed that a message has already been printed.
11499
11500    If the bottom bit of TAG is set it assumed to have a
11501    string value, otherwise it is assumed to have an integer
11502    value.
11503
11504    Returns an updated P pointing to the first unread byte
11505    beyond the end of TAG's value.
11506
11507    Reads at or beyond END will not be made.  */
11508
11509 static unsigned char *
11510 display_tag_value (int tag,
11511                    unsigned char * p,
11512                    const unsigned char * const end)
11513 {
11514   unsigned long val;
11515
11516   if (tag > 0)
11517     printf ("  Tag_unknown_%d: ", tag);
11518
11519   if (p >= end)
11520     {
11521       warn (_("corrupt tag\n"));
11522     }
11523   else if (tag & 1)
11524     {
11525       /* FIXME: we could read beyond END here.  */
11526       printf ("\"%s\"\n", p);
11527       p += strlen ((char *) p) + 1;
11528     }
11529   else
11530     {
11531       unsigned int len;
11532
11533       val = read_uleb128 (p, &len, end);
11534       p += len;
11535       printf ("%ld (0x%lx)\n", val, val);
11536     }
11537
11538   return p;
11539 }
11540
11541 /* ARM EABI attributes section.  */
11542 typedef struct
11543 {
11544   int tag;
11545   const char * name;
11546   /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup.  */
11547   int type;
11548   const char ** table;
11549 } arm_attr_public_tag;
11550
11551 static const char * arm_attr_tag_CPU_arch[] =
11552   {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
11553    "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8"};
11554 static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
11555 static const char * arm_attr_tag_THUMB_ISA_use[] =
11556   {"No", "Thumb-1", "Thumb-2"};
11557 static const char * arm_attr_tag_FP_arch[] =
11558   {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
11559    "FP for ARMv8"};
11560 static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
11561 static const char * arm_attr_tag_Advanced_SIMD_arch[] =
11562   {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8"};
11563 static const char * arm_attr_tag_PCS_config[] =
11564   {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
11565    "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
11566 static const char * arm_attr_tag_ABI_PCS_R9_use[] =
11567   {"V6", "SB", "TLS", "Unused"};
11568 static const char * arm_attr_tag_ABI_PCS_RW_data[] =
11569   {"Absolute", "PC-relative", "SB-relative", "None"};
11570 static const char * arm_attr_tag_ABI_PCS_RO_data[] =
11571   {"Absolute", "PC-relative", "None"};
11572 static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
11573   {"None", "direct", "GOT-indirect"};
11574 static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
11575   {"None", "??? 1", "2", "??? 3", "4"};
11576 static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
11577 static const char * arm_attr_tag_ABI_FP_denormal[] =
11578   {"Unused", "Needed", "Sign only"};
11579 static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
11580 static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
11581 static const char * arm_attr_tag_ABI_FP_number_model[] =
11582   {"Unused", "Finite", "RTABI", "IEEE 754"};
11583 static const char * arm_attr_tag_ABI_enum_size[] =
11584   {"Unused", "small", "int", "forced to int"};
11585 static const char * arm_attr_tag_ABI_HardFP_use[] =
11586   {"As Tag_FP_arch", "SP only", "DP only", "SP and DP"};
11587 static const char * arm_attr_tag_ABI_VFP_args[] =
11588   {"AAPCS", "VFP registers", "custom"};
11589 static const char * arm_attr_tag_ABI_WMMX_args[] =
11590   {"AAPCS", "WMMX registers", "custom"};
11591 static const char * arm_attr_tag_ABI_optimization_goals[] =
11592   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
11593     "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
11594 static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
11595   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
11596     "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
11597 static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
11598 static const char * arm_attr_tag_FP_HP_extension[] =
11599   {"Not Allowed", "Allowed"};
11600 static const char * arm_attr_tag_ABI_FP_16bit_format[] =
11601   {"None", "IEEE 754", "Alternative Format"};
11602 static const char * arm_attr_tag_MPextension_use[] =
11603   {"Not Allowed", "Allowed"};
11604 static const char * arm_attr_tag_DIV_use[] =
11605   {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
11606     "Allowed in v7-A with integer division extension"};
11607 static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
11608 static const char * arm_attr_tag_Virtualization_use[] =
11609   {"Not Allowed", "TrustZone", "Virtualization Extensions",
11610     "TrustZone and Virtualization Extensions"};
11611 static const char * arm_attr_tag_MPextension_use_legacy[] =
11612   {"Not Allowed", "Allowed"};
11613
11614 #define LOOKUP(id, name) \
11615   {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
11616 static arm_attr_public_tag arm_attr_public_tags[] =
11617 {
11618   {4, "CPU_raw_name", 1, NULL},
11619   {5, "CPU_name", 1, NULL},
11620   LOOKUP(6, CPU_arch),
11621   {7, "CPU_arch_profile", 0, NULL},
11622   LOOKUP(8, ARM_ISA_use),
11623   LOOKUP(9, THUMB_ISA_use),
11624   LOOKUP(10, FP_arch),
11625   LOOKUP(11, WMMX_arch),
11626   LOOKUP(12, Advanced_SIMD_arch),
11627   LOOKUP(13, PCS_config),
11628   LOOKUP(14, ABI_PCS_R9_use),
11629   LOOKUP(15, ABI_PCS_RW_data),
11630   LOOKUP(16, ABI_PCS_RO_data),
11631   LOOKUP(17, ABI_PCS_GOT_use),
11632   LOOKUP(18, ABI_PCS_wchar_t),
11633   LOOKUP(19, ABI_FP_rounding),
11634   LOOKUP(20, ABI_FP_denormal),
11635   LOOKUP(21, ABI_FP_exceptions),
11636   LOOKUP(22, ABI_FP_user_exceptions),
11637   LOOKUP(23, ABI_FP_number_model),
11638   {24, "ABI_align_needed", 0, NULL},
11639   {25, "ABI_align_preserved", 0, NULL},
11640   LOOKUP(26, ABI_enum_size),
11641   LOOKUP(27, ABI_HardFP_use),
11642   LOOKUP(28, ABI_VFP_args),
11643   LOOKUP(29, ABI_WMMX_args),
11644   LOOKUP(30, ABI_optimization_goals),
11645   LOOKUP(31, ABI_FP_optimization_goals),
11646   {32, "compatibility", 0, NULL},
11647   LOOKUP(34, CPU_unaligned_access),
11648   LOOKUP(36, FP_HP_extension),
11649   LOOKUP(38, ABI_FP_16bit_format),
11650   LOOKUP(42, MPextension_use),
11651   LOOKUP(44, DIV_use),
11652   {64, "nodefaults", 0, NULL},
11653   {65, "also_compatible_with", 0, NULL},
11654   LOOKUP(66, T2EE_use),
11655   {67, "conformance", 1, NULL},
11656   LOOKUP(68, Virtualization_use),
11657   LOOKUP(70, MPextension_use_legacy)
11658 };
11659 #undef LOOKUP
11660
11661 static unsigned char *
11662 display_arm_attribute (unsigned char * p,
11663                        const unsigned char * const end)
11664 {
11665   int tag;
11666   unsigned int len;
11667   int val;
11668   arm_attr_public_tag * attr;
11669   unsigned i;
11670   int type;
11671
11672   tag = read_uleb128 (p, &len, end);
11673   p += len;
11674   attr = NULL;
11675   for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
11676     {
11677       if (arm_attr_public_tags[i].tag == tag)
11678         {
11679           attr = &arm_attr_public_tags[i];
11680           break;
11681         }
11682     }
11683
11684   if (attr)
11685     {
11686       printf ("  Tag_%s: ", attr->name);
11687       switch (attr->type)
11688         {
11689         case 0:
11690           switch (tag)
11691             {
11692             case 7: /* Tag_CPU_arch_profile.  */
11693               val = read_uleb128 (p, &len, end);
11694               p += len;
11695               switch (val)
11696                 {
11697                 case 0: printf (_("None\n")); break;
11698                 case 'A': printf (_("Application\n")); break;
11699                 case 'R': printf (_("Realtime\n")); break;
11700                 case 'M': printf (_("Microcontroller\n")); break;
11701                 case 'S': printf (_("Application or Realtime\n")); break;
11702                 default: printf ("??? (%d)\n", val); break;
11703                 }
11704               break;
11705
11706             case 24: /* Tag_align_needed.  */
11707               val = read_uleb128 (p, &len, end);
11708               p += len;
11709               switch (val)
11710                 {
11711                 case 0: printf (_("None\n")); break;
11712                 case 1: printf (_("8-byte\n")); break;
11713                 case 2: printf (_("4-byte\n")); break;
11714                 case 3: printf ("??? 3\n"); break;
11715                 default:
11716                   if (val <= 12)
11717                     printf (_("8-byte and up to %d-byte extended\n"),
11718                             1 << val);
11719                   else
11720                     printf ("??? (%d)\n", val);
11721                   break;
11722                 }
11723               break;
11724
11725             case 25: /* Tag_align_preserved.  */
11726               val = read_uleb128 (p, &len, end);
11727               p += len;
11728               switch (val)
11729                 {
11730                 case 0: printf (_("None\n")); break;
11731                 case 1: printf (_("8-byte, except leaf SP\n")); break;
11732                 case 2: printf (_("8-byte\n")); break;
11733                 case 3: printf ("??? 3\n"); break;
11734                 default:
11735                   if (val <= 12)
11736                     printf (_("8-byte and up to %d-byte extended\n"),
11737                             1 << val);
11738                   else
11739                     printf ("??? (%d)\n", val);
11740                   break;
11741                 }
11742               break;
11743
11744             case 32: /* Tag_compatibility.  */
11745               val = read_uleb128 (p, &len, end);
11746               p += len;
11747               printf (_("flag = %d, vendor = %s\n"), val, p);
11748               p += strlen ((char *) p) + 1;
11749               break;
11750
11751             case 64: /* Tag_nodefaults.  */
11752               p++;
11753               printf (_("True\n"));
11754               break;
11755
11756             case 65: /* Tag_also_compatible_with.  */
11757               val = read_uleb128 (p, &len, end);
11758               p += len;
11759               if (val == 6 /* Tag_CPU_arch.  */)
11760                 {
11761                   val = read_uleb128 (p, &len, end);
11762                   p += len;
11763                   if ((unsigned int)val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
11764                     printf ("??? (%d)\n", val);
11765                   else
11766                     printf ("%s\n", arm_attr_tag_CPU_arch[val]);
11767                 }
11768               else
11769                 printf ("???\n");
11770               while (*(p++) != '\0' /* NUL terminator.  */);
11771               break;
11772
11773             default:
11774               abort ();
11775             }
11776           return p;
11777
11778         case 1:
11779           return display_tag_value (-1, p, end);
11780         case 2:
11781           return display_tag_value (0, p, end);
11782
11783         default:
11784           assert (attr->type & 0x80);
11785           val = read_uleb128 (p, &len, end);
11786           p += len;
11787           type = attr->type & 0x7f;
11788           if (val >= type)
11789             printf ("??? (%d)\n", val);
11790           else
11791             printf ("%s\n", attr->table[val]);
11792           return p;
11793         }
11794     }
11795
11796   return display_tag_value (tag, p, end);
11797 }
11798
11799 static unsigned char *
11800 display_gnu_attribute (unsigned char * p,
11801                        unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const),
11802                        const unsigned char * const end)
11803 {
11804   int tag;
11805   unsigned int len;
11806   int val;
11807
11808   tag = read_uleb128 (p, &len, end);
11809   p += len;
11810
11811   /* Tag_compatibility is the only generic GNU attribute defined at
11812      present.  */
11813   if (tag == 32)
11814     {
11815       val = read_uleb128 (p, &len, end);
11816       p += len;
11817       if (p == end)
11818         {
11819           printf (_("flag = %d, vendor = <corrupt>\n"), val);
11820           warn (_("corrupt vendor attribute\n"));
11821         }
11822       else
11823         {
11824           printf (_("flag = %d, vendor = %s\n"), val, p);
11825           p += strlen ((char *) p) + 1;
11826         }
11827       return p;
11828     }
11829
11830   if ((tag & 2) == 0 && display_proc_gnu_attribute)
11831     return display_proc_gnu_attribute (p, tag, end);
11832
11833   return display_tag_value (tag, p, end);
11834 }
11835
11836 static unsigned char *
11837 display_power_gnu_attribute (unsigned char * p,
11838                              int tag,
11839                              const unsigned char * const end)
11840 {
11841   unsigned int len;
11842   int val;
11843
11844   if (tag == Tag_GNU_Power_ABI_FP)
11845     {
11846       val = read_uleb128 (p, &len, end);
11847       p += len;
11848       printf ("  Tag_GNU_Power_ABI_FP: ");
11849
11850       switch (val)
11851         {
11852         case 0:
11853           printf (_("Hard or soft float\n"));
11854           break;
11855         case 1:
11856           printf (_("Hard float\n"));
11857           break;
11858         case 2:
11859           printf (_("Soft float\n"));
11860           break;
11861         case 3:
11862           printf (_("Single-precision hard float\n"));
11863           break;
11864         default:
11865           printf ("??? (%d)\n", val);
11866           break;
11867         }
11868       return p;
11869    }
11870
11871   if (tag == Tag_GNU_Power_ABI_Vector)
11872     {
11873       val = read_uleb128 (p, &len, end);
11874       p += len;
11875       printf ("  Tag_GNU_Power_ABI_Vector: ");
11876       switch (val)
11877         {
11878         case 0:
11879           printf (_("Any\n"));
11880           break;
11881         case 1:
11882           printf (_("Generic\n"));
11883           break;
11884         case 2:
11885           printf ("AltiVec\n");
11886           break;
11887         case 3:
11888           printf ("SPE\n");
11889           break;
11890         default:
11891           printf ("??? (%d)\n", val);
11892           break;
11893         }
11894       return p;
11895    }
11896
11897   if (tag == Tag_GNU_Power_ABI_Struct_Return)
11898     {
11899       if (p == end)
11900         {
11901           warn (_("corrupt Tag_GNU_Power_ABI_Struct_Return"));
11902           return p;
11903         }
11904
11905       val = read_uleb128 (p, &len, end);
11906       p += len;
11907       printf ("  Tag_GNU_Power_ABI_Struct_Return: ");
11908       switch (val)
11909        {
11910        case 0:
11911          printf (_("Any\n"));
11912          break;
11913        case 1:
11914          printf ("r3/r4\n");
11915          break;
11916        case 2:
11917          printf (_("Memory\n"));
11918          break;
11919        default:
11920          printf ("??? (%d)\n", val);
11921          break;
11922        }
11923       return p;
11924     }
11925
11926   return display_tag_value (tag & 1, p, end);
11927 }
11928
11929 static void
11930 display_sparc_hwcaps (int mask)
11931 {
11932   if (mask)
11933     {
11934       int first = 1;
11935       if (mask & ELF_SPARC_HWCAP_MUL32)
11936         fputs ("mul32", stdout), first = 0;
11937       if (mask & ELF_SPARC_HWCAP_DIV32)
11938         printf ("%sdiv32", first ? "" : "|"), first = 0;
11939       if (mask & ELF_SPARC_HWCAP_FSMULD)
11940         printf ("%sfsmuld", first ? "" : "|"), first = 0;
11941       if (mask & ELF_SPARC_HWCAP_V8PLUS)
11942         printf ("%sv8plus", first ? "" : "|"), first = 0;
11943       if (mask & ELF_SPARC_HWCAP_POPC)
11944         printf ("%spopc", first ? "" : "|"), first = 0;
11945       if (mask & ELF_SPARC_HWCAP_VIS)
11946         printf ("%svis", first ? "" : "|"), first = 0;
11947       if (mask & ELF_SPARC_HWCAP_VIS2)
11948         printf ("%svis2", first ? "" : "|"), first = 0;
11949       if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
11950         printf ("%sASIBlkInit", first ? "" : "|"), first = 0;
11951       if (mask & ELF_SPARC_HWCAP_FMAF)
11952         printf ("%sfmaf", first ? "" : "|"), first = 0;
11953       if (mask & ELF_SPARC_HWCAP_VIS3)
11954         printf ("%svis3", first ? "" : "|"), first = 0;
11955       if (mask & ELF_SPARC_HWCAP_HPC)
11956         printf ("%shpc", first ? "" : "|"), first = 0;
11957       if (mask & ELF_SPARC_HWCAP_RANDOM)
11958         printf ("%srandom", first ? "" : "|"), first = 0;
11959       if (mask & ELF_SPARC_HWCAP_TRANS)
11960         printf ("%strans", first ? "" : "|"), first = 0;
11961       if (mask & ELF_SPARC_HWCAP_FJFMAU)
11962         printf ("%sfjfmau", first ? "" : "|"), first = 0;
11963       if (mask & ELF_SPARC_HWCAP_IMA)
11964         printf ("%sima", first ? "" : "|"), first = 0;
11965       if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
11966         printf ("%scspare", first ? "" : "|"), first = 0;
11967     }
11968   else
11969     fputc('0', stdout);
11970   fputc('\n', stdout);
11971 }
11972
11973 static unsigned char *
11974 display_sparc_gnu_attribute (unsigned char * p,
11975                              int tag,
11976                              const unsigned char * const end)
11977 {
11978   if (tag == Tag_GNU_Sparc_HWCAPS)
11979     {
11980       unsigned int len;
11981       int val;
11982
11983       val = read_uleb128 (p, &len, end);
11984       p += len;
11985       printf ("  Tag_GNU_Sparc_HWCAPS: ");
11986       display_sparc_hwcaps (val);
11987       return p;
11988    }
11989
11990   return display_tag_value (tag, p, end);
11991 }
11992
11993 static unsigned char *
11994 display_mips_gnu_attribute (unsigned char * p,
11995                             int tag,
11996                             const unsigned char * const end)
11997 {
11998   if (tag == Tag_GNU_MIPS_ABI_FP)
11999     {
12000       unsigned int len;
12001       int val;
12002
12003       val = read_uleb128 (p, &len, end);
12004       p += len;
12005       printf ("  Tag_GNU_MIPS_ABI_FP: ");
12006
12007       switch (val)
12008         {
12009         case Val_GNU_MIPS_ABI_FP_ANY:
12010           printf (_("Hard or soft float\n"));
12011           break;
12012         case Val_GNU_MIPS_ABI_FP_DOUBLE:
12013           printf (_("Hard float (double precision)\n"));
12014           break;
12015         case Val_GNU_MIPS_ABI_FP_SINGLE:
12016           printf (_("Hard float (single precision)\n"));
12017           break;
12018         case Val_GNU_MIPS_ABI_FP_SOFT:
12019           printf (_("Soft float\n"));
12020           break;
12021         case Val_GNU_MIPS_ABI_FP_64:
12022           printf (_("Hard float (MIPS32r2 64-bit FPU)\n"));
12023           break;
12024         default:
12025           printf ("??? (%d)\n", val);
12026           break;
12027         }
12028       return p;
12029    }
12030
12031   if (tag == Tag_GNU_MIPS_ABI_MSA)
12032     {
12033       unsigned int len;
12034       int val;
12035
12036       val = read_uleb128 (p, &len, end);
12037       p += len;
12038       printf ("  Tag_GNU_MIPS_ABI_MSA: ");
12039
12040       switch (val)
12041         {
12042         case Val_GNU_MIPS_ABI_MSA_ANY:
12043           printf (_("Any MSA or not\n"));
12044           break;
12045         case Val_GNU_MIPS_ABI_MSA_128:
12046           printf (_("128-bit MSA\n"));
12047           break;
12048         default:
12049           printf ("??? (%d)\n", val);
12050           break;
12051         }
12052       return p;
12053     }
12054
12055   return display_tag_value (tag & 1, p, end);
12056 }
12057
12058 static unsigned char *
12059 display_tic6x_attribute (unsigned char * p,
12060                          const unsigned char * const end)
12061 {
12062   int tag;
12063   unsigned int len;
12064   int val;
12065
12066   tag = read_uleb128 (p, &len, end);
12067   p += len;
12068
12069   switch (tag)
12070     {
12071     case Tag_ISA:
12072       val = read_uleb128 (p, &len, end);
12073       p += len;
12074       printf ("  Tag_ISA: ");
12075
12076       switch (val)
12077         {
12078         case C6XABI_Tag_ISA_none:
12079           printf (_("None\n"));
12080           break;
12081         case C6XABI_Tag_ISA_C62X:
12082           printf ("C62x\n");
12083           break;
12084         case C6XABI_Tag_ISA_C67X:
12085           printf ("C67x\n");
12086           break;
12087         case C6XABI_Tag_ISA_C67XP:
12088           printf ("C67x+\n");
12089           break;
12090         case C6XABI_Tag_ISA_C64X:
12091           printf ("C64x\n");
12092           break;
12093         case C6XABI_Tag_ISA_C64XP:
12094           printf ("C64x+\n");
12095           break;
12096         case C6XABI_Tag_ISA_C674X:
12097           printf ("C674x\n");
12098           break;
12099         default:
12100           printf ("??? (%d)\n", val);
12101           break;
12102         }
12103       return p;
12104
12105     case Tag_ABI_wchar_t:
12106       val = read_uleb128 (p, &len, end);
12107       p += len;
12108       printf ("  Tag_ABI_wchar_t: ");
12109       switch (val)
12110         {
12111         case 0:
12112           printf (_("Not used\n"));
12113           break;
12114         case 1:
12115           printf (_("2 bytes\n"));
12116           break;
12117         case 2:
12118           printf (_("4 bytes\n"));
12119           break;
12120         default:
12121           printf ("??? (%d)\n", val);
12122           break;
12123         }
12124       return p;
12125
12126     case Tag_ABI_stack_align_needed:
12127       val = read_uleb128 (p, &len, end);
12128       p += len;
12129       printf ("  Tag_ABI_stack_align_needed: ");
12130       switch (val)
12131         {
12132         case 0:
12133           printf (_("8-byte\n"));
12134           break;
12135         case 1:
12136           printf (_("16-byte\n"));
12137           break;
12138         default:
12139           printf ("??? (%d)\n", val);
12140           break;
12141         }
12142       return p;
12143
12144     case Tag_ABI_stack_align_preserved:
12145       val = read_uleb128 (p, &len, end);
12146       p += len;
12147       printf ("  Tag_ABI_stack_align_preserved: ");
12148       switch (val)
12149         {
12150         case 0:
12151           printf (_("8-byte\n"));
12152           break;
12153         case 1:
12154           printf (_("16-byte\n"));
12155           break;
12156         default:
12157           printf ("??? (%d)\n", val);
12158           break;
12159         }
12160       return p;
12161
12162     case Tag_ABI_DSBT:
12163       val = read_uleb128 (p, &len, end);
12164       p += len;
12165       printf ("  Tag_ABI_DSBT: ");
12166       switch (val)
12167         {
12168         case 0:
12169           printf (_("DSBT addressing not used\n"));
12170           break;
12171         case 1:
12172           printf (_("DSBT addressing used\n"));
12173           break;
12174         default:
12175           printf ("??? (%d)\n", val);
12176           break;
12177         }
12178       return p;
12179
12180     case Tag_ABI_PID:
12181       val = read_uleb128 (p, &len, end);
12182       p += len;
12183       printf ("  Tag_ABI_PID: ");
12184       switch (val)
12185         {
12186         case 0:
12187           printf (_("Data addressing position-dependent\n"));
12188           break;
12189         case 1:
12190           printf (_("Data addressing position-independent, GOT near DP\n"));
12191           break;
12192         case 2:
12193           printf (_("Data addressing position-independent, GOT far from DP\n"));
12194           break;
12195         default:
12196           printf ("??? (%d)\n", val);
12197           break;
12198         }
12199       return p;
12200
12201     case Tag_ABI_PIC:
12202       val = read_uleb128 (p, &len, end);
12203       p += len;
12204       printf ("  Tag_ABI_PIC: ");
12205       switch (val)
12206         {
12207         case 0:
12208           printf (_("Code addressing position-dependent\n"));
12209           break;
12210         case 1:
12211           printf (_("Code addressing position-independent\n"));
12212           break;
12213         default:
12214           printf ("??? (%d)\n", val);
12215           break;
12216         }
12217       return p;
12218
12219     case Tag_ABI_array_object_alignment:
12220       val = read_uleb128 (p, &len, end);
12221       p += len;
12222       printf ("  Tag_ABI_array_object_alignment: ");
12223       switch (val)
12224         {
12225         case 0:
12226           printf (_("8-byte\n"));
12227           break;
12228         case 1:
12229           printf (_("4-byte\n"));
12230           break;
12231         case 2:
12232           printf (_("16-byte\n"));
12233           break;
12234         default:
12235           printf ("??? (%d)\n", val);
12236           break;
12237         }
12238       return p;
12239
12240     case Tag_ABI_array_object_align_expected:
12241       val = read_uleb128 (p, &len, end);
12242       p += len;
12243       printf ("  Tag_ABI_array_object_align_expected: ");
12244       switch (val)
12245         {
12246         case 0:
12247           printf (_("8-byte\n"));
12248           break;
12249         case 1:
12250           printf (_("4-byte\n"));
12251           break;
12252         case 2:
12253           printf (_("16-byte\n"));
12254           break;
12255         default:
12256           printf ("??? (%d)\n", val);
12257           break;
12258         }
12259       return p;
12260
12261     case Tag_ABI_compatibility:
12262       val = read_uleb128 (p, &len, end);
12263       p += len;
12264       printf ("  Tag_ABI_compatibility: ");
12265       printf (_("flag = %d, vendor = %s\n"), val, p);
12266       p += strlen ((char *) p) + 1;
12267       return p;
12268
12269     case Tag_ABI_conformance:
12270       printf ("  Tag_ABI_conformance: ");
12271       printf ("\"%s\"\n", p);
12272       p += strlen ((char *) p) + 1;
12273       return p;
12274     }
12275
12276   return display_tag_value (tag, p, end);
12277 }
12278
12279 static void
12280 display_raw_attribute (unsigned char * p, unsigned char * end)
12281 {
12282   unsigned long addr = 0;
12283   size_t bytes = end - p;
12284
12285   while (bytes)
12286     {
12287       int j;
12288       int k;
12289       int lbytes = (bytes > 16 ? 16 : bytes);
12290
12291       printf ("  0x%8.8lx ", addr);
12292
12293       for (j = 0; j < 16; j++)
12294         {
12295           if (j < lbytes)
12296             printf ("%2.2x", p[j]);
12297           else
12298             printf ("  ");
12299
12300           if ((j & 3) == 3)
12301             printf (" ");
12302         }
12303
12304       for (j = 0; j < lbytes; j++)
12305         {
12306           k = p[j];
12307           if (k >= ' ' && k < 0x7f)
12308             printf ("%c", k);
12309           else
12310             printf (".");
12311         }
12312
12313       putchar ('\n');
12314
12315       p  += lbytes;
12316       bytes -= lbytes;
12317       addr += lbytes;
12318     }
12319
12320   putchar ('\n');
12321 }
12322
12323 static unsigned char *
12324 display_msp430x_attribute (unsigned char * p,
12325                            const unsigned char * const end)
12326 {
12327   unsigned int len;
12328   int val;
12329   int tag;
12330
12331   tag = read_uleb128 (p, & len, end);
12332   p += len;
12333
12334   switch (tag)
12335     {
12336     case OFBA_MSPABI_Tag_ISA:
12337       val = read_uleb128 (p, &len, end);
12338       p += len;
12339       printf ("  Tag_ISA: ");
12340       switch (val)
12341         {
12342         case 0: printf (_("None\n")); break;
12343         case 1: printf (_("MSP430\n")); break;
12344         case 2: printf (_("MSP430X\n")); break;
12345         default: printf ("??? (%d)\n", val); break;
12346         }
12347       break;
12348
12349     case OFBA_MSPABI_Tag_Code_Model:
12350       val = read_uleb128 (p, &len, end);
12351       p += len;
12352       printf ("  Tag_Code_Model: ");
12353       switch (val)
12354         {
12355         case 0: printf (_("None\n")); break;
12356         case 1: printf (_("Small\n")); break;
12357         case 2: printf (_("Large\n")); break;
12358         default: printf ("??? (%d)\n", val); break;
12359         }
12360       break;
12361
12362     case OFBA_MSPABI_Tag_Data_Model:
12363       val = read_uleb128 (p, &len, end);
12364       p += len;
12365       printf ("  Tag_Data_Model: ");
12366       switch (val)
12367         {
12368         case 0: printf (_("None\n")); break;
12369         case 1: printf (_("Small\n")); break;
12370         case 2: printf (_("Large\n")); break;
12371         case 3: printf (_("Restricted Large\n")); break;
12372         default: printf ("??? (%d)\n", val); break;
12373         }
12374       break;
12375
12376     default:
12377       printf (_("  <unknown tag %d>: "), tag);
12378
12379       if (tag & 1)
12380         {
12381           printf ("\"%s\"\n", p);
12382           p += strlen ((char *) p) + 1;
12383         }
12384       else
12385         {
12386           val = read_uleb128 (p, &len, end);
12387           p += len;
12388           printf ("%d (0x%x)\n", val, val);
12389         }
12390       break;
12391    }
12392
12393   return p;
12394 }
12395
12396 static int
12397 process_attributes (FILE * file,
12398                     const char * public_name,
12399                     unsigned int proc_type,
12400                     unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
12401                     unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const))
12402 {
12403   Elf_Internal_Shdr * sect;
12404   unsigned char * contents;
12405   unsigned char * p;
12406   unsigned char * end;
12407   bfd_vma section_len;
12408   bfd_vma len;
12409   unsigned i;
12410
12411   /* Find the section header so that we get the size.  */
12412   for (i = 0, sect = section_headers;
12413        i < elf_header.e_shnum;
12414        i++, sect++)
12415     {
12416       if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
12417         continue;
12418
12419       contents = (unsigned char *) get_data (NULL, file, sect->sh_offset, 1,
12420                                              sect->sh_size, _("attributes"));
12421       if (contents == NULL)
12422         continue;
12423
12424       p = contents;
12425       if (*p == 'A')
12426         {
12427           len = sect->sh_size - 1;
12428           p++;
12429
12430           while (len > 0)
12431             {
12432               unsigned int namelen;
12433               bfd_boolean public_section;
12434               bfd_boolean gnu_section;
12435
12436               section_len = byte_get (p, 4);
12437               p += 4;
12438
12439               if (section_len > len)
12440                 {
12441                   error (_("Length of attribute (%u) greater than length of section (%u)\n"),
12442                           (unsigned) section_len, (unsigned) len);
12443                   section_len = len;
12444                 }
12445
12446               len -= section_len;
12447               section_len -= 4;
12448
12449               namelen = strnlen ((char *) p, section_len) + 1;
12450               if (namelen == 0 || namelen >= section_len)
12451                 {
12452                   error (_("Corrupt attribute section name\n"));
12453                   break;
12454                 }
12455
12456               printf (_("Attribute Section: %s\n"), p);
12457
12458               if (public_name && streq ((char *) p, public_name))
12459                 public_section = TRUE;
12460               else
12461                 public_section = FALSE;
12462
12463               if (streq ((char *) p, "gnu"))
12464                 gnu_section = TRUE;
12465               else
12466                 gnu_section = FALSE;
12467
12468               p += namelen;
12469               section_len -= namelen;
12470               while (section_len > 0)
12471                 {
12472                   int tag = *(p++);
12473                   int val;
12474                   bfd_vma size;
12475
12476                   size = byte_get (p, 4);
12477                   if (size > section_len)
12478                     {
12479                       error (_("Bad subsection length (%u > %u)\n"),
12480                               (unsigned) size, (unsigned) section_len);
12481                       size = section_len;
12482                     }
12483
12484                   section_len -= size;
12485                   end = p + size - 1;
12486                   p += 4;
12487
12488                   switch (tag)
12489                     {
12490                     case 1:
12491                       printf (_("File Attributes\n"));
12492                       break;
12493                     case 2:
12494                       printf (_("Section Attributes:"));
12495                       goto do_numlist;
12496                     case 3:
12497                       printf (_("Symbol Attributes:"));
12498                     do_numlist:
12499                       for (;;)
12500                         {
12501                           unsigned int j;
12502
12503                           val = read_uleb128 (p, &j, end);
12504                           p += j;
12505                           if (val == 0)
12506                             break;
12507                           printf (" %d", val);
12508                         }
12509                       printf ("\n");
12510                       break;
12511                     default:
12512                       printf (_("Unknown tag: %d\n"), tag);
12513                       public_section = FALSE;
12514                       break;
12515                     }
12516
12517                   if (public_section)
12518                     {
12519                       while (p < end)
12520                         p = display_pub_attribute (p, end);
12521                     }
12522                   else if (gnu_section)
12523                     {
12524                       while (p < end)
12525                         p = display_gnu_attribute (p,
12526                                                    display_proc_gnu_attribute,
12527                                                    end);
12528                     }
12529                   else
12530                     {
12531                       printf (_("  Unknown section contexts\n"));
12532                       display_raw_attribute (p, end);
12533                       p = end;
12534                     }
12535                 }
12536             }
12537         }
12538       else
12539         printf (_("Unknown format '%c' (%d)\n"), *p, *p);
12540
12541       free (contents);
12542     }
12543   return 1;
12544 }
12545
12546 static int
12547 process_arm_specific (FILE * file)
12548 {
12549   return process_attributes (file, "aeabi", SHT_ARM_ATTRIBUTES,
12550                              display_arm_attribute, NULL);
12551 }
12552
12553 static int
12554 process_power_specific (FILE * file)
12555 {
12556   return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
12557                              display_power_gnu_attribute);
12558 }
12559
12560 static int
12561 process_sparc_specific (FILE * file)
12562 {
12563   return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
12564                              display_sparc_gnu_attribute);
12565 }
12566
12567 static int
12568 process_tic6x_specific (FILE * file)
12569 {
12570   return process_attributes (file, "c6xabi", SHT_C6000_ATTRIBUTES,
12571                              display_tic6x_attribute, NULL);
12572 }
12573
12574 static int
12575 process_msp430x_specific (FILE * file)
12576 {
12577   return process_attributes (file, "mspabi", SHT_MSP430_ATTRIBUTES,
12578                              display_msp430x_attribute, NULL);
12579 }
12580
12581 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
12582    Print the Address, Access and Initial fields of an entry at VMA ADDR
12583    and return the VMA of the next entry.  */
12584
12585 static bfd_vma
12586 print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
12587 {
12588   printf ("  ");
12589   print_vma (addr, LONG_HEX);
12590   printf (" ");
12591   if (addr < pltgot + 0xfff0)
12592     printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
12593   else
12594     printf ("%10s", "");
12595   printf (" ");
12596   if (data == NULL)
12597     printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
12598   else
12599     {
12600       bfd_vma entry;
12601
12602       entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
12603       print_vma (entry, LONG_HEX);
12604     }
12605   return addr + (is_32bit_elf ? 4 : 8);
12606 }
12607
12608 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
12609    PLTGOT.  Print the Address and Initial fields of an entry at VMA
12610    ADDR and return the VMA of the next entry.  */
12611
12612 static bfd_vma
12613 print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
12614 {
12615   printf ("  ");
12616   print_vma (addr, LONG_HEX);
12617   printf (" ");
12618   if (data == NULL)
12619     printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
12620   else
12621     {
12622       bfd_vma entry;
12623
12624       entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
12625       print_vma (entry, LONG_HEX);
12626     }
12627   return addr + (is_32bit_elf ? 4 : 8);
12628 }
12629
12630 static int
12631 process_mips_specific (FILE * file)
12632 {
12633   Elf_Internal_Dyn * entry;
12634   size_t liblist_offset = 0;
12635   size_t liblistno = 0;
12636   size_t conflictsno = 0;
12637   size_t options_offset = 0;
12638   size_t conflicts_offset = 0;
12639   size_t pltrelsz = 0;
12640   size_t pltrel = 0;
12641   bfd_vma pltgot = 0;
12642   bfd_vma mips_pltgot = 0;
12643   bfd_vma jmprel = 0;
12644   bfd_vma local_gotno = 0;
12645   bfd_vma gotsym = 0;
12646   bfd_vma symtabno = 0;
12647
12648   process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
12649                       display_mips_gnu_attribute);
12650
12651   /* We have a lot of special sections.  Thanks SGI!  */
12652   if (dynamic_section == NULL)
12653     /* No information available.  */
12654     return 0;
12655
12656   for (entry = dynamic_section; entry->d_tag != DT_NULL; ++entry)
12657     switch (entry->d_tag)
12658       {
12659       case DT_MIPS_LIBLIST:
12660         liblist_offset
12661           = offset_from_vma (file, entry->d_un.d_val,
12662                              liblistno * sizeof (Elf32_External_Lib));
12663         break;
12664       case DT_MIPS_LIBLISTNO:
12665         liblistno = entry->d_un.d_val;
12666         break;
12667       case DT_MIPS_OPTIONS:
12668         options_offset = offset_from_vma (file, entry->d_un.d_val, 0);
12669         break;
12670       case DT_MIPS_CONFLICT:
12671         conflicts_offset
12672           = offset_from_vma (file, entry->d_un.d_val,
12673                              conflictsno * sizeof (Elf32_External_Conflict));
12674         break;
12675       case DT_MIPS_CONFLICTNO:
12676         conflictsno = entry->d_un.d_val;
12677         break;
12678       case DT_PLTGOT:
12679         pltgot = entry->d_un.d_ptr;
12680         break;
12681       case DT_MIPS_LOCAL_GOTNO:
12682         local_gotno = entry->d_un.d_val;
12683         break;
12684       case DT_MIPS_GOTSYM:
12685         gotsym = entry->d_un.d_val;
12686         break;
12687       case DT_MIPS_SYMTABNO:
12688         symtabno = entry->d_un.d_val;
12689         break;
12690       case DT_MIPS_PLTGOT:
12691         mips_pltgot = entry->d_un.d_ptr;
12692         break;
12693       case DT_PLTREL:
12694         pltrel = entry->d_un.d_val;
12695         break;
12696       case DT_PLTRELSZ:
12697         pltrelsz = entry->d_un.d_val;
12698         break;
12699       case DT_JMPREL:
12700         jmprel = entry->d_un.d_ptr;
12701         break;
12702       default:
12703         break;
12704       }
12705
12706   if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
12707     {
12708       Elf32_External_Lib * elib;
12709       size_t cnt;
12710
12711       elib = (Elf32_External_Lib *) get_data (NULL, file, liblist_offset,
12712                                               liblistno,
12713                                               sizeof (Elf32_External_Lib),
12714                                               _("liblist section data"));
12715       if (elib)
12716         {
12717           printf (_("\nSection '.liblist' contains %lu entries:\n"),
12718                   (unsigned long) liblistno);
12719           fputs (_("     Library              Time Stamp          Checksum   Version Flags\n"),
12720                  stdout);
12721
12722           for (cnt = 0; cnt < liblistno; ++cnt)
12723             {
12724               Elf32_Lib liblist;
12725               time_t atime;
12726               char timebuf[20];
12727               struct tm * tmp;
12728
12729               liblist.l_name = BYTE_GET (elib[cnt].l_name);
12730               atime = BYTE_GET (elib[cnt].l_time_stamp);
12731               liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
12732               liblist.l_version = BYTE_GET (elib[cnt].l_version);
12733               liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
12734
12735               tmp = gmtime (&atime);
12736               snprintf (timebuf, sizeof (timebuf),
12737                         "%04u-%02u-%02uT%02u:%02u:%02u",
12738                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
12739                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
12740
12741               printf ("%3lu: ", (unsigned long) cnt);
12742               if (VALID_DYNAMIC_NAME (liblist.l_name))
12743                 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
12744               else
12745                 printf (_("<corrupt: %9ld>"), liblist.l_name);
12746               printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
12747                       liblist.l_version);
12748
12749               if (liblist.l_flags == 0)
12750                 puts (_(" NONE"));
12751               else
12752                 {
12753                   static const struct
12754                   {
12755                     const char * name;
12756                     int bit;
12757                   }
12758                   l_flags_vals[] =
12759                   {
12760                     { " EXACT_MATCH", LL_EXACT_MATCH },
12761                     { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
12762                     { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
12763                     { " EXPORTS", LL_EXPORTS },
12764                     { " DELAY_LOAD", LL_DELAY_LOAD },
12765                     { " DELTA", LL_DELTA }
12766                   };
12767                   int flags = liblist.l_flags;
12768                   size_t fcnt;
12769
12770                   for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
12771                     if ((flags & l_flags_vals[fcnt].bit) != 0)
12772                       {
12773                         fputs (l_flags_vals[fcnt].name, stdout);
12774                         flags ^= l_flags_vals[fcnt].bit;
12775                       }
12776                   if (flags != 0)
12777                     printf (" %#x", (unsigned int) flags);
12778
12779                   puts ("");
12780                 }
12781             }
12782
12783           free (elib);
12784         }
12785     }
12786
12787   if (options_offset != 0)
12788     {
12789       Elf_External_Options * eopt;
12790       Elf_Internal_Shdr * sect = section_headers;
12791       Elf_Internal_Options * iopt;
12792       Elf_Internal_Options * option;
12793       size_t offset;
12794       int cnt;
12795
12796       /* Find the section header so that we get the size.  */
12797       while (sect->sh_type != SHT_MIPS_OPTIONS)
12798         ++sect;
12799
12800       eopt = (Elf_External_Options *) get_data (NULL, file, options_offset, 1,
12801                                                 sect->sh_size, _("options"));
12802       if (eopt)
12803         {
12804           iopt = (Elf_Internal_Options *)
12805               cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
12806           if (iopt == NULL)
12807             {
12808               error (_("Out of memory\n"));
12809               return 0;
12810             }
12811
12812           offset = cnt = 0;
12813           option = iopt;
12814
12815           while (offset < sect->sh_size)
12816             {
12817               Elf_External_Options * eoption;
12818
12819               eoption = (Elf_External_Options *) ((char *) eopt + offset);
12820
12821               option->kind = BYTE_GET (eoption->kind);
12822               option->size = BYTE_GET (eoption->size);
12823               option->section = BYTE_GET (eoption->section);
12824               option->info = BYTE_GET (eoption->info);
12825
12826               offset += option->size;
12827
12828               ++option;
12829               ++cnt;
12830             }
12831
12832           printf (_("\nSection '%s' contains %d entries:\n"),
12833                   SECTION_NAME (sect), cnt);
12834
12835           option = iopt;
12836
12837           while (cnt-- > 0)
12838             {
12839               size_t len;
12840
12841               switch (option->kind)
12842                 {
12843                 case ODK_NULL:
12844                   /* This shouldn't happen.  */
12845                   printf (" NULL       %d %lx", option->section, option->info);
12846                   break;
12847                 case ODK_REGINFO:
12848                   printf (" REGINFO    ");
12849                   if (elf_header.e_machine == EM_MIPS)
12850                     {
12851                       /* 32bit form.  */
12852                       Elf32_External_RegInfo * ereg;
12853                       Elf32_RegInfo reginfo;
12854
12855                       ereg = (Elf32_External_RegInfo *) (option + 1);
12856                       reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
12857                       reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
12858                       reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
12859                       reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
12860                       reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
12861                       reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
12862
12863                       printf ("GPR %08lx  GP 0x%lx\n",
12864                               reginfo.ri_gprmask,
12865                               (unsigned long) reginfo.ri_gp_value);
12866                       printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
12867                               reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
12868                               reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
12869                     }
12870                   else
12871                     {
12872                       /* 64 bit form.  */
12873                       Elf64_External_RegInfo * ereg;
12874                       Elf64_Internal_RegInfo reginfo;
12875
12876                       ereg = (Elf64_External_RegInfo *) (option + 1);
12877                       reginfo.ri_gprmask    = BYTE_GET (ereg->ri_gprmask);
12878                       reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
12879                       reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
12880                       reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
12881                       reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
12882                       reginfo.ri_gp_value   = BYTE_GET (ereg->ri_gp_value);
12883
12884                       printf ("GPR %08lx  GP 0x",
12885                               reginfo.ri_gprmask);
12886                       printf_vma (reginfo.ri_gp_value);
12887                       printf ("\n");
12888
12889                       printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
12890                               reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
12891                               reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
12892                     }
12893                   ++option;
12894                   continue;
12895                 case ODK_EXCEPTIONS:
12896                   fputs (" EXCEPTIONS fpe_min(", stdout);
12897                   process_mips_fpe_exception (option->info & OEX_FPU_MIN);
12898                   fputs (") fpe_max(", stdout);
12899                   process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
12900                   fputs (")", stdout);
12901
12902                   if (option->info & OEX_PAGE0)
12903                     fputs (" PAGE0", stdout);
12904                   if (option->info & OEX_SMM)
12905                     fputs (" SMM", stdout);
12906                   if (option->info & OEX_FPDBUG)
12907                     fputs (" FPDBUG", stdout);
12908                   if (option->info & OEX_DISMISS)
12909                     fputs (" DISMISS", stdout);
12910                   break;
12911                 case ODK_PAD:
12912                   fputs (" PAD       ", stdout);
12913                   if (option->info & OPAD_PREFIX)
12914                     fputs (" PREFIX", stdout);
12915                   if (option->info & OPAD_POSTFIX)
12916                     fputs (" POSTFIX", stdout);
12917                   if (option->info & OPAD_SYMBOL)
12918                     fputs (" SYMBOL", stdout);
12919                   break;
12920                 case ODK_HWPATCH:
12921                   fputs (" HWPATCH   ", stdout);
12922                   if (option->info & OHW_R4KEOP)
12923                     fputs (" R4KEOP", stdout);
12924                   if (option->info & OHW_R8KPFETCH)
12925                     fputs (" R8KPFETCH", stdout);
12926                   if (option->info & OHW_R5KEOP)
12927                     fputs (" R5KEOP", stdout);
12928                   if (option->info & OHW_R5KCVTL)
12929                     fputs (" R5KCVTL", stdout);
12930                   break;
12931                 case ODK_FILL:
12932                   fputs (" FILL       ", stdout);
12933                   /* XXX Print content of info word?  */
12934                   break;
12935                 case ODK_TAGS:
12936                   fputs (" TAGS       ", stdout);
12937                   /* XXX Print content of info word?  */
12938                   break;
12939                 case ODK_HWAND:
12940                   fputs (" HWAND     ", stdout);
12941                   if (option->info & OHWA0_R4KEOP_CHECKED)
12942                     fputs (" R4KEOP_CHECKED", stdout);
12943                   if (option->info & OHWA0_R4KEOP_CLEAN)
12944                     fputs (" R4KEOP_CLEAN", stdout);
12945                   break;
12946                 case ODK_HWOR:
12947                   fputs (" HWOR      ", stdout);
12948                   if (option->info & OHWA0_R4KEOP_CHECKED)
12949                     fputs (" R4KEOP_CHECKED", stdout);
12950                   if (option->info & OHWA0_R4KEOP_CLEAN)
12951                     fputs (" R4KEOP_CLEAN", stdout);
12952                   break;
12953                 case ODK_GP_GROUP:
12954                   printf (" GP_GROUP  %#06lx  self-contained %#06lx",
12955                           option->info & OGP_GROUP,
12956                           (option->info & OGP_SELF) >> 16);
12957                   break;
12958                 case ODK_IDENT:
12959                   printf (" IDENT     %#06lx  self-contained %#06lx",
12960                           option->info & OGP_GROUP,
12961                           (option->info & OGP_SELF) >> 16);
12962                   break;
12963                 default:
12964                   /* This shouldn't happen.  */
12965                   printf (" %3d ???     %d %lx",
12966                           option->kind, option->section, option->info);
12967                   break;
12968                 }
12969
12970               len = sizeof (* eopt);
12971               while (len < option->size)
12972                 if (((char *) option)[len] >= ' '
12973                     && ((char *) option)[len] < 0x7f)
12974                   printf ("%c", ((char *) option)[len++]);
12975                 else
12976                   printf ("\\%03o", ((char *) option)[len++]);
12977
12978               fputs ("\n", stdout);
12979               ++option;
12980             }
12981
12982           free (eopt);
12983         }
12984     }
12985
12986   if (conflicts_offset != 0 && conflictsno != 0)
12987     {
12988       Elf32_Conflict * iconf;
12989       size_t cnt;
12990
12991       if (dynamic_symbols == NULL)
12992         {
12993           error (_("conflict list found without a dynamic symbol table\n"));
12994           return 0;
12995         }
12996
12997       iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
12998       if (iconf == NULL)
12999         {
13000           error (_("Out of memory\n"));
13001           return 0;
13002         }
13003
13004       if (is_32bit_elf)
13005         {
13006           Elf32_External_Conflict * econf32;
13007
13008           econf32 = (Elf32_External_Conflict *)
13009               get_data (NULL, file, conflicts_offset, conflictsno,
13010                         sizeof (* econf32), _("conflict"));
13011           if (!econf32)
13012             return 0;
13013
13014           for (cnt = 0; cnt < conflictsno; ++cnt)
13015             iconf[cnt] = BYTE_GET (econf32[cnt]);
13016
13017           free (econf32);
13018         }
13019       else
13020         {
13021           Elf64_External_Conflict * econf64;
13022
13023           econf64 = (Elf64_External_Conflict *)
13024               get_data (NULL, file, conflicts_offset, conflictsno,
13025                         sizeof (* econf64), _("conflict"));
13026           if (!econf64)
13027             return 0;
13028
13029           for (cnt = 0; cnt < conflictsno; ++cnt)
13030             iconf[cnt] = BYTE_GET (econf64[cnt]);
13031
13032           free (econf64);
13033         }
13034
13035       printf (_("\nSection '.conflict' contains %lu entries:\n"),
13036               (unsigned long) conflictsno);
13037       puts (_("  Num:    Index       Value  Name"));
13038
13039       for (cnt = 0; cnt < conflictsno; ++cnt)
13040         {
13041           Elf_Internal_Sym * psym = & dynamic_symbols[iconf[cnt]];
13042
13043           printf ("%5lu: %8lu  ", (unsigned long) cnt, iconf[cnt]);
13044           print_vma (psym->st_value, FULL_HEX);
13045           putchar (' ');
13046           if (VALID_DYNAMIC_NAME (psym->st_name))
13047             print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
13048           else
13049             printf (_("<corrupt: %14ld>"), psym->st_name);
13050           putchar ('\n');
13051         }
13052
13053       free (iconf);
13054     }
13055
13056   if (pltgot != 0 && local_gotno != 0)
13057     {
13058       bfd_vma ent, local_end, global_end;
13059       size_t i, offset;
13060       unsigned char * data;
13061       int addr_size;
13062
13063       ent = pltgot;
13064       addr_size = (is_32bit_elf ? 4 : 8);
13065       local_end = pltgot + local_gotno * addr_size;
13066       global_end = local_end + (symtabno - gotsym) * addr_size;
13067
13068       offset = offset_from_vma (file, pltgot, global_end - pltgot);
13069       data = (unsigned char *) get_data (NULL, file, offset,
13070                                          global_end - pltgot, 1,
13071                                          _("Global Offset Table data"));
13072       if (data == NULL)
13073         return 0;
13074
13075       printf (_("\nPrimary GOT:\n"));
13076       printf (_(" Canonical gp value: "));
13077       print_vma (pltgot + 0x7ff0, LONG_HEX);
13078       printf ("\n\n");
13079
13080       printf (_(" Reserved entries:\n"));
13081       printf (_("  %*s %10s %*s Purpose\n"),
13082               addr_size * 2, _("Address"), _("Access"),
13083               addr_size * 2, _("Initial"));
13084       ent = print_mips_got_entry (data, pltgot, ent);
13085       printf (_(" Lazy resolver\n"));
13086       if (data
13087           && (byte_get (data + ent - pltgot, addr_size)
13088               >> (addr_size * 8 - 1)) != 0)
13089         {
13090           ent = print_mips_got_entry (data, pltgot, ent);
13091           printf (_(" Module pointer (GNU extension)\n"));
13092         }
13093       printf ("\n");
13094
13095       if (ent < local_end)
13096         {
13097           printf (_(" Local entries:\n"));
13098           printf ("  %*s %10s %*s\n",
13099                   addr_size * 2, _("Address"), _("Access"),
13100                   addr_size * 2, _("Initial"));
13101           while (ent < local_end)
13102             {
13103               ent = print_mips_got_entry (data, pltgot, ent);
13104               printf ("\n");
13105             }
13106           printf ("\n");
13107         }
13108
13109       if (gotsym < symtabno)
13110         {
13111           int sym_width;
13112
13113           printf (_(" Global entries:\n"));
13114           printf ("  %*s %10s %*s %*s %-7s %3s %s\n",
13115                   addr_size * 2, _("Address"),
13116                   _("Access"),
13117                   addr_size * 2, _("Initial"),
13118                   addr_size * 2, _("Sym.Val."),
13119                   _("Type"),
13120                   /* Note for translators: "Ndx" = abbreviated form of "Index".  */
13121                   _("Ndx"), _("Name"));
13122
13123           sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
13124           for (i = gotsym; i < symtabno; i++)
13125             {
13126               Elf_Internal_Sym * psym;
13127
13128               psym = dynamic_symbols + i;
13129               ent = print_mips_got_entry (data, pltgot, ent);
13130               printf (" ");
13131               print_vma (psym->st_value, LONG_HEX);
13132               printf (" %-7s %3s ",
13133                       get_symbol_type (ELF_ST_TYPE (psym->st_info)),
13134                       get_symbol_index_type (psym->st_shndx));
13135               if (VALID_DYNAMIC_NAME (psym->st_name))
13136                 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
13137               else
13138                 printf (_("<corrupt: %14ld>"), psym->st_name);
13139               printf ("\n");
13140             }
13141           printf ("\n");
13142         }
13143
13144       if (data)
13145         free (data);
13146     }
13147
13148   if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
13149     {
13150       bfd_vma ent, end;
13151       size_t offset, rel_offset;
13152       unsigned long count, i;
13153       unsigned char * data;
13154       int addr_size, sym_width;
13155       Elf_Internal_Rela * rels;
13156
13157       rel_offset = offset_from_vma (file, jmprel, pltrelsz);
13158       if (pltrel == DT_RELA)
13159         {
13160           if (!slurp_rela_relocs (file, rel_offset, pltrelsz, &rels, &count))
13161             return 0;
13162         }
13163       else
13164         {
13165           if (!slurp_rel_relocs (file, rel_offset, pltrelsz, &rels, &count))
13166             return 0;
13167         }
13168
13169       ent = mips_pltgot;
13170       addr_size = (is_32bit_elf ? 4 : 8);
13171       end = mips_pltgot + (2 + count) * addr_size;
13172
13173       offset = offset_from_vma (file, mips_pltgot, end - mips_pltgot);
13174       data = (unsigned char *) get_data (NULL, file, offset, end - mips_pltgot,
13175                                          1, _("Procedure Linkage Table data"));
13176       if (data == NULL)
13177         return 0;
13178
13179       printf ("\nPLT GOT:\n\n");
13180       printf (_(" Reserved entries:\n"));
13181       printf (_("  %*s %*s Purpose\n"),
13182               addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
13183       ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
13184       printf (_(" PLT lazy resolver\n"));
13185       ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
13186       printf (_(" Module pointer\n"));
13187       printf ("\n");
13188
13189       printf (_(" Entries:\n"));
13190       printf ("  %*s %*s %*s %-7s %3s %s\n",
13191               addr_size * 2, _("Address"),
13192               addr_size * 2, _("Initial"),
13193               addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
13194       sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
13195       for (i = 0; i < count; i++)
13196         {
13197           Elf_Internal_Sym * psym;
13198
13199           psym = dynamic_symbols + get_reloc_symindex (rels[i].r_info);
13200           ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
13201           printf (" ");
13202           print_vma (psym->st_value, LONG_HEX);
13203           printf (" %-7s %3s ",
13204                   get_symbol_type (ELF_ST_TYPE (psym->st_info)),
13205                   get_symbol_index_type (psym->st_shndx));
13206           if (VALID_DYNAMIC_NAME (psym->st_name))
13207             print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
13208           else
13209             printf (_("<corrupt: %14ld>"), psym->st_name);
13210           printf ("\n");
13211         }
13212       printf ("\n");
13213
13214       if (data)
13215         free (data);
13216       free (rels);
13217     }
13218
13219   return 1;
13220 }
13221
13222 static int
13223 process_nds32_specific (FILE * file)
13224 {
13225   Elf_Internal_Shdr *sect = NULL;
13226
13227   sect = find_section (".nds32_e_flags");
13228   if (sect != NULL)
13229     {
13230       unsigned int *flag;
13231
13232       printf ("\nNDS32 elf flags section:\n");
13233       flag = get_data (NULL, file, sect->sh_offset, 1,
13234                        sect->sh_size, _("NDS32 elf flags section"));
13235
13236       switch ((*flag) & 0x3)
13237         {
13238         case 0:
13239           printf ("(VEC_SIZE):\tNo entry.\n");
13240           break;
13241         case 1:
13242           printf ("(VEC_SIZE):\t4 bytes\n");
13243           break;
13244         case 2:
13245           printf ("(VEC_SIZE):\t16 bytes\n");
13246           break;
13247         case 3:
13248           printf ("(VEC_SIZE):\treserved\n");
13249           break;
13250         }
13251     }
13252
13253   return TRUE;
13254 }
13255
13256 static int
13257 process_gnu_liblist (FILE * file)
13258 {
13259   Elf_Internal_Shdr * section;
13260   Elf_Internal_Shdr * string_sec;
13261   Elf32_External_Lib * elib;
13262   char * strtab;
13263   size_t strtab_size;
13264   size_t cnt;
13265   unsigned i;
13266
13267   if (! do_arch)
13268     return 0;
13269
13270   for (i = 0, section = section_headers;
13271        i < elf_header.e_shnum;
13272        i++, section++)
13273     {
13274       switch (section->sh_type)
13275         {
13276         case SHT_GNU_LIBLIST:
13277           if (section->sh_link >= elf_header.e_shnum)
13278             break;
13279
13280           elib = (Elf32_External_Lib *)
13281               get_data (NULL, file, section->sh_offset, 1, section->sh_size,
13282                         _("liblist section data"));
13283
13284           if (elib == NULL)
13285             break;
13286           string_sec = section_headers + section->sh_link;
13287
13288           strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
13289                                       string_sec->sh_size,
13290                                       _("liblist string table"));
13291           if (strtab == NULL
13292               || section->sh_entsize != sizeof (Elf32_External_Lib))
13293             {
13294               free (elib);
13295               free (strtab);
13296               break;
13297             }
13298           strtab_size = string_sec->sh_size;
13299
13300           printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
13301                   SECTION_NAME (section),
13302                   (unsigned long) (section->sh_size / sizeof (Elf32_External_Lib)));
13303
13304           puts (_("     Library              Time Stamp          Checksum   Version Flags"));
13305
13306           for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
13307                ++cnt)
13308             {
13309               Elf32_Lib liblist;
13310               time_t atime;
13311               char timebuf[20];
13312               struct tm * tmp;
13313
13314               liblist.l_name = BYTE_GET (elib[cnt].l_name);
13315               atime = BYTE_GET (elib[cnt].l_time_stamp);
13316               liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
13317               liblist.l_version = BYTE_GET (elib[cnt].l_version);
13318               liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
13319
13320               tmp = gmtime (&atime);
13321               snprintf (timebuf, sizeof (timebuf),
13322                         "%04u-%02u-%02uT%02u:%02u:%02u",
13323                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
13324                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
13325
13326               printf ("%3lu: ", (unsigned long) cnt);
13327               if (do_wide)
13328                 printf ("%-20s", liblist.l_name < strtab_size
13329                         ? strtab + liblist.l_name : _("<corrupt>"));
13330               else
13331                 printf ("%-20.20s", liblist.l_name < strtab_size
13332                         ? strtab + liblist.l_name : _("<corrupt>"));
13333               printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
13334                       liblist.l_version, liblist.l_flags);
13335             }
13336
13337           free (elib);
13338           free (strtab);
13339         }
13340     }
13341
13342   return 1;
13343 }
13344
13345 static const char *
13346 get_note_type (unsigned e_type)
13347 {
13348   static char buff[64];
13349
13350   if (elf_header.e_type == ET_CORE)
13351     switch (e_type)
13352       {
13353       case NT_AUXV:
13354         return _("NT_AUXV (auxiliary vector)");
13355       case NT_PRSTATUS:
13356         return _("NT_PRSTATUS (prstatus structure)");
13357       case NT_FPREGSET:
13358         return _("NT_FPREGSET (floating point registers)");
13359       case NT_PRPSINFO:
13360         return _("NT_PRPSINFO (prpsinfo structure)");
13361       case NT_TASKSTRUCT:
13362         return _("NT_TASKSTRUCT (task structure)");
13363       case NT_PRXFPREG:
13364         return _("NT_PRXFPREG (user_xfpregs structure)");
13365       case NT_PPC_VMX:
13366         return _("NT_PPC_VMX (ppc Altivec registers)");
13367       case NT_PPC_VSX:
13368         return _("NT_PPC_VSX (ppc VSX registers)");
13369       case NT_386_TLS:
13370         return _("NT_386_TLS (x86 TLS information)");
13371       case NT_386_IOPERM:
13372         return _("NT_386_IOPERM (x86 I/O permissions)");
13373       case NT_X86_XSTATE:
13374         return _("NT_X86_XSTATE (x86 XSAVE extended state)");
13375       case NT_S390_HIGH_GPRS:
13376         return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
13377       case NT_S390_TIMER:
13378         return _("NT_S390_TIMER (s390 timer register)");
13379       case NT_S390_TODCMP:
13380         return _("NT_S390_TODCMP (s390 TOD comparator register)");
13381       case NT_S390_TODPREG:
13382         return _("NT_S390_TODPREG (s390 TOD programmable register)");
13383       case NT_S390_CTRS:
13384         return _("NT_S390_CTRS (s390 control registers)");
13385       case NT_S390_PREFIX:
13386         return _("NT_S390_PREFIX (s390 prefix register)");
13387       case NT_S390_LAST_BREAK:
13388         return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
13389       case NT_S390_SYSTEM_CALL:
13390         return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
13391       case NT_S390_TDB:
13392         return _("NT_S390_TDB (s390 transaction diagnostic block)");
13393       case NT_ARM_VFP:
13394         return _("NT_ARM_VFP (arm VFP registers)");
13395       case NT_ARM_TLS:
13396         return _("NT_ARM_TLS (AArch TLS registers)");
13397       case NT_ARM_HW_BREAK:
13398         return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
13399       case NT_ARM_HW_WATCH:
13400         return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
13401       case NT_PSTATUS:
13402         return _("NT_PSTATUS (pstatus structure)");
13403       case NT_FPREGS:
13404         return _("NT_FPREGS (floating point registers)");
13405       case NT_PSINFO:
13406         return _("NT_PSINFO (psinfo structure)");
13407       case NT_LWPSTATUS:
13408         return _("NT_LWPSTATUS (lwpstatus_t structure)");
13409       case NT_LWPSINFO:
13410         return _("NT_LWPSINFO (lwpsinfo_t structure)");
13411       case NT_WIN32PSTATUS:
13412         return _("NT_WIN32PSTATUS (win32_pstatus structure)");
13413       case NT_SIGINFO:
13414         return _("NT_SIGINFO (siginfo_t data)");
13415       case NT_FILE:
13416         return _("NT_FILE (mapped files)");
13417       default:
13418         break;
13419       }
13420   else
13421     switch (e_type)
13422       {
13423       case NT_VERSION:
13424         return _("NT_VERSION (version)");
13425       case NT_ARCH:
13426         return _("NT_ARCH (architecture)");
13427       default:
13428         break;
13429       }
13430
13431   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
13432   return buff;
13433 }
13434
13435 static int
13436 print_core_note (Elf_Internal_Note *pnote)
13437 {
13438   unsigned int addr_size = is_32bit_elf ? 4 : 8;
13439   bfd_vma count, page_size;
13440   unsigned char *descdata, *filenames, *descend;
13441
13442   if (pnote->type != NT_FILE)
13443     return 1;
13444
13445 #ifndef BFD64
13446   if (!is_32bit_elf)
13447     {
13448       printf (_("    Cannot decode 64-bit note in 32-bit build\n"));
13449       /* Still "successful".  */
13450       return 1;
13451     }
13452 #endif
13453
13454   if (pnote->descsz < 2 * addr_size)
13455     {
13456       printf (_("    Malformed note - too short for header\n"));
13457       return 0;
13458     }
13459
13460   descdata = (unsigned char *) pnote->descdata;
13461   descend = descdata + pnote->descsz;
13462
13463   if (descdata[pnote->descsz - 1] != '\0')
13464     {
13465       printf (_("    Malformed note - does not end with \\0\n"));
13466       return 0;
13467     }
13468
13469   count = byte_get (descdata, addr_size);
13470   descdata += addr_size;
13471
13472   page_size = byte_get (descdata, addr_size);
13473   descdata += addr_size;
13474
13475   if (pnote->descsz < 2 * addr_size + count * 3 * addr_size)
13476     {
13477       printf (_("    Malformed note - too short for supplied file count\n"));
13478       return 0;
13479     }
13480
13481   printf (_("    Page size: "));
13482   print_vma (page_size, DEC);
13483   printf ("\n");
13484
13485   printf (_("    %*s%*s%*s\n"),
13486           (int) (2 + 2 * addr_size), _("Start"),
13487           (int) (4 + 2 * addr_size), _("End"),
13488           (int) (4 + 2 * addr_size), _("Page Offset"));
13489   filenames = descdata + count * 3 * addr_size;
13490   while (--count > 0)
13491     {
13492       bfd_vma start, end, file_ofs;
13493
13494       if (filenames == descend)
13495         {
13496           printf (_("    Malformed note - filenames end too early\n"));
13497           return 0;
13498         }
13499
13500       start = byte_get (descdata, addr_size);
13501       descdata += addr_size;
13502       end = byte_get (descdata, addr_size);
13503       descdata += addr_size;
13504       file_ofs = byte_get (descdata, addr_size);
13505       descdata += addr_size;
13506
13507       printf ("    ");
13508       print_vma (start, FULL_HEX);
13509       printf ("  ");
13510       print_vma (end, FULL_HEX);
13511       printf ("  ");
13512       print_vma (file_ofs, FULL_HEX);
13513       printf ("\n        %s\n", filenames);
13514
13515       filenames += 1 + strlen ((char *) filenames);
13516     }
13517
13518   return 1;
13519 }
13520
13521 static const char *
13522 get_gnu_elf_note_type (unsigned e_type)
13523 {
13524   static char buff[64];
13525
13526   switch (e_type)
13527     {
13528     case NT_GNU_ABI_TAG:
13529       return _("NT_GNU_ABI_TAG (ABI version tag)");
13530     case NT_GNU_HWCAP:
13531       return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
13532     case NT_GNU_BUILD_ID:
13533       return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
13534     case NT_GNU_GOLD_VERSION:
13535       return _("NT_GNU_GOLD_VERSION (gold version)");
13536     default:
13537       break;
13538     }
13539
13540   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
13541   return buff;
13542 }
13543
13544 static int
13545 print_gnu_note (Elf_Internal_Note *pnote)
13546 {
13547   switch (pnote->type)
13548     {
13549     case NT_GNU_BUILD_ID:
13550       {
13551         unsigned long i;
13552
13553         printf (_("    Build ID: "));
13554         for (i = 0; i < pnote->descsz; ++i)
13555           printf ("%02x", pnote->descdata[i] & 0xff);
13556         printf ("\n");
13557       }
13558       break;
13559
13560     case NT_GNU_ABI_TAG:
13561       {
13562         unsigned long os, major, minor, subminor;
13563         const char *osname;
13564
13565         os = byte_get ((unsigned char *) pnote->descdata, 4);
13566         major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
13567         minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
13568         subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
13569
13570         switch (os)
13571           {
13572           case GNU_ABI_TAG_LINUX:
13573             osname = "Linux";
13574             break;
13575           case GNU_ABI_TAG_HURD:
13576             osname = "Hurd";
13577             break;
13578           case GNU_ABI_TAG_SOLARIS:
13579             osname = "Solaris";
13580             break;
13581           case GNU_ABI_TAG_FREEBSD:
13582             osname = "FreeBSD";
13583             break;
13584           case GNU_ABI_TAG_NETBSD:
13585             osname = "NetBSD";
13586             break;
13587           default:
13588             osname = "Unknown";
13589             break;
13590           }
13591
13592         printf (_("    OS: %s, ABI: %ld.%ld.%ld\n"), osname,
13593                 major, minor, subminor);
13594       }
13595       break;
13596
13597     case NT_GNU_GOLD_VERSION:
13598       {
13599         unsigned long i;
13600
13601         printf (_("    Version: "));
13602         for (i = 0; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
13603           printf ("%c", pnote->descdata[i]);
13604         printf ("\n");
13605       }
13606       break;
13607     }
13608
13609   return 1;
13610 }
13611
13612 static const char *
13613 get_netbsd_elfcore_note_type (unsigned e_type)
13614 {
13615   static char buff[64];
13616
13617   if (e_type == NT_NETBSDCORE_PROCINFO)
13618     {
13619       /* NetBSD core "procinfo" structure.  */
13620       return _("NetBSD procinfo structure");
13621     }
13622
13623   /* As of Jan 2002 there are no other machine-independent notes
13624      defined for NetBSD core files.  If the note type is less
13625      than the start of the machine-dependent note types, we don't
13626      understand it.  */
13627
13628   if (e_type < NT_NETBSDCORE_FIRSTMACH)
13629     {
13630       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
13631       return buff;
13632     }
13633
13634   switch (elf_header.e_machine)
13635     {
13636     /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
13637        and PT_GETFPREGS == mach+2.  */
13638
13639     case EM_OLD_ALPHA:
13640     case EM_ALPHA:
13641     case EM_SPARC:
13642     case EM_SPARC32PLUS:
13643     case EM_SPARCV9:
13644       switch (e_type)
13645         {
13646         case NT_NETBSDCORE_FIRSTMACH + 0:
13647           return _("PT_GETREGS (reg structure)");
13648         case NT_NETBSDCORE_FIRSTMACH + 2:
13649           return _("PT_GETFPREGS (fpreg structure)");
13650         default:
13651           break;
13652         }
13653       break;
13654
13655     /* On all other arch's, PT_GETREGS == mach+1 and
13656        PT_GETFPREGS == mach+3.  */
13657     default:
13658       switch (e_type)
13659         {
13660         case NT_NETBSDCORE_FIRSTMACH + 1:
13661           return _("PT_GETREGS (reg structure)");
13662         case NT_NETBSDCORE_FIRSTMACH + 3:
13663           return _("PT_GETFPREGS (fpreg structure)");
13664         default:
13665           break;
13666         }
13667     }
13668
13669   snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
13670             e_type - NT_NETBSDCORE_FIRSTMACH);
13671   return buff;
13672 }
13673
13674 static const char *
13675 get_stapsdt_note_type (unsigned e_type)
13676 {
13677   static char buff[64];
13678
13679   switch (e_type)
13680     {
13681     case NT_STAPSDT:
13682       return _("NT_STAPSDT (SystemTap probe descriptors)");
13683
13684     default:
13685       break;
13686     }
13687
13688   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
13689   return buff;
13690 }
13691
13692 static int
13693 print_stapsdt_note (Elf_Internal_Note *pnote)
13694 {
13695   int addr_size = is_32bit_elf ? 4 : 8;
13696   char *data = pnote->descdata;
13697   char *data_end = pnote->descdata + pnote->descsz;
13698   bfd_vma pc, base_addr, semaphore;
13699   char *provider, *probe, *arg_fmt;
13700
13701   pc = byte_get ((unsigned char *) data, addr_size);
13702   data += addr_size;
13703   base_addr = byte_get ((unsigned char *) data, addr_size);
13704   data += addr_size;
13705   semaphore = byte_get ((unsigned char *) data, addr_size);
13706   data += addr_size;
13707
13708   provider = data;
13709   data += strlen (data) + 1;
13710   probe = data;
13711   data += strlen (data) + 1;
13712   arg_fmt = data;
13713   data += strlen (data) + 1;
13714
13715   printf (_("    Provider: %s\n"), provider);
13716   printf (_("    Name: %s\n"), probe);
13717   printf (_("    Location: "));
13718   print_vma (pc, FULL_HEX);
13719   printf (_(", Base: "));
13720   print_vma (base_addr, FULL_HEX);
13721   printf (_(", Semaphore: "));
13722   print_vma (semaphore, FULL_HEX);
13723   printf ("\n");
13724   printf (_("    Arguments: %s\n"), arg_fmt);
13725
13726   return data == data_end;
13727 }
13728
13729 static const char *
13730 get_ia64_vms_note_type (unsigned e_type)
13731 {
13732   static char buff[64];
13733
13734   switch (e_type)
13735     {
13736     case NT_VMS_MHD:
13737       return _("NT_VMS_MHD (module header)");
13738     case NT_VMS_LNM:
13739       return _("NT_VMS_LNM (language name)");
13740     case NT_VMS_SRC:
13741       return _("NT_VMS_SRC (source files)");
13742     case NT_VMS_TITLE:
13743       return "NT_VMS_TITLE";
13744     case NT_VMS_EIDC:
13745       return _("NT_VMS_EIDC (consistency check)");
13746     case NT_VMS_FPMODE:
13747       return _("NT_VMS_FPMODE (FP mode)");
13748     case NT_VMS_LINKTIME:
13749       return "NT_VMS_LINKTIME";
13750     case NT_VMS_IMGNAM:
13751       return _("NT_VMS_IMGNAM (image name)");
13752     case NT_VMS_IMGID:
13753       return _("NT_VMS_IMGID (image id)");
13754     case NT_VMS_LINKID:
13755       return _("NT_VMS_LINKID (link id)");
13756     case NT_VMS_IMGBID:
13757       return _("NT_VMS_IMGBID (build id)");
13758     case NT_VMS_GSTNAM:
13759       return _("NT_VMS_GSTNAM (sym table name)");
13760     case NT_VMS_ORIG_DYN:
13761       return "NT_VMS_ORIG_DYN";
13762     case NT_VMS_PATCHTIME:
13763       return "NT_VMS_PATCHTIME";
13764     default:
13765       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
13766       return buff;
13767     }
13768 }
13769
13770 static int
13771 print_ia64_vms_note (Elf_Internal_Note * pnote)
13772 {
13773   switch (pnote->type)
13774     {
13775     case NT_VMS_MHD:
13776       if (pnote->descsz > 36)
13777         {
13778           size_t l = strlen (pnote->descdata + 34);
13779           printf (_("    Creation date  : %.17s\n"), pnote->descdata);
13780           printf (_("    Last patch date: %.17s\n"), pnote->descdata + 17);
13781           printf (_("    Module name    : %s\n"), pnote->descdata + 34);
13782           printf (_("    Module version : %s\n"), pnote->descdata + 34 + l + 1);
13783         }
13784       else
13785         printf (_("    Invalid size\n"));
13786       break;
13787     case NT_VMS_LNM:
13788       printf (_("   Language: %s\n"), pnote->descdata);
13789       break;
13790 #ifdef BFD64
13791     case NT_VMS_FPMODE:
13792       printf (_("   Floating Point mode: "));
13793       printf ("0x%016" BFD_VMA_FMT "x\n",
13794               (bfd_vma)byte_get ((unsigned char *)pnote->descdata, 8));
13795       break;
13796     case NT_VMS_LINKTIME:
13797       printf (_("   Link time: "));
13798       print_vms_time
13799         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
13800       printf ("\n");
13801       break;
13802     case NT_VMS_PATCHTIME:
13803       printf (_("   Patch time: "));
13804       print_vms_time
13805         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
13806       printf ("\n");
13807       break;
13808     case NT_VMS_ORIG_DYN:
13809       printf (_("   Major id: %u,  minor id: %u\n"),
13810               (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
13811               (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
13812       printf (_("   Last modified  : "));
13813       print_vms_time
13814         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
13815       printf (_("\n   Link flags  : "));
13816       printf ("0x%016" BFD_VMA_FMT "x\n",
13817               (bfd_vma)byte_get ((unsigned char *)pnote->descdata + 16, 8));
13818       printf (_("   Header flags: 0x%08x\n"),
13819               (unsigned)byte_get ((unsigned char *)pnote->descdata + 24, 4));
13820       printf (_("   Image id    : %s\n"), pnote->descdata + 32);
13821       break;
13822 #endif
13823     case NT_VMS_IMGNAM:
13824       printf (_("    Image name: %s\n"), pnote->descdata);
13825       break;
13826     case NT_VMS_GSTNAM:
13827       printf (_("    Global symbol table name: %s\n"), pnote->descdata);
13828       break;
13829     case NT_VMS_IMGID:
13830       printf (_("    Image id: %s\n"), pnote->descdata);
13831       break;
13832     case NT_VMS_LINKID:
13833       printf (_("    Linker id: %s\n"), pnote->descdata);
13834       break;
13835     default:
13836       break;
13837     }
13838   return 1;
13839 }
13840
13841 /* Note that by the ELF standard, the name field is already null byte
13842    terminated, and namesz includes the terminating null byte.
13843    I.E. the value of namesz for the name "FSF" is 4.
13844
13845    If the value of namesz is zero, there is no name present.  */
13846 static int
13847 process_note (Elf_Internal_Note * pnote)
13848 {
13849   const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
13850   const char * nt;
13851
13852   if (pnote->namesz == 0)
13853     /* If there is no note name, then use the default set of
13854        note type strings.  */
13855     nt = get_note_type (pnote->type);
13856
13857   else if (const_strneq (pnote->namedata, "GNU"))
13858     /* GNU-specific object file notes.  */
13859     nt = get_gnu_elf_note_type (pnote->type);
13860
13861   else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
13862     /* NetBSD-specific core file notes.  */
13863     nt = get_netbsd_elfcore_note_type (pnote->type);
13864
13865   else if (strneq (pnote->namedata, "SPU/", 4))
13866     {
13867       /* SPU-specific core file notes.  */
13868       nt = pnote->namedata + 4;
13869       name = "SPU";
13870     }
13871
13872   else if (const_strneq (pnote->namedata, "IPF/VMS"))
13873     /* VMS/ia64-specific file notes.  */
13874     nt = get_ia64_vms_note_type (pnote->type);
13875
13876   else if (const_strneq (pnote->namedata, "stapsdt"))
13877     nt = get_stapsdt_note_type (pnote->type);
13878
13879   else
13880     /* Don't recognize this note name; just use the default set of
13881        note type strings.  */
13882     nt = get_note_type (pnote->type);
13883
13884   printf ("  %-20s 0x%08lx\t%s\n", name, pnote->descsz, nt);
13885
13886   if (const_strneq (pnote->namedata, "IPF/VMS"))
13887     return print_ia64_vms_note (pnote);
13888   else if (const_strneq (pnote->namedata, "GNU"))
13889     return print_gnu_note (pnote);
13890   else if (const_strneq (pnote->namedata, "stapsdt"))
13891     return print_stapsdt_note (pnote);
13892   else if (const_strneq (pnote->namedata, "CORE"))
13893     return print_core_note (pnote);
13894   else
13895     return 1;
13896 }
13897
13898
13899 static int
13900 process_corefile_note_segment (FILE * file, bfd_vma offset, bfd_vma length)
13901 {
13902   Elf_External_Note * pnotes;
13903   Elf_External_Note * external;
13904   int res = 1;
13905
13906   if (length <= 0)
13907     return 0;
13908
13909   pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
13910                                            _("notes"));
13911   if (pnotes == NULL)
13912     return 0;
13913
13914   external = pnotes;
13915
13916   printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
13917           (unsigned long) offset, (unsigned long) length);
13918   printf (_("  %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
13919
13920   while ((char *) external < (char *) pnotes + length)
13921     {
13922       Elf_Internal_Note inote;
13923       size_t min_notesz;
13924       char *next;
13925       char * temp = NULL;
13926       size_t data_remaining = ((char *) pnotes + length) - (char *) external;
13927
13928       if (!is_ia64_vms ())
13929         {
13930           /* PR binutils/15191
13931              Make sure that there is enough data to read.  */
13932           min_notesz = offsetof (Elf_External_Note, name);
13933           if (data_remaining < min_notesz)
13934             {
13935               warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
13936                     (int) data_remaining);
13937               break;
13938             }
13939           inote.type     = BYTE_GET (external->type);
13940           inote.namesz   = BYTE_GET (external->namesz);
13941           inote.namedata = external->name;
13942           inote.descsz   = BYTE_GET (external->descsz);
13943           inote.descdata = inote.namedata + align_power (inote.namesz, 2);
13944           inote.descpos  = offset + (inote.descdata - (char *) pnotes);
13945           next = inote.descdata + align_power (inote.descsz, 2);
13946         }
13947       else
13948         {
13949           Elf64_External_VMS_Note *vms_external;
13950
13951           /* PR binutils/15191
13952              Make sure that there is enough data to read.  */
13953           min_notesz = offsetof (Elf64_External_VMS_Note, name);
13954           if (data_remaining < min_notesz)
13955             {
13956               warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
13957                     (int) data_remaining);
13958               break;
13959             }
13960
13961           vms_external = (Elf64_External_VMS_Note *) external;
13962           inote.type     = BYTE_GET (vms_external->type);
13963           inote.namesz   = BYTE_GET (vms_external->namesz);
13964           inote.namedata = vms_external->name;
13965           inote.descsz   = BYTE_GET (vms_external->descsz);
13966           inote.descdata = inote.namedata + align_power (inote.namesz, 3);
13967           inote.descpos  = offset + (inote.descdata - (char *) pnotes);
13968           next = inote.descdata + align_power (inote.descsz, 3);
13969         }
13970
13971       if (inote.descdata < (char *) external + min_notesz
13972           || next < (char *) external + min_notesz
13973           || data_remaining < (size_t)(next - (char *) external))
13974         {
13975           warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
13976                 (unsigned long) ((char *) external - (char *) pnotes));
13977           warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx\n"),
13978                 inote.type, inote.namesz, inote.descsz);
13979           break;
13980         }
13981
13982       external = (Elf_External_Note *) next;
13983
13984       /* Verify that name is null terminated.  It appears that at least
13985          one version of Linux (RedHat 6.0) generates corefiles that don't
13986          comply with the ELF spec by failing to include the null byte in
13987          namesz.  */
13988       if (inote.namedata[inote.namesz - 1] != '\0')
13989         {
13990           temp = (char *) malloc (inote.namesz + 1);
13991
13992           if (temp == NULL)
13993             {
13994               error (_("Out of memory\n"));
13995               res = 0;
13996               break;
13997             }
13998
13999           strncpy (temp, inote.namedata, inote.namesz);
14000           temp[inote.namesz] = 0;
14001
14002           /* warn (_("'%s' NOTE name not properly null terminated\n"), temp);  */
14003           inote.namedata = temp;
14004         }
14005
14006       res &= process_note (& inote);
14007
14008       if (temp != NULL)
14009         {
14010           free (temp);
14011           temp = NULL;
14012         }
14013     }
14014
14015   free (pnotes);
14016
14017   return res;
14018 }
14019
14020 static int
14021 process_corefile_note_segments (FILE * file)
14022 {
14023   Elf_Internal_Phdr * segment;
14024   unsigned int i;
14025   int res = 1;
14026
14027   if (! get_program_headers (file))
14028       return 0;
14029
14030   for (i = 0, segment = program_headers;
14031        i < elf_header.e_phnum;
14032        i++, segment++)
14033     {
14034       if (segment->p_type == PT_NOTE)
14035         res &= process_corefile_note_segment (file,
14036                                               (bfd_vma) segment->p_offset,
14037                                               (bfd_vma) segment->p_filesz);
14038     }
14039
14040   return res;
14041 }
14042
14043 static int
14044 process_note_sections (FILE * file)
14045 {
14046   Elf_Internal_Shdr * section;
14047   unsigned long i;
14048   int n = 0;
14049   int res = 1;
14050
14051   for (i = 0, section = section_headers;
14052        i < elf_header.e_shnum && section != NULL;
14053        i++, section++)
14054     if (section->sh_type == SHT_NOTE)
14055       {
14056         res &= process_corefile_note_segment (file,
14057                                               (bfd_vma) section->sh_offset,
14058                                               (bfd_vma) section->sh_size);
14059         n++;
14060       }
14061
14062   if (n == 0)
14063     /* Try processing NOTE segments instead.  */
14064     return process_corefile_note_segments (file);
14065
14066   return res;
14067 }
14068
14069 static int
14070 process_notes (FILE * file)
14071 {
14072   /* If we have not been asked to display the notes then do nothing.  */
14073   if (! do_notes)
14074     return 1;
14075
14076   if (elf_header.e_type != ET_CORE)
14077     return process_note_sections (file);
14078
14079   /* No program headers means no NOTE segment.  */
14080   if (elf_header.e_phnum > 0)
14081     return process_corefile_note_segments (file);
14082
14083   printf (_("No note segments present in the core file.\n"));
14084   return 1;
14085 }
14086
14087 static int
14088 process_arch_specific (FILE * file)
14089 {
14090   if (! do_arch)
14091     return 1;
14092
14093   switch (elf_header.e_machine)
14094     {
14095     case EM_ARM:
14096       return process_arm_specific (file);
14097     case EM_MIPS:
14098     case EM_MIPS_RS3_LE:
14099       return process_mips_specific (file);
14100       break;
14101     case EM_NDS32:
14102       return process_nds32_specific (file);
14103       break;
14104     case EM_PPC:
14105       return process_power_specific (file);
14106       break;
14107     case EM_SPARC:
14108     case EM_SPARC32PLUS:
14109     case EM_SPARCV9:
14110       return process_sparc_specific (file);
14111       break;
14112     case EM_TI_C6000:
14113       return process_tic6x_specific (file);
14114       break;
14115     case EM_MSP430:
14116       return process_msp430x_specific (file);
14117     default:
14118       break;
14119     }
14120   return 1;
14121 }
14122
14123 static int
14124 get_file_header (FILE * file)
14125 {
14126   /* Read in the identity array.  */
14127   if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
14128     return 0;
14129
14130   /* Determine how to read the rest of the header.  */
14131   switch (elf_header.e_ident[EI_DATA])
14132     {
14133     default: /* fall through */
14134     case ELFDATANONE: /* fall through */
14135     case ELFDATA2LSB:
14136       byte_get = byte_get_little_endian;
14137       byte_put = byte_put_little_endian;
14138       break;
14139     case ELFDATA2MSB:
14140       byte_get = byte_get_big_endian;
14141       byte_put = byte_put_big_endian;
14142       break;
14143     }
14144
14145   /* For now we only support 32 bit and 64 bit ELF files.  */
14146   is_32bit_elf = (elf_header.e_ident[EI_CLASS] != ELFCLASS64);
14147
14148   /* Read in the rest of the header.  */
14149   if (is_32bit_elf)
14150     {
14151       Elf32_External_Ehdr ehdr32;
14152
14153       if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
14154         return 0;
14155
14156       elf_header.e_type      = BYTE_GET (ehdr32.e_type);
14157       elf_header.e_machine   = BYTE_GET (ehdr32.e_machine);
14158       elf_header.e_version   = BYTE_GET (ehdr32.e_version);
14159       elf_header.e_entry     = BYTE_GET (ehdr32.e_entry);
14160       elf_header.e_phoff     = BYTE_GET (ehdr32.e_phoff);
14161       elf_header.e_shoff     = BYTE_GET (ehdr32.e_shoff);
14162       elf_header.e_flags     = BYTE_GET (ehdr32.e_flags);
14163       elf_header.e_ehsize    = BYTE_GET (ehdr32.e_ehsize);
14164       elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
14165       elf_header.e_phnum     = BYTE_GET (ehdr32.e_phnum);
14166       elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
14167       elf_header.e_shnum     = BYTE_GET (ehdr32.e_shnum);
14168       elf_header.e_shstrndx  = BYTE_GET (ehdr32.e_shstrndx);
14169     }
14170   else
14171     {
14172       Elf64_External_Ehdr ehdr64;
14173
14174       /* If we have been compiled with sizeof (bfd_vma) == 4, then
14175          we will not be able to cope with the 64bit data found in
14176          64 ELF files.  Detect this now and abort before we start
14177          overwriting things.  */
14178       if (sizeof (bfd_vma) < 8)
14179         {
14180           error (_("This instance of readelf has been built without support for a\n\
14181 64 bit data type and so it cannot read 64 bit ELF files.\n"));
14182           return 0;
14183         }
14184
14185       if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
14186         return 0;
14187
14188       elf_header.e_type      = BYTE_GET (ehdr64.e_type);
14189       elf_header.e_machine   = BYTE_GET (ehdr64.e_machine);
14190       elf_header.e_version   = BYTE_GET (ehdr64.e_version);
14191       elf_header.e_entry     = BYTE_GET (ehdr64.e_entry);
14192       elf_header.e_phoff     = BYTE_GET (ehdr64.e_phoff);
14193       elf_header.e_shoff     = BYTE_GET (ehdr64.e_shoff);
14194       elf_header.e_flags     = BYTE_GET (ehdr64.e_flags);
14195       elf_header.e_ehsize    = BYTE_GET (ehdr64.e_ehsize);
14196       elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
14197       elf_header.e_phnum     = BYTE_GET (ehdr64.e_phnum);
14198       elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
14199       elf_header.e_shnum     = BYTE_GET (ehdr64.e_shnum);
14200       elf_header.e_shstrndx  = BYTE_GET (ehdr64.e_shstrndx);
14201     }
14202
14203   if (elf_header.e_shoff)
14204     {
14205       /* There may be some extensions in the first section header.  Don't
14206          bomb if we can't read it.  */
14207       if (is_32bit_elf)
14208         get_32bit_section_headers (file, 1);
14209       else
14210         get_64bit_section_headers (file, 1);
14211     }
14212
14213   return 1;
14214 }
14215
14216 /* Process one ELF object file according to the command line options.
14217    This file may actually be stored in an archive.  The file is
14218    positioned at the start of the ELF object.  */
14219
14220 static int
14221 process_object (char * file_name, FILE * file)
14222 {
14223   unsigned int i;
14224
14225   if (! get_file_header (file))
14226     {
14227       error (_("%s: Failed to read file header\n"), file_name);
14228       return 1;
14229     }
14230
14231   /* Initialise per file variables.  */
14232   for (i = ARRAY_SIZE (version_info); i--;)
14233     version_info[i] = 0;
14234
14235   for (i = ARRAY_SIZE (dynamic_info); i--;)
14236     dynamic_info[i] = 0;
14237   dynamic_info_DT_GNU_HASH = 0;
14238
14239   /* Process the file.  */
14240   if (show_name)
14241     printf (_("\nFile: %s\n"), file_name);
14242
14243   /* Initialise the dump_sects array from the cmdline_dump_sects array.
14244      Note we do this even if cmdline_dump_sects is empty because we
14245      must make sure that the dump_sets array is zeroed out before each
14246      object file is processed.  */
14247   if (num_dump_sects > num_cmdline_dump_sects)
14248     memset (dump_sects, 0, num_dump_sects * sizeof (* dump_sects));
14249
14250   if (num_cmdline_dump_sects > 0)
14251     {
14252       if (num_dump_sects == 0)
14253         /* A sneaky way of allocating the dump_sects array.  */
14254         request_dump_bynumber (num_cmdline_dump_sects, 0);
14255
14256       assert (num_dump_sects >= num_cmdline_dump_sects);
14257       memcpy (dump_sects, cmdline_dump_sects,
14258               num_cmdline_dump_sects * sizeof (* dump_sects));
14259     }
14260
14261   if (! process_file_header ())
14262     return 1;
14263
14264   if (! process_section_headers (file))
14265     {
14266       /* Without loaded section headers we cannot process lots of
14267          things.  */
14268       do_unwind = do_version = do_dump = do_arch = 0;
14269
14270       if (! do_using_dynamic)
14271         do_syms = do_dyn_syms = do_reloc = 0;
14272     }
14273
14274   if (! process_section_groups (file))
14275     {
14276       /* Without loaded section groups we cannot process unwind.  */
14277       do_unwind = 0;
14278     }
14279
14280   if (process_program_headers (file))
14281     process_dynamic_section (file);
14282
14283   process_relocs (file);
14284
14285   process_unwind (file);
14286
14287   process_symbol_table (file);
14288
14289   process_syminfo (file);
14290
14291   process_version_sections (file);
14292
14293   process_section_contents (file);
14294
14295   process_notes (file);
14296
14297   process_gnu_liblist (file);
14298
14299   process_arch_specific (file);
14300
14301   if (program_headers)
14302     {
14303       free (program_headers);
14304       program_headers = NULL;
14305     }
14306
14307   if (section_headers)
14308     {
14309       free (section_headers);
14310       section_headers = NULL;
14311     }
14312
14313   if (string_table)
14314     {
14315       free (string_table);
14316       string_table = NULL;
14317       string_table_length = 0;
14318     }
14319
14320   if (dynamic_strings)
14321     {
14322       free (dynamic_strings);
14323       dynamic_strings = NULL;
14324       dynamic_strings_length = 0;
14325     }
14326
14327   if (dynamic_symbols)
14328     {
14329       free (dynamic_symbols);
14330       dynamic_symbols = NULL;
14331       num_dynamic_syms = 0;
14332     }
14333
14334   if (dynamic_syminfo)
14335     {
14336       free (dynamic_syminfo);
14337       dynamic_syminfo = NULL;
14338     }
14339
14340   if (dynamic_section)
14341     {
14342       free (dynamic_section);
14343       dynamic_section = NULL;
14344     }
14345
14346   if (section_headers_groups)
14347     {
14348       free (section_headers_groups);
14349       section_headers_groups = NULL;
14350     }
14351
14352   if (section_groups)
14353     {
14354       struct group_list * g;
14355       struct group_list * next;
14356
14357       for (i = 0; i < group_count; i++)
14358         {
14359           for (g = section_groups [i].root; g != NULL; g = next)
14360             {
14361               next = g->next;
14362               free (g);
14363             }
14364         }
14365
14366       free (section_groups);
14367       section_groups = NULL;
14368     }
14369
14370   free_debug_memory ();
14371
14372   return 0;
14373 }
14374
14375 /* Process an ELF archive.
14376    On entry the file is positioned just after the ARMAG string.  */
14377
14378 static int
14379 process_archive (char * file_name, FILE * file, bfd_boolean is_thin_archive)
14380 {
14381   struct archive_info arch;
14382   struct archive_info nested_arch;
14383   size_t got;
14384   int ret;
14385
14386   show_name = 1;
14387
14388   /* The ARCH structure is used to hold information about this archive.  */
14389   arch.file_name = NULL;
14390   arch.file = NULL;
14391   arch.index_array = NULL;
14392   arch.sym_table = NULL;
14393   arch.longnames = NULL;
14394
14395   /* The NESTED_ARCH structure is used as a single-item cache of information
14396      about a nested archive (when members of a thin archive reside within
14397      another regular archive file).  */
14398   nested_arch.file_name = NULL;
14399   nested_arch.file = NULL;
14400   nested_arch.index_array = NULL;
14401   nested_arch.sym_table = NULL;
14402   nested_arch.longnames = NULL;
14403
14404   if (setup_archive (&arch, file_name, file, is_thin_archive, do_archive_index) != 0)
14405     {
14406       ret = 1;
14407       goto out;
14408     }
14409
14410   if (do_archive_index)
14411     {
14412       if (arch.sym_table == NULL)
14413         error (_("%s: unable to dump the index as none was found\n"), file_name);
14414       else
14415         {
14416           unsigned int i, l;
14417           unsigned long current_pos;
14418
14419           printf (_("Index of archive %s: (%ld entries, 0x%lx bytes in the symbol table)\n"),
14420                   file_name, (long) arch.index_num, arch.sym_size);
14421           current_pos = ftell (file);
14422
14423           for (i = l = 0; i < arch.index_num; i++)
14424             {
14425               if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
14426                 {
14427                   char * member_name;
14428
14429                   member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
14430
14431                   if (member_name != NULL)
14432                     {
14433                       char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
14434
14435                       if (qualified_name != NULL)
14436                         {
14437                           printf (_("Contents of binary %s at offset "), qualified_name);
14438                           (void) print_vma (arch.index_array[i], PREFIX_HEX);
14439                           putchar ('\n');
14440                           free (qualified_name);
14441                         }
14442                     }
14443                 }
14444
14445               if (l >= arch.sym_size)
14446                 {
14447                   error (_("%s: end of the symbol table reached before the end of the index\n"),
14448                          file_name);
14449                   break;
14450                 }
14451               printf ("\t%s\n", arch.sym_table + l);
14452               l += strlen (arch.sym_table + l) + 1;
14453             }
14454
14455           if (arch.uses_64bit_indicies)
14456             l = (l + 7) & ~ 7;
14457           else
14458             l += l & 1;
14459
14460           if (l < arch.sym_size)
14461             error (_("%s: %ld bytes remain in the symbol table, but without corresponding entries in the index table\n"),
14462                    file_name, arch.sym_size - l);
14463
14464           if (fseek (file, current_pos, SEEK_SET) != 0)
14465             {
14466               error (_("%s: failed to seek back to start of object files in the archive\n"), file_name);
14467               ret = 1;
14468               goto out;
14469             }
14470         }
14471
14472       if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
14473           && !do_segments && !do_header && !do_dump && !do_version
14474           && !do_histogram && !do_debugging && !do_arch && !do_notes
14475           && !do_section_groups && !do_dyn_syms)
14476         {
14477           ret = 0; /* Archive index only.  */
14478           goto out;
14479         }
14480     }
14481
14482   ret = 0;
14483
14484   while (1)
14485     {
14486       char * name;
14487       size_t namelen;
14488       char * qualified_name;
14489
14490       /* Read the next archive header.  */
14491       if (fseek (file, arch.next_arhdr_offset, SEEK_SET) != 0)
14492         {
14493           error (_("%s: failed to seek to next archive header\n"), file_name);
14494           return 1;
14495         }
14496       got = fread (&arch.arhdr, 1, sizeof arch.arhdr, file);
14497       if (got != sizeof arch.arhdr)
14498         {
14499           if (got == 0)
14500             break;
14501           error (_("%s: failed to read archive header\n"), file_name);
14502           ret = 1;
14503           break;
14504         }
14505       if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
14506         {
14507           error (_("%s: did not find a valid archive header\n"), arch.file_name);
14508           ret = 1;
14509           break;
14510         }
14511
14512       arch.next_arhdr_offset += sizeof arch.arhdr;
14513
14514       archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
14515       if (archive_file_size & 01)
14516         ++archive_file_size;
14517
14518       name = get_archive_member_name (&arch, &nested_arch);
14519       if (name == NULL)
14520         {
14521           error (_("%s: bad archive file name\n"), file_name);
14522           ret = 1;
14523           break;
14524         }
14525       namelen = strlen (name);
14526
14527       qualified_name = make_qualified_name (&arch, &nested_arch, name);
14528       if (qualified_name == NULL)
14529         {
14530           error (_("%s: bad archive file name\n"), file_name);
14531           ret = 1;
14532           break;
14533         }
14534
14535       if (is_thin_archive && arch.nested_member_origin == 0)
14536         {
14537           /* This is a proxy for an external member of a thin archive.  */
14538           FILE * member_file;
14539           char * member_file_name = adjust_relative_path (file_name, name, namelen);
14540           if (member_file_name == NULL)
14541             {
14542               ret = 1;
14543               break;
14544             }
14545
14546           member_file = fopen (member_file_name, "rb");
14547           if (member_file == NULL)
14548             {
14549               error (_("Input file '%s' is not readable.\n"), member_file_name);
14550               free (member_file_name);
14551               ret = 1;
14552               break;
14553             }
14554
14555           archive_file_offset = arch.nested_member_origin;
14556
14557           ret |= process_object (qualified_name, member_file);
14558
14559           fclose (member_file);
14560           free (member_file_name);
14561         }
14562       else if (is_thin_archive)
14563         {
14564           /* PR 15140: Allow for corrupt thin archives.  */
14565           if (nested_arch.file == NULL)
14566             {
14567               error (_("%s: contains corrupt thin archive: %s\n"),
14568                      file_name, name);
14569               ret = 1;
14570               break;
14571             }
14572
14573           /* This is a proxy for a member of a nested archive.  */
14574           archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
14575
14576           /* The nested archive file will have been opened and setup by
14577              get_archive_member_name.  */
14578           if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
14579             {
14580               error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
14581               ret = 1;
14582               break;
14583             }
14584
14585           ret |= process_object (qualified_name, nested_arch.file);
14586         }
14587       else
14588         {
14589           archive_file_offset = arch.next_arhdr_offset;
14590           arch.next_arhdr_offset += archive_file_size;
14591
14592           ret |= process_object (qualified_name, file);
14593         }
14594
14595       if (dump_sects != NULL)
14596         {
14597           free (dump_sects);
14598           dump_sects = NULL;
14599           num_dump_sects = 0;
14600         }
14601
14602       free (qualified_name);
14603     }
14604
14605  out:
14606   if (nested_arch.file != NULL)
14607     fclose (nested_arch.file);
14608   release_archive (&nested_arch);
14609   release_archive (&arch);
14610
14611   return ret;
14612 }
14613
14614 static int
14615 process_file (char * file_name)
14616 {
14617   FILE * file;
14618   struct stat statbuf;
14619   char armag[SARMAG];
14620   int ret;
14621
14622   if (stat (file_name, &statbuf) < 0)
14623     {
14624       if (errno == ENOENT)
14625         error (_("'%s': No such file\n"), file_name);
14626       else
14627         error (_("Could not locate '%s'.  System error message: %s\n"),
14628                file_name, strerror (errno));
14629       return 1;
14630     }
14631
14632   if (! S_ISREG (statbuf.st_mode))
14633     {
14634       error (_("'%s' is not an ordinary file\n"), file_name);
14635       return 1;
14636     }
14637
14638   file = fopen (file_name, "rb");
14639   if (file == NULL)
14640     {
14641       error (_("Input file '%s' is not readable.\n"), file_name);
14642       return 1;
14643     }
14644
14645   if (fread (armag, SARMAG, 1, file) != 1)
14646     {
14647       error (_("%s: Failed to read file's magic number\n"), file_name);
14648       fclose (file);
14649       return 1;
14650     }
14651
14652   if (memcmp (armag, ARMAG, SARMAG) == 0)
14653     ret = process_archive (file_name, file, FALSE);
14654   else if (memcmp (armag, ARMAGT, SARMAG) == 0)
14655     ret = process_archive (file_name, file, TRUE);
14656   else
14657     {
14658       if (do_archive_index)
14659         error (_("File %s is not an archive so its index cannot be displayed.\n"),
14660                file_name);
14661
14662       rewind (file);
14663       archive_file_size = archive_file_offset = 0;
14664       ret = process_object (file_name, file);
14665     }
14666
14667   fclose (file);
14668
14669   return ret;
14670 }
14671
14672 #ifdef SUPPORT_DISASSEMBLY
14673 /* Needed by the i386 disassembler.  For extra credit, someone could
14674    fix this so that we insert symbolic addresses here, esp for GOT/PLT
14675    symbols.  */
14676
14677 void
14678 print_address (unsigned int addr, FILE * outfile)
14679 {
14680   fprintf (outfile,"0x%8.8x", addr);
14681 }
14682
14683 /* Needed by the i386 disassembler.  */
14684 void
14685 db_task_printsym (unsigned int addr)
14686 {
14687   print_address (addr, stderr);
14688 }
14689 #endif
14690
14691 int
14692 main (int argc, char ** argv)
14693 {
14694   int err;
14695
14696 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
14697   setlocale (LC_MESSAGES, "");
14698 #endif
14699 #if defined (HAVE_SETLOCALE)
14700   setlocale (LC_CTYPE, "");
14701 #endif
14702   bindtextdomain (PACKAGE, LOCALEDIR);
14703   textdomain (PACKAGE);
14704
14705   expandargv (&argc, &argv);
14706
14707   parse_args (argc, argv);
14708
14709   if (num_dump_sects > 0)
14710     {
14711       /* Make a copy of the dump_sects array.  */
14712       cmdline_dump_sects = (dump_type *)
14713           malloc (num_dump_sects * sizeof (* dump_sects));
14714       if (cmdline_dump_sects == NULL)
14715         error (_("Out of memory allocating dump request table.\n"));
14716       else
14717         {
14718           memcpy (cmdline_dump_sects, dump_sects,
14719                   num_dump_sects * sizeof (* dump_sects));
14720           num_cmdline_dump_sects = num_dump_sects;
14721         }
14722     }
14723
14724   if (optind < (argc - 1))
14725     show_name = 1;
14726
14727   err = 0;
14728   while (optind < argc)
14729     err |= process_file (argv[optind++]);
14730
14731   if (dump_sects != NULL)
14732     free (dump_sects);
14733   if (cmdline_dump_sects != NULL)
14734     free (cmdline_dump_sects);
14735
14736   return err;
14737 }