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