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