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