Add more fixes for inavlid memory accesses triggered by corrupt files.
[external/binutils.git] / binutils / readelf.c
1 /* readelf.c -- display contents of an ELF format file
2    Copyright (C) 1998-2014 Free Software Foundation, Inc.
3
4    Originally developed by Eric Youngdale <eric@andante.jic.com>
5    Modifications by Nick Clifton <nickc@redhat.com>
6
7    This file is part of GNU Binutils.
8
9    This program is free software; you can redistribute it and/or modify
10    it under the terms of the GNU General Public License as published by
11    the Free Software Foundation; either version 3 of the License, or
12    (at your option) any later version.
13
14    This program is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17    GNU General Public License for more details.
18
19    You should have received a copy of the GNU General Public License
20    along with this program; if not, write to the Free Software
21    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
22    02110-1301, USA.  */
23 \f
24 /* The difference between readelf and objdump:
25
26   Both programs are capable of displaying the contents of ELF format files,
27   so why does the binutils project have two file dumpers ?
28
29   The reason is that objdump sees an ELF file through a BFD filter of the
30   world; if BFD has a bug where, say, it disagrees about a machine constant
31   in e_flags, then the odds are good that it will remain internally
32   consistent.  The linker sees it the BFD way, objdump sees it the BFD way,
33   GAS sees it the BFD way.  There was need for a tool to go find out what
34   the file actually says.
35
36   This is why the readelf program does not link against the BFD library - it
37   exists as an independent program to help verify the correct working of BFD.
38
39   There is also the case that readelf can provide more information about an
40   ELF file than is provided by objdump.  In particular it can display DWARF
41   debugging information which (at the moment) objdump cannot.  */
42 \f
43 #include "sysdep.h"
44 #include <assert.h>
45 #include <time.h>
46 #ifdef HAVE_ZLIB_H
47 #include <zlib.h>
48 #endif
49 #ifdef HAVE_WCHAR_H
50 #include <wchar.h>
51 #endif
52
53 #if __GNUC__ >= 2
54 /* Define BFD64 here, even if our default architecture is 32 bit ELF
55    as this will allow us to read in and parse 64bit and 32bit ELF files.
56    Only do this if we believe that the compiler can support a 64 bit
57    data type.  For now we only rely on GCC being able to do this.  */
58 #define BFD64
59 #endif
60
61 #include "bfd.h"
62 #include "bucomm.h"
63 #include "elfcomm.h"
64 #include "dwarf.h"
65
66 #include "elf/common.h"
67 #include "elf/external.h"
68 #include "elf/internal.h"
69
70
71 /* Included here, before RELOC_MACROS_GEN_FUNC is defined, so that
72    we can obtain the H8 reloc numbers.  We need these for the
73    get_reloc_size() function.  We include h8.h again after defining
74    RELOC_MACROS_GEN_FUNC so that we get the naming function as well.  */
75
76 #include "elf/h8.h"
77 #undef _ELF_H8_H
78
79 /* Undo the effects of #including reloc-macros.h.  */
80
81 #undef START_RELOC_NUMBERS
82 #undef RELOC_NUMBER
83 #undef FAKE_RELOC
84 #undef EMPTY_RELOC
85 #undef END_RELOC_NUMBERS
86 #undef _RELOC_MACROS_H
87
88 /* The following headers use the elf/reloc-macros.h file to
89    automatically generate relocation recognition functions
90    such as elf_mips_reloc_type()  */
91
92 #define RELOC_MACROS_GEN_FUNC
93
94 #include "elf/aarch64.h"
95 #include "elf/alpha.h"
96 #include "elf/arc.h"
97 #include "elf/arm.h"
98 #include "elf/avr.h"
99 #include "elf/bfin.h"
100 #include "elf/cr16.h"
101 #include "elf/cris.h"
102 #include "elf/crx.h"
103 #include "elf/d10v.h"
104 #include "elf/d30v.h"
105 #include "elf/dlx.h"
106 #include "elf/epiphany.h"
107 #include "elf/fr30.h"
108 #include "elf/frv.h"
109 #include "elf/h8.h"
110 #include "elf/hppa.h"
111 #include "elf/i386.h"
112 #include "elf/i370.h"
113 #include "elf/i860.h"
114 #include "elf/i960.h"
115 #include "elf/ia64.h"
116 #include "elf/ip2k.h"
117 #include "elf/lm32.h"
118 #include "elf/iq2000.h"
119 #include "elf/m32c.h"
120 #include "elf/m32r.h"
121 #include "elf/m68k.h"
122 #include "elf/m68hc11.h"
123 #include "elf/mcore.h"
124 #include "elf/mep.h"
125 #include "elf/metag.h"
126 #include "elf/microblaze.h"
127 #include "elf/mips.h"
128 #include "elf/mmix.h"
129 #include "elf/mn10200.h"
130 #include "elf/mn10300.h"
131 #include "elf/moxie.h"
132 #include "elf/mt.h"
133 #include "elf/msp430.h"
134 #include "elf/nds32.h"
135 #include "elf/nios2.h"
136 #include "elf/or1k.h"
137 #include "elf/pj.h"
138 #include "elf/ppc.h"
139 #include "elf/ppc64.h"
140 #include "elf/rl78.h"
141 #include "elf/rx.h"
142 #include "elf/s390.h"
143 #include "elf/score.h"
144 #include "elf/sh.h"
145 #include "elf/sparc.h"
146 #include "elf/spu.h"
147 #include "elf/tic6x.h"
148 #include "elf/tilegx.h"
149 #include "elf/tilepro.h"
150 #include "elf/v850.h"
151 #include "elf/vax.h"
152 #include "elf/x86-64.h"
153 #include "elf/xc16x.h"
154 #include "elf/xgate.h"
155 #include "elf/xstormy16.h"
156 #include "elf/xtensa.h"
157
158 #include "getopt.h"
159 #include "libiberty.h"
160 #include "safe-ctype.h"
161 #include "filenames.h"
162
163 #ifndef offsetof
164 #define offsetof(TYPE, MEMBER) ((size_t) &(((TYPE *) 0)->MEMBER))
165 #endif
166
167 char * program_name = "readelf";
168 static long archive_file_offset;
169 static unsigned long archive_file_size;
170 static bfd_size_type current_file_size;
171 static unsigned long dynamic_addr;
172 static bfd_size_type dynamic_size;
173 static unsigned int dynamic_nent;
174 static char * dynamic_strings;
175 static unsigned long dynamic_strings_length;
176 static char * string_table;
177 static unsigned long string_table_length;
178 static unsigned long num_dynamic_syms;
179 static Elf_Internal_Sym * dynamic_symbols;
180 static Elf_Internal_Syminfo * dynamic_syminfo;
181 static unsigned long dynamic_syminfo_offset;
182 static unsigned int dynamic_syminfo_nent;
183 static char program_interpreter[PATH_MAX];
184 static bfd_vma dynamic_info[DT_ENCODING];
185 static bfd_vma dynamic_info_DT_GNU_HASH;
186 static bfd_vma version_info[16];
187 static Elf_Internal_Ehdr elf_header;
188 static Elf_Internal_Shdr * section_headers;
189 static Elf_Internal_Phdr * program_headers;
190 static Elf_Internal_Dyn *  dynamic_section;
191 static Elf_Internal_Shdr * symtab_shndx_hdr;
192 static int show_name;
193 static int do_dynamic;
194 static int do_syms;
195 static int do_dyn_syms;
196 static int do_reloc;
197 static int do_sections;
198 static int do_section_groups;
199 static int do_section_details;
200 static int do_segments;
201 static int do_unwind;
202 static int do_using_dynamic;
203 static int do_header;
204 static int do_dump;
205 static int do_version;
206 static int do_histogram;
207 static int do_debugging;
208 static int do_arch;
209 static int do_notes;
210 static int do_archive_index;
211 static int is_32bit_elf;
212
213 struct group_list
214 {
215   struct group_list * next;
216   unsigned int section_index;
217 };
218
219 struct group
220 {
221   struct group_list * root;
222   unsigned int group_index;
223 };
224
225 static size_t group_count;
226 static struct group * section_groups;
227 static struct group ** section_headers_groups;
228
229
230 /* Flag bits indicating particular types of dump.  */
231 #define HEX_DUMP        (1 << 0)        /* The -x command line switch.  */
232 #define DISASS_DUMP     (1 << 1)        /* The -i command line switch.  */
233 #define DEBUG_DUMP      (1 << 2)        /* The -w command line switch.  */
234 #define STRING_DUMP     (1 << 3)        /* The -p command line switch.  */
235 #define RELOC_DUMP      (1 << 4)        /* The -R command line switch.  */
236
237 typedef unsigned char dump_type;
238
239 /* A linked list of the section names for which dumps were requested.  */
240 struct dump_list_entry
241 {
242   char * name;
243   dump_type type;
244   struct dump_list_entry * next;
245 };
246 static struct dump_list_entry * dump_sects_byname;
247
248 /* A dynamic array of flags indicating for which sections a dump
249    has been requested via command line switches.  */
250 static dump_type *   cmdline_dump_sects = NULL;
251 static unsigned int  num_cmdline_dump_sects = 0;
252
253 /* A dynamic array of flags indicating for which sections a dump of
254    some kind has been requested.  It is reset on a per-object file
255    basis and then initialised from the cmdline_dump_sects array,
256    the results of interpreting the -w switch, and the
257    dump_sects_byname list.  */
258 static dump_type *   dump_sects = NULL;
259 static unsigned int  num_dump_sects = 0;
260
261
262 /* How to print a vma value.  */
263 typedef enum print_mode
264 {
265   HEX,
266   DEC,
267   DEC_5,
268   UNSIGNED,
269   PREFIX_HEX,
270   FULL_HEX,
271   LONG_HEX
272 }
273 print_mode;
274
275 #define UNKNOWN -1
276
277 #define SECTION_NAME(X)                                         \
278   ((X) == NULL ? _("<none>")                                    \
279    : string_table == NULL ? _("<no-name>")                      \
280    : ((X)->sh_name >= string_table_length ? _("<corrupt>")      \
281   : string_table + (X)->sh_name))
282
283 #define DT_VERSIONTAGIDX(tag)   (DT_VERNEEDNUM - (tag)) /* Reverse order!  */
284
285 #define GET_ELF_SYMBOLS(file, section, sym_count)                       \
286   (is_32bit_elf ? get_32bit_elf_symbols (file, section, sym_count)      \
287    : get_64bit_elf_symbols (file, section, sym_count))
288
289 #define VALID_DYNAMIC_NAME(offset)      ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
290 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
291    already been called and verified that the string exists.  */
292 #define GET_DYNAMIC_NAME(offset)        (dynamic_strings + offset)
293
294 #define REMOVE_ARCH_BITS(ADDR)                  \
295   do                                            \
296     {                                           \
297       if (elf_header.e_machine == EM_ARM)       \
298         (ADDR) &= ~1;                           \
299     }                                           \
300   while (0)
301 \f
302 /* Retrieve NMEMB structures, each SIZE bytes long from FILE starting at OFFSET.
303    Put the retrieved data into VAR, if it is not NULL.  Otherwise allocate a buffer
304    using malloc and fill that.  In either case return the pointer to the start of
305    the retrieved data or NULL if something went wrong.  If something does go wrong
306    emit an error message using REASON as part of the context.  */
307
308 static void *
309 get_data (void * var, FILE * file, long offset, size_t size, size_t nmemb,
310           const char * reason)
311 {
312   void * mvar;
313
314   if (size == 0 || nmemb == 0)
315     return NULL;
316
317   if (fseek (file, archive_file_offset + offset, SEEK_SET))
318     {
319       if (reason)
320         error (_("Unable to seek to 0x%lx for %s\n"),
321                (unsigned long) archive_file_offset + offset, reason);
322       return NULL;
323     }
324
325   /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
326      attempting to allocate memory when the read is bound to fail.  */
327   if (offset + archive_file_offset + size * nmemb > current_file_size)
328     {
329       if (reason)
330         error (_("Reading 0x%lx bytes extends past end of file for %s\n"),
331                (unsigned long) (size * nmemb), reason);
332       return NULL;
333     }
334
335   mvar = var;
336   if (mvar == NULL)
337     {
338       /* Check for overflow.  */
339       if (nmemb < (~(size_t) 0 - 1) / size)
340         /* + 1 so that we can '\0' terminate invalid string table sections.  */
341         mvar = malloc (size * nmemb + 1);
342
343       if (mvar == NULL)
344         {
345           if (reason)
346             error (_("Out of memory allocating 0x%lx bytes for %s\n"),
347                    (unsigned long)(size * nmemb), reason);
348           return NULL;
349         }
350
351       ((char *) mvar)[size * nmemb] = '\0';
352     }
353
354   if (fread (mvar, size, nmemb, file) != nmemb)
355     {
356       if (reason)
357         error (_("Unable to read in 0x%lx bytes of %s\n"),
358                (unsigned long)(size * nmemb), reason);
359       if (mvar != var)
360         free (mvar);
361       return NULL;
362     }
363
364   return mvar;
365 }
366
367 /* Print a VMA value.  */
368
369 static int
370 print_vma (bfd_vma vma, print_mode mode)
371 {
372   int nc = 0;
373
374   switch (mode)
375     {
376     case FULL_HEX:
377       nc = printf ("0x");
378       /* Drop through.  */
379
380     case LONG_HEX:
381 #ifdef BFD64
382       if (is_32bit_elf)
383         return nc + printf ("%8.8" BFD_VMA_FMT "x", vma);
384 #endif
385       printf_vma (vma);
386       return nc + 16;
387
388     case DEC_5:
389       if (vma <= 99999)
390         return printf ("%5" BFD_VMA_FMT "d", vma);
391       /* Drop through.  */
392
393     case PREFIX_HEX:
394       nc = printf ("0x");
395       /* Drop through.  */
396
397     case HEX:
398       return nc + printf ("%" BFD_VMA_FMT "x", vma);
399
400     case DEC:
401       return printf ("%" BFD_VMA_FMT "d", vma);
402
403     case UNSIGNED:
404       return printf ("%" BFD_VMA_FMT "u", vma);
405     }
406   return 0;
407 }
408
409 /* Display a symbol on stdout.  Handles the display of control characters and
410    multibye characters (assuming the host environment supports them).
411
412    Display at most abs(WIDTH) characters, truncating as necessary, unless do_wide is true.
413
414    If WIDTH is negative then ensure that the output is at least (- WIDTH) characters,
415    padding as necessary.
416
417    Returns the number of emitted characters.  */
418
419 static unsigned int
420 print_symbol (int width, const char *symbol)
421 {
422   bfd_boolean extra_padding = FALSE;
423   int num_printed = 0;
424 #ifdef HAVE_MBSTATE_T
425   mbstate_t state;
426 #endif
427   int width_remaining;
428
429   if (width < 0)
430     {
431       /* Keep the width positive.  This also helps.  */
432       width = - width;
433       extra_padding = TRUE;
434     }
435   assert (width != 0);
436
437   if (do_wide)
438     /* Set the remaining width to a very large value.
439        This simplifies the code below.  */
440     width_remaining = INT_MAX;
441   else
442     width_remaining = width;
443
444 #ifdef HAVE_MBSTATE_T
445   /* Initialise the multibyte conversion state.  */
446   memset (& state, 0, sizeof (state));
447 #endif
448
449   while (width_remaining)
450     {
451       size_t  n;
452       const char c = *symbol++;
453
454       if (c == 0)
455         break;
456
457       /* Do not print control characters directly as they can affect terminal
458          settings.  Such characters usually appear in the names generated
459          by the assembler for local labels.  */
460       if (ISCNTRL (c))
461         {
462           if (width_remaining < 2)
463             break;
464
465           printf ("^%c", c + 0x40);
466           width_remaining -= 2;
467           num_printed += 2;
468         }
469       else if (ISPRINT (c))
470         {
471           putchar (c);
472           width_remaining --;
473           num_printed ++;
474         }
475       else
476         {
477 #ifdef HAVE_MBSTATE_T
478           wchar_t w;
479 #endif
480           /* Let printf do the hard work of displaying multibyte characters.  */
481           printf ("%.1s", symbol - 1);
482           width_remaining --;
483           num_printed ++;
484
485 #ifdef HAVE_MBSTATE_T
486           /* Try to find out how many bytes made up the character that was
487              just printed.  Advance the symbol pointer past the bytes that
488              were displayed.  */
489           n = mbrtowc (& w, symbol - 1, MB_CUR_MAX, & state);
490 #else
491           n = 1;
492 #endif
493           if (n != (size_t) -1 && n != (size_t) -2 && n > 0)
494             symbol += (n - 1);
495         }
496     }
497
498   if (extra_padding && num_printed < width)
499     {
500       /* Fill in the remaining spaces.  */
501       printf ("%-*s", width - num_printed, " ");
502       num_printed = width;
503     }
504
505   return num_printed;
506 }
507
508 /* Returns a pointer to a static buffer containing a  printable version of
509    the given section's name.  Like print_symbol, except that it does not try
510    to print multibyte characters, it just interprets them as hex values.  */
511
512 static const char *
513 printable_section_name (Elf_Internal_Shdr * sec)
514 {
515 #define MAX_PRINT_SEC_NAME_LEN 128
516   static char  sec_name_buf [MAX_PRINT_SEC_NAME_LEN + 1];
517   const char * name = SECTION_NAME (sec);
518   char *       buf = sec_name_buf;
519   char         c;
520   unsigned int remaining = MAX_PRINT_SEC_NAME_LEN;
521
522   while ((c = * name ++) != 0)
523     {
524       if (ISCNTRL (c))
525         {
526           if (remaining < 2)
527             break;
528           
529           * buf ++ = '^';
530           * buf ++ = c + 0x40;
531           remaining -= 2;
532         }
533       else if (ISPRINT (c))
534         {
535           * buf ++ = c;
536           remaining -= 1;
537         }
538       else
539         {
540           static char hex[17] = "0123456789ABCDEF";
541
542           if (remaining < 4)
543             break;
544           * buf ++ = '<';
545           * buf ++ = hex[(c & 0xf0) >> 4];
546           * buf ++ = hex[c & 0x0f];
547           * buf ++ = '>';
548           remaining -= 4;
549         }
550
551       if (remaining == 0)
552         break;
553     }
554
555   * buf = 0;
556   return sec_name_buf;
557 }
558
559 static const char *
560 printable_section_name_from_index (unsigned long ndx)
561 {
562   if (ndx >= elf_header.e_shnum)
563     return _("<corrupt>");
564
565   return printable_section_name (section_headers + ndx);
566 }
567
568 /* Return a pointer to section NAME, or NULL if no such section exists.  */
569
570 static Elf_Internal_Shdr *
571 find_section (const char * name)
572 {
573   unsigned int i;
574
575   for (i = 0; i < elf_header.e_shnum; i++)
576     if (streq (SECTION_NAME (section_headers + i), name))
577       return section_headers + i;
578
579   return NULL;
580 }
581
582 /* Return a pointer to a section containing ADDR, or NULL if no such
583    section exists.  */
584
585 static Elf_Internal_Shdr *
586 find_section_by_address (bfd_vma addr)
587 {
588   unsigned int i;
589
590   for (i = 0; i < elf_header.e_shnum; i++)
591     {
592       Elf_Internal_Shdr *sec = section_headers + i;
593       if (addr >= sec->sh_addr && addr < sec->sh_addr + sec->sh_size)
594         return sec;
595     }
596
597   return NULL;
598 }
599
600 static Elf_Internal_Shdr *
601 find_section_by_type (unsigned int type)
602 {
603   unsigned int i;
604
605   for (i = 0; i < elf_header.e_shnum; i++)
606     {
607       Elf_Internal_Shdr *sec = section_headers + i;
608       if (sec->sh_type == type)
609         return sec;
610     }
611
612   return NULL;
613 }
614
615 /* Return a pointer to section NAME, or NULL if no such section exists,
616    restricted to the list of sections given in SET.  */
617
618 static Elf_Internal_Shdr *
619 find_section_in_set (const char * name, unsigned int * set)
620 {
621   unsigned int i;
622
623   if (set != NULL)
624     {
625       while ((i = *set++) > 0)
626         if (streq (SECTION_NAME (section_headers + i), name))
627           return section_headers + i;
628     }
629
630   return find_section (name);
631 }
632
633 /* Read an unsigned LEB128 encoded value from p.  Set *PLEN to the number of
634    bytes read.  */
635
636 static inline unsigned long
637 read_uleb128 (unsigned char *data,
638               unsigned int *length_return,
639               const unsigned char * const end)
640 {
641   return read_leb128 (data, length_return, FALSE, end);
642 }
643
644 /* Return true if the current file is for IA-64 machine and OpenVMS ABI.
645    This OS has so many departures from the ELF standard that we test it at
646    many places.  */
647
648 static inline int
649 is_ia64_vms (void)
650 {
651   return elf_header.e_machine == EM_IA_64
652     && elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS;
653 }
654
655 /* Guess the relocation size commonly used by the specific machines.  */
656
657 static int
658 guess_is_rela (unsigned int e_machine)
659 {
660   switch (e_machine)
661     {
662       /* Targets that use REL relocations.  */
663     case EM_386:
664     case EM_486:
665     case EM_960:
666     case EM_ARM:
667     case EM_D10V:
668     case EM_CYGNUS_D10V:
669     case EM_DLX:
670     case EM_MIPS:
671     case EM_MIPS_RS3_LE:
672     case EM_CYGNUS_M32R:
673     case EM_SCORE:
674     case EM_XGATE:
675       return FALSE;
676
677       /* Targets that use RELA relocations.  */
678     case EM_68K:
679     case EM_860:
680     case EM_AARCH64:
681     case EM_ADAPTEVA_EPIPHANY:
682     case EM_ALPHA:
683     case EM_ALTERA_NIOS2:
684     case EM_AVR:
685     case EM_AVR_OLD:
686     case EM_BLACKFIN:
687     case EM_CR16:
688     case EM_CRIS:
689     case EM_CRX:
690     case EM_D30V:
691     case EM_CYGNUS_D30V:
692     case EM_FR30:
693     case EM_CYGNUS_FR30:
694     case EM_CYGNUS_FRV:
695     case EM_H8S:
696     case EM_H8_300:
697     case EM_H8_300H:
698     case EM_IA_64:
699     case EM_IP2K:
700     case EM_IP2K_OLD:
701     case EM_IQ2000:
702     case EM_LATTICEMICO32:
703     case EM_M32C_OLD:
704     case EM_M32C:
705     case EM_M32R:
706     case EM_MCORE:
707     case EM_CYGNUS_MEP:
708     case EM_METAG:
709     case EM_MMIX:
710     case EM_MN10200:
711     case EM_CYGNUS_MN10200:
712     case EM_MN10300:
713     case EM_CYGNUS_MN10300:
714     case EM_MOXIE:
715     case EM_MSP430:
716     case EM_MSP430_OLD:
717     case EM_MT:
718     case EM_NDS32:
719     case EM_NIOS32:
720     case EM_OR1K:
721     case EM_PPC64:
722     case EM_PPC:
723     case EM_RL78:
724     case EM_RX:
725     case EM_S390:
726     case EM_S390_OLD:
727     case EM_SH:
728     case EM_SPARC:
729     case EM_SPARC32PLUS:
730     case EM_SPARCV9:
731     case EM_SPU:
732     case EM_TI_C6000:
733     case EM_TILEGX:
734     case EM_TILEPRO:
735     case EM_V800:
736     case EM_V850:
737     case EM_CYGNUS_V850:
738     case EM_VAX:
739     case EM_X86_64:
740     case EM_L1OM:
741     case EM_K1OM:
742     case EM_XSTORMY16:
743     case EM_XTENSA:
744     case EM_XTENSA_OLD:
745     case EM_MICROBLAZE:
746     case EM_MICROBLAZE_OLD:
747       return TRUE;
748
749     case EM_68HC05:
750     case EM_68HC08:
751     case EM_68HC11:
752     case EM_68HC16:
753     case EM_FX66:
754     case EM_ME16:
755     case EM_MMA:
756     case EM_NCPU:
757     case EM_NDR1:
758     case EM_PCP:
759     case EM_ST100:
760     case EM_ST19:
761     case EM_ST7:
762     case EM_ST9PLUS:
763     case EM_STARCORE:
764     case EM_SVX:
765     case EM_TINYJ:
766     default:
767       warn (_("Don't know about relocations on this machine architecture\n"));
768       return FALSE;
769     }
770 }
771
772 static int
773 slurp_rela_relocs (FILE * file,
774                    unsigned long rel_offset,
775                    unsigned long rel_size,
776                    Elf_Internal_Rela ** relasp,
777                    unsigned long * nrelasp)
778 {
779   Elf_Internal_Rela * relas;
780   unsigned long nrelas;
781   unsigned int i;
782
783   if (is_32bit_elf)
784     {
785       Elf32_External_Rela * erelas;
786
787       erelas = (Elf32_External_Rela *) get_data (NULL, file, rel_offset, 1,
788                                                  rel_size, _("32-bit relocation data"));
789       if (!erelas)
790         return 0;
791
792       nrelas = rel_size / sizeof (Elf32_External_Rela);
793
794       relas = (Elf_Internal_Rela *) cmalloc (nrelas,
795                                              sizeof (Elf_Internal_Rela));
796
797       if (relas == NULL)
798         {
799           free (erelas);
800           error (_("out of memory parsing relocs\n"));
801           return 0;
802         }
803
804       for (i = 0; i < nrelas; i++)
805         {
806           relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
807           relas[i].r_info   = BYTE_GET (erelas[i].r_info);
808           relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
809         }
810
811       free (erelas);
812     }
813   else
814     {
815       Elf64_External_Rela * erelas;
816
817       erelas = (Elf64_External_Rela *) get_data (NULL, file, rel_offset, 1,
818                                                  rel_size, _("64-bit relocation data"));
819       if (!erelas)
820         return 0;
821
822       nrelas = rel_size / sizeof (Elf64_External_Rela);
823
824       relas = (Elf_Internal_Rela *) cmalloc (nrelas,
825                                              sizeof (Elf_Internal_Rela));
826
827       if (relas == NULL)
828         {
829           free (erelas);
830           error (_("out of memory parsing relocs\n"));
831           return 0;
832         }
833
834       for (i = 0; i < nrelas; i++)
835         {
836           relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
837           relas[i].r_info   = BYTE_GET (erelas[i].r_info);
838           relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
839
840           /* The #ifdef BFD64 below is to prevent a compile time
841              warning.  We know that if we do not have a 64 bit data
842              type that we will never execute this code anyway.  */
843 #ifdef BFD64
844           if (elf_header.e_machine == EM_MIPS
845               && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
846             {
847               /* In little-endian objects, r_info isn't really a
848                  64-bit little-endian value: it has a 32-bit
849                  little-endian symbol index followed by four
850                  individual byte fields.  Reorder INFO
851                  accordingly.  */
852               bfd_vma inf = relas[i].r_info;
853               inf = (((inf & 0xffffffff) << 32)
854                       | ((inf >> 56) & 0xff)
855                       | ((inf >> 40) & 0xff00)
856                       | ((inf >> 24) & 0xff0000)
857                       | ((inf >> 8) & 0xff000000));
858               relas[i].r_info = inf;
859             }
860 #endif /* BFD64 */
861         }
862
863       free (erelas);
864     }
865   *relasp = relas;
866   *nrelasp = nrelas;
867   return 1;
868 }
869
870 static int
871 slurp_rel_relocs (FILE * file,
872                   unsigned long rel_offset,
873                   unsigned long rel_size,
874                   Elf_Internal_Rela ** relsp,
875                   unsigned long * nrelsp)
876 {
877   Elf_Internal_Rela * rels;
878   unsigned long nrels;
879   unsigned int i;
880
881   if (is_32bit_elf)
882     {
883       Elf32_External_Rel * erels;
884
885       erels = (Elf32_External_Rel *) get_data (NULL, file, rel_offset, 1,
886                                                rel_size, _("32-bit relocation data"));
887       if (!erels)
888         return 0;
889
890       nrels = rel_size / sizeof (Elf32_External_Rel);
891
892       rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
893
894       if (rels == NULL)
895         {
896           free (erels);
897           error (_("out of memory parsing relocs\n"));
898           return 0;
899         }
900
901       for (i = 0; i < nrels; i++)
902         {
903           rels[i].r_offset = BYTE_GET (erels[i].r_offset);
904           rels[i].r_info   = BYTE_GET (erels[i].r_info);
905           rels[i].r_addend = 0;
906         }
907
908       free (erels);
909     }
910   else
911     {
912       Elf64_External_Rel * erels;
913
914       erels = (Elf64_External_Rel *) get_data (NULL, file, rel_offset, 1,
915                                                rel_size, _("64-bit relocation data"));
916       if (!erels)
917         return 0;
918
919       nrels = rel_size / sizeof (Elf64_External_Rel);
920
921       rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
922
923       if (rels == NULL)
924         {
925           free (erels);
926           error (_("out of memory parsing relocs\n"));
927           return 0;
928         }
929
930       for (i = 0; i < nrels; i++)
931         {
932           rels[i].r_offset = BYTE_GET (erels[i].r_offset);
933           rels[i].r_info   = BYTE_GET (erels[i].r_info);
934           rels[i].r_addend = 0;
935
936           /* The #ifdef BFD64 below is to prevent a compile time
937              warning.  We know that if we do not have a 64 bit data
938              type that we will never execute this code anyway.  */
939 #ifdef BFD64
940           if (elf_header.e_machine == EM_MIPS
941               && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
942             {
943               /* In little-endian objects, r_info isn't really a
944                  64-bit little-endian value: it has a 32-bit
945                  little-endian symbol index followed by four
946                  individual byte fields.  Reorder INFO
947                  accordingly.  */
948               bfd_vma inf = rels[i].r_info;
949               inf = (((inf & 0xffffffff) << 32)
950                      | ((inf >> 56) & 0xff)
951                      | ((inf >> 40) & 0xff00)
952                      | ((inf >> 24) & 0xff0000)
953                      | ((inf >> 8) & 0xff000000));
954               rels[i].r_info = inf;
955             }
956 #endif /* BFD64 */
957         }
958
959       free (erels);
960     }
961   *relsp = rels;
962   *nrelsp = nrels;
963   return 1;
964 }
965
966 /* Returns the reloc type extracted from the reloc info field.  */
967
968 static unsigned int
969 get_reloc_type (bfd_vma reloc_info)
970 {
971   if (is_32bit_elf)
972     return ELF32_R_TYPE (reloc_info);
973
974   switch (elf_header.e_machine)
975     {
976     case EM_MIPS:
977       /* Note: We assume that reloc_info has already been adjusted for us.  */
978       return ELF64_MIPS_R_TYPE (reloc_info);
979
980     case EM_SPARCV9:
981       return ELF64_R_TYPE_ID (reloc_info);
982
983     default:
984       return ELF64_R_TYPE (reloc_info);
985     }
986 }
987
988 /* Return the symbol index extracted from the reloc info field.  */
989
990 static bfd_vma
991 get_reloc_symindex (bfd_vma reloc_info)
992 {
993   return is_32bit_elf ? ELF32_R_SYM (reloc_info) : ELF64_R_SYM (reloc_info);
994 }
995
996 static inline bfd_boolean
997 uses_msp430x_relocs (void)
998 {
999   return
1000     elf_header.e_machine == EM_MSP430 /* Paranoia.  */
1001     /* GCC uses osabi == ELFOSBI_STANDALONE.  */
1002     && (((elf_header.e_flags & EF_MSP430_MACH) == E_MSP430_MACH_MSP430X)
1003         /* TI compiler uses ELFOSABI_NONE.  */
1004         || (elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE));
1005 }
1006
1007 /* Display the contents of the relocation data found at the specified
1008    offset.  */
1009
1010 static void
1011 dump_relocations (FILE * file,
1012                   unsigned long rel_offset,
1013                   unsigned long rel_size,
1014                   Elf_Internal_Sym * symtab,
1015                   unsigned long nsyms,
1016                   char * strtab,
1017                   unsigned long strtablen,
1018                   int is_rela)
1019 {
1020   unsigned int i;
1021   Elf_Internal_Rela * rels;
1022
1023   if (is_rela == UNKNOWN)
1024     is_rela = guess_is_rela (elf_header.e_machine);
1025
1026   if (is_rela)
1027     {
1028       if (!slurp_rela_relocs (file, rel_offset, rel_size, &rels, &rel_size))
1029         return;
1030     }
1031   else
1032     {
1033       if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
1034         return;
1035     }
1036
1037   if (is_32bit_elf)
1038     {
1039       if (is_rela)
1040         {
1041           if (do_wide)
1042             printf (_(" Offset     Info    Type                Sym. Value  Symbol's Name + Addend\n"));
1043           else
1044             printf (_(" Offset     Info    Type            Sym.Value  Sym. Name + Addend\n"));
1045         }
1046       else
1047         {
1048           if (do_wide)
1049             printf (_(" Offset     Info    Type                Sym. Value  Symbol's Name\n"));
1050           else
1051             printf (_(" Offset     Info    Type            Sym.Value  Sym. Name\n"));
1052         }
1053     }
1054   else
1055     {
1056       if (is_rela)
1057         {
1058           if (do_wide)
1059             printf (_("    Offset             Info             Type               Symbol's Value  Symbol's Name + Addend\n"));
1060           else
1061             printf (_("  Offset          Info           Type           Sym. Value    Sym. Name + Addend\n"));
1062         }
1063       else
1064         {
1065           if (do_wide)
1066             printf (_("    Offset             Info             Type               Symbol's Value  Symbol's Name\n"));
1067           else
1068             printf (_("  Offset          Info           Type           Sym. Value    Sym. Name\n"));
1069         }
1070     }
1071
1072   for (i = 0; i < rel_size; i++)
1073     {
1074       const char * rtype;
1075       bfd_vma offset;
1076       bfd_vma inf;
1077       bfd_vma symtab_index;
1078       bfd_vma type;
1079
1080       offset = rels[i].r_offset;
1081       inf    = rels[i].r_info;
1082
1083       type = get_reloc_type (inf);
1084       symtab_index = get_reloc_symindex  (inf);
1085
1086       if (is_32bit_elf)
1087         {
1088           printf ("%8.8lx  %8.8lx ",
1089                   (unsigned long) offset & 0xffffffff,
1090                   (unsigned long) inf & 0xffffffff);
1091         }
1092       else
1093         {
1094 #if BFD_HOST_64BIT_LONG
1095           printf (do_wide
1096                   ? "%16.16lx  %16.16lx "
1097                   : "%12.12lx  %12.12lx ",
1098                   offset, inf);
1099 #elif BFD_HOST_64BIT_LONG_LONG
1100 #ifndef __MSVCRT__
1101           printf (do_wide
1102                   ? "%16.16llx  %16.16llx "
1103                   : "%12.12llx  %12.12llx ",
1104                   offset, inf);
1105 #else
1106           printf (do_wide
1107                   ? "%16.16I64x  %16.16I64x "
1108                   : "%12.12I64x  %12.12I64x ",
1109                   offset, inf);
1110 #endif
1111 #else
1112           printf (do_wide
1113                   ? "%8.8lx%8.8lx  %8.8lx%8.8lx "
1114                   : "%4.4lx%8.8lx  %4.4lx%8.8lx ",
1115                   _bfd_int64_high (offset),
1116                   _bfd_int64_low (offset),
1117                   _bfd_int64_high (inf),
1118                   _bfd_int64_low (inf));
1119 #endif
1120         }
1121
1122       switch (elf_header.e_machine)
1123         {
1124         default:
1125           rtype = NULL;
1126           break;
1127
1128         case EM_AARCH64:
1129           rtype = elf_aarch64_reloc_type (type);
1130           break;
1131
1132         case EM_M32R:
1133         case EM_CYGNUS_M32R:
1134           rtype = elf_m32r_reloc_type (type);
1135           break;
1136
1137         case EM_386:
1138         case EM_486:
1139           rtype = elf_i386_reloc_type (type);
1140           break;
1141
1142         case EM_68HC11:
1143         case EM_68HC12:
1144           rtype = elf_m68hc11_reloc_type (type);
1145           break;
1146
1147         case EM_68K:
1148           rtype = elf_m68k_reloc_type (type);
1149           break;
1150
1151         case EM_960:
1152           rtype = elf_i960_reloc_type (type);
1153           break;
1154
1155         case EM_AVR:
1156         case EM_AVR_OLD:
1157           rtype = elf_avr_reloc_type (type);
1158           break;
1159
1160         case EM_OLD_SPARCV9:
1161         case EM_SPARC32PLUS:
1162         case EM_SPARCV9:
1163         case EM_SPARC:
1164           rtype = elf_sparc_reloc_type (type);
1165           break;
1166
1167         case EM_SPU:
1168           rtype = elf_spu_reloc_type (type);
1169           break;
1170
1171         case EM_V800:
1172           rtype = v800_reloc_type (type);
1173           break;
1174         case EM_V850:
1175         case EM_CYGNUS_V850:
1176           rtype = v850_reloc_type (type);
1177           break;
1178
1179         case EM_D10V:
1180         case EM_CYGNUS_D10V:
1181           rtype = elf_d10v_reloc_type (type);
1182           break;
1183
1184         case EM_D30V:
1185         case EM_CYGNUS_D30V:
1186           rtype = elf_d30v_reloc_type (type);
1187           break;
1188
1189         case EM_DLX:
1190           rtype = elf_dlx_reloc_type (type);
1191           break;
1192
1193         case EM_SH:
1194           rtype = elf_sh_reloc_type (type);
1195           break;
1196
1197         case EM_MN10300:
1198         case EM_CYGNUS_MN10300:
1199           rtype = elf_mn10300_reloc_type (type);
1200           break;
1201
1202         case EM_MN10200:
1203         case EM_CYGNUS_MN10200:
1204           rtype = elf_mn10200_reloc_type (type);
1205           break;
1206
1207         case EM_FR30:
1208         case EM_CYGNUS_FR30:
1209           rtype = elf_fr30_reloc_type (type);
1210           break;
1211
1212         case EM_CYGNUS_FRV:
1213           rtype = elf_frv_reloc_type (type);
1214           break;
1215
1216         case EM_MCORE:
1217           rtype = elf_mcore_reloc_type (type);
1218           break;
1219
1220         case EM_MMIX:
1221           rtype = elf_mmix_reloc_type (type);
1222           break;
1223
1224         case EM_MOXIE:
1225           rtype = elf_moxie_reloc_type (type);
1226           break;
1227
1228         case EM_MSP430:
1229           if (uses_msp430x_relocs ())
1230             {
1231               rtype = elf_msp430x_reloc_type (type);
1232               break;
1233             }
1234         case EM_MSP430_OLD:
1235           rtype = elf_msp430_reloc_type (type);
1236           break;
1237
1238         case EM_NDS32:
1239           rtype = elf_nds32_reloc_type (type);
1240           break;
1241
1242         case EM_PPC:
1243           rtype = elf_ppc_reloc_type (type);
1244           break;
1245
1246         case EM_PPC64:
1247           rtype = elf_ppc64_reloc_type (type);
1248           break;
1249
1250         case EM_MIPS:
1251         case EM_MIPS_RS3_LE:
1252           rtype = elf_mips_reloc_type (type);
1253           break;
1254
1255         case EM_ALPHA:
1256           rtype = elf_alpha_reloc_type (type);
1257           break;
1258
1259         case EM_ARM:
1260           rtype = elf_arm_reloc_type (type);
1261           break;
1262
1263         case EM_ARC:
1264           rtype = elf_arc_reloc_type (type);
1265           break;
1266
1267         case EM_PARISC:
1268           rtype = elf_hppa_reloc_type (type);
1269           break;
1270
1271         case EM_H8_300:
1272         case EM_H8_300H:
1273         case EM_H8S:
1274           rtype = elf_h8_reloc_type (type);
1275           break;
1276
1277         case EM_OR1K:
1278           rtype = elf_or1k_reloc_type (type);
1279           break;
1280
1281         case EM_PJ:
1282         case EM_PJ_OLD:
1283           rtype = elf_pj_reloc_type (type);
1284           break;
1285         case EM_IA_64:
1286           rtype = elf_ia64_reloc_type (type);
1287           break;
1288
1289         case EM_CRIS:
1290           rtype = elf_cris_reloc_type (type);
1291           break;
1292
1293         case EM_860:
1294           rtype = elf_i860_reloc_type (type);
1295           break;
1296
1297         case EM_X86_64:
1298         case EM_L1OM:
1299         case EM_K1OM:
1300           rtype = elf_x86_64_reloc_type (type);
1301           break;
1302
1303         case EM_S370:
1304           rtype = i370_reloc_type (type);
1305           break;
1306
1307         case EM_S390_OLD:
1308         case EM_S390:
1309           rtype = elf_s390_reloc_type (type);
1310           break;
1311
1312         case EM_SCORE:
1313           rtype = elf_score_reloc_type (type);
1314           break;
1315
1316         case EM_XSTORMY16:
1317           rtype = elf_xstormy16_reloc_type (type);
1318           break;
1319
1320         case EM_CRX:
1321           rtype = elf_crx_reloc_type (type);
1322           break;
1323
1324         case EM_VAX:
1325           rtype = elf_vax_reloc_type (type);
1326           break;
1327
1328         case EM_ADAPTEVA_EPIPHANY:
1329           rtype = elf_epiphany_reloc_type (type);
1330           break;
1331
1332         case EM_IP2K:
1333         case EM_IP2K_OLD:
1334           rtype = elf_ip2k_reloc_type (type);
1335           break;
1336
1337         case EM_IQ2000:
1338           rtype = elf_iq2000_reloc_type (type);
1339           break;
1340
1341         case EM_XTENSA_OLD:
1342         case EM_XTENSA:
1343           rtype = elf_xtensa_reloc_type (type);
1344           break;
1345
1346         case EM_LATTICEMICO32:
1347           rtype = elf_lm32_reloc_type (type);
1348           break;
1349
1350         case EM_M32C_OLD:
1351         case EM_M32C:
1352           rtype = elf_m32c_reloc_type (type);
1353           break;
1354
1355         case EM_MT:
1356           rtype = elf_mt_reloc_type (type);
1357           break;
1358
1359         case EM_BLACKFIN:
1360           rtype = elf_bfin_reloc_type (type);
1361           break;
1362
1363         case EM_CYGNUS_MEP:
1364           rtype = elf_mep_reloc_type (type);
1365           break;
1366
1367         case EM_CR16:
1368           rtype = elf_cr16_reloc_type (type);
1369           break;
1370
1371         case EM_MICROBLAZE:
1372         case EM_MICROBLAZE_OLD:
1373           rtype = elf_microblaze_reloc_type (type);
1374           break;
1375
1376         case EM_RL78:
1377           rtype = elf_rl78_reloc_type (type);
1378           break;
1379
1380         case EM_RX:
1381           rtype = elf_rx_reloc_type (type);
1382           break;
1383
1384         case EM_METAG:
1385           rtype = elf_metag_reloc_type (type);
1386           break;
1387
1388         case EM_XC16X:
1389         case EM_C166:
1390           rtype = elf_xc16x_reloc_type (type);
1391           break;
1392
1393         case EM_TI_C6000:
1394           rtype = elf_tic6x_reloc_type (type);
1395           break;
1396
1397         case EM_TILEGX:
1398           rtype = elf_tilegx_reloc_type (type);
1399           break;
1400
1401         case EM_TILEPRO:
1402           rtype = elf_tilepro_reloc_type (type);
1403           break;
1404
1405         case EM_XGATE:
1406           rtype = elf_xgate_reloc_type (type);
1407           break;
1408
1409         case EM_ALTERA_NIOS2:
1410           rtype = elf_nios2_reloc_type (type);
1411           break;
1412         }
1413
1414       if (rtype == NULL)
1415         printf (_("unrecognized: %-7lx"), (unsigned long) type & 0xffffffff);
1416       else
1417         printf (do_wide ? "%-22.22s" : "%-17.17s", rtype);
1418
1419       if (elf_header.e_machine == EM_ALPHA
1420           && rtype != NULL
1421           && streq (rtype, "R_ALPHA_LITUSE")
1422           && is_rela)
1423         {
1424           switch (rels[i].r_addend)
1425             {
1426             case LITUSE_ALPHA_ADDR:   rtype = "ADDR";   break;
1427             case LITUSE_ALPHA_BASE:   rtype = "BASE";   break;
1428             case LITUSE_ALPHA_BYTOFF: rtype = "BYTOFF"; break;
1429             case LITUSE_ALPHA_JSR:    rtype = "JSR";    break;
1430             case LITUSE_ALPHA_TLSGD:  rtype = "TLSGD";  break;
1431             case LITUSE_ALPHA_TLSLDM: rtype = "TLSLDM"; break;
1432             case LITUSE_ALPHA_JSRDIRECT: rtype = "JSRDIRECT"; break;
1433             default: rtype = NULL;
1434             }
1435           if (rtype)
1436             printf (" (%s)", rtype);
1437           else
1438             {
1439               putchar (' ');
1440               printf (_("<unknown addend: %lx>"),
1441                       (unsigned long) rels[i].r_addend);
1442             }
1443         }
1444       else if (symtab_index)
1445         {
1446           if (symtab == NULL || symtab_index >= nsyms)
1447             printf (_(" bad symbol index: %08lx"), (unsigned long) symtab_index);
1448           else
1449             {
1450               Elf_Internal_Sym * psym;
1451
1452               psym = symtab + symtab_index;
1453
1454               printf (" ");
1455
1456               if (ELF_ST_TYPE (psym->st_info) == STT_GNU_IFUNC)
1457                 {
1458                   const char * name;
1459                   unsigned int len;
1460                   unsigned int width = is_32bit_elf ? 8 : 14;
1461
1462                   /* Relocations against GNU_IFUNC symbols do not use the value
1463                      of the symbol as the address to relocate against.  Instead
1464                      they invoke the function named by the symbol and use its
1465                      result as the address for relocation.
1466
1467                      To indicate this to the user, do not display the value of
1468                      the symbol in the "Symbols's Value" field.  Instead show
1469                      its name followed by () as a hint that the symbol is
1470                      invoked.  */
1471
1472                   if (strtab == NULL
1473                       || psym->st_name == 0
1474                       || psym->st_name >= strtablen)
1475                     name = "??";
1476                   else
1477                     name = strtab + psym->st_name;
1478
1479                   len = print_symbol (width, name);
1480                   printf ("()%-*s", len <= width ? (width + 1) - len : 1, " ");
1481                 }
1482               else
1483                 {
1484                   print_vma (psym->st_value, LONG_HEX);
1485
1486                   printf (is_32bit_elf ? "   " : " ");
1487                 }
1488
1489               if (psym->st_name == 0)
1490                 {
1491                   const char * sec_name = "<null>";
1492                   char name_buf[40];
1493
1494                   if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1495                     {
1496                       if (psym->st_shndx < elf_header.e_shnum)
1497                         sec_name = SECTION_NAME (section_headers + psym->st_shndx);
1498                       else if (psym->st_shndx == SHN_ABS)
1499                         sec_name = "ABS";
1500                       else if (psym->st_shndx == SHN_COMMON)
1501                         sec_name = "COMMON";
1502                       else if ((elf_header.e_machine == EM_MIPS
1503                                 && psym->st_shndx == SHN_MIPS_SCOMMON)
1504                                || (elf_header.e_machine == EM_TI_C6000
1505                                    && psym->st_shndx == SHN_TIC6X_SCOMMON))
1506                         sec_name = "SCOMMON";
1507                       else if (elf_header.e_machine == EM_MIPS
1508                                && psym->st_shndx == SHN_MIPS_SUNDEFINED)
1509                         sec_name = "SUNDEF";
1510                       else if ((elf_header.e_machine == EM_X86_64
1511                                 || elf_header.e_machine == EM_L1OM
1512                                 || elf_header.e_machine == EM_K1OM)
1513                                && psym->st_shndx == SHN_X86_64_LCOMMON)
1514                         sec_name = "LARGE_COMMON";
1515                       else if (elf_header.e_machine == EM_IA_64
1516                                && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
1517                                && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1518                         sec_name = "ANSI_COM";
1519                       else if (is_ia64_vms ()
1520                                && psym->st_shndx == SHN_IA_64_VMS_SYMVEC)
1521                         sec_name = "VMS_SYMVEC";
1522                       else
1523                         {
1524                           sprintf (name_buf, "<section 0x%x>",
1525                                    (unsigned int) psym->st_shndx);
1526                           sec_name = name_buf;
1527                         }
1528                     }
1529                   print_symbol (22, sec_name);
1530                 }
1531               else if (strtab == NULL)
1532                 printf (_("<string table index: %3ld>"), psym->st_name);
1533               else if (psym->st_name >= strtablen)
1534                 printf (_("<corrupt string table index: %3ld>"), psym->st_name);
1535               else
1536                 print_symbol (22, strtab + psym->st_name);
1537
1538               if (is_rela)
1539                 {
1540                   bfd_signed_vma off = rels[i].r_addend;
1541
1542                   if (off < 0)
1543                     printf (" - %" BFD_VMA_FMT "x", - off);
1544                   else
1545                     printf (" + %" BFD_VMA_FMT "x", off);
1546                 }
1547             }
1548         }
1549       else if (is_rela)
1550         {
1551           bfd_signed_vma off = rels[i].r_addend;
1552
1553           printf ("%*c", is_32bit_elf ? 12 : 20, ' ');
1554           if (off < 0)
1555             printf ("-%" BFD_VMA_FMT "x", - off);
1556           else
1557             printf ("%" BFD_VMA_FMT "x", off);
1558         }
1559
1560       if (elf_header.e_machine == EM_SPARCV9
1561           && rtype != NULL
1562           && streq (rtype, "R_SPARC_OLO10"))
1563         printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf));
1564
1565       putchar ('\n');
1566
1567 #ifdef BFD64
1568       if (! is_32bit_elf && elf_header.e_machine == EM_MIPS)
1569         {
1570           bfd_vma type2 = ELF64_MIPS_R_TYPE2 (inf);
1571           bfd_vma type3 = ELF64_MIPS_R_TYPE3 (inf);
1572           const char * rtype2 = elf_mips_reloc_type (type2);
1573           const char * rtype3 = elf_mips_reloc_type (type3);
1574
1575           printf ("                    Type2: ");
1576
1577           if (rtype2 == NULL)
1578             printf (_("unrecognized: %-7lx"),
1579                     (unsigned long) type2 & 0xffffffff);
1580           else
1581             printf ("%-17.17s", rtype2);
1582
1583           printf ("\n                    Type3: ");
1584
1585           if (rtype3 == NULL)
1586             printf (_("unrecognized: %-7lx"),
1587                     (unsigned long) type3 & 0xffffffff);
1588           else
1589             printf ("%-17.17s", rtype3);
1590
1591           putchar ('\n');
1592         }
1593 #endif /* BFD64 */
1594     }
1595
1596   free (rels);
1597 }
1598
1599 static const char *
1600 get_mips_dynamic_type (unsigned long type)
1601 {
1602   switch (type)
1603     {
1604     case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1605     case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1606     case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1607     case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1608     case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1609     case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1610     case DT_MIPS_MSYM: return "MIPS_MSYM";
1611     case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1612     case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1613     case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1614     case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1615     case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1616     case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1617     case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1618     case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1619     case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1620     case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1621     case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1622     case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1623     case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1624     case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1625     case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1626     case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1627     case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1628     case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1629     case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1630     case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1631     case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1632     case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1633     case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1634     case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1635     case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1636     case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1637     case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1638     case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1639     case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1640     case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1641     case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1642     case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1643     case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1644     case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1645     case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1646     case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1647     case DT_MIPS_PLTGOT: return "MIPS_PLTGOT";
1648     case DT_MIPS_RWPLT: return "MIPS_RWPLT";
1649     default:
1650       return NULL;
1651     }
1652 }
1653
1654 static const char *
1655 get_sparc64_dynamic_type (unsigned long type)
1656 {
1657   switch (type)
1658     {
1659     case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1660     default:
1661       return NULL;
1662     }
1663 }
1664
1665 static const char *
1666 get_ppc_dynamic_type (unsigned long type)
1667 {
1668   switch (type)
1669     {
1670     case DT_PPC_GOT:    return "PPC_GOT";
1671     case DT_PPC_OPT:    return "PPC_OPT";
1672     default:
1673       return NULL;
1674     }
1675 }
1676
1677 static const char *
1678 get_ppc64_dynamic_type (unsigned long type)
1679 {
1680   switch (type)
1681     {
1682     case DT_PPC64_GLINK:  return "PPC64_GLINK";
1683     case DT_PPC64_OPD:    return "PPC64_OPD";
1684     case DT_PPC64_OPDSZ:  return "PPC64_OPDSZ";
1685     case DT_PPC64_OPT:    return "PPC64_OPT";
1686     default:
1687       return NULL;
1688     }
1689 }
1690
1691 static const char *
1692 get_parisc_dynamic_type (unsigned long type)
1693 {
1694   switch (type)
1695     {
1696     case DT_HP_LOAD_MAP:        return "HP_LOAD_MAP";
1697     case DT_HP_DLD_FLAGS:       return "HP_DLD_FLAGS";
1698     case DT_HP_DLD_HOOK:        return "HP_DLD_HOOK";
1699     case DT_HP_UX10_INIT:       return "HP_UX10_INIT";
1700     case DT_HP_UX10_INITSZ:     return "HP_UX10_INITSZ";
1701     case DT_HP_PREINIT:         return "HP_PREINIT";
1702     case DT_HP_PREINITSZ:       return "HP_PREINITSZ";
1703     case DT_HP_NEEDED:          return "HP_NEEDED";
1704     case DT_HP_TIME_STAMP:      return "HP_TIME_STAMP";
1705     case DT_HP_CHECKSUM:        return "HP_CHECKSUM";
1706     case DT_HP_GST_SIZE:        return "HP_GST_SIZE";
1707     case DT_HP_GST_VERSION:     return "HP_GST_VERSION";
1708     case DT_HP_GST_HASHVAL:     return "HP_GST_HASHVAL";
1709     case DT_HP_EPLTREL:         return "HP_GST_EPLTREL";
1710     case DT_HP_EPLTRELSZ:       return "HP_GST_EPLTRELSZ";
1711     case DT_HP_FILTERED:        return "HP_FILTERED";
1712     case DT_HP_FILTER_TLS:      return "HP_FILTER_TLS";
1713     case DT_HP_COMPAT_FILTERED: return "HP_COMPAT_FILTERED";
1714     case DT_HP_LAZYLOAD:        return "HP_LAZYLOAD";
1715     case DT_HP_BIND_NOW_COUNT:  return "HP_BIND_NOW_COUNT";
1716     case DT_PLT:                return "PLT";
1717     case DT_PLT_SIZE:           return "PLT_SIZE";
1718     case DT_DLT:                return "DLT";
1719     case DT_DLT_SIZE:           return "DLT_SIZE";
1720     default:
1721       return NULL;
1722     }
1723 }
1724
1725 static const char *
1726 get_ia64_dynamic_type (unsigned long type)
1727 {
1728   switch (type)
1729     {
1730     case DT_IA_64_PLT_RESERVE:         return "IA_64_PLT_RESERVE";
1731     case DT_IA_64_VMS_SUBTYPE:         return "VMS_SUBTYPE";
1732     case DT_IA_64_VMS_IMGIOCNT:        return "VMS_IMGIOCNT";
1733     case DT_IA_64_VMS_LNKFLAGS:        return "VMS_LNKFLAGS";
1734     case DT_IA_64_VMS_VIR_MEM_BLK_SIZ: return "VMS_VIR_MEM_BLK_SIZ";
1735     case DT_IA_64_VMS_IDENT:           return "VMS_IDENT";
1736     case DT_IA_64_VMS_NEEDED_IDENT:    return "VMS_NEEDED_IDENT";
1737     case DT_IA_64_VMS_IMG_RELA_CNT:    return "VMS_IMG_RELA_CNT";
1738     case DT_IA_64_VMS_SEG_RELA_CNT:    return "VMS_SEG_RELA_CNT";
1739     case DT_IA_64_VMS_FIXUP_RELA_CNT:  return "VMS_FIXUP_RELA_CNT";
1740     case DT_IA_64_VMS_FIXUP_NEEDED:    return "VMS_FIXUP_NEEDED";
1741     case DT_IA_64_VMS_SYMVEC_CNT:      return "VMS_SYMVEC_CNT";
1742     case DT_IA_64_VMS_XLATED:          return "VMS_XLATED";
1743     case DT_IA_64_VMS_STACKSIZE:       return "VMS_STACKSIZE";
1744     case DT_IA_64_VMS_UNWINDSZ:        return "VMS_UNWINDSZ";
1745     case DT_IA_64_VMS_UNWIND_CODSEG:   return "VMS_UNWIND_CODSEG";
1746     case DT_IA_64_VMS_UNWIND_INFOSEG:  return "VMS_UNWIND_INFOSEG";
1747     case DT_IA_64_VMS_LINKTIME:        return "VMS_LINKTIME";
1748     case DT_IA_64_VMS_SEG_NO:          return "VMS_SEG_NO";
1749     case DT_IA_64_VMS_SYMVEC_OFFSET:   return "VMS_SYMVEC_OFFSET";
1750     case DT_IA_64_VMS_SYMVEC_SEG:      return "VMS_SYMVEC_SEG";
1751     case DT_IA_64_VMS_UNWIND_OFFSET:   return "VMS_UNWIND_OFFSET";
1752     case DT_IA_64_VMS_UNWIND_SEG:      return "VMS_UNWIND_SEG";
1753     case DT_IA_64_VMS_STRTAB_OFFSET:   return "VMS_STRTAB_OFFSET";
1754     case DT_IA_64_VMS_SYSVER_OFFSET:   return "VMS_SYSVER_OFFSET";
1755     case DT_IA_64_VMS_IMG_RELA_OFF:    return "VMS_IMG_RELA_OFF";
1756     case DT_IA_64_VMS_SEG_RELA_OFF:    return "VMS_SEG_RELA_OFF";
1757     case DT_IA_64_VMS_FIXUP_RELA_OFF:  return "VMS_FIXUP_RELA_OFF";
1758     case DT_IA_64_VMS_PLTGOT_OFFSET:   return "VMS_PLTGOT_OFFSET";
1759     case DT_IA_64_VMS_PLTGOT_SEG:      return "VMS_PLTGOT_SEG";
1760     case DT_IA_64_VMS_FPMODE:          return "VMS_FPMODE";
1761     default:
1762       return NULL;
1763     }
1764 }
1765
1766 static const char *
1767 get_alpha_dynamic_type (unsigned long type)
1768 {
1769   switch (type)
1770     {
1771     case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
1772     default:
1773       return NULL;
1774     }
1775 }
1776
1777 static const char *
1778 get_score_dynamic_type (unsigned long type)
1779 {
1780   switch (type)
1781     {
1782     case DT_SCORE_BASE_ADDRESS: return "SCORE_BASE_ADDRESS";
1783     case DT_SCORE_LOCAL_GOTNO:  return "SCORE_LOCAL_GOTNO";
1784     case DT_SCORE_SYMTABNO:     return "SCORE_SYMTABNO";
1785     case DT_SCORE_GOTSYM:       return "SCORE_GOTSYM";
1786     case DT_SCORE_UNREFEXTNO:   return "SCORE_UNREFEXTNO";
1787     case DT_SCORE_HIPAGENO:     return "SCORE_HIPAGENO";
1788     default:
1789       return NULL;
1790     }
1791 }
1792
1793 static const char *
1794 get_tic6x_dynamic_type (unsigned long type)
1795 {
1796   switch (type)
1797     {
1798     case DT_C6000_GSYM_OFFSET: return "C6000_GSYM_OFFSET";
1799     case DT_C6000_GSTR_OFFSET: return "C6000_GSTR_OFFSET";
1800     case DT_C6000_DSBT_BASE:   return "C6000_DSBT_BASE";
1801     case DT_C6000_DSBT_SIZE:   return "C6000_DSBT_SIZE";
1802     case DT_C6000_PREEMPTMAP:  return "C6000_PREEMPTMAP";
1803     case DT_C6000_DSBT_INDEX:  return "C6000_DSBT_INDEX";
1804     default:
1805       return NULL;
1806     }
1807 }
1808
1809 static const char *
1810 get_nios2_dynamic_type (unsigned long type)
1811 {
1812   switch (type)
1813     {
1814     case DT_NIOS2_GP: return "NIOS2_GP";
1815     default:
1816       return NULL;
1817     }
1818 }
1819
1820 static const char *
1821 get_dynamic_type (unsigned long type)
1822 {
1823   static char buff[64];
1824
1825   switch (type)
1826     {
1827     case DT_NULL:       return "NULL";
1828     case DT_NEEDED:     return "NEEDED";
1829     case DT_PLTRELSZ:   return "PLTRELSZ";
1830     case DT_PLTGOT:     return "PLTGOT";
1831     case DT_HASH:       return "HASH";
1832     case DT_STRTAB:     return "STRTAB";
1833     case DT_SYMTAB:     return "SYMTAB";
1834     case DT_RELA:       return "RELA";
1835     case DT_RELASZ:     return "RELASZ";
1836     case DT_RELAENT:    return "RELAENT";
1837     case DT_STRSZ:      return "STRSZ";
1838     case DT_SYMENT:     return "SYMENT";
1839     case DT_INIT:       return "INIT";
1840     case DT_FINI:       return "FINI";
1841     case DT_SONAME:     return "SONAME";
1842     case DT_RPATH:      return "RPATH";
1843     case DT_SYMBOLIC:   return "SYMBOLIC";
1844     case DT_REL:        return "REL";
1845     case DT_RELSZ:      return "RELSZ";
1846     case DT_RELENT:     return "RELENT";
1847     case DT_PLTREL:     return "PLTREL";
1848     case DT_DEBUG:      return "DEBUG";
1849     case DT_TEXTREL:    return "TEXTREL";
1850     case DT_JMPREL:     return "JMPREL";
1851     case DT_BIND_NOW:   return "BIND_NOW";
1852     case DT_INIT_ARRAY: return "INIT_ARRAY";
1853     case DT_FINI_ARRAY: return "FINI_ARRAY";
1854     case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
1855     case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
1856     case DT_RUNPATH:    return "RUNPATH";
1857     case DT_FLAGS:      return "FLAGS";
1858
1859     case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1860     case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
1861
1862     case DT_CHECKSUM:   return "CHECKSUM";
1863     case DT_PLTPADSZ:   return "PLTPADSZ";
1864     case DT_MOVEENT:    return "MOVEENT";
1865     case DT_MOVESZ:     return "MOVESZ";
1866     case DT_FEATURE:    return "FEATURE";
1867     case DT_POSFLAG_1:  return "POSFLAG_1";
1868     case DT_SYMINSZ:    return "SYMINSZ";
1869     case DT_SYMINENT:   return "SYMINENT"; /* aka VALRNGHI */
1870
1871     case DT_ADDRRNGLO:  return "ADDRRNGLO";
1872     case DT_CONFIG:     return "CONFIG";
1873     case DT_DEPAUDIT:   return "DEPAUDIT";
1874     case DT_AUDIT:      return "AUDIT";
1875     case DT_PLTPAD:     return "PLTPAD";
1876     case DT_MOVETAB:    return "MOVETAB";
1877     case DT_SYMINFO:    return "SYMINFO"; /* aka ADDRRNGHI */
1878
1879     case DT_VERSYM:     return "VERSYM";
1880
1881     case DT_TLSDESC_GOT: return "TLSDESC_GOT";
1882     case DT_TLSDESC_PLT: return "TLSDESC_PLT";
1883     case DT_RELACOUNT:  return "RELACOUNT";
1884     case DT_RELCOUNT:   return "RELCOUNT";
1885     case DT_FLAGS_1:    return "FLAGS_1";
1886     case DT_VERDEF:     return "VERDEF";
1887     case DT_VERDEFNUM:  return "VERDEFNUM";
1888     case DT_VERNEED:    return "VERNEED";
1889     case DT_VERNEEDNUM: return "VERNEEDNUM";
1890
1891     case DT_AUXILIARY:  return "AUXILIARY";
1892     case DT_USED:       return "USED";
1893     case DT_FILTER:     return "FILTER";
1894
1895     case DT_GNU_PRELINKED: return "GNU_PRELINKED";
1896     case DT_GNU_CONFLICT: return "GNU_CONFLICT";
1897     case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
1898     case DT_GNU_LIBLIST: return "GNU_LIBLIST";
1899     case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
1900     case DT_GNU_HASH:   return "GNU_HASH";
1901
1902     default:
1903       if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
1904         {
1905           const char * result;
1906
1907           switch (elf_header.e_machine)
1908             {
1909             case EM_MIPS:
1910             case EM_MIPS_RS3_LE:
1911               result = get_mips_dynamic_type (type);
1912               break;
1913             case EM_SPARCV9:
1914               result = get_sparc64_dynamic_type (type);
1915               break;
1916             case EM_PPC:
1917               result = get_ppc_dynamic_type (type);
1918               break;
1919             case EM_PPC64:
1920               result = get_ppc64_dynamic_type (type);
1921               break;
1922             case EM_IA_64:
1923               result = get_ia64_dynamic_type (type);
1924               break;
1925             case EM_ALPHA:
1926               result = get_alpha_dynamic_type (type);
1927               break;
1928             case EM_SCORE:
1929               result = get_score_dynamic_type (type);
1930               break;
1931             case EM_TI_C6000:
1932               result = get_tic6x_dynamic_type (type);
1933               break;
1934             case EM_ALTERA_NIOS2:
1935               result = get_nios2_dynamic_type (type);
1936               break;
1937             default:
1938               result = NULL;
1939               break;
1940             }
1941
1942           if (result != NULL)
1943             return result;
1944
1945           snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
1946         }
1947       else if (((type >= DT_LOOS) && (type <= DT_HIOS))
1948                || (elf_header.e_machine == EM_PARISC
1949                    && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
1950         {
1951           const char * result;
1952
1953           switch (elf_header.e_machine)
1954             {
1955             case EM_PARISC:
1956               result = get_parisc_dynamic_type (type);
1957               break;
1958             case EM_IA_64:
1959               result = get_ia64_dynamic_type (type);
1960               break;
1961             default:
1962               result = NULL;
1963               break;
1964             }
1965
1966           if (result != NULL)
1967             return result;
1968
1969           snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
1970                     type);
1971         }
1972       else
1973         snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
1974
1975       return buff;
1976     }
1977 }
1978
1979 static char *
1980 get_file_type (unsigned e_type)
1981 {
1982   static char buff[32];
1983
1984   switch (e_type)
1985     {
1986     case ET_NONE:       return _("NONE (None)");
1987     case ET_REL:        return _("REL (Relocatable file)");
1988     case ET_EXEC:       return _("EXEC (Executable file)");
1989     case ET_DYN:        return _("DYN (Shared object file)");
1990     case ET_CORE:       return _("CORE (Core file)");
1991
1992     default:
1993       if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
1994         snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
1995       else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
1996         snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
1997       else
1998         snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
1999       return buff;
2000     }
2001 }
2002
2003 static char *
2004 get_machine_name (unsigned e_machine)
2005 {
2006   static char buff[64]; /* XXX */
2007
2008   switch (e_machine)
2009     {
2010     case EM_NONE:               return _("None");
2011     case EM_AARCH64:            return "AArch64";
2012     case EM_M32:                return "WE32100";
2013     case EM_SPARC:              return "Sparc";
2014     case EM_SPU:                return "SPU";
2015     case EM_386:                return "Intel 80386";
2016     case EM_68K:                return "MC68000";
2017     case EM_88K:                return "MC88000";
2018     case EM_486:                return "Intel 80486";
2019     case EM_860:                return "Intel 80860";
2020     case EM_MIPS:               return "MIPS R3000";
2021     case EM_S370:               return "IBM System/370";
2022     case EM_MIPS_RS3_LE:        return "MIPS R4000 big-endian";
2023     case EM_OLD_SPARCV9:        return "Sparc v9 (old)";
2024     case EM_PARISC:             return "HPPA";
2025     case EM_PPC_OLD:            return "Power PC (old)";
2026     case EM_SPARC32PLUS:        return "Sparc v8+" ;
2027     case EM_960:                return "Intel 90860";
2028     case EM_PPC:                return "PowerPC";
2029     case EM_PPC64:              return "PowerPC64";
2030     case EM_FR20:               return "Fujitsu FR20";
2031     case EM_RH32:               return "TRW RH32";
2032     case EM_MCORE:              return "MCORE";
2033     case EM_ARM:                return "ARM";
2034     case EM_OLD_ALPHA:          return "Digital Alpha (old)";
2035     case EM_SH:                 return "Renesas / SuperH SH";
2036     case EM_SPARCV9:            return "Sparc v9";
2037     case EM_TRICORE:            return "Siemens Tricore";
2038     case EM_ARC:                return "ARC";
2039     case EM_H8_300:             return "Renesas H8/300";
2040     case EM_H8_300H:            return "Renesas H8/300H";
2041     case EM_H8S:                return "Renesas H8S";
2042     case EM_H8_500:             return "Renesas H8/500";
2043     case EM_IA_64:              return "Intel IA-64";
2044     case EM_MIPS_X:             return "Stanford MIPS-X";
2045     case EM_COLDFIRE:           return "Motorola Coldfire";
2046     case EM_ALPHA:              return "Alpha";
2047     case EM_CYGNUS_D10V:
2048     case EM_D10V:               return "d10v";
2049     case EM_CYGNUS_D30V:
2050     case EM_D30V:               return "d30v";
2051     case EM_CYGNUS_M32R:
2052     case EM_M32R:               return "Renesas M32R (formerly Mitsubishi M32r)";
2053     case EM_CYGNUS_V850:
2054     case EM_V800:               return "Renesas V850 (using RH850 ABI)";
2055     case EM_V850:               return "Renesas V850";
2056     case EM_CYGNUS_MN10300:
2057     case EM_MN10300:            return "mn10300";
2058     case EM_CYGNUS_MN10200:
2059     case EM_MN10200:            return "mn10200";
2060     case EM_MOXIE:              return "Moxie";
2061     case EM_CYGNUS_FR30:
2062     case EM_FR30:               return "Fujitsu FR30";
2063     case EM_CYGNUS_FRV:         return "Fujitsu FR-V";
2064     case EM_PJ_OLD:
2065     case EM_PJ:                 return "picoJava";
2066     case EM_MMA:                return "Fujitsu Multimedia Accelerator";
2067     case EM_PCP:                return "Siemens PCP";
2068     case EM_NCPU:               return "Sony nCPU embedded RISC processor";
2069     case EM_NDR1:               return "Denso NDR1 microprocesspr";
2070     case EM_STARCORE:           return "Motorola Star*Core processor";
2071     case EM_ME16:               return "Toyota ME16 processor";
2072     case EM_ST100:              return "STMicroelectronics ST100 processor";
2073     case EM_TINYJ:              return "Advanced Logic Corp. TinyJ embedded processor";
2074     case EM_PDSP:               return "Sony DSP processor";
2075     case EM_PDP10:              return "Digital Equipment Corp. PDP-10";
2076     case EM_PDP11:              return "Digital Equipment Corp. PDP-11";
2077     case EM_FX66:               return "Siemens FX66 microcontroller";
2078     case EM_ST9PLUS:            return "STMicroelectronics ST9+ 8/16 bit microcontroller";
2079     case EM_ST7:                return "STMicroelectronics ST7 8-bit microcontroller";
2080     case EM_68HC16:             return "Motorola MC68HC16 Microcontroller";
2081     case EM_68HC12:             return "Motorola MC68HC12 Microcontroller";
2082     case EM_68HC11:             return "Motorola MC68HC11 Microcontroller";
2083     case EM_68HC08:             return "Motorola MC68HC08 Microcontroller";
2084     case EM_68HC05:             return "Motorola MC68HC05 Microcontroller";
2085     case EM_SVX:                return "Silicon Graphics SVx";
2086     case EM_ST19:               return "STMicroelectronics ST19 8-bit microcontroller";
2087     case EM_VAX:                return "Digital VAX";
2088     case EM_AVR_OLD:
2089     case EM_AVR:                return "Atmel AVR 8-bit microcontroller";
2090     case EM_CRIS:               return "Axis Communications 32-bit embedded processor";
2091     case EM_JAVELIN:            return "Infineon Technologies 32-bit embedded cpu";
2092     case EM_FIREPATH:           return "Element 14 64-bit DSP processor";
2093     case EM_ZSP:                return "LSI Logic's 16-bit DSP processor";
2094     case EM_MMIX:               return "Donald Knuth's educational 64-bit processor";
2095     case EM_HUANY:              return "Harvard Universitys's machine-independent object format";
2096     case EM_PRISM:              return "Vitesse Prism";
2097     case EM_X86_64:             return "Advanced Micro Devices X86-64";
2098     case EM_L1OM:               return "Intel L1OM";
2099     case EM_K1OM:               return "Intel K1OM";
2100     case EM_S390_OLD:
2101     case EM_S390:               return "IBM S/390";
2102     case EM_SCORE:              return "SUNPLUS S+Core";
2103     case EM_XSTORMY16:          return "Sanyo XStormy16 CPU core";
2104     case EM_OR1K:               return "OpenRISC 1000";
2105     case EM_ARC_A5:             return "ARC International ARCompact processor";
2106     case EM_CRX:                return "National Semiconductor CRX microprocessor";
2107     case EM_ADAPTEVA_EPIPHANY:  return "Adapteva EPIPHANY";
2108     case EM_DLX:                return "OpenDLX";
2109     case EM_IP2K_OLD:
2110     case EM_IP2K:               return "Ubicom IP2xxx 8-bit microcontrollers";
2111     case EM_IQ2000:             return "Vitesse IQ2000";
2112     case EM_XTENSA_OLD:
2113     case EM_XTENSA:             return "Tensilica Xtensa Processor";
2114     case EM_VIDEOCORE:          return "Alphamosaic VideoCore processor";
2115     case EM_TMM_GPP:            return "Thompson Multimedia General Purpose Processor";
2116     case EM_NS32K:              return "National Semiconductor 32000 series";
2117     case EM_TPC:                return "Tenor Network TPC processor";
2118     case EM_ST200:              return "STMicroelectronics ST200 microcontroller";
2119     case EM_MAX:                return "MAX Processor";
2120     case EM_CR:                 return "National Semiconductor CompactRISC";
2121     case EM_F2MC16:             return "Fujitsu F2MC16";
2122     case EM_MSP430:             return "Texas Instruments msp430 microcontroller";
2123     case EM_LATTICEMICO32:      return "Lattice Mico32";
2124     case EM_M32C_OLD:
2125     case EM_M32C:               return "Renesas M32c";
2126     case EM_MT:                 return "Morpho Techologies MT processor";
2127     case EM_BLACKFIN:           return "Analog Devices Blackfin";
2128     case EM_SE_C33:             return "S1C33 Family of Seiko Epson processors";
2129     case EM_SEP:                return "Sharp embedded microprocessor";
2130     case EM_ARCA:               return "Arca RISC microprocessor";
2131     case EM_UNICORE:            return "Unicore";
2132     case EM_EXCESS:             return "eXcess 16/32/64-bit configurable embedded CPU";
2133     case EM_DXP:                return "Icera Semiconductor Inc. Deep Execution Processor";
2134     case EM_NIOS32:             return "Altera Nios";
2135     case EM_ALTERA_NIOS2:       return "Altera Nios II";
2136     case EM_C166:
2137     case EM_XC16X:              return "Infineon Technologies xc16x";
2138     case EM_M16C:               return "Renesas M16C series microprocessors";
2139     case EM_DSPIC30F:           return "Microchip Technology dsPIC30F Digital Signal Controller";
2140     case EM_CE:                 return "Freescale Communication Engine RISC core";
2141     case EM_TSK3000:            return "Altium TSK3000 core";
2142     case EM_RS08:               return "Freescale RS08 embedded processor";
2143     case EM_ECOG2:              return "Cyan Technology eCOG2 microprocessor";
2144     case EM_DSP24:              return "New Japan Radio (NJR) 24-bit DSP Processor";
2145     case EM_VIDEOCORE3:         return "Broadcom VideoCore III processor";
2146     case EM_SE_C17:             return "Seiko Epson C17 family";
2147     case EM_TI_C6000:           return "Texas Instruments TMS320C6000 DSP family";
2148     case EM_TI_C2000:           return "Texas Instruments TMS320C2000 DSP family";
2149     case EM_TI_C5500:           return "Texas Instruments TMS320C55x DSP family";
2150     case EM_MMDSP_PLUS:         return "STMicroelectronics 64bit VLIW Data Signal Processor";
2151     case EM_CYPRESS_M8C:        return "Cypress M8C microprocessor";
2152     case EM_R32C:               return "Renesas R32C series microprocessors";
2153     case EM_TRIMEDIA:           return "NXP Semiconductors TriMedia architecture family";
2154     case EM_QDSP6:              return "QUALCOMM DSP6 Processor";
2155     case EM_8051:               return "Intel 8051 and variants";
2156     case EM_STXP7X:             return "STMicroelectronics STxP7x family";
2157     case EM_NDS32:              return "Andes Technology compact code size embedded RISC processor family";
2158     case EM_ECOG1X:             return "Cyan Technology eCOG1X family";
2159     case EM_MAXQ30:             return "Dallas Semiconductor MAXQ30 Core microcontrollers";
2160     case EM_XIMO16:             return "New Japan Radio (NJR) 16-bit DSP Processor";
2161     case EM_MANIK:              return "M2000 Reconfigurable RISC Microprocessor";
2162     case EM_CRAYNV2:            return "Cray Inc. NV2 vector architecture";
2163     case EM_CYGNUS_MEP:         return "Toshiba MeP Media Engine";
2164     case EM_CR16:
2165     case EM_MICROBLAZE:
2166     case EM_MICROBLAZE_OLD:     return "Xilinx MicroBlaze";
2167     case EM_RL78:               return "Renesas RL78";
2168     case EM_RX:                 return "Renesas RX";
2169     case EM_METAG:              return "Imagination Technologies Meta processor architecture";
2170     case EM_MCST_ELBRUS:        return "MCST Elbrus general purpose hardware architecture";
2171     case EM_ECOG16:             return "Cyan Technology eCOG16 family";
2172     case EM_ETPU:               return "Freescale Extended Time Processing Unit";
2173     case EM_SLE9X:              return "Infineon Technologies SLE9X core";
2174     case EM_AVR32:              return "Atmel Corporation 32-bit microprocessor family";
2175     case EM_STM8:               return "STMicroeletronics STM8 8-bit microcontroller";
2176     case EM_TILE64:             return "Tilera TILE64 multicore architecture family";
2177     case EM_TILEPRO:            return "Tilera TILEPro multicore architecture family";
2178     case EM_TILEGX:             return "Tilera TILE-Gx multicore architecture family";
2179     case EM_CUDA:               return "NVIDIA CUDA architecture";
2180     case EM_XGATE:              return "Motorola XGATE embedded processor";
2181     default:
2182       snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
2183       return buff;
2184     }
2185 }
2186
2187 static void
2188 decode_ARM_machine_flags (unsigned e_flags, char buf[])
2189 {
2190   unsigned eabi;
2191   int unknown = 0;
2192
2193   eabi = EF_ARM_EABI_VERSION (e_flags);
2194   e_flags &= ~ EF_ARM_EABIMASK;
2195
2196   /* Handle "generic" ARM flags.  */
2197   if (e_flags & EF_ARM_RELEXEC)
2198     {
2199       strcat (buf, ", relocatable executable");
2200       e_flags &= ~ EF_ARM_RELEXEC;
2201     }
2202
2203   if (e_flags & EF_ARM_HASENTRY)
2204     {
2205       strcat (buf, ", has entry point");
2206       e_flags &= ~ EF_ARM_HASENTRY;
2207     }
2208
2209   /* Now handle EABI specific flags.  */
2210   switch (eabi)
2211     {
2212     default:
2213       strcat (buf, ", <unrecognized EABI>");
2214       if (e_flags)
2215         unknown = 1;
2216       break;
2217
2218     case EF_ARM_EABI_VER1:
2219       strcat (buf, ", Version1 EABI");
2220       while (e_flags)
2221         {
2222           unsigned flag;
2223
2224           /* Process flags one bit at a time.  */
2225           flag = e_flags & - e_flags;
2226           e_flags &= ~ flag;
2227
2228           switch (flag)
2229             {
2230             case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK.  */
2231               strcat (buf, ", sorted symbol tables");
2232               break;
2233
2234             default:
2235               unknown = 1;
2236               break;
2237             }
2238         }
2239       break;
2240
2241     case EF_ARM_EABI_VER2:
2242       strcat (buf, ", Version2 EABI");
2243       while (e_flags)
2244         {
2245           unsigned flag;
2246
2247           /* Process flags one bit at a time.  */
2248           flag = e_flags & - e_flags;
2249           e_flags &= ~ flag;
2250
2251           switch (flag)
2252             {
2253             case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK.  */
2254               strcat (buf, ", sorted symbol tables");
2255               break;
2256
2257             case EF_ARM_DYNSYMSUSESEGIDX:
2258               strcat (buf, ", dynamic symbols use segment index");
2259               break;
2260
2261             case EF_ARM_MAPSYMSFIRST:
2262               strcat (buf, ", mapping symbols precede others");
2263               break;
2264
2265             default:
2266               unknown = 1;
2267               break;
2268             }
2269         }
2270       break;
2271
2272     case EF_ARM_EABI_VER3:
2273       strcat (buf, ", Version3 EABI");
2274       break;
2275
2276     case EF_ARM_EABI_VER4:
2277       strcat (buf, ", Version4 EABI");
2278       while (e_flags)
2279         {
2280           unsigned flag;
2281
2282           /* Process flags one bit at a time.  */
2283           flag = e_flags & - e_flags;
2284           e_flags &= ~ flag;
2285
2286           switch (flag)
2287             {
2288             case EF_ARM_BE8:
2289               strcat (buf, ", BE8");
2290               break;
2291
2292             case EF_ARM_LE8:
2293               strcat (buf, ", LE8");
2294               break;
2295
2296             default:
2297               unknown = 1;
2298               break;
2299             }
2300       break;
2301         }
2302       break;
2303
2304     case EF_ARM_EABI_VER5:
2305       strcat (buf, ", Version5 EABI");
2306       while (e_flags)
2307         {
2308           unsigned flag;
2309
2310           /* Process flags one bit at a time.  */
2311           flag = e_flags & - e_flags;
2312           e_flags &= ~ flag;
2313
2314           switch (flag)
2315             {
2316             case EF_ARM_BE8:
2317               strcat (buf, ", BE8");
2318               break;
2319
2320             case EF_ARM_LE8:
2321               strcat (buf, ", LE8");
2322               break;
2323
2324             case EF_ARM_ABI_FLOAT_SOFT: /* Conflicts with EF_ARM_SOFT_FLOAT.  */
2325               strcat (buf, ", soft-float ABI");
2326               break;
2327
2328             case EF_ARM_ABI_FLOAT_HARD: /* Conflicts with EF_ARM_VFP_FLOAT.  */
2329               strcat (buf, ", hard-float ABI");
2330               break;
2331
2332             default:
2333               unknown = 1;
2334               break;
2335             }
2336         }
2337       break;
2338
2339     case EF_ARM_EABI_UNKNOWN:
2340       strcat (buf, ", GNU EABI");
2341       while (e_flags)
2342         {
2343           unsigned flag;
2344
2345           /* Process flags one bit at a time.  */
2346           flag = e_flags & - e_flags;
2347           e_flags &= ~ flag;
2348
2349           switch (flag)
2350             {
2351             case EF_ARM_INTERWORK:
2352               strcat (buf, ", interworking enabled");
2353               break;
2354
2355             case EF_ARM_APCS_26:
2356               strcat (buf, ", uses APCS/26");
2357               break;
2358
2359             case EF_ARM_APCS_FLOAT:
2360               strcat (buf, ", uses APCS/float");
2361               break;
2362
2363             case EF_ARM_PIC:
2364               strcat (buf, ", position independent");
2365               break;
2366
2367             case EF_ARM_ALIGN8:
2368               strcat (buf, ", 8 bit structure alignment");
2369               break;
2370
2371             case EF_ARM_NEW_ABI:
2372               strcat (buf, ", uses new ABI");
2373               break;
2374
2375             case EF_ARM_OLD_ABI:
2376               strcat (buf, ", uses old ABI");
2377               break;
2378
2379             case EF_ARM_SOFT_FLOAT:
2380               strcat (buf, ", software FP");
2381               break;
2382
2383             case EF_ARM_VFP_FLOAT:
2384               strcat (buf, ", VFP");
2385               break;
2386
2387             case EF_ARM_MAVERICK_FLOAT:
2388               strcat (buf, ", Maverick FP");
2389               break;
2390
2391             default:
2392               unknown = 1;
2393               break;
2394             }
2395         }
2396     }
2397
2398   if (unknown)
2399     strcat (buf,_(", <unknown>"));
2400 }
2401
2402 static void
2403 decode_NDS32_machine_flags (unsigned e_flags, char buf[], size_t size)
2404 {
2405   unsigned abi;
2406   unsigned arch;
2407   unsigned config;
2408   unsigned version;
2409   int has_fpu = 0;
2410   int r = 0;
2411
2412   static const char *ABI_STRINGS[] =
2413   {
2414     "ABI v0", /* use r5 as return register; only used in N1213HC */
2415     "ABI v1", /* use r0 as return register */
2416     "ABI v2", /* use r0 as return register and don't reserve 24 bytes for arguments */
2417     "ABI v2fp", /* for FPU */
2418     "AABI",
2419     "ABI2 FP+"
2420   };
2421   static const char *VER_STRINGS[] =
2422   {
2423     "Andes ELF V1.3 or older",
2424     "Andes ELF V1.3.1",
2425     "Andes ELF V1.4"
2426   };
2427   static const char *ARCH_STRINGS[] =
2428   {
2429     "",
2430     "Andes Star v1.0",
2431     "Andes Star v2.0",
2432     "Andes Star v3.0",
2433     "Andes Star v3.0m"
2434   };
2435
2436   abi = EF_NDS_ABI & e_flags;
2437   arch = EF_NDS_ARCH & e_flags;
2438   config = EF_NDS_INST & e_flags;
2439   version = EF_NDS32_ELF_VERSION & e_flags;
2440
2441   memset (buf, 0, size);
2442
2443   switch (abi)
2444     {
2445     case E_NDS_ABI_V0:
2446     case E_NDS_ABI_V1:
2447     case E_NDS_ABI_V2:
2448     case E_NDS_ABI_V2FP:
2449     case E_NDS_ABI_AABI:
2450     case E_NDS_ABI_V2FP_PLUS:
2451       /* In case there are holes in the array.  */
2452       r += snprintf (buf + r, size - r, ", %s", ABI_STRINGS[abi >> EF_NDS_ABI_SHIFT]);
2453       break;
2454
2455     default:
2456       r += snprintf (buf + r, size - r, ", <unrecognized ABI>");
2457       break;
2458     }
2459
2460   switch (version)
2461     {
2462     case E_NDS32_ELF_VER_1_2:
2463     case E_NDS32_ELF_VER_1_3:
2464     case E_NDS32_ELF_VER_1_4:
2465       r += snprintf (buf + r, size - r, ", %s", VER_STRINGS[version >> EF_NDS32_ELF_VERSION_SHIFT]);
2466       break;
2467
2468     default:
2469       r += snprintf (buf + r, size - r, ", <unrecognized ELF version number>");
2470       break;
2471     }
2472
2473   if (E_NDS_ABI_V0 == abi)
2474     {
2475       /* OLD ABI; only used in N1213HC, has performance extension 1.  */
2476       r += snprintf (buf + r, size - r, ", Andes Star v1.0, N1213HC, MAC, PERF1");
2477       if (arch == E_NDS_ARCH_STAR_V1_0)
2478         r += snprintf (buf + r, size -r, ", 16b"); /* has 16-bit instructions */
2479       return;
2480     }
2481
2482   switch (arch)
2483     {
2484     case E_NDS_ARCH_STAR_V1_0:
2485     case E_NDS_ARCH_STAR_V2_0:
2486     case E_NDS_ARCH_STAR_V3_0:
2487     case E_NDS_ARCH_STAR_V3_M:
2488       r += snprintf (buf + r, size - r, ", %s", ARCH_STRINGS[arch >> EF_NDS_ARCH_SHIFT]);
2489       break;
2490
2491     default:
2492       r += snprintf (buf + r, size - r, ", <unrecognized architecture>");
2493       /* ARCH version determines how the e_flags are interpreted.
2494          If it is unknown, we cannot proceed.  */
2495       return;
2496     }
2497
2498   /* Newer ABI; Now handle architecture specific flags.  */
2499   if (arch == E_NDS_ARCH_STAR_V1_0)
2500     {
2501       if (config & E_NDS32_HAS_MFUSR_PC_INST)
2502         r += snprintf (buf + r, size -r, ", MFUSR_PC");
2503
2504       if (!(config & E_NDS32_HAS_NO_MAC_INST))
2505         r += snprintf (buf + r, size -r, ", MAC");
2506
2507       if (config & E_NDS32_HAS_DIV_INST)
2508         r += snprintf (buf + r, size -r, ", DIV");
2509
2510       if (config & E_NDS32_HAS_16BIT_INST)
2511         r += snprintf (buf + r, size -r, ", 16b");
2512     }
2513   else
2514     {
2515       if (config & E_NDS32_HAS_MFUSR_PC_INST)
2516         {
2517           if (version <= E_NDS32_ELF_VER_1_3)
2518             r += snprintf (buf + r, size -r, ", [B8]");
2519           else
2520             r += snprintf (buf + r, size -r, ", EX9");
2521         }
2522
2523       if (config & E_NDS32_HAS_MAC_DX_INST)
2524         r += snprintf (buf + r, size -r, ", MAC_DX");
2525
2526       if (config & E_NDS32_HAS_DIV_DX_INST)
2527         r += snprintf (buf + r, size -r, ", DIV_DX");
2528
2529       if (config & E_NDS32_HAS_16BIT_INST)
2530         {
2531           if (version <= E_NDS32_ELF_VER_1_3)
2532             r += snprintf (buf + r, size -r, ", 16b");
2533           else
2534             r += snprintf (buf + r, size -r, ", IFC");
2535         }
2536     }
2537
2538   if (config & E_NDS32_HAS_EXT_INST)
2539     r += snprintf (buf + r, size -r, ", PERF1");
2540
2541   if (config & E_NDS32_HAS_EXT2_INST)
2542     r += snprintf (buf + r, size -r, ", PERF2");
2543
2544   if (config & E_NDS32_HAS_FPU_INST)
2545     {
2546       has_fpu = 1;
2547       r += snprintf (buf + r, size -r, ", FPU_SP");
2548     }
2549
2550   if (config & E_NDS32_HAS_FPU_DP_INST)
2551     {
2552       has_fpu = 1;
2553       r += snprintf (buf + r, size -r, ", FPU_DP");
2554     }
2555
2556   if (config & E_NDS32_HAS_FPU_MAC_INST)
2557     {
2558       has_fpu = 1;
2559       r += snprintf (buf + r, size -r, ", FPU_MAC");
2560     }
2561
2562   if (has_fpu)
2563     {
2564       switch ((config & E_NDS32_FPU_REG_CONF) >> E_NDS32_FPU_REG_CONF_SHIFT)
2565         {
2566         case E_NDS32_FPU_REG_8SP_4DP:
2567           r += snprintf (buf + r, size -r, ", FPU_REG:8/4");
2568           break;
2569         case E_NDS32_FPU_REG_16SP_8DP:
2570           r += snprintf (buf + r, size -r, ", FPU_REG:16/8");
2571           break;
2572         case E_NDS32_FPU_REG_32SP_16DP:
2573           r += snprintf (buf + r, size -r, ", FPU_REG:32/16");
2574           break;
2575         case E_NDS32_FPU_REG_32SP_32DP:
2576           r += snprintf (buf + r, size -r, ", FPU_REG:32/32");
2577           break;
2578         }
2579     }
2580
2581   if (config & E_NDS32_HAS_AUDIO_INST)
2582     r += snprintf (buf + r, size -r, ", AUDIO");
2583
2584   if (config & E_NDS32_HAS_STRING_INST)
2585     r += snprintf (buf + r, size -r, ", STR");
2586
2587   if (config & E_NDS32_HAS_REDUCED_REGS)
2588     r += snprintf (buf + r, size -r, ", 16REG");
2589
2590   if (config & E_NDS32_HAS_VIDEO_INST)
2591     {
2592       if (version <= E_NDS32_ELF_VER_1_3)
2593         r += snprintf (buf + r, size -r, ", VIDEO");
2594       else
2595         r += snprintf (buf + r, size -r, ", SATURATION");
2596     }
2597
2598   if (config & E_NDS32_HAS_ENCRIPT_INST)
2599     r += snprintf (buf + r, size -r, ", ENCRP");
2600
2601   if (config & E_NDS32_HAS_L2C_INST)
2602     r += snprintf (buf + r, size -r, ", L2C");
2603 }
2604
2605 static char *
2606 get_machine_flags (unsigned e_flags, unsigned e_machine)
2607 {
2608   static char buf[1024];
2609
2610   buf[0] = '\0';
2611
2612   if (e_flags)
2613     {
2614       switch (e_machine)
2615         {
2616         default:
2617           break;
2618
2619         case EM_ARM:
2620           decode_ARM_machine_flags (e_flags, buf);
2621           break;
2622
2623         case EM_BLACKFIN:
2624           if (e_flags & EF_BFIN_PIC)
2625             strcat (buf, ", PIC");
2626
2627           if (e_flags & EF_BFIN_FDPIC)
2628             strcat (buf, ", FDPIC");
2629
2630           if (e_flags & EF_BFIN_CODE_IN_L1)
2631             strcat (buf, ", code in L1");
2632
2633           if (e_flags & EF_BFIN_DATA_IN_L1)
2634             strcat (buf, ", data in L1");
2635
2636           break;
2637
2638         case EM_CYGNUS_FRV:
2639           switch (e_flags & EF_FRV_CPU_MASK)
2640             {
2641             case EF_FRV_CPU_GENERIC:
2642               break;
2643
2644             default:
2645               strcat (buf, ", fr???");
2646               break;
2647
2648             case EF_FRV_CPU_FR300:
2649               strcat (buf, ", fr300");
2650               break;
2651
2652             case EF_FRV_CPU_FR400:
2653               strcat (buf, ", fr400");
2654               break;
2655             case EF_FRV_CPU_FR405:
2656               strcat (buf, ", fr405");
2657               break;
2658
2659             case EF_FRV_CPU_FR450:
2660               strcat (buf, ", fr450");
2661               break;
2662
2663             case EF_FRV_CPU_FR500:
2664               strcat (buf, ", fr500");
2665               break;
2666             case EF_FRV_CPU_FR550:
2667               strcat (buf, ", fr550");
2668               break;
2669
2670             case EF_FRV_CPU_SIMPLE:
2671               strcat (buf, ", simple");
2672               break;
2673             case EF_FRV_CPU_TOMCAT:
2674               strcat (buf, ", tomcat");
2675               break;
2676             }
2677           break;
2678
2679         case EM_68K:
2680           if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
2681             strcat (buf, ", m68000");
2682           else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
2683             strcat (buf, ", cpu32");
2684           else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
2685             strcat (buf, ", fido_a");
2686           else
2687             {
2688               char const * isa = _("unknown");
2689               char const * mac = _("unknown mac");
2690               char const * additional = NULL;
2691
2692               switch (e_flags & EF_M68K_CF_ISA_MASK)
2693                 {
2694                 case EF_M68K_CF_ISA_A_NODIV:
2695                   isa = "A";
2696                   additional = ", nodiv";
2697                   break;
2698                 case EF_M68K_CF_ISA_A:
2699                   isa = "A";
2700                   break;
2701                 case EF_M68K_CF_ISA_A_PLUS:
2702                   isa = "A+";
2703                   break;
2704                 case EF_M68K_CF_ISA_B_NOUSP:
2705                   isa = "B";
2706                   additional = ", nousp";
2707                   break;
2708                 case EF_M68K_CF_ISA_B:
2709                   isa = "B";
2710                   break;
2711                 case EF_M68K_CF_ISA_C:
2712                   isa = "C";
2713                   break;
2714                 case EF_M68K_CF_ISA_C_NODIV:
2715                   isa = "C";
2716                   additional = ", nodiv";
2717                   break;
2718                 }
2719               strcat (buf, ", cf, isa ");
2720               strcat (buf, isa);
2721               if (additional)
2722                 strcat (buf, additional);
2723               if (e_flags & EF_M68K_CF_FLOAT)
2724                 strcat (buf, ", float");
2725               switch (e_flags & EF_M68K_CF_MAC_MASK)
2726                 {
2727                 case 0:
2728                   mac = NULL;
2729                   break;
2730                 case EF_M68K_CF_MAC:
2731                   mac = "mac";
2732                   break;
2733                 case EF_M68K_CF_EMAC:
2734                   mac = "emac";
2735                   break;
2736                 case EF_M68K_CF_EMAC_B:
2737                   mac = "emac_b";
2738                   break;
2739                 }
2740               if (mac)
2741                 {
2742                   strcat (buf, ", ");
2743                   strcat (buf, mac);
2744                 }
2745             }
2746           break;
2747
2748         case EM_PPC:
2749           if (e_flags & EF_PPC_EMB)
2750             strcat (buf, ", emb");
2751
2752           if (e_flags & EF_PPC_RELOCATABLE)
2753             strcat (buf, _(", relocatable"));
2754
2755           if (e_flags & EF_PPC_RELOCATABLE_LIB)
2756             strcat (buf, _(", relocatable-lib"));
2757           break;
2758
2759         case EM_PPC64:
2760           if (e_flags & EF_PPC64_ABI)
2761             {
2762               char abi[] = ", abiv0";
2763
2764               abi[6] += e_flags & EF_PPC64_ABI;
2765               strcat (buf, abi);
2766             }
2767           break;
2768
2769         case EM_V800:
2770           if ((e_flags & EF_RH850_ABI) == EF_RH850_ABI)
2771             strcat (buf, ", RH850 ABI");
2772
2773           if (e_flags & EF_V800_850E3)
2774             strcat (buf, ", V3 architecture");
2775
2776           if ((e_flags & (EF_RH850_FPU_DOUBLE | EF_RH850_FPU_SINGLE)) == 0)
2777             strcat (buf, ", FPU not used");
2778
2779           if ((e_flags & (EF_RH850_REGMODE22 | EF_RH850_REGMODE32)) == 0)
2780             strcat (buf, ", regmode: COMMON");
2781
2782           if ((e_flags & (EF_RH850_GP_FIX | EF_RH850_GP_NOFIX)) == 0)
2783             strcat (buf, ", r4 not used");
2784
2785           if ((e_flags & (EF_RH850_EP_FIX | EF_RH850_EP_NOFIX)) == 0)
2786             strcat (buf, ", r30 not used");
2787
2788           if ((e_flags & (EF_RH850_TP_FIX | EF_RH850_TP_NOFIX)) == 0)
2789             strcat (buf, ", r5 not used");
2790
2791           if ((e_flags & (EF_RH850_REG2_RESERVE | EF_RH850_REG2_NORESERVE)) == 0)
2792             strcat (buf, ", r2 not used");
2793
2794           for (e_flags &= 0xFFFF; e_flags; e_flags &= ~ (e_flags & - e_flags))
2795             {
2796               switch (e_flags & - e_flags)
2797                 {
2798                 case EF_RH850_FPU_DOUBLE: strcat (buf, ", double precision FPU"); break;
2799                 case EF_RH850_FPU_SINGLE: strcat (buf, ", single precision FPU"); break;
2800                 case EF_RH850_SIMD: strcat (buf, ", SIMD"); break;
2801                 case EF_RH850_CACHE: strcat (buf, ", CACHE"); break;
2802                 case EF_RH850_MMU: strcat (buf, ", MMU"); break;
2803                 case EF_RH850_REGMODE22: strcat (buf, ", regmode:22"); break;
2804                 case EF_RH850_REGMODE32: strcat (buf, ", regmode:23"); break;
2805                 case EF_RH850_DATA_ALIGN8: strcat (buf, ", 8-byte alignment"); break;
2806                 case EF_RH850_GP_FIX: strcat (buf, ", r4 fixed"); break;
2807                 case EF_RH850_GP_NOFIX: strcat (buf, ", r4 free"); break;
2808                 case EF_RH850_EP_FIX: strcat (buf, ", r30 fixed"); break;
2809                 case EF_RH850_EP_NOFIX: strcat (buf, ", r30 free"); break;
2810                 case EF_RH850_TP_FIX: strcat (buf, ", r5 fixed"); break;
2811                 case EF_RH850_TP_NOFIX: strcat (buf, ", r5 free"); break;
2812                 case EF_RH850_REG2_RESERVE: strcat (buf, ", r2 fixed"); break;
2813                 case EF_RH850_REG2_NORESERVE: strcat (buf, ", r2 free"); break;
2814                 default: break;
2815                 }
2816             }
2817           break;
2818
2819         case EM_V850:
2820         case EM_CYGNUS_V850:
2821           switch (e_flags & EF_V850_ARCH)
2822             {
2823             case E_V850E3V5_ARCH:
2824               strcat (buf, ", v850e3v5");
2825               break;
2826             case E_V850E2V3_ARCH:
2827               strcat (buf, ", v850e2v3");
2828               break;
2829             case E_V850E2_ARCH:
2830               strcat (buf, ", v850e2");
2831               break;
2832             case E_V850E1_ARCH:
2833               strcat (buf, ", v850e1");
2834               break;
2835             case E_V850E_ARCH:
2836               strcat (buf, ", v850e");
2837               break;
2838             case E_V850_ARCH:
2839               strcat (buf, ", v850");
2840               break;
2841             default:
2842               strcat (buf, _(", unknown v850 architecture variant"));
2843               break;
2844             }
2845           break;
2846
2847         case EM_M32R:
2848         case EM_CYGNUS_M32R:
2849           if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
2850             strcat (buf, ", m32r");
2851           break;
2852
2853         case EM_MIPS:
2854         case EM_MIPS_RS3_LE:
2855           if (e_flags & EF_MIPS_NOREORDER)
2856             strcat (buf, ", noreorder");
2857
2858           if (e_flags & EF_MIPS_PIC)
2859             strcat (buf, ", pic");
2860
2861           if (e_flags & EF_MIPS_CPIC)
2862             strcat (buf, ", cpic");
2863
2864           if (e_flags & EF_MIPS_UCODE)
2865             strcat (buf, ", ugen_reserved");
2866
2867           if (e_flags & EF_MIPS_ABI2)
2868             strcat (buf, ", abi2");
2869
2870           if (e_flags & EF_MIPS_OPTIONS_FIRST)
2871             strcat (buf, ", odk first");
2872
2873           if (e_flags & EF_MIPS_32BITMODE)
2874             strcat (buf, ", 32bitmode");
2875
2876           if (e_flags & EF_MIPS_NAN2008)
2877             strcat (buf, ", nan2008");
2878
2879           if (e_flags & EF_MIPS_FP64)
2880             strcat (buf, ", fp64");
2881
2882           switch ((e_flags & EF_MIPS_MACH))
2883             {
2884             case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
2885             case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
2886             case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
2887             case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
2888             case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
2889             case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
2890             case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
2891             case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
2892             case E_MIPS_MACH_SB1:  strcat (buf, ", sb1");  break;
2893             case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
2894             case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break;
2895             case E_MIPS_MACH_LS2F: strcat (buf, ", loongson-2f"); break;
2896             case E_MIPS_MACH_LS3A: strcat (buf, ", loongson-3a"); break;
2897             case E_MIPS_MACH_OCTEON: strcat (buf, ", octeon"); break;
2898             case E_MIPS_MACH_OCTEON2: strcat (buf, ", octeon2"); break;
2899             case E_MIPS_MACH_OCTEON3: strcat (buf, ", octeon3"); break;
2900             case E_MIPS_MACH_XLR:  strcat (buf, ", xlr"); break;
2901             case 0:
2902             /* We simply ignore the field in this case to avoid confusion:
2903                MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
2904                extension.  */
2905               break;
2906             default: strcat (buf, _(", unknown CPU")); break;
2907             }
2908
2909           switch ((e_flags & EF_MIPS_ABI))
2910             {
2911             case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
2912             case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
2913             case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
2914             case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
2915             case 0:
2916             /* We simply ignore the field in this case to avoid confusion:
2917                MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
2918                This means it is likely to be an o32 file, but not for
2919                sure.  */
2920               break;
2921             default: strcat (buf, _(", unknown ABI")); break;
2922             }
2923
2924           if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
2925             strcat (buf, ", mdmx");
2926
2927           if (e_flags & EF_MIPS_ARCH_ASE_M16)
2928             strcat (buf, ", mips16");
2929
2930           if (e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
2931             strcat (buf, ", micromips");
2932
2933           switch ((e_flags & EF_MIPS_ARCH))
2934             {
2935             case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
2936             case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
2937             case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
2938             case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
2939             case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
2940             case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
2941             case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
2942             case E_MIPS_ARCH_32R6: strcat (buf, ", mips32r6"); break;
2943             case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
2944             case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
2945             case E_MIPS_ARCH_64R6: strcat (buf, ", mips64r6"); break;
2946             default: strcat (buf, _(", unknown ISA")); break;
2947             }
2948           break;
2949
2950         case EM_NDS32:
2951           decode_NDS32_machine_flags (e_flags, buf, sizeof buf);
2952           break;
2953
2954         case EM_SH:
2955           switch ((e_flags & EF_SH_MACH_MASK))
2956             {
2957             case EF_SH1: strcat (buf, ", sh1"); break;
2958             case EF_SH2: strcat (buf, ", sh2"); break;
2959             case EF_SH3: strcat (buf, ", sh3"); break;
2960             case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
2961             case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
2962             case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
2963             case EF_SH3E: strcat (buf, ", sh3e"); break;
2964             case EF_SH4: strcat (buf, ", sh4"); break;
2965             case EF_SH5: strcat (buf, ", sh5"); break;
2966             case EF_SH2E: strcat (buf, ", sh2e"); break;
2967             case EF_SH4A: strcat (buf, ", sh4a"); break;
2968             case EF_SH2A: strcat (buf, ", sh2a"); break;
2969             case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
2970             case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
2971             case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
2972             case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
2973             case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
2974             case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
2975             case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
2976             case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
2977             case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
2978             default: strcat (buf, _(", unknown ISA")); break;
2979             }
2980
2981           if (e_flags & EF_SH_PIC)
2982             strcat (buf, ", pic");
2983
2984           if (e_flags & EF_SH_FDPIC)
2985             strcat (buf, ", fdpic");
2986           break;
2987           
2988         case EM_OR1K:
2989           if (e_flags & EF_OR1K_NODELAY)
2990             strcat (buf, ", no delay");
2991           break;
2992
2993         case EM_SPARCV9:
2994           if (e_flags & EF_SPARC_32PLUS)
2995             strcat (buf, ", v8+");
2996
2997           if (e_flags & EF_SPARC_SUN_US1)
2998             strcat (buf, ", ultrasparcI");
2999
3000           if (e_flags & EF_SPARC_SUN_US3)
3001             strcat (buf, ", ultrasparcIII");
3002
3003           if (e_flags & EF_SPARC_HAL_R1)
3004             strcat (buf, ", halr1");
3005
3006           if (e_flags & EF_SPARC_LEDATA)
3007             strcat (buf, ", ledata");
3008
3009           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
3010             strcat (buf, ", tso");
3011
3012           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
3013             strcat (buf, ", pso");
3014
3015           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
3016             strcat (buf, ", rmo");
3017           break;
3018
3019         case EM_PARISC:
3020           switch (e_flags & EF_PARISC_ARCH)
3021             {
3022             case EFA_PARISC_1_0:
3023               strcpy (buf, ", PA-RISC 1.0");
3024               break;
3025             case EFA_PARISC_1_1:
3026               strcpy (buf, ", PA-RISC 1.1");
3027               break;
3028             case EFA_PARISC_2_0:
3029               strcpy (buf, ", PA-RISC 2.0");
3030               break;
3031             default:
3032               break;
3033             }
3034           if (e_flags & EF_PARISC_TRAPNIL)
3035             strcat (buf, ", trapnil");
3036           if (e_flags & EF_PARISC_EXT)
3037             strcat (buf, ", ext");
3038           if (e_flags & EF_PARISC_LSB)
3039             strcat (buf, ", lsb");
3040           if (e_flags & EF_PARISC_WIDE)
3041             strcat (buf, ", wide");
3042           if (e_flags & EF_PARISC_NO_KABP)
3043             strcat (buf, ", no kabp");
3044           if (e_flags & EF_PARISC_LAZYSWAP)
3045             strcat (buf, ", lazyswap");
3046           break;
3047
3048         case EM_PJ:
3049         case EM_PJ_OLD:
3050           if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
3051             strcat (buf, ", new calling convention");
3052
3053           if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
3054             strcat (buf, ", gnu calling convention");
3055           break;
3056
3057         case EM_IA_64:
3058           if ((e_flags & EF_IA_64_ABI64))
3059             strcat (buf, ", 64-bit");
3060           else
3061             strcat (buf, ", 32-bit");
3062           if ((e_flags & EF_IA_64_REDUCEDFP))
3063             strcat (buf, ", reduced fp model");
3064           if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
3065             strcat (buf, ", no function descriptors, constant gp");
3066           else if ((e_flags & EF_IA_64_CONS_GP))
3067             strcat (buf, ", constant gp");
3068           if ((e_flags & EF_IA_64_ABSOLUTE))
3069             strcat (buf, ", absolute");
3070           if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
3071             {
3072               if ((e_flags & EF_IA_64_VMS_LINKAGES))
3073                 strcat (buf, ", vms_linkages");
3074               switch ((e_flags & EF_IA_64_VMS_COMCOD))
3075                 {
3076                 case EF_IA_64_VMS_COMCOD_SUCCESS:
3077                   break;
3078                 case EF_IA_64_VMS_COMCOD_WARNING:
3079                   strcat (buf, ", warning");
3080                   break;
3081                 case EF_IA_64_VMS_COMCOD_ERROR:
3082                   strcat (buf, ", error");
3083                   break;
3084                 case EF_IA_64_VMS_COMCOD_ABORT:
3085                   strcat (buf, ", abort");
3086                   break;
3087                 default:
3088                   abort ();
3089                 }
3090             }
3091           break;
3092
3093         case EM_VAX:
3094           if ((e_flags & EF_VAX_NONPIC))
3095             strcat (buf, ", non-PIC");
3096           if ((e_flags & EF_VAX_DFLOAT))
3097             strcat (buf, ", D-Float");
3098           if ((e_flags & EF_VAX_GFLOAT))
3099             strcat (buf, ", G-Float");
3100           break;
3101
3102         case EM_RL78:
3103           if (e_flags & E_FLAG_RL78_G10)
3104             strcat (buf, ", G10");
3105           if (e_flags & E_FLAG_RL78_64BIT_DOUBLES)
3106             strcat (buf, ", 64-bit doubles");
3107           break;
3108
3109         case EM_RX:
3110           if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
3111             strcat (buf, ", 64-bit doubles");
3112           if (e_flags & E_FLAG_RX_DSP)
3113             strcat (buf, ", dsp");
3114           if (e_flags & E_FLAG_RX_PID)
3115             strcat (buf, ", pid");
3116           if (e_flags & E_FLAG_RX_ABI)
3117             strcat (buf, ", RX ABI");
3118           break;
3119
3120         case EM_S390:
3121           if (e_flags & EF_S390_HIGH_GPRS)
3122             strcat (buf, ", highgprs");
3123           break;
3124
3125         case EM_TI_C6000:
3126           if ((e_flags & EF_C6000_REL))
3127             strcat (buf, ", relocatable module");
3128           break;
3129
3130         case EM_MSP430:
3131           strcat (buf, _(": architecture variant: "));
3132           switch (e_flags & EF_MSP430_MACH)
3133             {
3134             case E_MSP430_MACH_MSP430x11: strcat (buf, "MSP430x11"); break;
3135             case E_MSP430_MACH_MSP430x11x1 : strcat (buf, "MSP430x11x1 "); break;
3136             case E_MSP430_MACH_MSP430x12: strcat (buf, "MSP430x12"); break;
3137             case E_MSP430_MACH_MSP430x13: strcat (buf, "MSP430x13"); break;
3138             case E_MSP430_MACH_MSP430x14: strcat (buf, "MSP430x14"); break;
3139             case E_MSP430_MACH_MSP430x15: strcat (buf, "MSP430x15"); break;
3140             case E_MSP430_MACH_MSP430x16: strcat (buf, "MSP430x16"); break;
3141             case E_MSP430_MACH_MSP430x31: strcat (buf, "MSP430x31"); break;
3142             case E_MSP430_MACH_MSP430x32: strcat (buf, "MSP430x32"); break;
3143             case E_MSP430_MACH_MSP430x33: strcat (buf, "MSP430x33"); break;
3144             case E_MSP430_MACH_MSP430x41: strcat (buf, "MSP430x41"); break;
3145             case E_MSP430_MACH_MSP430x42: strcat (buf, "MSP430x42"); break;
3146             case E_MSP430_MACH_MSP430x43: strcat (buf, "MSP430x43"); break;
3147             case E_MSP430_MACH_MSP430x44: strcat (buf, "MSP430x44"); break;
3148             case E_MSP430_MACH_MSP430X  : strcat (buf, "MSP430X"); break;
3149             default:
3150               strcat (buf, _(": unknown")); break;
3151             }
3152
3153           if (e_flags & ~ EF_MSP430_MACH)
3154             strcat (buf, _(": unknown extra flag bits also present"));
3155         }
3156     }
3157
3158   return buf;
3159 }
3160
3161 static const char *
3162 get_osabi_name (unsigned int osabi)
3163 {
3164   static char buff[32];
3165
3166   switch (osabi)
3167     {
3168     case ELFOSABI_NONE:         return "UNIX - System V";
3169     case ELFOSABI_HPUX:         return "UNIX - HP-UX";
3170     case ELFOSABI_NETBSD:       return "UNIX - NetBSD";
3171     case ELFOSABI_GNU:          return "UNIX - GNU";
3172     case ELFOSABI_SOLARIS:      return "UNIX - Solaris";
3173     case ELFOSABI_AIX:          return "UNIX - AIX";
3174     case ELFOSABI_IRIX:         return "UNIX - IRIX";
3175     case ELFOSABI_FREEBSD:      return "UNIX - FreeBSD";
3176     case ELFOSABI_TRU64:        return "UNIX - TRU64";
3177     case ELFOSABI_MODESTO:      return "Novell - Modesto";
3178     case ELFOSABI_OPENBSD:      return "UNIX - OpenBSD";
3179     case ELFOSABI_OPENVMS:      return "VMS - OpenVMS";
3180     case ELFOSABI_NSK:          return "HP - Non-Stop Kernel";
3181     case ELFOSABI_AROS:         return "AROS";
3182     case ELFOSABI_FENIXOS:      return "FenixOS";
3183     default:
3184       if (osabi >= 64)
3185         switch (elf_header.e_machine)
3186           {
3187           case EM_ARM:
3188             switch (osabi)
3189               {
3190               case ELFOSABI_ARM:        return "ARM";
3191               default:
3192                 break;
3193               }
3194             break;
3195
3196           case EM_MSP430:
3197           case EM_MSP430_OLD:
3198             switch (osabi)
3199               {
3200               case ELFOSABI_STANDALONE: return _("Standalone App");
3201               default:
3202                 break;
3203               }
3204             break;
3205
3206           case EM_TI_C6000:
3207             switch (osabi)
3208               {
3209               case ELFOSABI_C6000_ELFABI:       return _("Bare-metal C6000");
3210               case ELFOSABI_C6000_LINUX:        return "Linux C6000";
3211               default:
3212                 break;
3213               }
3214             break;
3215
3216           default:
3217             break;
3218           }
3219       snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
3220       return buff;
3221     }
3222 }
3223
3224 static const char *
3225 get_aarch64_segment_type (unsigned long type)
3226 {
3227   switch (type)
3228     {
3229     case PT_AARCH64_ARCHEXT:
3230       return "AARCH64_ARCHEXT";
3231     default:
3232       break;
3233     }
3234
3235   return NULL;
3236 }
3237
3238 static const char *
3239 get_arm_segment_type (unsigned long type)
3240 {
3241   switch (type)
3242     {
3243     case PT_ARM_EXIDX:
3244       return "EXIDX";
3245     default:
3246       break;
3247     }
3248
3249   return NULL;
3250 }
3251
3252 static const char *
3253 get_mips_segment_type (unsigned long type)
3254 {
3255   switch (type)
3256     {
3257     case PT_MIPS_REGINFO:
3258       return "REGINFO";
3259     case PT_MIPS_RTPROC:
3260       return "RTPROC";
3261     case PT_MIPS_OPTIONS:
3262       return "OPTIONS";
3263     case PT_MIPS_ABIFLAGS:
3264       return "ABIFLAGS";
3265     default:
3266       break;
3267     }
3268
3269   return NULL;
3270 }
3271
3272 static const char *
3273 get_parisc_segment_type (unsigned long type)
3274 {
3275   switch (type)
3276     {
3277     case PT_HP_TLS:             return "HP_TLS";
3278     case PT_HP_CORE_NONE:       return "HP_CORE_NONE";
3279     case PT_HP_CORE_VERSION:    return "HP_CORE_VERSION";
3280     case PT_HP_CORE_KERNEL:     return "HP_CORE_KERNEL";
3281     case PT_HP_CORE_COMM:       return "HP_CORE_COMM";
3282     case PT_HP_CORE_PROC:       return "HP_CORE_PROC";
3283     case PT_HP_CORE_LOADABLE:   return "HP_CORE_LOADABLE";
3284     case PT_HP_CORE_STACK:      return "HP_CORE_STACK";
3285     case PT_HP_CORE_SHM:        return "HP_CORE_SHM";
3286     case PT_HP_CORE_MMF:        return "HP_CORE_MMF";
3287     case PT_HP_PARALLEL:        return "HP_PARALLEL";
3288     case PT_HP_FASTBIND:        return "HP_FASTBIND";
3289     case PT_HP_OPT_ANNOT:       return "HP_OPT_ANNOT";
3290     case PT_HP_HSL_ANNOT:       return "HP_HSL_ANNOT";
3291     case PT_HP_STACK:           return "HP_STACK";
3292     case PT_HP_CORE_UTSNAME:    return "HP_CORE_UTSNAME";
3293     case PT_PARISC_ARCHEXT:     return "PARISC_ARCHEXT";
3294     case PT_PARISC_UNWIND:      return "PARISC_UNWIND";
3295     case PT_PARISC_WEAKORDER:   return "PARISC_WEAKORDER";
3296     default:
3297       break;
3298     }
3299
3300   return NULL;
3301 }
3302
3303 static const char *
3304 get_ia64_segment_type (unsigned long type)
3305 {
3306   switch (type)
3307     {
3308     case PT_IA_64_ARCHEXT:      return "IA_64_ARCHEXT";
3309     case PT_IA_64_UNWIND:       return "IA_64_UNWIND";
3310     case PT_HP_TLS:             return "HP_TLS";
3311     case PT_IA_64_HP_OPT_ANOT:  return "HP_OPT_ANNOT";
3312     case PT_IA_64_HP_HSL_ANOT:  return "HP_HSL_ANNOT";
3313     case PT_IA_64_HP_STACK:     return "HP_STACK";
3314     default:
3315       break;
3316     }
3317
3318   return NULL;
3319 }
3320
3321 static const char *
3322 get_tic6x_segment_type (unsigned long type)
3323 {
3324   switch (type)
3325     {
3326     case PT_C6000_PHATTR:       return "C6000_PHATTR";
3327     default:
3328       break;
3329     }
3330
3331   return NULL;
3332 }
3333
3334 static const char *
3335 get_segment_type (unsigned long p_type)
3336 {
3337   static char buff[32];
3338
3339   switch (p_type)
3340     {
3341     case PT_NULL:       return "NULL";
3342     case PT_LOAD:       return "LOAD";
3343     case PT_DYNAMIC:    return "DYNAMIC";
3344     case PT_INTERP:     return "INTERP";
3345     case PT_NOTE:       return "NOTE";
3346     case PT_SHLIB:      return "SHLIB";
3347     case PT_PHDR:       return "PHDR";
3348     case PT_TLS:        return "TLS";
3349
3350     case PT_GNU_EH_FRAME:
3351                         return "GNU_EH_FRAME";
3352     case PT_GNU_STACK:  return "GNU_STACK";
3353     case PT_GNU_RELRO:  return "GNU_RELRO";
3354
3355     default:
3356       if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
3357         {
3358           const char * result;
3359
3360           switch (elf_header.e_machine)
3361             {
3362             case EM_AARCH64:
3363               result = get_aarch64_segment_type (p_type);
3364               break;
3365             case EM_ARM:
3366               result = get_arm_segment_type (p_type);
3367               break;
3368             case EM_MIPS:
3369             case EM_MIPS_RS3_LE:
3370               result = get_mips_segment_type (p_type);
3371               break;
3372             case EM_PARISC:
3373               result = get_parisc_segment_type (p_type);
3374               break;
3375             case EM_IA_64:
3376               result = get_ia64_segment_type (p_type);
3377               break;
3378             case EM_TI_C6000:
3379               result = get_tic6x_segment_type (p_type);
3380               break;
3381             default:
3382               result = NULL;
3383               break;
3384             }
3385
3386           if (result != NULL)
3387             return result;
3388
3389           sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
3390         }
3391       else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
3392         {
3393           const char * result;
3394
3395           switch (elf_header.e_machine)
3396             {
3397             case EM_PARISC:
3398               result = get_parisc_segment_type (p_type);
3399               break;
3400             case EM_IA_64:
3401               result = get_ia64_segment_type (p_type);
3402               break;
3403             default:
3404               result = NULL;
3405               break;
3406             }
3407
3408           if (result != NULL)
3409             return result;
3410
3411           sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
3412         }
3413       else
3414         snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
3415
3416       return buff;
3417     }
3418 }
3419
3420 static const char *
3421 get_mips_section_type_name (unsigned int sh_type)
3422 {
3423   switch (sh_type)
3424     {
3425     case SHT_MIPS_LIBLIST:       return "MIPS_LIBLIST";
3426     case SHT_MIPS_MSYM:          return "MIPS_MSYM";
3427     case SHT_MIPS_CONFLICT:      return "MIPS_CONFLICT";
3428     case SHT_MIPS_GPTAB:         return "MIPS_GPTAB";
3429     case SHT_MIPS_UCODE:         return "MIPS_UCODE";
3430     case SHT_MIPS_DEBUG:         return "MIPS_DEBUG";
3431     case SHT_MIPS_REGINFO:       return "MIPS_REGINFO";
3432     case SHT_MIPS_PACKAGE:       return "MIPS_PACKAGE";
3433     case SHT_MIPS_PACKSYM:       return "MIPS_PACKSYM";
3434     case SHT_MIPS_RELD:          return "MIPS_RELD";
3435     case SHT_MIPS_IFACE:         return "MIPS_IFACE";
3436     case SHT_MIPS_CONTENT:       return "MIPS_CONTENT";
3437     case SHT_MIPS_OPTIONS:       return "MIPS_OPTIONS";
3438     case SHT_MIPS_SHDR:          return "MIPS_SHDR";
3439     case SHT_MIPS_FDESC:         return "MIPS_FDESC";
3440     case SHT_MIPS_EXTSYM:        return "MIPS_EXTSYM";
3441     case SHT_MIPS_DENSE:         return "MIPS_DENSE";
3442     case SHT_MIPS_PDESC:         return "MIPS_PDESC";
3443     case SHT_MIPS_LOCSYM:        return "MIPS_LOCSYM";
3444     case SHT_MIPS_AUXSYM:        return "MIPS_AUXSYM";
3445     case SHT_MIPS_OPTSYM:        return "MIPS_OPTSYM";
3446     case SHT_MIPS_LOCSTR:        return "MIPS_LOCSTR";
3447     case SHT_MIPS_LINE:          return "MIPS_LINE";
3448     case SHT_MIPS_RFDESC:        return "MIPS_RFDESC";
3449     case SHT_MIPS_DELTASYM:      return "MIPS_DELTASYM";
3450     case SHT_MIPS_DELTAINST:     return "MIPS_DELTAINST";
3451     case SHT_MIPS_DELTACLASS:    return "MIPS_DELTACLASS";
3452     case SHT_MIPS_DWARF:         return "MIPS_DWARF";
3453     case SHT_MIPS_DELTADECL:     return "MIPS_DELTADECL";
3454     case SHT_MIPS_SYMBOL_LIB:    return "MIPS_SYMBOL_LIB";
3455     case SHT_MIPS_EVENTS:        return "MIPS_EVENTS";
3456     case SHT_MIPS_TRANSLATE:     return "MIPS_TRANSLATE";
3457     case SHT_MIPS_PIXIE:         return "MIPS_PIXIE";
3458     case SHT_MIPS_XLATE:         return "MIPS_XLATE";
3459     case SHT_MIPS_XLATE_DEBUG:   return "MIPS_XLATE_DEBUG";
3460     case SHT_MIPS_WHIRL:         return "MIPS_WHIRL";
3461     case SHT_MIPS_EH_REGION:     return "MIPS_EH_REGION";
3462     case SHT_MIPS_XLATE_OLD:     return "MIPS_XLATE_OLD";
3463     case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
3464     case SHT_MIPS_ABIFLAGS:      return "MIPS_ABIFLAGS";
3465     default:
3466       break;
3467     }
3468   return NULL;
3469 }
3470
3471 static const char *
3472 get_parisc_section_type_name (unsigned int sh_type)
3473 {
3474   switch (sh_type)
3475     {
3476     case SHT_PARISC_EXT:        return "PARISC_EXT";
3477     case SHT_PARISC_UNWIND:     return "PARISC_UNWIND";
3478     case SHT_PARISC_DOC:        return "PARISC_DOC";
3479     case SHT_PARISC_ANNOT:      return "PARISC_ANNOT";
3480     case SHT_PARISC_SYMEXTN:    return "PARISC_SYMEXTN";
3481     case SHT_PARISC_STUBS:      return "PARISC_STUBS";
3482     case SHT_PARISC_DLKM:       return "PARISC_DLKM";
3483     default:
3484       break;
3485     }
3486   return NULL;
3487 }
3488
3489 static const char *
3490 get_ia64_section_type_name (unsigned int sh_type)
3491 {
3492   /* If the top 8 bits are 0x78 the next 8 are the os/abi ID.  */
3493   if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
3494     return get_osabi_name ((sh_type & 0x00FF0000) >> 16);
3495
3496   switch (sh_type)
3497     {
3498     case SHT_IA_64_EXT:                return "IA_64_EXT";
3499     case SHT_IA_64_UNWIND:             return "IA_64_UNWIND";
3500     case SHT_IA_64_PRIORITY_INIT:      return "IA_64_PRIORITY_INIT";
3501     case SHT_IA_64_VMS_TRACE:          return "VMS_TRACE";
3502     case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
3503     case SHT_IA_64_VMS_DEBUG:          return "VMS_DEBUG";
3504     case SHT_IA_64_VMS_DEBUG_STR:      return "VMS_DEBUG_STR";
3505     case SHT_IA_64_VMS_LINKAGES:       return "VMS_LINKAGES";
3506     case SHT_IA_64_VMS_SYMBOL_VECTOR:  return "VMS_SYMBOL_VECTOR";
3507     case SHT_IA_64_VMS_FIXUP:          return "VMS_FIXUP";
3508     default:
3509       break;
3510     }
3511   return NULL;
3512 }
3513
3514 static const char *
3515 get_x86_64_section_type_name (unsigned int sh_type)
3516 {
3517   switch (sh_type)
3518     {
3519     case SHT_X86_64_UNWIND:     return "X86_64_UNWIND";
3520     default:
3521       break;
3522     }
3523   return NULL;
3524 }
3525
3526 static const char *
3527 get_aarch64_section_type_name (unsigned int sh_type)
3528 {
3529   switch (sh_type)
3530     {
3531     case SHT_AARCH64_ATTRIBUTES:
3532       return "AARCH64_ATTRIBUTES";
3533     default:
3534       break;
3535     }
3536   return NULL;
3537 }
3538
3539 static const char *
3540 get_arm_section_type_name (unsigned int sh_type)
3541 {
3542   switch (sh_type)
3543     {
3544     case SHT_ARM_EXIDX:           return "ARM_EXIDX";
3545     case SHT_ARM_PREEMPTMAP:      return "ARM_PREEMPTMAP";
3546     case SHT_ARM_ATTRIBUTES:      return "ARM_ATTRIBUTES";
3547     case SHT_ARM_DEBUGOVERLAY:    return "ARM_DEBUGOVERLAY";
3548     case SHT_ARM_OVERLAYSECTION:  return "ARM_OVERLAYSECTION";
3549     default:
3550       break;
3551     }
3552   return NULL;
3553 }
3554
3555 static const char *
3556 get_tic6x_section_type_name (unsigned int sh_type)
3557 {
3558   switch (sh_type)
3559     {
3560     case SHT_C6000_UNWIND:
3561       return "C6000_UNWIND";
3562     case SHT_C6000_PREEMPTMAP:
3563       return "C6000_PREEMPTMAP";
3564     case SHT_C6000_ATTRIBUTES:
3565       return "C6000_ATTRIBUTES";
3566     case SHT_TI_ICODE:
3567       return "TI_ICODE";
3568     case SHT_TI_XREF:
3569       return "TI_XREF";
3570     case SHT_TI_HANDLER:
3571       return "TI_HANDLER";
3572     case SHT_TI_INITINFO:
3573       return "TI_INITINFO";
3574     case SHT_TI_PHATTRS:
3575       return "TI_PHATTRS";
3576     default:
3577       break;
3578     }
3579   return NULL;
3580 }
3581
3582 static const char *
3583 get_msp430x_section_type_name (unsigned int sh_type)
3584 {
3585   switch (sh_type)
3586     {
3587     case SHT_MSP430_SEC_FLAGS:   return "MSP430_SEC_FLAGS";
3588     case SHT_MSP430_SYM_ALIASES: return "MSP430_SYM_ALIASES";
3589     case SHT_MSP430_ATTRIBUTES:  return "MSP430_ATTRIBUTES";
3590     default: return NULL;
3591     }
3592 }
3593
3594 static const char *
3595 get_section_type_name (unsigned int sh_type)
3596 {
3597   static char buff[32];
3598
3599   switch (sh_type)
3600     {
3601     case SHT_NULL:              return "NULL";
3602     case SHT_PROGBITS:          return "PROGBITS";
3603     case SHT_SYMTAB:            return "SYMTAB";
3604     case SHT_STRTAB:            return "STRTAB";
3605     case SHT_RELA:              return "RELA";
3606     case SHT_HASH:              return "HASH";
3607     case SHT_DYNAMIC:           return "DYNAMIC";
3608     case SHT_NOTE:              return "NOTE";
3609     case SHT_NOBITS:            return "NOBITS";
3610     case SHT_REL:               return "REL";
3611     case SHT_SHLIB:             return "SHLIB";
3612     case SHT_DYNSYM:            return "DYNSYM";
3613     case SHT_INIT_ARRAY:        return "INIT_ARRAY";
3614     case SHT_FINI_ARRAY:        return "FINI_ARRAY";
3615     case SHT_PREINIT_ARRAY:     return "PREINIT_ARRAY";
3616     case SHT_GNU_HASH:          return "GNU_HASH";
3617     case SHT_GROUP:             return "GROUP";
3618     case SHT_SYMTAB_SHNDX:      return "SYMTAB SECTION INDICIES";
3619     case SHT_GNU_verdef:        return "VERDEF";
3620     case SHT_GNU_verneed:       return "VERNEED";
3621     case SHT_GNU_versym:        return "VERSYM";
3622     case 0x6ffffff0:            return "VERSYM";
3623     case 0x6ffffffc:            return "VERDEF";
3624     case 0x7ffffffd:            return "AUXILIARY";
3625     case 0x7fffffff:            return "FILTER";
3626     case SHT_GNU_LIBLIST:       return "GNU_LIBLIST";
3627
3628     default:
3629       if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
3630         {
3631           const char * result;
3632
3633           switch (elf_header.e_machine)
3634             {
3635             case EM_MIPS:
3636             case EM_MIPS_RS3_LE:
3637               result = get_mips_section_type_name (sh_type);
3638               break;
3639             case EM_PARISC:
3640               result = get_parisc_section_type_name (sh_type);
3641               break;
3642             case EM_IA_64:
3643               result = get_ia64_section_type_name (sh_type);
3644               break;
3645             case EM_X86_64:
3646             case EM_L1OM:
3647             case EM_K1OM:
3648               result = get_x86_64_section_type_name (sh_type);
3649               break;
3650             case EM_AARCH64:
3651               result = get_aarch64_section_type_name (sh_type);
3652               break;
3653             case EM_ARM:
3654               result = get_arm_section_type_name (sh_type);
3655               break;
3656             case EM_TI_C6000:
3657               result = get_tic6x_section_type_name (sh_type);
3658               break;
3659             case EM_MSP430:
3660               result = get_msp430x_section_type_name (sh_type);
3661               break;
3662             default:
3663               result = NULL;
3664               break;
3665             }
3666
3667           if (result != NULL)
3668             return result;
3669
3670           sprintf (buff, "LOPROC+%x", sh_type - SHT_LOPROC);
3671         }
3672       else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
3673         {
3674           const char * result;
3675
3676           switch (elf_header.e_machine)
3677             {
3678             case EM_IA_64:
3679               result = get_ia64_section_type_name (sh_type);
3680               break;
3681             default:
3682               result = NULL;
3683               break;
3684             }
3685
3686           if (result != NULL)
3687             return result;
3688
3689           sprintf (buff, "LOOS+%x", sh_type - SHT_LOOS);
3690         }
3691       else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
3692         sprintf (buff, "LOUSER+%x", sh_type - SHT_LOUSER);
3693       else
3694         /* This message is probably going to be displayed in a 15
3695            character wide field, so put the hex value first.  */
3696         snprintf (buff, sizeof (buff), _("%08x: <unknown>"), sh_type);
3697
3698       return buff;
3699     }
3700 }
3701
3702 #define OPTION_DEBUG_DUMP       512
3703 #define OPTION_DYN_SYMS         513
3704 #define OPTION_DWARF_DEPTH      514
3705 #define OPTION_DWARF_START      515
3706 #define OPTION_DWARF_CHECK      516
3707
3708 static struct option options[] =
3709 {
3710   {"all",              no_argument, 0, 'a'},
3711   {"file-header",      no_argument, 0, 'h'},
3712   {"program-headers",  no_argument, 0, 'l'},
3713   {"headers",          no_argument, 0, 'e'},
3714   {"histogram",        no_argument, 0, 'I'},
3715   {"segments",         no_argument, 0, 'l'},
3716   {"sections",         no_argument, 0, 'S'},
3717   {"section-headers",  no_argument, 0, 'S'},
3718   {"section-groups",   no_argument, 0, 'g'},
3719   {"section-details",  no_argument, 0, 't'},
3720   {"full-section-name",no_argument, 0, 'N'},
3721   {"symbols",          no_argument, 0, 's'},
3722   {"syms",             no_argument, 0, 's'},
3723   {"dyn-syms",         no_argument, 0, OPTION_DYN_SYMS},
3724   {"relocs",           no_argument, 0, 'r'},
3725   {"notes",            no_argument, 0, 'n'},
3726   {"dynamic",          no_argument, 0, 'd'},
3727   {"arch-specific",    no_argument, 0, 'A'},
3728   {"version-info",     no_argument, 0, 'V'},
3729   {"use-dynamic",      no_argument, 0, 'D'},
3730   {"unwind",           no_argument, 0, 'u'},
3731   {"archive-index",    no_argument, 0, 'c'},
3732   {"hex-dump",         required_argument, 0, 'x'},
3733   {"relocated-dump",   required_argument, 0, 'R'},
3734   {"string-dump",      required_argument, 0, 'p'},
3735 #ifdef SUPPORT_DISASSEMBLY
3736   {"instruction-dump", required_argument, 0, 'i'},
3737 #endif
3738   {"debug-dump",       optional_argument, 0, OPTION_DEBUG_DUMP},
3739
3740   {"dwarf-depth",      required_argument, 0, OPTION_DWARF_DEPTH},
3741   {"dwarf-start",      required_argument, 0, OPTION_DWARF_START},
3742   {"dwarf-check",      no_argument, 0, OPTION_DWARF_CHECK},
3743
3744   {"version",          no_argument, 0, 'v'},
3745   {"wide",             no_argument, 0, 'W'},
3746   {"help",             no_argument, 0, 'H'},
3747   {0,                  no_argument, 0, 0}
3748 };
3749
3750 static void
3751 usage (FILE * stream)
3752 {
3753   fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
3754   fprintf (stream, _(" Display information about the contents of ELF format files\n"));
3755   fprintf (stream, _(" Options are:\n\
3756   -a --all               Equivalent to: -h -l -S -s -r -d -V -A -I\n\
3757   -h --file-header       Display the ELF file header\n\
3758   -l --program-headers   Display the program headers\n\
3759      --segments          An alias for --program-headers\n\
3760   -S --section-headers   Display the sections' header\n\
3761      --sections          An alias for --section-headers\n\
3762   -g --section-groups    Display the section groups\n\
3763   -t --section-details   Display the section details\n\
3764   -e --headers           Equivalent to: -h -l -S\n\
3765   -s --syms              Display the symbol table\n\
3766      --symbols           An alias for --syms\n\
3767   --dyn-syms             Display the dynamic symbol table\n\
3768   -n --notes             Display the core notes (if present)\n\
3769   -r --relocs            Display the relocations (if present)\n\
3770   -u --unwind            Display the unwind info (if present)\n\
3771   -d --dynamic           Display the dynamic section (if present)\n\
3772   -V --version-info      Display the version sections (if present)\n\
3773   -A --arch-specific     Display architecture specific information (if any)\n\
3774   -c --archive-index     Display the symbol/file index in an archive\n\
3775   -D --use-dynamic       Use the dynamic section info when displaying symbols\n\
3776   -x --hex-dump=<number|name>\n\
3777                          Dump the contents of section <number|name> as bytes\n\
3778   -p --string-dump=<number|name>\n\
3779                          Dump the contents of section <number|name> as strings\n\
3780   -R --relocated-dump=<number|name>\n\
3781                          Dump the contents of section <number|name> as relocated bytes\n\
3782   -w[lLiaprmfFsoRt] or\n\
3783   --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
3784                =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
3785                =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
3786                =addr,=cu_index]\n\
3787                          Display the contents of DWARF2 debug sections\n"));
3788   fprintf (stream, _("\
3789   --dwarf-depth=N        Do not display DIEs at depth N or greater\n\
3790   --dwarf-start=N        Display DIEs starting with N, at the same depth\n\
3791                          or deeper\n"));
3792 #ifdef SUPPORT_DISASSEMBLY
3793   fprintf (stream, _("\
3794   -i --instruction-dump=<number|name>\n\
3795                          Disassemble the contents of section <number|name>\n"));
3796 #endif
3797   fprintf (stream, _("\
3798   -I --histogram         Display histogram of bucket list lengths\n\
3799   -W --wide              Allow output width to exceed 80 characters\n\
3800   @<file>                Read options from <file>\n\
3801   -H --help              Display this information\n\
3802   -v --version           Display the version number of readelf\n"));
3803
3804   if (REPORT_BUGS_TO[0] && stream == stdout)
3805     fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
3806
3807   exit (stream == stdout ? 0 : 1);
3808 }
3809
3810 /* Record the fact that the user wants the contents of section number
3811    SECTION to be displayed using the method(s) encoded as flags bits
3812    in TYPE.  Note, TYPE can be zero if we are creating the array for
3813    the first time.  */
3814
3815 static void
3816 request_dump_bynumber (unsigned int section, dump_type type)
3817 {
3818   if (section >= num_dump_sects)
3819     {
3820       dump_type * new_dump_sects;
3821
3822       new_dump_sects = (dump_type *) calloc (section + 1,
3823                                              sizeof (* dump_sects));
3824
3825       if (new_dump_sects == NULL)
3826         error (_("Out of memory allocating dump request table.\n"));
3827       else
3828         {
3829           /* Copy current flag settings.  */
3830           memcpy (new_dump_sects, dump_sects, num_dump_sects * sizeof (* dump_sects));
3831
3832           free (dump_sects);
3833
3834           dump_sects = new_dump_sects;
3835           num_dump_sects = section + 1;
3836         }
3837     }
3838
3839   if (dump_sects)
3840     dump_sects[section] |= type;
3841
3842   return;
3843 }
3844
3845 /* Request a dump by section name.  */
3846
3847 static void
3848 request_dump_byname (const char * section, dump_type type)
3849 {
3850   struct dump_list_entry * new_request;
3851
3852   new_request = (struct dump_list_entry *)
3853       malloc (sizeof (struct dump_list_entry));
3854   if (!new_request)
3855     error (_("Out of memory allocating dump request table.\n"));
3856
3857   new_request->name = strdup (section);
3858   if (!new_request->name)
3859     error (_("Out of memory allocating dump request table.\n"));
3860
3861   new_request->type = type;
3862
3863   new_request->next = dump_sects_byname;
3864   dump_sects_byname = new_request;
3865 }
3866
3867 static inline void
3868 request_dump (dump_type type)
3869 {
3870   int section;
3871   char * cp;
3872
3873   do_dump++;
3874   section = strtoul (optarg, & cp, 0);
3875
3876   if (! *cp && section >= 0)
3877     request_dump_bynumber (section, type);
3878   else
3879     request_dump_byname (optarg, type);
3880 }
3881
3882
3883 static void
3884 parse_args (int argc, char ** argv)
3885 {
3886   int c;
3887
3888   if (argc < 2)
3889     usage (stderr);
3890
3891   while ((c = getopt_long
3892           (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:", options, NULL)) != EOF)
3893     {
3894       switch (c)
3895         {
3896         case 0:
3897           /* Long options.  */
3898           break;
3899         case 'H':
3900           usage (stdout);
3901           break;
3902
3903         case 'a':
3904           do_syms++;
3905           do_reloc++;
3906           do_unwind++;
3907           do_dynamic++;
3908           do_header++;
3909           do_sections++;
3910           do_section_groups++;
3911           do_segments++;
3912           do_version++;
3913           do_histogram++;
3914           do_arch++;
3915           do_notes++;
3916           break;
3917         case 'g':
3918           do_section_groups++;
3919           break;
3920         case 't':
3921         case 'N':
3922           do_sections++;
3923           do_section_details++;
3924           break;
3925         case 'e':
3926           do_header++;
3927           do_sections++;
3928           do_segments++;
3929           break;
3930         case 'A':
3931           do_arch++;
3932           break;
3933         case 'D':
3934           do_using_dynamic++;
3935           break;
3936         case 'r':
3937           do_reloc++;
3938           break;
3939         case 'u':
3940           do_unwind++;
3941           break;
3942         case 'h':
3943           do_header++;
3944           break;
3945         case 'l':
3946           do_segments++;
3947           break;
3948         case 's':
3949           do_syms++;
3950           break;
3951         case 'S':
3952           do_sections++;
3953           break;
3954         case 'd':
3955           do_dynamic++;
3956           break;
3957         case 'I':
3958           do_histogram++;
3959           break;
3960         case 'n':
3961           do_notes++;
3962           break;
3963         case 'c':
3964           do_archive_index++;
3965           break;
3966         case 'x':
3967           request_dump (HEX_DUMP);
3968           break;
3969         case 'p':
3970           request_dump (STRING_DUMP);
3971           break;
3972         case 'R':
3973           request_dump (RELOC_DUMP);
3974           break;
3975         case 'w':
3976           do_dump++;
3977           if (optarg == 0)
3978             {
3979               do_debugging = 1;
3980               dwarf_select_sections_all ();
3981             }
3982           else
3983             {
3984               do_debugging = 0;
3985               dwarf_select_sections_by_letters (optarg);
3986             }
3987           break;
3988         case OPTION_DEBUG_DUMP:
3989           do_dump++;
3990           if (optarg == 0)
3991             do_debugging = 1;
3992           else
3993             {
3994               do_debugging = 0;
3995               dwarf_select_sections_by_names (optarg);
3996             }
3997           break;
3998         case OPTION_DWARF_DEPTH:
3999           {
4000             char *cp;
4001
4002             dwarf_cutoff_level = strtoul (optarg, & cp, 0);
4003           }
4004           break;
4005         case OPTION_DWARF_START:
4006           {
4007             char *cp;
4008
4009             dwarf_start_die = strtoul (optarg, & cp, 0);
4010           }
4011           break;
4012         case OPTION_DWARF_CHECK:
4013           dwarf_check = 1;
4014           break;
4015         case OPTION_DYN_SYMS:
4016           do_dyn_syms++;
4017           break;
4018 #ifdef SUPPORT_DISASSEMBLY
4019         case 'i':
4020           request_dump (DISASS_DUMP);
4021           break;
4022 #endif
4023         case 'v':
4024           print_version (program_name);
4025           break;
4026         case 'V':
4027           do_version++;
4028           break;
4029         case 'W':
4030           do_wide++;
4031           break;
4032         default:
4033           /* xgettext:c-format */
4034           error (_("Invalid option '-%c'\n"), c);
4035           /* Drop through.  */
4036         case '?':
4037           usage (stderr);
4038         }
4039     }
4040
4041   if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
4042       && !do_segments && !do_header && !do_dump && !do_version
4043       && !do_histogram && !do_debugging && !do_arch && !do_notes
4044       && !do_section_groups && !do_archive_index
4045       && !do_dyn_syms)
4046     usage (stderr);
4047   else if (argc < 3)
4048     {
4049       warn (_("Nothing to do.\n"));
4050       usage (stderr);
4051     }
4052 }
4053
4054 static const char *
4055 get_elf_class (unsigned int elf_class)
4056 {
4057   static char buff[32];
4058
4059   switch (elf_class)
4060     {
4061     case ELFCLASSNONE: return _("none");
4062     case ELFCLASS32:   return "ELF32";
4063     case ELFCLASS64:   return "ELF64";
4064     default:
4065       snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
4066       return buff;
4067     }
4068 }
4069
4070 static const char *
4071 get_data_encoding (unsigned int encoding)
4072 {
4073   static char buff[32];
4074
4075   switch (encoding)
4076     {
4077     case ELFDATANONE: return _("none");
4078     case ELFDATA2LSB: return _("2's complement, little endian");
4079     case ELFDATA2MSB: return _("2's complement, big endian");
4080     default:
4081       snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
4082       return buff;
4083     }
4084 }
4085
4086 /* Decode the data held in 'elf_header'.  */
4087
4088 static int
4089 process_file_header (void)
4090 {
4091   if (   elf_header.e_ident[EI_MAG0] != ELFMAG0
4092       || elf_header.e_ident[EI_MAG1] != ELFMAG1
4093       || elf_header.e_ident[EI_MAG2] != ELFMAG2
4094       || elf_header.e_ident[EI_MAG3] != ELFMAG3)
4095     {
4096       error
4097         (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
4098       return 0;
4099     }
4100
4101   init_dwarf_regnames (elf_header.e_machine);
4102
4103   if (do_header)
4104     {
4105       int i;
4106
4107       printf (_("ELF Header:\n"));
4108       printf (_("  Magic:   "));
4109       for (i = 0; i < EI_NIDENT; i++)
4110         printf ("%2.2x ", elf_header.e_ident[i]);
4111       printf ("\n");
4112       printf (_("  Class:                             %s\n"),
4113               get_elf_class (elf_header.e_ident[EI_CLASS]));
4114       printf (_("  Data:                              %s\n"),
4115               get_data_encoding (elf_header.e_ident[EI_DATA]));
4116       printf (_("  Version:                           %d %s\n"),
4117               elf_header.e_ident[EI_VERSION],
4118               (elf_header.e_ident[EI_VERSION] == EV_CURRENT
4119                ? "(current)"
4120                : (elf_header.e_ident[EI_VERSION] != EV_NONE
4121                   ? _("<unknown: %lx>")
4122                   : "")));
4123       printf (_("  OS/ABI:                            %s\n"),
4124               get_osabi_name (elf_header.e_ident[EI_OSABI]));
4125       printf (_("  ABI Version:                       %d\n"),
4126               elf_header.e_ident[EI_ABIVERSION]);
4127       printf (_("  Type:                              %s\n"),
4128               get_file_type (elf_header.e_type));
4129       printf (_("  Machine:                           %s\n"),
4130               get_machine_name (elf_header.e_machine));
4131       printf (_("  Version:                           0x%lx\n"),
4132               (unsigned long) elf_header.e_version);
4133
4134       printf (_("  Entry point address:               "));
4135       print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4136       printf (_("\n  Start of program headers:          "));
4137       print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4138       printf (_(" (bytes into file)\n  Start of section headers:          "));
4139       print_vma ((bfd_vma) elf_header.e_shoff, DEC);
4140       printf (_(" (bytes into file)\n"));
4141
4142       printf (_("  Flags:                             0x%lx%s\n"),
4143               (unsigned long) elf_header.e_flags,
4144               get_machine_flags (elf_header.e_flags, elf_header.e_machine));
4145       printf (_("  Size of this header:               %ld (bytes)\n"),
4146               (long) elf_header.e_ehsize);
4147       printf (_("  Size of program headers:           %ld (bytes)\n"),
4148               (long) elf_header.e_phentsize);
4149       printf (_("  Number of program headers:         %ld"),
4150               (long) elf_header.e_phnum);
4151       if (section_headers != NULL
4152           && elf_header.e_phnum == PN_XNUM
4153           && section_headers[0].sh_info != 0)
4154         printf (" (%ld)", (long) section_headers[0].sh_info);
4155       putc ('\n', stdout);
4156       printf (_("  Size of section headers:           %ld (bytes)\n"),
4157               (long) elf_header.e_shentsize);
4158       printf (_("  Number of section headers:         %ld"),
4159               (long) elf_header.e_shnum);
4160       if (section_headers != NULL && elf_header.e_shnum == SHN_UNDEF)
4161         printf (" (%ld)", (long) section_headers[0].sh_size);
4162       putc ('\n', stdout);
4163       printf (_("  Section header string table index: %ld"),
4164               (long) elf_header.e_shstrndx);
4165       if (section_headers != NULL
4166           && elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
4167         printf (" (%u)", section_headers[0].sh_link);
4168       else if (elf_header.e_shstrndx != SHN_UNDEF
4169                && elf_header.e_shstrndx >= elf_header.e_shnum)
4170         printf (_(" <corrupt: out of range>"));
4171       putc ('\n', stdout);
4172     }
4173
4174   if (section_headers != NULL)
4175     {
4176       if (elf_header.e_phnum == PN_XNUM
4177           && section_headers[0].sh_info != 0)
4178         elf_header.e_phnum = section_headers[0].sh_info;
4179       if (elf_header.e_shnum == SHN_UNDEF)
4180         elf_header.e_shnum = section_headers[0].sh_size;
4181       if (elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
4182         elf_header.e_shstrndx = section_headers[0].sh_link;
4183       else if (elf_header.e_shstrndx >= elf_header.e_shnum)
4184         elf_header.e_shstrndx = SHN_UNDEF;
4185       free (section_headers);
4186       section_headers = NULL;
4187     }
4188
4189   return 1;
4190 }
4191
4192 static bfd_boolean
4193 get_32bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
4194 {
4195   Elf32_External_Phdr * phdrs;
4196   Elf32_External_Phdr * external;
4197   Elf_Internal_Phdr *   internal;
4198   unsigned int i;
4199   unsigned int size = elf_header.e_phentsize;
4200   unsigned int num  = elf_header.e_phnum;
4201
4202   /* PR binutils/17531: Cope with unexpected section header sizes.  */
4203   if (size == 0 || num == 0)
4204     return FALSE;
4205   if (size < sizeof * phdrs)
4206     {
4207       error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4208       return FALSE;
4209     }
4210   if (size > sizeof * phdrs)
4211     warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4212
4213   phdrs = (Elf32_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
4214                                             size, num, _("program headers"));
4215   if (phdrs == NULL)
4216     return FALSE;
4217
4218   for (i = 0, internal = pheaders, external = phdrs;
4219        i < elf_header.e_phnum;
4220        i++, internal++, external++)
4221     {
4222       internal->p_type   = BYTE_GET (external->p_type);
4223       internal->p_offset = BYTE_GET (external->p_offset);
4224       internal->p_vaddr  = BYTE_GET (external->p_vaddr);
4225       internal->p_paddr  = BYTE_GET (external->p_paddr);
4226       internal->p_filesz = BYTE_GET (external->p_filesz);
4227       internal->p_memsz  = BYTE_GET (external->p_memsz);
4228       internal->p_flags  = BYTE_GET (external->p_flags);
4229       internal->p_align  = BYTE_GET (external->p_align);
4230     }
4231
4232   free (phdrs);
4233   return TRUE;
4234 }
4235
4236 static bfd_boolean
4237 get_64bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
4238 {
4239   Elf64_External_Phdr * phdrs;
4240   Elf64_External_Phdr * external;
4241   Elf_Internal_Phdr *   internal;
4242   unsigned int i;
4243   unsigned int size = elf_header.e_phentsize;
4244   unsigned int num  = elf_header.e_phnum;
4245
4246   /* PR binutils/17531: Cope with unexpected section header sizes.  */
4247   if (size == 0 || num == 0)
4248     return FALSE;
4249   if (size < sizeof * phdrs)
4250     {
4251       error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4252       return FALSE;
4253     }
4254   if (size > sizeof * phdrs)
4255     warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4256
4257   phdrs = (Elf64_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
4258                                             size, num, _("program headers"));
4259   if (!phdrs)
4260     return FALSE;
4261
4262   for (i = 0, internal = pheaders, external = phdrs;
4263        i < elf_header.e_phnum;
4264        i++, internal++, external++)
4265     {
4266       internal->p_type   = BYTE_GET (external->p_type);
4267       internal->p_flags  = BYTE_GET (external->p_flags);
4268       internal->p_offset = BYTE_GET (external->p_offset);
4269       internal->p_vaddr  = BYTE_GET (external->p_vaddr);
4270       internal->p_paddr  = BYTE_GET (external->p_paddr);
4271       internal->p_filesz = BYTE_GET (external->p_filesz);
4272       internal->p_memsz  = BYTE_GET (external->p_memsz);
4273       internal->p_align  = BYTE_GET (external->p_align);
4274     }
4275
4276   free (phdrs);
4277   return TRUE;
4278 }
4279
4280 /* Returns 1 if the program headers were read into `program_headers'.  */
4281
4282 static int
4283 get_program_headers (FILE * file)
4284 {
4285   Elf_Internal_Phdr * phdrs;
4286
4287   /* Check cache of prior read.  */
4288   if (program_headers != NULL)
4289     return 1;
4290
4291   phdrs = (Elf_Internal_Phdr *) cmalloc (elf_header.e_phnum,
4292                                          sizeof (Elf_Internal_Phdr));
4293
4294   if (phdrs == NULL)
4295     {
4296       error (_("Out of memory\n"));
4297       return 0;
4298     }
4299
4300   if (is_32bit_elf
4301       ? get_32bit_program_headers (file, phdrs)
4302       : get_64bit_program_headers (file, phdrs))
4303     {
4304       program_headers = phdrs;
4305       return 1;
4306     }
4307
4308   free (phdrs);
4309   return 0;
4310 }
4311
4312 /* Returns 1 if the program headers were loaded.  */
4313
4314 static int
4315 process_program_headers (FILE * file)
4316 {
4317   Elf_Internal_Phdr * segment;
4318   unsigned int i;
4319
4320   if (elf_header.e_phnum == 0)
4321     {
4322       /* PR binutils/12467.  */
4323       if (elf_header.e_phoff != 0)
4324         warn (_("possibly corrupt ELF header - it has a non-zero program"
4325                 " header offset, but no program headers"));
4326       else if (do_segments)
4327         printf (_("\nThere are no program headers in this file.\n"));
4328       return 0;
4329     }
4330
4331   if (do_segments && !do_header)
4332     {
4333       printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
4334       printf (_("Entry point "));
4335       print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4336       printf (_("\nThere are %d program headers, starting at offset "),
4337               elf_header.e_phnum);
4338       print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4339       printf ("\n");
4340     }
4341
4342   if (! get_program_headers (file))
4343       return 0;
4344
4345   if (do_segments)
4346     {
4347       if (elf_header.e_phnum > 1)
4348         printf (_("\nProgram Headers:\n"));
4349       else
4350         printf (_("\nProgram Headers:\n"));
4351
4352       if (is_32bit_elf)
4353         printf
4354           (_("  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align\n"));
4355       else if (do_wide)
4356         printf
4357           (_("  Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align\n"));
4358       else
4359         {
4360           printf
4361             (_("  Type           Offset             VirtAddr           PhysAddr\n"));
4362           printf
4363             (_("                 FileSiz            MemSiz              Flags  Align\n"));
4364         }
4365     }
4366
4367   dynamic_addr = 0;
4368   dynamic_size = 0;
4369
4370   for (i = 0, segment = program_headers;
4371        i < elf_header.e_phnum;
4372        i++, segment++)
4373     {
4374       if (do_segments)
4375         {
4376           printf ("  %-14.14s ", get_segment_type (segment->p_type));
4377
4378           if (is_32bit_elf)
4379             {
4380               printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4381               printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
4382               printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
4383               printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
4384               printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
4385               printf ("%c%c%c ",
4386                       (segment->p_flags & PF_R ? 'R' : ' '),
4387                       (segment->p_flags & PF_W ? 'W' : ' '),
4388                       (segment->p_flags & PF_X ? 'E' : ' '));
4389               printf ("%#lx", (unsigned long) segment->p_align);
4390             }
4391           else if (do_wide)
4392             {
4393               if ((unsigned long) segment->p_offset == segment->p_offset)
4394                 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4395               else
4396                 {
4397                   print_vma (segment->p_offset, FULL_HEX);
4398                   putchar (' ');
4399                 }
4400
4401               print_vma (segment->p_vaddr, FULL_HEX);
4402               putchar (' ');
4403               print_vma (segment->p_paddr, FULL_HEX);
4404               putchar (' ');
4405
4406               if ((unsigned long) segment->p_filesz == segment->p_filesz)
4407                 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
4408               else
4409                 {
4410                   print_vma (segment->p_filesz, FULL_HEX);
4411                   putchar (' ');
4412                 }
4413
4414               if ((unsigned long) segment->p_memsz == segment->p_memsz)
4415                 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
4416               else
4417                 {
4418                   print_vma (segment->p_memsz, FULL_HEX);
4419                 }
4420
4421               printf (" %c%c%c ",
4422                       (segment->p_flags & PF_R ? 'R' : ' '),
4423                       (segment->p_flags & PF_W ? 'W' : ' '),
4424                       (segment->p_flags & PF_X ? 'E' : ' '));
4425
4426               if ((unsigned long) segment->p_align == segment->p_align)
4427                 printf ("%#lx", (unsigned long) segment->p_align);
4428               else
4429                 {
4430                   print_vma (segment->p_align, PREFIX_HEX);
4431                 }
4432             }
4433           else
4434             {
4435               print_vma (segment->p_offset, FULL_HEX);
4436               putchar (' ');
4437               print_vma (segment->p_vaddr, FULL_HEX);
4438               putchar (' ');
4439               print_vma (segment->p_paddr, FULL_HEX);
4440               printf ("\n                 ");
4441               print_vma (segment->p_filesz, FULL_HEX);
4442               putchar (' ');
4443               print_vma (segment->p_memsz, FULL_HEX);
4444               printf ("  %c%c%c    ",
4445                       (segment->p_flags & PF_R ? 'R' : ' '),
4446                       (segment->p_flags & PF_W ? 'W' : ' '),
4447                       (segment->p_flags & PF_X ? 'E' : ' '));
4448               print_vma (segment->p_align, HEX);
4449             }
4450         }
4451
4452       if (do_segments)
4453         putc ('\n', stdout);
4454
4455       switch (segment->p_type)
4456         {
4457         case PT_DYNAMIC:
4458           if (dynamic_addr)
4459             error (_("more than one dynamic segment\n"));
4460
4461           /* By default, assume that the .dynamic section is the first
4462              section in the DYNAMIC segment.  */
4463           dynamic_addr = segment->p_offset;
4464           dynamic_size = segment->p_filesz;
4465           /* PR binutils/17512: Avoid corrupt dynamic section info in the segment.  */
4466           if (dynamic_addr + dynamic_size >= current_file_size)
4467             {
4468               error (_("the dynamic segment offset + size exceeds the size of the file\n"));
4469               dynamic_addr = dynamic_size = 0;
4470             }
4471
4472           /* Try to locate the .dynamic section. If there is
4473              a section header table, we can easily locate it.  */
4474           if (section_headers != NULL)
4475             {
4476               Elf_Internal_Shdr * sec;
4477
4478               sec = find_section (".dynamic");
4479               if (sec == NULL || sec->sh_size == 0)
4480                 {
4481                   /* A corresponding .dynamic section is expected, but on
4482                      IA-64/OpenVMS it is OK for it to be missing.  */
4483                   if (!is_ia64_vms ())
4484                     error (_("no .dynamic section in the dynamic segment\n"));
4485                   break;
4486                 }
4487
4488               if (sec->sh_type == SHT_NOBITS)
4489                 {
4490                   dynamic_size = 0;
4491                   break;
4492                 }
4493
4494               dynamic_addr = sec->sh_offset;
4495               dynamic_size = sec->sh_size;
4496
4497               if (dynamic_addr < segment->p_offset
4498                   || dynamic_addr > segment->p_offset + segment->p_filesz)
4499                 warn (_("the .dynamic section is not contained"
4500                         " within the dynamic segment\n"));
4501               else if (dynamic_addr > segment->p_offset)
4502                 warn (_("the .dynamic section is not the first section"
4503                         " in the dynamic segment.\n"));
4504             }
4505           break;
4506
4507         case PT_INTERP:
4508           if (fseek (file, archive_file_offset + (long) segment->p_offset,
4509                      SEEK_SET))
4510             error (_("Unable to find program interpreter name\n"));
4511           else
4512             {
4513               char fmt [32];
4514               int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX - 1);
4515
4516               if (ret >= (int) sizeof (fmt) || ret < 0)
4517                 error (_("Internal error: failed to create format string to display program interpreter\n"));
4518
4519               program_interpreter[0] = 0;
4520               if (fscanf (file, fmt, program_interpreter) <= 0)
4521                 error (_("Unable to read program interpreter name\n"));
4522
4523               if (do_segments)
4524                 printf (_("      [Requesting program interpreter: %s]\n"),
4525                     program_interpreter);
4526             }
4527           break;
4528         }
4529     }
4530
4531   if (do_segments && section_headers != NULL && string_table != NULL)
4532     {
4533       printf (_("\n Section to Segment mapping:\n"));
4534       printf (_("  Segment Sections...\n"));
4535
4536       for (i = 0; i < elf_header.e_phnum; i++)
4537         {
4538           unsigned int j;
4539           Elf_Internal_Shdr * section;
4540
4541           segment = program_headers + i;
4542           section = section_headers + 1;
4543
4544           printf ("   %2.2d     ", i);
4545
4546           for (j = 1; j < elf_header.e_shnum; j++, section++)
4547             {
4548               if (!ELF_TBSS_SPECIAL (section, segment)
4549                   && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
4550                 printf ("%s ", printable_section_name (section));
4551             }
4552
4553           putc ('\n',stdout);
4554         }
4555     }
4556
4557   return 1;
4558 }
4559
4560
4561 /* Find the file offset corresponding to VMA by using the program headers.  */
4562
4563 static long
4564 offset_from_vma (FILE * file, bfd_vma vma, bfd_size_type size)
4565 {
4566   Elf_Internal_Phdr * seg;
4567
4568   if (! get_program_headers (file))
4569     {
4570       warn (_("Cannot interpret virtual addresses without program headers.\n"));
4571       return (long) vma;
4572     }
4573
4574   for (seg = program_headers;
4575        seg < program_headers + elf_header.e_phnum;
4576        ++seg)
4577     {
4578       if (seg->p_type != PT_LOAD)
4579         continue;
4580
4581       if (vma >= (seg->p_vaddr & -seg->p_align)
4582           && vma + size <= seg->p_vaddr + seg->p_filesz)
4583         return vma - seg->p_vaddr + seg->p_offset;
4584     }
4585
4586   warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
4587         (unsigned long) vma);
4588   return (long) vma;
4589 }
4590
4591
4592 /* Allocate memory and load the sections headers into the global pointer
4593    SECTION_HEADERS.  If PROBE is true, this is just a probe and we do not
4594    generate any error messages if the load fails.  */
4595
4596 static bfd_boolean
4597 get_32bit_section_headers (FILE * file, bfd_boolean probe)
4598 {
4599   Elf32_External_Shdr * shdrs;
4600   Elf_Internal_Shdr *   internal;
4601   unsigned int i;
4602   unsigned int size = elf_header.e_shentsize;
4603   unsigned int num = probe ? 1 : elf_header.e_shnum;
4604
4605   /* PR binutils/17531: Cope with unexpected section header sizes.  */
4606   if (size == 0 || num == 0)
4607     return FALSE;
4608   if (size < sizeof * shdrs)
4609     {
4610       if (! probe)
4611         error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
4612       return FALSE;
4613     }
4614   if (!probe && size > sizeof * shdrs)
4615     warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
4616
4617   shdrs = (Elf32_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
4618                                             size, num,
4619                                             probe ? NULL : _("section headers"));
4620   if (shdrs == NULL)
4621     return FALSE;
4622
4623   if (section_headers != NULL)
4624     free (section_headers);
4625   section_headers = (Elf_Internal_Shdr *) cmalloc (num,
4626                                                    sizeof (Elf_Internal_Shdr));
4627   if (section_headers == NULL)
4628     {
4629       if (!probe)
4630         error (_("Out of memory\n"));
4631       return FALSE;
4632     }
4633
4634   for (i = 0, internal = section_headers;
4635        i < num;
4636        i++, internal++)
4637     {
4638       internal->sh_name      = BYTE_GET (shdrs[i].sh_name);
4639       internal->sh_type      = BYTE_GET (shdrs[i].sh_type);
4640       internal->sh_flags     = BYTE_GET (shdrs[i].sh_flags);
4641       internal->sh_addr      = BYTE_GET (shdrs[i].sh_addr);
4642       internal->sh_offset    = BYTE_GET (shdrs[i].sh_offset);
4643       internal->sh_size      = BYTE_GET (shdrs[i].sh_size);
4644       internal->sh_link      = BYTE_GET (shdrs[i].sh_link);
4645       internal->sh_info      = BYTE_GET (shdrs[i].sh_info);
4646       internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
4647       internal->sh_entsize   = BYTE_GET (shdrs[i].sh_entsize);
4648     }
4649
4650   free (shdrs);
4651   return TRUE;
4652 }
4653
4654 static bfd_boolean
4655 get_64bit_section_headers (FILE * file, bfd_boolean probe)
4656 {
4657   Elf64_External_Shdr * shdrs;
4658   Elf_Internal_Shdr *   internal;
4659   unsigned int i;
4660   unsigned int size = elf_header.e_shentsize;
4661   unsigned int num = probe ? 1 : elf_header.e_shnum;
4662
4663   /* PR binutils/17531: Cope with unexpected section header sizes.  */
4664   if (size == 0 || num == 0)
4665     return FALSE;
4666   if (size < sizeof * shdrs)
4667     {
4668       if (! probe)
4669         error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
4670       return FALSE;
4671     }
4672   if (! probe && size > sizeof * shdrs)
4673     warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
4674
4675   shdrs = (Elf64_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
4676                                             size, num,
4677                                             probe ? NULL : _("section headers"));
4678   if (shdrs == NULL)
4679     return FALSE;
4680
4681   if (section_headers != NULL)
4682     free (section_headers);
4683   section_headers = (Elf_Internal_Shdr *) cmalloc (num,
4684                                                    sizeof (Elf_Internal_Shdr));
4685   if (section_headers == NULL)
4686     {
4687       if (! probe)
4688         error (_("Out of memory\n"));
4689       return FALSE;
4690     }
4691
4692   for (i = 0, internal = section_headers;
4693        i < num;
4694        i++, internal++)
4695     {
4696       internal->sh_name      = BYTE_GET (shdrs[i].sh_name);
4697       internal->sh_type      = BYTE_GET (shdrs[i].sh_type);
4698       internal->sh_flags     = BYTE_GET (shdrs[i].sh_flags);
4699       internal->sh_addr      = BYTE_GET (shdrs[i].sh_addr);
4700       internal->sh_size      = BYTE_GET (shdrs[i].sh_size);
4701       internal->sh_entsize   = BYTE_GET (shdrs[i].sh_entsize);
4702       internal->sh_link      = BYTE_GET (shdrs[i].sh_link);
4703       internal->sh_info      = BYTE_GET (shdrs[i].sh_info);
4704       internal->sh_offset    = BYTE_GET (shdrs[i].sh_offset);
4705       internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
4706     }
4707
4708   free (shdrs);
4709   return TRUE;
4710 }
4711
4712 static Elf_Internal_Sym *
4713 get_32bit_elf_symbols (FILE * file,
4714                        Elf_Internal_Shdr * section,
4715                        unsigned long * num_syms_return)
4716 {
4717   unsigned long number = 0;
4718   Elf32_External_Sym * esyms = NULL;
4719   Elf_External_Sym_Shndx * shndx = NULL;
4720   Elf_Internal_Sym * isyms = NULL;
4721   Elf_Internal_Sym * psym;
4722   unsigned int j;
4723
4724   /* Run some sanity checks first.  */
4725   if (section->sh_entsize == 0)
4726     {
4727       error (_("sh_entsize is zero\n"));
4728       goto exit_point;
4729     }
4730
4731   if (section->sh_size > current_file_size)
4732     {
4733       error (_("Section %s has an invalid sh_size of 0x%lx\n"),
4734              printable_section_name (section), (unsigned long) section->sh_size);
4735       goto exit_point;
4736     }
4737
4738   number = section->sh_size / section->sh_entsize;
4739
4740   if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
4741     {
4742       error (_("Invalid sh_entsize\n"));
4743       goto exit_point;
4744     }
4745
4746   esyms = (Elf32_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
4747                                            section->sh_size, _("symbols"));
4748   if (esyms == NULL)
4749     goto exit_point;
4750
4751   shndx = NULL;
4752   if (symtab_shndx_hdr != NULL
4753       && (symtab_shndx_hdr->sh_link
4754           == (unsigned long) (section - section_headers)))
4755     {
4756       shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
4757                                                    symtab_shndx_hdr->sh_offset,
4758                                                    1, symtab_shndx_hdr->sh_size,
4759                                                    _("symbol table section indicies"));
4760       if (shndx == NULL)
4761         goto exit_point;
4762     }
4763
4764   isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
4765
4766   if (isyms == NULL)
4767     {
4768       error (_("Out of memory\n"));
4769       goto exit_point;
4770     }
4771
4772   for (j = 0, psym = isyms; j < number; j++, psym++)
4773     {
4774       psym->st_name  = BYTE_GET (esyms[j].st_name);
4775       psym->st_value = BYTE_GET (esyms[j].st_value);
4776       psym->st_size  = BYTE_GET (esyms[j].st_size);
4777       psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
4778       if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
4779         psym->st_shndx
4780           = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
4781       else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
4782         psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
4783       psym->st_info  = BYTE_GET (esyms[j].st_info);
4784       psym->st_other = BYTE_GET (esyms[j].st_other);
4785     }
4786
4787  exit_point:
4788   if (shndx != NULL)
4789     free (shndx);
4790   if (esyms != NULL)
4791     free (esyms);
4792
4793   if (num_syms_return != NULL)
4794     * num_syms_return = isyms == NULL ? 0 : number;
4795
4796   return isyms;
4797 }
4798
4799 static Elf_Internal_Sym *
4800 get_64bit_elf_symbols (FILE * file,
4801                        Elf_Internal_Shdr * section,
4802                        unsigned long * num_syms_return)
4803 {
4804   unsigned long number = 0;
4805   Elf64_External_Sym * esyms = NULL;
4806   Elf_External_Sym_Shndx * shndx = NULL;
4807   Elf_Internal_Sym * isyms = NULL;
4808   Elf_Internal_Sym * psym;
4809   unsigned int j;
4810
4811   /* Run some sanity checks first.  */
4812   if (section->sh_entsize == 0)
4813     {
4814       error (_("sh_entsize is zero\n"));
4815       goto exit_point;
4816     }
4817
4818   if (section->sh_size > current_file_size)
4819     {
4820       error (_("Section %s has an invalid sh_size of 0x%lx\n"),
4821              printable_section_name (section), (unsigned long) section->sh_size);
4822       goto exit_point;
4823     }
4824
4825   number = section->sh_size / section->sh_entsize;
4826
4827   if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
4828     {
4829       error (_("Invalid sh_entsize\n"));
4830       goto exit_point;
4831     }
4832
4833   esyms = (Elf64_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
4834                                            section->sh_size, _("symbols"));
4835   if (!esyms)
4836     goto exit_point;
4837
4838   if (symtab_shndx_hdr != NULL
4839       && (symtab_shndx_hdr->sh_link
4840           == (unsigned long) (section - section_headers)))
4841     {
4842       shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
4843                                                    symtab_shndx_hdr->sh_offset,
4844                                                    1, symtab_shndx_hdr->sh_size,
4845                                                    _("symbol table section indicies"));
4846       if (shndx == NULL)
4847         goto exit_point;
4848     }
4849
4850   isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
4851
4852   if (isyms == NULL)
4853     {
4854       error (_("Out of memory\n"));
4855       goto exit_point;
4856     }
4857
4858   for (j = 0, psym = isyms; j < number; j++, psym++)
4859     {
4860       psym->st_name  = BYTE_GET (esyms[j].st_name);
4861       psym->st_info  = BYTE_GET (esyms[j].st_info);
4862       psym->st_other = BYTE_GET (esyms[j].st_other);
4863       psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
4864
4865       if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
4866         psym->st_shndx
4867           = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
4868       else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
4869         psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
4870
4871       psym->st_value = BYTE_GET (esyms[j].st_value);
4872       psym->st_size  = BYTE_GET (esyms[j].st_size);
4873     }
4874
4875  exit_point:
4876   if (shndx != NULL)
4877     free (shndx);
4878   if (esyms != NULL)
4879     free (esyms);
4880
4881   if (num_syms_return != NULL)
4882     * num_syms_return = isyms == NULL ? 0 : number;
4883
4884   return isyms;
4885 }
4886
4887 static const char *
4888 get_elf_section_flags (bfd_vma sh_flags)
4889 {
4890   static char buff[1024];
4891   char * p = buff;
4892   int field_size = is_32bit_elf ? 8 : 16;
4893   int sindex;
4894   int size = sizeof (buff) - (field_size + 4 + 1);
4895   bfd_vma os_flags = 0;
4896   bfd_vma proc_flags = 0;
4897   bfd_vma unknown_flags = 0;
4898   static const struct
4899     {
4900       const char * str;
4901       int len;
4902     }
4903   flags [] =
4904     {
4905       /*  0 */ { STRING_COMMA_LEN ("WRITE") },
4906       /*  1 */ { STRING_COMMA_LEN ("ALLOC") },
4907       /*  2 */ { STRING_COMMA_LEN ("EXEC") },
4908       /*  3 */ { STRING_COMMA_LEN ("MERGE") },
4909       /*  4 */ { STRING_COMMA_LEN ("STRINGS") },
4910       /*  5 */ { STRING_COMMA_LEN ("INFO LINK") },
4911       /*  6 */ { STRING_COMMA_LEN ("LINK ORDER") },
4912       /*  7 */ { STRING_COMMA_LEN ("OS NONCONF") },
4913       /*  8 */ { STRING_COMMA_LEN ("GROUP") },
4914       /*  9 */ { STRING_COMMA_LEN ("TLS") },
4915       /* IA-64 specific.  */
4916       /* 10 */ { STRING_COMMA_LEN ("SHORT") },
4917       /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
4918       /* IA-64 OpenVMS specific.  */
4919       /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
4920       /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
4921       /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
4922       /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
4923       /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
4924       /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
4925       /* Generic.  */
4926       /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
4927       /* SPARC specific.  */
4928       /* 19 */ { STRING_COMMA_LEN ("ORDERED") }
4929     };
4930
4931   if (do_section_details)
4932     {
4933       sprintf (buff, "[%*.*lx]: ",
4934                field_size, field_size, (unsigned long) sh_flags);
4935       p += field_size + 4;
4936     }
4937
4938   while (sh_flags)
4939     {
4940       bfd_vma flag;
4941
4942       flag = sh_flags & - sh_flags;
4943       sh_flags &= ~ flag;
4944
4945       if (do_section_details)
4946         {
4947           switch (flag)
4948             {
4949             case SHF_WRITE:             sindex = 0; break;
4950             case SHF_ALLOC:             sindex = 1; break;
4951             case SHF_EXECINSTR:         sindex = 2; break;
4952             case SHF_MERGE:             sindex = 3; break;
4953             case SHF_STRINGS:           sindex = 4; break;
4954             case SHF_INFO_LINK:         sindex = 5; break;
4955             case SHF_LINK_ORDER:        sindex = 6; break;
4956             case SHF_OS_NONCONFORMING:  sindex = 7; break;
4957             case SHF_GROUP:             sindex = 8; break;
4958             case SHF_TLS:               sindex = 9; break;
4959             case SHF_EXCLUDE:           sindex = 18; break;
4960
4961             default:
4962               sindex = -1;
4963               switch (elf_header.e_machine)
4964                 {
4965                 case EM_IA_64:
4966                   if (flag == SHF_IA_64_SHORT)
4967                     sindex = 10;
4968                   else if (flag == SHF_IA_64_NORECOV)
4969                     sindex = 11;
4970 #ifdef BFD64
4971                   else if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
4972                     switch (flag)
4973                       {
4974                       case SHF_IA_64_VMS_GLOBAL:      sindex = 12; break;
4975                       case SHF_IA_64_VMS_OVERLAID:    sindex = 13; break;
4976                       case SHF_IA_64_VMS_SHARED:      sindex = 14; break;
4977                       case SHF_IA_64_VMS_VECTOR:      sindex = 15; break;
4978                       case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
4979                       case SHF_IA_64_VMS_PROTECTED:   sindex = 17; break;
4980                       default:                        break;
4981                       }
4982 #endif
4983                   break;
4984
4985                 case EM_386:
4986                 case EM_486:
4987                 case EM_X86_64:
4988                 case EM_L1OM:
4989                 case EM_K1OM:
4990                 case EM_OLD_SPARCV9:
4991                 case EM_SPARC32PLUS:
4992                 case EM_SPARCV9:
4993                 case EM_SPARC:
4994                   if (flag == SHF_ORDERED)
4995                     sindex = 19;
4996                   break;
4997                 default:
4998                   break;
4999                 }
5000             }
5001
5002           if (sindex != -1)
5003             {
5004               if (p != buff + field_size + 4)
5005                 {
5006                   if (size < (10 + 2))
5007                     abort ();
5008                   size -= 2;
5009                   *p++ = ',';
5010                   *p++ = ' ';
5011                 }
5012
5013               size -= flags [sindex].len;
5014               p = stpcpy (p, flags [sindex].str);
5015             }
5016           else if (flag & SHF_MASKOS)
5017             os_flags |= flag;
5018           else if (flag & SHF_MASKPROC)
5019             proc_flags |= flag;
5020           else
5021             unknown_flags |= flag;
5022         }
5023       else
5024         {
5025           switch (flag)
5026             {
5027             case SHF_WRITE:             *p = 'W'; break;
5028             case SHF_ALLOC:             *p = 'A'; break;
5029             case SHF_EXECINSTR:         *p = 'X'; break;
5030             case SHF_MERGE:             *p = 'M'; break;
5031             case SHF_STRINGS:           *p = 'S'; break;
5032             case SHF_INFO_LINK:         *p = 'I'; break;
5033             case SHF_LINK_ORDER:        *p = 'L'; break;
5034             case SHF_OS_NONCONFORMING:  *p = 'O'; break;
5035             case SHF_GROUP:             *p = 'G'; break;
5036             case SHF_TLS:               *p = 'T'; break;
5037             case SHF_EXCLUDE:           *p = 'E'; break;
5038
5039             default:
5040               if ((elf_header.e_machine == EM_X86_64
5041                    || elf_header.e_machine == EM_L1OM
5042                    || elf_header.e_machine == EM_K1OM)
5043                   && flag == SHF_X86_64_LARGE)
5044                 *p = 'l';
5045               else if (flag & SHF_MASKOS)
5046                 {
5047                   *p = 'o';
5048                   sh_flags &= ~ SHF_MASKOS;
5049                 }
5050               else if (flag & SHF_MASKPROC)
5051                 {
5052                   *p = 'p';
5053                   sh_flags &= ~ SHF_MASKPROC;
5054                 }
5055               else
5056                 *p = 'x';
5057               break;
5058             }
5059           p++;
5060         }
5061     }
5062
5063   if (do_section_details)
5064     {
5065       if (os_flags)
5066         {
5067           size -= 5 + field_size;
5068           if (p != buff + field_size + 4)
5069             {
5070               if (size < (2 + 1))
5071                 abort ();
5072               size -= 2;
5073               *p++ = ',';
5074               *p++ = ' ';
5075             }
5076           sprintf (p, "OS (%*.*lx)", field_size, field_size,
5077                    (unsigned long) os_flags);
5078           p += 5 + field_size;
5079         }
5080       if (proc_flags)
5081         {
5082           size -= 7 + field_size;
5083           if (p != buff + field_size + 4)
5084             {
5085               if (size < (2 + 1))
5086                 abort ();
5087               size -= 2;
5088               *p++ = ',';
5089               *p++ = ' ';
5090             }
5091           sprintf (p, "PROC (%*.*lx)", field_size, field_size,
5092                    (unsigned long) proc_flags);
5093           p += 7 + field_size;
5094         }
5095       if (unknown_flags)
5096         {
5097           size -= 10 + field_size;
5098           if (p != buff + field_size + 4)
5099             {
5100               if (size < (2 + 1))
5101                 abort ();
5102               size -= 2;
5103               *p++ = ',';
5104               *p++ = ' ';
5105             }
5106           sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
5107                    (unsigned long) unknown_flags);
5108           p += 10 + field_size;
5109         }
5110     }
5111
5112   *p = '\0';
5113   return buff;
5114 }
5115
5116 static int
5117 process_section_headers (FILE * file)
5118 {
5119   Elf_Internal_Shdr * section;
5120   unsigned int i;
5121
5122   section_headers = NULL;
5123
5124   if (elf_header.e_shnum == 0)
5125     {
5126       /* PR binutils/12467.  */
5127       if (elf_header.e_shoff != 0)
5128         warn (_("possibly corrupt ELF file header - it has a non-zero"
5129                 " section header offset, but no section headers\n"));
5130       else if (do_sections)
5131         printf (_("\nThere are no sections in this file.\n"));
5132
5133       return 1;
5134     }
5135
5136   if (do_sections && !do_header)
5137     printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
5138             elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
5139
5140   if (is_32bit_elf)
5141     {
5142       if (! get_32bit_section_headers (file, FALSE))
5143         return 0;
5144     }
5145   else if (! get_64bit_section_headers (file, FALSE))
5146     return 0;
5147
5148   /* Read in the string table, so that we have names to display.  */
5149   if (elf_header.e_shstrndx != SHN_UNDEF
5150        && elf_header.e_shstrndx < elf_header.e_shnum)
5151     {
5152       section = section_headers + elf_header.e_shstrndx;
5153
5154       if (section->sh_size != 0)
5155         {
5156           string_table = (char *) get_data (NULL, file, section->sh_offset,
5157                                             1, section->sh_size,
5158                                             _("string table"));
5159
5160           string_table_length = string_table != NULL ? section->sh_size : 0;
5161         }
5162     }
5163
5164   /* Scan the sections for the dynamic symbol table
5165      and dynamic string table and debug sections.  */
5166   dynamic_symbols = NULL;
5167   dynamic_strings = NULL;
5168   dynamic_syminfo = NULL;
5169   symtab_shndx_hdr = NULL;
5170
5171   eh_addr_size = is_32bit_elf ? 4 : 8;
5172   switch (elf_header.e_machine)
5173     {
5174     case EM_MIPS:
5175     case EM_MIPS_RS3_LE:
5176       /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
5177          FDE addresses.  However, the ABI also has a semi-official ILP32
5178          variant for which the normal FDE address size rules apply.
5179
5180          GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
5181          section, where XX is the size of longs in bits.  Unfortunately,
5182          earlier compilers provided no way of distinguishing ILP32 objects
5183          from LP64 objects, so if there's any doubt, we should assume that
5184          the official LP64 form is being used.  */
5185       if ((elf_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
5186           && find_section (".gcc_compiled_long32") == NULL)
5187         eh_addr_size = 8;
5188       break;
5189
5190     case EM_H8_300:
5191     case EM_H8_300H:
5192       switch (elf_header.e_flags & EF_H8_MACH)
5193         {
5194         case E_H8_MACH_H8300:
5195         case E_H8_MACH_H8300HN:
5196         case E_H8_MACH_H8300SN:
5197         case E_H8_MACH_H8300SXN:
5198           eh_addr_size = 2;
5199           break;
5200         case E_H8_MACH_H8300H:
5201         case E_H8_MACH_H8300S:
5202         case E_H8_MACH_H8300SX:
5203           eh_addr_size = 4;
5204           break;
5205         }
5206       break;
5207
5208     case EM_M32C_OLD:
5209     case EM_M32C:
5210       switch (elf_header.e_flags & EF_M32C_CPU_MASK)
5211         {
5212         case EF_M32C_CPU_M16C:
5213           eh_addr_size = 2;
5214           break;
5215         }
5216       break;
5217     }
5218
5219 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64)                \
5220   do                                                                    \
5221     {                                                                   \
5222       bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64;  \
5223       if (section->sh_entsize != expected_entsize)                      \
5224         {                                                               \
5225           char buf[40];                                                 \
5226           sprintf_vma (buf, section->sh_entsize);                       \
5227           /* Note: coded this way so that there is a single string for  \
5228              translation.  */ \
5229           error (_("Section %d has invalid sh_entsize of %s\n"), i, buf); \
5230           error (_("(Using the expected size of %u for the rest of this dump)\n"), \
5231                    (unsigned) expected_entsize);                        \
5232           section->sh_entsize = expected_entsize;                       \
5233         }                                                               \
5234     }                                                                   \
5235   while (0)
5236
5237 #define CHECK_ENTSIZE(section, i, type)                                 \
5238   CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type),         \
5239                         sizeof (Elf64_External_##type))
5240
5241   for (i = 0, section = section_headers;
5242        i < elf_header.e_shnum;
5243        i++, section++)
5244     {
5245       char * name = SECTION_NAME (section);
5246
5247       if (section->sh_type == SHT_DYNSYM)
5248         {
5249           if (dynamic_symbols != NULL)
5250             {
5251               error (_("File contains multiple dynamic symbol tables\n"));
5252               continue;
5253             }
5254
5255           CHECK_ENTSIZE (section, i, Sym);
5256           dynamic_symbols = GET_ELF_SYMBOLS (file, section, & num_dynamic_syms);
5257         }
5258       else if (section->sh_type == SHT_STRTAB
5259                && streq (name, ".dynstr"))
5260         {
5261           if (dynamic_strings != NULL)
5262             {
5263               error (_("File contains multiple dynamic string tables\n"));
5264               continue;
5265             }
5266
5267           dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
5268                                                1, section->sh_size,
5269                                                _("dynamic strings"));
5270           dynamic_strings_length = dynamic_strings == NULL ? 0 : section->sh_size;
5271         }
5272       else if (section->sh_type == SHT_SYMTAB_SHNDX)
5273         {
5274           if (symtab_shndx_hdr != NULL)
5275             {
5276               error (_("File contains multiple symtab shndx tables\n"));
5277               continue;
5278             }
5279           symtab_shndx_hdr = section;
5280         }
5281       else if (section->sh_type == SHT_SYMTAB)
5282         CHECK_ENTSIZE (section, i, Sym);
5283       else if (section->sh_type == SHT_GROUP)
5284         CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
5285       else if (section->sh_type == SHT_REL)
5286         CHECK_ENTSIZE (section, i, Rel);
5287       else if (section->sh_type == SHT_RELA)
5288         CHECK_ENTSIZE (section, i, Rela);
5289       else if ((do_debugging || do_debug_info || do_debug_abbrevs
5290                 || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
5291                 || do_debug_aranges || do_debug_frames || do_debug_macinfo
5292                 || do_debug_str || do_debug_loc || do_debug_ranges
5293                 || do_debug_addr || do_debug_cu_index)
5294                && (const_strneq (name, ".debug_")
5295                    || const_strneq (name, ".zdebug_")))
5296         {
5297           if (name[1] == 'z')
5298             name += sizeof (".zdebug_") - 1;
5299           else
5300             name += sizeof (".debug_") - 1;
5301
5302           if (do_debugging
5303               || (do_debug_info     && const_strneq (name, "info"))
5304               || (do_debug_info     && const_strneq (name, "types"))
5305               || (do_debug_abbrevs  && const_strneq (name, "abbrev"))
5306               || (do_debug_lines    && strcmp (name, "line") == 0)
5307               || (do_debug_lines    && const_strneq (name, "line."))
5308               || (do_debug_pubnames && const_strneq (name, "pubnames"))
5309               || (do_debug_pubtypes && const_strneq (name, "pubtypes"))
5310               || (do_debug_pubnames && const_strneq (name, "gnu_pubnames"))
5311               || (do_debug_pubtypes && const_strneq (name, "gnu_pubtypes"))
5312               || (do_debug_aranges  && const_strneq (name, "aranges"))
5313               || (do_debug_ranges   && const_strneq (name, "ranges"))
5314               || (do_debug_frames   && const_strneq (name, "frame"))
5315               || (do_debug_macinfo  && const_strneq (name, "macinfo"))
5316               || (do_debug_macinfo  && const_strneq (name, "macro"))
5317               || (do_debug_str      && const_strneq (name, "str"))
5318               || (do_debug_loc      && const_strneq (name, "loc"))
5319               || (do_debug_addr     && const_strneq (name, "addr"))
5320               || (do_debug_cu_index && const_strneq (name, "cu_index"))
5321               || (do_debug_cu_index && const_strneq (name, "tu_index"))
5322               )
5323             request_dump_bynumber (i, DEBUG_DUMP);
5324         }
5325       /* Linkonce section to be combined with .debug_info at link time.  */
5326       else if ((do_debugging || do_debug_info)
5327                && const_strneq (name, ".gnu.linkonce.wi."))
5328         request_dump_bynumber (i, DEBUG_DUMP);
5329       else if (do_debug_frames && streq (name, ".eh_frame"))
5330         request_dump_bynumber (i, DEBUG_DUMP);
5331       else if (do_gdb_index && streq (name, ".gdb_index"))
5332         request_dump_bynumber (i, DEBUG_DUMP);
5333       /* Trace sections for Itanium VMS.  */
5334       else if ((do_debugging || do_trace_info || do_trace_abbrevs
5335                 || do_trace_aranges)
5336                && const_strneq (name, ".trace_"))
5337         {
5338           name += sizeof (".trace_") - 1;
5339
5340           if (do_debugging
5341               || (do_trace_info     && streq (name, "info"))
5342               || (do_trace_abbrevs  && streq (name, "abbrev"))
5343               || (do_trace_aranges  && streq (name, "aranges"))
5344               )
5345             request_dump_bynumber (i, DEBUG_DUMP);
5346         }
5347     }
5348
5349   if (! do_sections)
5350     return 1;
5351
5352   if (elf_header.e_shnum > 1)
5353     printf (_("\nSection Headers:\n"));
5354   else
5355     printf (_("\nSection Header:\n"));
5356
5357   if (is_32bit_elf)
5358     {
5359       if (do_section_details)
5360         {
5361           printf (_("  [Nr] Name\n"));
5362           printf (_("       Type            Addr     Off    Size   ES   Lk Inf Al\n"));
5363         }
5364       else
5365         printf
5366           (_("  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al\n"));
5367     }
5368   else if (do_wide)
5369     {
5370       if (do_section_details)
5371         {
5372           printf (_("  [Nr] Name\n"));
5373           printf (_("       Type            Address          Off    Size   ES   Lk Inf Al\n"));
5374         }
5375       else
5376         printf
5377           (_("  [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al\n"));
5378     }
5379   else
5380     {
5381       if (do_section_details)
5382         {
5383           printf (_("  [Nr] Name\n"));
5384           printf (_("       Type              Address          Offset            Link\n"));
5385           printf (_("       Size              EntSize          Info              Align\n"));
5386         }
5387       else
5388         {
5389           printf (_("  [Nr] Name              Type             Address           Offset\n"));
5390           printf (_("       Size              EntSize          Flags  Link  Info  Align\n"));
5391         }
5392     }
5393
5394   if (do_section_details)
5395     printf (_("       Flags\n"));
5396
5397   for (i = 0, section = section_headers;
5398        i < elf_header.e_shnum;
5399        i++, section++)
5400     {
5401       printf ("  [%2u] ", i);
5402       if (do_section_details)
5403         printf ("%s\n      ", printable_section_name (section));
5404       else
5405         print_symbol (-17, SECTION_NAME (section));
5406
5407       printf (do_wide ? " %-15s " : " %-15.15s ",
5408               get_section_type_name (section->sh_type));
5409
5410       if (is_32bit_elf)
5411         {
5412           const char * link_too_big = NULL;
5413
5414           print_vma (section->sh_addr, LONG_HEX);
5415
5416           printf ( " %6.6lx %6.6lx %2.2lx",
5417                    (unsigned long) section->sh_offset,
5418                    (unsigned long) section->sh_size,
5419                    (unsigned long) section->sh_entsize);
5420
5421           if (do_section_details)
5422             fputs ("  ", stdout);
5423           else
5424             printf (" %3s ", get_elf_section_flags (section->sh_flags));
5425
5426           if (section->sh_link >= elf_header.e_shnum)
5427             {
5428               link_too_big = "";
5429               /* The sh_link value is out of range.  Normally this indicates
5430                  an error but it can have special values in Solaris binaries.  */
5431               switch (elf_header.e_machine)
5432                 {
5433                 case EM_386:
5434                 case EM_486:
5435                 case EM_X86_64:
5436                 case EM_L1OM:
5437                 case EM_K1OM:
5438                 case EM_OLD_SPARCV9:
5439                 case EM_SPARC32PLUS:
5440                 case EM_SPARCV9:
5441                 case EM_SPARC:
5442                   if (section->sh_link == (SHN_BEFORE & 0xffff))
5443                     link_too_big = "BEFORE";
5444                   else if (section->sh_link == (SHN_AFTER & 0xffff))
5445                     link_too_big = "AFTER";
5446                   break;
5447                 default:
5448                   break;
5449                 }
5450             }
5451
5452           if (do_section_details)
5453             {
5454               if (link_too_big != NULL && * link_too_big)
5455                 printf ("<%s> ", link_too_big);
5456               else
5457                 printf ("%2u ", section->sh_link);
5458               printf ("%3u %2lu\n", section->sh_info,
5459                       (unsigned long) section->sh_addralign);
5460             }
5461           else
5462             printf ("%2u %3u %2lu\n",
5463                     section->sh_link,
5464                     section->sh_info,
5465                     (unsigned long) section->sh_addralign);
5466
5467           if (link_too_big && ! * link_too_big)
5468             warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
5469                   i, section->sh_link);
5470         }
5471       else if (do_wide)
5472         {
5473           print_vma (section->sh_addr, LONG_HEX);
5474
5475           if ((long) section->sh_offset == section->sh_offset)
5476             printf (" %6.6lx", (unsigned long) section->sh_offset);
5477           else
5478             {
5479               putchar (' ');
5480               print_vma (section->sh_offset, LONG_HEX);
5481             }
5482
5483           if ((unsigned long) section->sh_size == section->sh_size)
5484             printf (" %6.6lx", (unsigned long) section->sh_size);
5485           else
5486             {
5487               putchar (' ');
5488               print_vma (section->sh_size, LONG_HEX);
5489             }
5490
5491           if ((unsigned long) section->sh_entsize == section->sh_entsize)
5492             printf (" %2.2lx", (unsigned long) section->sh_entsize);
5493           else
5494             {
5495               putchar (' ');
5496               print_vma (section->sh_entsize, LONG_HEX);
5497             }
5498
5499           if (do_section_details)
5500             fputs ("  ", stdout);
5501           else
5502             printf (" %3s ", get_elf_section_flags (section->sh_flags));
5503
5504           printf ("%2u %3u ", section->sh_link, section->sh_info);
5505
5506           if ((unsigned long) section->sh_addralign == section->sh_addralign)
5507             printf ("%2lu\n", (unsigned long) section->sh_addralign);
5508           else
5509             {
5510               print_vma (section->sh_addralign, DEC);
5511               putchar ('\n');
5512             }
5513         }
5514       else if (do_section_details)
5515         {
5516           printf ("       %-15.15s  ",
5517                   get_section_type_name (section->sh_type));
5518           print_vma (section->sh_addr, LONG_HEX);
5519           if ((long) section->sh_offset == section->sh_offset)
5520             printf ("  %16.16lx", (unsigned long) section->sh_offset);
5521           else
5522             {
5523               printf ("  ");
5524               print_vma (section->sh_offset, LONG_HEX);
5525             }
5526           printf ("  %u\n       ", section->sh_link);
5527           print_vma (section->sh_size, LONG_HEX);
5528           putchar (' ');
5529           print_vma (section->sh_entsize, LONG_HEX);
5530
5531           printf ("  %-16u  %lu\n",
5532                   section->sh_info,
5533                   (unsigned long) section->sh_addralign);
5534         }
5535       else
5536         {
5537           putchar (' ');
5538           print_vma (section->sh_addr, LONG_HEX);
5539           if ((long) section->sh_offset == section->sh_offset)
5540             printf ("  %8.8lx", (unsigned long) section->sh_offset);
5541           else
5542             {
5543               printf ("  ");
5544               print_vma (section->sh_offset, LONG_HEX);
5545             }
5546           printf ("\n       ");
5547           print_vma (section->sh_size, LONG_HEX);
5548           printf ("  ");
5549           print_vma (section->sh_entsize, LONG_HEX);
5550
5551           printf (" %3s ", get_elf_section_flags (section->sh_flags));
5552
5553           printf ("     %2u   %3u     %lu\n",
5554                   section->sh_link,
5555                   section->sh_info,
5556                   (unsigned long) section->sh_addralign);
5557         }
5558
5559       if (do_section_details)
5560         printf ("       %s\n", get_elf_section_flags (section->sh_flags));
5561     }
5562
5563   if (!do_section_details)
5564     {
5565       if (elf_header.e_machine == EM_X86_64
5566           || elf_header.e_machine == EM_L1OM
5567           || elf_header.e_machine == EM_K1OM)
5568         printf (_("Key to Flags:\n\
5569   W (write), A (alloc), X (execute), M (merge), S (strings), l (large)\n\
5570   I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)\n\
5571   O (extra OS processing required) o (OS specific), p (processor specific)\n"));
5572       else
5573         printf (_("Key to Flags:\n\
5574   W (write), A (alloc), X (execute), M (merge), S (strings)\n\
5575   I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)\n\
5576   O (extra OS processing required) o (OS specific), p (processor specific)\n"));
5577     }
5578
5579   return 1;
5580 }
5581
5582 static const char *
5583 get_group_flags (unsigned int flags)
5584 {
5585   static char buff[32];
5586   switch (flags)
5587     {
5588     case 0:
5589       return "";
5590
5591     case GRP_COMDAT:
5592       return "COMDAT ";
5593
5594    default:
5595       snprintf (buff, sizeof (buff), _("[<unknown>: 0x%x] "), flags);
5596       break;
5597     }
5598   return buff;
5599 }
5600
5601 static int
5602 process_section_groups (FILE * file)
5603 {
5604   Elf_Internal_Shdr * section;
5605   unsigned int i;
5606   struct group * group;
5607   Elf_Internal_Shdr * symtab_sec;
5608   Elf_Internal_Shdr * strtab_sec;
5609   Elf_Internal_Sym * symtab;
5610   unsigned long num_syms;
5611   char * strtab;
5612   size_t strtab_size;
5613
5614   /* Don't process section groups unless needed.  */
5615   if (!do_unwind && !do_section_groups)
5616     return 1;
5617
5618   if (elf_header.e_shnum == 0)
5619     {
5620       if (do_section_groups)
5621         printf (_("\nThere are no sections to group in this file.\n"));
5622
5623       return 1;
5624     }
5625
5626   if (section_headers == NULL)
5627     {
5628       error (_("Section headers are not available!\n"));
5629       /* PR 13622: This can happen with a corrupt ELF header.  */
5630       return 0;
5631     }
5632
5633   section_headers_groups = (struct group **) calloc (elf_header.e_shnum,
5634                                                      sizeof (struct group *));
5635
5636   if (section_headers_groups == NULL)
5637     {
5638       error (_("Out of memory\n"));
5639       return 0;
5640     }
5641
5642   /* Scan the sections for the group section.  */
5643   group_count = 0;
5644   for (i = 0, section = section_headers;
5645        i < elf_header.e_shnum;
5646        i++, section++)
5647     if (section->sh_type == SHT_GROUP)
5648       group_count++;
5649
5650   if (group_count == 0)
5651     {
5652       if (do_section_groups)
5653         printf (_("\nThere are no section groups in this file.\n"));
5654
5655       return 1;
5656     }
5657
5658   section_groups = (struct group *) calloc (group_count, sizeof (struct group));
5659
5660   if (section_groups == NULL)
5661     {
5662       error (_("Out of memory\n"));
5663       return 0;
5664     }
5665
5666   symtab_sec = NULL;
5667   strtab_sec = NULL;
5668   symtab = NULL;
5669   num_syms = 0;
5670   strtab = NULL;
5671   strtab_size = 0;
5672   for (i = 0, section = section_headers, group = section_groups;
5673        i < elf_header.e_shnum;
5674        i++, section++)
5675     {
5676       if (section->sh_type == SHT_GROUP)
5677         {
5678           const char * name = printable_section_name (section);
5679           const char * group_name;
5680           unsigned char * start;
5681           unsigned char * indices;
5682           unsigned int entry, j, size;
5683           Elf_Internal_Shdr * sec;
5684           Elf_Internal_Sym * sym;
5685
5686           /* Get the symbol table.  */
5687           if (section->sh_link >= elf_header.e_shnum
5688               || ((sec = section_headers + section->sh_link)->sh_type
5689                   != SHT_SYMTAB))
5690             {
5691               error (_("Bad sh_link in group section `%s'\n"), name);
5692               continue;
5693             }
5694
5695           if (symtab_sec != sec)
5696             {
5697               symtab_sec = sec;
5698               if (symtab)
5699                 free (symtab);
5700               symtab = GET_ELF_SYMBOLS (file, symtab_sec, & num_syms);
5701             }
5702
5703           if (symtab == NULL)
5704             {
5705               error (_("Corrupt header in group section `%s'\n"), name);
5706               continue;
5707             }
5708
5709           if (section->sh_info >= num_syms)
5710             {
5711               error (_("Bad sh_info in group section `%s'\n"), name);
5712               continue;
5713             }
5714
5715           sym = symtab + section->sh_info;
5716
5717           if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
5718             {
5719               if (sym->st_shndx == 0
5720                   || sym->st_shndx >= elf_header.e_shnum)
5721                 {
5722                   error (_("Bad sh_info in group section `%s'\n"), name);
5723                   continue;
5724                 }
5725
5726               group_name = SECTION_NAME (section_headers + sym->st_shndx);
5727               strtab_sec = NULL;
5728               if (strtab)
5729                 free (strtab);
5730               strtab = NULL;
5731               strtab_size = 0;
5732             }
5733           else
5734             {
5735               /* Get the string table.  */
5736               if (symtab_sec->sh_link >= elf_header.e_shnum)
5737                 {
5738                   strtab_sec = NULL;
5739                   if (strtab)
5740                     free (strtab);
5741                   strtab = NULL;
5742                   strtab_size = 0;
5743                 }
5744               else if (strtab_sec
5745                        != (sec = section_headers + symtab_sec->sh_link))
5746                 {
5747                   strtab_sec = sec;
5748                   if (strtab)
5749                     free (strtab);
5750
5751                   strtab = (char *) get_data (NULL, file, strtab_sec->sh_offset,
5752                                               1, strtab_sec->sh_size,
5753                                               _("string table"));
5754                   strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
5755                 }
5756               group_name = sym->st_name < strtab_size
5757                 ? strtab + sym->st_name : _("<corrupt>");
5758             }
5759
5760           start = (unsigned char *) get_data (NULL, file, section->sh_offset,
5761                                               1, section->sh_size,
5762                                               _("section data"));
5763           if (start == NULL)
5764             continue;
5765
5766           indices = start;
5767           size = (section->sh_size / section->sh_entsize) - 1;
5768           entry = byte_get (indices, 4);
5769           indices += 4;
5770
5771           if (do_section_groups)
5772             {
5773               printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
5774                       get_group_flags (entry), i, name, group_name, size);
5775
5776               printf (_("   [Index]    Name\n"));
5777             }
5778
5779           group->group_index = i;
5780
5781           for (j = 0; j < size; j++)
5782             {
5783               struct group_list * g;
5784
5785               entry = byte_get (indices, 4);
5786               indices += 4;
5787
5788               if (entry >= elf_header.e_shnum)
5789                 {
5790                   error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
5791                          entry, i, elf_header.e_shnum - 1);
5792                   continue;
5793                 }
5794
5795               if (section_headers_groups [entry] != NULL)
5796                 {
5797                   if (entry)
5798                     {
5799                       error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
5800                              entry, i,
5801                              section_headers_groups [entry]->group_index);
5802                       continue;
5803                     }
5804                   else
5805                     {
5806                       /* Intel C/C++ compiler may put section 0 in a
5807                          section group. We just warn it the first time
5808                          and ignore it afterwards.  */
5809                       static int warned = 0;
5810                       if (!warned)
5811                         {
5812                           error (_("section 0 in group section [%5u]\n"),
5813                                  section_headers_groups [entry]->group_index);
5814                           warned++;
5815                         }
5816                     }
5817                 }
5818
5819               section_headers_groups [entry] = group;
5820
5821               if (do_section_groups)
5822                 {
5823                   sec = section_headers + entry;
5824                   printf ("   [%5u]   %s\n", entry, printable_section_name (sec));
5825                 }
5826
5827               g = (struct group_list *) xmalloc (sizeof (struct group_list));
5828               g->section_index = entry;
5829               g->next = group->root;
5830               group->root = g;
5831             }
5832
5833           if (start)
5834             free (start);
5835
5836           group++;
5837         }
5838     }
5839
5840   if (symtab)
5841     free (symtab);
5842   if (strtab)
5843     free (strtab);
5844   return 1;
5845 }
5846
5847 /* Data used to display dynamic fixups.  */
5848
5849 struct ia64_vms_dynfixup
5850 {
5851   bfd_vma needed_ident;         /* Library ident number.  */
5852   bfd_vma needed;               /* Index in the dstrtab of the library name.  */
5853   bfd_vma fixup_needed;         /* Index of the library.  */
5854   bfd_vma fixup_rela_cnt;       /* Number of fixups.  */
5855   bfd_vma fixup_rela_off;       /* Fixups offset in the dynamic segment.  */
5856 };
5857
5858 /* Data used to display dynamic relocations.  */
5859
5860 struct ia64_vms_dynimgrela
5861 {
5862   bfd_vma img_rela_cnt;         /* Number of relocations.  */
5863   bfd_vma img_rela_off;         /* Reloc offset in the dynamic segment.  */
5864 };
5865
5866 /* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
5867    library).  */
5868
5869 static void
5870 dump_ia64_vms_dynamic_fixups (FILE *file, struct ia64_vms_dynfixup *fixup,
5871                               const char *strtab, unsigned int strtab_sz)
5872 {
5873   Elf64_External_VMS_IMAGE_FIXUP *imfs;
5874   long i;
5875   const char *lib_name;
5876
5877   imfs = get_data (NULL, file, dynamic_addr + fixup->fixup_rela_off,
5878                    1, fixup->fixup_rela_cnt * sizeof (*imfs),
5879                    _("dynamic section image fixups"));
5880   if (!imfs)
5881     return;
5882
5883   if (fixup->needed < strtab_sz)
5884     lib_name = strtab + fixup->needed;
5885   else
5886     {
5887       warn ("corrupt library name index of 0x%lx found in dynamic entry",
5888             (unsigned long) fixup->needed);
5889       lib_name = "???";
5890     }
5891   printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
5892           (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
5893   printf
5894     (_("Seg Offset           Type                             SymVec DataType\n"));
5895
5896   for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
5897     {
5898       unsigned int type;
5899       const char *rtype;
5900
5901       printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
5902       printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
5903       type = BYTE_GET (imfs [i].type);
5904       rtype = elf_ia64_reloc_type (type);
5905       if (rtype == NULL)
5906         printf (" 0x%08x                       ", type);
5907       else
5908         printf (" %-32s ", rtype);
5909       printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
5910       printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
5911     }
5912
5913   free (imfs);
5914 }
5915
5916 /* Display IA-64 OpenVMS dynamic relocations (used to relocate an image).  */
5917
5918 static void
5919 dump_ia64_vms_dynamic_relocs (FILE *file, struct ia64_vms_dynimgrela *imgrela)
5920 {
5921   Elf64_External_VMS_IMAGE_RELA *imrs;
5922   long i;
5923
5924   imrs = get_data (NULL, file, dynamic_addr + imgrela->img_rela_off,
5925                    1, imgrela->img_rela_cnt * sizeof (*imrs),
5926                    _("dynamic section image relocations"));
5927   if (!imrs)
5928     return;
5929
5930   printf (_("\nImage relocs\n"));
5931   printf
5932     (_("Seg Offset   Type                            Addend            Seg Sym Off\n"));
5933
5934   for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
5935     {
5936       unsigned int type;
5937       const char *rtype;
5938
5939       printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
5940       printf ("%08" BFD_VMA_FMT "x ",
5941               (bfd_vma) BYTE_GET (imrs [i].rela_offset));
5942       type = BYTE_GET (imrs [i].type);
5943       rtype = elf_ia64_reloc_type (type);
5944       if (rtype == NULL)
5945         printf ("0x%08x                      ", type);
5946       else
5947         printf ("%-31s ", rtype);
5948       print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
5949       printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
5950       printf ("%08" BFD_VMA_FMT "x\n",
5951               (bfd_vma) BYTE_GET (imrs [i].sym_offset));
5952     }
5953
5954   free (imrs);
5955 }
5956
5957 /* Display IA-64 OpenVMS dynamic relocations and fixups.  */
5958
5959 static int
5960 process_ia64_vms_dynamic_relocs (FILE *file)
5961 {
5962   struct ia64_vms_dynfixup fixup;
5963   struct ia64_vms_dynimgrela imgrela;
5964   Elf_Internal_Dyn *entry;
5965   int res = 0;
5966   bfd_vma strtab_off = 0;
5967   bfd_vma strtab_sz = 0;
5968   char *strtab = NULL;
5969
5970   memset (&fixup, 0, sizeof (fixup));
5971   memset (&imgrela, 0, sizeof (imgrela));
5972
5973   /* Note: the order of the entries is specified by the OpenVMS specs.  */
5974   for (entry = dynamic_section;
5975        entry < dynamic_section + dynamic_nent;
5976        entry++)
5977     {
5978       switch (entry->d_tag)
5979         {
5980         case DT_IA_64_VMS_STRTAB_OFFSET:
5981           strtab_off = entry->d_un.d_val;
5982           break;
5983         case DT_STRSZ:
5984           strtab_sz = entry->d_un.d_val;
5985           if (strtab == NULL)
5986             strtab = get_data (NULL, file, dynamic_addr + strtab_off,
5987                                1, strtab_sz, _("dynamic string section"));
5988           break;
5989
5990         case DT_IA_64_VMS_NEEDED_IDENT:
5991           fixup.needed_ident = entry->d_un.d_val;
5992           break;
5993         case DT_NEEDED:
5994           fixup.needed = entry->d_un.d_val;
5995           break;
5996         case DT_IA_64_VMS_FIXUP_NEEDED:
5997           fixup.fixup_needed = entry->d_un.d_val;
5998           break;
5999         case DT_IA_64_VMS_FIXUP_RELA_CNT:
6000           fixup.fixup_rela_cnt = entry->d_un.d_val;
6001           break;
6002         case DT_IA_64_VMS_FIXUP_RELA_OFF:
6003           fixup.fixup_rela_off = entry->d_un.d_val;
6004           res++;
6005           dump_ia64_vms_dynamic_fixups (file, &fixup, strtab, strtab_sz);
6006           break;
6007
6008         case DT_IA_64_VMS_IMG_RELA_CNT:
6009           imgrela.img_rela_cnt = entry->d_un.d_val;
6010           break;
6011         case DT_IA_64_VMS_IMG_RELA_OFF:
6012           imgrela.img_rela_off = entry->d_un.d_val;
6013           res++;
6014           dump_ia64_vms_dynamic_relocs (file, &imgrela);
6015           break;
6016
6017         default:
6018           break;
6019         }
6020     }
6021
6022   if (strtab != NULL)
6023     free (strtab);
6024
6025   return res;
6026 }
6027
6028 static struct
6029 {
6030   const char * name;
6031   int reloc;
6032   int size;
6033   int rela;
6034 } dynamic_relocations [] =
6035 {
6036     { "REL", DT_REL, DT_RELSZ, FALSE },
6037     { "RELA", DT_RELA, DT_RELASZ, TRUE },
6038     { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
6039 };
6040
6041 /* Process the reloc section.  */
6042
6043 static int
6044 process_relocs (FILE * file)
6045 {
6046   unsigned long rel_size;
6047   unsigned long rel_offset;
6048
6049
6050   if (!do_reloc)
6051     return 1;
6052
6053   if (do_using_dynamic)
6054     {
6055       int is_rela;
6056       const char * name;
6057       int has_dynamic_reloc;
6058       unsigned int i;
6059
6060       has_dynamic_reloc = 0;
6061
6062       for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
6063         {
6064           is_rela = dynamic_relocations [i].rela;
6065           name = dynamic_relocations [i].name;
6066           rel_size = dynamic_info [dynamic_relocations [i].size];
6067           rel_offset = dynamic_info [dynamic_relocations [i].reloc];
6068
6069           has_dynamic_reloc |= rel_size;
6070
6071           if (is_rela == UNKNOWN)
6072             {
6073               if (dynamic_relocations [i].reloc == DT_JMPREL)
6074                 switch (dynamic_info[DT_PLTREL])
6075                   {
6076                   case DT_REL:
6077                     is_rela = FALSE;
6078                     break;
6079                   case DT_RELA:
6080                     is_rela = TRUE;
6081                     break;
6082                   }
6083             }
6084
6085           if (rel_size)
6086             {
6087               printf
6088                 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
6089                  name, rel_offset, rel_size);
6090
6091               dump_relocations (file,
6092                                 offset_from_vma (file, rel_offset, rel_size),
6093                                 rel_size,
6094                                 dynamic_symbols, num_dynamic_syms,
6095                                 dynamic_strings, dynamic_strings_length, is_rela);
6096             }
6097         }
6098
6099       if (is_ia64_vms ())
6100         has_dynamic_reloc |= process_ia64_vms_dynamic_relocs (file);
6101
6102       if (! has_dynamic_reloc)
6103         printf (_("\nThere are no dynamic relocations in this file.\n"));
6104     }
6105   else
6106     {
6107       Elf_Internal_Shdr * section;
6108       unsigned long i;
6109       int found = 0;
6110
6111       for (i = 0, section = section_headers;
6112            i < elf_header.e_shnum;
6113            i++, section++)
6114         {
6115           if (   section->sh_type != SHT_RELA
6116               && section->sh_type != SHT_REL)
6117             continue;
6118
6119           rel_offset = section->sh_offset;
6120           rel_size   = section->sh_size;
6121
6122           if (rel_size)
6123             {
6124               Elf_Internal_Shdr * strsec;
6125               int is_rela;
6126
6127               printf (_("\nRelocation section "));
6128
6129               if (string_table == NULL)
6130                 printf ("%d", section->sh_name);
6131               else
6132                 printf ("'%s'", printable_section_name (section));
6133
6134               printf (_(" at offset 0x%lx contains %lu entries:\n"),
6135                  rel_offset, (unsigned long) (rel_size / section->sh_entsize));
6136
6137               is_rela = section->sh_type == SHT_RELA;
6138
6139               if (section->sh_link != 0
6140                   && section->sh_link < elf_header.e_shnum)
6141                 {
6142                   Elf_Internal_Shdr * symsec;
6143                   Elf_Internal_Sym *  symtab;
6144                   unsigned long nsyms;
6145                   unsigned long strtablen = 0;
6146                   char * strtab = NULL;
6147
6148                   symsec = section_headers + section->sh_link;
6149                   if (symsec->sh_type != SHT_SYMTAB
6150                       && symsec->sh_type != SHT_DYNSYM)
6151                     continue;
6152
6153                   symtab = GET_ELF_SYMBOLS (file, symsec, & nsyms);
6154
6155                   if (symtab == NULL)
6156                     continue;
6157
6158                   if (symsec->sh_link != 0
6159                       && symsec->sh_link < elf_header.e_shnum)
6160                     {
6161                       strsec = section_headers + symsec->sh_link;
6162
6163                       strtab = (char *) get_data (NULL, file, strsec->sh_offset,
6164                                                   1, strsec->sh_size,
6165                                                   _("string table"));
6166                       strtablen = strtab == NULL ? 0 : strsec->sh_size;
6167                     }
6168
6169                   dump_relocations (file, rel_offset, rel_size,
6170                                     symtab, nsyms, strtab, strtablen, is_rela);
6171                   if (strtab)
6172                     free (strtab);
6173                   free (symtab);
6174                 }
6175               else
6176                 dump_relocations (file, rel_offset, rel_size,
6177                                   NULL, 0, NULL, 0, is_rela);
6178
6179               found = 1;
6180             }
6181         }
6182
6183       if (! found)
6184         printf (_("\nThere are no relocations in this file.\n"));
6185     }
6186
6187   return 1;
6188 }
6189
6190 /* Process the unwind section.  */
6191
6192 #include "unwind-ia64.h"
6193
6194 /* An absolute address consists of a section and an offset.  If the
6195    section is NULL, the offset itself is the address, otherwise, the
6196    address equals to LOAD_ADDRESS(section) + offset.  */
6197
6198 struct absaddr
6199   {
6200     unsigned short section;
6201     bfd_vma offset;
6202   };
6203
6204 #define ABSADDR(a) \
6205   ((a).section \
6206    ? section_headers [(a).section].sh_addr + (a).offset \
6207    : (a).offset)
6208
6209 struct ia64_unw_table_entry
6210   {
6211     struct absaddr start;
6212     struct absaddr end;
6213     struct absaddr info;
6214   };
6215
6216 struct ia64_unw_aux_info
6217   {
6218
6219     struct ia64_unw_table_entry *table; /* Unwind table.  */
6220     unsigned long table_len;    /* Length of unwind table.  */
6221     unsigned char * info;       /* Unwind info.  */
6222     unsigned long info_size;    /* Size of unwind info.  */
6223     bfd_vma info_addr;          /* starting address of unwind info.  */
6224     bfd_vma seg_base;           /* Starting address of segment.  */
6225     Elf_Internal_Sym * symtab;  /* The symbol table.  */
6226     unsigned long nsyms;        /* Number of symbols.  */
6227     char * strtab;              /* The string table.  */
6228     unsigned long strtab_size;  /* Size of string table.  */
6229   };
6230
6231 static void
6232 find_symbol_for_address (Elf_Internal_Sym * symtab,
6233                          unsigned long nsyms,
6234                          const char * strtab,
6235                          unsigned long strtab_size,
6236                          struct absaddr addr,
6237                          const char ** symname,
6238                          bfd_vma * offset)
6239 {
6240   bfd_vma dist = 0x100000;
6241   Elf_Internal_Sym * sym;
6242   Elf_Internal_Sym * best = NULL;
6243   unsigned long i;
6244
6245   REMOVE_ARCH_BITS (addr.offset);
6246
6247   for (i = 0, sym = symtab; i < nsyms; ++i, ++sym)
6248     {
6249       bfd_vma value = sym->st_value;
6250
6251       REMOVE_ARCH_BITS (value);
6252
6253       if (ELF_ST_TYPE (sym->st_info) == STT_FUNC
6254           && sym->st_name != 0
6255           && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
6256           && addr.offset >= value
6257           && addr.offset - value < dist)
6258         {
6259           best = sym;
6260           dist = addr.offset - value;
6261           if (!dist)
6262             break;
6263         }
6264     }
6265
6266   if (best)
6267     {
6268       *symname = (best->st_name >= strtab_size
6269                   ? _("<corrupt>") : strtab + best->st_name);
6270       *offset = dist;
6271       return;
6272     }
6273
6274   *symname = NULL;
6275   *offset = addr.offset;
6276 }
6277
6278 static void
6279 dump_ia64_unwind (struct ia64_unw_aux_info * aux)
6280 {
6281   struct ia64_unw_table_entry * tp;
6282   int in_body;
6283
6284   for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
6285     {
6286       bfd_vma stamp;
6287       bfd_vma offset;
6288       const unsigned char * dp;
6289       const unsigned char * head;
6290       const char * procname;
6291
6292       find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
6293                                aux->strtab_size, tp->start, &procname, &offset);
6294
6295       fputs ("\n<", stdout);
6296
6297       if (procname)
6298         {
6299           fputs (procname, stdout);
6300
6301           if (offset)
6302             printf ("+%lx", (unsigned long) offset);
6303         }
6304
6305       fputs (">: [", stdout);
6306       print_vma (tp->start.offset, PREFIX_HEX);
6307       fputc ('-', stdout);
6308       print_vma (tp->end.offset, PREFIX_HEX);
6309       printf ("], info at +0x%lx\n",
6310               (unsigned long) (tp->info.offset - aux->seg_base));
6311
6312       head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
6313       stamp = byte_get ((unsigned char *) head, sizeof (stamp));
6314
6315       printf ("  v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
6316               (unsigned) UNW_VER (stamp),
6317               (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
6318               UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
6319               UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
6320               (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
6321
6322       if (UNW_VER (stamp) != 1)
6323         {
6324           printf (_("\tUnknown version.\n"));
6325           continue;
6326         }
6327
6328       in_body = 0;
6329       for (dp = head + 8; dp < head + 8 + eh_addr_size * UNW_LENGTH (stamp);)
6330         dp = unw_decode (dp, in_body, & in_body);
6331     }
6332 }
6333
6334 static int
6335 slurp_ia64_unwind_table (FILE * file,
6336                          struct ia64_unw_aux_info * aux,
6337                          Elf_Internal_Shdr * sec)
6338 {
6339   unsigned long size, nrelas, i;
6340   Elf_Internal_Phdr * seg;
6341   struct ia64_unw_table_entry * tep;
6342   Elf_Internal_Shdr * relsec;
6343   Elf_Internal_Rela * rela;
6344   Elf_Internal_Rela * rp;
6345   unsigned char * table;
6346   unsigned char * tp;
6347   Elf_Internal_Sym * sym;
6348   const char * relname;
6349
6350   /* First, find the starting address of the segment that includes
6351      this section: */
6352
6353   if (elf_header.e_phnum)
6354     {
6355       if (! get_program_headers (file))
6356           return 0;
6357
6358       for (seg = program_headers;
6359            seg < program_headers + elf_header.e_phnum;
6360            ++seg)
6361         {
6362           if (seg->p_type != PT_LOAD)
6363             continue;
6364
6365           if (sec->sh_addr >= seg->p_vaddr
6366               && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
6367             {
6368               aux->seg_base = seg->p_vaddr;
6369               break;
6370             }
6371         }
6372     }
6373
6374   /* Second, build the unwind table from the contents of the unwind section:  */
6375   size = sec->sh_size;
6376   table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
6377                                       _("unwind table"));
6378   if (!table)
6379     return 0;
6380
6381   aux->table = (struct ia64_unw_table_entry *)
6382       xcmalloc (size / (3 * eh_addr_size), sizeof (aux->table[0]));
6383   tep = aux->table;
6384   for (tp = table; tp < table + size; ++tep)
6385     {
6386       tep->start.section = SHN_UNDEF;
6387       tep->end.section   = SHN_UNDEF;
6388       tep->info.section  = SHN_UNDEF;
6389       tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
6390       tep->end.offset   = byte_get (tp, eh_addr_size); tp += eh_addr_size;
6391       tep->info.offset  = byte_get (tp, eh_addr_size); tp += eh_addr_size;
6392       tep->start.offset += aux->seg_base;
6393       tep->end.offset   += aux->seg_base;
6394       tep->info.offset  += aux->seg_base;
6395     }
6396   free (table);
6397
6398   /* Third, apply any relocations to the unwind table:  */
6399   for (relsec = section_headers;
6400        relsec < section_headers + elf_header.e_shnum;
6401        ++relsec)
6402     {
6403       if (relsec->sh_type != SHT_RELA
6404           || relsec->sh_info >= elf_header.e_shnum
6405           || section_headers + relsec->sh_info != sec)
6406         continue;
6407
6408       if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
6409                               & rela, & nrelas))
6410         return 0;
6411
6412       for (rp = rela; rp < rela + nrelas; ++rp)
6413         {
6414           relname = elf_ia64_reloc_type (get_reloc_type (rp->r_info));
6415           sym = aux->symtab + get_reloc_symindex (rp->r_info);
6416
6417           if (! const_strneq (relname, "R_IA64_SEGREL"))
6418             {
6419               warn (_("Skipping unexpected relocation type %s\n"), relname);
6420               continue;
6421             }
6422
6423           i = rp->r_offset / (3 * eh_addr_size);
6424
6425           switch (rp->r_offset/eh_addr_size % 3)
6426             {
6427             case 0:
6428               aux->table[i].start.section = sym->st_shndx;
6429               aux->table[i].start.offset  = rp->r_addend + sym->st_value;
6430               break;
6431             case 1:
6432               aux->table[i].end.section   = sym->st_shndx;
6433               aux->table[i].end.offset    = rp->r_addend + sym->st_value;
6434               break;
6435             case 2:
6436               aux->table[i].info.section  = sym->st_shndx;
6437               aux->table[i].info.offset   = rp->r_addend + sym->st_value;
6438               break;
6439             default:
6440               break;
6441             }
6442         }
6443
6444       free (rela);
6445     }
6446
6447   aux->table_len = size / (3 * eh_addr_size);
6448   return 1;
6449 }
6450
6451 static void
6452 ia64_process_unwind (FILE * file)
6453 {
6454   Elf_Internal_Shdr * sec;
6455   Elf_Internal_Shdr * unwsec = NULL;
6456   Elf_Internal_Shdr * strsec;
6457   unsigned long i, unwcount = 0, unwstart = 0;
6458   struct ia64_unw_aux_info aux;
6459
6460   memset (& aux, 0, sizeof (aux));
6461
6462   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
6463     {
6464       if (sec->sh_type == SHT_SYMTAB
6465           && sec->sh_link < elf_header.e_shnum)
6466         {
6467           aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
6468
6469           strsec = section_headers + sec->sh_link;
6470           assert (aux.strtab == NULL);
6471           aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
6472                                           1, strsec->sh_size,
6473                                           _("string table"));
6474           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
6475         }
6476       else if (sec->sh_type == SHT_IA_64_UNWIND)
6477         unwcount++;
6478     }
6479
6480   if (!unwcount)
6481     printf (_("\nThere are no unwind sections in this file.\n"));
6482
6483   while (unwcount-- > 0)
6484     {
6485       char * suffix;
6486       size_t len, len2;
6487
6488       for (i = unwstart, sec = section_headers + unwstart;
6489            i < elf_header.e_shnum; ++i, ++sec)
6490         if (sec->sh_type == SHT_IA_64_UNWIND)
6491           {
6492             unwsec = sec;
6493             break;
6494           }
6495
6496       unwstart = i + 1;
6497       len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
6498
6499       if ((unwsec->sh_flags & SHF_GROUP) != 0)
6500         {
6501           /* We need to find which section group it is in.  */
6502           struct group_list * g = section_headers_groups [i]->root;
6503
6504           for (; g != NULL; g = g->next)
6505             {
6506               sec = section_headers + g->section_index;
6507
6508               if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
6509                 break;
6510             }
6511
6512           if (g == NULL)
6513             i = elf_header.e_shnum;
6514         }
6515       else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
6516         {
6517           /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO.  */
6518           len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
6519           suffix = SECTION_NAME (unwsec) + len;
6520           for (i = 0, sec = section_headers; i < elf_header.e_shnum;
6521                ++i, ++sec)
6522             if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
6523                 && streq (SECTION_NAME (sec) + len2, suffix))
6524               break;
6525         }
6526       else
6527         {
6528           /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
6529              .IA_64.unwind or BAR -> .IA_64.unwind_info.  */
6530           len = sizeof (ELF_STRING_ia64_unwind) - 1;
6531           len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
6532           suffix = "";
6533           if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
6534             suffix = SECTION_NAME (unwsec) + len;
6535           for (i = 0, sec = section_headers; i < elf_header.e_shnum;
6536                ++i, ++sec)
6537             if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
6538                 && streq (SECTION_NAME (sec) + len2, suffix))
6539               break;
6540         }
6541
6542       if (i == elf_header.e_shnum)
6543         {
6544           printf (_("\nCould not find unwind info section for "));
6545
6546           if (string_table == NULL)
6547             printf ("%d", unwsec->sh_name);
6548           else
6549             printf ("'%s'", printable_section_name (unwsec));
6550         }
6551       else
6552         {
6553           aux.info_addr = sec->sh_addr;
6554           aux.info = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1,
6555                                                  sec->sh_size,
6556                                                  _("unwind info"));
6557           aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
6558
6559           printf (_("\nUnwind section "));
6560
6561           if (string_table == NULL)
6562             printf ("%d", unwsec->sh_name);
6563           else
6564             printf ("'%s'", printable_section_name (unwsec));
6565
6566           printf (_(" at offset 0x%lx contains %lu entries:\n"),
6567                   (unsigned long) unwsec->sh_offset,
6568                   (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
6569
6570           (void) slurp_ia64_unwind_table (file, & aux, unwsec);
6571
6572           if (aux.table_len > 0)
6573             dump_ia64_unwind (& aux);
6574
6575           if (aux.table)
6576             free ((char *) aux.table);
6577           if (aux.info)
6578             free ((char *) aux.info);
6579           aux.table = NULL;
6580           aux.info = NULL;
6581         }
6582     }
6583
6584   if (aux.symtab)
6585     free (aux.symtab);
6586   if (aux.strtab)
6587     free ((char *) aux.strtab);
6588 }
6589
6590 struct hppa_unw_table_entry
6591   {
6592     struct absaddr start;
6593     struct absaddr end;
6594     unsigned int Cannot_unwind:1;                       /* 0 */
6595     unsigned int Millicode:1;                   /* 1 */
6596     unsigned int Millicode_save_sr0:1;          /* 2 */
6597     unsigned int Region_description:2;          /* 3..4 */
6598     unsigned int reserved1:1;                   /* 5 */
6599     unsigned int Entry_SR:1;                    /* 6 */
6600     unsigned int Entry_FR:4;     /* number saved */     /* 7..10 */
6601     unsigned int Entry_GR:5;     /* number saved */     /* 11..15 */
6602     unsigned int Args_stored:1;                 /* 16 */
6603     unsigned int Variable_Frame:1;                      /* 17 */
6604     unsigned int Separate_Package_Body:1;               /* 18 */
6605     unsigned int Frame_Extension_Millicode:1;   /* 19 */
6606     unsigned int Stack_Overflow_Check:1;                /* 20 */
6607     unsigned int Two_Instruction_SP_Increment:1;        /* 21 */
6608     unsigned int Ada_Region:1;                  /* 22 */
6609     unsigned int cxx_info:1;                    /* 23 */
6610     unsigned int cxx_try_catch:1;                       /* 24 */
6611     unsigned int sched_entry_seq:1;                     /* 25 */
6612     unsigned int reserved2:1;                   /* 26 */
6613     unsigned int Save_SP:1;                             /* 27 */
6614     unsigned int Save_RP:1;                             /* 28 */
6615     unsigned int Save_MRP_in_frame:1;           /* 29 */
6616     unsigned int extn_ptr_defined:1;            /* 30 */
6617     unsigned int Cleanup_defined:1;                     /* 31 */
6618
6619     unsigned int MPE_XL_interrupt_marker:1;             /* 0 */
6620     unsigned int HP_UX_interrupt_marker:1;              /* 1 */
6621     unsigned int Large_frame:1;                 /* 2 */
6622     unsigned int Pseudo_SP_Set:1;                       /* 3 */
6623     unsigned int reserved4:1;                   /* 4 */
6624     unsigned int Total_frame_size:27;           /* 5..31 */
6625   };
6626
6627 struct hppa_unw_aux_info
6628   {
6629     struct hppa_unw_table_entry *table; /* Unwind table.  */
6630     unsigned long table_len;    /* Length of unwind table.  */
6631     bfd_vma seg_base;           /* Starting address of segment.  */
6632     Elf_Internal_Sym * symtab;  /* The symbol table.  */
6633     unsigned long nsyms;        /* Number of symbols.  */
6634     char * strtab;              /* The string table.  */
6635     unsigned long strtab_size;  /* Size of string table.  */
6636   };
6637
6638 static void
6639 dump_hppa_unwind (struct hppa_unw_aux_info * aux)
6640 {
6641   struct hppa_unw_table_entry * tp;
6642
6643   for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
6644     {
6645       bfd_vma offset;
6646       const char * procname;
6647
6648       find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
6649                                aux->strtab_size, tp->start, &procname,
6650                                &offset);
6651
6652       fputs ("\n<", stdout);
6653
6654       if (procname)
6655         {
6656           fputs (procname, stdout);
6657
6658           if (offset)
6659             printf ("+%lx", (unsigned long) offset);
6660         }
6661
6662       fputs (">: [", stdout);
6663       print_vma (tp->start.offset, PREFIX_HEX);
6664       fputc ('-', stdout);
6665       print_vma (tp->end.offset, PREFIX_HEX);
6666       printf ("]\n\t");
6667
6668 #define PF(_m) if (tp->_m) printf (#_m " ");
6669 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
6670       PF(Cannot_unwind);
6671       PF(Millicode);
6672       PF(Millicode_save_sr0);
6673       /* PV(Region_description);  */
6674       PF(Entry_SR);
6675       PV(Entry_FR);
6676       PV(Entry_GR);
6677       PF(Args_stored);
6678       PF(Variable_Frame);
6679       PF(Separate_Package_Body);
6680       PF(Frame_Extension_Millicode);
6681       PF(Stack_Overflow_Check);
6682       PF(Two_Instruction_SP_Increment);
6683       PF(Ada_Region);
6684       PF(cxx_info);
6685       PF(cxx_try_catch);
6686       PF(sched_entry_seq);
6687       PF(Save_SP);
6688       PF(Save_RP);
6689       PF(Save_MRP_in_frame);
6690       PF(extn_ptr_defined);
6691       PF(Cleanup_defined);
6692       PF(MPE_XL_interrupt_marker);
6693       PF(HP_UX_interrupt_marker);
6694       PF(Large_frame);
6695       PF(Pseudo_SP_Set);
6696       PV(Total_frame_size);
6697 #undef PF
6698 #undef PV
6699     }
6700
6701   printf ("\n");
6702 }
6703
6704 static int
6705 slurp_hppa_unwind_table (FILE * file,
6706                          struct hppa_unw_aux_info * aux,
6707                          Elf_Internal_Shdr * sec)
6708 {
6709   unsigned long size, unw_ent_size, nentries, nrelas, i;
6710   Elf_Internal_Phdr * seg;
6711   struct hppa_unw_table_entry * tep;
6712   Elf_Internal_Shdr * relsec;
6713   Elf_Internal_Rela * rela;
6714   Elf_Internal_Rela * rp;
6715   unsigned char * table;
6716   unsigned char * tp;
6717   Elf_Internal_Sym * sym;
6718   const char * relname;
6719
6720   /* First, find the starting address of the segment that includes
6721      this section.  */
6722
6723   if (elf_header.e_phnum)
6724     {
6725       if (! get_program_headers (file))
6726         return 0;
6727
6728       for (seg = program_headers;
6729            seg < program_headers + elf_header.e_phnum;
6730            ++seg)
6731         {
6732           if (seg->p_type != PT_LOAD)
6733             continue;
6734
6735           if (sec->sh_addr >= seg->p_vaddr
6736               && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
6737             {
6738               aux->seg_base = seg->p_vaddr;
6739               break;
6740             }
6741         }
6742     }
6743
6744   /* Second, build the unwind table from the contents of the unwind
6745      section.  */
6746   size = sec->sh_size;
6747   table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
6748                                       _("unwind table"));
6749   if (!table)
6750     return 0;
6751
6752   unw_ent_size = 16;
6753   nentries = size / unw_ent_size;
6754   size = unw_ent_size * nentries;
6755
6756   tep = aux->table = (struct hppa_unw_table_entry *)
6757       xcmalloc (nentries, sizeof (aux->table[0]));
6758
6759   for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
6760     {
6761       unsigned int tmp1, tmp2;
6762
6763       tep->start.section = SHN_UNDEF;
6764       tep->end.section   = SHN_UNDEF;
6765
6766       tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
6767       tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
6768       tmp1 = byte_get ((unsigned char *) tp + 8, 4);
6769       tmp2 = byte_get ((unsigned char *) tp + 12, 4);
6770
6771       tep->start.offset += aux->seg_base;
6772       tep->end.offset   += aux->seg_base;
6773
6774       tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
6775       tep->Millicode = (tmp1 >> 30) & 0x1;
6776       tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
6777       tep->Region_description = (tmp1 >> 27) & 0x3;
6778       tep->reserved1 = (tmp1 >> 26) & 0x1;
6779       tep->Entry_SR = (tmp1 >> 25) & 0x1;
6780       tep->Entry_FR = (tmp1 >> 21) & 0xf;
6781       tep->Entry_GR = (tmp1 >> 16) & 0x1f;
6782       tep->Args_stored = (tmp1 >> 15) & 0x1;
6783       tep->Variable_Frame = (tmp1 >> 14) & 0x1;
6784       tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
6785       tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
6786       tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
6787       tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
6788       tep->Ada_Region = (tmp1 >> 9) & 0x1;
6789       tep->cxx_info = (tmp1 >> 8) & 0x1;
6790       tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
6791       tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
6792       tep->reserved2 = (tmp1 >> 5) & 0x1;
6793       tep->Save_SP = (tmp1 >> 4) & 0x1;
6794       tep->Save_RP = (tmp1 >> 3) & 0x1;
6795       tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
6796       tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
6797       tep->Cleanup_defined = tmp1 & 0x1;
6798
6799       tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
6800       tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
6801       tep->Large_frame = (tmp2 >> 29) & 0x1;
6802       tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
6803       tep->reserved4 = (tmp2 >> 27) & 0x1;
6804       tep->Total_frame_size = tmp2 & 0x7ffffff;
6805     }
6806   free (table);
6807
6808   /* Third, apply any relocations to the unwind table.  */
6809   for (relsec = section_headers;
6810        relsec < section_headers + elf_header.e_shnum;
6811        ++relsec)
6812     {
6813       if (relsec->sh_type != SHT_RELA
6814           || relsec->sh_info >= elf_header.e_shnum
6815           || section_headers + relsec->sh_info != sec)
6816         continue;
6817
6818       if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
6819                               & rela, & nrelas))
6820         return 0;
6821
6822       for (rp = rela; rp < rela + nrelas; ++rp)
6823         {
6824           relname = elf_hppa_reloc_type (get_reloc_type (rp->r_info));
6825           sym = aux->symtab + get_reloc_symindex (rp->r_info);
6826
6827           /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64.  */
6828           if (! const_strneq (relname, "R_PARISC_SEGREL"))
6829             {
6830               warn (_("Skipping unexpected relocation type %s\n"), relname);
6831               continue;
6832             }
6833
6834           i = rp->r_offset / unw_ent_size;
6835
6836           switch ((rp->r_offset % unw_ent_size) / eh_addr_size)
6837             {
6838             case 0:
6839               aux->table[i].start.section = sym->st_shndx;
6840               aux->table[i].start.offset  = sym->st_value + rp->r_addend;
6841               break;
6842             case 1:
6843               aux->table[i].end.section   = sym->st_shndx;
6844               aux->table[i].end.offset    = sym->st_value + rp->r_addend;
6845               break;
6846             default:
6847               break;
6848             }
6849         }
6850
6851       free (rela);
6852     }
6853
6854   aux->table_len = nentries;
6855
6856   return 1;
6857 }
6858
6859 static void
6860 hppa_process_unwind (FILE * file)
6861 {
6862   struct hppa_unw_aux_info aux;
6863   Elf_Internal_Shdr * unwsec = NULL;
6864   Elf_Internal_Shdr * strsec;
6865   Elf_Internal_Shdr * sec;
6866   unsigned long i;
6867
6868   if (string_table == NULL)
6869     return;
6870
6871   memset (& aux, 0, sizeof (aux));
6872
6873   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
6874     {
6875       if (sec->sh_type == SHT_SYMTAB
6876           && sec->sh_link < elf_header.e_shnum)
6877         {
6878           aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
6879
6880           strsec = section_headers + sec->sh_link;
6881           assert (aux.strtab == NULL);
6882           aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
6883                                           1, strsec->sh_size,
6884                                           _("string table"));
6885           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
6886         }
6887       else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
6888         unwsec = sec;
6889     }
6890
6891   if (!unwsec)
6892     printf (_("\nThere are no unwind sections in this file.\n"));
6893
6894   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
6895     {
6896       if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
6897         {
6898           printf (_("\nUnwind section '%s' at offset 0x%lx contains %lu entries:\n"),
6899                   printable_section_name (sec),
6900                   (unsigned long) sec->sh_offset,
6901                   (unsigned long) (sec->sh_size / (2 * eh_addr_size + 8)));
6902
6903           slurp_hppa_unwind_table (file, &aux, sec);
6904           if (aux.table_len > 0)
6905             dump_hppa_unwind (&aux);
6906
6907           if (aux.table)
6908             free ((char *) aux.table);
6909           aux.table = NULL;
6910         }
6911     }
6912
6913   if (aux.symtab)
6914     free (aux.symtab);
6915   if (aux.strtab)
6916     free ((char *) aux.strtab);
6917 }
6918
6919 struct arm_section
6920 {
6921   unsigned char *      data;            /* The unwind data.  */
6922   Elf_Internal_Shdr *  sec;             /* The cached unwind section header.  */
6923   Elf_Internal_Rela *  rela;            /* The cached relocations for this section.  */
6924   unsigned long        nrelas;          /* The number of relocations.  */
6925   unsigned int         rel_type;        /* REL or RELA ?  */
6926   Elf_Internal_Rela *  next_rela;       /* Cyclic pointer to the next reloc to process.  */
6927 };
6928
6929 struct arm_unw_aux_info
6930 {
6931   FILE *              file;             /* The file containing the unwind sections.  */
6932   Elf_Internal_Sym *  symtab;           /* The file's symbol table.  */
6933   unsigned long       nsyms;            /* Number of symbols.  */
6934   char *              strtab;           /* The file's string table.  */
6935   unsigned long       strtab_size;      /* Size of string table.  */
6936 };
6937
6938 static const char *
6939 arm_print_vma_and_name (struct arm_unw_aux_info *aux,
6940                         bfd_vma fn, struct absaddr addr)
6941 {
6942   const char *procname;
6943   bfd_vma sym_offset;
6944
6945   if (addr.section == SHN_UNDEF)
6946     addr.offset = fn;
6947
6948   find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
6949                            aux->strtab_size, addr, &procname,
6950                            &sym_offset);
6951
6952   print_vma (fn, PREFIX_HEX);
6953
6954   if (procname)
6955     {
6956       fputs (" <", stdout);
6957       fputs (procname, stdout);
6958
6959       if (sym_offset)
6960         printf ("+0x%lx", (unsigned long) sym_offset);
6961       fputc ('>', stdout);
6962     }
6963
6964   return procname;
6965 }
6966
6967 static void
6968 arm_free_section (struct arm_section *arm_sec)
6969 {
6970   if (arm_sec->data != NULL)
6971     free (arm_sec->data);
6972
6973   if (arm_sec->rela != NULL)
6974     free (arm_sec->rela);
6975 }
6976
6977 /* 1) If SEC does not match the one cached in ARM_SEC, then free the current
6978       cached section and install SEC instead.
6979    2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
6980       and return its valued in * WORDP, relocating if necessary.
6981    3) Update the NEXT_RELA field in ARM_SEC and store the section index and
6982       relocation's offset in ADDR.
6983    4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
6984       into the string table of the symbol associated with the reloc.  If no
6985       reloc was applied store -1 there.
6986    5) Return TRUE upon success, FALSE otherwise.  */
6987
6988 static bfd_boolean
6989 get_unwind_section_word (struct arm_unw_aux_info *  aux,
6990                          struct arm_section *       arm_sec,
6991                          Elf_Internal_Shdr *        sec,
6992                          bfd_vma                    word_offset,
6993                          unsigned int *             wordp,
6994                          struct absaddr *           addr,
6995                          bfd_vma *                  sym_name)
6996 {
6997   Elf_Internal_Rela *rp;
6998   Elf_Internal_Sym *sym;
6999   const char * relname;
7000   unsigned int word;
7001   bfd_boolean wrapped;
7002
7003   if (sec == NULL || arm_sec == NULL)
7004     return FALSE;
7005
7006   addr->section = SHN_UNDEF;
7007   addr->offset = 0;
7008
7009   if (sym_name != NULL)
7010     *sym_name = (bfd_vma) -1;
7011
7012   /* If necessary, update the section cache.  */
7013   if (sec != arm_sec->sec)
7014     {
7015       Elf_Internal_Shdr *relsec;
7016
7017       arm_free_section (arm_sec);
7018
7019       arm_sec->sec = sec;
7020       arm_sec->data = get_data (NULL, aux->file, sec->sh_offset, 1,
7021                                 sec->sh_size, _("unwind data"));
7022       arm_sec->rela = NULL;
7023       arm_sec->nrelas = 0;
7024
7025       for (relsec = section_headers;
7026            relsec < section_headers + elf_header.e_shnum;
7027            ++relsec)
7028         {
7029           if (relsec->sh_info >= elf_header.e_shnum
7030               || section_headers + relsec->sh_info != sec
7031               /* PR 15745: Check the section type as well.  */
7032               || (relsec->sh_type != SHT_REL
7033                   && relsec->sh_type != SHT_RELA))
7034             continue;
7035
7036           arm_sec->rel_type = relsec->sh_type;
7037           if (relsec->sh_type == SHT_REL)
7038             {
7039               if (!slurp_rel_relocs (aux->file, relsec->sh_offset,
7040                                      relsec->sh_size,
7041                                      & arm_sec->rela, & arm_sec->nrelas))
7042                 return FALSE;
7043             }
7044           else /* relsec->sh_type == SHT_RELA */
7045             {
7046               if (!slurp_rela_relocs (aux->file, relsec->sh_offset,
7047                                       relsec->sh_size,
7048                                       & arm_sec->rela, & arm_sec->nrelas))
7049                 return FALSE;
7050             }
7051           break;
7052         }
7053
7054       arm_sec->next_rela = arm_sec->rela;
7055     }
7056
7057   /* If there is no unwind data we can do nothing.  */
7058   if (arm_sec->data == NULL)
7059     return FALSE;
7060
7061   /* If the offset is invalid then fail.  */
7062   if (word_offset > sec->sh_size - 4)
7063     return FALSE;
7064
7065   /* Get the word at the required offset.  */
7066   word = byte_get (arm_sec->data + word_offset, 4);
7067
7068   /* Look through the relocs to find the one that applies to the provided offset.  */
7069   wrapped = FALSE;
7070   for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
7071     {
7072       bfd_vma prelval, offset;
7073
7074       if (rp->r_offset > word_offset && !wrapped)
7075         {
7076           rp = arm_sec->rela;
7077           wrapped = TRUE;
7078         }
7079       if (rp->r_offset > word_offset)
7080         break;
7081
7082       if (rp->r_offset & 3)
7083         {
7084           warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
7085                 (unsigned long) rp->r_offset);
7086           continue;
7087         }
7088
7089       if (rp->r_offset < word_offset)
7090         continue;
7091
7092       /* PR 17531: file: 027-161405-0.004  */
7093       if (aux->symtab == NULL)
7094         continue;
7095
7096       if (arm_sec->rel_type == SHT_REL)
7097         {
7098           offset = word & 0x7fffffff;
7099           if (offset & 0x40000000)
7100             offset |= ~ (bfd_vma) 0x7fffffff;
7101         }
7102       else if (arm_sec->rel_type == SHT_RELA)
7103         offset = rp->r_addend;
7104       else
7105         {
7106           error (_("Unknown section relocation type %d encountered\n"),
7107                  arm_sec->rel_type);
7108           break;
7109         }
7110
7111       /* PR 17531 file: 027-1241568-0.004.  */
7112       if (ELF32_R_SYM (rp->r_info) >= aux->nsyms)
7113         {
7114           error (_("Bad symbol index in unwind relocation (%lu > %lu)\n"),
7115                  (unsigned long) ELF32_R_SYM (rp->r_info), aux->nsyms);
7116           break;
7117         }
7118
7119       sym = aux->symtab + ELF32_R_SYM (rp->r_info);
7120       offset += sym->st_value;
7121       prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
7122
7123       /* Check that we are processing the expected reloc type.  */
7124       if (elf_header.e_machine == EM_ARM)
7125         {
7126           relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
7127           if (relname == NULL)
7128             {
7129               warn (_("Skipping unknown ARM relocation type: %d\n"),
7130                     (int) ELF32_R_TYPE (rp->r_info));
7131               continue;
7132             }
7133
7134           if (streq (relname, "R_ARM_NONE"))
7135               continue;
7136
7137           if (! streq (relname, "R_ARM_PREL31"))
7138             {
7139               warn (_("Skipping unexpected ARM relocation type %s\n"), relname);
7140               continue;
7141             }
7142         }
7143       else if (elf_header.e_machine == EM_TI_C6000)
7144         {
7145           relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
7146           if (relname == NULL)
7147             {
7148               warn (_("Skipping unknown C6000 relocation type: %d\n"),
7149                     (int) ELF32_R_TYPE (rp->r_info));
7150               continue;
7151             }
7152
7153           if (streq (relname, "R_C6000_NONE"))
7154             continue;
7155
7156           if (! streq (relname, "R_C6000_PREL31"))
7157             {
7158               warn (_("Skipping unexpected C6000 relocation type %s\n"), relname);
7159               continue;
7160             }
7161
7162           prelval >>= 1;
7163         }
7164       else
7165         {
7166           /* This function currently only supports ARM and TI unwinders.  */
7167           warn (_("Only TI and ARM unwinders are currently supported\n"));
7168           break;
7169         }
7170
7171       word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
7172       addr->section = sym->st_shndx;
7173       addr->offset = offset;
7174
7175       if (sym_name)
7176         * sym_name = sym->st_name;
7177       break;
7178     }
7179
7180   *wordp = word;
7181   arm_sec->next_rela = rp;
7182
7183   return TRUE;
7184 }
7185
7186 static const char *tic6x_unwind_regnames[16] =
7187 {
7188   "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
7189   "A14", "A13", "A12", "A11", "A10",
7190   "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
7191 };
7192
7193 static void
7194 decode_tic6x_unwind_regmask (unsigned int mask)
7195 {
7196   int i;
7197
7198   for (i = 12; mask; mask >>= 1, i--)
7199     {
7200       if (mask & 1)
7201         {
7202           fputs (tic6x_unwind_regnames[i], stdout);
7203           if (mask > 1)
7204             fputs (", ", stdout);
7205         }
7206     }
7207 }
7208
7209 #define ADVANCE                                                 \
7210   if (remaining == 0 && more_words)                             \
7211     {                                                           \
7212       data_offset += 4;                                         \
7213       if (! get_unwind_section_word (aux, data_arm_sec, data_sec,       \
7214                                      data_offset, & word, & addr, NULL))        \
7215         return;                                                 \
7216       remaining = 4;                                            \
7217       more_words--;                                             \
7218     }                                                           \
7219
7220 #define GET_OP(OP)                      \
7221   ADVANCE;                              \
7222   if (remaining)                        \
7223     {                                   \
7224       remaining--;                      \
7225       (OP) = word >> 24;                \
7226       word <<= 8;                       \
7227     }                                   \
7228   else                                  \
7229     {                                   \
7230       printf (_("[Truncated opcode]\n"));       \
7231       return;                           \
7232     }                                   \
7233   printf ("0x%02x ", OP)
7234
7235 static void
7236 decode_arm_unwind_bytecode (struct arm_unw_aux_info *aux,
7237                             unsigned int word, unsigned int remaining,
7238                             unsigned int more_words,
7239                             bfd_vma data_offset, Elf_Internal_Shdr *data_sec,
7240                             struct arm_section *data_arm_sec)
7241 {
7242   struct absaddr addr;
7243
7244   /* Decode the unwinding instructions.  */
7245   while (1)
7246     {
7247       unsigned int op, op2;
7248
7249       ADVANCE;
7250       if (remaining == 0)
7251         break;
7252       remaining--;
7253       op = word >> 24;
7254       word <<= 8;
7255
7256       printf ("  0x%02x ", op);
7257
7258       if ((op & 0xc0) == 0x00)
7259         {
7260           int offset = ((op & 0x3f) << 2) + 4;
7261
7262           printf ("     vsp = vsp + %d", offset);
7263         }
7264       else if ((op & 0xc0) == 0x40)
7265         {
7266           int offset = ((op & 0x3f) << 2) + 4;
7267
7268           printf ("     vsp = vsp - %d", offset);
7269         }
7270       else if ((op & 0xf0) == 0x80)
7271         {
7272           GET_OP (op2);
7273           if (op == 0x80 && op2 == 0)
7274             printf (_("Refuse to unwind"));
7275           else
7276             {
7277               unsigned int mask = ((op & 0x0f) << 8) | op2;
7278               int first = 1;
7279               int i;
7280
7281               printf ("pop {");
7282               for (i = 0; i < 12; i++)
7283                 if (mask & (1 << i))
7284                   {
7285                     if (first)
7286                       first = 0;
7287                     else
7288                       printf (", ");
7289                     printf ("r%d", 4 + i);
7290                   }
7291               printf ("}");
7292             }
7293         }
7294       else if ((op & 0xf0) == 0x90)
7295         {
7296           if (op == 0x9d || op == 0x9f)
7297             printf (_("     [Reserved]"));
7298           else
7299             printf ("     vsp = r%d", op & 0x0f);
7300         }
7301       else if ((op & 0xf0) == 0xa0)
7302         {
7303           int end = 4 + (op & 0x07);
7304           int first = 1;
7305           int i;
7306
7307           printf ("     pop {");
7308           for (i = 4; i <= end; i++)
7309             {
7310               if (first)
7311                 first = 0;
7312               else
7313                 printf (", ");
7314               printf ("r%d", i);
7315             }
7316           if (op & 0x08)
7317             {
7318               if (!first)
7319                 printf (", ");
7320               printf ("r14");
7321             }
7322           printf ("}");
7323         }
7324       else if (op == 0xb0)
7325         printf (_("     finish"));
7326       else if (op == 0xb1)
7327         {
7328           GET_OP (op2);
7329           if (op2 == 0 || (op2 & 0xf0) != 0)
7330             printf (_("[Spare]"));
7331           else
7332             {
7333               unsigned int mask = op2 & 0x0f;
7334               int first = 1;
7335               int i;
7336
7337               printf ("pop {");
7338               for (i = 0; i < 12; i++)
7339                 if (mask & (1 << i))
7340                   {
7341                     if (first)
7342                       first = 0;
7343                     else
7344                       printf (", ");
7345                     printf ("r%d", i);
7346                   }
7347               printf ("}");
7348             }
7349         }
7350       else if (op == 0xb2)
7351         {
7352           unsigned char buf[9];
7353           unsigned int i, len;
7354           unsigned long offset;
7355
7356           for (i = 0; i < sizeof (buf); i++)
7357             {
7358               GET_OP (buf[i]);
7359               if ((buf[i] & 0x80) == 0)
7360                 break;
7361             }
7362           assert (i < sizeof (buf));
7363           offset = read_uleb128 (buf, &len, buf + i + 1);
7364           assert (len == i + 1);
7365           offset = offset * 4 + 0x204;
7366           printf ("vsp = vsp + %ld", offset);
7367         }
7368       else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
7369         {
7370           unsigned int first, last;
7371
7372           GET_OP (op2);
7373           first = op2 >> 4;
7374           last = op2 & 0x0f;
7375           if (op == 0xc8)
7376             first = first + 16;
7377           printf ("pop {D%d", first);
7378           if (last)
7379             printf ("-D%d", first + last);
7380           printf ("}");
7381         }
7382       else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
7383         {
7384           unsigned int count = op & 0x07;
7385
7386           printf ("pop {D8");
7387           if (count)
7388             printf ("-D%d", 8 + count);
7389           printf ("}");
7390         }
7391       else if (op >= 0xc0 && op <= 0xc5)
7392         {
7393           unsigned int count = op & 0x07;
7394
7395           printf ("     pop {wR10");
7396           if (count)
7397             printf ("-wR%d", 10 + count);
7398           printf ("}");
7399         }
7400       else if (op == 0xc6)
7401         {
7402           unsigned int first, last;
7403
7404           GET_OP (op2);
7405           first = op2 >> 4;
7406           last = op2 & 0x0f;
7407           printf ("pop {wR%d", first);
7408           if (last)
7409             printf ("-wR%d", first + last);
7410           printf ("}");
7411         }
7412       else if (op == 0xc7)
7413         {
7414           GET_OP (op2);
7415           if (op2 == 0 || (op2 & 0xf0) != 0)
7416             printf (_("[Spare]"));
7417           else
7418             {
7419               unsigned int mask = op2 & 0x0f;
7420               int first = 1;
7421               int i;
7422
7423               printf ("pop {");
7424               for (i = 0; i < 4; i++)
7425                 if (mask & (1 << i))
7426                   {
7427                     if (first)
7428                       first = 0;
7429                     else
7430                       printf (", ");
7431                     printf ("wCGR%d", i);
7432                   }
7433               printf ("}");
7434             }
7435         }
7436       else
7437         printf (_("     [unsupported opcode]"));
7438       printf ("\n");
7439     }
7440 }
7441
7442 static void
7443 decode_tic6x_unwind_bytecode (struct arm_unw_aux_info *aux,
7444                             unsigned int word, unsigned int remaining,
7445                             unsigned int more_words,
7446                             bfd_vma data_offset, Elf_Internal_Shdr *data_sec,
7447                             struct arm_section *data_arm_sec)
7448 {
7449   struct absaddr addr;
7450
7451   /* Decode the unwinding instructions.  */
7452   while (1)
7453     {
7454       unsigned int op, op2;
7455
7456       ADVANCE;
7457       if (remaining == 0)
7458         break;
7459       remaining--;
7460       op = word >> 24;
7461       word <<= 8;
7462
7463       printf ("  0x%02x ", op);
7464
7465       if ((op & 0xc0) == 0x00)
7466         {
7467           int offset = ((op & 0x3f) << 3) + 8;
7468           printf ("     sp = sp + %d", offset);
7469         }
7470       else if ((op & 0xc0) == 0x80)
7471         {
7472           GET_OP (op2);
7473           if (op == 0x80 && op2 == 0)
7474             printf (_("Refuse to unwind"));
7475           else
7476             {
7477               unsigned int mask = ((op & 0x1f) << 8) | op2;
7478               if (op & 0x20)
7479                 printf ("pop compact {");
7480               else
7481                 printf ("pop {");
7482
7483               decode_tic6x_unwind_regmask (mask);
7484               printf("}");
7485             }
7486         }
7487       else if ((op & 0xf0) == 0xc0)
7488         {
7489           unsigned int reg;
7490           unsigned int nregs;
7491           unsigned int i;
7492           const char *name;
7493           struct
7494           {
7495               unsigned int offset;
7496               unsigned int reg;
7497           } regpos[16];
7498
7499           /* Scan entire instruction first so that GET_OP output is not
7500              interleaved with disassembly.  */
7501           nregs = 0;
7502           for (i = 0; nregs < (op & 0xf); i++)
7503             {
7504               GET_OP (op2);
7505               reg = op2 >> 4;
7506               if (reg != 0xf)
7507                 {
7508                   regpos[nregs].offset = i * 2;
7509                   regpos[nregs].reg = reg;
7510                   nregs++;
7511                 }
7512
7513               reg = op2 & 0xf;
7514               if (reg != 0xf)
7515                 {
7516                   regpos[nregs].offset = i * 2 + 1;
7517                   regpos[nregs].reg = reg;
7518                   nregs++;
7519                 }
7520             }
7521
7522           printf (_("pop frame {"));
7523           reg = nregs - 1;
7524           for (i = i * 2; i > 0; i--)
7525             {
7526               if (regpos[reg].offset == i - 1)
7527                 {
7528                   name = tic6x_unwind_regnames[regpos[reg].reg];
7529                   if (reg > 0)
7530                     reg--;
7531                 }
7532               else
7533                 name = _("[pad]");
7534
7535               fputs (name, stdout);
7536               if (i > 1)
7537                 printf (", ");
7538             }
7539
7540           printf ("}");
7541         }
7542       else if (op == 0xd0)
7543         printf ("     MOV FP, SP");
7544       else if (op == 0xd1)
7545         printf ("     __c6xabi_pop_rts");
7546       else if (op == 0xd2)
7547         {
7548           unsigned char buf[9];
7549           unsigned int i, len;
7550           unsigned long offset;
7551
7552           for (i = 0; i < sizeof (buf); i++)
7553             {
7554               GET_OP (buf[i]);
7555               if ((buf[i] & 0x80) == 0)
7556                 break;
7557             }
7558           assert (i < sizeof (buf));
7559           offset = read_uleb128 (buf, &len, buf + i + 1);
7560           assert (len == i + 1);
7561           offset = offset * 8 + 0x408;
7562           printf (_("sp = sp + %ld"), offset);
7563         }
7564       else if ((op & 0xf0) == 0xe0)
7565         {
7566           if ((op & 0x0f) == 7)
7567             printf ("     RETURN");
7568           else
7569             printf ("     MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
7570         }
7571       else
7572         {
7573           printf (_("     [unsupported opcode]"));
7574         }
7575       putchar ('\n');
7576     }
7577 }
7578
7579 static bfd_vma
7580 arm_expand_prel31 (bfd_vma word, bfd_vma where)
7581 {
7582   bfd_vma offset;
7583
7584   offset = word & 0x7fffffff;
7585   if (offset & 0x40000000)
7586     offset |= ~ (bfd_vma) 0x7fffffff;
7587
7588   if (elf_header.e_machine == EM_TI_C6000)
7589     offset <<= 1;
7590
7591   return offset + where;
7592 }
7593
7594 static void
7595 decode_arm_unwind (struct arm_unw_aux_info *  aux,
7596                    unsigned int               word,
7597                    unsigned int               remaining,
7598                    bfd_vma                    data_offset,
7599                    Elf_Internal_Shdr *        data_sec,
7600                    struct arm_section *       data_arm_sec)
7601 {
7602   int per_index;
7603   unsigned int more_words = 0;
7604   struct absaddr addr;
7605   bfd_vma sym_name = (bfd_vma) -1;
7606
7607   if (remaining == 0)
7608     {
7609       /* Fetch the first word.
7610          Note - when decoding an object file the address extracted
7611          here will always be 0.  So we also pass in the sym_name
7612          parameter so that we can find the symbol associated with
7613          the personality routine.  */
7614       if (! get_unwind_section_word (aux, data_arm_sec, data_sec, data_offset,
7615                                      & word, & addr, & sym_name))
7616         return;
7617
7618       remaining = 4;
7619     }
7620
7621   if ((word & 0x80000000) == 0)
7622     {
7623       /* Expand prel31 for personality routine.  */
7624       bfd_vma fn;
7625       const char *procname;
7626
7627       fn = arm_expand_prel31 (word, data_sec->sh_addr + data_offset);
7628       printf (_("  Personality routine: "));
7629       if (fn == 0
7630           && addr.section == SHN_UNDEF && addr.offset == 0
7631           && sym_name != (bfd_vma) -1 && sym_name < aux->strtab_size)
7632         {
7633           procname = aux->strtab + sym_name;
7634           print_vma (fn, PREFIX_HEX);
7635           if (procname)
7636             {
7637               fputs (" <", stdout);
7638               fputs (procname, stdout);
7639               fputc ('>', stdout);
7640             }
7641         }
7642       else
7643         procname = arm_print_vma_and_name (aux, fn, addr);
7644       fputc ('\n', stdout);
7645
7646       /* The GCC personality routines use the standard compact
7647          encoding, starting with one byte giving the number of
7648          words.  */
7649       if (procname != NULL
7650           && (const_strneq (procname, "__gcc_personality_v0")
7651               || const_strneq (procname, "__gxx_personality_v0")
7652               || const_strneq (procname, "__gcj_personality_v0")
7653               || const_strneq (procname, "__gnu_objc_personality_v0")))
7654         {
7655           remaining = 0;
7656           more_words = 1;
7657           ADVANCE;
7658           if (!remaining)
7659             {
7660               printf (_("  [Truncated data]\n"));
7661               return;
7662             }
7663           more_words = word >> 24;
7664           word <<= 8;
7665           remaining--;
7666           per_index = -1;
7667         }
7668       else
7669         return;
7670     }
7671   else
7672     {
7673       /* ARM EHABI Section 6.3:
7674
7675          An exception-handling table entry for the compact model looks like:
7676
7677            31 30-28 27-24 23-0
7678            -- ----- ----- ----
7679             1   0   index Data for personalityRoutine[index]    */
7680
7681       if (elf_header.e_machine == EM_ARM
7682           && (word & 0x70000000))
7683         warn (_("Corrupt ARM compact model table entry: %x \n"), word);
7684
7685       per_index = (word >> 24) & 0x7f;
7686       printf (_("  Compact model index: %d\n"), per_index);
7687       if (per_index == 0)
7688         {
7689           more_words = 0;
7690           word <<= 8;
7691           remaining--;
7692         }
7693       else if (per_index < 3)
7694         {
7695           more_words = (word >> 16) & 0xff;
7696           word <<= 16;
7697           remaining -= 2;
7698         }
7699     }
7700
7701   switch (elf_header.e_machine)
7702     {
7703     case EM_ARM:
7704       if (per_index < 3)
7705         {
7706           decode_arm_unwind_bytecode (aux, word, remaining, more_words,
7707                                       data_offset, data_sec, data_arm_sec);
7708         }
7709       else
7710         {
7711           warn (_("Unknown ARM compact model index encountered\n"));
7712           printf (_("  [reserved]\n"));
7713         }
7714       break;
7715
7716     case EM_TI_C6000:
7717       if (per_index < 3)
7718         {
7719           decode_tic6x_unwind_bytecode (aux, word, remaining, more_words,
7720                                         data_offset, data_sec, data_arm_sec);
7721         }
7722       else if (per_index < 5)
7723         {
7724           if (((word >> 17) & 0x7f) == 0x7f)
7725             printf (_("  Restore stack from frame pointer\n"));
7726           else
7727             printf (_("  Stack increment %d\n"), (word >> 14) & 0x1fc);
7728           printf (_("  Registers restored: "));
7729           if (per_index == 4)
7730             printf (" (compact) ");
7731           decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
7732           putchar ('\n');
7733           printf (_("  Return register: %s\n"),
7734                   tic6x_unwind_regnames[word & 0xf]);
7735         }
7736       else
7737         printf (_("  [reserved (%d)]\n"), per_index);
7738       break;
7739
7740     default:
7741       error (_("Unsupported architecture type %d encountered when decoding unwind table\n"),
7742              elf_header.e_machine);
7743     }
7744
7745   /* Decode the descriptors.  Not implemented.  */
7746 }
7747
7748 static void
7749 dump_arm_unwind (struct arm_unw_aux_info *aux, Elf_Internal_Shdr *exidx_sec)
7750 {
7751   struct arm_section exidx_arm_sec, extab_arm_sec;
7752   unsigned int i, exidx_len;
7753
7754   memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
7755   memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
7756   exidx_len = exidx_sec->sh_size / 8;
7757
7758   for (i = 0; i < exidx_len; i++)
7759     {
7760       unsigned int exidx_fn, exidx_entry;
7761       struct absaddr fn_addr, entry_addr;
7762       bfd_vma fn;
7763
7764       fputc ('\n', stdout);
7765
7766       if (! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
7767                                      8 * i, & exidx_fn, & fn_addr, NULL)
7768           || ! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
7769                                         8 * i + 4, & exidx_entry, & entry_addr, NULL))
7770         {
7771           arm_free_section (& exidx_arm_sec);
7772           arm_free_section (& extab_arm_sec);
7773           return;
7774         }
7775
7776       /* ARM EHABI, Section 5:
7777          An index table entry consists of 2 words.
7778          The first word contains a prel31 offset to the start of a function, with bit 31 clear.  */
7779       if (exidx_fn & 0x80000000)
7780         warn (_("corrupt index table entry: %x\n"), exidx_fn);
7781
7782       fn = arm_expand_prel31 (exidx_fn, exidx_sec->sh_addr + 8 * i);
7783
7784       arm_print_vma_and_name (aux, fn, fn_addr);
7785       fputs (": ", stdout);
7786
7787       if (exidx_entry == 1)
7788         {
7789           print_vma (exidx_entry, PREFIX_HEX);
7790           fputs (" [cantunwind]\n", stdout);
7791         }
7792       else if (exidx_entry & 0x80000000)
7793         {
7794           print_vma (exidx_entry, PREFIX_HEX);
7795           fputc ('\n', stdout);
7796           decode_arm_unwind (aux, exidx_entry, 4, 0, NULL, NULL);
7797         }
7798       else
7799         {
7800           bfd_vma table, table_offset = 0;
7801           Elf_Internal_Shdr *table_sec;
7802
7803           fputs ("@", stdout);
7804           table = arm_expand_prel31 (exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
7805           print_vma (table, PREFIX_HEX);
7806           printf ("\n");
7807
7808           /* Locate the matching .ARM.extab.  */
7809           if (entry_addr.section != SHN_UNDEF
7810               && entry_addr.section < elf_header.e_shnum)
7811             {
7812               table_sec = section_headers + entry_addr.section;
7813               table_offset = entry_addr.offset;
7814             }
7815           else
7816             {
7817               table_sec = find_section_by_address (table);
7818               if (table_sec != NULL)
7819                 table_offset = table - table_sec->sh_addr;
7820             }
7821           if (table_sec == NULL)
7822             {
7823               warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
7824                     (unsigned long) table);
7825               continue;
7826             }
7827           decode_arm_unwind (aux, 0, 0, table_offset, table_sec,
7828                              &extab_arm_sec);
7829         }
7830     }
7831
7832   printf ("\n");
7833
7834   arm_free_section (&exidx_arm_sec);
7835   arm_free_section (&extab_arm_sec);
7836 }
7837
7838 /* Used for both ARM and C6X unwinding tables.  */
7839
7840 static void
7841 arm_process_unwind (FILE *file)
7842 {
7843   struct arm_unw_aux_info aux;
7844   Elf_Internal_Shdr *unwsec = NULL;
7845   Elf_Internal_Shdr *strsec;
7846   Elf_Internal_Shdr *sec;
7847   unsigned long i;
7848   unsigned int sec_type;
7849
7850   switch (elf_header.e_machine)
7851     {
7852     case EM_ARM:
7853       sec_type = SHT_ARM_EXIDX;
7854       break;
7855
7856     case EM_TI_C6000:
7857       sec_type = SHT_C6000_UNWIND;
7858       break;
7859
7860     default:
7861       error (_("Unsupported architecture type %d encountered when processing unwind table\n"),
7862              elf_header.e_machine);
7863       return;
7864     }
7865
7866   if (string_table == NULL)
7867     return;
7868
7869   memset (& aux, 0, sizeof (aux));
7870   aux.file = file;
7871
7872   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7873     {
7874       if (sec->sh_type == SHT_SYMTAB && sec->sh_link < elf_header.e_shnum)
7875         {
7876           aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
7877
7878           strsec = section_headers + sec->sh_link;
7879
7880           /* PR binutils/17531 file: 011-12666-0.004.  */
7881           if (aux.strtab != NULL)
7882             {
7883               warn (_("Multiple string tables found in file.\n"));
7884               free (aux.strtab);
7885             }
7886           aux.strtab = get_data (NULL, file, strsec->sh_offset,
7887                                  1, strsec->sh_size, _("string table"));
7888           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7889         }
7890       else if (sec->sh_type == sec_type)
7891         unwsec = sec;
7892     }
7893
7894   if (unwsec == NULL)
7895     printf (_("\nThere are no unwind sections in this file.\n"));
7896   else
7897     for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7898       {
7899         if (sec->sh_type == sec_type)
7900           {
7901             printf (_("\nUnwind table index '%s' at offset 0x%lx contains %lu entries:\n"),
7902                     printable_section_name (sec),
7903                     (unsigned long) sec->sh_offset,
7904                     (unsigned long) (sec->sh_size / (2 * eh_addr_size)));
7905
7906             dump_arm_unwind (&aux, sec);
7907           }
7908       }
7909
7910   if (aux.symtab)
7911     free (aux.symtab);
7912   if (aux.strtab)
7913     free ((char *) aux.strtab);
7914 }
7915
7916 static void
7917 process_unwind (FILE * file)
7918 {
7919   struct unwind_handler
7920   {
7921     int machtype;
7922     void (* handler)(FILE *);
7923   } handlers[] =
7924   {
7925     { EM_ARM, arm_process_unwind },
7926     { EM_IA_64, ia64_process_unwind },
7927     { EM_PARISC, hppa_process_unwind },
7928     { EM_TI_C6000, arm_process_unwind },
7929     { 0, 0 }
7930   };
7931   int i;
7932
7933   if (!do_unwind)
7934     return;
7935
7936   for (i = 0; handlers[i].handler != NULL; i++)
7937     if (elf_header.e_machine == handlers[i].machtype)
7938       {
7939         handlers[i].handler (file);
7940         return;
7941       }
7942
7943   printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
7944           get_machine_name (elf_header.e_machine));
7945 }
7946
7947 static void
7948 dynamic_section_mips_val (Elf_Internal_Dyn * entry)
7949 {
7950   switch (entry->d_tag)
7951     {
7952     case DT_MIPS_FLAGS:
7953       if (entry->d_un.d_val == 0)
7954         printf (_("NONE"));
7955       else
7956         {
7957           static const char * opts[] =
7958           {
7959             "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
7960             "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
7961             "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
7962             "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
7963             "RLD_ORDER_SAFE"
7964           };
7965           unsigned int cnt;
7966           int first = 1;
7967
7968           for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
7969             if (entry->d_un.d_val & (1 << cnt))
7970               {
7971                 printf ("%s%s", first ? "" : " ", opts[cnt]);
7972                 first = 0;
7973               }
7974         }
7975       break;
7976
7977     case DT_MIPS_IVERSION:
7978       if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
7979         printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry->d_un.d_val));
7980       else
7981         {
7982           char buf[40];
7983           sprintf_vma (buf, entry->d_un.d_ptr);
7984           /* Note: coded this way so that there is a single string for translation.  */
7985           printf (_("<corrupt: %s>"), buf);
7986         }
7987       break;
7988
7989     case DT_MIPS_TIME_STAMP:
7990       {
7991         char timebuf[20];
7992         struct tm * tmp;
7993
7994         time_t atime = entry->d_un.d_val;
7995         tmp = gmtime (&atime);
7996         snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
7997                   tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
7998                   tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
7999         printf (_("Time Stamp: %s"), timebuf);
8000       }
8001       break;
8002
8003     case DT_MIPS_RLD_VERSION:
8004     case DT_MIPS_LOCAL_GOTNO:
8005     case DT_MIPS_CONFLICTNO:
8006     case DT_MIPS_LIBLISTNO:
8007     case DT_MIPS_SYMTABNO:
8008     case DT_MIPS_UNREFEXTNO:
8009     case DT_MIPS_HIPAGENO:
8010     case DT_MIPS_DELTA_CLASS_NO:
8011     case DT_MIPS_DELTA_INSTANCE_NO:
8012     case DT_MIPS_DELTA_RELOC_NO:
8013     case DT_MIPS_DELTA_SYM_NO:
8014     case DT_MIPS_DELTA_CLASSSYM_NO:
8015     case DT_MIPS_COMPACT_SIZE:
8016       print_vma (entry->d_un.d_ptr, DEC);
8017       break;
8018
8019     default:
8020       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8021     }
8022     putchar ('\n');
8023 }
8024
8025 static void
8026 dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
8027 {
8028   switch (entry->d_tag)
8029     {
8030     case DT_HP_DLD_FLAGS:
8031       {
8032         static struct
8033         {
8034           long int bit;
8035           const char * str;
8036         }
8037         flags[] =
8038         {
8039           { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
8040           { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
8041           { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
8042           { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
8043           { DT_HP_BIND_NOW, "HP_BIND_NOW" },
8044           { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
8045           { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
8046           { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
8047           { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
8048           { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
8049           { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
8050           { DT_HP_GST, "HP_GST" },
8051           { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
8052           { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
8053           { DT_HP_NODELETE, "HP_NODELETE" },
8054           { DT_HP_GROUP, "HP_GROUP" },
8055           { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
8056         };
8057         int first = 1;
8058         size_t cnt;
8059         bfd_vma val = entry->d_un.d_val;
8060
8061         for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
8062           if (val & flags[cnt].bit)
8063             {
8064               if (! first)
8065                 putchar (' ');
8066               fputs (flags[cnt].str, stdout);
8067               first = 0;
8068               val ^= flags[cnt].bit;
8069             }
8070
8071         if (val != 0 || first)
8072           {
8073             if (! first)
8074               putchar (' ');
8075             print_vma (val, HEX);
8076           }
8077       }
8078       break;
8079
8080     default:
8081       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8082       break;
8083     }
8084   putchar ('\n');
8085 }
8086
8087 #ifdef BFD64
8088
8089 /* VMS vs Unix time offset and factor.  */
8090
8091 #define VMS_EPOCH_OFFSET 35067168000000000LL
8092 #define VMS_GRANULARITY_FACTOR 10000000
8093
8094 /* Display a VMS time in a human readable format.  */
8095
8096 static void
8097 print_vms_time (bfd_int64_t vmstime)
8098 {
8099   struct tm *tm;
8100   time_t unxtime;
8101
8102   unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
8103   tm = gmtime (&unxtime);
8104   printf ("%04u-%02u-%02uT%02u:%02u:%02u",
8105           tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
8106           tm->tm_hour, tm->tm_min, tm->tm_sec);
8107 }
8108 #endif /* BFD64 */
8109
8110 static void
8111 dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
8112 {
8113   switch (entry->d_tag)
8114     {
8115     case DT_IA_64_PLT_RESERVE:
8116       /* First 3 slots reserved.  */
8117       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8118       printf (" -- ");
8119       print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
8120       break;
8121
8122     case DT_IA_64_VMS_LINKTIME:
8123 #ifdef BFD64
8124       print_vms_time (entry->d_un.d_val);
8125 #endif
8126       break;
8127
8128     case DT_IA_64_VMS_LNKFLAGS:
8129       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8130       if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
8131         printf (" CALL_DEBUG");
8132       if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
8133         printf (" NOP0BUFS");
8134       if (entry->d_un.d_val & VMS_LF_P0IMAGE)
8135         printf (" P0IMAGE");
8136       if (entry->d_un.d_val & VMS_LF_MKTHREADS)
8137         printf (" MKTHREADS");
8138       if (entry->d_un.d_val & VMS_LF_UPCALLS)
8139         printf (" UPCALLS");
8140       if (entry->d_un.d_val & VMS_LF_IMGSTA)
8141         printf (" IMGSTA");
8142       if (entry->d_un.d_val & VMS_LF_INITIALIZE)
8143         printf (" INITIALIZE");
8144       if (entry->d_un.d_val & VMS_LF_MAIN)
8145         printf (" MAIN");
8146       if (entry->d_un.d_val & VMS_LF_EXE_INIT)
8147         printf (" EXE_INIT");
8148       if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
8149         printf (" TBK_IN_IMG");
8150       if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
8151         printf (" DBG_IN_IMG");
8152       if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
8153         printf (" TBK_IN_DSF");
8154       if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
8155         printf (" DBG_IN_DSF");
8156       if (entry->d_un.d_val & VMS_LF_SIGNATURES)
8157         printf (" SIGNATURES");
8158       if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
8159         printf (" REL_SEG_OFF");
8160       break;
8161
8162     default:
8163       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8164       break;
8165     }
8166   putchar ('\n');
8167 }
8168
8169 static int
8170 get_32bit_dynamic_section (FILE * file)
8171 {
8172   Elf32_External_Dyn * edyn;
8173   Elf32_External_Dyn * ext;
8174   Elf_Internal_Dyn * entry;
8175
8176   edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
8177                                           dynamic_size, _("dynamic section"));
8178   if (!edyn)
8179     return 0;
8180
8181   /* SGI's ELF has more than one section in the DYNAMIC segment, and we
8182      might not have the luxury of section headers.  Look for the DT_NULL
8183      terminator to determine the number of entries.  */
8184   for (ext = edyn, dynamic_nent = 0;
8185        (char *) ext < (char *) edyn + dynamic_size - sizeof (* entry);
8186        ext++)
8187     {
8188       dynamic_nent++;
8189       if (BYTE_GET (ext->d_tag) == DT_NULL)
8190         break;
8191     }
8192
8193   dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
8194                                                   sizeof (* entry));
8195   if (dynamic_section == NULL)
8196     {
8197       error (_("Out of memory\n"));
8198       free (edyn);
8199       return 0;
8200     }
8201
8202   for (ext = edyn, entry = dynamic_section;
8203        entry < dynamic_section + dynamic_nent;
8204        ext++, entry++)
8205     {
8206       entry->d_tag      = BYTE_GET (ext->d_tag);
8207       entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
8208     }
8209
8210   free (edyn);
8211
8212   return 1;
8213 }
8214
8215 static int
8216 get_64bit_dynamic_section (FILE * file)
8217 {
8218   Elf64_External_Dyn * edyn;
8219   Elf64_External_Dyn * ext;
8220   Elf_Internal_Dyn * entry;
8221
8222   /* Read in the data.  */
8223   edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
8224                                           dynamic_size, _("dynamic section"));
8225   if (!edyn)
8226     return 0;
8227
8228   /* SGI's ELF has more than one section in the DYNAMIC segment, and we
8229      might not have the luxury of section headers.  Look for the DT_NULL
8230      terminator to determine the number of entries.  */
8231   for (ext = edyn, dynamic_nent = 0;
8232        /* PR 17533 file: 033-67080-0.004 - do not read off the end of the buffer.  */
8233        (char *) ext < ((char *) edyn) + dynamic_size - sizeof (* ext);
8234        ext++)
8235     {
8236       dynamic_nent++;
8237       if (BYTE_GET (ext->d_tag) == DT_NULL)
8238         break;
8239     }
8240
8241   dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
8242                                                   sizeof (* entry));
8243   if (dynamic_section == NULL)
8244     {
8245       error (_("Out of memory\n"));
8246       free (edyn);
8247       return 0;
8248     }
8249
8250   /* Convert from external to internal formats.  */
8251   for (ext = edyn, entry = dynamic_section;
8252        entry < dynamic_section + dynamic_nent;
8253        ext++, entry++)
8254     {
8255       entry->d_tag      = BYTE_GET (ext->d_tag);
8256       entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
8257     }
8258
8259   free (edyn);
8260
8261   return 1;
8262 }
8263
8264 static void
8265 print_dynamic_flags (bfd_vma flags)
8266 {
8267   int first = 1;
8268
8269   while (flags)
8270     {
8271       bfd_vma flag;
8272
8273       flag = flags & - flags;
8274       flags &= ~ flag;
8275
8276       if (first)
8277         first = 0;
8278       else
8279         putc (' ', stdout);
8280
8281       switch (flag)
8282         {
8283         case DF_ORIGIN:         fputs ("ORIGIN", stdout); break;
8284         case DF_SYMBOLIC:       fputs ("SYMBOLIC", stdout); break;
8285         case DF_TEXTREL:        fputs ("TEXTREL", stdout); break;
8286         case DF_BIND_NOW:       fputs ("BIND_NOW", stdout); break;
8287         case DF_STATIC_TLS:     fputs ("STATIC_TLS", stdout); break;
8288         default:                fputs (_("unknown"), stdout); break;
8289         }
8290     }
8291   puts ("");
8292 }
8293
8294 /* Parse and display the contents of the dynamic section.  */
8295
8296 static int
8297 process_dynamic_section (FILE * file)
8298 {
8299   Elf_Internal_Dyn * entry;
8300
8301   if (dynamic_size == 0)
8302     {
8303       if (do_dynamic)
8304         printf (_("\nThere is no dynamic section in this file.\n"));
8305
8306       return 1;
8307     }
8308
8309   if (is_32bit_elf)
8310     {
8311       if (! get_32bit_dynamic_section (file))
8312         return 0;
8313     }
8314   else if (! get_64bit_dynamic_section (file))
8315     return 0;
8316
8317   /* Find the appropriate symbol table.  */
8318   if (dynamic_symbols == NULL)
8319     {
8320       for (entry = dynamic_section;
8321            entry < dynamic_section + dynamic_nent;
8322            ++entry)
8323         {
8324           Elf_Internal_Shdr section;
8325
8326           if (entry->d_tag != DT_SYMTAB)
8327             continue;
8328
8329           dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
8330
8331           /* Since we do not know how big the symbol table is,
8332              we default to reading in the entire file (!) and
8333              processing that.  This is overkill, I know, but it
8334              should work.  */
8335           section.sh_offset = offset_from_vma (file, entry->d_un.d_val, 0);
8336
8337           if (archive_file_offset != 0)
8338             section.sh_size = archive_file_size - section.sh_offset;
8339           else
8340             {
8341               if (fseek (file, 0, SEEK_END))
8342                 error (_("Unable to seek to end of file!\n"));
8343
8344               section.sh_size = ftell (file) - section.sh_offset;
8345             }
8346
8347           if (is_32bit_elf)
8348             section.sh_entsize = sizeof (Elf32_External_Sym);
8349           else
8350             section.sh_entsize = sizeof (Elf64_External_Sym);
8351           section.sh_name = string_table_length;
8352
8353           dynamic_symbols = GET_ELF_SYMBOLS (file, &section, & num_dynamic_syms);
8354           if (num_dynamic_syms < 1)
8355             {
8356               error (_("Unable to determine the number of symbols to load\n"));
8357               continue;
8358             }
8359         }
8360     }
8361
8362   /* Similarly find a string table.  */
8363   if (dynamic_strings == NULL)
8364     {
8365       for (entry = dynamic_section;
8366            entry < dynamic_section + dynamic_nent;
8367            ++entry)
8368         {
8369           unsigned long offset;
8370           long str_tab_len;
8371
8372           if (entry->d_tag != DT_STRTAB)
8373             continue;
8374
8375           dynamic_info[DT_STRTAB] = entry->d_un.d_val;
8376
8377           /* Since we do not know how big the string table is,
8378              we default to reading in the entire file (!) and
8379              processing that.  This is overkill, I know, but it
8380              should work.  */
8381
8382           offset = offset_from_vma (file, entry->d_un.d_val, 0);
8383
8384           if (archive_file_offset != 0)
8385             str_tab_len = archive_file_size - offset;
8386           else
8387             {
8388               if (fseek (file, 0, SEEK_END))
8389                 error (_("Unable to seek to end of file\n"));
8390               str_tab_len = ftell (file) - offset;
8391             }
8392
8393           if (str_tab_len < 1)
8394             {
8395               error
8396                 (_("Unable to determine the length of the dynamic string table\n"));
8397               continue;
8398             }
8399
8400           dynamic_strings = (char *) get_data (NULL, file, offset, 1,
8401                                                str_tab_len,
8402                                                _("dynamic string table"));
8403           dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
8404           break;
8405         }
8406     }
8407
8408   /* And find the syminfo section if available.  */
8409   if (dynamic_syminfo == NULL)
8410     {
8411       unsigned long syminsz = 0;
8412
8413       for (entry = dynamic_section;
8414            entry < dynamic_section + dynamic_nent;
8415            ++entry)
8416         {
8417           if (entry->d_tag == DT_SYMINENT)
8418             {
8419               /* Note: these braces are necessary to avoid a syntax
8420                  error from the SunOS4 C compiler.  */
8421               /* PR binutils/17531: A corrupt file can trigger this test.
8422                  So do not use an assert, instead generate an error message.  */
8423               if (sizeof (Elf_External_Syminfo) != entry->d_un.d_val)
8424                 error (_("Bad value (%d) for SYMINENT entry\n"),
8425                        (int) entry->d_un.d_val);
8426             }
8427           else if (entry->d_tag == DT_SYMINSZ)
8428             syminsz = entry->d_un.d_val;
8429           else if (entry->d_tag == DT_SYMINFO)
8430             dynamic_syminfo_offset = offset_from_vma (file, entry->d_un.d_val,
8431                                                       syminsz);
8432         }
8433
8434       if (dynamic_syminfo_offset != 0 && syminsz != 0)
8435         {
8436           Elf_External_Syminfo * extsyminfo;
8437           Elf_External_Syminfo * extsym;
8438           Elf_Internal_Syminfo * syminfo;
8439
8440           /* There is a syminfo section.  Read the data.  */
8441           extsyminfo = (Elf_External_Syminfo *)
8442               get_data (NULL, file, dynamic_syminfo_offset, 1, syminsz,
8443                         _("symbol information"));
8444           if (!extsyminfo)
8445             return 0;
8446
8447           dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
8448           if (dynamic_syminfo == NULL)
8449             {
8450               error (_("Out of memory\n"));
8451               return 0;
8452             }
8453
8454           dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
8455           for (syminfo = dynamic_syminfo, extsym = extsyminfo;
8456                syminfo < dynamic_syminfo + dynamic_syminfo_nent;
8457                ++syminfo, ++extsym)
8458             {
8459               syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
8460               syminfo->si_flags = BYTE_GET (extsym->si_flags);
8461             }
8462
8463           free (extsyminfo);
8464         }
8465     }
8466
8467   if (do_dynamic && dynamic_addr)
8468     printf (_("\nDynamic section at offset 0x%lx contains %u entries:\n"),
8469             dynamic_addr, dynamic_nent);
8470   if (do_dynamic)
8471     printf (_("  Tag        Type                         Name/Value\n"));
8472
8473   for (entry = dynamic_section;
8474        entry < dynamic_section + dynamic_nent;
8475        entry++)
8476     {
8477       if (do_dynamic)
8478         {
8479           const char * dtype;
8480
8481           putchar (' ');
8482           print_vma (entry->d_tag, FULL_HEX);
8483           dtype = get_dynamic_type (entry->d_tag);
8484           printf (" (%s)%*s", dtype,
8485                   ((is_32bit_elf ? 27 : 19)
8486                    - (int) strlen (dtype)),
8487                   " ");
8488         }
8489
8490       switch (entry->d_tag)
8491         {
8492         case DT_FLAGS:
8493           if (do_dynamic)
8494             print_dynamic_flags (entry->d_un.d_val);
8495           break;
8496
8497         case DT_AUXILIARY:
8498         case DT_FILTER:
8499         case DT_CONFIG:
8500         case DT_DEPAUDIT:
8501         case DT_AUDIT:
8502           if (do_dynamic)
8503             {
8504               switch (entry->d_tag)
8505                 {
8506                 case DT_AUXILIARY:
8507                   printf (_("Auxiliary library"));
8508                   break;
8509
8510                 case DT_FILTER:
8511                   printf (_("Filter library"));
8512                   break;
8513
8514                 case DT_CONFIG:
8515                   printf (_("Configuration file"));
8516                   break;
8517
8518                 case DT_DEPAUDIT:
8519                   printf (_("Dependency audit library"));
8520                   break;
8521
8522                 case DT_AUDIT:
8523                   printf (_("Audit library"));
8524                   break;
8525                 }
8526
8527               if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
8528                 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
8529               else
8530                 {
8531                   printf (": ");
8532                   print_vma (entry->d_un.d_val, PREFIX_HEX);
8533                   putchar ('\n');
8534                 }
8535             }
8536           break;
8537
8538         case DT_FEATURE:
8539           if (do_dynamic)
8540             {
8541               printf (_("Flags:"));
8542
8543               if (entry->d_un.d_val == 0)
8544                 printf (_(" None\n"));
8545               else
8546                 {
8547                   unsigned long int val = entry->d_un.d_val;
8548
8549                   if (val & DTF_1_PARINIT)
8550                     {
8551                       printf (" PARINIT");
8552                       val ^= DTF_1_PARINIT;
8553                     }
8554                   if (val & DTF_1_CONFEXP)
8555                     {
8556                       printf (" CONFEXP");
8557                       val ^= DTF_1_CONFEXP;
8558                     }
8559                   if (val != 0)
8560                     printf (" %lx", val);
8561                   puts ("");
8562                 }
8563             }
8564           break;
8565
8566         case DT_POSFLAG_1:
8567           if (do_dynamic)
8568             {
8569               printf (_("Flags:"));
8570
8571               if (entry->d_un.d_val == 0)
8572                 printf (_(" None\n"));
8573               else
8574                 {
8575                   unsigned long int val = entry->d_un.d_val;
8576
8577                   if (val & DF_P1_LAZYLOAD)
8578                     {
8579                       printf (" LAZYLOAD");
8580                       val ^= DF_P1_LAZYLOAD;
8581                     }
8582                   if (val & DF_P1_GROUPPERM)
8583                     {
8584                       printf (" GROUPPERM");
8585                       val ^= DF_P1_GROUPPERM;
8586                     }
8587                   if (val != 0)
8588                     printf (" %lx", val);
8589                   puts ("");
8590                 }
8591             }
8592           break;
8593
8594         case DT_FLAGS_1:
8595           if (do_dynamic)
8596             {
8597               printf (_("Flags:"));
8598               if (entry->d_un.d_val == 0)
8599                 printf (_(" None\n"));
8600               else
8601                 {
8602                   unsigned long int val = entry->d_un.d_val;
8603
8604                   if (val & DF_1_NOW)
8605                     {
8606                       printf (" NOW");
8607                       val ^= DF_1_NOW;
8608                     }
8609                   if (val & DF_1_GLOBAL)
8610                     {
8611                       printf (" GLOBAL");
8612                       val ^= DF_1_GLOBAL;
8613                     }
8614                   if (val & DF_1_GROUP)
8615                     {
8616                       printf (" GROUP");
8617                       val ^= DF_1_GROUP;
8618                     }
8619                   if (val & DF_1_NODELETE)
8620                     {
8621                       printf (" NODELETE");
8622                       val ^= DF_1_NODELETE;
8623                     }
8624                   if (val & DF_1_LOADFLTR)
8625                     {
8626                       printf (" LOADFLTR");
8627                       val ^= DF_1_LOADFLTR;
8628                     }
8629                   if (val & DF_1_INITFIRST)
8630                     {
8631                       printf (" INITFIRST");
8632                       val ^= DF_1_INITFIRST;
8633                     }
8634                   if (val & DF_1_NOOPEN)
8635                     {
8636                       printf (" NOOPEN");
8637                       val ^= DF_1_NOOPEN;
8638                     }
8639                   if (val & DF_1_ORIGIN)
8640                     {
8641                       printf (" ORIGIN");
8642                       val ^= DF_1_ORIGIN;
8643                     }
8644                   if (val & DF_1_DIRECT)
8645                     {
8646                       printf (" DIRECT");
8647                       val ^= DF_1_DIRECT;
8648                     }
8649                   if (val & DF_1_TRANS)
8650                     {
8651                       printf (" TRANS");
8652                       val ^= DF_1_TRANS;
8653                     }
8654                   if (val & DF_1_INTERPOSE)
8655                     {
8656                       printf (" INTERPOSE");
8657                       val ^= DF_1_INTERPOSE;
8658                     }
8659                   if (val & DF_1_NODEFLIB)
8660                     {
8661                       printf (" NODEFLIB");
8662                       val ^= DF_1_NODEFLIB;
8663                     }
8664                   if (val & DF_1_NODUMP)
8665                     {
8666                       printf (" NODUMP");
8667                       val ^= DF_1_NODUMP;
8668                     }
8669                   if (val & DF_1_CONFALT)
8670                     {
8671                       printf (" CONFALT");
8672                       val ^= DF_1_CONFALT;
8673                     }
8674                   if (val & DF_1_ENDFILTEE)
8675                     {
8676                       printf (" ENDFILTEE");
8677                       val ^= DF_1_ENDFILTEE;
8678                     }
8679                   if (val & DF_1_DISPRELDNE)
8680                     {
8681                       printf (" DISPRELDNE");
8682                       val ^= DF_1_DISPRELDNE;
8683                     }
8684                   if (val & DF_1_DISPRELPND)
8685                     {
8686                       printf (" DISPRELPND");
8687                       val ^= DF_1_DISPRELPND;
8688                     }
8689                   if (val & DF_1_NODIRECT)
8690                     {
8691                       printf (" NODIRECT");
8692                       val ^= DF_1_NODIRECT;
8693                     }
8694                   if (val & DF_1_IGNMULDEF)
8695                     {
8696                       printf (" IGNMULDEF");
8697                       val ^= DF_1_IGNMULDEF;
8698                     }
8699                   if (val & DF_1_NOKSYMS)
8700                     {
8701                       printf (" NOKSYMS");
8702                       val ^= DF_1_NOKSYMS;
8703                     }
8704                   if (val & DF_1_NOHDR)
8705                     {
8706                       printf (" NOHDR");
8707                       val ^= DF_1_NOHDR;
8708                     }
8709                   if (val & DF_1_EDITED)
8710                     {
8711                       printf (" EDITED");
8712                       val ^= DF_1_EDITED;
8713                     }
8714                   if (val & DF_1_NORELOC)
8715                     {
8716                       printf (" NORELOC");
8717                       val ^= DF_1_NORELOC;
8718                     }
8719                   if (val & DF_1_SYMINTPOSE)
8720                     {
8721                       printf (" SYMINTPOSE");
8722                       val ^= DF_1_SYMINTPOSE;
8723                     }
8724                   if (val & DF_1_GLOBAUDIT)
8725                     {
8726                       printf (" GLOBAUDIT");
8727                       val ^= DF_1_GLOBAUDIT;
8728                     }
8729                   if (val & DF_1_SINGLETON)
8730                     {
8731                       printf (" SINGLETON");
8732                       val ^= DF_1_SINGLETON;
8733                     }
8734                   if (val != 0)
8735                     printf (" %lx", val);
8736                   puts ("");
8737                 }
8738             }
8739           break;
8740
8741         case DT_PLTREL:
8742           dynamic_info[entry->d_tag] = entry->d_un.d_val;
8743           if (do_dynamic)
8744             puts (get_dynamic_type (entry->d_un.d_val));
8745           break;
8746
8747         case DT_NULL    :
8748         case DT_NEEDED  :
8749         case DT_PLTGOT  :
8750         case DT_HASH    :
8751         case DT_STRTAB  :
8752         case DT_SYMTAB  :
8753         case DT_RELA    :
8754         case DT_INIT    :
8755         case DT_FINI    :
8756         case DT_SONAME  :
8757         case DT_RPATH   :
8758         case DT_SYMBOLIC:
8759         case DT_REL     :
8760         case DT_DEBUG   :
8761         case DT_TEXTREL :
8762         case DT_JMPREL  :
8763         case DT_RUNPATH :
8764           dynamic_info[entry->d_tag] = entry->d_un.d_val;
8765
8766           if (do_dynamic)
8767             {
8768               char * name;
8769
8770               if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
8771                 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
8772               else
8773                 name = NULL;
8774
8775               if (name)
8776                 {
8777                   switch (entry->d_tag)
8778                     {
8779                     case DT_NEEDED:
8780                       printf (_("Shared library: [%s]"), name);
8781
8782                       if (streq (name, program_interpreter))
8783                         printf (_(" program interpreter"));
8784                       break;
8785
8786                     case DT_SONAME:
8787                       printf (_("Library soname: [%s]"), name);
8788                       break;
8789
8790                     case DT_RPATH:
8791                       printf (_("Library rpath: [%s]"), name);
8792                       break;
8793
8794                     case DT_RUNPATH:
8795                       printf (_("Library runpath: [%s]"), name);
8796                       break;
8797
8798                     default:
8799                       print_vma (entry->d_un.d_val, PREFIX_HEX);
8800                       break;
8801                     }
8802                 }
8803               else
8804                 print_vma (entry->d_un.d_val, PREFIX_HEX);
8805
8806               putchar ('\n');
8807             }
8808           break;
8809
8810         case DT_PLTRELSZ:
8811         case DT_RELASZ  :
8812         case DT_STRSZ   :
8813         case DT_RELSZ   :
8814         case DT_RELAENT :
8815         case DT_SYMENT  :
8816         case DT_RELENT  :
8817           dynamic_info[entry->d_tag] = entry->d_un.d_val;
8818         case DT_PLTPADSZ:
8819         case DT_MOVEENT :
8820         case DT_MOVESZ  :
8821         case DT_INIT_ARRAYSZ:
8822         case DT_FINI_ARRAYSZ:
8823         case DT_GNU_CONFLICTSZ:
8824         case DT_GNU_LIBLISTSZ:
8825           if (do_dynamic)
8826             {
8827               print_vma (entry->d_un.d_val, UNSIGNED);
8828               printf (_(" (bytes)\n"));
8829             }
8830           break;
8831
8832         case DT_VERDEFNUM:
8833         case DT_VERNEEDNUM:
8834         case DT_RELACOUNT:
8835         case DT_RELCOUNT:
8836           if (do_dynamic)
8837             {
8838               print_vma (entry->d_un.d_val, UNSIGNED);
8839               putchar ('\n');
8840             }
8841           break;
8842
8843         case DT_SYMINSZ:
8844         case DT_SYMINENT:
8845         case DT_SYMINFO:
8846         case DT_USED:
8847         case DT_INIT_ARRAY:
8848         case DT_FINI_ARRAY:
8849           if (do_dynamic)
8850             {
8851               if (entry->d_tag == DT_USED
8852                   && VALID_DYNAMIC_NAME (entry->d_un.d_val))
8853                 {
8854                   char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
8855
8856                   if (*name)
8857                     {
8858                       printf (_("Not needed object: [%s]\n"), name);
8859                       break;
8860                     }
8861                 }
8862
8863               print_vma (entry->d_un.d_val, PREFIX_HEX);
8864               putchar ('\n');
8865             }
8866           break;
8867
8868         case DT_BIND_NOW:
8869           /* The value of this entry is ignored.  */
8870           if (do_dynamic)
8871             putchar ('\n');
8872           break;
8873
8874         case DT_GNU_PRELINKED:
8875           if (do_dynamic)
8876             {
8877               struct tm * tmp;
8878               time_t atime = entry->d_un.d_val;
8879
8880               tmp = gmtime (&atime);
8881               /* PR 17533 file: 041-1244816-0.004.  */
8882               if (tmp == NULL)
8883                 printf (_("<corrupt time val: %lx"), atime);
8884               else
8885                 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
8886                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
8887                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
8888
8889             }
8890           break;
8891
8892         case DT_GNU_HASH:
8893           dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
8894           if (do_dynamic)
8895             {
8896               print_vma (entry->d_un.d_val, PREFIX_HEX);
8897               putchar ('\n');
8898             }
8899           break;
8900
8901         default:
8902           if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
8903             version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
8904               entry->d_un.d_val;
8905
8906           if (do_dynamic)
8907             {
8908               switch (elf_header.e_machine)
8909                 {
8910                 case EM_MIPS:
8911                 case EM_MIPS_RS3_LE:
8912                   dynamic_section_mips_val (entry);
8913                   break;
8914                 case EM_PARISC:
8915                   dynamic_section_parisc_val (entry);
8916                   break;
8917                 case EM_IA_64:
8918                   dynamic_section_ia64_val (entry);
8919                   break;
8920                 default:
8921                   print_vma (entry->d_un.d_val, PREFIX_HEX);
8922                   putchar ('\n');
8923                 }
8924             }
8925           break;
8926         }
8927     }
8928
8929   return 1;
8930 }
8931
8932 static char *
8933 get_ver_flags (unsigned int flags)
8934 {
8935   static char buff[32];
8936
8937   buff[0] = 0;
8938
8939   if (flags == 0)
8940     return _("none");
8941
8942   if (flags & VER_FLG_BASE)
8943     strcat (buff, "BASE ");
8944
8945   if (flags & VER_FLG_WEAK)
8946     {
8947       if (flags & VER_FLG_BASE)
8948         strcat (buff, "| ");
8949
8950       strcat (buff, "WEAK ");
8951     }
8952
8953   if (flags & VER_FLG_INFO)
8954     {
8955       if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
8956         strcat (buff, "| ");
8957
8958       strcat (buff, "INFO ");
8959     }
8960
8961   if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
8962     strcat (buff, _("| <unknown>"));
8963
8964   return buff;
8965 }
8966
8967 /* Display the contents of the version sections.  */
8968
8969 static int
8970 process_version_sections (FILE * file)
8971 {
8972   Elf_Internal_Shdr * section;
8973   unsigned i;
8974   int found = 0;
8975
8976   if (! do_version)
8977     return 1;
8978
8979   for (i = 0, section = section_headers;
8980        i < elf_header.e_shnum;
8981        i++, section++)
8982     {
8983       switch (section->sh_type)
8984         {
8985         case SHT_GNU_verdef:
8986           {
8987             Elf_External_Verdef * edefs;
8988             unsigned int idx;
8989             unsigned int cnt;
8990             char * endbuf;
8991
8992             found = 1;
8993
8994             printf (_("\nVersion definition section '%s' contains %u entries:\n"),
8995                     printable_section_name (section),
8996                     section->sh_info);
8997
8998             printf (_("  Addr: 0x"));
8999             printf_vma (section->sh_addr);
9000             printf (_("  Offset: %#08lx  Link: %u (%s)"),
9001                     (unsigned long) section->sh_offset, section->sh_link,
9002                     printable_section_name_from_index (section->sh_link));
9003
9004             edefs = (Elf_External_Verdef *)
9005                 get_data (NULL, file, section->sh_offset, 1,section->sh_size,
9006                           _("version definition section"));
9007             if (!edefs)
9008               break;
9009             endbuf = (char *) edefs + section->sh_size;
9010
9011             for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
9012               {
9013                 char * vstart;
9014                 Elf_External_Verdef * edef;
9015                 Elf_Internal_Verdef ent;
9016                 Elf_External_Verdaux * eaux;
9017                 Elf_Internal_Verdaux aux;
9018                 int j;
9019                 int isum;
9020
9021                 /* Check for very large indicies.  */
9022                 if (idx > (size_t) (endbuf - (char *) edefs))
9023                   break;
9024
9025                 vstart = ((char *) edefs) + idx;
9026                 if (vstart + sizeof (*edef) > endbuf)
9027                   break;
9028
9029                 edef = (Elf_External_Verdef *) vstart;
9030
9031                 ent.vd_version = BYTE_GET (edef->vd_version);
9032                 ent.vd_flags   = BYTE_GET (edef->vd_flags);
9033                 ent.vd_ndx     = BYTE_GET (edef->vd_ndx);
9034                 ent.vd_cnt     = BYTE_GET (edef->vd_cnt);
9035                 ent.vd_hash    = BYTE_GET (edef->vd_hash);
9036                 ent.vd_aux     = BYTE_GET (edef->vd_aux);
9037                 ent.vd_next    = BYTE_GET (edef->vd_next);
9038
9039                 printf (_("  %#06x: Rev: %d  Flags: %s"),
9040                         idx, ent.vd_version, get_ver_flags (ent.vd_flags));
9041
9042                 printf (_("  Index: %d  Cnt: %d  "),
9043                         ent.vd_ndx, ent.vd_cnt);
9044
9045                 /* Check for overflow.  */
9046                 if (ent.vd_aux > (size_t) (endbuf - vstart))
9047                   break;
9048
9049                 vstart += ent.vd_aux;
9050
9051                 eaux = (Elf_External_Verdaux *) vstart;
9052
9053                 aux.vda_name = BYTE_GET (eaux->vda_name);
9054                 aux.vda_next = BYTE_GET (eaux->vda_next);
9055
9056                 if (VALID_DYNAMIC_NAME (aux.vda_name))
9057                   printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
9058                 else
9059                   printf (_("Name index: %ld\n"), aux.vda_name);
9060
9061                 isum = idx + ent.vd_aux;
9062
9063                 for (j = 1; j < ent.vd_cnt; j++)
9064                   {
9065                     /* Check for overflow.  */
9066                     if (aux.vda_next > (size_t) (endbuf - vstart))
9067                       break;
9068
9069                     isum   += aux.vda_next;
9070                     vstart += aux.vda_next;
9071
9072                     eaux = (Elf_External_Verdaux *) vstart;
9073                     if (vstart + sizeof (*eaux) > endbuf)
9074                       break;
9075
9076                     aux.vda_name = BYTE_GET (eaux->vda_name);
9077                     aux.vda_next = BYTE_GET (eaux->vda_next);
9078
9079                     if (VALID_DYNAMIC_NAME (aux.vda_name))
9080                       printf (_("  %#06x: Parent %d: %s\n"),
9081                               isum, j, GET_DYNAMIC_NAME (aux.vda_name));
9082                     else
9083                       printf (_("  %#06x: Parent %d, name index: %ld\n"),
9084                               isum, j, aux.vda_name);
9085                   }
9086
9087                 if (j < ent.vd_cnt)
9088                   printf (_("  Version def aux past end of section\n"));
9089
9090                 idx += ent.vd_next;
9091               }
9092
9093             if (cnt < section->sh_info)
9094               printf (_("  Version definition past end of section\n"));
9095
9096             free (edefs);
9097           }
9098           break;
9099
9100         case SHT_GNU_verneed:
9101           {
9102             Elf_External_Verneed * eneed;
9103             unsigned int idx;
9104             unsigned int cnt;
9105             char * endbuf;
9106
9107             found = 1;
9108
9109             printf (_("\nVersion needs section '%s' contains %u entries:\n"),
9110                     printable_section_name (section), section->sh_info);
9111
9112             printf (_(" Addr: 0x"));
9113             printf_vma (section->sh_addr);
9114             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
9115                     (unsigned long) section->sh_offset, section->sh_link,
9116                     printable_section_name_from_index (section->sh_link));
9117
9118             eneed = (Elf_External_Verneed *) get_data (NULL, file,
9119                                                        section->sh_offset, 1,
9120                                                        section->sh_size,
9121                                                        _("Version Needs section"));
9122             if (!eneed)
9123               break;
9124             endbuf = (char *) eneed + section->sh_size;
9125
9126             for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
9127               {
9128                 Elf_External_Verneed * entry;
9129                 Elf_Internal_Verneed ent;
9130                 int j;
9131                 int isum;
9132                 char * vstart;
9133
9134                 if (idx > (size_t) (endbuf - (char *) eneed))
9135                   break;
9136
9137                 vstart = ((char *) eneed) + idx;
9138                 if (vstart + sizeof (*entry) > endbuf)
9139                   break;
9140
9141                 entry = (Elf_External_Verneed *) vstart;
9142
9143                 ent.vn_version = BYTE_GET (entry->vn_version);
9144                 ent.vn_cnt     = BYTE_GET (entry->vn_cnt);
9145                 ent.vn_file    = BYTE_GET (entry->vn_file);
9146                 ent.vn_aux     = BYTE_GET (entry->vn_aux);
9147                 ent.vn_next    = BYTE_GET (entry->vn_next);
9148
9149                 printf (_("  %#06x: Version: %d"), idx, ent.vn_version);
9150
9151                 if (VALID_DYNAMIC_NAME (ent.vn_file))
9152                   printf (_("  File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
9153                 else
9154                   printf (_("  File: %lx"), ent.vn_file);
9155
9156                 printf (_("  Cnt: %d\n"), ent.vn_cnt);
9157
9158                 /* Check for overflow.  */
9159                 if (ent.vn_aux > (size_t) (endbuf - vstart))
9160                   break;
9161
9162                 vstart += ent.vn_aux;
9163
9164                 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
9165                   {
9166                     Elf_External_Vernaux * eaux;
9167                     Elf_Internal_Vernaux aux;
9168
9169                     if (vstart + sizeof (*eaux) > endbuf)
9170                       break;
9171                     eaux = (Elf_External_Vernaux *) vstart;
9172
9173                     aux.vna_hash  = BYTE_GET (eaux->vna_hash);
9174                     aux.vna_flags = BYTE_GET (eaux->vna_flags);
9175                     aux.vna_other = BYTE_GET (eaux->vna_other);
9176                     aux.vna_name  = BYTE_GET (eaux->vna_name);
9177                     aux.vna_next  = BYTE_GET (eaux->vna_next);
9178
9179                     if (VALID_DYNAMIC_NAME (aux.vna_name))
9180                       printf (_("  %#06x:   Name: %s"),
9181                               isum, GET_DYNAMIC_NAME (aux.vna_name));
9182                     else
9183                       printf (_("  %#06x:   Name index: %lx"),
9184                               isum, aux.vna_name);
9185
9186                     printf (_("  Flags: %s  Version: %d\n"),
9187                             get_ver_flags (aux.vna_flags), aux.vna_other);
9188
9189                     /* Check for overflow.  */
9190                     if (aux.vna_next > (size_t) (endbuf - vstart))
9191                       break;
9192
9193                     isum   += aux.vna_next;
9194                     vstart += aux.vna_next;
9195                   }
9196
9197                 if (j < ent.vn_cnt)
9198                   warn (_("Missing Version Needs auxillary information\n"));
9199
9200                 if (ent.vn_next == 0 && cnt < section->sh_info - 1)
9201                   {
9202                     warn (_("Corrupt Version Needs structure - offset to next structure is zero with entries still left to be processed\n"));
9203                     cnt = section->sh_info;
9204                     break;
9205                   }
9206                 idx += ent.vn_next;
9207               }
9208
9209             if (cnt < section->sh_info)
9210               warn (_("Missing Version Needs information\n"));
9211
9212             free (eneed);
9213           }
9214           break;
9215
9216         case SHT_GNU_versym:
9217           {
9218             Elf_Internal_Shdr * link_section;
9219             int total;
9220             int cnt;
9221             unsigned char * edata;
9222             unsigned short * data;
9223             char * strtab;
9224             Elf_Internal_Sym * symbols;
9225             Elf_Internal_Shdr * string_sec;
9226             unsigned long num_syms;
9227             long off;
9228
9229             if (section->sh_link >= elf_header.e_shnum)
9230               break;
9231
9232             link_section = section_headers + section->sh_link;
9233             total = section->sh_size / sizeof (Elf_External_Versym);
9234
9235             if (link_section->sh_link >= elf_header.e_shnum)
9236               break;
9237
9238             found = 1;
9239
9240             symbols = GET_ELF_SYMBOLS (file, link_section, & num_syms);
9241             if (symbols == NULL)
9242               break;
9243
9244             string_sec = section_headers + link_section->sh_link;
9245
9246             strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
9247                                         string_sec->sh_size,
9248                                         _("version string table"));
9249             if (!strtab)
9250               {
9251                 free (symbols);
9252                 break;
9253               }
9254
9255             printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
9256                     printable_section_name (section), total);
9257
9258             printf (_(" Addr: "));
9259             printf_vma (section->sh_addr);
9260             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
9261                     (unsigned long) section->sh_offset, section->sh_link,
9262                     printable_section_name (link_section));
9263
9264             off = offset_from_vma (file,
9265                                    version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
9266                                    total * sizeof (short));
9267             edata = (unsigned char *) get_data (NULL, file, off, total,
9268                                                 sizeof (short),
9269                                                 _("version symbol data"));
9270             if (!edata)
9271               {
9272                 free (strtab);
9273                 free (symbols);
9274                 break;
9275               }
9276
9277             data = (short unsigned int *) cmalloc (total, sizeof (short));
9278
9279             for (cnt = total; cnt --;)
9280               data[cnt] = byte_get (edata + cnt * sizeof (short),
9281                                     sizeof (short));
9282
9283             free (edata);
9284
9285             for (cnt = 0; cnt < total; cnt += 4)
9286               {
9287                 int j, nn;
9288                 int check_def, check_need;
9289                 char * name;
9290
9291                 printf ("  %03x:", cnt);
9292
9293                 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
9294                   switch (data[cnt + j])
9295                     {
9296                     case 0:
9297                       fputs (_("   0 (*local*)    "), stdout);
9298                       break;
9299
9300                     case 1:
9301                       fputs (_("   1 (*global*)   "), stdout);
9302                       break;
9303
9304                     default:
9305                       nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
9306                                    data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
9307
9308                       /* If this index value is greater than the size of the symbols
9309                          array, break to avoid an out-of-bounds read.  */
9310                       if ((unsigned long)(cnt + j) >= num_syms)
9311                         {
9312                           warn (_("invalid index into symbol array\n"));
9313                           break;
9314                         }
9315
9316                       check_def = 1;
9317                       check_need = 1;
9318                       if (symbols[cnt + j].st_shndx >= elf_header.e_shnum
9319                           || section_headers[symbols[cnt + j].st_shndx].sh_type
9320                              != SHT_NOBITS)
9321                         {
9322                           if (symbols[cnt + j].st_shndx == SHN_UNDEF)
9323                             check_def = 0;
9324                           else
9325                             check_need = 0;
9326                         }
9327
9328                       if (check_need
9329                           && version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
9330                         {
9331                           Elf_Internal_Verneed ivn;
9332                           unsigned long offset;
9333
9334                           offset = offset_from_vma
9335                             (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
9336                              sizeof (Elf_External_Verneed));
9337
9338                           do
9339                             {
9340                               Elf_Internal_Vernaux ivna;
9341                               Elf_External_Verneed evn;
9342                               Elf_External_Vernaux evna;
9343                               unsigned long a_off;
9344
9345                               if (get_data (&evn, file, offset, sizeof (evn), 1,
9346                                             _("version need")) == NULL)
9347                                 break;
9348
9349                               ivn.vn_aux  = BYTE_GET (evn.vn_aux);
9350                               ivn.vn_next = BYTE_GET (evn.vn_next);
9351
9352                               a_off = offset + ivn.vn_aux;
9353
9354                               do
9355                                 {
9356                                   if (get_data (&evna, file, a_off, sizeof (evna),
9357                                                 1, _("version need aux (2)")) == NULL)
9358                                     {
9359                                       ivna.vna_next  = 0;
9360                                       ivna.vna_other = 0;
9361                                     }
9362                                   else
9363                                     {
9364                                       ivna.vna_next  = BYTE_GET (evna.vna_next);
9365                                       ivna.vna_other = BYTE_GET (evna.vna_other);
9366                                     }
9367
9368                                   a_off += ivna.vna_next;
9369                                 }
9370                               while (ivna.vna_other != data[cnt + j]
9371                                      && ivna.vna_next != 0);
9372
9373                               if (ivna.vna_other == data[cnt + j])
9374                                 {
9375                                   ivna.vna_name = BYTE_GET (evna.vna_name);
9376
9377                                   if (ivna.vna_name >= string_sec->sh_size)
9378                                     name = _("*invalid*");
9379                                   else
9380                                     name = strtab + ivna.vna_name;
9381                                   nn += printf ("(%s%-*s",
9382                                                 name,
9383                                                 12 - (int) strlen (name),
9384                                                 ")");
9385                                   check_def = 0;
9386                                   break;
9387                                 }
9388
9389                               offset += ivn.vn_next;
9390                             }
9391                           while (ivn.vn_next);
9392                         }
9393
9394                       if (check_def && data[cnt + j] != 0x8001
9395                           && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
9396                         {
9397                           Elf_Internal_Verdef ivd;
9398                           Elf_External_Verdef evd;
9399                           unsigned long offset;
9400
9401                           offset = offset_from_vma
9402                             (file, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
9403                              sizeof evd);
9404
9405                           do
9406                             {
9407                               if (get_data (&evd, file, offset, sizeof (evd), 1,
9408                                             _("version def")) == NULL)
9409                                 {
9410                                   ivd.vd_next = 0;
9411                                   ivd.vd_ndx  = 0;
9412                                 }
9413                               else
9414                                 {
9415                                   ivd.vd_next = BYTE_GET (evd.vd_next);
9416                                   ivd.vd_ndx  = BYTE_GET (evd.vd_ndx);
9417                                 }
9418
9419                               offset += ivd.vd_next;
9420                             }
9421                           while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
9422                                  && ivd.vd_next != 0);
9423
9424                           if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
9425                             {
9426                               Elf_External_Verdaux evda;
9427                               Elf_Internal_Verdaux ivda;
9428
9429                               ivd.vd_aux = BYTE_GET (evd.vd_aux);
9430
9431                               if (get_data (&evda, file,
9432                                             offset - ivd.vd_next + ivd.vd_aux,
9433                                             sizeof (evda), 1,
9434                                             _("version def aux")) == NULL)
9435                                 break;
9436
9437                               ivda.vda_name = BYTE_GET (evda.vda_name);
9438
9439                               if (ivda.vda_name >= string_sec->sh_size)
9440                                 name = _("*invalid*");
9441                               else
9442                                 name = strtab + ivda.vda_name;
9443                               nn += printf ("(%s%-*s",
9444                                             name,
9445                                             12 - (int) strlen (name),
9446                                             ")");
9447                             }
9448                         }
9449
9450                       if (nn < 18)
9451                         printf ("%*c", 18 - nn, ' ');
9452                     }
9453
9454                 putchar ('\n');
9455               }
9456
9457             free (data);
9458             free (strtab);
9459             free (symbols);
9460           }
9461           break;
9462
9463         default:
9464           break;
9465         }
9466     }
9467
9468   if (! found)
9469     printf (_("\nNo version information found in this file.\n"));
9470
9471   return 1;
9472 }
9473
9474 static const char *
9475 get_symbol_binding (unsigned int binding)
9476 {
9477   static char buff[32];
9478
9479   switch (binding)
9480     {
9481     case STB_LOCAL:     return "LOCAL";
9482     case STB_GLOBAL:    return "GLOBAL";
9483     case STB_WEAK:      return "WEAK";
9484     default:
9485       if (binding >= STB_LOPROC && binding <= STB_HIPROC)
9486         snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
9487                   binding);
9488       else if (binding >= STB_LOOS && binding <= STB_HIOS)
9489         {
9490           if (binding == STB_GNU_UNIQUE
9491               && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
9492                   /* GNU is still using the default value 0.  */
9493                   || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
9494             return "UNIQUE";
9495           snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
9496         }
9497       else
9498         snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
9499       return buff;
9500     }
9501 }
9502
9503 static const char *
9504 get_symbol_type (unsigned int type)
9505 {
9506   static char buff[32];
9507
9508   switch (type)
9509     {
9510     case STT_NOTYPE:    return "NOTYPE";
9511     case STT_OBJECT:    return "OBJECT";
9512     case STT_FUNC:      return "FUNC";
9513     case STT_SECTION:   return "SECTION";
9514     case STT_FILE:      return "FILE";
9515     case STT_COMMON:    return "COMMON";
9516     case STT_TLS:       return "TLS";
9517     case STT_RELC:      return "RELC";
9518     case STT_SRELC:     return "SRELC";
9519     default:
9520       if (type >= STT_LOPROC && type <= STT_HIPROC)
9521         {
9522           if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
9523             return "THUMB_FUNC";
9524
9525           if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
9526             return "REGISTER";
9527
9528           if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
9529             return "PARISC_MILLI";
9530
9531           snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
9532         }
9533       else if (type >= STT_LOOS && type <= STT_HIOS)
9534         {
9535           if (elf_header.e_machine == EM_PARISC)
9536             {
9537               if (type == STT_HP_OPAQUE)
9538                 return "HP_OPAQUE";
9539               if (type == STT_HP_STUB)
9540                 return "HP_STUB";
9541             }
9542
9543           if (type == STT_GNU_IFUNC
9544               && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
9545                   || elf_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD
9546                   /* GNU is still using the default value 0.  */
9547                   || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
9548             return "IFUNC";
9549
9550           snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
9551         }
9552       else
9553         snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
9554       return buff;
9555     }
9556 }
9557
9558 static const char *
9559 get_symbol_visibility (unsigned int visibility)
9560 {
9561   switch (visibility)
9562     {
9563     case STV_DEFAULT:   return "DEFAULT";
9564     case STV_INTERNAL:  return "INTERNAL";
9565     case STV_HIDDEN:    return "HIDDEN";
9566     case STV_PROTECTED: return "PROTECTED";
9567     default: abort ();
9568     }
9569 }
9570
9571 static const char *
9572 get_mips_symbol_other (unsigned int other)
9573 {
9574   switch (other)
9575     {
9576     case STO_OPTIONAL:
9577       return "OPTIONAL";
9578     case STO_MIPS_PLT:
9579       return "MIPS PLT";
9580     case STO_MIPS_PIC:
9581       return "MIPS PIC";
9582     case STO_MICROMIPS:
9583       return "MICROMIPS";
9584     case STO_MICROMIPS | STO_MIPS_PIC:
9585       return "MICROMIPS, MIPS PIC";
9586     case STO_MIPS16:
9587       return "MIPS16";
9588     default:
9589       return NULL;
9590     }
9591 }
9592
9593 static const char *
9594 get_ia64_symbol_other (unsigned int other)
9595 {
9596   if (is_ia64_vms ())
9597     {
9598       static char res[32];
9599
9600       res[0] = 0;
9601
9602       /* Function types is for images and .STB files only.  */
9603       switch (elf_header.e_type)
9604         {
9605         case ET_DYN:
9606         case ET_EXEC:
9607           switch (VMS_ST_FUNC_TYPE (other))
9608             {
9609             case VMS_SFT_CODE_ADDR:
9610               strcat (res, " CA");
9611               break;
9612             case VMS_SFT_SYMV_IDX:
9613               strcat (res, " VEC");
9614               break;
9615             case VMS_SFT_FD:
9616               strcat (res, " FD");
9617               break;
9618             case VMS_SFT_RESERVE:
9619               strcat (res, " RSV");
9620               break;
9621             default:
9622               abort ();
9623             }
9624           break;
9625         default:
9626           break;
9627         }
9628       switch (VMS_ST_LINKAGE (other))
9629         {
9630         case VMS_STL_IGNORE:
9631           strcat (res, " IGN");
9632           break;
9633         case VMS_STL_RESERVE:
9634           strcat (res, " RSV");
9635           break;
9636         case VMS_STL_STD:
9637           strcat (res, " STD");
9638           break;
9639         case VMS_STL_LNK:
9640           strcat (res, " LNK");
9641           break;
9642         default:
9643           abort ();
9644         }
9645
9646       if (res[0] != 0)
9647         return res + 1;
9648       else
9649         return res;
9650     }
9651   return NULL;
9652 }
9653
9654 static const char *
9655 get_ppc64_symbol_other (unsigned int other)
9656 {
9657   if (PPC64_LOCAL_ENTRY_OFFSET (other) != 0)
9658     {
9659       static char buf[32];
9660       snprintf (buf, sizeof buf, _("<localentry>: %d"),
9661                 PPC64_LOCAL_ENTRY_OFFSET (other));
9662       return buf;
9663     }
9664   return NULL;
9665 }
9666
9667 static const char *
9668 get_symbol_other (unsigned int other)
9669 {
9670   const char * result = NULL;
9671   static char buff [32];
9672
9673   if (other == 0)
9674     return "";
9675
9676   switch (elf_header.e_machine)
9677     {
9678     case EM_MIPS:
9679       result = get_mips_symbol_other (other);
9680       break;
9681     case EM_IA_64:
9682       result = get_ia64_symbol_other (other);
9683       break;
9684     case EM_PPC64:
9685       result = get_ppc64_symbol_other (other);
9686       break;
9687     default:
9688       break;
9689     }
9690
9691   if (result)
9692     return result;
9693
9694   snprintf (buff, sizeof buff, _("<other>: %x"), other);
9695   return buff;
9696 }
9697
9698 static const char *
9699 get_symbol_index_type (unsigned int type)
9700 {
9701   static char buff[32];
9702
9703   switch (type)
9704     {
9705     case SHN_UNDEF:     return "UND";
9706     case SHN_ABS:       return "ABS";
9707     case SHN_COMMON:    return "COM";
9708     default:
9709       if (type == SHN_IA_64_ANSI_COMMON
9710           && elf_header.e_machine == EM_IA_64
9711           && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
9712         return "ANSI_COM";
9713       else if ((elf_header.e_machine == EM_X86_64
9714                 || elf_header.e_machine == EM_L1OM
9715                 || elf_header.e_machine == EM_K1OM)
9716                && type == SHN_X86_64_LCOMMON)
9717         return "LARGE_COM";
9718       else if ((type == SHN_MIPS_SCOMMON
9719                 && elf_header.e_machine == EM_MIPS)
9720                || (type == SHN_TIC6X_SCOMMON
9721                    && elf_header.e_machine == EM_TI_C6000))
9722         return "SCOM";
9723       else if (type == SHN_MIPS_SUNDEFINED
9724                && elf_header.e_machine == EM_MIPS)
9725         return "SUND";
9726       else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
9727         sprintf (buff, "PRC[0x%04x]", type & 0xffff);
9728       else if (type >= SHN_LOOS && type <= SHN_HIOS)
9729         sprintf (buff, "OS [0x%04x]", type & 0xffff);
9730       else if (type >= SHN_LORESERVE)
9731         sprintf (buff, "RSV[0x%04x]", type & 0xffff);
9732       else if (type >= elf_header.e_shnum)
9733         sprintf (buff, _("bad section index[%3d]"), type);
9734       else
9735         sprintf (buff, "%3d", type);
9736       break;
9737     }
9738
9739   return buff;
9740 }
9741
9742 static bfd_vma *
9743 get_dynamic_data (FILE * file, unsigned int number, unsigned int ent_size)
9744 {
9745   unsigned char * e_data;
9746   bfd_vma * i_data;
9747
9748   e_data = (unsigned char *) cmalloc (number, ent_size);
9749
9750   if (e_data == NULL)
9751     {
9752       error (_("Out of memory\n"));
9753       return NULL;
9754     }
9755
9756   if (fread (e_data, ent_size, number, file) != number)
9757     {
9758       error (_("Unable to read in dynamic data\n"));
9759       return NULL;
9760     }
9761
9762   i_data = (bfd_vma *) cmalloc (number, sizeof (*i_data));
9763
9764   if (i_data == NULL)
9765     {
9766       error (_("Out of memory\n"));
9767       free (e_data);
9768       return NULL;
9769     }
9770
9771   while (number--)
9772     i_data[number] = byte_get (e_data + number * ent_size, ent_size);
9773
9774   free (e_data);
9775
9776   return i_data;
9777 }
9778
9779 static void
9780 print_dynamic_symbol (bfd_vma si, unsigned long hn)
9781 {
9782   Elf_Internal_Sym * psym;
9783   int n;
9784
9785   n = print_vma (si, DEC_5);
9786   if (n < 5)
9787     fputs (&"     "[n], stdout);
9788   printf (" %3lu: ", hn);
9789
9790   if (dynamic_symbols == NULL || si >= num_dynamic_syms)
9791     {
9792       printf (_("<No info available>\n"));
9793       return;
9794     }
9795
9796   psym = dynamic_symbols + si;
9797   print_vma (psym->st_value, LONG_HEX);
9798   putchar (' ');
9799   print_vma (psym->st_size, DEC_5);
9800
9801   printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
9802   printf (" %-6s",  get_symbol_binding (ELF_ST_BIND (psym->st_info)));
9803   printf (" %-7s",  get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
9804   /* Check to see if any other bits in the st_other field are set.
9805      Note - displaying this information disrupts the layout of the
9806      table being generated, but for the moment this case is very
9807      rare.  */
9808   if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
9809     printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
9810   printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
9811   if (VALID_DYNAMIC_NAME (psym->st_name))
9812     print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
9813   else
9814     printf (_(" <corrupt: %14ld>"), psym->st_name);
9815   putchar ('\n');
9816 }
9817
9818 /* Dump the symbol table.  */
9819 static int
9820 process_symbol_table (FILE * file)
9821 {
9822   Elf_Internal_Shdr * section;
9823   bfd_vma nbuckets = 0;
9824   bfd_vma nchains = 0;
9825   bfd_vma * buckets = NULL;
9826   bfd_vma * chains = NULL;
9827   bfd_vma ngnubuckets = 0;
9828   bfd_vma * gnubuckets = NULL;
9829   bfd_vma * gnuchains = NULL;
9830   bfd_vma gnusymidx = 0;
9831   bfd_size_type ngnuchains = 0;
9832
9833   if (!do_syms && !do_dyn_syms && !do_histogram)
9834     return 1;
9835
9836   if (dynamic_info[DT_HASH]
9837       && (do_histogram
9838           || (do_using_dynamic
9839               && !do_dyn_syms
9840               && dynamic_strings != NULL)))
9841     {
9842       unsigned char nb[8];
9843       unsigned char nc[8];
9844       int hash_ent_size = 4;
9845
9846       if ((elf_header.e_machine == EM_ALPHA
9847            || elf_header.e_machine == EM_S390
9848            || elf_header.e_machine == EM_S390_OLD)
9849           && elf_header.e_ident[EI_CLASS] == ELFCLASS64)
9850         hash_ent_size = 8;
9851
9852       if (fseek (file,
9853                  (archive_file_offset
9854                   + offset_from_vma (file, dynamic_info[DT_HASH],
9855                                      sizeof nb + sizeof nc)),
9856                  SEEK_SET))
9857         {
9858           error (_("Unable to seek to start of dynamic information\n"));
9859           goto no_hash;
9860         }
9861
9862       if (fread (nb, hash_ent_size, 1, file) != 1)
9863         {
9864           error (_("Failed to read in number of buckets\n"));
9865           goto no_hash;
9866         }
9867
9868       if (fread (nc, hash_ent_size, 1, file) != 1)
9869         {
9870           error (_("Failed to read in number of chains\n"));
9871           goto no_hash;
9872         }
9873
9874       nbuckets = byte_get (nb, hash_ent_size);
9875       nchains  = byte_get (nc, hash_ent_size);
9876
9877       buckets = get_dynamic_data (file, nbuckets, hash_ent_size);
9878       chains  = get_dynamic_data (file, nchains, hash_ent_size);
9879
9880     no_hash:
9881       if (buckets == NULL || chains == NULL)
9882         {
9883           if (do_using_dynamic)
9884             return 0;
9885           free (buckets);
9886           free (chains);
9887           buckets = NULL;
9888           chains = NULL;
9889           nbuckets = 0;
9890           nchains = 0;
9891         }
9892     }
9893
9894   if (dynamic_info_DT_GNU_HASH
9895       && (do_histogram
9896           || (do_using_dynamic
9897               && !do_dyn_syms
9898               && dynamic_strings != NULL)))
9899     {
9900       unsigned char nb[16];
9901       bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
9902       bfd_vma buckets_vma;
9903
9904       if (fseek (file,
9905                  (archive_file_offset
9906                   + offset_from_vma (file, dynamic_info_DT_GNU_HASH,
9907                                      sizeof nb)),
9908                  SEEK_SET))
9909         {
9910           error (_("Unable to seek to start of dynamic information\n"));
9911           goto no_gnu_hash;
9912         }
9913
9914       if (fread (nb, 16, 1, file) != 1)
9915         {
9916           error (_("Failed to read in number of buckets\n"));
9917           goto no_gnu_hash;
9918         }
9919
9920       ngnubuckets = byte_get (nb, 4);
9921       gnusymidx = byte_get (nb + 4, 4);
9922       bitmaskwords = byte_get (nb + 8, 4);
9923       buckets_vma = dynamic_info_DT_GNU_HASH + 16;
9924       if (is_32bit_elf)
9925         buckets_vma += bitmaskwords * 4;
9926       else
9927         buckets_vma += bitmaskwords * 8;
9928
9929       if (fseek (file,
9930                  (archive_file_offset
9931                   + offset_from_vma (file, buckets_vma, 4)),
9932                  SEEK_SET))
9933         {
9934           error (_("Unable to seek to start of dynamic information\n"));
9935           goto no_gnu_hash;
9936         }
9937
9938       gnubuckets = get_dynamic_data (file, ngnubuckets, 4);
9939
9940       if (gnubuckets == NULL)
9941         goto no_gnu_hash;
9942
9943       for (i = 0; i < ngnubuckets; i++)
9944         if (gnubuckets[i] != 0)
9945           {
9946             if (gnubuckets[i] < gnusymidx)
9947               return 0;
9948
9949             if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
9950               maxchain = gnubuckets[i];
9951           }
9952
9953       if (maxchain == 0xffffffff)
9954         goto no_gnu_hash;
9955
9956       maxchain -= gnusymidx;
9957
9958       if (fseek (file,
9959                  (archive_file_offset
9960                   + offset_from_vma (file, buckets_vma
9961                                            + 4 * (ngnubuckets + maxchain), 4)),
9962                  SEEK_SET))
9963         {
9964           error (_("Unable to seek to start of dynamic information\n"));
9965           goto no_gnu_hash;
9966         }
9967
9968       do
9969         {
9970           if (fread (nb, 4, 1, file) != 1)
9971             {
9972               error (_("Failed to determine last chain length\n"));
9973               goto no_gnu_hash;
9974             }
9975
9976           if (maxchain + 1 == 0)
9977             goto no_gnu_hash;
9978
9979           ++maxchain;
9980         }
9981       while ((byte_get (nb, 4) & 1) == 0);
9982
9983       if (fseek (file,
9984                  (archive_file_offset
9985                   + offset_from_vma (file, buckets_vma + 4 * ngnubuckets, 4)),
9986                  SEEK_SET))
9987         {
9988           error (_("Unable to seek to start of dynamic information\n"));
9989           goto no_gnu_hash;
9990         }
9991
9992       gnuchains = get_dynamic_data (file, maxchain, 4);
9993       ngnuchains = maxchain;
9994
9995     no_gnu_hash:
9996       if (gnuchains == NULL)
9997         {
9998           free (gnubuckets);
9999           gnubuckets = NULL;
10000           ngnubuckets = 0;
10001           if (do_using_dynamic)
10002             return 0;
10003         }
10004     }
10005
10006   if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
10007       && do_syms
10008       && do_using_dynamic
10009       && dynamic_strings != NULL)
10010     {
10011       unsigned long hn;
10012
10013       if (dynamic_info[DT_HASH])
10014         {
10015           bfd_vma si;
10016
10017           printf (_("\nSymbol table for image:\n"));
10018           if (is_32bit_elf)
10019             printf (_("  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"));
10020           else
10021             printf (_("  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"));
10022
10023           for (hn = 0; hn < nbuckets; hn++)
10024             {
10025               if (! buckets[hn])
10026                 continue;
10027
10028               for (si = buckets[hn]; si < nchains && si > 0; si = chains[si])
10029                 print_dynamic_symbol (si, hn);
10030             }
10031         }
10032
10033       if (dynamic_info_DT_GNU_HASH)
10034         {
10035           printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
10036           if (is_32bit_elf)
10037             printf (_("  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"));
10038           else
10039             printf (_("  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"));
10040
10041           for (hn = 0; hn < ngnubuckets; ++hn)
10042             if (gnubuckets[hn] != 0)
10043               {
10044                 bfd_vma si = gnubuckets[hn];
10045                 bfd_vma off = si - gnusymidx;
10046
10047                 do
10048                   {
10049                     print_dynamic_symbol (si, hn);
10050                     si++;
10051                   }
10052                 while (off < ngnuchains && (gnuchains[off++] & 1) == 0);
10053               }
10054         }
10055     }
10056   else if (do_dyn_syms || (do_syms && !do_using_dynamic))
10057     {
10058       unsigned int i;
10059
10060       for (i = 0, section = section_headers;
10061            i < elf_header.e_shnum;
10062            i++, section++)
10063         {
10064           unsigned int si;
10065           char * strtab = NULL;
10066           unsigned long int strtab_size = 0;
10067           Elf_Internal_Sym * symtab;
10068           Elf_Internal_Sym * psym;
10069           unsigned long num_syms;
10070
10071           if ((section->sh_type != SHT_SYMTAB
10072                && section->sh_type != SHT_DYNSYM)
10073               || (!do_syms
10074                   && section->sh_type == SHT_SYMTAB))
10075             continue;
10076
10077           if (section->sh_entsize == 0)
10078             {
10079               printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
10080                       printable_section_name (section));
10081               continue;
10082             }
10083
10084           printf (_("\nSymbol table '%s' contains %lu entries:\n"),
10085                   printable_section_name (section),
10086                   (unsigned long) (section->sh_size / section->sh_entsize));
10087
10088           if (is_32bit_elf)
10089             printf (_("   Num:    Value  Size Type    Bind   Vis      Ndx Name\n"));
10090           else
10091             printf (_("   Num:    Value          Size Type    Bind   Vis      Ndx Name\n"));
10092
10093           symtab = GET_ELF_SYMBOLS (file, section, & num_syms);
10094           if (symtab == NULL)
10095             continue;
10096
10097           if (section->sh_link == elf_header.e_shstrndx)
10098             {
10099               strtab = string_table;
10100               strtab_size = string_table_length;
10101             }
10102           else if (section->sh_link < elf_header.e_shnum)
10103             {
10104               Elf_Internal_Shdr * string_sec;
10105
10106               string_sec = section_headers + section->sh_link;
10107
10108               strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
10109                                           1, string_sec->sh_size,
10110                                           _("string table"));
10111               strtab_size = strtab != NULL ? string_sec->sh_size : 0;
10112             }
10113
10114           for (si = 0, psym = symtab; si < num_syms; si++, psym++)
10115             {
10116               printf ("%6d: ", si);
10117               print_vma (psym->st_value, LONG_HEX);
10118               putchar (' ');
10119               print_vma (psym->st_size, DEC_5);
10120               printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
10121               printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
10122               printf (" %-7s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
10123               /* Check to see if any other bits in the st_other field are set.
10124                  Note - displaying this information disrupts the layout of the
10125                  table being generated, but for the moment this case is very rare.  */
10126               if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
10127                 printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
10128               printf (" %4s ", get_symbol_index_type (psym->st_shndx));
10129               print_symbol (25, psym->st_name < strtab_size
10130                             ? strtab + psym->st_name : _("<corrupt>"));
10131
10132               if (section->sh_type == SHT_DYNSYM
10133                   && version_info[DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
10134                 {
10135                   unsigned char data[2];
10136                   unsigned short vers_data;
10137                   unsigned long offset;
10138                   int is_nobits;
10139                   int check_def;
10140
10141                   offset = offset_from_vma
10142                     (file, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10143                      sizeof data + si * sizeof (vers_data));
10144
10145                   if (get_data (&data, file, offset + si * sizeof (vers_data),
10146                                 sizeof (data), 1, _("version data")) == NULL)
10147                     break;
10148
10149                   vers_data = byte_get (data, 2);
10150
10151                   is_nobits = (psym->st_shndx < elf_header.e_shnum
10152                                && section_headers[psym->st_shndx].sh_type
10153                                   == SHT_NOBITS);
10154
10155                   check_def = (psym->st_shndx != SHN_UNDEF);
10156
10157                   if ((vers_data & VERSYM_HIDDEN) || vers_data > 1)
10158                     {
10159                       if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)]
10160                           && (is_nobits || ! check_def))
10161                         {
10162                           Elf_External_Verneed evn;
10163                           Elf_Internal_Verneed ivn;
10164                           Elf_Internal_Vernaux ivna;
10165
10166                           /* We must test both.  */
10167                           offset = offset_from_vma
10168                             (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10169                              sizeof evn);
10170
10171                           do
10172                             {
10173                               unsigned long vna_off;
10174
10175                               if (get_data (&evn, file, offset, sizeof (evn), 1,
10176                                             _("version need")) == NULL)
10177                                 {
10178                                   ivna.vna_next = 0;
10179                                   ivna.vna_other = 0;
10180                                   ivna.vna_name = 0;
10181                                   break;
10182                                 }
10183
10184                               ivn.vn_aux  = BYTE_GET (evn.vn_aux);
10185                               ivn.vn_next = BYTE_GET (evn.vn_next);
10186
10187                               vna_off = offset + ivn.vn_aux;
10188
10189                               do
10190                                 {
10191                                   Elf_External_Vernaux evna;
10192
10193                                   if (get_data (&evna, file, vna_off,
10194                                                 sizeof (evna), 1,
10195                                                 _("version need aux (3)")) == NULL)
10196                                     {
10197                                       ivna.vna_next = 0;
10198                                       ivna.vna_other = 0;
10199                                       ivna.vna_name = 0;
10200                                     }
10201                                   else
10202                                     {
10203                                       ivna.vna_other = BYTE_GET (evna.vna_other);
10204                                       ivna.vna_next  = BYTE_GET (evna.vna_next);
10205                                       ivna.vna_name  = BYTE_GET (evna.vna_name);
10206                                     }
10207
10208                                   vna_off += ivna.vna_next;
10209                                 }
10210                               while (ivna.vna_other != vers_data
10211                                      && ivna.vna_next != 0);
10212
10213                               if (ivna.vna_other == vers_data)
10214                                 break;
10215
10216                               offset += ivn.vn_next;
10217                             }
10218                           while (ivn.vn_next != 0);
10219
10220                           if (ivna.vna_other == vers_data)
10221                             {
10222                               printf ("@%s (%d)",
10223                                       ivna.vna_name < strtab_size
10224                                       ? strtab + ivna.vna_name : _("<corrupt>"),
10225                                       ivna.vna_other);
10226                               check_def = 0;
10227                             }
10228                           else if (! is_nobits)
10229                             error (_("bad dynamic symbol\n"));
10230                           else
10231                             check_def = 1;
10232                         }
10233
10234                       if (check_def)
10235                         {
10236                           if (vers_data != 0x8001
10237                               && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10238                             {
10239                               Elf_Internal_Verdef ivd;
10240                               Elf_Internal_Verdaux ivda;
10241                               Elf_External_Verdaux evda;
10242                               unsigned long off;
10243
10244                               off = offset_from_vma
10245                                 (file,
10246                                  version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10247                                  sizeof (Elf_External_Verdef));
10248
10249                               do
10250                                 {
10251                                   Elf_External_Verdef evd;
10252
10253                                   if (get_data (&evd, file, off, sizeof (evd),
10254                                                 1, _("version def")) == NULL)
10255                                     {
10256                                       ivd.vd_ndx = 0;
10257                                       ivd.vd_aux = 0;
10258                                       ivd.vd_next = 0;
10259                                     }
10260                                   else
10261                                     {
10262                                       ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
10263                                       ivd.vd_aux = BYTE_GET (evd.vd_aux);
10264                                       ivd.vd_next = BYTE_GET (evd.vd_next);
10265                                     }
10266
10267                                   off += ivd.vd_next;
10268                                 }
10269                               while (ivd.vd_ndx != (vers_data & VERSYM_VERSION)
10270                                      && ivd.vd_next != 0);
10271
10272                               off -= ivd.vd_next;
10273                               off += ivd.vd_aux;
10274
10275                               if (get_data (&evda, file, off, sizeof (evda),
10276                                             1, _("version def aux")) == NULL)
10277                                 break;
10278
10279                               ivda.vda_name = BYTE_GET (evda.vda_name);
10280
10281                               if (psym->st_name != ivda.vda_name)
10282                                 printf ((vers_data & VERSYM_HIDDEN)
10283                                         ? "@%s" : "@@%s",
10284                                         ivda.vda_name < strtab_size
10285                                         ? strtab + ivda.vda_name : _("<corrupt>"));
10286                             }
10287                         }
10288                     }
10289                 }
10290
10291               putchar ('\n');
10292             }
10293
10294           free (symtab);
10295           if (strtab != string_table)
10296             free (strtab);
10297         }
10298     }
10299   else if (do_syms)
10300     printf
10301       (_("\nDynamic symbol information is not available for displaying symbols.\n"));
10302
10303   if (do_histogram && buckets != NULL)
10304     {
10305       unsigned long * lengths;
10306       unsigned long * counts;
10307       unsigned long hn;
10308       bfd_vma si;
10309       unsigned long maxlength = 0;
10310       unsigned long nzero_counts = 0;
10311       unsigned long nsyms = 0;
10312
10313       printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
10314               (unsigned long) nbuckets);
10315       printf (_(" Length  Number     %% of total  Coverage\n"));
10316
10317       lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
10318       if (lengths == NULL)
10319         {
10320           error (_("Out of memory\n"));
10321           return 0;
10322         }
10323       for (hn = 0; hn < nbuckets; ++hn)
10324         {
10325           for (si = buckets[hn]; si > 0 && si < nchains; si = chains[si])
10326             {
10327               ++nsyms;
10328               if (maxlength < ++lengths[hn])
10329                 ++maxlength;
10330
10331               /* PR binutils/17531: A corrupt binary could contain broken
10332                  histogram data.  Do not go into an infinite loop trying
10333                  to process it.  */
10334               if (chains[si] == si)
10335                 {
10336                   error (_("histogram chain links to itself\n"));
10337                   break;
10338                 }
10339             }
10340         }
10341
10342       counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
10343       if (counts == NULL)
10344         {
10345           free (lengths);
10346           error (_("Out of memory\n"));
10347           return 0;
10348         }
10349
10350       for (hn = 0; hn < nbuckets; ++hn)
10351         ++counts[lengths[hn]];
10352
10353       if (nbuckets > 0)
10354         {
10355           unsigned long i;
10356           printf ("      0  %-10lu (%5.1f%%)\n",
10357                   counts[0], (counts[0] * 100.0) / nbuckets);
10358           for (i = 1; i <= maxlength; ++i)
10359             {
10360               nzero_counts += counts[i] * i;
10361               printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
10362                       i, counts[i], (counts[i] * 100.0) / nbuckets,
10363                       (nzero_counts * 100.0) / nsyms);
10364             }
10365         }
10366
10367       free (counts);
10368       free (lengths);
10369     }
10370
10371   if (buckets != NULL)
10372     {
10373       free (buckets);
10374       free (chains);
10375     }
10376
10377   if (do_histogram && gnubuckets != NULL)
10378     {
10379       unsigned long * lengths;
10380       unsigned long * counts;
10381       unsigned long hn;
10382       unsigned long maxlength = 0;
10383       unsigned long nzero_counts = 0;
10384       unsigned long nsyms = 0;
10385
10386       lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
10387       if (lengths == NULL)
10388         {
10389           error (_("Out of memory\n"));
10390           return 0;
10391         }
10392
10393       printf (_("\nHistogram for `.gnu.hash' bucket list length (total of %lu buckets):\n"),
10394               (unsigned long) ngnubuckets);
10395       printf (_(" Length  Number     %% of total  Coverage\n"));
10396
10397       for (hn = 0; hn < ngnubuckets; ++hn)
10398         if (gnubuckets[hn] != 0)
10399           {
10400             bfd_vma off, length = 1;
10401
10402             for (off = gnubuckets[hn] - gnusymidx;
10403                  /* PR 17531 file: 010-77222-0.004.  */
10404                  off < ngnuchains && (gnuchains[off] & 1) == 0;
10405                  ++off)
10406               ++length;
10407             lengths[hn] = length;
10408             if (length > maxlength)
10409               maxlength = length;
10410             nsyms += length;
10411           }
10412
10413       counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
10414       if (counts == NULL)
10415         {
10416           free (lengths);
10417           error (_("Out of memory\n"));
10418           return 0;
10419         }
10420
10421       for (hn = 0; hn < ngnubuckets; ++hn)
10422         ++counts[lengths[hn]];
10423
10424       if (ngnubuckets > 0)
10425         {
10426           unsigned long j;
10427           printf ("      0  %-10lu (%5.1f%%)\n",
10428                   counts[0], (counts[0] * 100.0) / ngnubuckets);
10429           for (j = 1; j <= maxlength; ++j)
10430             {
10431               nzero_counts += counts[j] * j;
10432               printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
10433                       j, counts[j], (counts[j] * 100.0) / ngnubuckets,
10434                       (nzero_counts * 100.0) / nsyms);
10435             }
10436         }
10437
10438       free (counts);
10439       free (lengths);
10440       free (gnubuckets);
10441       free (gnuchains);
10442     }
10443
10444   return 1;
10445 }
10446
10447 static int
10448 process_syminfo (FILE * file ATTRIBUTE_UNUSED)
10449 {
10450   unsigned int i;
10451
10452   if (dynamic_syminfo == NULL
10453       || !do_dynamic)
10454     /* No syminfo, this is ok.  */
10455     return 1;
10456
10457   /* There better should be a dynamic symbol section.  */
10458   if (dynamic_symbols == NULL || dynamic_strings == NULL)
10459     return 0;
10460
10461   if (dynamic_addr)
10462     printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
10463             dynamic_syminfo_offset, dynamic_syminfo_nent);
10464
10465   printf (_(" Num: Name                           BoundTo     Flags\n"));
10466   for (i = 0; i < dynamic_syminfo_nent; ++i)
10467     {
10468       unsigned short int flags = dynamic_syminfo[i].si_flags;
10469
10470       printf ("%4d: ", i);
10471       assert (i <  num_dynamic_syms);
10472       if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
10473         print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
10474       else
10475         printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
10476       putchar (' ');
10477
10478       switch (dynamic_syminfo[i].si_boundto)
10479         {
10480         case SYMINFO_BT_SELF:
10481           fputs ("SELF       ", stdout);
10482           break;
10483         case SYMINFO_BT_PARENT:
10484           fputs ("PARENT     ", stdout);
10485           break;
10486         default:
10487           if (dynamic_syminfo[i].si_boundto > 0
10488               && dynamic_syminfo[i].si_boundto < dynamic_nent
10489               && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
10490             {
10491               print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
10492               putchar (' ' );
10493             }
10494           else
10495             printf ("%-10d ", dynamic_syminfo[i].si_boundto);
10496           break;
10497         }
10498
10499       if (flags & SYMINFO_FLG_DIRECT)
10500         printf (" DIRECT");
10501       if (flags & SYMINFO_FLG_PASSTHRU)
10502         printf (" PASSTHRU");
10503       if (flags & SYMINFO_FLG_COPY)
10504         printf (" COPY");
10505       if (flags & SYMINFO_FLG_LAZYLOAD)
10506         printf (" LAZYLOAD");
10507
10508       puts ("");
10509     }
10510
10511   return 1;
10512 }
10513
10514 /* Check to see if the given reloc needs to be handled in a target specific
10515    manner.  If so then process the reloc and return TRUE otherwise return
10516    FALSE.  */
10517
10518 static bfd_boolean
10519 target_specific_reloc_handling (Elf_Internal_Rela * reloc,
10520                                 unsigned char *     start,
10521                                 Elf_Internal_Sym *  symtab)
10522 {
10523   unsigned int reloc_type = get_reloc_type (reloc->r_info);
10524
10525   switch (elf_header.e_machine)
10526     {
10527     case EM_MSP430:
10528     case EM_MSP430_OLD:
10529       {
10530         static Elf_Internal_Sym * saved_sym = NULL;
10531
10532         switch (reloc_type)
10533           {
10534           case 10: /* R_MSP430_SYM_DIFF */
10535             if (uses_msp430x_relocs ())
10536               break;
10537           case 21: /* R_MSP430X_SYM_DIFF */
10538             saved_sym = symtab + get_reloc_symindex (reloc->r_info);
10539             return TRUE;
10540
10541           case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
10542           case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
10543             goto handle_sym_diff;
10544
10545           case 5: /* R_MSP430_16_BYTE */
10546           case 9: /* R_MSP430_8 */
10547             if (uses_msp430x_relocs ())
10548               break;
10549             goto handle_sym_diff;
10550
10551           case 2: /* R_MSP430_ABS16 */
10552           case 15: /* R_MSP430X_ABS16 */
10553             if (! uses_msp430x_relocs ())
10554               break;
10555             goto handle_sym_diff;
10556
10557           handle_sym_diff:
10558             if (saved_sym != NULL)
10559               {
10560                 bfd_vma value;
10561
10562                 value = reloc->r_addend
10563                   + (symtab[get_reloc_symindex (reloc->r_info)].st_value
10564                      - saved_sym->st_value);
10565
10566                 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
10567
10568                 saved_sym = NULL;
10569                 return TRUE;
10570               }
10571             break;
10572
10573           default:
10574             if (saved_sym != NULL)
10575               error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc\n"));
10576             break;
10577           }
10578         break;
10579       }
10580
10581     case EM_MN10300:
10582     case EM_CYGNUS_MN10300:
10583       {
10584         static Elf_Internal_Sym * saved_sym = NULL;
10585
10586         switch (reloc_type)
10587           {
10588           case 34: /* R_MN10300_ALIGN */
10589             return TRUE;
10590           case 33: /* R_MN10300_SYM_DIFF */
10591             saved_sym = symtab + get_reloc_symindex (reloc->r_info);
10592             return TRUE;
10593           case 1: /* R_MN10300_32 */
10594           case 2: /* R_MN10300_16 */
10595             if (saved_sym != NULL)
10596               {
10597                 bfd_vma value;
10598
10599                 value = reloc->r_addend
10600                   + (symtab[get_reloc_symindex (reloc->r_info)].st_value
10601                      - saved_sym->st_value);
10602
10603                 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
10604
10605                 saved_sym = NULL;
10606                 return TRUE;
10607               }
10608             break;
10609           default:
10610             if (saved_sym != NULL)
10611               error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc\n"));
10612             break;
10613           }
10614         break;
10615       }
10616     }
10617
10618   return FALSE;
10619 }
10620
10621 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
10622    DWARF debug sections.  This is a target specific test.  Note - we do not
10623    go through the whole including-target-headers-multiple-times route, (as
10624    we have already done with <elf/h8.h>) because this would become very
10625    messy and even then this function would have to contain target specific
10626    information (the names of the relocs instead of their numeric values).
10627    FIXME: This is not the correct way to solve this problem.  The proper way
10628    is to have target specific reloc sizing and typing functions created by
10629    the reloc-macros.h header, in the same way that it already creates the
10630    reloc naming functions.  */
10631
10632 static bfd_boolean
10633 is_32bit_abs_reloc (unsigned int reloc_type)
10634 {
10635   switch (elf_header.e_machine)
10636     {
10637     case EM_386:
10638     case EM_486:
10639       return reloc_type == 1; /* R_386_32.  */
10640     case EM_68K:
10641       return reloc_type == 1; /* R_68K_32.  */
10642     case EM_860:
10643       return reloc_type == 1; /* R_860_32.  */
10644     case EM_960:
10645       return reloc_type == 2; /* R_960_32.  */
10646     case EM_AARCH64:
10647       return reloc_type == 258; /* R_AARCH64_ABS32 */
10648     case EM_ALPHA:
10649       return reloc_type == 1; /* R_ALPHA_REFLONG.  */
10650     case EM_ARC:
10651       return reloc_type == 1; /* R_ARC_32.  */
10652     case EM_ARM:
10653       return reloc_type == 2; /* R_ARM_ABS32 */
10654     case EM_AVR_OLD:
10655     case EM_AVR:
10656       return reloc_type == 1;
10657     case EM_ADAPTEVA_EPIPHANY:
10658       return reloc_type == 3;
10659     case EM_BLACKFIN:
10660       return reloc_type == 0x12; /* R_byte4_data.  */
10661     case EM_CRIS:
10662       return reloc_type == 3; /* R_CRIS_32.  */
10663     case EM_CR16:
10664       return reloc_type == 3; /* R_CR16_NUM32.  */
10665     case EM_CRX:
10666       return reloc_type == 15; /* R_CRX_NUM32.  */
10667     case EM_CYGNUS_FRV:
10668       return reloc_type == 1;
10669     case EM_CYGNUS_D10V:
10670     case EM_D10V:
10671       return reloc_type == 6; /* R_D10V_32.  */
10672     case EM_CYGNUS_D30V:
10673     case EM_D30V:
10674       return reloc_type == 12; /* R_D30V_32_NORMAL.  */
10675     case EM_DLX:
10676       return reloc_type == 3; /* R_DLX_RELOC_32.  */
10677     case EM_CYGNUS_FR30:
10678     case EM_FR30:
10679       return reloc_type == 3; /* R_FR30_32.  */
10680     case EM_H8S:
10681     case EM_H8_300:
10682     case EM_H8_300H:
10683       return reloc_type == 1; /* R_H8_DIR32.  */
10684     case EM_IA_64:
10685       return reloc_type == 0x65; /* R_IA64_SECREL32LSB.  */
10686     case EM_IP2K_OLD:
10687     case EM_IP2K:
10688       return reloc_type == 2; /* R_IP2K_32.  */
10689     case EM_IQ2000:
10690       return reloc_type == 2; /* R_IQ2000_32.  */
10691     case EM_LATTICEMICO32:
10692       return reloc_type == 3; /* R_LM32_32.  */
10693     case EM_M32C_OLD:
10694     case EM_M32C:
10695       return reloc_type == 3; /* R_M32C_32.  */
10696     case EM_M32R:
10697       return reloc_type == 34; /* R_M32R_32_RELA.  */
10698     case EM_MCORE:
10699       return reloc_type == 1; /* R_MCORE_ADDR32.  */
10700     case EM_CYGNUS_MEP:
10701       return reloc_type == 4; /* R_MEP_32.  */
10702     case EM_METAG:
10703       return reloc_type == 2; /* R_METAG_ADDR32.  */
10704     case EM_MICROBLAZE:
10705       return reloc_type == 1; /* R_MICROBLAZE_32.  */
10706     case EM_MIPS:
10707       return reloc_type == 2; /* R_MIPS_32.  */
10708     case EM_MMIX:
10709       return reloc_type == 4; /* R_MMIX_32.  */
10710     case EM_CYGNUS_MN10200:
10711     case EM_MN10200:
10712       return reloc_type == 1; /* R_MN10200_32.  */
10713     case EM_CYGNUS_MN10300:
10714     case EM_MN10300:
10715       return reloc_type == 1; /* R_MN10300_32.  */
10716     case EM_MOXIE:
10717       return reloc_type == 1; /* R_MOXIE_32.  */
10718     case EM_MSP430_OLD:
10719     case EM_MSP430:
10720       return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32.  */
10721     case EM_MT:
10722       return reloc_type == 2; /* R_MT_32.  */
10723     case EM_NDS32:
10724       return reloc_type == 20; /* R_NDS32_RELA.  */
10725     case EM_ALTERA_NIOS2:
10726       return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32.  */
10727     case EM_NIOS32:
10728       return reloc_type == 1; /* R_NIOS_32.  */
10729     case EM_OR1K:
10730       return reloc_type == 1; /* R_OR1K_32.  */
10731     case EM_PARISC:
10732       return (reloc_type == 1 /* R_PARISC_DIR32.  */
10733               || reloc_type == 41); /* R_PARISC_SECREL32.  */
10734     case EM_PJ:
10735     case EM_PJ_OLD:
10736       return reloc_type == 1; /* R_PJ_DATA_DIR32.  */
10737     case EM_PPC64:
10738       return reloc_type == 1; /* R_PPC64_ADDR32.  */
10739     case EM_PPC:
10740       return reloc_type == 1; /* R_PPC_ADDR32.  */
10741     case EM_RL78:
10742       return reloc_type == 1; /* R_RL78_DIR32.  */
10743     case EM_RX:
10744       return reloc_type == 1; /* R_RX_DIR32.  */
10745     case EM_S370:
10746       return reloc_type == 1; /* R_I370_ADDR31.  */
10747     case EM_S390_OLD:
10748     case EM_S390:
10749       return reloc_type == 4; /* R_S390_32.  */
10750     case EM_SCORE:
10751       return reloc_type == 8; /* R_SCORE_ABS32.  */
10752     case EM_SH:
10753       return reloc_type == 1; /* R_SH_DIR32.  */
10754     case EM_SPARC32PLUS:
10755     case EM_SPARCV9:
10756     case EM_SPARC:
10757       return reloc_type == 3 /* R_SPARC_32.  */
10758         || reloc_type == 23; /* R_SPARC_UA32.  */
10759     case EM_SPU:
10760       return reloc_type == 6; /* R_SPU_ADDR32 */
10761     case EM_TI_C6000:
10762       return reloc_type == 1; /* R_C6000_ABS32.  */
10763     case EM_TILEGX:
10764       return reloc_type == 2; /* R_TILEGX_32.  */
10765     case EM_TILEPRO:
10766       return reloc_type == 1; /* R_TILEPRO_32.  */
10767     case EM_CYGNUS_V850:
10768     case EM_V850:
10769       return reloc_type == 6; /* R_V850_ABS32.  */
10770     case EM_V800:
10771       return reloc_type == 0x33; /* R_V810_WORD.  */
10772     case EM_VAX:
10773       return reloc_type == 1; /* R_VAX_32.  */
10774     case EM_X86_64:
10775     case EM_L1OM:
10776     case EM_K1OM:
10777       return reloc_type == 10; /* R_X86_64_32.  */
10778     case EM_XC16X:
10779     case EM_C166:
10780       return reloc_type == 3; /* R_XC16C_ABS_32.  */
10781     case EM_XGATE:
10782       return reloc_type == 4; /* R_XGATE_32.  */
10783     case EM_XSTORMY16:
10784       return reloc_type == 1; /* R_XSTROMY16_32.  */
10785     case EM_XTENSA_OLD:
10786     case EM_XTENSA:
10787       return reloc_type == 1; /* R_XTENSA_32.  */
10788     default:
10789       error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
10790              elf_header.e_machine);
10791       abort ();
10792     }
10793 }
10794
10795 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
10796    a 32-bit pc-relative RELA relocation used in DWARF debug sections.  */
10797
10798 static bfd_boolean
10799 is_32bit_pcrel_reloc (unsigned int reloc_type)
10800 {
10801   switch (elf_header.e_machine)
10802     {
10803     case EM_386:
10804     case EM_486:
10805       return reloc_type == 2;  /* R_386_PC32.  */
10806     case EM_68K:
10807       return reloc_type == 4;  /* R_68K_PC32.  */
10808     case EM_AARCH64:
10809       return reloc_type == 261; /* R_AARCH64_PREL32 */
10810     case EM_ADAPTEVA_EPIPHANY:
10811       return reloc_type == 6;
10812     case EM_ALPHA:
10813       return reloc_type == 10; /* R_ALPHA_SREL32.  */
10814     case EM_ARM:
10815       return reloc_type == 3;  /* R_ARM_REL32 */
10816     case EM_MICROBLAZE:
10817       return reloc_type == 2;  /* R_MICROBLAZE_32_PCREL.  */
10818     case EM_OR1K:
10819       return reloc_type == 9; /* R_OR1K_32_PCREL.  */
10820     case EM_PARISC:
10821       return reloc_type == 9;  /* R_PARISC_PCREL32.  */
10822     case EM_PPC:
10823       return reloc_type == 26; /* R_PPC_REL32.  */
10824     case EM_PPC64:
10825       return reloc_type == 26; /* R_PPC64_REL32.  */
10826     case EM_S390_OLD:
10827     case EM_S390:
10828       return reloc_type == 5;  /* R_390_PC32.  */
10829     case EM_SH:
10830       return reloc_type == 2;  /* R_SH_REL32.  */
10831     case EM_SPARC32PLUS:
10832     case EM_SPARCV9:
10833     case EM_SPARC:
10834       return reloc_type == 6;  /* R_SPARC_DISP32.  */
10835     case EM_SPU:
10836       return reloc_type == 13; /* R_SPU_REL32.  */
10837     case EM_TILEGX:
10838       return reloc_type == 6; /* R_TILEGX_32_PCREL.  */
10839     case EM_TILEPRO:
10840       return reloc_type == 4; /* R_TILEPRO_32_PCREL.  */
10841     case EM_X86_64:
10842     case EM_L1OM:
10843     case EM_K1OM:
10844       return reloc_type == 2;  /* R_X86_64_PC32.  */
10845     case EM_XTENSA_OLD:
10846     case EM_XTENSA:
10847       return reloc_type == 14; /* R_XTENSA_32_PCREL.  */
10848     default:
10849       /* Do not abort or issue an error message here.  Not all targets use
10850          pc-relative 32-bit relocs in their DWARF debug information and we
10851          have already tested for target coverage in is_32bit_abs_reloc.  A
10852          more helpful warning message will be generated by apply_relocations
10853          anyway, so just return.  */
10854       return FALSE;
10855     }
10856 }
10857
10858 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
10859    a 64-bit absolute RELA relocation used in DWARF debug sections.  */
10860
10861 static bfd_boolean
10862 is_64bit_abs_reloc (unsigned int reloc_type)
10863 {
10864   switch (elf_header.e_machine)
10865     {
10866     case EM_AARCH64:
10867       return reloc_type == 257; /* R_AARCH64_ABS64.  */
10868     case EM_ALPHA:
10869       return reloc_type == 2; /* R_ALPHA_REFQUAD.  */
10870     case EM_IA_64:
10871       return reloc_type == 0x27; /* R_IA64_DIR64LSB.  */
10872     case EM_PARISC:
10873       return reloc_type == 80; /* R_PARISC_DIR64.  */
10874     case EM_PPC64:
10875       return reloc_type == 38; /* R_PPC64_ADDR64.  */
10876     case EM_SPARC32PLUS:
10877     case EM_SPARCV9:
10878     case EM_SPARC:
10879       return reloc_type == 54; /* R_SPARC_UA64.  */
10880     case EM_X86_64:
10881     case EM_L1OM:
10882     case EM_K1OM:
10883       return reloc_type == 1; /* R_X86_64_64.  */
10884     case EM_S390_OLD:
10885     case EM_S390:
10886       return reloc_type == 22;  /* R_S390_64.  */
10887     case EM_TILEGX:
10888       return reloc_type == 1; /* R_TILEGX_64.  */
10889     case EM_MIPS:
10890       return reloc_type == 18;  /* R_MIPS_64.  */
10891     default:
10892       return FALSE;
10893     }
10894 }
10895
10896 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
10897    a 64-bit pc-relative RELA relocation used in DWARF debug sections.  */
10898
10899 static bfd_boolean
10900 is_64bit_pcrel_reloc (unsigned int reloc_type)
10901 {
10902   switch (elf_header.e_machine)
10903     {
10904     case EM_AARCH64:
10905       return reloc_type == 260; /* R_AARCH64_PREL64.  */
10906     case EM_ALPHA:
10907       return reloc_type == 11; /* R_ALPHA_SREL64.  */
10908     case EM_IA_64:
10909       return reloc_type == 0x4f; /* R_IA64_PCREL64LSB.  */
10910     case EM_PARISC:
10911       return reloc_type == 72; /* R_PARISC_PCREL64.  */
10912     case EM_PPC64:
10913       return reloc_type == 44; /* R_PPC64_REL64.  */
10914     case EM_SPARC32PLUS:
10915     case EM_SPARCV9:
10916     case EM_SPARC:
10917       return reloc_type == 46; /* R_SPARC_DISP64.  */
10918     case EM_X86_64:
10919     case EM_L1OM:
10920     case EM_K1OM:
10921       return reloc_type == 24; /* R_X86_64_PC64.  */
10922     case EM_S390_OLD:
10923     case EM_S390:
10924       return reloc_type == 23;  /* R_S390_PC64.  */
10925     case EM_TILEGX:
10926       return reloc_type == 5;  /* R_TILEGX_64_PCREL.  */
10927     default:
10928       return FALSE;
10929     }
10930 }
10931
10932 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
10933    a 24-bit absolute RELA relocation used in DWARF debug sections.  */
10934
10935 static bfd_boolean
10936 is_24bit_abs_reloc (unsigned int reloc_type)
10937 {
10938   switch (elf_header.e_machine)
10939     {
10940     case EM_CYGNUS_MN10200:
10941     case EM_MN10200:
10942       return reloc_type == 4; /* R_MN10200_24.  */
10943     default:
10944       return FALSE;
10945     }
10946 }
10947
10948 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
10949    a 16-bit absolute RELA relocation used in DWARF debug sections.  */
10950
10951 static bfd_boolean
10952 is_16bit_abs_reloc (unsigned int reloc_type)
10953 {
10954   switch (elf_header.e_machine)
10955     {
10956     case EM_AVR_OLD:
10957     case EM_AVR:
10958       return reloc_type == 4; /* R_AVR_16.  */
10959     case EM_ADAPTEVA_EPIPHANY:
10960       return reloc_type == 5;
10961     case EM_CYGNUS_D10V:
10962     case EM_D10V:
10963       return reloc_type == 3; /* R_D10V_16.  */
10964     case EM_H8S:
10965     case EM_H8_300:
10966     case EM_H8_300H:
10967       return reloc_type == R_H8_DIR16;
10968     case EM_IP2K_OLD:
10969     case EM_IP2K:
10970       return reloc_type == 1; /* R_IP2K_16.  */
10971     case EM_M32C_OLD:
10972     case EM_M32C:
10973       return reloc_type == 1; /* R_M32C_16 */
10974     case EM_MSP430:
10975       if (uses_msp430x_relocs ())
10976         return reloc_type == 2; /* R_MSP430_ABS16.  */
10977     case EM_MSP430_OLD:
10978       return reloc_type == 5; /* R_MSP430_16_BYTE.  */
10979     case EM_NDS32:
10980       return reloc_type == 19; /* R_NDS32_RELA.  */
10981     case EM_ALTERA_NIOS2:
10982       return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16.  */
10983     case EM_NIOS32:
10984       return reloc_type == 9; /* R_NIOS_16.  */
10985     case EM_OR1K:
10986       return reloc_type == 2; /* R_OR1K_16.  */
10987     case EM_TI_C6000:
10988       return reloc_type == 2; /* R_C6000_ABS16.  */
10989     case EM_XC16X:
10990     case EM_C166:
10991       return reloc_type == 2; /* R_XC16C_ABS_16.  */
10992     case EM_CYGNUS_MN10200:
10993     case EM_MN10200:
10994       return reloc_type == 2; /* R_MN10200_16.  */
10995     case EM_CYGNUS_MN10300:
10996     case EM_MN10300:
10997       return reloc_type == 2; /* R_MN10300_16.  */
10998     case EM_XGATE:
10999       return reloc_type == 3; /* R_XGATE_16.  */
11000     default:
11001       return FALSE;
11002     }
11003 }
11004
11005 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
11006    relocation entries (possibly formerly used for SHT_GROUP sections).  */
11007
11008 static bfd_boolean
11009 is_none_reloc (unsigned int reloc_type)
11010 {
11011   switch (elf_header.e_machine)
11012     {
11013     case EM_68K:     /* R_68K_NONE.  */
11014     case EM_386:     /* R_386_NONE.  */
11015     case EM_SPARC32PLUS:
11016     case EM_SPARCV9:
11017     case EM_SPARC:   /* R_SPARC_NONE.  */
11018     case EM_MIPS:    /* R_MIPS_NONE.  */
11019     case EM_PARISC:  /* R_PARISC_NONE.  */
11020     case EM_ALPHA:   /* R_ALPHA_NONE.  */
11021     case EM_ADAPTEVA_EPIPHANY:
11022     case EM_PPC:     /* R_PPC_NONE.  */
11023     case EM_PPC64:   /* R_PPC64_NONE.  */
11024     case EM_ARM:     /* R_ARM_NONE.  */
11025     case EM_IA_64:   /* R_IA64_NONE.  */
11026     case EM_SH:      /* R_SH_NONE.  */
11027     case EM_S390_OLD:
11028     case EM_S390:    /* R_390_NONE.  */
11029     case EM_CRIS:    /* R_CRIS_NONE.  */
11030     case EM_X86_64:  /* R_X86_64_NONE.  */
11031     case EM_L1OM:    /* R_X86_64_NONE.  */
11032     case EM_K1OM:    /* R_X86_64_NONE.  */
11033     case EM_MN10300: /* R_MN10300_NONE.  */
11034     case EM_MOXIE:   /* R_MOXIE_NONE.  */
11035     case EM_M32R:    /* R_M32R_NONE.  */
11036     case EM_TI_C6000:/* R_C6000_NONE.  */
11037     case EM_TILEGX:  /* R_TILEGX_NONE.  */
11038     case EM_TILEPRO: /* R_TILEPRO_NONE.  */
11039     case EM_XC16X:
11040     case EM_C166:    /* R_XC16X_NONE.  */
11041     case EM_ALTERA_NIOS2: /* R_NIOS2_NONE.  */
11042     case EM_NIOS32:  /* R_NIOS_NONE.  */
11043     case EM_OR1K:    /* R_OR1K_NONE. */
11044       return reloc_type == 0;
11045     case EM_AARCH64:
11046       return reloc_type == 0 || reloc_type == 256;
11047     case EM_NDS32:
11048       return (reloc_type == 0       /* R_XTENSA_NONE.  */
11049               || reloc_type == 204  /* R_NDS32_DIFF8.  */
11050               || reloc_type == 205  /* R_NDS32_DIFF16.  */
11051               || reloc_type == 206  /* R_NDS32_DIFF32.  */
11052               || reloc_type == 207  /* R_NDS32_ULEB128.  */);
11053     case EM_XTENSA_OLD:
11054     case EM_XTENSA:
11055       return (reloc_type == 0      /* R_XTENSA_NONE.  */
11056               || reloc_type == 17  /* R_XTENSA_DIFF8.  */
11057               || reloc_type == 18  /* R_XTENSA_DIFF16.  */
11058               || reloc_type == 19  /* R_XTENSA_DIFF32.  */);
11059     case EM_METAG:
11060       return reloc_type == 3; /* R_METAG_NONE.  */
11061     }
11062   return FALSE;
11063 }
11064
11065 /* Apply relocations to a section.
11066    Note: So far support has been added only for those relocations
11067    which can be found in debug sections.
11068    FIXME: Add support for more relocations ?  */
11069
11070 static void
11071 apply_relocations (void * file,
11072                    Elf_Internal_Shdr * section,
11073                    unsigned char * start)
11074 {
11075   Elf_Internal_Shdr * relsec;
11076   unsigned char * end = start + section->sh_size;
11077
11078   if (elf_header.e_type != ET_REL)
11079     return;
11080
11081   /* Find the reloc section associated with the section.  */
11082   for (relsec = section_headers;
11083        relsec < section_headers + elf_header.e_shnum;
11084        ++relsec)
11085     {
11086       bfd_boolean is_rela;
11087       unsigned long num_relocs;
11088       Elf_Internal_Rela * relocs;
11089       Elf_Internal_Rela * rp;
11090       Elf_Internal_Shdr * symsec;
11091       Elf_Internal_Sym * symtab;
11092       unsigned long num_syms;
11093       Elf_Internal_Sym * sym;
11094
11095       if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
11096           || relsec->sh_info >= elf_header.e_shnum
11097           || section_headers + relsec->sh_info != section
11098           || relsec->sh_size == 0
11099           || relsec->sh_link >= elf_header.e_shnum)
11100         continue;
11101
11102       is_rela = relsec->sh_type == SHT_RELA;
11103
11104       if (is_rela)
11105         {
11106           if (!slurp_rela_relocs ((FILE *) file, relsec->sh_offset,
11107                                   relsec->sh_size, & relocs, & num_relocs))
11108             return;
11109         }
11110       else
11111         {
11112           if (!slurp_rel_relocs ((FILE *) file, relsec->sh_offset,
11113                                  relsec->sh_size, & relocs, & num_relocs))
11114             return;
11115         }
11116
11117       /* SH uses RELA but uses in place value instead of the addend field.  */
11118       if (elf_header.e_machine == EM_SH)
11119         is_rela = FALSE;
11120
11121       symsec = section_headers + relsec->sh_link;
11122       symtab = GET_ELF_SYMBOLS ((FILE *) file, symsec, & num_syms);
11123
11124       for (rp = relocs; rp < relocs + num_relocs; ++rp)
11125         {
11126           bfd_vma         addend;
11127           unsigned int    reloc_type;
11128           unsigned int    reloc_size;
11129           unsigned char * rloc;
11130           unsigned long   sym_index;
11131
11132           reloc_type = get_reloc_type (rp->r_info);
11133
11134           if (target_specific_reloc_handling (rp, start, symtab))
11135             continue;
11136           else if (is_none_reloc (reloc_type))
11137             continue;
11138           else if (is_32bit_abs_reloc (reloc_type)
11139                    || is_32bit_pcrel_reloc (reloc_type))
11140             reloc_size = 4;
11141           else if (is_64bit_abs_reloc (reloc_type)
11142                    || is_64bit_pcrel_reloc (reloc_type))
11143             reloc_size = 8;
11144           else if (is_24bit_abs_reloc (reloc_type))
11145             reloc_size = 3;
11146           else if (is_16bit_abs_reloc (reloc_type))
11147             reloc_size = 2;
11148           else
11149             {
11150               warn (_("unable to apply unsupported reloc type %d to section %s\n"),
11151                     reloc_type, printable_section_name (section));
11152               continue;
11153             }
11154
11155           rloc = start + rp->r_offset;
11156           if ((rloc + reloc_size) > end || (rloc < start))
11157             {
11158               warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
11159                     (unsigned long) rp->r_offset,
11160                     printable_section_name (section));
11161               continue;
11162             }
11163
11164           sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
11165           if (sym_index >= num_syms)
11166             {
11167               warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
11168                     sym_index, printable_section_name (section));
11169               continue;
11170             }
11171           sym = symtab + sym_index;
11172
11173           /* If the reloc has a symbol associated with it,
11174              make sure that it is of an appropriate type.
11175
11176              Relocations against symbols without type can happen.
11177              Gcc -feliminate-dwarf2-dups may generate symbols
11178              without type for debug info.
11179
11180              Icc generates relocations against function symbols
11181              instead of local labels.
11182
11183              Relocations against object symbols can happen, eg when
11184              referencing a global array.  For an example of this see
11185              the _clz.o binary in libgcc.a.  */
11186           if (sym != symtab
11187               && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
11188             {
11189               warn (_("skipping unexpected symbol type %s in %ld'th relocation in section %s\n"),
11190                     get_symbol_type (ELF_ST_TYPE (sym->st_info)),
11191                     (long int)(rp - relocs),
11192                     printable_section_name (relsec));
11193               continue;
11194             }
11195
11196           addend = 0;
11197           if (is_rela)
11198             addend += rp->r_addend;
11199           /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
11200              partial_inplace.  */
11201           if (!is_rela
11202               || (elf_header.e_machine == EM_XTENSA
11203                   && reloc_type == 1)
11204               || ((elf_header.e_machine == EM_PJ
11205                    || elf_header.e_machine == EM_PJ_OLD)
11206                   && reloc_type == 1)
11207               || ((elf_header.e_machine == EM_D30V
11208                    || elf_header.e_machine == EM_CYGNUS_D30V)
11209                   && reloc_type == 12))
11210             addend += byte_get (rloc, reloc_size);
11211
11212           if (is_32bit_pcrel_reloc (reloc_type)
11213               || is_64bit_pcrel_reloc (reloc_type))
11214             {
11215               /* On HPPA, all pc-relative relocations are biased by 8.  */
11216               if (elf_header.e_machine == EM_PARISC)
11217                 addend -= 8;
11218               byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
11219                         reloc_size);
11220             }
11221           else
11222             byte_put (rloc, addend + sym->st_value, reloc_size);
11223         }
11224
11225       free (symtab);
11226       free (relocs);
11227       break;
11228     }
11229 }
11230
11231 #ifdef SUPPORT_DISASSEMBLY
11232 static int
11233 disassemble_section (Elf_Internal_Shdr * section, FILE * file)
11234 {
11235   printf (_("\nAssembly dump of section %s\n"), printable_section_name (section));
11236
11237   /* FIXME: XXX -- to be done --- XXX */
11238
11239   return 1;
11240 }
11241 #endif
11242
11243 /* Reads in the contents of SECTION from FILE, returning a pointer
11244    to a malloc'ed buffer or NULL if something went wrong.  */
11245
11246 static char *
11247 get_section_contents (Elf_Internal_Shdr * section, FILE * file)
11248 {
11249   bfd_size_type num_bytes;
11250
11251   num_bytes = section->sh_size;
11252
11253   if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
11254     {
11255       printf (_("\nSection '%s' has no data to dump.\n"),
11256               printable_section_name (section));
11257       return NULL;
11258     }
11259
11260   return  (char *) get_data (NULL, file, section->sh_offset, 1, num_bytes,
11261                              _("section contents"));
11262 }
11263
11264
11265 static void
11266 dump_section_as_strings (Elf_Internal_Shdr * section, FILE * file)
11267 {
11268   Elf_Internal_Shdr * relsec;
11269   bfd_size_type num_bytes;
11270   char * data;
11271   char * end;
11272   char * start;
11273   bfd_boolean some_strings_shown;
11274
11275   start = get_section_contents (section, file);
11276   if (start == NULL)
11277     return;
11278
11279   printf (_("\nString dump of section '%s':\n"), printable_section_name (section));
11280
11281   /* If the section being dumped has relocations against it the user might
11282      be expecting these relocations to have been applied.  Check for this
11283      case and issue a warning message in order to avoid confusion.
11284      FIXME: Maybe we ought to have an option that dumps a section with
11285      relocs applied ?  */
11286   for (relsec = section_headers;
11287        relsec < section_headers + elf_header.e_shnum;
11288        ++relsec)
11289     {
11290       if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
11291           || relsec->sh_info >= elf_header.e_shnum
11292           || section_headers + relsec->sh_info != section
11293           || relsec->sh_size == 0
11294           || relsec->sh_link >= elf_header.e_shnum)
11295         continue;
11296
11297       printf (_("  Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
11298       break;
11299     }
11300
11301   num_bytes = section->sh_size;
11302   data = start;
11303   end  = start + num_bytes;
11304   some_strings_shown = FALSE;
11305
11306   while (data < end)
11307     {
11308       while (!ISPRINT (* data))
11309         if (++ data >= end)
11310           break;
11311
11312       if (data < end)
11313         {
11314           size_t maxlen = end - data;
11315
11316 #ifndef __MSVCRT__
11317           /* PR 11128: Use two separate invocations in order to work
11318              around bugs in the Solaris 8 implementation of printf.  */
11319           printf ("  [%6tx]  ", data - start);
11320 #else
11321           printf ("  [%6Ix]  ", (size_t) (data - start));
11322 #endif
11323           print_symbol ((int) maxlen, data);
11324           putchar ('\n');
11325           data += strnlen (data, maxlen);
11326           some_strings_shown = TRUE;
11327         }
11328     }
11329
11330   if (! some_strings_shown)
11331     printf (_("  No strings found in this section."));
11332
11333   free (start);
11334
11335   putchar ('\n');
11336 }
11337
11338 static void
11339 dump_section_as_bytes (Elf_Internal_Shdr * section,
11340                        FILE * file,
11341                        bfd_boolean relocate)
11342 {
11343   Elf_Internal_Shdr * relsec;
11344   bfd_size_type bytes;
11345   bfd_vma addr;
11346   unsigned char * data;
11347   unsigned char * start;
11348
11349   start = (unsigned char *) get_section_contents (section, file);
11350   if (start == NULL)
11351     return;
11352
11353   printf (_("\nHex dump of section '%s':\n"), printable_section_name (section));
11354
11355   if (relocate)
11356     {
11357       apply_relocations (file, section, start);
11358     }
11359   else
11360     {
11361       /* If the section being dumped has relocations against it the user might
11362          be expecting these relocations to have been applied.  Check for this
11363          case and issue a warning message in order to avoid confusion.
11364          FIXME: Maybe we ought to have an option that dumps a section with
11365          relocs applied ?  */
11366       for (relsec = section_headers;
11367            relsec < section_headers + elf_header.e_shnum;
11368            ++relsec)
11369         {
11370           if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
11371               || relsec->sh_info >= elf_header.e_shnum
11372               || section_headers + relsec->sh_info != section
11373               || relsec->sh_size == 0
11374               || relsec->sh_link >= elf_header.e_shnum)
11375             continue;
11376
11377           printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
11378           break;
11379         }
11380     }
11381
11382   addr = section->sh_addr;
11383   bytes = section->sh_size;
11384   data = start;
11385
11386   while (bytes)
11387     {
11388       int j;
11389       int k;
11390       int lbytes;
11391
11392       lbytes = (bytes > 16 ? 16 : bytes);
11393
11394       printf ("  0x%8.8lx ", (unsigned long) addr);
11395
11396       for (j = 0; j < 16; j++)
11397         {
11398           if (j < lbytes)
11399             printf ("%2.2x", data[j]);
11400           else
11401             printf ("  ");
11402
11403           if ((j & 3) == 3)
11404             printf (" ");
11405         }
11406
11407       for (j = 0; j < lbytes; j++)
11408         {
11409           k = data[j];
11410           if (k >= ' ' && k < 0x7f)
11411             printf ("%c", k);
11412           else
11413             printf (".");
11414         }
11415
11416       putchar ('\n');
11417
11418       data  += lbytes;
11419       addr  += lbytes;
11420       bytes -= lbytes;
11421     }
11422
11423   free (start);
11424
11425   putchar ('\n');
11426 }
11427
11428 /* Uncompresses a section that was compressed using zlib, in place.  */
11429
11430 static int
11431 uncompress_section_contents (unsigned char **buffer ATTRIBUTE_UNUSED,
11432                              dwarf_size_type *size ATTRIBUTE_UNUSED)
11433 {
11434 #ifndef HAVE_ZLIB_H
11435   return FALSE;
11436 #else
11437   dwarf_size_type compressed_size = *size;
11438   unsigned char * compressed_buffer = *buffer;
11439   dwarf_size_type uncompressed_size;
11440   unsigned char * uncompressed_buffer;
11441   z_stream strm;
11442   int rc;
11443   dwarf_size_type header_size = 12;
11444
11445   /* Read the zlib header.  In this case, it should be "ZLIB" followed
11446      by the uncompressed section size, 8 bytes in big-endian order.  */
11447   if (compressed_size < header_size
11448       || ! streq ((char *) compressed_buffer, "ZLIB"))
11449     return 0;
11450
11451   uncompressed_size = compressed_buffer[4]; uncompressed_size <<= 8;
11452   uncompressed_size += compressed_buffer[5]; uncompressed_size <<= 8;
11453   uncompressed_size += compressed_buffer[6]; uncompressed_size <<= 8;
11454   uncompressed_size += compressed_buffer[7]; uncompressed_size <<= 8;
11455   uncompressed_size += compressed_buffer[8]; uncompressed_size <<= 8;
11456   uncompressed_size += compressed_buffer[9]; uncompressed_size <<= 8;
11457   uncompressed_size += compressed_buffer[10]; uncompressed_size <<= 8;
11458   uncompressed_size += compressed_buffer[11];
11459
11460   /* It is possible the section consists of several compressed
11461      buffers concatenated together, so we uncompress in a loop.  */
11462   strm.zalloc = NULL;
11463   strm.zfree = NULL;
11464   strm.opaque = NULL;
11465   strm.avail_in = compressed_size - header_size;
11466   strm.next_in = (Bytef *) compressed_buffer + header_size;
11467   strm.avail_out = uncompressed_size;
11468   uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
11469
11470   rc = inflateInit (& strm);
11471   while (strm.avail_in > 0)
11472     {
11473       if (rc != Z_OK)
11474         goto fail;
11475       strm.next_out = ((Bytef *) uncompressed_buffer
11476                        + (uncompressed_size - strm.avail_out));
11477       rc = inflate (&strm, Z_FINISH);
11478       if (rc != Z_STREAM_END)
11479         goto fail;
11480       rc = inflateReset (& strm);
11481     }
11482   rc = inflateEnd (& strm);
11483   if (rc != Z_OK
11484       || strm.avail_out != 0)
11485     goto fail;
11486
11487   free (compressed_buffer);
11488   *buffer = uncompressed_buffer;
11489   *size = uncompressed_size;
11490   return 1;
11491
11492  fail:
11493   free (uncompressed_buffer);
11494   /* Indicate decompression failure.  */
11495   *buffer = NULL;
11496   return 0;
11497 #endif  /* HAVE_ZLIB_H */
11498 }
11499
11500 static int
11501 load_specific_debug_section (enum dwarf_section_display_enum debug,
11502                              Elf_Internal_Shdr * sec, void * file)
11503 {
11504   struct dwarf_section * section = &debug_displays [debug].section;
11505   char buf [64];
11506
11507   /* If it is already loaded, do nothing.  */
11508   if (section->start != NULL)
11509     return 1;
11510
11511   snprintf (buf, sizeof (buf), _("%s section data"), section->name);
11512   section->address = sec->sh_addr;
11513   section->start = (unsigned char *) get_data (NULL, (FILE *) file,
11514                                                sec->sh_offset, 1,
11515                                                sec->sh_size, buf);
11516   if (section->start == NULL)
11517     section->size = 0;
11518   else
11519     {
11520       section->size = sec->sh_size;
11521       if (uncompress_section_contents (&section->start, &section->size))
11522         sec->sh_size = section->size;
11523     }
11524
11525   if (section->start == NULL)
11526     return 0;
11527
11528   if (debug_displays [debug].relocate)
11529     apply_relocations ((FILE *) file, sec, section->start);
11530
11531   return 1;
11532 }
11533
11534 /* If this is not NULL, load_debug_section will only look for sections
11535    within the list of sections given here.  */
11536 unsigned int *section_subset = NULL;
11537
11538 int
11539 load_debug_section (enum dwarf_section_display_enum debug, void * file)
11540 {
11541   struct dwarf_section * section = &debug_displays [debug].section;
11542   Elf_Internal_Shdr * sec;
11543
11544   /* Locate the debug section.  */
11545   sec = find_section_in_set (section->uncompressed_name, section_subset);
11546   if (sec != NULL)
11547     section->name = section->uncompressed_name;
11548   else
11549     {
11550       sec = find_section_in_set (section->compressed_name, section_subset);
11551       if (sec != NULL)
11552         section->name = section->compressed_name;
11553     }
11554   if (sec == NULL)
11555     return 0;
11556
11557   /* If we're loading from a subset of sections, and we've loaded
11558      a section matching this name before, it's likely that it's a
11559      different one.  */
11560   if (section_subset != NULL)
11561     free_debug_section (debug);
11562
11563   return load_specific_debug_section (debug, sec, (FILE *) file);
11564 }
11565
11566 void
11567 free_debug_section (enum dwarf_section_display_enum debug)
11568 {
11569   struct dwarf_section * section = &debug_displays [debug].section;
11570
11571   if (section->start == NULL)
11572     return;
11573
11574   free ((char *) section->start);
11575   section->start = NULL;
11576   section->address = 0;
11577   section->size = 0;
11578 }
11579
11580 static int
11581 display_debug_section (int shndx, Elf_Internal_Shdr * section, FILE * file)
11582 {
11583   char * name = SECTION_NAME (section);
11584   const char * print_name = printable_section_name (section);
11585   bfd_size_type length;
11586   int result = 1;
11587   int i;
11588
11589   length = section->sh_size;
11590   if (length == 0)
11591     {
11592       printf (_("\nSection '%s' has no debugging data.\n"), print_name);
11593       return 0;
11594     }
11595   if (section->sh_type == SHT_NOBITS)
11596     {
11597       /* There is no point in dumping the contents of a debugging section
11598          which has the NOBITS type - the bits in the file will be random.
11599          This can happen when a file containing a .eh_frame section is
11600          stripped with the --only-keep-debug command line option.  */
11601       printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"),
11602               print_name);
11603       return 0;
11604     }
11605
11606   if (const_strneq (name, ".gnu.linkonce.wi."))
11607     name = ".debug_info";
11608
11609   /* See if we know how to display the contents of this section.  */
11610   for (i = 0; i < max; i++)
11611     if (streq (debug_displays[i].section.uncompressed_name, name)
11612         || (i == line && const_strneq (name, ".debug_line."))
11613         || streq (debug_displays[i].section.compressed_name, name))
11614       {
11615         struct dwarf_section * sec = &debug_displays [i].section;
11616         int secondary = (section != find_section (name));
11617
11618         if (secondary)
11619           free_debug_section ((enum dwarf_section_display_enum) i);
11620
11621         if (i == line && const_strneq (name, ".debug_line."))
11622           sec->name = name;
11623         else if (streq (sec->uncompressed_name, name))
11624           sec->name = sec->uncompressed_name;
11625         else
11626           sec->name = sec->compressed_name;
11627         if (load_specific_debug_section ((enum dwarf_section_display_enum) i,
11628                                          section, file))
11629           {
11630             /* If this debug section is part of a CU/TU set in a .dwp file,
11631                restrict load_debug_section to the sections in that set.  */
11632             section_subset = find_cu_tu_set (file, shndx);
11633
11634             result &= debug_displays[i].display (sec, file);
11635
11636             section_subset = NULL;
11637
11638             if (secondary || (i != info && i != abbrev))
11639               free_debug_section ((enum dwarf_section_display_enum) i);
11640           }
11641
11642         break;
11643       }
11644
11645   if (i == max)
11646     {
11647       printf (_("Unrecognized debug section: %s\n"), print_name);
11648       result = 0;
11649     }
11650
11651   return result;
11652 }
11653
11654 /* Set DUMP_SECTS for all sections where dumps were requested
11655    based on section name.  */
11656
11657 static void
11658 initialise_dumps_byname (void)
11659 {
11660   struct dump_list_entry * cur;
11661
11662   for (cur = dump_sects_byname; cur; cur = cur->next)
11663     {
11664       unsigned int i;
11665       int any;
11666
11667       for (i = 0, any = 0; i < elf_header.e_shnum; i++)
11668         if (streq (SECTION_NAME (section_headers + i), cur->name))
11669           {
11670             request_dump_bynumber (i, cur->type);
11671             any = 1;
11672           }
11673
11674       if (!any)
11675         warn (_("Section '%s' was not dumped because it does not exist!\n"),
11676               cur->name);
11677     }
11678 }
11679
11680 static void
11681 process_section_contents (FILE * file)
11682 {
11683   Elf_Internal_Shdr * section;
11684   unsigned int i;
11685
11686   if (! do_dump)
11687     return;
11688
11689   initialise_dumps_byname ();
11690
11691   for (i = 0, section = section_headers;
11692        i < elf_header.e_shnum && i < num_dump_sects;
11693        i++, section++)
11694     {
11695 #ifdef SUPPORT_DISASSEMBLY
11696       if (dump_sects[i] & DISASS_DUMP)
11697         disassemble_section (section, file);
11698 #endif
11699       if (dump_sects[i] & HEX_DUMP)
11700         dump_section_as_bytes (section, file, FALSE);
11701
11702       if (dump_sects[i] & RELOC_DUMP)
11703         dump_section_as_bytes (section, file, TRUE);
11704
11705       if (dump_sects[i] & STRING_DUMP)
11706         dump_section_as_strings (section, file);
11707
11708       if (dump_sects[i] & DEBUG_DUMP)
11709         display_debug_section (i, section, file);
11710     }
11711
11712   /* Check to see if the user requested a
11713      dump of a section that does not exist.  */
11714   while (i++ < num_dump_sects)
11715     if (dump_sects[i])
11716       warn (_("Section %d was not dumped because it does not exist!\n"), i);
11717 }
11718
11719 static void
11720 process_mips_fpe_exception (int mask)
11721 {
11722   if (mask)
11723     {
11724       int first = 1;
11725       if (mask & OEX_FPU_INEX)
11726         fputs ("INEX", stdout), first = 0;
11727       if (mask & OEX_FPU_UFLO)
11728         printf ("%sUFLO", first ? "" : "|"), first = 0;
11729       if (mask & OEX_FPU_OFLO)
11730         printf ("%sOFLO", first ? "" : "|"), first = 0;
11731       if (mask & OEX_FPU_DIV0)
11732         printf ("%sDIV0", first ? "" : "|"), first = 0;
11733       if (mask & OEX_FPU_INVAL)
11734         printf ("%sINVAL", first ? "" : "|");
11735     }
11736   else
11737     fputs ("0", stdout);
11738 }
11739
11740 /* Display's the value of TAG at location P.  If TAG is
11741    greater than 0 it is assumed to be an unknown tag, and
11742    a message is printed to this effect.  Otherwise it is
11743    assumed that a message has already been printed.
11744
11745    If the bottom bit of TAG is set it assumed to have a
11746    string value, otherwise it is assumed to have an integer
11747    value.
11748
11749    Returns an updated P pointing to the first unread byte
11750    beyond the end of TAG's value.
11751
11752    Reads at or beyond END will not be made.  */
11753
11754 static unsigned char *
11755 display_tag_value (int tag,
11756                    unsigned char * p,
11757                    const unsigned char * const end)
11758 {
11759   unsigned long val;
11760
11761   if (tag > 0)
11762     printf ("  Tag_unknown_%d: ", tag);
11763
11764   if (p >= end)
11765     {
11766       warn (_("corrupt tag\n"));
11767     }
11768   else if (tag & 1)
11769     {
11770       /* PR 17531 file: 027-19978-0.004.  */
11771       size_t maxlen = (end - p) - 1;
11772
11773       putchar ('"');
11774       print_symbol ((int) maxlen, (const char *) p);
11775       printf ("\"\n");
11776       p += strnlen ((char *) p, maxlen) + 1;
11777     }
11778   else
11779     {
11780       unsigned int len;
11781
11782       val = read_uleb128 (p, &len, end);
11783       p += len;
11784       printf ("%ld (0x%lx)\n", val, val);
11785     }
11786
11787   return p;
11788 }
11789
11790 /* ARM EABI attributes section.  */
11791 typedef struct
11792 {
11793   unsigned int tag;
11794   const char * name;
11795   /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup.  */
11796   unsigned int type;
11797   const char ** table;
11798 } arm_attr_public_tag;
11799
11800 static const char * arm_attr_tag_CPU_arch[] =
11801   {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
11802    "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8"};
11803 static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
11804 static const char * arm_attr_tag_THUMB_ISA_use[] =
11805   {"No", "Thumb-1", "Thumb-2"};
11806 static const char * arm_attr_tag_FP_arch[] =
11807   {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
11808    "FP for ARMv8"};
11809 static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
11810 static const char * arm_attr_tag_Advanced_SIMD_arch[] =
11811   {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8"};
11812 static const char * arm_attr_tag_PCS_config[] =
11813   {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
11814    "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
11815 static const char * arm_attr_tag_ABI_PCS_R9_use[] =
11816   {"V6", "SB", "TLS", "Unused"};
11817 static const char * arm_attr_tag_ABI_PCS_RW_data[] =
11818   {"Absolute", "PC-relative", "SB-relative", "None"};
11819 static const char * arm_attr_tag_ABI_PCS_RO_data[] =
11820   {"Absolute", "PC-relative", "None"};
11821 static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
11822   {"None", "direct", "GOT-indirect"};
11823 static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
11824   {"None", "??? 1", "2", "??? 3", "4"};
11825 static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
11826 static const char * arm_attr_tag_ABI_FP_denormal[] =
11827   {"Unused", "Needed", "Sign only"};
11828 static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
11829 static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
11830 static const char * arm_attr_tag_ABI_FP_number_model[] =
11831   {"Unused", "Finite", "RTABI", "IEEE 754"};
11832 static const char * arm_attr_tag_ABI_enum_size[] =
11833   {"Unused", "small", "int", "forced to int"};
11834 static const char * arm_attr_tag_ABI_HardFP_use[] =
11835   {"As Tag_FP_arch", "SP only", "DP only", "SP and DP"};
11836 static const char * arm_attr_tag_ABI_VFP_args[] =
11837   {"AAPCS", "VFP registers", "custom"};
11838 static const char * arm_attr_tag_ABI_WMMX_args[] =
11839   {"AAPCS", "WMMX registers", "custom"};
11840 static const char * arm_attr_tag_ABI_optimization_goals[] =
11841   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
11842     "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
11843 static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
11844   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
11845     "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
11846 static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
11847 static const char * arm_attr_tag_FP_HP_extension[] =
11848   {"Not Allowed", "Allowed"};
11849 static const char * arm_attr_tag_ABI_FP_16bit_format[] =
11850   {"None", "IEEE 754", "Alternative Format"};
11851 static const char * arm_attr_tag_MPextension_use[] =
11852   {"Not Allowed", "Allowed"};
11853 static const char * arm_attr_tag_DIV_use[] =
11854   {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
11855     "Allowed in v7-A with integer division extension"};
11856 static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
11857 static const char * arm_attr_tag_Virtualization_use[] =
11858   {"Not Allowed", "TrustZone", "Virtualization Extensions",
11859     "TrustZone and Virtualization Extensions"};
11860 static const char * arm_attr_tag_MPextension_use_legacy[] =
11861   {"Not Allowed", "Allowed"};
11862
11863 #define LOOKUP(id, name) \
11864   {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
11865 static arm_attr_public_tag arm_attr_public_tags[] =
11866 {
11867   {4, "CPU_raw_name", 1, NULL},
11868   {5, "CPU_name", 1, NULL},
11869   LOOKUP(6, CPU_arch),
11870   {7, "CPU_arch_profile", 0, NULL},
11871   LOOKUP(8, ARM_ISA_use),
11872   LOOKUP(9, THUMB_ISA_use),
11873   LOOKUP(10, FP_arch),
11874   LOOKUP(11, WMMX_arch),
11875   LOOKUP(12, Advanced_SIMD_arch),
11876   LOOKUP(13, PCS_config),
11877   LOOKUP(14, ABI_PCS_R9_use),
11878   LOOKUP(15, ABI_PCS_RW_data),
11879   LOOKUP(16, ABI_PCS_RO_data),
11880   LOOKUP(17, ABI_PCS_GOT_use),
11881   LOOKUP(18, ABI_PCS_wchar_t),
11882   LOOKUP(19, ABI_FP_rounding),
11883   LOOKUP(20, ABI_FP_denormal),
11884   LOOKUP(21, ABI_FP_exceptions),
11885   LOOKUP(22, ABI_FP_user_exceptions),
11886   LOOKUP(23, ABI_FP_number_model),
11887   {24, "ABI_align_needed", 0, NULL},
11888   {25, "ABI_align_preserved", 0, NULL},
11889   LOOKUP(26, ABI_enum_size),
11890   LOOKUP(27, ABI_HardFP_use),
11891   LOOKUP(28, ABI_VFP_args),
11892   LOOKUP(29, ABI_WMMX_args),
11893   LOOKUP(30, ABI_optimization_goals),
11894   LOOKUP(31, ABI_FP_optimization_goals),
11895   {32, "compatibility", 0, NULL},
11896   LOOKUP(34, CPU_unaligned_access),
11897   LOOKUP(36, FP_HP_extension),
11898   LOOKUP(38, ABI_FP_16bit_format),
11899   LOOKUP(42, MPextension_use),
11900   LOOKUP(44, DIV_use),
11901   {64, "nodefaults", 0, NULL},
11902   {65, "also_compatible_with", 0, NULL},
11903   LOOKUP(66, T2EE_use),
11904   {67, "conformance", 1, NULL},
11905   LOOKUP(68, Virtualization_use),
11906   LOOKUP(70, MPextension_use_legacy)
11907 };
11908 #undef LOOKUP
11909
11910 static unsigned char *
11911 display_arm_attribute (unsigned char * p,
11912                        const unsigned char * const end)
11913 {
11914   unsigned int tag;
11915   unsigned int len;
11916   unsigned int val;
11917   arm_attr_public_tag * attr;
11918   unsigned i;
11919   unsigned int type;
11920
11921   tag = read_uleb128 (p, &len, end);
11922   p += len;
11923   attr = NULL;
11924   for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
11925     {
11926       if (arm_attr_public_tags[i].tag == tag)
11927         {
11928           attr = &arm_attr_public_tags[i];
11929           break;
11930         }
11931     }
11932
11933   if (attr)
11934     {
11935       printf ("  Tag_%s: ", attr->name);
11936       switch (attr->type)
11937         {
11938         case 0:
11939           switch (tag)
11940             {
11941             case 7: /* Tag_CPU_arch_profile.  */
11942               val = read_uleb128 (p, &len, end);
11943               p += len;
11944               switch (val)
11945                 {
11946                 case 0: printf (_("None\n")); break;
11947                 case 'A': printf (_("Application\n")); break;
11948                 case 'R': printf (_("Realtime\n")); break;
11949                 case 'M': printf (_("Microcontroller\n")); break;
11950                 case 'S': printf (_("Application or Realtime\n")); break;
11951                 default: printf ("??? (%d)\n", val); break;
11952                 }
11953               break;
11954
11955             case 24: /* Tag_align_needed.  */
11956               val = read_uleb128 (p, &len, end);
11957               p += len;
11958               switch (val)
11959                 {
11960                 case 0: printf (_("None\n")); break;
11961                 case 1: printf (_("8-byte\n")); break;
11962                 case 2: printf (_("4-byte\n")); break;
11963                 case 3: printf ("??? 3\n"); break;
11964                 default:
11965                   if (val <= 12)
11966                     printf (_("8-byte and up to %d-byte extended\n"),
11967                             1 << val);
11968                   else
11969                     printf ("??? (%d)\n", val);
11970                   break;
11971                 }
11972               break;
11973
11974             case 25: /* Tag_align_preserved.  */
11975               val = read_uleb128 (p, &len, end);
11976               p += len;
11977               switch (val)
11978                 {
11979                 case 0: printf (_("None\n")); break;
11980                 case 1: printf (_("8-byte, except leaf SP\n")); break;
11981                 case 2: printf (_("8-byte\n")); break;
11982                 case 3: printf ("??? 3\n"); break;
11983                 default:
11984                   if (val <= 12)
11985                     printf (_("8-byte and up to %d-byte extended\n"),
11986                             1 << val);
11987                   else
11988                     printf ("??? (%d)\n", val);
11989                   break;
11990                 }
11991               break;
11992
11993             case 32: /* Tag_compatibility.  */
11994               {
11995                 size_t maxlen;
11996
11997                 val = read_uleb128 (p, &len, end);
11998                 p += len;
11999                 maxlen = (end - p) - 1;
12000                 printf (_("flag = %d, vendor = "), val);
12001                 print_symbol ((int) maxlen, (const char *) p);
12002                 putchar ('\n');
12003                 p += strnlen ((char *) p, maxlen) + 1;
12004               }
12005               break;
12006
12007             case 64: /* Tag_nodefaults.  */
12008               p++;
12009               printf (_("True\n"));
12010               break;
12011
12012             case 65: /* Tag_also_compatible_with.  */
12013               val = read_uleb128 (p, &len, end);
12014               p += len;
12015               if (val == 6 /* Tag_CPU_arch.  */)
12016                 {
12017                   val = read_uleb128 (p, &len, end);
12018                   p += len;
12019                   if ((unsigned int) val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
12020                     printf ("??? (%d)\n", val);
12021                   else
12022                     printf ("%s\n", arm_attr_tag_CPU_arch[val]);
12023                 }
12024               else
12025                 printf ("???\n");
12026               while (p < end && *(p++) != '\0' /* NUL terminator.  */)
12027                 ;
12028               break;
12029
12030             default:
12031               abort ();
12032             }
12033           return p;
12034
12035         case 1:
12036           return display_tag_value (-1, p, end);
12037         case 2:
12038           return display_tag_value (0, p, end);
12039
12040         default:
12041           assert (attr->type & 0x80);
12042           val = read_uleb128 (p, &len, end);
12043           p += len;
12044           type = attr->type & 0x7f;
12045           if (val >= type)
12046             printf ("??? (%d)\n", val);
12047           else
12048             printf ("%s\n", attr->table[val]);
12049           return p;
12050         }
12051     }
12052
12053   return display_tag_value (tag, p, end);
12054 }
12055
12056 static unsigned char *
12057 display_gnu_attribute (unsigned char * p,
12058                        unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const),
12059                        const unsigned char * const end)
12060 {
12061   int tag;
12062   unsigned int len;
12063   int val;
12064
12065   tag = read_uleb128 (p, &len, end);
12066   p += len;
12067
12068   /* Tag_compatibility is the only generic GNU attribute defined at
12069      present.  */
12070   if (tag == 32)
12071     {
12072       val = read_uleb128 (p, &len, end);
12073       p += len;
12074
12075       printf (_("flag = %d, vendor = "), val);
12076       if (p == end)
12077         {
12078           printf (_("<corrupt>\n"));
12079           warn (_("corrupt vendor attribute\n"));
12080         }
12081       else
12082         {
12083           size_t maxlen = (end - p) - 1;
12084
12085           print_symbol ((int) maxlen, (const char *) p);
12086           putchar ('\n');
12087           p += strnlen ((char *) p, maxlen) + 1;
12088         }
12089       return p;
12090     }
12091
12092   if ((tag & 2) == 0 && display_proc_gnu_attribute)
12093     return display_proc_gnu_attribute (p, tag, end);
12094
12095   return display_tag_value (tag, p, end);
12096 }
12097
12098 static unsigned char *
12099 display_power_gnu_attribute (unsigned char * p,
12100                              int tag,
12101                              const unsigned char * const end)
12102 {
12103   unsigned int len;
12104   int val;
12105
12106   if (tag == Tag_GNU_Power_ABI_FP)
12107     {
12108       val = read_uleb128 (p, &len, end);
12109       p += len;
12110       printf ("  Tag_GNU_Power_ABI_FP: ");
12111
12112       switch (val)
12113         {
12114         case 0:
12115           printf (_("Hard or soft float\n"));
12116           break;
12117         case 1:
12118           printf (_("Hard float\n"));
12119           break;
12120         case 2:
12121           printf (_("Soft float\n"));
12122           break;
12123         case 3:
12124           printf (_("Single-precision hard float\n"));
12125           break;
12126         default:
12127           printf ("??? (%d)\n", val);
12128           break;
12129         }
12130       return p;
12131    }
12132
12133   if (tag == Tag_GNU_Power_ABI_Vector)
12134     {
12135       val = read_uleb128 (p, &len, end);
12136       p += len;
12137       printf ("  Tag_GNU_Power_ABI_Vector: ");
12138       switch (val)
12139         {
12140         case 0:
12141           printf (_("Any\n"));
12142           break;
12143         case 1:
12144           printf (_("Generic\n"));
12145           break;
12146         case 2:
12147           printf ("AltiVec\n");
12148           break;
12149         case 3:
12150           printf ("SPE\n");
12151           break;
12152         default:
12153           printf ("??? (%d)\n", val);
12154           break;
12155         }
12156       return p;
12157    }
12158
12159   if (tag == Tag_GNU_Power_ABI_Struct_Return)
12160     {
12161       if (p == end)
12162         {
12163           warn (_("corrupt Tag_GNU_Power_ABI_Struct_Return\n"));
12164           return p;
12165         }
12166
12167       val = read_uleb128 (p, &len, end);
12168       p += len;
12169       printf ("  Tag_GNU_Power_ABI_Struct_Return: ");
12170       switch (val)
12171        {
12172        case 0:
12173          printf (_("Any\n"));
12174          break;
12175        case 1:
12176          printf ("r3/r4\n");
12177          break;
12178        case 2:
12179          printf (_("Memory\n"));
12180          break;
12181        default:
12182          printf ("??? (%d)\n", val);
12183          break;
12184        }
12185       return p;
12186     }
12187
12188   return display_tag_value (tag & 1, p, end);
12189 }
12190
12191 static void
12192 display_sparc_hwcaps (int mask)
12193 {
12194   if (mask)
12195     {
12196       int first = 1;
12197
12198       if (mask & ELF_SPARC_HWCAP_MUL32)
12199         fputs ("mul32", stdout), first = 0;
12200       if (mask & ELF_SPARC_HWCAP_DIV32)
12201         printf ("%sdiv32", first ? "" : "|"), first = 0;
12202       if (mask & ELF_SPARC_HWCAP_FSMULD)
12203         printf ("%sfsmuld", first ? "" : "|"), first = 0;
12204       if (mask & ELF_SPARC_HWCAP_V8PLUS)
12205         printf ("%sv8plus", first ? "" : "|"), first = 0;
12206       if (mask & ELF_SPARC_HWCAP_POPC)
12207         printf ("%spopc", first ? "" : "|"), first = 0;
12208       if (mask & ELF_SPARC_HWCAP_VIS)
12209         printf ("%svis", first ? "" : "|"), first = 0;
12210       if (mask & ELF_SPARC_HWCAP_VIS2)
12211         printf ("%svis2", first ? "" : "|"), first = 0;
12212       if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
12213         printf ("%sASIBlkInit", first ? "" : "|"), first = 0;
12214       if (mask & ELF_SPARC_HWCAP_FMAF)
12215         printf ("%sfmaf", first ? "" : "|"), first = 0;
12216       if (mask & ELF_SPARC_HWCAP_VIS3)
12217         printf ("%svis3", first ? "" : "|"), first = 0;
12218       if (mask & ELF_SPARC_HWCAP_HPC)
12219         printf ("%shpc", first ? "" : "|"), first = 0;
12220       if (mask & ELF_SPARC_HWCAP_RANDOM)
12221         printf ("%srandom", first ? "" : "|"), first = 0;
12222       if (mask & ELF_SPARC_HWCAP_TRANS)
12223         printf ("%strans", first ? "" : "|"), first = 0;
12224       if (mask & ELF_SPARC_HWCAP_FJFMAU)
12225         printf ("%sfjfmau", first ? "" : "|"), first = 0;
12226       if (mask & ELF_SPARC_HWCAP_IMA)
12227         printf ("%sima", first ? "" : "|"), first = 0;
12228       if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
12229         printf ("%scspare", first ? "" : "|"), first = 0;
12230     }
12231   else
12232     fputc ('0', stdout);
12233   fputc ('\n', stdout);
12234 }
12235
12236 static void
12237 display_sparc_hwcaps2 (int mask)
12238 {
12239   if (mask)
12240     {
12241       int first = 1;
12242
12243       if (mask & ELF_SPARC_HWCAP2_FJATHPLUS)
12244         fputs ("fjathplus", stdout), first = 0;
12245       if (mask & ELF_SPARC_HWCAP2_VIS3B)
12246         printf ("%svis3b", first ? "" : "|"), first = 0;
12247       if (mask & ELF_SPARC_HWCAP2_ADP)
12248         printf ("%sadp", first ? "" : "|"), first = 0;
12249       if (mask & ELF_SPARC_HWCAP2_SPARC5)
12250         printf ("%ssparc5", first ? "" : "|"), first = 0;
12251       if (mask & ELF_SPARC_HWCAP2_MWAIT)
12252         printf ("%smwait", first ? "" : "|"), first = 0;
12253       if (mask & ELF_SPARC_HWCAP2_XMPMUL)
12254         printf ("%sxmpmul", first ? "" : "|"), first = 0;
12255       if (mask & ELF_SPARC_HWCAP2_XMONT)
12256         printf ("%sxmont2", first ? "" : "|"), first = 0;
12257       if (mask & ELF_SPARC_HWCAP2_NSEC)
12258         printf ("%snsec", first ? "" : "|"), first = 0;
12259       if (mask & ELF_SPARC_HWCAP2_FJATHHPC)
12260         printf ("%sfjathhpc", first ? "" : "|"), first = 0;
12261       if (mask & ELF_SPARC_HWCAP2_FJDES)
12262         printf ("%sfjdes", first ? "" : "|"), first = 0;
12263       if (mask & ELF_SPARC_HWCAP2_FJAES)
12264         printf ("%sfjaes", first ? "" : "|"), first = 0;
12265     }
12266   else
12267     fputc ('0', stdout);
12268   fputc ('\n', stdout);
12269 }
12270
12271 static unsigned char *
12272 display_sparc_gnu_attribute (unsigned char * p,
12273                              int tag,
12274                              const unsigned char * const end)
12275 {
12276   unsigned int len;
12277   int val;
12278
12279   if (tag == Tag_GNU_Sparc_HWCAPS)
12280     {
12281       val = read_uleb128 (p, &len, end);
12282       p += len;
12283       printf ("  Tag_GNU_Sparc_HWCAPS: ");
12284       display_sparc_hwcaps (val);
12285       return p;
12286     }
12287   if (tag == Tag_GNU_Sparc_HWCAPS2)
12288     {
12289       val = read_uleb128 (p, &len, end);
12290       p += len;
12291       printf ("  Tag_GNU_Sparc_HWCAPS2: ");
12292       display_sparc_hwcaps2 (val);
12293       return p;
12294     }
12295
12296   return display_tag_value (tag, p, end);
12297 }
12298
12299 static void
12300 print_mips_fp_abi_value (int val)
12301 {
12302   switch (val)
12303     {
12304     case Val_GNU_MIPS_ABI_FP_ANY:
12305       printf (_("Hard or soft float\n"));
12306       break;
12307     case Val_GNU_MIPS_ABI_FP_DOUBLE:
12308       printf (_("Hard float (double precision)\n"));
12309       break;
12310     case Val_GNU_MIPS_ABI_FP_SINGLE:
12311       printf (_("Hard float (single precision)\n"));
12312       break;
12313     case Val_GNU_MIPS_ABI_FP_SOFT:
12314       printf (_("Soft float\n"));
12315       break;
12316     case Val_GNU_MIPS_ABI_FP_OLD_64:
12317       printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
12318       break;
12319     case Val_GNU_MIPS_ABI_FP_XX:
12320       printf (_("Hard float (32-bit CPU, Any FPU)\n"));
12321       break;
12322     case Val_GNU_MIPS_ABI_FP_64:
12323       printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
12324       break;
12325     case Val_GNU_MIPS_ABI_FP_64A:
12326       printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
12327       break;
12328     default:
12329       printf ("??? (%d)\n", val);
12330       break;
12331     }
12332 }
12333
12334 static unsigned char *
12335 display_mips_gnu_attribute (unsigned char * p,
12336                             int tag,
12337                             const unsigned char * const end)
12338 {
12339   if (tag == Tag_GNU_MIPS_ABI_FP)
12340     {
12341       unsigned int len;
12342       int val;
12343
12344       val = read_uleb128 (p, &len, end);
12345       p += len;
12346       printf ("  Tag_GNU_MIPS_ABI_FP: ");
12347
12348       print_mips_fp_abi_value (val);
12349
12350       return p;
12351    }
12352
12353   if (tag == Tag_GNU_MIPS_ABI_MSA)
12354     {
12355       unsigned int len;
12356       int val;
12357
12358       val = read_uleb128 (p, &len, end);
12359       p += len;
12360       printf ("  Tag_GNU_MIPS_ABI_MSA: ");
12361
12362       switch (val)
12363         {
12364         case Val_GNU_MIPS_ABI_MSA_ANY:
12365           printf (_("Any MSA or not\n"));
12366           break;
12367         case Val_GNU_MIPS_ABI_MSA_128:
12368           printf (_("128-bit MSA\n"));
12369           break;
12370         default:
12371           printf ("??? (%d)\n", val);
12372           break;
12373         }
12374       return p;
12375     }
12376
12377   return display_tag_value (tag & 1, p, end);
12378 }
12379
12380 static unsigned char *
12381 display_tic6x_attribute (unsigned char * p,
12382                          const unsigned char * const end)
12383 {
12384   int tag;
12385   unsigned int len;
12386   int val;
12387
12388   tag = read_uleb128 (p, &len, end);
12389   p += len;
12390
12391   switch (tag)
12392     {
12393     case Tag_ISA:
12394       val = read_uleb128 (p, &len, end);
12395       p += len;
12396       printf ("  Tag_ISA: ");
12397
12398       switch (val)
12399         {
12400         case C6XABI_Tag_ISA_none:
12401           printf (_("None\n"));
12402           break;
12403         case C6XABI_Tag_ISA_C62X:
12404           printf ("C62x\n");
12405           break;
12406         case C6XABI_Tag_ISA_C67X:
12407           printf ("C67x\n");
12408           break;
12409         case C6XABI_Tag_ISA_C67XP:
12410           printf ("C67x+\n");
12411           break;
12412         case C6XABI_Tag_ISA_C64X:
12413           printf ("C64x\n");
12414           break;
12415         case C6XABI_Tag_ISA_C64XP:
12416           printf ("C64x+\n");
12417           break;
12418         case C6XABI_Tag_ISA_C674X:
12419           printf ("C674x\n");
12420           break;
12421         default:
12422           printf ("??? (%d)\n", val);
12423           break;
12424         }
12425       return p;
12426
12427     case Tag_ABI_wchar_t:
12428       val = read_uleb128 (p, &len, end);
12429       p += len;
12430       printf ("  Tag_ABI_wchar_t: ");
12431       switch (val)
12432         {
12433         case 0:
12434           printf (_("Not used\n"));
12435           break;
12436         case 1:
12437           printf (_("2 bytes\n"));
12438           break;
12439         case 2:
12440           printf (_("4 bytes\n"));
12441           break;
12442         default:
12443           printf ("??? (%d)\n", val);
12444           break;
12445         }
12446       return p;
12447
12448     case Tag_ABI_stack_align_needed:
12449       val = read_uleb128 (p, &len, end);
12450       p += len;
12451       printf ("  Tag_ABI_stack_align_needed: ");
12452       switch (val)
12453         {
12454         case 0:
12455           printf (_("8-byte\n"));
12456           break;
12457         case 1:
12458           printf (_("16-byte\n"));
12459           break;
12460         default:
12461           printf ("??? (%d)\n", val);
12462           break;
12463         }
12464       return p;
12465
12466     case Tag_ABI_stack_align_preserved:
12467       val = read_uleb128 (p, &len, end);
12468       p += len;
12469       printf ("  Tag_ABI_stack_align_preserved: ");
12470       switch (val)
12471         {
12472         case 0:
12473           printf (_("8-byte\n"));
12474           break;
12475         case 1:
12476           printf (_("16-byte\n"));
12477           break;
12478         default:
12479           printf ("??? (%d)\n", val);
12480           break;
12481         }
12482       return p;
12483
12484     case Tag_ABI_DSBT:
12485       val = read_uleb128 (p, &len, end);
12486       p += len;
12487       printf ("  Tag_ABI_DSBT: ");
12488       switch (val)
12489         {
12490         case 0:
12491           printf (_("DSBT addressing not used\n"));
12492           break;
12493         case 1:
12494           printf (_("DSBT addressing used\n"));
12495           break;
12496         default:
12497           printf ("??? (%d)\n", val);
12498           break;
12499         }
12500       return p;
12501
12502     case Tag_ABI_PID:
12503       val = read_uleb128 (p, &len, end);
12504       p += len;
12505       printf ("  Tag_ABI_PID: ");
12506       switch (val)
12507         {
12508         case 0:
12509           printf (_("Data addressing position-dependent\n"));
12510           break;
12511         case 1:
12512           printf (_("Data addressing position-independent, GOT near DP\n"));
12513           break;
12514         case 2:
12515           printf (_("Data addressing position-independent, GOT far from DP\n"));
12516           break;
12517         default:
12518           printf ("??? (%d)\n", val);
12519           break;
12520         }
12521       return p;
12522
12523     case Tag_ABI_PIC:
12524       val = read_uleb128 (p, &len, end);
12525       p += len;
12526       printf ("  Tag_ABI_PIC: ");
12527       switch (val)
12528         {
12529         case 0:
12530           printf (_("Code addressing position-dependent\n"));
12531           break;
12532         case 1:
12533           printf (_("Code addressing position-independent\n"));
12534           break;
12535         default:
12536           printf ("??? (%d)\n", val);
12537           break;
12538         }
12539       return p;
12540
12541     case Tag_ABI_array_object_alignment:
12542       val = read_uleb128 (p, &len, end);
12543       p += len;
12544       printf ("  Tag_ABI_array_object_alignment: ");
12545       switch (val)
12546         {
12547         case 0:
12548           printf (_("8-byte\n"));
12549           break;
12550         case 1:
12551           printf (_("4-byte\n"));
12552           break;
12553         case 2:
12554           printf (_("16-byte\n"));
12555           break;
12556         default:
12557           printf ("??? (%d)\n", val);
12558           break;
12559         }
12560       return p;
12561
12562     case Tag_ABI_array_object_align_expected:
12563       val = read_uleb128 (p, &len, end);
12564       p += len;
12565       printf ("  Tag_ABI_array_object_align_expected: ");
12566       switch (val)
12567         {
12568         case 0:
12569           printf (_("8-byte\n"));
12570           break;
12571         case 1:
12572           printf (_("4-byte\n"));
12573           break;
12574         case 2:
12575           printf (_("16-byte\n"));
12576           break;
12577         default:
12578           printf ("??? (%d)\n", val);
12579           break;
12580         }
12581       return p;
12582
12583     case Tag_ABI_compatibility:
12584       {
12585         size_t maxlen;
12586
12587         val = read_uleb128 (p, &len, end);
12588         p += len;
12589         printf ("  Tag_ABI_compatibility: ");
12590         maxlen = (end - p) - 1;
12591         printf (_("flag = %d, vendor = "), val);
12592         print_symbol ((int) maxlen, (const char *) p);
12593         putchar ('\n');
12594         p += strnlen ((char *) p, maxlen) + 1;
12595         return p;
12596       }
12597
12598     case Tag_ABI_conformance:
12599       {
12600         size_t maxlen;
12601
12602         printf ("  Tag_ABI_conformance: ");
12603         maxlen = (end - p) - 1;
12604         putchar ('"');
12605         print_symbol ((int) maxlen, (const char *) p);
12606         printf ("\"\n");
12607         p += strnlen ((char *) p, maxlen) + 1;
12608         return p;
12609       }
12610     }
12611
12612   return display_tag_value (tag, p, end);
12613 }
12614
12615 static void
12616 display_raw_attribute (unsigned char * p, unsigned char * end)
12617 {
12618   unsigned long addr = 0;
12619   size_t bytes = end - p;
12620
12621   assert (end > p);
12622   while (bytes)
12623     {
12624       int j;
12625       int k;
12626       int lbytes = (bytes > 16 ? 16 : bytes);
12627
12628       printf ("  0x%8.8lx ", addr);
12629
12630       for (j = 0; j < 16; j++)
12631         {
12632           if (j < lbytes)
12633             printf ("%2.2x", p[j]);
12634           else
12635             printf ("  ");
12636
12637           if ((j & 3) == 3)
12638             printf (" ");
12639         }
12640
12641       for (j = 0; j < lbytes; j++)
12642         {
12643           k = p[j];
12644           if (k >= ' ' && k < 0x7f)
12645             printf ("%c", k);
12646           else
12647             printf (".");
12648         }
12649
12650       putchar ('\n');
12651
12652       p  += lbytes;
12653       bytes -= lbytes;
12654       addr += lbytes;
12655     }
12656
12657   putchar ('\n');
12658 }
12659
12660 static unsigned char *
12661 display_msp430x_attribute (unsigned char * p,
12662                            const unsigned char * const end)
12663 {
12664   unsigned int len;
12665   int val;
12666   int tag;
12667
12668   tag = read_uleb128 (p, & len, end);
12669   p += len;
12670
12671   switch (tag)
12672     {
12673     case OFBA_MSPABI_Tag_ISA:
12674       val = read_uleb128 (p, &len, end);
12675       p += len;
12676       printf ("  Tag_ISA: ");
12677       switch (val)
12678         {
12679         case 0: printf (_("None\n")); break;
12680         case 1: printf (_("MSP430\n")); break;
12681         case 2: printf (_("MSP430X\n")); break;
12682         default: printf ("??? (%d)\n", val); break;
12683         }
12684       break;
12685
12686     case OFBA_MSPABI_Tag_Code_Model:
12687       val = read_uleb128 (p, &len, end);
12688       p += len;
12689       printf ("  Tag_Code_Model: ");
12690       switch (val)
12691         {
12692         case 0: printf (_("None\n")); break;
12693         case 1: printf (_("Small\n")); break;
12694         case 2: printf (_("Large\n")); break;
12695         default: printf ("??? (%d)\n", val); break;
12696         }
12697       break;
12698
12699     case OFBA_MSPABI_Tag_Data_Model:
12700       val = read_uleb128 (p, &len, end);
12701       p += len;
12702       printf ("  Tag_Data_Model: ");
12703       switch (val)
12704         {
12705         case 0: printf (_("None\n")); break;
12706         case 1: printf (_("Small\n")); break;
12707         case 2: printf (_("Large\n")); break;
12708         case 3: printf (_("Restricted Large\n")); break;
12709         default: printf ("??? (%d)\n", val); break;
12710         }
12711       break;
12712
12713     default:
12714       printf (_("  <unknown tag %d>: "), tag);
12715
12716       if (tag & 1)
12717         {
12718           size_t maxlen;
12719
12720           maxlen = (end - p) - 1;
12721           putchar ('"');
12722           print_symbol ((int) maxlen, (const char *) p);
12723           printf ("\"\n");
12724           p += strnlen ((char *) p, maxlen) + 1;
12725         }
12726       else
12727         {
12728           val = read_uleb128 (p, &len, end);
12729           p += len;
12730           printf ("%d (0x%x)\n", val, val);
12731         }
12732       break;
12733    }
12734
12735   return p;
12736 }
12737
12738 static int
12739 process_attributes (FILE * file,
12740                     const char * public_name,
12741                     unsigned int proc_type,
12742                     unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
12743                     unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const))
12744 {
12745   Elf_Internal_Shdr * sect;
12746   unsigned i;
12747
12748   /* Find the section header so that we get the size.  */
12749   for (i = 0, sect = section_headers;
12750        i < elf_header.e_shnum;
12751        i++, sect++)
12752     {
12753       unsigned char * contents;
12754       unsigned char * p;
12755
12756       if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
12757         continue;
12758
12759       contents = (unsigned char *) get_data (NULL, file, sect->sh_offset, 1,
12760                                              sect->sh_size, _("attributes"));
12761       if (contents == NULL)
12762         continue;
12763
12764       p = contents;
12765       if (*p == 'A')
12766         {
12767           bfd_vma section_len;
12768
12769           section_len = sect->sh_size - 1;
12770           p++;
12771
12772           while (section_len > 0)
12773             {
12774               bfd_vma attr_len;
12775               unsigned int namelen;
12776               bfd_boolean public_section;
12777               bfd_boolean gnu_section;
12778
12779               if (section_len <= 4)
12780                 {
12781                   error (_("Tag section ends prematurely\n"));
12782                   break;
12783                 }
12784               attr_len = byte_get (p, 4);
12785               p += 4;
12786
12787               if (attr_len > section_len)
12788                 {
12789                   error (_("Bad attribute length (%u > %u)\n"),
12790                           (unsigned) attr_len, (unsigned) section_len);
12791                   attr_len = section_len;
12792                 }
12793               /* PR 17531: file: 001-101425-0.004  */
12794               else if (attr_len < 5)
12795                 {
12796                   error (_("Attribute length of %u is too small\n"), (unsigned) attr_len);
12797                   break;
12798                 }
12799
12800               section_len -= attr_len;
12801               attr_len -= 4;
12802
12803               namelen = strnlen ((char *) p, attr_len) + 1;
12804               if (namelen == 0 || namelen >= attr_len)
12805                 {
12806                   error (_("Corrupt attribute section name\n"));
12807                   break;
12808                 }
12809
12810               printf (_("Attribute Section: "));
12811               print_symbol (INT_MAX, (const char *) p);
12812               putchar ('\n');
12813
12814               if (public_name && streq ((char *) p, public_name))
12815                 public_section = TRUE;
12816               else
12817                 public_section = FALSE;
12818
12819               if (streq ((char *) p, "gnu"))
12820                 gnu_section = TRUE;
12821               else
12822                 gnu_section = FALSE;
12823
12824               p += namelen;
12825               attr_len -= namelen;
12826
12827               while (attr_len > 0 && p < contents + sect->sh_size)
12828                 {
12829                   int tag;
12830                   int val;
12831                   bfd_vma size;
12832                   unsigned char * end;
12833
12834                   /* PR binutils/17531: Safe handling of corrupt files.  */
12835                   if (attr_len < 6)
12836                     {
12837                       error (_("Unused bytes at end of section\n"));
12838                       section_len = 0;
12839                       break;
12840                     }
12841
12842                   tag = *(p++);
12843                   size = byte_get (p, 4);
12844                   if (size > attr_len)
12845                     {
12846                       error (_("Bad subsection length (%u > %u)\n"),
12847                               (unsigned) size, (unsigned) attr_len);
12848                       size = attr_len;
12849                     }
12850                   /* PR binutils/17531: Safe handling of corrupt files.  */
12851                   if (size < 6)
12852                     {
12853                       error (_("Bad subsection length (%u < 6)\n"),
12854                               (unsigned) size);
12855                       section_len = 0;
12856                       break;
12857                     }
12858
12859                   attr_len -= size;
12860                   end = p + size - 1;
12861                   assert (end <= contents + sect->sh_size);
12862                   p += 4;
12863
12864                   switch (tag)
12865                     {
12866                     case 1:
12867                       printf (_("File Attributes\n"));
12868                       break;
12869                     case 2:
12870                       printf (_("Section Attributes:"));
12871                       goto do_numlist;
12872                     case 3:
12873                       printf (_("Symbol Attributes:"));
12874                     do_numlist:
12875                       for (;;)
12876                         {
12877                           unsigned int j;
12878
12879                           val = read_uleb128 (p, &j, end);
12880                           p += j;
12881                           if (val == 0)
12882                             break;
12883                           printf (" %d", val);
12884                         }
12885                       printf ("\n");
12886                       break;
12887                     default:
12888                       printf (_("Unknown tag: %d\n"), tag);
12889                       public_section = FALSE;
12890                       break;
12891                     }
12892
12893                   if (public_section && display_pub_attribute != NULL)
12894                     {
12895                       while (p < end)
12896                         p = display_pub_attribute (p, end);
12897                       assert (p <= end);
12898                     }
12899                   else if (gnu_section && display_proc_gnu_attribute != NULL)
12900                     {
12901                       while (p < end)
12902                         p = display_gnu_attribute (p,
12903                                                    display_proc_gnu_attribute,
12904                                                    end);
12905                       assert (p <= end);
12906                     }
12907                   else if (p < end)
12908                     {
12909                       printf (_("  Unknown attribute:\n"));
12910                       display_raw_attribute (p, end);
12911                       p = end;
12912                     }
12913                   else
12914                     attr_len = 0;
12915                 }
12916             }
12917         }
12918       else
12919         printf (_("Unknown format '%c' (%d)\n"), *p, *p);
12920
12921       free (contents);
12922     }
12923   return 1;
12924 }
12925
12926 static int
12927 process_arm_specific (FILE * file)
12928 {
12929   return process_attributes (file, "aeabi", SHT_ARM_ATTRIBUTES,
12930                              display_arm_attribute, NULL);
12931 }
12932
12933 static int
12934 process_power_specific (FILE * file)
12935 {
12936   return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
12937                              display_power_gnu_attribute);
12938 }
12939
12940 static int
12941 process_sparc_specific (FILE * file)
12942 {
12943   return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
12944                              display_sparc_gnu_attribute);
12945 }
12946
12947 static int
12948 process_tic6x_specific (FILE * file)
12949 {
12950   return process_attributes (file, "c6xabi", SHT_C6000_ATTRIBUTES,
12951                              display_tic6x_attribute, NULL);
12952 }
12953
12954 static int
12955 process_msp430x_specific (FILE * file)
12956 {
12957   return process_attributes (file, "mspabi", SHT_MSP430_ATTRIBUTES,
12958                              display_msp430x_attribute, NULL);
12959 }
12960
12961 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
12962    Print the Address, Access and Initial fields of an entry at VMA ADDR
12963    and return the VMA of the next entry.  */
12964
12965 static bfd_vma
12966 print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
12967 {
12968   printf ("  ");
12969   print_vma (addr, LONG_HEX);
12970   printf (" ");
12971   if (addr < pltgot + 0xfff0)
12972     printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
12973   else
12974     printf ("%10s", "");
12975   printf (" ");
12976   if (data == NULL)
12977     printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
12978   else
12979     {
12980       bfd_vma entry;
12981
12982       entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
12983       print_vma (entry, LONG_HEX);
12984     }
12985   return addr + (is_32bit_elf ? 4 : 8);
12986 }
12987
12988 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
12989    PLTGOT.  Print the Address and Initial fields of an entry at VMA
12990    ADDR and return the VMA of the next entry.  */
12991
12992 static bfd_vma
12993 print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
12994 {
12995   printf ("  ");
12996   print_vma (addr, LONG_HEX);
12997   printf (" ");
12998   if (data == NULL)
12999     printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
13000   else
13001     {
13002       bfd_vma entry;
13003
13004       entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
13005       print_vma (entry, LONG_HEX);
13006     }
13007   return addr + (is_32bit_elf ? 4 : 8);
13008 }
13009
13010 static void
13011 print_mips_ases (unsigned int mask)
13012 {
13013   if (mask & AFL_ASE_DSP)
13014     fputs ("\n\tDSP ASE", stdout);
13015   if (mask & AFL_ASE_DSPR2)
13016     fputs ("\n\tDSP R2 ASE", stdout);
13017   if (mask & AFL_ASE_EVA)
13018     fputs ("\n\tEnhanced VA Scheme", stdout);
13019   if (mask & AFL_ASE_MCU)
13020     fputs ("\n\tMCU (MicroController) ASE", stdout);
13021   if (mask & AFL_ASE_MDMX)
13022     fputs ("\n\tMDMX ASE", stdout);
13023   if (mask & AFL_ASE_MIPS3D)
13024     fputs ("\n\tMIPS-3D ASE", stdout);
13025   if (mask & AFL_ASE_MT)
13026     fputs ("\n\tMT ASE", stdout);
13027   if (mask & AFL_ASE_SMARTMIPS)
13028     fputs ("\n\tSmartMIPS ASE", stdout);
13029   if (mask & AFL_ASE_VIRT)
13030     fputs ("\n\tVZ ASE", stdout);
13031   if (mask & AFL_ASE_MSA)
13032     fputs ("\n\tMSA ASE", stdout);
13033   if (mask & AFL_ASE_MIPS16)
13034     fputs ("\n\tMIPS16 ASE", stdout);
13035   if (mask & AFL_ASE_MICROMIPS)
13036     fputs ("\n\tMICROMIPS ASE", stdout);
13037   if (mask & AFL_ASE_XPA)
13038     fputs ("\n\tXPA ASE", stdout);
13039   if (mask == 0)
13040     fprintf (stdout, "\n\t%s", _("None"));
13041   else if ((mask & ~AFL_ASE_MASK) != 0)
13042     fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
13043 }
13044
13045 static void
13046 print_mips_isa_ext (unsigned int isa_ext)
13047 {
13048   switch (isa_ext)
13049     {
13050     case 0:
13051       fputs (_("None"), stdout);
13052       break;
13053     case AFL_EXT_XLR:
13054       fputs ("RMI XLR", stdout);
13055       break;
13056     case AFL_EXT_OCTEON3:
13057       fputs ("Cavium Networks Octeon3", stdout);
13058       break;
13059     case AFL_EXT_OCTEON2:
13060       fputs ("Cavium Networks Octeon2", stdout);
13061       break;
13062     case AFL_EXT_OCTEONP:
13063       fputs ("Cavium Networks OcteonP", stdout);
13064       break;
13065     case AFL_EXT_LOONGSON_3A:
13066       fputs ("Loongson 3A", stdout);
13067       break;
13068     case AFL_EXT_OCTEON:
13069       fputs ("Cavium Networks Octeon", stdout);
13070       break;
13071     case AFL_EXT_5900:
13072       fputs ("Toshiba R5900", stdout);
13073       break;
13074     case AFL_EXT_4650:
13075       fputs ("MIPS R4650", stdout);
13076       break;
13077     case AFL_EXT_4010:
13078       fputs ("LSI R4010", stdout);
13079       break;
13080     case AFL_EXT_4100:
13081       fputs ("NEC VR4100", stdout);
13082       break;
13083     case AFL_EXT_3900:
13084       fputs ("Toshiba R3900", stdout);
13085       break;
13086     case AFL_EXT_10000:
13087       fputs ("MIPS R10000", stdout);
13088       break;
13089     case AFL_EXT_SB1:
13090       fputs ("Broadcom SB-1", stdout);
13091       break;
13092     case AFL_EXT_4111:
13093       fputs ("NEC VR4111/VR4181", stdout);
13094       break;
13095     case AFL_EXT_4120:
13096       fputs ("NEC VR4120", stdout);
13097       break;
13098     case AFL_EXT_5400:
13099       fputs ("NEC VR5400", stdout);
13100       break;
13101     case AFL_EXT_5500:
13102       fputs ("NEC VR5500", stdout);
13103       break;
13104     case AFL_EXT_LOONGSON_2E:
13105       fputs ("ST Microelectronics Loongson 2E", stdout);
13106       break;
13107     case AFL_EXT_LOONGSON_2F:
13108       fputs ("ST Microelectronics Loongson 2F", stdout);
13109       break;
13110     default:
13111       fprintf (stdout, "%s (%d)", _("Unknown"), isa_ext);
13112     }
13113 }
13114
13115 static int
13116 get_mips_reg_size (int reg_size)
13117 {
13118   return (reg_size == AFL_REG_NONE) ? 0
13119          : (reg_size == AFL_REG_32) ? 32
13120          : (reg_size == AFL_REG_64) ? 64
13121          : (reg_size == AFL_REG_128) ? 128
13122          : -1;
13123 }
13124
13125 static int
13126 process_mips_specific (FILE * file)
13127 {
13128   Elf_Internal_Dyn * entry;
13129   Elf_Internal_Shdr *sect = NULL;
13130   size_t liblist_offset = 0;
13131   size_t liblistno = 0;
13132   size_t conflictsno = 0;
13133   size_t options_offset = 0;
13134   size_t conflicts_offset = 0;
13135   size_t pltrelsz = 0;
13136   size_t pltrel = 0;
13137   bfd_vma pltgot = 0;
13138   bfd_vma mips_pltgot = 0;
13139   bfd_vma jmprel = 0;
13140   bfd_vma local_gotno = 0;
13141   bfd_vma gotsym = 0;
13142   bfd_vma symtabno = 0;
13143
13144   process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
13145                       display_mips_gnu_attribute);
13146
13147   sect = find_section (".MIPS.abiflags");
13148
13149   if (sect != NULL)
13150     {
13151       Elf_External_ABIFlags_v0 *abiflags_ext;
13152       Elf_Internal_ABIFlags_v0 abiflags_in;
13153
13154       if (sizeof (Elf_External_ABIFlags_v0) != sect->sh_size)
13155         fputs ("\nCorrupt ABI Flags section.\n", stdout);
13156       else
13157         {
13158           abiflags_ext = get_data (NULL, file, sect->sh_offset, 1,
13159                                    sect->sh_size, _("MIPS ABI Flags section"));
13160           if (abiflags_ext)
13161             {
13162               abiflags_in.version = BYTE_GET (abiflags_ext->version);
13163               abiflags_in.isa_level = BYTE_GET (abiflags_ext->isa_level);
13164               abiflags_in.isa_rev = BYTE_GET (abiflags_ext->isa_rev);
13165               abiflags_in.gpr_size = BYTE_GET (abiflags_ext->gpr_size);
13166               abiflags_in.cpr1_size = BYTE_GET (abiflags_ext->cpr1_size);
13167               abiflags_in.cpr2_size = BYTE_GET (abiflags_ext->cpr2_size);
13168               abiflags_in.fp_abi = BYTE_GET (abiflags_ext->fp_abi);
13169               abiflags_in.isa_ext = BYTE_GET (abiflags_ext->isa_ext);
13170               abiflags_in.ases = BYTE_GET (abiflags_ext->ases);
13171               abiflags_in.flags1 = BYTE_GET (abiflags_ext->flags1);
13172               abiflags_in.flags2 = BYTE_GET (abiflags_ext->flags2);
13173
13174               printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in.version);
13175               printf ("\nISA: MIPS%d", abiflags_in.isa_level);
13176               if (abiflags_in.isa_rev > 1)
13177                 printf ("r%d", abiflags_in.isa_rev);
13178               printf ("\nGPR size: %d",
13179                       get_mips_reg_size (abiflags_in.gpr_size));
13180               printf ("\nCPR1 size: %d",
13181                       get_mips_reg_size (abiflags_in.cpr1_size));
13182               printf ("\nCPR2 size: %d",
13183                       get_mips_reg_size (abiflags_in.cpr2_size));
13184               fputs ("\nFP ABI: ", stdout);
13185               print_mips_fp_abi_value (abiflags_in.fp_abi);
13186               fputs ("ISA Extension: ", stdout);
13187               print_mips_isa_ext (abiflags_in.isa_ext);
13188               fputs ("\nASEs:", stdout);
13189               print_mips_ases (abiflags_in.ases);
13190               printf ("\nFLAGS 1: %8.8lx", abiflags_in.flags1);
13191               printf ("\nFLAGS 2: %8.8lx", abiflags_in.flags2);
13192               fputc ('\n', stdout);
13193               free (abiflags_ext);
13194             }
13195         }
13196     }
13197
13198   /* We have a lot of special sections.  Thanks SGI!  */
13199   if (dynamic_section == NULL)
13200     /* No information available.  */
13201     return 0;
13202
13203   for (entry = dynamic_section;
13204        /* PR 17531 file: 012-50589-0.004.  */
13205        entry < dynamic_section + dynamic_nent && entry->d_tag != DT_NULL;
13206        ++entry)
13207     switch (entry->d_tag)
13208       {
13209       case DT_MIPS_LIBLIST:
13210         liblist_offset
13211           = offset_from_vma (file, entry->d_un.d_val,
13212                              liblistno * sizeof (Elf32_External_Lib));
13213         break;
13214       case DT_MIPS_LIBLISTNO:
13215         liblistno = entry->d_un.d_val;
13216         break;
13217       case DT_MIPS_OPTIONS:
13218         options_offset = offset_from_vma (file, entry->d_un.d_val, 0);
13219         break;
13220       case DT_MIPS_CONFLICT:
13221         conflicts_offset
13222           = offset_from_vma (file, entry->d_un.d_val,
13223                              conflictsno * sizeof (Elf32_External_Conflict));
13224         break;
13225       case DT_MIPS_CONFLICTNO:
13226         conflictsno = entry->d_un.d_val;
13227         break;
13228       case DT_PLTGOT:
13229         pltgot = entry->d_un.d_ptr;
13230         break;
13231       case DT_MIPS_LOCAL_GOTNO:
13232         local_gotno = entry->d_un.d_val;
13233         break;
13234       case DT_MIPS_GOTSYM:
13235         gotsym = entry->d_un.d_val;
13236         break;
13237       case DT_MIPS_SYMTABNO:
13238         symtabno = entry->d_un.d_val;
13239         break;
13240       case DT_MIPS_PLTGOT:
13241         mips_pltgot = entry->d_un.d_ptr;
13242         break;
13243       case DT_PLTREL:
13244         pltrel = entry->d_un.d_val;
13245         break;
13246       case DT_PLTRELSZ:
13247         pltrelsz = entry->d_un.d_val;
13248         break;
13249       case DT_JMPREL:
13250         jmprel = entry->d_un.d_ptr;
13251         break;
13252       default:
13253         break;
13254       }
13255
13256   if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
13257     {
13258       Elf32_External_Lib * elib;
13259       size_t cnt;
13260
13261       elib = (Elf32_External_Lib *) get_data (NULL, file, liblist_offset,
13262                                               liblistno,
13263                                               sizeof (Elf32_External_Lib),
13264                                               _("liblist section data"));
13265       if (elib)
13266         {
13267           printf (_("\nSection '.liblist' contains %lu entries:\n"),
13268                   (unsigned long) liblistno);
13269           fputs (_("     Library              Time Stamp          Checksum   Version Flags\n"),
13270                  stdout);
13271
13272           for (cnt = 0; cnt < liblistno; ++cnt)
13273             {
13274               Elf32_Lib liblist;
13275               time_t atime;
13276               char timebuf[20];
13277               struct tm * tmp;
13278
13279               liblist.l_name = BYTE_GET (elib[cnt].l_name);
13280               atime = BYTE_GET (elib[cnt].l_time_stamp);
13281               liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
13282               liblist.l_version = BYTE_GET (elib[cnt].l_version);
13283               liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
13284
13285               tmp = gmtime (&atime);
13286               snprintf (timebuf, sizeof (timebuf),
13287                         "%04u-%02u-%02uT%02u:%02u:%02u",
13288                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
13289                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
13290
13291               printf ("%3lu: ", (unsigned long) cnt);
13292               if (VALID_DYNAMIC_NAME (liblist.l_name))
13293                 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
13294               else
13295                 printf (_("<corrupt: %9ld>"), liblist.l_name);
13296               printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
13297                       liblist.l_version);
13298
13299               if (liblist.l_flags == 0)
13300                 puts (_(" NONE"));
13301               else
13302                 {
13303                   static const struct
13304                   {
13305                     const char * name;
13306                     int bit;
13307                   }
13308                   l_flags_vals[] =
13309                   {
13310                     { " EXACT_MATCH", LL_EXACT_MATCH },
13311                     { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
13312                     { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
13313                     { " EXPORTS", LL_EXPORTS },
13314                     { " DELAY_LOAD", LL_DELAY_LOAD },
13315                     { " DELTA", LL_DELTA }
13316                   };
13317                   int flags = liblist.l_flags;
13318                   size_t fcnt;
13319
13320                   for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
13321                     if ((flags & l_flags_vals[fcnt].bit) != 0)
13322                       {
13323                         fputs (l_flags_vals[fcnt].name, stdout);
13324                         flags ^= l_flags_vals[fcnt].bit;
13325                       }
13326                   if (flags != 0)
13327                     printf (" %#x", (unsigned int) flags);
13328
13329                   puts ("");
13330                 }
13331             }
13332
13333           free (elib);
13334         }
13335     }
13336
13337   if (options_offset != 0)
13338     {
13339       Elf_External_Options * eopt;
13340       Elf_Internal_Options * iopt;
13341       Elf_Internal_Options * option;
13342       size_t offset;
13343       int cnt;
13344       sect = section_headers;
13345
13346       /* Find the section header so that we get the size.  */
13347       sect = find_section_by_type (SHT_MIPS_OPTIONS);
13348       /* PR 17533 file: 012-277276-0.004.  */ 
13349       if (sect == NULL)
13350         {
13351           error (_("No MIPS_OPTIONS header found\n"));
13352           return 0;
13353         }
13354
13355       eopt = (Elf_External_Options *) get_data (NULL, file, options_offset, 1,
13356                                                 sect->sh_size, _("options"));
13357       if (eopt)
13358         {
13359           iopt = (Elf_Internal_Options *)
13360               cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
13361           if (iopt == NULL)
13362             {
13363               error (_("Out of memory\n"));
13364               return 0;
13365             }
13366
13367           offset = cnt = 0;
13368           option = iopt;
13369
13370           while (offset < sect->sh_size)
13371             {
13372               Elf_External_Options * eoption;
13373
13374               eoption = (Elf_External_Options *) ((char *) eopt + offset);
13375
13376               option->kind = BYTE_GET (eoption->kind);
13377               option->size = BYTE_GET (eoption->size);
13378               option->section = BYTE_GET (eoption->section);
13379               option->info = BYTE_GET (eoption->info);
13380
13381               offset += option->size;
13382
13383               ++option;
13384               ++cnt;
13385             }
13386
13387           printf (_("\nSection '%s' contains %d entries:\n"),
13388                   printable_section_name (sect), cnt);
13389
13390           option = iopt;
13391
13392           while (cnt-- > 0)
13393             {
13394               size_t len;
13395
13396               switch (option->kind)
13397                 {
13398                 case ODK_NULL:
13399                   /* This shouldn't happen.  */
13400                   printf (" NULL       %d %lx", option->section, option->info);
13401                   break;
13402                 case ODK_REGINFO:
13403                   printf (" REGINFO    ");
13404                   if (elf_header.e_machine == EM_MIPS)
13405                     {
13406                       /* 32bit form.  */
13407                       Elf32_External_RegInfo * ereg;
13408                       Elf32_RegInfo reginfo;
13409
13410                       ereg = (Elf32_External_RegInfo *) (option + 1);
13411                       reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
13412                       reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
13413                       reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
13414                       reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
13415                       reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
13416                       reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
13417
13418                       printf ("GPR %08lx  GP 0x%lx\n",
13419                               reginfo.ri_gprmask,
13420                               (unsigned long) reginfo.ri_gp_value);
13421                       printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
13422                               reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
13423                               reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
13424                     }
13425                   else
13426                     {
13427                       /* 64 bit form.  */
13428                       Elf64_External_RegInfo * ereg;
13429                       Elf64_Internal_RegInfo reginfo;
13430
13431                       ereg = (Elf64_External_RegInfo *) (option + 1);
13432                       reginfo.ri_gprmask    = BYTE_GET (ereg->ri_gprmask);
13433                       reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
13434                       reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
13435                       reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
13436                       reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
13437                       reginfo.ri_gp_value   = BYTE_GET (ereg->ri_gp_value);
13438
13439                       printf ("GPR %08lx  GP 0x",
13440                               reginfo.ri_gprmask);
13441                       printf_vma (reginfo.ri_gp_value);
13442                       printf ("\n");
13443
13444                       printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
13445                               reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
13446                               reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
13447                     }
13448                   ++option;
13449                   continue;
13450                 case ODK_EXCEPTIONS:
13451                   fputs (" EXCEPTIONS fpe_min(", stdout);
13452                   process_mips_fpe_exception (option->info & OEX_FPU_MIN);
13453                   fputs (") fpe_max(", stdout);
13454                   process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
13455                   fputs (")", stdout);
13456
13457                   if (option->info & OEX_PAGE0)
13458                     fputs (" PAGE0", stdout);
13459                   if (option->info & OEX_SMM)
13460                     fputs (" SMM", stdout);
13461                   if (option->info & OEX_FPDBUG)
13462                     fputs (" FPDBUG", stdout);
13463                   if (option->info & OEX_DISMISS)
13464                     fputs (" DISMISS", stdout);
13465                   break;
13466                 case ODK_PAD:
13467                   fputs (" PAD       ", stdout);
13468                   if (option->info & OPAD_PREFIX)
13469                     fputs (" PREFIX", stdout);
13470                   if (option->info & OPAD_POSTFIX)
13471                     fputs (" POSTFIX", stdout);
13472                   if (option->info & OPAD_SYMBOL)
13473                     fputs (" SYMBOL", stdout);
13474                   break;
13475                 case ODK_HWPATCH:
13476                   fputs (" HWPATCH   ", stdout);
13477                   if (option->info & OHW_R4KEOP)
13478                     fputs (" R4KEOP", stdout);
13479                   if (option->info & OHW_R8KPFETCH)
13480                     fputs (" R8KPFETCH", stdout);
13481                   if (option->info & OHW_R5KEOP)
13482                     fputs (" R5KEOP", stdout);
13483                   if (option->info & OHW_R5KCVTL)
13484                     fputs (" R5KCVTL", stdout);
13485                   break;
13486                 case ODK_FILL:
13487                   fputs (" FILL       ", stdout);
13488                   /* XXX Print content of info word?  */
13489                   break;
13490                 case ODK_TAGS:
13491                   fputs (" TAGS       ", stdout);
13492                   /* XXX Print content of info word?  */
13493                   break;
13494                 case ODK_HWAND:
13495                   fputs (" HWAND     ", stdout);
13496                   if (option->info & OHWA0_R4KEOP_CHECKED)
13497                     fputs (" R4KEOP_CHECKED", stdout);
13498                   if (option->info & OHWA0_R4KEOP_CLEAN)
13499                     fputs (" R4KEOP_CLEAN", stdout);
13500                   break;
13501                 case ODK_HWOR:
13502                   fputs (" HWOR      ", stdout);
13503                   if (option->info & OHWA0_R4KEOP_CHECKED)
13504                     fputs (" R4KEOP_CHECKED", stdout);
13505                   if (option->info & OHWA0_R4KEOP_CLEAN)
13506                     fputs (" R4KEOP_CLEAN", stdout);
13507                   break;
13508                 case ODK_GP_GROUP:
13509                   printf (" GP_GROUP  %#06lx  self-contained %#06lx",
13510                           option->info & OGP_GROUP,
13511                           (option->info & OGP_SELF) >> 16);
13512                   break;
13513                 case ODK_IDENT:
13514                   printf (" IDENT     %#06lx  self-contained %#06lx",
13515                           option->info & OGP_GROUP,
13516                           (option->info & OGP_SELF) >> 16);
13517                   break;
13518                 default:
13519                   /* This shouldn't happen.  */
13520                   printf (" %3d ???     %d %lx",
13521                           option->kind, option->section, option->info);
13522                   break;
13523                 }
13524
13525               len = sizeof (* eopt);
13526               while (len < option->size)
13527                 if (((char *) option)[len] >= ' '
13528                     && ((char *) option)[len] < 0x7f)
13529                   printf ("%c", ((char *) option)[len++]);
13530                 else
13531                   printf ("\\%03o", ((char *) option)[len++]);
13532
13533               fputs ("\n", stdout);
13534               ++option;
13535             }
13536
13537           free (eopt);
13538         }
13539     }
13540
13541   if (conflicts_offset != 0 && conflictsno != 0)
13542     {
13543       Elf32_Conflict * iconf;
13544       size_t cnt;
13545
13546       if (dynamic_symbols == NULL)
13547         {
13548           error (_("conflict list found without a dynamic symbol table\n"));
13549           return 0;
13550         }
13551
13552       iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
13553       if (iconf == NULL)
13554         {
13555           error (_("Out of memory\n"));
13556           return 0;
13557         }
13558
13559       if (is_32bit_elf)
13560         {
13561           Elf32_External_Conflict * econf32;
13562
13563           econf32 = (Elf32_External_Conflict *)
13564               get_data (NULL, file, conflicts_offset, conflictsno,
13565                         sizeof (* econf32), _("conflict"));
13566           if (!econf32)
13567             return 0;
13568
13569           for (cnt = 0; cnt < conflictsno; ++cnt)
13570             iconf[cnt] = BYTE_GET (econf32[cnt]);
13571
13572           free (econf32);
13573         }
13574       else
13575         {
13576           Elf64_External_Conflict * econf64;
13577
13578           econf64 = (Elf64_External_Conflict *)
13579               get_data (NULL, file, conflicts_offset, conflictsno,
13580                         sizeof (* econf64), _("conflict"));
13581           if (!econf64)
13582             return 0;
13583
13584           for (cnt = 0; cnt < conflictsno; ++cnt)
13585             iconf[cnt] = BYTE_GET (econf64[cnt]);
13586
13587           free (econf64);
13588         }
13589
13590       printf (_("\nSection '.conflict' contains %lu entries:\n"),
13591               (unsigned long) conflictsno);
13592       puts (_("  Num:    Index       Value  Name"));
13593
13594       for (cnt = 0; cnt < conflictsno; ++cnt)
13595         {
13596           printf ("%5lu: %8lu  ", (unsigned long) cnt, iconf[cnt]);
13597
13598           if (iconf[cnt] >= num_dynamic_syms)
13599             printf (_("<corrupt symbol index>"));
13600           else
13601             {
13602               Elf_Internal_Sym * psym;
13603
13604               psym = & dynamic_symbols[iconf[cnt]];
13605               print_vma (psym->st_value, FULL_HEX);
13606               putchar (' ');
13607               if (VALID_DYNAMIC_NAME (psym->st_name))
13608                 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
13609               else
13610                 printf (_("<corrupt: %14ld>"), psym->st_name);
13611             }
13612           putchar ('\n');
13613         }
13614
13615       free (iconf);
13616     }
13617
13618   if (pltgot != 0 && local_gotno != 0)
13619     {
13620       bfd_vma ent, local_end, global_end;
13621       size_t i, offset;
13622       unsigned char * data;
13623       int addr_size;
13624
13625       ent = pltgot;
13626       addr_size = (is_32bit_elf ? 4 : 8);
13627       local_end = pltgot + local_gotno * addr_size;
13628
13629       /* PR binutils/17533 file: 012-111227-0.004  */
13630       if (symtabno < gotsym)
13631         {
13632           error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
13633                  (long) gotsym, (long) symtabno);
13634           return 0;
13635         }
13636  
13637       global_end = local_end + (symtabno - gotsym) * addr_size;
13638       assert (global_end >= local_end);
13639       offset = offset_from_vma (file, pltgot, global_end - pltgot);
13640       data = (unsigned char *) get_data (NULL, file, offset,
13641                                          global_end - pltgot, 1,
13642                                          _("Global Offset Table data"));
13643       if (data == NULL)
13644         return 0;
13645
13646       printf (_("\nPrimary GOT:\n"));
13647       printf (_(" Canonical gp value: "));
13648       print_vma (pltgot + 0x7ff0, LONG_HEX);
13649       printf ("\n\n");
13650
13651       printf (_(" Reserved entries:\n"));
13652       printf (_("  %*s %10s %*s Purpose\n"),
13653               addr_size * 2, _("Address"), _("Access"),
13654               addr_size * 2, _("Initial"));
13655       ent = print_mips_got_entry (data, pltgot, ent);
13656       printf (_(" Lazy resolver\n"));
13657       if (data
13658           && (byte_get (data + ent - pltgot, addr_size)
13659               >> (addr_size * 8 - 1)) != 0)
13660         {
13661           ent = print_mips_got_entry (data, pltgot, ent);
13662           printf (_(" Module pointer (GNU extension)\n"));
13663         }
13664       printf ("\n");
13665
13666       if (ent < local_end)
13667         {
13668           printf (_(" Local entries:\n"));
13669           printf ("  %*s %10s %*s\n",
13670                   addr_size * 2, _("Address"), _("Access"),
13671                   addr_size * 2, _("Initial"));
13672           while (ent < local_end)
13673             {
13674               ent = print_mips_got_entry (data, pltgot, ent);
13675               printf ("\n");
13676             }
13677           printf ("\n");
13678         }
13679
13680       if (gotsym < symtabno)
13681         {
13682           int sym_width;
13683
13684           printf (_(" Global entries:\n"));
13685           printf ("  %*s %10s %*s %*s %-7s %3s %s\n",
13686                   addr_size * 2, _("Address"),
13687                   _("Access"),
13688                   addr_size * 2, _("Initial"),
13689                   addr_size * 2, _("Sym.Val."),
13690                   _("Type"),
13691                   /* Note for translators: "Ndx" = abbreviated form of "Index".  */
13692                   _("Ndx"), _("Name"));
13693
13694           sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
13695
13696           for (i = gotsym; i < symtabno; i++)
13697             {
13698               ent = print_mips_got_entry (data, pltgot, ent);
13699               printf (" ");
13700
13701               if (dynamic_symbols == NULL)
13702                 printf (_("<no dynamic symbols>"));
13703               else if (i < num_dynamic_syms)
13704                 {
13705                   Elf_Internal_Sym * psym = dynamic_symbols + i;
13706
13707                   print_vma (psym->st_value, LONG_HEX);
13708                   printf (" %-7s %3s ",
13709                           get_symbol_type (ELF_ST_TYPE (psym->st_info)),
13710                           get_symbol_index_type (psym->st_shndx));
13711
13712                   if (VALID_DYNAMIC_NAME (psym->st_name))
13713                     print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
13714                   else
13715                     printf (_("<corrupt: %14ld>"), psym->st_name);
13716                 }
13717               else
13718                 printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
13719                         (unsigned long) i);
13720
13721               printf ("\n");
13722             }
13723           printf ("\n");
13724         }
13725
13726       if (data)
13727         free (data);
13728     }
13729
13730   if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
13731     {
13732       bfd_vma ent, end;
13733       size_t offset, rel_offset;
13734       unsigned long count, i;
13735       unsigned char * data;
13736       int addr_size, sym_width;
13737       Elf_Internal_Rela * rels;
13738
13739       rel_offset = offset_from_vma (file, jmprel, pltrelsz);
13740       if (pltrel == DT_RELA)
13741         {
13742           if (!slurp_rela_relocs (file, rel_offset, pltrelsz, &rels, &count))
13743             return 0;
13744         }
13745       else
13746         {
13747           if (!slurp_rel_relocs (file, rel_offset, pltrelsz, &rels, &count))
13748             return 0;
13749         }
13750
13751       ent = mips_pltgot;
13752       addr_size = (is_32bit_elf ? 4 : 8);
13753       end = mips_pltgot + (2 + count) * addr_size;
13754
13755       offset = offset_from_vma (file, mips_pltgot, end - mips_pltgot);
13756       data = (unsigned char *) get_data (NULL, file, offset, end - mips_pltgot,
13757                                          1, _("Procedure Linkage Table data"));
13758       if (data == NULL)
13759         return 0;
13760
13761       printf ("\nPLT GOT:\n\n");
13762       printf (_(" Reserved entries:\n"));
13763       printf (_("  %*s %*s Purpose\n"),
13764               addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
13765       ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
13766       printf (_(" PLT lazy resolver\n"));
13767       ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
13768       printf (_(" Module pointer\n"));
13769       printf ("\n");
13770
13771       printf (_(" Entries:\n"));
13772       printf ("  %*s %*s %*s %-7s %3s %s\n",
13773               addr_size * 2, _("Address"),
13774               addr_size * 2, _("Initial"),
13775               addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
13776       sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
13777       for (i = 0; i < count; i++)
13778         {
13779           unsigned long idx = get_reloc_symindex (rels[i].r_info);
13780
13781           ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
13782           printf (" ");
13783
13784           if (idx >= num_dynamic_syms)
13785             printf (_("<corrupt symbol index: %lu>"), idx);
13786           else
13787             {
13788               Elf_Internal_Sym * psym = dynamic_symbols + idx;
13789
13790               print_vma (psym->st_value, LONG_HEX);
13791               printf (" %-7s %3s ",
13792                       get_symbol_type (ELF_ST_TYPE (psym->st_info)),
13793                       get_symbol_index_type (psym->st_shndx));
13794               if (VALID_DYNAMIC_NAME (psym->st_name))
13795                 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
13796               else
13797                 printf (_("<corrupt: %14ld>"), psym->st_name);
13798             }
13799           printf ("\n");
13800         }
13801       printf ("\n");
13802
13803       if (data)
13804         free (data);
13805       free (rels);
13806     }
13807
13808   return 1;
13809 }
13810
13811 static int
13812 process_nds32_specific (FILE * file)
13813 {
13814   Elf_Internal_Shdr *sect = NULL;
13815
13816   sect = find_section (".nds32_e_flags");
13817   if (sect != NULL)
13818     {
13819       unsigned int *flag;
13820
13821       printf ("\nNDS32 elf flags section:\n");
13822       flag = get_data (NULL, file, sect->sh_offset, 1,
13823                        sect->sh_size, _("NDS32 elf flags section"));
13824
13825       switch ((*flag) & 0x3)
13826         {
13827         case 0:
13828           printf ("(VEC_SIZE):\tNo entry.\n");
13829           break;
13830         case 1:
13831           printf ("(VEC_SIZE):\t4 bytes\n");
13832           break;
13833         case 2:
13834           printf ("(VEC_SIZE):\t16 bytes\n");
13835           break;
13836         case 3:
13837           printf ("(VEC_SIZE):\treserved\n");
13838           break;
13839         }
13840     }
13841
13842   return TRUE;
13843 }
13844
13845 static int
13846 process_gnu_liblist (FILE * file)
13847 {
13848   Elf_Internal_Shdr * section;
13849   Elf_Internal_Shdr * string_sec;
13850   Elf32_External_Lib * elib;
13851   char * strtab;
13852   size_t strtab_size;
13853   size_t cnt;
13854   unsigned i;
13855
13856   if (! do_arch)
13857     return 0;
13858
13859   for (i = 0, section = section_headers;
13860        i < elf_header.e_shnum;
13861        i++, section++)
13862     {
13863       switch (section->sh_type)
13864         {
13865         case SHT_GNU_LIBLIST:
13866           if (section->sh_link >= elf_header.e_shnum)
13867             break;
13868
13869           elib = (Elf32_External_Lib *)
13870               get_data (NULL, file, section->sh_offset, 1, section->sh_size,
13871                         _("liblist section data"));
13872
13873           if (elib == NULL)
13874             break;
13875           string_sec = section_headers + section->sh_link;
13876
13877           strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
13878                                       string_sec->sh_size,
13879                                       _("liblist string table"));
13880           if (strtab == NULL
13881               || section->sh_entsize != sizeof (Elf32_External_Lib))
13882             {
13883               free (elib);
13884               free (strtab);
13885               break;
13886             }
13887           strtab_size = string_sec->sh_size;
13888
13889           printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
13890                   printable_section_name (section),
13891                   (unsigned long) (section->sh_size / sizeof (Elf32_External_Lib)));
13892
13893           puts (_("     Library              Time Stamp          Checksum   Version Flags"));
13894
13895           for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
13896                ++cnt)
13897             {
13898               Elf32_Lib liblist;
13899               time_t atime;
13900               char timebuf[20];
13901               struct tm * tmp;
13902
13903               liblist.l_name = BYTE_GET (elib[cnt].l_name);
13904               atime = BYTE_GET (elib[cnt].l_time_stamp);
13905               liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
13906               liblist.l_version = BYTE_GET (elib[cnt].l_version);
13907               liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
13908
13909               tmp = gmtime (&atime);
13910               snprintf (timebuf, sizeof (timebuf),
13911                         "%04u-%02u-%02uT%02u:%02u:%02u",
13912                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
13913                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
13914
13915               printf ("%3lu: ", (unsigned long) cnt);
13916               if (do_wide)
13917                 printf ("%-20s", liblist.l_name < strtab_size
13918                         ? strtab + liblist.l_name : _("<corrupt>"));
13919               else
13920                 printf ("%-20.20s", liblist.l_name < strtab_size
13921                         ? strtab + liblist.l_name : _("<corrupt>"));
13922               printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
13923                       liblist.l_version, liblist.l_flags);
13924             }
13925
13926           free (elib);
13927           free (strtab);
13928         }
13929     }
13930
13931   return 1;
13932 }
13933
13934 static const char *
13935 get_note_type (unsigned e_type)
13936 {
13937   static char buff[64];
13938
13939   if (elf_header.e_type == ET_CORE)
13940     switch (e_type)
13941       {
13942       case NT_AUXV:
13943         return _("NT_AUXV (auxiliary vector)");
13944       case NT_PRSTATUS:
13945         return _("NT_PRSTATUS (prstatus structure)");
13946       case NT_FPREGSET:
13947         return _("NT_FPREGSET (floating point registers)");
13948       case NT_PRPSINFO:
13949         return _("NT_PRPSINFO (prpsinfo structure)");
13950       case NT_TASKSTRUCT:
13951         return _("NT_TASKSTRUCT (task structure)");
13952       case NT_PRXFPREG:
13953         return _("NT_PRXFPREG (user_xfpregs structure)");
13954       case NT_PPC_VMX:
13955         return _("NT_PPC_VMX (ppc Altivec registers)");
13956       case NT_PPC_VSX:
13957         return _("NT_PPC_VSX (ppc VSX registers)");
13958       case NT_386_TLS:
13959         return _("NT_386_TLS (x86 TLS information)");
13960       case NT_386_IOPERM:
13961         return _("NT_386_IOPERM (x86 I/O permissions)");
13962       case NT_X86_XSTATE:
13963         return _("NT_X86_XSTATE (x86 XSAVE extended state)");
13964       case NT_S390_HIGH_GPRS:
13965         return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
13966       case NT_S390_TIMER:
13967         return _("NT_S390_TIMER (s390 timer register)");
13968       case NT_S390_TODCMP:
13969         return _("NT_S390_TODCMP (s390 TOD comparator register)");
13970       case NT_S390_TODPREG:
13971         return _("NT_S390_TODPREG (s390 TOD programmable register)");
13972       case NT_S390_CTRS:
13973         return _("NT_S390_CTRS (s390 control registers)");
13974       case NT_S390_PREFIX:
13975         return _("NT_S390_PREFIX (s390 prefix register)");
13976       case NT_S390_LAST_BREAK:
13977         return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
13978       case NT_S390_SYSTEM_CALL:
13979         return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
13980       case NT_S390_TDB:
13981         return _("NT_S390_TDB (s390 transaction diagnostic block)");
13982       case NT_ARM_VFP:
13983         return _("NT_ARM_VFP (arm VFP registers)");
13984       case NT_ARM_TLS:
13985         return _("NT_ARM_TLS (AArch TLS registers)");
13986       case NT_ARM_HW_BREAK:
13987         return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
13988       case NT_ARM_HW_WATCH:
13989         return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
13990       case NT_PSTATUS:
13991         return _("NT_PSTATUS (pstatus structure)");
13992       case NT_FPREGS:
13993         return _("NT_FPREGS (floating point registers)");
13994       case NT_PSINFO:
13995         return _("NT_PSINFO (psinfo structure)");
13996       case NT_LWPSTATUS:
13997         return _("NT_LWPSTATUS (lwpstatus_t structure)");
13998       case NT_LWPSINFO:
13999         return _("NT_LWPSINFO (lwpsinfo_t structure)");
14000       case NT_WIN32PSTATUS:
14001         return _("NT_WIN32PSTATUS (win32_pstatus structure)");
14002       case NT_SIGINFO:
14003         return _("NT_SIGINFO (siginfo_t data)");
14004       case NT_FILE:
14005         return _("NT_FILE (mapped files)");
14006       default:
14007         break;
14008       }
14009   else
14010     switch (e_type)
14011       {
14012       case NT_VERSION:
14013         return _("NT_VERSION (version)");
14014       case NT_ARCH:
14015         return _("NT_ARCH (architecture)");
14016       default:
14017         break;
14018       }
14019
14020   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
14021   return buff;
14022 }
14023
14024 static int
14025 print_core_note (Elf_Internal_Note *pnote)
14026 {
14027   unsigned int addr_size = is_32bit_elf ? 4 : 8;
14028   bfd_vma count, page_size;
14029   unsigned char *descdata, *filenames, *descend;
14030
14031   if (pnote->type != NT_FILE)
14032     return 1;
14033
14034 #ifndef BFD64
14035   if (!is_32bit_elf)
14036     {
14037       printf (_("    Cannot decode 64-bit note in 32-bit build\n"));
14038       /* Still "successful".  */
14039       return 1;
14040     }
14041 #endif
14042
14043   if (pnote->descsz < 2 * addr_size)
14044     {
14045       printf (_("    Malformed note - too short for header\n"));
14046       return 0;
14047     }
14048
14049   descdata = (unsigned char *) pnote->descdata;
14050   descend = descdata + pnote->descsz;
14051
14052   if (descdata[pnote->descsz - 1] != '\0')
14053     {
14054       printf (_("    Malformed note - does not end with \\0\n"));
14055       return 0;
14056     }
14057
14058   count = byte_get (descdata, addr_size);
14059   descdata += addr_size;
14060
14061   page_size = byte_get (descdata, addr_size);
14062   descdata += addr_size;
14063
14064   if (pnote->descsz < 2 * addr_size + count * 3 * addr_size)
14065     {
14066       printf (_("    Malformed note - too short for supplied file count\n"));
14067       return 0;
14068     }
14069
14070   printf (_("    Page size: "));
14071   print_vma (page_size, DEC);
14072   printf ("\n");
14073
14074   printf (_("    %*s%*s%*s\n"),
14075           (int) (2 + 2 * addr_size), _("Start"),
14076           (int) (4 + 2 * addr_size), _("End"),
14077           (int) (4 + 2 * addr_size), _("Page Offset"));
14078   filenames = descdata + count * 3 * addr_size;
14079   while (--count > 0)
14080     {
14081       bfd_vma start, end, file_ofs;
14082
14083       if (filenames == descend)
14084         {
14085           printf (_("    Malformed note - filenames end too early\n"));
14086           return 0;
14087         }
14088
14089       start = byte_get (descdata, addr_size);
14090       descdata += addr_size;
14091       end = byte_get (descdata, addr_size);
14092       descdata += addr_size;
14093       file_ofs = byte_get (descdata, addr_size);
14094       descdata += addr_size;
14095
14096       printf ("    ");
14097       print_vma (start, FULL_HEX);
14098       printf ("  ");
14099       print_vma (end, FULL_HEX);
14100       printf ("  ");
14101       print_vma (file_ofs, FULL_HEX);
14102       printf ("\n        %s\n", filenames);
14103
14104       filenames += 1 + strlen ((char *) filenames);
14105     }
14106
14107   return 1;
14108 }
14109
14110 static const char *
14111 get_gnu_elf_note_type (unsigned e_type)
14112 {
14113   static char buff[64];
14114
14115   switch (e_type)
14116     {
14117     case NT_GNU_ABI_TAG:
14118       return _("NT_GNU_ABI_TAG (ABI version tag)");
14119     case NT_GNU_HWCAP:
14120       return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
14121     case NT_GNU_BUILD_ID:
14122       return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
14123     case NT_GNU_GOLD_VERSION:
14124       return _("NT_GNU_GOLD_VERSION (gold version)");
14125     default:
14126       break;
14127     }
14128
14129   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
14130   return buff;
14131 }
14132
14133 static int
14134 print_gnu_note (Elf_Internal_Note *pnote)
14135 {
14136   switch (pnote->type)
14137     {
14138     case NT_GNU_BUILD_ID:
14139       {
14140         unsigned long i;
14141
14142         printf (_("    Build ID: "));
14143         for (i = 0; i < pnote->descsz; ++i)
14144           printf ("%02x", pnote->descdata[i] & 0xff);
14145         printf ("\n");
14146       }
14147       break;
14148
14149     case NT_GNU_ABI_TAG:
14150       {
14151         unsigned long os, major, minor, subminor;
14152         const char *osname;
14153
14154         os = byte_get ((unsigned char *) pnote->descdata, 4);
14155         major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
14156         minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
14157         subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
14158
14159         switch (os)
14160           {
14161           case GNU_ABI_TAG_LINUX:
14162             osname = "Linux";
14163             break;
14164           case GNU_ABI_TAG_HURD:
14165             osname = "Hurd";
14166             break;
14167           case GNU_ABI_TAG_SOLARIS:
14168             osname = "Solaris";
14169             break;
14170           case GNU_ABI_TAG_FREEBSD:
14171             osname = "FreeBSD";
14172             break;
14173           case GNU_ABI_TAG_NETBSD:
14174             osname = "NetBSD";
14175             break;
14176           default:
14177             osname = "Unknown";
14178             break;
14179           }
14180
14181         printf (_("    OS: %s, ABI: %ld.%ld.%ld\n"), osname,
14182                 major, minor, subminor);
14183       }
14184       break;
14185
14186     case NT_GNU_GOLD_VERSION:
14187       {
14188         unsigned long i;
14189
14190         printf (_("    Version: "));
14191         for (i = 0; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
14192           printf ("%c", pnote->descdata[i]);
14193         printf ("\n");
14194       }
14195       break;
14196     }
14197
14198   return 1;
14199 }
14200
14201 static const char *
14202 get_netbsd_elfcore_note_type (unsigned e_type)
14203 {
14204   static char buff[64];
14205
14206   if (e_type == NT_NETBSDCORE_PROCINFO)
14207     {
14208       /* NetBSD core "procinfo" structure.  */
14209       return _("NetBSD procinfo structure");
14210     }
14211
14212   /* As of Jan 2002 there are no other machine-independent notes
14213      defined for NetBSD core files.  If the note type is less
14214      than the start of the machine-dependent note types, we don't
14215      understand it.  */
14216
14217   if (e_type < NT_NETBSDCORE_FIRSTMACH)
14218     {
14219       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
14220       return buff;
14221     }
14222
14223   switch (elf_header.e_machine)
14224     {
14225     /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
14226        and PT_GETFPREGS == mach+2.  */
14227
14228     case EM_OLD_ALPHA:
14229     case EM_ALPHA:
14230     case EM_SPARC:
14231     case EM_SPARC32PLUS:
14232     case EM_SPARCV9:
14233       switch (e_type)
14234         {
14235         case NT_NETBSDCORE_FIRSTMACH + 0:
14236           return _("PT_GETREGS (reg structure)");
14237         case NT_NETBSDCORE_FIRSTMACH + 2:
14238           return _("PT_GETFPREGS (fpreg structure)");
14239         default:
14240           break;
14241         }
14242       break;
14243
14244     /* On all other arch's, PT_GETREGS == mach+1 and
14245        PT_GETFPREGS == mach+3.  */
14246     default:
14247       switch (e_type)
14248         {
14249         case NT_NETBSDCORE_FIRSTMACH + 1:
14250           return _("PT_GETREGS (reg structure)");
14251         case NT_NETBSDCORE_FIRSTMACH + 3:
14252           return _("PT_GETFPREGS (fpreg structure)");
14253         default:
14254           break;
14255         }
14256     }
14257
14258   snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
14259             e_type - NT_NETBSDCORE_FIRSTMACH);
14260   return buff;
14261 }
14262
14263 static const char *
14264 get_stapsdt_note_type (unsigned e_type)
14265 {
14266   static char buff[64];
14267
14268   switch (e_type)
14269     {
14270     case NT_STAPSDT:
14271       return _("NT_STAPSDT (SystemTap probe descriptors)");
14272
14273     default:
14274       break;
14275     }
14276
14277   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
14278   return buff;
14279 }
14280
14281 static int
14282 print_stapsdt_note (Elf_Internal_Note *pnote)
14283 {
14284   int addr_size = is_32bit_elf ? 4 : 8;
14285   char *data = pnote->descdata;
14286   char *data_end = pnote->descdata + pnote->descsz;
14287   bfd_vma pc, base_addr, semaphore;
14288   char *provider, *probe, *arg_fmt;
14289
14290   pc = byte_get ((unsigned char *) data, addr_size);
14291   data += addr_size;
14292   base_addr = byte_get ((unsigned char *) data, addr_size);
14293   data += addr_size;
14294   semaphore = byte_get ((unsigned char *) data, addr_size);
14295   data += addr_size;
14296
14297   provider = data;
14298   data += strlen (data) + 1;
14299   probe = data;
14300   data += strlen (data) + 1;
14301   arg_fmt = data;
14302   data += strlen (data) + 1;
14303
14304   printf (_("    Provider: %s\n"), provider);
14305   printf (_("    Name: %s\n"), probe);
14306   printf (_("    Location: "));
14307   print_vma (pc, FULL_HEX);
14308   printf (_(", Base: "));
14309   print_vma (base_addr, FULL_HEX);
14310   printf (_(", Semaphore: "));
14311   print_vma (semaphore, FULL_HEX);
14312   printf ("\n");
14313   printf (_("    Arguments: %s\n"), arg_fmt);
14314
14315   return data == data_end;
14316 }
14317
14318 static const char *
14319 get_ia64_vms_note_type (unsigned e_type)
14320 {
14321   static char buff[64];
14322
14323   switch (e_type)
14324     {
14325     case NT_VMS_MHD:
14326       return _("NT_VMS_MHD (module header)");
14327     case NT_VMS_LNM:
14328       return _("NT_VMS_LNM (language name)");
14329     case NT_VMS_SRC:
14330       return _("NT_VMS_SRC (source files)");
14331     case NT_VMS_TITLE:
14332       return "NT_VMS_TITLE";
14333     case NT_VMS_EIDC:
14334       return _("NT_VMS_EIDC (consistency check)");
14335     case NT_VMS_FPMODE:
14336       return _("NT_VMS_FPMODE (FP mode)");
14337     case NT_VMS_LINKTIME:
14338       return "NT_VMS_LINKTIME";
14339     case NT_VMS_IMGNAM:
14340       return _("NT_VMS_IMGNAM (image name)");
14341     case NT_VMS_IMGID:
14342       return _("NT_VMS_IMGID (image id)");
14343     case NT_VMS_LINKID:
14344       return _("NT_VMS_LINKID (link id)");
14345     case NT_VMS_IMGBID:
14346       return _("NT_VMS_IMGBID (build id)");
14347     case NT_VMS_GSTNAM:
14348       return _("NT_VMS_GSTNAM (sym table name)");
14349     case NT_VMS_ORIG_DYN:
14350       return "NT_VMS_ORIG_DYN";
14351     case NT_VMS_PATCHTIME:
14352       return "NT_VMS_PATCHTIME";
14353     default:
14354       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
14355       return buff;
14356     }
14357 }
14358
14359 static int
14360 print_ia64_vms_note (Elf_Internal_Note * pnote)
14361 {
14362   switch (pnote->type)
14363     {
14364     case NT_VMS_MHD:
14365       if (pnote->descsz > 36)
14366         {
14367           size_t l = strlen (pnote->descdata + 34);
14368           printf (_("    Creation date  : %.17s\n"), pnote->descdata);
14369           printf (_("    Last patch date: %.17s\n"), pnote->descdata + 17);
14370           printf (_("    Module name    : %s\n"), pnote->descdata + 34);
14371           printf (_("    Module version : %s\n"), pnote->descdata + 34 + l + 1);
14372         }
14373       else
14374         printf (_("    Invalid size\n"));
14375       break;
14376     case NT_VMS_LNM:
14377       printf (_("   Language: %s\n"), pnote->descdata);
14378       break;
14379 #ifdef BFD64
14380     case NT_VMS_FPMODE:
14381       printf (_("   Floating Point mode: "));
14382       printf ("0x%016" BFD_VMA_FMT "x\n",
14383               (bfd_vma)byte_get ((unsigned char *)pnote->descdata, 8));
14384       break;
14385     case NT_VMS_LINKTIME:
14386       printf (_("   Link time: "));
14387       print_vms_time
14388         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
14389       printf ("\n");
14390       break;
14391     case NT_VMS_PATCHTIME:
14392       printf (_("   Patch time: "));
14393       print_vms_time
14394         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
14395       printf ("\n");
14396       break;
14397     case NT_VMS_ORIG_DYN:
14398       printf (_("   Major id: %u,  minor id: %u\n"),
14399               (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
14400               (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
14401       printf (_("   Last modified  : "));
14402       print_vms_time
14403         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
14404       printf (_("\n   Link flags  : "));
14405       printf ("0x%016" BFD_VMA_FMT "x\n",
14406               (bfd_vma)byte_get ((unsigned char *)pnote->descdata + 16, 8));
14407       printf (_("   Header flags: 0x%08x\n"),
14408               (unsigned)byte_get ((unsigned char *)pnote->descdata + 24, 4));
14409       printf (_("   Image id    : %s\n"), pnote->descdata + 32);
14410       break;
14411 #endif
14412     case NT_VMS_IMGNAM:
14413       printf (_("    Image name: %s\n"), pnote->descdata);
14414       break;
14415     case NT_VMS_GSTNAM:
14416       printf (_("    Global symbol table name: %s\n"), pnote->descdata);
14417       break;
14418     case NT_VMS_IMGID:
14419       printf (_("    Image id: %s\n"), pnote->descdata);
14420       break;
14421     case NT_VMS_LINKID:
14422       printf (_("    Linker id: %s\n"), pnote->descdata);
14423       break;
14424     default:
14425       break;
14426     }
14427   return 1;
14428 }
14429
14430 /* Note that by the ELF standard, the name field is already null byte
14431    terminated, and namesz includes the terminating null byte.
14432    I.E. the value of namesz for the name "FSF" is 4.
14433
14434    If the value of namesz is zero, there is no name present.  */
14435 static int
14436 process_note (Elf_Internal_Note * pnote)
14437 {
14438   const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
14439   const char * nt;
14440
14441   if (pnote->namesz == 0)
14442     /* If there is no note name, then use the default set of
14443        note type strings.  */
14444     nt = get_note_type (pnote->type);
14445
14446   else if (const_strneq (pnote->namedata, "GNU"))
14447     /* GNU-specific object file notes.  */
14448     nt = get_gnu_elf_note_type (pnote->type);
14449
14450   else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
14451     /* NetBSD-specific core file notes.  */
14452     nt = get_netbsd_elfcore_note_type (pnote->type);
14453
14454   else if (strneq (pnote->namedata, "SPU/", 4))
14455     {
14456       /* SPU-specific core file notes.  */
14457       nt = pnote->namedata + 4;
14458       name = "SPU";
14459     }
14460
14461   else if (const_strneq (pnote->namedata, "IPF/VMS"))
14462     /* VMS/ia64-specific file notes.  */
14463     nt = get_ia64_vms_note_type (pnote->type);
14464
14465   else if (const_strneq (pnote->namedata, "stapsdt"))
14466     nt = get_stapsdt_note_type (pnote->type);
14467
14468   else
14469     /* Don't recognize this note name; just use the default set of
14470        note type strings.  */
14471     nt = get_note_type (pnote->type);
14472
14473   printf ("  %-20s 0x%08lx\t%s\n", name, pnote->descsz, nt);
14474
14475   if (const_strneq (pnote->namedata, "IPF/VMS"))
14476     return print_ia64_vms_note (pnote);
14477   else if (const_strneq (pnote->namedata, "GNU"))
14478     return print_gnu_note (pnote);
14479   else if (const_strneq (pnote->namedata, "stapsdt"))
14480     return print_stapsdt_note (pnote);
14481   else if (const_strneq (pnote->namedata, "CORE"))
14482     return print_core_note (pnote);
14483   else
14484     return 1;
14485 }
14486
14487
14488 static int
14489 process_corefile_note_segment (FILE * file, bfd_vma offset, bfd_vma length)
14490 {
14491   Elf_External_Note * pnotes;
14492   Elf_External_Note * external;
14493   int res = 1;
14494
14495   if (length <= 0)
14496     return 0;
14497
14498   pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
14499                                            _("notes"));
14500   if (pnotes == NULL)
14501     return 0;
14502
14503   external = pnotes;
14504
14505   printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
14506           (unsigned long) offset, (unsigned long) length);
14507   printf (_("  %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
14508
14509   while ((char *) external < (char *) pnotes + length)
14510     {
14511       Elf_Internal_Note inote;
14512       size_t min_notesz;
14513       char *next;
14514       char * temp = NULL;
14515       size_t data_remaining = ((char *) pnotes + length) - (char *) external;
14516
14517       if (!is_ia64_vms ())
14518         {
14519           /* PR binutils/15191
14520              Make sure that there is enough data to read.  */
14521           min_notesz = offsetof (Elf_External_Note, name);
14522           if (data_remaining < min_notesz)
14523             {
14524               warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
14525                     (int) data_remaining);
14526               break;
14527             }
14528           inote.type     = BYTE_GET (external->type);
14529           inote.namesz   = BYTE_GET (external->namesz);
14530           inote.namedata = external->name;
14531           inote.descsz   = BYTE_GET (external->descsz);
14532           inote.descdata = inote.namedata + align_power (inote.namesz, 2);
14533           inote.descpos  = offset + (inote.descdata - (char *) pnotes);
14534           next = inote.descdata + align_power (inote.descsz, 2);
14535         }
14536       else
14537         {
14538           Elf64_External_VMS_Note *vms_external;
14539
14540           /* PR binutils/15191
14541              Make sure that there is enough data to read.  */
14542           min_notesz = offsetof (Elf64_External_VMS_Note, name);
14543           if (data_remaining < min_notesz)
14544             {
14545               warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
14546                     (int) data_remaining);
14547               break;
14548             }
14549
14550           vms_external = (Elf64_External_VMS_Note *) external;
14551           inote.type     = BYTE_GET (vms_external->type);
14552           inote.namesz   = BYTE_GET (vms_external->namesz);
14553           inote.namedata = vms_external->name;
14554           inote.descsz   = BYTE_GET (vms_external->descsz);
14555           inote.descdata = inote.namedata + align_power (inote.namesz, 3);
14556           inote.descpos  = offset + (inote.descdata - (char *) pnotes);
14557           next = inote.descdata + align_power (inote.descsz, 3);
14558         }
14559
14560       if (inote.descdata < (char *) external + min_notesz
14561           || next < (char *) external + min_notesz
14562           || data_remaining < (size_t)(next - (char *) external))
14563         {
14564           warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
14565                 (unsigned long) ((char *) external - (char *) pnotes));
14566           warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx\n"),
14567                 inote.type, inote.namesz, inote.descsz);
14568           break;
14569         }
14570
14571       external = (Elf_External_Note *) next;
14572
14573       /* Verify that name is null terminated.  It appears that at least
14574          one version of Linux (RedHat 6.0) generates corefiles that don't
14575          comply with the ELF spec by failing to include the null byte in
14576          namesz.  */
14577       if (inote.namedata[inote.namesz - 1] != '\0')
14578         {
14579           temp = (char *) malloc (inote.namesz + 1);
14580
14581           if (temp == NULL)
14582             {
14583               error (_("Out of memory\n"));
14584               res = 0;
14585               break;
14586             }
14587
14588           strncpy (temp, inote.namedata, inote.namesz);
14589           temp[inote.namesz] = 0;
14590
14591           /* warn (_("'%s' NOTE name not properly null terminated\n"), temp);  */
14592           inote.namedata = temp;
14593         }
14594
14595       res &= process_note (& inote);
14596
14597       if (temp != NULL)
14598         {
14599           free (temp);
14600           temp = NULL;
14601         }
14602     }
14603
14604   free (pnotes);
14605
14606   return res;
14607 }
14608
14609 static int
14610 process_corefile_note_segments (FILE * file)
14611 {
14612   Elf_Internal_Phdr * segment;
14613   unsigned int i;
14614   int res = 1;
14615
14616   if (! get_program_headers (file))
14617       return 0;
14618
14619   for (i = 0, segment = program_headers;
14620        i < elf_header.e_phnum;
14621        i++, segment++)
14622     {
14623       if (segment->p_type == PT_NOTE)
14624         res &= process_corefile_note_segment (file,
14625                                               (bfd_vma) segment->p_offset,
14626                                               (bfd_vma) segment->p_filesz);
14627     }
14628
14629   return res;
14630 }
14631
14632 static int
14633 process_note_sections (FILE * file)
14634 {
14635   Elf_Internal_Shdr * section;
14636   unsigned long i;
14637   int n = 0;
14638   int res = 1;
14639
14640   for (i = 0, section = section_headers;
14641        i < elf_header.e_shnum && section != NULL;
14642        i++, section++)
14643     if (section->sh_type == SHT_NOTE)
14644       {
14645         res &= process_corefile_note_segment (file,
14646                                               (bfd_vma) section->sh_offset,
14647                                               (bfd_vma) section->sh_size);
14648         n++;
14649       }
14650
14651   if (n == 0)
14652     /* Try processing NOTE segments instead.  */
14653     return process_corefile_note_segments (file);
14654
14655   return res;
14656 }
14657
14658 static int
14659 process_notes (FILE * file)
14660 {
14661   /* If we have not been asked to display the notes then do nothing.  */
14662   if (! do_notes)
14663     return 1;
14664
14665   if (elf_header.e_type != ET_CORE)
14666     return process_note_sections (file);
14667
14668   /* No program headers means no NOTE segment.  */
14669   if (elf_header.e_phnum > 0)
14670     return process_corefile_note_segments (file);
14671
14672   printf (_("No note segments present in the core file.\n"));
14673   return 1;
14674 }
14675
14676 static int
14677 process_arch_specific (FILE * file)
14678 {
14679   if (! do_arch)
14680     return 1;
14681
14682   switch (elf_header.e_machine)
14683     {
14684     case EM_ARM:
14685       return process_arm_specific (file);
14686     case EM_MIPS:
14687     case EM_MIPS_RS3_LE:
14688       return process_mips_specific (file);
14689       break;
14690     case EM_NDS32:
14691       return process_nds32_specific (file);
14692       break;
14693     case EM_PPC:
14694       return process_power_specific (file);
14695       break;
14696     case EM_SPARC:
14697     case EM_SPARC32PLUS:
14698     case EM_SPARCV9:
14699       return process_sparc_specific (file);
14700       break;
14701     case EM_TI_C6000:
14702       return process_tic6x_specific (file);
14703       break;
14704     case EM_MSP430:
14705       return process_msp430x_specific (file);
14706     default:
14707       break;
14708     }
14709   return 1;
14710 }
14711
14712 static int
14713 get_file_header (FILE * file)
14714 {
14715   /* Read in the identity array.  */
14716   if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
14717     return 0;
14718
14719   /* Determine how to read the rest of the header.  */
14720   switch (elf_header.e_ident[EI_DATA])
14721     {
14722     default: /* fall through */
14723     case ELFDATANONE: /* fall through */
14724     case ELFDATA2LSB:
14725       byte_get = byte_get_little_endian;
14726       byte_put = byte_put_little_endian;
14727       break;
14728     case ELFDATA2MSB:
14729       byte_get = byte_get_big_endian;
14730       byte_put = byte_put_big_endian;
14731       break;
14732     }
14733
14734   /* For now we only support 32 bit and 64 bit ELF files.  */
14735   is_32bit_elf = (elf_header.e_ident[EI_CLASS] != ELFCLASS64);
14736
14737   /* Read in the rest of the header.  */
14738   if (is_32bit_elf)
14739     {
14740       Elf32_External_Ehdr ehdr32;
14741
14742       if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
14743         return 0;
14744
14745       elf_header.e_type      = BYTE_GET (ehdr32.e_type);
14746       elf_header.e_machine   = BYTE_GET (ehdr32.e_machine);
14747       elf_header.e_version   = BYTE_GET (ehdr32.e_version);
14748       elf_header.e_entry     = BYTE_GET (ehdr32.e_entry);
14749       elf_header.e_phoff     = BYTE_GET (ehdr32.e_phoff);
14750       elf_header.e_shoff     = BYTE_GET (ehdr32.e_shoff);
14751       elf_header.e_flags     = BYTE_GET (ehdr32.e_flags);
14752       elf_header.e_ehsize    = BYTE_GET (ehdr32.e_ehsize);
14753       elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
14754       elf_header.e_phnum     = BYTE_GET (ehdr32.e_phnum);
14755       elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
14756       elf_header.e_shnum     = BYTE_GET (ehdr32.e_shnum);
14757       elf_header.e_shstrndx  = BYTE_GET (ehdr32.e_shstrndx);
14758     }
14759   else
14760     {
14761       Elf64_External_Ehdr ehdr64;
14762
14763       /* If we have been compiled with sizeof (bfd_vma) == 4, then
14764          we will not be able to cope with the 64bit data found in
14765          64 ELF files.  Detect this now and abort before we start
14766          overwriting things.  */
14767       if (sizeof (bfd_vma) < 8)
14768         {
14769           error (_("This instance of readelf has been built without support for a\n\
14770 64 bit data type and so it cannot read 64 bit ELF files.\n"));
14771           return 0;
14772         }
14773
14774       if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
14775         return 0;
14776
14777       elf_header.e_type      = BYTE_GET (ehdr64.e_type);
14778       elf_header.e_machine   = BYTE_GET (ehdr64.e_machine);
14779       elf_header.e_version   = BYTE_GET (ehdr64.e_version);
14780       elf_header.e_entry     = BYTE_GET (ehdr64.e_entry);
14781       elf_header.e_phoff     = BYTE_GET (ehdr64.e_phoff);
14782       elf_header.e_shoff     = BYTE_GET (ehdr64.e_shoff);
14783       elf_header.e_flags     = BYTE_GET (ehdr64.e_flags);
14784       elf_header.e_ehsize    = BYTE_GET (ehdr64.e_ehsize);
14785       elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
14786       elf_header.e_phnum     = BYTE_GET (ehdr64.e_phnum);
14787       elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
14788       elf_header.e_shnum     = BYTE_GET (ehdr64.e_shnum);
14789       elf_header.e_shstrndx  = BYTE_GET (ehdr64.e_shstrndx);
14790     }
14791
14792   if (elf_header.e_shoff)
14793     {
14794       /* There may be some extensions in the first section header.  Don't
14795          bomb if we can't read it.  */
14796       if (is_32bit_elf)
14797         get_32bit_section_headers (file, TRUE);
14798       else
14799         get_64bit_section_headers (file, TRUE);
14800     }
14801
14802   return 1;
14803 }
14804
14805 /* Process one ELF object file according to the command line options.
14806    This file may actually be stored in an archive.  The file is
14807    positioned at the start of the ELF object.  */
14808
14809 static int
14810 process_object (char * file_name, FILE * file)
14811 {
14812   unsigned int i;
14813
14814   if (! get_file_header (file))
14815     {
14816       error (_("%s: Failed to read file header\n"), file_name);
14817       return 1;
14818     }
14819
14820   /* Initialise per file variables.  */
14821   for (i = ARRAY_SIZE (version_info); i--;)
14822     version_info[i] = 0;
14823
14824   for (i = ARRAY_SIZE (dynamic_info); i--;)
14825     dynamic_info[i] = 0;
14826   dynamic_info_DT_GNU_HASH = 0;
14827
14828   /* Process the file.  */
14829   if (show_name)
14830     printf (_("\nFile: %s\n"), file_name);
14831
14832   /* Initialise the dump_sects array from the cmdline_dump_sects array.
14833      Note we do this even if cmdline_dump_sects is empty because we
14834      must make sure that the dump_sets array is zeroed out before each
14835      object file is processed.  */
14836   if (num_dump_sects > num_cmdline_dump_sects)
14837     memset (dump_sects, 0, num_dump_sects * sizeof (* dump_sects));
14838
14839   if (num_cmdline_dump_sects > 0)
14840     {
14841       if (num_dump_sects == 0)
14842         /* A sneaky way of allocating the dump_sects array.  */
14843         request_dump_bynumber (num_cmdline_dump_sects, 0);
14844
14845       assert (num_dump_sects >= num_cmdline_dump_sects);
14846       memcpy (dump_sects, cmdline_dump_sects,
14847               num_cmdline_dump_sects * sizeof (* dump_sects));
14848     }
14849
14850   if (! process_file_header ())
14851     return 1;
14852
14853   if (! process_section_headers (file))
14854     {
14855       /* Without loaded section headers we cannot process lots of
14856          things.  */
14857       do_unwind = do_version = do_dump = do_arch = 0;
14858
14859       if (! do_using_dynamic)
14860         do_syms = do_dyn_syms = do_reloc = 0;
14861     }
14862
14863   if (! process_section_groups (file))
14864     {
14865       /* Without loaded section groups we cannot process unwind.  */
14866       do_unwind = 0;
14867     }
14868
14869   if (process_program_headers (file))
14870     process_dynamic_section (file);
14871
14872   process_relocs (file);
14873
14874   process_unwind (file);
14875
14876   process_symbol_table (file);
14877
14878   process_syminfo (file);
14879
14880   process_version_sections (file);
14881
14882   process_section_contents (file);
14883
14884   process_notes (file);
14885
14886   process_gnu_liblist (file);
14887
14888   process_arch_specific (file);
14889
14890   if (program_headers)
14891     {
14892       free (program_headers);
14893       program_headers = NULL;
14894     }
14895
14896   if (section_headers)
14897     {
14898       free (section_headers);
14899       section_headers = NULL;
14900     }
14901
14902   if (string_table)
14903     {
14904       free (string_table);
14905       string_table = NULL;
14906       string_table_length = 0;
14907     }
14908
14909   if (dynamic_strings)
14910     {
14911       free (dynamic_strings);
14912       dynamic_strings = NULL;
14913       dynamic_strings_length = 0;
14914     }
14915
14916   if (dynamic_symbols)
14917     {
14918       free (dynamic_symbols);
14919       dynamic_symbols = NULL;
14920       num_dynamic_syms = 0;
14921     }
14922
14923   if (dynamic_syminfo)
14924     {
14925       free (dynamic_syminfo);
14926       dynamic_syminfo = NULL;
14927     }
14928
14929   if (dynamic_section)
14930     {
14931       free (dynamic_section);
14932       dynamic_section = NULL;
14933     }
14934
14935   if (section_headers_groups)
14936     {
14937       free (section_headers_groups);
14938       section_headers_groups = NULL;
14939     }
14940
14941   if (section_groups)
14942     {
14943       struct group_list * g;
14944       struct group_list * next;
14945
14946       for (i = 0; i < group_count; i++)
14947         {
14948           for (g = section_groups [i].root; g != NULL; g = next)
14949             {
14950               next = g->next;
14951               free (g);
14952             }
14953         }
14954
14955       free (section_groups);
14956       section_groups = NULL;
14957     }
14958
14959   free_debug_memory ();
14960
14961   return 0;
14962 }
14963
14964 /* Process an ELF archive.
14965    On entry the file is positioned just after the ARMAG string.  */
14966
14967 static int
14968 process_archive (char * file_name, FILE * file, bfd_boolean is_thin_archive)
14969 {
14970   struct archive_info arch;
14971   struct archive_info nested_arch;
14972   size_t got;
14973   int ret;
14974
14975   show_name = 1;
14976
14977   /* The ARCH structure is used to hold information about this archive.  */
14978   arch.file_name = NULL;
14979   arch.file = NULL;
14980   arch.index_array = NULL;
14981   arch.sym_table = NULL;
14982   arch.longnames = NULL;
14983
14984   /* The NESTED_ARCH structure is used as a single-item cache of information
14985      about a nested archive (when members of a thin archive reside within
14986      another regular archive file).  */
14987   nested_arch.file_name = NULL;
14988   nested_arch.file = NULL;
14989   nested_arch.index_array = NULL;
14990   nested_arch.sym_table = NULL;
14991   nested_arch.longnames = NULL;
14992
14993   if (setup_archive (&arch, file_name, file, is_thin_archive, do_archive_index) != 0)
14994     {
14995       ret = 1;
14996       goto out;
14997     }
14998
14999   if (do_archive_index)
15000     {
15001       if (arch.sym_table == NULL)
15002         error (_("%s: unable to dump the index as none was found\n"), file_name);
15003       else
15004         {
15005           unsigned int i, l;
15006           unsigned long current_pos;
15007
15008           printf (_("Index of archive %s: (%ld entries, 0x%lx bytes in the symbol table)\n"),
15009                   file_name, (long) arch.index_num, arch.sym_size);
15010           current_pos = ftell (file);
15011
15012           for (i = l = 0; i < arch.index_num; i++)
15013             {
15014               if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
15015                 {
15016                   char * member_name;
15017
15018                   member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
15019
15020                   if (member_name != NULL)
15021                     {
15022                       char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
15023
15024                       if (qualified_name != NULL)
15025                         {
15026                           printf (_("Contents of binary %s at offset "), qualified_name);
15027                           (void) print_vma (arch.index_array[i], PREFIX_HEX);
15028                           putchar ('\n');
15029                           free (qualified_name);
15030                         }
15031                     }
15032                 }
15033
15034               if (l >= arch.sym_size)
15035                 {
15036                   error (_("%s: end of the symbol table reached before the end of the index\n"),
15037                          file_name);
15038                   break;
15039                 }
15040               printf ("\t%s\n", arch.sym_table + l);
15041               l += strlen (arch.sym_table + l) + 1;
15042             }
15043
15044           if (arch.uses_64bit_indicies)
15045             l = (l + 7) & ~ 7;
15046           else
15047             l += l & 1;
15048
15049           if (l < arch.sym_size)
15050             error (_("%s: %ld bytes remain in the symbol table, but without corresponding entries in the index table\n"),
15051                    file_name, arch.sym_size - l);
15052
15053           if (fseek (file, current_pos, SEEK_SET) != 0)
15054             {
15055               error (_("%s: failed to seek back to start of object files in the archive\n"), file_name);
15056               ret = 1;
15057               goto out;
15058             }
15059         }
15060
15061       if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
15062           && !do_segments && !do_header && !do_dump && !do_version
15063           && !do_histogram && !do_debugging && !do_arch && !do_notes
15064           && !do_section_groups && !do_dyn_syms)
15065         {
15066           ret = 0; /* Archive index only.  */
15067           goto out;
15068         }
15069     }
15070
15071   ret = 0;
15072
15073   while (1)
15074     {
15075       char * name;
15076       size_t namelen;
15077       char * qualified_name;
15078
15079       /* Read the next archive header.  */
15080       if (fseek (file, arch.next_arhdr_offset, SEEK_SET) != 0)
15081         {
15082           error (_("%s: failed to seek to next archive header\n"), file_name);
15083           return 1;
15084         }
15085       got = fread (&arch.arhdr, 1, sizeof arch.arhdr, file);
15086       if (got != sizeof arch.arhdr)
15087         {
15088           if (got == 0)
15089             break;
15090           error (_("%s: failed to read archive header\n"), file_name);
15091           ret = 1;
15092           break;
15093         }
15094       if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
15095         {
15096           error (_("%s: did not find a valid archive header\n"), arch.file_name);
15097           ret = 1;
15098           break;
15099         }
15100
15101       arch.next_arhdr_offset += sizeof arch.arhdr;
15102
15103       archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
15104       if (archive_file_size & 01)
15105         ++archive_file_size;
15106
15107       name = get_archive_member_name (&arch, &nested_arch);
15108       if (name == NULL)
15109         {
15110           error (_("%s: bad archive file name\n"), file_name);
15111           ret = 1;
15112           break;
15113         }
15114       namelen = strlen (name);
15115
15116       qualified_name = make_qualified_name (&arch, &nested_arch, name);
15117       if (qualified_name == NULL)
15118         {
15119           error (_("%s: bad archive file name\n"), file_name);
15120           ret = 1;
15121           break;
15122         }
15123
15124       if (is_thin_archive && arch.nested_member_origin == 0)
15125         {
15126           /* This is a proxy for an external member of a thin archive.  */
15127           FILE * member_file;
15128           char * member_file_name = adjust_relative_path (file_name, name, namelen);
15129           if (member_file_name == NULL)
15130             {
15131               ret = 1;
15132               break;
15133             }
15134
15135           member_file = fopen (member_file_name, "rb");
15136           if (member_file == NULL)
15137             {
15138               error (_("Input file '%s' is not readable.\n"), member_file_name);
15139               free (member_file_name);
15140               ret = 1;
15141               break;
15142             }
15143
15144           archive_file_offset = arch.nested_member_origin;
15145
15146           ret |= process_object (qualified_name, member_file);
15147
15148           fclose (member_file);
15149           free (member_file_name);
15150         }
15151       else if (is_thin_archive)
15152         {
15153           /* PR 15140: Allow for corrupt thin archives.  */
15154           if (nested_arch.file == NULL)
15155             {
15156               error (_("%s: contains corrupt thin archive: %s\n"),
15157                      file_name, name);
15158               ret = 1;
15159               break;
15160             }
15161
15162           /* This is a proxy for a member of a nested archive.  */
15163           archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
15164
15165           /* The nested archive file will have been opened and setup by
15166              get_archive_member_name.  */
15167           if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
15168             {
15169               error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
15170               ret = 1;
15171               break;
15172             }
15173
15174           ret |= process_object (qualified_name, nested_arch.file);
15175         }
15176       else
15177         {
15178           archive_file_offset = arch.next_arhdr_offset;
15179           arch.next_arhdr_offset += archive_file_size;
15180
15181           ret |= process_object (qualified_name, file);
15182         }
15183
15184       if (dump_sects != NULL)
15185         {
15186           free (dump_sects);
15187           dump_sects = NULL;
15188           num_dump_sects = 0;
15189         }
15190
15191       free (qualified_name);
15192     }
15193
15194  out:
15195   if (nested_arch.file != NULL)
15196     fclose (nested_arch.file);
15197   release_archive (&nested_arch);
15198   release_archive (&arch);
15199
15200   return ret;
15201 }
15202
15203 static int
15204 process_file (char * file_name)
15205 {
15206   FILE * file;
15207   struct stat statbuf;
15208   char armag[SARMAG];
15209   int ret;
15210
15211   if (stat (file_name, &statbuf) < 0)
15212     {
15213       if (errno == ENOENT)
15214         error (_("'%s': No such file\n"), file_name);
15215       else
15216         error (_("Could not locate '%s'.  System error message: %s\n"),
15217                file_name, strerror (errno));
15218       return 1;
15219     }
15220
15221   if (! S_ISREG (statbuf.st_mode))
15222     {
15223       error (_("'%s' is not an ordinary file\n"), file_name);
15224       return 1;
15225     }
15226
15227   file = fopen (file_name, "rb");
15228   if (file == NULL)
15229     {
15230       error (_("Input file '%s' is not readable.\n"), file_name);
15231       return 1;
15232     }
15233
15234   if (fread (armag, SARMAG, 1, file) != 1)
15235     {
15236       error (_("%s: Failed to read file's magic number\n"), file_name);
15237       fclose (file);
15238       return 1;
15239     }
15240
15241   current_file_size = (bfd_size_type) statbuf.st_size;
15242
15243   if (memcmp (armag, ARMAG, SARMAG) == 0)
15244     ret = process_archive (file_name, file, FALSE);
15245   else if (memcmp (armag, ARMAGT, SARMAG) == 0)
15246     ret = process_archive (file_name, file, TRUE);
15247   else
15248     {
15249       if (do_archive_index)
15250         error (_("File %s is not an archive so its index cannot be displayed.\n"),
15251                file_name);
15252
15253       rewind (file);
15254       archive_file_size = archive_file_offset = 0;
15255       ret = process_object (file_name, file);
15256     }
15257
15258   fclose (file);
15259
15260   current_file_size = 0;
15261   return ret;
15262 }
15263
15264 #ifdef SUPPORT_DISASSEMBLY
15265 /* Needed by the i386 disassembler.  For extra credit, someone could
15266    fix this so that we insert symbolic addresses here, esp for GOT/PLT
15267    symbols.  */
15268
15269 void
15270 print_address (unsigned int addr, FILE * outfile)
15271 {
15272   fprintf (outfile,"0x%8.8x", addr);
15273 }
15274
15275 /* Needed by the i386 disassembler.  */
15276 void
15277 db_task_printsym (unsigned int addr)
15278 {
15279   print_address (addr, stderr);
15280 }
15281 #endif
15282
15283 int
15284 main (int argc, char ** argv)
15285 {
15286   int err;
15287
15288 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
15289   setlocale (LC_MESSAGES, "");
15290 #endif
15291 #if defined (HAVE_SETLOCALE)
15292   setlocale (LC_CTYPE, "");
15293 #endif
15294   bindtextdomain (PACKAGE, LOCALEDIR);
15295   textdomain (PACKAGE);
15296
15297   expandargv (&argc, &argv);
15298
15299   parse_args (argc, argv);
15300
15301   if (num_dump_sects > 0)
15302     {
15303       /* Make a copy of the dump_sects array.  */
15304       cmdline_dump_sects = (dump_type *)
15305           malloc (num_dump_sects * sizeof (* dump_sects));
15306       if (cmdline_dump_sects == NULL)
15307         error (_("Out of memory allocating dump request table.\n"));
15308       else
15309         {
15310           memcpy (cmdline_dump_sects, dump_sects,
15311                   num_dump_sects * sizeof (* dump_sects));
15312           num_cmdline_dump_sects = num_dump_sects;
15313         }
15314     }
15315
15316   if (optind < (argc - 1))
15317     show_name = 1;
15318
15319   err = 0;
15320   while (optind < argc)
15321     err |= process_file (argv[optind++]);
15322
15323   if (dump_sects != NULL)
15324     free (dump_sects);
15325   if (cmdline_dump_sects != NULL)
15326     free (cmdline_dump_sects);
15327
15328   return err;
15329 }