OSDN Git Service

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