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