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