Speed up the display of unwind tables by using a binary chop search to locate functio...
[external/binutils.git] / binutils / readelf.c
1 /* readelf.c -- display contents of an ELF format file
2    Copyright (C) 1998-2015 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/ft32.h"
110 #include "elf/h8.h"
111 #include "elf/hppa.h"
112 #include "elf/i386.h"
113 #include "elf/i370.h"
114 #include "elf/i860.h"
115 #include "elf/i960.h"
116 #include "elf/ia64.h"
117 #include "elf/ip2k.h"
118 #include "elf/lm32.h"
119 #include "elf/iq2000.h"
120 #include "elf/m32c.h"
121 #include "elf/m32r.h"
122 #include "elf/m68k.h"
123 #include "elf/m68hc11.h"
124 #include "elf/mcore.h"
125 #include "elf/mep.h"
126 #include "elf/metag.h"
127 #include "elf/microblaze.h"
128 #include "elf/mips.h"
129 #include "elf/mmix.h"
130 #include "elf/mn10200.h"
131 #include "elf/mn10300.h"
132 #include "elf/moxie.h"
133 #include "elf/mt.h"
134 #include "elf/msp430.h"
135 #include "elf/nds32.h"
136 #include "elf/nios2.h"
137 #include "elf/or1k.h"
138 #include "elf/pj.h"
139 #include "elf/ppc.h"
140 #include "elf/ppc64.h"
141 #include "elf/rl78.h"
142 #include "elf/rx.h"
143 #include "elf/s390.h"
144 #include "elf/score.h"
145 #include "elf/sh.h"
146 #include "elf/sparc.h"
147 #include "elf/spu.h"
148 #include "elf/tic6x.h"
149 #include "elf/tilegx.h"
150 #include "elf/tilepro.h"
151 #include "elf/v850.h"
152 #include "elf/vax.h"
153 #include "elf/visium.h"
154 #include "elf/x86-64.h"
155 #include "elf/xc16x.h"
156 #include "elf/xgate.h"
157 #include "elf/xstormy16.h"
158 #include "elf/xtensa.h"
159
160 #include "getopt.h"
161 #include "libiberty.h"
162 #include "safe-ctype.h"
163 #include "filenames.h"
164
165 #ifndef offsetof
166 #define offsetof(TYPE, MEMBER) ((size_t) &(((TYPE *) 0)->MEMBER))
167 #endif
168
169 char * program_name = "readelf";
170 static unsigned long archive_file_offset;
171 static unsigned long archive_file_size;
172 static bfd_size_type current_file_size;
173 static unsigned long dynamic_addr;
174 static bfd_size_type dynamic_size;
175 static size_t dynamic_nent;
176 static char * dynamic_strings;
177 static unsigned long dynamic_strings_length;
178 static char * string_table;
179 static unsigned long string_table_length;
180 static unsigned long num_dynamic_syms;
181 static Elf_Internal_Sym * dynamic_symbols;
182 static Elf_Internal_Syminfo * dynamic_syminfo;
183 static unsigned long dynamic_syminfo_offset;
184 static unsigned int dynamic_syminfo_nent;
185 static char program_interpreter[PATH_MAX];
186 static bfd_vma dynamic_info[DT_ENCODING];
187 static bfd_vma dynamic_info_DT_GNU_HASH;
188 static bfd_vma version_info[16];
189 static Elf_Internal_Ehdr elf_header;
190 static Elf_Internal_Shdr * section_headers;
191 static Elf_Internal_Phdr * program_headers;
192 static Elf_Internal_Dyn *  dynamic_section;
193 static Elf_Internal_Shdr * symtab_shndx_hdr;
194 static int show_name;
195 static int do_dynamic;
196 static int do_syms;
197 static int do_dyn_syms;
198 static int do_reloc;
199 static int do_sections;
200 static int do_section_groups;
201 static int do_section_details;
202 static int do_segments;
203 static int do_unwind;
204 static int do_using_dynamic;
205 static int do_header;
206 static int do_dump;
207 static int do_version;
208 static int do_histogram;
209 static int do_debugging;
210 static int do_arch;
211 static int do_notes;
212 static int do_archive_index;
213 static int is_32bit_elf;
214
215 struct group_list
216 {
217   struct group_list * next;
218   unsigned int section_index;
219 };
220
221 struct group
222 {
223   struct group_list * root;
224   unsigned int group_index;
225 };
226
227 static size_t group_count;
228 static struct group * section_groups;
229 static struct group ** section_headers_groups;
230
231
232 /* Flag bits indicating particular types of dump.  */
233 #define HEX_DUMP        (1 << 0)        /* The -x command line switch.  */
234 #define DISASS_DUMP     (1 << 1)        /* The -i command line switch.  */
235 #define DEBUG_DUMP      (1 << 2)        /* The -w command line switch.  */
236 #define STRING_DUMP     (1 << 3)        /* The -p command line switch.  */
237 #define RELOC_DUMP      (1 << 4)        /* The -R command line switch.  */
238
239 typedef unsigned char dump_type;
240
241 /* A linked list of the section names for which dumps were requested.  */
242 struct dump_list_entry
243 {
244   char * name;
245   dump_type type;
246   struct dump_list_entry * next;
247 };
248 static struct dump_list_entry * dump_sects_byname;
249
250 /* A dynamic array of flags indicating for which sections a dump
251    has been requested via command line switches.  */
252 static dump_type *   cmdline_dump_sects = NULL;
253 static unsigned int  num_cmdline_dump_sects = 0;
254
255 /* A dynamic array of flags indicating for which sections a dump of
256    some kind has been requested.  It is reset on a per-object file
257    basis and then initialised from the cmdline_dump_sects array,
258    the results of interpreting the -w switch, and the
259    dump_sects_byname list.  */
260 static dump_type *   dump_sects = NULL;
261 static unsigned int  num_dump_sects = 0;
262
263
264 /* How to print a vma value.  */
265 typedef enum print_mode
266 {
267   HEX,
268   DEC,
269   DEC_5,
270   UNSIGNED,
271   PREFIX_HEX,
272   FULL_HEX,
273   LONG_HEX
274 }
275 print_mode;
276
277 /* Versioned symbol info.  */
278 enum versioned_symbol_info
279 {
280   symbol_undefined,
281   symbol_hidden,
282   symbol_public
283 };
284
285 static const char *get_symbol_version_string
286   (FILE *file, int is_dynsym, const char *strtab,
287    unsigned long int strtab_size, unsigned int si,
288    Elf_Internal_Sym *psym, enum versioned_symbol_info *sym_info,
289    unsigned short *vna_other);
290
291 #define UNKNOWN -1
292
293 #define SECTION_NAME(X)                                         \
294   ((X) == NULL ? _("<none>")                                    \
295    : string_table == NULL ? _("<no-name>")                      \
296    : ((X)->sh_name >= string_table_length ? _("<corrupt>")      \
297   : string_table + (X)->sh_name))
298
299 #define DT_VERSIONTAGIDX(tag)   (DT_VERNEEDNUM - (tag)) /* Reverse order!  */
300
301 #define GET_ELF_SYMBOLS(file, section, sym_count)                       \
302   (is_32bit_elf ? get_32bit_elf_symbols (file, section, sym_count)      \
303    : get_64bit_elf_symbols (file, section, sym_count))
304
305 #define VALID_DYNAMIC_NAME(offset)      ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
306 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
307    already been called and verified that the string exists.  */
308 #define GET_DYNAMIC_NAME(offset)        (dynamic_strings + offset)
309
310 #define REMOVE_ARCH_BITS(ADDR)                  \
311   do                                            \
312     {                                           \
313       if (elf_header.e_machine == EM_ARM)       \
314         (ADDR) &= ~1;                           \
315     }                                           \
316   while (0)
317 \f
318 /* Retrieve NMEMB structures, each SIZE bytes long from FILE starting at OFFSET +
319    the offset of the current archive member, if we are examining an archive.
320    Put the retrieved data into VAR, if it is not NULL.  Otherwise allocate a buffer
321    using malloc and fill that.  In either case return the pointer to the start of
322    the retrieved data or NULL if something went wrong.  If something does go wrong
323    and REASON is not NULL then emit an error message using REASON as part of the
324    context.  */
325
326 static void *
327 get_data (void * var, FILE * file, unsigned long offset, bfd_size_type size,
328           bfd_size_type nmemb, const char * reason)
329 {
330   void * mvar;
331   bfd_size_type amt = size * nmemb;
332
333   if (size == 0 || nmemb == 0)
334     return NULL;
335
336   /* If the size_t type is smaller than the bfd_size_type, eg because
337      you are building a 32-bit tool on a 64-bit host, then make sure
338      that when the sizes are cast to (size_t) no information is lost.  */
339   if (sizeof (size_t) < sizeof (bfd_size_type)
340       && (   (bfd_size_type) ((size_t) size) != size
341           || (bfd_size_type) ((size_t) nmemb) != nmemb))
342     {
343       if (reason)
344         error (_("Size truncation prevents reading 0x%llx elements of size 0x%llx for %s\n"),
345                (unsigned long long) nmemb, (unsigned long long) size, reason);
346       return NULL;
347     }
348
349   /* Check for size overflow.  */
350   if (amt < nmemb)
351     {
352       if (reason)
353         error (_("Size overflow prevents reading 0x%llx elements of size 0x%llx for %s\n"),
354                (unsigned long long) nmemb, (unsigned long long) size, reason);
355       return NULL;
356     }
357
358   /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
359      attempting to allocate memory when the read is bound to fail.  */
360   if (amt > current_file_size
361       || offset + archive_file_offset + amt > current_file_size)
362     {
363       if (reason)
364         error (_("Reading 0x%llx bytes extends past end of file for %s\n"),
365                (unsigned long long) amt, reason);
366       return NULL;
367     }
368
369   if (fseek (file, archive_file_offset + offset, SEEK_SET))
370     {
371       if (reason)
372         error (_("Unable to seek to 0x%lx for %s\n"),
373                (unsigned long) archive_file_offset + offset, reason);
374       return NULL;
375     }
376
377   mvar = var;
378   if (mvar == NULL)
379     {
380       /* Check for overflow.  */
381       if (nmemb < (~(bfd_size_type) 0 - 1) / size)
382         /* + 1 so that we can '\0' terminate invalid string table sections.  */
383         mvar = malloc ((size_t) amt + 1);
384
385       if (mvar == NULL)
386         {
387           if (reason)
388             error (_("Out of memory allocating 0x%llx bytes for %s\n"),
389                    (unsigned long long) amt, reason);
390           return NULL;
391         }
392
393       ((char *) mvar)[amt] = '\0';
394     }
395
396   if (fread (mvar, (size_t) size, (size_t) nmemb, file) != nmemb)
397     {
398       if (reason)
399         error (_("Unable to read in 0x%llx bytes of %s\n"),
400                (unsigned long long) amt, reason);
401       if (mvar != var)
402         free (mvar);
403       return NULL;
404     }
405
406   return mvar;
407 }
408
409 /* Print a VMA value.  */
410
411 static int
412 print_vma (bfd_vma vma, print_mode mode)
413 {
414   int nc = 0;
415
416   switch (mode)
417     {
418     case FULL_HEX:
419       nc = printf ("0x");
420       /* Drop through.  */
421
422     case LONG_HEX:
423 #ifdef BFD64
424       if (is_32bit_elf)
425         return nc + printf ("%8.8" BFD_VMA_FMT "x", vma);
426 #endif
427       printf_vma (vma);
428       return nc + 16;
429
430     case DEC_5:
431       if (vma <= 99999)
432         return printf ("%5" BFD_VMA_FMT "d", vma);
433       /* Drop through.  */
434
435     case PREFIX_HEX:
436       nc = printf ("0x");
437       /* Drop through.  */
438
439     case HEX:
440       return nc + printf ("%" BFD_VMA_FMT "x", vma);
441
442     case DEC:
443       return printf ("%" BFD_VMA_FMT "d", vma);
444
445     case UNSIGNED:
446       return printf ("%" BFD_VMA_FMT "u", vma);
447     }
448   return 0;
449 }
450
451 /* Display a symbol on stdout.  Handles the display of control characters and
452    multibye characters (assuming the host environment supports them).
453
454    Display at most abs(WIDTH) characters, truncating as necessary, unless do_wide is true.
455
456    If WIDTH is negative then ensure that the output is at least (- WIDTH) characters,
457    padding as necessary.
458
459    Returns the number of emitted characters.  */
460
461 static unsigned int
462 print_symbol (int width, const char *symbol)
463 {
464   bfd_boolean extra_padding = FALSE;
465   int num_printed = 0;
466 #ifdef HAVE_MBSTATE_T
467   mbstate_t state;
468 #endif
469   int width_remaining;
470
471   if (width < 0)
472     {
473       /* Keep the width positive.  This also helps.  */
474       width = - width;
475       extra_padding = TRUE;
476     }
477   assert (width != 0);
478
479   if (do_wide)
480     /* Set the remaining width to a very large value.
481        This simplifies the code below.  */
482     width_remaining = INT_MAX;
483   else
484     width_remaining = width;
485
486 #ifdef HAVE_MBSTATE_T
487   /* Initialise the multibyte conversion state.  */
488   memset (& state, 0, sizeof (state));
489 #endif
490
491   while (width_remaining)
492     {
493       size_t  n;
494       const char c = *symbol++;
495
496       if (c == 0)
497         break;
498
499       /* Do not print control characters directly as they can affect terminal
500          settings.  Such characters usually appear in the names generated
501          by the assembler for local labels.  */
502       if (ISCNTRL (c))
503         {
504           if (width_remaining < 2)
505             break;
506
507           printf ("^%c", c + 0x40);
508           width_remaining -= 2;
509           num_printed += 2;
510         }
511       else if (ISPRINT (c))
512         {
513           putchar (c);
514           width_remaining --;
515           num_printed ++;
516         }
517       else
518         {
519 #ifdef HAVE_MBSTATE_T
520           wchar_t w;
521 #endif
522           /* Let printf do the hard work of displaying multibyte characters.  */
523           printf ("%.1s", symbol - 1);
524           width_remaining --;
525           num_printed ++;
526
527 #ifdef HAVE_MBSTATE_T
528           /* Try to find out how many bytes made up the character that was
529              just printed.  Advance the symbol pointer past the bytes that
530              were displayed.  */
531           n = mbrtowc (& w, symbol - 1, MB_CUR_MAX, & state);
532 #else
533           n = 1;
534 #endif
535           if (n != (size_t) -1 && n != (size_t) -2 && n > 0)
536             symbol += (n - 1);
537         }
538     }
539
540   if (extra_padding && num_printed < width)
541     {
542       /* Fill in the remaining spaces.  */
543       printf ("%-*s", width - num_printed, " ");
544       num_printed = width;
545     }
546
547   return num_printed;
548 }
549
550 /* Returns a pointer to a static buffer containing a  printable version of
551    the given section's name.  Like print_symbol, except that it does not try
552    to print multibyte characters, it just interprets them as hex values.  */
553
554 static const char *
555 printable_section_name (Elf_Internal_Shdr * sec)
556 {
557 #define MAX_PRINT_SEC_NAME_LEN 128
558   static char  sec_name_buf [MAX_PRINT_SEC_NAME_LEN + 1];
559   const char * name = SECTION_NAME (sec);
560   char *       buf = sec_name_buf;
561   char         c;
562   unsigned int remaining = MAX_PRINT_SEC_NAME_LEN;
563
564   while ((c = * name ++) != 0)
565     {
566       if (ISCNTRL (c))
567         {
568           if (remaining < 2)
569             break;
570
571           * buf ++ = '^';
572           * buf ++ = c + 0x40;
573           remaining -= 2;
574         }
575       else if (ISPRINT (c))
576         {
577           * buf ++ = c;
578           remaining -= 1;
579         }
580       else
581         {
582           static char hex[17] = "0123456789ABCDEF";
583
584           if (remaining < 4)
585             break;
586           * buf ++ = '<';
587           * buf ++ = hex[(c & 0xf0) >> 4];
588           * buf ++ = hex[c & 0x0f];
589           * buf ++ = '>';
590           remaining -= 4;
591         }
592
593       if (remaining == 0)
594         break;
595     }
596
597   * buf = 0;
598   return sec_name_buf;
599 }
600
601 static const char *
602 printable_section_name_from_index (unsigned long ndx)
603 {
604   if (ndx >= elf_header.e_shnum)
605     return _("<corrupt>");
606
607   return printable_section_name (section_headers + ndx);
608 }
609
610 /* Return a pointer to section NAME, or NULL if no such section exists.  */
611
612 static Elf_Internal_Shdr *
613 find_section (const char * name)
614 {
615   unsigned int i;
616
617   for (i = 0; i < elf_header.e_shnum; i++)
618     if (streq (SECTION_NAME (section_headers + i), name))
619       return section_headers + i;
620
621   return NULL;
622 }
623
624 /* Return a pointer to a section containing ADDR, or NULL if no such
625    section exists.  */
626
627 static Elf_Internal_Shdr *
628 find_section_by_address (bfd_vma addr)
629 {
630   unsigned int i;
631
632   for (i = 0; i < elf_header.e_shnum; i++)
633     {
634       Elf_Internal_Shdr *sec = section_headers + i;
635       if (addr >= sec->sh_addr && addr < sec->sh_addr + sec->sh_size)
636         return sec;
637     }
638
639   return NULL;
640 }
641
642 static Elf_Internal_Shdr *
643 find_section_by_type (unsigned int type)
644 {
645   unsigned int i;
646
647   for (i = 0; i < elf_header.e_shnum; i++)
648     {
649       Elf_Internal_Shdr *sec = section_headers + i;
650       if (sec->sh_type == type)
651         return sec;
652     }
653
654   return NULL;
655 }
656
657 /* Return a pointer to section NAME, or NULL if no such section exists,
658    restricted to the list of sections given in SET.  */
659
660 static Elf_Internal_Shdr *
661 find_section_in_set (const char * name, unsigned int * set)
662 {
663   unsigned int i;
664
665   if (set != NULL)
666     {
667       while ((i = *set++) > 0)
668         if (streq (SECTION_NAME (section_headers + i), name))
669           return section_headers + i;
670     }
671
672   return find_section (name);
673 }
674
675 /* Read an unsigned LEB128 encoded value from p.  Set *PLEN to the number of
676    bytes read.  */
677
678 static inline unsigned long
679 read_uleb128 (unsigned char *data,
680               unsigned int *length_return,
681               const unsigned char * const end)
682 {
683   return read_leb128 (data, length_return, FALSE, end);
684 }
685
686 /* Return true if the current file is for IA-64 machine and OpenVMS ABI.
687    This OS has so many departures from the ELF standard that we test it at
688    many places.  */
689
690 static inline int
691 is_ia64_vms (void)
692 {
693   return elf_header.e_machine == EM_IA_64
694     && elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS;
695 }
696
697 /* Guess the relocation size commonly used by the specific machines.  */
698
699 static int
700 guess_is_rela (unsigned int e_machine)
701 {
702   switch (e_machine)
703     {
704       /* Targets that use REL relocations.  */
705     case EM_386:
706     case EM_486:
707     case EM_960:
708     case EM_ARM:
709     case EM_D10V:
710     case EM_CYGNUS_D10V:
711     case EM_DLX:
712     case EM_MIPS:
713     case EM_MIPS_RS3_LE:
714     case EM_CYGNUS_M32R:
715     case EM_SCORE:
716     case EM_XGATE:
717       return FALSE;
718
719       /* Targets that use RELA relocations.  */
720     case EM_68K:
721     case EM_860:
722     case EM_AARCH64:
723     case EM_ADAPTEVA_EPIPHANY:
724     case EM_ALPHA:
725     case EM_ALTERA_NIOS2:
726     case EM_AVR:
727     case EM_AVR_OLD:
728     case EM_BLACKFIN:
729     case EM_CR16:
730     case EM_CRIS:
731     case EM_CRX:
732     case EM_D30V:
733     case EM_CYGNUS_D30V:
734     case EM_FR30:
735     case EM_FT32:
736     case EM_CYGNUS_FR30:
737     case EM_CYGNUS_FRV:
738     case EM_H8S:
739     case EM_H8_300:
740     case EM_H8_300H:
741     case EM_IA_64:
742     case EM_IP2K:
743     case EM_IP2K_OLD:
744     case EM_IQ2000:
745     case EM_LATTICEMICO32:
746     case EM_M32C_OLD:
747     case EM_M32C:
748     case EM_M32R:
749     case EM_MCORE:
750     case EM_CYGNUS_MEP:
751     case EM_METAG:
752     case EM_MMIX:
753     case EM_MN10200:
754     case EM_CYGNUS_MN10200:
755     case EM_MN10300:
756     case EM_CYGNUS_MN10300:
757     case EM_MOXIE:
758     case EM_MSP430:
759     case EM_MSP430_OLD:
760     case EM_MT:
761     case EM_NDS32:
762     case EM_NIOS32:
763     case EM_OR1K:
764     case EM_PPC64:
765     case EM_PPC:
766     case EM_RL78:
767     case EM_RX:
768     case EM_S390:
769     case EM_S390_OLD:
770     case EM_SH:
771     case EM_SPARC:
772     case EM_SPARC32PLUS:
773     case EM_SPARCV9:
774     case EM_SPU:
775     case EM_TI_C6000:
776     case EM_TILEGX:
777     case EM_TILEPRO:
778     case EM_V800:
779     case EM_V850:
780     case EM_CYGNUS_V850:
781     case EM_VAX:
782     case EM_VISIUM:
783     case EM_X86_64:
784     case EM_L1OM:
785     case EM_K1OM:
786     case EM_XSTORMY16:
787     case EM_XTENSA:
788     case EM_XTENSA_OLD:
789     case EM_MICROBLAZE:
790     case EM_MICROBLAZE_OLD:
791       return TRUE;
792
793     case EM_68HC05:
794     case EM_68HC08:
795     case EM_68HC11:
796     case EM_68HC16:
797     case EM_FX66:
798     case EM_ME16:
799     case EM_MMA:
800     case EM_NCPU:
801     case EM_NDR1:
802     case EM_PCP:
803     case EM_ST100:
804     case EM_ST19:
805     case EM_ST7:
806     case EM_ST9PLUS:
807     case EM_STARCORE:
808     case EM_SVX:
809     case EM_TINYJ:
810     default:
811       warn (_("Don't know about relocations on this machine architecture\n"));
812       return FALSE;
813     }
814 }
815
816 static int
817 slurp_rela_relocs (FILE * file,
818                    unsigned long rel_offset,
819                    unsigned long rel_size,
820                    Elf_Internal_Rela ** relasp,
821                    unsigned long * nrelasp)
822 {
823   Elf_Internal_Rela * relas;
824   size_t nrelas;
825   unsigned int i;
826
827   if (is_32bit_elf)
828     {
829       Elf32_External_Rela * erelas;
830
831       erelas = (Elf32_External_Rela *) get_data (NULL, file, rel_offset, 1,
832                                                  rel_size, _("32-bit relocation data"));
833       if (!erelas)
834         return 0;
835
836       nrelas = rel_size / sizeof (Elf32_External_Rela);
837
838       relas = (Elf_Internal_Rela *) cmalloc (nrelas,
839                                              sizeof (Elf_Internal_Rela));
840
841       if (relas == NULL)
842         {
843           free (erelas);
844           error (_("out of memory parsing relocs\n"));
845           return 0;
846         }
847
848       for (i = 0; i < nrelas; i++)
849         {
850           relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
851           relas[i].r_info   = BYTE_GET (erelas[i].r_info);
852           relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
853         }
854
855       free (erelas);
856     }
857   else
858     {
859       Elf64_External_Rela * erelas;
860
861       erelas = (Elf64_External_Rela *) get_data (NULL, file, rel_offset, 1,
862                                                  rel_size, _("64-bit relocation data"));
863       if (!erelas)
864         return 0;
865
866       nrelas = rel_size / sizeof (Elf64_External_Rela);
867
868       relas = (Elf_Internal_Rela *) cmalloc (nrelas,
869                                              sizeof (Elf_Internal_Rela));
870
871       if (relas == NULL)
872         {
873           free (erelas);
874           error (_("out of memory parsing relocs\n"));
875           return 0;
876         }
877
878       for (i = 0; i < nrelas; i++)
879         {
880           relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
881           relas[i].r_info   = BYTE_GET (erelas[i].r_info);
882           relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
883
884           /* The #ifdef BFD64 below is to prevent a compile time
885              warning.  We know that if we do not have a 64 bit data
886              type that we will never execute this code anyway.  */
887 #ifdef BFD64
888           if (elf_header.e_machine == EM_MIPS
889               && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
890             {
891               /* In little-endian objects, r_info isn't really a
892                  64-bit little-endian value: it has a 32-bit
893                  little-endian symbol index followed by four
894                  individual byte fields.  Reorder INFO
895                  accordingly.  */
896               bfd_vma inf = relas[i].r_info;
897               inf = (((inf & 0xffffffff) << 32)
898                       | ((inf >> 56) & 0xff)
899                       | ((inf >> 40) & 0xff00)
900                       | ((inf >> 24) & 0xff0000)
901                       | ((inf >> 8) & 0xff000000));
902               relas[i].r_info = inf;
903             }
904 #endif /* BFD64 */
905         }
906
907       free (erelas);
908     }
909   *relasp = relas;
910   *nrelasp = nrelas;
911   return 1;
912 }
913
914 static int
915 slurp_rel_relocs (FILE * file,
916                   unsigned long rel_offset,
917                   unsigned long rel_size,
918                   Elf_Internal_Rela ** relsp,
919                   unsigned long * nrelsp)
920 {
921   Elf_Internal_Rela * rels;
922   size_t nrels;
923   unsigned int i;
924
925   if (is_32bit_elf)
926     {
927       Elf32_External_Rel * erels;
928
929       erels = (Elf32_External_Rel *) get_data (NULL, file, rel_offset, 1,
930                                                rel_size, _("32-bit relocation data"));
931       if (!erels)
932         return 0;
933
934       nrels = rel_size / sizeof (Elf32_External_Rel);
935
936       rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
937
938       if (rels == NULL)
939         {
940           free (erels);
941           error (_("out of memory parsing relocs\n"));
942           return 0;
943         }
944
945       for (i = 0; i < nrels; i++)
946         {
947           rels[i].r_offset = BYTE_GET (erels[i].r_offset);
948           rels[i].r_info   = BYTE_GET (erels[i].r_info);
949           rels[i].r_addend = 0;
950         }
951
952       free (erels);
953     }
954   else
955     {
956       Elf64_External_Rel * erels;
957
958       erels = (Elf64_External_Rel *) get_data (NULL, file, rel_offset, 1,
959                                                rel_size, _("64-bit relocation data"));
960       if (!erels)
961         return 0;
962
963       nrels = rel_size / sizeof (Elf64_External_Rel);
964
965       rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
966
967       if (rels == NULL)
968         {
969           free (erels);
970           error (_("out of memory parsing relocs\n"));
971           return 0;
972         }
973
974       for (i = 0; i < nrels; i++)
975         {
976           rels[i].r_offset = BYTE_GET (erels[i].r_offset);
977           rels[i].r_info   = BYTE_GET (erels[i].r_info);
978           rels[i].r_addend = 0;
979
980           /* The #ifdef BFD64 below is to prevent a compile time
981              warning.  We know that if we do not have a 64 bit data
982              type that we will never execute this code anyway.  */
983 #ifdef BFD64
984           if (elf_header.e_machine == EM_MIPS
985               && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
986             {
987               /* In little-endian objects, r_info isn't really a
988                  64-bit little-endian value: it has a 32-bit
989                  little-endian symbol index followed by four
990                  individual byte fields.  Reorder INFO
991                  accordingly.  */
992               bfd_vma inf = rels[i].r_info;
993               inf = (((inf & 0xffffffff) << 32)
994                      | ((inf >> 56) & 0xff)
995                      | ((inf >> 40) & 0xff00)
996                      | ((inf >> 24) & 0xff0000)
997                      | ((inf >> 8) & 0xff000000));
998               rels[i].r_info = inf;
999             }
1000 #endif /* BFD64 */
1001         }
1002
1003       free (erels);
1004     }
1005   *relsp = rels;
1006   *nrelsp = nrels;
1007   return 1;
1008 }
1009
1010 /* Returns the reloc type extracted from the reloc info field.  */
1011
1012 static unsigned int
1013 get_reloc_type (bfd_vma reloc_info)
1014 {
1015   if (is_32bit_elf)
1016     return ELF32_R_TYPE (reloc_info);
1017
1018   switch (elf_header.e_machine)
1019     {
1020     case EM_MIPS:
1021       /* Note: We assume that reloc_info has already been adjusted for us.  */
1022       return ELF64_MIPS_R_TYPE (reloc_info);
1023
1024     case EM_SPARCV9:
1025       return ELF64_R_TYPE_ID (reloc_info);
1026
1027     default:
1028       return ELF64_R_TYPE (reloc_info);
1029     }
1030 }
1031
1032 /* Return the symbol index extracted from the reloc info field.  */
1033
1034 static bfd_vma
1035 get_reloc_symindex (bfd_vma reloc_info)
1036 {
1037   return is_32bit_elf ? ELF32_R_SYM (reloc_info) : ELF64_R_SYM (reloc_info);
1038 }
1039
1040 static inline bfd_boolean
1041 uses_msp430x_relocs (void)
1042 {
1043   return
1044     elf_header.e_machine == EM_MSP430 /* Paranoia.  */
1045     /* GCC uses osabi == ELFOSBI_STANDALONE.  */
1046     && (((elf_header.e_flags & EF_MSP430_MACH) == E_MSP430_MACH_MSP430X)
1047         /* TI compiler uses ELFOSABI_NONE.  */
1048         || (elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE));
1049 }
1050
1051 /* Display the contents of the relocation data found at the specified
1052    offset.  */
1053
1054 static void
1055 dump_relocations (FILE * file,
1056                   unsigned long rel_offset,
1057                   unsigned long rel_size,
1058                   Elf_Internal_Sym * symtab,
1059                   unsigned long nsyms,
1060                   char * strtab,
1061                   unsigned long strtablen,
1062                   int is_rela,
1063                   int is_dynsym)
1064 {
1065   unsigned int i;
1066   Elf_Internal_Rela * rels;
1067
1068   if (is_rela == UNKNOWN)
1069     is_rela = guess_is_rela (elf_header.e_machine);
1070
1071   if (is_rela)
1072     {
1073       if (!slurp_rela_relocs (file, rel_offset, rel_size, &rels, &rel_size))
1074         return;
1075     }
1076   else
1077     {
1078       if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
1079         return;
1080     }
1081
1082   if (is_32bit_elf)
1083     {
1084       if (is_rela)
1085         {
1086           if (do_wide)
1087             printf (_(" Offset     Info    Type                Sym. Value  Symbol's Name + Addend\n"));
1088           else
1089             printf (_(" Offset     Info    Type            Sym.Value  Sym. Name + Addend\n"));
1090         }
1091       else
1092         {
1093           if (do_wide)
1094             printf (_(" Offset     Info    Type                Sym. Value  Symbol's Name\n"));
1095           else
1096             printf (_(" Offset     Info    Type            Sym.Value  Sym. Name\n"));
1097         }
1098     }
1099   else
1100     {
1101       if (is_rela)
1102         {
1103           if (do_wide)
1104             printf (_("    Offset             Info             Type               Symbol's Value  Symbol's Name + Addend\n"));
1105           else
1106             printf (_("  Offset          Info           Type           Sym. Value    Sym. Name + Addend\n"));
1107         }
1108       else
1109         {
1110           if (do_wide)
1111             printf (_("    Offset             Info             Type               Symbol's Value  Symbol's Name\n"));
1112           else
1113             printf (_("  Offset          Info           Type           Sym. Value    Sym. Name\n"));
1114         }
1115     }
1116
1117   for (i = 0; i < rel_size; i++)
1118     {
1119       const char * rtype;
1120       bfd_vma offset;
1121       bfd_vma inf;
1122       bfd_vma symtab_index;
1123       bfd_vma type;
1124
1125       offset = rels[i].r_offset;
1126       inf    = rels[i].r_info;
1127
1128       type = get_reloc_type (inf);
1129       symtab_index = get_reloc_symindex  (inf);
1130
1131       if (is_32bit_elf)
1132         {
1133           printf ("%8.8lx  %8.8lx ",
1134                   (unsigned long) offset & 0xffffffff,
1135                   (unsigned long) inf & 0xffffffff);
1136         }
1137       else
1138         {
1139 #if BFD_HOST_64BIT_LONG
1140           printf (do_wide
1141                   ? "%16.16lx  %16.16lx "
1142                   : "%12.12lx  %12.12lx ",
1143                   offset, inf);
1144 #elif BFD_HOST_64BIT_LONG_LONG
1145 #ifndef __MSVCRT__
1146           printf (do_wide
1147                   ? "%16.16llx  %16.16llx "
1148                   : "%12.12llx  %12.12llx ",
1149                   offset, inf);
1150 #else
1151           printf (do_wide
1152                   ? "%16.16I64x  %16.16I64x "
1153                   : "%12.12I64x  %12.12I64x ",
1154                   offset, inf);
1155 #endif
1156 #else
1157           printf (do_wide
1158                   ? "%8.8lx%8.8lx  %8.8lx%8.8lx "
1159                   : "%4.4lx%8.8lx  %4.4lx%8.8lx ",
1160                   _bfd_int64_high (offset),
1161                   _bfd_int64_low (offset),
1162                   _bfd_int64_high (inf),
1163                   _bfd_int64_low (inf));
1164 #endif
1165         }
1166
1167       switch (elf_header.e_machine)
1168         {
1169         default:
1170           rtype = NULL;
1171           break;
1172
1173         case EM_AARCH64:
1174           rtype = elf_aarch64_reloc_type (type);
1175           break;
1176
1177         case EM_M32R:
1178         case EM_CYGNUS_M32R:
1179           rtype = elf_m32r_reloc_type (type);
1180           break;
1181
1182         case EM_386:
1183         case EM_486:
1184           rtype = elf_i386_reloc_type (type);
1185           break;
1186
1187         case EM_68HC11:
1188         case EM_68HC12:
1189           rtype = elf_m68hc11_reloc_type (type);
1190           break;
1191
1192         case EM_68K:
1193           rtype = elf_m68k_reloc_type (type);
1194           break;
1195
1196         case EM_960:
1197           rtype = elf_i960_reloc_type (type);
1198           break;
1199
1200         case EM_AVR:
1201         case EM_AVR_OLD:
1202           rtype = elf_avr_reloc_type (type);
1203           break;
1204
1205         case EM_OLD_SPARCV9:
1206         case EM_SPARC32PLUS:
1207         case EM_SPARCV9:
1208         case EM_SPARC:
1209           rtype = elf_sparc_reloc_type (type);
1210           break;
1211
1212         case EM_SPU:
1213           rtype = elf_spu_reloc_type (type);
1214           break;
1215
1216         case EM_V800:
1217           rtype = v800_reloc_type (type);
1218           break;
1219         case EM_V850:
1220         case EM_CYGNUS_V850:
1221           rtype = v850_reloc_type (type);
1222           break;
1223
1224         case EM_D10V:
1225         case EM_CYGNUS_D10V:
1226           rtype = elf_d10v_reloc_type (type);
1227           break;
1228
1229         case EM_D30V:
1230         case EM_CYGNUS_D30V:
1231           rtype = elf_d30v_reloc_type (type);
1232           break;
1233
1234         case EM_DLX:
1235           rtype = elf_dlx_reloc_type (type);
1236           break;
1237
1238         case EM_SH:
1239           rtype = elf_sh_reloc_type (type);
1240           break;
1241
1242         case EM_MN10300:
1243         case EM_CYGNUS_MN10300:
1244           rtype = elf_mn10300_reloc_type (type);
1245           break;
1246
1247         case EM_MN10200:
1248         case EM_CYGNUS_MN10200:
1249           rtype = elf_mn10200_reloc_type (type);
1250           break;
1251
1252         case EM_FR30:
1253         case EM_CYGNUS_FR30:
1254           rtype = elf_fr30_reloc_type (type);
1255           break;
1256
1257         case EM_CYGNUS_FRV:
1258           rtype = elf_frv_reloc_type (type);
1259           break;
1260
1261         case EM_FT32:
1262           rtype = elf_ft32_reloc_type (type);
1263           break;
1264
1265         case EM_MCORE:
1266           rtype = elf_mcore_reloc_type (type);
1267           break;
1268
1269         case EM_MMIX:
1270           rtype = elf_mmix_reloc_type (type);
1271           break;
1272
1273         case EM_MOXIE:
1274           rtype = elf_moxie_reloc_type (type);
1275           break;
1276
1277         case EM_MSP430:
1278           if (uses_msp430x_relocs ())
1279             {
1280               rtype = elf_msp430x_reloc_type (type);
1281               break;
1282             }
1283         case EM_MSP430_OLD:
1284           rtype = elf_msp430_reloc_type (type);
1285           break;
1286
1287         case EM_NDS32:
1288           rtype = elf_nds32_reloc_type (type);
1289           break;
1290
1291         case EM_PPC:
1292           rtype = elf_ppc_reloc_type (type);
1293           break;
1294
1295         case EM_PPC64:
1296           rtype = elf_ppc64_reloc_type (type);
1297           break;
1298
1299         case EM_MIPS:
1300         case EM_MIPS_RS3_LE:
1301           rtype = elf_mips_reloc_type (type);
1302           break;
1303
1304         case EM_ALPHA:
1305           rtype = elf_alpha_reloc_type (type);
1306           break;
1307
1308         case EM_ARM:
1309           rtype = elf_arm_reloc_type (type);
1310           break;
1311
1312         case EM_ARC:
1313           rtype = elf_arc_reloc_type (type);
1314           break;
1315
1316         case EM_PARISC:
1317           rtype = elf_hppa_reloc_type (type);
1318           break;
1319
1320         case EM_H8_300:
1321         case EM_H8_300H:
1322         case EM_H8S:
1323           rtype = elf_h8_reloc_type (type);
1324           break;
1325
1326         case EM_OR1K:
1327           rtype = elf_or1k_reloc_type (type);
1328           break;
1329
1330         case EM_PJ:
1331         case EM_PJ_OLD:
1332           rtype = elf_pj_reloc_type (type);
1333           break;
1334         case EM_IA_64:
1335           rtype = elf_ia64_reloc_type (type);
1336           break;
1337
1338         case EM_CRIS:
1339           rtype = elf_cris_reloc_type (type);
1340           break;
1341
1342         case EM_860:
1343           rtype = elf_i860_reloc_type (type);
1344           break;
1345
1346         case EM_X86_64:
1347         case EM_L1OM:
1348         case EM_K1OM:
1349           rtype = elf_x86_64_reloc_type (type);
1350           break;
1351
1352         case EM_S370:
1353           rtype = i370_reloc_type (type);
1354           break;
1355
1356         case EM_S390_OLD:
1357         case EM_S390:
1358           rtype = elf_s390_reloc_type (type);
1359           break;
1360
1361         case EM_SCORE:
1362           rtype = elf_score_reloc_type (type);
1363           break;
1364
1365         case EM_XSTORMY16:
1366           rtype = elf_xstormy16_reloc_type (type);
1367           break;
1368
1369         case EM_CRX:
1370           rtype = elf_crx_reloc_type (type);
1371           break;
1372
1373         case EM_VAX:
1374           rtype = elf_vax_reloc_type (type);
1375           break;
1376
1377         case EM_VISIUM:
1378           rtype = elf_visium_reloc_type (type);
1379           break;
1380
1381         case EM_ADAPTEVA_EPIPHANY:
1382           rtype = elf_epiphany_reloc_type (type);
1383           break;
1384
1385         case EM_IP2K:
1386         case EM_IP2K_OLD:
1387           rtype = elf_ip2k_reloc_type (type);
1388           break;
1389
1390         case EM_IQ2000:
1391           rtype = elf_iq2000_reloc_type (type);
1392           break;
1393
1394         case EM_XTENSA_OLD:
1395         case EM_XTENSA:
1396           rtype = elf_xtensa_reloc_type (type);
1397           break;
1398
1399         case EM_LATTICEMICO32:
1400           rtype = elf_lm32_reloc_type (type);
1401           break;
1402
1403         case EM_M32C_OLD:
1404         case EM_M32C:
1405           rtype = elf_m32c_reloc_type (type);
1406           break;
1407
1408         case EM_MT:
1409           rtype = elf_mt_reloc_type (type);
1410           break;
1411
1412         case EM_BLACKFIN:
1413           rtype = elf_bfin_reloc_type (type);
1414           break;
1415
1416         case EM_CYGNUS_MEP:
1417           rtype = elf_mep_reloc_type (type);
1418           break;
1419
1420         case EM_CR16:
1421           rtype = elf_cr16_reloc_type (type);
1422           break;
1423
1424         case EM_MICROBLAZE:
1425         case EM_MICROBLAZE_OLD:
1426           rtype = elf_microblaze_reloc_type (type);
1427           break;
1428
1429         case EM_RL78:
1430           rtype = elf_rl78_reloc_type (type);
1431           break;
1432
1433         case EM_RX:
1434           rtype = elf_rx_reloc_type (type);
1435           break;
1436
1437         case EM_METAG:
1438           rtype = elf_metag_reloc_type (type);
1439           break;
1440
1441         case EM_XC16X:
1442         case EM_C166:
1443           rtype = elf_xc16x_reloc_type (type);
1444           break;
1445
1446         case EM_TI_C6000:
1447           rtype = elf_tic6x_reloc_type (type);
1448           break;
1449
1450         case EM_TILEGX:
1451           rtype = elf_tilegx_reloc_type (type);
1452           break;
1453
1454         case EM_TILEPRO:
1455           rtype = elf_tilepro_reloc_type (type);
1456           break;
1457
1458         case EM_XGATE:
1459           rtype = elf_xgate_reloc_type (type);
1460           break;
1461
1462         case EM_ALTERA_NIOS2:
1463           rtype = elf_nios2_reloc_type (type);
1464           break;
1465         }
1466
1467       if (rtype == NULL)
1468         printf (_("unrecognized: %-7lx"), (unsigned long) type & 0xffffffff);
1469       else
1470         printf (do_wide ? "%-22.22s" : "%-17.17s", rtype);
1471
1472       if (elf_header.e_machine == EM_ALPHA
1473           && rtype != NULL
1474           && streq (rtype, "R_ALPHA_LITUSE")
1475           && is_rela)
1476         {
1477           switch (rels[i].r_addend)
1478             {
1479             case LITUSE_ALPHA_ADDR:   rtype = "ADDR";   break;
1480             case LITUSE_ALPHA_BASE:   rtype = "BASE";   break;
1481             case LITUSE_ALPHA_BYTOFF: rtype = "BYTOFF"; break;
1482             case LITUSE_ALPHA_JSR:    rtype = "JSR";    break;
1483             case LITUSE_ALPHA_TLSGD:  rtype = "TLSGD";  break;
1484             case LITUSE_ALPHA_TLSLDM: rtype = "TLSLDM"; break;
1485             case LITUSE_ALPHA_JSRDIRECT: rtype = "JSRDIRECT"; break;
1486             default: rtype = NULL;
1487             }
1488           if (rtype)
1489             printf (" (%s)", rtype);
1490           else
1491             {
1492               putchar (' ');
1493               printf (_("<unknown addend: %lx>"),
1494                       (unsigned long) rels[i].r_addend);
1495             }
1496         }
1497       else if (symtab_index)
1498         {
1499           if (symtab == NULL || symtab_index >= nsyms)
1500             printf (_(" bad symbol index: %08lx"), (unsigned long) symtab_index);
1501           else
1502             {
1503               Elf_Internal_Sym * psym;
1504               const char * version_string;
1505               enum versioned_symbol_info sym_info;
1506               unsigned short vna_other;
1507
1508               psym = symtab + symtab_index;
1509
1510               version_string
1511                 = get_symbol_version_string (file, is_dynsym,
1512                                              strtab, strtablen,
1513                                              symtab_index,
1514                                              psym,
1515                                              &sym_info,
1516                                              &vna_other);
1517
1518               printf (" ");
1519
1520               if (ELF_ST_TYPE (psym->st_info) == STT_GNU_IFUNC)
1521                 {
1522                   const char * name;
1523                   unsigned int len;
1524                   unsigned int width = is_32bit_elf ? 8 : 14;
1525
1526                   /* Relocations against GNU_IFUNC symbols do not use the value
1527                      of the symbol as the address to relocate against.  Instead
1528                      they invoke the function named by the symbol and use its
1529                      result as the address for relocation.
1530
1531                      To indicate this to the user, do not display the value of
1532                      the symbol in the "Symbols's Value" field.  Instead show
1533                      its name followed by () as a hint that the symbol is
1534                      invoked.  */
1535
1536                   if (strtab == NULL
1537                       || psym->st_name == 0
1538                       || psym->st_name >= strtablen)
1539                     name = "??";
1540                   else
1541                     name = strtab + psym->st_name;
1542
1543                   len = print_symbol (width, name);
1544                   if (version_string)
1545                     printf (sym_info == symbol_public ? "@@%s" : "@%s",
1546                             version_string);
1547                   printf ("()%-*s", len <= width ? (width + 1) - len : 1, " ");
1548                 }
1549               else
1550                 {
1551                   print_vma (psym->st_value, LONG_HEX);
1552
1553                   printf (is_32bit_elf ? "   " : " ");
1554                 }
1555
1556               if (psym->st_name == 0)
1557                 {
1558                   const char * sec_name = "<null>";
1559                   char name_buf[40];
1560
1561                   if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1562                     {
1563                       if (psym->st_shndx < elf_header.e_shnum)
1564                         sec_name = SECTION_NAME (section_headers + psym->st_shndx);
1565                       else if (psym->st_shndx == SHN_ABS)
1566                         sec_name = "ABS";
1567                       else if (psym->st_shndx == SHN_COMMON)
1568                         sec_name = "COMMON";
1569                       else if ((elf_header.e_machine == EM_MIPS
1570                                 && psym->st_shndx == SHN_MIPS_SCOMMON)
1571                                || (elf_header.e_machine == EM_TI_C6000
1572                                    && psym->st_shndx == SHN_TIC6X_SCOMMON))
1573                         sec_name = "SCOMMON";
1574                       else if (elf_header.e_machine == EM_MIPS
1575                                && psym->st_shndx == SHN_MIPS_SUNDEFINED)
1576                         sec_name = "SUNDEF";
1577                       else if ((elf_header.e_machine == EM_X86_64
1578                                 || elf_header.e_machine == EM_L1OM
1579                                 || elf_header.e_machine == EM_K1OM)
1580                                && psym->st_shndx == SHN_X86_64_LCOMMON)
1581                         sec_name = "LARGE_COMMON";
1582                       else if (elf_header.e_machine == EM_IA_64
1583                                && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
1584                                && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1585                         sec_name = "ANSI_COM";
1586                       else if (is_ia64_vms ()
1587                                && psym->st_shndx == SHN_IA_64_VMS_SYMVEC)
1588                         sec_name = "VMS_SYMVEC";
1589                       else
1590                         {
1591                           sprintf (name_buf, "<section 0x%x>",
1592                                    (unsigned int) psym->st_shndx);
1593                           sec_name = name_buf;
1594                         }
1595                     }
1596                   print_symbol (22, sec_name);
1597                 }
1598               else if (strtab == NULL)
1599                 printf (_("<string table index: %3ld>"), psym->st_name);
1600               else if (psym->st_name >= strtablen)
1601                 printf (_("<corrupt string table index: %3ld>"), psym->st_name);
1602               else
1603                 {
1604                   print_symbol (22, strtab + psym->st_name);
1605                   if (version_string)
1606                     printf (sym_info == symbol_public ? "@@%s" : "@%s",
1607                             version_string);
1608                 }
1609
1610               if (is_rela)
1611                 {
1612                   bfd_signed_vma off = rels[i].r_addend;
1613
1614                   /* PR 17531: file: 2e63226f.  */
1615                   if (off == ((bfd_signed_vma) 1) << ((sizeof (bfd_signed_vma) * 8) - 1))
1616                     printf (" + %" BFD_VMA_FMT "x", off);
1617                   else if (off < 0)
1618                     printf (" - %" BFD_VMA_FMT "x", - off);
1619                   else
1620                     printf (" + %" BFD_VMA_FMT "x", off);
1621                 }
1622             }
1623         }
1624       else if (is_rela)
1625         {
1626           bfd_signed_vma off = rels[i].r_addend;
1627
1628           printf ("%*c", is_32bit_elf ? 12 : 20, ' ');
1629           /* PR 17531: file: 2e63226f.  */
1630           if (off == ((bfd_signed_vma) 1) << ((sizeof (bfd_signed_vma) * 8) - 1))
1631             printf ("%" BFD_VMA_FMT "x", off);
1632           else if (off < 0)
1633             printf ("-%" BFD_VMA_FMT "x", - off);
1634           else
1635             printf ("%" BFD_VMA_FMT "x", off);
1636         }
1637
1638       if (elf_header.e_machine == EM_SPARCV9
1639           && rtype != NULL
1640           && streq (rtype, "R_SPARC_OLO10"))
1641         printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf));
1642
1643       putchar ('\n');
1644
1645 #ifdef BFD64
1646       if (! is_32bit_elf && elf_header.e_machine == EM_MIPS)
1647         {
1648           bfd_vma type2 = ELF64_MIPS_R_TYPE2 (inf);
1649           bfd_vma type3 = ELF64_MIPS_R_TYPE3 (inf);
1650           const char * rtype2 = elf_mips_reloc_type (type2);
1651           const char * rtype3 = elf_mips_reloc_type (type3);
1652
1653           printf ("                    Type2: ");
1654
1655           if (rtype2 == NULL)
1656             printf (_("unrecognized: %-7lx"),
1657                     (unsigned long) type2 & 0xffffffff);
1658           else
1659             printf ("%-17.17s", rtype2);
1660
1661           printf ("\n                    Type3: ");
1662
1663           if (rtype3 == NULL)
1664             printf (_("unrecognized: %-7lx"),
1665                     (unsigned long) type3 & 0xffffffff);
1666           else
1667             printf ("%-17.17s", rtype3);
1668
1669           putchar ('\n');
1670         }
1671 #endif /* BFD64 */
1672     }
1673
1674   free (rels);
1675 }
1676
1677 static const char *
1678 get_mips_dynamic_type (unsigned long type)
1679 {
1680   switch (type)
1681     {
1682     case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1683     case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1684     case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1685     case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1686     case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1687     case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1688     case DT_MIPS_MSYM: return "MIPS_MSYM";
1689     case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1690     case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1691     case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1692     case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1693     case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1694     case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1695     case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1696     case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1697     case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1698     case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1699     case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1700     case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1701     case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1702     case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1703     case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1704     case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1705     case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1706     case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1707     case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1708     case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1709     case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1710     case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1711     case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1712     case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1713     case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1714     case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1715     case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1716     case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1717     case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1718     case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1719     case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1720     case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1721     case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1722     case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1723     case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1724     case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1725     case DT_MIPS_PLTGOT: return "MIPS_PLTGOT";
1726     case DT_MIPS_RWPLT: return "MIPS_RWPLT";
1727     default:
1728       return NULL;
1729     }
1730 }
1731
1732 static const char *
1733 get_sparc64_dynamic_type (unsigned long type)
1734 {
1735   switch (type)
1736     {
1737     case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1738     default:
1739       return NULL;
1740     }
1741 }
1742
1743 static const char *
1744 get_ppc_dynamic_type (unsigned long type)
1745 {
1746   switch (type)
1747     {
1748     case DT_PPC_GOT:    return "PPC_GOT";
1749     case DT_PPC_OPT:    return "PPC_OPT";
1750     default:
1751       return NULL;
1752     }
1753 }
1754
1755 static const char *
1756 get_ppc64_dynamic_type (unsigned long type)
1757 {
1758   switch (type)
1759     {
1760     case DT_PPC64_GLINK:  return "PPC64_GLINK";
1761     case DT_PPC64_OPD:    return "PPC64_OPD";
1762     case DT_PPC64_OPDSZ:  return "PPC64_OPDSZ";
1763     case DT_PPC64_OPT:    return "PPC64_OPT";
1764     default:
1765       return NULL;
1766     }
1767 }
1768
1769 static const char *
1770 get_parisc_dynamic_type (unsigned long type)
1771 {
1772   switch (type)
1773     {
1774     case DT_HP_LOAD_MAP:        return "HP_LOAD_MAP";
1775     case DT_HP_DLD_FLAGS:       return "HP_DLD_FLAGS";
1776     case DT_HP_DLD_HOOK:        return "HP_DLD_HOOK";
1777     case DT_HP_UX10_INIT:       return "HP_UX10_INIT";
1778     case DT_HP_UX10_INITSZ:     return "HP_UX10_INITSZ";
1779     case DT_HP_PREINIT:         return "HP_PREINIT";
1780     case DT_HP_PREINITSZ:       return "HP_PREINITSZ";
1781     case DT_HP_NEEDED:          return "HP_NEEDED";
1782     case DT_HP_TIME_STAMP:      return "HP_TIME_STAMP";
1783     case DT_HP_CHECKSUM:        return "HP_CHECKSUM";
1784     case DT_HP_GST_SIZE:        return "HP_GST_SIZE";
1785     case DT_HP_GST_VERSION:     return "HP_GST_VERSION";
1786     case DT_HP_GST_HASHVAL:     return "HP_GST_HASHVAL";
1787     case DT_HP_EPLTREL:         return "HP_GST_EPLTREL";
1788     case DT_HP_EPLTRELSZ:       return "HP_GST_EPLTRELSZ";
1789     case DT_HP_FILTERED:        return "HP_FILTERED";
1790     case DT_HP_FILTER_TLS:      return "HP_FILTER_TLS";
1791     case DT_HP_COMPAT_FILTERED: return "HP_COMPAT_FILTERED";
1792     case DT_HP_LAZYLOAD:        return "HP_LAZYLOAD";
1793     case DT_HP_BIND_NOW_COUNT:  return "HP_BIND_NOW_COUNT";
1794     case DT_PLT:                return "PLT";
1795     case DT_PLT_SIZE:           return "PLT_SIZE";
1796     case DT_DLT:                return "DLT";
1797     case DT_DLT_SIZE:           return "DLT_SIZE";
1798     default:
1799       return NULL;
1800     }
1801 }
1802
1803 static const char *
1804 get_ia64_dynamic_type (unsigned long type)
1805 {
1806   switch (type)
1807     {
1808     case DT_IA_64_PLT_RESERVE:         return "IA_64_PLT_RESERVE";
1809     case DT_IA_64_VMS_SUBTYPE:         return "VMS_SUBTYPE";
1810     case DT_IA_64_VMS_IMGIOCNT:        return "VMS_IMGIOCNT";
1811     case DT_IA_64_VMS_LNKFLAGS:        return "VMS_LNKFLAGS";
1812     case DT_IA_64_VMS_VIR_MEM_BLK_SIZ: return "VMS_VIR_MEM_BLK_SIZ";
1813     case DT_IA_64_VMS_IDENT:           return "VMS_IDENT";
1814     case DT_IA_64_VMS_NEEDED_IDENT:    return "VMS_NEEDED_IDENT";
1815     case DT_IA_64_VMS_IMG_RELA_CNT:    return "VMS_IMG_RELA_CNT";
1816     case DT_IA_64_VMS_SEG_RELA_CNT:    return "VMS_SEG_RELA_CNT";
1817     case DT_IA_64_VMS_FIXUP_RELA_CNT:  return "VMS_FIXUP_RELA_CNT";
1818     case DT_IA_64_VMS_FIXUP_NEEDED:    return "VMS_FIXUP_NEEDED";
1819     case DT_IA_64_VMS_SYMVEC_CNT:      return "VMS_SYMVEC_CNT";
1820     case DT_IA_64_VMS_XLATED:          return "VMS_XLATED";
1821     case DT_IA_64_VMS_STACKSIZE:       return "VMS_STACKSIZE";
1822     case DT_IA_64_VMS_UNWINDSZ:        return "VMS_UNWINDSZ";
1823     case DT_IA_64_VMS_UNWIND_CODSEG:   return "VMS_UNWIND_CODSEG";
1824     case DT_IA_64_VMS_UNWIND_INFOSEG:  return "VMS_UNWIND_INFOSEG";
1825     case DT_IA_64_VMS_LINKTIME:        return "VMS_LINKTIME";
1826     case DT_IA_64_VMS_SEG_NO:          return "VMS_SEG_NO";
1827     case DT_IA_64_VMS_SYMVEC_OFFSET:   return "VMS_SYMVEC_OFFSET";
1828     case DT_IA_64_VMS_SYMVEC_SEG:      return "VMS_SYMVEC_SEG";
1829     case DT_IA_64_VMS_UNWIND_OFFSET:   return "VMS_UNWIND_OFFSET";
1830     case DT_IA_64_VMS_UNWIND_SEG:      return "VMS_UNWIND_SEG";
1831     case DT_IA_64_VMS_STRTAB_OFFSET:   return "VMS_STRTAB_OFFSET";
1832     case DT_IA_64_VMS_SYSVER_OFFSET:   return "VMS_SYSVER_OFFSET";
1833     case DT_IA_64_VMS_IMG_RELA_OFF:    return "VMS_IMG_RELA_OFF";
1834     case DT_IA_64_VMS_SEG_RELA_OFF:    return "VMS_SEG_RELA_OFF";
1835     case DT_IA_64_VMS_FIXUP_RELA_OFF:  return "VMS_FIXUP_RELA_OFF";
1836     case DT_IA_64_VMS_PLTGOT_OFFSET:   return "VMS_PLTGOT_OFFSET";
1837     case DT_IA_64_VMS_PLTGOT_SEG:      return "VMS_PLTGOT_SEG";
1838     case DT_IA_64_VMS_FPMODE:          return "VMS_FPMODE";
1839     default:
1840       return NULL;
1841     }
1842 }
1843
1844 static const char *
1845 get_alpha_dynamic_type (unsigned long type)
1846 {
1847   switch (type)
1848     {
1849     case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
1850     default:
1851       return NULL;
1852     }
1853 }
1854
1855 static const char *
1856 get_score_dynamic_type (unsigned long type)
1857 {
1858   switch (type)
1859     {
1860     case DT_SCORE_BASE_ADDRESS: return "SCORE_BASE_ADDRESS";
1861     case DT_SCORE_LOCAL_GOTNO:  return "SCORE_LOCAL_GOTNO";
1862     case DT_SCORE_SYMTABNO:     return "SCORE_SYMTABNO";
1863     case DT_SCORE_GOTSYM:       return "SCORE_GOTSYM";
1864     case DT_SCORE_UNREFEXTNO:   return "SCORE_UNREFEXTNO";
1865     case DT_SCORE_HIPAGENO:     return "SCORE_HIPAGENO";
1866     default:
1867       return NULL;
1868     }
1869 }
1870
1871 static const char *
1872 get_tic6x_dynamic_type (unsigned long type)
1873 {
1874   switch (type)
1875     {
1876     case DT_C6000_GSYM_OFFSET: return "C6000_GSYM_OFFSET";
1877     case DT_C6000_GSTR_OFFSET: return "C6000_GSTR_OFFSET";
1878     case DT_C6000_DSBT_BASE:   return "C6000_DSBT_BASE";
1879     case DT_C6000_DSBT_SIZE:   return "C6000_DSBT_SIZE";
1880     case DT_C6000_PREEMPTMAP:  return "C6000_PREEMPTMAP";
1881     case DT_C6000_DSBT_INDEX:  return "C6000_DSBT_INDEX";
1882     default:
1883       return NULL;
1884     }
1885 }
1886
1887 static const char *
1888 get_nios2_dynamic_type (unsigned long type)
1889 {
1890   switch (type)
1891     {
1892     case DT_NIOS2_GP: return "NIOS2_GP";
1893     default:
1894       return NULL;
1895     }
1896 }
1897
1898 static const char *
1899 get_dynamic_type (unsigned long type)
1900 {
1901   static char buff[64];
1902
1903   switch (type)
1904     {
1905     case DT_NULL:       return "NULL";
1906     case DT_NEEDED:     return "NEEDED";
1907     case DT_PLTRELSZ:   return "PLTRELSZ";
1908     case DT_PLTGOT:     return "PLTGOT";
1909     case DT_HASH:       return "HASH";
1910     case DT_STRTAB:     return "STRTAB";
1911     case DT_SYMTAB:     return "SYMTAB";
1912     case DT_RELA:       return "RELA";
1913     case DT_RELASZ:     return "RELASZ";
1914     case DT_RELAENT:    return "RELAENT";
1915     case DT_STRSZ:      return "STRSZ";
1916     case DT_SYMENT:     return "SYMENT";
1917     case DT_INIT:       return "INIT";
1918     case DT_FINI:       return "FINI";
1919     case DT_SONAME:     return "SONAME";
1920     case DT_RPATH:      return "RPATH";
1921     case DT_SYMBOLIC:   return "SYMBOLIC";
1922     case DT_REL:        return "REL";
1923     case DT_RELSZ:      return "RELSZ";
1924     case DT_RELENT:     return "RELENT";
1925     case DT_PLTREL:     return "PLTREL";
1926     case DT_DEBUG:      return "DEBUG";
1927     case DT_TEXTREL:    return "TEXTREL";
1928     case DT_JMPREL:     return "JMPREL";
1929     case DT_BIND_NOW:   return "BIND_NOW";
1930     case DT_INIT_ARRAY: return "INIT_ARRAY";
1931     case DT_FINI_ARRAY: return "FINI_ARRAY";
1932     case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
1933     case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
1934     case DT_RUNPATH:    return "RUNPATH";
1935     case DT_FLAGS:      return "FLAGS";
1936
1937     case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1938     case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
1939
1940     case DT_CHECKSUM:   return "CHECKSUM";
1941     case DT_PLTPADSZ:   return "PLTPADSZ";
1942     case DT_MOVEENT:    return "MOVEENT";
1943     case DT_MOVESZ:     return "MOVESZ";
1944     case DT_FEATURE:    return "FEATURE";
1945     case DT_POSFLAG_1:  return "POSFLAG_1";
1946     case DT_SYMINSZ:    return "SYMINSZ";
1947     case DT_SYMINENT:   return "SYMINENT"; /* aka VALRNGHI */
1948
1949     case DT_ADDRRNGLO:  return "ADDRRNGLO";
1950     case DT_CONFIG:     return "CONFIG";
1951     case DT_DEPAUDIT:   return "DEPAUDIT";
1952     case DT_AUDIT:      return "AUDIT";
1953     case DT_PLTPAD:     return "PLTPAD";
1954     case DT_MOVETAB:    return "MOVETAB";
1955     case DT_SYMINFO:    return "SYMINFO"; /* aka ADDRRNGHI */
1956
1957     case DT_VERSYM:     return "VERSYM";
1958
1959     case DT_TLSDESC_GOT: return "TLSDESC_GOT";
1960     case DT_TLSDESC_PLT: return "TLSDESC_PLT";
1961     case DT_RELACOUNT:  return "RELACOUNT";
1962     case DT_RELCOUNT:   return "RELCOUNT";
1963     case DT_FLAGS_1:    return "FLAGS_1";
1964     case DT_VERDEF:     return "VERDEF";
1965     case DT_VERDEFNUM:  return "VERDEFNUM";
1966     case DT_VERNEED:    return "VERNEED";
1967     case DT_VERNEEDNUM: return "VERNEEDNUM";
1968
1969     case DT_AUXILIARY:  return "AUXILIARY";
1970     case DT_USED:       return "USED";
1971     case DT_FILTER:     return "FILTER";
1972
1973     case DT_GNU_PRELINKED: return "GNU_PRELINKED";
1974     case DT_GNU_CONFLICT: return "GNU_CONFLICT";
1975     case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
1976     case DT_GNU_LIBLIST: return "GNU_LIBLIST";
1977     case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
1978     case DT_GNU_HASH:   return "GNU_HASH";
1979
1980     default:
1981       if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
1982         {
1983           const char * result;
1984
1985           switch (elf_header.e_machine)
1986             {
1987             case EM_MIPS:
1988             case EM_MIPS_RS3_LE:
1989               result = get_mips_dynamic_type (type);
1990               break;
1991             case EM_SPARCV9:
1992               result = get_sparc64_dynamic_type (type);
1993               break;
1994             case EM_PPC:
1995               result = get_ppc_dynamic_type (type);
1996               break;
1997             case EM_PPC64:
1998               result = get_ppc64_dynamic_type (type);
1999               break;
2000             case EM_IA_64:
2001               result = get_ia64_dynamic_type (type);
2002               break;
2003             case EM_ALPHA:
2004               result = get_alpha_dynamic_type (type);
2005               break;
2006             case EM_SCORE:
2007               result = get_score_dynamic_type (type);
2008               break;
2009             case EM_TI_C6000:
2010               result = get_tic6x_dynamic_type (type);
2011               break;
2012             case EM_ALTERA_NIOS2:
2013               result = get_nios2_dynamic_type (type);
2014               break;
2015             default:
2016               result = NULL;
2017               break;
2018             }
2019
2020           if (result != NULL)
2021             return result;
2022
2023           snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
2024         }
2025       else if (((type >= DT_LOOS) && (type <= DT_HIOS))
2026                || (elf_header.e_machine == EM_PARISC
2027                    && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
2028         {
2029           const char * result;
2030
2031           switch (elf_header.e_machine)
2032             {
2033             case EM_PARISC:
2034               result = get_parisc_dynamic_type (type);
2035               break;
2036             case EM_IA_64:
2037               result = get_ia64_dynamic_type (type);
2038               break;
2039             default:
2040               result = NULL;
2041               break;
2042             }
2043
2044           if (result != NULL)
2045             return result;
2046
2047           snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
2048                     type);
2049         }
2050       else
2051         snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
2052
2053       return buff;
2054     }
2055 }
2056
2057 static char *
2058 get_file_type (unsigned e_type)
2059 {
2060   static char buff[32];
2061
2062   switch (e_type)
2063     {
2064     case ET_NONE:       return _("NONE (None)");
2065     case ET_REL:        return _("REL (Relocatable file)");
2066     case ET_EXEC:       return _("EXEC (Executable file)");
2067     case ET_DYN:        return _("DYN (Shared object file)");
2068     case ET_CORE:       return _("CORE (Core file)");
2069
2070     default:
2071       if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
2072         snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
2073       else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
2074         snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
2075       else
2076         snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
2077       return buff;
2078     }
2079 }
2080
2081 static char *
2082 get_machine_name (unsigned e_machine)
2083 {
2084   static char buff[64]; /* XXX */
2085
2086   switch (e_machine)
2087     {
2088     case EM_NONE:               return _("None");
2089     case EM_AARCH64:            return "AArch64";
2090     case EM_M32:                return "WE32100";
2091     case EM_SPARC:              return "Sparc";
2092     case EM_SPU:                return "SPU";
2093     case EM_386:                return "Intel 80386";
2094     case EM_68K:                return "MC68000";
2095     case EM_88K:                return "MC88000";
2096     case EM_486:                return "Intel 80486";
2097     case EM_860:                return "Intel 80860";
2098     case EM_MIPS:               return "MIPS R3000";
2099     case EM_S370:               return "IBM System/370";
2100     case EM_MIPS_RS3_LE:        return "MIPS R4000 big-endian";
2101     case EM_OLD_SPARCV9:        return "Sparc v9 (old)";
2102     case EM_PARISC:             return "HPPA";
2103     case EM_PPC_OLD:            return "Power PC (old)";
2104     case EM_SPARC32PLUS:        return "Sparc v8+" ;
2105     case EM_960:                return "Intel 90860";
2106     case EM_PPC:                return "PowerPC";
2107     case EM_PPC64:              return "PowerPC64";
2108     case EM_FR20:               return "Fujitsu FR20";
2109     case EM_FT32:               return "FTDI FT32";
2110     case EM_RH32:               return "TRW RH32";
2111     case EM_MCORE:              return "MCORE";
2112     case EM_ARM:                return "ARM";
2113     case EM_OLD_ALPHA:          return "Digital Alpha (old)";
2114     case EM_SH:                 return "Renesas / SuperH SH";
2115     case EM_SPARCV9:            return "Sparc v9";
2116     case EM_TRICORE:            return "Siemens Tricore";
2117     case EM_ARC:                return "ARC";
2118     case EM_H8_300:             return "Renesas H8/300";
2119     case EM_H8_300H:            return "Renesas H8/300H";
2120     case EM_H8S:                return "Renesas H8S";
2121     case EM_H8_500:             return "Renesas H8/500";
2122     case EM_IA_64:              return "Intel IA-64";
2123     case EM_MIPS_X:             return "Stanford MIPS-X";
2124     case EM_COLDFIRE:           return "Motorola Coldfire";
2125     case EM_ALPHA:              return "Alpha";
2126     case EM_CYGNUS_D10V:
2127     case EM_D10V:               return "d10v";
2128     case EM_CYGNUS_D30V:
2129     case EM_D30V:               return "d30v";
2130     case EM_CYGNUS_M32R:
2131     case EM_M32R:               return "Renesas M32R (formerly Mitsubishi M32r)";
2132     case EM_CYGNUS_V850:
2133     case EM_V800:               return "Renesas V850 (using RH850 ABI)";
2134     case EM_V850:               return "Renesas V850";
2135     case EM_CYGNUS_MN10300:
2136     case EM_MN10300:            return "mn10300";
2137     case EM_CYGNUS_MN10200:
2138     case EM_MN10200:            return "mn10200";
2139     case EM_MOXIE:              return "Moxie";
2140     case EM_CYGNUS_FR30:
2141     case EM_FR30:               return "Fujitsu FR30";
2142     case EM_CYGNUS_FRV:         return "Fujitsu FR-V";
2143     case EM_PJ_OLD:
2144     case EM_PJ:                 return "picoJava";
2145     case EM_MMA:                return "Fujitsu Multimedia Accelerator";
2146     case EM_PCP:                return "Siemens PCP";
2147     case EM_NCPU:               return "Sony nCPU embedded RISC processor";
2148     case EM_NDR1:               return "Denso NDR1 microprocesspr";
2149     case EM_STARCORE:           return "Motorola Star*Core processor";
2150     case EM_ME16:               return "Toyota ME16 processor";
2151     case EM_ST100:              return "STMicroelectronics ST100 processor";
2152     case EM_TINYJ:              return "Advanced Logic Corp. TinyJ embedded processor";
2153     case EM_PDSP:               return "Sony DSP processor";
2154     case EM_PDP10:              return "Digital Equipment Corp. PDP-10";
2155     case EM_PDP11:              return "Digital Equipment Corp. PDP-11";
2156     case EM_FX66:               return "Siemens FX66 microcontroller";
2157     case EM_ST9PLUS:            return "STMicroelectronics ST9+ 8/16 bit microcontroller";
2158     case EM_ST7:                return "STMicroelectronics ST7 8-bit microcontroller";
2159     case EM_68HC16:             return "Motorola MC68HC16 Microcontroller";
2160     case EM_68HC12:             return "Motorola MC68HC12 Microcontroller";
2161     case EM_68HC11:             return "Motorola MC68HC11 Microcontroller";
2162     case EM_68HC08:             return "Motorola MC68HC08 Microcontroller";
2163     case EM_68HC05:             return "Motorola MC68HC05 Microcontroller";
2164     case EM_SVX:                return "Silicon Graphics SVx";
2165     case EM_ST19:               return "STMicroelectronics ST19 8-bit microcontroller";
2166     case EM_VAX:                return "Digital VAX";
2167     case EM_VISIUM:             return "CDS VISIUMcore processor";
2168     case EM_AVR_OLD:
2169     case EM_AVR:                return "Atmel AVR 8-bit microcontroller";
2170     case EM_CRIS:               return "Axis Communications 32-bit embedded processor";
2171     case EM_JAVELIN:            return "Infineon Technologies 32-bit embedded cpu";
2172     case EM_FIREPATH:           return "Element 14 64-bit DSP processor";
2173     case EM_ZSP:                return "LSI Logic's 16-bit DSP processor";
2174     case EM_MMIX:               return "Donald Knuth's educational 64-bit processor";
2175     case EM_HUANY:              return "Harvard Universitys's machine-independent object format";
2176     case EM_PRISM:              return "Vitesse Prism";
2177     case EM_X86_64:             return "Advanced Micro Devices X86-64";
2178     case EM_L1OM:               return "Intel L1OM";
2179     case EM_K1OM:               return "Intel K1OM";
2180     case EM_S390_OLD:
2181     case EM_S390:               return "IBM S/390";
2182     case EM_SCORE:              return "SUNPLUS S+Core";
2183     case EM_XSTORMY16:          return "Sanyo XStormy16 CPU core";
2184     case EM_OR1K:               return "OpenRISC 1000";
2185     case EM_ARC_A5:             return "ARC International ARCompact processor";
2186     case EM_CRX:                return "National Semiconductor CRX microprocessor";
2187     case EM_ADAPTEVA_EPIPHANY:  return "Adapteva EPIPHANY";
2188     case EM_DLX:                return "OpenDLX";
2189     case EM_IP2K_OLD:
2190     case EM_IP2K:               return "Ubicom IP2xxx 8-bit microcontrollers";
2191     case EM_IQ2000:             return "Vitesse IQ2000";
2192     case EM_XTENSA_OLD:
2193     case EM_XTENSA:             return "Tensilica Xtensa Processor";
2194     case EM_VIDEOCORE:          return "Alphamosaic VideoCore processor";
2195     case EM_TMM_GPP:            return "Thompson Multimedia General Purpose Processor";
2196     case EM_NS32K:              return "National Semiconductor 32000 series";
2197     case EM_TPC:                return "Tenor Network TPC processor";
2198     case EM_ST200:              return "STMicroelectronics ST200 microcontroller";
2199     case EM_MAX:                return "MAX Processor";
2200     case EM_CR:                 return "National Semiconductor CompactRISC";
2201     case EM_F2MC16:             return "Fujitsu F2MC16";
2202     case EM_MSP430:             return "Texas Instruments msp430 microcontroller";
2203     case EM_LATTICEMICO32:      return "Lattice Mico32";
2204     case EM_M32C_OLD:
2205     case EM_M32C:               return "Renesas M32c";
2206     case EM_MT:                 return "Morpho Techologies MT processor";
2207     case EM_BLACKFIN:           return "Analog Devices Blackfin";
2208     case EM_SE_C33:             return "S1C33 Family of Seiko Epson processors";
2209     case EM_SEP:                return "Sharp embedded microprocessor";
2210     case EM_ARCA:               return "Arca RISC microprocessor";
2211     case EM_UNICORE:            return "Unicore";
2212     case EM_EXCESS:             return "eXcess 16/32/64-bit configurable embedded CPU";
2213     case EM_DXP:                return "Icera Semiconductor Inc. Deep Execution Processor";
2214     case EM_NIOS32:             return "Altera Nios";
2215     case EM_ALTERA_NIOS2:       return "Altera Nios II";
2216     case EM_C166:
2217     case EM_XC16X:              return "Infineon Technologies xc16x";
2218     case EM_M16C:               return "Renesas M16C series microprocessors";
2219     case EM_DSPIC30F:           return "Microchip Technology dsPIC30F Digital Signal Controller";
2220     case EM_CE:                 return "Freescale Communication Engine RISC core";
2221     case EM_TSK3000:            return "Altium TSK3000 core";
2222     case EM_RS08:               return "Freescale RS08 embedded processor";
2223     case EM_ECOG2:              return "Cyan Technology eCOG2 microprocessor";
2224     case EM_DSP24:              return "New Japan Radio (NJR) 24-bit DSP Processor";
2225     case EM_VIDEOCORE3:         return "Broadcom VideoCore III processor";
2226     case EM_SE_C17:             return "Seiko Epson C17 family";
2227     case EM_TI_C6000:           return "Texas Instruments TMS320C6000 DSP family";
2228     case EM_TI_C2000:           return "Texas Instruments TMS320C2000 DSP family";
2229     case EM_TI_C5500:           return "Texas Instruments TMS320C55x DSP family";
2230     case EM_MMDSP_PLUS:         return "STMicroelectronics 64bit VLIW Data Signal Processor";
2231     case EM_CYPRESS_M8C:        return "Cypress M8C microprocessor";
2232     case EM_R32C:               return "Renesas R32C series microprocessors";
2233     case EM_TRIMEDIA:           return "NXP Semiconductors TriMedia architecture family";
2234     case EM_QDSP6:              return "QUALCOMM DSP6 Processor";
2235     case EM_8051:               return "Intel 8051 and variants";
2236     case EM_STXP7X:             return "STMicroelectronics STxP7x family";
2237     case EM_NDS32:              return "Andes Technology compact code size embedded RISC processor family";
2238     case EM_ECOG1X:             return "Cyan Technology eCOG1X family";
2239     case EM_MAXQ30:             return "Dallas Semiconductor MAXQ30 Core microcontrollers";
2240     case EM_XIMO16:             return "New Japan Radio (NJR) 16-bit DSP Processor";
2241     case EM_MANIK:              return "M2000 Reconfigurable RISC Microprocessor";
2242     case EM_CRAYNV2:            return "Cray Inc. NV2 vector architecture";
2243     case EM_CYGNUS_MEP:         return "Toshiba MeP Media Engine";
2244     case EM_CR16:
2245     case EM_MICROBLAZE:
2246     case EM_MICROBLAZE_OLD:     return "Xilinx MicroBlaze";
2247     case EM_RL78:               return "Renesas RL78";
2248     case EM_RX:                 return "Renesas RX";
2249     case EM_METAG:              return "Imagination Technologies Meta processor architecture";
2250     case EM_MCST_ELBRUS:        return "MCST Elbrus general purpose hardware architecture";
2251     case EM_ECOG16:             return "Cyan Technology eCOG16 family";
2252     case EM_ETPU:               return "Freescale Extended Time Processing Unit";
2253     case EM_SLE9X:              return "Infineon Technologies SLE9X core";
2254     case EM_AVR32:              return "Atmel Corporation 32-bit microprocessor family";
2255     case EM_STM8:               return "STMicroeletronics STM8 8-bit microcontroller";
2256     case EM_TILE64:             return "Tilera TILE64 multicore architecture family";
2257     case EM_TILEPRO:            return "Tilera TILEPro multicore architecture family";
2258     case EM_TILEGX:             return "Tilera TILE-Gx multicore architecture family";
2259     case EM_CUDA:               return "NVIDIA CUDA architecture";
2260     case EM_XGATE:              return "Motorola XGATE embedded processor";
2261     default:
2262       snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
2263       return buff;
2264     }
2265 }
2266
2267 static void
2268 decode_ARM_machine_flags (unsigned e_flags, char buf[])
2269 {
2270   unsigned eabi;
2271   int unknown = 0;
2272
2273   eabi = EF_ARM_EABI_VERSION (e_flags);
2274   e_flags &= ~ EF_ARM_EABIMASK;
2275
2276   /* Handle "generic" ARM flags.  */
2277   if (e_flags & EF_ARM_RELEXEC)
2278     {
2279       strcat (buf, ", relocatable executable");
2280       e_flags &= ~ EF_ARM_RELEXEC;
2281     }
2282
2283   if (e_flags & EF_ARM_HASENTRY)
2284     {
2285       strcat (buf, ", has entry point");
2286       e_flags &= ~ EF_ARM_HASENTRY;
2287     }
2288
2289   /* Now handle EABI specific flags.  */
2290   switch (eabi)
2291     {
2292     default:
2293       strcat (buf, ", <unrecognized EABI>");
2294       if (e_flags)
2295         unknown = 1;
2296       break;
2297
2298     case EF_ARM_EABI_VER1:
2299       strcat (buf, ", Version1 EABI");
2300       while (e_flags)
2301         {
2302           unsigned flag;
2303
2304           /* Process flags one bit at a time.  */
2305           flag = e_flags & - e_flags;
2306           e_flags &= ~ flag;
2307
2308           switch (flag)
2309             {
2310             case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK.  */
2311               strcat (buf, ", sorted symbol tables");
2312               break;
2313
2314             default:
2315               unknown = 1;
2316               break;
2317             }
2318         }
2319       break;
2320
2321     case EF_ARM_EABI_VER2:
2322       strcat (buf, ", Version2 EABI");
2323       while (e_flags)
2324         {
2325           unsigned flag;
2326
2327           /* Process flags one bit at a time.  */
2328           flag = e_flags & - e_flags;
2329           e_flags &= ~ flag;
2330
2331           switch (flag)
2332             {
2333             case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK.  */
2334               strcat (buf, ", sorted symbol tables");
2335               break;
2336
2337             case EF_ARM_DYNSYMSUSESEGIDX:
2338               strcat (buf, ", dynamic symbols use segment index");
2339               break;
2340
2341             case EF_ARM_MAPSYMSFIRST:
2342               strcat (buf, ", mapping symbols precede others");
2343               break;
2344
2345             default:
2346               unknown = 1;
2347               break;
2348             }
2349         }
2350       break;
2351
2352     case EF_ARM_EABI_VER3:
2353       strcat (buf, ", Version3 EABI");
2354       break;
2355
2356     case EF_ARM_EABI_VER4:
2357       strcat (buf, ", Version4 EABI");
2358       while (e_flags)
2359         {
2360           unsigned flag;
2361
2362           /* Process flags one bit at a time.  */
2363           flag = e_flags & - e_flags;
2364           e_flags &= ~ flag;
2365
2366           switch (flag)
2367             {
2368             case EF_ARM_BE8:
2369               strcat (buf, ", BE8");
2370               break;
2371
2372             case EF_ARM_LE8:
2373               strcat (buf, ", LE8");
2374               break;
2375
2376             default:
2377               unknown = 1;
2378               break;
2379             }
2380       break;
2381         }
2382       break;
2383
2384     case EF_ARM_EABI_VER5:
2385       strcat (buf, ", Version5 EABI");
2386       while (e_flags)
2387         {
2388           unsigned flag;
2389
2390           /* Process flags one bit at a time.  */
2391           flag = e_flags & - e_flags;
2392           e_flags &= ~ flag;
2393
2394           switch (flag)
2395             {
2396             case EF_ARM_BE8:
2397               strcat (buf, ", BE8");
2398               break;
2399
2400             case EF_ARM_LE8:
2401               strcat (buf, ", LE8");
2402               break;
2403
2404             case EF_ARM_ABI_FLOAT_SOFT: /* Conflicts with EF_ARM_SOFT_FLOAT.  */
2405               strcat (buf, ", soft-float ABI");
2406               break;
2407
2408             case EF_ARM_ABI_FLOAT_HARD: /* Conflicts with EF_ARM_VFP_FLOAT.  */
2409               strcat (buf, ", hard-float ABI");
2410               break;
2411
2412             default:
2413               unknown = 1;
2414               break;
2415             }
2416         }
2417       break;
2418
2419     case EF_ARM_EABI_UNKNOWN:
2420       strcat (buf, ", GNU EABI");
2421       while (e_flags)
2422         {
2423           unsigned flag;
2424
2425           /* Process flags one bit at a time.  */
2426           flag = e_flags & - e_flags;
2427           e_flags &= ~ flag;
2428
2429           switch (flag)
2430             {
2431             case EF_ARM_INTERWORK:
2432               strcat (buf, ", interworking enabled");
2433               break;
2434
2435             case EF_ARM_APCS_26:
2436               strcat (buf, ", uses APCS/26");
2437               break;
2438
2439             case EF_ARM_APCS_FLOAT:
2440               strcat (buf, ", uses APCS/float");
2441               break;
2442
2443             case EF_ARM_PIC:
2444               strcat (buf, ", position independent");
2445               break;
2446
2447             case EF_ARM_ALIGN8:
2448               strcat (buf, ", 8 bit structure alignment");
2449               break;
2450
2451             case EF_ARM_NEW_ABI:
2452               strcat (buf, ", uses new ABI");
2453               break;
2454
2455             case EF_ARM_OLD_ABI:
2456               strcat (buf, ", uses old ABI");
2457               break;
2458
2459             case EF_ARM_SOFT_FLOAT:
2460               strcat (buf, ", software FP");
2461               break;
2462
2463             case EF_ARM_VFP_FLOAT:
2464               strcat (buf, ", VFP");
2465               break;
2466
2467             case EF_ARM_MAVERICK_FLOAT:
2468               strcat (buf, ", Maverick FP");
2469               break;
2470
2471             default:
2472               unknown = 1;
2473               break;
2474             }
2475         }
2476     }
2477
2478   if (unknown)
2479     strcat (buf,_(", <unknown>"));
2480 }
2481
2482 static void
2483 decode_AVR_machine_flags (unsigned e_flags, char buf[], size_t size)
2484 {
2485   --size; /* Leave space for null terminator.  */
2486
2487   switch (e_flags & EF_AVR_MACH)
2488     {
2489     case E_AVR_MACH_AVR1:
2490       strncat (buf, ", avr:1", size);
2491       break;
2492     case E_AVR_MACH_AVR2:
2493       strncat (buf, ", avr:2", size);
2494       break;
2495     case E_AVR_MACH_AVR25:
2496       strncat (buf, ", avr:25", size);
2497       break;
2498     case E_AVR_MACH_AVR3:
2499       strncat (buf, ", avr:3", size);
2500       break;
2501     case E_AVR_MACH_AVR31:
2502       strncat (buf, ", avr:31", size);
2503       break;
2504     case E_AVR_MACH_AVR35:
2505       strncat (buf, ", avr:35", size);
2506       break;
2507     case E_AVR_MACH_AVR4:
2508       strncat (buf, ", avr:4", size);
2509       break;
2510     case E_AVR_MACH_AVR5:
2511       strncat (buf, ", avr:5", size);
2512       break;
2513     case E_AVR_MACH_AVR51:
2514       strncat (buf, ", avr:51", size);
2515       break;
2516     case E_AVR_MACH_AVR6:
2517       strncat (buf, ", avr:6", size);
2518       break;
2519     case E_AVR_MACH_AVRTINY:
2520       strncat (buf, ", avr:100", size);
2521       break;
2522     case E_AVR_MACH_XMEGA1:
2523       strncat (buf, ", avr:101", size);
2524       break;
2525     case E_AVR_MACH_XMEGA2:
2526       strncat (buf, ", avr:102", size);
2527       break;
2528     case E_AVR_MACH_XMEGA3:
2529       strncat (buf, ", avr:103", size);
2530       break;
2531     case E_AVR_MACH_XMEGA4:
2532       strncat (buf, ", avr:104", size);
2533       break;
2534     case E_AVR_MACH_XMEGA5:
2535       strncat (buf, ", avr:105", size);
2536       break;
2537     case E_AVR_MACH_XMEGA6:
2538       strncat (buf, ", avr:106", size);
2539       break;
2540     case E_AVR_MACH_XMEGA7:
2541       strncat (buf, ", avr:107", size);
2542       break;
2543     default:
2544       strncat (buf, ", avr:<unknown>", size);
2545       break;
2546     }
2547
2548   size -= strlen (buf);
2549   if (e_flags & EF_AVR_LINKRELAX_PREPARED)
2550     strncat (buf, ", link-relax", size);
2551 }
2552
2553 static void
2554 decode_NDS32_machine_flags (unsigned e_flags, char buf[], size_t size)
2555 {
2556   unsigned abi;
2557   unsigned arch;
2558   unsigned config;
2559   unsigned version;
2560   int has_fpu = 0;
2561   int r = 0;
2562
2563   static const char *ABI_STRINGS[] =
2564   {
2565     "ABI v0", /* use r5 as return register; only used in N1213HC */
2566     "ABI v1", /* use r0 as return register */
2567     "ABI v2", /* use r0 as return register and don't reserve 24 bytes for arguments */
2568     "ABI v2fp", /* for FPU */
2569     "AABI",
2570     "ABI2 FP+"
2571   };
2572   static const char *VER_STRINGS[] =
2573   {
2574     "Andes ELF V1.3 or older",
2575     "Andes ELF V1.3.1",
2576     "Andes ELF V1.4"
2577   };
2578   static const char *ARCH_STRINGS[] =
2579   {
2580     "",
2581     "Andes Star v1.0",
2582     "Andes Star v2.0",
2583     "Andes Star v3.0",
2584     "Andes Star v3.0m"
2585   };
2586
2587   abi = EF_NDS_ABI & e_flags;
2588   arch = EF_NDS_ARCH & e_flags;
2589   config = EF_NDS_INST & e_flags;
2590   version = EF_NDS32_ELF_VERSION & e_flags;
2591
2592   memset (buf, 0, size);
2593
2594   switch (abi)
2595     {
2596     case E_NDS_ABI_V0:
2597     case E_NDS_ABI_V1:
2598     case E_NDS_ABI_V2:
2599     case E_NDS_ABI_V2FP:
2600     case E_NDS_ABI_AABI:
2601     case E_NDS_ABI_V2FP_PLUS:
2602       /* In case there are holes in the array.  */
2603       r += snprintf (buf + r, size - r, ", %s", ABI_STRINGS[abi >> EF_NDS_ABI_SHIFT]);
2604       break;
2605
2606     default:
2607       r += snprintf (buf + r, size - r, ", <unrecognized ABI>");
2608       break;
2609     }
2610
2611   switch (version)
2612     {
2613     case E_NDS32_ELF_VER_1_2:
2614     case E_NDS32_ELF_VER_1_3:
2615     case E_NDS32_ELF_VER_1_4:
2616       r += snprintf (buf + r, size - r, ", %s", VER_STRINGS[version >> EF_NDS32_ELF_VERSION_SHIFT]);
2617       break;
2618
2619     default:
2620       r += snprintf (buf + r, size - r, ", <unrecognized ELF version number>");
2621       break;
2622     }
2623
2624   if (E_NDS_ABI_V0 == abi)
2625     {
2626       /* OLD ABI; only used in N1213HC, has performance extension 1.  */
2627       r += snprintf (buf + r, size - r, ", Andes Star v1.0, N1213HC, MAC, PERF1");
2628       if (arch == E_NDS_ARCH_STAR_V1_0)
2629         r += snprintf (buf + r, size -r, ", 16b"); /* has 16-bit instructions */
2630       return;
2631     }
2632
2633   switch (arch)
2634     {
2635     case E_NDS_ARCH_STAR_V1_0:
2636     case E_NDS_ARCH_STAR_V2_0:
2637     case E_NDS_ARCH_STAR_V3_0:
2638     case E_NDS_ARCH_STAR_V3_M:
2639       r += snprintf (buf + r, size - r, ", %s", ARCH_STRINGS[arch >> EF_NDS_ARCH_SHIFT]);
2640       break;
2641
2642     default:
2643       r += snprintf (buf + r, size - r, ", <unrecognized architecture>");
2644       /* ARCH version determines how the e_flags are interpreted.
2645          If it is unknown, we cannot proceed.  */
2646       return;
2647     }
2648
2649   /* Newer ABI; Now handle architecture specific flags.  */
2650   if (arch == E_NDS_ARCH_STAR_V1_0)
2651     {
2652       if (config & E_NDS32_HAS_MFUSR_PC_INST)
2653         r += snprintf (buf + r, size -r, ", MFUSR_PC");
2654
2655       if (!(config & E_NDS32_HAS_NO_MAC_INST))
2656         r += snprintf (buf + r, size -r, ", MAC");
2657
2658       if (config & E_NDS32_HAS_DIV_INST)
2659         r += snprintf (buf + r, size -r, ", DIV");
2660
2661       if (config & E_NDS32_HAS_16BIT_INST)
2662         r += snprintf (buf + r, size -r, ", 16b");
2663     }
2664   else
2665     {
2666       if (config & E_NDS32_HAS_MFUSR_PC_INST)
2667         {
2668           if (version <= E_NDS32_ELF_VER_1_3)
2669             r += snprintf (buf + r, size -r, ", [B8]");
2670           else
2671             r += snprintf (buf + r, size -r, ", EX9");
2672         }
2673
2674       if (config & E_NDS32_HAS_MAC_DX_INST)
2675         r += snprintf (buf + r, size -r, ", MAC_DX");
2676
2677       if (config & E_NDS32_HAS_DIV_DX_INST)
2678         r += snprintf (buf + r, size -r, ", DIV_DX");
2679
2680       if (config & E_NDS32_HAS_16BIT_INST)
2681         {
2682           if (version <= E_NDS32_ELF_VER_1_3)
2683             r += snprintf (buf + r, size -r, ", 16b");
2684           else
2685             r += snprintf (buf + r, size -r, ", IFC");
2686         }
2687     }
2688
2689   if (config & E_NDS32_HAS_EXT_INST)
2690     r += snprintf (buf + r, size -r, ", PERF1");
2691
2692   if (config & E_NDS32_HAS_EXT2_INST)
2693     r += snprintf (buf + r, size -r, ", PERF2");
2694
2695   if (config & E_NDS32_HAS_FPU_INST)
2696     {
2697       has_fpu = 1;
2698       r += snprintf (buf + r, size -r, ", FPU_SP");
2699     }
2700
2701   if (config & E_NDS32_HAS_FPU_DP_INST)
2702     {
2703       has_fpu = 1;
2704       r += snprintf (buf + r, size -r, ", FPU_DP");
2705     }
2706
2707   if (config & E_NDS32_HAS_FPU_MAC_INST)
2708     {
2709       has_fpu = 1;
2710       r += snprintf (buf + r, size -r, ", FPU_MAC");
2711     }
2712
2713   if (has_fpu)
2714     {
2715       switch ((config & E_NDS32_FPU_REG_CONF) >> E_NDS32_FPU_REG_CONF_SHIFT)
2716         {
2717         case E_NDS32_FPU_REG_8SP_4DP:
2718           r += snprintf (buf + r, size -r, ", FPU_REG:8/4");
2719           break;
2720         case E_NDS32_FPU_REG_16SP_8DP:
2721           r += snprintf (buf + r, size -r, ", FPU_REG:16/8");
2722           break;
2723         case E_NDS32_FPU_REG_32SP_16DP:
2724           r += snprintf (buf + r, size -r, ", FPU_REG:32/16");
2725           break;
2726         case E_NDS32_FPU_REG_32SP_32DP:
2727           r += snprintf (buf + r, size -r, ", FPU_REG:32/32");
2728           break;
2729         }
2730     }
2731
2732   if (config & E_NDS32_HAS_AUDIO_INST)
2733     r += snprintf (buf + r, size -r, ", AUDIO");
2734
2735   if (config & E_NDS32_HAS_STRING_INST)
2736     r += snprintf (buf + r, size -r, ", STR");
2737
2738   if (config & E_NDS32_HAS_REDUCED_REGS)
2739     r += snprintf (buf + r, size -r, ", 16REG");
2740
2741   if (config & E_NDS32_HAS_VIDEO_INST)
2742     {
2743       if (version <= E_NDS32_ELF_VER_1_3)
2744         r += snprintf (buf + r, size -r, ", VIDEO");
2745       else
2746         r += snprintf (buf + r, size -r, ", SATURATION");
2747     }
2748
2749   if (config & E_NDS32_HAS_ENCRIPT_INST)
2750     r += snprintf (buf + r, size -r, ", ENCRP");
2751
2752   if (config & E_NDS32_HAS_L2C_INST)
2753     r += snprintf (buf + r, size -r, ", L2C");
2754 }
2755
2756 static char *
2757 get_machine_flags (unsigned e_flags, unsigned e_machine)
2758 {
2759   static char buf[1024];
2760
2761   buf[0] = '\0';
2762
2763   if (e_flags)
2764     {
2765       switch (e_machine)
2766         {
2767         default:
2768           break;
2769
2770         case EM_ARM:
2771           decode_ARM_machine_flags (e_flags, buf);
2772           break;
2773
2774         case EM_AVR:
2775           decode_AVR_machine_flags (e_flags, buf, sizeof buf);
2776           break;
2777
2778         case EM_BLACKFIN:
2779           if (e_flags & EF_BFIN_PIC)
2780             strcat (buf, ", PIC");
2781
2782           if (e_flags & EF_BFIN_FDPIC)
2783             strcat (buf, ", FDPIC");
2784
2785           if (e_flags & EF_BFIN_CODE_IN_L1)
2786             strcat (buf, ", code in L1");
2787
2788           if (e_flags & EF_BFIN_DATA_IN_L1)
2789             strcat (buf, ", data in L1");
2790
2791           break;
2792
2793         case EM_CYGNUS_FRV:
2794           switch (e_flags & EF_FRV_CPU_MASK)
2795             {
2796             case EF_FRV_CPU_GENERIC:
2797               break;
2798
2799             default:
2800               strcat (buf, ", fr???");
2801               break;
2802
2803             case EF_FRV_CPU_FR300:
2804               strcat (buf, ", fr300");
2805               break;
2806
2807             case EF_FRV_CPU_FR400:
2808               strcat (buf, ", fr400");
2809               break;
2810             case EF_FRV_CPU_FR405:
2811               strcat (buf, ", fr405");
2812               break;
2813
2814             case EF_FRV_CPU_FR450:
2815               strcat (buf, ", fr450");
2816               break;
2817
2818             case EF_FRV_CPU_FR500:
2819               strcat (buf, ", fr500");
2820               break;
2821             case EF_FRV_CPU_FR550:
2822               strcat (buf, ", fr550");
2823               break;
2824
2825             case EF_FRV_CPU_SIMPLE:
2826               strcat (buf, ", simple");
2827               break;
2828             case EF_FRV_CPU_TOMCAT:
2829               strcat (buf, ", tomcat");
2830               break;
2831             }
2832           break;
2833
2834         case EM_68K:
2835           if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
2836             strcat (buf, ", m68000");
2837           else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
2838             strcat (buf, ", cpu32");
2839           else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
2840             strcat (buf, ", fido_a");
2841           else
2842             {
2843               char const * isa = _("unknown");
2844               char const * mac = _("unknown mac");
2845               char const * additional = NULL;
2846
2847               switch (e_flags & EF_M68K_CF_ISA_MASK)
2848                 {
2849                 case EF_M68K_CF_ISA_A_NODIV:
2850                   isa = "A";
2851                   additional = ", nodiv";
2852                   break;
2853                 case EF_M68K_CF_ISA_A:
2854                   isa = "A";
2855                   break;
2856                 case EF_M68K_CF_ISA_A_PLUS:
2857                   isa = "A+";
2858                   break;
2859                 case EF_M68K_CF_ISA_B_NOUSP:
2860                   isa = "B";
2861                   additional = ", nousp";
2862                   break;
2863                 case EF_M68K_CF_ISA_B:
2864                   isa = "B";
2865                   break;
2866                 case EF_M68K_CF_ISA_C:
2867                   isa = "C";
2868                   break;
2869                 case EF_M68K_CF_ISA_C_NODIV:
2870                   isa = "C";
2871                   additional = ", nodiv";
2872                   break;
2873                 }
2874               strcat (buf, ", cf, isa ");
2875               strcat (buf, isa);
2876               if (additional)
2877                 strcat (buf, additional);
2878               if (e_flags & EF_M68K_CF_FLOAT)
2879                 strcat (buf, ", float");
2880               switch (e_flags & EF_M68K_CF_MAC_MASK)
2881                 {
2882                 case 0:
2883                   mac = NULL;
2884                   break;
2885                 case EF_M68K_CF_MAC:
2886                   mac = "mac";
2887                   break;
2888                 case EF_M68K_CF_EMAC:
2889                   mac = "emac";
2890                   break;
2891                 case EF_M68K_CF_EMAC_B:
2892                   mac = "emac_b";
2893                   break;
2894                 }
2895               if (mac)
2896                 {
2897                   strcat (buf, ", ");
2898                   strcat (buf, mac);
2899                 }
2900             }
2901           break;
2902
2903         case EM_PPC:
2904           if (e_flags & EF_PPC_EMB)
2905             strcat (buf, ", emb");
2906
2907           if (e_flags & EF_PPC_RELOCATABLE)
2908             strcat (buf, _(", relocatable"));
2909
2910           if (e_flags & EF_PPC_RELOCATABLE_LIB)
2911             strcat (buf, _(", relocatable-lib"));
2912           break;
2913
2914         case EM_PPC64:
2915           if (e_flags & EF_PPC64_ABI)
2916             {
2917               char abi[] = ", abiv0";
2918
2919               abi[6] += e_flags & EF_PPC64_ABI;
2920               strcat (buf, abi);
2921             }
2922           break;
2923
2924         case EM_V800:
2925           if ((e_flags & EF_RH850_ABI) == EF_RH850_ABI)
2926             strcat (buf, ", RH850 ABI");
2927
2928           if (e_flags & EF_V800_850E3)
2929             strcat (buf, ", V3 architecture");
2930
2931           if ((e_flags & (EF_RH850_FPU_DOUBLE | EF_RH850_FPU_SINGLE)) == 0)
2932             strcat (buf, ", FPU not used");
2933
2934           if ((e_flags & (EF_RH850_REGMODE22 | EF_RH850_REGMODE32)) == 0)
2935             strcat (buf, ", regmode: COMMON");
2936
2937           if ((e_flags & (EF_RH850_GP_FIX | EF_RH850_GP_NOFIX)) == 0)
2938             strcat (buf, ", r4 not used");
2939
2940           if ((e_flags & (EF_RH850_EP_FIX | EF_RH850_EP_NOFIX)) == 0)
2941             strcat (buf, ", r30 not used");
2942
2943           if ((e_flags & (EF_RH850_TP_FIX | EF_RH850_TP_NOFIX)) == 0)
2944             strcat (buf, ", r5 not used");
2945
2946           if ((e_flags & (EF_RH850_REG2_RESERVE | EF_RH850_REG2_NORESERVE)) == 0)
2947             strcat (buf, ", r2 not used");
2948
2949           for (e_flags &= 0xFFFF; e_flags; e_flags &= ~ (e_flags & - e_flags))
2950             {
2951               switch (e_flags & - e_flags)
2952                 {
2953                 case EF_RH850_FPU_DOUBLE: strcat (buf, ", double precision FPU"); break;
2954                 case EF_RH850_FPU_SINGLE: strcat (buf, ", single precision FPU"); break;
2955                 case EF_RH850_SIMD: strcat (buf, ", SIMD"); break;
2956                 case EF_RH850_CACHE: strcat (buf, ", CACHE"); break;
2957                 case EF_RH850_MMU: strcat (buf, ", MMU"); break;
2958                 case EF_RH850_REGMODE22: strcat (buf, ", regmode:22"); break;
2959                 case EF_RH850_REGMODE32: strcat (buf, ", regmode:23"); break;
2960                 case EF_RH850_DATA_ALIGN8: strcat (buf, ", 8-byte alignment"); break;
2961                 case EF_RH850_GP_FIX: strcat (buf, ", r4 fixed"); break;
2962                 case EF_RH850_GP_NOFIX: strcat (buf, ", r4 free"); break;
2963                 case EF_RH850_EP_FIX: strcat (buf, ", r30 fixed"); break;
2964                 case EF_RH850_EP_NOFIX: strcat (buf, ", r30 free"); break;
2965                 case EF_RH850_TP_FIX: strcat (buf, ", r5 fixed"); break;
2966                 case EF_RH850_TP_NOFIX: strcat (buf, ", r5 free"); break;
2967                 case EF_RH850_REG2_RESERVE: strcat (buf, ", r2 fixed"); break;
2968                 case EF_RH850_REG2_NORESERVE: strcat (buf, ", r2 free"); break;
2969                 default: break;
2970                 }
2971             }
2972           break;
2973
2974         case EM_V850:
2975         case EM_CYGNUS_V850:
2976           switch (e_flags & EF_V850_ARCH)
2977             {
2978             case E_V850E3V5_ARCH:
2979               strcat (buf, ", v850e3v5");
2980               break;
2981             case E_V850E2V3_ARCH:
2982               strcat (buf, ", v850e2v3");
2983               break;
2984             case E_V850E2_ARCH:
2985               strcat (buf, ", v850e2");
2986               break;
2987             case E_V850E1_ARCH:
2988               strcat (buf, ", v850e1");
2989               break;
2990             case E_V850E_ARCH:
2991               strcat (buf, ", v850e");
2992               break;
2993             case E_V850_ARCH:
2994               strcat (buf, ", v850");
2995               break;
2996             default:
2997               strcat (buf, _(", unknown v850 architecture variant"));
2998               break;
2999             }
3000           break;
3001
3002         case EM_M32R:
3003         case EM_CYGNUS_M32R:
3004           if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
3005             strcat (buf, ", m32r");
3006           break;
3007
3008         case EM_MIPS:
3009         case EM_MIPS_RS3_LE:
3010           if (e_flags & EF_MIPS_NOREORDER)
3011             strcat (buf, ", noreorder");
3012
3013           if (e_flags & EF_MIPS_PIC)
3014             strcat (buf, ", pic");
3015
3016           if (e_flags & EF_MIPS_CPIC)
3017             strcat (buf, ", cpic");
3018
3019           if (e_flags & EF_MIPS_UCODE)
3020             strcat (buf, ", ugen_reserved");
3021
3022           if (e_flags & EF_MIPS_ABI2)
3023             strcat (buf, ", abi2");
3024
3025           if (e_flags & EF_MIPS_OPTIONS_FIRST)
3026             strcat (buf, ", odk first");
3027
3028           if (e_flags & EF_MIPS_32BITMODE)
3029             strcat (buf, ", 32bitmode");
3030
3031           if (e_flags & EF_MIPS_NAN2008)
3032             strcat (buf, ", nan2008");
3033
3034           if (e_flags & EF_MIPS_FP64)
3035             strcat (buf, ", fp64");
3036
3037           switch ((e_flags & EF_MIPS_MACH))
3038             {
3039             case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
3040             case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
3041             case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
3042             case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
3043             case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
3044             case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
3045             case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
3046             case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
3047             case E_MIPS_MACH_SB1:  strcat (buf, ", sb1");  break;
3048             case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
3049             case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break;
3050             case E_MIPS_MACH_LS2F: strcat (buf, ", loongson-2f"); break;
3051             case E_MIPS_MACH_LS3A: strcat (buf, ", loongson-3a"); break;
3052             case E_MIPS_MACH_OCTEON: strcat (buf, ", octeon"); break;
3053             case E_MIPS_MACH_OCTEON2: strcat (buf, ", octeon2"); break;
3054             case E_MIPS_MACH_OCTEON3: strcat (buf, ", octeon3"); break;
3055             case E_MIPS_MACH_XLR:  strcat (buf, ", xlr"); break;
3056             case 0:
3057             /* We simply ignore the field in this case to avoid confusion:
3058                MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
3059                extension.  */
3060               break;
3061             default: strcat (buf, _(", unknown CPU")); break;
3062             }
3063
3064           switch ((e_flags & EF_MIPS_ABI))
3065             {
3066             case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
3067             case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
3068             case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
3069             case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
3070             case 0:
3071             /* We simply ignore the field in this case to avoid confusion:
3072                MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
3073                This means it is likely to be an o32 file, but not for
3074                sure.  */
3075               break;
3076             default: strcat (buf, _(", unknown ABI")); break;
3077             }
3078
3079           if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
3080             strcat (buf, ", mdmx");
3081
3082           if (e_flags & EF_MIPS_ARCH_ASE_M16)
3083             strcat (buf, ", mips16");
3084
3085           if (e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
3086             strcat (buf, ", micromips");
3087
3088           switch ((e_flags & EF_MIPS_ARCH))
3089             {
3090             case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
3091             case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
3092             case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
3093             case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
3094             case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
3095             case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
3096             case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
3097             case E_MIPS_ARCH_32R6: strcat (buf, ", mips32r6"); break;
3098             case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
3099             case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
3100             case E_MIPS_ARCH_64R6: strcat (buf, ", mips64r6"); break;
3101             default: strcat (buf, _(", unknown ISA")); break;
3102             }
3103           break;
3104
3105         case EM_NDS32:
3106           decode_NDS32_machine_flags (e_flags, buf, sizeof buf);
3107           break;
3108
3109         case EM_SH:
3110           switch ((e_flags & EF_SH_MACH_MASK))
3111             {
3112             case EF_SH1: strcat (buf, ", sh1"); break;
3113             case EF_SH2: strcat (buf, ", sh2"); break;
3114             case EF_SH3: strcat (buf, ", sh3"); break;
3115             case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
3116             case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
3117             case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
3118             case EF_SH3E: strcat (buf, ", sh3e"); break;
3119             case EF_SH4: strcat (buf, ", sh4"); break;
3120             case EF_SH5: strcat (buf, ", sh5"); break;
3121             case EF_SH2E: strcat (buf, ", sh2e"); break;
3122             case EF_SH4A: strcat (buf, ", sh4a"); break;
3123             case EF_SH2A: strcat (buf, ", sh2a"); break;
3124             case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
3125             case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
3126             case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
3127             case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
3128             case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
3129             case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
3130             case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
3131             case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
3132             case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
3133             default: strcat (buf, _(", unknown ISA")); break;
3134             }
3135
3136           if (e_flags & EF_SH_PIC)
3137             strcat (buf, ", pic");
3138
3139           if (e_flags & EF_SH_FDPIC)
3140             strcat (buf, ", fdpic");
3141           break;
3142
3143         case EM_OR1K:
3144           if (e_flags & EF_OR1K_NODELAY)
3145             strcat (buf, ", no delay");
3146           break;
3147
3148         case EM_SPARCV9:
3149           if (e_flags & EF_SPARC_32PLUS)
3150             strcat (buf, ", v8+");
3151
3152           if (e_flags & EF_SPARC_SUN_US1)
3153             strcat (buf, ", ultrasparcI");
3154
3155           if (e_flags & EF_SPARC_SUN_US3)
3156             strcat (buf, ", ultrasparcIII");
3157
3158           if (e_flags & EF_SPARC_HAL_R1)
3159             strcat (buf, ", halr1");
3160
3161           if (e_flags & EF_SPARC_LEDATA)
3162             strcat (buf, ", ledata");
3163
3164           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
3165             strcat (buf, ", tso");
3166
3167           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
3168             strcat (buf, ", pso");
3169
3170           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
3171             strcat (buf, ", rmo");
3172           break;
3173
3174         case EM_PARISC:
3175           switch (e_flags & EF_PARISC_ARCH)
3176             {
3177             case EFA_PARISC_1_0:
3178               strcpy (buf, ", PA-RISC 1.0");
3179               break;
3180             case EFA_PARISC_1_1:
3181               strcpy (buf, ", PA-RISC 1.1");
3182               break;
3183             case EFA_PARISC_2_0:
3184               strcpy (buf, ", PA-RISC 2.0");
3185               break;
3186             default:
3187               break;
3188             }
3189           if (e_flags & EF_PARISC_TRAPNIL)
3190             strcat (buf, ", trapnil");
3191           if (e_flags & EF_PARISC_EXT)
3192             strcat (buf, ", ext");
3193           if (e_flags & EF_PARISC_LSB)
3194             strcat (buf, ", lsb");
3195           if (e_flags & EF_PARISC_WIDE)
3196             strcat (buf, ", wide");
3197           if (e_flags & EF_PARISC_NO_KABP)
3198             strcat (buf, ", no kabp");
3199           if (e_flags & EF_PARISC_LAZYSWAP)
3200             strcat (buf, ", lazyswap");
3201           break;
3202
3203         case EM_PJ:
3204         case EM_PJ_OLD:
3205           if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
3206             strcat (buf, ", new calling convention");
3207
3208           if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
3209             strcat (buf, ", gnu calling convention");
3210           break;
3211
3212         case EM_IA_64:
3213           if ((e_flags & EF_IA_64_ABI64))
3214             strcat (buf, ", 64-bit");
3215           else
3216             strcat (buf, ", 32-bit");
3217           if ((e_flags & EF_IA_64_REDUCEDFP))
3218             strcat (buf, ", reduced fp model");
3219           if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
3220             strcat (buf, ", no function descriptors, constant gp");
3221           else if ((e_flags & EF_IA_64_CONS_GP))
3222             strcat (buf, ", constant gp");
3223           if ((e_flags & EF_IA_64_ABSOLUTE))
3224             strcat (buf, ", absolute");
3225           if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
3226             {
3227               if ((e_flags & EF_IA_64_VMS_LINKAGES))
3228                 strcat (buf, ", vms_linkages");
3229               switch ((e_flags & EF_IA_64_VMS_COMCOD))
3230                 {
3231                 case EF_IA_64_VMS_COMCOD_SUCCESS:
3232                   break;
3233                 case EF_IA_64_VMS_COMCOD_WARNING:
3234                   strcat (buf, ", warning");
3235                   break;
3236                 case EF_IA_64_VMS_COMCOD_ERROR:
3237                   strcat (buf, ", error");
3238                   break;
3239                 case EF_IA_64_VMS_COMCOD_ABORT:
3240                   strcat (buf, ", abort");
3241                   break;
3242                 default:
3243                   warn (_("Unrecognised IA64 VMS Command Code: %x\n"),
3244                         e_flags & EF_IA_64_VMS_COMCOD);
3245                   strcat (buf, ", <unknown>");
3246                 }
3247             }
3248           break;
3249
3250         case EM_VAX:
3251           if ((e_flags & EF_VAX_NONPIC))
3252             strcat (buf, ", non-PIC");
3253           if ((e_flags & EF_VAX_DFLOAT))
3254             strcat (buf, ", D-Float");
3255           if ((e_flags & EF_VAX_GFLOAT))
3256             strcat (buf, ", G-Float");
3257           break;
3258
3259         case EM_VISIUM:
3260           if (e_flags & EF_VISIUM_ARCH_MCM)
3261             strcat (buf, ", mcm");
3262           else if (e_flags & EF_VISIUM_ARCH_MCM24)
3263             strcat (buf, ", mcm24");
3264           if (e_flags & EF_VISIUM_ARCH_GR6)
3265             strcat (buf, ", gr6");
3266           break;
3267
3268         case EM_RL78:
3269           if (e_flags & E_FLAG_RL78_G10)
3270             strcat (buf, ", G10");
3271           if (e_flags & E_FLAG_RL78_64BIT_DOUBLES)
3272             strcat (buf, ", 64-bit doubles");
3273           break;
3274
3275         case EM_RX:
3276           if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
3277             strcat (buf, ", 64-bit doubles");
3278           if (e_flags & E_FLAG_RX_DSP)
3279             strcat (buf, ", dsp");
3280           if (e_flags & E_FLAG_RX_PID)
3281             strcat (buf, ", pid");
3282           if (e_flags & E_FLAG_RX_ABI)
3283             strcat (buf, ", RX ABI");
3284           break;
3285
3286         case EM_S390:
3287           if (e_flags & EF_S390_HIGH_GPRS)
3288             strcat (buf, ", highgprs");
3289           break;
3290
3291         case EM_TI_C6000:
3292           if ((e_flags & EF_C6000_REL))
3293             strcat (buf, ", relocatable module");
3294           break;
3295
3296         case EM_MSP430:
3297           strcat (buf, _(": architecture variant: "));
3298           switch (e_flags & EF_MSP430_MACH)
3299             {
3300             case E_MSP430_MACH_MSP430x11: strcat (buf, "MSP430x11"); break;
3301             case E_MSP430_MACH_MSP430x11x1 : strcat (buf, "MSP430x11x1 "); break;
3302             case E_MSP430_MACH_MSP430x12: strcat (buf, "MSP430x12"); break;
3303             case E_MSP430_MACH_MSP430x13: strcat (buf, "MSP430x13"); break;
3304             case E_MSP430_MACH_MSP430x14: strcat (buf, "MSP430x14"); break;
3305             case E_MSP430_MACH_MSP430x15: strcat (buf, "MSP430x15"); break;
3306             case E_MSP430_MACH_MSP430x16: strcat (buf, "MSP430x16"); break;
3307             case E_MSP430_MACH_MSP430x31: strcat (buf, "MSP430x31"); break;
3308             case E_MSP430_MACH_MSP430x32: strcat (buf, "MSP430x32"); break;
3309             case E_MSP430_MACH_MSP430x33: strcat (buf, "MSP430x33"); break;
3310             case E_MSP430_MACH_MSP430x41: strcat (buf, "MSP430x41"); break;
3311             case E_MSP430_MACH_MSP430x42: strcat (buf, "MSP430x42"); break;
3312             case E_MSP430_MACH_MSP430x43: strcat (buf, "MSP430x43"); break;
3313             case E_MSP430_MACH_MSP430x44: strcat (buf, "MSP430x44"); break;
3314             case E_MSP430_MACH_MSP430X  : strcat (buf, "MSP430X"); break;
3315             default:
3316               strcat (buf, _(": unknown")); break;
3317             }
3318
3319           if (e_flags & ~ EF_MSP430_MACH)
3320             strcat (buf, _(": unknown extra flag bits also present"));
3321         }
3322     }
3323
3324   return buf;
3325 }
3326
3327 static const char *
3328 get_osabi_name (unsigned int osabi)
3329 {
3330   static char buff[32];
3331
3332   switch (osabi)
3333     {
3334     case ELFOSABI_NONE:         return "UNIX - System V";
3335     case ELFOSABI_HPUX:         return "UNIX - HP-UX";
3336     case ELFOSABI_NETBSD:       return "UNIX - NetBSD";
3337     case ELFOSABI_GNU:          return "UNIX - GNU";
3338     case ELFOSABI_SOLARIS:      return "UNIX - Solaris";
3339     case ELFOSABI_AIX:          return "UNIX - AIX";
3340     case ELFOSABI_IRIX:         return "UNIX - IRIX";
3341     case ELFOSABI_FREEBSD:      return "UNIX - FreeBSD";
3342     case ELFOSABI_TRU64:        return "UNIX - TRU64";
3343     case ELFOSABI_MODESTO:      return "Novell - Modesto";
3344     case ELFOSABI_OPENBSD:      return "UNIX - OpenBSD";
3345     case ELFOSABI_OPENVMS:      return "VMS - OpenVMS";
3346     case ELFOSABI_NSK:          return "HP - Non-Stop Kernel";
3347     case ELFOSABI_AROS:         return "AROS";
3348     case ELFOSABI_FENIXOS:      return "FenixOS";
3349     default:
3350       if (osabi >= 64)
3351         switch (elf_header.e_machine)
3352           {
3353           case EM_ARM:
3354             switch (osabi)
3355               {
3356               case ELFOSABI_ARM:        return "ARM";
3357               default:
3358                 break;
3359               }
3360             break;
3361
3362           case EM_MSP430:
3363           case EM_MSP430_OLD:
3364           case EM_VISIUM:
3365             switch (osabi)
3366               {
3367               case ELFOSABI_STANDALONE: return _("Standalone App");
3368               default:
3369                 break;
3370               }
3371             break;
3372
3373           case EM_TI_C6000:
3374             switch (osabi)
3375               {
3376               case ELFOSABI_C6000_ELFABI:       return _("Bare-metal C6000");
3377               case ELFOSABI_C6000_LINUX:        return "Linux C6000";
3378               default:
3379                 break;
3380               }
3381             break;
3382
3383           default:
3384             break;
3385           }
3386       snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
3387       return buff;
3388     }
3389 }
3390
3391 static const char *
3392 get_aarch64_segment_type (unsigned long type)
3393 {
3394   switch (type)
3395     {
3396     case PT_AARCH64_ARCHEXT:
3397       return "AARCH64_ARCHEXT";
3398     default:
3399       break;
3400     }
3401
3402   return NULL;
3403 }
3404
3405 static const char *
3406 get_arm_segment_type (unsigned long type)
3407 {
3408   switch (type)
3409     {
3410     case PT_ARM_EXIDX:
3411       return "EXIDX";
3412     default:
3413       break;
3414     }
3415
3416   return NULL;
3417 }
3418
3419 static const char *
3420 get_mips_segment_type (unsigned long type)
3421 {
3422   switch (type)
3423     {
3424     case PT_MIPS_REGINFO:
3425       return "REGINFO";
3426     case PT_MIPS_RTPROC:
3427       return "RTPROC";
3428     case PT_MIPS_OPTIONS:
3429       return "OPTIONS";
3430     case PT_MIPS_ABIFLAGS:
3431       return "ABIFLAGS";
3432     default:
3433       break;
3434     }
3435
3436   return NULL;
3437 }
3438
3439 static const char *
3440 get_parisc_segment_type (unsigned long type)
3441 {
3442   switch (type)
3443     {
3444     case PT_HP_TLS:             return "HP_TLS";
3445     case PT_HP_CORE_NONE:       return "HP_CORE_NONE";
3446     case PT_HP_CORE_VERSION:    return "HP_CORE_VERSION";
3447     case PT_HP_CORE_KERNEL:     return "HP_CORE_KERNEL";
3448     case PT_HP_CORE_COMM:       return "HP_CORE_COMM";
3449     case PT_HP_CORE_PROC:       return "HP_CORE_PROC";
3450     case PT_HP_CORE_LOADABLE:   return "HP_CORE_LOADABLE";
3451     case PT_HP_CORE_STACK:      return "HP_CORE_STACK";
3452     case PT_HP_CORE_SHM:        return "HP_CORE_SHM";
3453     case PT_HP_CORE_MMF:        return "HP_CORE_MMF";
3454     case PT_HP_PARALLEL:        return "HP_PARALLEL";
3455     case PT_HP_FASTBIND:        return "HP_FASTBIND";
3456     case PT_HP_OPT_ANNOT:       return "HP_OPT_ANNOT";
3457     case PT_HP_HSL_ANNOT:       return "HP_HSL_ANNOT";
3458     case PT_HP_STACK:           return "HP_STACK";
3459     case PT_HP_CORE_UTSNAME:    return "HP_CORE_UTSNAME";
3460     case PT_PARISC_ARCHEXT:     return "PARISC_ARCHEXT";
3461     case PT_PARISC_UNWIND:      return "PARISC_UNWIND";
3462     case PT_PARISC_WEAKORDER:   return "PARISC_WEAKORDER";
3463     default:
3464       break;
3465     }
3466
3467   return NULL;
3468 }
3469
3470 static const char *
3471 get_ia64_segment_type (unsigned long type)
3472 {
3473   switch (type)
3474     {
3475     case PT_IA_64_ARCHEXT:      return "IA_64_ARCHEXT";
3476     case PT_IA_64_UNWIND:       return "IA_64_UNWIND";
3477     case PT_HP_TLS:             return "HP_TLS";
3478     case PT_IA_64_HP_OPT_ANOT:  return "HP_OPT_ANNOT";
3479     case PT_IA_64_HP_HSL_ANOT:  return "HP_HSL_ANNOT";
3480     case PT_IA_64_HP_STACK:     return "HP_STACK";
3481     default:
3482       break;
3483     }
3484
3485   return NULL;
3486 }
3487
3488 static const char *
3489 get_tic6x_segment_type (unsigned long type)
3490 {
3491   switch (type)
3492     {
3493     case PT_C6000_PHATTR:       return "C6000_PHATTR";
3494     default:
3495       break;
3496     }
3497
3498   return NULL;
3499 }
3500
3501 static const char *
3502 get_segment_type (unsigned long p_type)
3503 {
3504   static char buff[32];
3505
3506   switch (p_type)
3507     {
3508     case PT_NULL:       return "NULL";
3509     case PT_LOAD:       return "LOAD";
3510     case PT_DYNAMIC:    return "DYNAMIC";
3511     case PT_INTERP:     return "INTERP";
3512     case PT_NOTE:       return "NOTE";
3513     case PT_SHLIB:      return "SHLIB";
3514     case PT_PHDR:       return "PHDR";
3515     case PT_TLS:        return "TLS";
3516
3517     case PT_GNU_EH_FRAME:
3518                         return "GNU_EH_FRAME";
3519     case PT_GNU_STACK:  return "GNU_STACK";
3520     case PT_GNU_RELRO:  return "GNU_RELRO";
3521
3522     default:
3523       if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
3524         {
3525           const char * result;
3526
3527           switch (elf_header.e_machine)
3528             {
3529             case EM_AARCH64:
3530               result = get_aarch64_segment_type (p_type);
3531               break;
3532             case EM_ARM:
3533               result = get_arm_segment_type (p_type);
3534               break;
3535             case EM_MIPS:
3536             case EM_MIPS_RS3_LE:
3537               result = get_mips_segment_type (p_type);
3538               break;
3539             case EM_PARISC:
3540               result = get_parisc_segment_type (p_type);
3541               break;
3542             case EM_IA_64:
3543               result = get_ia64_segment_type (p_type);
3544               break;
3545             case EM_TI_C6000:
3546               result = get_tic6x_segment_type (p_type);
3547               break;
3548             default:
3549               result = NULL;
3550               break;
3551             }
3552
3553           if (result != NULL)
3554             return result;
3555
3556           sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
3557         }
3558       else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
3559         {
3560           const char * result;
3561
3562           switch (elf_header.e_machine)
3563             {
3564             case EM_PARISC:
3565               result = get_parisc_segment_type (p_type);
3566               break;
3567             case EM_IA_64:
3568               result = get_ia64_segment_type (p_type);
3569               break;
3570             default:
3571               result = NULL;
3572               break;
3573             }
3574
3575           if (result != NULL)
3576             return result;
3577
3578           sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
3579         }
3580       else
3581         snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
3582
3583       return buff;
3584     }
3585 }
3586
3587 static const char *
3588 get_mips_section_type_name (unsigned int sh_type)
3589 {
3590   switch (sh_type)
3591     {
3592     case SHT_MIPS_LIBLIST:       return "MIPS_LIBLIST";
3593     case SHT_MIPS_MSYM:          return "MIPS_MSYM";
3594     case SHT_MIPS_CONFLICT:      return "MIPS_CONFLICT";
3595     case SHT_MIPS_GPTAB:         return "MIPS_GPTAB";
3596     case SHT_MIPS_UCODE:         return "MIPS_UCODE";
3597     case SHT_MIPS_DEBUG:         return "MIPS_DEBUG";
3598     case SHT_MIPS_REGINFO:       return "MIPS_REGINFO";
3599     case SHT_MIPS_PACKAGE:       return "MIPS_PACKAGE";
3600     case SHT_MIPS_PACKSYM:       return "MIPS_PACKSYM";
3601     case SHT_MIPS_RELD:          return "MIPS_RELD";
3602     case SHT_MIPS_IFACE:         return "MIPS_IFACE";
3603     case SHT_MIPS_CONTENT:       return "MIPS_CONTENT";
3604     case SHT_MIPS_OPTIONS:       return "MIPS_OPTIONS";
3605     case SHT_MIPS_SHDR:          return "MIPS_SHDR";
3606     case SHT_MIPS_FDESC:         return "MIPS_FDESC";
3607     case SHT_MIPS_EXTSYM:        return "MIPS_EXTSYM";
3608     case SHT_MIPS_DENSE:         return "MIPS_DENSE";
3609     case SHT_MIPS_PDESC:         return "MIPS_PDESC";
3610     case SHT_MIPS_LOCSYM:        return "MIPS_LOCSYM";
3611     case SHT_MIPS_AUXSYM:        return "MIPS_AUXSYM";
3612     case SHT_MIPS_OPTSYM:        return "MIPS_OPTSYM";
3613     case SHT_MIPS_LOCSTR:        return "MIPS_LOCSTR";
3614     case SHT_MIPS_LINE:          return "MIPS_LINE";
3615     case SHT_MIPS_RFDESC:        return "MIPS_RFDESC";
3616     case SHT_MIPS_DELTASYM:      return "MIPS_DELTASYM";
3617     case SHT_MIPS_DELTAINST:     return "MIPS_DELTAINST";
3618     case SHT_MIPS_DELTACLASS:    return "MIPS_DELTACLASS";
3619     case SHT_MIPS_DWARF:         return "MIPS_DWARF";
3620     case SHT_MIPS_DELTADECL:     return "MIPS_DELTADECL";
3621     case SHT_MIPS_SYMBOL_LIB:    return "MIPS_SYMBOL_LIB";
3622     case SHT_MIPS_EVENTS:        return "MIPS_EVENTS";
3623     case SHT_MIPS_TRANSLATE:     return "MIPS_TRANSLATE";
3624     case SHT_MIPS_PIXIE:         return "MIPS_PIXIE";
3625     case SHT_MIPS_XLATE:         return "MIPS_XLATE";
3626     case SHT_MIPS_XLATE_DEBUG:   return "MIPS_XLATE_DEBUG";
3627     case SHT_MIPS_WHIRL:         return "MIPS_WHIRL";
3628     case SHT_MIPS_EH_REGION:     return "MIPS_EH_REGION";
3629     case SHT_MIPS_XLATE_OLD:     return "MIPS_XLATE_OLD";
3630     case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
3631     case SHT_MIPS_ABIFLAGS:      return "MIPS_ABIFLAGS";
3632     default:
3633       break;
3634     }
3635   return NULL;
3636 }
3637
3638 static const char *
3639 get_parisc_section_type_name (unsigned int sh_type)
3640 {
3641   switch (sh_type)
3642     {
3643     case SHT_PARISC_EXT:        return "PARISC_EXT";
3644     case SHT_PARISC_UNWIND:     return "PARISC_UNWIND";
3645     case SHT_PARISC_DOC:        return "PARISC_DOC";
3646     case SHT_PARISC_ANNOT:      return "PARISC_ANNOT";
3647     case SHT_PARISC_SYMEXTN:    return "PARISC_SYMEXTN";
3648     case SHT_PARISC_STUBS:      return "PARISC_STUBS";
3649     case SHT_PARISC_DLKM:       return "PARISC_DLKM";
3650     default:
3651       break;
3652     }
3653   return NULL;
3654 }
3655
3656 static const char *
3657 get_ia64_section_type_name (unsigned int sh_type)
3658 {
3659   /* If the top 8 bits are 0x78 the next 8 are the os/abi ID.  */
3660   if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
3661     return get_osabi_name ((sh_type & 0x00FF0000) >> 16);
3662
3663   switch (sh_type)
3664     {
3665     case SHT_IA_64_EXT:                return "IA_64_EXT";
3666     case SHT_IA_64_UNWIND:             return "IA_64_UNWIND";
3667     case SHT_IA_64_PRIORITY_INIT:      return "IA_64_PRIORITY_INIT";
3668     case SHT_IA_64_VMS_TRACE:          return "VMS_TRACE";
3669     case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
3670     case SHT_IA_64_VMS_DEBUG:          return "VMS_DEBUG";
3671     case SHT_IA_64_VMS_DEBUG_STR:      return "VMS_DEBUG_STR";
3672     case SHT_IA_64_VMS_LINKAGES:       return "VMS_LINKAGES";
3673     case SHT_IA_64_VMS_SYMBOL_VECTOR:  return "VMS_SYMBOL_VECTOR";
3674     case SHT_IA_64_VMS_FIXUP:          return "VMS_FIXUP";
3675     default:
3676       break;
3677     }
3678   return NULL;
3679 }
3680
3681 static const char *
3682 get_x86_64_section_type_name (unsigned int sh_type)
3683 {
3684   switch (sh_type)
3685     {
3686     case SHT_X86_64_UNWIND:     return "X86_64_UNWIND";
3687     default:
3688       break;
3689     }
3690   return NULL;
3691 }
3692
3693 static const char *
3694 get_aarch64_section_type_name (unsigned int sh_type)
3695 {
3696   switch (sh_type)
3697     {
3698     case SHT_AARCH64_ATTRIBUTES:
3699       return "AARCH64_ATTRIBUTES";
3700     default:
3701       break;
3702     }
3703   return NULL;
3704 }
3705
3706 static const char *
3707 get_arm_section_type_name (unsigned int sh_type)
3708 {
3709   switch (sh_type)
3710     {
3711     case SHT_ARM_EXIDX:           return "ARM_EXIDX";
3712     case SHT_ARM_PREEMPTMAP:      return "ARM_PREEMPTMAP";
3713     case SHT_ARM_ATTRIBUTES:      return "ARM_ATTRIBUTES";
3714     case SHT_ARM_DEBUGOVERLAY:    return "ARM_DEBUGOVERLAY";
3715     case SHT_ARM_OVERLAYSECTION:  return "ARM_OVERLAYSECTION";
3716     default:
3717       break;
3718     }
3719   return NULL;
3720 }
3721
3722 static const char *
3723 get_tic6x_section_type_name (unsigned int sh_type)
3724 {
3725   switch (sh_type)
3726     {
3727     case SHT_C6000_UNWIND:
3728       return "C6000_UNWIND";
3729     case SHT_C6000_PREEMPTMAP:
3730       return "C6000_PREEMPTMAP";
3731     case SHT_C6000_ATTRIBUTES:
3732       return "C6000_ATTRIBUTES";
3733     case SHT_TI_ICODE:
3734       return "TI_ICODE";
3735     case SHT_TI_XREF:
3736       return "TI_XREF";
3737     case SHT_TI_HANDLER:
3738       return "TI_HANDLER";
3739     case SHT_TI_INITINFO:
3740       return "TI_INITINFO";
3741     case SHT_TI_PHATTRS:
3742       return "TI_PHATTRS";
3743     default:
3744       break;
3745     }
3746   return NULL;
3747 }
3748
3749 static const char *
3750 get_msp430x_section_type_name (unsigned int sh_type)
3751 {
3752   switch (sh_type)
3753     {
3754     case SHT_MSP430_SEC_FLAGS:   return "MSP430_SEC_FLAGS";
3755     case SHT_MSP430_SYM_ALIASES: return "MSP430_SYM_ALIASES";
3756     case SHT_MSP430_ATTRIBUTES:  return "MSP430_ATTRIBUTES";
3757     default: return NULL;
3758     }
3759 }
3760
3761 static const char *
3762 get_section_type_name (unsigned int sh_type)
3763 {
3764   static char buff[32];
3765
3766   switch (sh_type)
3767     {
3768     case SHT_NULL:              return "NULL";
3769     case SHT_PROGBITS:          return "PROGBITS";
3770     case SHT_SYMTAB:            return "SYMTAB";
3771     case SHT_STRTAB:            return "STRTAB";
3772     case SHT_RELA:              return "RELA";
3773     case SHT_HASH:              return "HASH";
3774     case SHT_DYNAMIC:           return "DYNAMIC";
3775     case SHT_NOTE:              return "NOTE";
3776     case SHT_NOBITS:            return "NOBITS";
3777     case SHT_REL:               return "REL";
3778     case SHT_SHLIB:             return "SHLIB";
3779     case SHT_DYNSYM:            return "DYNSYM";
3780     case SHT_INIT_ARRAY:        return "INIT_ARRAY";
3781     case SHT_FINI_ARRAY:        return "FINI_ARRAY";
3782     case SHT_PREINIT_ARRAY:     return "PREINIT_ARRAY";
3783     case SHT_GNU_HASH:          return "GNU_HASH";
3784     case SHT_GROUP:             return "GROUP";
3785     case SHT_SYMTAB_SHNDX:      return "SYMTAB SECTION INDICIES";
3786     case SHT_GNU_verdef:        return "VERDEF";
3787     case SHT_GNU_verneed:       return "VERNEED";
3788     case SHT_GNU_versym:        return "VERSYM";
3789     case 0x6ffffff0:            return "VERSYM";
3790     case 0x6ffffffc:            return "VERDEF";
3791     case 0x7ffffffd:            return "AUXILIARY";
3792     case 0x7fffffff:            return "FILTER";
3793     case SHT_GNU_LIBLIST:       return "GNU_LIBLIST";
3794
3795     default:
3796       if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
3797         {
3798           const char * result;
3799
3800           switch (elf_header.e_machine)
3801             {
3802             case EM_MIPS:
3803             case EM_MIPS_RS3_LE:
3804               result = get_mips_section_type_name (sh_type);
3805               break;
3806             case EM_PARISC:
3807               result = get_parisc_section_type_name (sh_type);
3808               break;
3809             case EM_IA_64:
3810               result = get_ia64_section_type_name (sh_type);
3811               break;
3812             case EM_X86_64:
3813             case EM_L1OM:
3814             case EM_K1OM:
3815               result = get_x86_64_section_type_name (sh_type);
3816               break;
3817             case EM_AARCH64:
3818               result = get_aarch64_section_type_name (sh_type);
3819               break;
3820             case EM_ARM:
3821               result = get_arm_section_type_name (sh_type);
3822               break;
3823             case EM_TI_C6000:
3824               result = get_tic6x_section_type_name (sh_type);
3825               break;
3826             case EM_MSP430:
3827               result = get_msp430x_section_type_name (sh_type);
3828               break;
3829             default:
3830               result = NULL;
3831               break;
3832             }
3833
3834           if (result != NULL)
3835             return result;
3836
3837           sprintf (buff, "LOPROC+%x", sh_type - SHT_LOPROC);
3838         }
3839       else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
3840         {
3841           const char * result;
3842
3843           switch (elf_header.e_machine)
3844             {
3845             case EM_IA_64:
3846               result = get_ia64_section_type_name (sh_type);
3847               break;
3848             default:
3849               result = NULL;
3850               break;
3851             }
3852
3853           if (result != NULL)
3854             return result;
3855
3856           sprintf (buff, "LOOS+%x", sh_type - SHT_LOOS);
3857         }
3858       else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
3859         sprintf (buff, "LOUSER+%x", sh_type - SHT_LOUSER);
3860       else
3861         /* This message is probably going to be displayed in a 15
3862            character wide field, so put the hex value first.  */
3863         snprintf (buff, sizeof (buff), _("%08x: <unknown>"), sh_type);
3864
3865       return buff;
3866     }
3867 }
3868
3869 #define OPTION_DEBUG_DUMP       512
3870 #define OPTION_DYN_SYMS         513
3871 #define OPTION_DWARF_DEPTH      514
3872 #define OPTION_DWARF_START      515
3873 #define OPTION_DWARF_CHECK      516
3874
3875 static struct option options[] =
3876 {
3877   {"all",              no_argument, 0, 'a'},
3878   {"file-header",      no_argument, 0, 'h'},
3879   {"program-headers",  no_argument, 0, 'l'},
3880   {"headers",          no_argument, 0, 'e'},
3881   {"histogram",        no_argument, 0, 'I'},
3882   {"segments",         no_argument, 0, 'l'},
3883   {"sections",         no_argument, 0, 'S'},
3884   {"section-headers",  no_argument, 0, 'S'},
3885   {"section-groups",   no_argument, 0, 'g'},
3886   {"section-details",  no_argument, 0, 't'},
3887   {"full-section-name",no_argument, 0, 'N'},
3888   {"symbols",          no_argument, 0, 's'},
3889   {"syms",             no_argument, 0, 's'},
3890   {"dyn-syms",         no_argument, 0, OPTION_DYN_SYMS},
3891   {"relocs",           no_argument, 0, 'r'},
3892   {"notes",            no_argument, 0, 'n'},
3893   {"dynamic",          no_argument, 0, 'd'},
3894   {"arch-specific",    no_argument, 0, 'A'},
3895   {"version-info",     no_argument, 0, 'V'},
3896   {"use-dynamic",      no_argument, 0, 'D'},
3897   {"unwind",           no_argument, 0, 'u'},
3898   {"archive-index",    no_argument, 0, 'c'},
3899   {"hex-dump",         required_argument, 0, 'x'},
3900   {"relocated-dump",   required_argument, 0, 'R'},
3901   {"string-dump",      required_argument, 0, 'p'},
3902 #ifdef SUPPORT_DISASSEMBLY
3903   {"instruction-dump", required_argument, 0, 'i'},
3904 #endif
3905   {"debug-dump",       optional_argument, 0, OPTION_DEBUG_DUMP},
3906
3907   {"dwarf-depth",      required_argument, 0, OPTION_DWARF_DEPTH},
3908   {"dwarf-start",      required_argument, 0, OPTION_DWARF_START},
3909   {"dwarf-check",      no_argument, 0, OPTION_DWARF_CHECK},
3910
3911   {"version",          no_argument, 0, 'v'},
3912   {"wide",             no_argument, 0, 'W'},
3913   {"help",             no_argument, 0, 'H'},
3914   {0,                  no_argument, 0, 0}
3915 };
3916
3917 static void
3918 usage (FILE * stream)
3919 {
3920   fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
3921   fprintf (stream, _(" Display information about the contents of ELF format files\n"));
3922   fprintf (stream, _(" Options are:\n\
3923   -a --all               Equivalent to: -h -l -S -s -r -d -V -A -I\n\
3924   -h --file-header       Display the ELF file header\n\
3925   -l --program-headers   Display the program headers\n\
3926      --segments          An alias for --program-headers\n\
3927   -S --section-headers   Display the sections' header\n\
3928      --sections          An alias for --section-headers\n\
3929   -g --section-groups    Display the section groups\n\
3930   -t --section-details   Display the section details\n\
3931   -e --headers           Equivalent to: -h -l -S\n\
3932   -s --syms              Display the symbol table\n\
3933      --symbols           An alias for --syms\n\
3934   --dyn-syms             Display the dynamic symbol table\n\
3935   -n --notes             Display the core notes (if present)\n\
3936   -r --relocs            Display the relocations (if present)\n\
3937   -u --unwind            Display the unwind info (if present)\n\
3938   -d --dynamic           Display the dynamic section (if present)\n\
3939   -V --version-info      Display the version sections (if present)\n\
3940   -A --arch-specific     Display architecture specific information (if any)\n\
3941   -c --archive-index     Display the symbol/file index in an archive\n\
3942   -D --use-dynamic       Use the dynamic section info when displaying symbols\n\
3943   -x --hex-dump=<number|name>\n\
3944                          Dump the contents of section <number|name> as bytes\n\
3945   -p --string-dump=<number|name>\n\
3946                          Dump the contents of section <number|name> as strings\n\
3947   -R --relocated-dump=<number|name>\n\
3948                          Dump the contents of section <number|name> as relocated bytes\n\
3949   -w[lLiaprmfFsoRt] or\n\
3950   --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
3951                =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
3952                =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
3953                =addr,=cu_index]\n\
3954                          Display the contents of DWARF2 debug sections\n"));
3955   fprintf (stream, _("\
3956   --dwarf-depth=N        Do not display DIEs at depth N or greater\n\
3957   --dwarf-start=N        Display DIEs starting with N, at the same depth\n\
3958                          or deeper\n"));
3959 #ifdef SUPPORT_DISASSEMBLY
3960   fprintf (stream, _("\
3961   -i --instruction-dump=<number|name>\n\
3962                          Disassemble the contents of section <number|name>\n"));
3963 #endif
3964   fprintf (stream, _("\
3965   -I --histogram         Display histogram of bucket list lengths\n\
3966   -W --wide              Allow output width to exceed 80 characters\n\
3967   @<file>                Read options from <file>\n\
3968   -H --help              Display this information\n\
3969   -v --version           Display the version number of readelf\n"));
3970
3971   if (REPORT_BUGS_TO[0] && stream == stdout)
3972     fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
3973
3974   exit (stream == stdout ? 0 : 1);
3975 }
3976
3977 /* Record the fact that the user wants the contents of section number
3978    SECTION to be displayed using the method(s) encoded as flags bits
3979    in TYPE.  Note, TYPE can be zero if we are creating the array for
3980    the first time.  */
3981
3982 static void
3983 request_dump_bynumber (unsigned int section, dump_type type)
3984 {
3985   if (section >= num_dump_sects)
3986     {
3987       dump_type * new_dump_sects;
3988
3989       new_dump_sects = (dump_type *) calloc (section + 1,
3990                                              sizeof (* dump_sects));
3991
3992       if (new_dump_sects == NULL)
3993         error (_("Out of memory allocating dump request table.\n"));
3994       else
3995         {
3996           /* Copy current flag settings.  */
3997           memcpy (new_dump_sects, dump_sects, num_dump_sects * sizeof (* dump_sects));
3998
3999           free (dump_sects);
4000
4001           dump_sects = new_dump_sects;
4002           num_dump_sects = section + 1;
4003         }
4004     }
4005
4006   if (dump_sects)
4007     dump_sects[section] |= type;
4008
4009   return;
4010 }
4011
4012 /* Request a dump by section name.  */
4013
4014 static void
4015 request_dump_byname (const char * section, dump_type type)
4016 {
4017   struct dump_list_entry * new_request;
4018
4019   new_request = (struct dump_list_entry *)
4020       malloc (sizeof (struct dump_list_entry));
4021   if (!new_request)
4022     error (_("Out of memory allocating dump request table.\n"));
4023
4024   new_request->name = strdup (section);
4025   if (!new_request->name)
4026     error (_("Out of memory allocating dump request table.\n"));
4027
4028   new_request->type = type;
4029
4030   new_request->next = dump_sects_byname;
4031   dump_sects_byname = new_request;
4032 }
4033
4034 static inline void
4035 request_dump (dump_type type)
4036 {
4037   int section;
4038   char * cp;
4039
4040   do_dump++;
4041   section = strtoul (optarg, & cp, 0);
4042
4043   if (! *cp && section >= 0)
4044     request_dump_bynumber (section, type);
4045   else
4046     request_dump_byname (optarg, type);
4047 }
4048
4049
4050 static void
4051 parse_args (int argc, char ** argv)
4052 {
4053   int c;
4054
4055   if (argc < 2)
4056     usage (stderr);
4057
4058   while ((c = getopt_long
4059           (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:", options, NULL)) != EOF)
4060     {
4061       switch (c)
4062         {
4063         case 0:
4064           /* Long options.  */
4065           break;
4066         case 'H':
4067           usage (stdout);
4068           break;
4069
4070         case 'a':
4071           do_syms++;
4072           do_reloc++;
4073           do_unwind++;
4074           do_dynamic++;
4075           do_header++;
4076           do_sections++;
4077           do_section_groups++;
4078           do_segments++;
4079           do_version++;
4080           do_histogram++;
4081           do_arch++;
4082           do_notes++;
4083           break;
4084         case 'g':
4085           do_section_groups++;
4086           break;
4087         case 't':
4088         case 'N':
4089           do_sections++;
4090           do_section_details++;
4091           break;
4092         case 'e':
4093           do_header++;
4094           do_sections++;
4095           do_segments++;
4096           break;
4097         case 'A':
4098           do_arch++;
4099           break;
4100         case 'D':
4101           do_using_dynamic++;
4102           break;
4103         case 'r':
4104           do_reloc++;
4105           break;
4106         case 'u':
4107           do_unwind++;
4108           break;
4109         case 'h':
4110           do_header++;
4111           break;
4112         case 'l':
4113           do_segments++;
4114           break;
4115         case 's':
4116           do_syms++;
4117           break;
4118         case 'S':
4119           do_sections++;
4120           break;
4121         case 'd':
4122           do_dynamic++;
4123           break;
4124         case 'I':
4125           do_histogram++;
4126           break;
4127         case 'n':
4128           do_notes++;
4129           break;
4130         case 'c':
4131           do_archive_index++;
4132           break;
4133         case 'x':
4134           request_dump (HEX_DUMP);
4135           break;
4136         case 'p':
4137           request_dump (STRING_DUMP);
4138           break;
4139         case 'R':
4140           request_dump (RELOC_DUMP);
4141           break;
4142         case 'w':
4143           do_dump++;
4144           if (optarg == 0)
4145             {
4146               do_debugging = 1;
4147               dwarf_select_sections_all ();
4148             }
4149           else
4150             {
4151               do_debugging = 0;
4152               dwarf_select_sections_by_letters (optarg);
4153             }
4154           break;
4155         case OPTION_DEBUG_DUMP:
4156           do_dump++;
4157           if (optarg == 0)
4158             do_debugging = 1;
4159           else
4160             {
4161               do_debugging = 0;
4162               dwarf_select_sections_by_names (optarg);
4163             }
4164           break;
4165         case OPTION_DWARF_DEPTH:
4166           {
4167             char *cp;
4168
4169             dwarf_cutoff_level = strtoul (optarg, & cp, 0);
4170           }
4171           break;
4172         case OPTION_DWARF_START:
4173           {
4174             char *cp;
4175
4176             dwarf_start_die = strtoul (optarg, & cp, 0);
4177           }
4178           break;
4179         case OPTION_DWARF_CHECK:
4180           dwarf_check = 1;
4181           break;
4182         case OPTION_DYN_SYMS:
4183           do_dyn_syms++;
4184           break;
4185 #ifdef SUPPORT_DISASSEMBLY
4186         case 'i':
4187           request_dump (DISASS_DUMP);
4188           break;
4189 #endif
4190         case 'v':
4191           print_version (program_name);
4192           break;
4193         case 'V':
4194           do_version++;
4195           break;
4196         case 'W':
4197           do_wide++;
4198           break;
4199         default:
4200           /* xgettext:c-format */
4201           error (_("Invalid option '-%c'\n"), c);
4202           /* Drop through.  */
4203         case '?':
4204           usage (stderr);
4205         }
4206     }
4207
4208   if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
4209       && !do_segments && !do_header && !do_dump && !do_version
4210       && !do_histogram && !do_debugging && !do_arch && !do_notes
4211       && !do_section_groups && !do_archive_index
4212       && !do_dyn_syms)
4213     usage (stderr);
4214   else if (argc < 3)
4215     {
4216       warn (_("Nothing to do.\n"));
4217       usage (stderr);
4218     }
4219 }
4220
4221 static const char *
4222 get_elf_class (unsigned int elf_class)
4223 {
4224   static char buff[32];
4225
4226   switch (elf_class)
4227     {
4228     case ELFCLASSNONE: return _("none");
4229     case ELFCLASS32:   return "ELF32";
4230     case ELFCLASS64:   return "ELF64";
4231     default:
4232       snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
4233       return buff;
4234     }
4235 }
4236
4237 static const char *
4238 get_data_encoding (unsigned int encoding)
4239 {
4240   static char buff[32];
4241
4242   switch (encoding)
4243     {
4244     case ELFDATANONE: return _("none");
4245     case ELFDATA2LSB: return _("2's complement, little endian");
4246     case ELFDATA2MSB: return _("2's complement, big endian");
4247     default:
4248       snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
4249       return buff;
4250     }
4251 }
4252
4253 /* Decode the data held in 'elf_header'.  */
4254
4255 static int
4256 process_file_header (void)
4257 {
4258   if (   elf_header.e_ident[EI_MAG0] != ELFMAG0
4259       || elf_header.e_ident[EI_MAG1] != ELFMAG1
4260       || elf_header.e_ident[EI_MAG2] != ELFMAG2
4261       || elf_header.e_ident[EI_MAG3] != ELFMAG3)
4262     {
4263       error
4264         (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
4265       return 0;
4266     }
4267
4268   init_dwarf_regnames (elf_header.e_machine);
4269
4270   if (do_header)
4271     {
4272       int i;
4273
4274       printf (_("ELF Header:\n"));
4275       printf (_("  Magic:   "));
4276       for (i = 0; i < EI_NIDENT; i++)
4277         printf ("%2.2x ", elf_header.e_ident[i]);
4278       printf ("\n");
4279       printf (_("  Class:                             %s\n"),
4280               get_elf_class (elf_header.e_ident[EI_CLASS]));
4281       printf (_("  Data:                              %s\n"),
4282               get_data_encoding (elf_header.e_ident[EI_DATA]));
4283       printf (_("  Version:                           %d %s\n"),
4284               elf_header.e_ident[EI_VERSION],
4285               (elf_header.e_ident[EI_VERSION] == EV_CURRENT
4286                ? "(current)"
4287                : (elf_header.e_ident[EI_VERSION] != EV_NONE
4288                   ? _("<unknown: %lx>")
4289                   : "")));
4290       printf (_("  OS/ABI:                            %s\n"),
4291               get_osabi_name (elf_header.e_ident[EI_OSABI]));
4292       printf (_("  ABI Version:                       %d\n"),
4293               elf_header.e_ident[EI_ABIVERSION]);
4294       printf (_("  Type:                              %s\n"),
4295               get_file_type (elf_header.e_type));
4296       printf (_("  Machine:                           %s\n"),
4297               get_machine_name (elf_header.e_machine));
4298       printf (_("  Version:                           0x%lx\n"),
4299               (unsigned long) elf_header.e_version);
4300
4301       printf (_("  Entry point address:               "));
4302       print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4303       printf (_("\n  Start of program headers:          "));
4304       print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4305       printf (_(" (bytes into file)\n  Start of section headers:          "));
4306       print_vma ((bfd_vma) elf_header.e_shoff, DEC);
4307       printf (_(" (bytes into file)\n"));
4308
4309       printf (_("  Flags:                             0x%lx%s\n"),
4310               (unsigned long) elf_header.e_flags,
4311               get_machine_flags (elf_header.e_flags, elf_header.e_machine));
4312       printf (_("  Size of this header:               %ld (bytes)\n"),
4313               (long) elf_header.e_ehsize);
4314       printf (_("  Size of program headers:           %ld (bytes)\n"),
4315               (long) elf_header.e_phentsize);
4316       printf (_("  Number of program headers:         %ld"),
4317               (long) elf_header.e_phnum);
4318       if (section_headers != NULL
4319           && elf_header.e_phnum == PN_XNUM
4320           && section_headers[0].sh_info != 0)
4321         printf (" (%ld)", (long) section_headers[0].sh_info);
4322       putc ('\n', stdout);
4323       printf (_("  Size of section headers:           %ld (bytes)\n"),
4324               (long) elf_header.e_shentsize);
4325       printf (_("  Number of section headers:         %ld"),
4326               (long) elf_header.e_shnum);
4327       if (section_headers != NULL && elf_header.e_shnum == SHN_UNDEF)
4328         printf (" (%ld)", (long) section_headers[0].sh_size);
4329       putc ('\n', stdout);
4330       printf (_("  Section header string table index: %ld"),
4331               (long) elf_header.e_shstrndx);
4332       if (section_headers != NULL
4333           && elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
4334         printf (" (%u)", section_headers[0].sh_link);
4335       else if (elf_header.e_shstrndx != SHN_UNDEF
4336                && elf_header.e_shstrndx >= elf_header.e_shnum)
4337         printf (_(" <corrupt: out of range>"));
4338       putc ('\n', stdout);
4339     }
4340
4341   if (section_headers != NULL)
4342     {
4343       if (elf_header.e_phnum == PN_XNUM
4344           && section_headers[0].sh_info != 0)
4345         elf_header.e_phnum = section_headers[0].sh_info;
4346       if (elf_header.e_shnum == SHN_UNDEF)
4347         elf_header.e_shnum = section_headers[0].sh_size;
4348       if (elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
4349         elf_header.e_shstrndx = section_headers[0].sh_link;
4350       else if (elf_header.e_shstrndx >= elf_header.e_shnum)
4351         elf_header.e_shstrndx = SHN_UNDEF;
4352       free (section_headers);
4353       section_headers = NULL;
4354     }
4355
4356   return 1;
4357 }
4358
4359 static bfd_boolean
4360 get_32bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
4361 {
4362   Elf32_External_Phdr * phdrs;
4363   Elf32_External_Phdr * external;
4364   Elf_Internal_Phdr *   internal;
4365   unsigned int i;
4366   unsigned int size = elf_header.e_phentsize;
4367   unsigned int num  = elf_header.e_phnum;
4368
4369   /* PR binutils/17531: Cope with unexpected section header sizes.  */
4370   if (size == 0 || num == 0)
4371     return FALSE;
4372   if (size < sizeof * phdrs)
4373     {
4374       error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4375       return FALSE;
4376     }
4377   if (size > sizeof * phdrs)
4378     warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4379
4380   phdrs = (Elf32_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
4381                                             size, num, _("program headers"));
4382   if (phdrs == NULL)
4383     return FALSE;
4384
4385   for (i = 0, internal = pheaders, external = phdrs;
4386        i < elf_header.e_phnum;
4387        i++, internal++, external++)
4388     {
4389       internal->p_type   = BYTE_GET (external->p_type);
4390       internal->p_offset = BYTE_GET (external->p_offset);
4391       internal->p_vaddr  = BYTE_GET (external->p_vaddr);
4392       internal->p_paddr  = BYTE_GET (external->p_paddr);
4393       internal->p_filesz = BYTE_GET (external->p_filesz);
4394       internal->p_memsz  = BYTE_GET (external->p_memsz);
4395       internal->p_flags  = BYTE_GET (external->p_flags);
4396       internal->p_align  = BYTE_GET (external->p_align);
4397     }
4398
4399   free (phdrs);
4400   return TRUE;
4401 }
4402
4403 static bfd_boolean
4404 get_64bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
4405 {
4406   Elf64_External_Phdr * phdrs;
4407   Elf64_External_Phdr * external;
4408   Elf_Internal_Phdr *   internal;
4409   unsigned int i;
4410   unsigned int size = elf_header.e_phentsize;
4411   unsigned int num  = elf_header.e_phnum;
4412
4413   /* PR binutils/17531: Cope with unexpected section header sizes.  */
4414   if (size == 0 || num == 0)
4415     return FALSE;
4416   if (size < sizeof * phdrs)
4417     {
4418       error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4419       return FALSE;
4420     }
4421   if (size > sizeof * phdrs)
4422     warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4423
4424   phdrs = (Elf64_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
4425                                             size, num, _("program headers"));
4426   if (!phdrs)
4427     return FALSE;
4428
4429   for (i = 0, internal = pheaders, external = phdrs;
4430        i < elf_header.e_phnum;
4431        i++, internal++, external++)
4432     {
4433       internal->p_type   = BYTE_GET (external->p_type);
4434       internal->p_flags  = BYTE_GET (external->p_flags);
4435       internal->p_offset = BYTE_GET (external->p_offset);
4436       internal->p_vaddr  = BYTE_GET (external->p_vaddr);
4437       internal->p_paddr  = BYTE_GET (external->p_paddr);
4438       internal->p_filesz = BYTE_GET (external->p_filesz);
4439       internal->p_memsz  = BYTE_GET (external->p_memsz);
4440       internal->p_align  = BYTE_GET (external->p_align);
4441     }
4442
4443   free (phdrs);
4444   return TRUE;
4445 }
4446
4447 /* Returns 1 if the program headers were read into `program_headers'.  */
4448
4449 static int
4450 get_program_headers (FILE * file)
4451 {
4452   Elf_Internal_Phdr * phdrs;
4453
4454   /* Check cache of prior read.  */
4455   if (program_headers != NULL)
4456     return 1;
4457
4458   phdrs = (Elf_Internal_Phdr *) cmalloc (elf_header.e_phnum,
4459                                          sizeof (Elf_Internal_Phdr));
4460
4461   if (phdrs == NULL)
4462     {
4463       error (_("Out of memory reading %u program headers\n"),
4464              elf_header.e_phnum);
4465       return 0;
4466     }
4467
4468   if (is_32bit_elf
4469       ? get_32bit_program_headers (file, phdrs)
4470       : get_64bit_program_headers (file, phdrs))
4471     {
4472       program_headers = phdrs;
4473       return 1;
4474     }
4475
4476   free (phdrs);
4477   return 0;
4478 }
4479
4480 /* Returns 1 if the program headers were loaded.  */
4481
4482 static int
4483 process_program_headers (FILE * file)
4484 {
4485   Elf_Internal_Phdr * segment;
4486   unsigned int i;
4487
4488   if (elf_header.e_phnum == 0)
4489     {
4490       /* PR binutils/12467.  */
4491       if (elf_header.e_phoff != 0)
4492         warn (_("possibly corrupt ELF header - it has a non-zero program"
4493                 " header offset, but no program headers\n"));
4494       else if (do_segments)
4495         printf (_("\nThere are no program headers in this file.\n"));
4496       return 0;
4497     }
4498
4499   if (do_segments && !do_header)
4500     {
4501       printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
4502       printf (_("Entry point "));
4503       print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4504       printf (_("\nThere are %d program headers, starting at offset "),
4505               elf_header.e_phnum);
4506       print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4507       printf ("\n");
4508     }
4509
4510   if (! get_program_headers (file))
4511       return 0;
4512
4513   if (do_segments)
4514     {
4515       if (elf_header.e_phnum > 1)
4516         printf (_("\nProgram Headers:\n"));
4517       else
4518         printf (_("\nProgram Headers:\n"));
4519
4520       if (is_32bit_elf)
4521         printf
4522           (_("  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align\n"));
4523       else if (do_wide)
4524         printf
4525           (_("  Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align\n"));
4526       else
4527         {
4528           printf
4529             (_("  Type           Offset             VirtAddr           PhysAddr\n"));
4530           printf
4531             (_("                 FileSiz            MemSiz              Flags  Align\n"));
4532         }
4533     }
4534
4535   dynamic_addr = 0;
4536   dynamic_size = 0;
4537
4538   for (i = 0, segment = program_headers;
4539        i < elf_header.e_phnum;
4540        i++, segment++)
4541     {
4542       if (do_segments)
4543         {
4544           printf ("  %-14.14s ", get_segment_type (segment->p_type));
4545
4546           if (is_32bit_elf)
4547             {
4548               printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4549               printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
4550               printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
4551               printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
4552               printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
4553               printf ("%c%c%c ",
4554                       (segment->p_flags & PF_R ? 'R' : ' '),
4555                       (segment->p_flags & PF_W ? 'W' : ' '),
4556                       (segment->p_flags & PF_X ? 'E' : ' '));
4557               printf ("%#lx", (unsigned long) segment->p_align);
4558             }
4559           else if (do_wide)
4560             {
4561               if ((unsigned long) segment->p_offset == segment->p_offset)
4562                 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4563               else
4564                 {
4565                   print_vma (segment->p_offset, FULL_HEX);
4566                   putchar (' ');
4567                 }
4568
4569               print_vma (segment->p_vaddr, FULL_HEX);
4570               putchar (' ');
4571               print_vma (segment->p_paddr, FULL_HEX);
4572               putchar (' ');
4573
4574               if ((unsigned long) segment->p_filesz == segment->p_filesz)
4575                 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
4576               else
4577                 {
4578                   print_vma (segment->p_filesz, FULL_HEX);
4579                   putchar (' ');
4580                 }
4581
4582               if ((unsigned long) segment->p_memsz == segment->p_memsz)
4583                 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
4584               else
4585                 {
4586                   print_vma (segment->p_memsz, FULL_HEX);
4587                 }
4588
4589               printf (" %c%c%c ",
4590                       (segment->p_flags & PF_R ? 'R' : ' '),
4591                       (segment->p_flags & PF_W ? 'W' : ' '),
4592                       (segment->p_flags & PF_X ? 'E' : ' '));
4593
4594               if ((unsigned long) segment->p_align == segment->p_align)
4595                 printf ("%#lx", (unsigned long) segment->p_align);
4596               else
4597                 {
4598                   print_vma (segment->p_align, PREFIX_HEX);
4599                 }
4600             }
4601           else
4602             {
4603               print_vma (segment->p_offset, FULL_HEX);
4604               putchar (' ');
4605               print_vma (segment->p_vaddr, FULL_HEX);
4606               putchar (' ');
4607               print_vma (segment->p_paddr, FULL_HEX);
4608               printf ("\n                 ");
4609               print_vma (segment->p_filesz, FULL_HEX);
4610               putchar (' ');
4611               print_vma (segment->p_memsz, FULL_HEX);
4612               printf ("  %c%c%c    ",
4613                       (segment->p_flags & PF_R ? 'R' : ' '),
4614                       (segment->p_flags & PF_W ? 'W' : ' '),
4615                       (segment->p_flags & PF_X ? 'E' : ' '));
4616               print_vma (segment->p_align, HEX);
4617             }
4618         }
4619
4620       if (do_segments)
4621         putc ('\n', stdout);
4622
4623       switch (segment->p_type)
4624         {
4625         case PT_DYNAMIC:
4626           if (dynamic_addr)
4627             error (_("more than one dynamic segment\n"));
4628
4629           /* By default, assume that the .dynamic section is the first
4630              section in the DYNAMIC segment.  */
4631           dynamic_addr = segment->p_offset;
4632           dynamic_size = segment->p_filesz;
4633           /* PR binutils/17512: Avoid corrupt dynamic section info in the segment.  */
4634           if (dynamic_addr + dynamic_size >= current_file_size)
4635             {
4636               error (_("the dynamic segment offset + size exceeds the size of the file\n"));
4637               dynamic_addr = dynamic_size = 0;
4638             }
4639
4640           /* Try to locate the .dynamic section. If there is
4641              a section header table, we can easily locate it.  */
4642           if (section_headers != NULL)
4643             {
4644               Elf_Internal_Shdr * sec;
4645
4646               sec = find_section (".dynamic");
4647               if (sec == NULL || sec->sh_size == 0)
4648                 {
4649                   /* A corresponding .dynamic section is expected, but on
4650                      IA-64/OpenVMS it is OK for it to be missing.  */
4651                   if (!is_ia64_vms ())
4652                     error (_("no .dynamic section in the dynamic segment\n"));
4653                   break;
4654                 }
4655
4656               if (sec->sh_type == SHT_NOBITS)
4657                 {
4658                   dynamic_size = 0;
4659                   break;
4660                 }
4661
4662               dynamic_addr = sec->sh_offset;
4663               dynamic_size = sec->sh_size;
4664
4665               if (dynamic_addr < segment->p_offset
4666                   || dynamic_addr > segment->p_offset + segment->p_filesz)
4667                 warn (_("the .dynamic section is not contained"
4668                         " within the dynamic segment\n"));
4669               else if (dynamic_addr > segment->p_offset)
4670                 warn (_("the .dynamic section is not the first section"
4671                         " in the dynamic segment.\n"));
4672             }
4673           break;
4674
4675         case PT_INTERP:
4676           if (fseek (file, archive_file_offset + (long) segment->p_offset,
4677                      SEEK_SET))
4678             error (_("Unable to find program interpreter name\n"));
4679           else
4680             {
4681               char fmt [32];
4682               int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX - 1);
4683
4684               if (ret >= (int) sizeof (fmt) || ret < 0)
4685                 error (_("Internal error: failed to create format string to display program interpreter\n"));
4686
4687               program_interpreter[0] = 0;
4688               if (fscanf (file, fmt, program_interpreter) <= 0)
4689                 error (_("Unable to read program interpreter name\n"));
4690
4691               if (do_segments)
4692                 printf (_("      [Requesting program interpreter: %s]\n"),
4693                     program_interpreter);
4694             }
4695           break;
4696         }
4697     }
4698
4699   if (do_segments && section_headers != NULL && string_table != NULL)
4700     {
4701       printf (_("\n Section to Segment mapping:\n"));
4702       printf (_("  Segment Sections...\n"));
4703
4704       for (i = 0; i < elf_header.e_phnum; i++)
4705         {
4706           unsigned int j;
4707           Elf_Internal_Shdr * section;
4708
4709           segment = program_headers + i;
4710           section = section_headers + 1;
4711
4712           printf ("   %2.2d     ", i);
4713
4714           for (j = 1; j < elf_header.e_shnum; j++, section++)
4715             {
4716               if (!ELF_TBSS_SPECIAL (section, segment)
4717                   && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
4718                 printf ("%s ", printable_section_name (section));
4719             }
4720
4721           putc ('\n',stdout);
4722         }
4723     }
4724
4725   return 1;
4726 }
4727
4728
4729 /* Find the file offset corresponding to VMA by using the program headers.  */
4730
4731 static long
4732 offset_from_vma (FILE * file, bfd_vma vma, bfd_size_type size)
4733 {
4734   Elf_Internal_Phdr * seg;
4735
4736   if (! get_program_headers (file))
4737     {
4738       warn (_("Cannot interpret virtual addresses without program headers.\n"));
4739       return (long) vma;
4740     }
4741
4742   for (seg = program_headers;
4743        seg < program_headers + elf_header.e_phnum;
4744        ++seg)
4745     {
4746       if (seg->p_type != PT_LOAD)
4747         continue;
4748
4749       if (vma >= (seg->p_vaddr & -seg->p_align)
4750           && vma + size <= seg->p_vaddr + seg->p_filesz)
4751         return vma - seg->p_vaddr + seg->p_offset;
4752     }
4753
4754   warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
4755         (unsigned long) vma);
4756   return (long) vma;
4757 }
4758
4759
4760 /* Allocate memory and load the sections headers into the global pointer
4761    SECTION_HEADERS.  If PROBE is true, this is just a probe and we do not
4762    generate any error messages if the load fails.  */
4763
4764 static bfd_boolean
4765 get_32bit_section_headers (FILE * file, bfd_boolean probe)
4766 {
4767   Elf32_External_Shdr * shdrs;
4768   Elf_Internal_Shdr *   internal;
4769   unsigned int i;
4770   unsigned int size = elf_header.e_shentsize;
4771   unsigned int num = probe ? 1 : elf_header.e_shnum;
4772
4773   /* PR binutils/17531: Cope with unexpected section header sizes.  */
4774   if (size == 0 || num == 0)
4775     return FALSE;
4776   if (size < sizeof * shdrs)
4777     {
4778       if (! probe)
4779         error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
4780       return FALSE;
4781     }
4782   if (!probe && size > sizeof * shdrs)
4783     warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
4784
4785   shdrs = (Elf32_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
4786                                             size, num,
4787                                             probe ? NULL : _("section headers"));
4788   if (shdrs == NULL)
4789     return FALSE;
4790
4791   if (section_headers != NULL)
4792     free (section_headers);
4793   section_headers = (Elf_Internal_Shdr *) cmalloc (num,
4794                                                    sizeof (Elf_Internal_Shdr));
4795   if (section_headers == NULL)
4796     {
4797       if (!probe)
4798         error (_("Out of memory reading %u section headers\n"), num);
4799       return FALSE;
4800     }
4801
4802   for (i = 0, internal = section_headers;
4803        i < num;
4804        i++, internal++)
4805     {
4806       internal->sh_name      = BYTE_GET (shdrs[i].sh_name);
4807       internal->sh_type      = BYTE_GET (shdrs[i].sh_type);
4808       internal->sh_flags     = BYTE_GET (shdrs[i].sh_flags);
4809       internal->sh_addr      = BYTE_GET (shdrs[i].sh_addr);
4810       internal->sh_offset    = BYTE_GET (shdrs[i].sh_offset);
4811       internal->sh_size      = BYTE_GET (shdrs[i].sh_size);
4812       internal->sh_link      = BYTE_GET (shdrs[i].sh_link);
4813       internal->sh_info      = BYTE_GET (shdrs[i].sh_info);
4814       internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
4815       internal->sh_entsize   = BYTE_GET (shdrs[i].sh_entsize);
4816     }
4817
4818   free (shdrs);
4819   return TRUE;
4820 }
4821
4822 static bfd_boolean
4823 get_64bit_section_headers (FILE * file, bfd_boolean probe)
4824 {
4825   Elf64_External_Shdr * shdrs;
4826   Elf_Internal_Shdr *   internal;
4827   unsigned int i;
4828   unsigned int size = elf_header.e_shentsize;
4829   unsigned int num = probe ? 1 : elf_header.e_shnum;
4830
4831   /* PR binutils/17531: Cope with unexpected section header sizes.  */
4832   if (size == 0 || num == 0)
4833     return FALSE;
4834   if (size < sizeof * shdrs)
4835     {
4836       if (! probe)
4837         error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
4838       return FALSE;
4839     }
4840   if (! probe && size > sizeof * shdrs)
4841     warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
4842
4843   shdrs = (Elf64_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
4844                                             size, num,
4845                                             probe ? NULL : _("section headers"));
4846   if (shdrs == NULL)
4847     return FALSE;
4848
4849   if (section_headers != NULL)
4850     free (section_headers);
4851   section_headers = (Elf_Internal_Shdr *) cmalloc (num,
4852                                                    sizeof (Elf_Internal_Shdr));
4853   if (section_headers == NULL)
4854     {
4855       if (! probe)
4856         error (_("Out of memory reading %u section headers\n"), num);
4857       return FALSE;
4858     }
4859
4860   for (i = 0, internal = section_headers;
4861        i < num;
4862        i++, internal++)
4863     {
4864       internal->sh_name      = BYTE_GET (shdrs[i].sh_name);
4865       internal->sh_type      = BYTE_GET (shdrs[i].sh_type);
4866       internal->sh_flags     = BYTE_GET (shdrs[i].sh_flags);
4867       internal->sh_addr      = BYTE_GET (shdrs[i].sh_addr);
4868       internal->sh_size      = BYTE_GET (shdrs[i].sh_size);
4869       internal->sh_entsize   = BYTE_GET (shdrs[i].sh_entsize);
4870       internal->sh_link      = BYTE_GET (shdrs[i].sh_link);
4871       internal->sh_info      = BYTE_GET (shdrs[i].sh_info);
4872       internal->sh_offset    = BYTE_GET (shdrs[i].sh_offset);
4873       internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
4874     }
4875
4876   free (shdrs);
4877   return TRUE;
4878 }
4879
4880 static Elf_Internal_Sym *
4881 get_32bit_elf_symbols (FILE * file,
4882                        Elf_Internal_Shdr * section,
4883                        unsigned long * num_syms_return)
4884 {
4885   unsigned long number = 0;
4886   Elf32_External_Sym * esyms = NULL;
4887   Elf_External_Sym_Shndx * shndx = NULL;
4888   Elf_Internal_Sym * isyms = NULL;
4889   Elf_Internal_Sym * psym;
4890   unsigned int j;
4891
4892   if (section->sh_size == 0)
4893     {
4894       if (num_syms_return != NULL)
4895         * num_syms_return = 0;
4896       return NULL;
4897     }
4898
4899   /* Run some sanity checks first.  */
4900   if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
4901     {
4902       error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
4903              printable_section_name (section), (unsigned long) section->sh_entsize);
4904       goto exit_point;
4905     }
4906
4907   if (section->sh_size > current_file_size)
4908     {
4909       error (_("Section %s has an invalid sh_size of 0x%lx\n"),
4910              printable_section_name (section), (unsigned long) section->sh_size);
4911       goto exit_point;
4912     }
4913
4914   number = section->sh_size / section->sh_entsize;
4915
4916   if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
4917     {
4918       error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
4919              (unsigned long) section->sh_size,
4920              printable_section_name (section),
4921              (unsigned long) section->sh_entsize);
4922       goto exit_point;
4923     }
4924
4925   esyms = (Elf32_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
4926                                            section->sh_size, _("symbols"));
4927   if (esyms == NULL)
4928     goto exit_point;
4929
4930   shndx = NULL;
4931   if (symtab_shndx_hdr != NULL
4932       && (symtab_shndx_hdr->sh_link
4933           == (unsigned long) (section - section_headers)))
4934     {
4935       shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
4936                                                    symtab_shndx_hdr->sh_offset,
4937                                                    1, symtab_shndx_hdr->sh_size,
4938                                                    _("symbol table section indicies"));
4939       if (shndx == NULL)
4940         goto exit_point;
4941       /* PR17531: file: heap-buffer-overflow */
4942       else if (symtab_shndx_hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
4943         {
4944           error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
4945                  printable_section_name (symtab_shndx_hdr),
4946                  (unsigned long) symtab_shndx_hdr->sh_size,
4947                  (unsigned long) section->sh_size);
4948           goto exit_point;
4949         }
4950     }
4951
4952   isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
4953
4954   if (isyms == NULL)
4955     {
4956       error (_("Out of memory reading %lu symbols\n"),
4957              (unsigned long) number);
4958       goto exit_point;
4959     }
4960
4961   for (j = 0, psym = isyms; j < number; j++, psym++)
4962     {
4963       psym->st_name  = BYTE_GET (esyms[j].st_name);
4964       psym->st_value = BYTE_GET (esyms[j].st_value);
4965       psym->st_size  = BYTE_GET (esyms[j].st_size);
4966       psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
4967       if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
4968         psym->st_shndx
4969           = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
4970       else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
4971         psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
4972       psym->st_info  = BYTE_GET (esyms[j].st_info);
4973       psym->st_other = BYTE_GET (esyms[j].st_other);
4974     }
4975
4976  exit_point:
4977   if (shndx != NULL)
4978     free (shndx);
4979   if (esyms != NULL)
4980     free (esyms);
4981
4982   if (num_syms_return != NULL)
4983     * num_syms_return = isyms == NULL ? 0 : number;
4984
4985   return isyms;
4986 }
4987
4988 static Elf_Internal_Sym *
4989 get_64bit_elf_symbols (FILE * file,
4990                        Elf_Internal_Shdr * section,
4991                        unsigned long * num_syms_return)
4992 {
4993   unsigned long number = 0;
4994   Elf64_External_Sym * esyms = NULL;
4995   Elf_External_Sym_Shndx * shndx = NULL;
4996   Elf_Internal_Sym * isyms = NULL;
4997   Elf_Internal_Sym * psym;
4998   unsigned int j;
4999
5000   if (section->sh_size == 0)
5001     {
5002       if (num_syms_return != NULL)
5003         * num_syms_return = 0;
5004       return NULL;
5005     }
5006
5007   /* Run some sanity checks first.  */
5008   if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5009     {
5010       error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5011              printable_section_name (section),
5012              (unsigned long) section->sh_entsize);
5013       goto exit_point;
5014     }
5015
5016   if (section->sh_size > current_file_size)
5017     {
5018       error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5019              printable_section_name (section),
5020              (unsigned long) section->sh_size);
5021       goto exit_point;
5022     }
5023
5024   number = section->sh_size / section->sh_entsize;
5025
5026   if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
5027     {
5028       error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5029              (unsigned long) section->sh_size,
5030              printable_section_name (section),
5031              (unsigned long) section->sh_entsize);
5032       goto exit_point;
5033     }
5034
5035   esyms = (Elf64_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
5036                                            section->sh_size, _("symbols"));
5037   if (!esyms)
5038     goto exit_point;
5039
5040   if (symtab_shndx_hdr != NULL
5041       && (symtab_shndx_hdr->sh_link
5042           == (unsigned long) (section - section_headers)))
5043     {
5044       shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
5045                                                    symtab_shndx_hdr->sh_offset,
5046                                                    1, symtab_shndx_hdr->sh_size,
5047                                                    _("symbol table section indicies"));
5048       if (shndx == NULL)
5049         goto exit_point;
5050       else if (symtab_shndx_hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5051         {
5052           error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5053                  printable_section_name (symtab_shndx_hdr),
5054                  (unsigned long) symtab_shndx_hdr->sh_size,
5055                  (unsigned long) section->sh_size);
5056           goto exit_point;
5057         }
5058     }
5059
5060   isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5061
5062   if (isyms == NULL)
5063     {
5064       error (_("Out of memory reading %lu symbols\n"),
5065              (unsigned long) number);
5066       goto exit_point;
5067     }
5068
5069   for (j = 0, psym = isyms; j < number; j++, psym++)
5070     {
5071       psym->st_name  = BYTE_GET (esyms[j].st_name);
5072       psym->st_info  = BYTE_GET (esyms[j].st_info);
5073       psym->st_other = BYTE_GET (esyms[j].st_other);
5074       psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5075
5076       if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5077         psym->st_shndx
5078           = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5079       else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5080         psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5081
5082       psym->st_value = BYTE_GET (esyms[j].st_value);
5083       psym->st_size  = BYTE_GET (esyms[j].st_size);
5084     }
5085
5086  exit_point:
5087   if (shndx != NULL)
5088     free (shndx);
5089   if (esyms != NULL)
5090     free (esyms);
5091
5092   if (num_syms_return != NULL)
5093     * num_syms_return = isyms == NULL ? 0 : number;
5094
5095   return isyms;
5096 }
5097
5098 static const char *
5099 get_elf_section_flags (bfd_vma sh_flags)
5100 {
5101   static char buff[1024];
5102   char * p = buff;
5103   int field_size = is_32bit_elf ? 8 : 16;
5104   int sindex;
5105   int size = sizeof (buff) - (field_size + 4 + 1);
5106   bfd_vma os_flags = 0;
5107   bfd_vma proc_flags = 0;
5108   bfd_vma unknown_flags = 0;
5109   static const struct
5110     {
5111       const char * str;
5112       int len;
5113     }
5114   flags [] =
5115     {
5116       /*  0 */ { STRING_COMMA_LEN ("WRITE") },
5117       /*  1 */ { STRING_COMMA_LEN ("ALLOC") },
5118       /*  2 */ { STRING_COMMA_LEN ("EXEC") },
5119       /*  3 */ { STRING_COMMA_LEN ("MERGE") },
5120       /*  4 */ { STRING_COMMA_LEN ("STRINGS") },
5121       /*  5 */ { STRING_COMMA_LEN ("INFO LINK") },
5122       /*  6 */ { STRING_COMMA_LEN ("LINK ORDER") },
5123       /*  7 */ { STRING_COMMA_LEN ("OS NONCONF") },
5124       /*  8 */ { STRING_COMMA_LEN ("GROUP") },
5125       /*  9 */ { STRING_COMMA_LEN ("TLS") },
5126       /* IA-64 specific.  */
5127       /* 10 */ { STRING_COMMA_LEN ("SHORT") },
5128       /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
5129       /* IA-64 OpenVMS specific.  */
5130       /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
5131       /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
5132       /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
5133       /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
5134       /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
5135       /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
5136       /* Generic.  */
5137       /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
5138       /* SPARC specific.  */
5139       /* 19 */ { STRING_COMMA_LEN ("ORDERED") }
5140     };
5141
5142   if (do_section_details)
5143     {
5144       sprintf (buff, "[%*.*lx]: ",
5145                field_size, field_size, (unsigned long) sh_flags);
5146       p += field_size + 4;
5147     }
5148
5149   while (sh_flags)
5150     {
5151       bfd_vma flag;
5152
5153       flag = sh_flags & - sh_flags;
5154       sh_flags &= ~ flag;
5155
5156       if (do_section_details)
5157         {
5158           switch (flag)
5159             {
5160             case SHF_WRITE:             sindex = 0; break;
5161             case SHF_ALLOC:             sindex = 1; break;
5162             case SHF_EXECINSTR:         sindex = 2; break;
5163             case SHF_MERGE:             sindex = 3; break;
5164             case SHF_STRINGS:           sindex = 4; break;
5165             case SHF_INFO_LINK:         sindex = 5; break;
5166             case SHF_LINK_ORDER:        sindex = 6; break;
5167             case SHF_OS_NONCONFORMING:  sindex = 7; break;
5168             case SHF_GROUP:             sindex = 8; break;
5169             case SHF_TLS:               sindex = 9; break;
5170             case SHF_EXCLUDE:           sindex = 18; break;
5171
5172             default:
5173               sindex = -1;
5174               switch (elf_header.e_machine)
5175                 {
5176                 case EM_IA_64:
5177                   if (flag == SHF_IA_64_SHORT)
5178                     sindex = 10;
5179                   else if (flag == SHF_IA_64_NORECOV)
5180                     sindex = 11;
5181 #ifdef BFD64
5182                   else if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
5183                     switch (flag)
5184                       {
5185                       case SHF_IA_64_VMS_GLOBAL:      sindex = 12; break;
5186                       case SHF_IA_64_VMS_OVERLAID:    sindex = 13; break;
5187                       case SHF_IA_64_VMS_SHARED:      sindex = 14; break;
5188                       case SHF_IA_64_VMS_VECTOR:      sindex = 15; break;
5189                       case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
5190                       case SHF_IA_64_VMS_PROTECTED:   sindex = 17; break;
5191                       default:                        break;
5192                       }
5193 #endif
5194                   break;
5195
5196                 case EM_386:
5197                 case EM_486:
5198                 case EM_X86_64:
5199                 case EM_L1OM:
5200                 case EM_K1OM:
5201                 case EM_OLD_SPARCV9:
5202                 case EM_SPARC32PLUS:
5203                 case EM_SPARCV9:
5204                 case EM_SPARC:
5205                   if (flag == SHF_ORDERED)
5206                     sindex = 19;
5207                   break;
5208                 default:
5209                   break;
5210                 }
5211             }
5212
5213           if (sindex != -1)
5214             {
5215               if (p != buff + field_size + 4)
5216                 {
5217                   if (size < (10 + 2))
5218                     {
5219                       warn (_("Internal error: not enough buffer room for section flag info"));
5220                       return _("<unknown>");
5221                     }
5222                   size -= 2;
5223                   *p++ = ',';
5224                   *p++ = ' ';
5225                 }
5226
5227               size -= flags [sindex].len;
5228               p = stpcpy (p, flags [sindex].str);
5229             }
5230           else if (flag & SHF_MASKOS)
5231             os_flags |= flag;
5232           else if (flag & SHF_MASKPROC)
5233             proc_flags |= flag;
5234           else
5235             unknown_flags |= flag;
5236         }
5237       else
5238         {
5239           switch (flag)
5240             {
5241             case SHF_WRITE:             *p = 'W'; break;
5242             case SHF_ALLOC:             *p = 'A'; break;
5243             case SHF_EXECINSTR:         *p = 'X'; break;
5244             case SHF_MERGE:             *p = 'M'; break;
5245             case SHF_STRINGS:           *p = 'S'; break;
5246             case SHF_INFO_LINK:         *p = 'I'; break;
5247             case SHF_LINK_ORDER:        *p = 'L'; break;
5248             case SHF_OS_NONCONFORMING:  *p = 'O'; break;
5249             case SHF_GROUP:             *p = 'G'; break;
5250             case SHF_TLS:               *p = 'T'; break;
5251             case SHF_EXCLUDE:           *p = 'E'; break;
5252
5253             default:
5254               if ((elf_header.e_machine == EM_X86_64
5255                    || elf_header.e_machine == EM_L1OM
5256                    || elf_header.e_machine == EM_K1OM)
5257                   && flag == SHF_X86_64_LARGE)
5258                 *p = 'l';
5259               else if (flag & SHF_MASKOS)
5260                 {
5261                   *p = 'o';
5262                   sh_flags &= ~ SHF_MASKOS;
5263                 }
5264               else if (flag & SHF_MASKPROC)
5265                 {
5266                   *p = 'p';
5267                   sh_flags &= ~ SHF_MASKPROC;
5268                 }
5269               else
5270                 *p = 'x';
5271               break;
5272             }
5273           p++;
5274         }
5275     }
5276
5277   if (do_section_details)
5278     {
5279       if (os_flags)
5280         {
5281           size -= 5 + field_size;
5282           if (p != buff + field_size + 4)
5283             {
5284               if (size < (2 + 1))
5285                 {
5286                   warn (_("Internal error: not enough buffer room for section flag info"));
5287                   return _("<unknown>");
5288                 }
5289               size -= 2;
5290               *p++ = ',';
5291               *p++ = ' ';
5292             }
5293           sprintf (p, "OS (%*.*lx)", field_size, field_size,
5294                    (unsigned long) os_flags);
5295           p += 5 + field_size;
5296         }
5297       if (proc_flags)
5298         {
5299           size -= 7 + field_size;
5300           if (p != buff + field_size + 4)
5301             {
5302               if (size < (2 + 1))
5303                 {
5304                   warn (_("Internal error: not enough buffer room for section flag info"));
5305                   return _("<unknown>");
5306                 }
5307               size -= 2;
5308               *p++ = ',';
5309               *p++ = ' ';
5310             }
5311           sprintf (p, "PROC (%*.*lx)", field_size, field_size,
5312                    (unsigned long) proc_flags);
5313           p += 7 + field_size;
5314         }
5315       if (unknown_flags)
5316         {
5317           size -= 10 + field_size;
5318           if (p != buff + field_size + 4)
5319             {
5320               if (size < (2 + 1))
5321                 {
5322                   warn (_("Internal error: not enough buffer room for section flag info"));
5323                   return _("<unknown>");
5324                 }
5325               size -= 2;
5326               *p++ = ',';
5327               *p++ = ' ';
5328             }
5329           sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
5330                    (unsigned long) unknown_flags);
5331           p += 10 + field_size;
5332         }
5333     }
5334
5335   *p = '\0';
5336   return buff;
5337 }
5338
5339 static int
5340 process_section_headers (FILE * file)
5341 {
5342   Elf_Internal_Shdr * section;
5343   unsigned int i;
5344
5345   section_headers = NULL;
5346
5347   if (elf_header.e_shnum == 0)
5348     {
5349       /* PR binutils/12467.  */
5350       if (elf_header.e_shoff != 0)
5351         warn (_("possibly corrupt ELF file header - it has a non-zero"
5352                 " section header offset, but no section headers\n"));
5353       else if (do_sections)
5354         printf (_("\nThere are no sections in this file.\n"));
5355
5356       return 1;
5357     }
5358
5359   if (do_sections && !do_header)
5360     printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
5361             elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
5362
5363   if (is_32bit_elf)
5364     {
5365       if (! get_32bit_section_headers (file, FALSE))
5366         return 0;
5367     }
5368   else if (! get_64bit_section_headers (file, FALSE))
5369     return 0;
5370
5371   /* Read in the string table, so that we have names to display.  */
5372   if (elf_header.e_shstrndx != SHN_UNDEF
5373        && elf_header.e_shstrndx < elf_header.e_shnum)
5374     {
5375       section = section_headers + elf_header.e_shstrndx;
5376
5377       if (section->sh_size != 0)
5378         {
5379           string_table = (char *) get_data (NULL, file, section->sh_offset,
5380                                             1, section->sh_size,
5381                                             _("string table"));
5382
5383           string_table_length = string_table != NULL ? section->sh_size : 0;
5384         }
5385     }
5386
5387   /* Scan the sections for the dynamic symbol table
5388      and dynamic string table and debug sections.  */
5389   dynamic_symbols = NULL;
5390   dynamic_strings = NULL;
5391   dynamic_syminfo = NULL;
5392   symtab_shndx_hdr = NULL;
5393
5394   eh_addr_size = is_32bit_elf ? 4 : 8;
5395   switch (elf_header.e_machine)
5396     {
5397     case EM_MIPS:
5398     case EM_MIPS_RS3_LE:
5399       /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
5400          FDE addresses.  However, the ABI also has a semi-official ILP32
5401          variant for which the normal FDE address size rules apply.
5402
5403          GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
5404          section, where XX is the size of longs in bits.  Unfortunately,
5405          earlier compilers provided no way of distinguishing ILP32 objects
5406          from LP64 objects, so if there's any doubt, we should assume that
5407          the official LP64 form is being used.  */
5408       if ((elf_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
5409           && find_section (".gcc_compiled_long32") == NULL)
5410         eh_addr_size = 8;
5411       break;
5412
5413     case EM_H8_300:
5414     case EM_H8_300H:
5415       switch (elf_header.e_flags & EF_H8_MACH)
5416         {
5417         case E_H8_MACH_H8300:
5418         case E_H8_MACH_H8300HN:
5419         case E_H8_MACH_H8300SN:
5420         case E_H8_MACH_H8300SXN:
5421           eh_addr_size = 2;
5422           break;
5423         case E_H8_MACH_H8300H:
5424         case E_H8_MACH_H8300S:
5425         case E_H8_MACH_H8300SX:
5426           eh_addr_size = 4;
5427           break;
5428         }
5429       break;
5430
5431     case EM_M32C_OLD:
5432     case EM_M32C:
5433       switch (elf_header.e_flags & EF_M32C_CPU_MASK)
5434         {
5435         case EF_M32C_CPU_M16C:
5436           eh_addr_size = 2;
5437           break;
5438         }
5439       break;
5440     }
5441
5442 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64)                \
5443   do                                                                    \
5444     {                                                                   \
5445       bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64;  \
5446       if (section->sh_entsize != expected_entsize)                      \
5447         {                                                               \
5448           char buf[40];                                                 \
5449           sprintf_vma (buf, section->sh_entsize);                       \
5450           /* Note: coded this way so that there is a single string for  \
5451              translation.  */ \
5452           error (_("Section %d has invalid sh_entsize of %s\n"), i, buf); \
5453           error (_("(Using the expected size of %u for the rest of this dump)\n"), \
5454                    (unsigned) expected_entsize);                        \
5455           section->sh_entsize = expected_entsize;                       \
5456         }                                                               \
5457     }                                                                   \
5458   while (0)
5459
5460 #define CHECK_ENTSIZE(section, i, type)                                 \
5461   CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type),         \
5462                         sizeof (Elf64_External_##type))
5463
5464   for (i = 0, section = section_headers;
5465        i < elf_header.e_shnum;
5466        i++, section++)
5467     {
5468       char * name = SECTION_NAME (section);
5469
5470       if (section->sh_type == SHT_DYNSYM)
5471         {
5472           if (dynamic_symbols != NULL)
5473             {
5474               error (_("File contains multiple dynamic symbol tables\n"));
5475               continue;
5476             }
5477
5478           CHECK_ENTSIZE (section, i, Sym);
5479           dynamic_symbols = GET_ELF_SYMBOLS (file, section, & num_dynamic_syms);
5480         }
5481       else if (section->sh_type == SHT_STRTAB
5482                && streq (name, ".dynstr"))
5483         {
5484           if (dynamic_strings != NULL)
5485             {
5486               error (_("File contains multiple dynamic string tables\n"));
5487               continue;
5488             }
5489
5490           dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
5491                                                1, section->sh_size,
5492                                                _("dynamic strings"));
5493           dynamic_strings_length = dynamic_strings == NULL ? 0 : section->sh_size;
5494         }
5495       else if (section->sh_type == SHT_SYMTAB_SHNDX)
5496         {
5497           if (symtab_shndx_hdr != NULL)
5498             {
5499               error (_("File contains multiple symtab shndx tables\n"));
5500               continue;
5501             }
5502           symtab_shndx_hdr = section;
5503         }
5504       else if (section->sh_type == SHT_SYMTAB)
5505         CHECK_ENTSIZE (section, i, Sym);
5506       else if (section->sh_type == SHT_GROUP)
5507         CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
5508       else if (section->sh_type == SHT_REL)
5509         CHECK_ENTSIZE (section, i, Rel);
5510       else if (section->sh_type == SHT_RELA)
5511         CHECK_ENTSIZE (section, i, Rela);
5512       else if ((do_debugging || do_debug_info || do_debug_abbrevs
5513                 || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
5514                 || do_debug_aranges || do_debug_frames || do_debug_macinfo
5515                 || do_debug_str || do_debug_loc || do_debug_ranges
5516                 || do_debug_addr || do_debug_cu_index)
5517                && (const_strneq (name, ".debug_")
5518                    || const_strneq (name, ".zdebug_")))
5519         {
5520           if (name[1] == 'z')
5521             name += sizeof (".zdebug_") - 1;
5522           else
5523             name += sizeof (".debug_") - 1;
5524
5525           if (do_debugging
5526               || (do_debug_info     && const_strneq (name, "info"))
5527               || (do_debug_info     && const_strneq (name, "types"))
5528               || (do_debug_abbrevs  && const_strneq (name, "abbrev"))
5529               || (do_debug_lines    && strcmp (name, "line") == 0)
5530               || (do_debug_lines    && const_strneq (name, "line."))
5531               || (do_debug_pubnames && const_strneq (name, "pubnames"))
5532               || (do_debug_pubtypes && const_strneq (name, "pubtypes"))
5533               || (do_debug_pubnames && const_strneq (name, "gnu_pubnames"))
5534               || (do_debug_pubtypes && const_strneq (name, "gnu_pubtypes"))
5535               || (do_debug_aranges  && const_strneq (name, "aranges"))
5536               || (do_debug_ranges   && const_strneq (name, "ranges"))
5537               || (do_debug_frames   && const_strneq (name, "frame"))
5538               || (do_debug_macinfo  && const_strneq (name, "macinfo"))
5539               || (do_debug_macinfo  && const_strneq (name, "macro"))
5540               || (do_debug_str      && const_strneq (name, "str"))
5541               || (do_debug_loc      && const_strneq (name, "loc"))
5542               || (do_debug_addr     && const_strneq (name, "addr"))
5543               || (do_debug_cu_index && const_strneq (name, "cu_index"))
5544               || (do_debug_cu_index && const_strneq (name, "tu_index"))
5545               )
5546             request_dump_bynumber (i, DEBUG_DUMP);
5547         }
5548       /* Linkonce section to be combined with .debug_info at link time.  */
5549       else if ((do_debugging || do_debug_info)
5550                && const_strneq (name, ".gnu.linkonce.wi."))
5551         request_dump_bynumber (i, DEBUG_DUMP);
5552       else if (do_debug_frames && streq (name, ".eh_frame"))
5553         request_dump_bynumber (i, DEBUG_DUMP);
5554       else if (do_gdb_index && streq (name, ".gdb_index"))
5555         request_dump_bynumber (i, DEBUG_DUMP);
5556       /* Trace sections for Itanium VMS.  */
5557       else if ((do_debugging || do_trace_info || do_trace_abbrevs
5558                 || do_trace_aranges)
5559                && const_strneq (name, ".trace_"))
5560         {
5561           name += sizeof (".trace_") - 1;
5562
5563           if (do_debugging
5564               || (do_trace_info     && streq (name, "info"))
5565               || (do_trace_abbrevs  && streq (name, "abbrev"))
5566               || (do_trace_aranges  && streq (name, "aranges"))
5567               )
5568             request_dump_bynumber (i, DEBUG_DUMP);
5569         }
5570     }
5571
5572   if (! do_sections)
5573     return 1;
5574
5575   if (elf_header.e_shnum > 1)
5576     printf (_("\nSection Headers:\n"));
5577   else
5578     printf (_("\nSection Header:\n"));
5579
5580   if (is_32bit_elf)
5581     {
5582       if (do_section_details)
5583         {
5584           printf (_("  [Nr] Name\n"));
5585           printf (_("       Type            Addr     Off    Size   ES   Lk Inf Al\n"));
5586         }
5587       else
5588         printf
5589           (_("  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al\n"));
5590     }
5591   else if (do_wide)
5592     {
5593       if (do_section_details)
5594         {
5595           printf (_("  [Nr] Name\n"));
5596           printf (_("       Type            Address          Off    Size   ES   Lk Inf Al\n"));
5597         }
5598       else
5599         printf
5600           (_("  [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al\n"));
5601     }
5602   else
5603     {
5604       if (do_section_details)
5605         {
5606           printf (_("  [Nr] Name\n"));
5607           printf (_("       Type              Address          Offset            Link\n"));
5608           printf (_("       Size              EntSize          Info              Align\n"));
5609         }
5610       else
5611         {
5612           printf (_("  [Nr] Name              Type             Address           Offset\n"));
5613           printf (_("       Size              EntSize          Flags  Link  Info  Align\n"));
5614         }
5615     }
5616
5617   if (do_section_details)
5618     printf (_("       Flags\n"));
5619
5620   for (i = 0, section = section_headers;
5621        i < elf_header.e_shnum;
5622        i++, section++)
5623     {
5624       printf ("  [%2u] ", i);
5625       if (do_section_details)
5626         printf ("%s\n      ", printable_section_name (section));
5627       else
5628         print_symbol (-17, SECTION_NAME (section));
5629
5630       printf (do_wide ? " %-15s " : " %-15.15s ",
5631               get_section_type_name (section->sh_type));
5632
5633       if (is_32bit_elf)
5634         {
5635           const char * link_too_big = NULL;
5636
5637           print_vma (section->sh_addr, LONG_HEX);
5638
5639           printf ( " %6.6lx %6.6lx %2.2lx",
5640                    (unsigned long) section->sh_offset,
5641                    (unsigned long) section->sh_size,
5642                    (unsigned long) section->sh_entsize);
5643
5644           if (do_section_details)
5645             fputs ("  ", stdout);
5646           else
5647             printf (" %3s ", get_elf_section_flags (section->sh_flags));
5648
5649           if (section->sh_link >= elf_header.e_shnum)
5650             {
5651               link_too_big = "";
5652               /* The sh_link value is out of range.  Normally this indicates
5653                  an error but it can have special values in Solaris binaries.  */
5654               switch (elf_header.e_machine)
5655                 {
5656                 case EM_386:
5657                 case EM_486:
5658                 case EM_X86_64:
5659                 case EM_L1OM:
5660                 case EM_K1OM:
5661                 case EM_OLD_SPARCV9:
5662                 case EM_SPARC32PLUS:
5663                 case EM_SPARCV9:
5664                 case EM_SPARC:
5665                   if (section->sh_link == (SHN_BEFORE & 0xffff))
5666                     link_too_big = "BEFORE";
5667                   else if (section->sh_link == (SHN_AFTER & 0xffff))
5668                     link_too_big = "AFTER";
5669                   break;
5670                 default:
5671                   break;
5672                 }
5673             }
5674
5675           if (do_section_details)
5676             {
5677               if (link_too_big != NULL && * link_too_big)
5678                 printf ("<%s> ", link_too_big);
5679               else
5680                 printf ("%2u ", section->sh_link);
5681               printf ("%3u %2lu\n", section->sh_info,
5682                       (unsigned long) section->sh_addralign);
5683             }
5684           else
5685             printf ("%2u %3u %2lu\n",
5686                     section->sh_link,
5687                     section->sh_info,
5688                     (unsigned long) section->sh_addralign);
5689
5690           if (link_too_big && ! * link_too_big)
5691             warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
5692                   i, section->sh_link);
5693         }
5694       else if (do_wide)
5695         {
5696           print_vma (section->sh_addr, LONG_HEX);
5697
5698           if ((long) section->sh_offset == section->sh_offset)
5699             printf (" %6.6lx", (unsigned long) section->sh_offset);
5700           else
5701             {
5702               putchar (' ');
5703               print_vma (section->sh_offset, LONG_HEX);
5704             }
5705
5706           if ((unsigned long) section->sh_size == section->sh_size)
5707             printf (" %6.6lx", (unsigned long) section->sh_size);
5708           else
5709             {
5710               putchar (' ');
5711               print_vma (section->sh_size, LONG_HEX);
5712             }
5713
5714           if ((unsigned long) section->sh_entsize == section->sh_entsize)
5715             printf (" %2.2lx", (unsigned long) section->sh_entsize);
5716           else
5717             {
5718               putchar (' ');
5719               print_vma (section->sh_entsize, LONG_HEX);
5720             }
5721
5722           if (do_section_details)
5723             fputs ("  ", stdout);
5724           else
5725             printf (" %3s ", get_elf_section_flags (section->sh_flags));
5726
5727           printf ("%2u %3u ", section->sh_link, section->sh_info);
5728
5729           if ((unsigned long) section->sh_addralign == section->sh_addralign)
5730             printf ("%2lu\n", (unsigned long) section->sh_addralign);
5731           else
5732             {
5733               print_vma (section->sh_addralign, DEC);
5734               putchar ('\n');
5735             }
5736         }
5737       else if (do_section_details)
5738         {
5739           printf ("       %-15.15s  ",
5740                   get_section_type_name (section->sh_type));
5741           print_vma (section->sh_addr, LONG_HEX);
5742           if ((long) section->sh_offset == section->sh_offset)
5743             printf ("  %16.16lx", (unsigned long) section->sh_offset);
5744           else
5745             {
5746               printf ("  ");
5747               print_vma (section->sh_offset, LONG_HEX);
5748             }
5749           printf ("  %u\n       ", section->sh_link);
5750           print_vma (section->sh_size, LONG_HEX);
5751           putchar (' ');
5752           print_vma (section->sh_entsize, LONG_HEX);
5753
5754           printf ("  %-16u  %lu\n",
5755                   section->sh_info,
5756                   (unsigned long) section->sh_addralign);
5757         }
5758       else
5759         {
5760           putchar (' ');
5761           print_vma (section->sh_addr, LONG_HEX);
5762           if ((long) section->sh_offset == section->sh_offset)
5763             printf ("  %8.8lx", (unsigned long) section->sh_offset);
5764           else
5765             {
5766               printf ("  ");
5767               print_vma (section->sh_offset, LONG_HEX);
5768             }
5769           printf ("\n       ");
5770           print_vma (section->sh_size, LONG_HEX);
5771           printf ("  ");
5772           print_vma (section->sh_entsize, LONG_HEX);
5773
5774           printf (" %3s ", get_elf_section_flags (section->sh_flags));
5775
5776           printf ("     %2u   %3u     %lu\n",
5777                   section->sh_link,
5778                   section->sh_info,
5779                   (unsigned long) section->sh_addralign);
5780         }
5781
5782       if (do_section_details)
5783         printf ("       %s\n", get_elf_section_flags (section->sh_flags));
5784     }
5785
5786   if (!do_section_details)
5787     {
5788       if (elf_header.e_machine == EM_X86_64
5789           || elf_header.e_machine == EM_L1OM
5790           || elf_header.e_machine == EM_K1OM)
5791         printf (_("Key to Flags:\n\
5792   W (write), A (alloc), X (execute), M (merge), S (strings), l (large)\n\
5793   I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)\n\
5794   O (extra OS processing required) o (OS specific), p (processor specific)\n"));
5795       else
5796         printf (_("Key to Flags:\n\
5797   W (write), A (alloc), X (execute), M (merge), S (strings)\n\
5798   I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)\n\
5799   O (extra OS processing required) o (OS specific), p (processor specific)\n"));
5800     }
5801
5802   return 1;
5803 }
5804
5805 static const char *
5806 get_group_flags (unsigned int flags)
5807 {
5808   static char buff[32];
5809   switch (flags)
5810     {
5811     case 0:
5812       return "";
5813
5814     case GRP_COMDAT:
5815       return "COMDAT ";
5816
5817    default:
5818       snprintf (buff, sizeof (buff), _("[<unknown>: 0x%x] "), flags);
5819       break;
5820     }
5821   return buff;
5822 }
5823
5824 static int
5825 process_section_groups (FILE * file)
5826 {
5827   Elf_Internal_Shdr * section;
5828   unsigned int i;
5829   struct group * group;
5830   Elf_Internal_Shdr * symtab_sec;
5831   Elf_Internal_Shdr * strtab_sec;
5832   Elf_Internal_Sym * symtab;
5833   unsigned long num_syms;
5834   char * strtab;
5835   size_t strtab_size;
5836
5837   /* Don't process section groups unless needed.  */
5838   if (!do_unwind && !do_section_groups)
5839     return 1;
5840
5841   if (elf_header.e_shnum == 0)
5842     {
5843       if (do_section_groups)
5844         printf (_("\nThere are no sections to group in this file.\n"));
5845
5846       return 1;
5847     }
5848
5849   if (section_headers == NULL)
5850     {
5851       error (_("Section headers are not available!\n"));
5852       /* PR 13622: This can happen with a corrupt ELF header.  */
5853       return 0;
5854     }
5855
5856   section_headers_groups = (struct group **) calloc (elf_header.e_shnum,
5857                                                      sizeof (struct group *));
5858
5859   if (section_headers_groups == NULL)
5860     {
5861       error (_("Out of memory reading %u section group headers\n"),
5862              elf_header.e_shnum);
5863       return 0;
5864     }
5865
5866   /* Scan the sections for the group section.  */
5867   group_count = 0;
5868   for (i = 0, section = section_headers;
5869        i < elf_header.e_shnum;
5870        i++, section++)
5871     if (section->sh_type == SHT_GROUP)
5872       group_count++;
5873
5874   if (group_count == 0)
5875     {
5876       if (do_section_groups)
5877         printf (_("\nThere are no section groups in this file.\n"));
5878
5879       return 1;
5880     }
5881
5882   section_groups = (struct group *) calloc (group_count, sizeof (struct group));
5883
5884   if (section_groups == NULL)
5885     {
5886       error (_("Out of memory reading %lu groups\n"),
5887              (unsigned long) group_count);
5888       return 0;
5889     }
5890
5891   symtab_sec = NULL;
5892   strtab_sec = NULL;
5893   symtab = NULL;
5894   num_syms = 0;
5895   strtab = NULL;
5896   strtab_size = 0;
5897   for (i = 0, section = section_headers, group = section_groups;
5898        i < elf_header.e_shnum;
5899        i++, section++)
5900     {
5901       if (section->sh_type == SHT_GROUP)
5902         {
5903           const char * name = printable_section_name (section);
5904           const char * group_name;
5905           unsigned char * start;
5906           unsigned char * indices;
5907           unsigned int entry, j, size;
5908           Elf_Internal_Shdr * sec;
5909           Elf_Internal_Sym * sym;
5910
5911           /* Get the symbol table.  */
5912           if (section->sh_link >= elf_header.e_shnum
5913               || ((sec = section_headers + section->sh_link)->sh_type
5914                   != SHT_SYMTAB))
5915             {
5916               error (_("Bad sh_link in group section `%s'\n"), name);
5917               continue;
5918             }
5919
5920           if (symtab_sec != sec)
5921             {
5922               symtab_sec = sec;
5923               if (symtab)
5924                 free (symtab);
5925               symtab = GET_ELF_SYMBOLS (file, symtab_sec, & num_syms);
5926             }
5927
5928           if (symtab == NULL)
5929             {
5930               error (_("Corrupt header in group section `%s'\n"), name);
5931               continue;
5932             }
5933
5934           if (section->sh_info >= num_syms)
5935             {
5936               error (_("Bad sh_info in group section `%s'\n"), name);
5937               continue;
5938             }
5939
5940           sym = symtab + section->sh_info;
5941
5942           if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
5943             {
5944               if (sym->st_shndx == 0
5945                   || sym->st_shndx >= elf_header.e_shnum)
5946                 {
5947                   error (_("Bad sh_info in group section `%s'\n"), name);
5948                   continue;
5949                 }
5950
5951               group_name = SECTION_NAME (section_headers + sym->st_shndx);
5952               strtab_sec = NULL;
5953               if (strtab)
5954                 free (strtab);
5955               strtab = NULL;
5956               strtab_size = 0;
5957             }
5958           else
5959             {
5960               /* Get the string table.  */
5961               if (symtab_sec->sh_link >= elf_header.e_shnum)
5962                 {
5963                   strtab_sec = NULL;
5964                   if (strtab)
5965                     free (strtab);
5966                   strtab = NULL;
5967                   strtab_size = 0;
5968                 }
5969               else if (strtab_sec
5970                        != (sec = section_headers + symtab_sec->sh_link))
5971                 {
5972                   strtab_sec = sec;
5973                   if (strtab)
5974                     free (strtab);
5975
5976                   strtab = (char *) get_data (NULL, file, strtab_sec->sh_offset,
5977                                               1, strtab_sec->sh_size,
5978                                               _("string table"));
5979                   strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
5980                 }
5981               group_name = sym->st_name < strtab_size
5982                 ? strtab + sym->st_name : _("<corrupt>");
5983             }
5984
5985           /* PR 17531: file: loop.  */
5986           if (section->sh_entsize > section->sh_size)
5987             {
5988               error (_("Section %s has sh_entsize (0x%lx) which is larger than its size (0x%lx)\n"),
5989                      printable_section_name (section),
5990                      (unsigned long) section->sh_entsize,
5991                      (unsigned long) section->sh_size);
5992               break;
5993             }
5994
5995           start = (unsigned char *) get_data (NULL, file, section->sh_offset,
5996                                               1, section->sh_size,
5997                                               _("section data"));
5998           if (start == NULL)
5999             continue;
6000
6001           indices = start;
6002           size = (section->sh_size / section->sh_entsize) - 1;
6003           entry = byte_get (indices, 4);
6004           indices += 4;
6005
6006           if (do_section_groups)
6007             {
6008               printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
6009                       get_group_flags (entry), i, name, group_name, size);
6010
6011               printf (_("   [Index]    Name\n"));
6012             }
6013
6014           group->group_index = i;
6015
6016           for (j = 0; j < size; j++)
6017             {
6018               struct group_list * g;
6019
6020               entry = byte_get (indices, 4);
6021               indices += 4;
6022
6023               if (entry >= elf_header.e_shnum)
6024                 {
6025                   static unsigned num_group_errors = 0;
6026
6027                   if (num_group_errors ++ < 10)
6028                     {
6029                       error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
6030                              entry, i, elf_header.e_shnum - 1);
6031                       if (num_group_errors == 10)
6032                         warn (_("Futher error messages about overlarge group section indicies suppressed\n"));
6033                     }
6034                   continue;
6035                 }
6036
6037               if (section_headers_groups [entry] != NULL)
6038                 {
6039                   if (entry)
6040                     {
6041                       static unsigned num_errs = 0;
6042
6043                       if (num_errs ++ < 10)
6044                         {
6045                           error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
6046                                  entry, i,
6047                                  section_headers_groups [entry]->group_index);
6048                           if (num_errs == 10)
6049                             warn (_("Further error messages about already contained group sections suppressed\n"));
6050                         }
6051                       continue;
6052                     }
6053                   else
6054                     {
6055                       /* Intel C/C++ compiler may put section 0 in a
6056                          section group. We just warn it the first time
6057                          and ignore it afterwards.  */
6058                       static int warned = 0;
6059                       if (!warned)
6060                         {
6061                           error (_("section 0 in group section [%5u]\n"),
6062                                  section_headers_groups [entry]->group_index);
6063                           warned++;
6064                         }
6065                     }
6066                 }
6067
6068               section_headers_groups [entry] = group;
6069
6070               if (do_section_groups)
6071                 {
6072                   sec = section_headers + entry;
6073                   printf ("   [%5u]   %s\n", entry, printable_section_name (sec));
6074                 }
6075
6076               g = (struct group_list *) xmalloc (sizeof (struct group_list));
6077               g->section_index = entry;
6078               g->next = group->root;
6079               group->root = g;
6080             }
6081
6082           if (start)
6083             free (start);
6084
6085           group++;
6086         }
6087     }
6088
6089   if (symtab)
6090     free (symtab);
6091   if (strtab)
6092     free (strtab);
6093   return 1;
6094 }
6095
6096 /* Data used to display dynamic fixups.  */
6097
6098 struct ia64_vms_dynfixup
6099 {
6100   bfd_vma needed_ident;         /* Library ident number.  */
6101   bfd_vma needed;               /* Index in the dstrtab of the library name.  */
6102   bfd_vma fixup_needed;         /* Index of the library.  */
6103   bfd_vma fixup_rela_cnt;       /* Number of fixups.  */
6104   bfd_vma fixup_rela_off;       /* Fixups offset in the dynamic segment.  */
6105 };
6106
6107 /* Data used to display dynamic relocations.  */
6108
6109 struct ia64_vms_dynimgrela
6110 {
6111   bfd_vma img_rela_cnt;         /* Number of relocations.  */
6112   bfd_vma img_rela_off;         /* Reloc offset in the dynamic segment.  */
6113 };
6114
6115 /* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
6116    library).  */
6117
6118 static void
6119 dump_ia64_vms_dynamic_fixups (FILE *file, struct ia64_vms_dynfixup *fixup,
6120                               const char *strtab, unsigned int strtab_sz)
6121 {
6122   Elf64_External_VMS_IMAGE_FIXUP *imfs;
6123   long i;
6124   const char *lib_name;
6125
6126   imfs = get_data (NULL, file, dynamic_addr + fixup->fixup_rela_off,
6127                    1, fixup->fixup_rela_cnt * sizeof (*imfs),
6128                    _("dynamic section image fixups"));
6129   if (!imfs)
6130     return;
6131
6132   if (fixup->needed < strtab_sz)
6133     lib_name = strtab + fixup->needed;
6134   else
6135     {
6136       warn ("corrupt library name index of 0x%lx found in dynamic entry",
6137             (unsigned long) fixup->needed);
6138       lib_name = "???";
6139     }
6140   printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
6141           (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
6142   printf
6143     (_("Seg Offset           Type                             SymVec DataType\n"));
6144
6145   for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
6146     {
6147       unsigned int type;
6148       const char *rtype;
6149
6150       printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
6151       printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
6152       type = BYTE_GET (imfs [i].type);
6153       rtype = elf_ia64_reloc_type (type);
6154       if (rtype == NULL)
6155         printf (" 0x%08x                       ", type);
6156       else
6157         printf (" %-32s ", rtype);
6158       printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
6159       printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
6160     }
6161
6162   free (imfs);
6163 }
6164
6165 /* Display IA-64 OpenVMS dynamic relocations (used to relocate an image).  */
6166
6167 static void
6168 dump_ia64_vms_dynamic_relocs (FILE *file, struct ia64_vms_dynimgrela *imgrela)
6169 {
6170   Elf64_External_VMS_IMAGE_RELA *imrs;
6171   long i;
6172
6173   imrs = get_data (NULL, file, dynamic_addr + imgrela->img_rela_off,
6174                    1, imgrela->img_rela_cnt * sizeof (*imrs),
6175                    _("dynamic section image relocations"));
6176   if (!imrs)
6177     return;
6178
6179   printf (_("\nImage relocs\n"));
6180   printf
6181     (_("Seg Offset   Type                            Addend            Seg Sym Off\n"));
6182
6183   for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
6184     {
6185       unsigned int type;
6186       const char *rtype;
6187
6188       printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
6189       printf ("%08" BFD_VMA_FMT "x ",
6190               (bfd_vma) BYTE_GET (imrs [i].rela_offset));
6191       type = BYTE_GET (imrs [i].type);
6192       rtype = elf_ia64_reloc_type (type);
6193       if (rtype == NULL)
6194         printf ("0x%08x                      ", type);
6195       else
6196         printf ("%-31s ", rtype);
6197       print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
6198       printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
6199       printf ("%08" BFD_VMA_FMT "x\n",
6200               (bfd_vma) BYTE_GET (imrs [i].sym_offset));
6201     }
6202
6203   free (imrs);
6204 }
6205
6206 /* Display IA-64 OpenVMS dynamic relocations and fixups.  */
6207
6208 static int
6209 process_ia64_vms_dynamic_relocs (FILE *file)
6210 {
6211   struct ia64_vms_dynfixup fixup;
6212   struct ia64_vms_dynimgrela imgrela;
6213   Elf_Internal_Dyn *entry;
6214   int res = 0;
6215   bfd_vma strtab_off = 0;
6216   bfd_vma strtab_sz = 0;
6217   char *strtab = NULL;
6218
6219   memset (&fixup, 0, sizeof (fixup));
6220   memset (&imgrela, 0, sizeof (imgrela));
6221
6222   /* Note: the order of the entries is specified by the OpenVMS specs.  */
6223   for (entry = dynamic_section;
6224        entry < dynamic_section + dynamic_nent;
6225        entry++)
6226     {
6227       switch (entry->d_tag)
6228         {
6229         case DT_IA_64_VMS_STRTAB_OFFSET:
6230           strtab_off = entry->d_un.d_val;
6231           break;
6232         case DT_STRSZ:
6233           strtab_sz = entry->d_un.d_val;
6234           if (strtab == NULL)
6235             strtab = get_data (NULL, file, dynamic_addr + strtab_off,
6236                                1, strtab_sz, _("dynamic string section"));
6237           break;
6238
6239         case DT_IA_64_VMS_NEEDED_IDENT:
6240           fixup.needed_ident = entry->d_un.d_val;
6241           break;
6242         case DT_NEEDED:
6243           fixup.needed = entry->d_un.d_val;
6244           break;
6245         case DT_IA_64_VMS_FIXUP_NEEDED:
6246           fixup.fixup_needed = entry->d_un.d_val;
6247           break;
6248         case DT_IA_64_VMS_FIXUP_RELA_CNT:
6249           fixup.fixup_rela_cnt = entry->d_un.d_val;
6250           break;
6251         case DT_IA_64_VMS_FIXUP_RELA_OFF:
6252           fixup.fixup_rela_off = entry->d_un.d_val;
6253           res++;
6254           dump_ia64_vms_dynamic_fixups (file, &fixup, strtab, strtab_sz);
6255           break;
6256
6257         case DT_IA_64_VMS_IMG_RELA_CNT:
6258           imgrela.img_rela_cnt = entry->d_un.d_val;
6259           break;
6260         case DT_IA_64_VMS_IMG_RELA_OFF:
6261           imgrela.img_rela_off = entry->d_un.d_val;
6262           res++;
6263           dump_ia64_vms_dynamic_relocs (file, &imgrela);
6264           break;
6265
6266         default:
6267           break;
6268         }
6269     }
6270
6271   if (strtab != NULL)
6272     free (strtab);
6273
6274   return res;
6275 }
6276
6277 static struct
6278 {
6279   const char * name;
6280   int reloc;
6281   int size;
6282   int rela;
6283 } dynamic_relocations [] =
6284 {
6285     { "REL", DT_REL, DT_RELSZ, FALSE },
6286     { "RELA", DT_RELA, DT_RELASZ, TRUE },
6287     { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
6288 };
6289
6290 /* Process the reloc section.  */
6291
6292 static int
6293 process_relocs (FILE * file)
6294 {
6295   unsigned long rel_size;
6296   unsigned long rel_offset;
6297
6298
6299   if (!do_reloc)
6300     return 1;
6301
6302   if (do_using_dynamic)
6303     {
6304       int is_rela;
6305       const char * name;
6306       int has_dynamic_reloc;
6307       unsigned int i;
6308
6309       has_dynamic_reloc = 0;
6310
6311       for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
6312         {
6313           is_rela = dynamic_relocations [i].rela;
6314           name = dynamic_relocations [i].name;
6315           rel_size = dynamic_info [dynamic_relocations [i].size];
6316           rel_offset = dynamic_info [dynamic_relocations [i].reloc];
6317
6318           has_dynamic_reloc |= rel_size;
6319
6320           if (is_rela == UNKNOWN)
6321             {
6322               if (dynamic_relocations [i].reloc == DT_JMPREL)
6323                 switch (dynamic_info[DT_PLTREL])
6324                   {
6325                   case DT_REL:
6326                     is_rela = FALSE;
6327                     break;
6328                   case DT_RELA:
6329                     is_rela = TRUE;
6330                     break;
6331                   }
6332             }
6333
6334           if (rel_size)
6335             {
6336               printf
6337                 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
6338                  name, rel_offset, rel_size);
6339
6340               dump_relocations (file,
6341                                 offset_from_vma (file, rel_offset, rel_size),
6342                                 rel_size,
6343                                 dynamic_symbols, num_dynamic_syms,
6344                                 dynamic_strings, dynamic_strings_length,
6345                                 is_rela, 1);
6346             }
6347         }
6348
6349       if (is_ia64_vms ())
6350         has_dynamic_reloc |= process_ia64_vms_dynamic_relocs (file);
6351
6352       if (! has_dynamic_reloc)
6353         printf (_("\nThere are no dynamic relocations in this file.\n"));
6354     }
6355   else
6356     {
6357       Elf_Internal_Shdr * section;
6358       unsigned long i;
6359       int found = 0;
6360
6361       for (i = 0, section = section_headers;
6362            i < elf_header.e_shnum;
6363            i++, section++)
6364         {
6365           if (   section->sh_type != SHT_RELA
6366               && section->sh_type != SHT_REL)
6367             continue;
6368
6369           rel_offset = section->sh_offset;
6370           rel_size   = section->sh_size;
6371
6372           if (rel_size)
6373             {
6374               Elf_Internal_Shdr * strsec;
6375               int is_rela;
6376
6377               printf (_("\nRelocation section "));
6378
6379               if (string_table == NULL)
6380                 printf ("%d", section->sh_name);
6381               else
6382                 printf ("'%s'", printable_section_name (section));
6383
6384               printf (_(" at offset 0x%lx contains %lu entries:\n"),
6385                  rel_offset, (unsigned long) (rel_size / section->sh_entsize));
6386
6387               is_rela = section->sh_type == SHT_RELA;
6388
6389               if (section->sh_link != 0
6390                   && section->sh_link < elf_header.e_shnum)
6391                 {
6392                   Elf_Internal_Shdr * symsec;
6393                   Elf_Internal_Sym *  symtab;
6394                   unsigned long nsyms;
6395                   unsigned long strtablen = 0;
6396                   char * strtab = NULL;
6397
6398                   symsec = section_headers + section->sh_link;
6399                   if (symsec->sh_type != SHT_SYMTAB
6400                       && symsec->sh_type != SHT_DYNSYM)
6401                     continue;
6402
6403                   symtab = GET_ELF_SYMBOLS (file, symsec, & nsyms);
6404
6405                   if (symtab == NULL)
6406                     continue;
6407
6408                   if (symsec->sh_link != 0
6409                       && symsec->sh_link < elf_header.e_shnum)
6410                     {
6411                       strsec = section_headers + symsec->sh_link;
6412
6413                       strtab = (char *) get_data (NULL, file, strsec->sh_offset,
6414                                                   1, strsec->sh_size,
6415                                                   _("string table"));
6416                       strtablen = strtab == NULL ? 0 : strsec->sh_size;
6417                     }
6418
6419                   dump_relocations (file, rel_offset, rel_size,
6420                                     symtab, nsyms, strtab, strtablen,
6421                                     is_rela,
6422                                     symsec->sh_type == SHT_DYNSYM);
6423                   if (strtab)
6424                     free (strtab);
6425                   free (symtab);
6426                 }
6427               else
6428                 dump_relocations (file, rel_offset, rel_size,
6429                                   NULL, 0, NULL, 0, is_rela, 0);
6430
6431               found = 1;
6432             }
6433         }
6434
6435       if (! found)
6436         printf (_("\nThere are no relocations in this file.\n"));
6437     }
6438
6439   return 1;
6440 }
6441
6442 /* An absolute address consists of a section and an offset.  If the
6443    section is NULL, the offset itself is the address, otherwise, the
6444    address equals to LOAD_ADDRESS(section) + offset.  */
6445
6446 struct absaddr
6447 {
6448   unsigned short section;
6449   bfd_vma offset;
6450 };
6451
6452 #define ABSADDR(a) \
6453   ((a).section \
6454    ? section_headers [(a).section].sh_addr + (a).offset \
6455    : (a).offset)
6456
6457 /* Find the nearest symbol at or below ADDR.  Returns the symbol
6458    name, if found, and the offset from the symbol to ADDR.  */
6459
6460 static void
6461 find_symbol_for_address (Elf_Internal_Sym * symtab,
6462                          unsigned long      nsyms,
6463                          const char *       strtab,
6464                          unsigned long      strtab_size,
6465                          struct absaddr     addr,
6466                          const char **      symname,
6467                          bfd_vma *          offset)
6468 {
6469   bfd_vma dist = 0x100000;
6470   Elf_Internal_Sym * sym;
6471   Elf_Internal_Sym * beg;
6472   Elf_Internal_Sym * end;
6473   Elf_Internal_Sym * best = NULL;
6474
6475   REMOVE_ARCH_BITS (addr.offset);
6476   beg = symtab;
6477   end = symtab + nsyms;
6478
6479   while (beg < end)
6480     {
6481       bfd_vma value;
6482
6483       sym = beg + (end - beg) / 2;
6484
6485       value = sym->st_value;
6486       REMOVE_ARCH_BITS (value);
6487
6488       if (sym->st_name != 0
6489           && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
6490           && addr.offset >= value
6491           && addr.offset - value < dist)
6492         {
6493           best = sym;
6494           dist = addr.offset - value;
6495           if (!dist)
6496             break;
6497         }
6498
6499       if (addr.offset < value)
6500         end = sym;
6501       else
6502         beg = sym + 1;
6503     }
6504
6505   if (best)
6506     {
6507       *symname = (best->st_name >= strtab_size
6508                   ? _("<corrupt>") : strtab + best->st_name);
6509       *offset = dist;
6510       return;
6511     }
6512
6513   *symname = NULL;
6514   *offset = addr.offset;
6515 }
6516
6517 static int
6518 symcmp (const void *p, const void *q)
6519 {
6520   Elf_Internal_Sym *sp = (Elf_Internal_Sym *) p;
6521   Elf_Internal_Sym *sq = (Elf_Internal_Sym *) q;
6522
6523   return sp->st_value > sq->st_value ? 1 : (sp->st_value < sq->st_value ? -1 : 0);
6524 }
6525
6526 /* Process the unwind section.  */
6527
6528 #include "unwind-ia64.h"
6529
6530 struct ia64_unw_table_entry
6531 {
6532   struct absaddr start;
6533   struct absaddr end;
6534   struct absaddr info;
6535 };
6536
6537 struct ia64_unw_aux_info
6538 {
6539   struct ia64_unw_table_entry *table;   /* Unwind table.  */
6540   unsigned long table_len;              /* Length of unwind table.  */
6541   unsigned char * info;                 /* Unwind info.  */
6542   unsigned long info_size;              /* Size of unwind info.  */
6543   bfd_vma info_addr;                    /* Starting address of unwind info.  */
6544   bfd_vma seg_base;                     /* Starting address of segment.  */
6545   Elf_Internal_Sym * symtab;            /* The symbol table.  */
6546   unsigned long nsyms;                  /* Number of symbols.  */
6547   Elf_Internal_Sym * funtab;            /* Sorted table of STT_FUNC symbols.  */
6548   unsigned long nfuns;                  /* Number of entries in funtab.  */
6549   char * strtab;                        /* The string table.  */
6550   unsigned long strtab_size;            /* Size of string table.  */
6551 };
6552
6553 static void
6554 dump_ia64_unwind (struct ia64_unw_aux_info * aux)
6555 {
6556   struct ia64_unw_table_entry * tp;
6557   unsigned long j, nfuns;
6558   int in_body;
6559
6560   aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
6561   for (nfuns = 0, j = 0; j < aux->nsyms; j++)
6562     if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
6563       aux->funtab[nfuns++] = aux->symtab[j];
6564   aux->nfuns = nfuns;
6565   qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
6566
6567   for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
6568     {
6569       bfd_vma stamp;
6570       bfd_vma offset;
6571       const unsigned char * dp;
6572       const unsigned char * head;
6573       const unsigned char * end;
6574       const char * procname;
6575
6576       find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
6577                                aux->strtab_size, tp->start, &procname, &offset);
6578
6579       fputs ("\n<", stdout);
6580
6581       if (procname)
6582         {
6583           fputs (procname, stdout);
6584
6585           if (offset)
6586             printf ("+%lx", (unsigned long) offset);
6587         }
6588
6589       fputs (">: [", stdout);
6590       print_vma (tp->start.offset, PREFIX_HEX);
6591       fputc ('-', stdout);
6592       print_vma (tp->end.offset, PREFIX_HEX);
6593       printf ("], info at +0x%lx\n",
6594               (unsigned long) (tp->info.offset - aux->seg_base));
6595
6596       /* PR 17531: file: 86232b32.  */
6597       if (aux->info == NULL)
6598         continue;
6599
6600       /* PR 17531: file: 0997b4d1.  */
6601       if ((ABSADDR (tp->info) - aux->info_addr) >= aux->info_size)
6602         {
6603           warn (_("Invalid offset %lx in table entry %ld\n"),
6604                 (long) tp->info.offset, (long) (tp - aux->table));
6605           continue;
6606         }
6607
6608       head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
6609       stamp = byte_get ((unsigned char *) head, sizeof (stamp));
6610
6611       printf ("  v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
6612               (unsigned) UNW_VER (stamp),
6613               (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
6614               UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
6615               UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
6616               (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
6617
6618       if (UNW_VER (stamp) != 1)
6619         {
6620           printf (_("\tUnknown version.\n"));
6621           continue;
6622         }
6623
6624       in_body = 0;
6625       end = head + 8 + eh_addr_size * UNW_LENGTH (stamp);
6626       /* PR 17531: file: 16ceda89.  */
6627       if (end > aux->info + aux->info_size)
6628         end = aux->info + aux->info_size;
6629       for (dp = head + 8; dp < end;)
6630         dp = unw_decode (dp, in_body, & in_body);
6631     }
6632
6633   free (aux->funtab);
6634 }
6635
6636 static bfd_boolean
6637 slurp_ia64_unwind_table (FILE * file,
6638                          struct ia64_unw_aux_info * aux,
6639                          Elf_Internal_Shdr * sec)
6640 {
6641   unsigned long size, nrelas, i;
6642   Elf_Internal_Phdr * seg;
6643   struct ia64_unw_table_entry * tep;
6644   Elf_Internal_Shdr * relsec;
6645   Elf_Internal_Rela * rela;
6646   Elf_Internal_Rela * rp;
6647   unsigned char * table;
6648   unsigned char * tp;
6649   Elf_Internal_Sym * sym;
6650   const char * relname;
6651
6652   aux->table_len = 0;
6653
6654   /* First, find the starting address of the segment that includes
6655      this section: */
6656
6657   if (elf_header.e_phnum)
6658     {
6659       if (! get_program_headers (file))
6660           return FALSE;
6661
6662       for (seg = program_headers;
6663            seg < program_headers + elf_header.e_phnum;
6664            ++seg)
6665         {
6666           if (seg->p_type != PT_LOAD)
6667             continue;
6668
6669           if (sec->sh_addr >= seg->p_vaddr
6670               && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
6671             {
6672               aux->seg_base = seg->p_vaddr;
6673               break;
6674             }
6675         }
6676     }
6677
6678   /* Second, build the unwind table from the contents of the unwind section:  */
6679   size = sec->sh_size;
6680   table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
6681                                       _("unwind table"));
6682   if (!table)
6683     return FALSE;
6684
6685   aux->table_len = size / (3 * eh_addr_size);
6686   aux->table = (struct ia64_unw_table_entry *)
6687     xcmalloc (aux->table_len, sizeof (aux->table[0]));
6688   tep = aux->table;
6689
6690   for (tp = table; tp <= table + size - (3 * eh_addr_size); ++tep)
6691     {
6692       tep->start.section = SHN_UNDEF;
6693       tep->end.section   = SHN_UNDEF;
6694       tep->info.section  = SHN_UNDEF;
6695       tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
6696       tep->end.offset   = byte_get (tp, eh_addr_size); tp += eh_addr_size;
6697       tep->info.offset  = byte_get (tp, eh_addr_size); tp += eh_addr_size;
6698       tep->start.offset += aux->seg_base;
6699       tep->end.offset   += aux->seg_base;
6700       tep->info.offset  += aux->seg_base;
6701     }
6702   free (table);
6703
6704   /* Third, apply any relocations to the unwind table:  */
6705   for (relsec = section_headers;
6706        relsec < section_headers + elf_header.e_shnum;
6707        ++relsec)
6708     {
6709       if (relsec->sh_type != SHT_RELA
6710           || relsec->sh_info >= elf_header.e_shnum
6711           || section_headers + relsec->sh_info != sec)
6712         continue;
6713
6714       if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
6715                               & rela, & nrelas))
6716         {
6717           free (aux->table);
6718           aux->table = NULL;
6719           aux->table_len = 0;
6720           return FALSE;
6721         }
6722
6723       for (rp = rela; rp < rela + nrelas; ++rp)
6724         {
6725           relname = elf_ia64_reloc_type (get_reloc_type (rp->r_info));
6726           sym = aux->symtab + get_reloc_symindex (rp->r_info);
6727
6728           /* PR 17531: file: 9fa67536.  */
6729           if (relname == NULL)
6730             {
6731               warn (_("Skipping unknown relocation type: %u\n"), get_reloc_type (rp->r_info));
6732               continue;
6733             }
6734
6735           if (! const_strneq (relname, "R_IA64_SEGREL"))
6736             {
6737               warn (_("Skipping unexpected relocation type: %s\n"), relname);
6738               continue;
6739             }
6740
6741           i = rp->r_offset / (3 * eh_addr_size);
6742
6743           /* PR 17531: file: 5bc8d9bf.  */
6744           if (i >= aux->table_len)
6745             {
6746               warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
6747               continue;
6748             }
6749
6750           switch (rp->r_offset / eh_addr_size % 3)
6751             {
6752             case 0:
6753               aux->table[i].start.section = sym->st_shndx;
6754               aux->table[i].start.offset  = rp->r_addend + sym->st_value;
6755               break;
6756             case 1:
6757               aux->table[i].end.section   = sym->st_shndx;
6758               aux->table[i].end.offset    = rp->r_addend + sym->st_value;
6759               break;
6760             case 2:
6761               aux->table[i].info.section  = sym->st_shndx;
6762               aux->table[i].info.offset   = rp->r_addend + sym->st_value;
6763               break;
6764             default:
6765               break;
6766             }
6767         }
6768
6769       free (rela);
6770     }
6771
6772   return TRUE;
6773 }
6774
6775 static void
6776 ia64_process_unwind (FILE * file)
6777 {
6778   Elf_Internal_Shdr * sec;
6779   Elf_Internal_Shdr * unwsec = NULL;
6780   Elf_Internal_Shdr * strsec;
6781   unsigned long i, unwcount = 0, unwstart = 0;
6782   struct ia64_unw_aux_info aux;
6783
6784   memset (& aux, 0, sizeof (aux));
6785
6786   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
6787     {
6788       if (sec->sh_type == SHT_SYMTAB
6789           && sec->sh_link < elf_header.e_shnum)
6790         {
6791           aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
6792
6793           strsec = section_headers + sec->sh_link;
6794           if (aux.strtab != NULL)
6795             {
6796               error (_("Multiple auxillary string tables encountered\n"));
6797               free (aux.strtab);
6798             }
6799           aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
6800                                           1, strsec->sh_size,
6801                                           _("string table"));
6802           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
6803         }
6804       else if (sec->sh_type == SHT_IA_64_UNWIND)
6805         unwcount++;
6806     }
6807
6808   if (!unwcount)
6809     printf (_("\nThere are no unwind sections in this file.\n"));
6810
6811   while (unwcount-- > 0)
6812     {
6813       char * suffix;
6814       size_t len, len2;
6815
6816       for (i = unwstart, sec = section_headers + unwstart, unwsec = NULL;
6817            i < elf_header.e_shnum; ++i, ++sec)
6818         if (sec->sh_type == SHT_IA_64_UNWIND)
6819           {
6820             unwsec = sec;
6821             break;
6822           }
6823       /* We have already counted the number of SHT_IA64_UNWIND
6824          sections so the loop above should never fail.  */
6825       assert (unwsec != NULL);
6826
6827       unwstart = i + 1;
6828       len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
6829
6830       if ((unwsec->sh_flags & SHF_GROUP) != 0)
6831         {
6832           /* We need to find which section group it is in.  */
6833           struct group_list * g;
6834
6835           if (section_headers_groups == NULL
6836               || section_headers_groups [i] == NULL)
6837             i = elf_header.e_shnum;
6838           else
6839             {
6840               g = section_headers_groups [i]->root;
6841
6842               for (; g != NULL; g = g->next)
6843                 {
6844                   sec = section_headers + g->section_index;
6845
6846                   if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
6847                     break;
6848                 }
6849
6850               if (g == NULL)
6851                 i = elf_header.e_shnum;
6852             }
6853         }
6854       else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
6855         {
6856           /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO.  */
6857           len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
6858           suffix = SECTION_NAME (unwsec) + len;
6859           for (i = 0, sec = section_headers; i < elf_header.e_shnum;
6860                ++i, ++sec)
6861             if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
6862                 && streq (SECTION_NAME (sec) + len2, suffix))
6863               break;
6864         }
6865       else
6866         {
6867           /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
6868              .IA_64.unwind or BAR -> .IA_64.unwind_info.  */
6869           len = sizeof (ELF_STRING_ia64_unwind) - 1;
6870           len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
6871           suffix = "";
6872           if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
6873             suffix = SECTION_NAME (unwsec) + len;
6874           for (i = 0, sec = section_headers; i < elf_header.e_shnum;
6875                ++i, ++sec)
6876             if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
6877                 && streq (SECTION_NAME (sec) + len2, suffix))
6878               break;
6879         }
6880
6881       if (i == elf_header.e_shnum)
6882         {
6883           printf (_("\nCould not find unwind info section for "));
6884
6885           if (string_table == NULL)
6886             printf ("%d", unwsec->sh_name);
6887           else
6888             printf ("'%s'", printable_section_name (unwsec));
6889         }
6890       else
6891         {
6892           aux.info_addr = sec->sh_addr;
6893           aux.info = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1,
6894                                                  sec->sh_size,
6895                                                  _("unwind info"));
6896           aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
6897
6898           printf (_("\nUnwind section "));
6899
6900           if (string_table == NULL)
6901             printf ("%d", unwsec->sh_name);
6902           else
6903             printf ("'%s'", printable_section_name (unwsec));
6904
6905           printf (_(" at offset 0x%lx contains %lu entries:\n"),
6906                   (unsigned long) unwsec->sh_offset,
6907                   (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
6908
6909           if (slurp_ia64_unwind_table (file, & aux, unwsec)
6910               && aux.table_len > 0)
6911             dump_ia64_unwind (& aux);
6912
6913           if (aux.table)
6914             free ((char *) aux.table);
6915           if (aux.info)
6916             free ((char *) aux.info);
6917           aux.table = NULL;
6918           aux.info = NULL;
6919         }
6920     }
6921
6922   if (aux.symtab)
6923     free (aux.symtab);
6924   if (aux.strtab)
6925     free ((char *) aux.strtab);
6926 }
6927
6928 struct hppa_unw_table_entry
6929   {
6930     struct absaddr start;
6931     struct absaddr end;
6932     unsigned int Cannot_unwind:1;               /* 0 */
6933     unsigned int Millicode:1;                   /* 1 */
6934     unsigned int Millicode_save_sr0:1;          /* 2 */
6935     unsigned int Region_description:2;          /* 3..4 */
6936     unsigned int reserved1:1;                   /* 5 */
6937     unsigned int Entry_SR:1;                    /* 6 */
6938     unsigned int Entry_FR:4;     /* number saved */     /* 7..10 */
6939     unsigned int Entry_GR:5;     /* number saved */     /* 11..15 */
6940     unsigned int Args_stored:1;                 /* 16 */
6941     unsigned int Variable_Frame:1;              /* 17 */
6942     unsigned int Separate_Package_Body:1;       /* 18 */
6943     unsigned int Frame_Extension_Millicode:1;   /* 19 */
6944     unsigned int Stack_Overflow_Check:1;        /* 20 */
6945     unsigned int Two_Instruction_SP_Increment:1;/* 21 */
6946     unsigned int Ada_Region:1;                  /* 22 */
6947     unsigned int cxx_info:1;                    /* 23 */
6948     unsigned int cxx_try_catch:1;               /* 24 */
6949     unsigned int sched_entry_seq:1;             /* 25 */
6950     unsigned int reserved2:1;                   /* 26 */
6951     unsigned int Save_SP:1;                     /* 27 */
6952     unsigned int Save_RP:1;                     /* 28 */
6953     unsigned int Save_MRP_in_frame:1;           /* 29 */
6954     unsigned int extn_ptr_defined:1;            /* 30 */
6955     unsigned int Cleanup_defined:1;             /* 31 */
6956
6957     unsigned int MPE_XL_interrupt_marker:1;     /* 0 */
6958     unsigned int HP_UX_interrupt_marker:1;      /* 1 */
6959     unsigned int Large_frame:1;                 /* 2 */
6960     unsigned int Pseudo_SP_Set:1;               /* 3 */
6961     unsigned int reserved4:1;                   /* 4 */
6962     unsigned int Total_frame_size:27;           /* 5..31 */
6963   };
6964
6965 struct hppa_unw_aux_info
6966 {
6967   struct hppa_unw_table_entry * table;  /* Unwind table.  */
6968   unsigned long table_len;              /* Length of unwind table.  */
6969   bfd_vma seg_base;                     /* Starting address of segment.  */
6970   Elf_Internal_Sym * symtab;            /* The symbol table.  */
6971   unsigned long nsyms;                  /* Number of symbols.  */
6972   Elf_Internal_Sym * funtab;            /* Sorted table of STT_FUNC symbols.  */
6973   unsigned long nfuns;                  /* Number of entries in funtab.  */
6974   char * strtab;                        /* The string table.  */
6975   unsigned long strtab_size;            /* Size of string table.  */
6976 };
6977
6978 static void
6979 dump_hppa_unwind (struct hppa_unw_aux_info * aux)
6980 {
6981   struct hppa_unw_table_entry * tp;
6982   unsigned long j, nfuns;
6983
6984   aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
6985   for (nfuns = 0, j = 0; j < aux->nsyms; j++)
6986     if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
6987       aux->funtab[nfuns++] = aux->symtab[j];
6988   aux->nfuns = nfuns;
6989   qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
6990
6991   for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
6992     {
6993       bfd_vma offset;
6994       const char * procname;
6995
6996       find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
6997                                aux->strtab_size, tp->start, &procname,
6998                                &offset);
6999
7000       fputs ("\n<", stdout);
7001
7002       if (procname)
7003         {
7004           fputs (procname, stdout);
7005
7006           if (offset)
7007             printf ("+%lx", (unsigned long) offset);
7008         }
7009
7010       fputs (">: [", stdout);
7011       print_vma (tp->start.offset, PREFIX_HEX);
7012       fputc ('-', stdout);
7013       print_vma (tp->end.offset, PREFIX_HEX);
7014       printf ("]\n\t");
7015
7016 #define PF(_m) if (tp->_m) printf (#_m " ");
7017 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
7018       PF(Cannot_unwind);
7019       PF(Millicode);
7020       PF(Millicode_save_sr0);
7021       /* PV(Region_description);  */
7022       PF(Entry_SR);
7023       PV(Entry_FR);
7024       PV(Entry_GR);
7025       PF(Args_stored);
7026       PF(Variable_Frame);
7027       PF(Separate_Package_Body);
7028       PF(Frame_Extension_Millicode);
7029       PF(Stack_Overflow_Check);
7030       PF(Two_Instruction_SP_Increment);
7031       PF(Ada_Region);
7032       PF(cxx_info);
7033       PF(cxx_try_catch);
7034       PF(sched_entry_seq);
7035       PF(Save_SP);
7036       PF(Save_RP);
7037       PF(Save_MRP_in_frame);
7038       PF(extn_ptr_defined);
7039       PF(Cleanup_defined);
7040       PF(MPE_XL_interrupt_marker);
7041       PF(HP_UX_interrupt_marker);
7042       PF(Large_frame);
7043       PF(Pseudo_SP_Set);
7044       PV(Total_frame_size);
7045 #undef PF
7046 #undef PV
7047     }
7048
7049   printf ("\n");
7050
7051   free (aux->funtab);
7052 }
7053
7054 static int
7055 slurp_hppa_unwind_table (FILE * file,
7056                          struct hppa_unw_aux_info * aux,
7057                          Elf_Internal_Shdr * sec)
7058 {
7059   unsigned long size, unw_ent_size, nentries, nrelas, i;
7060   Elf_Internal_Phdr * seg;
7061   struct hppa_unw_table_entry * tep;
7062   Elf_Internal_Shdr * relsec;
7063   Elf_Internal_Rela * rela;
7064   Elf_Internal_Rela * rp;
7065   unsigned char * table;
7066   unsigned char * tp;
7067   Elf_Internal_Sym * sym;
7068   const char * relname;
7069
7070   /* First, find the starting address of the segment that includes
7071      this section.  */
7072
7073   if (elf_header.e_phnum)
7074     {
7075       if (! get_program_headers (file))
7076         return 0;
7077
7078       for (seg = program_headers;
7079            seg < program_headers + elf_header.e_phnum;
7080            ++seg)
7081         {
7082           if (seg->p_type != PT_LOAD)
7083             continue;
7084
7085           if (sec->sh_addr >= seg->p_vaddr
7086               && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7087             {
7088               aux->seg_base = seg->p_vaddr;
7089               break;
7090             }
7091         }
7092     }
7093
7094   /* Second, build the unwind table from the contents of the unwind
7095      section.  */
7096   size = sec->sh_size;
7097   table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
7098                                       _("unwind table"));
7099   if (!table)
7100     return 0;
7101
7102   unw_ent_size = 16;
7103   nentries = size / unw_ent_size;
7104   size = unw_ent_size * nentries;
7105
7106   tep = aux->table = (struct hppa_unw_table_entry *)
7107       xcmalloc (nentries, sizeof (aux->table[0]));
7108
7109   for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
7110     {
7111       unsigned int tmp1, tmp2;
7112
7113       tep->start.section = SHN_UNDEF;
7114       tep->end.section   = SHN_UNDEF;
7115
7116       tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
7117       tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
7118       tmp1 = byte_get ((unsigned char *) tp + 8, 4);
7119       tmp2 = byte_get ((unsigned char *) tp + 12, 4);
7120
7121       tep->start.offset += aux->seg_base;
7122       tep->end.offset   += aux->seg_base;
7123
7124       tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
7125       tep->Millicode = (tmp1 >> 30) & 0x1;
7126       tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
7127       tep->Region_description = (tmp1 >> 27) & 0x3;
7128       tep->reserved1 = (tmp1 >> 26) & 0x1;
7129       tep->Entry_SR = (tmp1 >> 25) & 0x1;
7130       tep->Entry_FR = (tmp1 >> 21) & 0xf;
7131       tep->Entry_GR = (tmp1 >> 16) & 0x1f;
7132       tep->Args_stored = (tmp1 >> 15) & 0x1;
7133       tep->Variable_Frame = (tmp1 >> 14) & 0x1;
7134       tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
7135       tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
7136       tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
7137       tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
7138       tep->Ada_Region = (tmp1 >> 9) & 0x1;
7139       tep->cxx_info = (tmp1 >> 8) & 0x1;
7140       tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
7141       tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
7142       tep->reserved2 = (tmp1 >> 5) & 0x1;
7143       tep->Save_SP = (tmp1 >> 4) & 0x1;
7144       tep->Save_RP = (tmp1 >> 3) & 0x1;
7145       tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
7146       tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
7147       tep->Cleanup_defined = tmp1 & 0x1;
7148
7149       tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
7150       tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
7151       tep->Large_frame = (tmp2 >> 29) & 0x1;
7152       tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
7153       tep->reserved4 = (tmp2 >> 27) & 0x1;
7154       tep->Total_frame_size = tmp2 & 0x7ffffff;
7155     }
7156   free (table);
7157
7158   /* Third, apply any relocations to the unwind table.  */
7159   for (relsec = section_headers;
7160        relsec < section_headers + elf_header.e_shnum;
7161        ++relsec)
7162     {
7163       if (relsec->sh_type != SHT_RELA
7164           || relsec->sh_info >= elf_header.e_shnum
7165           || section_headers + relsec->sh_info != sec)
7166         continue;
7167
7168       if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7169                               & rela, & nrelas))
7170         return 0;
7171
7172       for (rp = rela; rp < rela + nrelas; ++rp)
7173         {
7174           relname = elf_hppa_reloc_type (get_reloc_type (rp->r_info));
7175           sym = aux->symtab + get_reloc_symindex (rp->r_info);
7176
7177           /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64.  */
7178           if (! const_strneq (relname, "R_PARISC_SEGREL"))
7179             {
7180               warn (_("Skipping unexpected relocation type %s\n"), relname);
7181               continue;
7182             }
7183
7184           i = rp->r_offset / unw_ent_size;
7185
7186           switch ((rp->r_offset % unw_ent_size) / eh_addr_size)
7187             {
7188             case 0:
7189               aux->table[i].start.section = sym->st_shndx;
7190               aux->table[i].start.offset  = sym->st_value + rp->r_addend;
7191               break;
7192             case 1:
7193               aux->table[i].end.section   = sym->st_shndx;
7194               aux->table[i].end.offset    = sym->st_value + rp->r_addend;
7195               break;
7196             default:
7197               break;
7198             }
7199         }
7200
7201       free (rela);
7202     }
7203
7204   aux->table_len = nentries;
7205
7206   return 1;
7207 }
7208
7209 static void
7210 hppa_process_unwind (FILE * file)
7211 {
7212   struct hppa_unw_aux_info aux;
7213   Elf_Internal_Shdr * unwsec = NULL;
7214   Elf_Internal_Shdr * strsec;
7215   Elf_Internal_Shdr * sec;
7216   unsigned long i;
7217
7218   if (string_table == NULL)
7219     return;
7220
7221   memset (& aux, 0, sizeof (aux));
7222
7223   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7224     {
7225       if (sec->sh_type == SHT_SYMTAB
7226           && sec->sh_link < elf_header.e_shnum)
7227         {
7228           aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
7229
7230           strsec = section_headers + sec->sh_link;
7231           if (aux.strtab != NULL)
7232             {
7233               error (_("Multiple auxillary string tables encountered\n"));
7234               free (aux.strtab);
7235             }
7236           aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
7237                                           1, strsec->sh_size,
7238                                           _("string table"));
7239           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7240         }
7241       else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
7242         unwsec = sec;
7243     }
7244
7245   if (!unwsec)
7246     printf (_("\nThere are no unwind sections in this file.\n"));
7247
7248   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7249     {
7250       if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
7251         {
7252           printf (_("\nUnwind section '%s' at offset 0x%lx contains %lu entries:\n"),
7253                   printable_section_name (sec),
7254                   (unsigned long) sec->sh_offset,
7255                   (unsigned long) (sec->sh_size / (2 * eh_addr_size + 8)));
7256
7257           slurp_hppa_unwind_table (file, &aux, sec);
7258           if (aux.table_len > 0)
7259             dump_hppa_unwind (&aux);
7260
7261           if (aux.table)
7262             free ((char *) aux.table);
7263           aux.table = NULL;
7264         }
7265     }
7266
7267   if (aux.symtab)
7268     free (aux.symtab);
7269   if (aux.strtab)
7270     free ((char *) aux.strtab);
7271 }
7272
7273 struct arm_section
7274 {
7275   unsigned char *      data;            /* The unwind data.  */
7276   Elf_Internal_Shdr *  sec;             /* The cached unwind section header.  */
7277   Elf_Internal_Rela *  rela;            /* The cached relocations for this section.  */
7278   unsigned long        nrelas;          /* The number of relocations.  */
7279   unsigned int         rel_type;        /* REL or RELA ?  */
7280   Elf_Internal_Rela *  next_rela;       /* Cyclic pointer to the next reloc to process.  */
7281 };
7282
7283 struct arm_unw_aux_info
7284 {
7285   FILE *              file;             /* The file containing the unwind sections.  */
7286   Elf_Internal_Sym *  symtab;           /* The file's symbol table.  */
7287   unsigned long       nsyms;            /* Number of symbols.  */
7288   Elf_Internal_Sym *  funtab;           /* Sorted table of STT_FUNC symbols.  */
7289   unsigned long       nfuns;            /* Number of these symbols.  */
7290   char *              strtab;           /* The file's string table.  */
7291   unsigned long       strtab_size;      /* Size of string table.  */
7292 };
7293
7294 static const char *
7295 arm_print_vma_and_name (struct arm_unw_aux_info *aux,
7296                         bfd_vma fn, struct absaddr addr)
7297 {
7298   const char *procname;
7299   bfd_vma sym_offset;
7300
7301   if (addr.section == SHN_UNDEF)
7302     addr.offset = fn;
7303
7304   find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
7305                            aux->strtab_size, addr, &procname,
7306                            &sym_offset);
7307
7308   print_vma (fn, PREFIX_HEX);
7309
7310   if (procname)
7311     {
7312       fputs (" <", stdout);
7313       fputs (procname, stdout);
7314
7315       if (sym_offset)
7316         printf ("+0x%lx", (unsigned long) sym_offset);
7317       fputc ('>', stdout);
7318     }
7319
7320   return procname;
7321 }
7322
7323 static void
7324 arm_free_section (struct arm_section *arm_sec)
7325 {
7326   if (arm_sec->data != NULL)
7327     free (arm_sec->data);
7328
7329   if (arm_sec->rela != NULL)
7330     free (arm_sec->rela);
7331 }
7332
7333 /* 1) If SEC does not match the one cached in ARM_SEC, then free the current
7334       cached section and install SEC instead.
7335    2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
7336       and return its valued in * WORDP, relocating if necessary.
7337    3) Update the NEXT_RELA field in ARM_SEC and store the section index and
7338       relocation's offset in ADDR.
7339    4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
7340       into the string table of the symbol associated with the reloc.  If no
7341       reloc was applied store -1 there.
7342    5) Return TRUE upon success, FALSE otherwise.  */
7343
7344 static bfd_boolean
7345 get_unwind_section_word (struct arm_unw_aux_info *  aux,
7346                          struct arm_section *       arm_sec,
7347                          Elf_Internal_Shdr *        sec,
7348                          bfd_vma                    word_offset,
7349                          unsigned int *             wordp,
7350                          struct absaddr *           addr,
7351                          bfd_vma *                  sym_name)
7352 {
7353   Elf_Internal_Rela *rp;
7354   Elf_Internal_Sym *sym;
7355   const char * relname;
7356   unsigned int word;
7357   bfd_boolean wrapped;
7358
7359   if (sec == NULL || arm_sec == NULL)
7360     return FALSE;
7361
7362   addr->section = SHN_UNDEF;
7363   addr->offset = 0;
7364
7365   if (sym_name != NULL)
7366     *sym_name = (bfd_vma) -1;
7367
7368   /* If necessary, update the section cache.  */
7369   if (sec != arm_sec->sec)
7370     {
7371       Elf_Internal_Shdr *relsec;
7372
7373       arm_free_section (arm_sec);
7374
7375       arm_sec->sec = sec;
7376       arm_sec->data = get_data (NULL, aux->file, sec->sh_offset, 1,
7377                                 sec->sh_size, _("unwind data"));
7378       arm_sec->rela = NULL;
7379       arm_sec->nrelas = 0;
7380
7381       for (relsec = section_headers;
7382            relsec < section_headers + elf_header.e_shnum;
7383            ++relsec)
7384         {
7385           if (relsec->sh_info >= elf_header.e_shnum
7386               || section_headers + relsec->sh_info != sec
7387               /* PR 15745: Check the section type as well.  */
7388               || (relsec->sh_type != SHT_REL
7389                   && relsec->sh_type != SHT_RELA))
7390             continue;
7391
7392           arm_sec->rel_type = relsec->sh_type;
7393           if (relsec->sh_type == SHT_REL)
7394             {
7395               if (!slurp_rel_relocs (aux->file, relsec->sh_offset,
7396                                      relsec->sh_size,
7397                                      & arm_sec->rela, & arm_sec->nrelas))
7398                 return FALSE;
7399             }
7400           else /* relsec->sh_type == SHT_RELA */
7401             {
7402               if (!slurp_rela_relocs (aux->file, relsec->sh_offset,
7403                                       relsec->sh_size,
7404                                       & arm_sec->rela, & arm_sec->nrelas))
7405                 return FALSE;
7406             }
7407           break;
7408         }
7409
7410       arm_sec->next_rela = arm_sec->rela;
7411     }
7412
7413   /* If there is no unwind data we can do nothing.  */
7414   if (arm_sec->data == NULL)
7415     return FALSE;
7416
7417   /* If the offset is invalid then fail.  */
7418   if (word_offset > sec->sh_size - 4)
7419     return FALSE;
7420
7421   /* Get the word at the required offset.  */
7422   word = byte_get (arm_sec->data + word_offset, 4);
7423
7424   /* PR 17531: file: id:000001,src:001266+003044,op:splice,rep:128.  */
7425   if (arm_sec->rela == NULL)
7426     {
7427       * wordp = word;
7428       return TRUE;
7429     }
7430
7431   /* Look through the relocs to find the one that applies to the provided offset.  */
7432   wrapped = FALSE;
7433   for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
7434     {
7435       bfd_vma prelval, offset;
7436
7437       if (rp->r_offset > word_offset && !wrapped)
7438         {
7439           rp = arm_sec->rela;
7440           wrapped = TRUE;
7441         }
7442       if (rp->r_offset > word_offset)
7443         break;
7444
7445       if (rp->r_offset & 3)
7446         {
7447           warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
7448                 (unsigned long) rp->r_offset);
7449           continue;
7450         }
7451
7452       if (rp->r_offset < word_offset)
7453         continue;
7454
7455       /* PR 17531: file: 027-161405-0.004  */
7456       if (aux->symtab == NULL)
7457         continue;
7458
7459       if (arm_sec->rel_type == SHT_REL)
7460         {
7461           offset = word & 0x7fffffff;
7462           if (offset & 0x40000000)
7463             offset |= ~ (bfd_vma) 0x7fffffff;
7464         }
7465       else if (arm_sec->rel_type == SHT_RELA)
7466         offset = rp->r_addend;
7467       else
7468         {
7469           error (_("Unknown section relocation type %d encountered\n"),
7470                  arm_sec->rel_type);
7471           break;
7472         }
7473
7474       /* PR 17531 file: 027-1241568-0.004.  */
7475       if (ELF32_R_SYM (rp->r_info) >= aux->nsyms)
7476         {
7477           error (_("Bad symbol index in unwind relocation (%lu > %lu)\n"),
7478                  (unsigned long) ELF32_R_SYM (rp->r_info), aux->nsyms);
7479           break;
7480         }
7481
7482       sym = aux->symtab + ELF32_R_SYM (rp->r_info);
7483       offset += sym->st_value;
7484       prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
7485
7486       /* Check that we are processing the expected reloc type.  */
7487       if (elf_header.e_machine == EM_ARM)
7488         {
7489           relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
7490           if (relname == NULL)
7491             {
7492               warn (_("Skipping unknown ARM relocation type: %d\n"),
7493                     (int) ELF32_R_TYPE (rp->r_info));
7494               continue;
7495             }
7496
7497           if (streq (relname, "R_ARM_NONE"))
7498               continue;
7499
7500           if (! streq (relname, "R_ARM_PREL31"))
7501             {
7502               warn (_("Skipping unexpected ARM relocation type %s\n"), relname);
7503               continue;
7504             }
7505         }
7506       else if (elf_header.e_machine == EM_TI_C6000)
7507         {
7508           relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
7509           if (relname == NULL)
7510             {
7511               warn (_("Skipping unknown C6000 relocation type: %d\n"),
7512                     (int) ELF32_R_TYPE (rp->r_info));
7513               continue;
7514             }
7515
7516           if (streq (relname, "R_C6000_NONE"))
7517             continue;
7518
7519           if (! streq (relname, "R_C6000_PREL31"))
7520             {
7521               warn (_("Skipping unexpected C6000 relocation type %s\n"), relname);
7522               continue;
7523             }
7524
7525           prelval >>= 1;
7526         }
7527       else
7528         {
7529           /* This function currently only supports ARM and TI unwinders.  */
7530           warn (_("Only TI and ARM unwinders are currently supported\n"));
7531           break;
7532         }
7533
7534       word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
7535       addr->section = sym->st_shndx;
7536       addr->offset = offset;
7537
7538       if (sym_name)
7539         * sym_name = sym->st_name;
7540       break;
7541     }
7542
7543   *wordp = word;
7544   arm_sec->next_rela = rp;
7545
7546   return TRUE;
7547 }
7548
7549 static const char *tic6x_unwind_regnames[16] =
7550 {
7551   "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
7552   "A14", "A13", "A12", "A11", "A10",
7553   "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
7554 };
7555
7556 static void
7557 decode_tic6x_unwind_regmask (unsigned int mask)
7558 {
7559   int i;
7560
7561   for (i = 12; mask; mask >>= 1, i--)
7562     {
7563       if (mask & 1)
7564         {
7565           fputs (tic6x_unwind_regnames[i], stdout);
7566           if (mask > 1)
7567             fputs (", ", stdout);
7568         }
7569     }
7570 }
7571
7572 #define ADVANCE                                                 \
7573   if (remaining == 0 && more_words)                             \
7574     {                                                           \
7575       data_offset += 4;                                         \
7576       if (! get_unwind_section_word (aux, data_arm_sec, data_sec,       \
7577                                      data_offset, & word, & addr, NULL))        \
7578         return;                                                 \
7579       remaining = 4;                                            \
7580       more_words--;                                             \
7581     }                                                           \
7582
7583 #define GET_OP(OP)                      \
7584   ADVANCE;                              \
7585   if (remaining)                        \
7586     {                                   \
7587       remaining--;                      \
7588       (OP) = word >> 24;                \
7589       word <<= 8;                       \
7590     }                                   \
7591   else                                  \
7592     {                                   \
7593       printf (_("[Truncated opcode]\n"));       \
7594       return;                           \
7595     }                                   \
7596   printf ("0x%02x ", OP)
7597
7598 static void
7599 decode_arm_unwind_bytecode (struct arm_unw_aux_info *  aux,
7600                             unsigned int               word,
7601                             unsigned int               remaining,
7602                             unsigned int               more_words,
7603                             bfd_vma                    data_offset,
7604                             Elf_Internal_Shdr *        data_sec,
7605                             struct arm_section *       data_arm_sec)
7606 {
7607   struct absaddr addr;
7608
7609   /* Decode the unwinding instructions.  */
7610   while (1)
7611     {
7612       unsigned int op, op2;
7613
7614       ADVANCE;
7615       if (remaining == 0)
7616         break;
7617       remaining--;
7618       op = word >> 24;
7619       word <<= 8;
7620
7621       printf ("  0x%02x ", op);
7622
7623       if ((op & 0xc0) == 0x00)
7624         {
7625           int offset = ((op & 0x3f) << 2) + 4;
7626
7627           printf ("     vsp = vsp + %d", offset);
7628         }
7629       else if ((op & 0xc0) == 0x40)
7630         {
7631           int offset = ((op & 0x3f) << 2) + 4;
7632
7633           printf ("     vsp = vsp - %d", offset);
7634         }
7635       else if ((op & 0xf0) == 0x80)
7636         {
7637           GET_OP (op2);
7638           if (op == 0x80 && op2 == 0)
7639             printf (_("Refuse to unwind"));
7640           else
7641             {
7642               unsigned int mask = ((op & 0x0f) << 8) | op2;
7643               int first = 1;
7644               int i;
7645
7646               printf ("pop {");
7647               for (i = 0; i < 12; i++)
7648                 if (mask & (1 << i))
7649                   {
7650                     if (first)
7651                       first = 0;
7652                     else
7653                       printf (", ");
7654                     printf ("r%d", 4 + i);
7655                   }
7656               printf ("}");
7657             }
7658         }
7659       else if ((op & 0xf0) == 0x90)
7660         {
7661           if (op == 0x9d || op == 0x9f)
7662             printf (_("     [Reserved]"));
7663           else
7664             printf ("     vsp = r%d", op & 0x0f);
7665         }
7666       else if ((op & 0xf0) == 0xa0)
7667         {
7668           int end = 4 + (op & 0x07);
7669           int first = 1;
7670           int i;
7671
7672           printf ("     pop {");
7673           for (i = 4; i <= end; i++)
7674             {
7675               if (first)
7676                 first = 0;
7677               else
7678                 printf (", ");
7679               printf ("r%d", i);
7680             }
7681           if (op & 0x08)
7682             {
7683               if (!first)
7684                 printf (", ");
7685               printf ("r14");
7686             }
7687           printf ("}");
7688         }
7689       else if (op == 0xb0)
7690         printf (_("     finish"));
7691       else if (op == 0xb1)
7692         {
7693           GET_OP (op2);
7694           if (op2 == 0 || (op2 & 0xf0) != 0)
7695             printf (_("[Spare]"));
7696           else
7697             {
7698               unsigned int mask = op2 & 0x0f;
7699               int first = 1;
7700               int i;
7701
7702               printf ("pop {");
7703               for (i = 0; i < 12; i++)
7704                 if (mask & (1 << i))
7705                   {
7706                     if (first)
7707                       first = 0;
7708                     else
7709                       printf (", ");
7710                     printf ("r%d", i);
7711                   }
7712               printf ("}");
7713             }
7714         }
7715       else if (op == 0xb2)
7716         {
7717           unsigned char buf[9];
7718           unsigned int i, len;
7719           unsigned long offset;
7720
7721           for (i = 0; i < sizeof (buf); i++)
7722             {
7723               GET_OP (buf[i]);
7724               if ((buf[i] & 0x80) == 0)
7725                 break;
7726             }
7727           if (i == sizeof (buf))
7728             printf (_("corrupt change to vsp"));
7729           else
7730             {
7731               offset = read_uleb128 (buf, &len, buf + i + 1);
7732               assert (len == i + 1);
7733               offset = offset * 4 + 0x204;
7734               printf ("vsp = vsp + %ld", offset);
7735             }
7736         }
7737       else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
7738         {
7739           unsigned int first, last;
7740
7741           GET_OP (op2);
7742           first = op2 >> 4;
7743           last = op2 & 0x0f;
7744           if (op == 0xc8)
7745             first = first + 16;
7746           printf ("pop {D%d", first);
7747           if (last)
7748             printf ("-D%d", first + last);
7749           printf ("}");
7750         }
7751       else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
7752         {
7753           unsigned int count = op & 0x07;
7754
7755           printf ("pop {D8");
7756           if (count)
7757             printf ("-D%d", 8 + count);
7758           printf ("}");
7759         }
7760       else if (op >= 0xc0 && op <= 0xc5)
7761         {
7762           unsigned int count = op & 0x07;
7763
7764           printf ("     pop {wR10");
7765           if (count)
7766             printf ("-wR%d", 10 + count);
7767           printf ("}");
7768         }
7769       else if (op == 0xc6)
7770         {
7771           unsigned int first, last;
7772
7773           GET_OP (op2);
7774           first = op2 >> 4;
7775           last = op2 & 0x0f;
7776           printf ("pop {wR%d", first);
7777           if (last)
7778             printf ("-wR%d", first + last);
7779           printf ("}");
7780         }
7781       else if (op == 0xc7)
7782         {
7783           GET_OP (op2);
7784           if (op2 == 0 || (op2 & 0xf0) != 0)
7785             printf (_("[Spare]"));
7786           else
7787             {
7788               unsigned int mask = op2 & 0x0f;
7789               int first = 1;
7790               int i;
7791
7792               printf ("pop {");
7793               for (i = 0; i < 4; i++)
7794                 if (mask & (1 << i))
7795                   {
7796                     if (first)
7797                       first = 0;
7798                     else
7799                       printf (", ");
7800                     printf ("wCGR%d", i);
7801                   }
7802               printf ("}");
7803             }
7804         }
7805       else
7806         printf (_("     [unsupported opcode]"));
7807       printf ("\n");
7808     }
7809 }
7810
7811 static void
7812 decode_tic6x_unwind_bytecode (struct arm_unw_aux_info *  aux,
7813                               unsigned int               word,
7814                               unsigned int               remaining,
7815                               unsigned int               more_words,
7816                               bfd_vma                    data_offset,
7817                               Elf_Internal_Shdr *        data_sec,
7818                               struct arm_section *       data_arm_sec)
7819 {
7820   struct absaddr addr;
7821
7822   /* Decode the unwinding instructions.  */
7823   while (1)
7824     {
7825       unsigned int op, op2;
7826
7827       ADVANCE;
7828       if (remaining == 0)
7829         break;
7830       remaining--;
7831       op = word >> 24;
7832       word <<= 8;
7833
7834       printf ("  0x%02x ", op);
7835
7836       if ((op & 0xc0) == 0x00)
7837         {
7838           int offset = ((op & 0x3f) << 3) + 8;
7839           printf ("     sp = sp + %d", offset);
7840         }
7841       else if ((op & 0xc0) == 0x80)
7842         {
7843           GET_OP (op2);
7844           if (op == 0x80 && op2 == 0)
7845             printf (_("Refuse to unwind"));
7846           else
7847             {
7848               unsigned int mask = ((op & 0x1f) << 8) | op2;
7849               if (op & 0x20)
7850                 printf ("pop compact {");
7851               else
7852                 printf ("pop {");
7853
7854               decode_tic6x_unwind_regmask (mask);
7855               printf("}");
7856             }
7857         }
7858       else if ((op & 0xf0) == 0xc0)
7859         {
7860           unsigned int reg;
7861           unsigned int nregs;
7862           unsigned int i;
7863           const char *name;
7864           struct
7865           {
7866               unsigned int offset;
7867               unsigned int reg;
7868           } regpos[16];
7869
7870           /* Scan entire instruction first so that GET_OP output is not
7871              interleaved with disassembly.  */
7872           nregs = 0;
7873           for (i = 0; nregs < (op & 0xf); i++)
7874             {
7875               GET_OP (op2);
7876               reg = op2 >> 4;
7877               if (reg != 0xf)
7878                 {
7879                   regpos[nregs].offset = i * 2;
7880                   regpos[nregs].reg = reg;
7881                   nregs++;
7882                 }
7883
7884               reg = op2 & 0xf;
7885               if (reg != 0xf)
7886                 {
7887                   regpos[nregs].offset = i * 2 + 1;
7888                   regpos[nregs].reg = reg;
7889                   nregs++;
7890                 }
7891             }
7892
7893           printf (_("pop frame {"));
7894           reg = nregs - 1;
7895           for (i = i * 2; i > 0; i--)
7896             {
7897               if (regpos[reg].offset == i - 1)
7898                 {
7899                   name = tic6x_unwind_regnames[regpos[reg].reg];
7900                   if (reg > 0)
7901                     reg--;
7902                 }
7903               else
7904                 name = _("[pad]");
7905
7906               fputs (name, stdout);
7907               if (i > 1)
7908                 printf (", ");
7909             }
7910
7911           printf ("}");
7912         }
7913       else if (op == 0xd0)
7914         printf ("     MOV FP, SP");
7915       else if (op == 0xd1)
7916         printf ("     __c6xabi_pop_rts");
7917       else if (op == 0xd2)
7918         {
7919           unsigned char buf[9];
7920           unsigned int i, len;
7921           unsigned long offset;
7922
7923           for (i = 0; i < sizeof (buf); i++)
7924             {
7925               GET_OP (buf[i]);
7926               if ((buf[i] & 0x80) == 0)
7927                 break;
7928             }
7929           /* PR 17531: file: id:000001,src:001906+004739,op:splice,rep:2.  */
7930           if (i == sizeof (buf))
7931             {
7932               printf ("<corrupt sp adjust>\n");
7933               warn (_("Corrupt stack pointer adjustment detected\n"));
7934               return;
7935             }
7936
7937           offset = read_uleb128 (buf, &len, buf + i + 1);
7938           assert (len == i + 1);
7939           offset = offset * 8 + 0x408;
7940           printf (_("sp = sp + %ld"), offset);
7941         }
7942       else if ((op & 0xf0) == 0xe0)
7943         {
7944           if ((op & 0x0f) == 7)
7945             printf ("     RETURN");
7946           else
7947             printf ("     MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
7948         }
7949       else
7950         {
7951           printf (_("     [unsupported opcode]"));
7952         }
7953       putchar ('\n');
7954     }
7955 }
7956
7957 static bfd_vma
7958 arm_expand_prel31 (bfd_vma word, bfd_vma where)
7959 {
7960   bfd_vma offset;
7961
7962   offset = word & 0x7fffffff;
7963   if (offset & 0x40000000)
7964     offset |= ~ (bfd_vma) 0x7fffffff;
7965
7966   if (elf_header.e_machine == EM_TI_C6000)
7967     offset <<= 1;
7968
7969   return offset + where;
7970 }
7971
7972 static void
7973 decode_arm_unwind (struct arm_unw_aux_info *  aux,
7974                    unsigned int               word,
7975                    unsigned int               remaining,
7976                    bfd_vma                    data_offset,
7977                    Elf_Internal_Shdr *        data_sec,
7978                    struct arm_section *       data_arm_sec)
7979 {
7980   int per_index;
7981   unsigned int more_words = 0;
7982   struct absaddr addr;
7983   bfd_vma sym_name = (bfd_vma) -1;
7984
7985   if (remaining == 0)
7986     {
7987       /* Fetch the first word.
7988          Note - when decoding an object file the address extracted
7989          here will always be 0.  So we also pass in the sym_name
7990          parameter so that we can find the symbol associated with
7991          the personality routine.  */
7992       if (! get_unwind_section_word (aux, data_arm_sec, data_sec, data_offset,
7993                                      & word, & addr, & sym_name))
7994         return;
7995
7996       remaining = 4;
7997     }
7998
7999   if ((word & 0x80000000) == 0)
8000     {
8001       /* Expand prel31 for personality routine.  */
8002       bfd_vma fn;
8003       const char *procname;
8004
8005       fn = arm_expand_prel31 (word, data_sec->sh_addr + data_offset);
8006       printf (_("  Personality routine: "));
8007       if (fn == 0
8008           && addr.section == SHN_UNDEF && addr.offset == 0
8009           && sym_name != (bfd_vma) -1 && sym_name < aux->strtab_size)
8010         {
8011           procname = aux->strtab + sym_name;
8012           print_vma (fn, PREFIX_HEX);
8013           if (procname)
8014             {
8015               fputs (" <", stdout);
8016               fputs (procname, stdout);
8017               fputc ('>', stdout);
8018             }
8019         }
8020       else
8021         procname = arm_print_vma_and_name (aux, fn, addr);
8022       fputc ('\n', stdout);
8023
8024       /* The GCC personality routines use the standard compact
8025          encoding, starting with one byte giving the number of
8026          words.  */
8027       if (procname != NULL
8028           && (const_strneq (procname, "__gcc_personality_v0")
8029               || const_strneq (procname, "__gxx_personality_v0")
8030               || const_strneq (procname, "__gcj_personality_v0")
8031               || const_strneq (procname, "__gnu_objc_personality_v0")))
8032         {
8033           remaining = 0;
8034           more_words = 1;
8035           ADVANCE;
8036           if (!remaining)
8037             {
8038               printf (_("  [Truncated data]\n"));
8039               return;
8040             }
8041           more_words = word >> 24;
8042           word <<= 8;
8043           remaining--;
8044           per_index = -1;
8045         }
8046       else
8047         return;
8048     }
8049   else
8050     {
8051       /* ARM EHABI Section 6.3:
8052
8053          An exception-handling table entry for the compact model looks like:
8054
8055            31 30-28 27-24 23-0
8056            -- ----- ----- ----
8057             1   0   index Data for personalityRoutine[index]    */
8058
8059       if (elf_header.e_machine == EM_ARM
8060           && (word & 0x70000000))
8061         warn (_("Corrupt ARM compact model table entry: %x \n"), word);
8062
8063       per_index = (word >> 24) & 0x7f;
8064       printf (_("  Compact model index: %d\n"), per_index);
8065       if (per_index == 0)
8066         {
8067           more_words = 0;
8068           word <<= 8;
8069           remaining--;
8070         }
8071       else if (per_index < 3)
8072         {
8073           more_words = (word >> 16) & 0xff;
8074           word <<= 16;
8075           remaining -= 2;
8076         }
8077     }
8078
8079   switch (elf_header.e_machine)
8080     {
8081     case EM_ARM:
8082       if (per_index < 3)
8083         {
8084           decode_arm_unwind_bytecode (aux, word, remaining, more_words,
8085                                       data_offset, data_sec, data_arm_sec);
8086         }
8087       else
8088         {
8089           warn (_("Unknown ARM compact model index encountered\n"));
8090           printf (_("  [reserved]\n"));
8091         }
8092       break;
8093
8094     case EM_TI_C6000:
8095       if (per_index < 3)
8096         {
8097           decode_tic6x_unwind_bytecode (aux, word, remaining, more_words,
8098                                         data_offset, data_sec, data_arm_sec);
8099         }
8100       else if (per_index < 5)
8101         {
8102           if (((word >> 17) & 0x7f) == 0x7f)
8103             printf (_("  Restore stack from frame pointer\n"));
8104           else
8105             printf (_("  Stack increment %d\n"), (word >> 14) & 0x1fc);
8106           printf (_("  Registers restored: "));
8107           if (per_index == 4)
8108             printf (" (compact) ");
8109           decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
8110           putchar ('\n');
8111           printf (_("  Return register: %s\n"),
8112                   tic6x_unwind_regnames[word & 0xf]);
8113         }
8114       else
8115         printf (_("  [reserved (%d)]\n"), per_index);
8116       break;
8117
8118     default:
8119       error (_("Unsupported architecture type %d encountered when decoding unwind table\n"),
8120              elf_header.e_machine);
8121     }
8122
8123   /* Decode the descriptors.  Not implemented.  */
8124 }
8125
8126 static void
8127 dump_arm_unwind (struct arm_unw_aux_info *aux, Elf_Internal_Shdr *exidx_sec)
8128 {
8129   struct arm_section exidx_arm_sec, extab_arm_sec;
8130   unsigned int i, exidx_len;
8131   unsigned long j, nfuns;
8132
8133   memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
8134   memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
8135   exidx_len = exidx_sec->sh_size / 8;
8136
8137   aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
8138   for (nfuns = 0, j = 0; j < aux->nsyms; j++)
8139     if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
8140       aux->funtab[nfuns++] = aux->symtab[j];
8141   aux->nfuns = nfuns;
8142   qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
8143
8144   for (i = 0; i < exidx_len; i++)
8145     {
8146       unsigned int exidx_fn, exidx_entry;
8147       struct absaddr fn_addr, entry_addr;
8148       bfd_vma fn;
8149
8150       fputc ('\n', stdout);
8151
8152       if (! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
8153                                      8 * i, & exidx_fn, & fn_addr, NULL)
8154           || ! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
8155                                         8 * i + 4, & exidx_entry, & entry_addr, NULL))
8156         {
8157           free (aux->funtab);
8158           arm_free_section (& exidx_arm_sec);
8159           arm_free_section (& extab_arm_sec);
8160           return;
8161         }
8162
8163       /* ARM EHABI, Section 5:
8164          An index table entry consists of 2 words.
8165          The first word contains a prel31 offset to the start of a function, with bit 31 clear.  */
8166       if (exidx_fn & 0x80000000)
8167         warn (_("corrupt index table entry: %x\n"), exidx_fn);
8168
8169       fn = arm_expand_prel31 (exidx_fn, exidx_sec->sh_addr + 8 * i);
8170
8171       arm_print_vma_and_name (aux, fn, fn_addr);
8172       fputs (": ", stdout);
8173
8174       if (exidx_entry == 1)
8175         {
8176           print_vma (exidx_entry, PREFIX_HEX);
8177           fputs (" [cantunwind]\n", stdout);
8178         }
8179       else if (exidx_entry & 0x80000000)
8180         {
8181           print_vma (exidx_entry, PREFIX_HEX);
8182           fputc ('\n', stdout);
8183           decode_arm_unwind (aux, exidx_entry, 4, 0, NULL, NULL);
8184         }
8185       else
8186         {
8187           bfd_vma table, table_offset = 0;
8188           Elf_Internal_Shdr *table_sec;
8189
8190           fputs ("@", stdout);
8191           table = arm_expand_prel31 (exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
8192           print_vma (table, PREFIX_HEX);
8193           printf ("\n");
8194
8195           /* Locate the matching .ARM.extab.  */
8196           if (entry_addr.section != SHN_UNDEF
8197               && entry_addr.section < elf_header.e_shnum)
8198             {
8199               table_sec = section_headers + entry_addr.section;
8200               table_offset = entry_addr.offset;
8201             }
8202           else
8203             {
8204               table_sec = find_section_by_address (table);
8205               if (table_sec != NULL)
8206                 table_offset = table - table_sec->sh_addr;
8207             }
8208           if (table_sec == NULL)
8209             {
8210               warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
8211                     (unsigned long) table);
8212               continue;
8213             }
8214           decode_arm_unwind (aux, 0, 0, table_offset, table_sec,
8215                              &extab_arm_sec);
8216         }
8217     }
8218
8219   printf ("\n");
8220
8221   free (aux->funtab);
8222   arm_free_section (&exidx_arm_sec);
8223   arm_free_section (&extab_arm_sec);
8224 }
8225
8226 /* Used for both ARM and C6X unwinding tables.  */
8227
8228 static void
8229 arm_process_unwind (FILE *file)
8230 {
8231   struct arm_unw_aux_info aux;
8232   Elf_Internal_Shdr *unwsec = NULL;
8233   Elf_Internal_Shdr *strsec;
8234   Elf_Internal_Shdr *sec;
8235   unsigned long i;
8236   unsigned int sec_type;
8237
8238   switch (elf_header.e_machine)
8239     {
8240     case EM_ARM:
8241       sec_type = SHT_ARM_EXIDX;
8242       break;
8243
8244     case EM_TI_C6000:
8245       sec_type = SHT_C6000_UNWIND;
8246       break;
8247
8248     default:
8249       error (_("Unsupported architecture type %d encountered when processing unwind table\n"),
8250              elf_header.e_machine);
8251       return;
8252     }
8253
8254   if (string_table == NULL)
8255     return;
8256
8257   memset (& aux, 0, sizeof (aux));
8258   aux.file = file;
8259
8260   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
8261     {
8262       if (sec->sh_type == SHT_SYMTAB && sec->sh_link < elf_header.e_shnum)
8263         {
8264           aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
8265
8266           strsec = section_headers + sec->sh_link;
8267
8268           /* PR binutils/17531 file: 011-12666-0.004.  */
8269           if (aux.strtab != NULL)
8270             {
8271               error (_("Multiple string tables found in file.\n"));
8272               free (aux.strtab);
8273             }
8274           aux.strtab = get_data (NULL, file, strsec->sh_offset,
8275                                  1, strsec->sh_size, _("string table"));
8276           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
8277         }
8278       else if (sec->sh_type == sec_type)
8279         unwsec = sec;
8280     }
8281
8282   if (unwsec == NULL)
8283     printf (_("\nThere are no unwind sections in this file.\n"));
8284   else
8285     for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
8286       {
8287         if (sec->sh_type == sec_type)
8288           {
8289             printf (_("\nUnwind table index '%s' at offset 0x%lx contains %lu entries:\n"),
8290                     printable_section_name (sec),
8291                     (unsigned long) sec->sh_offset,
8292                     (unsigned long) (sec->sh_size / (2 * eh_addr_size)));
8293
8294             dump_arm_unwind (&aux, sec);
8295           }
8296       }
8297
8298   if (aux.symtab)
8299     free (aux.symtab);
8300   if (aux.strtab)
8301     free ((char *) aux.strtab);
8302 }
8303
8304 static void
8305 process_unwind (FILE * file)
8306 {
8307   struct unwind_handler
8308   {
8309     int machtype;
8310     void (* handler)(FILE *);
8311   } handlers[] =
8312   {
8313     { EM_ARM, arm_process_unwind },
8314     { EM_IA_64, ia64_process_unwind },
8315     { EM_PARISC, hppa_process_unwind },
8316     { EM_TI_C6000, arm_process_unwind },
8317     { 0, 0 }
8318   };
8319   int i;
8320
8321   if (!do_unwind)
8322     return;
8323
8324   for (i = 0; handlers[i].handler != NULL; i++)
8325     if (elf_header.e_machine == handlers[i].machtype)
8326       {
8327         handlers[i].handler (file);
8328         return;
8329       }
8330
8331   printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
8332           get_machine_name (elf_header.e_machine));
8333 }
8334
8335 static void
8336 dynamic_section_mips_val (Elf_Internal_Dyn * entry)
8337 {
8338   switch (entry->d_tag)
8339     {
8340     case DT_MIPS_FLAGS:
8341       if (entry->d_un.d_val == 0)
8342         printf (_("NONE"));
8343       else
8344         {
8345           static const char * opts[] =
8346           {
8347             "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
8348             "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
8349             "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
8350             "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
8351             "RLD_ORDER_SAFE"
8352           };
8353           unsigned int cnt;
8354           int first = 1;
8355
8356           for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
8357             if (entry->d_un.d_val & (1 << cnt))
8358               {
8359                 printf ("%s%s", first ? "" : " ", opts[cnt]);
8360                 first = 0;
8361               }
8362         }
8363       break;
8364
8365     case DT_MIPS_IVERSION:
8366       if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
8367         printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry->d_un.d_val));
8368       else
8369         {
8370           char buf[40];
8371           sprintf_vma (buf, entry->d_un.d_ptr);
8372           /* Note: coded this way so that there is a single string for translation.  */
8373           printf (_("<corrupt: %s>"), buf);
8374         }
8375       break;
8376
8377     case DT_MIPS_TIME_STAMP:
8378       {
8379         char timebuf[20];
8380         struct tm * tmp;
8381         time_t atime = entry->d_un.d_val;
8382
8383         tmp = gmtime (&atime);
8384         /* PR 17531: file: 6accc532.  */
8385         if (tmp == NULL)
8386           snprintf (timebuf, sizeof (timebuf), _("<corrupt>"));
8387         else
8388           snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
8389                     tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
8390                     tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
8391         printf (_("Time Stamp: %s"), timebuf);
8392       }
8393       break;
8394
8395     case DT_MIPS_RLD_VERSION:
8396     case DT_MIPS_LOCAL_GOTNO:
8397     case DT_MIPS_CONFLICTNO:
8398     case DT_MIPS_LIBLISTNO:
8399     case DT_MIPS_SYMTABNO:
8400     case DT_MIPS_UNREFEXTNO:
8401     case DT_MIPS_HIPAGENO:
8402     case DT_MIPS_DELTA_CLASS_NO:
8403     case DT_MIPS_DELTA_INSTANCE_NO:
8404     case DT_MIPS_DELTA_RELOC_NO:
8405     case DT_MIPS_DELTA_SYM_NO:
8406     case DT_MIPS_DELTA_CLASSSYM_NO:
8407     case DT_MIPS_COMPACT_SIZE:
8408       print_vma (entry->d_un.d_ptr, DEC);
8409       break;
8410
8411     default:
8412       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8413     }
8414     putchar ('\n');
8415 }
8416
8417 static void
8418 dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
8419 {
8420   switch (entry->d_tag)
8421     {
8422     case DT_HP_DLD_FLAGS:
8423       {
8424         static struct
8425         {
8426           long int bit;
8427           const char * str;
8428         }
8429         flags[] =
8430         {
8431           { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
8432           { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
8433           { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
8434           { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
8435           { DT_HP_BIND_NOW, "HP_BIND_NOW" },
8436           { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
8437           { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
8438           { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
8439           { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
8440           { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
8441           { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
8442           { DT_HP_GST, "HP_GST" },
8443           { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
8444           { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
8445           { DT_HP_NODELETE, "HP_NODELETE" },
8446           { DT_HP_GROUP, "HP_GROUP" },
8447           { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
8448         };
8449         int first = 1;
8450         size_t cnt;
8451         bfd_vma val = entry->d_un.d_val;
8452
8453         for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
8454           if (val & flags[cnt].bit)
8455             {
8456               if (! first)
8457                 putchar (' ');
8458               fputs (flags[cnt].str, stdout);
8459               first = 0;
8460               val ^= flags[cnt].bit;
8461             }
8462
8463         if (val != 0 || first)
8464           {
8465             if (! first)
8466               putchar (' ');
8467             print_vma (val, HEX);
8468           }
8469       }
8470       break;
8471
8472     default:
8473       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8474       break;
8475     }
8476   putchar ('\n');
8477 }
8478
8479 #ifdef BFD64
8480
8481 /* VMS vs Unix time offset and factor.  */
8482
8483 #define VMS_EPOCH_OFFSET 35067168000000000LL
8484 #define VMS_GRANULARITY_FACTOR 10000000
8485
8486 /* Display a VMS time in a human readable format.  */
8487
8488 static void
8489 print_vms_time (bfd_int64_t vmstime)
8490 {
8491   struct tm *tm;
8492   time_t unxtime;
8493
8494   unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
8495   tm = gmtime (&unxtime);
8496   printf ("%04u-%02u-%02uT%02u:%02u:%02u",
8497           tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
8498           tm->tm_hour, tm->tm_min, tm->tm_sec);
8499 }
8500 #endif /* BFD64 */
8501
8502 static void
8503 dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
8504 {
8505   switch (entry->d_tag)
8506     {
8507     case DT_IA_64_PLT_RESERVE:
8508       /* First 3 slots reserved.  */
8509       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8510       printf (" -- ");
8511       print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
8512       break;
8513
8514     case DT_IA_64_VMS_LINKTIME:
8515 #ifdef BFD64
8516       print_vms_time (entry->d_un.d_val);
8517 #endif
8518       break;
8519
8520     case DT_IA_64_VMS_LNKFLAGS:
8521       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8522       if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
8523         printf (" CALL_DEBUG");
8524       if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
8525         printf (" NOP0BUFS");
8526       if (entry->d_un.d_val & VMS_LF_P0IMAGE)
8527         printf (" P0IMAGE");
8528       if (entry->d_un.d_val & VMS_LF_MKTHREADS)
8529         printf (" MKTHREADS");
8530       if (entry->d_un.d_val & VMS_LF_UPCALLS)
8531         printf (" UPCALLS");
8532       if (entry->d_un.d_val & VMS_LF_IMGSTA)
8533         printf (" IMGSTA");
8534       if (entry->d_un.d_val & VMS_LF_INITIALIZE)
8535         printf (" INITIALIZE");
8536       if (entry->d_un.d_val & VMS_LF_MAIN)
8537         printf (" MAIN");
8538       if (entry->d_un.d_val & VMS_LF_EXE_INIT)
8539         printf (" EXE_INIT");
8540       if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
8541         printf (" TBK_IN_IMG");
8542       if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
8543         printf (" DBG_IN_IMG");
8544       if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
8545         printf (" TBK_IN_DSF");
8546       if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
8547         printf (" DBG_IN_DSF");
8548       if (entry->d_un.d_val & VMS_LF_SIGNATURES)
8549         printf (" SIGNATURES");
8550       if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
8551         printf (" REL_SEG_OFF");
8552       break;
8553
8554     default:
8555       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8556       break;
8557     }
8558   putchar ('\n');
8559 }
8560
8561 static int
8562 get_32bit_dynamic_section (FILE * file)
8563 {
8564   Elf32_External_Dyn * edyn;
8565   Elf32_External_Dyn * ext;
8566   Elf_Internal_Dyn * entry;
8567
8568   edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
8569                                           dynamic_size, _("dynamic section"));
8570   if (!edyn)
8571     return 0;
8572
8573   /* SGI's ELF has more than one section in the DYNAMIC segment, and we
8574      might not have the luxury of section headers.  Look for the DT_NULL
8575      terminator to determine the number of entries.  */
8576   for (ext = edyn, dynamic_nent = 0;
8577        (char *) ext < (char *) edyn + dynamic_size - sizeof (* entry);
8578        ext++)
8579     {
8580       dynamic_nent++;
8581       if (BYTE_GET (ext->d_tag) == DT_NULL)
8582         break;
8583     }
8584
8585   dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
8586                                                   sizeof (* entry));
8587   if (dynamic_section == NULL)
8588     {
8589       error (_("Out of memory allocating space for %lu dynamic entries\n"),
8590              (unsigned long) dynamic_nent);
8591       free (edyn);
8592       return 0;
8593     }
8594
8595   for (ext = edyn, entry = dynamic_section;
8596        entry < dynamic_section + dynamic_nent;
8597        ext++, entry++)
8598     {
8599       entry->d_tag      = BYTE_GET (ext->d_tag);
8600       entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
8601     }
8602
8603   free (edyn);
8604
8605   return 1;
8606 }
8607
8608 static int
8609 get_64bit_dynamic_section (FILE * file)
8610 {
8611   Elf64_External_Dyn * edyn;
8612   Elf64_External_Dyn * ext;
8613   Elf_Internal_Dyn * entry;
8614
8615   /* Read in the data.  */
8616   edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
8617                                           dynamic_size, _("dynamic section"));
8618   if (!edyn)
8619     return 0;
8620
8621   /* SGI's ELF has more than one section in the DYNAMIC segment, and we
8622      might not have the luxury of section headers.  Look for the DT_NULL
8623      terminator to determine the number of entries.  */
8624   for (ext = edyn, dynamic_nent = 0;
8625        /* PR 17533 file: 033-67080-0.004 - do not read off the end of the buffer.  */
8626        (char *) ext < ((char *) edyn) + dynamic_size - sizeof (* ext);
8627        ext++)
8628     {
8629       dynamic_nent++;
8630       if (BYTE_GET (ext->d_tag) == DT_NULL)
8631         break;
8632     }
8633
8634   dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
8635                                                   sizeof (* entry));
8636   if (dynamic_section == NULL)
8637     {
8638       error (_("Out of memory allocating space for %lu dynamic entries\n"),
8639              (unsigned long) dynamic_nent);
8640       free (edyn);
8641       return 0;
8642     }
8643
8644   /* Convert from external to internal formats.  */
8645   for (ext = edyn, entry = dynamic_section;
8646        entry < dynamic_section + dynamic_nent;
8647        ext++, entry++)
8648     {
8649       entry->d_tag      = BYTE_GET (ext->d_tag);
8650       entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
8651     }
8652
8653   free (edyn);
8654
8655   return 1;
8656 }
8657
8658 static void
8659 print_dynamic_flags (bfd_vma flags)
8660 {
8661   int first = 1;
8662
8663   while (flags)
8664     {
8665       bfd_vma flag;
8666
8667       flag = flags & - flags;
8668       flags &= ~ flag;
8669
8670       if (first)
8671         first = 0;
8672       else
8673         putc (' ', stdout);
8674
8675       switch (flag)
8676         {
8677         case DF_ORIGIN:         fputs ("ORIGIN", stdout); break;
8678         case DF_SYMBOLIC:       fputs ("SYMBOLIC", stdout); break;
8679         case DF_TEXTREL:        fputs ("TEXTREL", stdout); break;
8680         case DF_BIND_NOW:       fputs ("BIND_NOW", stdout); break;
8681         case DF_STATIC_TLS:     fputs ("STATIC_TLS", stdout); break;
8682         default:                fputs (_("unknown"), stdout); break;
8683         }
8684     }
8685   puts ("");
8686 }
8687
8688 /* Parse and display the contents of the dynamic section.  */
8689
8690 static int
8691 process_dynamic_section (FILE * file)
8692 {
8693   Elf_Internal_Dyn * entry;
8694
8695   if (dynamic_size == 0)
8696     {
8697       if (do_dynamic)
8698         printf (_("\nThere is no dynamic section in this file.\n"));
8699
8700       return 1;
8701     }
8702
8703   if (is_32bit_elf)
8704     {
8705       if (! get_32bit_dynamic_section (file))
8706         return 0;
8707     }
8708   else if (! get_64bit_dynamic_section (file))
8709     return 0;
8710
8711   /* Find the appropriate symbol table.  */
8712   if (dynamic_symbols == NULL)
8713     {
8714       for (entry = dynamic_section;
8715            entry < dynamic_section + dynamic_nent;
8716            ++entry)
8717         {
8718           Elf_Internal_Shdr section;
8719
8720           if (entry->d_tag != DT_SYMTAB)
8721             continue;
8722
8723           dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
8724
8725           /* Since we do not know how big the symbol table is,
8726              we default to reading in the entire file (!) and
8727              processing that.  This is overkill, I know, but it
8728              should work.  */
8729           section.sh_offset = offset_from_vma (file, entry->d_un.d_val, 0);
8730
8731           if (archive_file_offset != 0)
8732             section.sh_size = archive_file_size - section.sh_offset;
8733           else
8734             {
8735               if (fseek (file, 0, SEEK_END))
8736                 error (_("Unable to seek to end of file!\n"));
8737
8738               section.sh_size = ftell (file) - section.sh_offset;
8739             }
8740
8741           if (is_32bit_elf)
8742             section.sh_entsize = sizeof (Elf32_External_Sym);
8743           else
8744             section.sh_entsize = sizeof (Elf64_External_Sym);
8745           section.sh_name = string_table_length;
8746
8747           dynamic_symbols = GET_ELF_SYMBOLS (file, &section, & num_dynamic_syms);
8748           if (num_dynamic_syms < 1)
8749             {
8750               error (_("Unable to determine the number of symbols to load\n"));
8751               continue;
8752             }
8753         }
8754     }
8755
8756   /* Similarly find a string table.  */
8757   if (dynamic_strings == NULL)
8758     {
8759       for (entry = dynamic_section;
8760            entry < dynamic_section + dynamic_nent;
8761            ++entry)
8762         {
8763           unsigned long offset;
8764           long str_tab_len;
8765
8766           if (entry->d_tag != DT_STRTAB)
8767             continue;
8768
8769           dynamic_info[DT_STRTAB] = entry->d_un.d_val;
8770
8771           /* Since we do not know how big the string table is,
8772              we default to reading in the entire file (!) and
8773              processing that.  This is overkill, I know, but it
8774              should work.  */
8775
8776           offset = offset_from_vma (file, entry->d_un.d_val, 0);
8777
8778           if (archive_file_offset != 0)
8779             str_tab_len = archive_file_size - offset;
8780           else
8781             {
8782               if (fseek (file, 0, SEEK_END))
8783                 error (_("Unable to seek to end of file\n"));
8784               str_tab_len = ftell (file) - offset;
8785             }
8786
8787           if (str_tab_len < 1)
8788             {
8789               error
8790                 (_("Unable to determine the length of the dynamic string table\n"));
8791               continue;
8792             }
8793
8794           dynamic_strings = (char *) get_data (NULL, file, offset, 1,
8795                                                str_tab_len,
8796                                                _("dynamic string table"));
8797           dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
8798           break;
8799         }
8800     }
8801
8802   /* And find the syminfo section if available.  */
8803   if (dynamic_syminfo == NULL)
8804     {
8805       unsigned long syminsz = 0;
8806
8807       for (entry = dynamic_section;
8808            entry < dynamic_section + dynamic_nent;
8809            ++entry)
8810         {
8811           if (entry->d_tag == DT_SYMINENT)
8812             {
8813               /* Note: these braces are necessary to avoid a syntax
8814                  error from the SunOS4 C compiler.  */
8815               /* PR binutils/17531: A corrupt file can trigger this test.
8816                  So do not use an assert, instead generate an error message.  */
8817               if (sizeof (Elf_External_Syminfo) != entry->d_un.d_val)
8818                 error (_("Bad value (%d) for SYMINENT entry\n"),
8819                        (int) entry->d_un.d_val);
8820             }
8821           else if (entry->d_tag == DT_SYMINSZ)
8822             syminsz = entry->d_un.d_val;
8823           else if (entry->d_tag == DT_SYMINFO)
8824             dynamic_syminfo_offset = offset_from_vma (file, entry->d_un.d_val,
8825                                                       syminsz);
8826         }
8827
8828       if (dynamic_syminfo_offset != 0 && syminsz != 0)
8829         {
8830           Elf_External_Syminfo * extsyminfo;
8831           Elf_External_Syminfo * extsym;
8832           Elf_Internal_Syminfo * syminfo;
8833
8834           /* There is a syminfo section.  Read the data.  */
8835           extsyminfo = (Elf_External_Syminfo *)
8836               get_data (NULL, file, dynamic_syminfo_offset, 1, syminsz,
8837                         _("symbol information"));
8838           if (!extsyminfo)
8839             return 0;
8840
8841           dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
8842           if (dynamic_syminfo == NULL)
8843             {
8844               error (_("Out of memory allocating %lu byte for dynamic symbol info\n"),
8845                      (unsigned long) syminsz);
8846               return 0;
8847             }
8848
8849           dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
8850           for (syminfo = dynamic_syminfo, extsym = extsyminfo;
8851                syminfo < dynamic_syminfo + dynamic_syminfo_nent;
8852                ++syminfo, ++extsym)
8853             {
8854               syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
8855               syminfo->si_flags = BYTE_GET (extsym->si_flags);
8856             }
8857
8858           free (extsyminfo);
8859         }
8860     }
8861
8862   if (do_dynamic && dynamic_addr)
8863     printf (_("\nDynamic section at offset 0x%lx contains %lu entries:\n"),
8864             dynamic_addr, (unsigned long) dynamic_nent);
8865   if (do_dynamic)
8866     printf (_("  Tag        Type                         Name/Value\n"));
8867
8868   for (entry = dynamic_section;
8869        entry < dynamic_section + dynamic_nent;
8870        entry++)
8871     {
8872       if (do_dynamic)
8873         {
8874           const char * dtype;
8875
8876           putchar (' ');
8877           print_vma (entry->d_tag, FULL_HEX);
8878           dtype = get_dynamic_type (entry->d_tag);
8879           printf (" (%s)%*s", dtype,
8880                   ((is_32bit_elf ? 27 : 19)
8881                    - (int) strlen (dtype)),
8882                   " ");
8883         }
8884
8885       switch (entry->d_tag)
8886         {
8887         case DT_FLAGS:
8888           if (do_dynamic)
8889             print_dynamic_flags (entry->d_un.d_val);
8890           break;
8891
8892         case DT_AUXILIARY:
8893         case DT_FILTER:
8894         case DT_CONFIG:
8895         case DT_DEPAUDIT:
8896         case DT_AUDIT:
8897           if (do_dynamic)
8898             {
8899               switch (entry->d_tag)
8900                 {
8901                 case DT_AUXILIARY:
8902                   printf (_("Auxiliary library"));
8903                   break;
8904
8905                 case DT_FILTER:
8906                   printf (_("Filter library"));
8907                   break;
8908
8909                 case DT_CONFIG:
8910                   printf (_("Configuration file"));
8911                   break;
8912
8913                 case DT_DEPAUDIT:
8914                   printf (_("Dependency audit library"));
8915                   break;
8916
8917                 case DT_AUDIT:
8918                   printf (_("Audit library"));
8919                   break;
8920                 }
8921
8922               if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
8923                 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
8924               else
8925                 {
8926                   printf (": ");
8927                   print_vma (entry->d_un.d_val, PREFIX_HEX);
8928                   putchar ('\n');
8929                 }
8930             }
8931           break;
8932
8933         case DT_FEATURE:
8934           if (do_dynamic)
8935             {
8936               printf (_("Flags:"));
8937
8938               if (entry->d_un.d_val == 0)
8939                 printf (_(" None\n"));
8940               else
8941                 {
8942                   unsigned long int val = entry->d_un.d_val;
8943
8944                   if (val & DTF_1_PARINIT)
8945                     {
8946                       printf (" PARINIT");
8947                       val ^= DTF_1_PARINIT;
8948                     }
8949                   if (val & DTF_1_CONFEXP)
8950                     {
8951                       printf (" CONFEXP");
8952                       val ^= DTF_1_CONFEXP;
8953                     }
8954                   if (val != 0)
8955                     printf (" %lx", val);
8956                   puts ("");
8957                 }
8958             }
8959           break;
8960
8961         case DT_POSFLAG_1:
8962           if (do_dynamic)
8963             {
8964               printf (_("Flags:"));
8965
8966               if (entry->d_un.d_val == 0)
8967                 printf (_(" None\n"));
8968               else
8969                 {
8970                   unsigned long int val = entry->d_un.d_val;
8971
8972                   if (val & DF_P1_LAZYLOAD)
8973                     {
8974                       printf (" LAZYLOAD");
8975                       val ^= DF_P1_LAZYLOAD;
8976                     }
8977                   if (val & DF_P1_GROUPPERM)
8978                     {
8979                       printf (" GROUPPERM");
8980                       val ^= DF_P1_GROUPPERM;
8981                     }
8982                   if (val != 0)
8983                     printf (" %lx", val);
8984                   puts ("");
8985                 }
8986             }
8987           break;
8988
8989         case DT_FLAGS_1:
8990           if (do_dynamic)
8991             {
8992               printf (_("Flags:"));
8993               if (entry->d_un.d_val == 0)
8994                 printf (_(" None\n"));
8995               else
8996                 {
8997                   unsigned long int val = entry->d_un.d_val;
8998
8999                   if (val & DF_1_NOW)
9000                     {
9001                       printf (" NOW");
9002                       val ^= DF_1_NOW;
9003                     }
9004                   if (val & DF_1_GLOBAL)
9005                     {
9006                       printf (" GLOBAL");
9007                       val ^= DF_1_GLOBAL;
9008                     }
9009                   if (val & DF_1_GROUP)
9010                     {
9011                       printf (" GROUP");
9012                       val ^= DF_1_GROUP;
9013                     }
9014                   if (val & DF_1_NODELETE)
9015                     {
9016                       printf (" NODELETE");
9017                       val ^= DF_1_NODELETE;
9018                     }
9019                   if (val & DF_1_LOADFLTR)
9020                     {
9021                       printf (" LOADFLTR");
9022                       val ^= DF_1_LOADFLTR;
9023                     }
9024                   if (val & DF_1_INITFIRST)
9025                     {
9026                       printf (" INITFIRST");
9027                       val ^= DF_1_INITFIRST;
9028                     }
9029                   if (val & DF_1_NOOPEN)
9030                     {
9031                       printf (" NOOPEN");
9032                       val ^= DF_1_NOOPEN;
9033                     }
9034                   if (val & DF_1_ORIGIN)
9035                     {
9036                       printf (" ORIGIN");
9037                       val ^= DF_1_ORIGIN;
9038                     }
9039                   if (val & DF_1_DIRECT)
9040                     {
9041                       printf (" DIRECT");
9042                       val ^= DF_1_DIRECT;
9043                     }
9044                   if (val & DF_1_TRANS)
9045                     {
9046                       printf (" TRANS");
9047                       val ^= DF_1_TRANS;
9048                     }
9049                   if (val & DF_1_INTERPOSE)
9050                     {
9051                       printf (" INTERPOSE");
9052                       val ^= DF_1_INTERPOSE;
9053                     }
9054                   if (val & DF_1_NODEFLIB)
9055                     {
9056                       printf (" NODEFLIB");
9057                       val ^= DF_1_NODEFLIB;
9058                     }
9059                   if (val & DF_1_NODUMP)
9060                     {
9061                       printf (" NODUMP");
9062                       val ^= DF_1_NODUMP;
9063                     }
9064                   if (val & DF_1_CONFALT)
9065                     {
9066                       printf (" CONFALT");
9067                       val ^= DF_1_CONFALT;
9068                     }
9069                   if (val & DF_1_ENDFILTEE)
9070                     {
9071                       printf (" ENDFILTEE");
9072                       val ^= DF_1_ENDFILTEE;
9073                     }
9074                   if (val & DF_1_DISPRELDNE)
9075                     {
9076                       printf (" DISPRELDNE");
9077                       val ^= DF_1_DISPRELDNE;
9078                     }
9079                   if (val & DF_1_DISPRELPND)
9080                     {
9081                       printf (" DISPRELPND");
9082                       val ^= DF_1_DISPRELPND;
9083                     }
9084                   if (val & DF_1_NODIRECT)
9085                     {
9086                       printf (" NODIRECT");
9087                       val ^= DF_1_NODIRECT;
9088                     }
9089                   if (val & DF_1_IGNMULDEF)
9090                     {
9091                       printf (" IGNMULDEF");
9092                       val ^= DF_1_IGNMULDEF;
9093                     }
9094                   if (val & DF_1_NOKSYMS)
9095                     {
9096                       printf (" NOKSYMS");
9097                       val ^= DF_1_NOKSYMS;
9098                     }
9099                   if (val & DF_1_NOHDR)
9100                     {
9101                       printf (" NOHDR");
9102                       val ^= DF_1_NOHDR;
9103                     }
9104                   if (val & DF_1_EDITED)
9105                     {
9106                       printf (" EDITED");
9107                       val ^= DF_1_EDITED;
9108                     }
9109                   if (val & DF_1_NORELOC)
9110                     {
9111                       printf (" NORELOC");
9112                       val ^= DF_1_NORELOC;
9113                     }
9114                   if (val & DF_1_SYMINTPOSE)
9115                     {
9116                       printf (" SYMINTPOSE");
9117                       val ^= DF_1_SYMINTPOSE;
9118                     }
9119                   if (val & DF_1_GLOBAUDIT)
9120                     {
9121                       printf (" GLOBAUDIT");
9122                       val ^= DF_1_GLOBAUDIT;
9123                     }
9124                   if (val & DF_1_SINGLETON)
9125                     {
9126                       printf (" SINGLETON");
9127                       val ^= DF_1_SINGLETON;
9128                     }
9129                   if (val != 0)
9130                     printf (" %lx", val);
9131                   puts ("");
9132                 }
9133             }
9134           break;
9135
9136         case DT_PLTREL:
9137           dynamic_info[entry->d_tag] = entry->d_un.d_val;
9138           if (do_dynamic)
9139             puts (get_dynamic_type (entry->d_un.d_val));
9140           break;
9141
9142         case DT_NULL    :
9143         case DT_NEEDED  :
9144         case DT_PLTGOT  :
9145         case DT_HASH    :
9146         case DT_STRTAB  :
9147         case DT_SYMTAB  :
9148         case DT_RELA    :
9149         case DT_INIT    :
9150         case DT_FINI    :
9151         case DT_SONAME  :
9152         case DT_RPATH   :
9153         case DT_SYMBOLIC:
9154         case DT_REL     :
9155         case DT_DEBUG   :
9156         case DT_TEXTREL :
9157         case DT_JMPREL  :
9158         case DT_RUNPATH :
9159           dynamic_info[entry->d_tag] = entry->d_un.d_val;
9160
9161           if (do_dynamic)
9162             {
9163               char * name;
9164
9165               if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9166                 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
9167               else
9168                 name = NULL;
9169
9170               if (name)
9171                 {
9172                   switch (entry->d_tag)
9173                     {
9174                     case DT_NEEDED:
9175                       printf (_("Shared library: [%s]"), name);
9176
9177                       if (streq (name, program_interpreter))
9178                         printf (_(" program interpreter"));
9179                       break;
9180
9181                     case DT_SONAME:
9182                       printf (_("Library soname: [%s]"), name);
9183                       break;
9184
9185                     case DT_RPATH:
9186                       printf (_("Library rpath: [%s]"), name);
9187                       break;
9188
9189                     case DT_RUNPATH:
9190                       printf (_("Library runpath: [%s]"), name);
9191                       break;
9192
9193                     default:
9194                       print_vma (entry->d_un.d_val, PREFIX_HEX);
9195                       break;
9196                     }
9197                 }
9198               else
9199                 print_vma (entry->d_un.d_val, PREFIX_HEX);
9200
9201               putchar ('\n');
9202             }
9203           break;
9204
9205         case DT_PLTRELSZ:
9206         case DT_RELASZ  :
9207         case DT_STRSZ   :
9208         case DT_RELSZ   :
9209         case DT_RELAENT :
9210         case DT_SYMENT  :
9211         case DT_RELENT  :
9212           dynamic_info[entry->d_tag] = entry->d_un.d_val;
9213         case DT_PLTPADSZ:
9214         case DT_MOVEENT :
9215         case DT_MOVESZ  :
9216         case DT_INIT_ARRAYSZ:
9217         case DT_FINI_ARRAYSZ:
9218         case DT_GNU_CONFLICTSZ:
9219         case DT_GNU_LIBLISTSZ:
9220           if (do_dynamic)
9221             {
9222               print_vma (entry->d_un.d_val, UNSIGNED);
9223               printf (_(" (bytes)\n"));
9224             }
9225           break;
9226
9227         case DT_VERDEFNUM:
9228         case DT_VERNEEDNUM:
9229         case DT_RELACOUNT:
9230         case DT_RELCOUNT:
9231           if (do_dynamic)
9232             {
9233               print_vma (entry->d_un.d_val, UNSIGNED);
9234               putchar ('\n');
9235             }
9236           break;
9237
9238         case DT_SYMINSZ:
9239         case DT_SYMINENT:
9240         case DT_SYMINFO:
9241         case DT_USED:
9242         case DT_INIT_ARRAY:
9243         case DT_FINI_ARRAY:
9244           if (do_dynamic)
9245             {
9246               if (entry->d_tag == DT_USED
9247                   && VALID_DYNAMIC_NAME (entry->d_un.d_val))
9248                 {
9249                   char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
9250
9251                   if (*name)
9252                     {
9253                       printf (_("Not needed object: [%s]\n"), name);
9254                       break;
9255                     }
9256                 }
9257
9258               print_vma (entry->d_un.d_val, PREFIX_HEX);
9259               putchar ('\n');
9260             }
9261           break;
9262
9263         case DT_BIND_NOW:
9264           /* The value of this entry is ignored.  */
9265           if (do_dynamic)
9266             putchar ('\n');
9267           break;
9268
9269         case DT_GNU_PRELINKED:
9270           if (do_dynamic)
9271             {
9272               struct tm * tmp;
9273               time_t atime = entry->d_un.d_val;
9274
9275               tmp = gmtime (&atime);
9276               /* PR 17533 file: 041-1244816-0.004.  */
9277               if (tmp == NULL)
9278                 printf (_("<corrupt time val: %lx"),
9279                         (unsigned long) atime);
9280               else
9281                 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
9282                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9283                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
9284
9285             }
9286           break;
9287
9288         case DT_GNU_HASH:
9289           dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
9290           if (do_dynamic)
9291             {
9292               print_vma (entry->d_un.d_val, PREFIX_HEX);
9293               putchar ('\n');
9294             }
9295           break;
9296
9297         default:
9298           if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
9299             version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
9300               entry->d_un.d_val;
9301
9302           if (do_dynamic)
9303             {
9304               switch (elf_header.e_machine)
9305                 {
9306                 case EM_MIPS:
9307                 case EM_MIPS_RS3_LE:
9308                   dynamic_section_mips_val (entry);
9309                   break;
9310                 case EM_PARISC:
9311                   dynamic_section_parisc_val (entry);
9312                   break;
9313                 case EM_IA_64:
9314                   dynamic_section_ia64_val (entry);
9315                   break;
9316                 default:
9317                   print_vma (entry->d_un.d_val, PREFIX_HEX);
9318                   putchar ('\n');
9319                 }
9320             }
9321           break;
9322         }
9323     }
9324
9325   return 1;
9326 }
9327
9328 static char *
9329 get_ver_flags (unsigned int flags)
9330 {
9331   static char buff[32];
9332
9333   buff[0] = 0;
9334
9335   if (flags == 0)
9336     return _("none");
9337
9338   if (flags & VER_FLG_BASE)
9339     strcat (buff, "BASE ");
9340
9341   if (flags & VER_FLG_WEAK)
9342     {
9343       if (flags & VER_FLG_BASE)
9344         strcat (buff, "| ");
9345
9346       strcat (buff, "WEAK ");
9347     }
9348
9349   if (flags & VER_FLG_INFO)
9350     {
9351       if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
9352         strcat (buff, "| ");
9353
9354       strcat (buff, "INFO ");
9355     }
9356
9357   if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
9358     strcat (buff, _("| <unknown>"));
9359
9360   return buff;
9361 }
9362
9363 /* Display the contents of the version sections.  */
9364
9365 static int
9366 process_version_sections (FILE * file)
9367 {
9368   Elf_Internal_Shdr * section;
9369   unsigned i;
9370   int found = 0;
9371
9372   if (! do_version)
9373     return 1;
9374
9375   for (i = 0, section = section_headers;
9376        i < elf_header.e_shnum;
9377        i++, section++)
9378     {
9379       switch (section->sh_type)
9380         {
9381         case SHT_GNU_verdef:
9382           {
9383             Elf_External_Verdef * edefs;
9384             unsigned int idx;
9385             unsigned int cnt;
9386             char * endbuf;
9387
9388             found = 1;
9389
9390             printf (_("\nVersion definition section '%s' contains %u entries:\n"),
9391                     printable_section_name (section),
9392                     section->sh_info);
9393
9394             printf (_("  Addr: 0x"));
9395             printf_vma (section->sh_addr);
9396             printf (_("  Offset: %#08lx  Link: %u (%s)"),
9397                     (unsigned long) section->sh_offset, section->sh_link,
9398                     printable_section_name_from_index (section->sh_link));
9399
9400             edefs = (Elf_External_Verdef *)
9401                 get_data (NULL, file, section->sh_offset, 1,section->sh_size,
9402                           _("version definition section"));
9403             if (!edefs)
9404               break;
9405             endbuf = (char *) edefs + section->sh_size;
9406
9407             for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
9408               {
9409                 char * vstart;
9410                 Elf_External_Verdef * edef;
9411                 Elf_Internal_Verdef ent;
9412                 Elf_External_Verdaux * eaux;
9413                 Elf_Internal_Verdaux aux;
9414                 int j;
9415                 int isum;
9416
9417                 /* Check for very large indicies.  */
9418                 if (idx > (size_t) (endbuf - (char *) edefs))
9419                   break;
9420
9421                 vstart = ((char *) edefs) + idx;
9422                 if (vstart + sizeof (*edef) > endbuf)
9423                   break;
9424
9425                 edef = (Elf_External_Verdef *) vstart;
9426
9427                 ent.vd_version = BYTE_GET (edef->vd_version);
9428                 ent.vd_flags   = BYTE_GET (edef->vd_flags);
9429                 ent.vd_ndx     = BYTE_GET (edef->vd_ndx);
9430                 ent.vd_cnt     = BYTE_GET (edef->vd_cnt);
9431                 ent.vd_hash    = BYTE_GET (edef->vd_hash);
9432                 ent.vd_aux     = BYTE_GET (edef->vd_aux);
9433                 ent.vd_next    = BYTE_GET (edef->vd_next);
9434
9435                 printf (_("  %#06x: Rev: %d  Flags: %s"),
9436                         idx, ent.vd_version, get_ver_flags (ent.vd_flags));
9437
9438                 printf (_("  Index: %d  Cnt: %d  "),
9439                         ent.vd_ndx, ent.vd_cnt);
9440
9441                 /* Check for overflow.  */
9442                 if (ent.vd_aux > (size_t) (endbuf - vstart))
9443                   break;
9444
9445                 vstart += ent.vd_aux;
9446
9447                 eaux = (Elf_External_Verdaux *) vstart;
9448
9449                 aux.vda_name = BYTE_GET (eaux->vda_name);
9450                 aux.vda_next = BYTE_GET (eaux->vda_next);
9451
9452                 if (VALID_DYNAMIC_NAME (aux.vda_name))
9453                   printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
9454                 else
9455                   printf (_("Name index: %ld\n"), aux.vda_name);
9456
9457                 isum = idx + ent.vd_aux;
9458
9459                 for (j = 1; j < ent.vd_cnt; j++)
9460                   {
9461                     /* Check for overflow.  */
9462                     if (aux.vda_next > (size_t) (endbuf - vstart))
9463                       break;
9464
9465                     isum   += aux.vda_next;
9466                     vstart += aux.vda_next;
9467
9468                     eaux = (Elf_External_Verdaux *) vstart;
9469                     if (vstart + sizeof (*eaux) > endbuf)
9470                       break;
9471
9472                     aux.vda_name = BYTE_GET (eaux->vda_name);
9473                     aux.vda_next = BYTE_GET (eaux->vda_next);
9474
9475                     if (VALID_DYNAMIC_NAME (aux.vda_name))
9476                       printf (_("  %#06x: Parent %d: %s\n"),
9477                               isum, j, GET_DYNAMIC_NAME (aux.vda_name));
9478                     else
9479                       printf (_("  %#06x: Parent %d, name index: %ld\n"),
9480                               isum, j, aux.vda_name);
9481                   }
9482
9483                 if (j < ent.vd_cnt)
9484                   printf (_("  Version def aux past end of section\n"));
9485
9486                 /* PR 17531: file: id:000001,src:000172+005151,op:splice,rep:2.  */
9487                 if (idx + ent.vd_next <= idx)
9488                   break;
9489
9490                 idx += ent.vd_next;
9491               }
9492
9493             if (cnt < section->sh_info)
9494               printf (_("  Version definition past end of section\n"));
9495
9496             free (edefs);
9497           }
9498           break;
9499
9500         case SHT_GNU_verneed:
9501           {
9502             Elf_External_Verneed * eneed;
9503             unsigned int idx;
9504             unsigned int cnt;
9505             char * endbuf;
9506
9507             found = 1;
9508
9509             printf (_("\nVersion needs section '%s' contains %u entries:\n"),
9510                     printable_section_name (section), section->sh_info);
9511
9512             printf (_(" Addr: 0x"));
9513             printf_vma (section->sh_addr);
9514             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
9515                     (unsigned long) section->sh_offset, section->sh_link,
9516                     printable_section_name_from_index (section->sh_link));
9517
9518             eneed = (Elf_External_Verneed *) get_data (NULL, file,
9519                                                        section->sh_offset, 1,
9520                                                        section->sh_size,
9521                                                        _("Version Needs section"));
9522             if (!eneed)
9523               break;
9524             endbuf = (char *) eneed + section->sh_size;
9525
9526             for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
9527               {
9528                 Elf_External_Verneed * entry;
9529                 Elf_Internal_Verneed ent;
9530                 int j;
9531                 int isum;
9532                 char * vstart;
9533
9534                 if (idx > (size_t) (endbuf - (char *) eneed))
9535                   break;
9536
9537                 vstart = ((char *) eneed) + idx;
9538                 if (vstart + sizeof (*entry) > endbuf)
9539                   break;
9540
9541                 entry = (Elf_External_Verneed *) vstart;
9542
9543                 ent.vn_version = BYTE_GET (entry->vn_version);
9544                 ent.vn_cnt     = BYTE_GET (entry->vn_cnt);
9545                 ent.vn_file    = BYTE_GET (entry->vn_file);
9546                 ent.vn_aux     = BYTE_GET (entry->vn_aux);
9547                 ent.vn_next    = BYTE_GET (entry->vn_next);
9548
9549                 printf (_("  %#06x: Version: %d"), idx, ent.vn_version);
9550
9551                 if (VALID_DYNAMIC_NAME (ent.vn_file))
9552                   printf (_("  File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
9553                 else
9554                   printf (_("  File: %lx"), ent.vn_file);
9555
9556                 printf (_("  Cnt: %d\n"), ent.vn_cnt);
9557
9558                 /* Check for overflow.  */
9559                 if (ent.vn_aux > (size_t) (endbuf - vstart))
9560                   break;
9561                 vstart += ent.vn_aux;
9562
9563                 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
9564                   {
9565                     Elf_External_Vernaux * eaux;
9566                     Elf_Internal_Vernaux aux;
9567
9568                     if (vstart + sizeof (*eaux) > endbuf)
9569                       break;
9570                     eaux = (Elf_External_Vernaux *) vstart;
9571
9572                     aux.vna_hash  = BYTE_GET (eaux->vna_hash);
9573                     aux.vna_flags = BYTE_GET (eaux->vna_flags);
9574                     aux.vna_other = BYTE_GET (eaux->vna_other);
9575                     aux.vna_name  = BYTE_GET (eaux->vna_name);
9576                     aux.vna_next  = BYTE_GET (eaux->vna_next);
9577
9578                     if (VALID_DYNAMIC_NAME (aux.vna_name))
9579                       printf (_("  %#06x:   Name: %s"),
9580                               isum, GET_DYNAMIC_NAME (aux.vna_name));
9581                     else
9582                       printf (_("  %#06x:   Name index: %lx"),
9583                               isum, aux.vna_name);
9584
9585                     printf (_("  Flags: %s  Version: %d\n"),
9586                             get_ver_flags (aux.vna_flags), aux.vna_other);
9587
9588                     /* Check for overflow.  */
9589                     if (aux.vna_next > (size_t) (endbuf - vstart)
9590                         || (aux.vna_next == 0 && j < ent.vn_cnt - 1))
9591                       {
9592                         warn (_("Invalid vna_next field of %lx\n"),
9593                               aux.vna_next);
9594                         j = ent.vn_cnt;
9595                         break;
9596                       }
9597                     isum   += aux.vna_next;
9598                     vstart += aux.vna_next;
9599                   }
9600
9601                 if (j < ent.vn_cnt)
9602                   warn (_("Missing Version Needs auxillary information\n"));
9603
9604                 if (ent.vn_next == 0 && cnt < section->sh_info - 1)
9605                   {
9606                     warn (_("Corrupt Version Needs structure - offset to next structure is zero with entries still left to be processed\n"));
9607                     cnt = section->sh_info;
9608                     break;
9609                   }
9610                 idx += ent.vn_next;
9611               }
9612
9613             if (cnt < section->sh_info)
9614               warn (_("Missing Version Needs information\n"));
9615
9616             free (eneed);
9617           }
9618           break;
9619
9620         case SHT_GNU_versym:
9621           {
9622             Elf_Internal_Shdr * link_section;
9623             size_t total;
9624             unsigned int cnt;
9625             unsigned char * edata;
9626             unsigned short * data;
9627             char * strtab;
9628             Elf_Internal_Sym * symbols;
9629             Elf_Internal_Shdr * string_sec;
9630             unsigned long num_syms;
9631             long off;
9632
9633             if (section->sh_link >= elf_header.e_shnum)
9634               break;
9635
9636             link_section = section_headers + section->sh_link;
9637             total = section->sh_size / sizeof (Elf_External_Versym);
9638
9639             if (link_section->sh_link >= elf_header.e_shnum)
9640               break;
9641
9642             found = 1;
9643
9644             symbols = GET_ELF_SYMBOLS (file, link_section, & num_syms);
9645             if (symbols == NULL)
9646               break;
9647
9648             string_sec = section_headers + link_section->sh_link;
9649
9650             strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
9651                                         string_sec->sh_size,
9652                                         _("version string table"));
9653             if (!strtab)
9654               {
9655                 free (symbols);
9656                 break;
9657               }
9658
9659             printf (_("\nVersion symbols section '%s' contains %lu entries:\n"),
9660                     printable_section_name (section), (unsigned long) total);
9661
9662             printf (_(" Addr: "));
9663             printf_vma (section->sh_addr);
9664             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
9665                     (unsigned long) section->sh_offset, section->sh_link,
9666                     printable_section_name (link_section));
9667
9668             off = offset_from_vma (file,
9669                                    version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
9670                                    total * sizeof (short));
9671             edata = (unsigned char *) get_data (NULL, file, off, total,
9672                                                 sizeof (short),
9673                                                 _("version symbol data"));
9674             if (!edata)
9675               {
9676                 free (strtab);
9677                 free (symbols);
9678                 break;
9679               }
9680
9681             data = (short unsigned int *) cmalloc (total, sizeof (short));
9682
9683             for (cnt = total; cnt --;)
9684               data[cnt] = byte_get (edata + cnt * sizeof (short),
9685                                     sizeof (short));
9686
9687             free (edata);
9688
9689             for (cnt = 0; cnt < total; cnt += 4)
9690               {
9691                 int j, nn;
9692                 int check_def, check_need;
9693                 char * name;
9694
9695                 printf ("  %03x:", cnt);
9696
9697                 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
9698                   switch (data[cnt + j])
9699                     {
9700                     case 0:
9701                       fputs (_("   0 (*local*)    "), stdout);
9702                       break;
9703
9704                     case 1:
9705                       fputs (_("   1 (*global*)   "), stdout);
9706                       break;
9707
9708                     default:
9709                       nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
9710                                    data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
9711
9712                       /* If this index value is greater than the size of the symbols
9713                          array, break to avoid an out-of-bounds read.  */
9714                       if ((unsigned long)(cnt + j) >= num_syms)
9715                         {
9716                           warn (_("invalid index into symbol array\n"));
9717                           break;
9718                         }
9719
9720                       check_def = 1;
9721                       check_need = 1;
9722                       if (symbols[cnt + j].st_shndx >= elf_header.e_shnum
9723                           || section_headers[symbols[cnt + j].st_shndx].sh_type
9724                              != SHT_NOBITS)
9725                         {
9726                           if (symbols[cnt + j].st_shndx == SHN_UNDEF)
9727                             check_def = 0;
9728                           else
9729                             check_need = 0;
9730                         }
9731
9732                       if (check_need
9733                           && version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
9734                         {
9735                           Elf_Internal_Verneed ivn;
9736                           unsigned long offset;
9737
9738                           offset = offset_from_vma
9739                             (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
9740                              sizeof (Elf_External_Verneed));
9741
9742                           do
9743                             {
9744                               Elf_Internal_Vernaux ivna;
9745                               Elf_External_Verneed evn;
9746                               Elf_External_Vernaux evna;
9747                               unsigned long a_off;
9748
9749                               if (get_data (&evn, file, offset, sizeof (evn), 1,
9750                                             _("version need")) == NULL)
9751                                 break;
9752
9753                               ivn.vn_aux  = BYTE_GET (evn.vn_aux);
9754                               ivn.vn_next = BYTE_GET (evn.vn_next);
9755
9756                               a_off = offset + ivn.vn_aux;
9757
9758                               do
9759                                 {
9760                                   if (get_data (&evna, file, a_off, sizeof (evna),
9761                                                 1, _("version need aux (2)")) == NULL)
9762                                     {
9763                                       ivna.vna_next  = 0;
9764                                       ivna.vna_other = 0;
9765                                     }
9766                                   else
9767                                     {
9768                                       ivna.vna_next  = BYTE_GET (evna.vna_next);
9769                                       ivna.vna_other = BYTE_GET (evna.vna_other);
9770                                     }
9771
9772                                   a_off += ivna.vna_next;
9773                                 }
9774                               while (ivna.vna_other != data[cnt + j]
9775                                      && ivna.vna_next != 0);
9776
9777                               if (ivna.vna_other == data[cnt + j])
9778                                 {
9779                                   ivna.vna_name = BYTE_GET (evna.vna_name);
9780
9781                                   if (ivna.vna_name >= string_sec->sh_size)
9782                                     name = _("*invalid*");
9783                                   else
9784                                     name = strtab + ivna.vna_name;
9785                                   nn += printf ("(%s%-*s",
9786                                                 name,
9787                                                 12 - (int) strlen (name),
9788                                                 ")");
9789                                   check_def = 0;
9790                                   break;
9791                                 }
9792
9793                               offset += ivn.vn_next;
9794                             }
9795                           while (ivn.vn_next);
9796                         }
9797
9798                       if (check_def && data[cnt + j] != 0x8001
9799                           && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
9800                         {
9801                           Elf_Internal_Verdef ivd;
9802                           Elf_External_Verdef evd;
9803                           unsigned long offset;
9804
9805                           offset = offset_from_vma
9806                             (file, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
9807                              sizeof evd);
9808
9809                           do
9810                             {
9811                               if (get_data (&evd, file, offset, sizeof (evd), 1,
9812                                             _("version def")) == NULL)
9813                                 {
9814                                   ivd.vd_next = 0;
9815                                   /* PR 17531: file: 046-1082287-0.004.  */
9816                                   ivd.vd_ndx  = (data[cnt + j] & VERSYM_VERSION) + 1;
9817                                   break;
9818                                 }
9819                               else
9820                                 {
9821                                   ivd.vd_next = BYTE_GET (evd.vd_next);
9822                                   ivd.vd_ndx  = BYTE_GET (evd.vd_ndx);
9823                                 }
9824
9825                               offset += ivd.vd_next;
9826                             }
9827                           while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
9828                                  && ivd.vd_next != 0);
9829
9830                           if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
9831                             {
9832                               Elf_External_Verdaux evda;
9833                               Elf_Internal_Verdaux ivda;
9834
9835                               ivd.vd_aux = BYTE_GET (evd.vd_aux);
9836
9837                               if (get_data (&evda, file,
9838                                             offset - ivd.vd_next + ivd.vd_aux,
9839                                             sizeof (evda), 1,
9840                                             _("version def aux")) == NULL)
9841                                 break;
9842
9843                               ivda.vda_name = BYTE_GET (evda.vda_name);
9844
9845                               if (ivda.vda_name >= string_sec->sh_size)
9846                                 name = _("*invalid*");
9847                               else
9848                                 name = strtab + ivda.vda_name;
9849                               nn += printf ("(%s%-*s",
9850                                             name,
9851                                             12 - (int) strlen (name),
9852                                             ")");
9853                             }
9854                         }
9855
9856                       if (nn < 18)
9857                         printf ("%*c", 18 - nn, ' ');
9858                     }
9859
9860                 putchar ('\n');
9861               }
9862
9863             free (data);
9864             free (strtab);
9865             free (symbols);
9866           }
9867           break;
9868
9869         default:
9870           break;
9871         }
9872     }
9873
9874   if (! found)
9875     printf (_("\nNo version information found in this file.\n"));
9876
9877   return 1;
9878 }
9879
9880 static const char *
9881 get_symbol_binding (unsigned int binding)
9882 {
9883   static char buff[32];
9884
9885   switch (binding)
9886     {
9887     case STB_LOCAL:     return "LOCAL";
9888     case STB_GLOBAL:    return "GLOBAL";
9889     case STB_WEAK:      return "WEAK";
9890     default:
9891       if (binding >= STB_LOPROC && binding <= STB_HIPROC)
9892         snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
9893                   binding);
9894       else if (binding >= STB_LOOS && binding <= STB_HIOS)
9895         {
9896           if (binding == STB_GNU_UNIQUE
9897               && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
9898                   /* GNU is still using the default value 0.  */
9899                   || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
9900             return "UNIQUE";
9901           snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
9902         }
9903       else
9904         snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
9905       return buff;
9906     }
9907 }
9908
9909 static const char *
9910 get_symbol_type (unsigned int type)
9911 {
9912   static char buff[32];
9913
9914   switch (type)
9915     {
9916     case STT_NOTYPE:    return "NOTYPE";
9917     case STT_OBJECT:    return "OBJECT";
9918     case STT_FUNC:      return "FUNC";
9919     case STT_SECTION:   return "SECTION";
9920     case STT_FILE:      return "FILE";
9921     case STT_COMMON:    return "COMMON";
9922     case STT_TLS:       return "TLS";
9923     case STT_RELC:      return "RELC";
9924     case STT_SRELC:     return "SRELC";
9925     default:
9926       if (type >= STT_LOPROC && type <= STT_HIPROC)
9927         {
9928           if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
9929             return "THUMB_FUNC";
9930
9931           if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
9932             return "REGISTER";
9933
9934           if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
9935             return "PARISC_MILLI";
9936
9937           snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
9938         }
9939       else if (type >= STT_LOOS && type <= STT_HIOS)
9940         {
9941           if (elf_header.e_machine == EM_PARISC)
9942             {
9943               if (type == STT_HP_OPAQUE)
9944                 return "HP_OPAQUE";
9945               if (type == STT_HP_STUB)
9946                 return "HP_STUB";
9947             }
9948
9949           if (type == STT_GNU_IFUNC
9950               && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
9951                   || elf_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD
9952                   /* GNU is still using the default value 0.  */
9953                   || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
9954             return "IFUNC";
9955
9956           snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
9957         }
9958       else
9959         snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
9960       return buff;
9961     }
9962 }
9963
9964 static const char *
9965 get_symbol_visibility (unsigned int visibility)
9966 {
9967   switch (visibility)
9968     {
9969     case STV_DEFAULT:   return "DEFAULT";
9970     case STV_INTERNAL:  return "INTERNAL";
9971     case STV_HIDDEN:    return "HIDDEN";
9972     case STV_PROTECTED: return "PROTECTED";
9973     default:
9974       error (_("Unrecognized visibility value: %u"), visibility);
9975       return _("<unknown>");
9976     }
9977 }
9978
9979 static const char *
9980 get_mips_symbol_other (unsigned int other)
9981 {
9982   switch (other)
9983     {
9984     case STO_OPTIONAL:
9985       return "OPTIONAL";
9986     case STO_MIPS_PLT:
9987       return "MIPS PLT";
9988     case STO_MIPS_PIC:
9989       return "MIPS PIC";
9990     case STO_MICROMIPS:
9991       return "MICROMIPS";
9992     case STO_MICROMIPS | STO_MIPS_PIC:
9993       return "MICROMIPS, MIPS PIC";
9994     case STO_MIPS16:
9995       return "MIPS16";
9996     default:
9997       return NULL;
9998     }
9999 }
10000
10001 static const char *
10002 get_ia64_symbol_other (unsigned int other)
10003 {
10004   if (is_ia64_vms ())
10005     {
10006       static char res[32];
10007
10008       res[0] = 0;
10009
10010       /* Function types is for images and .STB files only.  */
10011       switch (elf_header.e_type)
10012         {
10013         case ET_DYN:
10014         case ET_EXEC:
10015           switch (VMS_ST_FUNC_TYPE (other))
10016             {
10017             case VMS_SFT_CODE_ADDR:
10018               strcat (res, " CA");
10019               break;
10020             case VMS_SFT_SYMV_IDX:
10021               strcat (res, " VEC");
10022               break;
10023             case VMS_SFT_FD:
10024               strcat (res, " FD");
10025               break;
10026             case VMS_SFT_RESERVE:
10027               strcat (res, " RSV");
10028               break;
10029             default:
10030               warn (_("Unrecognized IA64 VMS ST Function type: %d\n"),
10031                     VMS_ST_FUNC_TYPE (other));
10032               strcat (res, " <unknown>");
10033               break;
10034             }
10035           break;
10036         default:
10037           break;
10038         }
10039       switch (VMS_ST_LINKAGE (other))
10040         {
10041         case VMS_STL_IGNORE:
10042           strcat (res, " IGN");
10043           break;
10044         case VMS_STL_RESERVE:
10045           strcat (res, " RSV");
10046           break;
10047         case VMS_STL_STD:
10048           strcat (res, " STD");
10049           break;
10050         case VMS_STL_LNK:
10051           strcat (res, " LNK");
10052           break;
10053         default:
10054           warn (_("Unrecognized IA64 VMS ST Linkage: %d\n"),
10055                 VMS_ST_LINKAGE (other));
10056           strcat (res, " <unknown>");
10057           break;
10058         }
10059
10060       if (res[0] != 0)
10061         return res + 1;
10062       else
10063         return res;
10064     }
10065   return NULL;
10066 }
10067
10068 static const char *
10069 get_ppc64_symbol_other (unsigned int other)
10070 {
10071   if (PPC64_LOCAL_ENTRY_OFFSET (other) != 0)
10072     {
10073       static char buf[32];
10074       snprintf (buf, sizeof buf, _("<localentry>: %d"),
10075                 PPC64_LOCAL_ENTRY_OFFSET (other));
10076       return buf;
10077     }
10078   return NULL;
10079 }
10080
10081 static const char *
10082 get_symbol_other (unsigned int other)
10083 {
10084   const char * result = NULL;
10085   static char buff [32];
10086
10087   if (other == 0)
10088     return "";
10089
10090   switch (elf_header.e_machine)
10091     {
10092     case EM_MIPS:
10093       result = get_mips_symbol_other (other);
10094       break;
10095     case EM_IA_64:
10096       result = get_ia64_symbol_other (other);
10097       break;
10098     case EM_PPC64:
10099       result = get_ppc64_symbol_other (other);
10100       break;
10101     default:
10102       break;
10103     }
10104
10105   if (result)
10106     return result;
10107
10108   snprintf (buff, sizeof buff, _("<other>: %x"), other);
10109   return buff;
10110 }
10111
10112 static const char *
10113 get_symbol_index_type (unsigned int type)
10114 {
10115   static char buff[32];
10116
10117   switch (type)
10118     {
10119     case SHN_UNDEF:     return "UND";
10120     case SHN_ABS:       return "ABS";
10121     case SHN_COMMON:    return "COM";
10122     default:
10123       if (type == SHN_IA_64_ANSI_COMMON
10124           && elf_header.e_machine == EM_IA_64
10125           && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
10126         return "ANSI_COM";
10127       else if ((elf_header.e_machine == EM_X86_64
10128                 || elf_header.e_machine == EM_L1OM
10129                 || elf_header.e_machine == EM_K1OM)
10130                && type == SHN_X86_64_LCOMMON)
10131         return "LARGE_COM";
10132       else if ((type == SHN_MIPS_SCOMMON
10133                 && elf_header.e_machine == EM_MIPS)
10134                || (type == SHN_TIC6X_SCOMMON
10135                    && elf_header.e_machine == EM_TI_C6000))
10136         return "SCOM";
10137       else if (type == SHN_MIPS_SUNDEFINED
10138                && elf_header.e_machine == EM_MIPS)
10139         return "SUND";
10140       else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
10141         sprintf (buff, "PRC[0x%04x]", type & 0xffff);
10142       else if (type >= SHN_LOOS && type <= SHN_HIOS)
10143         sprintf (buff, "OS [0x%04x]", type & 0xffff);
10144       else if (type >= SHN_LORESERVE)
10145         sprintf (buff, "RSV[0x%04x]", type & 0xffff);
10146       else if (type >= elf_header.e_shnum)
10147         sprintf (buff, _("bad section index[%3d]"), type);
10148       else
10149         sprintf (buff, "%3d", type);
10150       break;
10151     }
10152
10153   return buff;
10154 }
10155
10156 static bfd_vma *
10157 get_dynamic_data (FILE * file, bfd_size_type number, unsigned int ent_size)
10158 {
10159   unsigned char * e_data;
10160   bfd_vma * i_data;
10161
10162   /* If the size_t type is smaller than the bfd_size_type, eg because
10163      you are building a 32-bit tool on a 64-bit host, then make sure
10164      that when (number) is cast to (size_t) no information is lost.  */
10165   if (sizeof (size_t) < sizeof (bfd_size_type)
10166       && (bfd_size_type) ((size_t) number) != number)
10167     {
10168       error (_("Size truncation prevents reading %llu elements of size %u\n"),
10169              (unsigned long long) number, ent_size);
10170       return NULL;
10171     }
10172
10173   /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
10174      attempting to allocate memory when the read is bound to fail.  */
10175   if (ent_size * number > current_file_size)
10176     {
10177       error (_("Invalid number of dynamic entries: %llu\n"),
10178              (unsigned long long) number);
10179       return NULL;
10180     }
10181
10182   e_data = (unsigned char *) cmalloc ((size_t) number, ent_size);
10183   if (e_data == NULL)
10184     {
10185       error (_("Out of memory reading %llu dynamic entries\n"),
10186              (unsigned long long) number);
10187       return NULL;
10188     }
10189
10190   if (fread (e_data, ent_size, (size_t) number, file) != number)
10191     {
10192       error (_("Unable to read in %llu bytes of dynamic data\n"),
10193              (unsigned long long) (number * ent_size));
10194       free (e_data);
10195       return NULL;
10196     }
10197
10198   i_data = (bfd_vma *) cmalloc ((size_t) number, sizeof (*i_data));
10199   if (i_data == NULL)
10200     {
10201       error (_("Out of memory allocating space for %llu dynamic entries\n"),
10202              (unsigned long long) number);
10203       free (e_data);
10204       return NULL;
10205     }
10206
10207   while (number--)
10208     i_data[number] = byte_get (e_data + number * ent_size, ent_size);
10209
10210   free (e_data);
10211
10212   return i_data;
10213 }
10214
10215 static void
10216 print_dynamic_symbol (bfd_vma si, unsigned long hn)
10217 {
10218   Elf_Internal_Sym * psym;
10219   int n;
10220
10221   n = print_vma (si, DEC_5);
10222   if (n < 5)
10223     fputs (&"     "[n], stdout);
10224   printf (" %3lu: ", hn);
10225
10226   if (dynamic_symbols == NULL || si >= num_dynamic_syms)
10227     {
10228       printf (_("<No info available for dynamic symbol number %lu>\n"),
10229               (unsigned long) si);
10230       return;
10231     }
10232
10233   psym = dynamic_symbols + si;
10234   print_vma (psym->st_value, LONG_HEX);
10235   putchar (' ');
10236   print_vma (psym->st_size, DEC_5);
10237
10238   printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
10239   printf (" %-6s",  get_symbol_binding (ELF_ST_BIND (psym->st_info)));
10240   printf (" %-7s",  get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
10241   /* Check to see if any other bits in the st_other field are set.
10242      Note - displaying this information disrupts the layout of the
10243      table being generated, but for the moment this case is very
10244      rare.  */
10245   if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
10246     printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
10247   printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
10248   if (VALID_DYNAMIC_NAME (psym->st_name))
10249     print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
10250   else
10251     printf (_(" <corrupt: %14ld>"), psym->st_name);
10252   putchar ('\n');
10253 }
10254
10255 static const char *
10256 get_symbol_version_string (FILE *file, int is_dynsym,
10257                            const char *strtab,
10258                            unsigned long int strtab_size,
10259                            unsigned int si, Elf_Internal_Sym *psym,
10260                            enum versioned_symbol_info *sym_info,
10261                            unsigned short *vna_other)
10262 {
10263   const char *version_string = NULL;
10264
10265   if (is_dynsym
10266       && version_info[DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
10267     {
10268       unsigned char data[2];
10269       unsigned short vers_data;
10270       unsigned long offset;
10271       int is_nobits;
10272       int check_def;
10273
10274       offset = offset_from_vma
10275         (file, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10276          sizeof data + si * sizeof (vers_data));
10277
10278       if (get_data (&data, file, offset + si * sizeof (vers_data),
10279                     sizeof (data), 1, _("version data")) == NULL)
10280         return NULL;
10281
10282       vers_data = byte_get (data, 2);
10283
10284       is_nobits = (section_headers != NULL
10285                    && psym->st_shndx < elf_header.e_shnum
10286                    && section_headers[psym->st_shndx].sh_type
10287                    == SHT_NOBITS);
10288
10289       check_def = (psym->st_shndx != SHN_UNDEF);
10290
10291       if ((vers_data & VERSYM_HIDDEN) || vers_data > 1)
10292         {
10293           if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)]
10294               && (is_nobits || ! check_def))
10295             {
10296               Elf_External_Verneed evn;
10297               Elf_Internal_Verneed ivn;
10298               Elf_Internal_Vernaux ivna;
10299
10300               /* We must test both.  */
10301               offset = offset_from_vma
10302                 (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10303                  sizeof evn);
10304
10305               do
10306                 {
10307                   unsigned long vna_off;
10308
10309                   if (get_data (&evn, file, offset, sizeof (evn), 1,
10310                                 _("version need")) == NULL)
10311                     {
10312                       ivna.vna_next = 0;
10313                       ivna.vna_other = 0;
10314                       ivna.vna_name = 0;
10315                       break;
10316                     }
10317
10318                   ivn.vn_aux  = BYTE_GET (evn.vn_aux);
10319                   ivn.vn_next = BYTE_GET (evn.vn_next);
10320
10321                   vna_off = offset + ivn.vn_aux;
10322
10323                   do
10324                     {
10325                       Elf_External_Vernaux evna;
10326
10327                       if (get_data (&evna, file, vna_off,
10328                                     sizeof (evna), 1,
10329                                     _("version need aux (3)")) == NULL)
10330                         {
10331                           ivna.vna_next = 0;
10332                           ivna.vna_other = 0;
10333                           ivna.vna_name = 0;
10334                         }
10335                       else
10336                         {
10337                           ivna.vna_other = BYTE_GET (evna.vna_other);
10338                           ivna.vna_next  = BYTE_GET (evna.vna_next);
10339                           ivna.vna_name  = BYTE_GET (evna.vna_name);
10340                         }
10341
10342                       vna_off += ivna.vna_next;
10343                     }
10344                   while (ivna.vna_other != vers_data
10345                          && ivna.vna_next != 0);
10346
10347                   if (ivna.vna_other == vers_data)
10348                     break;
10349
10350                   offset += ivn.vn_next;
10351                 }
10352               while (ivn.vn_next != 0);
10353
10354               if (ivna.vna_other == vers_data)
10355                 {
10356                   *sym_info = symbol_undefined;
10357                   *vna_other = ivna.vna_other;
10358                   version_string = (ivna.vna_name < strtab_size
10359                                     ? strtab + ivna.vna_name
10360                                     : _("<corrupt>"));
10361                   check_def = 0;
10362                 }
10363               else if (! is_nobits)
10364                 error (_("bad dynamic symbol\n"));
10365               else
10366                 check_def = 1;
10367             }
10368
10369           if (check_def)
10370             {
10371               if (vers_data != 0x8001
10372                   && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10373                 {
10374                   Elf_Internal_Verdef ivd;
10375                   Elf_Internal_Verdaux ivda;
10376                   Elf_External_Verdaux evda;
10377                   unsigned long off;
10378
10379                   off = offset_from_vma
10380                     (file,
10381                      version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10382                      sizeof (Elf_External_Verdef));
10383
10384                   do
10385                     {
10386                       Elf_External_Verdef evd;
10387
10388                       if (get_data (&evd, file, off, sizeof (evd),
10389                                     1, _("version def")) == NULL)
10390                         {
10391                           ivd.vd_ndx = 0;
10392                           ivd.vd_aux = 0;
10393                           ivd.vd_next = 0;
10394                         }
10395                       else
10396                         {
10397                           ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
10398                           ivd.vd_aux = BYTE_GET (evd.vd_aux);
10399                           ivd.vd_next = BYTE_GET (evd.vd_next);
10400                         }
10401
10402                       off += ivd.vd_next;
10403                     }
10404                   while (ivd.vd_ndx != (vers_data & VERSYM_VERSION)
10405                          && ivd.vd_next != 0);
10406
10407                   off -= ivd.vd_next;
10408                   off += ivd.vd_aux;
10409
10410                   if (get_data (&evda, file, off, sizeof (evda),
10411                                 1, _("version def aux")) == NULL)
10412                     return version_string;
10413
10414                   ivda.vda_name = BYTE_GET (evda.vda_name);
10415
10416                   if (psym->st_name != ivda.vda_name)
10417                     {
10418                       *sym_info = ((vers_data & VERSYM_HIDDEN) != 0
10419                                    ? symbol_hidden : symbol_public);
10420                       version_string = (ivda.vda_name < strtab_size
10421                                         ? strtab + ivda.vda_name
10422                                         : _("<corrupt>"));
10423                     }
10424                 }
10425             }
10426         }
10427     }
10428   return version_string;
10429 }
10430
10431 /* Dump the symbol table.  */
10432 static int
10433 process_symbol_table (FILE * file)
10434 {
10435   Elf_Internal_Shdr * section;
10436   bfd_size_type nbuckets = 0;
10437   bfd_size_type nchains = 0;
10438   bfd_vma * buckets = NULL;
10439   bfd_vma * chains = NULL;
10440   bfd_vma ngnubuckets = 0;
10441   bfd_vma * gnubuckets = NULL;
10442   bfd_vma * gnuchains = NULL;
10443   bfd_vma gnusymidx = 0;
10444   bfd_size_type ngnuchains = 0;
10445
10446   if (!do_syms && !do_dyn_syms && !do_histogram)
10447     return 1;
10448
10449   if (dynamic_info[DT_HASH]
10450       && (do_histogram
10451           || (do_using_dynamic
10452               && !do_dyn_syms
10453               && dynamic_strings != NULL)))
10454     {
10455       unsigned char nb[8];
10456       unsigned char nc[8];
10457       unsigned int hash_ent_size = 4;
10458
10459       if ((elf_header.e_machine == EM_ALPHA
10460            || elf_header.e_machine == EM_S390
10461            || elf_header.e_machine == EM_S390_OLD)
10462           && elf_header.e_ident[EI_CLASS] == ELFCLASS64)
10463         hash_ent_size = 8;
10464
10465       if (fseek (file,
10466                  (archive_file_offset
10467                   + offset_from_vma (file, dynamic_info[DT_HASH],
10468                                      sizeof nb + sizeof nc)),
10469                  SEEK_SET))
10470         {
10471           error (_("Unable to seek to start of dynamic information\n"));
10472           goto no_hash;
10473         }
10474
10475       if (fread (nb, hash_ent_size, 1, file) != 1)
10476         {
10477           error (_("Failed to read in number of buckets\n"));
10478           goto no_hash;
10479         }
10480
10481       if (fread (nc, hash_ent_size, 1, file) != 1)
10482         {
10483           error (_("Failed to read in number of chains\n"));
10484           goto no_hash;
10485         }
10486
10487       nbuckets = byte_get (nb, hash_ent_size);
10488       nchains  = byte_get (nc, hash_ent_size);
10489
10490       buckets = get_dynamic_data (file, nbuckets, hash_ent_size);
10491       chains  = get_dynamic_data (file, nchains, hash_ent_size);
10492
10493     no_hash:
10494       if (buckets == NULL || chains == NULL)
10495         {
10496           if (do_using_dynamic)
10497             return 0;
10498           free (buckets);
10499           free (chains);
10500           buckets = NULL;
10501           chains = NULL;
10502           nbuckets = 0;
10503           nchains = 0;
10504         }
10505     }
10506
10507   if (dynamic_info_DT_GNU_HASH
10508       && (do_histogram
10509           || (do_using_dynamic
10510               && !do_dyn_syms
10511               && dynamic_strings != NULL)))
10512     {
10513       unsigned char nb[16];
10514       bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
10515       bfd_vma buckets_vma;
10516
10517       if (fseek (file,
10518                  (archive_file_offset
10519                   + offset_from_vma (file, dynamic_info_DT_GNU_HASH,
10520                                      sizeof nb)),
10521                  SEEK_SET))
10522         {
10523           error (_("Unable to seek to start of dynamic information\n"));
10524           goto no_gnu_hash;
10525         }
10526
10527       if (fread (nb, 16, 1, file) != 1)
10528         {
10529           error (_("Failed to read in number of buckets\n"));
10530           goto no_gnu_hash;
10531         }
10532
10533       ngnubuckets = byte_get (nb, 4);
10534       gnusymidx = byte_get (nb + 4, 4);
10535       bitmaskwords = byte_get (nb + 8, 4);
10536       buckets_vma = dynamic_info_DT_GNU_HASH + 16;
10537       if (is_32bit_elf)
10538         buckets_vma += bitmaskwords * 4;
10539       else
10540         buckets_vma += bitmaskwords * 8;
10541
10542       if (fseek (file,
10543                  (archive_file_offset
10544                   + offset_from_vma (file, buckets_vma, 4)),
10545                  SEEK_SET))
10546         {
10547           error (_("Unable to seek to start of dynamic information\n"));
10548           goto no_gnu_hash;
10549         }
10550
10551       gnubuckets = get_dynamic_data (file, ngnubuckets, 4);
10552
10553       if (gnubuckets == NULL)
10554         goto no_gnu_hash;
10555
10556       for (i = 0; i < ngnubuckets; i++)
10557         if (gnubuckets[i] != 0)
10558           {
10559             if (gnubuckets[i] < gnusymidx)
10560               return 0;
10561
10562             if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
10563               maxchain = gnubuckets[i];
10564           }
10565
10566       if (maxchain == 0xffffffff)
10567         goto no_gnu_hash;
10568
10569       maxchain -= gnusymidx;
10570
10571       if (fseek (file,
10572                  (archive_file_offset
10573                   + offset_from_vma (file, buckets_vma
10574                                            + 4 * (ngnubuckets + maxchain), 4)),
10575                  SEEK_SET))
10576         {
10577           error (_("Unable to seek to start of dynamic information\n"));
10578           goto no_gnu_hash;
10579         }
10580
10581       do
10582         {
10583           if (fread (nb, 4, 1, file) != 1)
10584             {
10585               error (_("Failed to determine last chain length\n"));
10586               goto no_gnu_hash;
10587             }
10588
10589           if (maxchain + 1 == 0)
10590             goto no_gnu_hash;
10591
10592           ++maxchain;
10593         }
10594       while ((byte_get (nb, 4) & 1) == 0);
10595
10596       if (fseek (file,
10597                  (archive_file_offset
10598                   + offset_from_vma (file, buckets_vma + 4 * ngnubuckets, 4)),
10599                  SEEK_SET))
10600         {
10601           error (_("Unable to seek to start of dynamic information\n"));
10602           goto no_gnu_hash;
10603         }
10604
10605       gnuchains = get_dynamic_data (file, maxchain, 4);
10606       ngnuchains = maxchain;
10607
10608     no_gnu_hash:
10609       if (gnuchains == NULL)
10610         {
10611           free (gnubuckets);
10612           gnubuckets = NULL;
10613           ngnubuckets = 0;
10614           if (do_using_dynamic)
10615             return 0;
10616         }
10617     }
10618
10619   if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
10620       && do_syms
10621       && do_using_dynamic
10622       && dynamic_strings != NULL
10623       && dynamic_symbols != NULL)
10624     {
10625       unsigned long hn;
10626
10627       if (dynamic_info[DT_HASH])
10628         {
10629           bfd_vma si;
10630
10631           printf (_("\nSymbol table for image:\n"));
10632           if (is_32bit_elf)
10633             printf (_("  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"));
10634           else
10635             printf (_("  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"));
10636
10637           for (hn = 0; hn < nbuckets; hn++)
10638             {
10639               if (! buckets[hn])
10640                 continue;
10641
10642               for (si = buckets[hn]; si < nchains && si > 0; si = chains[si])
10643                 print_dynamic_symbol (si, hn);
10644             }
10645         }
10646
10647       if (dynamic_info_DT_GNU_HASH)
10648         {
10649           printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
10650           if (is_32bit_elf)
10651             printf (_("  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"));
10652           else
10653             printf (_("  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"));
10654
10655           for (hn = 0; hn < ngnubuckets; ++hn)
10656             if (gnubuckets[hn] != 0)
10657               {
10658                 bfd_vma si = gnubuckets[hn];
10659                 bfd_vma off = si - gnusymidx;
10660
10661                 do
10662                   {
10663                     print_dynamic_symbol (si, hn);
10664                     si++;
10665                   }
10666                 while (off < ngnuchains && (gnuchains[off++] & 1) == 0);
10667               }
10668         }
10669     }
10670   else if ((do_dyn_syms || (do_syms && !do_using_dynamic))
10671            && section_headers != NULL)
10672     {
10673       unsigned int i;
10674
10675       for (i = 0, section = section_headers;
10676            i < elf_header.e_shnum;
10677            i++, section++)
10678         {
10679           unsigned int si;
10680           char * strtab = NULL;
10681           unsigned long int strtab_size = 0;
10682           Elf_Internal_Sym * symtab;
10683           Elf_Internal_Sym * psym;
10684           unsigned long num_syms;
10685
10686           if ((section->sh_type != SHT_SYMTAB
10687                && section->sh_type != SHT_DYNSYM)
10688               || (!do_syms
10689                   && section->sh_type == SHT_SYMTAB))
10690             continue;
10691
10692           if (section->sh_entsize == 0)
10693             {
10694               printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
10695                       printable_section_name (section));
10696               continue;
10697             }
10698
10699           printf (_("\nSymbol table '%s' contains %lu entries:\n"),
10700                   printable_section_name (section),
10701                   (unsigned long) (section->sh_size / section->sh_entsize));
10702
10703           if (is_32bit_elf)
10704             printf (_("   Num:    Value  Size Type    Bind   Vis      Ndx Name\n"));
10705           else
10706             printf (_("   Num:    Value          Size Type    Bind   Vis      Ndx Name\n"));
10707
10708           symtab = GET_ELF_SYMBOLS (file, section, & num_syms);
10709           if (symtab == NULL)
10710             continue;
10711
10712           if (section->sh_link == elf_header.e_shstrndx)
10713             {
10714               strtab = string_table;
10715               strtab_size = string_table_length;
10716             }
10717           else if (section->sh_link < elf_header.e_shnum)
10718             {
10719               Elf_Internal_Shdr * string_sec;
10720
10721               string_sec = section_headers + section->sh_link;
10722
10723               strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
10724                                           1, string_sec->sh_size,
10725                                           _("string table"));
10726               strtab_size = strtab != NULL ? string_sec->sh_size : 0;
10727             }
10728
10729           for (si = 0, psym = symtab; si < num_syms; si++, psym++)
10730             {
10731               const char *version_string;
10732               enum versioned_symbol_info sym_info;
10733               unsigned short vna_other;
10734
10735               printf ("%6d: ", si);
10736               print_vma (psym->st_value, LONG_HEX);
10737               putchar (' ');
10738               print_vma (psym->st_size, DEC_5);
10739               printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
10740               printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
10741               printf (" %-7s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
10742               /* Check to see if any other bits in the st_other field are set.
10743                  Note - displaying this information disrupts the layout of the
10744                  table being generated, but for the moment this case is very rare.  */
10745               if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
10746                 printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
10747               printf (" %4s ", get_symbol_index_type (psym->st_shndx));
10748               print_symbol (25, psym->st_name < strtab_size
10749                             ? strtab + psym->st_name : _("<corrupt>"));
10750
10751               version_string
10752                 = get_symbol_version_string (file,
10753                                              section->sh_type == SHT_DYNSYM,
10754                                              strtab, strtab_size, si,
10755                                              psym, &sym_info, &vna_other);
10756               if (version_string)
10757                 {
10758                   if (sym_info == symbol_undefined)
10759                     printf ("@%s (%d)", version_string, vna_other);
10760                   else
10761                     printf (sym_info == symbol_hidden ? "@%s" : "@@%s",
10762                             version_string);
10763                 }
10764
10765               putchar ('\n');
10766             }
10767
10768           free (symtab);
10769           if (strtab != string_table)
10770             free (strtab);
10771         }
10772     }
10773   else if (do_syms)
10774     printf
10775       (_("\nDynamic symbol information is not available for displaying symbols.\n"));
10776
10777   if (do_histogram && buckets != NULL)
10778     {
10779       unsigned long * lengths;
10780       unsigned long * counts;
10781       unsigned long hn;
10782       bfd_vma si;
10783       unsigned long maxlength = 0;
10784       unsigned long nzero_counts = 0;
10785       unsigned long nsyms = 0;
10786
10787       printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
10788               (unsigned long) nbuckets);
10789
10790       lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
10791       if (lengths == NULL)
10792         {
10793           error (_("Out of memory allocating space for histogram buckets\n"));
10794           return 0;
10795         }
10796
10797       printf (_(" Length  Number     %% of total  Coverage\n"));
10798       for (hn = 0; hn < nbuckets; ++hn)
10799         {
10800           for (si = buckets[hn]; si > 0 && si < nchains && si < nbuckets; si = chains[si])
10801             {
10802               ++nsyms;
10803               if (maxlength < ++lengths[hn])
10804                 ++maxlength;
10805
10806               /* PR binutils/17531: A corrupt binary could contain broken
10807                  histogram data.  Do not go into an infinite loop trying
10808                  to process it.  */
10809               if (chains[si] == si)
10810                 {
10811                   error (_("histogram chain links to itself\n"));
10812                   break;
10813                 }
10814             }
10815         }
10816
10817       counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
10818       if (counts == NULL)
10819         {
10820           free (lengths);
10821           error (_("Out of memory allocating space for histogram counts\n"));
10822           return 0;
10823         }
10824
10825       for (hn = 0; hn < nbuckets; ++hn)
10826         ++counts[lengths[hn]];
10827
10828       if (nbuckets > 0)
10829         {
10830           unsigned long i;
10831           printf ("      0  %-10lu (%5.1f%%)\n",
10832                   counts[0], (counts[0] * 100.0) / nbuckets);
10833           for (i = 1; i <= maxlength; ++i)
10834             {
10835               nzero_counts += counts[i] * i;
10836               printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
10837                       i, counts[i], (counts[i] * 100.0) / nbuckets,
10838                       (nzero_counts * 100.0) / nsyms);
10839             }
10840         }
10841
10842       free (counts);
10843       free (lengths);
10844     }
10845
10846   if (buckets != NULL)
10847     {
10848       free (buckets);
10849       free (chains);
10850     }
10851
10852   if (do_histogram && gnubuckets != NULL)
10853     {
10854       unsigned long * lengths;
10855       unsigned long * counts;
10856       unsigned long hn;
10857       unsigned long maxlength = 0;
10858       unsigned long nzero_counts = 0;
10859       unsigned long nsyms = 0;
10860
10861       printf (_("\nHistogram for `.gnu.hash' bucket list length (total of %lu buckets):\n"),
10862               (unsigned long) ngnubuckets);
10863
10864       lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
10865       if (lengths == NULL)
10866         {
10867           error (_("Out of memory allocating space for gnu histogram buckets\n"));
10868           return 0;
10869         }
10870
10871       printf (_(" Length  Number     %% of total  Coverage\n"));
10872
10873       for (hn = 0; hn < ngnubuckets; ++hn)
10874         if (gnubuckets[hn] != 0)
10875           {
10876             bfd_vma off, length = 1;
10877
10878             for (off = gnubuckets[hn] - gnusymidx;
10879                  /* PR 17531 file: 010-77222-0.004.  */
10880                  off < ngnuchains && (gnuchains[off] & 1) == 0;
10881                  ++off)
10882               ++length;
10883             lengths[hn] = length;
10884             if (length > maxlength)
10885               maxlength = length;
10886             nsyms += length;
10887           }
10888
10889       counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
10890       if (counts == NULL)
10891         {
10892           free (lengths);
10893           error (_("Out of memory allocating space for gnu histogram counts\n"));
10894           return 0;
10895         }
10896
10897       for (hn = 0; hn < ngnubuckets; ++hn)
10898         ++counts[lengths[hn]];
10899
10900       if (ngnubuckets > 0)
10901         {
10902           unsigned long j;
10903           printf ("      0  %-10lu (%5.1f%%)\n",
10904                   counts[0], (counts[0] * 100.0) / ngnubuckets);
10905           for (j = 1; j <= maxlength; ++j)
10906             {
10907               nzero_counts += counts[j] * j;
10908               printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
10909                       j, counts[j], (counts[j] * 100.0) / ngnubuckets,
10910                       (nzero_counts * 100.0) / nsyms);
10911             }
10912         }
10913
10914       free (counts);
10915       free (lengths);
10916       free (gnubuckets);
10917       free (gnuchains);
10918     }
10919
10920   return 1;
10921 }
10922
10923 static int
10924 process_syminfo (FILE * file ATTRIBUTE_UNUSED)
10925 {
10926   unsigned int i;
10927
10928   if (dynamic_syminfo == NULL
10929       || !do_dynamic)
10930     /* No syminfo, this is ok.  */
10931     return 1;
10932
10933   /* There better should be a dynamic symbol section.  */
10934   if (dynamic_symbols == NULL || dynamic_strings == NULL)
10935     return 0;
10936
10937   if (dynamic_addr)
10938     printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
10939             dynamic_syminfo_offset, dynamic_syminfo_nent);
10940
10941   printf (_(" Num: Name                           BoundTo     Flags\n"));
10942   for (i = 0; i < dynamic_syminfo_nent; ++i)
10943     {
10944       unsigned short int flags = dynamic_syminfo[i].si_flags;
10945
10946       printf ("%4d: ", i);
10947       if (i >= num_dynamic_syms)
10948         printf (_("<corrupt index>"));
10949       else if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
10950         print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
10951       else
10952         printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
10953       putchar (' ');
10954
10955       switch (dynamic_syminfo[i].si_boundto)
10956         {
10957         case SYMINFO_BT_SELF:
10958           fputs ("SELF       ", stdout);
10959           break;
10960         case SYMINFO_BT_PARENT:
10961           fputs ("PARENT     ", stdout);
10962           break;
10963         default:
10964           if (dynamic_syminfo[i].si_boundto > 0
10965               && dynamic_syminfo[i].si_boundto < dynamic_nent
10966               && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
10967             {
10968               print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
10969               putchar (' ' );
10970             }
10971           else
10972             printf ("%-10d ", dynamic_syminfo[i].si_boundto);
10973           break;
10974         }
10975
10976       if (flags & SYMINFO_FLG_DIRECT)
10977         printf (" DIRECT");
10978       if (flags & SYMINFO_FLG_PASSTHRU)
10979         printf (" PASSTHRU");
10980       if (flags & SYMINFO_FLG_COPY)
10981         printf (" COPY");
10982       if (flags & SYMINFO_FLG_LAZYLOAD)
10983         printf (" LAZYLOAD");
10984
10985       puts ("");
10986     }
10987
10988   return 1;
10989 }
10990
10991 /* Check to see if the given reloc needs to be handled in a target specific
10992    manner.  If so then process the reloc and return TRUE otherwise return
10993    FALSE.  */
10994
10995 static bfd_boolean
10996 target_specific_reloc_handling (Elf_Internal_Rela * reloc,
10997                                 unsigned char *     start,
10998                                 Elf_Internal_Sym *  symtab)
10999 {
11000   unsigned int reloc_type = get_reloc_type (reloc->r_info);
11001
11002   switch (elf_header.e_machine)
11003     {
11004     case EM_MSP430:
11005     case EM_MSP430_OLD:
11006       {
11007         static Elf_Internal_Sym * saved_sym = NULL;
11008
11009         switch (reloc_type)
11010           {
11011           case 10: /* R_MSP430_SYM_DIFF */
11012             if (uses_msp430x_relocs ())
11013               break;
11014           case 21: /* R_MSP430X_SYM_DIFF */
11015             saved_sym = symtab + get_reloc_symindex (reloc->r_info);
11016             return TRUE;
11017
11018           case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
11019           case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
11020             goto handle_sym_diff;
11021
11022           case 5: /* R_MSP430_16_BYTE */
11023           case 9: /* R_MSP430_8 */
11024             if (uses_msp430x_relocs ())
11025               break;
11026             goto handle_sym_diff;
11027
11028           case 2: /* R_MSP430_ABS16 */
11029           case 15: /* R_MSP430X_ABS16 */
11030             if (! uses_msp430x_relocs ())
11031               break;
11032             goto handle_sym_diff;
11033
11034           handle_sym_diff:
11035             if (saved_sym != NULL)
11036               {
11037                 bfd_vma value;
11038
11039                 value = reloc->r_addend
11040                   + (symtab[get_reloc_symindex (reloc->r_info)].st_value
11041                      - saved_sym->st_value);
11042
11043                 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
11044
11045                 saved_sym = NULL;
11046                 return TRUE;
11047               }
11048             break;
11049
11050           default:
11051             if (saved_sym != NULL)
11052               error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc\n"));
11053             break;
11054           }
11055         break;
11056       }
11057
11058     case EM_MN10300:
11059     case EM_CYGNUS_MN10300:
11060       {
11061         static Elf_Internal_Sym * saved_sym = NULL;
11062
11063         switch (reloc_type)
11064           {
11065           case 34: /* R_MN10300_ALIGN */
11066             return TRUE;
11067           case 33: /* R_MN10300_SYM_DIFF */
11068             saved_sym = symtab + get_reloc_symindex (reloc->r_info);
11069             return TRUE;
11070           case 1: /* R_MN10300_32 */
11071           case 2: /* R_MN10300_16 */
11072             if (saved_sym != NULL)
11073               {
11074                 bfd_vma value;
11075
11076                 value = reloc->r_addend
11077                   + (symtab[get_reloc_symindex (reloc->r_info)].st_value
11078                      - saved_sym->st_value);
11079
11080                 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
11081
11082                 saved_sym = NULL;
11083                 return TRUE;
11084               }
11085             break;
11086           default:
11087             if (saved_sym != NULL)
11088               error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc\n"));
11089             break;
11090           }
11091         break;
11092       }
11093     }
11094
11095   return FALSE;
11096 }
11097
11098 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
11099    DWARF debug sections.  This is a target specific test.  Note - we do not
11100    go through the whole including-target-headers-multiple-times route, (as
11101    we have already done with <elf/h8.h>) because this would become very
11102    messy and even then this function would have to contain target specific
11103    information (the names of the relocs instead of their numeric values).
11104    FIXME: This is not the correct way to solve this problem.  The proper way
11105    is to have target specific reloc sizing and typing functions created by
11106    the reloc-macros.h header, in the same way that it already creates the
11107    reloc naming functions.  */
11108
11109 static bfd_boolean
11110 is_32bit_abs_reloc (unsigned int reloc_type)
11111 {
11112   switch (elf_header.e_machine)
11113     {
11114     case EM_386:
11115     case EM_486:
11116       return reloc_type == 1; /* R_386_32.  */
11117     case EM_68K:
11118       return reloc_type == 1; /* R_68K_32.  */
11119     case EM_860:
11120       return reloc_type == 1; /* R_860_32.  */
11121     case EM_960:
11122       return reloc_type == 2; /* R_960_32.  */
11123     case EM_AARCH64:
11124       return reloc_type == 258; /* R_AARCH64_ABS32 */
11125     case EM_ALPHA:
11126       return reloc_type == 1; /* R_ALPHA_REFLONG.  */
11127     case EM_ARC:
11128       return reloc_type == 1; /* R_ARC_32.  */
11129     case EM_ARM:
11130       return reloc_type == 2; /* R_ARM_ABS32 */
11131     case EM_AVR_OLD:
11132     case EM_AVR:
11133       return reloc_type == 1;
11134     case EM_ADAPTEVA_EPIPHANY:
11135       return reloc_type == 3;
11136     case EM_BLACKFIN:
11137       return reloc_type == 0x12; /* R_byte4_data.  */
11138     case EM_CRIS:
11139       return reloc_type == 3; /* R_CRIS_32.  */
11140     case EM_CR16:
11141       return reloc_type == 3; /* R_CR16_NUM32.  */
11142     case EM_CRX:
11143       return reloc_type == 15; /* R_CRX_NUM32.  */
11144     case EM_CYGNUS_FRV:
11145       return reloc_type == 1;
11146     case EM_CYGNUS_D10V:
11147     case EM_D10V:
11148       return reloc_type == 6; /* R_D10V_32.  */
11149     case EM_CYGNUS_D30V:
11150     case EM_D30V:
11151       return reloc_type == 12; /* R_D30V_32_NORMAL.  */
11152     case EM_DLX:
11153       return reloc_type == 3; /* R_DLX_RELOC_32.  */
11154     case EM_CYGNUS_FR30:
11155     case EM_FR30:
11156       return reloc_type == 3; /* R_FR30_32.  */
11157     case EM_FT32:
11158       return reloc_type == 1; /* R_FT32_32.  */
11159     case EM_H8S:
11160     case EM_H8_300:
11161     case EM_H8_300H:
11162       return reloc_type == 1; /* R_H8_DIR32.  */
11163     case EM_IA_64:
11164       return reloc_type == 0x65; /* R_IA64_SECREL32LSB.  */
11165     case EM_IP2K_OLD:
11166     case EM_IP2K:
11167       return reloc_type == 2; /* R_IP2K_32.  */
11168     case EM_IQ2000:
11169       return reloc_type == 2; /* R_IQ2000_32.  */
11170     case EM_LATTICEMICO32:
11171       return reloc_type == 3; /* R_LM32_32.  */
11172     case EM_M32C_OLD:
11173     case EM_M32C:
11174       return reloc_type == 3; /* R_M32C_32.  */
11175     case EM_M32R:
11176       return reloc_type == 34; /* R_M32R_32_RELA.  */
11177     case EM_MCORE:
11178       return reloc_type == 1; /* R_MCORE_ADDR32.  */
11179     case EM_CYGNUS_MEP:
11180       return reloc_type == 4; /* R_MEP_32.  */
11181     case EM_METAG:
11182       return reloc_type == 2; /* R_METAG_ADDR32.  */
11183     case EM_MICROBLAZE:
11184       return reloc_type == 1; /* R_MICROBLAZE_32.  */
11185     case EM_MIPS:
11186       return reloc_type == 2; /* R_MIPS_32.  */
11187     case EM_MMIX:
11188       return reloc_type == 4; /* R_MMIX_32.  */
11189     case EM_CYGNUS_MN10200:
11190     case EM_MN10200:
11191       return reloc_type == 1; /* R_MN10200_32.  */
11192     case EM_CYGNUS_MN10300:
11193     case EM_MN10300:
11194       return reloc_type == 1; /* R_MN10300_32.  */
11195     case EM_MOXIE:
11196       return reloc_type == 1; /* R_MOXIE_32.  */
11197     case EM_MSP430_OLD:
11198     case EM_MSP430:
11199       return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32.  */
11200     case EM_MT:
11201       return reloc_type == 2; /* R_MT_32.  */
11202     case EM_NDS32:
11203       return reloc_type == 20; /* R_NDS32_RELA.  */
11204     case EM_ALTERA_NIOS2:
11205       return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32.  */
11206     case EM_NIOS32:
11207       return reloc_type == 1; /* R_NIOS_32.  */
11208     case EM_OR1K:
11209       return reloc_type == 1; /* R_OR1K_32.  */
11210     case EM_PARISC:
11211       return (reloc_type == 1 /* R_PARISC_DIR32.  */
11212               || reloc_type == 41); /* R_PARISC_SECREL32.  */
11213     case EM_PJ:
11214     case EM_PJ_OLD:
11215       return reloc_type == 1; /* R_PJ_DATA_DIR32.  */
11216     case EM_PPC64:
11217       return reloc_type == 1; /* R_PPC64_ADDR32.  */
11218     case EM_PPC:
11219       return reloc_type == 1; /* R_PPC_ADDR32.  */
11220     case EM_RL78:
11221       return reloc_type == 1; /* R_RL78_DIR32.  */
11222     case EM_RX:
11223       return reloc_type == 1; /* R_RX_DIR32.  */
11224     case EM_S370:
11225       return reloc_type == 1; /* R_I370_ADDR31.  */
11226     case EM_S390_OLD:
11227     case EM_S390:
11228       return reloc_type == 4; /* R_S390_32.  */
11229     case EM_SCORE:
11230       return reloc_type == 8; /* R_SCORE_ABS32.  */
11231     case EM_SH:
11232       return reloc_type == 1; /* R_SH_DIR32.  */
11233     case EM_SPARC32PLUS:
11234     case EM_SPARCV9:
11235     case EM_SPARC:
11236       return reloc_type == 3 /* R_SPARC_32.  */
11237         || reloc_type == 23; /* R_SPARC_UA32.  */
11238     case EM_SPU:
11239       return reloc_type == 6; /* R_SPU_ADDR32 */
11240     case EM_TI_C6000:
11241       return reloc_type == 1; /* R_C6000_ABS32.  */
11242     case EM_TILEGX:
11243       return reloc_type == 2; /* R_TILEGX_32.  */
11244     case EM_TILEPRO:
11245       return reloc_type == 1; /* R_TILEPRO_32.  */
11246     case EM_CYGNUS_V850:
11247     case EM_V850:
11248       return reloc_type == 6; /* R_V850_ABS32.  */
11249     case EM_V800:
11250       return reloc_type == 0x33; /* R_V810_WORD.  */
11251     case EM_VAX:
11252       return reloc_type == 1; /* R_VAX_32.  */
11253     case EM_VISIUM:
11254       return reloc_type == 3;  /* R_VISIUM_32. */
11255     case EM_X86_64:
11256     case EM_L1OM:
11257     case EM_K1OM:
11258       return reloc_type == 10; /* R_X86_64_32.  */
11259     case EM_XC16X:
11260     case EM_C166:
11261       return reloc_type == 3; /* R_XC16C_ABS_32.  */
11262     case EM_XGATE:
11263       return reloc_type == 4; /* R_XGATE_32.  */
11264     case EM_XSTORMY16:
11265       return reloc_type == 1; /* R_XSTROMY16_32.  */
11266     case EM_XTENSA_OLD:
11267     case EM_XTENSA:
11268       return reloc_type == 1; /* R_XTENSA_32.  */
11269     default:
11270       {
11271         static unsigned int prev_warn = 0;
11272
11273         /* Avoid repeating the same warning multiple times.  */
11274         if (prev_warn != elf_header.e_machine)
11275           error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
11276                  elf_header.e_machine);
11277         prev_warn = elf_header.e_machine;
11278         return FALSE;
11279       }
11280     }
11281 }
11282
11283 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11284    a 32-bit pc-relative RELA relocation used in DWARF debug sections.  */
11285
11286 static bfd_boolean
11287 is_32bit_pcrel_reloc (unsigned int reloc_type)
11288 {
11289   switch (elf_header.e_machine)
11290     {
11291     case EM_386:
11292     case EM_486:
11293       return reloc_type == 2;  /* R_386_PC32.  */
11294     case EM_68K:
11295       return reloc_type == 4;  /* R_68K_PC32.  */
11296     case EM_AARCH64:
11297       return reloc_type == 261; /* R_AARCH64_PREL32 */
11298     case EM_ADAPTEVA_EPIPHANY:
11299       return reloc_type == 6;
11300     case EM_ALPHA:
11301       return reloc_type == 10; /* R_ALPHA_SREL32.  */
11302     case EM_ARM:
11303       return reloc_type == 3;  /* R_ARM_REL32 */
11304     case EM_MICROBLAZE:
11305       return reloc_type == 2;  /* R_MICROBLAZE_32_PCREL.  */
11306     case EM_OR1K:
11307       return reloc_type == 9; /* R_OR1K_32_PCREL.  */
11308     case EM_PARISC:
11309       return reloc_type == 9;  /* R_PARISC_PCREL32.  */
11310     case EM_PPC:
11311       return reloc_type == 26; /* R_PPC_REL32.  */
11312     case EM_PPC64:
11313       return reloc_type == 26; /* R_PPC64_REL32.  */
11314     case EM_S390_OLD:
11315     case EM_S390:
11316       return reloc_type == 5;  /* R_390_PC32.  */
11317     case EM_SH:
11318       return reloc_type == 2;  /* R_SH_REL32.  */
11319     case EM_SPARC32PLUS:
11320     case EM_SPARCV9:
11321     case EM_SPARC:
11322       return reloc_type == 6;  /* R_SPARC_DISP32.  */
11323     case EM_SPU:
11324       return reloc_type == 13; /* R_SPU_REL32.  */
11325     case EM_TILEGX:
11326       return reloc_type == 6; /* R_TILEGX_32_PCREL.  */
11327     case EM_TILEPRO:
11328       return reloc_type == 4; /* R_TILEPRO_32_PCREL.  */
11329     case EM_VISIUM:
11330       return reloc_type == 6;  /* R_VISIUM_32_PCREL */
11331     case EM_X86_64:
11332     case EM_L1OM:
11333     case EM_K1OM:
11334       return reloc_type == 2;  /* R_X86_64_PC32.  */
11335     case EM_XTENSA_OLD:
11336     case EM_XTENSA:
11337       return reloc_type == 14; /* R_XTENSA_32_PCREL.  */
11338     default:
11339       /* Do not abort or issue an error message here.  Not all targets use
11340          pc-relative 32-bit relocs in their DWARF debug information and we
11341          have already tested for target coverage in is_32bit_abs_reloc.  A
11342          more helpful warning message will be generated by apply_relocations
11343          anyway, so just return.  */
11344       return FALSE;
11345     }
11346 }
11347
11348 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11349    a 64-bit absolute RELA relocation used in DWARF debug sections.  */
11350
11351 static bfd_boolean
11352 is_64bit_abs_reloc (unsigned int reloc_type)
11353 {
11354   switch (elf_header.e_machine)
11355     {
11356     case EM_AARCH64:
11357       return reloc_type == 257; /* R_AARCH64_ABS64.  */
11358     case EM_ALPHA:
11359       return reloc_type == 2; /* R_ALPHA_REFQUAD.  */
11360     case EM_IA_64:
11361       return reloc_type == 0x27; /* R_IA64_DIR64LSB.  */
11362     case EM_PARISC:
11363       return reloc_type == 80; /* R_PARISC_DIR64.  */
11364     case EM_PPC64:
11365       return reloc_type == 38; /* R_PPC64_ADDR64.  */
11366     case EM_SPARC32PLUS:
11367     case EM_SPARCV9:
11368     case EM_SPARC:
11369       return reloc_type == 54; /* R_SPARC_UA64.  */
11370     case EM_X86_64:
11371     case EM_L1OM:
11372     case EM_K1OM:
11373       return reloc_type == 1; /* R_X86_64_64.  */
11374     case EM_S390_OLD:
11375     case EM_S390:
11376       return reloc_type == 22;  /* R_S390_64.  */
11377     case EM_TILEGX:
11378       return reloc_type == 1; /* R_TILEGX_64.  */
11379     case EM_MIPS:
11380       return reloc_type == 18;  /* R_MIPS_64.  */
11381     default:
11382       return FALSE;
11383     }
11384 }
11385
11386 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
11387    a 64-bit pc-relative RELA relocation used in DWARF debug sections.  */
11388
11389 static bfd_boolean
11390 is_64bit_pcrel_reloc (unsigned int reloc_type)
11391 {
11392   switch (elf_header.e_machine)
11393     {
11394     case EM_AARCH64:
11395       return reloc_type == 260; /* R_AARCH64_PREL64.  */
11396     case EM_ALPHA:
11397       return reloc_type == 11; /* R_ALPHA_SREL64.  */
11398     case EM_IA_64:
11399       return reloc_type == 0x4f; /* R_IA64_PCREL64LSB.  */
11400     case EM_PARISC:
11401       return reloc_type == 72; /* R_PARISC_PCREL64.  */
11402     case EM_PPC64:
11403       return reloc_type == 44; /* R_PPC64_REL64.  */
11404     case EM_SPARC32PLUS:
11405     case EM_SPARCV9:
11406     case EM_SPARC:
11407       return reloc_type == 46; /* R_SPARC_DISP64.  */
11408     case EM_X86_64:
11409     case EM_L1OM:
11410     case EM_K1OM:
11411       return reloc_type == 24; /* R_X86_64_PC64.  */
11412     case EM_S390_OLD:
11413     case EM_S390:
11414       return reloc_type == 23;  /* R_S390_PC64.  */
11415     case EM_TILEGX:
11416       return reloc_type == 5;  /* R_TILEGX_64_PCREL.  */
11417     default:
11418       return FALSE;
11419     }
11420 }
11421
11422 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11423    a 24-bit absolute RELA relocation used in DWARF debug sections.  */
11424
11425 static bfd_boolean
11426 is_24bit_abs_reloc (unsigned int reloc_type)
11427 {
11428   switch (elf_header.e_machine)
11429     {
11430     case EM_CYGNUS_MN10200:
11431     case EM_MN10200:
11432       return reloc_type == 4; /* R_MN10200_24.  */
11433     default:
11434       return FALSE;
11435     }
11436 }
11437
11438 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11439    a 16-bit absolute RELA relocation used in DWARF debug sections.  */
11440
11441 static bfd_boolean
11442 is_16bit_abs_reloc (unsigned int reloc_type)
11443 {
11444   switch (elf_header.e_machine)
11445     {
11446     case EM_AVR_OLD:
11447     case EM_AVR:
11448       return reloc_type == 4; /* R_AVR_16.  */
11449     case EM_ADAPTEVA_EPIPHANY:
11450       return reloc_type == 5;
11451     case EM_CYGNUS_D10V:
11452     case EM_D10V:
11453       return reloc_type == 3; /* R_D10V_16.  */
11454     case EM_H8S:
11455     case EM_H8_300:
11456     case EM_H8_300H:
11457       return reloc_type == R_H8_DIR16;
11458     case EM_IP2K_OLD:
11459     case EM_IP2K:
11460       return reloc_type == 1; /* R_IP2K_16.  */
11461     case EM_M32C_OLD:
11462     case EM_M32C:
11463       return reloc_type == 1; /* R_M32C_16 */
11464     case EM_MSP430:
11465       if (uses_msp430x_relocs ())
11466         return reloc_type == 2; /* R_MSP430_ABS16.  */
11467     case EM_MSP430_OLD:
11468       return reloc_type == 5; /* R_MSP430_16_BYTE.  */
11469     case EM_NDS32:
11470       return reloc_type == 19; /* R_NDS32_RELA.  */
11471     case EM_ALTERA_NIOS2:
11472       return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16.  */
11473     case EM_NIOS32:
11474       return reloc_type == 9; /* R_NIOS_16.  */
11475     case EM_OR1K:
11476       return reloc_type == 2; /* R_OR1K_16.  */
11477     case EM_TI_C6000:
11478       return reloc_type == 2; /* R_C6000_ABS16.  */
11479     case EM_XC16X:
11480     case EM_C166:
11481       return reloc_type == 2; /* R_XC16C_ABS_16.  */
11482     case EM_CYGNUS_MN10200:
11483     case EM_MN10200:
11484       return reloc_type == 2; /* R_MN10200_16.  */
11485     case EM_CYGNUS_MN10300:
11486     case EM_MN10300:
11487       return reloc_type == 2; /* R_MN10300_16.  */
11488     case EM_VISIUM:
11489       return reloc_type == 2; /* R_VISIUM_16. */
11490     case EM_XGATE:
11491       return reloc_type == 3; /* R_XGATE_16.  */
11492     default:
11493       return FALSE;
11494     }
11495 }
11496
11497 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
11498    relocation entries (possibly formerly used for SHT_GROUP sections).  */
11499
11500 static bfd_boolean
11501 is_none_reloc (unsigned int reloc_type)
11502 {
11503   switch (elf_header.e_machine)
11504     {
11505     case EM_68K:     /* R_68K_NONE.  */
11506     case EM_386:     /* R_386_NONE.  */
11507     case EM_SPARC32PLUS:
11508     case EM_SPARCV9:
11509     case EM_SPARC:   /* R_SPARC_NONE.  */
11510     case EM_MIPS:    /* R_MIPS_NONE.  */
11511     case EM_PARISC:  /* R_PARISC_NONE.  */
11512     case EM_ALPHA:   /* R_ALPHA_NONE.  */
11513     case EM_ADAPTEVA_EPIPHANY:
11514     case EM_PPC:     /* R_PPC_NONE.  */
11515     case EM_PPC64:   /* R_PPC64_NONE.  */
11516     case EM_ARM:     /* R_ARM_NONE.  */
11517     case EM_IA_64:   /* R_IA64_NONE.  */
11518     case EM_SH:      /* R_SH_NONE.  */
11519     case EM_S390_OLD:
11520     case EM_S390:    /* R_390_NONE.  */
11521     case EM_CRIS:    /* R_CRIS_NONE.  */
11522     case EM_X86_64:  /* R_X86_64_NONE.  */
11523     case EM_L1OM:    /* R_X86_64_NONE.  */
11524     case EM_K1OM:    /* R_X86_64_NONE.  */
11525     case EM_MN10300: /* R_MN10300_NONE.  */
11526     case EM_FT32:    /* R_FT32_NONE.  */
11527     case EM_MOXIE:   /* R_MOXIE_NONE.  */
11528     case EM_M32R:    /* R_M32R_NONE.  */
11529     case EM_TI_C6000:/* R_C6000_NONE.  */
11530     case EM_TILEGX:  /* R_TILEGX_NONE.  */
11531     case EM_TILEPRO: /* R_TILEPRO_NONE.  */
11532     case EM_XC16X:
11533     case EM_C166:    /* R_XC16X_NONE.  */
11534     case EM_ALTERA_NIOS2: /* R_NIOS2_NONE.  */
11535     case EM_NIOS32:  /* R_NIOS_NONE.  */
11536     case EM_OR1K:    /* R_OR1K_NONE. */
11537       return reloc_type == 0;
11538     case EM_AARCH64:
11539       return reloc_type == 0 || reloc_type == 256;
11540     case EM_NDS32:
11541       return (reloc_type == 0       /* R_XTENSA_NONE.  */
11542               || reloc_type == 204  /* R_NDS32_DIFF8.  */
11543               || reloc_type == 205  /* R_NDS32_DIFF16.  */
11544               || reloc_type == 206  /* R_NDS32_DIFF32.  */
11545               || reloc_type == 207  /* R_NDS32_ULEB128.  */);
11546     case EM_XTENSA_OLD:
11547     case EM_XTENSA:
11548       return (reloc_type == 0      /* R_XTENSA_NONE.  */
11549               || reloc_type == 17  /* R_XTENSA_DIFF8.  */
11550               || reloc_type == 18  /* R_XTENSA_DIFF16.  */
11551               || reloc_type == 19  /* R_XTENSA_DIFF32.  */);
11552     case EM_METAG:
11553       return reloc_type == 3; /* R_METAG_NONE.  */
11554     }
11555   return FALSE;
11556 }
11557
11558 /* Apply relocations to a section.
11559    Note: So far support has been added only for those relocations
11560    which can be found in debug sections.
11561    FIXME: Add support for more relocations ?  */
11562
11563 static void
11564 apply_relocations (void * file,
11565                    Elf_Internal_Shdr * section,
11566                    unsigned char * start)
11567 {
11568   Elf_Internal_Shdr * relsec;
11569   unsigned char * end = start + section->sh_size;
11570
11571   if (elf_header.e_type != ET_REL)
11572     return;
11573
11574   /* Find the reloc section associated with the section.  */
11575   for (relsec = section_headers;
11576        relsec < section_headers + elf_header.e_shnum;
11577        ++relsec)
11578     {
11579       bfd_boolean is_rela;
11580       unsigned long num_relocs;
11581       Elf_Internal_Rela * relocs;
11582       Elf_Internal_Rela * rp;
11583       Elf_Internal_Shdr * symsec;
11584       Elf_Internal_Sym * symtab;
11585       unsigned long num_syms;
11586       Elf_Internal_Sym * sym;
11587
11588       if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
11589           || relsec->sh_info >= elf_header.e_shnum
11590           || section_headers + relsec->sh_info != section
11591           || relsec->sh_size == 0
11592           || relsec->sh_link >= elf_header.e_shnum)
11593         continue;
11594
11595       is_rela = relsec->sh_type == SHT_RELA;
11596
11597       if (is_rela)
11598         {
11599           if (!slurp_rela_relocs ((FILE *) file, relsec->sh_offset,
11600                                   relsec->sh_size, & relocs, & num_relocs))
11601             return;
11602         }
11603       else
11604         {
11605           if (!slurp_rel_relocs ((FILE *) file, relsec->sh_offset,
11606                                  relsec->sh_size, & relocs, & num_relocs))
11607             return;
11608         }
11609
11610       /* SH uses RELA but uses in place value instead of the addend field.  */
11611       if (elf_header.e_machine == EM_SH)
11612         is_rela = FALSE;
11613
11614       symsec = section_headers + relsec->sh_link;
11615       symtab = GET_ELF_SYMBOLS ((FILE *) file, symsec, & num_syms);
11616
11617       for (rp = relocs; rp < relocs + num_relocs; ++rp)
11618         {
11619           bfd_vma         addend;
11620           unsigned int    reloc_type;
11621           unsigned int    reloc_size;
11622           unsigned char * rloc;
11623           unsigned long   sym_index;
11624
11625           reloc_type = get_reloc_type (rp->r_info);
11626
11627           if (target_specific_reloc_handling (rp, start, symtab))
11628             continue;
11629           else if (is_none_reloc (reloc_type))
11630             continue;
11631           else if (is_32bit_abs_reloc (reloc_type)
11632                    || is_32bit_pcrel_reloc (reloc_type))
11633             reloc_size = 4;
11634           else if (is_64bit_abs_reloc (reloc_type)
11635                    || is_64bit_pcrel_reloc (reloc_type))
11636             reloc_size = 8;
11637           else if (is_24bit_abs_reloc (reloc_type))
11638             reloc_size = 3;
11639           else if (is_16bit_abs_reloc (reloc_type))
11640             reloc_size = 2;
11641           else
11642             {
11643               static unsigned int prev_reloc = 0;
11644               if (reloc_type != prev_reloc)
11645                 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
11646                       reloc_type, printable_section_name (section));
11647               prev_reloc = reloc_type;
11648               continue;
11649             }
11650
11651           rloc = start + rp->r_offset;
11652           if ((rloc + reloc_size) > end || (rloc < start))
11653             {
11654               warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
11655                     (unsigned long) rp->r_offset,
11656                     printable_section_name (section));
11657               continue;
11658             }
11659
11660           sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
11661           if (sym_index >= num_syms)
11662             {
11663               warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
11664                     sym_index, printable_section_name (section));
11665               continue;
11666             }
11667           sym = symtab + sym_index;
11668
11669           /* If the reloc has a symbol associated with it,
11670              make sure that it is of an appropriate type.
11671
11672              Relocations against symbols without type can happen.
11673              Gcc -feliminate-dwarf2-dups may generate symbols
11674              without type for debug info.
11675
11676              Icc generates relocations against function symbols
11677              instead of local labels.
11678
11679              Relocations against object symbols can happen, eg when
11680              referencing a global array.  For an example of this see
11681              the _clz.o binary in libgcc.a.  */
11682           if (sym != symtab
11683               && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
11684             {
11685               warn (_("skipping unexpected symbol type %s in %ld'th relocation in section %s\n"),
11686                     get_symbol_type (ELF_ST_TYPE (sym->st_info)),
11687                     (long int)(rp - relocs),
11688                     printable_section_name (relsec));
11689               continue;
11690             }
11691
11692           addend = 0;
11693           if (is_rela)
11694             addend += rp->r_addend;
11695           /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
11696              partial_inplace.  */
11697           if (!is_rela
11698               || (elf_header.e_machine == EM_XTENSA
11699                   && reloc_type == 1)
11700               || ((elf_header.e_machine == EM_PJ
11701                    || elf_header.e_machine == EM_PJ_OLD)
11702                   && reloc_type == 1)
11703               || ((elf_header.e_machine == EM_D30V
11704                    || elf_header.e_machine == EM_CYGNUS_D30V)
11705                   && reloc_type == 12))
11706             addend += byte_get (rloc, reloc_size);
11707
11708           if (is_32bit_pcrel_reloc (reloc_type)
11709               || is_64bit_pcrel_reloc (reloc_type))
11710             {
11711               /* On HPPA, all pc-relative relocations are biased by 8.  */
11712               if (elf_header.e_machine == EM_PARISC)
11713                 addend -= 8;
11714               byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
11715                         reloc_size);
11716             }
11717           else
11718             byte_put (rloc, addend + sym->st_value, reloc_size);
11719         }
11720
11721       free (symtab);
11722       free (relocs);
11723       break;
11724     }
11725 }
11726
11727 #ifdef SUPPORT_DISASSEMBLY
11728 static int
11729 disassemble_section (Elf_Internal_Shdr * section, FILE * file)
11730 {
11731   printf (_("\nAssembly dump of section %s\n"), printable_section_name (section));
11732
11733   /* FIXME: XXX -- to be done --- XXX */
11734
11735   return 1;
11736 }
11737 #endif
11738
11739 /* Reads in the contents of SECTION from FILE, returning a pointer
11740    to a malloc'ed buffer or NULL if something went wrong.  */
11741
11742 static char *
11743 get_section_contents (Elf_Internal_Shdr * section, FILE * file)
11744 {
11745   bfd_size_type num_bytes;
11746
11747   num_bytes = section->sh_size;
11748
11749   if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
11750     {
11751       printf (_("\nSection '%s' has no data to dump.\n"),
11752               printable_section_name (section));
11753       return NULL;
11754     }
11755
11756   return  (char *) get_data (NULL, file, section->sh_offset, 1, num_bytes,
11757                              _("section contents"));
11758 }
11759
11760
11761 static void
11762 dump_section_as_strings (Elf_Internal_Shdr * section, FILE * file)
11763 {
11764   Elf_Internal_Shdr * relsec;
11765   bfd_size_type num_bytes;
11766   char * data;
11767   char * end;
11768   char * start;
11769   bfd_boolean some_strings_shown;
11770
11771   start = get_section_contents (section, file);
11772   if (start == NULL)
11773     return;
11774
11775   printf (_("\nString dump of section '%s':\n"), printable_section_name (section));
11776
11777   /* If the section being dumped has relocations against it the user might
11778      be expecting these relocations to have been applied.  Check for this
11779      case and issue a warning message in order to avoid confusion.
11780      FIXME: Maybe we ought to have an option that dumps a section with
11781      relocs applied ?  */
11782   for (relsec = section_headers;
11783        relsec < section_headers + elf_header.e_shnum;
11784        ++relsec)
11785     {
11786       if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
11787           || relsec->sh_info >= elf_header.e_shnum
11788           || section_headers + relsec->sh_info != section
11789           || relsec->sh_size == 0
11790           || relsec->sh_link >= elf_header.e_shnum)
11791         continue;
11792
11793       printf (_("  Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
11794       break;
11795     }
11796
11797   num_bytes = section->sh_size;
11798   data = start;
11799   end  = start + num_bytes;
11800   some_strings_shown = FALSE;
11801
11802   while (data < end)
11803     {
11804       while (!ISPRINT (* data))
11805         if (++ data >= end)
11806           break;
11807
11808       if (data < end)
11809         {
11810           size_t maxlen = end - data;
11811
11812 #ifndef __MSVCRT__
11813           /* PR 11128: Use two separate invocations in order to work
11814              around bugs in the Solaris 8 implementation of printf.  */
11815           printf ("  [%6tx]  ", data - start);
11816 #else
11817           printf ("  [%6Ix]  ", (size_t) (data - start));
11818 #endif
11819           if (maxlen > 0)
11820             {
11821               print_symbol ((int) maxlen, data);
11822               putchar ('\n');
11823               data += strnlen (data, maxlen);
11824             }
11825           else
11826             {
11827               printf (_("<corrupt>\n"));
11828               data = end;
11829             }
11830           some_strings_shown = TRUE;
11831         }
11832     }
11833
11834   if (! some_strings_shown)
11835     printf (_("  No strings found in this section."));
11836
11837   free (start);
11838
11839   putchar ('\n');
11840 }
11841
11842 static void
11843 dump_section_as_bytes (Elf_Internal_Shdr * section,
11844                        FILE * file,
11845                        bfd_boolean relocate)
11846 {
11847   Elf_Internal_Shdr * relsec;
11848   bfd_size_type bytes;
11849   bfd_vma addr;
11850   unsigned char * data;
11851   unsigned char * start;
11852
11853   start = (unsigned char *) get_section_contents (section, file);
11854   if (start == NULL)
11855     return;
11856
11857   printf (_("\nHex dump of section '%s':\n"), printable_section_name (section));
11858
11859   if (relocate)
11860     {
11861       apply_relocations (file, section, start);
11862     }
11863   else
11864     {
11865       /* If the section being dumped has relocations against it the user might
11866          be expecting these relocations to have been applied.  Check for this
11867          case and issue a warning message in order to avoid confusion.
11868          FIXME: Maybe we ought to have an option that dumps a section with
11869          relocs applied ?  */
11870       for (relsec = section_headers;
11871            relsec < section_headers + elf_header.e_shnum;
11872            ++relsec)
11873         {
11874           if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
11875               || relsec->sh_info >= elf_header.e_shnum
11876               || section_headers + relsec->sh_info != section
11877               || relsec->sh_size == 0
11878               || relsec->sh_link >= elf_header.e_shnum)
11879             continue;
11880
11881           printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
11882           break;
11883         }
11884     }
11885
11886   addr = section->sh_addr;
11887   bytes = section->sh_size;
11888   data = start;
11889
11890   while (bytes)
11891     {
11892       int j;
11893       int k;
11894       int lbytes;
11895
11896       lbytes = (bytes > 16 ? 16 : bytes);
11897
11898       printf ("  0x%8.8lx ", (unsigned long) addr);
11899
11900       for (j = 0; j < 16; j++)
11901         {
11902           if (j < lbytes)
11903             printf ("%2.2x", data[j]);
11904           else
11905             printf ("  ");
11906
11907           if ((j & 3) == 3)
11908             printf (" ");
11909         }
11910
11911       for (j = 0; j < lbytes; j++)
11912         {
11913           k = data[j];
11914           if (k >= ' ' && k < 0x7f)
11915             printf ("%c", k);
11916           else
11917             printf (".");
11918         }
11919
11920       putchar ('\n');
11921
11922       data  += lbytes;
11923       addr  += lbytes;
11924       bytes -= lbytes;
11925     }
11926
11927   free (start);
11928
11929   putchar ('\n');
11930 }
11931
11932 /* Uncompresses a section that was compressed using zlib, in place.  */
11933
11934 static int
11935 uncompress_section_contents (unsigned char **buffer ATTRIBUTE_UNUSED,
11936                              dwarf_size_type *size ATTRIBUTE_UNUSED)
11937 {
11938 #ifndef HAVE_ZLIB_H
11939   return FALSE;
11940 #else
11941   dwarf_size_type compressed_size = *size;
11942   unsigned char * compressed_buffer = *buffer;
11943   dwarf_size_type uncompressed_size;
11944   unsigned char * uncompressed_buffer;
11945   z_stream strm;
11946   int rc;
11947   dwarf_size_type header_size = 12;
11948
11949   /* Read the zlib header.  In this case, it should be "ZLIB" followed
11950      by the uncompressed section size, 8 bytes in big-endian order.  */
11951   if (compressed_size < header_size
11952       || ! streq ((char *) compressed_buffer, "ZLIB"))
11953     return 0;
11954
11955   uncompressed_size = compressed_buffer[4]; uncompressed_size <<= 8;
11956   uncompressed_size += compressed_buffer[5]; uncompressed_size <<= 8;
11957   uncompressed_size += compressed_buffer[6]; uncompressed_size <<= 8;
11958   uncompressed_size += compressed_buffer[7]; uncompressed_size <<= 8;
11959   uncompressed_size += compressed_buffer[8]; uncompressed_size <<= 8;
11960   uncompressed_size += compressed_buffer[9]; uncompressed_size <<= 8;
11961   uncompressed_size += compressed_buffer[10]; uncompressed_size <<= 8;
11962   uncompressed_size += compressed_buffer[11];
11963
11964   /* It is possible the section consists of several compressed
11965      buffers concatenated together, so we uncompress in a loop.  */
11966   strm.zalloc = NULL;
11967   strm.zfree = NULL;
11968   strm.opaque = NULL;
11969   strm.avail_in = compressed_size - header_size;
11970   strm.next_in = (Bytef *) compressed_buffer + header_size;
11971   strm.avail_out = uncompressed_size;
11972   uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
11973
11974   rc = inflateInit (& strm);
11975   while (strm.avail_in > 0)
11976     {
11977       if (rc != Z_OK)
11978         goto fail;
11979       strm.next_out = ((Bytef *) uncompressed_buffer
11980                        + (uncompressed_size - strm.avail_out));
11981       rc = inflate (&strm, Z_FINISH);
11982       if (rc != Z_STREAM_END)
11983         goto fail;
11984       rc = inflateReset (& strm);
11985     }
11986   rc = inflateEnd (& strm);
11987   if (rc != Z_OK
11988       || strm.avail_out != 0)
11989     goto fail;
11990
11991   free (compressed_buffer);
11992   *buffer = uncompressed_buffer;
11993   *size = uncompressed_size;
11994   return 1;
11995
11996  fail:
11997   free (uncompressed_buffer);
11998   /* Indicate decompression failure.  */
11999   *buffer = NULL;
12000   return 0;
12001 #endif  /* HAVE_ZLIB_H */
12002 }
12003
12004 static int
12005 load_specific_debug_section (enum dwarf_section_display_enum debug,
12006                              Elf_Internal_Shdr * sec, void * file)
12007 {
12008   struct dwarf_section * section = &debug_displays [debug].section;
12009   char buf [64];
12010
12011   /* If it is already loaded, do nothing.  */
12012   if (section->start != NULL)
12013     return 1;
12014
12015   snprintf (buf, sizeof (buf), _("%s section data"), section->name);
12016   section->address = sec->sh_addr;
12017   section->user_data = NULL;
12018   section->start = (unsigned char *) get_data (NULL, (FILE *) file,
12019                                                sec->sh_offset, 1,
12020                                                sec->sh_size, buf);
12021   if (section->start == NULL)
12022     section->size = 0;
12023   else
12024     {
12025       section->size = sec->sh_size;
12026       if (uncompress_section_contents (&section->start, &section->size))
12027         sec->sh_size = section->size;
12028     }
12029
12030   if (section->start == NULL)
12031     return 0;
12032
12033   if (debug_displays [debug].relocate)
12034     apply_relocations ((FILE *) file, sec, section->start);
12035
12036   return 1;
12037 }
12038
12039 /* If this is not NULL, load_debug_section will only look for sections
12040    within the list of sections given here.  */
12041 unsigned int *section_subset = NULL;
12042
12043 int
12044 load_debug_section (enum dwarf_section_display_enum debug, void * file)
12045 {
12046   struct dwarf_section * section = &debug_displays [debug].section;
12047   Elf_Internal_Shdr * sec;
12048
12049   /* Locate the debug section.  */
12050   sec = find_section_in_set (section->uncompressed_name, section_subset);
12051   if (sec != NULL)
12052     section->name = section->uncompressed_name;
12053   else
12054     {
12055       sec = find_section_in_set (section->compressed_name, section_subset);
12056       if (sec != NULL)
12057         section->name = section->compressed_name;
12058     }
12059   if (sec == NULL)
12060     return 0;
12061
12062   /* If we're loading from a subset of sections, and we've loaded
12063      a section matching this name before, it's likely that it's a
12064      different one.  */
12065   if (section_subset != NULL)
12066     free_debug_section (debug);
12067
12068   return load_specific_debug_section (debug, sec, (FILE *) file);
12069 }
12070
12071 void
12072 free_debug_section (enum dwarf_section_display_enum debug)
12073 {
12074   struct dwarf_section * section = &debug_displays [debug].section;
12075
12076   if (section->start == NULL)
12077     return;
12078
12079   free ((char *) section->start);
12080   section->start = NULL;
12081   section->address = 0;
12082   section->size = 0;
12083 }
12084
12085 static int
12086 display_debug_section (int shndx, Elf_Internal_Shdr * section, FILE * file)
12087 {
12088   char * name = SECTION_NAME (section);
12089   const char * print_name = printable_section_name (section);
12090   bfd_size_type length;
12091   int result = 1;
12092   int i;
12093
12094   length = section->sh_size;
12095   if (length == 0)
12096     {
12097       printf (_("\nSection '%s' has no debugging data.\n"), print_name);
12098       return 0;
12099     }
12100   if (section->sh_type == SHT_NOBITS)
12101     {
12102       /* There is no point in dumping the contents of a debugging section
12103          which has the NOBITS type - the bits in the file will be random.
12104          This can happen when a file containing a .eh_frame section is
12105          stripped with the --only-keep-debug command line option.  */
12106       printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"),
12107               print_name);
12108       return 0;
12109     }
12110
12111   if (const_strneq (name, ".gnu.linkonce.wi."))
12112     name = ".debug_info";
12113
12114   /* See if we know how to display the contents of this section.  */
12115   for (i = 0; i < max; i++)
12116     if (streq (debug_displays[i].section.uncompressed_name, name)
12117         || (i == line && const_strneq (name, ".debug_line."))
12118         || streq (debug_displays[i].section.compressed_name, name))
12119       {
12120         struct dwarf_section * sec = &debug_displays [i].section;
12121         int secondary = (section != find_section (name));
12122
12123         if (secondary)
12124           free_debug_section ((enum dwarf_section_display_enum) i);
12125
12126         if (i == line && const_strneq (name, ".debug_line."))
12127           sec->name = name;
12128         else if (streq (sec->uncompressed_name, name))
12129           sec->name = sec->uncompressed_name;
12130         else
12131           sec->name = sec->compressed_name;
12132         if (load_specific_debug_section ((enum dwarf_section_display_enum) i,
12133                                          section, file))
12134           {
12135             /* If this debug section is part of a CU/TU set in a .dwp file,
12136                restrict load_debug_section to the sections in that set.  */
12137             section_subset = find_cu_tu_set (file, shndx);
12138
12139             result &= debug_displays[i].display (sec, file);
12140
12141             section_subset = NULL;
12142
12143             if (secondary || (i != info && i != abbrev))
12144               free_debug_section ((enum dwarf_section_display_enum) i);
12145           }
12146
12147         break;
12148       }
12149
12150   if (i == max)
12151     {
12152       printf (_("Unrecognized debug section: %s\n"), print_name);
12153       result = 0;
12154     }
12155
12156   return result;
12157 }
12158
12159 /* Set DUMP_SECTS for all sections where dumps were requested
12160    based on section name.  */
12161
12162 static void
12163 initialise_dumps_byname (void)
12164 {
12165   struct dump_list_entry * cur;
12166
12167   for (cur = dump_sects_byname; cur; cur = cur->next)
12168     {
12169       unsigned int i;
12170       int any;
12171
12172       for (i = 0, any = 0; i < elf_header.e_shnum; i++)
12173         if (streq (SECTION_NAME (section_headers + i), cur->name))
12174           {
12175             request_dump_bynumber (i, cur->type);
12176             any = 1;
12177           }
12178
12179       if (!any)
12180         warn (_("Section '%s' was not dumped because it does not exist!\n"),
12181               cur->name);
12182     }
12183 }
12184
12185 static void
12186 process_section_contents (FILE * file)
12187 {
12188   Elf_Internal_Shdr * section;
12189   unsigned int i;
12190
12191   if (! do_dump)
12192     return;
12193
12194   initialise_dumps_byname ();
12195
12196   for (i = 0, section = section_headers;
12197        i < elf_header.e_shnum && i < num_dump_sects;
12198        i++, section++)
12199     {
12200 #ifdef SUPPORT_DISASSEMBLY
12201       if (dump_sects[i] & DISASS_DUMP)
12202         disassemble_section (section, file);
12203 #endif
12204       if (dump_sects[i] & HEX_DUMP)
12205         dump_section_as_bytes (section, file, FALSE);
12206
12207       if (dump_sects[i] & RELOC_DUMP)
12208         dump_section_as_bytes (section, file, TRUE);
12209
12210       if (dump_sects[i] & STRING_DUMP)
12211         dump_section_as_strings (section, file);
12212
12213       if (dump_sects[i] & DEBUG_DUMP)
12214         display_debug_section (i, section, file);
12215     }
12216
12217   /* Check to see if the user requested a
12218      dump of a section that does not exist.  */
12219   while (i++ < num_dump_sects)
12220     if (dump_sects[i])
12221       warn (_("Section %d was not dumped because it does not exist!\n"), i);
12222 }
12223
12224 static void
12225 process_mips_fpe_exception (int mask)
12226 {
12227   if (mask)
12228     {
12229       int first = 1;
12230       if (mask & OEX_FPU_INEX)
12231         fputs ("INEX", stdout), first = 0;
12232       if (mask & OEX_FPU_UFLO)
12233         printf ("%sUFLO", first ? "" : "|"), first = 0;
12234       if (mask & OEX_FPU_OFLO)
12235         printf ("%sOFLO", first ? "" : "|"), first = 0;
12236       if (mask & OEX_FPU_DIV0)
12237         printf ("%sDIV0", first ? "" : "|"), first = 0;
12238       if (mask & OEX_FPU_INVAL)
12239         printf ("%sINVAL", first ? "" : "|");
12240     }
12241   else
12242     fputs ("0", stdout);
12243 }
12244
12245 /* Display's the value of TAG at location P.  If TAG is
12246    greater than 0 it is assumed to be an unknown tag, and
12247    a message is printed to this effect.  Otherwise it is
12248    assumed that a message has already been printed.
12249
12250    If the bottom bit of TAG is set it assumed to have a
12251    string value, otherwise it is assumed to have an integer
12252    value.
12253
12254    Returns an updated P pointing to the first unread byte
12255    beyond the end of TAG's value.
12256
12257    Reads at or beyond END will not be made.  */
12258
12259 static unsigned char *
12260 display_tag_value (int tag,
12261                    unsigned char * p,
12262                    const unsigned char * const end)
12263 {
12264   unsigned long val;
12265
12266   if (tag > 0)
12267     printf ("  Tag_unknown_%d: ", tag);
12268
12269   if (p >= end)
12270     {
12271       warn (_("<corrupt tag>\n"));
12272     }
12273   else if (tag & 1)
12274     {
12275       /* PR 17531 file: 027-19978-0.004.  */
12276       size_t maxlen = (end - p) - 1;
12277
12278       putchar ('"');
12279       if (maxlen > 0)
12280         {
12281           print_symbol ((int) maxlen, (const char *) p);
12282           p += strnlen ((char *) p, maxlen) + 1;
12283         }
12284       else
12285         {
12286           printf (_("<corrupt string tag>"));
12287           p = (unsigned char *) end;
12288         }
12289       printf ("\"\n");
12290     }
12291   else
12292     {
12293       unsigned int len;
12294
12295       val = read_uleb128 (p, &len, end);
12296       p += len;
12297       printf ("%ld (0x%lx)\n", val, val);
12298     }
12299
12300   assert (p <= end);
12301   return p;
12302 }
12303
12304 /* ARM EABI attributes section.  */
12305 typedef struct
12306 {
12307   unsigned int tag;
12308   const char * name;
12309   /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup.  */
12310   unsigned int type;
12311   const char ** table;
12312 } arm_attr_public_tag;
12313
12314 static const char * arm_attr_tag_CPU_arch[] =
12315   {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
12316    "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8"};
12317 static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
12318 static const char * arm_attr_tag_THUMB_ISA_use[] =
12319   {"No", "Thumb-1", "Thumb-2"};
12320 static const char * arm_attr_tag_FP_arch[] =
12321   {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
12322    "FP for ARMv8", "FPv5/FP-D16 for ARMv8"};
12323 static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
12324 static const char * arm_attr_tag_Advanced_SIMD_arch[] =
12325   {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8"};
12326 static const char * arm_attr_tag_PCS_config[] =
12327   {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
12328    "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
12329 static const char * arm_attr_tag_ABI_PCS_R9_use[] =
12330   {"V6", "SB", "TLS", "Unused"};
12331 static const char * arm_attr_tag_ABI_PCS_RW_data[] =
12332   {"Absolute", "PC-relative", "SB-relative", "None"};
12333 static const char * arm_attr_tag_ABI_PCS_RO_data[] =
12334   {"Absolute", "PC-relative", "None"};
12335 static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
12336   {"None", "direct", "GOT-indirect"};
12337 static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
12338   {"None", "??? 1", "2", "??? 3", "4"};
12339 static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
12340 static const char * arm_attr_tag_ABI_FP_denormal[] =
12341   {"Unused", "Needed", "Sign only"};
12342 static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
12343 static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
12344 static const char * arm_attr_tag_ABI_FP_number_model[] =
12345   {"Unused", "Finite", "RTABI", "IEEE 754"};
12346 static const char * arm_attr_tag_ABI_enum_size[] =
12347   {"Unused", "small", "int", "forced to int"};
12348 static const char * arm_attr_tag_ABI_HardFP_use[] =
12349   {"As Tag_FP_arch", "SP only", "DP only", "SP and DP"};
12350 static const char * arm_attr_tag_ABI_VFP_args[] =
12351   {"AAPCS", "VFP registers", "custom", "compatible"};
12352 static const char * arm_attr_tag_ABI_WMMX_args[] =
12353   {"AAPCS", "WMMX registers", "custom"};
12354 static const char * arm_attr_tag_ABI_optimization_goals[] =
12355   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
12356     "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
12357 static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
12358   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
12359     "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
12360 static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
12361 static const char * arm_attr_tag_FP_HP_extension[] =
12362   {"Not Allowed", "Allowed"};
12363 static const char * arm_attr_tag_ABI_FP_16bit_format[] =
12364   {"None", "IEEE 754", "Alternative Format"};
12365 static const char * arm_attr_tag_MPextension_use[] =
12366   {"Not Allowed", "Allowed"};
12367 static const char * arm_attr_tag_DIV_use[] =
12368   {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
12369     "Allowed in v7-A with integer division extension"};
12370 static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
12371 static const char * arm_attr_tag_Virtualization_use[] =
12372   {"Not Allowed", "TrustZone", "Virtualization Extensions",
12373     "TrustZone and Virtualization Extensions"};
12374 static const char * arm_attr_tag_MPextension_use_legacy[] =
12375   {"Not Allowed", "Allowed"};
12376
12377 #define LOOKUP(id, name) \
12378   {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
12379 static arm_attr_public_tag arm_attr_public_tags[] =
12380 {
12381   {4, "CPU_raw_name", 1, NULL},
12382   {5, "CPU_name", 1, NULL},
12383   LOOKUP(6, CPU_arch),
12384   {7, "CPU_arch_profile", 0, NULL},
12385   LOOKUP(8, ARM_ISA_use),
12386   LOOKUP(9, THUMB_ISA_use),
12387   LOOKUP(10, FP_arch),
12388   LOOKUP(11, WMMX_arch),
12389   LOOKUP(12, Advanced_SIMD_arch),
12390   LOOKUP(13, PCS_config),
12391   LOOKUP(14, ABI_PCS_R9_use),
12392   LOOKUP(15, ABI_PCS_RW_data),
12393   LOOKUP(16, ABI_PCS_RO_data),
12394   LOOKUP(17, ABI_PCS_GOT_use),
12395   LOOKUP(18, ABI_PCS_wchar_t),
12396   LOOKUP(19, ABI_FP_rounding),
12397   LOOKUP(20, ABI_FP_denormal),
12398   LOOKUP(21, ABI_FP_exceptions),
12399   LOOKUP(22, ABI_FP_user_exceptions),
12400   LOOKUP(23, ABI_FP_number_model),
12401   {24, "ABI_align_needed", 0, NULL},
12402   {25, "ABI_align_preserved", 0, NULL},
12403   LOOKUP(26, ABI_enum_size),
12404   LOOKUP(27, ABI_HardFP_use),
12405   LOOKUP(28, ABI_VFP_args),
12406   LOOKUP(29, ABI_WMMX_args),
12407   LOOKUP(30, ABI_optimization_goals),
12408   LOOKUP(31, ABI_FP_optimization_goals),
12409   {32, "compatibility", 0, NULL},
12410   LOOKUP(34, CPU_unaligned_access),
12411   LOOKUP(36, FP_HP_extension),
12412   LOOKUP(38, ABI_FP_16bit_format),
12413   LOOKUP(42, MPextension_use),
12414   LOOKUP(44, DIV_use),
12415   {64, "nodefaults", 0, NULL},
12416   {65, "also_compatible_with", 0, NULL},
12417   LOOKUP(66, T2EE_use),
12418   {67, "conformance", 1, NULL},
12419   LOOKUP(68, Virtualization_use),
12420   LOOKUP(70, MPextension_use_legacy)
12421 };
12422 #undef LOOKUP
12423
12424 static unsigned char *
12425 display_arm_attribute (unsigned char * p,
12426                        const unsigned char * const end)
12427 {
12428   unsigned int tag;
12429   unsigned int len;
12430   unsigned int val;
12431   arm_attr_public_tag * attr;
12432   unsigned i;
12433   unsigned int type;
12434
12435   tag = read_uleb128 (p, &len, end);
12436   p += len;
12437   attr = NULL;
12438   for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
12439     {
12440       if (arm_attr_public_tags[i].tag == tag)
12441         {
12442           attr = &arm_attr_public_tags[i];
12443           break;
12444         }
12445     }
12446
12447   if (attr)
12448     {
12449       printf ("  Tag_%s: ", attr->name);
12450       switch (attr->type)
12451         {
12452         case 0:
12453           switch (tag)
12454             {
12455             case 7: /* Tag_CPU_arch_profile.  */
12456               val = read_uleb128 (p, &len, end);
12457               p += len;
12458               switch (val)
12459                 {
12460                 case 0: printf (_("None\n")); break;
12461                 case 'A': printf (_("Application\n")); break;
12462                 case 'R': printf (_("Realtime\n")); break;
12463                 case 'M': printf (_("Microcontroller\n")); break;
12464                 case 'S': printf (_("Application or Realtime\n")); break;
12465                 default: printf ("??? (%d)\n", val); break;
12466                 }
12467               break;
12468
12469             case 24: /* Tag_align_needed.  */
12470               val = read_uleb128 (p, &len, end);
12471               p += len;
12472               switch (val)
12473                 {
12474                 case 0: printf (_("None\n")); break;
12475                 case 1: printf (_("8-byte\n")); break;
12476                 case 2: printf (_("4-byte\n")); break;
12477                 case 3: printf ("??? 3\n"); break;
12478                 default:
12479                   if (val <= 12)
12480                     printf (_("8-byte and up to %d-byte extended\n"),
12481                             1 << val);
12482                   else
12483                     printf ("??? (%d)\n", val);
12484                   break;
12485                 }
12486               break;
12487
12488             case 25: /* Tag_align_preserved.  */
12489               val = read_uleb128 (p, &len, end);
12490               p += len;
12491               switch (val)
12492                 {
12493                 case 0: printf (_("None\n")); break;
12494                 case 1: printf (_("8-byte, except leaf SP\n")); break;
12495                 case 2: printf (_("8-byte\n")); break;
12496                 case 3: printf ("??? 3\n"); break;
12497                 default:
12498                   if (val <= 12)
12499                     printf (_("8-byte and up to %d-byte extended\n"),
12500                             1 << val);
12501                   else
12502                     printf ("??? (%d)\n", val);
12503                   break;
12504                 }
12505               break;
12506
12507             case 32: /* Tag_compatibility.  */
12508               {
12509                 val = read_uleb128 (p, &len, end);
12510                 p += len;
12511                 printf (_("flag = %d, vendor = "), val);
12512                 if (p < end - 1)
12513                   {
12514                     size_t maxlen = (end - p) - 1;
12515
12516                     print_symbol ((int) maxlen, (const char *) p);
12517                     p += strnlen ((char *) p, maxlen) + 1;
12518                   }
12519                 else
12520                   {
12521                     printf (_("<corrupt>"));
12522                     p = (unsigned char *) end;
12523                   }
12524                 putchar ('\n');
12525               }
12526               break;
12527
12528             case 64: /* Tag_nodefaults.  */
12529               /* PR 17531: file: 001-505008-0.01.  */
12530               if (p < end)
12531                 p++;
12532               printf (_("True\n"));
12533               break;
12534
12535             case 65: /* Tag_also_compatible_with.  */
12536               val = read_uleb128 (p, &len, end);
12537               p += len;
12538               if (val == 6 /* Tag_CPU_arch.  */)
12539                 {
12540                   val = read_uleb128 (p, &len, end);
12541                   p += len;
12542                   if ((unsigned int) val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
12543                     printf ("??? (%d)\n", val);
12544                   else
12545                     printf ("%s\n", arm_attr_tag_CPU_arch[val]);
12546                 }
12547               else
12548                 printf ("???\n");
12549               while (p < end && *(p++) != '\0' /* NUL terminator.  */)
12550                 ;
12551               break;
12552
12553             default:
12554               printf (_("<unknown: %d>\n"), tag);
12555               break;
12556             }
12557           return p;
12558
12559         case 1:
12560           return display_tag_value (-1, p, end);
12561         case 2:
12562           return display_tag_value (0, p, end);
12563
12564         default:
12565           assert (attr->type & 0x80);
12566           val = read_uleb128 (p, &len, end);
12567           p += len;
12568           type = attr->type & 0x7f;
12569           if (val >= type)
12570             printf ("??? (%d)\n", val);
12571           else
12572             printf ("%s\n", attr->table[val]);
12573           return p;
12574         }
12575     }
12576
12577   return display_tag_value (tag, p, end);
12578 }
12579
12580 static unsigned char *
12581 display_gnu_attribute (unsigned char * p,
12582                        unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const),
12583                        const unsigned char * const end)
12584 {
12585   int tag;
12586   unsigned int len;
12587   int val;
12588
12589   tag = read_uleb128 (p, &len, end);
12590   p += len;
12591
12592   /* Tag_compatibility is the only generic GNU attribute defined at
12593      present.  */
12594   if (tag == 32)
12595     {
12596       val = read_uleb128 (p, &len, end);
12597       p += len;
12598
12599       printf (_("flag = %d, vendor = "), val);
12600       if (p == end)
12601         {
12602           printf (_("<corrupt>\n"));
12603           warn (_("corrupt vendor attribute\n"));
12604         }
12605       else
12606         {
12607           if (p < end - 1)
12608             {
12609               size_t maxlen = (end - p) - 1;
12610
12611               print_symbol ((int) maxlen, (const char *) p);
12612               p += strnlen ((char *) p, maxlen) + 1;
12613             }
12614           else
12615             {
12616               printf (_("<corrupt>"));
12617               p = (unsigned char *) end;
12618             }
12619           putchar ('\n');
12620         }
12621       return p;
12622     }
12623
12624   if ((tag & 2) == 0 && display_proc_gnu_attribute)
12625     return display_proc_gnu_attribute (p, tag, end);
12626
12627   return display_tag_value (tag, p, end);
12628 }
12629
12630 static unsigned char *
12631 display_power_gnu_attribute (unsigned char * p,
12632                              int tag,
12633                              const unsigned char * const end)
12634 {
12635   unsigned int len;
12636   int val;
12637
12638   if (tag == Tag_GNU_Power_ABI_FP)
12639     {
12640       val = read_uleb128 (p, &len, end);
12641       p += len;
12642       printf ("  Tag_GNU_Power_ABI_FP: ");
12643
12644       switch (val)
12645         {
12646         case 0:
12647           printf (_("Hard or soft float\n"));
12648           break;
12649         case 1:
12650           printf (_("Hard float\n"));
12651           break;
12652         case 2:
12653           printf (_("Soft float\n"));
12654           break;
12655         case 3:
12656           printf (_("Single-precision hard float\n"));
12657           break;
12658         default:
12659           printf ("??? (%d)\n", val);
12660           break;
12661         }
12662       return p;
12663    }
12664
12665   if (tag == Tag_GNU_Power_ABI_Vector)
12666     {
12667       val = read_uleb128 (p, &len, end);
12668       p += len;
12669       printf ("  Tag_GNU_Power_ABI_Vector: ");
12670       switch (val)
12671         {
12672         case 0:
12673           printf (_("Any\n"));
12674           break;
12675         case 1:
12676           printf (_("Generic\n"));
12677           break;
12678         case 2:
12679           printf ("AltiVec\n");
12680           break;
12681         case 3:
12682           printf ("SPE\n");
12683           break;
12684         default:
12685           printf ("??? (%d)\n", val);
12686           break;
12687         }
12688       return p;
12689    }
12690
12691   if (tag == Tag_GNU_Power_ABI_Struct_Return)
12692     {
12693       if (p == end)
12694         {
12695           warn (_("corrupt Tag_GNU_Power_ABI_Struct_Return\n"));
12696           return p;
12697         }
12698
12699       val = read_uleb128 (p, &len, end);
12700       p += len;
12701       printf ("  Tag_GNU_Power_ABI_Struct_Return: ");
12702       switch (val)
12703        {
12704        case 0:
12705          printf (_("Any\n"));
12706          break;
12707        case 1:
12708          printf ("r3/r4\n");
12709          break;
12710        case 2:
12711          printf (_("Memory\n"));
12712          break;
12713        default:
12714          printf ("??? (%d)\n", val);
12715          break;
12716        }
12717       return p;
12718     }
12719
12720   return display_tag_value (tag & 1, p, end);
12721 }
12722
12723 static void
12724 display_sparc_hwcaps (int mask)
12725 {
12726   if (mask)
12727     {
12728       int first = 1;
12729
12730       if (mask & ELF_SPARC_HWCAP_MUL32)
12731         fputs ("mul32", stdout), first = 0;
12732       if (mask & ELF_SPARC_HWCAP_DIV32)
12733         printf ("%sdiv32", first ? "" : "|"), first = 0;
12734       if (mask & ELF_SPARC_HWCAP_FSMULD)
12735         printf ("%sfsmuld", first ? "" : "|"), first = 0;
12736       if (mask & ELF_SPARC_HWCAP_V8PLUS)
12737         printf ("%sv8plus", first ? "" : "|"), first = 0;
12738       if (mask & ELF_SPARC_HWCAP_POPC)
12739         printf ("%spopc", first ? "" : "|"), first = 0;
12740       if (mask & ELF_SPARC_HWCAP_VIS)
12741         printf ("%svis", first ? "" : "|"), first = 0;
12742       if (mask & ELF_SPARC_HWCAP_VIS2)
12743         printf ("%svis2", first ? "" : "|"), first = 0;
12744       if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
12745         printf ("%sASIBlkInit", first ? "" : "|"), first = 0;
12746       if (mask & ELF_SPARC_HWCAP_FMAF)
12747         printf ("%sfmaf", first ? "" : "|"), first = 0;
12748       if (mask & ELF_SPARC_HWCAP_VIS3)
12749         printf ("%svis3", first ? "" : "|"), first = 0;
12750       if (mask & ELF_SPARC_HWCAP_HPC)
12751         printf ("%shpc", first ? "" : "|"), first = 0;
12752       if (mask & ELF_SPARC_HWCAP_RANDOM)
12753         printf ("%srandom", first ? "" : "|"), first = 0;
12754       if (mask & ELF_SPARC_HWCAP_TRANS)
12755         printf ("%strans", first ? "" : "|"), first = 0;
12756       if (mask & ELF_SPARC_HWCAP_FJFMAU)
12757         printf ("%sfjfmau", first ? "" : "|"), first = 0;
12758       if (mask & ELF_SPARC_HWCAP_IMA)
12759         printf ("%sima", first ? "" : "|"), first = 0;
12760       if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
12761         printf ("%scspare", first ? "" : "|"), first = 0;
12762     }
12763   else
12764     fputc ('0', stdout);
12765   fputc ('\n', stdout);
12766 }
12767
12768 static void
12769 display_sparc_hwcaps2 (int mask)
12770 {
12771   if (mask)
12772     {
12773       int first = 1;
12774
12775       if (mask & ELF_SPARC_HWCAP2_FJATHPLUS)
12776         fputs ("fjathplus", stdout), first = 0;
12777       if (mask & ELF_SPARC_HWCAP2_VIS3B)
12778         printf ("%svis3b", first ? "" : "|"), first = 0;
12779       if (mask & ELF_SPARC_HWCAP2_ADP)
12780         printf ("%sadp", first ? "" : "|"), first = 0;
12781       if (mask & ELF_SPARC_HWCAP2_SPARC5)
12782         printf ("%ssparc5", first ? "" : "|"), first = 0;
12783       if (mask & ELF_SPARC_HWCAP2_MWAIT)
12784         printf ("%smwait", first ? "" : "|"), first = 0;
12785       if (mask & ELF_SPARC_HWCAP2_XMPMUL)
12786         printf ("%sxmpmul", first ? "" : "|"), first = 0;
12787       if (mask & ELF_SPARC_HWCAP2_XMONT)
12788         printf ("%sxmont2", first ? "" : "|"), first = 0;
12789       if (mask & ELF_SPARC_HWCAP2_NSEC)
12790         printf ("%snsec", first ? "" : "|"), first = 0;
12791       if (mask & ELF_SPARC_HWCAP2_FJATHHPC)
12792         printf ("%sfjathhpc", first ? "" : "|"), first = 0;
12793       if (mask & ELF_SPARC_HWCAP2_FJDES)
12794         printf ("%sfjdes", first ? "" : "|"), first = 0;
12795       if (mask & ELF_SPARC_HWCAP2_FJAES)
12796         printf ("%sfjaes", first ? "" : "|"), first = 0;
12797     }
12798   else
12799     fputc ('0', stdout);
12800   fputc ('\n', stdout);
12801 }
12802
12803 static unsigned char *
12804 display_sparc_gnu_attribute (unsigned char * p,
12805                              int tag,
12806                              const unsigned char * const end)
12807 {
12808   unsigned int len;
12809   int val;
12810
12811   if (tag == Tag_GNU_Sparc_HWCAPS)
12812     {
12813       val = read_uleb128 (p, &len, end);
12814       p += len;
12815       printf ("  Tag_GNU_Sparc_HWCAPS: ");
12816       display_sparc_hwcaps (val);
12817       return p;
12818     }
12819   if (tag == Tag_GNU_Sparc_HWCAPS2)
12820     {
12821       val = read_uleb128 (p, &len, end);
12822       p += len;
12823       printf ("  Tag_GNU_Sparc_HWCAPS2: ");
12824       display_sparc_hwcaps2 (val);
12825       return p;
12826     }
12827
12828   return display_tag_value (tag, p, end);
12829 }
12830
12831 static void
12832 print_mips_fp_abi_value (int val)
12833 {
12834   switch (val)
12835     {
12836     case Val_GNU_MIPS_ABI_FP_ANY:
12837       printf (_("Hard or soft float\n"));
12838       break;
12839     case Val_GNU_MIPS_ABI_FP_DOUBLE:
12840       printf (_("Hard float (double precision)\n"));
12841       break;
12842     case Val_GNU_MIPS_ABI_FP_SINGLE:
12843       printf (_("Hard float (single precision)\n"));
12844       break;
12845     case Val_GNU_MIPS_ABI_FP_SOFT:
12846       printf (_("Soft float\n"));
12847       break;
12848     case Val_GNU_MIPS_ABI_FP_OLD_64:
12849       printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
12850       break;
12851     case Val_GNU_MIPS_ABI_FP_XX:
12852       printf (_("Hard float (32-bit CPU, Any FPU)\n"));
12853       break;
12854     case Val_GNU_MIPS_ABI_FP_64:
12855       printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
12856       break;
12857     case Val_GNU_MIPS_ABI_FP_64A:
12858       printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
12859       break;
12860     default:
12861       printf ("??? (%d)\n", val);
12862       break;
12863     }
12864 }
12865
12866 static unsigned char *
12867 display_mips_gnu_attribute (unsigned char * p,
12868                             int tag,
12869                             const unsigned char * const end)
12870 {
12871   if (tag == Tag_GNU_MIPS_ABI_FP)
12872     {
12873       unsigned int len;
12874       int val;
12875
12876       val = read_uleb128 (p, &len, end);
12877       p += len;
12878       printf ("  Tag_GNU_MIPS_ABI_FP: ");
12879
12880       print_mips_fp_abi_value (val);
12881
12882       return p;
12883    }
12884
12885   if (tag == Tag_GNU_MIPS_ABI_MSA)
12886     {
12887       unsigned int len;
12888       int val;
12889
12890       val = read_uleb128 (p, &len, end);
12891       p += len;
12892       printf ("  Tag_GNU_MIPS_ABI_MSA: ");
12893
12894       switch (val)
12895         {
12896         case Val_GNU_MIPS_ABI_MSA_ANY:
12897           printf (_("Any MSA or not\n"));
12898           break;
12899         case Val_GNU_MIPS_ABI_MSA_128:
12900           printf (_("128-bit MSA\n"));
12901           break;
12902         default:
12903           printf ("??? (%d)\n", val);
12904           break;
12905         }
12906       return p;
12907     }
12908
12909   return display_tag_value (tag & 1, p, end);
12910 }
12911
12912 static unsigned char *
12913 display_tic6x_attribute (unsigned char * p,
12914                          const unsigned char * const end)
12915 {
12916   int tag;
12917   unsigned int len;
12918   int val;
12919
12920   tag = read_uleb128 (p, &len, end);
12921   p += len;
12922
12923   switch (tag)
12924     {
12925     case Tag_ISA:
12926       val = read_uleb128 (p, &len, end);
12927       p += len;
12928       printf ("  Tag_ISA: ");
12929
12930       switch (val)
12931         {
12932         case C6XABI_Tag_ISA_none:
12933           printf (_("None\n"));
12934           break;
12935         case C6XABI_Tag_ISA_C62X:
12936           printf ("C62x\n");
12937           break;
12938         case C6XABI_Tag_ISA_C67X:
12939           printf ("C67x\n");
12940           break;
12941         case C6XABI_Tag_ISA_C67XP:
12942           printf ("C67x+\n");
12943           break;
12944         case C6XABI_Tag_ISA_C64X:
12945           printf ("C64x\n");
12946           break;
12947         case C6XABI_Tag_ISA_C64XP:
12948           printf ("C64x+\n");
12949           break;
12950         case C6XABI_Tag_ISA_C674X:
12951           printf ("C674x\n");
12952           break;
12953         default:
12954           printf ("??? (%d)\n", val);
12955           break;
12956         }
12957       return p;
12958
12959     case Tag_ABI_wchar_t:
12960       val = read_uleb128 (p, &len, end);
12961       p += len;
12962       printf ("  Tag_ABI_wchar_t: ");
12963       switch (val)
12964         {
12965         case 0:
12966           printf (_("Not used\n"));
12967           break;
12968         case 1:
12969           printf (_("2 bytes\n"));
12970           break;
12971         case 2:
12972           printf (_("4 bytes\n"));
12973           break;
12974         default:
12975           printf ("??? (%d)\n", val);
12976           break;
12977         }
12978       return p;
12979
12980     case Tag_ABI_stack_align_needed:
12981       val = read_uleb128 (p, &len, end);
12982       p += len;
12983       printf ("  Tag_ABI_stack_align_needed: ");
12984       switch (val)
12985         {
12986         case 0:
12987           printf (_("8-byte\n"));
12988           break;
12989         case 1:
12990           printf (_("16-byte\n"));
12991           break;
12992         default:
12993           printf ("??? (%d)\n", val);
12994           break;
12995         }
12996       return p;
12997
12998     case Tag_ABI_stack_align_preserved:
12999       val = read_uleb128 (p, &len, end);
13000       p += len;
13001       printf ("  Tag_ABI_stack_align_preserved: ");
13002       switch (val)
13003         {
13004         case 0:
13005           printf (_("8-byte\n"));
13006           break;
13007         case 1:
13008           printf (_("16-byte\n"));
13009           break;
13010         default:
13011           printf ("??? (%d)\n", val);
13012           break;
13013         }
13014       return p;
13015
13016     case Tag_ABI_DSBT:
13017       val = read_uleb128 (p, &len, end);
13018       p += len;
13019       printf ("  Tag_ABI_DSBT: ");
13020       switch (val)
13021         {
13022         case 0:
13023           printf (_("DSBT addressing not used\n"));
13024           break;
13025         case 1:
13026           printf (_("DSBT addressing used\n"));
13027           break;
13028         default:
13029           printf ("??? (%d)\n", val);
13030           break;
13031         }
13032       return p;
13033
13034     case Tag_ABI_PID:
13035       val = read_uleb128 (p, &len, end);
13036       p += len;
13037       printf ("  Tag_ABI_PID: ");
13038       switch (val)
13039         {
13040         case 0:
13041           printf (_("Data addressing position-dependent\n"));
13042           break;
13043         case 1:
13044           printf (_("Data addressing position-independent, GOT near DP\n"));
13045           break;
13046         case 2:
13047           printf (_("Data addressing position-independent, GOT far from DP\n"));
13048           break;
13049         default:
13050           printf ("??? (%d)\n", val);
13051           break;
13052         }
13053       return p;
13054
13055     case Tag_ABI_PIC:
13056       val = read_uleb128 (p, &len, end);
13057       p += len;
13058       printf ("  Tag_ABI_PIC: ");
13059       switch (val)
13060         {
13061         case 0:
13062           printf (_("Code addressing position-dependent\n"));
13063           break;
13064         case 1:
13065           printf (_("Code addressing position-independent\n"));
13066           break;
13067         default:
13068           printf ("??? (%d)\n", val);
13069           break;
13070         }
13071       return p;
13072
13073     case Tag_ABI_array_object_alignment:
13074       val = read_uleb128 (p, &len, end);
13075       p += len;
13076       printf ("  Tag_ABI_array_object_alignment: ");
13077       switch (val)
13078         {
13079         case 0:
13080           printf (_("8-byte\n"));
13081           break;
13082         case 1:
13083           printf (_("4-byte\n"));
13084           break;
13085         case 2:
13086           printf (_("16-byte\n"));
13087           break;
13088         default:
13089           printf ("??? (%d)\n", val);
13090           break;
13091         }
13092       return p;
13093
13094     case Tag_ABI_array_object_align_expected:
13095       val = read_uleb128 (p, &len, end);
13096       p += len;
13097       printf ("  Tag_ABI_array_object_align_expected: ");
13098       switch (val)
13099         {
13100         case 0:
13101           printf (_("8-byte\n"));
13102           break;
13103         case 1:
13104           printf (_("4-byte\n"));
13105           break;
13106         case 2:
13107           printf (_("16-byte\n"));
13108           break;
13109         default:
13110           printf ("??? (%d)\n", val);
13111           break;
13112         }
13113       return p;
13114
13115     case Tag_ABI_compatibility:
13116       {
13117         val = read_uleb128 (p, &len, end);
13118         p += len;
13119         printf ("  Tag_ABI_compatibility: ");
13120         printf (_("flag = %d, vendor = "), val);
13121         if (p < end - 1)
13122           {
13123             size_t maxlen = (end - p) - 1;
13124
13125             print_symbol ((int) maxlen, (const char *) p);
13126             p += strnlen ((char *) p, maxlen) + 1;
13127           }
13128         else
13129           {
13130             printf (_("<corrupt>"));
13131             p = (unsigned char *) end;
13132           }
13133         putchar ('\n');
13134         return p;
13135       }
13136
13137     case Tag_ABI_conformance:
13138       {
13139         printf ("  Tag_ABI_conformance: \"");
13140         if (p < end - 1)
13141           {
13142             size_t maxlen = (end - p) - 1;
13143
13144             print_symbol ((int) maxlen, (const char *) p);
13145             p += strnlen ((char *) p, maxlen) + 1;
13146           }
13147         else
13148           {
13149             printf (_("<corrupt>"));
13150             p = (unsigned char *) end;
13151           }
13152         printf ("\"\n");
13153         return p;
13154       }
13155     }
13156
13157   return display_tag_value (tag, p, end);
13158 }
13159
13160 static void
13161 display_raw_attribute (unsigned char * p, unsigned char * end)
13162 {
13163   unsigned long addr = 0;
13164   size_t bytes = end - p;
13165
13166   assert (end > p);
13167   while (bytes)
13168     {
13169       int j;
13170       int k;
13171       int lbytes = (bytes > 16 ? 16 : bytes);
13172
13173       printf ("  0x%8.8lx ", addr);
13174
13175       for (j = 0; j < 16; j++)
13176         {
13177           if (j < lbytes)
13178             printf ("%2.2x", p[j]);
13179           else
13180             printf ("  ");
13181
13182           if ((j & 3) == 3)
13183             printf (" ");
13184         }
13185
13186       for (j = 0; j < lbytes; j++)
13187         {
13188           k = p[j];
13189           if (k >= ' ' && k < 0x7f)
13190             printf ("%c", k);
13191           else
13192             printf (".");
13193         }
13194
13195       putchar ('\n');
13196
13197       p  += lbytes;
13198       bytes -= lbytes;
13199       addr += lbytes;
13200     }
13201
13202   putchar ('\n');
13203 }
13204
13205 static unsigned char *
13206 display_msp430x_attribute (unsigned char * p,
13207                            const unsigned char * const end)
13208 {
13209   unsigned int len;
13210   int val;
13211   int tag;
13212
13213   tag = read_uleb128 (p, & len, end);
13214   p += len;
13215
13216   switch (tag)
13217     {
13218     case OFBA_MSPABI_Tag_ISA:
13219       val = read_uleb128 (p, &len, end);
13220       p += len;
13221       printf ("  Tag_ISA: ");
13222       switch (val)
13223         {
13224         case 0: printf (_("None\n")); break;
13225         case 1: printf (_("MSP430\n")); break;
13226         case 2: printf (_("MSP430X\n")); break;
13227         default: printf ("??? (%d)\n", val); break;
13228         }
13229       break;
13230
13231     case OFBA_MSPABI_Tag_Code_Model:
13232       val = read_uleb128 (p, &len, end);
13233       p += len;
13234       printf ("  Tag_Code_Model: ");
13235       switch (val)
13236         {
13237         case 0: printf (_("None\n")); break;
13238         case 1: printf (_("Small\n")); break;
13239         case 2: printf (_("Large\n")); break;
13240         default: printf ("??? (%d)\n", val); break;
13241         }
13242       break;
13243
13244     case OFBA_MSPABI_Tag_Data_Model:
13245       val = read_uleb128 (p, &len, end);
13246       p += len;
13247       printf ("  Tag_Data_Model: ");
13248       switch (val)
13249         {
13250         case 0: printf (_("None\n")); break;
13251         case 1: printf (_("Small\n")); break;
13252         case 2: printf (_("Large\n")); break;
13253         case 3: printf (_("Restricted Large\n")); break;
13254         default: printf ("??? (%d)\n", val); break;
13255         }
13256       break;
13257
13258     default:
13259       printf (_("  <unknown tag %d>: "), tag);
13260
13261       if (tag & 1)
13262         {
13263           putchar ('"');
13264           if (p < end - 1)
13265             {
13266               size_t maxlen = (end - p) - 1;
13267
13268               print_symbol ((int) maxlen, (const char *) p);
13269               p += strnlen ((char *) p, maxlen) + 1;
13270             }
13271           else
13272             {
13273               printf (_("<corrupt>"));
13274               p = (unsigned char *) end;
13275             }
13276           printf ("\"\n");
13277         }
13278       else
13279         {
13280           val = read_uleb128 (p, &len, end);
13281           p += len;
13282           printf ("%d (0x%x)\n", val, val);
13283         }
13284       break;
13285    }
13286
13287   assert (p <= end);
13288   return p;
13289 }
13290
13291 static int
13292 process_attributes (FILE * file,
13293                     const char * public_name,
13294                     unsigned int proc_type,
13295                     unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
13296                     unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const))
13297 {
13298   Elf_Internal_Shdr * sect;
13299   unsigned i;
13300
13301   /* Find the section header so that we get the size.  */
13302   for (i = 0, sect = section_headers;
13303        i < elf_header.e_shnum;
13304        i++, sect++)
13305     {
13306       unsigned char * contents;
13307       unsigned char * p;
13308
13309       if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
13310         continue;
13311
13312       contents = (unsigned char *) get_data (NULL, file, sect->sh_offset, 1,
13313                                              sect->sh_size, _("attributes"));
13314       if (contents == NULL)
13315         continue;
13316
13317       p = contents;
13318       if (*p == 'A')
13319         {
13320           bfd_vma section_len;
13321
13322           section_len = sect->sh_size - 1;
13323           p++;
13324
13325           while (section_len > 0)
13326             {
13327               bfd_vma attr_len;
13328               unsigned int namelen;
13329               bfd_boolean public_section;
13330               bfd_boolean gnu_section;
13331
13332               if (section_len <= 4)
13333                 {
13334                   error (_("Tag section ends prematurely\n"));
13335                   break;
13336                 }
13337               attr_len = byte_get (p, 4);
13338               p += 4;
13339
13340               if (attr_len > section_len)
13341                 {
13342                   error (_("Bad attribute length (%u > %u)\n"),
13343                           (unsigned) attr_len, (unsigned) section_len);
13344                   attr_len = section_len;
13345                 }
13346               /* PR 17531: file: 001-101425-0.004  */
13347               else if (attr_len < 5)
13348                 {
13349                   error (_("Attribute length of %u is too small\n"), (unsigned) attr_len);
13350                   break;
13351                 }
13352
13353               section_len -= attr_len;
13354               attr_len -= 4;
13355
13356               namelen = strnlen ((char *) p, attr_len) + 1;
13357               if (namelen == 0 || namelen >= attr_len)
13358                 {
13359                   error (_("Corrupt attribute section name\n"));
13360                   break;
13361                 }
13362
13363               printf (_("Attribute Section: "));
13364               print_symbol (INT_MAX, (const char *) p);
13365               putchar ('\n');
13366
13367               if (public_name && streq ((char *) p, public_name))
13368                 public_section = TRUE;
13369               else
13370                 public_section = FALSE;
13371
13372               if (streq ((char *) p, "gnu"))
13373                 gnu_section = TRUE;
13374               else
13375                 gnu_section = FALSE;
13376
13377               p += namelen;
13378               attr_len -= namelen;
13379
13380               while (attr_len > 0 && p < contents + sect->sh_size)
13381                 {
13382                   int tag;
13383                   int val;
13384                   bfd_vma size;
13385                   unsigned char * end;
13386
13387                   /* PR binutils/17531: Safe handling of corrupt files.  */
13388                   if (attr_len < 6)
13389                     {
13390                       error (_("Unused bytes at end of section\n"));
13391                       section_len = 0;
13392                       break;
13393                     }
13394
13395                   tag = *(p++);
13396                   size = byte_get (p, 4);
13397                   if (size > attr_len)
13398                     {
13399                       error (_("Bad subsection length (%u > %u)\n"),
13400                               (unsigned) size, (unsigned) attr_len);
13401                       size = attr_len;
13402                     }
13403                   /* PR binutils/17531: Safe handling of corrupt files.  */
13404                   if (size < 6)
13405                     {
13406                       error (_("Bad subsection length (%u < 6)\n"),
13407                               (unsigned) size);
13408                       section_len = 0;
13409                       break;
13410                     }
13411
13412                   attr_len -= size;
13413                   end = p + size - 1;
13414                   assert (end <= contents + sect->sh_size);
13415                   p += 4;
13416
13417                   switch (tag)
13418                     {
13419                     case 1:
13420                       printf (_("File Attributes\n"));
13421                       break;
13422                     case 2:
13423                       printf (_("Section Attributes:"));
13424                       goto do_numlist;
13425                     case 3:
13426                       printf (_("Symbol Attributes:"));
13427                     do_numlist:
13428                       for (;;)
13429                         {
13430                           unsigned int j;
13431
13432                           val = read_uleb128 (p, &j, end);
13433                           p += j;
13434                           if (val == 0)
13435                             break;
13436                           printf (" %d", val);
13437                         }
13438                       printf ("\n");
13439                       break;
13440                     default:
13441                       printf (_("Unknown tag: %d\n"), tag);
13442                       public_section = FALSE;
13443                       break;
13444                     }
13445
13446                   if (public_section && display_pub_attribute != NULL)
13447                     {
13448                       while (p < end)
13449                         p = display_pub_attribute (p, end);
13450                       assert (p <= end);
13451                     }
13452                   else if (gnu_section && display_proc_gnu_attribute != NULL)
13453                     {
13454                       while (p < end)
13455                         p = display_gnu_attribute (p,
13456                                                    display_proc_gnu_attribute,
13457                                                    end);
13458                       assert (p <= end);
13459                     }
13460                   else if (p < end)
13461                     {
13462                       printf (_("  Unknown attribute:\n"));
13463                       display_raw_attribute (p, end);
13464                       p = end;
13465                     }
13466                   else
13467                     attr_len = 0;
13468                 }
13469             }
13470         }
13471       else
13472         printf (_("Unknown format '%c' (%d)\n"), *p, *p);
13473
13474       free (contents);
13475     }
13476   return 1;
13477 }
13478
13479 static int
13480 process_arm_specific (FILE * file)
13481 {
13482   return process_attributes (file, "aeabi", SHT_ARM_ATTRIBUTES,
13483                              display_arm_attribute, NULL);
13484 }
13485
13486 static int
13487 process_power_specific (FILE * file)
13488 {
13489   return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
13490                              display_power_gnu_attribute);
13491 }
13492
13493 static int
13494 process_sparc_specific (FILE * file)
13495 {
13496   return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
13497                              display_sparc_gnu_attribute);
13498 }
13499
13500 static int
13501 process_tic6x_specific (FILE * file)
13502 {
13503   return process_attributes (file, "c6xabi", SHT_C6000_ATTRIBUTES,
13504                              display_tic6x_attribute, NULL);
13505 }
13506
13507 static int
13508 process_msp430x_specific (FILE * file)
13509 {
13510   return process_attributes (file, "mspabi", SHT_MSP430_ATTRIBUTES,
13511                              display_msp430x_attribute, NULL);
13512 }
13513
13514 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
13515    Print the Address, Access and Initial fields of an entry at VMA ADDR
13516    and return the VMA of the next entry, or -1 if there was a problem.
13517    Does not read from DATA_END or beyond.  */
13518
13519 static bfd_vma
13520 print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr,
13521                       unsigned char * data_end)
13522 {
13523   printf ("  ");
13524   print_vma (addr, LONG_HEX);
13525   printf (" ");
13526   if (addr < pltgot + 0xfff0)
13527     printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
13528   else
13529     printf ("%10s", "");
13530   printf (" ");
13531   if (data == NULL)
13532     printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
13533   else
13534     {
13535       bfd_vma entry;
13536       unsigned char * from = data + addr - pltgot;
13537
13538       if (from + (is_32bit_elf ? 4 : 8) > data_end)
13539         {
13540           warn (_("MIPS GOT entry extends beyond the end of available data\n"));
13541           printf ("%*s", is_32bit_elf ? 8 : 16, _("<corrupt>"));
13542           return (bfd_vma) -1;
13543         }
13544       else
13545         {
13546           entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
13547           print_vma (entry, LONG_HEX);
13548         }
13549     }
13550   return addr + (is_32bit_elf ? 4 : 8);
13551 }
13552
13553 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
13554    PLTGOT.  Print the Address and Initial fields of an entry at VMA
13555    ADDR and return the VMA of the next entry.  */
13556
13557 static bfd_vma
13558 print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
13559 {
13560   printf ("  ");
13561   print_vma (addr, LONG_HEX);
13562   printf (" ");
13563   if (data == NULL)
13564     printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
13565   else
13566     {
13567       bfd_vma entry;
13568
13569       entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
13570       print_vma (entry, LONG_HEX);
13571     }
13572   return addr + (is_32bit_elf ? 4 : 8);
13573 }
13574
13575 static void
13576 print_mips_ases (unsigned int mask)
13577 {
13578   if (mask & AFL_ASE_DSP)
13579     fputs ("\n\tDSP ASE", stdout);
13580   if (mask & AFL_ASE_DSPR2)
13581     fputs ("\n\tDSP R2 ASE", stdout);
13582   if (mask & AFL_ASE_EVA)
13583     fputs ("\n\tEnhanced VA Scheme", stdout);
13584   if (mask & AFL_ASE_MCU)
13585     fputs ("\n\tMCU (MicroController) ASE", stdout);
13586   if (mask & AFL_ASE_MDMX)
13587     fputs ("\n\tMDMX ASE", stdout);
13588   if (mask & AFL_ASE_MIPS3D)
13589     fputs ("\n\tMIPS-3D ASE", stdout);
13590   if (mask & AFL_ASE_MT)
13591     fputs ("\n\tMT ASE", stdout);
13592   if (mask & AFL_ASE_SMARTMIPS)
13593     fputs ("\n\tSmartMIPS ASE", stdout);
13594   if (mask & AFL_ASE_VIRT)
13595     fputs ("\n\tVZ ASE", stdout);
13596   if (mask & AFL_ASE_MSA)
13597     fputs ("\n\tMSA ASE", stdout);
13598   if (mask & AFL_ASE_MIPS16)
13599     fputs ("\n\tMIPS16 ASE", stdout);
13600   if (mask & AFL_ASE_MICROMIPS)
13601     fputs ("\n\tMICROMIPS ASE", stdout);
13602   if (mask & AFL_ASE_XPA)
13603     fputs ("\n\tXPA ASE", stdout);
13604   if (mask == 0)
13605     fprintf (stdout, "\n\t%s", _("None"));
13606   else if ((mask & ~AFL_ASE_MASK) != 0)
13607     fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
13608 }
13609
13610 static void
13611 print_mips_isa_ext (unsigned int isa_ext)
13612 {
13613   switch (isa_ext)
13614     {
13615     case 0:
13616       fputs (_("None"), stdout);
13617       break;
13618     case AFL_EXT_XLR:
13619       fputs ("RMI XLR", stdout);
13620       break;
13621     case AFL_EXT_OCTEON3:
13622       fputs ("Cavium Networks Octeon3", stdout);
13623       break;
13624     case AFL_EXT_OCTEON2:
13625       fputs ("Cavium Networks Octeon2", stdout);
13626       break;
13627     case AFL_EXT_OCTEONP:
13628       fputs ("Cavium Networks OcteonP", stdout);
13629       break;
13630     case AFL_EXT_LOONGSON_3A:
13631       fputs ("Loongson 3A", stdout);
13632       break;
13633     case AFL_EXT_OCTEON:
13634       fputs ("Cavium Networks Octeon", stdout);
13635       break;
13636     case AFL_EXT_5900:
13637       fputs ("Toshiba R5900", stdout);
13638       break;
13639     case AFL_EXT_4650:
13640       fputs ("MIPS R4650", stdout);
13641       break;
13642     case AFL_EXT_4010:
13643       fputs ("LSI R4010", stdout);
13644       break;
13645     case AFL_EXT_4100:
13646       fputs ("NEC VR4100", stdout);
13647       break;
13648     case AFL_EXT_3900:
13649       fputs ("Toshiba R3900", stdout);
13650       break;
13651     case AFL_EXT_10000:
13652       fputs ("MIPS R10000", stdout);
13653       break;
13654     case AFL_EXT_SB1:
13655       fputs ("Broadcom SB-1", stdout);
13656       break;
13657     case AFL_EXT_4111:
13658       fputs ("NEC VR4111/VR4181", stdout);
13659       break;
13660     case AFL_EXT_4120:
13661       fputs ("NEC VR4120", stdout);
13662       break;
13663     case AFL_EXT_5400:
13664       fputs ("NEC VR5400", stdout);
13665       break;
13666     case AFL_EXT_5500:
13667       fputs ("NEC VR5500", stdout);
13668       break;
13669     case AFL_EXT_LOONGSON_2E:
13670       fputs ("ST Microelectronics Loongson 2E", stdout);
13671       break;
13672     case AFL_EXT_LOONGSON_2F:
13673       fputs ("ST Microelectronics Loongson 2F", stdout);
13674       break;
13675     default:
13676       fprintf (stdout, "%s (%d)", _("Unknown"), isa_ext);
13677     }
13678 }
13679
13680 static int
13681 get_mips_reg_size (int reg_size)
13682 {
13683   return (reg_size == AFL_REG_NONE) ? 0
13684          : (reg_size == AFL_REG_32) ? 32
13685          : (reg_size == AFL_REG_64) ? 64
13686          : (reg_size == AFL_REG_128) ? 128
13687          : -1;
13688 }
13689
13690 static int
13691 process_mips_specific (FILE * file)
13692 {
13693   Elf_Internal_Dyn * entry;
13694   Elf_Internal_Shdr *sect = NULL;
13695   size_t liblist_offset = 0;
13696   size_t liblistno = 0;
13697   size_t conflictsno = 0;
13698   size_t options_offset = 0;
13699   size_t conflicts_offset = 0;
13700   size_t pltrelsz = 0;
13701   size_t pltrel = 0;
13702   bfd_vma pltgot = 0;
13703   bfd_vma mips_pltgot = 0;
13704   bfd_vma jmprel = 0;
13705   bfd_vma local_gotno = 0;
13706   bfd_vma gotsym = 0;
13707   bfd_vma symtabno = 0;
13708
13709   process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
13710                       display_mips_gnu_attribute);
13711
13712   sect = find_section (".MIPS.abiflags");
13713
13714   if (sect != NULL)
13715     {
13716       Elf_External_ABIFlags_v0 *abiflags_ext;
13717       Elf_Internal_ABIFlags_v0 abiflags_in;
13718
13719       if (sizeof (Elf_External_ABIFlags_v0) != sect->sh_size)
13720         fputs ("\nCorrupt ABI Flags section.\n", stdout);
13721       else
13722         {
13723           abiflags_ext = get_data (NULL, file, sect->sh_offset, 1,
13724                                    sect->sh_size, _("MIPS ABI Flags section"));
13725           if (abiflags_ext)
13726             {
13727               abiflags_in.version = BYTE_GET (abiflags_ext->version);
13728               abiflags_in.isa_level = BYTE_GET (abiflags_ext->isa_level);
13729               abiflags_in.isa_rev = BYTE_GET (abiflags_ext->isa_rev);
13730               abiflags_in.gpr_size = BYTE_GET (abiflags_ext->gpr_size);
13731               abiflags_in.cpr1_size = BYTE_GET (abiflags_ext->cpr1_size);
13732               abiflags_in.cpr2_size = BYTE_GET (abiflags_ext->cpr2_size);
13733               abiflags_in.fp_abi = BYTE_GET (abiflags_ext->fp_abi);
13734               abiflags_in.isa_ext = BYTE_GET (abiflags_ext->isa_ext);
13735               abiflags_in.ases = BYTE_GET (abiflags_ext->ases);
13736               abiflags_in.flags1 = BYTE_GET (abiflags_ext->flags1);
13737               abiflags_in.flags2 = BYTE_GET (abiflags_ext->flags2);
13738
13739               printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in.version);
13740               printf ("\nISA: MIPS%d", abiflags_in.isa_level);
13741               if (abiflags_in.isa_rev > 1)
13742                 printf ("r%d", abiflags_in.isa_rev);
13743               printf ("\nGPR size: %d",
13744                       get_mips_reg_size (abiflags_in.gpr_size));
13745               printf ("\nCPR1 size: %d",
13746                       get_mips_reg_size (abiflags_in.cpr1_size));
13747               printf ("\nCPR2 size: %d",
13748                       get_mips_reg_size (abiflags_in.cpr2_size));
13749               fputs ("\nFP ABI: ", stdout);
13750               print_mips_fp_abi_value (abiflags_in.fp_abi);
13751               fputs ("ISA Extension: ", stdout);
13752               print_mips_isa_ext (abiflags_in.isa_ext);
13753               fputs ("\nASEs:", stdout);
13754               print_mips_ases (abiflags_in.ases);
13755               printf ("\nFLAGS 1: %8.8lx", abiflags_in.flags1);
13756               printf ("\nFLAGS 2: %8.8lx", abiflags_in.flags2);
13757               fputc ('\n', stdout);
13758               free (abiflags_ext);
13759             }
13760         }
13761     }
13762
13763   /* We have a lot of special sections.  Thanks SGI!  */
13764   if (dynamic_section == NULL)
13765     /* No information available.  */
13766     return 0;
13767
13768   for (entry = dynamic_section;
13769        /* PR 17531 file: 012-50589-0.004.  */
13770        entry < dynamic_section + dynamic_nent && entry->d_tag != DT_NULL;
13771        ++entry)
13772     switch (entry->d_tag)
13773       {
13774       case DT_MIPS_LIBLIST:
13775         liblist_offset
13776           = offset_from_vma (file, entry->d_un.d_val,
13777                              liblistno * sizeof (Elf32_External_Lib));
13778         break;
13779       case DT_MIPS_LIBLISTNO:
13780         liblistno = entry->d_un.d_val;
13781         break;
13782       case DT_MIPS_OPTIONS:
13783         options_offset = offset_from_vma (file, entry->d_un.d_val, 0);
13784         break;
13785       case DT_MIPS_CONFLICT:
13786         conflicts_offset
13787           = offset_from_vma (file, entry->d_un.d_val,
13788                              conflictsno * sizeof (Elf32_External_Conflict));
13789         break;
13790       case DT_MIPS_CONFLICTNO:
13791         conflictsno = entry->d_un.d_val;
13792         break;
13793       case DT_PLTGOT:
13794         pltgot = entry->d_un.d_ptr;
13795         break;
13796       case DT_MIPS_LOCAL_GOTNO:
13797         local_gotno = entry->d_un.d_val;
13798         break;
13799       case DT_MIPS_GOTSYM:
13800         gotsym = entry->d_un.d_val;
13801         break;
13802       case DT_MIPS_SYMTABNO:
13803         symtabno = entry->d_un.d_val;
13804         break;
13805       case DT_MIPS_PLTGOT:
13806         mips_pltgot = entry->d_un.d_ptr;
13807         break;
13808       case DT_PLTREL:
13809         pltrel = entry->d_un.d_val;
13810         break;
13811       case DT_PLTRELSZ:
13812         pltrelsz = entry->d_un.d_val;
13813         break;
13814       case DT_JMPREL:
13815         jmprel = entry->d_un.d_ptr;
13816         break;
13817       default:
13818         break;
13819       }
13820
13821   if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
13822     {
13823       Elf32_External_Lib * elib;
13824       size_t cnt;
13825
13826       elib = (Elf32_External_Lib *) get_data (NULL, file, liblist_offset,
13827                                               liblistno,
13828                                               sizeof (Elf32_External_Lib),
13829                                               _("liblist section data"));
13830       if (elib)
13831         {
13832           printf (_("\nSection '.liblist' contains %lu entries:\n"),
13833                   (unsigned long) liblistno);
13834           fputs (_("     Library              Time Stamp          Checksum   Version Flags\n"),
13835                  stdout);
13836
13837           for (cnt = 0; cnt < liblistno; ++cnt)
13838             {
13839               Elf32_Lib liblist;
13840               time_t atime;
13841               char timebuf[20];
13842               struct tm * tmp;
13843
13844               liblist.l_name = BYTE_GET (elib[cnt].l_name);
13845               atime = BYTE_GET (elib[cnt].l_time_stamp);
13846               liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
13847               liblist.l_version = BYTE_GET (elib[cnt].l_version);
13848               liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
13849
13850               tmp = gmtime (&atime);
13851               snprintf (timebuf, sizeof (timebuf),
13852                         "%04u-%02u-%02uT%02u:%02u:%02u",
13853                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
13854                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
13855
13856               printf ("%3lu: ", (unsigned long) cnt);
13857               if (VALID_DYNAMIC_NAME (liblist.l_name))
13858                 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
13859               else
13860                 printf (_("<corrupt: %9ld>"), liblist.l_name);
13861               printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
13862                       liblist.l_version);
13863
13864               if (liblist.l_flags == 0)
13865                 puts (_(" NONE"));
13866               else
13867                 {
13868                   static const struct
13869                   {
13870                     const char * name;
13871                     int bit;
13872                   }
13873                   l_flags_vals[] =
13874                   {
13875                     { " EXACT_MATCH", LL_EXACT_MATCH },
13876                     { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
13877                     { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
13878                     { " EXPORTS", LL_EXPORTS },
13879                     { " DELAY_LOAD", LL_DELAY_LOAD },
13880                     { " DELTA", LL_DELTA }
13881                   };
13882                   int flags = liblist.l_flags;
13883                   size_t fcnt;
13884
13885                   for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
13886                     if ((flags & l_flags_vals[fcnt].bit) != 0)
13887                       {
13888                         fputs (l_flags_vals[fcnt].name, stdout);
13889                         flags ^= l_flags_vals[fcnt].bit;
13890                       }
13891                   if (flags != 0)
13892                     printf (" %#x", (unsigned int) flags);
13893
13894                   puts ("");
13895                 }
13896             }
13897
13898           free (elib);
13899         }
13900     }
13901
13902   if (options_offset != 0)
13903     {
13904       Elf_External_Options * eopt;
13905       Elf_Internal_Options * iopt;
13906       Elf_Internal_Options * option;
13907       size_t offset;
13908       int cnt;
13909       sect = section_headers;
13910
13911       /* Find the section header so that we get the size.  */
13912       sect = find_section_by_type (SHT_MIPS_OPTIONS);
13913       /* PR 17533 file: 012-277276-0.004.  */
13914       if (sect == NULL)
13915         {
13916           error (_("No MIPS_OPTIONS header found\n"));
13917           return 0;
13918         }
13919
13920       eopt = (Elf_External_Options *) get_data (NULL, file, options_offset, 1,
13921                                                 sect->sh_size, _("options"));
13922       if (eopt)
13923         {
13924           iopt = (Elf_Internal_Options *)
13925               cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
13926           if (iopt == NULL)
13927             {
13928               error (_("Out of memory allocatinf space for MIPS options\n"));
13929               return 0;
13930             }
13931
13932           offset = cnt = 0;
13933           option = iopt;
13934
13935           while (offset <= sect->sh_size - sizeof (* eopt))
13936             {
13937               Elf_External_Options * eoption;
13938
13939               eoption = (Elf_External_Options *) ((char *) eopt + offset);
13940
13941               option->kind = BYTE_GET (eoption->kind);
13942               option->size = BYTE_GET (eoption->size);
13943               option->section = BYTE_GET (eoption->section);
13944               option->info = BYTE_GET (eoption->info);
13945
13946               /* PR 17531: file: ffa0fa3b.  */
13947               if (option->size < sizeof (* eopt)
13948                   || offset + option->size > sect->sh_size)
13949                 {
13950                   error (_("Invalid size (%u) for MIPS option\n"), option->size);
13951                   return 0;
13952                 }
13953               offset += option->size;
13954                 
13955               ++option;
13956               ++cnt;
13957             }
13958
13959           printf (_("\nSection '%s' contains %d entries:\n"),
13960                   printable_section_name (sect), cnt);
13961
13962           option = iopt;
13963           offset = 0;
13964
13965           while (cnt-- > 0)
13966             {
13967               size_t len;
13968
13969               switch (option->kind)
13970                 {
13971                 case ODK_NULL:
13972                   /* This shouldn't happen.  */
13973                   printf (" NULL       %d %lx", option->section, option->info);
13974                   break;
13975                 case ODK_REGINFO:
13976                   printf (" REGINFO    ");
13977                   if (elf_header.e_machine == EM_MIPS)
13978                     {
13979                       /* 32bit form.  */
13980                       Elf32_External_RegInfo * ereg;
13981                       Elf32_RegInfo reginfo;
13982
13983                       ereg = (Elf32_External_RegInfo *) (option + 1);
13984                       reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
13985                       reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
13986                       reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
13987                       reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
13988                       reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
13989                       reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
13990
13991                       printf ("GPR %08lx  GP 0x%lx\n",
13992                               reginfo.ri_gprmask,
13993                               (unsigned long) reginfo.ri_gp_value);
13994                       printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
13995                               reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
13996                               reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
13997                     }
13998                   else
13999                     {
14000                       /* 64 bit form.  */
14001                       Elf64_External_RegInfo * ereg;
14002                       Elf64_Internal_RegInfo reginfo;
14003
14004                       ereg = (Elf64_External_RegInfo *) (option + 1);
14005                       reginfo.ri_gprmask    = BYTE_GET (ereg->ri_gprmask);
14006                       reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
14007                       reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
14008                       reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
14009                       reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
14010                       reginfo.ri_gp_value   = BYTE_GET (ereg->ri_gp_value);
14011
14012                       printf ("GPR %08lx  GP 0x",
14013                               reginfo.ri_gprmask);
14014                       printf_vma (reginfo.ri_gp_value);
14015                       printf ("\n");
14016
14017                       printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
14018                               reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
14019                               reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
14020                     }
14021                   ++option;
14022                   continue;
14023                 case ODK_EXCEPTIONS:
14024                   fputs (" EXCEPTIONS fpe_min(", stdout);
14025                   process_mips_fpe_exception (option->info & OEX_FPU_MIN);
14026                   fputs (") fpe_max(", stdout);
14027                   process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
14028                   fputs (")", stdout);
14029
14030                   if (option->info & OEX_PAGE0)
14031                     fputs (" PAGE0", stdout);
14032                   if (option->info & OEX_SMM)
14033                     fputs (" SMM", stdout);
14034                   if (option->info & OEX_FPDBUG)
14035                     fputs (" FPDBUG", stdout);
14036                   if (option->info & OEX_DISMISS)
14037                     fputs (" DISMISS", stdout);
14038                   break;
14039                 case ODK_PAD:
14040                   fputs (" PAD       ", stdout);
14041                   if (option->info & OPAD_PREFIX)
14042                     fputs (" PREFIX", stdout);
14043                   if (option->info & OPAD_POSTFIX)
14044                     fputs (" POSTFIX", stdout);
14045                   if (option->info & OPAD_SYMBOL)
14046                     fputs (" SYMBOL", stdout);
14047                   break;
14048                 case ODK_HWPATCH:
14049                   fputs (" HWPATCH   ", stdout);
14050                   if (option->info & OHW_R4KEOP)
14051                     fputs (" R4KEOP", stdout);
14052                   if (option->info & OHW_R8KPFETCH)
14053                     fputs (" R8KPFETCH", stdout);
14054                   if (option->info & OHW_R5KEOP)
14055                     fputs (" R5KEOP", stdout);
14056                   if (option->info & OHW_R5KCVTL)
14057                     fputs (" R5KCVTL", stdout);
14058                   break;
14059                 case ODK_FILL:
14060                   fputs (" FILL       ", stdout);
14061                   /* XXX Print content of info word?  */
14062                   break;
14063                 case ODK_TAGS:
14064                   fputs (" TAGS       ", stdout);
14065                   /* XXX Print content of info word?  */
14066                   break;
14067                 case ODK_HWAND:
14068                   fputs (" HWAND     ", stdout);
14069                   if (option->info & OHWA0_R4KEOP_CHECKED)
14070                     fputs (" R4KEOP_CHECKED", stdout);
14071                   if (option->info & OHWA0_R4KEOP_CLEAN)
14072                     fputs (" R4KEOP_CLEAN", stdout);
14073                   break;
14074                 case ODK_HWOR:
14075                   fputs (" HWOR      ", stdout);
14076                   if (option->info & OHWA0_R4KEOP_CHECKED)
14077                     fputs (" R4KEOP_CHECKED", stdout);
14078                   if (option->info & OHWA0_R4KEOP_CLEAN)
14079                     fputs (" R4KEOP_CLEAN", stdout);
14080                   break;
14081                 case ODK_GP_GROUP:
14082                   printf (" GP_GROUP  %#06lx  self-contained %#06lx",
14083                           option->info & OGP_GROUP,
14084                           (option->info & OGP_SELF) >> 16);
14085                   break;
14086                 case ODK_IDENT:
14087                   printf (" IDENT     %#06lx  self-contained %#06lx",
14088                           option->info & OGP_GROUP,
14089                           (option->info & OGP_SELF) >> 16);
14090                   break;
14091                 default:
14092                   /* This shouldn't happen.  */
14093                   printf (" %3d ???     %d %lx",
14094                           option->kind, option->section, option->info);
14095                   break;
14096                 }
14097
14098               len = sizeof (* eopt);
14099               while (len < option->size)
14100                 {
14101                   char datum = * ((char *) eopt + offset + len);
14102
14103                   if (ISPRINT (datum))
14104                     printf ("%c", datum);
14105                   else
14106                     printf ("\\%03o", datum);
14107                   len ++;
14108                 }
14109               fputs ("\n", stdout);
14110
14111               offset += option->size;
14112               ++option;
14113             }
14114
14115           free (eopt);
14116         }
14117     }
14118
14119   if (conflicts_offset != 0 && conflictsno != 0)
14120     {
14121       Elf32_Conflict * iconf;
14122       size_t cnt;
14123
14124       if (dynamic_symbols == NULL)
14125         {
14126           error (_("conflict list found without a dynamic symbol table\n"));
14127           return 0;
14128         }
14129
14130       iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
14131       if (iconf == NULL)
14132         {
14133           error (_("Out of memory allocating space for dynamic conflicts\n"));
14134           return 0;
14135         }
14136
14137       if (is_32bit_elf)
14138         {
14139           Elf32_External_Conflict * econf32;
14140
14141           econf32 = (Elf32_External_Conflict *)
14142               get_data (NULL, file, conflicts_offset, conflictsno,
14143                         sizeof (* econf32), _("conflict"));
14144           if (!econf32)
14145             return 0;
14146
14147           for (cnt = 0; cnt < conflictsno; ++cnt)
14148             iconf[cnt] = BYTE_GET (econf32[cnt]);
14149
14150           free (econf32);
14151         }
14152       else
14153         {
14154           Elf64_External_Conflict * econf64;
14155
14156           econf64 = (Elf64_External_Conflict *)
14157               get_data (NULL, file, conflicts_offset, conflictsno,
14158                         sizeof (* econf64), _("conflict"));
14159           if (!econf64)
14160             return 0;
14161
14162           for (cnt = 0; cnt < conflictsno; ++cnt)
14163             iconf[cnt] = BYTE_GET (econf64[cnt]);
14164
14165           free (econf64);
14166         }
14167
14168       printf (_("\nSection '.conflict' contains %lu entries:\n"),
14169               (unsigned long) conflictsno);
14170       puts (_("  Num:    Index       Value  Name"));
14171
14172       for (cnt = 0; cnt < conflictsno; ++cnt)
14173         {
14174           printf ("%5lu: %8lu  ", (unsigned long) cnt, iconf[cnt]);
14175
14176           if (iconf[cnt] >= num_dynamic_syms)
14177             printf (_("<corrupt symbol index>"));
14178           else
14179             {
14180               Elf_Internal_Sym * psym;
14181
14182               psym = & dynamic_symbols[iconf[cnt]];
14183               print_vma (psym->st_value, FULL_HEX);
14184               putchar (' ');
14185               if (VALID_DYNAMIC_NAME (psym->st_name))
14186                 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
14187               else
14188                 printf (_("<corrupt: %14ld>"), psym->st_name);
14189             }
14190           putchar ('\n');
14191         }
14192
14193       free (iconf);
14194     }
14195
14196   if (pltgot != 0 && local_gotno != 0)
14197     {
14198       bfd_vma ent, local_end, global_end;
14199       size_t i, offset;
14200       unsigned char * data;
14201       unsigned char * data_end;
14202       int addr_size;
14203
14204       ent = pltgot;
14205       addr_size = (is_32bit_elf ? 4 : 8);
14206       local_end = pltgot + local_gotno * addr_size;
14207
14208       /* PR binutils/17533 file: 012-111227-0.004  */
14209       if (symtabno < gotsym)
14210         {
14211           error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
14212                  (unsigned long) gotsym, (unsigned long) symtabno);
14213           return 0;
14214         }
14215
14216       global_end = local_end + (symtabno - gotsym) * addr_size;
14217       /* PR 17531: file: 54c91a34.  */
14218       if (global_end < local_end)
14219         {
14220           error (_("Too many GOT symbols: %lu\n"), (unsigned long) symtabno);
14221           return 0;
14222         }
14223
14224       offset = offset_from_vma (file, pltgot, global_end - pltgot);
14225       data = (unsigned char *) get_data (NULL, file, offset,
14226                                          global_end - pltgot, 1,
14227                                          _("Global Offset Table data"));
14228       if (data == NULL)
14229         return 0;
14230       data_end = data + (global_end - pltgot);
14231
14232       printf (_("\nPrimary GOT:\n"));
14233       printf (_(" Canonical gp value: "));
14234       print_vma (pltgot + 0x7ff0, LONG_HEX);
14235       printf ("\n\n");
14236
14237       printf (_(" Reserved entries:\n"));
14238       printf (_("  %*s %10s %*s Purpose\n"),
14239               addr_size * 2, _("Address"), _("Access"),
14240               addr_size * 2, _("Initial"));
14241       ent = print_mips_got_entry (data, pltgot, ent, data_end);
14242       printf (_(" Lazy resolver\n"));
14243       if (ent == (bfd_vma) -1)
14244         goto got_print_fail;
14245       if (data
14246           && (byte_get (data + ent - pltgot, addr_size)
14247               >> (addr_size * 8 - 1)) != 0)
14248         {
14249           ent = print_mips_got_entry (data, pltgot, ent, data_end);
14250           printf (_(" Module pointer (GNU extension)\n"));
14251           if (ent == (bfd_vma) -1)
14252             goto got_print_fail;
14253         }
14254       printf ("\n");
14255
14256       if (ent < local_end)
14257         {
14258           printf (_(" Local entries:\n"));
14259           printf ("  %*s %10s %*s\n",
14260                   addr_size * 2, _("Address"), _("Access"),
14261                   addr_size * 2, _("Initial"));
14262           while (ent < local_end)
14263             {
14264               ent = print_mips_got_entry (data, pltgot, ent, data_end);
14265               printf ("\n");
14266               if (ent == (bfd_vma) -1)
14267                 goto got_print_fail;
14268             }
14269           printf ("\n");
14270         }
14271
14272       if (gotsym < symtabno)
14273         {
14274           int sym_width;
14275
14276           printf (_(" Global entries:\n"));
14277           printf ("  %*s %10s %*s %*s %-7s %3s %s\n",
14278                   addr_size * 2, _("Address"),
14279                   _("Access"),
14280                   addr_size * 2, _("Initial"),
14281                   addr_size * 2, _("Sym.Val."),
14282                   _("Type"),
14283                   /* Note for translators: "Ndx" = abbreviated form of "Index".  */
14284                   _("Ndx"), _("Name"));
14285
14286           sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
14287
14288           for (i = gotsym; i < symtabno; i++)
14289             {
14290               ent = print_mips_got_entry (data, pltgot, ent, data_end);
14291               printf (" ");
14292
14293               if (dynamic_symbols == NULL)
14294                 printf (_("<no dynamic symbols>"));
14295               else if (i < num_dynamic_syms)
14296                 {
14297                   Elf_Internal_Sym * psym = dynamic_symbols + i;
14298
14299                   print_vma (psym->st_value, LONG_HEX);
14300                   printf (" %-7s %3s ",
14301                           get_symbol_type (ELF_ST_TYPE (psym->st_info)),
14302                           get_symbol_index_type (psym->st_shndx));
14303
14304                   if (VALID_DYNAMIC_NAME (psym->st_name))
14305                     print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
14306                   else
14307                     printf (_("<corrupt: %14ld>"), psym->st_name);
14308                 }
14309               else
14310                 printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
14311                         (unsigned long) i);
14312
14313               printf ("\n");
14314               if (ent == (bfd_vma) -1)
14315                 break;
14316             }
14317           printf ("\n");
14318         }
14319
14320     got_print_fail:
14321       if (data)
14322         free (data);
14323     }
14324
14325   if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
14326     {
14327       bfd_vma ent, end;
14328       size_t offset, rel_offset;
14329       unsigned long count, i;
14330       unsigned char * data;
14331       int addr_size, sym_width;
14332       Elf_Internal_Rela * rels;
14333
14334       rel_offset = offset_from_vma (file, jmprel, pltrelsz);
14335       if (pltrel == DT_RELA)
14336         {
14337           if (!slurp_rela_relocs (file, rel_offset, pltrelsz, &rels, &count))
14338             return 0;
14339         }
14340       else
14341         {
14342           if (!slurp_rel_relocs (file, rel_offset, pltrelsz, &rels, &count))
14343             return 0;
14344         }
14345
14346       ent = mips_pltgot;
14347       addr_size = (is_32bit_elf ? 4 : 8);
14348       end = mips_pltgot + (2 + count) * addr_size;
14349
14350       offset = offset_from_vma (file, mips_pltgot, end - mips_pltgot);
14351       data = (unsigned char *) get_data (NULL, file, offset, end - mips_pltgot,
14352                                          1, _("Procedure Linkage Table data"));
14353       if (data == NULL)
14354         return 0;
14355
14356       printf ("\nPLT GOT:\n\n");
14357       printf (_(" Reserved entries:\n"));
14358       printf (_("  %*s %*s Purpose\n"),
14359               addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
14360       ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
14361       printf (_(" PLT lazy resolver\n"));
14362       ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
14363       printf (_(" Module pointer\n"));
14364       printf ("\n");
14365
14366       printf (_(" Entries:\n"));
14367       printf ("  %*s %*s %*s %-7s %3s %s\n",
14368               addr_size * 2, _("Address"),
14369               addr_size * 2, _("Initial"),
14370               addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
14371       sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
14372       for (i = 0; i < count; i++)
14373         {
14374           unsigned long idx = get_reloc_symindex (rels[i].r_info);
14375
14376           ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
14377           printf (" ");
14378
14379           if (idx >= num_dynamic_syms)
14380             printf (_("<corrupt symbol index: %lu>"), idx);
14381           else
14382             {
14383               Elf_Internal_Sym * psym = dynamic_symbols + idx;
14384
14385               print_vma (psym->st_value, LONG_HEX);
14386               printf (" %-7s %3s ",
14387                       get_symbol_type (ELF_ST_TYPE (psym->st_info)),
14388                       get_symbol_index_type (psym->st_shndx));
14389               if (VALID_DYNAMIC_NAME (psym->st_name))
14390                 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
14391               else
14392                 printf (_("<corrupt: %14ld>"), psym->st_name);
14393             }
14394           printf ("\n");
14395         }
14396       printf ("\n");
14397
14398       if (data)
14399         free (data);
14400       free (rels);
14401     }
14402
14403   return 1;
14404 }
14405
14406 static int
14407 process_nds32_specific (FILE * file)
14408 {
14409   Elf_Internal_Shdr *sect = NULL;
14410
14411   sect = find_section (".nds32_e_flags");
14412   if (sect != NULL)
14413     {
14414       unsigned int *flag;
14415
14416       printf ("\nNDS32 elf flags section:\n");
14417       flag = get_data (NULL, file, sect->sh_offset, 1,
14418                        sect->sh_size, _("NDS32 elf flags section"));
14419
14420       switch ((*flag) & 0x3)
14421         {
14422         case 0:
14423           printf ("(VEC_SIZE):\tNo entry.\n");
14424           break;
14425         case 1:
14426           printf ("(VEC_SIZE):\t4 bytes\n");
14427           break;
14428         case 2:
14429           printf ("(VEC_SIZE):\t16 bytes\n");
14430           break;
14431         case 3:
14432           printf ("(VEC_SIZE):\treserved\n");
14433           break;
14434         }
14435     }
14436
14437   return TRUE;
14438 }
14439
14440 static int
14441 process_gnu_liblist (FILE * file)
14442 {
14443   Elf_Internal_Shdr * section;
14444   Elf_Internal_Shdr * string_sec;
14445   Elf32_External_Lib * elib;
14446   char * strtab;
14447   size_t strtab_size;
14448   size_t cnt;
14449   unsigned i;
14450
14451   if (! do_arch)
14452     return 0;
14453
14454   for (i = 0, section = section_headers;
14455        i < elf_header.e_shnum;
14456        i++, section++)
14457     {
14458       switch (section->sh_type)
14459         {
14460         case SHT_GNU_LIBLIST:
14461           if (section->sh_link >= elf_header.e_shnum)
14462             break;
14463
14464           elib = (Elf32_External_Lib *)
14465               get_data (NULL, file, section->sh_offset, 1, section->sh_size,
14466                         _("liblist section data"));
14467
14468           if (elib == NULL)
14469             break;
14470           string_sec = section_headers + section->sh_link;
14471
14472           strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
14473                                       string_sec->sh_size,
14474                                       _("liblist string table"));
14475           if (strtab == NULL
14476               || section->sh_entsize != sizeof (Elf32_External_Lib))
14477             {
14478               free (elib);
14479               free (strtab);
14480               break;
14481             }
14482           strtab_size = string_sec->sh_size;
14483
14484           printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
14485                   printable_section_name (section),
14486                   (unsigned long) (section->sh_size / sizeof (Elf32_External_Lib)));
14487
14488           puts (_("     Library              Time Stamp          Checksum   Version Flags"));
14489
14490           for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
14491                ++cnt)
14492             {
14493               Elf32_Lib liblist;
14494               time_t atime;
14495               char timebuf[20];
14496               struct tm * tmp;
14497
14498               liblist.l_name = BYTE_GET (elib[cnt].l_name);
14499               atime = BYTE_GET (elib[cnt].l_time_stamp);
14500               liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
14501               liblist.l_version = BYTE_GET (elib[cnt].l_version);
14502               liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
14503
14504               tmp = gmtime (&atime);
14505               snprintf (timebuf, sizeof (timebuf),
14506                         "%04u-%02u-%02uT%02u:%02u:%02u",
14507                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
14508                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
14509
14510               printf ("%3lu: ", (unsigned long) cnt);
14511               if (do_wide)
14512                 printf ("%-20s", liblist.l_name < strtab_size
14513                         ? strtab + liblist.l_name : _("<corrupt>"));
14514               else
14515                 printf ("%-20.20s", liblist.l_name < strtab_size
14516                         ? strtab + liblist.l_name : _("<corrupt>"));
14517               printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
14518                       liblist.l_version, liblist.l_flags);
14519             }
14520
14521           free (elib);
14522           free (strtab);
14523         }
14524     }
14525
14526   return 1;
14527 }
14528
14529 static const char *
14530 get_note_type (unsigned e_type)
14531 {
14532   static char buff[64];
14533
14534   if (elf_header.e_type == ET_CORE)
14535     switch (e_type)
14536       {
14537       case NT_AUXV:
14538         return _("NT_AUXV (auxiliary vector)");
14539       case NT_PRSTATUS:
14540         return _("NT_PRSTATUS (prstatus structure)");
14541       case NT_FPREGSET:
14542         return _("NT_FPREGSET (floating point registers)");
14543       case NT_PRPSINFO:
14544         return _("NT_PRPSINFO (prpsinfo structure)");
14545       case NT_TASKSTRUCT:
14546         return _("NT_TASKSTRUCT (task structure)");
14547       case NT_PRXFPREG:
14548         return _("NT_PRXFPREG (user_xfpregs structure)");
14549       case NT_PPC_VMX:
14550         return _("NT_PPC_VMX (ppc Altivec registers)");
14551       case NT_PPC_VSX:
14552         return _("NT_PPC_VSX (ppc VSX registers)");
14553       case NT_386_TLS:
14554         return _("NT_386_TLS (x86 TLS information)");
14555       case NT_386_IOPERM:
14556         return _("NT_386_IOPERM (x86 I/O permissions)");
14557       case NT_X86_XSTATE:
14558         return _("NT_X86_XSTATE (x86 XSAVE extended state)");
14559       case NT_S390_HIGH_GPRS:
14560         return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
14561       case NT_S390_TIMER:
14562         return _("NT_S390_TIMER (s390 timer register)");
14563       case NT_S390_TODCMP:
14564         return _("NT_S390_TODCMP (s390 TOD comparator register)");
14565       case NT_S390_TODPREG:
14566         return _("NT_S390_TODPREG (s390 TOD programmable register)");
14567       case NT_S390_CTRS:
14568         return _("NT_S390_CTRS (s390 control registers)");
14569       case NT_S390_PREFIX:
14570         return _("NT_S390_PREFIX (s390 prefix register)");
14571       case NT_S390_LAST_BREAK:
14572         return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
14573       case NT_S390_SYSTEM_CALL:
14574         return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
14575       case NT_S390_TDB:
14576         return _("NT_S390_TDB (s390 transaction diagnostic block)");
14577       case NT_S390_VXRS_LOW:
14578         return _("NT_S390_VXRS_LOW (s390 vector registers 0-15 upper half)");
14579       case NT_S390_VXRS_HIGH:
14580         return _("NT_S390_VXRS_HIGH (s390 vector registers 16-31)");
14581       case NT_ARM_VFP:
14582         return _("NT_ARM_VFP (arm VFP registers)");
14583       case NT_ARM_TLS:
14584         return _("NT_ARM_TLS (AArch TLS registers)");
14585       case NT_ARM_HW_BREAK:
14586         return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
14587       case NT_ARM_HW_WATCH:
14588         return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
14589       case NT_PSTATUS:
14590         return _("NT_PSTATUS (pstatus structure)");
14591       case NT_FPREGS:
14592         return _("NT_FPREGS (floating point registers)");
14593       case NT_PSINFO:
14594         return _("NT_PSINFO (psinfo structure)");
14595       case NT_LWPSTATUS:
14596         return _("NT_LWPSTATUS (lwpstatus_t structure)");
14597       case NT_LWPSINFO:
14598         return _("NT_LWPSINFO (lwpsinfo_t structure)");
14599       case NT_WIN32PSTATUS:
14600         return _("NT_WIN32PSTATUS (win32_pstatus structure)");
14601       case NT_SIGINFO:
14602         return _("NT_SIGINFO (siginfo_t data)");
14603       case NT_FILE:
14604         return _("NT_FILE (mapped files)");
14605       default:
14606         break;
14607       }
14608   else
14609     switch (e_type)
14610       {
14611       case NT_VERSION:
14612         return _("NT_VERSION (version)");
14613       case NT_ARCH:
14614         return _("NT_ARCH (architecture)");
14615       default:
14616         break;
14617       }
14618
14619   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
14620   return buff;
14621 }
14622
14623 static int
14624 print_core_note (Elf_Internal_Note *pnote)
14625 {
14626   unsigned int addr_size = is_32bit_elf ? 4 : 8;
14627   bfd_vma count, page_size;
14628   unsigned char *descdata, *filenames, *descend;
14629
14630   if (pnote->type != NT_FILE)
14631     return 1;
14632
14633 #ifndef BFD64
14634   if (!is_32bit_elf)
14635     {
14636       printf (_("    Cannot decode 64-bit note in 32-bit build\n"));
14637       /* Still "successful".  */
14638       return 1;
14639     }
14640 #endif
14641
14642   if (pnote->descsz < 2 * addr_size)
14643     {
14644       printf (_("    Malformed note - too short for header\n"));
14645       return 0;
14646     }
14647
14648   descdata = (unsigned char *) pnote->descdata;
14649   descend = descdata + pnote->descsz;
14650
14651   if (descdata[pnote->descsz - 1] != '\0')
14652     {
14653       printf (_("    Malformed note - does not end with \\0\n"));
14654       return 0;
14655     }
14656
14657   count = byte_get (descdata, addr_size);
14658   descdata += addr_size;
14659
14660   page_size = byte_get (descdata, addr_size);
14661   descdata += addr_size;
14662
14663   if (pnote->descsz < 2 * addr_size + count * 3 * addr_size)
14664     {
14665       printf (_("    Malformed note - too short for supplied file count\n"));
14666       return 0;
14667     }
14668
14669   printf (_("    Page size: "));
14670   print_vma (page_size, DEC);
14671   printf ("\n");
14672
14673   printf (_("    %*s%*s%*s\n"),
14674           (int) (2 + 2 * addr_size), _("Start"),
14675           (int) (4 + 2 * addr_size), _("End"),
14676           (int) (4 + 2 * addr_size), _("Page Offset"));
14677   filenames = descdata + count * 3 * addr_size;
14678   while (--count > 0)
14679     {
14680       bfd_vma start, end, file_ofs;
14681
14682       if (filenames == descend)
14683         {
14684           printf (_("    Malformed note - filenames end too early\n"));
14685           return 0;
14686         }
14687
14688       start = byte_get (descdata, addr_size);
14689       descdata += addr_size;
14690       end = byte_get (descdata, addr_size);
14691       descdata += addr_size;
14692       file_ofs = byte_get (descdata, addr_size);
14693       descdata += addr_size;
14694
14695       printf ("    ");
14696       print_vma (start, FULL_HEX);
14697       printf ("  ");
14698       print_vma (end, FULL_HEX);
14699       printf ("  ");
14700       print_vma (file_ofs, FULL_HEX);
14701       printf ("\n        %s\n", filenames);
14702
14703       filenames += 1 + strlen ((char *) filenames);
14704     }
14705
14706   return 1;
14707 }
14708
14709 static const char *
14710 get_gnu_elf_note_type (unsigned e_type)
14711 {
14712   static char buff[64];
14713
14714   switch (e_type)
14715     {
14716     case NT_GNU_ABI_TAG:
14717       return _("NT_GNU_ABI_TAG (ABI version tag)");
14718     case NT_GNU_HWCAP:
14719       return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
14720     case NT_GNU_BUILD_ID:
14721       return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
14722     case NT_GNU_GOLD_VERSION:
14723       return _("NT_GNU_GOLD_VERSION (gold version)");
14724     default:
14725       break;
14726     }
14727
14728   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
14729   return buff;
14730 }
14731
14732 static int
14733 print_gnu_note (Elf_Internal_Note *pnote)
14734 {
14735   switch (pnote->type)
14736     {
14737     case NT_GNU_BUILD_ID:
14738       {
14739         unsigned long i;
14740
14741         printf (_("    Build ID: "));
14742         for (i = 0; i < pnote->descsz; ++i)
14743           printf ("%02x", pnote->descdata[i] & 0xff);
14744         printf ("\n");
14745       }
14746       break;
14747
14748     case NT_GNU_ABI_TAG:
14749       {
14750         unsigned long os, major, minor, subminor;
14751         const char *osname;
14752
14753         /* PR 17531: file: 030-599401-0.004.  */
14754         if (pnote->descsz < 16)
14755           {
14756             printf (_("    <corrupt GNU_ABI_TAG>\n"));
14757             break;
14758           }
14759
14760         os = byte_get ((unsigned char *) pnote->descdata, 4);
14761         major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
14762         minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
14763         subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
14764
14765         switch (os)
14766           {
14767           case GNU_ABI_TAG_LINUX:
14768             osname = "Linux";
14769             break;
14770           case GNU_ABI_TAG_HURD:
14771             osname = "Hurd";
14772             break;
14773           case GNU_ABI_TAG_SOLARIS:
14774             osname = "Solaris";
14775             break;
14776           case GNU_ABI_TAG_FREEBSD:
14777             osname = "FreeBSD";
14778             break;
14779           case GNU_ABI_TAG_NETBSD:
14780             osname = "NetBSD";
14781             break;
14782           default:
14783             osname = "Unknown";
14784             break;
14785           }
14786
14787         printf (_("    OS: %s, ABI: %ld.%ld.%ld\n"), osname,
14788                 major, minor, subminor);
14789       }
14790       break;
14791
14792     case NT_GNU_GOLD_VERSION:
14793       {
14794         unsigned long i;
14795
14796         printf (_("    Version: "));
14797         for (i = 0; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
14798           printf ("%c", pnote->descdata[i]);
14799         printf ("\n");
14800       }
14801       break;
14802     }
14803
14804   return 1;
14805 }
14806
14807 static const char *
14808 get_netbsd_elfcore_note_type (unsigned e_type)
14809 {
14810   static char buff[64];
14811
14812   if (e_type == NT_NETBSDCORE_PROCINFO)
14813     {
14814       /* NetBSD core "procinfo" structure.  */
14815       return _("NetBSD procinfo structure");
14816     }
14817
14818   /* As of Jan 2002 there are no other machine-independent notes
14819      defined for NetBSD core files.  If the note type is less
14820      than the start of the machine-dependent note types, we don't
14821      understand it.  */
14822
14823   if (e_type < NT_NETBSDCORE_FIRSTMACH)
14824     {
14825       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
14826       return buff;
14827     }
14828
14829   switch (elf_header.e_machine)
14830     {
14831     /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
14832        and PT_GETFPREGS == mach+2.  */
14833
14834     case EM_OLD_ALPHA:
14835     case EM_ALPHA:
14836     case EM_SPARC:
14837     case EM_SPARC32PLUS:
14838     case EM_SPARCV9:
14839       switch (e_type)
14840         {
14841         case NT_NETBSDCORE_FIRSTMACH + 0:
14842           return _("PT_GETREGS (reg structure)");
14843         case NT_NETBSDCORE_FIRSTMACH + 2:
14844           return _("PT_GETFPREGS (fpreg structure)");
14845         default:
14846           break;
14847         }
14848       break;
14849
14850     /* On all other arch's, PT_GETREGS == mach+1 and
14851        PT_GETFPREGS == mach+3.  */
14852     default:
14853       switch (e_type)
14854         {
14855         case NT_NETBSDCORE_FIRSTMACH + 1:
14856           return _("PT_GETREGS (reg structure)");
14857         case NT_NETBSDCORE_FIRSTMACH + 3:
14858           return _("PT_GETFPREGS (fpreg structure)");
14859         default:
14860           break;
14861         }
14862     }
14863
14864   snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
14865             e_type - NT_NETBSDCORE_FIRSTMACH);
14866   return buff;
14867 }
14868
14869 static const char *
14870 get_stapsdt_note_type (unsigned e_type)
14871 {
14872   static char buff[64];
14873
14874   switch (e_type)
14875     {
14876     case NT_STAPSDT:
14877       return _("NT_STAPSDT (SystemTap probe descriptors)");
14878
14879     default:
14880       break;
14881     }
14882
14883   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
14884   return buff;
14885 }
14886
14887 static int
14888 print_stapsdt_note (Elf_Internal_Note *pnote)
14889 {
14890   int addr_size = is_32bit_elf ? 4 : 8;
14891   char *data = pnote->descdata;
14892   char *data_end = pnote->descdata + pnote->descsz;
14893   bfd_vma pc, base_addr, semaphore;
14894   char *provider, *probe, *arg_fmt;
14895
14896   pc = byte_get ((unsigned char *) data, addr_size);
14897   data += addr_size;
14898   base_addr = byte_get ((unsigned char *) data, addr_size);
14899   data += addr_size;
14900   semaphore = byte_get ((unsigned char *) data, addr_size);
14901   data += addr_size;
14902
14903   provider = data;
14904   data += strlen (data) + 1;
14905   probe = data;
14906   data += strlen (data) + 1;
14907   arg_fmt = data;
14908   data += strlen (data) + 1;
14909
14910   printf (_("    Provider: %s\n"), provider);
14911   printf (_("    Name: %s\n"), probe);
14912   printf (_("    Location: "));
14913   print_vma (pc, FULL_HEX);
14914   printf (_(", Base: "));
14915   print_vma (base_addr, FULL_HEX);
14916   printf (_(", Semaphore: "));
14917   print_vma (semaphore, FULL_HEX);
14918   printf ("\n");
14919   printf (_("    Arguments: %s\n"), arg_fmt);
14920
14921   return data == data_end;
14922 }
14923
14924 static const char *
14925 get_ia64_vms_note_type (unsigned e_type)
14926 {
14927   static char buff[64];
14928
14929   switch (e_type)
14930     {
14931     case NT_VMS_MHD:
14932       return _("NT_VMS_MHD (module header)");
14933     case NT_VMS_LNM:
14934       return _("NT_VMS_LNM (language name)");
14935     case NT_VMS_SRC:
14936       return _("NT_VMS_SRC (source files)");
14937     case NT_VMS_TITLE:
14938       return "NT_VMS_TITLE";
14939     case NT_VMS_EIDC:
14940       return _("NT_VMS_EIDC (consistency check)");
14941     case NT_VMS_FPMODE:
14942       return _("NT_VMS_FPMODE (FP mode)");
14943     case NT_VMS_LINKTIME:
14944       return "NT_VMS_LINKTIME";
14945     case NT_VMS_IMGNAM:
14946       return _("NT_VMS_IMGNAM (image name)");
14947     case NT_VMS_IMGID:
14948       return _("NT_VMS_IMGID (image id)");
14949     case NT_VMS_LINKID:
14950       return _("NT_VMS_LINKID (link id)");
14951     case NT_VMS_IMGBID:
14952       return _("NT_VMS_IMGBID (build id)");
14953     case NT_VMS_GSTNAM:
14954       return _("NT_VMS_GSTNAM (sym table name)");
14955     case NT_VMS_ORIG_DYN:
14956       return "NT_VMS_ORIG_DYN";
14957     case NT_VMS_PATCHTIME:
14958       return "NT_VMS_PATCHTIME";
14959     default:
14960       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
14961       return buff;
14962     }
14963 }
14964
14965 static int
14966 print_ia64_vms_note (Elf_Internal_Note * pnote)
14967 {
14968   switch (pnote->type)
14969     {
14970     case NT_VMS_MHD:
14971       if (pnote->descsz > 36)
14972         {
14973           size_t l = strlen (pnote->descdata + 34);
14974           printf (_("    Creation date  : %.17s\n"), pnote->descdata);
14975           printf (_("    Last patch date: %.17s\n"), pnote->descdata + 17);
14976           printf (_("    Module name    : %s\n"), pnote->descdata + 34);
14977           printf (_("    Module version : %s\n"), pnote->descdata + 34 + l + 1);
14978         }
14979       else
14980         printf (_("    Invalid size\n"));
14981       break;
14982     case NT_VMS_LNM:
14983       printf (_("   Language: %s\n"), pnote->descdata);
14984       break;
14985 #ifdef BFD64
14986     case NT_VMS_FPMODE:
14987       printf (_("   Floating Point mode: "));
14988       printf ("0x%016" BFD_VMA_FMT "x\n",
14989               (bfd_vma) byte_get ((unsigned char *)pnote->descdata, 8));
14990       break;
14991     case NT_VMS_LINKTIME:
14992       printf (_("   Link time: "));
14993       print_vms_time
14994         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
14995       printf ("\n");
14996       break;
14997     case NT_VMS_PATCHTIME:
14998       printf (_("   Patch time: "));
14999       print_vms_time
15000         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
15001       printf ("\n");
15002       break;
15003     case NT_VMS_ORIG_DYN:
15004       printf (_("   Major id: %u,  minor id: %u\n"),
15005               (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
15006               (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
15007       printf (_("   Last modified  : "));
15008       print_vms_time
15009         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
15010       printf (_("\n   Link flags  : "));
15011       printf ("0x%016" BFD_VMA_FMT "x\n",
15012               (bfd_vma) byte_get ((unsigned char *)pnote->descdata + 16, 8));
15013       printf (_("   Header flags: 0x%08x\n"),
15014               (unsigned) byte_get ((unsigned char *)pnote->descdata + 24, 4));
15015       printf (_("   Image id    : %s\n"), pnote->descdata + 32);
15016       break;
15017 #endif
15018     case NT_VMS_IMGNAM:
15019       printf (_("    Image name: %s\n"), pnote->descdata);
15020       break;
15021     case NT_VMS_GSTNAM:
15022       printf (_("    Global symbol table name: %s\n"), pnote->descdata);
15023       break;
15024     case NT_VMS_IMGID:
15025       printf (_("    Image id: %s\n"), pnote->descdata);
15026       break;
15027     case NT_VMS_LINKID:
15028       printf (_("    Linker id: %s\n"), pnote->descdata);
15029       break;
15030     default:
15031       break;
15032     }
15033   return 1;
15034 }
15035
15036 /* Note that by the ELF standard, the name field is already null byte
15037    terminated, and namesz includes the terminating null byte.
15038    I.E. the value of namesz for the name "FSF" is 4.
15039
15040    If the value of namesz is zero, there is no name present.  */
15041 static int
15042 process_note (Elf_Internal_Note * pnote)
15043 {
15044   const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
15045   const char * nt;
15046
15047   if (pnote->namesz == 0)
15048     /* If there is no note name, then use the default set of
15049        note type strings.  */
15050     nt = get_note_type (pnote->type);
15051
15052   else if (const_strneq (pnote->namedata, "GNU"))
15053     /* GNU-specific object file notes.  */
15054     nt = get_gnu_elf_note_type (pnote->type);
15055
15056   else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
15057     /* NetBSD-specific core file notes.  */
15058     nt = get_netbsd_elfcore_note_type (pnote->type);
15059
15060   else if (strneq (pnote->namedata, "SPU/", 4))
15061     {
15062       /* SPU-specific core file notes.  */
15063       nt = pnote->namedata + 4;
15064       name = "SPU";
15065     }
15066
15067   else if (const_strneq (pnote->namedata, "IPF/VMS"))
15068     /* VMS/ia64-specific file notes.  */
15069     nt = get_ia64_vms_note_type (pnote->type);
15070
15071   else if (const_strneq (pnote->namedata, "stapsdt"))
15072     nt = get_stapsdt_note_type (pnote->type);
15073
15074   else
15075     /* Don't recognize this note name; just use the default set of
15076        note type strings.  */
15077     nt = get_note_type (pnote->type);
15078
15079   printf ("  %-20s 0x%08lx\t%s\n", name, pnote->descsz, nt);
15080
15081   if (const_strneq (pnote->namedata, "IPF/VMS"))
15082     return print_ia64_vms_note (pnote);
15083   else if (const_strneq (pnote->namedata, "GNU"))
15084     return print_gnu_note (pnote);
15085   else if (const_strneq (pnote->namedata, "stapsdt"))
15086     return print_stapsdt_note (pnote);
15087   else if (const_strneq (pnote->namedata, "CORE"))
15088     return print_core_note (pnote);
15089   else
15090     return 1;
15091 }
15092
15093
15094 static int
15095 process_corefile_note_segment (FILE * file, bfd_vma offset, bfd_vma length)
15096 {
15097   Elf_External_Note * pnotes;
15098   Elf_External_Note * external;
15099   int res = 1;
15100
15101   if (length <= 0)
15102     return 0;
15103
15104   pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
15105                                            _("notes"));
15106   if (pnotes == NULL)
15107     return 0;
15108
15109   external = pnotes;
15110
15111   printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
15112           (unsigned long) offset, (unsigned long) length);
15113   printf (_("  %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
15114
15115   while ((char *) external < (char *) pnotes + length)
15116     {
15117       Elf_Internal_Note inote;
15118       size_t min_notesz;
15119       char *next;
15120       char * temp = NULL;
15121       size_t data_remaining = ((char *) pnotes + length) - (char *) external;
15122
15123       if (!is_ia64_vms ())
15124         {
15125           /* PR binutils/15191
15126              Make sure that there is enough data to read.  */
15127           min_notesz = offsetof (Elf_External_Note, name);
15128           if (data_remaining < min_notesz)
15129             {
15130               warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
15131                     (int) data_remaining);
15132               break;
15133             }
15134           inote.type     = BYTE_GET (external->type);
15135           inote.namesz   = BYTE_GET (external->namesz);
15136           inote.namedata = external->name;
15137           inote.descsz   = BYTE_GET (external->descsz);
15138           inote.descdata = inote.namedata + align_power (inote.namesz, 2);
15139           /* PR 17531: file: 3443835e.  */
15140           if (inote.descdata < (char *) pnotes)
15141             {
15142               warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
15143               inote.descdata = inote.namedata;
15144               inote.namesz   = 0;
15145             }
15146           inote.descpos  = offset + (inote.descdata - (char *) pnotes);
15147           next = inote.descdata + align_power (inote.descsz, 2);
15148         }
15149       else
15150         {
15151           Elf64_External_VMS_Note *vms_external;
15152
15153           /* PR binutils/15191
15154              Make sure that there is enough data to read.  */
15155           min_notesz = offsetof (Elf64_External_VMS_Note, name);
15156           if (data_remaining < min_notesz)
15157             {
15158               warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
15159                     (int) data_remaining);
15160               break;
15161             }
15162
15163           vms_external = (Elf64_External_VMS_Note *) external;
15164           inote.type     = BYTE_GET (vms_external->type);
15165           inote.namesz   = BYTE_GET (vms_external->namesz);
15166           inote.namedata = vms_external->name;
15167           inote.descsz   = BYTE_GET (vms_external->descsz);
15168           inote.descdata = inote.namedata + align_power (inote.namesz, 3);
15169           inote.descpos  = offset + (inote.descdata - (char *) pnotes);
15170           next = inote.descdata + align_power (inote.descsz, 3);
15171         }
15172
15173       if (inote.descdata < (char *) external + min_notesz
15174           || next < (char *) external + min_notesz
15175           /* PR binutils/17531: file: id:000000,sig:11,src:006986,op:havoc,rep:4.  */
15176           || inote.namedata + inote.namesz < inote.namedata
15177           || inote.descdata + inote.descsz < inote.descdata
15178           || data_remaining < (size_t)(next - (char *) external))
15179         {
15180           warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
15181                 (unsigned long) ((char *) external - (char *) pnotes));
15182           warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx\n"),
15183                 inote.type, inote.namesz, inote.descsz);
15184           break;
15185         }
15186
15187       external = (Elf_External_Note *) next;
15188
15189       /* Verify that name is null terminated.  It appears that at least
15190          one version of Linux (RedHat 6.0) generates corefiles that don't
15191          comply with the ELF spec by failing to include the null byte in
15192          namesz.  */
15193       if (inote.namedata[inote.namesz - 1] != '\0')
15194         {
15195           temp = (char *) malloc (inote.namesz + 1);
15196           if (temp == NULL)
15197             {
15198               error (_("Out of memory allocating space for inote name\n"));
15199               res = 0;
15200               break;
15201             }
15202
15203           strncpy (temp, inote.namedata, inote.namesz);
15204           temp[inote.namesz] = 0;
15205
15206           /* warn (_("'%s' NOTE name not properly null terminated\n"), temp);  */
15207           inote.namedata = temp;
15208         }
15209
15210       res &= process_note (& inote);
15211
15212       if (temp != NULL)
15213         {
15214           free (temp);
15215           temp = NULL;
15216         }
15217     }
15218
15219   free (pnotes);
15220
15221   return res;
15222 }
15223
15224 static int
15225 process_corefile_note_segments (FILE * file)
15226 {
15227   Elf_Internal_Phdr * segment;
15228   unsigned int i;
15229   int res = 1;
15230
15231   if (! get_program_headers (file))
15232       return 0;
15233
15234   for (i = 0, segment = program_headers;
15235        i < elf_header.e_phnum;
15236        i++, segment++)
15237     {
15238       if (segment->p_type == PT_NOTE)
15239         res &= process_corefile_note_segment (file,
15240                                               (bfd_vma) segment->p_offset,
15241                                               (bfd_vma) segment->p_filesz);
15242     }
15243
15244   return res;
15245 }
15246
15247 static int
15248 process_note_sections (FILE * file)
15249 {
15250   Elf_Internal_Shdr * section;
15251   unsigned long i;
15252   int n = 0;
15253   int res = 1;
15254
15255   for (i = 0, section = section_headers;
15256        i < elf_header.e_shnum && section != NULL;
15257        i++, section++)
15258     if (section->sh_type == SHT_NOTE)
15259       {
15260         res &= process_corefile_note_segment (file,
15261                                               (bfd_vma) section->sh_offset,
15262                                               (bfd_vma) section->sh_size);
15263         n++;
15264       }
15265
15266   if (n == 0)
15267     /* Try processing NOTE segments instead.  */
15268     return process_corefile_note_segments (file);
15269
15270   return res;
15271 }
15272
15273 static int
15274 process_notes (FILE * file)
15275 {
15276   /* If we have not been asked to display the notes then do nothing.  */
15277   if (! do_notes)
15278     return 1;
15279
15280   if (elf_header.e_type != ET_CORE)
15281     return process_note_sections (file);
15282
15283   /* No program headers means no NOTE segment.  */
15284   if (elf_header.e_phnum > 0)
15285     return process_corefile_note_segments (file);
15286
15287   printf (_("No note segments present in the core file.\n"));
15288   return 1;
15289 }
15290
15291 static int
15292 process_arch_specific (FILE * file)
15293 {
15294   if (! do_arch)
15295     return 1;
15296
15297   switch (elf_header.e_machine)
15298     {
15299     case EM_ARM:
15300       return process_arm_specific (file);
15301     case EM_MIPS:
15302     case EM_MIPS_RS3_LE:
15303       return process_mips_specific (file);
15304       break;
15305     case EM_NDS32:
15306       return process_nds32_specific (file);
15307       break;
15308     case EM_PPC:
15309       return process_power_specific (file);
15310       break;
15311     case EM_SPARC:
15312     case EM_SPARC32PLUS:
15313     case EM_SPARCV9:
15314       return process_sparc_specific (file);
15315       break;
15316     case EM_TI_C6000:
15317       return process_tic6x_specific (file);
15318       break;
15319     case EM_MSP430:
15320       return process_msp430x_specific (file);
15321     default:
15322       break;
15323     }
15324   return 1;
15325 }
15326
15327 static int
15328 get_file_header (FILE * file)
15329 {
15330   /* Read in the identity array.  */
15331   if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
15332     return 0;
15333
15334   /* Determine how to read the rest of the header.  */
15335   switch (elf_header.e_ident[EI_DATA])
15336     {
15337     default: /* fall through */
15338     case ELFDATANONE: /* fall through */
15339     case ELFDATA2LSB:
15340       byte_get = byte_get_little_endian;
15341       byte_put = byte_put_little_endian;
15342       break;
15343     case ELFDATA2MSB:
15344       byte_get = byte_get_big_endian;
15345       byte_put = byte_put_big_endian;
15346       break;
15347     }
15348
15349   /* For now we only support 32 bit and 64 bit ELF files.  */
15350   is_32bit_elf = (elf_header.e_ident[EI_CLASS] != ELFCLASS64);
15351
15352   /* Read in the rest of the header.  */
15353   if (is_32bit_elf)
15354     {
15355       Elf32_External_Ehdr ehdr32;
15356
15357       if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
15358         return 0;
15359
15360       elf_header.e_type      = BYTE_GET (ehdr32.e_type);
15361       elf_header.e_machine   = BYTE_GET (ehdr32.e_machine);
15362       elf_header.e_version   = BYTE_GET (ehdr32.e_version);
15363       elf_header.e_entry     = BYTE_GET (ehdr32.e_entry);
15364       elf_header.e_phoff     = BYTE_GET (ehdr32.e_phoff);
15365       elf_header.e_shoff     = BYTE_GET (ehdr32.e_shoff);
15366       elf_header.e_flags     = BYTE_GET (ehdr32.e_flags);
15367       elf_header.e_ehsize    = BYTE_GET (ehdr32.e_ehsize);
15368       elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
15369       elf_header.e_phnum     = BYTE_GET (ehdr32.e_phnum);
15370       elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
15371       elf_header.e_shnum     = BYTE_GET (ehdr32.e_shnum);
15372       elf_header.e_shstrndx  = BYTE_GET (ehdr32.e_shstrndx);
15373     }
15374   else
15375     {
15376       Elf64_External_Ehdr ehdr64;
15377
15378       /* If we have been compiled with sizeof (bfd_vma) == 4, then
15379          we will not be able to cope with the 64bit data found in
15380          64 ELF files.  Detect this now and abort before we start
15381          overwriting things.  */
15382       if (sizeof (bfd_vma) < 8)
15383         {
15384           error (_("This instance of readelf has been built without support for a\n\
15385 64 bit data type and so it cannot read 64 bit ELF files.\n"));
15386           return 0;
15387         }
15388
15389       if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
15390         return 0;
15391
15392       elf_header.e_type      = BYTE_GET (ehdr64.e_type);
15393       elf_header.e_machine   = BYTE_GET (ehdr64.e_machine);
15394       elf_header.e_version   = BYTE_GET (ehdr64.e_version);
15395       elf_header.e_entry     = BYTE_GET (ehdr64.e_entry);
15396       elf_header.e_phoff     = BYTE_GET (ehdr64.e_phoff);
15397       elf_header.e_shoff     = BYTE_GET (ehdr64.e_shoff);
15398       elf_header.e_flags     = BYTE_GET (ehdr64.e_flags);
15399       elf_header.e_ehsize    = BYTE_GET (ehdr64.e_ehsize);
15400       elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
15401       elf_header.e_phnum     = BYTE_GET (ehdr64.e_phnum);
15402       elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
15403       elf_header.e_shnum     = BYTE_GET (ehdr64.e_shnum);
15404       elf_header.e_shstrndx  = BYTE_GET (ehdr64.e_shstrndx);
15405     }
15406
15407   if (elf_header.e_shoff)
15408     {
15409       /* There may be some extensions in the first section header.  Don't
15410          bomb if we can't read it.  */
15411       if (is_32bit_elf)
15412         get_32bit_section_headers (file, TRUE);
15413       else
15414         get_64bit_section_headers (file, TRUE);
15415     }
15416
15417   return 1;
15418 }
15419
15420 /* Process one ELF object file according to the command line options.
15421    This file may actually be stored in an archive.  The file is
15422    positioned at the start of the ELF object.  */
15423
15424 static int
15425 process_object (char * file_name, FILE * file)
15426 {
15427   unsigned int i;
15428
15429   if (! get_file_header (file))
15430     {
15431       error (_("%s: Failed to read file header\n"), file_name);
15432       return 1;
15433     }
15434
15435   /* Initialise per file variables.  */
15436   for (i = ARRAY_SIZE (version_info); i--;)
15437     version_info[i] = 0;
15438
15439   for (i = ARRAY_SIZE (dynamic_info); i--;)
15440     dynamic_info[i] = 0;
15441   dynamic_info_DT_GNU_HASH = 0;
15442
15443   /* Process the file.  */
15444   if (show_name)
15445     printf (_("\nFile: %s\n"), file_name);
15446
15447   /* Initialise the dump_sects array from the cmdline_dump_sects array.
15448      Note we do this even if cmdline_dump_sects is empty because we
15449      must make sure that the dump_sets array is zeroed out before each
15450      object file is processed.  */
15451   if (num_dump_sects > num_cmdline_dump_sects)
15452     memset (dump_sects, 0, num_dump_sects * sizeof (* dump_sects));
15453
15454   if (num_cmdline_dump_sects > 0)
15455     {
15456       if (num_dump_sects == 0)
15457         /* A sneaky way of allocating the dump_sects array.  */
15458         request_dump_bynumber (num_cmdline_dump_sects, 0);
15459
15460       assert (num_dump_sects >= num_cmdline_dump_sects);
15461       memcpy (dump_sects, cmdline_dump_sects,
15462               num_cmdline_dump_sects * sizeof (* dump_sects));
15463     }
15464
15465   if (! process_file_header ())
15466     return 1;
15467
15468   if (! process_section_headers (file))
15469     {
15470       /* Without loaded section headers we cannot process lots of
15471          things.  */
15472       do_unwind = do_version = do_dump = do_arch = 0;
15473
15474       if (! do_using_dynamic)
15475         do_syms = do_dyn_syms = do_reloc = 0;
15476     }
15477
15478   if (! process_section_groups (file))
15479     {
15480       /* Without loaded section groups we cannot process unwind.  */
15481       do_unwind = 0;
15482     }
15483
15484   if (process_program_headers (file))
15485     process_dynamic_section (file);
15486
15487   process_relocs (file);
15488
15489   process_unwind (file);
15490
15491   process_symbol_table (file);
15492
15493   process_syminfo (file);
15494
15495   process_version_sections (file);
15496
15497   process_section_contents (file);
15498
15499   process_notes (file);
15500
15501   process_gnu_liblist (file);
15502
15503   process_arch_specific (file);
15504
15505   if (program_headers)
15506     {
15507       free (program_headers);
15508       program_headers = NULL;
15509     }
15510
15511   if (section_headers)
15512     {
15513       free (section_headers);
15514       section_headers = NULL;
15515     }
15516
15517   if (string_table)
15518     {
15519       free (string_table);
15520       string_table = NULL;
15521       string_table_length = 0;
15522     }
15523
15524   if (dynamic_strings)
15525     {
15526       free (dynamic_strings);
15527       dynamic_strings = NULL;
15528       dynamic_strings_length = 0;
15529     }
15530
15531   if (dynamic_symbols)
15532     {
15533       free (dynamic_symbols);
15534       dynamic_symbols = NULL;
15535       num_dynamic_syms = 0;
15536     }
15537
15538   if (dynamic_syminfo)
15539     {
15540       free (dynamic_syminfo);
15541       dynamic_syminfo = NULL;
15542     }
15543
15544   if (dynamic_section)
15545     {
15546       free (dynamic_section);
15547       dynamic_section = NULL;
15548     }
15549
15550   if (section_headers_groups)
15551     {
15552       free (section_headers_groups);
15553       section_headers_groups = NULL;
15554     }
15555
15556   if (section_groups)
15557     {
15558       struct group_list * g;
15559       struct group_list * next;
15560
15561       for (i = 0; i < group_count; i++)
15562         {
15563           for (g = section_groups [i].root; g != NULL; g = next)
15564             {
15565               next = g->next;
15566               free (g);
15567             }
15568         }
15569
15570       free (section_groups);
15571       section_groups = NULL;
15572     }
15573
15574   free_debug_memory ();
15575
15576   return 0;
15577 }
15578
15579 /* Process an ELF archive.
15580    On entry the file is positioned just after the ARMAG string.  */
15581
15582 static int
15583 process_archive (char * file_name, FILE * file, bfd_boolean is_thin_archive)
15584 {
15585   struct archive_info arch;
15586   struct archive_info nested_arch;
15587   size_t got;
15588   int ret;
15589
15590   show_name = 1;
15591
15592   /* The ARCH structure is used to hold information about this archive.  */
15593   arch.file_name = NULL;
15594   arch.file = NULL;
15595   arch.index_array = NULL;
15596   arch.sym_table = NULL;
15597   arch.longnames = NULL;
15598
15599   /* The NESTED_ARCH structure is used as a single-item cache of information
15600      about a nested archive (when members of a thin archive reside within
15601      another regular archive file).  */
15602   nested_arch.file_name = NULL;
15603   nested_arch.file = NULL;
15604   nested_arch.index_array = NULL;
15605   nested_arch.sym_table = NULL;
15606   nested_arch.longnames = NULL;
15607
15608   if (setup_archive (&arch, file_name, file, is_thin_archive, do_archive_index) != 0)
15609     {
15610       ret = 1;
15611       goto out;
15612     }
15613
15614   if (do_archive_index)
15615     {
15616       if (arch.sym_table == NULL)
15617         error (_("%s: unable to dump the index as none was found\n"), file_name);
15618       else
15619         {
15620           unsigned long i, l;
15621           unsigned long current_pos;
15622
15623           printf (_("Index of archive %s: (%lu entries, 0x%lx bytes in the symbol table)\n"),
15624                   file_name, (unsigned long) arch.index_num, arch.sym_size);
15625           current_pos = ftell (file);
15626
15627           for (i = l = 0; i < arch.index_num; i++)
15628             {
15629               if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
15630                 {
15631                   char * member_name;
15632
15633                   member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
15634
15635                   if (member_name != NULL)
15636                     {
15637                       char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
15638
15639                       if (qualified_name != NULL)
15640                         {
15641                           printf (_("Contents of binary %s at offset "), qualified_name);
15642                           (void) print_vma (arch.index_array[i], PREFIX_HEX);
15643                           putchar ('\n');
15644                           free (qualified_name);
15645                         }
15646                     }
15647                 }
15648
15649               if (l >= arch.sym_size)
15650                 {
15651                   error (_("%s: end of the symbol table reached before the end of the index\n"),
15652                          file_name);
15653                   break;
15654                 }
15655               /* PR 17531: file: 0b6630b2.  */
15656               printf ("\t%.*s\n", (int) (arch.sym_size - l), arch.sym_table + l);
15657               l += strnlen (arch.sym_table + l, arch.sym_size - l) + 1;
15658             }
15659
15660           if (arch.uses_64bit_indicies)
15661             l = (l + 7) & ~ 7;
15662           else
15663             l += l & 1;
15664
15665           if (l < arch.sym_size)
15666             error (_("%s: %ld bytes remain in the symbol table, but without corresponding entries in the index table\n"),
15667                    file_name, arch.sym_size - l);
15668
15669           if (fseek (file, current_pos, SEEK_SET) != 0)
15670             {
15671               error (_("%s: failed to seek back to start of object files in the archive\n"), file_name);
15672               ret = 1;
15673               goto out;
15674             }
15675         }
15676
15677       if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
15678           && !do_segments && !do_header && !do_dump && !do_version
15679           && !do_histogram && !do_debugging && !do_arch && !do_notes
15680           && !do_section_groups && !do_dyn_syms)
15681         {
15682           ret = 0; /* Archive index only.  */
15683           goto out;
15684         }
15685     }
15686
15687   ret = 0;
15688
15689   while (1)
15690     {
15691       char * name;
15692       size_t namelen;
15693       char * qualified_name;
15694
15695       /* Read the next archive header.  */
15696       if (fseek (file, arch.next_arhdr_offset, SEEK_SET) != 0)
15697         {
15698           error (_("%s: failed to seek to next archive header\n"), file_name);
15699           return 1;
15700         }
15701       got = fread (&arch.arhdr, 1, sizeof arch.arhdr, file);
15702       if (got != sizeof arch.arhdr)
15703         {
15704           if (got == 0)
15705             break;
15706           error (_("%s: failed to read archive header\n"), file_name);
15707           ret = 1;
15708           break;
15709         }
15710       if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
15711         {
15712           error (_("%s: did not find a valid archive header\n"), arch.file_name);
15713           ret = 1;
15714           break;
15715         }
15716
15717       arch.next_arhdr_offset += sizeof arch.arhdr;
15718
15719       archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
15720       if (archive_file_size & 01)
15721         ++archive_file_size;
15722
15723       name = get_archive_member_name (&arch, &nested_arch);
15724       if (name == NULL)
15725         {
15726           error (_("%s: bad archive file name\n"), file_name);
15727           ret = 1;
15728           break;
15729         }
15730       namelen = strlen (name);
15731
15732       qualified_name = make_qualified_name (&arch, &nested_arch, name);
15733       if (qualified_name == NULL)
15734         {
15735           error (_("%s: bad archive file name\n"), file_name);
15736           ret = 1;
15737           break;
15738         }
15739
15740       if (is_thin_archive && arch.nested_member_origin == 0)
15741         {
15742           /* This is a proxy for an external member of a thin archive.  */
15743           FILE * member_file;
15744           char * member_file_name = adjust_relative_path (file_name, name, namelen);
15745           if (member_file_name == NULL)
15746             {
15747               ret = 1;
15748               break;
15749             }
15750
15751           member_file = fopen (member_file_name, "rb");
15752           if (member_file == NULL)
15753             {
15754               error (_("Input file '%s' is not readable.\n"), member_file_name);
15755               free (member_file_name);
15756               ret = 1;
15757               break;
15758             }
15759
15760           archive_file_offset = arch.nested_member_origin;
15761
15762           ret |= process_object (qualified_name, member_file);
15763
15764           fclose (member_file);
15765           free (member_file_name);
15766         }
15767       else if (is_thin_archive)
15768         {
15769           /* PR 15140: Allow for corrupt thin archives.  */
15770           if (nested_arch.file == NULL)
15771             {
15772               error (_("%s: contains corrupt thin archive: %s\n"),
15773                      file_name, name);
15774               ret = 1;
15775               break;
15776             }
15777
15778           /* This is a proxy for a member of a nested archive.  */
15779           archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
15780
15781           /* The nested archive file will have been opened and setup by
15782              get_archive_member_name.  */
15783           if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
15784             {
15785               error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
15786               ret = 1;
15787               break;
15788             }
15789
15790           ret |= process_object (qualified_name, nested_arch.file);
15791         }
15792       else
15793         {
15794           archive_file_offset = arch.next_arhdr_offset;
15795           arch.next_arhdr_offset += archive_file_size;
15796
15797           ret |= process_object (qualified_name, file);
15798         }
15799
15800       if (dump_sects != NULL)
15801         {
15802           free (dump_sects);
15803           dump_sects = NULL;
15804           num_dump_sects = 0;
15805         }
15806
15807       free (qualified_name);
15808     }
15809
15810  out:
15811   if (nested_arch.file != NULL)
15812     fclose (nested_arch.file);
15813   release_archive (&nested_arch);
15814   release_archive (&arch);
15815
15816   return ret;
15817 }
15818
15819 static int
15820 process_file (char * file_name)
15821 {
15822   FILE * file;
15823   struct stat statbuf;
15824   char armag[SARMAG];
15825   int ret;
15826
15827   if (stat (file_name, &statbuf) < 0)
15828     {
15829       if (errno == ENOENT)
15830         error (_("'%s': No such file\n"), file_name);
15831       else
15832         error (_("Could not locate '%s'.  System error message: %s\n"),
15833                file_name, strerror (errno));
15834       return 1;
15835     }
15836
15837   if (! S_ISREG (statbuf.st_mode))
15838     {
15839       error (_("'%s' is not an ordinary file\n"), file_name);
15840       return 1;
15841     }
15842
15843   file = fopen (file_name, "rb");
15844   if (file == NULL)
15845     {
15846       error (_("Input file '%s' is not readable.\n"), file_name);
15847       return 1;
15848     }
15849
15850   if (fread (armag, SARMAG, 1, file) != 1)
15851     {
15852       error (_("%s: Failed to read file's magic number\n"), file_name);
15853       fclose (file);
15854       return 1;
15855     }
15856
15857   current_file_size = (bfd_size_type) statbuf.st_size;
15858
15859   if (memcmp (armag, ARMAG, SARMAG) == 0)
15860     ret = process_archive (file_name, file, FALSE);
15861   else if (memcmp (armag, ARMAGT, SARMAG) == 0)
15862     ret = process_archive (file_name, file, TRUE);
15863   else
15864     {
15865       if (do_archive_index)
15866         error (_("File %s is not an archive so its index cannot be displayed.\n"),
15867                file_name);
15868
15869       rewind (file);
15870       archive_file_size = archive_file_offset = 0;
15871       ret = process_object (file_name, file);
15872     }
15873
15874   fclose (file);
15875
15876   current_file_size = 0;
15877   return ret;
15878 }
15879
15880 #ifdef SUPPORT_DISASSEMBLY
15881 /* Needed by the i386 disassembler.  For extra credit, someone could
15882    fix this so that we insert symbolic addresses here, esp for GOT/PLT
15883    symbols.  */
15884
15885 void
15886 print_address (unsigned int addr, FILE * outfile)
15887 {
15888   fprintf (outfile,"0x%8.8x", addr);
15889 }
15890
15891 /* Needed by the i386 disassembler.  */
15892 void
15893 db_task_printsym (unsigned int addr)
15894 {
15895   print_address (addr, stderr);
15896 }
15897 #endif
15898
15899 int
15900 main (int argc, char ** argv)
15901 {
15902   int err;
15903
15904 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
15905   setlocale (LC_MESSAGES, "");
15906 #endif
15907 #if defined (HAVE_SETLOCALE)
15908   setlocale (LC_CTYPE, "");
15909 #endif
15910   bindtextdomain (PACKAGE, LOCALEDIR);
15911   textdomain (PACKAGE);
15912
15913   expandargv (&argc, &argv);
15914
15915   parse_args (argc, argv);
15916
15917   if (num_dump_sects > 0)
15918     {
15919       /* Make a copy of the dump_sects array.  */
15920       cmdline_dump_sects = (dump_type *)
15921           malloc (num_dump_sects * sizeof (* dump_sects));
15922       if (cmdline_dump_sects == NULL)
15923         error (_("Out of memory allocating dump request table.\n"));
15924       else
15925         {
15926           memcpy (cmdline_dump_sects, dump_sects,
15927                   num_dump_sects * sizeof (* dump_sects));
15928           num_cmdline_dump_sects = num_dump_sects;
15929         }
15930     }
15931
15932   if (optind < (argc - 1))
15933     show_name = 1;
15934
15935   err = 0;
15936   while (optind < argc)
15937     err |= process_file (argv[optind++]);
15938
15939   if (dump_sects != NULL)
15940     free (dump_sects);
15941   if (cmdline_dump_sects != NULL)
15942     free (cmdline_dump_sects);
15943
15944   return err;
15945 }