* elf-bfd.h (enum elf_link_info_type): New.
[platform/upstream/binutils.git] / binutils / readelf.c
1 /* readelf.c -- display contents of an ELF format file
2    Copyright 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
3
4    Originally developed by Eric Youngdale <eric@andante.jic.com>
5    Modifications by Nick Clifton <nickc@redhat.com>
6
7    This file is part of GNU Binutils.
8
9    This program is free software; you can redistribute it and/or modify
10    it under the terms of the GNU General Public License as published by
11    the Free Software Foundation; either version 2 of the License, or
12    (at your option) any later version.
13
14    This program is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17    GNU General Public License for more details.
18
19    You should have received a copy of the GNU General Public License
20    along with this program; if not, write to the Free Software
21    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
22    02111-1307, USA.  */
23 \f
24
25 #include <assert.h>
26 #include <sys/types.h>
27 #include <sys/stat.h>
28 #include <stdio.h>
29 #include <time.h>
30
31 #if __GNUC__ >= 2
32 /* Define BFD64 here, even if our default architecture is 32 bit ELF
33    as this will allow us to read in and parse 64bit and 32bit ELF files.
34    Only do this if we belive that the compiler can support a 64 bit
35    data type.  For now we only rely on GCC being able to do this.  */
36 #define BFD64
37 #endif
38
39 #include "bfd.h"
40
41 #include "elf/common.h"
42 #include "elf/external.h"
43 #include "elf/internal.h"
44 #include "elf/dwarf2.h"
45
46 /* The following headers use the elf/reloc-macros.h file to
47    automatically generate relocation recognition functions
48    such as elf_mips_reloc_type()  */
49
50 #define RELOC_MACROS_GEN_FUNC
51
52 #include "elf/i386.h"
53 #include "elf/v850.h"
54 #include "elf/ppc.h"
55 #include "elf/mips.h"
56 #include "elf/alpha.h"
57 #include "elf/arm.h"
58 #include "elf/m68k.h"
59 #include "elf/sparc.h"
60 #include "elf/m32r.h"
61 #include "elf/d10v.h"
62 #include "elf/d30v.h"
63 #include "elf/sh.h"
64 #include "elf/mn10200.h"
65 #include "elf/mn10300.h"
66 #include "elf/hppa.h"
67 #include "elf/h8.h"
68 #include "elf/arc.h"
69 #include "elf/fr30.h"
70 #include "elf/mcore.h"
71 #include "elf/mmix.h"
72 #include "elf/i960.h"
73 #include "elf/pj.h"
74 #include "elf/avr.h"
75 #include "elf/ia64.h"
76 #include "elf/cris.h"
77 #include "elf/i860.h"
78 #include "elf/x86-64.h"
79 #include "elf/s390.h"
80 #include "elf/xstormy16.h"
81
82 #include "bucomm.h"
83 #include "getopt.h"
84
85 char *                  program_name = "readelf";
86 unsigned int            dynamic_addr;
87 bfd_size_type           dynamic_size;
88 unsigned int            rela_addr;
89 unsigned int            rela_size;
90 char *                  dynamic_strings;
91 char *                  string_table;
92 unsigned long           string_table_length;
93 unsigned long           num_dynamic_syms;
94 Elf_Internal_Sym *      dynamic_symbols;
95 Elf_Internal_Syminfo *  dynamic_syminfo;
96 unsigned long           dynamic_syminfo_offset;
97 unsigned int            dynamic_syminfo_nent;
98 char                    program_interpreter [64];
99 int                     dynamic_info[DT_JMPREL + 1];
100 int                     version_info[16];
101 int                     loadaddr = 0;
102 Elf_Internal_Ehdr       elf_header;
103 Elf_Internal_Shdr *     section_headers;
104 Elf_Internal_Dyn *      dynamic_segment;
105 int                     show_name;
106 int                     do_dynamic;
107 int                     do_syms;
108 int                     do_reloc;
109 int                     do_sections;
110 int                     do_segments;
111 int                     do_unwind;
112 int                     do_using_dynamic;
113 int                     do_header;
114 int                     do_dump;
115 int                     do_version;
116 int                     do_wide;
117 int                     do_histogram;
118 int                     do_debugging;
119 int                     do_debug_info;
120 int                     do_debug_abbrevs;
121 int                     do_debug_lines;
122 int                     do_debug_pubnames;
123 int                     do_debug_aranges;
124 int                     do_debug_frames;
125 int                     do_debug_frames_interp;
126 int                     do_debug_macinfo;
127 int                     do_debug_str;
128 int                     do_arch;
129 int                     do_notes;
130 int                     is_32bit_elf;
131
132 /* A dynamic array of flags indicating which sections require dumping.  */
133 char *                  dump_sects = NULL;
134 unsigned int            num_dump_sects = 0;
135
136 #define HEX_DUMP        (1 << 0)
137 #define DISASS_DUMP     (1 << 1)
138 #define DEBUG_DUMP      (1 << 2)
139
140 /* How to rpint a vma value.  */
141 typedef enum print_mode
142 {
143   HEX,
144   DEC,
145   DEC_5,
146   UNSIGNED,
147   PREFIX_HEX,
148   FULL_HEX,
149   LONG_HEX
150 }
151 print_mode;
152
153 /* Forward declarations for dumb compilers.  */
154 static void               print_vma                   PARAMS ((bfd_vma, print_mode));
155 static bfd_vma (*         byte_get)                   PARAMS ((unsigned char *, int));
156 static bfd_vma            byte_get_little_endian      PARAMS ((unsigned char *, int));
157 static bfd_vma            byte_get_big_endian         PARAMS ((unsigned char *, int));
158 static const char *       get_mips_dynamic_type       PARAMS ((unsigned long));
159 static const char *       get_sparc64_dynamic_type    PARAMS ((unsigned long));
160 static const char *       get_parisc_dynamic_type     PARAMS ((unsigned long));
161 static const char *       get_dynamic_type            PARAMS ((unsigned long));
162 static int                slurp_rela_relocs           PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Rela **, unsigned long *));
163 static int                slurp_rel_relocs            PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Rel **, unsigned long *));
164 static int                dump_relocations            PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Sym *, unsigned long, char *, int));
165 static char *             get_file_type               PARAMS ((unsigned));
166 static char *             get_machine_name            PARAMS ((unsigned));
167 static void               decode_ARM_machine_flags    PARAMS ((unsigned, char []));
168 static char *             get_machine_flags           PARAMS ((unsigned, unsigned));
169 static const char *       get_mips_segment_type       PARAMS ((unsigned long));
170 static const char *       get_parisc_segment_type     PARAMS ((unsigned long));
171 static const char *       get_ia64_segment_type       PARAMS ((unsigned long));
172 static const char *       get_segment_type            PARAMS ((unsigned long));
173 static const char *       get_mips_section_type_name  PARAMS ((unsigned int));
174 static const char *       get_parisc_section_type_name PARAMS ((unsigned int));
175 static const char *       get_ia64_section_type_name  PARAMS ((unsigned int));
176 static const char *       get_section_type_name       PARAMS ((unsigned int));
177 static const char *       get_symbol_binding          PARAMS ((unsigned int));
178 static const char *       get_symbol_type             PARAMS ((unsigned int));
179 static const char *       get_symbol_visibility       PARAMS ((unsigned int));
180 static const char *       get_symbol_index_type       PARAMS ((unsigned int));
181 static const char *       get_dynamic_flags           PARAMS ((bfd_vma));
182 static void               usage                       PARAMS ((void));
183 static void               parse_args                  PARAMS ((int, char **));
184 static int                process_file_header         PARAMS ((void));
185 static int                process_program_headers     PARAMS ((FILE *));
186 static int                process_section_headers     PARAMS ((FILE *));
187 static int                process_unwind              PARAMS ((FILE *));
188 static void               dynamic_segment_mips_val    PARAMS ((Elf_Internal_Dyn *));
189 static void               dynamic_segment_parisc_val  PARAMS ((Elf_Internal_Dyn *));
190 static int                process_dynamic_segment     PARAMS ((FILE *));
191 static int                process_symbol_table        PARAMS ((FILE *));
192 static int                process_syminfo             PARAMS ((FILE *));
193 static int                process_section_contents    PARAMS ((FILE *));
194 static void               process_mips_fpe_exception  PARAMS ((int));
195 static int                process_mips_specific       PARAMS ((FILE *));
196 static int                process_file                PARAMS ((char *));
197 static int                process_relocs              PARAMS ((FILE *));
198 static int                process_version_sections    PARAMS ((FILE *));
199 static char *             get_ver_flags               PARAMS ((unsigned int));
200 static int                get_32bit_section_headers   PARAMS ((FILE *, unsigned int));
201 static int                get_64bit_section_headers   PARAMS ((FILE *, unsigned int));
202 static int                get_32bit_program_headers   PARAMS ((FILE *, Elf_Internal_Phdr *));
203 static int                get_64bit_program_headers   PARAMS ((FILE *, Elf_Internal_Phdr *));
204 static int                get_file_header             PARAMS ((FILE *));
205 static Elf_Internal_Sym * get_32bit_elf_symbols       PARAMS ((FILE *, unsigned long, unsigned long));
206 static Elf_Internal_Sym * get_64bit_elf_symbols       PARAMS ((FILE *, unsigned long, unsigned long));
207 static const char *       get_elf_section_flags       PARAMS ((bfd_vma));
208 static int *              get_dynamic_data            PARAMS ((FILE *, unsigned int));
209 static int                get_32bit_dynamic_segment   PARAMS ((FILE *));
210 static int                get_64bit_dynamic_segment   PARAMS ((FILE *));
211 #ifdef SUPPORT_DISASSEMBLY
212 static int                disassemble_section         PARAMS ((Elf32_Internal_Shdr *, FILE *));
213 #endif
214 static int                dump_section                PARAMS ((Elf32_Internal_Shdr *, FILE *));
215 static int                display_debug_section       PARAMS ((Elf32_Internal_Shdr *, FILE *));
216 static int                display_debug_info          PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
217 static int                display_debug_not_supported PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
218 static int                prescan_debug_info          PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
219 static int                display_debug_lines         PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
220 static int                display_debug_pubnames      PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
221 static int                display_debug_abbrev        PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
222 static int                display_debug_aranges       PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
223 static int                display_debug_frames        PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
224 static int                display_debug_macinfo       PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
225 static int                display_debug_str           PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
226 static unsigned char *    process_abbrev_section      PARAMS ((unsigned char *, unsigned char *));
227 static void               load_debug_str              PARAMS ((FILE *));
228 static void               free_debug_str              PARAMS ((void));
229 static const char *       fetch_indirect_string       PARAMS ((unsigned long));
230 static unsigned long      read_leb128                 PARAMS ((unsigned char *, int *, int));
231 static int                process_extended_line_op    PARAMS ((unsigned char *, int, int));
232 static void               reset_state_machine         PARAMS ((int));
233 static char *             get_TAG_name                PARAMS ((unsigned long));
234 static char *             get_AT_name                 PARAMS ((unsigned long));
235 static char *             get_FORM_name               PARAMS ((unsigned long));
236 static void               free_abbrevs                PARAMS ((void));
237 static void               add_abbrev                  PARAMS ((unsigned long, unsigned long, int));
238 static void               add_abbrev_attr             PARAMS ((unsigned long, unsigned long));
239 static unsigned char *    read_and_display_attr       PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long, unsigned long));
240 static unsigned char *    read_and_display_attr_value PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long, unsigned long));
241 static unsigned char *    display_block               PARAMS ((unsigned char *, unsigned long));
242 static void               decode_location_expression  PARAMS ((unsigned char *, unsigned int, unsigned long));
243 static void               request_dump                PARAMS ((unsigned int, int));
244 static const char *       get_elf_class               PARAMS ((unsigned int));
245 static const char *       get_data_encoding           PARAMS ((unsigned int));
246 static const char *       get_osabi_name              PARAMS ((unsigned int));
247 static int                guess_is_rela               PARAMS ((unsigned long));
248 static char *             get_note_type                  PARAMS ((unsigned int));
249 static int                process_note                   PARAMS ((Elf32_Internal_Note *));
250 static int                process_corefile_note_segment  PARAMS ((FILE *, bfd_vma, bfd_vma));
251 static int                process_corefile_note_segments PARAMS ((FILE *));
252 static int                process_corefile_contents      PARAMS ((FILE *));
253 static int                process_arch_specific          PARAMS ((FILE *));
254
255 typedef int Elf32_Word;
256
257 #ifndef TRUE
258 #define TRUE     1
259 #define FALSE    0
260 #endif
261 #define UNKNOWN -1
262
263 #define SECTION_NAME(X) ((X) == NULL ? "<none>" : \
264                                  ((X)->sh_name >= string_table_length \
265                                   ? "<corrupt>" : string_table + (X)->sh_name))
266
267 #define DT_VERSIONTAGIDX(tag)   (DT_VERNEEDNUM - (tag)) /* Reverse order! */
268
269 #define BYTE_GET(field) byte_get (field, sizeof (field))
270
271 /* If we can support a 64 bit data type then BFD64 should be defined
272    and sizeof (bfd_vma) == 8.  In this case when translating from an
273    external 8 byte field to an internal field, we can assume that the
274    internal field is also 8 bytes wide and so we can extract all the data.
275    If, however, BFD64 is not defined, then we must assume that the
276    internal data structure only has 4 byte wide fields that are the
277    equivalent of the 8 byte wide external counterparts, and so we must
278    truncate the data.  */
279 #ifdef  BFD64
280 #define BYTE_GET8(field)        byte_get (field, -8)
281 #else
282 #define BYTE_GET8(field)        byte_get (field, 8)
283 #endif
284
285 #define NUM_ELEM(array)         (sizeof (array) / sizeof ((array)[0]))
286
287 #define GET_ELF_SYMBOLS(file, offset, size)                     \
288   (is_32bit_elf ? get_32bit_elf_symbols (file, offset, size)    \
289    : get_64bit_elf_symbols (file, offset, size))
290
291
292 static void
293 error VPARAMS ((const char *message, ...))
294 {
295   VA_OPEN (args, message);
296   VA_FIXEDARG (args, const char *, message);
297
298   fprintf (stderr, _("%s: Error: "), program_name);
299   vfprintf (stderr, message, args);
300   VA_CLOSE (args);
301 }
302
303 static void
304 warn VPARAMS ((const char *message, ...))
305 {
306   VA_OPEN (args, message);
307   VA_FIXEDARG (args, const char *, message);
308
309   fprintf (stderr, _("%s: Warning: "), program_name);
310   vfprintf (stderr, message, args);
311   VA_CLOSE (args);
312 }
313
314 static PTR get_data PARAMS ((PTR, FILE *, long, size_t, const char *));
315
316 static PTR
317 get_data (var, file, offset, size, reason)
318      PTR var;
319      FILE *file;
320      long offset;
321      size_t size;
322      const char *reason;
323 {
324   PTR mvar;
325
326   if (size == 0)
327     return NULL;
328
329   if (fseek (file, offset, SEEK_SET))
330     {
331       error (_("Unable to seek to %x for %s\n"), offset, reason);
332       return NULL;
333     }
334
335   mvar = var;
336   if (mvar == NULL)
337     {
338       mvar = (PTR) malloc (size);
339
340       if (mvar == NULL)
341         {
342           error (_("Out of memory allocating %d bytes for %s\n"),
343                  size, reason);
344           return NULL;
345         }
346     }
347
348   if (fread (mvar, size, 1, file) != 1)
349     {
350       error (_("Unable to read in %d bytes of %s\n"), size, reason);
351       if (mvar != var)
352         free (mvar);
353       return NULL;
354     }
355
356   return mvar;
357 }
358
359 static bfd_vma
360 byte_get_little_endian (field, size)
361      unsigned char * field;
362      int             size;
363 {
364   switch (size)
365     {
366     case 1:
367       return * field;
368
369     case 2:
370       return  ((unsigned int) (field [0]))
371         |    (((unsigned int) (field [1])) << 8);
372
373 #ifndef BFD64
374     case 8:
375       /* We want to extract data from an 8 byte wide field and
376          place it into a 4 byte wide field.  Since this is a little
377          endian source we can juts use the 4 byte extraction code.  */
378       /* Fall through.  */
379 #endif
380     case 4:
381       return  ((unsigned long) (field [0]))
382         |    (((unsigned long) (field [1])) << 8)
383         |    (((unsigned long) (field [2])) << 16)
384         |    (((unsigned long) (field [3])) << 24);
385
386 #ifdef BFD64
387     case 8:
388     case -8:
389       /* This is a special case, generated by the BYTE_GET8 macro.
390          It means that we are loading an 8 byte value from a field
391          in an external structure into an 8 byte value in a field
392          in an internal strcuture.  */
393       return  ((bfd_vma) (field [0]))
394         |    (((bfd_vma) (field [1])) << 8)
395         |    (((bfd_vma) (field [2])) << 16)
396         |    (((bfd_vma) (field [3])) << 24)
397         |    (((bfd_vma) (field [4])) << 32)
398         |    (((bfd_vma) (field [5])) << 40)
399         |    (((bfd_vma) (field [6])) << 48)
400         |    (((bfd_vma) (field [7])) << 56);
401 #endif
402     default:
403       error (_("Unhandled data length: %d\n"), size);
404       abort ();
405     }
406 }
407
408 /* Print a VMA value.  */
409 static void
410 print_vma (vma, mode)
411      bfd_vma vma;
412      print_mode mode;
413 {
414 #ifdef BFD64
415   if (is_32bit_elf)
416 #endif
417     {
418       switch (mode)
419         {
420         case FULL_HEX: printf ("0x"); /* drop through */
421         case LONG_HEX: printf ("%8.8lx", (unsigned long) vma); break;
422         case PREFIX_HEX: printf ("0x"); /* drop through */
423         case HEX: printf ("%lx", (unsigned long) vma); break;
424         case DEC: printf ("%ld", (unsigned long) vma); break;
425         case DEC_5: printf ("%5ld", (long) vma); break;
426         case UNSIGNED: printf ("%lu", (unsigned long) vma); break;
427         }
428     }
429 #ifdef BFD64
430   else
431     {
432       switch (mode)
433         {
434         case FULL_HEX:
435           printf ("0x");
436           /* drop through */
437
438         case LONG_HEX:
439           printf_vma (vma);
440           break;
441
442         case PREFIX_HEX:
443           printf ("0x");
444           /* drop through */
445
446         case HEX:
447 #if BFD_HOST_64BIT_LONG
448           printf ("%lx", vma);
449 #else
450           if (_bfd_int64_high (vma))
451             printf ("%lx%8.8lx", _bfd_int64_high (vma), _bfd_int64_low (vma));
452           else
453             printf ("%lx", _bfd_int64_low (vma));
454 #endif
455           break;
456
457         case DEC:
458 #if BFD_HOST_64BIT_LONG
459           printf ("%ld", vma);
460 #else
461           if (_bfd_int64_high (vma))
462             /* ugg */
463             printf ("++%ld", _bfd_int64_low (vma));
464           else
465             printf ("%ld", _bfd_int64_low (vma));
466 #endif
467           break;
468
469         case DEC_5:
470 #if BFD_HOST_64BIT_LONG
471           printf ("%5ld", vma);
472 #else
473           if (_bfd_int64_high (vma))
474             /* ugg */
475             printf ("++%ld", _bfd_int64_low (vma));
476           else
477             printf ("%5ld", _bfd_int64_low (vma));
478 #endif
479           break;
480
481         case UNSIGNED:
482 #if BFD_HOST_64BIT_LONG
483           printf ("%lu", vma);
484 #else
485           if (_bfd_int64_high (vma))
486             /* ugg */
487             printf ("++%lu", _bfd_int64_low (vma));
488           else
489             printf ("%lu", _bfd_int64_low (vma));
490 #endif
491           break;
492         }
493     }
494 #endif
495 }
496
497 static bfd_vma
498 byte_get_big_endian (field, size)
499      unsigned char * field;
500      int             size;
501 {
502   switch (size)
503     {
504     case 1:
505       return * field;
506
507     case 2:
508       return ((unsigned int) (field [1])) | (((int) (field [0])) << 8);
509
510     case 4:
511       return ((unsigned long) (field [3]))
512         |   (((unsigned long) (field [2])) << 8)
513         |   (((unsigned long) (field [1])) << 16)
514         |   (((unsigned long) (field [0])) << 24);
515
516 #ifndef BFD64
517     case 8:
518       /* Although we are extracing data from an 8 byte wide field, we
519          are returning only 4 bytes of data.  */
520       return ((unsigned long) (field [7]))
521         |   (((unsigned long) (field [6])) << 8)
522         |   (((unsigned long) (field [5])) << 16)
523         |   (((unsigned long) (field [4])) << 24);
524 #else
525     case 8:
526     case -8:
527       /* This is a special case, generated by the BYTE_GET8 macro.
528          It means that we are loading an 8 byte value from a field
529          in an external structure into an 8 byte value in a field
530          in an internal strcuture.  */
531       return ((bfd_vma) (field [7]))
532         |   (((bfd_vma) (field [6])) << 8)
533         |   (((bfd_vma) (field [5])) << 16)
534         |   (((bfd_vma) (field [4])) << 24)
535         |   (((bfd_vma) (field [3])) << 32)
536         |   (((bfd_vma) (field [2])) << 40)
537         |   (((bfd_vma) (field [1])) << 48)
538         |   (((bfd_vma) (field [0])) << 56);
539 #endif
540
541     default:
542       error (_("Unhandled data length: %d\n"), size);
543       abort ();
544     }
545 }
546
547 /* Guess the relocation size commonly used by the specific machines.  */
548
549 static int
550 guess_is_rela (e_machine)
551      unsigned long e_machine;
552 {
553   switch (e_machine)
554     {
555       /* Targets that use REL relocations.  */
556     case EM_ARM:
557     case EM_386:
558     case EM_486:
559     case EM_960:
560     case EM_M32R:
561     case EM_CYGNUS_M32R:
562     case EM_D10V:
563     case EM_CYGNUS_D10V:
564     case EM_MIPS:
565     case EM_MIPS_RS3_LE:
566       return FALSE;
567
568       /* Targets that use RELA relocations.  */
569     case EM_68K:
570     case EM_H8_300:
571     case EM_H8_300H:
572     case EM_H8S:
573     case EM_SPARC32PLUS:
574     case EM_SPARCV9:
575     case EM_SPARC:
576     case EM_PPC:
577     case EM_V850:
578     case EM_CYGNUS_V850:
579     case EM_D30V:
580     case EM_CYGNUS_D30V:
581     case EM_MN10200:
582     case EM_CYGNUS_MN10200:
583     case EM_MN10300:
584     case EM_CYGNUS_MN10300:
585     case EM_FR30:
586     case EM_CYGNUS_FR30:
587     case EM_SH:
588     case EM_ALPHA:
589     case EM_MCORE:
590     case EM_IA_64:
591     case EM_AVR:
592     case EM_AVR_OLD:
593     case EM_CRIS:
594     case EM_860:
595     case EM_X86_64:
596     case EM_S390:
597     case EM_S390_OLD:
598     case EM_MMIX:
599     case EM_XSTORMY16:
600       return TRUE;
601
602     case EM_MMA:
603     case EM_PCP:
604     case EM_NCPU:
605     case EM_NDR1:
606     case EM_STARCORE:
607     case EM_ME16:
608     case EM_ST100:
609     case EM_TINYJ:
610     case EM_FX66:
611     case EM_ST9PLUS:
612     case EM_ST7:
613     case EM_68HC16:
614     case EM_68HC11:
615     case EM_68HC08:
616     case EM_68HC05:
617     case EM_SVX:
618     case EM_ST19:
619     case EM_VAX:
620     default:
621       warn (_("Don't know about relocations on this machine architecture\n"));
622       return FALSE;
623     }
624 }
625
626 static int
627 slurp_rela_relocs (file, rel_offset, rel_size, relasp, nrelasp)
628      FILE *file;
629      unsigned long rel_offset;
630      unsigned long rel_size;
631      Elf_Internal_Rela **relasp;
632      unsigned long *nrelasp;
633 {
634   Elf_Internal_Rela *relas;
635   unsigned long nrelas;
636   unsigned int i;
637
638   if (is_32bit_elf)
639     {
640       Elf32_External_Rela * erelas;
641
642       erelas = (Elf32_External_Rela *) get_data (NULL, file, rel_offset,
643                                                  rel_size, _("relocs"));
644       if (!erelas)
645         return 0;
646
647       nrelas = rel_size / sizeof (Elf32_External_Rela);
648
649       relas = (Elf_Internal_Rela *)
650         malloc (nrelas * sizeof (Elf_Internal_Rela));
651
652       if (relas == NULL)
653         {
654           error(_("out of memory parsing relocs"));
655           return 0;
656         }
657
658       for (i = 0; i < nrelas; i++)
659         {
660           relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
661           relas[i].r_info   = BYTE_GET (erelas[i].r_info);
662           relas[i].r_addend = BYTE_GET (erelas[i].r_addend);
663         }
664
665       free (erelas);
666     }
667   else
668     {
669       Elf64_External_Rela * erelas;
670
671       erelas = (Elf64_External_Rela *) get_data (NULL, file, rel_offset,
672                                                  rel_size, _("relocs"));
673       if (!erelas)
674         return 0;
675
676       nrelas = rel_size / sizeof (Elf64_External_Rela);
677
678       relas = (Elf_Internal_Rela *)
679         malloc (nrelas * sizeof (Elf_Internal_Rela));
680
681       if (relas == NULL)
682         {
683           error(_("out of memory parsing relocs"));
684           return 0;
685         }
686
687       for (i = 0; i < nrelas; i++)
688         {
689           relas[i].r_offset = BYTE_GET8 (erelas[i].r_offset);
690           relas[i].r_info   = BYTE_GET8 (erelas[i].r_info);
691           relas[i].r_addend = BYTE_GET8 (erelas[i].r_addend);
692         }
693
694       free (erelas);
695     }
696   *relasp = relas;
697   *nrelasp = nrelas;
698   return 1;
699 }
700
701 static int
702 slurp_rel_relocs (file, rel_offset, rel_size, relsp, nrelsp)
703      FILE *file;
704      unsigned long rel_offset;
705      unsigned long rel_size;
706      Elf_Internal_Rel **relsp;
707      unsigned long *nrelsp;
708 {
709   Elf_Internal_Rel *rels;
710   unsigned long nrels;
711   unsigned int i;
712
713   if (is_32bit_elf)
714     {
715       Elf32_External_Rel * erels;
716
717       erels = (Elf32_External_Rel *) get_data (NULL, file, rel_offset,
718                                                rel_size, _("relocs"));
719       if (!erels)
720         return 0;
721
722       nrels = rel_size / sizeof (Elf32_External_Rel);
723
724       rels = (Elf_Internal_Rel *) malloc (nrels * sizeof (Elf_Internal_Rel));
725
726       if (rels == NULL)
727         {
728           error(_("out of memory parsing relocs"));
729           return 0;
730         }
731
732       for (i = 0; i < nrels; i++)
733         {
734           rels[i].r_offset = BYTE_GET (erels[i].r_offset);
735           rels[i].r_info   = BYTE_GET (erels[i].r_info);
736         }
737
738       free (erels);
739     }
740   else
741     {
742       Elf64_External_Rel * erels;
743
744       erels = (Elf64_External_Rel *) get_data (NULL, file, rel_offset,
745                                                rel_size, _("relocs"));
746       if (!erels)
747         return 0;
748
749       nrels = rel_size / sizeof (Elf64_External_Rel);
750
751       rels = (Elf_Internal_Rel *) malloc (nrels * sizeof (Elf_Internal_Rel));
752
753       if (rels == NULL)
754         {
755           error(_("out of memory parsing relocs"));
756           return 0;
757         }
758
759       for (i = 0; i < nrels; i++)
760         {
761           rels[i].r_offset = BYTE_GET8 (erels[i].r_offset);
762           rels[i].r_info   = BYTE_GET8 (erels[i].r_info);
763         }
764
765       free (erels);
766     }
767   *relsp = rels;
768   *nrelsp = nrels;
769   return 1;
770 }
771
772 /* Display the contents of the relocation data found at the specified offset.  */
773 static int
774 dump_relocations (file, rel_offset, rel_size, symtab, nsyms, strtab, is_rela)
775      FILE *             file;
776      unsigned long      rel_offset;
777      unsigned long      rel_size;
778      Elf_Internal_Sym * symtab;
779      unsigned long      nsyms;
780      char *             strtab;
781      int                is_rela;
782 {
783   unsigned int        i;
784   Elf_Internal_Rel *  rels;
785   Elf_Internal_Rela * relas;
786
787
788   if (is_rela == UNKNOWN)
789     is_rela = guess_is_rela (elf_header.e_machine);
790
791   if (is_rela)
792     {
793       if (!slurp_rela_relocs (file, rel_offset, rel_size, &relas, &rel_size))
794         return 0;
795     }
796   else
797     {
798       if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
799         return 0;
800     }
801
802   if (is_32bit_elf)
803     {
804       if (is_rela)
805         printf
806           (_(" Offset     Info    Type            Symbol's Value  Symbol's Name          Addend\n"));
807       else
808         printf
809           (_(" Offset     Info    Type            Symbol's Value  Symbol's Name\n"));
810     }
811   else
812     {
813       if (is_rela)
814         printf
815           (_("    Offset             Info            Type               Symbol's Value   Symbol's Name           Addend\n"));
816       else
817         printf
818           (_("    Offset             Info            Type               Symbol's Value   Symbol's Name\n"));
819     }
820
821   for (i = 0; i < rel_size; i++)
822     {
823       const char * rtype;
824       bfd_vma      offset;
825       bfd_vma      info;
826       bfd_vma      symtab_index;
827       bfd_vma      type;
828
829       if (is_rela)
830         {
831           offset = relas [i].r_offset;
832           info   = relas [i].r_info;
833         }
834       else
835         {
836           offset = rels [i].r_offset;
837           info   = rels [i].r_info;
838         }
839
840       if (is_32bit_elf)
841         {
842           type         = ELF32_R_TYPE (info);
843           symtab_index = ELF32_R_SYM  (info);
844         }
845       else
846         {
847           if (elf_header.e_machine == EM_SPARCV9)
848             type       = ELF64_R_TYPE_ID (info);
849           else
850             type       = ELF64_R_TYPE (info);
851           /* The #ifdef BFD64 below is to prevent a compile time warning.
852              We know that if we do not have a 64 bit data type that we
853              will never execute this code anyway.  */
854 #ifdef BFD64
855           symtab_index = ELF64_R_SYM  (info);
856 #endif
857         }
858
859       if (is_32bit_elf)
860         {
861 #ifdef _bfd_int64_low
862           printf ("%8.8lx  %8.8lx ", _bfd_int64_low (offset), _bfd_int64_low (info));
863 #else
864           printf ("%8.8lx  %8.8lx ", offset, info);
865 #endif
866         }
867       else
868         {
869 #ifdef _bfd_int64_low
870           printf ("%8.8lx%8.8lx  %8.8lx%8.8lx ",
871                   _bfd_int64_high (offset),
872                   _bfd_int64_low (offset),
873                   _bfd_int64_high (info),
874                   _bfd_int64_low (info));
875 #else
876           printf ("%16.16lx  %16.16lx ", offset, info);
877 #endif
878         }
879
880       switch (elf_header.e_machine)
881         {
882         default:
883           rtype = NULL;
884           break;
885
886         case EM_M32R:
887         case EM_CYGNUS_M32R:
888           rtype = elf_m32r_reloc_type (type);
889           break;
890
891         case EM_386:
892         case EM_486:
893           rtype = elf_i386_reloc_type (type);
894           break;
895
896         case EM_68K:
897           rtype = elf_m68k_reloc_type (type);
898           break;
899
900         case EM_960:
901           rtype = elf_i960_reloc_type (type);
902           break;
903
904         case EM_AVR:
905         case EM_AVR_OLD:
906           rtype = elf_avr_reloc_type (type);
907           break;
908
909         case EM_OLD_SPARCV9:
910         case EM_SPARC32PLUS:
911         case EM_SPARCV9:
912         case EM_SPARC:
913           rtype = elf_sparc_reloc_type (type);
914           break;
915
916         case EM_V850:
917         case EM_CYGNUS_V850:
918           rtype = v850_reloc_type (type);
919           break;
920
921         case EM_D10V:
922         case EM_CYGNUS_D10V:
923           rtype = elf_d10v_reloc_type (type);
924           break;
925
926         case EM_D30V:
927         case EM_CYGNUS_D30V:
928           rtype = elf_d30v_reloc_type (type);
929           break;
930
931         case EM_SH:
932           rtype = elf_sh_reloc_type (type);
933           break;
934
935         case EM_MN10300:
936         case EM_CYGNUS_MN10300:
937           rtype = elf_mn10300_reloc_type (type);
938           break;
939
940         case EM_MN10200:
941         case EM_CYGNUS_MN10200:
942           rtype = elf_mn10200_reloc_type (type);
943           break;
944
945         case EM_FR30:
946         case EM_CYGNUS_FR30:
947           rtype = elf_fr30_reloc_type (type);
948           break;
949
950         case EM_MCORE:
951           rtype = elf_mcore_reloc_type (type);
952           break;
953
954         case EM_MMIX:
955           rtype = elf_mmix_reloc_type (type);
956           break;
957
958         case EM_PPC:
959         case EM_PPC64:
960           rtype = elf_ppc_reloc_type (type);
961           break;
962
963         case EM_MIPS:
964         case EM_MIPS_RS3_LE:
965           rtype = elf_mips_reloc_type (type);
966           break;
967
968         case EM_ALPHA:
969           rtype = elf_alpha_reloc_type (type);
970           break;
971
972         case EM_ARM:
973           rtype = elf_arm_reloc_type (type);
974           break;
975
976         case EM_ARC:
977           rtype = elf_arc_reloc_type (type);
978           break;
979
980         case EM_PARISC:
981           rtype = elf_hppa_reloc_type (type);
982           break;
983
984         case EM_H8_300:
985         case EM_H8_300H:
986         case EM_H8S:
987           rtype = elf_h8_reloc_type (type);
988           break;
989
990         case EM_PJ:
991         case EM_PJ_OLD:
992           rtype = elf_pj_reloc_type (type);
993           break;
994         case EM_IA_64:
995           rtype = elf_ia64_reloc_type (type);
996           break;
997
998         case EM_CRIS:
999           rtype = elf_cris_reloc_type (type);
1000           break;
1001
1002         case EM_860:
1003           rtype = elf_i860_reloc_type (type);
1004           break;
1005
1006         case EM_X86_64:
1007           rtype = elf_x86_64_reloc_type (type);
1008           break;
1009
1010         case EM_S390_OLD:
1011         case EM_S390:
1012           rtype = elf_s390_reloc_type (type);
1013           break;
1014
1015         case EM_XSTORMY16:
1016           rtype = elf_xstormy16_reloc_type (type);
1017           break;
1018         }
1019
1020       if (rtype == NULL)
1021 #ifdef _bfd_int64_low
1022         printf (_("unrecognised: %-7lx"), _bfd_int64_low (type));
1023 #else
1024         printf (_("unrecognised: %-7lx"), type);
1025 #endif
1026       else
1027         printf ("%-21.21s", rtype);
1028
1029       if (symtab_index)
1030         {
1031           if (symtab == NULL || symtab_index >= nsyms)
1032             printf (" bad symbol index: %08lx", (unsigned long) symtab_index);
1033           else
1034             {
1035               Elf_Internal_Sym * psym;
1036
1037               psym = symtab + symtab_index;
1038
1039               printf (" ");
1040               print_vma (psym->st_value, LONG_HEX);
1041               printf ("  ");
1042
1043               if (psym->st_name == 0)
1044                 printf ("%-25.25s",
1045                         SECTION_NAME (section_headers + psym->st_shndx));
1046               else if (strtab == NULL)
1047                 printf (_("<string table index %3ld>"), psym->st_name);
1048               else
1049                 printf ("%-25.25s", strtab + psym->st_name);
1050
1051               if (is_rela)
1052                 printf (" + %lx", (unsigned long) relas [i].r_addend);
1053             }
1054         }
1055       else if (is_rela)
1056         {
1057           printf ("%*c", is_32bit_elf ? 34 : 26, ' ');
1058           print_vma (relas[i].r_addend, LONG_HEX);
1059         }
1060
1061       if (elf_header.e_machine == EM_SPARCV9
1062           && !strcmp (rtype, "R_SPARC_OLO10"))
1063         printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info));
1064
1065       putchar ('\n');
1066     }
1067
1068   if (is_rela)
1069     free (relas);
1070   else
1071     free (rels);
1072
1073   return 1;
1074 }
1075
1076 static const char *
1077 get_mips_dynamic_type (type)
1078      unsigned long type;
1079 {
1080   switch (type)
1081     {
1082     case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1083     case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1084     case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1085     case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1086     case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1087     case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1088     case DT_MIPS_MSYM: return "MIPS_MSYM";
1089     case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1090     case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1091     case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1092     case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1093     case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1094     case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1095     case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1096     case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1097     case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1098     case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1099     case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1100     case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1101     case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1102     case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1103     case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1104     case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1105     case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1106     case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1107     case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1108     case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1109     case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1110     case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1111     case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1112     case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1113     case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1114     case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1115     case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1116     case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1117     case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1118     case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1119     case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1120     case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1121     case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1122     case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1123     case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1124     case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1125     default:
1126       return NULL;
1127     }
1128 }
1129
1130 static const char *
1131 get_sparc64_dynamic_type (type)
1132      unsigned long type;
1133 {
1134   switch (type)
1135     {
1136     case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1137     default:
1138       return NULL;
1139     }
1140 }
1141
1142 static const char *
1143 get_parisc_dynamic_type (type)
1144      unsigned long type;
1145 {
1146   switch (type)
1147     {
1148     case DT_HP_LOAD_MAP:        return "HP_LOAD_MAP";
1149     case DT_HP_DLD_FLAGS:       return "HP_DLD_FLAGS";
1150     case DT_HP_DLD_HOOK:        return "HP_DLD_HOOK";
1151     case DT_HP_UX10_INIT:       return "HP_UX10_INIT";
1152     case DT_HP_UX10_INITSZ:     return "HP_UX10_INITSZ";
1153     case DT_HP_PREINIT:         return "HP_PREINIT";
1154     case DT_HP_PREINITSZ:       return "HP_PREINITSZ";
1155     case DT_HP_NEEDED:          return "HP_NEEDED";
1156     case DT_HP_TIME_STAMP:      return "HP_TIME_STAMP";
1157     case DT_HP_CHECKSUM:        return "HP_CHECKSUM";
1158     case DT_HP_GST_SIZE:        return "HP_GST_SIZE";
1159     case DT_HP_GST_VERSION:     return "HP_GST_VERSION";
1160     case DT_HP_GST_HASHVAL:     return "HP_GST_HASHVAL";
1161     default:
1162       return NULL;
1163     }
1164 }
1165
1166 static const char *
1167 get_dynamic_type (type)
1168      unsigned long type;
1169 {
1170   static char buff [32];
1171
1172   switch (type)
1173     {
1174     case DT_NULL:       return "NULL";
1175     case DT_NEEDED:     return "NEEDED";
1176     case DT_PLTRELSZ:   return "PLTRELSZ";
1177     case DT_PLTGOT:     return "PLTGOT";
1178     case DT_HASH:       return "HASH";
1179     case DT_STRTAB:     return "STRTAB";
1180     case DT_SYMTAB:     return "SYMTAB";
1181     case DT_RELA:       return "RELA";
1182     case DT_RELASZ:     return "RELASZ";
1183     case DT_RELAENT:    return "RELAENT";
1184     case DT_STRSZ:      return "STRSZ";
1185     case DT_SYMENT:     return "SYMENT";
1186     case DT_INIT:       return "INIT";
1187     case DT_FINI:       return "FINI";
1188     case DT_SONAME:     return "SONAME";
1189     case DT_RPATH:      return "RPATH";
1190     case DT_SYMBOLIC:   return "SYMBOLIC";
1191     case DT_REL:        return "REL";
1192     case DT_RELSZ:      return "RELSZ";
1193     case DT_RELENT:     return "RELENT";
1194     case DT_PLTREL:     return "PLTREL";
1195     case DT_DEBUG:      return "DEBUG";
1196     case DT_TEXTREL:    return "TEXTREL";
1197     case DT_JMPREL:     return "JMPREL";
1198     case DT_BIND_NOW:   return "BIND_NOW";
1199     case DT_INIT_ARRAY: return "INIT_ARRAY";
1200     case DT_FINI_ARRAY: return "FINI_ARRAY";
1201     case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
1202     case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
1203     case DT_RUNPATH:    return "RUNPATH";
1204     case DT_FLAGS:      return "FLAGS";
1205
1206     case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1207     case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
1208
1209     case DT_CHECKSUM:   return "CHECKSUM";
1210     case DT_PLTPADSZ:   return "PLTPADSZ";
1211     case DT_MOVEENT:    return "MOVEENT";
1212     case DT_MOVESZ:     return "MOVESZ";
1213     case DT_FEATURE:    return "FEATURE";
1214     case DT_POSFLAG_1:  return "POSFLAG_1";
1215     case DT_SYMINSZ:    return "SYMINSZ";
1216     case DT_SYMINENT:   return "SYMINENT"; /* aka VALRNGHI */
1217
1218     case DT_ADDRRNGLO:  return "ADDRRNGLO";
1219     case DT_CONFIG:     return "CONFIG";
1220     case DT_DEPAUDIT:   return "DEPAUDIT";
1221     case DT_AUDIT:      return "AUDIT";
1222     case DT_PLTPAD:     return "PLTPAD";
1223     case DT_MOVETAB:    return "MOVETAB";
1224     case DT_SYMINFO:    return "SYMINFO"; /* aka ADDRRNGHI */
1225
1226     case DT_VERSYM:     return "VERSYM";
1227
1228     case DT_RELACOUNT:  return "RELACOUNT";
1229     case DT_RELCOUNT:   return "RELCOUNT";
1230     case DT_FLAGS_1:    return "FLAGS_1";
1231     case DT_VERDEF:     return "VERDEF";
1232     case DT_VERDEFNUM:  return "VERDEFNUM";
1233     case DT_VERNEED:    return "VERNEED";
1234     case DT_VERNEEDNUM: return "VERNEEDNUM";
1235
1236     case DT_AUXILIARY:  return "AUXILIARY";
1237     case DT_USED:       return "USED";
1238     case DT_FILTER:     return "FILTER";
1239
1240     default:
1241       if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
1242         {
1243           const char * result;
1244
1245           switch (elf_header.e_machine)
1246             {
1247             case EM_MIPS:
1248             case EM_MIPS_RS3_LE:
1249               result = get_mips_dynamic_type (type);
1250               break;
1251             case EM_SPARCV9:
1252               result = get_sparc64_dynamic_type (type);
1253               break;
1254             default:
1255               result = NULL;
1256               break;
1257             }
1258
1259           if (result != NULL)
1260             return result;
1261
1262           sprintf (buff, _("Processor Specific: %lx"), type);
1263         }
1264       else if ((type >= DT_LOOS) && (type <= DT_HIOS))
1265         {
1266           const char * result;
1267
1268           switch (elf_header.e_machine)
1269             {
1270             case EM_PARISC:
1271               result = get_parisc_dynamic_type (type);
1272               break;
1273             default:
1274               result = NULL;
1275               break;
1276             }
1277
1278           if (result != NULL)
1279             return result;
1280
1281           sprintf (buff, _("Operating System specific: %lx"), type);
1282         }
1283       else
1284         sprintf (buff, _("<unknown>: %lx"), type);
1285
1286       return buff;
1287     }
1288 }
1289
1290 static char *
1291 get_file_type (e_type)
1292      unsigned e_type;
1293 {
1294   static char buff [32];
1295
1296   switch (e_type)
1297     {
1298     case ET_NONE:       return _("NONE (None)");
1299     case ET_REL:        return _("REL (Relocatable file)");
1300     case ET_EXEC:       return _("EXEC (Executable file)");
1301     case ET_DYN:        return _("DYN (Shared object file)");
1302     case ET_CORE:       return _("CORE (Core file)");
1303
1304     default:
1305       if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
1306         sprintf (buff, _("Processor Specific: (%x)"), e_type);
1307       else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
1308         sprintf (buff, _("OS Specific: (%x)"), e_type);
1309       else
1310         sprintf (buff, _("<unknown>: %x"), e_type);
1311       return buff;
1312     }
1313 }
1314
1315 static char *
1316 get_machine_name (e_machine)
1317      unsigned e_machine;
1318 {
1319   static char buff [64]; /* XXX */
1320
1321   switch (e_machine)
1322     {
1323     case EM_NONE:               return _("None");
1324     case EM_M32:                return "WE32100";
1325     case EM_SPARC:              return "Sparc";
1326     case EM_386:                return "Intel 80386";
1327     case EM_68K:                return "MC68000";
1328     case EM_88K:                return "MC88000";
1329     case EM_486:                return "Intel 80486";
1330     case EM_860:                return "Intel 80860";
1331     case EM_MIPS:               return "MIPS R3000";
1332     case EM_S370:               return "IBM System/370";
1333     case EM_MIPS_RS3_LE:        return "MIPS R4000 big-endian";
1334     case EM_OLD_SPARCV9:        return "Sparc v9 (old)";
1335     case EM_PARISC:             return "HPPA";
1336     case EM_PPC_OLD:            return "Power PC (old)";
1337     case EM_SPARC32PLUS:        return "Sparc v8+" ;
1338     case EM_960:                return "Intel 90860";
1339     case EM_PPC:                return "PowerPC";
1340     case EM_V800:               return "NEC V800";
1341     case EM_FR20:               return "Fujitsu FR20";
1342     case EM_RH32:               return "TRW RH32";
1343     case EM_MCORE:              return "MCORE";
1344     case EM_ARM:                return "ARM";
1345     case EM_OLD_ALPHA:          return "Digital Alpha (old)";
1346     case EM_SH:                 return "Hitachi SH";
1347     case EM_SPARCV9:            return "Sparc v9";
1348     case EM_TRICORE:            return "Siemens Tricore";
1349     case EM_ARC:                return "ARC";
1350     case EM_H8_300:             return "Hitachi H8/300";
1351     case EM_H8_300H:            return "Hitachi H8/300H";
1352     case EM_H8S:                return "Hitachi H8S";
1353     case EM_H8_500:             return "Hitachi H8/500";
1354     case EM_IA_64:              return "Intel IA-64";
1355     case EM_MIPS_X:             return "Stanford MIPS-X";
1356     case EM_COLDFIRE:           return "Motorola Coldfire";
1357     case EM_68HC12:             return "Motorola M68HC12";
1358     case EM_ALPHA:              return "Alpha";
1359     case EM_CYGNUS_D10V:
1360     case EM_D10V:               return "d10v";
1361     case EM_CYGNUS_D30V:
1362     case EM_D30V:               return "d30v";
1363     case EM_CYGNUS_M32R:
1364     case EM_M32R:               return "Mitsubishi M32r";
1365     case EM_CYGNUS_V850:
1366     case EM_V850:               return "NEC v850";
1367     case EM_CYGNUS_MN10300:
1368     case EM_MN10300:            return "mn10300";
1369     case EM_CYGNUS_MN10200:
1370     case EM_MN10200:            return "mn10200";
1371     case EM_CYGNUS_FR30:
1372     case EM_FR30:               return "Fujitsu FR30";
1373     case EM_PJ_OLD:
1374     case EM_PJ:                 return "picoJava";
1375     case EM_MMA:                return "Fujitsu Multimedia Accelerator";
1376     case EM_PCP:                return "Siemens PCP";
1377     case EM_NCPU:               return "Sony nCPU embedded RISC processor";
1378     case EM_NDR1:               return "Denso NDR1 microprocesspr";
1379     case EM_STARCORE:           return "Motorola Star*Core processor";
1380     case EM_ME16:               return "Toyota ME16 processor";
1381     case EM_ST100:              return "STMicroelectronics ST100 processor";
1382     case EM_TINYJ:              return "Advanced Logic Corp. TinyJ embedded processor";
1383     case EM_FX66:               return "Siemens FX66 microcontroller";
1384     case EM_ST9PLUS:            return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1385     case EM_ST7:                return "STMicroelectronics ST7 8-bit microcontroller";
1386     case EM_68HC16:             return "Motorola MC68HC16 Microcontroller";
1387     case EM_68HC11:             return "Motorola MC68HC11 Microcontroller";
1388     case EM_68HC08:             return "Motorola MC68HC08 Microcontroller";
1389     case EM_68HC05:             return "Motorola MC68HC05 Microcontroller";
1390     case EM_SVX:                return "Silicon Graphics SVx";
1391     case EM_ST19:               return "STMicroelectronics ST19 8-bit microcontroller";
1392     case EM_VAX:                return "Digital VAX";
1393     case EM_AVR_OLD:
1394     case EM_AVR:                return "Atmel AVR 8-bit microcontroller";
1395     case EM_CRIS:               return "Axis Communications 32-bit embedded processor";
1396     case EM_JAVELIN:            return "Infineon Technologies 32-bit embedded cpu";
1397     case EM_FIREPATH:           return "Element 14 64-bit DSP processor";
1398     case EM_ZSP:                return "LSI Logic's 16-bit DSP processor";
1399     case EM_MMIX:               return "Donald Knuth's educational 64-bit processor";
1400     case EM_HUANY:              return "Harvard Universitys's machine-independent object format";
1401     case EM_PRISM:              return "SiTera Prism";
1402     case EM_X86_64:             return "Advanced Micro Devices X86-64";
1403     case EM_S390_OLD:
1404     case EM_S390:               return "IBM S/390";
1405     case EM_XSTORMY16:          return "Sanyo Xstormy16 CPU core";
1406     default:
1407       sprintf (buff, _("<unknown>: %x"), e_machine);
1408       return buff;
1409     }
1410 }
1411
1412 static void
1413 decode_ARM_machine_flags (e_flags, buf)
1414      unsigned e_flags;
1415      char buf[];
1416 {
1417   unsigned eabi;
1418   int unknown = 0;
1419
1420   eabi = EF_ARM_EABI_VERSION (e_flags);
1421   e_flags &= ~ EF_ARM_EABIMASK;
1422
1423   /* Handle "generic" ARM flags.  */
1424   if (e_flags & EF_ARM_RELEXEC)
1425     {
1426       strcat (buf, ", relocatable executable");
1427       e_flags &= ~ EF_ARM_RELEXEC;
1428     }
1429
1430   if (e_flags & EF_ARM_HASENTRY)
1431     {
1432       strcat (buf, ", has entry point");
1433       e_flags &= ~ EF_ARM_HASENTRY;
1434     }
1435
1436   /* Now handle EABI specific flags.  */
1437   switch (eabi)
1438     {
1439     default:
1440       strcat (buf, ", <unrecognised EABI>");
1441       if (e_flags)
1442         unknown = 1;
1443       break;
1444
1445     case EF_ARM_EABI_VER1:
1446       strcat (buf, ", Version1 EABI");
1447       while (e_flags)
1448         {
1449           unsigned flag;
1450
1451           /* Process flags one bit at a time.  */
1452           flag = e_flags & - e_flags;
1453           e_flags &= ~ flag;
1454
1455           switch (flag)
1456             {
1457             case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK.  */
1458               strcat (buf, ", sorted symbol tables");
1459               break;
1460
1461             default:
1462               unknown = 1;
1463               break;
1464             }
1465         }
1466       break;
1467
1468     case EF_ARM_EABI_VER2:
1469       strcat (buf, ", Version2 EABI");
1470       while (e_flags)
1471         {
1472           unsigned flag;
1473
1474           /* Process flags one bit at a time.  */
1475           flag = e_flags & - e_flags;
1476           e_flags &= ~ flag;
1477
1478           switch (flag)
1479             {
1480             case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK.  */
1481               strcat (buf, ", sorted symbol tables");
1482               break;
1483
1484             case EF_ARM_DYNSYMSUSESEGIDX:
1485               strcat (buf, ", dynamic symbols use segment index");
1486               break;
1487
1488             case EF_ARM_MAPSYMSFIRST:
1489               strcat (buf, ", mapping symbols precede others");
1490               break;
1491
1492             default:
1493               unknown = 1;
1494               break;
1495             }
1496         }
1497       break;
1498
1499     case EF_ARM_EABI_UNKNOWN:
1500       strcat (buf, ", GNU EABI");
1501       while (e_flags)
1502         {
1503           unsigned flag;
1504
1505           /* Process flags one bit at a time.  */
1506           flag = e_flags & - e_flags;
1507           e_flags &= ~ flag;
1508
1509           switch (flag)
1510             {
1511             case EF_ARM_INTERWORK:
1512               strcat (buf, ", interworking enabled");
1513               break;
1514
1515             case EF_ARM_APCS_26:
1516               strcat (buf, ", uses APCS/26");
1517               break;
1518
1519             case EF_ARM_APCS_FLOAT:
1520               strcat (buf, ", uses APCS/float");
1521               break;
1522
1523             case EF_ARM_PIC:
1524               strcat (buf, ", position independent");
1525               break;
1526
1527             case EF_ARM_ALIGN8:
1528               strcat (buf, ", 8 bit structure alignment");
1529               break;
1530
1531             case EF_ARM_NEW_ABI:
1532               strcat (buf, ", uses new ABI");
1533               break;
1534
1535             case EF_ARM_OLD_ABI:
1536               strcat (buf, ", uses old ABI");
1537               break;
1538
1539             case EF_ARM_SOFT_FLOAT:
1540               strcat (buf, ", software FP");
1541               break;
1542
1543             default:
1544               unknown = 1;
1545               break;
1546             }
1547         }
1548     }
1549
1550   if (unknown)
1551     strcat (buf,", <unknown>");
1552 }
1553
1554 static char *
1555 get_machine_flags (e_flags, e_machine)
1556      unsigned e_flags;
1557      unsigned e_machine;
1558 {
1559   static char buf [1024];
1560
1561   buf[0] = '\0';
1562
1563   if (e_flags)
1564     {
1565       switch (e_machine)
1566         {
1567         default:
1568           break;
1569
1570         case EM_ARM:
1571           decode_ARM_machine_flags (e_flags, buf);
1572           break;
1573
1574         case EM_68K:
1575           if (e_flags & EF_CPU32)
1576             strcat (buf, ", cpu32");
1577           break;
1578
1579         case EM_PPC:
1580           if (e_flags & EF_PPC_EMB)
1581             strcat (buf, ", emb");
1582
1583           if (e_flags & EF_PPC_RELOCATABLE)
1584             strcat (buf, ", relocatable");
1585
1586           if (e_flags & EF_PPC_RELOCATABLE_LIB)
1587             strcat (buf, ", relocatable-lib");
1588           break;
1589
1590         case EM_V850:
1591         case EM_CYGNUS_V850:
1592           switch (e_flags & EF_V850_ARCH)
1593             {
1594             case E_V850E_ARCH:
1595               strcat (buf, ", v850e");
1596               break;
1597             case E_V850EA_ARCH:
1598               strcat (buf, ", v850ea");
1599               break;
1600             case E_V850_ARCH:
1601               strcat (buf, ", v850");
1602               break;
1603             default:
1604               strcat (buf, ", unknown v850 architecture variant");
1605               break;
1606             }
1607           break;
1608
1609         case EM_M32R:
1610         case EM_CYGNUS_M32R:
1611           if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
1612             strcat (buf, ", m32r");
1613
1614           break;
1615
1616         case EM_MIPS:
1617         case EM_MIPS_RS3_LE:
1618           if (e_flags & EF_MIPS_NOREORDER)
1619             strcat (buf, ", noreorder");
1620
1621           if (e_flags & EF_MIPS_PIC)
1622             strcat (buf, ", pic");
1623
1624           if (e_flags & EF_MIPS_CPIC)
1625             strcat (buf, ", cpic");
1626
1627           if (e_flags & EF_MIPS_UCODE)
1628             strcat (buf, ", ugen_reserved");
1629
1630           if (e_flags & EF_MIPS_ABI2)
1631             strcat (buf, ", abi2");
1632
1633           if (e_flags & EF_MIPS_32BITMODE)
1634             strcat (buf, ", 32bitmode");
1635
1636           if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_1)
1637             strcat (buf, ", mips1");
1638
1639           if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_2)
1640             strcat (buf, ", mips2");
1641
1642           if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_3)
1643             strcat (buf, ", mips3");
1644
1645           if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_4)
1646             strcat (buf, ", mips4");
1647
1648           if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_5)
1649             strcat (buf, ", mips5");
1650
1651           if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_32)
1652             strcat (buf, ", mips32");
1653
1654           if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_64)
1655             strcat (buf, ", mips64");
1656
1657           switch ((e_flags & EF_MIPS_MACH))
1658             {
1659             case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
1660             case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
1661             case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
1662             case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
1663             case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
1664             case E_MIPS_MACH_SB1:  strcat (buf, ", sb1");  break;
1665             default: strcat (buf, " UNKNOWN"); break;
1666             }
1667           break;
1668
1669         case EM_SPARCV9:
1670           if (e_flags & EF_SPARC_32PLUS)
1671             strcat (buf, ", v8+");
1672
1673           if (e_flags & EF_SPARC_SUN_US1)
1674             strcat (buf, ", ultrasparcI");
1675
1676           if (e_flags & EF_SPARC_SUN_US3)
1677             strcat (buf, ", ultrasparcIII");
1678
1679           if (e_flags & EF_SPARC_HAL_R1)
1680             strcat (buf, ", halr1");
1681
1682           if (e_flags & EF_SPARC_LEDATA)
1683             strcat (buf, ", ledata");
1684
1685           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
1686             strcat (buf, ", tso");
1687
1688           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
1689             strcat (buf, ", pso");
1690
1691           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
1692             strcat (buf, ", rmo");
1693           break;
1694
1695         case EM_PARISC:
1696           switch (e_flags & EF_PARISC_ARCH)
1697             {
1698             case EFA_PARISC_1_0:
1699               strcpy (buf, ", PA-RISC 1.0");
1700               break;
1701             case EFA_PARISC_1_1:
1702               strcpy (buf, ", PA-RISC 1.1");
1703               break;
1704             case EFA_PARISC_2_0:
1705               strcpy (buf, ", PA-RISC 2.0");
1706               break;
1707             default:
1708               break;
1709             }
1710           if (e_flags & EF_PARISC_TRAPNIL)
1711             strcat (buf, ", trapnil");
1712           if (e_flags & EF_PARISC_EXT)
1713             strcat (buf, ", ext");
1714           if (e_flags & EF_PARISC_LSB)
1715             strcat (buf, ", lsb");
1716           if (e_flags & EF_PARISC_WIDE)
1717             strcat (buf, ", wide");
1718           if (e_flags & EF_PARISC_NO_KABP)
1719             strcat (buf, ", no kabp");
1720           if (e_flags & EF_PARISC_LAZYSWAP)
1721             strcat (buf, ", lazyswap");
1722           break;
1723
1724         case EM_PJ:
1725         case EM_PJ_OLD:
1726           if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
1727             strcat (buf, ", new calling convention");
1728
1729           if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
1730             strcat (buf, ", gnu calling convention");
1731           break;
1732
1733         case EM_IA_64:
1734           if ((e_flags & EF_IA_64_ABI64))
1735             strcat (buf, ", 64-bit");
1736           else
1737             strcat (buf, ", 32-bit");
1738           if ((e_flags & EF_IA_64_REDUCEDFP))
1739             strcat (buf, ", reduced fp model");
1740           if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
1741             strcat (buf, ", no function descriptors, constant gp");
1742           else if ((e_flags & EF_IA_64_CONS_GP))
1743             strcat (buf, ", constant gp");
1744           if ((e_flags & EF_IA_64_ABSOLUTE))
1745             strcat (buf, ", absolute");
1746           break;
1747         }
1748     }
1749
1750   return buf;
1751 }
1752
1753 static const char *
1754 get_mips_segment_type (type)
1755      unsigned long type;
1756 {
1757   switch (type)
1758     {
1759     case PT_MIPS_REGINFO:
1760       return "REGINFO";
1761     case PT_MIPS_RTPROC:
1762       return "RTPROC";
1763     case PT_MIPS_OPTIONS:
1764       return "OPTIONS";
1765     default:
1766       break;
1767     }
1768
1769   return NULL;
1770 }
1771
1772 static const char *
1773 get_parisc_segment_type (type)
1774      unsigned long type;
1775 {
1776   switch (type)
1777     {
1778     case PT_HP_TLS:             return "HP_TLS";
1779     case PT_HP_CORE_NONE:       return "HP_CORE_NONE";
1780     case PT_HP_CORE_VERSION:    return "HP_CORE_VERSION";
1781     case PT_HP_CORE_KERNEL:     return "HP_CORE_KERNEL";
1782     case PT_HP_CORE_COMM:       return "HP_CORE_COMM";
1783     case PT_HP_CORE_PROC:       return "HP_CORE_PROC";
1784     case PT_HP_CORE_LOADABLE:   return "HP_CORE_LOADABLE";
1785     case PT_HP_CORE_STACK:      return "HP_CORE_STACK";
1786     case PT_HP_CORE_SHM:        return "HP_CORE_SHM";
1787     case PT_HP_CORE_MMF:        return "HP_CORE_MMF";
1788     case PT_HP_PARALLEL:        return "HP_PARALLEL";
1789     case PT_HP_FASTBIND:        return "HP_FASTBIND";
1790     case PT_PARISC_ARCHEXT:     return "PARISC_ARCHEXT";
1791     case PT_PARISC_UNWIND:      return "PARISC_UNWIND";
1792     default:
1793       break;
1794     }
1795
1796   return NULL;
1797 }
1798
1799 static const char *
1800 get_ia64_segment_type (type)
1801      unsigned long type;
1802 {
1803   switch (type)
1804     {
1805     case PT_IA_64_ARCHEXT:      return "IA_64_ARCHEXT";
1806     case PT_IA_64_UNWIND:       return "IA_64_UNWIND";
1807     default:
1808       break;
1809     }
1810
1811   return NULL;
1812 }
1813
1814 static const char *
1815 get_segment_type (p_type)
1816      unsigned long p_type;
1817 {
1818   static char buff [32];
1819
1820   switch (p_type)
1821     {
1822     case PT_NULL:       return "NULL";
1823     case PT_LOAD:       return "LOAD";
1824     case PT_DYNAMIC:    return "DYNAMIC";
1825     case PT_INTERP:     return "INTERP";
1826     case PT_NOTE:       return "NOTE";
1827     case PT_SHLIB:      return "SHLIB";
1828     case PT_PHDR:       return "PHDR";
1829
1830     case PT_GNU_EH_FRAME:
1831                         return "GNU_EH_FRAME";
1832
1833     default:
1834       if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
1835         {
1836           const char * result;
1837
1838           switch (elf_header.e_machine)
1839             {
1840             case EM_MIPS:
1841             case EM_MIPS_RS3_LE:
1842               result = get_mips_segment_type (p_type);
1843               break;
1844             case EM_PARISC:
1845               result = get_parisc_segment_type (p_type);
1846               break;
1847             case EM_IA_64:
1848               result = get_ia64_segment_type (p_type);
1849               break;
1850             default:
1851               result = NULL;
1852               break;
1853             }
1854
1855           if (result != NULL)
1856             return result;
1857
1858           sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
1859         }
1860       else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
1861         {
1862           const char * result;
1863
1864           switch (elf_header.e_machine)
1865             {
1866             case EM_PARISC:
1867               result = get_parisc_segment_type (p_type);
1868               break;
1869             default:
1870               result = NULL;
1871               break;
1872             }
1873
1874           if (result != NULL)
1875             return result;
1876
1877           sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
1878         }
1879       else
1880         sprintf (buff, _("<unknown>: %lx"), p_type);
1881
1882       return buff;
1883     }
1884 }
1885
1886 static const char *
1887 get_mips_section_type_name (sh_type)
1888      unsigned int sh_type;
1889 {
1890   switch (sh_type)
1891     {
1892     case SHT_MIPS_LIBLIST:       return "MIPS_LIBLIST";
1893     case SHT_MIPS_MSYM:          return "MIPS_MSYM";
1894     case SHT_MIPS_CONFLICT:      return "MIPS_CONFLICT";
1895     case SHT_MIPS_GPTAB:         return "MIPS_GPTAB";
1896     case SHT_MIPS_UCODE:         return "MIPS_UCODE";
1897     case SHT_MIPS_DEBUG:         return "MIPS_DEBUG";
1898     case SHT_MIPS_REGINFO:       return "MIPS_REGINFO";
1899     case SHT_MIPS_PACKAGE:       return "MIPS_PACKAGE";
1900     case SHT_MIPS_PACKSYM:       return "MIPS_PACKSYM";
1901     case SHT_MIPS_RELD:          return "MIPS_RELD";
1902     case SHT_MIPS_IFACE:         return "MIPS_IFACE";
1903     case SHT_MIPS_CONTENT:       return "MIPS_CONTENT";
1904     case SHT_MIPS_OPTIONS:       return "MIPS_OPTIONS";
1905     case SHT_MIPS_SHDR:          return "MIPS_SHDR";
1906     case SHT_MIPS_FDESC:         return "MIPS_FDESC";
1907     case SHT_MIPS_EXTSYM:        return "MIPS_EXTSYM";
1908     case SHT_MIPS_DENSE:         return "MIPS_DENSE";
1909     case SHT_MIPS_PDESC:         return "MIPS_PDESC";
1910     case SHT_MIPS_LOCSYM:        return "MIPS_LOCSYM";
1911     case SHT_MIPS_AUXSYM:        return "MIPS_AUXSYM";
1912     case SHT_MIPS_OPTSYM:        return "MIPS_OPTSYM";
1913     case SHT_MIPS_LOCSTR:        return "MIPS_LOCSTR";
1914     case SHT_MIPS_LINE:          return "MIPS_LINE";
1915     case SHT_MIPS_RFDESC:        return "MIPS_RFDESC";
1916     case SHT_MIPS_DELTASYM:      return "MIPS_DELTASYM";
1917     case SHT_MIPS_DELTAINST:     return "MIPS_DELTAINST";
1918     case SHT_MIPS_DELTACLASS:    return "MIPS_DELTACLASS";
1919     case SHT_MIPS_DWARF:         return "MIPS_DWARF";
1920     case SHT_MIPS_DELTADECL:     return "MIPS_DELTADECL";
1921     case SHT_MIPS_SYMBOL_LIB:    return "MIPS_SYMBOL_LIB";
1922     case SHT_MIPS_EVENTS:        return "MIPS_EVENTS";
1923     case SHT_MIPS_TRANSLATE:     return "MIPS_TRANSLATE";
1924     case SHT_MIPS_PIXIE:         return "MIPS_PIXIE";
1925     case SHT_MIPS_XLATE:         return "MIPS_XLATE";
1926     case SHT_MIPS_XLATE_DEBUG:   return "MIPS_XLATE_DEBUG";
1927     case SHT_MIPS_WHIRL:         return "MIPS_WHIRL";
1928     case SHT_MIPS_EH_REGION:     return "MIPS_EH_REGION";
1929     case SHT_MIPS_XLATE_OLD:     return "MIPS_XLATE_OLD";
1930     case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
1931     default:
1932       break;
1933     }
1934   return NULL;
1935 }
1936
1937 static const char *
1938 get_parisc_section_type_name (sh_type)
1939      unsigned int sh_type;
1940 {
1941   switch (sh_type)
1942     {
1943     case SHT_PARISC_EXT:        return "PARISC_EXT";
1944     case SHT_PARISC_UNWIND:     return "PARISC_UNWIND";
1945     case SHT_PARISC_DOC:        return "PARISC_DOC";
1946     default:
1947       break;
1948     }
1949   return NULL;
1950 }
1951
1952 static const char *
1953 get_ia64_section_type_name (sh_type)
1954      unsigned int sh_type;
1955 {
1956   switch (sh_type)
1957     {
1958     case SHT_IA_64_EXT:         return "IA_64_EXT";
1959     case SHT_IA_64_UNWIND:      return "IA_64_UNWIND";
1960     default:
1961       break;
1962     }
1963   return NULL;
1964 }
1965
1966 static const char *
1967 get_section_type_name (sh_type)
1968      unsigned int sh_type;
1969 {
1970   static char buff [32];
1971
1972   switch (sh_type)
1973     {
1974     case SHT_NULL:              return "NULL";
1975     case SHT_PROGBITS:          return "PROGBITS";
1976     case SHT_SYMTAB:            return "SYMTAB";
1977     case SHT_STRTAB:            return "STRTAB";
1978     case SHT_RELA:              return "RELA";
1979     case SHT_HASH:              return "HASH";
1980     case SHT_DYNAMIC:           return "DYNAMIC";
1981     case SHT_NOTE:              return "NOTE";
1982     case SHT_NOBITS:            return "NOBITS";
1983     case SHT_REL:               return "REL";
1984     case SHT_SHLIB:             return "SHLIB";
1985     case SHT_DYNSYM:            return "DYNSYM";
1986     case SHT_INIT_ARRAY:        return "INIT_ARRAY";
1987     case SHT_FINI_ARRAY:        return "FINI_ARRAY";
1988     case SHT_PREINIT_ARRAY:     return "PREINIT_ARRAY";
1989     case SHT_GROUP:             return "GROUP";
1990     case SHT_SYMTAB_SHNDX:      return "SYMTAB SECTION INDICIES";
1991     case SHT_GNU_verdef:        return "VERDEF";
1992     case SHT_GNU_verneed:       return "VERNEED";
1993     case SHT_GNU_versym:        return "VERSYM";
1994     case 0x6ffffff0:            return "VERSYM";
1995     case 0x6ffffffc:            return "VERDEF";
1996     case 0x7ffffffd:            return "AUXILIARY";
1997     case 0x7fffffff:            return "FILTER";
1998
1999     default:
2000       if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
2001         {
2002           const char * result;
2003
2004           switch (elf_header.e_machine)
2005             {
2006             case EM_MIPS:
2007             case EM_MIPS_RS3_LE:
2008               result = get_mips_section_type_name (sh_type);
2009               break;
2010             case EM_PARISC:
2011               result = get_parisc_section_type_name (sh_type);
2012               break;
2013             case EM_IA_64:
2014               result = get_ia64_section_type_name (sh_type);
2015               break;
2016             default:
2017               result = NULL;
2018               break;
2019             }
2020
2021           if (result != NULL)
2022             return result;
2023
2024           sprintf (buff, "LOPROC+%x", sh_type - SHT_LOPROC);
2025         }
2026       else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
2027         sprintf (buff, "LOOS+%x", sh_type - SHT_LOOS);
2028       else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
2029         sprintf (buff, "LOUSER+%x", sh_type - SHT_LOUSER);
2030       else
2031         sprintf (buff, _("<unknown>: %x"), sh_type);
2032
2033       return buff;
2034     }
2035 }
2036
2037 struct option options [] =
2038 {
2039   {"all",              no_argument, 0, 'a'},
2040   {"file-header",      no_argument, 0, 'h'},
2041   {"program-headers",  no_argument, 0, 'l'},
2042   {"headers",          no_argument, 0, 'e'},
2043   {"histogram",        no_argument, 0, 'I'},
2044   {"segments",         no_argument, 0, 'l'},
2045   {"sections",         no_argument, 0, 'S'},
2046   {"section-headers",  no_argument, 0, 'S'},
2047   {"symbols",          no_argument, 0, 's'},
2048   {"syms",             no_argument, 0, 's'},
2049   {"relocs",           no_argument, 0, 'r'},
2050   {"notes",            no_argument, 0, 'n'},
2051   {"dynamic",          no_argument, 0, 'd'},
2052   {"arch-specific",    no_argument, 0, 'A'},
2053   {"version-info",     no_argument, 0, 'V'},
2054   {"use-dynamic",      no_argument, 0, 'D'},
2055   {"hex-dump",         required_argument, 0, 'x'},
2056   {"debug-dump",       optional_argument, 0, 'w'},
2057   {"unwind",           no_argument, 0, 'u'},
2058 #ifdef SUPPORT_DISASSEMBLY
2059   {"instruction-dump", required_argument, 0, 'i'},
2060 #endif
2061
2062   {"version",          no_argument, 0, 'v'},
2063   {"wide",             no_argument, 0, 'W'},
2064   {"help",             no_argument, 0, 'H'},
2065   {0,                  no_argument, 0, 0}
2066 };
2067
2068 static void
2069 usage ()
2070 {
2071   fprintf (stdout, _("Usage: readelf {options} elf-file(s)\n"));
2072   fprintf (stdout, _("  Options are:\n"));
2073   fprintf (stdout, _("  -a or --all               Equivalent to: -h -l -S -s -r -d -V -A -I\n"));
2074   fprintf (stdout, _("  -h or --file-header       Display the ELF file header\n"));
2075   fprintf (stdout, _("  -l or --program-headers or --segments\n"));
2076   fprintf (stdout, _("                            Display the program headers\n"));
2077   fprintf (stdout, _("  -S or --section-headers or --sections\n"));
2078   fprintf (stdout, _("                            Display the sections' header\n"));
2079   fprintf (stdout, _("  -e or --headers           Equivalent to: -h -l -S\n"));
2080   fprintf (stdout, _("  -s or --syms or --symbols Display the symbol table\n"));
2081   fprintf (stdout, _("  -n or --notes             Display the core notes (if present)\n"));
2082   fprintf (stdout, _("  -r or --relocs            Display the relocations (if present)\n"));
2083   fprintf (stdout, _("  -u or --unwind            Display the unwind info (if present)\n"));
2084   fprintf (stdout, _("  -d or --dynamic           Display the dynamic segment (if present)\n"));
2085   fprintf (stdout, _("  -V or --version-info      Display the version sections (if present)\n"));
2086   fprintf (stdout, _("  -A or --arch-specific     Display architecture specific information (if any).\n"));
2087   fprintf (stdout, _("  -D or --use-dynamic       Use the dynamic section info when displaying symbols\n"));
2088   fprintf (stdout, _("  -x <number> or --hex-dump=<number>\n"));
2089   fprintf (stdout, _("                            Dump the contents of section <number>\n"));
2090   fprintf (stdout, _("  -w[liaprmfs] or --debug-dump[=line,=info,=abbrev,=pubnames,=ranges,=macro,=frames,=str]\n"));
2091   fprintf (stdout, _("                            Display the contents of DWARF2 debug sections\n"));
2092 #ifdef SUPPORT_DISASSEMBLY
2093   fprintf (stdout, _("  -i <number> or --instruction-dump=<number>\n"));
2094   fprintf (stdout, _("                            Disassemble the contents of section <number>\n"));
2095 #endif
2096   fprintf (stdout, _("  -I or --histogram         Display histogram of bucket list lengths\n"));
2097   fprintf (stdout, _("  -v or --version           Display the version number of readelf\n"));
2098   fprintf (stdout, _("  -W or --wide              Don't split lines to fit into 80 columns\n"));
2099   fprintf (stdout, _("  -H or --help              Display this information\n"));
2100   fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
2101
2102   exit (0);
2103 }
2104
2105 static void
2106 request_dump (section, type)
2107      unsigned int section;
2108      int         type;
2109 {
2110   if (section >= num_dump_sects)
2111     {
2112       char * new_dump_sects;
2113
2114       new_dump_sects = (char *) calloc (section + 1, 1);
2115
2116       if (new_dump_sects == NULL)
2117         error (_("Out of memory allocating dump request table."));
2118       else
2119         {
2120           /* Copy current flag settings.  */
2121           memcpy (new_dump_sects, dump_sects, num_dump_sects);
2122
2123           free (dump_sects);
2124
2125           dump_sects = new_dump_sects;
2126           num_dump_sects = section + 1;
2127         }
2128     }
2129
2130   if (dump_sects)
2131     dump_sects [section] |= type;
2132
2133   return;
2134 }
2135
2136 static void
2137 parse_args (argc, argv)
2138      int argc;
2139      char ** argv;
2140 {
2141   int c;
2142
2143   if (argc < 2)
2144     usage ();
2145
2146   while ((c = getopt_long
2147           (argc, argv, "ersuahnldSDAIw::x:i:vVW", options, NULL)) != EOF)
2148     {
2149       char *    cp;
2150       int       section;
2151
2152       switch (c)
2153         {
2154         case 0:
2155           /* Long options.  */
2156           break;
2157         case 'H':
2158           usage ();
2159           break;
2160
2161         case 'a':
2162           do_syms ++;
2163           do_reloc ++;
2164           do_unwind ++;
2165           do_dynamic ++;
2166           do_header ++;
2167           do_sections ++;
2168           do_segments ++;
2169           do_version ++;
2170           do_histogram ++;
2171           do_arch ++;
2172           do_notes ++;
2173           break;
2174         case 'e':
2175           do_header ++;
2176           do_sections ++;
2177           do_segments ++;
2178           break;
2179         case 'A':
2180           do_arch ++;
2181           break;
2182         case 'D':
2183           do_using_dynamic ++;
2184           break;
2185         case 'r':
2186           do_reloc ++;
2187           break;
2188         case 'u':
2189           do_unwind ++;
2190           break;
2191         case 'h':
2192           do_header ++;
2193           break;
2194         case 'l':
2195           do_segments ++;
2196           break;
2197         case 's':
2198           do_syms ++;
2199           break;
2200         case 'S':
2201           do_sections ++;
2202           break;
2203         case 'd':
2204           do_dynamic ++;
2205           break;
2206         case 'I':
2207           do_histogram ++;
2208           break;
2209         case 'n':
2210           do_notes ++;
2211           break;
2212         case 'x':
2213           do_dump ++;
2214           section = strtoul (optarg, & cp, 0);
2215           if (! * cp && section >= 0)
2216             {
2217               request_dump (section, HEX_DUMP);
2218               break;
2219             }
2220           goto oops;
2221         case 'w':
2222           do_dump ++;
2223           if (optarg == 0)
2224             do_debugging = 1;
2225           else
2226             {
2227               unsigned int index = 0;
2228               
2229               do_debugging = 0;
2230
2231               while (optarg[index])
2232                 switch (optarg[index++])
2233                   {
2234                   case 'i':
2235                   case 'I':
2236                     do_debug_info = 1;
2237                     break;
2238
2239                   case 'a':
2240                   case 'A':
2241                     do_debug_abbrevs = 1;
2242                     break;
2243
2244                   case 'l':
2245                   case 'L':
2246                     do_debug_lines = 1;
2247                     break;
2248
2249                   case 'p':
2250                   case 'P':
2251                     do_debug_pubnames = 1;
2252                     break;
2253
2254                   case 'r':
2255                   case 'R':
2256                     do_debug_aranges = 1;
2257                     break;
2258
2259                   case 'F':
2260                     do_debug_frames_interp = 1;
2261                   case 'f':
2262                     do_debug_frames = 1;
2263                     break;
2264
2265                   case 'm':
2266                   case 'M':
2267                     do_debug_macinfo = 1;
2268                     break;
2269
2270                   case 's':
2271                   case 'S':
2272                     do_debug_str = 1;
2273                     break;
2274
2275                   default:
2276                     warn (_("Unrecognised debug option '%s'\n"), optarg);
2277                     break;
2278                   }
2279             }
2280           break;
2281 #ifdef SUPPORT_DISASSEMBLY
2282         case 'i':
2283           do_dump ++;
2284           section = strtoul (optarg, & cp, 0);
2285           if (! * cp && section >= 0)
2286             {
2287               request_dump (section, DISASS_DUMP);
2288               break;
2289             }
2290           goto oops;
2291 #endif
2292         case 'v':
2293           print_version (program_name);
2294           break;
2295         case 'V':
2296           do_version ++;
2297           break;
2298         case 'W':
2299           do_wide ++;
2300           break;
2301         default:
2302         oops:
2303           /* xgettext:c-format */
2304           error (_("Invalid option '-%c'\n"), c);
2305           /* Drop through.  */
2306         case '?':
2307           usage ();
2308         }
2309     }
2310
2311   if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
2312       && !do_segments && !do_header && !do_dump && !do_version
2313       && !do_histogram && !do_debugging && !do_arch && !do_notes)
2314     usage ();
2315   else if (argc < 3)
2316     {
2317       warn (_("Nothing to do.\n"));
2318       usage();
2319     }
2320 }
2321
2322 static const char *
2323 get_elf_class (elf_class)
2324      unsigned int elf_class;
2325 {
2326   static char buff [32];
2327
2328   switch (elf_class)
2329     {
2330     case ELFCLASSNONE: return _("none");
2331     case ELFCLASS32:   return "ELF32";
2332     case ELFCLASS64:   return "ELF64";
2333     default:
2334       sprintf (buff, _("<unknown: %x>"), elf_class);
2335       return buff;
2336     }
2337 }
2338
2339 static const char *
2340 get_data_encoding (encoding)
2341      unsigned int encoding;
2342 {
2343   static char buff [32];
2344
2345   switch (encoding)
2346     {
2347     case ELFDATANONE: return _("none");
2348     case ELFDATA2LSB: return _("2's complement, little endian");
2349     case ELFDATA2MSB: return _("2's complement, big endian");
2350     default:
2351       sprintf (buff, _("<unknown: %x>"), encoding);
2352       return buff;
2353     }
2354 }
2355
2356 static const char *
2357 get_osabi_name (osabi)
2358      unsigned int osabi;
2359 {
2360   static char buff [32];
2361
2362   switch (osabi)
2363     {
2364     case ELFOSABI_NONE:       return "UNIX - System V";
2365     case ELFOSABI_HPUX:       return "UNIX - HP-UX";
2366     case ELFOSABI_NETBSD:     return "UNIX - NetBSD";
2367     case ELFOSABI_LINUX:      return "UNIX - Linux";
2368     case ELFOSABI_HURD:       return "GNU/Hurd";
2369     case ELFOSABI_SOLARIS:    return "UNIX - Solaris";
2370     case ELFOSABI_AIX:        return "UNIX - AIX";
2371     case ELFOSABI_IRIX:       return "UNIX - IRIX";
2372     case ELFOSABI_FREEBSD:    return "UNIX - FreeBSD";
2373     case ELFOSABI_TRU64:      return "UNIX - TRU64";
2374     case ELFOSABI_MODESTO:    return "Novell - Modesto";
2375     case ELFOSABI_OPENBSD:    return "UNIX - OpenBSD";
2376     case ELFOSABI_STANDALONE: return _("Standalone App");
2377     case ELFOSABI_ARM:        return "ARM";
2378     default:
2379       sprintf (buff, _("<unknown: %x>"), osabi);
2380       return buff;
2381     }
2382 }
2383
2384 /* Decode the data held in 'elf_header'.  */
2385 static int
2386 process_file_header ()
2387 {
2388   if (   elf_header.e_ident [EI_MAG0] != ELFMAG0
2389       || elf_header.e_ident [EI_MAG1] != ELFMAG1
2390       || elf_header.e_ident [EI_MAG2] != ELFMAG2
2391       || elf_header.e_ident [EI_MAG3] != ELFMAG3)
2392     {
2393       error
2394         (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
2395       return 0;
2396     }
2397
2398   if (do_header)
2399     {
2400       int i;
2401
2402       printf (_("ELF Header:\n"));
2403       printf (_("  Magic:   "));
2404       for (i = 0; i < EI_NIDENT; i ++)
2405         printf ("%2.2x ", elf_header.e_ident [i]);
2406       printf ("\n");
2407       printf (_("  Class:                             %s\n"),
2408               get_elf_class (elf_header.e_ident [EI_CLASS]));
2409       printf (_("  Data:                              %s\n"),
2410               get_data_encoding (elf_header.e_ident [EI_DATA]));
2411       printf (_("  Version:                           %d %s\n"),
2412               elf_header.e_ident [EI_VERSION],
2413               (elf_header.e_ident [EI_VERSION] == EV_CURRENT
2414                ? "(current)"
2415                : (elf_header.e_ident [EI_VERSION] != EV_NONE
2416                   ? "<unknown: %lx>"
2417                   : "")));
2418       printf (_("  OS/ABI:                            %s\n"),
2419               get_osabi_name (elf_header.e_ident [EI_OSABI]));
2420       printf (_("  ABI Version:                       %d\n"),
2421               elf_header.e_ident [EI_ABIVERSION]);
2422       printf (_("  Type:                              %s\n"),
2423               get_file_type (elf_header.e_type));
2424       printf (_("  Machine:                           %s\n"),
2425               get_machine_name (elf_header.e_machine));
2426       printf (_("  Version:                           0x%lx\n"),
2427               (unsigned long) elf_header.e_version);
2428
2429       printf (_("  Entry point address:               "));
2430       print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
2431       printf (_("\n  Start of program headers:          "));
2432       print_vma ((bfd_vma) elf_header.e_phoff, DEC);
2433       printf (_(" (bytes into file)\n  Start of section headers:          "));
2434       print_vma ((bfd_vma) elf_header.e_shoff, DEC);
2435       printf (_(" (bytes into file)\n"));
2436
2437       printf (_("  Flags:                             0x%lx%s\n"),
2438               (unsigned long) elf_header.e_flags,
2439               get_machine_flags (elf_header.e_flags, elf_header.e_machine));
2440       printf (_("  Size of this header:               %ld (bytes)\n"),
2441               (long) elf_header.e_ehsize);
2442       printf (_("  Size of program headers:           %ld (bytes)\n"),
2443               (long) elf_header.e_phentsize);
2444       printf (_("  Number of program headers:         %ld\n"),
2445               (long) elf_header.e_phnum);
2446       printf (_("  Size of section headers:           %ld (bytes)\n"),
2447               (long) elf_header.e_shentsize);
2448       printf (_("  Number of section headers:         %ld"),
2449               (long) elf_header.e_shnum);
2450       if (section_headers != NULL && elf_header.e_shnum == 0)
2451         printf (" (%ld)", (long) section_headers[0].sh_size);
2452       putc ('\n', stdout);
2453       printf (_("  Section header string table index: %ld"),
2454               (long) elf_header.e_shstrndx);
2455       if (section_headers != NULL && elf_header.e_shstrndx == SHN_XINDEX)
2456         printf (" (%ld)", (long) section_headers[0].sh_link);
2457       putc ('\n', stdout);
2458     }
2459
2460   if (section_headers != NULL)
2461     {
2462       if (elf_header.e_shnum == 0)
2463         elf_header.e_shnum = section_headers[0].sh_size;
2464       if (elf_header.e_shstrndx == SHN_XINDEX)
2465         elf_header.e_shstrndx = section_headers[0].sh_link;
2466       free (section_headers);
2467       section_headers = NULL;
2468     }
2469
2470   return 1;
2471 }
2472
2473
2474 static int
2475 get_32bit_program_headers (file, program_headers)
2476      FILE * file;
2477      Elf_Internal_Phdr * program_headers;
2478 {
2479   Elf32_External_Phdr * phdrs;
2480   Elf32_External_Phdr * external;
2481   Elf32_Internal_Phdr * internal;
2482   unsigned int          i;
2483
2484   phdrs = ((Elf32_External_Phdr *)
2485            get_data (NULL, file, elf_header.e_phoff,
2486                      elf_header.e_phentsize * elf_header.e_phnum,
2487                      _("program headers")));
2488   if (!phdrs)
2489     return 0;
2490
2491   for (i = 0, internal = program_headers, external = phdrs;
2492        i < elf_header.e_phnum;
2493        i ++, internal ++, external ++)
2494     {
2495       internal->p_type   = BYTE_GET (external->p_type);
2496       internal->p_offset = BYTE_GET (external->p_offset);
2497       internal->p_vaddr  = BYTE_GET (external->p_vaddr);
2498       internal->p_paddr  = BYTE_GET (external->p_paddr);
2499       internal->p_filesz = BYTE_GET (external->p_filesz);
2500       internal->p_memsz  = BYTE_GET (external->p_memsz);
2501       internal->p_flags  = BYTE_GET (external->p_flags);
2502       internal->p_align  = BYTE_GET (external->p_align);
2503     }
2504
2505   free (phdrs);
2506
2507   return 1;
2508 }
2509
2510 static int
2511 get_64bit_program_headers (file, program_headers)
2512      FILE * file;
2513      Elf_Internal_Phdr * program_headers;
2514 {
2515   Elf64_External_Phdr * phdrs;
2516   Elf64_External_Phdr * external;
2517   Elf64_Internal_Phdr * internal;
2518   unsigned int          i;
2519
2520   phdrs = ((Elf64_External_Phdr *)
2521            get_data (NULL, file, elf_header.e_phoff,
2522                      elf_header.e_phentsize * elf_header.e_phnum,
2523                      _("program headers")));
2524   if (!phdrs)
2525     return 0;
2526
2527   for (i = 0, internal = program_headers, external = phdrs;
2528        i < elf_header.e_phnum;
2529        i ++, internal ++, external ++)
2530     {
2531       internal->p_type   = BYTE_GET (external->p_type);
2532       internal->p_flags  = BYTE_GET (external->p_flags);
2533       internal->p_offset = BYTE_GET8 (external->p_offset);
2534       internal->p_vaddr  = BYTE_GET8 (external->p_vaddr);
2535       internal->p_paddr  = BYTE_GET8 (external->p_paddr);
2536       internal->p_filesz = BYTE_GET8 (external->p_filesz);
2537       internal->p_memsz  = BYTE_GET8 (external->p_memsz);
2538       internal->p_align  = BYTE_GET8 (external->p_align);
2539     }
2540
2541   free (phdrs);
2542
2543   return 1;
2544 }
2545
2546 static int
2547 process_program_headers (file)
2548      FILE * file;
2549 {
2550   Elf_Internal_Phdr * program_headers;
2551   Elf_Internal_Phdr * segment;
2552   unsigned int        i;
2553
2554   if (elf_header.e_phnum == 0)
2555     {
2556       if (do_segments)
2557         printf (_("\nThere are no program headers in this file.\n"));
2558       return 1;
2559     }
2560
2561   if (do_segments && !do_header)
2562     {
2563       printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
2564       printf (_("Entry point "));
2565       print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
2566       printf (_("\nThere are %d program headers, starting at offset "),
2567               elf_header.e_phnum);
2568       print_vma ((bfd_vma) elf_header.e_phoff, DEC);
2569       printf ("\n");
2570     }
2571
2572   program_headers = (Elf_Internal_Phdr *) malloc
2573     (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
2574
2575   if (program_headers == NULL)
2576     {
2577       error (_("Out of memory\n"));
2578       return 0;
2579     }
2580
2581   if (is_32bit_elf)
2582     i = get_32bit_program_headers (file, program_headers);
2583   else
2584     i = get_64bit_program_headers (file, program_headers);
2585
2586   if (i == 0)
2587     {
2588       free (program_headers);
2589       return 0;
2590     }
2591
2592   if (do_segments)
2593     {
2594       printf
2595         (_("\nProgram Header%s:\n"), elf_header.e_phnum > 1 ? "s" : "");
2596
2597       if (is_32bit_elf)
2598         printf
2599           (_("  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align\n"));
2600       else if (do_wide)
2601         printf
2602           (_("  Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align\n"));
2603       else
2604         {
2605           printf
2606             (_("  Type           Offset             VirtAddr           PhysAddr\n"));
2607           printf
2608             (_("                 FileSiz            MemSiz              Flags  Align\n"));
2609         }
2610     }
2611
2612   loadaddr = -1;
2613   dynamic_addr = 0;
2614   dynamic_size = 0;
2615
2616   for (i = 0, segment = program_headers;
2617        i < elf_header.e_phnum;
2618        i ++, segment ++)
2619     {
2620       if (do_segments)
2621         {
2622           printf ("  %-14.14s ", get_segment_type (segment->p_type));
2623
2624           if (is_32bit_elf)
2625             {
2626               printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
2627               printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
2628               printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
2629               printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
2630               printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
2631               printf ("%c%c%c ",
2632                       (segment->p_flags & PF_R ? 'R' : ' '),
2633                       (segment->p_flags & PF_W ? 'W' : ' '),
2634                       (segment->p_flags & PF_X ? 'E' : ' '));
2635               printf ("%#lx", (unsigned long) segment->p_align);
2636             }
2637           else if (do_wide)
2638             {
2639               if ((unsigned long) segment->p_offset == segment->p_offset)
2640                 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
2641               else
2642                 {
2643                   print_vma (segment->p_offset, FULL_HEX);
2644                   putchar (' ');
2645                 }
2646
2647               print_vma (segment->p_vaddr, FULL_HEX);
2648               putchar (' ');
2649               print_vma (segment->p_paddr, FULL_HEX);
2650               putchar (' ');
2651
2652               if ((unsigned long) segment->p_filesz == segment->p_filesz)
2653                 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
2654               else
2655                 {
2656                   print_vma (segment->p_filesz, FULL_HEX);
2657                   putchar (' ');
2658                 }
2659
2660               if ((unsigned long) segment->p_memsz == segment->p_memsz)
2661                 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
2662               else
2663                 {
2664                   print_vma (segment->p_offset, FULL_HEX);
2665                 }
2666
2667               printf (" %c%c%c ",
2668                       (segment->p_flags & PF_R ? 'R' : ' '),
2669                       (segment->p_flags & PF_W ? 'W' : ' '),
2670                       (segment->p_flags & PF_X ? 'E' : ' '));
2671
2672               if ((unsigned long) segment->p_align == segment->p_align)
2673                 printf ("%#lx", (unsigned long) segment->p_align);
2674               else
2675                 {
2676                   print_vma (segment->p_align, PREFIX_HEX);
2677                 }
2678             }
2679           else
2680             {
2681               print_vma (segment->p_offset, FULL_HEX);
2682               putchar (' ');
2683               print_vma (segment->p_vaddr, FULL_HEX);
2684               putchar (' ');
2685               print_vma (segment->p_paddr, FULL_HEX);
2686               printf ("\n                 ");
2687               print_vma (segment->p_filesz, FULL_HEX);
2688               putchar (' ');
2689               print_vma (segment->p_memsz, FULL_HEX);
2690               printf ("  %c%c%c    ",
2691                       (segment->p_flags & PF_R ? 'R' : ' '),
2692                       (segment->p_flags & PF_W ? 'W' : ' '),
2693                       (segment->p_flags & PF_X ? 'E' : ' '));
2694               print_vma (segment->p_align, HEX);
2695             }
2696         }
2697
2698       switch (segment->p_type)
2699         {
2700         case PT_LOAD:
2701           if (loadaddr == -1)
2702             loadaddr = (segment->p_vaddr & 0xfffff000)
2703               - (segment->p_offset & 0xfffff000);
2704           break;
2705
2706         case PT_DYNAMIC:
2707           if (dynamic_addr)
2708             error (_("more than one dynamic segment\n"));
2709
2710           dynamic_addr = segment->p_offset;
2711           dynamic_size = segment->p_filesz;
2712           break;
2713
2714         case PT_INTERP:
2715           if (fseek (file, (long) segment->p_offset, SEEK_SET))
2716             error (_("Unable to find program interpreter name\n"));
2717           else
2718             {
2719               program_interpreter[0] = 0;
2720               fscanf (file, "%63s", program_interpreter);
2721
2722               if (do_segments)
2723                 printf (_("\n      [Requesting program interpreter: %s]"),
2724                     program_interpreter);
2725             }
2726           break;
2727         }
2728
2729       if (do_segments)
2730         putc ('\n', stdout);
2731     }
2732
2733   if (loadaddr == -1)
2734     {
2735       /* Very strange.  */
2736       loadaddr = 0;
2737     }
2738
2739   if (do_segments && section_headers != NULL)
2740     {
2741       printf (_("\n Section to Segment mapping:\n"));
2742       printf (_("  Segment Sections...\n"));
2743
2744       assert (string_table != NULL);
2745
2746       for (i = 0; i < elf_header.e_phnum; i++)
2747         {
2748           int                 j;
2749           Elf_Internal_Shdr * section;
2750
2751           segment = program_headers + i;
2752           section = section_headers;
2753
2754           printf ("   %2.2d     ", i);
2755
2756           for (j = 0; j < elf_header.e_shnum; j++, section ++)
2757             {
2758               if (section->sh_size > 0
2759                   /* Compare allocated sections by VMA, unallocated
2760                      sections by file offset.  */
2761                   && (section->sh_flags & SHF_ALLOC
2762                       ? (section->sh_addr >= segment->p_vaddr
2763                          && section->sh_addr + section->sh_size
2764                          <= segment->p_vaddr + segment->p_memsz)
2765                       : ((bfd_vma) section->sh_offset >= segment->p_offset
2766                          && (section->sh_offset + section->sh_size
2767                              <= segment->p_offset + segment->p_filesz))))
2768                 printf ("%s ", SECTION_NAME (section));
2769             }
2770
2771           putc ('\n',stdout);
2772         }
2773     }
2774
2775   free (program_headers);
2776
2777   return 1;
2778 }
2779
2780
2781 static int
2782 get_32bit_section_headers (file, num)
2783      FILE * file;
2784      unsigned int num;
2785 {
2786   Elf32_External_Shdr * shdrs;
2787   Elf32_Internal_Shdr * internal;
2788   unsigned int          i;
2789
2790   shdrs = ((Elf32_External_Shdr *)
2791            get_data (NULL, file, elf_header.e_shoff,
2792                      elf_header.e_shentsize * num,
2793                      _("section headers")));
2794   if (!shdrs)
2795     return 0;
2796
2797   section_headers = ((Elf_Internal_Shdr *)
2798                      malloc (num * sizeof (Elf_Internal_Shdr)));
2799
2800   if (section_headers == NULL)
2801     {
2802       error (_("Out of memory\n"));
2803       return 0;
2804     }
2805
2806   for (i = 0, internal = section_headers;
2807        i < num;
2808        i ++, internal ++)
2809     {
2810       internal->sh_name      = BYTE_GET (shdrs[i].sh_name);
2811       internal->sh_type      = BYTE_GET (shdrs[i].sh_type);
2812       internal->sh_flags     = BYTE_GET (shdrs[i].sh_flags);
2813       internal->sh_addr      = BYTE_GET (shdrs[i].sh_addr);
2814       internal->sh_offset    = BYTE_GET (shdrs[i].sh_offset);
2815       internal->sh_size      = BYTE_GET (shdrs[i].sh_size);
2816       internal->sh_link      = BYTE_GET (shdrs[i].sh_link);
2817       internal->sh_info      = BYTE_GET (shdrs[i].sh_info);
2818       internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
2819       internal->sh_entsize   = BYTE_GET (shdrs[i].sh_entsize);
2820     }
2821
2822   free (shdrs);
2823
2824   return 1;
2825 }
2826
2827 static int
2828 get_64bit_section_headers (file, num)
2829      FILE * file;
2830      unsigned int num;
2831 {
2832   Elf64_External_Shdr * shdrs;
2833   Elf64_Internal_Shdr * internal;
2834   unsigned int          i;
2835
2836   shdrs = ((Elf64_External_Shdr *)
2837            get_data (NULL, file, elf_header.e_shoff,
2838                      elf_header.e_shentsize * num,
2839                      _("section headers")));
2840   if (!shdrs)
2841     return 0;
2842
2843   section_headers = ((Elf_Internal_Shdr *)
2844                      malloc (num * sizeof (Elf_Internal_Shdr)));
2845
2846   if (section_headers == NULL)
2847     {
2848       error (_("Out of memory\n"));
2849       return 0;
2850     }
2851
2852   for (i = 0, internal = section_headers;
2853        i < num;
2854        i ++, internal ++)
2855     {
2856       internal->sh_name      = BYTE_GET (shdrs[i].sh_name);
2857       internal->sh_type      = BYTE_GET (shdrs[i].sh_type);
2858       internal->sh_flags     = BYTE_GET8 (shdrs[i].sh_flags);
2859       internal->sh_addr      = BYTE_GET8 (shdrs[i].sh_addr);
2860       internal->sh_size      = BYTE_GET8 (shdrs[i].sh_size);
2861       internal->sh_entsize   = BYTE_GET8 (shdrs[i].sh_entsize);
2862       internal->sh_link      = BYTE_GET (shdrs[i].sh_link);
2863       internal->sh_info      = BYTE_GET (shdrs[i].sh_info);
2864       internal->sh_offset    = BYTE_GET (shdrs[i].sh_offset);
2865       internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
2866     }
2867
2868   free (shdrs);
2869
2870   return 1;
2871 }
2872
2873 static Elf_Internal_Sym *
2874 get_32bit_elf_symbols (file, offset, number)
2875      FILE * file;
2876      unsigned long offset;
2877      unsigned long number;
2878 {
2879   Elf32_External_Sym * esyms;
2880   Elf_Internal_Sym *   isyms;
2881   Elf_Internal_Sym *   psym;
2882   unsigned int         j;
2883
2884   esyms = ((Elf32_External_Sym *)
2885            get_data (NULL, file, offset,
2886                      number * sizeof (Elf32_External_Sym), _("symbols")));
2887   if (!esyms)
2888     return NULL;
2889
2890   isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym));
2891
2892   if (isyms == NULL)
2893     {
2894       error (_("Out of memory\n"));
2895       free (esyms);
2896
2897       return NULL;
2898     }
2899
2900   for (j = 0, psym = isyms;
2901        j < number;
2902        j ++, psym ++)
2903     {
2904       psym->st_name  = BYTE_GET (esyms[j].st_name);
2905       psym->st_value = BYTE_GET (esyms[j].st_value);
2906       psym->st_size  = BYTE_GET (esyms[j].st_size);
2907       psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
2908       psym->st_info  = BYTE_GET (esyms[j].st_info);
2909       psym->st_other = BYTE_GET (esyms[j].st_other);
2910     }
2911
2912   free (esyms);
2913
2914   return isyms;
2915 }
2916
2917 static Elf_Internal_Sym *
2918 get_64bit_elf_symbols (file, offset, number)
2919      FILE * file;
2920      unsigned long offset;
2921      unsigned long number;
2922 {
2923   Elf64_External_Sym * esyms;
2924   Elf_Internal_Sym *   isyms;
2925   Elf_Internal_Sym *   psym;
2926   unsigned int         j;
2927
2928   esyms = ((Elf64_External_Sym *)
2929            get_data (NULL, file, offset,
2930                      number * sizeof (Elf64_External_Sym), _("symbols")));
2931   if (!esyms)
2932     return NULL;
2933
2934   isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym));
2935
2936   if (isyms == NULL)
2937     {
2938       error (_("Out of memory\n"));
2939       free (esyms);
2940
2941       return NULL;
2942     }
2943
2944   for (j = 0, psym = isyms;
2945        j < number;
2946        j ++, psym ++)
2947     {
2948       psym->st_name  = BYTE_GET (esyms[j].st_name);
2949       psym->st_info  = BYTE_GET (esyms[j].st_info);
2950       psym->st_other = BYTE_GET (esyms[j].st_other);
2951       psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
2952       psym->st_value = BYTE_GET8 (esyms[j].st_value);
2953       psym->st_size  = BYTE_GET8 (esyms[j].st_size);
2954     }
2955
2956   free (esyms);
2957
2958   return isyms;
2959 }
2960
2961 static const char *
2962 get_elf_section_flags (sh_flags)
2963      bfd_vma sh_flags;
2964 {
2965   static char buff [32];
2966
2967   * buff = 0;
2968
2969   while (sh_flags)
2970     {
2971       bfd_vma flag;
2972
2973       flag = sh_flags & - sh_flags;
2974       sh_flags &= ~ flag;
2975
2976       switch (flag)
2977         {
2978         case SHF_WRITE:            strcat (buff, "W"); break;
2979         case SHF_ALLOC:            strcat (buff, "A"); break;
2980         case SHF_EXECINSTR:        strcat (buff, "X"); break;
2981         case SHF_MERGE:            strcat (buff, "M"); break;
2982         case SHF_STRINGS:          strcat (buff, "S"); break;
2983         case SHF_INFO_LINK:        strcat (buff, "I"); break;
2984         case SHF_LINK_ORDER:       strcat (buff, "L"); break;
2985         case SHF_OS_NONCONFORMING: strcat (buff, "O"); break;
2986         case SHF_GROUP:            strcat (buff, "G"); break;
2987
2988         default:
2989           if (flag & SHF_MASKOS)
2990             {
2991               strcat (buff, "o");
2992               sh_flags &= ~ SHF_MASKOS;
2993             }
2994           else if (flag & SHF_MASKPROC)
2995             {
2996               strcat (buff, "p");
2997               sh_flags &= ~ SHF_MASKPROC;
2998             }
2999           else
3000             strcat (buff, "x");
3001           break;
3002         }
3003     }
3004
3005   return buff;
3006 }
3007
3008 static int
3009 process_section_headers (file)
3010      FILE * file;
3011 {
3012   Elf_Internal_Shdr * section;
3013   int                 i;
3014
3015   section_headers = NULL;
3016
3017   if (elf_header.e_shnum == 0)
3018     {
3019       if (do_sections)
3020         printf (_("\nThere are no sections in this file.\n"));
3021
3022       return 1;
3023     }
3024
3025   if (do_sections && !do_header)
3026     printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
3027             elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
3028
3029   if (is_32bit_elf)
3030     {
3031       if (! get_32bit_section_headers (file, elf_header.e_shnum))
3032         return 0;
3033     }
3034   else if (! get_64bit_section_headers (file, elf_header.e_shnum))
3035     return 0;
3036
3037   /* Read in the string table, so that we have names to display.  */
3038   section = section_headers + elf_header.e_shstrndx;
3039
3040   if (section->sh_size != 0)
3041     {
3042       string_table = (char *) get_data (NULL, file, section->sh_offset,
3043                                         section->sh_size, _("string table"));
3044
3045       string_table_length = section->sh_size;
3046     }
3047
3048   /* Scan the sections for the dynamic symbol table
3049      and dynamic string table and debug sections.  */
3050   dynamic_symbols = NULL;
3051   dynamic_strings = NULL;
3052   dynamic_syminfo = NULL;
3053
3054   for (i = 0, section = section_headers;
3055        i < elf_header.e_shnum;
3056        i ++, section ++)
3057     {
3058       char * name = SECTION_NAME (section);
3059
3060       if (section->sh_type == SHT_DYNSYM)
3061         {
3062           if (dynamic_symbols != NULL)
3063             {
3064               error (_("File contains multiple dynamic symbol tables\n"));
3065               continue;
3066             }
3067
3068           num_dynamic_syms = section->sh_size / section->sh_entsize;
3069           dynamic_symbols =
3070             GET_ELF_SYMBOLS (file, section->sh_offset, num_dynamic_syms);
3071         }
3072       else if (section->sh_type == SHT_STRTAB
3073                && strcmp (name, ".dynstr") == 0)
3074         {
3075           if (dynamic_strings != NULL)
3076             {
3077               error (_("File contains multiple dynamic string tables\n"));
3078               continue;
3079             }
3080
3081           dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
3082                                                section->sh_size,
3083                                                _("dynamic strings"));
3084         }
3085       else if ((do_debugging || do_debug_info || do_debug_abbrevs
3086                 || do_debug_lines || do_debug_pubnames || do_debug_aranges
3087                 || do_debug_frames || do_debug_macinfo || do_debug_str)
3088                && strncmp (name, ".debug_", 7) == 0)
3089         {
3090           name += 7;
3091
3092           if (do_debugging
3093               || (do_debug_info     && (strcmp (name, "info") == 0))
3094               || (do_debug_abbrevs  && (strcmp (name, "abbrev") == 0))
3095               || (do_debug_lines    && (strcmp (name, "line") == 0))
3096               || (do_debug_pubnames && (strcmp (name, "pubnames") == 0))
3097               || (do_debug_aranges  && (strcmp (name, "aranges") == 0))
3098               || (do_debug_frames   && (strcmp (name, "frame") == 0))
3099               || (do_debug_macinfo  && (strcmp (name, "macinfo") == 0))
3100               || (do_debug_str      && (strcmp (name, "str") == 0))
3101               )
3102             request_dump (i, DEBUG_DUMP);
3103         }
3104       /* linkonce section to be combined with .debug_info at link time.  */
3105       else if ((do_debugging || do_debug_info)
3106                && strncmp (name, ".gnu.linkonce.wi.", 17) == 0)
3107         request_dump (i, DEBUG_DUMP);
3108       else if (do_debug_frames && strcmp (name, ".eh_frame") == 0)
3109         request_dump (i, DEBUG_DUMP);
3110     }
3111
3112   if (! do_sections)
3113     return 1;
3114
3115   printf (_("\nSection Header%s:\n"), elf_header.e_shnum > 1 ? "s" : "");
3116
3117   if (is_32bit_elf)
3118     printf
3119       (_("  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al\n"));
3120   else if (do_wide)
3121     printf
3122       (_("  [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al\n"));
3123   else
3124     {
3125       printf (_("  [Nr] Name              Type             Address           Offset\n"));
3126       printf (_("       Size              EntSize          Flags  Link  Info  Align\n"));
3127     }
3128
3129   for (i = 0, section = section_headers;
3130        i < elf_header.e_shnum;
3131        i ++, section ++)
3132     {
3133       printf ("  [%2d] %-17.17s %-15.15s ",
3134               i,
3135               SECTION_NAME (section),
3136               get_section_type_name (section->sh_type));
3137
3138       if (is_32bit_elf)
3139         {
3140           print_vma (section->sh_addr, LONG_HEX);
3141
3142           printf ( " %6.6lx %6.6lx %2.2lx",
3143                    (unsigned long) section->sh_offset,
3144                    (unsigned long) section->sh_size,
3145                    (unsigned long) section->sh_entsize);
3146
3147           printf (" %3s ", get_elf_section_flags (section->sh_flags));
3148
3149           printf ("%2ld %3lx %2ld\n",
3150                   (unsigned long) section->sh_link,
3151                   (unsigned long) section->sh_info,
3152                   (unsigned long) section->sh_addralign);
3153         }
3154       else if (do_wide)
3155         {
3156           print_vma (section->sh_addr, LONG_HEX);
3157
3158           if ((long) section->sh_offset == section->sh_offset)
3159             printf (" %6.6lx", (unsigned long) section->sh_offset);
3160           else
3161             {
3162               putchar (' ');
3163               print_vma (section->sh_offset, LONG_HEX);
3164             }
3165
3166           if ((unsigned long) section->sh_size == section->sh_size)
3167             printf (" %6.6lx", (unsigned long) section->sh_size);
3168           else
3169             {
3170               putchar (' ');
3171               print_vma (section->sh_size, LONG_HEX);
3172             }
3173
3174           if ((unsigned long) section->sh_entsize == section->sh_entsize)
3175             printf (" %2.2lx", (unsigned long) section->sh_entsize);
3176           else
3177             {
3178               putchar (' ');
3179               print_vma (section->sh_entsize, LONG_HEX);
3180             }
3181
3182           printf (" %3s ", get_elf_section_flags (section->sh_flags));
3183
3184           printf ("%2ld %3lx ",
3185                   (unsigned long) section->sh_link,
3186                   (unsigned long) section->sh_info);
3187
3188           if ((unsigned long) section->sh_addralign == section->sh_addralign)
3189             printf ("%2ld\n", (unsigned long) section->sh_addralign);
3190           else
3191             {
3192               print_vma (section->sh_addralign, DEC);
3193               putchar ('\n');
3194             }
3195         }
3196       else
3197         {
3198           putchar (' ');
3199           print_vma (section->sh_addr, LONG_HEX);
3200           if ((long) section->sh_offset == section->sh_offset)
3201             printf ("  %8.8lx", (unsigned long) section->sh_offset);
3202           else
3203             {
3204               printf ("  ");
3205               print_vma (section->sh_offset, LONG_HEX);
3206             }
3207           printf ("\n       ");
3208           print_vma (section->sh_size, LONG_HEX);
3209           printf ("  ");
3210           print_vma (section->sh_entsize, LONG_HEX);
3211
3212           printf (" %3s ", get_elf_section_flags (section->sh_flags));
3213
3214           printf ("     %2ld   %3lx     %ld\n",
3215                   (unsigned long) section->sh_link,
3216                   (unsigned long) section->sh_info,
3217                   (unsigned long) section->sh_addralign);
3218         }
3219     }
3220
3221   printf (_("Key to Flags:\n\
3222   W (write), A (alloc), X (execute), M (merge), S (strings)\n\
3223   I (info), L (link order), G (group), x (unknown)\n\
3224   O (extra OS processing required) o (OS specific), p (processor specific)\n"));
3225
3226   return 1;
3227 }
3228
3229 /* Process the reloc section.  */
3230 static int
3231 process_relocs (file)
3232      FILE * file;
3233 {
3234   unsigned long    rel_size;
3235   unsigned long    rel_offset;
3236
3237
3238   if (!do_reloc)
3239     return 1;
3240
3241   if (do_using_dynamic)
3242     {
3243       int is_rela = FALSE;
3244
3245       rel_size   = 0;
3246       rel_offset = 0;
3247
3248       if (dynamic_info[DT_REL])
3249         {
3250           rel_offset = dynamic_info[DT_REL];
3251           rel_size   = dynamic_info[DT_RELSZ];
3252           is_rela    = FALSE;
3253         }
3254       else if (dynamic_info [DT_RELA])
3255         {
3256           rel_offset = dynamic_info[DT_RELA];
3257           rel_size   = dynamic_info[DT_RELASZ];
3258           is_rela    = TRUE;
3259         }
3260       else if (dynamic_info[DT_JMPREL])
3261         {
3262           rel_offset = dynamic_info[DT_JMPREL];
3263           rel_size   = dynamic_info[DT_PLTRELSZ];
3264
3265           switch (dynamic_info[DT_PLTREL])
3266             {
3267             case DT_REL:
3268               is_rela = FALSE;
3269               break;
3270             case DT_RELA:
3271               is_rela = TRUE;
3272               break;
3273             default:
3274               is_rela = UNKNOWN;
3275               break;
3276             }
3277         }
3278
3279       if (rel_size)
3280         {
3281           printf
3282             (_("\nRelocation section at offset 0x%lx contains %ld bytes:\n"),
3283              rel_offset, rel_size);
3284
3285           dump_relocations (file, rel_offset - loadaddr, rel_size,
3286                             dynamic_symbols, num_dynamic_syms, dynamic_strings, is_rela);
3287         }
3288       else
3289         printf (_("\nThere are no dynamic relocations in this file.\n"));
3290     }
3291   else
3292     {
3293       Elf32_Internal_Shdr *     section;
3294       unsigned long             i;
3295       int               found = 0;
3296
3297       for (i = 0, section = section_headers;
3298            i < elf_header.e_shnum;
3299            i++, section ++)
3300         {
3301           if (   section->sh_type != SHT_RELA
3302               && section->sh_type != SHT_REL)
3303             continue;
3304
3305           rel_offset = section->sh_offset;
3306           rel_size   = section->sh_size;
3307
3308           if (rel_size)
3309             {
3310               Elf32_Internal_Shdr * strsec;
3311               Elf_Internal_Sym *    symtab;
3312               char *                strtab;
3313               int                   is_rela;
3314               unsigned long         nsyms;
3315
3316               printf (_("\nRelocation section "));
3317
3318               if (string_table == NULL)
3319                 printf ("%d", section->sh_name);
3320               else
3321                 printf ("'%s'", SECTION_NAME (section));
3322
3323               printf (_(" at offset 0x%lx contains %lu entries:\n"),
3324                  rel_offset, (unsigned long) (rel_size / section->sh_entsize));
3325
3326               symtab = NULL;
3327               strtab = NULL;
3328               nsyms = 0;
3329               if (section->sh_link)
3330                 {
3331                   Elf32_Internal_Shdr * symsec;
3332
3333                   symsec = section_headers + section->sh_link;
3334                   nsyms = symsec->sh_size / symsec->sh_entsize;
3335                   symtab = GET_ELF_SYMBOLS (file, symsec->sh_offset, nsyms);
3336
3337                   if (symtab == NULL)
3338                     continue;
3339
3340                   strsec = section_headers + symsec->sh_link;
3341
3342                   strtab = (char *) get_data (NULL, file, strsec->sh_offset,
3343                                               strsec->sh_size,
3344                                               _("string table"));
3345                 }
3346               is_rela = section->sh_type == SHT_RELA;
3347
3348               dump_relocations (file, rel_offset, rel_size,
3349                                 symtab, nsyms, strtab, is_rela);
3350
3351               if (strtab)
3352                 free (strtab);
3353               if (symtab)
3354                 free (symtab);
3355
3356               found = 1;
3357             }
3358         }
3359
3360       if (! found)
3361         printf (_("\nThere are no relocations in this file.\n"));
3362     }
3363
3364   return 1;
3365 }
3366
3367 #include "unwind-ia64.h"
3368
3369 /* An absolute address consists of a section and an offset.  If the
3370    section is NULL, the offset itself is the address, otherwise, the
3371    address equals to LOAD_ADDRESS(section) + offset.  */
3372
3373 struct absaddr
3374   {
3375     unsigned short section;
3376     bfd_vma offset;
3377   };
3378
3379 struct unw_aux_info
3380   {
3381     struct unw_table_entry
3382       {
3383         struct absaddr    start;
3384         struct absaddr    end;
3385         struct absaddr    info;
3386       }
3387     *table;                             /* Unwind table.  */
3388     unsigned long         table_len;    /* Length of unwind table.  */
3389     unsigned char *       info;         /* Unwind info.  */
3390     unsigned long         info_size;    /* Size of unwind info.  */
3391     bfd_vma               info_addr;    /* starting address of unwind info.  */
3392     bfd_vma               seg_base;     /* Starting address of segment.  */
3393     Elf_Internal_Sym *    symtab;       /* The symbol table.  */
3394     unsigned              long nsyms;   /* Number of symbols.  */
3395     char *                strtab;       /* The string table.  */
3396     unsigned long         strtab_size;  /* Size of string table.  */
3397   };
3398
3399 static void find_symbol_for_address PARAMS ((struct unw_aux_info *,
3400                                              struct absaddr, const char **,
3401                                              bfd_vma *));
3402 static void dump_ia64_unwind PARAMS ((struct unw_aux_info *));
3403 static int  slurp_ia64_unwind_table PARAMS ((FILE *, struct unw_aux_info *,
3404                                             Elf32_Internal_Shdr *));
3405
3406 static void
3407 find_symbol_for_address (aux, addr, symname, offset)
3408      struct unw_aux_info *aux;
3409      struct absaddr addr;
3410      const char **symname;
3411      bfd_vma *offset;
3412 {
3413   bfd_vma dist = (bfd_vma) 0x100000;
3414   Elf_Internal_Sym *sym, *best = NULL;
3415   unsigned long i;
3416
3417   for (i = 0, sym = aux->symtab; i < aux->nsyms; ++i, ++sym)
3418     {
3419       if (ELF_ST_TYPE (sym->st_info) == STT_FUNC
3420           && sym->st_name != 0
3421           && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
3422           && addr.offset >= sym->st_value
3423           && addr.offset - sym->st_value < dist)
3424         {
3425           best = sym;
3426           dist = addr.offset - sym->st_value;
3427           if (!dist)
3428             break;
3429         }
3430     }
3431   if (best)
3432     {
3433       *symname = (best->st_name >= aux->strtab_size
3434                   ? "<corrupt>" : aux->strtab + best->st_name);
3435       *offset = dist;
3436       return;
3437     }
3438   *symname = NULL;
3439   *offset = addr.offset;
3440 }
3441
3442 static void
3443 dump_ia64_unwind (aux)
3444      struct unw_aux_info *aux;
3445 {
3446   bfd_vma addr_size;
3447   struct unw_table_entry * tp;
3448   int in_body;
3449
3450   addr_size = is_32bit_elf ? 4 : 8;
3451
3452   for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
3453     {
3454       bfd_vma stamp;
3455       bfd_vma offset;
3456       const unsigned char * dp;
3457       const unsigned char * head;
3458       const char * procname;
3459
3460       find_symbol_for_address (aux, tp->start, &procname, &offset);
3461
3462       fputs ("\n<", stdout);
3463
3464       if (procname)
3465         {
3466           fputs (procname, stdout);
3467
3468           if (offset)
3469             printf ("+%lx", (unsigned long) offset);
3470         }
3471
3472       fputs (">: [", stdout);
3473       print_vma (tp->start.offset, PREFIX_HEX);
3474       fputc ('-', stdout);
3475       print_vma (tp->end.offset, PREFIX_HEX);
3476       printf ("), info at +0x%lx\n",
3477               (unsigned long) (tp->info.offset - aux->seg_base));
3478
3479       head = aux->info + (tp->info.offset - aux->info_addr);
3480       stamp = BYTE_GET8 ((unsigned char *) head);
3481
3482       printf ("  v%u, flags=0x%lx (%s%s ), len=%lu bytes\n",
3483               (unsigned) UNW_VER (stamp),
3484               (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
3485               UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
3486               UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
3487               (unsigned long) (addr_size * UNW_LENGTH (stamp)));
3488
3489       if (UNW_VER (stamp) != 1)
3490         {
3491           printf ("\tUnknown version.\n");
3492           continue;
3493         }
3494
3495       in_body = 0;
3496       for (dp = head + 8; dp < head + 8 + addr_size * UNW_LENGTH (stamp);)
3497         dp = unw_decode (dp, in_body, & in_body);
3498     }
3499 }
3500
3501 static int
3502 slurp_ia64_unwind_table (file, aux, sec)
3503      FILE *file;
3504      struct unw_aux_info *aux;
3505      Elf32_Internal_Shdr *sec;
3506 {
3507   unsigned long size, addr_size, nrelas, i;
3508   Elf_Internal_Phdr *prog_hdrs, *seg;
3509   struct unw_table_entry *tep;
3510   Elf32_Internal_Shdr *relsec;
3511   Elf_Internal_Rela *rela, *rp;
3512   unsigned char *table, *tp;
3513   Elf_Internal_Sym *sym;
3514   const char *relname;
3515   int result;
3516
3517   addr_size = is_32bit_elf ? 4 : 8;
3518
3519   /* First, find the starting address of the segment that includes
3520      this section: */
3521
3522   if (elf_header.e_phnum)
3523     {
3524       prog_hdrs = (Elf_Internal_Phdr *)
3525         xmalloc (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
3526
3527       if (is_32bit_elf)
3528         result = get_32bit_program_headers (file, prog_hdrs);
3529       else
3530         result = get_64bit_program_headers (file, prog_hdrs);
3531
3532       if (!result)
3533         {
3534           free (prog_hdrs);
3535           return 0;
3536         }
3537
3538       for (seg = prog_hdrs; seg < prog_hdrs + elf_header.e_phnum; ++seg)
3539         {
3540           if (seg->p_type != PT_LOAD)
3541             continue;
3542
3543           if (sec->sh_addr >= seg->p_vaddr
3544               && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
3545             {
3546               aux->seg_base = seg->p_vaddr;
3547               break;
3548             }
3549         }
3550
3551       free (prog_hdrs);
3552     }
3553
3554   /* Second, build the unwind table from the contents of the unwind section:  */
3555   size = sec->sh_size;
3556   table = (char *) get_data (NULL, file, sec->sh_offset,
3557                              size, _("unwind table"));
3558   if (!table)
3559     return 0;
3560
3561   tep = aux->table = xmalloc (size / (3 * addr_size) * sizeof (aux->table[0]));
3562   for (tp = table; tp < table + size; tp += 3 * addr_size, ++ tep)
3563     {
3564       tep->start.section = SHN_UNDEF;
3565       tep->end.section   = SHN_UNDEF;
3566       tep->info.section  = SHN_UNDEF;
3567       if (is_32bit_elf)
3568         {
3569           tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
3570           tep->end.offset   = byte_get ((unsigned char *) tp + 4, 4);
3571           tep->info.offset  = byte_get ((unsigned char *) tp + 8, 4);
3572         }
3573       else
3574         {
3575           tep->start.offset = BYTE_GET8 ((unsigned char *) tp +  0);
3576           tep->end.offset   = BYTE_GET8 ((unsigned char *) tp +  8);
3577           tep->info.offset  = BYTE_GET8 ((unsigned char *) tp + 16);
3578         }
3579       tep->start.offset += aux->seg_base;
3580       tep->end.offset   += aux->seg_base;
3581       tep->info.offset  += aux->seg_base;
3582     }
3583   free (table);
3584
3585   /* Third, apply any relocations to the unwind table: */
3586
3587   for (relsec = section_headers;
3588        relsec < section_headers + elf_header.e_shnum;
3589        ++relsec)
3590     {
3591       if (relsec->sh_type != SHT_RELA
3592           || section_headers + relsec->sh_info != sec)
3593         continue;
3594
3595       if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
3596                               & rela, & nrelas))
3597         return 0;
3598
3599       for (rp = rela; rp < rela + nrelas; ++rp)
3600         {
3601           if (is_32bit_elf)
3602             {
3603               relname = elf_ia64_reloc_type (ELF32_R_TYPE (rp->r_info));
3604               sym = aux->symtab + ELF32_R_SYM (rp->r_info);
3605
3606               if (ELF32_ST_TYPE (sym->st_info) != STT_SECTION)
3607                 {
3608                   warn (_("Skipping unexpected symbol type %u\n"),
3609                         ELF32_ST_TYPE (sym->st_info));
3610                   continue;
3611                 }
3612             }
3613           else
3614             {
3615               relname = elf_ia64_reloc_type (ELF64_R_TYPE (rp->r_info));
3616               sym = aux->symtab + ELF64_R_SYM (rp->r_info);
3617
3618               if (ELF64_ST_TYPE (sym->st_info) != STT_SECTION)
3619                 {
3620                   warn (_("Skipping unexpected symbol type %u\n"),
3621                         ELF64_ST_TYPE (sym->st_info));
3622                   continue;
3623                 }
3624             }
3625
3626           if (strncmp (relname, "R_IA64_SEGREL", 13) != 0)
3627             {
3628               warn (_("Skipping unexpected relocation type %s\n"), relname);
3629               continue;
3630             }
3631
3632           i = rp->r_offset / (3 * addr_size);
3633
3634           switch (rp->r_offset/addr_size % 3)
3635             {
3636             case 0:
3637               aux->table[i].start.section = sym->st_shndx;
3638               aux->table[i].start.offset += rp->r_addend;
3639               break;
3640             case 1:
3641               aux->table[i].end.section   = sym->st_shndx;
3642               aux->table[i].end.offset   += rp->r_addend;
3643               break;
3644             case 2:
3645               aux->table[i].info.section  = sym->st_shndx;
3646               aux->table[i].info.offset  += rp->r_addend;
3647               break;
3648             default:
3649               break;
3650             }
3651         }
3652
3653       free (rela);
3654     }
3655
3656   aux->table_len = size / (3 * addr_size);
3657   return 1;
3658 }
3659
3660 static int
3661 process_unwind (file)
3662      FILE * file;
3663 {
3664   Elf32_Internal_Shdr *sec, *unwsec = NULL, *strsec;
3665   unsigned long i, addr_size, unwcount = 0, unwstart = 0;
3666   struct unw_aux_info aux;
3667
3668   if (!do_unwind)
3669     return 1;
3670
3671   if (elf_header.e_machine != EM_IA_64)
3672     {
3673       printf (_("\nThere are no unwind sections in this file.\n"));
3674       return 1;
3675     }
3676
3677   memset (& aux, 0, sizeof (aux));
3678
3679   addr_size = is_32bit_elf ? 4 : 8;
3680
3681   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
3682     {
3683       if (sec->sh_type == SHT_SYMTAB)
3684         {
3685           aux.nsyms = sec->sh_size / sec->sh_entsize;
3686           aux.symtab = GET_ELF_SYMBOLS (file, sec->sh_offset, aux.nsyms);
3687
3688           strsec = section_headers + sec->sh_link;
3689           aux.strtab_size = strsec->sh_size;
3690           aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
3691                                           aux.strtab_size, _("string table"));
3692         }
3693       else if (sec->sh_type == SHT_IA_64_UNWIND)
3694         unwcount++;
3695     }
3696
3697   if (!unwcount)
3698     printf (_("\nThere are no unwind sections in this file.\n"));
3699
3700   while (unwcount-- > 0)
3701     {
3702       char *suffix;
3703       size_t len, len2;
3704
3705       for (i = unwstart, sec = section_headers + unwstart;
3706            i < elf_header.e_shnum; ++i, ++sec)
3707         if (sec->sh_type == SHT_IA_64_UNWIND)
3708           {
3709             unwsec = sec;
3710             break;
3711           }
3712
3713       unwstart = i + 1;
3714       len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
3715
3716       if (strncmp (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once,
3717                    len) == 0)
3718         {
3719           /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO */
3720           len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
3721           suffix = SECTION_NAME (unwsec) + len;
3722           for (i = 0, sec = section_headers; i < elf_header.e_shnum;
3723                ++i, ++sec)
3724             if (strncmp (SECTION_NAME (sec),
3725                          ELF_STRING_ia64_unwind_info_once, len2) == 0
3726                 && strcmp (SECTION_NAME (sec) + len2, suffix) == 0)
3727               break;
3728         }
3729       else
3730         {
3731           /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
3732              .IA_64.unwind or BAR -> .IA_64.unwind_info */
3733           len = sizeof (ELF_STRING_ia64_unwind) - 1;
3734           len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
3735           suffix = "";
3736           if (strncmp (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind,
3737                        len) == 0)
3738             suffix = SECTION_NAME (unwsec) + len;
3739           for (i = 0, sec = section_headers; i < elf_header.e_shnum;
3740                ++i, ++sec)
3741             if (strncmp (SECTION_NAME (sec),
3742                          ELF_STRING_ia64_unwind_info, len2) == 0
3743                 && strcmp (SECTION_NAME (sec) + len2, suffix) == 0)
3744               break;
3745         }
3746
3747       if (i == elf_header.e_shnum)
3748         {
3749           printf (_("\nCould not find unwind info section for "));
3750
3751           if (string_table == NULL)
3752             printf ("%d", unwsec->sh_name);
3753           else
3754             printf ("'%s'", SECTION_NAME (unwsec));
3755         }
3756       else
3757         {
3758           aux.info_size = sec->sh_size;
3759           aux.info_addr = sec->sh_addr;
3760           aux.info = (char *) get_data (NULL, file, sec->sh_offset,
3761                                         aux.info_size, _("unwind info"));
3762
3763           printf (_("\nUnwind section "));
3764
3765           if (string_table == NULL)
3766             printf ("%d", unwsec->sh_name);
3767           else
3768             printf ("'%s'", SECTION_NAME (unwsec));
3769
3770           printf (_(" at offset 0x%lx contains %lu entries:\n"),
3771                   (unsigned long) unwsec->sh_offset,
3772                   (unsigned long) (unwsec->sh_size / (3 * addr_size)));
3773
3774           (void) slurp_ia64_unwind_table (file, & aux, unwsec);
3775
3776           if (aux.table_len > 0)
3777             dump_ia64_unwind (& aux);
3778
3779           if (aux.table)
3780             free ((char *) aux.table);
3781           if (aux.info)
3782             free ((char *) aux.info);
3783           aux.table = NULL;
3784           aux.info = NULL;
3785         }
3786     }
3787
3788   if (aux.symtab)
3789     free (aux.symtab);
3790   if (aux.strtab)
3791     free ((char *) aux.strtab);
3792
3793   return 1;
3794 }
3795
3796 static void
3797 dynamic_segment_mips_val (entry)
3798      Elf_Internal_Dyn * entry;
3799 {
3800   switch (entry->d_tag)
3801     {
3802     case DT_MIPS_FLAGS:
3803       if (entry->d_un.d_val == 0)
3804         printf ("NONE\n");
3805       else
3806         {
3807           static const char * opts[] =
3808           {
3809             "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
3810             "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
3811             "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
3812             "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
3813             "RLD_ORDER_SAFE"
3814           };
3815           unsigned int cnt;
3816           int first = 1;
3817           for (cnt = 0; cnt < NUM_ELEM (opts); ++ cnt)
3818             if (entry->d_un.d_val & (1 << cnt))
3819               {
3820                 printf ("%s%s", first ? "" : " ", opts[cnt]);
3821                 first = 0;
3822               }
3823           puts ("");
3824         }
3825       break;
3826
3827     case DT_MIPS_IVERSION:
3828       if (dynamic_strings != NULL)
3829         printf ("Interface Version: %s\n",
3830                 dynamic_strings + entry->d_un.d_val);
3831       else
3832         printf ("%ld\n", (long) entry->d_un.d_ptr);
3833       break;
3834
3835     case DT_MIPS_TIME_STAMP:
3836       {
3837         char timebuf[20];
3838         struct tm * tmp;
3839
3840         time_t time = entry->d_un.d_val;
3841         tmp = gmtime (&time);
3842         sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
3843                  tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
3844                  tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
3845         printf ("Time Stamp: %s\n", timebuf);
3846       }
3847       break;
3848
3849     case DT_MIPS_RLD_VERSION:
3850     case DT_MIPS_LOCAL_GOTNO:
3851     case DT_MIPS_CONFLICTNO:
3852     case DT_MIPS_LIBLISTNO:
3853     case DT_MIPS_SYMTABNO:
3854     case DT_MIPS_UNREFEXTNO:
3855     case DT_MIPS_HIPAGENO:
3856     case DT_MIPS_DELTA_CLASS_NO:
3857     case DT_MIPS_DELTA_INSTANCE_NO:
3858     case DT_MIPS_DELTA_RELOC_NO:
3859     case DT_MIPS_DELTA_SYM_NO:
3860     case DT_MIPS_DELTA_CLASSSYM_NO:
3861     case DT_MIPS_COMPACT_SIZE:
3862       printf ("%ld\n", (long) entry->d_un.d_ptr);
3863       break;
3864
3865     default:
3866       printf ("%#lx\n", (long) entry->d_un.d_ptr);
3867     }
3868 }
3869
3870
3871 static void
3872 dynamic_segment_parisc_val (entry)
3873      Elf_Internal_Dyn * entry;
3874 {
3875   switch (entry->d_tag)
3876     {
3877     case DT_HP_DLD_FLAGS:
3878       {
3879         static struct
3880         {
3881           long int bit;
3882           const char * str;
3883         }
3884         flags[] =
3885         {
3886           { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
3887           { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
3888           { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
3889           { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
3890           { DT_HP_BIND_NOW, "HP_BIND_NOW" },
3891           { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
3892           { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
3893           { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
3894           { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
3895           { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
3896           { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" }
3897         };
3898         int first = 1;
3899         size_t cnt;
3900         bfd_vma val = entry->d_un.d_val;
3901
3902         for (cnt = 0; cnt < sizeof (flags) / sizeof (flags[0]); ++cnt)
3903           if (val & flags[cnt].bit)
3904             {
3905               if (! first)
3906                 putchar (' ');
3907               fputs (flags[cnt].str, stdout);
3908               first = 0;
3909               val ^= flags[cnt].bit;
3910             }
3911
3912         if (val != 0 || first)
3913           {
3914             if (! first)
3915               putchar (' ');
3916             print_vma (val, HEX);
3917           }
3918       }
3919       break;
3920
3921     default:
3922       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
3923       break;
3924     }
3925 }
3926
3927 static int
3928 get_32bit_dynamic_segment (file)
3929      FILE * file;
3930 {
3931   Elf32_External_Dyn * edyn;
3932   Elf_Internal_Dyn *   entry;
3933   bfd_size_type        i;
3934
3935   edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr,
3936                                           dynamic_size, _("dynamic segment"));
3937   if (!edyn)
3938     return 0;
3939
3940   /* SGI's ELF has more than one section in the DYNAMIC segment.  Determine
3941      how large this .dynamic is now.  We can do this even before the byte
3942      swapping since the DT_NULL tag is recognizable.  */
3943   dynamic_size = 0;
3944   while (*(Elf32_Word *) edyn [dynamic_size++].d_tag != DT_NULL)
3945     ;
3946
3947   dynamic_segment = (Elf_Internal_Dyn *)
3948     malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
3949
3950   if (dynamic_segment == NULL)
3951     {
3952       error (_("Out of memory\n"));
3953       free (edyn);
3954       return 0;
3955     }
3956
3957   for (i = 0, entry = dynamic_segment;
3958        i < dynamic_size;
3959        i ++, entry ++)
3960     {
3961       entry->d_tag      = BYTE_GET (edyn [i].d_tag);
3962       entry->d_un.d_val = BYTE_GET (edyn [i].d_un.d_val);
3963     }
3964
3965   free (edyn);
3966
3967   return 1;
3968 }
3969
3970 static int
3971 get_64bit_dynamic_segment (file)
3972      FILE * file;
3973 {
3974   Elf64_External_Dyn * edyn;
3975   Elf_Internal_Dyn *   entry;
3976   bfd_size_type        i;
3977
3978   edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr,
3979                                           dynamic_size, _("dynamic segment"));
3980   if (!edyn)
3981     return 0;
3982
3983   /* SGI's ELF has more than one section in the DYNAMIC segment.  Determine
3984      how large this .dynamic is now.  We can do this even before the byte
3985      swapping since the DT_NULL tag is recognizable.  */
3986   dynamic_size = 0;
3987   while (*(bfd_vma *) edyn [dynamic_size ++].d_tag != DT_NULL)
3988     ;
3989
3990   dynamic_segment = (Elf_Internal_Dyn *)
3991     malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
3992
3993   if (dynamic_segment == NULL)
3994     {
3995       error (_("Out of memory\n"));
3996       free (edyn);
3997       return 0;
3998     }
3999
4000   for (i = 0, entry = dynamic_segment;
4001        i < dynamic_size;
4002        i ++, entry ++)
4003     {
4004       entry->d_tag      = BYTE_GET8 (edyn [i].d_tag);
4005       entry->d_un.d_val = BYTE_GET8 (edyn [i].d_un.d_val);
4006     }
4007
4008   free (edyn);
4009
4010   return 1;
4011 }
4012
4013 static const char *
4014 get_dynamic_flags (flags)
4015      bfd_vma flags;
4016 {
4017   static char buff [64];
4018   while (flags)
4019     {
4020       bfd_vma flag;
4021
4022       flag = flags & - flags;
4023       flags &= ~ flag;
4024
4025       switch (flag)
4026         {
4027         case DF_ORIGIN:   strcat (buff, "ORIGIN "); break;
4028         case DF_SYMBOLIC: strcat (buff, "SYMBOLIC "); break;
4029         case DF_TEXTREL:  strcat (buff, "TEXTREL "); break;
4030         case DF_BIND_NOW: strcat (buff, "BIND_NOW "); break;
4031         default:          strcat (buff, "unknown "); break;
4032         }
4033     }
4034   return buff;
4035 }
4036
4037 /* Parse and display the contents of the dynamic segment.  */
4038 static int
4039 process_dynamic_segment (file)
4040      FILE * file;
4041 {
4042   Elf_Internal_Dyn * entry;
4043   bfd_size_type      i;
4044
4045   if (dynamic_size == 0)
4046     {
4047       if (do_dynamic)
4048         printf (_("\nThere is no dynamic segment in this file.\n"));
4049
4050       return 1;
4051     }
4052
4053   if (is_32bit_elf)
4054     {
4055       if (! get_32bit_dynamic_segment (file))
4056         return 0;
4057     }
4058   else if (! get_64bit_dynamic_segment (file))
4059     return 0;
4060
4061   /* Find the appropriate symbol table.  */
4062   if (dynamic_symbols == NULL)
4063     {
4064       for (i = 0, entry = dynamic_segment;
4065            i < dynamic_size;
4066            ++i, ++ entry)
4067         {
4068           unsigned long        offset;
4069
4070           if (entry->d_tag != DT_SYMTAB)
4071             continue;
4072
4073           dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
4074
4075           /* Since we do not know how big the symbol table is,
4076              we default to reading in the entire file (!) and
4077              processing that.  This is overkill, I know, but it
4078              should work.  */
4079           offset = entry->d_un.d_val - loadaddr;
4080
4081           if (fseek (file, 0, SEEK_END))
4082             error (_("Unable to seek to end of file!"));
4083
4084           if (is_32bit_elf)
4085             num_dynamic_syms = (ftell (file) - offset) / sizeof (Elf32_External_Sym);
4086           else
4087             num_dynamic_syms = (ftell (file) - offset) / sizeof (Elf64_External_Sym);
4088
4089           if (num_dynamic_syms < 1)
4090             {
4091               error (_("Unable to determine the number of symbols to load\n"));
4092               continue;
4093             }
4094
4095           dynamic_symbols = GET_ELF_SYMBOLS (file, offset, num_dynamic_syms);
4096         }
4097     }
4098
4099   /* Similarly find a string table.  */
4100   if (dynamic_strings == NULL)
4101     {
4102       for (i = 0, entry = dynamic_segment;
4103            i < dynamic_size;
4104            ++i, ++ entry)
4105         {
4106           unsigned long offset;
4107           long          str_tab_len;
4108
4109           if (entry->d_tag != DT_STRTAB)
4110             continue;
4111
4112           dynamic_info[DT_STRTAB] = entry->d_un.d_val;
4113
4114           /* Since we do not know how big the string table is,
4115              we default to reading in the entire file (!) and
4116              processing that.  This is overkill, I know, but it
4117              should work.  */
4118
4119           offset = entry->d_un.d_val - loadaddr;
4120           if (fseek (file, 0, SEEK_END))
4121             error (_("Unable to seek to end of file\n"));
4122           str_tab_len = ftell (file) - offset;
4123
4124           if (str_tab_len < 1)
4125             {
4126               error
4127                 (_("Unable to determine the length of the dynamic string table\n"));
4128               continue;
4129             }
4130
4131           dynamic_strings = (char *) get_data (NULL, file, offset, str_tab_len,
4132                                                _("dynamic string table"));
4133           break;
4134         }
4135     }
4136
4137   /* And find the syminfo section if available.  */
4138   if (dynamic_syminfo == NULL)
4139     {
4140       unsigned int syminsz = 0;
4141
4142       for (i = 0, entry = dynamic_segment;
4143            i < dynamic_size;
4144            ++i, ++ entry)
4145         {
4146           if (entry->d_tag == DT_SYMINENT)
4147             {
4148               /* Note: these braces are necessary to avoid a syntax
4149                  error from the SunOS4 C compiler.  */
4150               assert (sizeof (Elf_External_Syminfo) == entry->d_un.d_val);
4151             }
4152           else if (entry->d_tag == DT_SYMINSZ)
4153             syminsz = entry->d_un.d_val;
4154           else if (entry->d_tag == DT_SYMINFO)
4155             dynamic_syminfo_offset = entry->d_un.d_val - loadaddr;
4156         }
4157
4158       if (dynamic_syminfo_offset != 0 && syminsz != 0)
4159         {
4160           Elf_External_Syminfo * extsyminfo;
4161           Elf_Internal_Syminfo * syminfo;
4162
4163           /* There is a syminfo section.  Read the data.  */
4164           extsyminfo = ((Elf_External_Syminfo *)
4165                         get_data (NULL, file, dynamic_syminfo_offset,
4166                                   syminsz, _("symbol information")));
4167           if (!extsyminfo)
4168             return 0;
4169
4170           dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
4171           if (dynamic_syminfo == NULL)
4172             {
4173               error (_("Out of memory\n"));
4174               return 0;
4175             }
4176
4177           dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
4178           for (i = 0, syminfo = dynamic_syminfo; i < dynamic_syminfo_nent;
4179                ++i, ++syminfo)
4180             {
4181               syminfo->si_boundto = BYTE_GET (extsyminfo[i].si_boundto);
4182               syminfo->si_flags = BYTE_GET (extsyminfo[i].si_flags);
4183             }
4184
4185           free (extsyminfo);
4186         }
4187     }
4188
4189   if (do_dynamic && dynamic_addr)
4190     printf (_("\nDynamic segment at offset 0x%x contains %ld entries:\n"),
4191             dynamic_addr, (long) dynamic_size);
4192   if (do_dynamic)
4193     printf (_("  Tag        Type                         Name/Value\n"));
4194
4195   for (i = 0, entry = dynamic_segment;
4196        i < dynamic_size;
4197        i++, entry ++)
4198     {
4199       if (do_dynamic)
4200         {
4201           const char * dtype;
4202
4203           putchar (' ');
4204           print_vma (entry->d_tag, FULL_HEX);
4205           dtype = get_dynamic_type (entry->d_tag);
4206           printf (" (%s)%*s", dtype,
4207                   ((is_32bit_elf ? 27 : 19)
4208                    - (int) strlen (dtype)),
4209                   " ");
4210         }
4211
4212       switch (entry->d_tag)
4213         {
4214         case DT_FLAGS:
4215           if (do_dynamic)
4216             printf ("%s", get_dynamic_flags (entry->d_un.d_val));
4217           break;
4218
4219         case DT_AUXILIARY:
4220         case DT_FILTER:
4221         case DT_CONFIG:
4222         case DT_DEPAUDIT:
4223         case DT_AUDIT:
4224           if (do_dynamic)
4225             {
4226               switch (entry->d_tag)
4227                 {
4228                 case DT_AUXILIARY:
4229                   printf (_("Auxiliary library"));
4230                   break;
4231
4232                 case DT_FILTER:
4233                   printf (_("Filter library"));
4234                   break;
4235
4236                 case DT_CONFIG:
4237                   printf (_("Configuration file"));
4238                   break;
4239
4240                 case DT_DEPAUDIT:
4241                   printf (_("Dependency audit library"));
4242                   break;
4243
4244                 case DT_AUDIT:
4245                   printf (_("Audit library"));
4246                   break;
4247                 }
4248
4249               if (dynamic_strings)
4250                 printf (": [%s]\n", dynamic_strings + entry->d_un.d_val);
4251               else
4252                 {
4253                   printf (": ");
4254                   print_vma (entry->d_un.d_val, PREFIX_HEX);
4255                   putchar ('\n');
4256                 }
4257             }
4258           break;
4259
4260         case DT_FEATURE:
4261           if (do_dynamic)
4262             {
4263               printf (_("Flags:"));
4264               if (entry->d_un.d_val == 0)
4265                 printf (_(" None\n"));
4266               else
4267                 {
4268                   unsigned long int val = entry->d_un.d_val;
4269                   if (val & DTF_1_PARINIT)
4270                     {
4271                       printf (" PARINIT");
4272                       val ^= DTF_1_PARINIT;
4273                     }
4274                   if (val & DTF_1_CONFEXP)
4275                     {
4276                       printf (" CONFEXP");
4277                       val ^= DTF_1_CONFEXP;
4278                     }
4279                   if (val != 0)
4280                     printf (" %lx", val);
4281                   puts ("");
4282                 }
4283             }
4284           break;
4285
4286         case DT_POSFLAG_1:
4287           if (do_dynamic)
4288             {
4289               printf (_("Flags:"));
4290               if (entry->d_un.d_val == 0)
4291                 printf (_(" None\n"));
4292               else
4293                 {
4294                   unsigned long int val = entry->d_un.d_val;
4295                   if (val & DF_P1_LAZYLOAD)
4296                     {
4297                       printf (" LAZYLOAD");
4298                       val ^= DF_P1_LAZYLOAD;
4299                     }
4300                   if (val & DF_P1_GROUPPERM)
4301                     {
4302                       printf (" GROUPPERM");
4303                       val ^= DF_P1_GROUPPERM;
4304                     }
4305                   if (val != 0)
4306                     printf (" %lx", val);
4307                   puts ("");
4308                 }
4309             }
4310           break;
4311
4312         case DT_FLAGS_1:
4313           if (do_dynamic)
4314             {
4315               printf (_("Flags:"));
4316               if (entry->d_un.d_val == 0)
4317                 printf (_(" None\n"));
4318               else
4319                 {
4320                   unsigned long int val = entry->d_un.d_val;
4321                   if (val & DF_1_NOW)
4322                     {
4323                       printf (" NOW");
4324                       val ^= DF_1_NOW;
4325                     }
4326                   if (val & DF_1_GLOBAL)
4327                     {
4328                       printf (" GLOBAL");
4329                       val ^= DF_1_GLOBAL;
4330                     }
4331                   if (val & DF_1_GROUP)
4332                     {
4333                       printf (" GROUP");
4334                       val ^= DF_1_GROUP;
4335                     }
4336                   if (val & DF_1_NODELETE)
4337                     {
4338                       printf (" NODELETE");
4339                       val ^= DF_1_NODELETE;
4340                     }
4341                   if (val & DF_1_LOADFLTR)
4342                     {
4343                       printf (" LOADFLTR");
4344                       val ^= DF_1_LOADFLTR;
4345                     }
4346                   if (val & DF_1_INITFIRST)
4347                     {
4348                       printf (" INITFIRST");
4349                       val ^= DF_1_INITFIRST;
4350                     }
4351                   if (val & DF_1_NOOPEN)
4352                     {
4353                       printf (" NOOPEN");
4354                       val ^= DF_1_NOOPEN;
4355                     }
4356                   if (val & DF_1_ORIGIN)
4357                     {
4358                       printf (" ORIGIN");
4359                       val ^= DF_1_ORIGIN;
4360                     }
4361                   if (val & DF_1_DIRECT)
4362                     {
4363                       printf (" DIRECT");
4364                       val ^= DF_1_DIRECT;
4365                     }
4366                   if (val & DF_1_TRANS)
4367                     {
4368                       printf (" TRANS");
4369                       val ^= DF_1_TRANS;
4370                     }
4371                   if (val & DF_1_INTERPOSE)
4372                     {
4373                       printf (" INTERPOSE");
4374                       val ^= DF_1_INTERPOSE;
4375                     }
4376                   if (val & DF_1_NODEFLIB)
4377                     {
4378                       printf (" NODEFLIB");
4379                       val ^= DF_1_NODEFLIB;
4380                     }
4381                   if (val & DF_1_NODUMP)
4382                     {
4383                       printf (" NODUMP");
4384                       val ^= DF_1_NODUMP;
4385                     }
4386                   if (val & DF_1_CONLFAT)
4387                     {
4388                       printf (" CONLFAT");
4389                       val ^= DF_1_CONLFAT;
4390                     }
4391                   if (val != 0)
4392                     printf (" %lx", val);
4393                   puts ("");
4394                 }
4395             }
4396           break;
4397
4398         case DT_PLTREL:
4399           if (do_dynamic)
4400             puts (get_dynamic_type (entry->d_un.d_val));
4401           break;
4402
4403         case DT_NULL    :
4404         case DT_NEEDED  :
4405         case DT_PLTGOT  :
4406         case DT_HASH    :
4407         case DT_STRTAB  :
4408         case DT_SYMTAB  :
4409         case DT_RELA    :
4410         case DT_INIT    :
4411         case DT_FINI    :
4412         case DT_SONAME  :
4413         case DT_RPATH   :
4414         case DT_SYMBOLIC:
4415         case DT_REL     :
4416         case DT_DEBUG   :
4417         case DT_TEXTREL :
4418         case DT_JMPREL  :
4419         case DT_RUNPATH :
4420           dynamic_info[entry->d_tag] = entry->d_un.d_val;
4421
4422           if (do_dynamic)
4423             {
4424               char * name;
4425
4426               if (dynamic_strings == NULL)
4427                 name = NULL;
4428               else
4429                 name = dynamic_strings + entry->d_un.d_val;
4430
4431               if (name)
4432                 {
4433                   switch (entry->d_tag)
4434                     {
4435                     case DT_NEEDED:
4436                       printf (_("Shared library: [%s]"), name);
4437
4438                       if (strcmp (name, program_interpreter) == 0)
4439                         printf (_(" program interpreter"));
4440                       break;
4441
4442                     case DT_SONAME:
4443                       printf (_("Library soname: [%s]"), name);
4444                       break;
4445
4446                     case DT_RPATH:
4447                       printf (_("Library rpath: [%s]"), name);
4448                       break;
4449
4450                     case DT_RUNPATH:
4451                       printf (_("Library runpath: [%s]"), name);
4452                       break;
4453
4454                     default:
4455                       print_vma (entry->d_un.d_val, PREFIX_HEX);
4456                       break;
4457                     }
4458                 }
4459               else
4460                 print_vma (entry->d_un.d_val, PREFIX_HEX);
4461
4462               putchar ('\n');
4463             }
4464           break;
4465
4466         case DT_PLTRELSZ:
4467         case DT_RELASZ  :
4468         case DT_STRSZ   :
4469         case DT_RELSZ   :
4470         case DT_RELAENT :
4471         case DT_SYMENT  :
4472         case DT_RELENT  :
4473         case DT_PLTPADSZ:
4474         case DT_MOVEENT :
4475         case DT_MOVESZ  :
4476         case DT_INIT_ARRAYSZ:
4477         case DT_FINI_ARRAYSZ:
4478           if (do_dynamic)
4479             {
4480               print_vma (entry->d_un.d_val, UNSIGNED);
4481               printf (" (bytes)\n");
4482             }
4483           break;
4484
4485         case DT_VERDEFNUM:
4486         case DT_VERNEEDNUM:
4487         case DT_RELACOUNT:
4488         case DT_RELCOUNT:
4489           if (do_dynamic)
4490             {
4491               print_vma (entry->d_un.d_val, UNSIGNED);
4492               putchar ('\n');
4493             }
4494           break;
4495
4496         case DT_SYMINSZ:
4497         case DT_SYMINENT:
4498         case DT_SYMINFO:
4499         case DT_USED:
4500         case DT_INIT_ARRAY:
4501         case DT_FINI_ARRAY:
4502           if (do_dynamic)
4503             {
4504               if (dynamic_strings != NULL && entry->d_tag == DT_USED)
4505                 {
4506                   char * name;
4507
4508                   name = dynamic_strings + entry->d_un.d_val;
4509
4510                   if (* name)
4511                     {
4512                       printf (_("Not needed object: [%s]\n"), name);
4513                       break;
4514                     }
4515                 }
4516
4517               print_vma (entry->d_un.d_val, PREFIX_HEX);
4518               putchar ('\n');
4519             }
4520           break;
4521
4522         case DT_BIND_NOW:
4523           /* The value of this entry is ignored.  */
4524           break;
4525
4526         default:
4527           if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
4528             version_info [DT_VERSIONTAGIDX (entry->d_tag)] =
4529               entry->d_un.d_val;
4530
4531           if (do_dynamic)
4532             {
4533               switch (elf_header.e_machine)
4534                 {
4535                 case EM_MIPS:
4536                 case EM_MIPS_RS3_LE:
4537                   dynamic_segment_mips_val (entry);
4538                   break;
4539                 case EM_PARISC:
4540                   dynamic_segment_parisc_val (entry);
4541                   break;
4542                 default:
4543                   print_vma (entry->d_un.d_val, PREFIX_HEX);
4544                   putchar ('\n');
4545                 }
4546             }
4547           break;
4548         }
4549     }
4550
4551   return 1;
4552 }
4553
4554 static char *
4555 get_ver_flags (flags)
4556      unsigned int flags;
4557 {
4558   static char buff [32];
4559
4560   buff[0] = 0;
4561
4562   if (flags == 0)
4563     return _("none");
4564
4565   if (flags & VER_FLG_BASE)
4566     strcat (buff, "BASE ");
4567
4568   if (flags & VER_FLG_WEAK)
4569     {
4570       if (flags & VER_FLG_BASE)
4571         strcat (buff, "| ");
4572
4573       strcat (buff, "WEAK ");
4574     }
4575
4576   if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK))
4577     strcat (buff, "| <unknown>");
4578
4579   return buff;
4580 }
4581
4582 /* Display the contents of the version sections.  */
4583 static int
4584 process_version_sections (file)
4585      FILE * file;
4586 {
4587   Elf32_Internal_Shdr * section;
4588   unsigned   i;
4589   int        found = 0;
4590
4591   if (! do_version)
4592     return 1;
4593
4594   for (i = 0, section = section_headers;
4595        i < elf_header.e_shnum;
4596        i++, section ++)
4597     {
4598       switch (section->sh_type)
4599         {
4600         case SHT_GNU_verdef:
4601           {
4602             Elf_External_Verdef * edefs;
4603             unsigned int          idx;
4604             unsigned int          cnt;
4605
4606             found = 1;
4607
4608             printf
4609               (_("\nVersion definition section '%s' contains %ld entries:\n"),
4610                SECTION_NAME (section), section->sh_info);
4611
4612             printf (_("  Addr: 0x"));
4613             printf_vma (section->sh_addr);
4614             printf (_("  Offset: %#08lx  Link: %lx (%s)\n"),
4615                     (unsigned long) section->sh_offset, section->sh_link,
4616                     SECTION_NAME (section_headers + section->sh_link));
4617
4618             edefs = ((Elf_External_Verdef *)
4619                      get_data (NULL, file, section->sh_offset,
4620                                section->sh_size,
4621                                _("version definition section")));
4622             if (!edefs)
4623               break;
4624
4625             for (idx = cnt = 0; cnt < section->sh_info; ++ cnt)
4626               {
4627                 char *                 vstart;
4628                 Elf_External_Verdef *  edef;
4629                 Elf_Internal_Verdef    ent;
4630                 Elf_External_Verdaux * eaux;
4631                 Elf_Internal_Verdaux   aux;
4632                 int                    j;
4633                 int                    isum;
4634
4635                 vstart = ((char *) edefs) + idx;
4636
4637                 edef = (Elf_External_Verdef *) vstart;
4638
4639                 ent.vd_version = BYTE_GET (edef->vd_version);
4640                 ent.vd_flags   = BYTE_GET (edef->vd_flags);
4641                 ent.vd_ndx     = BYTE_GET (edef->vd_ndx);
4642                 ent.vd_cnt     = BYTE_GET (edef->vd_cnt);
4643                 ent.vd_hash    = BYTE_GET (edef->vd_hash);
4644                 ent.vd_aux     = BYTE_GET (edef->vd_aux);
4645                 ent.vd_next    = BYTE_GET (edef->vd_next);
4646
4647                 printf (_("  %#06x: Rev: %d  Flags: %s"),
4648                         idx, ent.vd_version, get_ver_flags (ent.vd_flags));
4649
4650                 printf (_("  Index: %d  Cnt: %d  "),
4651                         ent.vd_ndx, ent.vd_cnt);
4652
4653                 vstart += ent.vd_aux;
4654
4655                 eaux = (Elf_External_Verdaux *) vstart;
4656
4657                 aux.vda_name = BYTE_GET (eaux->vda_name);
4658                 aux.vda_next = BYTE_GET (eaux->vda_next);
4659
4660                 if (dynamic_strings)
4661                   printf (_("Name: %s\n"), dynamic_strings + aux.vda_name);
4662                 else
4663                   printf (_("Name index: %ld\n"), aux.vda_name);
4664
4665                 isum = idx + ent.vd_aux;
4666
4667                 for (j = 1; j < ent.vd_cnt; j ++)
4668                   {
4669                     isum   += aux.vda_next;
4670                     vstart += aux.vda_next;
4671
4672                     eaux = (Elf_External_Verdaux *) vstart;
4673
4674                     aux.vda_name = BYTE_GET (eaux->vda_name);
4675                     aux.vda_next = BYTE_GET (eaux->vda_next);
4676
4677                     if (dynamic_strings)
4678                       printf (_("  %#06x: Parent %d: %s\n"),
4679                               isum, j, dynamic_strings + aux.vda_name);
4680                     else
4681                       printf (_("  %#06x: Parent %d, name index: %ld\n"),
4682                               isum, j, aux.vda_name);
4683                   }
4684
4685                 idx += ent.vd_next;
4686               }
4687
4688             free (edefs);
4689           }
4690           break;
4691
4692         case SHT_GNU_verneed:
4693           {
4694             Elf_External_Verneed *  eneed;
4695             unsigned int            idx;
4696             unsigned int            cnt;
4697
4698             found = 1;
4699
4700             printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
4701                     SECTION_NAME (section), section->sh_info);
4702
4703             printf (_(" Addr: 0x"));
4704             printf_vma (section->sh_addr);
4705             printf (_("  Offset: %#08lx  Link to section: %ld (%s)\n"),
4706                     (unsigned long) section->sh_offset, section->sh_link,
4707                     SECTION_NAME (section_headers + section->sh_link));
4708
4709             eneed = ((Elf_External_Verneed *)
4710                      get_data (NULL, file, section->sh_offset,
4711                                section->sh_size, _("version need section")));
4712             if (!eneed)
4713               break;
4714
4715             for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
4716               {
4717                 Elf_External_Verneed * entry;
4718                 Elf_Internal_Verneed     ent;
4719                 int                      j;
4720                 int                      isum;
4721                 char *                   vstart;
4722
4723                 vstart = ((char *) eneed) + idx;
4724
4725                 entry = (Elf_External_Verneed *) vstart;
4726
4727                 ent.vn_version = BYTE_GET (entry->vn_version);
4728                 ent.vn_cnt     = BYTE_GET (entry->vn_cnt);
4729                 ent.vn_file    = BYTE_GET (entry->vn_file);
4730                 ent.vn_aux     = BYTE_GET (entry->vn_aux);
4731                 ent.vn_next    = BYTE_GET (entry->vn_next);
4732
4733                 printf (_("  %#06x: Version: %d"), idx, ent.vn_version);
4734
4735                 if (dynamic_strings)
4736                   printf (_("  File: %s"), dynamic_strings + ent.vn_file);
4737                 else
4738                   printf (_("  File: %lx"), ent.vn_file);
4739
4740                 printf (_("  Cnt: %d\n"), ent.vn_cnt);
4741
4742                 vstart += ent.vn_aux;
4743
4744                 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
4745                   {
4746                     Elf_External_Vernaux * eaux;
4747                     Elf_Internal_Vernaux   aux;
4748
4749                     eaux = (Elf_External_Vernaux *) vstart;
4750
4751                     aux.vna_hash  = BYTE_GET (eaux->vna_hash);
4752                     aux.vna_flags = BYTE_GET (eaux->vna_flags);
4753                     aux.vna_other = BYTE_GET (eaux->vna_other);
4754                     aux.vna_name  = BYTE_GET (eaux->vna_name);
4755                     aux.vna_next  = BYTE_GET (eaux->vna_next);
4756
4757                     if (dynamic_strings)
4758                       printf (_("  %#06x: Name: %s"),
4759                               isum, dynamic_strings + aux.vna_name);
4760                     else
4761                       printf (_("  %#06x: Name index: %lx"),
4762                               isum, aux.vna_name);
4763
4764                     printf (_("  Flags: %s  Version: %d\n"),
4765                             get_ver_flags (aux.vna_flags), aux.vna_other);
4766
4767                     isum   += aux.vna_next;
4768                     vstart += aux.vna_next;
4769                   }
4770
4771                 idx += ent.vn_next;
4772               }
4773
4774             free (eneed);
4775           }
4776           break;
4777
4778         case SHT_GNU_versym:
4779           {
4780             Elf32_Internal_Shdr *       link_section;
4781             int                         total;
4782             int                         cnt;
4783             unsigned char *             edata;
4784             unsigned short *            data;
4785             char *                      strtab;
4786             Elf_Internal_Sym *          symbols;
4787             Elf32_Internal_Shdr *       string_sec;
4788
4789             link_section = section_headers + section->sh_link;
4790             total = section->sh_size / section->sh_entsize;
4791
4792             found = 1;
4793
4794             symbols = GET_ELF_SYMBOLS (file, link_section->sh_offset,
4795                                        link_section->sh_size / link_section->sh_entsize);
4796
4797             string_sec = section_headers + link_section->sh_link;
4798
4799             strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
4800                                         string_sec->sh_size,
4801                                         _("version string table"));
4802             if (!strtab)
4803               break;
4804
4805             printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
4806                     SECTION_NAME (section), total);
4807
4808             printf (_(" Addr: "));
4809             printf_vma (section->sh_addr);
4810             printf (_("  Offset: %#08lx  Link: %lx (%s)\n"),
4811                     (unsigned long) section->sh_offset, section->sh_link,
4812                     SECTION_NAME (link_section));
4813
4814             edata =
4815               ((unsigned char *)
4816                get_data (NULL, file,
4817                          version_info[DT_VERSIONTAGIDX (DT_VERSYM)] - loadaddr,
4818                          total * sizeof (short), _("version symbol data")));
4819             if (!edata)
4820               {
4821                 free (strtab);
4822                 break;
4823               }
4824
4825             data = (unsigned short *) malloc (total * sizeof (short));
4826
4827             for (cnt = total; cnt --;)
4828               data [cnt] = byte_get (edata + cnt * sizeof (short),
4829                                      sizeof (short));
4830
4831             free (edata);
4832
4833             for (cnt = 0; cnt < total; cnt += 4)
4834               {
4835                 int j, nn;
4836                 int check_def, check_need;
4837                 char * name;
4838
4839                 printf ("  %03x:", cnt);
4840
4841                 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
4842                   switch (data [cnt + j])
4843                     {
4844                     case 0:
4845                       fputs (_("   0 (*local*)    "), stdout);
4846                       break;
4847
4848                     case 1:
4849                       fputs (_("   1 (*global*)   "), stdout);
4850                       break;
4851
4852                     default:
4853                       nn = printf ("%4x%c", data [cnt + j] & 0x7fff,
4854                                    data [cnt + j] & 0x8000 ? 'h' : ' ');
4855
4856                       check_def = 1;
4857                       check_need = 1;
4858                       if (symbols [cnt + j].st_shndx >= SHN_LORESERVE
4859                           || section_headers[symbols [cnt + j].st_shndx].sh_type
4860                           != SHT_NOBITS)
4861                         {
4862                           if (symbols [cnt + j].st_shndx == SHN_UNDEF)
4863                             check_def = 0;
4864                           else
4865                             check_need = 0;
4866                         }
4867
4868                       if (check_need
4869                           && version_info [DT_VERSIONTAGIDX (DT_VERNEED)])
4870                         {
4871                           Elf_Internal_Verneed     ivn;
4872                           unsigned long            offset;
4873
4874                           offset = version_info [DT_VERSIONTAGIDX (DT_VERNEED)]
4875                             - loadaddr;
4876
4877                           do
4878                             {
4879                               Elf_Internal_Vernaux   ivna;
4880                               Elf_External_Verneed   evn;
4881                               Elf_External_Vernaux   evna;
4882                               unsigned long          a_off;
4883
4884                               get_data (&evn, file, offset, sizeof (evn),
4885                                         _("version need"));
4886
4887                               ivn.vn_aux  = BYTE_GET (evn.vn_aux);
4888                               ivn.vn_next = BYTE_GET (evn.vn_next);
4889
4890                               a_off = offset + ivn.vn_aux;
4891
4892                               do
4893                                 {
4894                                   get_data (&evna, file, a_off, sizeof (evna),
4895                                             _("version need aux (2)"));
4896
4897                                   ivna.vna_next  = BYTE_GET (evna.vna_next);
4898                                   ivna.vna_other = BYTE_GET (evna.vna_other);
4899
4900                                   a_off += ivna.vna_next;
4901                                 }
4902                               while (ivna.vna_other != data [cnt + j]
4903                                      && ivna.vna_next != 0);
4904
4905                               if (ivna.vna_other == data [cnt + j])
4906                                 {
4907                                   ivna.vna_name = BYTE_GET (evna.vna_name);
4908
4909                                   name = strtab + ivna.vna_name;
4910                                   nn += printf ("(%s%-*s",
4911                                                 name,
4912                                                 12 - (int) strlen (name),
4913                                                 ")");
4914                                   check_def = 0;
4915                                   break;
4916                                 }
4917
4918                               offset += ivn.vn_next;
4919                             }
4920                           while (ivn.vn_next);
4921                         }
4922
4923                       if (check_def && data [cnt + j] != 0x8001
4924                           && version_info [DT_VERSIONTAGIDX (DT_VERDEF)])
4925                         {
4926                           Elf_Internal_Verdef  ivd;
4927                           Elf_External_Verdef  evd;
4928                           unsigned long        offset;
4929
4930                           offset = version_info
4931                             [DT_VERSIONTAGIDX (DT_VERDEF)] - loadaddr;
4932
4933                           do
4934                             {
4935                               get_data (&evd, file, offset, sizeof (evd),
4936                                         _("version def"));
4937
4938                               ivd.vd_next = BYTE_GET (evd.vd_next);
4939                               ivd.vd_ndx  = BYTE_GET (evd.vd_ndx);
4940
4941                               offset += ivd.vd_next;
4942                             }
4943                           while (ivd.vd_ndx != (data [cnt + j] & 0x7fff)
4944                                  && ivd.vd_next != 0);
4945
4946                           if (ivd.vd_ndx == (data [cnt + j] & 0x7fff))
4947                             {
4948                               Elf_External_Verdaux  evda;
4949                               Elf_Internal_Verdaux  ivda;
4950
4951                               ivd.vd_aux = BYTE_GET (evd.vd_aux);
4952
4953                               get_data (&evda, file,
4954                                         offset - ivd.vd_next + ivd.vd_aux,
4955                                         sizeof (evda), _("version def aux"));
4956
4957                               ivda.vda_name = BYTE_GET (evda.vda_name);
4958
4959                               name = strtab + ivda.vda_name;
4960                               nn += printf ("(%s%-*s",
4961                                             name,
4962                                             12 - (int) strlen (name),
4963                                             ")");
4964                             }
4965                         }
4966
4967                       if (nn < 18)
4968                         printf ("%*c", 18 - nn, ' ');
4969                     }
4970
4971                 putchar ('\n');
4972               }
4973
4974             free (data);
4975             free (strtab);
4976             free (symbols);
4977           }
4978           break;
4979
4980         default:
4981           break;
4982         }
4983     }
4984
4985   if (! found)
4986     printf (_("\nNo version information found in this file.\n"));
4987
4988   return 1;
4989 }
4990
4991 static const char *
4992 get_symbol_binding (binding)
4993      unsigned int binding;
4994 {
4995   static char buff [32];
4996
4997   switch (binding)
4998     {
4999     case STB_LOCAL:  return "LOCAL";
5000     case STB_GLOBAL: return "GLOBAL";
5001     case STB_WEAK:   return "WEAK";
5002     default:
5003       if (binding >= STB_LOPROC && binding <= STB_HIPROC)
5004         sprintf (buff, _("<processor specific>: %d"), binding);
5005       else if (binding >= STB_LOOS && binding <= STB_HIOS)
5006         sprintf (buff, _("<OS specific>: %d"), binding);
5007       else
5008         sprintf (buff, _("<unknown>: %d"), binding);
5009       return buff;
5010     }
5011 }
5012
5013 static const char *
5014 get_symbol_type (type)
5015      unsigned int type;
5016 {
5017   static char buff [32];
5018
5019   switch (type)
5020     {
5021     case STT_NOTYPE:   return "NOTYPE";
5022     case STT_OBJECT:   return "OBJECT";
5023     case STT_FUNC:     return "FUNC";
5024     case STT_SECTION:  return "SECTION";
5025     case STT_FILE:     return "FILE";
5026     case STT_COMMON:   return "COMMON";
5027     default:
5028       if (type >= STT_LOPROC && type <= STT_HIPROC)
5029         {
5030           if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
5031             return "THUMB_FUNC";
5032
5033           if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
5034             return "REGISTER";
5035
5036           if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
5037             return "PARISC_MILLI";
5038
5039           sprintf (buff, _("<processor specific>: %d"), type);
5040         }
5041       else if (type >= STT_LOOS && type <= STT_HIOS)
5042         {
5043           if (elf_header.e_machine == EM_PARISC)
5044             {
5045               if (type == STT_HP_OPAQUE)
5046                 return "HP_OPAQUE";
5047               if (type == STT_HP_STUB)
5048                 return "HP_STUB";
5049             }
5050
5051           sprintf (buff, _("<OS specific>: %d"), type);
5052         }
5053       else
5054         sprintf (buff, _("<unknown>: %d"), type);
5055       return buff;
5056     }
5057 }
5058
5059 static const char *
5060 get_symbol_visibility (visibility)
5061      unsigned int visibility;
5062 {
5063   switch (visibility)
5064     {
5065     case STV_DEFAULT:   return "DEFAULT";
5066     case STV_INTERNAL:  return "INTERNAL";
5067     case STV_HIDDEN:    return "HIDDEN";
5068     case STV_PROTECTED: return "PROTECTED";
5069     default: abort ();
5070     }
5071 }
5072
5073 static const char *
5074 get_symbol_index_type (type)
5075      unsigned int type;
5076 {
5077   switch (type)
5078     {
5079     case SHN_UNDEF:  return "UND";
5080     case SHN_ABS:    return "ABS";
5081     case SHN_COMMON: return "COM";
5082     default:
5083       if (type >= SHN_LOPROC && type <= SHN_HIPROC)
5084         return "PRC";
5085       else if (type >= SHN_LORESERVE && type <= SHN_HIRESERVE)
5086         return "RSV";
5087       else if (type >= SHN_LOOS && type <= SHN_HIOS)
5088         return "OS ";
5089       else
5090         {
5091           static char buff [32];
5092
5093           sprintf (buff, "%3d", type);
5094           return buff;
5095         }
5096     }
5097 }
5098
5099 static int *
5100 get_dynamic_data (file, number)
5101      FILE *       file;
5102      unsigned int number;
5103 {
5104   unsigned char * e_data;
5105   int *  i_data;
5106
5107   e_data = (unsigned char *) malloc (number * 4);
5108
5109   if (e_data == NULL)
5110     {
5111       error (_("Out of memory\n"));
5112       return NULL;
5113     }
5114
5115   if (fread (e_data, 4, number, file) != number)
5116     {
5117       error (_("Unable to read in dynamic data\n"));
5118       return NULL;
5119     }
5120
5121   i_data = (int *) malloc (number * sizeof (* i_data));
5122
5123   if (i_data == NULL)
5124     {
5125       error (_("Out of memory\n"));
5126       free (e_data);
5127       return NULL;
5128     }
5129
5130   while (number--)
5131     i_data [number] = byte_get (e_data + number * 4, 4);
5132
5133   free (e_data);
5134
5135   return i_data;
5136 }
5137
5138 /* Dump the symbol table.  */
5139 static int
5140 process_symbol_table (file)
5141      FILE * file;
5142 {
5143   Elf32_Internal_Shdr *   section;
5144   unsigned char   nb [4];
5145   unsigned char   nc [4];
5146   int    nbuckets = 0;
5147   int    nchains = 0;
5148   int *  buckets = NULL;
5149   int *  chains = NULL;
5150
5151   if (! do_syms && !do_histogram)
5152     return 1;
5153
5154   if (dynamic_info[DT_HASH] && ((do_using_dynamic && dynamic_strings != NULL)
5155                                 || do_histogram))
5156     {
5157       if (fseek (file, dynamic_info[DT_HASH] - loadaddr, SEEK_SET))
5158         {
5159           error (_("Unable to seek to start of dynamic information"));
5160           return 0;
5161         }
5162
5163       if (fread (nb, sizeof (nb), 1, file) != 1)
5164         {
5165           error (_("Failed to read in number of buckets\n"));
5166           return 0;
5167         }
5168
5169       if (fread (nc, sizeof (nc), 1, file) != 1)
5170         {
5171           error (_("Failed to read in number of chains\n"));
5172           return 0;
5173         }
5174
5175       nbuckets = byte_get (nb, 4);
5176       nchains  = byte_get (nc, 4);
5177
5178       buckets = get_dynamic_data (file, nbuckets);
5179       chains  = get_dynamic_data (file, nchains);
5180
5181       if (buckets == NULL || chains == NULL)
5182         return 0;
5183     }
5184
5185   if (do_syms
5186       && dynamic_info[DT_HASH] && do_using_dynamic && dynamic_strings != NULL)
5187     {
5188       int    hn;
5189       int    si;
5190
5191       printf (_("\nSymbol table for image:\n"));
5192       if (is_32bit_elf)
5193         printf (_("  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"));
5194       else
5195         printf (_("  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"));
5196
5197       for (hn = 0; hn < nbuckets; hn++)
5198         {
5199           if (! buckets [hn])
5200             continue;
5201
5202           for (si = buckets [hn]; si < nchains && si > 0; si = chains [si])
5203             {
5204               Elf_Internal_Sym * psym;
5205
5206               psym = dynamic_symbols + si;
5207
5208               printf ("  %3d %3d: ", si, hn);
5209               print_vma (psym->st_value, LONG_HEX);
5210               putchar (' ' );
5211               print_vma (psym->st_size, DEC_5);
5212
5213               printf ("  %6s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
5214               printf (" %6s",  get_symbol_binding (ELF_ST_BIND (psym->st_info)));
5215               printf (" %3s",  get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
5216               printf (" %3.3s", get_symbol_index_type (psym->st_shndx));
5217               printf (" %s\n", dynamic_strings + psym->st_name);
5218             }
5219         }
5220     }
5221   else if (do_syms && !do_using_dynamic)
5222     {
5223       unsigned int     i;
5224
5225       for (i = 0, section = section_headers;
5226            i < elf_header.e_shnum;
5227            i++, section++)
5228         {
5229           unsigned int          si;
5230           char *                strtab;
5231           Elf_Internal_Sym *    symtab;
5232           Elf_Internal_Sym *    psym;
5233
5234
5235           if (   section->sh_type != SHT_SYMTAB
5236               && section->sh_type != SHT_DYNSYM)
5237             continue;
5238
5239           printf (_("\nSymbol table '%s' contains %lu entries:\n"),
5240                   SECTION_NAME (section),
5241                   (unsigned long) (section->sh_size / section->sh_entsize));
5242           if (is_32bit_elf)
5243             printf (_("   Num:    Value  Size Type    Bind   Vis      Ndx Name\n"));
5244           else
5245             printf (_("   Num:    Value          Size Type    Bind   Vis      Ndx Name\n"));
5246
5247           symtab = GET_ELF_SYMBOLS (file, section->sh_offset,
5248                                     section->sh_size / section->sh_entsize);
5249           if (symtab == NULL)
5250             continue;
5251
5252           if (section->sh_link == elf_header.e_shstrndx)
5253             strtab = string_table;
5254           else
5255             {
5256               Elf32_Internal_Shdr * string_sec;
5257
5258               string_sec = section_headers + section->sh_link;
5259
5260               strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
5261                                           string_sec->sh_size,
5262                                           _("string table"));
5263             }
5264
5265           for (si = 0, psym = symtab;
5266                si < section->sh_size / section->sh_entsize;
5267                si ++, psym ++)
5268             {
5269               printf ("%6d: ", si);
5270               print_vma (psym->st_value, LONG_HEX);
5271               putchar (' ');
5272               print_vma (psym->st_size, DEC_5);
5273               printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
5274               printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
5275               printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
5276               printf (" %4s", get_symbol_index_type (psym->st_shndx));
5277               printf (" %s", strtab + psym->st_name);
5278
5279               if (section->sh_type == SHT_DYNSYM &&
5280                   version_info [DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
5281                 {
5282                   unsigned char   data[2];
5283                   unsigned short  vers_data;
5284                   unsigned long   offset;
5285                   int             is_nobits;
5286                   int             check_def;
5287
5288                   offset = version_info [DT_VERSIONTAGIDX (DT_VERSYM)]
5289                     - loadaddr;
5290
5291                   get_data (&data, file, offset + si * sizeof (vers_data),
5292                             sizeof (data), _("version data"));
5293
5294                   vers_data = byte_get (data, 2);
5295
5296                   is_nobits = psym->st_shndx < SHN_LORESERVE ?
5297                     (section_headers [psym->st_shndx].sh_type == SHT_NOBITS)
5298                     : 0;
5299
5300                   check_def = (psym->st_shndx != SHN_UNDEF);
5301
5302                   if ((vers_data & 0x8000) || vers_data > 1)
5303                     {
5304                       if (version_info [DT_VERSIONTAGIDX (DT_VERNEED)]
5305                           && (is_nobits || ! check_def))
5306                         {
5307                           Elf_External_Verneed  evn;
5308                           Elf_Internal_Verneed  ivn;
5309                           Elf_Internal_Vernaux  ivna;
5310
5311                           /* We must test both.  */
5312                           offset = version_info
5313                             [DT_VERSIONTAGIDX (DT_VERNEED)] - loadaddr;
5314
5315                           do
5316                             {
5317                               unsigned long  vna_off;
5318
5319                               get_data (&evn, file, offset, sizeof (evn),
5320                                         _("version need"));
5321
5322                               ivn.vn_aux  = BYTE_GET (evn.vn_aux);
5323                               ivn.vn_next = BYTE_GET (evn.vn_next);
5324
5325                               vna_off = offset + ivn.vn_aux;
5326
5327                               do
5328                                 {
5329                                   Elf_External_Vernaux  evna;
5330
5331                                   get_data (&evna, file, vna_off,
5332                                             sizeof (evna),
5333                                             _("version need aux (3)"));
5334
5335                                   ivna.vna_other = BYTE_GET (evna.vna_other);
5336                                   ivna.vna_next  = BYTE_GET (evna.vna_next);
5337                                   ivna.vna_name  = BYTE_GET (evna.vna_name);
5338
5339                                   vna_off += ivna.vna_next;
5340                                 }
5341                               while (ivna.vna_other != vers_data
5342                                      && ivna.vna_next != 0);
5343
5344                               if (ivna.vna_other == vers_data)
5345                                 break;
5346
5347                               offset += ivn.vn_next;
5348                             }
5349                           while (ivn.vn_next != 0);
5350
5351                           if (ivna.vna_other == vers_data)
5352                             {
5353                               printf ("@%s (%d)",
5354                                       strtab + ivna.vna_name, ivna.vna_other);
5355                               check_def = 0;
5356                             }
5357                           else if (! is_nobits)
5358                             error (_("bad dynamic symbol"));
5359                           else
5360                             check_def = 1;
5361                         }
5362
5363                       if (check_def)
5364                         {
5365                           if (vers_data != 0x8001
5366                               && version_info [DT_VERSIONTAGIDX (DT_VERDEF)])
5367                             {
5368                               Elf_Internal_Verdef     ivd;
5369                               Elf_Internal_Verdaux    ivda;
5370                               Elf_External_Verdaux  evda;
5371                               unsigned long           offset;
5372
5373                               offset =
5374                                 version_info [DT_VERSIONTAGIDX (DT_VERDEF)]
5375                                 - loadaddr;
5376
5377                               do
5378                                 {
5379                                   Elf_External_Verdef   evd;
5380
5381                                   get_data (&evd, file, offset, sizeof (evd),
5382                                             _("version def"));
5383
5384                                   ivd.vd_ndx  = BYTE_GET (evd.vd_ndx);
5385                                   ivd.vd_aux  = BYTE_GET (evd.vd_aux);
5386                                   ivd.vd_next = BYTE_GET (evd.vd_next);
5387
5388                                   offset += ivd.vd_next;
5389                                 }
5390                               while (ivd.vd_ndx != (vers_data & 0x7fff)
5391                                      && ivd.vd_next != 0);
5392
5393                               offset -= ivd.vd_next;
5394                               offset += ivd.vd_aux;
5395
5396                               get_data (&evda, file, offset, sizeof (evda),
5397                                         _("version def aux"));
5398
5399                               ivda.vda_name = BYTE_GET (evda.vda_name);
5400
5401                               if (psym->st_name != ivda.vda_name)
5402                                 printf ((vers_data & 0x8000)
5403                                         ? "@%s" : "@@%s",
5404                                         strtab + ivda.vda_name);
5405                             }
5406                         }
5407                     }
5408                 }
5409
5410               putchar ('\n');
5411             }
5412
5413           free (symtab);
5414           if (strtab != string_table)
5415             free (strtab);
5416         }
5417     }
5418   else if (do_syms)
5419     printf
5420       (_("\nDynamic symbol information is not available for displaying symbols.\n"));
5421
5422   if (do_histogram && buckets != NULL)
5423     {
5424       int * lengths;
5425       int * counts;
5426       int   hn;
5427       int   si;
5428       int   maxlength = 0;
5429       int   nzero_counts = 0;
5430       int   nsyms = 0;
5431
5432       printf (_("\nHistogram for bucket list length (total of %d buckets):\n"),
5433               nbuckets);
5434       printf (_(" Length  Number     %% of total  Coverage\n"));
5435
5436       lengths = (int *) calloc (nbuckets, sizeof (int));
5437       if (lengths == NULL)
5438         {
5439           error (_("Out of memory"));
5440           return 0;
5441         }
5442       for (hn = 0; hn < nbuckets; ++hn)
5443         {
5444           if (! buckets [hn])
5445             continue;
5446
5447           for (si = buckets[hn]; si > 0 && si < nchains; si = chains[si])
5448             {
5449               ++ nsyms;
5450               if (maxlength < ++lengths[hn])
5451                 ++ maxlength;
5452             }
5453         }
5454
5455       counts = (int *) calloc (maxlength + 1, sizeof (int));
5456       if (counts == NULL)
5457         {
5458           error (_("Out of memory"));
5459           return 0;
5460         }
5461
5462       for (hn = 0; hn < nbuckets; ++hn)
5463         ++ counts [lengths [hn]];
5464
5465       if (nbuckets > 0)
5466         {
5467           printf ("      0  %-10d (%5.1f%%)\n",
5468                   counts[0], (counts[0] * 100.0) / nbuckets);
5469           for (si = 1; si <= maxlength; ++si)
5470             {
5471               nzero_counts += counts[si] * si;
5472               printf ("%7d  %-10d (%5.1f%%)    %5.1f%%\n",
5473                       si, counts[si], (counts[si] * 100.0) / nbuckets,
5474                       (nzero_counts * 100.0) / nsyms);
5475             }
5476         }
5477
5478       free (counts);
5479       free (lengths);
5480     }
5481
5482   if (buckets != NULL)
5483     {
5484       free (buckets);
5485       free (chains);
5486     }
5487
5488   return 1;
5489 }
5490
5491 static int
5492 process_syminfo (file)
5493      FILE * file ATTRIBUTE_UNUSED;
5494 {
5495   unsigned int i;
5496
5497   if (dynamic_syminfo == NULL
5498       || !do_dynamic)
5499     /* No syminfo, this is ok.  */
5500     return 1;
5501
5502   /* There better should be a dynamic symbol section.  */
5503   if (dynamic_symbols == NULL || dynamic_strings == NULL)
5504     return 0;
5505
5506   if (dynamic_addr)
5507     printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
5508             dynamic_syminfo_offset, dynamic_syminfo_nent);
5509
5510   printf (_(" Num: Name                           BoundTo     Flags\n"));
5511   for (i = 0; i < dynamic_syminfo_nent; ++i)
5512     {
5513       unsigned short int flags = dynamic_syminfo[i].si_flags;
5514
5515       printf ("%4d: %-30s ", i,
5516               dynamic_strings + dynamic_symbols[i].st_name);
5517
5518       switch (dynamic_syminfo[i].si_boundto)
5519         {
5520         case SYMINFO_BT_SELF:
5521           fputs ("SELF       ", stdout);
5522           break;
5523         case SYMINFO_BT_PARENT:
5524           fputs ("PARENT     ", stdout);
5525           break;
5526         default:
5527           if (dynamic_syminfo[i].si_boundto > 0
5528               && dynamic_syminfo[i].si_boundto < dynamic_size)
5529             printf ("%-10s ",
5530                     dynamic_strings
5531                     + dynamic_segment[dynamic_syminfo[i].si_boundto].d_un.d_val);
5532           else
5533             printf ("%-10d ", dynamic_syminfo[i].si_boundto);
5534           break;
5535         }
5536
5537       if (flags & SYMINFO_FLG_DIRECT)
5538         printf (" DIRECT");
5539       if (flags & SYMINFO_FLG_PASSTHRU)
5540         printf (" PASSTHRU");
5541       if (flags & SYMINFO_FLG_COPY)
5542         printf (" COPY");
5543       if (flags & SYMINFO_FLG_LAZYLOAD)
5544         printf (" LAZYLOAD");
5545
5546       puts ("");
5547     }
5548
5549   return 1;
5550 }
5551
5552 #ifdef SUPPORT_DISASSEMBLY
5553 static void
5554 disassemble_section (section, file)
5555      Elf32_Internal_Shdr * section;
5556      FILE * file;
5557 {
5558   printf (_("\nAssembly dump of section %s\n"),
5559           SECTION_NAME (section));
5560
5561   /* XXX -- to be done --- XXX */
5562
5563   return 1;
5564 }
5565 #endif
5566
5567 static int
5568 dump_section (section, file)
5569      Elf32_Internal_Shdr * section;
5570      FILE * file;
5571 {
5572   bfd_size_type   bytes;
5573   bfd_vma         addr;
5574   unsigned char * data;
5575   unsigned char * start;
5576
5577   bytes = section->sh_size;
5578
5579   if (bytes == 0)
5580     {
5581       printf (_("\nSection '%s' has no data to dump.\n"),
5582               SECTION_NAME (section));
5583       return 0;
5584     }
5585   else
5586     printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section));
5587
5588   addr = section->sh_addr;
5589
5590   start = (unsigned char *) get_data (NULL, file, section->sh_offset, bytes,
5591                                       _("section data"));
5592   if (!start)
5593     return 0;
5594
5595   data = start;
5596
5597   while (bytes)
5598     {
5599       int j;
5600       int k;
5601       int lbytes;
5602
5603       lbytes = (bytes > 16 ? 16 : bytes);
5604
5605       printf ("  0x%8.8lx ", (unsigned long) addr);
5606
5607       switch (elf_header.e_ident [EI_DATA])
5608         {
5609         default:
5610         case ELFDATA2LSB:
5611           for (j = 15; j >= 0; j --)
5612             {
5613               if (j < lbytes)
5614                 printf ("%2.2x", data [j]);
5615               else
5616                 printf ("  ");
5617
5618               if (!(j & 0x3))
5619                 printf (" ");
5620             }
5621           break;
5622
5623         case ELFDATA2MSB:
5624           for (j = 0; j < 16; j++)
5625             {
5626               if (j < lbytes)
5627                 printf ("%2.2x", data [j]);
5628               else
5629                 printf ("  ");
5630
5631               if ((j & 3) == 3)
5632                 printf (" ");
5633             }
5634           break;
5635         }
5636
5637       for (j = 0; j < lbytes; j++)
5638         {
5639           k = data [j];
5640           if (k >= ' ' && k < 0x80)
5641             printf ("%c", k);
5642           else
5643             printf (".");
5644         }
5645
5646       putchar ('\n');
5647
5648       data  += lbytes;
5649       addr  += lbytes;
5650       bytes -= lbytes;
5651     }
5652
5653   free (start);
5654
5655   return 1;
5656 }
5657
5658
5659 static unsigned long int
5660 read_leb128 (data, length_return, sign)
5661      unsigned char * data;
5662      int *           length_return;
5663      int             sign;
5664 {
5665   unsigned long int result = 0;
5666   unsigned int      num_read = 0;
5667   int               shift = 0;
5668   unsigned char     byte;
5669
5670   do
5671     {
5672       byte = * data ++;
5673       num_read ++;
5674
5675       result |= (byte & 0x7f) << shift;
5676
5677       shift += 7;
5678
5679     }
5680   while (byte & 0x80);
5681
5682   if (length_return != NULL)
5683     * length_return = num_read;
5684
5685   if (sign && (shift < 32) && (byte & 0x40))
5686     result |= -1 << shift;
5687
5688   return result;
5689 }
5690
5691 typedef struct State_Machine_Registers
5692 {
5693   unsigned long address;
5694   unsigned int  file;
5695   unsigned int  line;
5696   unsigned int  column;
5697   int           is_stmt;
5698   int           basic_block;
5699   int           end_sequence;
5700 /* This variable hold the number of the last entry seen
5701    in the File Table.  */
5702   unsigned int  last_file_entry;
5703 } SMR;
5704
5705 static SMR state_machine_regs;
5706
5707 static void
5708 reset_state_machine (is_stmt)
5709      int is_stmt;
5710 {
5711   state_machine_regs.address = 0;
5712   state_machine_regs.file = 1;
5713   state_machine_regs.line = 1;
5714   state_machine_regs.column = 0;
5715   state_machine_regs.is_stmt = is_stmt;
5716   state_machine_regs.basic_block = 0;
5717   state_machine_regs.end_sequence = 0;
5718   state_machine_regs.last_file_entry = 0;
5719 }
5720
5721 /* Handled an extend line op.  Returns true if this is the end
5722    of sequence.  */
5723 static int
5724 process_extended_line_op (data, is_stmt, pointer_size)
5725      unsigned char * data;
5726      int is_stmt;
5727      int pointer_size;
5728 {
5729   unsigned char   op_code;
5730   int             bytes_read;
5731   unsigned int    len;
5732   unsigned char * name;
5733   unsigned long   adr;
5734
5735   len = read_leb128 (data, & bytes_read, 0);
5736   data += bytes_read;
5737
5738   if (len == 0)
5739     {
5740       warn (_("badly formed extended line op encountered!\n"));
5741       return bytes_read;
5742     }
5743
5744   len += bytes_read;
5745   op_code = * data ++;
5746
5747   printf (_("  Extended opcode %d: "), op_code);
5748
5749   switch (op_code)
5750     {
5751     case DW_LNE_end_sequence:
5752       printf (_("End of Sequence\n\n"));
5753       reset_state_machine (is_stmt);
5754       break;
5755
5756     case DW_LNE_set_address:
5757       adr = byte_get (data, pointer_size);
5758       printf (_("set Address to 0x%lx\n"), adr);
5759       state_machine_regs.address = adr;
5760       break;
5761
5762     case DW_LNE_define_file:
5763       printf (_("  define new File Table entry\n"));
5764       printf (_("  Entry\tDir\tTime\tSize\tName\n"));
5765
5766       printf (_("   %d\t"), ++ state_machine_regs.last_file_entry);
5767       name = data;
5768       data += strlen ((char *) data) + 1;
5769       printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5770       data += bytes_read;
5771       printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5772       data += bytes_read;
5773       printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5774       printf (_("%s\n\n"), name);
5775       break;
5776
5777     default:
5778       printf (_("UNKNOWN: length %d\n"), len - bytes_read);
5779       break;
5780     }
5781
5782   return len;
5783 }
5784
5785 /* Size of pointers in the .debug_line section.  This information is not
5786    really present in that section.  It's obtained before dumping the debug
5787    sections by doing some pre-scan of the .debug_info section.  */
5788 static int debug_line_pointer_size = 4;
5789
5790 static int
5791 display_debug_lines (section, start, file)
5792      Elf32_Internal_Shdr * section;
5793      unsigned char *       start;
5794      FILE *                file ATTRIBUTE_UNUSED;
5795 {
5796   DWARF2_External_LineInfo * external;
5797   DWARF2_Internal_LineInfo   info;
5798   unsigned char *            standard_opcodes;
5799   unsigned char *            data = start;
5800   unsigned char *            end  = start + section->sh_size;
5801   unsigned char *            end_of_sequence;
5802   int                        i;
5803
5804   printf (_("\nDump of debug contents of section %s:\n\n"),
5805           SECTION_NAME (section));
5806
5807   while (data < end)
5808     {
5809       external = (DWARF2_External_LineInfo *) data;
5810
5811       /* Check the length of the block.  */
5812       info.li_length = BYTE_GET (external->li_length);
5813
5814       if (info.li_length == 0xffffffff)
5815         {
5816           warn (_("64-bit DWARF line info is not supported yet.\n"));
5817           break;
5818         }
5819
5820       if (info.li_length + sizeof (external->li_length) > section->sh_size)
5821         {
5822           warn
5823             (_("The line info appears to be corrupt - the section is too small\n"));
5824           return 0;
5825         }
5826
5827       /* Check its version number.  */
5828       info.li_version = BYTE_GET (external->li_version);
5829       if (info.li_version != 2)
5830         {
5831           warn (_("Only DWARF version 2 line info is currently supported.\n"));
5832           return 0;
5833         }
5834
5835       info.li_prologue_length = BYTE_GET (external->li_prologue_length);
5836       info.li_min_insn_length = BYTE_GET (external->li_min_insn_length);
5837       info.li_default_is_stmt = BYTE_GET (external->li_default_is_stmt);
5838       info.li_line_base       = BYTE_GET (external->li_line_base);
5839       info.li_line_range      = BYTE_GET (external->li_line_range);
5840       info.li_opcode_base     = BYTE_GET (external->li_opcode_base);
5841
5842       /* Sign extend the line base field.  */
5843       info.li_line_base <<= 24;
5844       info.li_line_base >>= 24;
5845
5846       printf (_("  Length:                      %ld\n"), info.li_length);
5847       printf (_("  DWARF Version:               %d\n"), info.li_version);
5848       printf (_("  Prologue Length:             %d\n"), info.li_prologue_length);
5849       printf (_("  Minimum Instruction Length:  %d\n"), info.li_min_insn_length);
5850       printf (_("  Initial value of 'is_stmt':  %d\n"), info.li_default_is_stmt);
5851       printf (_("  Line Base:                   %d\n"), info.li_line_base);
5852       printf (_("  Line Range:                  %d\n"), info.li_line_range);
5853       printf (_("  Opcode Base:                 %d\n"), info.li_opcode_base);
5854
5855       end_of_sequence = data + info.li_length + sizeof (external->li_length);
5856
5857       reset_state_machine (info.li_default_is_stmt);
5858
5859       /* Display the contents of the Opcodes table.  */
5860       standard_opcodes = data + sizeof (* external);
5861
5862       printf (_("\n Opcodes:\n"));
5863
5864       for (i = 1; i < info.li_opcode_base; i++)
5865         printf (_("  Opcode %d has %d args\n"), i, standard_opcodes[i - 1]);
5866
5867       /* Display the contents of the Directory table.  */
5868       data = standard_opcodes + info.li_opcode_base - 1;
5869
5870       if (* data == 0)
5871         printf (_("\n The Directory Table is empty.\n"));
5872       else
5873         {
5874           printf (_("\n The Directory Table:\n"));
5875
5876           while (* data != 0)
5877             {
5878               printf (_("  %s\n"), data);
5879
5880               data += strlen ((char *) data) + 1;
5881             }
5882         }
5883
5884       /* Skip the NUL at the end of the table.  */
5885       data ++;
5886
5887       /* Display the contents of the File Name table.  */
5888       if (* data == 0)
5889         printf (_("\n The File Name Table is empty.\n"));
5890       else
5891         {
5892           printf (_("\n The File Name Table:\n"));
5893           printf (_("  Entry\tDir\tTime\tSize\tName\n"));
5894
5895           while (* data != 0)
5896             {
5897               unsigned char * name;
5898               int bytes_read;
5899
5900               printf (_("  %d\t"), ++ state_machine_regs.last_file_entry);
5901               name = data;
5902
5903               data += strlen ((char *) data) + 1;
5904
5905               printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5906               data += bytes_read;
5907               printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5908               data += bytes_read;
5909               printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5910               data += bytes_read;
5911               printf (_("%s\n"), name);
5912             }
5913         }
5914
5915       /* Skip the NUL at the end of the table.  */
5916       data ++;
5917
5918       /* Now display the statements.  */
5919       printf (_("\n Line Number Statements:\n"));
5920
5921
5922       while (data < end_of_sequence)
5923         {
5924           unsigned char op_code;
5925           int           adv;
5926           int           bytes_read;
5927
5928           op_code = * data ++;
5929
5930           if (op_code >= info.li_opcode_base)
5931             {
5932               op_code -= info.li_opcode_base;
5933               adv      = (op_code / info.li_line_range) * info.li_min_insn_length;
5934               state_machine_regs.address += adv;
5935               printf (_("  Special opcode %d: advance Address by %d to 0x%lx"),
5936                       op_code, adv, state_machine_regs.address);
5937               adv = (op_code % info.li_line_range) + info.li_line_base;
5938               state_machine_regs.line += adv;
5939               printf (_(" and Line by %d to %d\n"),
5940                       adv, state_machine_regs.line);
5941             } 
5942           else switch (op_code) 
5943             {
5944             case DW_LNS_extended_op:
5945               data += process_extended_line_op (data, info.li_default_is_stmt,
5946                                                 debug_line_pointer_size);
5947               break;
5948
5949             case DW_LNS_copy:
5950               printf (_("  Copy\n"));
5951               break;
5952
5953             case DW_LNS_advance_pc:
5954               adv = info.li_min_insn_length * read_leb128 (data, & bytes_read, 0);
5955               data += bytes_read;
5956               state_machine_regs.address += adv;
5957               printf (_("  Advance PC by %d to %lx\n"), adv,
5958                       state_machine_regs.address);
5959               break;
5960
5961             case DW_LNS_advance_line:
5962               adv = read_leb128 (data, & bytes_read, 1);
5963               data += bytes_read;
5964               state_machine_regs.line += adv;
5965               printf (_("  Advance Line by %d to %d\n"), adv,
5966                       state_machine_regs.line);
5967               break;
5968
5969             case DW_LNS_set_file:
5970               adv = read_leb128 (data, & bytes_read, 0);
5971               data += bytes_read;
5972               printf (_("  Set File Name to entry %d in the File Name Table\n"),
5973                       adv);
5974               state_machine_regs.file = adv;
5975               break;
5976
5977             case DW_LNS_set_column:
5978               adv = read_leb128 (data, & bytes_read, 0);
5979               data += bytes_read;
5980               printf (_("  Set column to %d\n"), adv);
5981               state_machine_regs.column = adv;
5982               break;
5983
5984             case DW_LNS_negate_stmt:
5985               adv = state_machine_regs.is_stmt;
5986               adv = ! adv;
5987               printf (_("  Set is_stmt to %d\n"), adv);
5988               state_machine_regs.is_stmt = adv;
5989               break;
5990
5991             case DW_LNS_set_basic_block:
5992               printf (_("  Set basic block\n"));
5993               state_machine_regs.basic_block = 1;
5994               break;
5995
5996             case DW_LNS_const_add_pc:
5997               adv = (((255 - info.li_opcode_base) / info.li_line_range)
5998                      * info.li_min_insn_length);
5999               state_machine_regs.address += adv;
6000               printf (_("  Advance PC by constant %d to 0x%lx\n"), adv,
6001                       state_machine_regs.address);
6002               break;
6003
6004             case DW_LNS_fixed_advance_pc:
6005               adv = byte_get (data, 2);
6006               data += 2;
6007               state_machine_regs.address += adv;
6008               printf (_("  Advance PC by fixed size amount %d to 0x%lx\n"),
6009                       adv, state_machine_regs.address);
6010               break;
6011
6012             case DW_LNS_set_prologue_end:
6013               printf (_("  Set prologue_end to true\n"));
6014               break;
6015               
6016             case DW_LNS_set_epilogue_begin:
6017               printf (_("  Set epilogue_begin to true\n"));
6018               break;
6019               
6020             case DW_LNS_set_isa:
6021               adv = read_leb128 (data, & bytes_read, 0);
6022               data += bytes_read;
6023               printf (_("  Set ISA to %d\n"), adv);
6024               break;
6025               
6026             default:
6027               printf (_("  Unknown opcode %d with operands: "), op_code);
6028               {
6029                 int i;
6030                 for (i = standard_opcodes[op_code - 1]; i > 0 ; --i)
6031                   {
6032                     printf ("0x%lx%s", read_leb128 (data, &bytes_read, 0),
6033                             i == 1 ? "" : ", ");
6034                     data += bytes_read;
6035                   }
6036                 putchar ('\n');
6037               }
6038               break;
6039             }
6040         }
6041       putchar ('\n');
6042     }
6043
6044   return 1;
6045 }
6046
6047 static int
6048 display_debug_pubnames (section, start, file)
6049      Elf32_Internal_Shdr * section;
6050      unsigned char *       start;
6051      FILE *                file ATTRIBUTE_UNUSED;
6052 {
6053   DWARF2_External_PubNames * external;
6054   DWARF2_Internal_PubNames   pubnames;
6055   unsigned char *            end;
6056
6057   end = start + section->sh_size;
6058
6059   printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
6060
6061   while (start < end)
6062     {
6063       unsigned char * data;
6064       unsigned long   offset;
6065
6066       external = (DWARF2_External_PubNames *) start;
6067
6068       pubnames.pn_length  = BYTE_GET (external->pn_length);
6069       pubnames.pn_version = BYTE_GET (external->pn_version);
6070       pubnames.pn_offset  = BYTE_GET (external->pn_offset);
6071       pubnames.pn_size    = BYTE_GET (external->pn_size);
6072
6073       data   = start + sizeof (* external);
6074       start += pubnames.pn_length + sizeof (external->pn_length);
6075
6076       if (pubnames.pn_length == 0xffffffff)
6077         {
6078           warn (_("64-bit DWARF pubnames are not supported yet.\n"));
6079           break;
6080         }
6081
6082       if (pubnames.pn_version != 2)
6083         {
6084           static int warned = 0;
6085
6086           if (! warned)
6087             {
6088               warn (_("Only DWARF 2 pubnames are currently supported\n"));
6089               warned = 1;
6090             }
6091
6092           continue;
6093         }
6094
6095       printf (_("  Length:                              %ld\n"),
6096               pubnames.pn_length);
6097       printf (_("  Version:                             %d\n"),
6098               pubnames.pn_version);
6099       printf (_("  Offset into .debug_info section:     %ld\n"),
6100               pubnames.pn_offset);
6101       printf (_("  Size of area in .debug_info section: %ld\n"),
6102               pubnames.pn_size);
6103
6104       printf (_("\n    Offset\tName\n"));
6105
6106       do
6107         {
6108           offset = byte_get (data, 4);
6109
6110           if (offset != 0)
6111             {
6112               data += 4;
6113               printf ("    %ld\t\t%s\n", offset, data);
6114               data += strlen ((char *) data) + 1;
6115             }
6116         }
6117       while (offset != 0);
6118     }
6119
6120   printf ("\n");
6121   return 1;
6122 }
6123
6124 static char *
6125 get_TAG_name (tag)
6126      unsigned long tag;
6127 {
6128   switch (tag)
6129     {
6130     case DW_TAG_padding:                return "DW_TAG_padding";
6131     case DW_TAG_array_type:             return "DW_TAG_array_type";
6132     case DW_TAG_class_type:             return "DW_TAG_class_type";
6133     case DW_TAG_entry_point:            return "DW_TAG_entry_point";
6134     case DW_TAG_enumeration_type:       return "DW_TAG_enumeration_type";
6135     case DW_TAG_formal_parameter:       return "DW_TAG_formal_parameter";
6136     case DW_TAG_imported_declaration:   return "DW_TAG_imported_declaration";
6137     case DW_TAG_label:                  return "DW_TAG_label";
6138     case DW_TAG_lexical_block:          return "DW_TAG_lexical_block";
6139     case DW_TAG_member:                 return "DW_TAG_member";
6140     case DW_TAG_pointer_type:           return "DW_TAG_pointer_type";
6141     case DW_TAG_reference_type:         return "DW_TAG_reference_type";
6142     case DW_TAG_compile_unit:           return "DW_TAG_compile_unit";
6143     case DW_TAG_string_type:            return "DW_TAG_string_type";
6144     case DW_TAG_structure_type:         return "DW_TAG_structure_type";
6145     case DW_TAG_subroutine_type:        return "DW_TAG_subroutine_type";
6146     case DW_TAG_typedef:                return "DW_TAG_typedef";
6147     case DW_TAG_union_type:             return "DW_TAG_union_type";
6148     case DW_TAG_unspecified_parameters: return "DW_TAG_unspecified_parameters";
6149     case DW_TAG_variant:                return "DW_TAG_variant";
6150     case DW_TAG_common_block:           return "DW_TAG_common_block";
6151     case DW_TAG_common_inclusion:       return "DW_TAG_common_inclusion";
6152     case DW_TAG_inheritance:            return "DW_TAG_inheritance";
6153     case DW_TAG_inlined_subroutine:     return "DW_TAG_inlined_subroutine";
6154     case DW_TAG_module:                 return "DW_TAG_module";
6155     case DW_TAG_ptr_to_member_type:     return "DW_TAG_ptr_to_member_type";
6156     case DW_TAG_set_type:               return "DW_TAG_set_type";
6157     case DW_TAG_subrange_type:          return "DW_TAG_subrange_type";
6158     case DW_TAG_with_stmt:              return "DW_TAG_with_stmt";
6159     case DW_TAG_access_declaration:     return "DW_TAG_access_declaration";
6160     case DW_TAG_base_type:              return "DW_TAG_base_type";
6161     case DW_TAG_catch_block:            return "DW_TAG_catch_block";
6162     case DW_TAG_const_type:             return "DW_TAG_const_type";
6163     case DW_TAG_constant:               return "DW_TAG_constant";
6164     case DW_TAG_enumerator:             return "DW_TAG_enumerator";
6165     case DW_TAG_file_type:              return "DW_TAG_file_type";
6166     case DW_TAG_friend:                 return "DW_TAG_friend";
6167     case DW_TAG_namelist:               return "DW_TAG_namelist";
6168     case DW_TAG_namelist_item:          return "DW_TAG_namelist_item";
6169     case DW_TAG_packed_type:            return "DW_TAG_packed_type";
6170     case DW_TAG_subprogram:             return "DW_TAG_subprogram";
6171     case DW_TAG_template_type_param:    return "DW_TAG_template_type_param";
6172     case DW_TAG_template_value_param:   return "DW_TAG_template_value_param";
6173     case DW_TAG_thrown_type:            return "DW_TAG_thrown_type";
6174     case DW_TAG_try_block:              return "DW_TAG_try_block";
6175     case DW_TAG_variant_part:           return "DW_TAG_variant_part";
6176     case DW_TAG_variable:               return "DW_TAG_variable";
6177     case DW_TAG_volatile_type:          return "DW_TAG_volatile_type";
6178     case DW_TAG_MIPS_loop:              return "DW_TAG_MIPS_loop";
6179     case DW_TAG_format_label:           return "DW_TAG_format_label";
6180     case DW_TAG_function_template:      return "DW_TAG_function_template";
6181     case DW_TAG_class_template:         return "DW_TAG_class_template";
6182       /* DWARF 2.1 values.  */
6183     case DW_TAG_dwarf_procedure:        return "DW_TAG_dwarf_procedure";
6184     case DW_TAG_restrict_type:          return "DW_TAG_restrict_type";
6185     case DW_TAG_interface_type:         return "DW_TAG_interface_type";
6186     case DW_TAG_namespace:              return "DW_TAG_namespace";
6187     case DW_TAG_imported_module:        return "DW_TAG_imported_module";
6188     case DW_TAG_unspecified_type:       return "DW_TAG_unspecified_type";
6189     case DW_TAG_partial_unit:           return "DW_TAG_partial_unit";
6190     case DW_TAG_imported_unit:          return "DW_TAG_imported_unit";
6191     default:
6192       {
6193         static char buffer [100];
6194
6195         sprintf (buffer, _("Unknown TAG value: %lx"), tag);
6196         return buffer;
6197       }
6198     }
6199 }
6200
6201 static char *
6202 get_AT_name (attribute)
6203      unsigned long attribute;
6204 {
6205   switch (attribute)
6206     {
6207     case DW_AT_sibling:              return "DW_AT_sibling";
6208     case DW_AT_location:             return "DW_AT_location";
6209     case DW_AT_name:                 return "DW_AT_name";
6210     case DW_AT_ordering:             return "DW_AT_ordering";
6211     case DW_AT_subscr_data:          return "DW_AT_subscr_data";
6212     case DW_AT_byte_size:            return "DW_AT_byte_size";
6213     case DW_AT_bit_offset:           return "DW_AT_bit_offset";
6214     case DW_AT_bit_size:             return "DW_AT_bit_size";
6215     case DW_AT_element_list:         return "DW_AT_element_list";
6216     case DW_AT_stmt_list:            return "DW_AT_stmt_list";
6217     case DW_AT_low_pc:               return "DW_AT_low_pc";
6218     case DW_AT_high_pc:              return "DW_AT_high_pc";
6219     case DW_AT_language:             return "DW_AT_language";
6220     case DW_AT_member:               return "DW_AT_member";
6221     case DW_AT_discr:                return "DW_AT_discr";
6222     case DW_AT_discr_value:          return "DW_AT_discr_value";
6223     case DW_AT_visibility:           return "DW_AT_visibility";
6224     case DW_AT_import:               return "DW_AT_import";
6225     case DW_AT_string_length:        return "DW_AT_string_length";
6226     case DW_AT_common_reference:     return "DW_AT_common_reference";
6227     case DW_AT_comp_dir:             return "DW_AT_comp_dir";
6228     case DW_AT_const_value:          return "DW_AT_const_value";
6229     case DW_AT_containing_type:      return "DW_AT_containing_type";
6230     case DW_AT_default_value:        return "DW_AT_default_value";
6231     case DW_AT_inline:               return "DW_AT_inline";
6232     case DW_AT_is_optional:          return "DW_AT_is_optional";
6233     case DW_AT_lower_bound:          return "DW_AT_lower_bound";
6234     case DW_AT_producer:             return "DW_AT_producer";
6235     case DW_AT_prototyped:           return "DW_AT_prototyped";
6236     case DW_AT_return_addr:          return "DW_AT_return_addr";
6237     case DW_AT_start_scope:          return "DW_AT_start_scope";
6238     case DW_AT_stride_size:          return "DW_AT_stride_size";
6239     case DW_AT_upper_bound:          return "DW_AT_upper_bound";
6240     case DW_AT_abstract_origin:      return "DW_AT_abstract_origin";
6241     case DW_AT_accessibility:        return "DW_AT_accessibility";
6242     case DW_AT_address_class:        return "DW_AT_address_class";
6243     case DW_AT_artificial:           return "DW_AT_artificial";
6244     case DW_AT_base_types:           return "DW_AT_base_types";
6245     case DW_AT_calling_convention:   return "DW_AT_calling_convention";
6246     case DW_AT_count:                return "DW_AT_count";
6247     case DW_AT_data_member_location: return "DW_AT_data_member_location";
6248     case DW_AT_decl_column:          return "DW_AT_decl_column";
6249     case DW_AT_decl_file:            return "DW_AT_decl_file";
6250     case DW_AT_decl_line:            return "DW_AT_decl_line";
6251     case DW_AT_declaration:          return "DW_AT_declaration";
6252     case DW_AT_discr_list:           return "DW_AT_discr_list";
6253     case DW_AT_encoding:             return "DW_AT_encoding";
6254     case DW_AT_external:             return "DW_AT_external";
6255     case DW_AT_frame_base:           return "DW_AT_frame_base";
6256     case DW_AT_friend:               return "DW_AT_friend";
6257     case DW_AT_identifier_case:      return "DW_AT_identifier_case";
6258     case DW_AT_macro_info:           return "DW_AT_macro_info";
6259     case DW_AT_namelist_items:       return "DW_AT_namelist_items";
6260     case DW_AT_priority:             return "DW_AT_priority";
6261     case DW_AT_segment:              return "DW_AT_segment";
6262     case DW_AT_specification:        return "DW_AT_specification";
6263     case DW_AT_static_link:          return "DW_AT_static_link";
6264     case DW_AT_type:                 return "DW_AT_type";
6265     case DW_AT_use_location:         return "DW_AT_use_location";
6266     case DW_AT_variable_parameter:   return "DW_AT_variable_parameter";
6267     case DW_AT_virtuality:           return "DW_AT_virtuality";
6268     case DW_AT_vtable_elem_location: return "DW_AT_vtable_elem_location";
6269       /* DWARF 2.1 values.  */
6270     case DW_AT_allocated:            return "DW_AT_allocated";
6271     case DW_AT_associated:           return "DW_AT_associated";
6272     case DW_AT_data_location:        return "DW_AT_data_location";
6273     case DW_AT_stride:               return "DW_AT_stride";
6274     case DW_AT_entry_pc:             return "DW_AT_entry_pc";
6275     case DW_AT_use_UTF8:             return "DW_AT_use_UTF8";
6276     case DW_AT_extension:            return "DW_AT_extension";
6277     case DW_AT_ranges:               return "DW_AT_ranges";
6278     case DW_AT_trampoline:           return "DW_AT_trampoline";
6279     case DW_AT_call_column:          return "DW_AT_call_column";
6280     case DW_AT_call_file:            return "DW_AT_call_file";
6281     case DW_AT_call_line:            return "DW_AT_call_line";
6282       /* SGI/MIPS extensions.  */
6283     case DW_AT_MIPS_fde:             return "DW_AT_MIPS_fde";
6284     case DW_AT_MIPS_loop_begin:      return "DW_AT_MIPS_loop_begin";
6285     case DW_AT_MIPS_tail_loop_begin: return "DW_AT_MIPS_tail_loop_begin";
6286     case DW_AT_MIPS_epilog_begin:    return "DW_AT_MIPS_epilog_begin";
6287     case DW_AT_MIPS_loop_unroll_factor: return "DW_AT_MIPS_loop_unroll_factor";
6288     case DW_AT_MIPS_software_pipeline_depth: return "DW_AT_MIPS_software_pipeline_depth";
6289     case DW_AT_MIPS_linkage_name:    return "DW_AT_MIPS_linkage_name";
6290     case DW_AT_MIPS_stride:          return "DW_AT_MIPS_stride";
6291     case DW_AT_MIPS_abstract_name:   return "DW_AT_MIPS_abstract_name";
6292     case DW_AT_MIPS_clone_origin:    return "DW_AT_MIPS_clone_origin";
6293     case DW_AT_MIPS_has_inlines:     return "DW_AT_MIPS_has_inlines";
6294       /* GNU extensions.  */
6295     case DW_AT_sf_names:             return "DW_AT_sf_names";
6296     case DW_AT_src_info:             return "DW_AT_src_info";
6297     case DW_AT_mac_info:             return "DW_AT_mac_info";
6298     case DW_AT_src_coords:           return "DW_AT_src_coords";
6299     case DW_AT_body_begin:           return "DW_AT_body_begin";
6300     case DW_AT_body_end:             return "DW_AT_body_end";
6301     default:
6302       {
6303         static char buffer [100];
6304
6305         sprintf (buffer, _("Unknown AT value: %lx"), attribute);
6306         return buffer;
6307       }
6308     }
6309 }
6310
6311 static char *
6312 get_FORM_name (form)
6313      unsigned long form;
6314 {
6315   switch (form)
6316     {
6317     case DW_FORM_addr:      return "DW_FORM_addr";
6318     case DW_FORM_block2:    return "DW_FORM_block2";
6319     case DW_FORM_block4:    return "DW_FORM_block4";
6320     case DW_FORM_data2:     return "DW_FORM_data2";
6321     case DW_FORM_data4:     return "DW_FORM_data4";
6322     case DW_FORM_data8:     return "DW_FORM_data8";
6323     case DW_FORM_string:    return "DW_FORM_string";
6324     case DW_FORM_block:     return "DW_FORM_block";
6325     case DW_FORM_block1:    return "DW_FORM_block1";
6326     case DW_FORM_data1:     return "DW_FORM_data1";
6327     case DW_FORM_flag:      return "DW_FORM_flag";
6328     case DW_FORM_sdata:     return "DW_FORM_sdata";
6329     case DW_FORM_strp:      return "DW_FORM_strp";
6330     case DW_FORM_udata:     return "DW_FORM_udata";
6331     case DW_FORM_ref_addr:  return "DW_FORM_ref_addr";
6332     case DW_FORM_ref1:      return "DW_FORM_ref1";
6333     case DW_FORM_ref2:      return "DW_FORM_ref2";
6334     case DW_FORM_ref4:      return "DW_FORM_ref4";
6335     case DW_FORM_ref8:      return "DW_FORM_ref8";
6336     case DW_FORM_ref_udata: return "DW_FORM_ref_udata";
6337     case DW_FORM_indirect:  return "DW_FORM_indirect";
6338     default:
6339       {
6340         static char buffer [100];
6341
6342         sprintf (buffer, _("Unknown FORM value: %lx"), form);
6343         return buffer;
6344       }
6345     }
6346 }
6347
6348 /* FIXME:  There are better and more effiecint ways to handle
6349    these structures.  For now though, I just want something that
6350    is simple to implement.  */
6351 typedef struct abbrev_attr
6352 {
6353   unsigned long        attribute;
6354   unsigned long        form;
6355   struct abbrev_attr * next;
6356 }
6357 abbrev_attr;
6358
6359 typedef struct abbrev_entry
6360 {
6361   unsigned long          entry;
6362   unsigned long          tag;
6363   int                    children;
6364   struct abbrev_attr *   first_attr;
6365   struct abbrev_attr *   last_attr;
6366   struct abbrev_entry *  next;
6367 }
6368 abbrev_entry;
6369
6370 static abbrev_entry * first_abbrev = NULL;
6371 static abbrev_entry * last_abbrev = NULL;
6372
6373 static void
6374 free_abbrevs PARAMS ((void))
6375 {
6376   abbrev_entry * abbrev;
6377
6378   for (abbrev = first_abbrev; abbrev;)
6379     {
6380       abbrev_entry * next = abbrev->next;
6381       abbrev_attr  * attr;
6382
6383       for (attr = abbrev->first_attr; attr;)
6384         {
6385           abbrev_attr * next = attr->next;
6386
6387           free (attr);
6388           attr = next;
6389         }
6390
6391       free (abbrev);
6392       abbrev = next;
6393     }
6394
6395   last_abbrev = first_abbrev = NULL;
6396 }
6397
6398 static void
6399 add_abbrev (number, tag, children)
6400      unsigned long number;
6401      unsigned long tag;
6402      int           children;
6403 {
6404   abbrev_entry * entry;
6405
6406   entry = (abbrev_entry *) malloc (sizeof (* entry));
6407
6408   if (entry == NULL)
6409     /* ugg */
6410     return;
6411
6412   entry->entry      = number;
6413   entry->tag        = tag;
6414   entry->children   = children;
6415   entry->first_attr = NULL;
6416   entry->last_attr  = NULL;
6417   entry->next       = NULL;
6418
6419   if (first_abbrev == NULL)
6420     first_abbrev = entry;
6421   else
6422     last_abbrev->next = entry;
6423
6424   last_abbrev = entry;
6425 }
6426
6427 static void
6428 add_abbrev_attr (attribute, form)
6429      unsigned long attribute;
6430      unsigned long form;
6431 {
6432   abbrev_attr * attr;
6433
6434   attr = (abbrev_attr *) malloc (sizeof (* attr));
6435
6436   if (attr == NULL)
6437     /* ugg */
6438     return;
6439
6440   attr->attribute = attribute;
6441   attr->form      = form;
6442   attr->next      = NULL;
6443
6444   if (last_abbrev->first_attr == NULL)
6445     last_abbrev->first_attr = attr;
6446   else
6447     last_abbrev->last_attr->next = attr;
6448
6449   last_abbrev->last_attr = attr;
6450 }
6451
6452 /* Processes the (partial) contents of a .debug_abbrev section.
6453    Returns NULL if the end of the section was encountered.
6454    Returns the address after the last byte read if the end of
6455    an abbreviation set was found.  */
6456
6457 static unsigned char *
6458 process_abbrev_section (start, end)
6459      unsigned char * start;
6460      unsigned char * end;
6461 {
6462   if (first_abbrev != NULL)
6463     return NULL;
6464
6465   while (start < end)
6466     {
6467       int           bytes_read;
6468       unsigned long entry;
6469       unsigned long tag;
6470       unsigned long attribute;
6471       int           children;
6472
6473       entry = read_leb128 (start, & bytes_read, 0);
6474       start += bytes_read;
6475
6476       /* A single zero is supposed to end the section according
6477          to the standard.  If there's more, then signal that to
6478          the caller.  */
6479       if (entry == 0)
6480         return start == end ? NULL : start;
6481
6482       tag = read_leb128 (start, & bytes_read, 0);
6483       start += bytes_read;
6484
6485       children = * start ++;
6486
6487       add_abbrev (entry, tag, children);
6488
6489       do
6490         {
6491           unsigned long form;
6492
6493           attribute = read_leb128 (start, & bytes_read, 0);
6494           start += bytes_read;
6495
6496           form = read_leb128 (start, & bytes_read, 0);
6497           start += bytes_read;
6498
6499           if (attribute != 0)
6500             add_abbrev_attr (attribute, form);
6501         }
6502       while (attribute != 0);
6503     }
6504
6505   return NULL;
6506 }
6507
6508
6509 static int
6510 display_debug_macinfo (section, start, file)
6511      Elf32_Internal_Shdr * section;
6512      unsigned char *       start;
6513      FILE *                file ATTRIBUTE_UNUSED;
6514 {
6515   unsigned char * end = start + section->sh_size;
6516   unsigned char * curr = start;
6517   unsigned int bytes_read;
6518   enum dwarf_macinfo_record_type op;
6519
6520   printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
6521
6522   while (curr < end)
6523     {
6524       unsigned int lineno;
6525       const char * string;
6526
6527       op = * curr;
6528       curr ++;
6529
6530       switch (op)
6531         {
6532         case DW_MACINFO_start_file:
6533           {
6534             unsigned int filenum;
6535
6536             lineno = read_leb128 (curr, & bytes_read, 0);
6537             curr += bytes_read;
6538             filenum = read_leb128 (curr, & bytes_read, 0);
6539             curr += bytes_read;
6540
6541             printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"), lineno, filenum);
6542           }
6543           break;
6544
6545         case DW_MACINFO_end_file:
6546           printf (_(" DW_MACINFO_end_file\n"));
6547           break;
6548
6549         case DW_MACINFO_define:
6550           lineno = read_leb128 (curr, & bytes_read, 0);
6551           curr += bytes_read;
6552           string = curr;
6553           curr += strlen (string) + 1;
6554           printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"), lineno, string);
6555           break;
6556
6557         case DW_MACINFO_undef:
6558           lineno = read_leb128 (curr, & bytes_read, 0);
6559           curr += bytes_read;
6560           string = curr;
6561           curr += strlen (string) + 1;
6562           printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"), lineno, string);
6563           break;
6564
6565         case DW_MACINFO_vendor_ext:
6566           {
6567             unsigned int constant;
6568
6569             constant = read_leb128 (curr, & bytes_read, 0);
6570             curr += bytes_read;
6571             string = curr;
6572             curr += strlen (string) + 1;
6573             printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"), constant, string);
6574           }
6575           break;
6576         }
6577     }
6578
6579   return 1;
6580 }
6581
6582
6583 static int
6584 display_debug_abbrev (section, start, file)
6585      Elf32_Internal_Shdr * section;
6586      unsigned char *       start;
6587      FILE *                file ATTRIBUTE_UNUSED;
6588 {
6589   abbrev_entry *  entry;
6590   unsigned char * end = start + section->sh_size;
6591
6592   printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
6593
6594   do
6595     {
6596       start = process_abbrev_section (start, end);
6597
6598       if (first_abbrev == NULL)
6599         continue;
6600
6601       printf (_("  Number TAG\n"));
6602
6603       for (entry = first_abbrev; entry; entry = entry->next)
6604         {
6605           abbrev_attr * attr;
6606
6607           printf (_("   %ld      %s    [%s]\n"),
6608                   entry->entry,
6609                   get_TAG_name (entry->tag),
6610                   entry->children ? _("has children") : _("no children"));
6611
6612           for (attr = entry->first_attr; attr; attr = attr->next)
6613             {
6614               printf (_("    %-18s %s\n"),
6615                       get_AT_name (attr->attribute),
6616                       get_FORM_name (attr->form));
6617             }
6618         }
6619
6620       free_abbrevs ();
6621     }
6622   while (start);
6623
6624   printf ("\n");
6625
6626   return 1;
6627 }
6628
6629
6630 static unsigned char *
6631 display_block (data, length)
6632      unsigned char * data;
6633      unsigned long   length;
6634 {
6635   printf (_(" %lu byte block: "), length);
6636
6637   while (length --)
6638     printf ("%lx ", (unsigned long) byte_get (data ++, 1));
6639
6640   return data;
6641 }
6642
6643 static void
6644 decode_location_expression (data, pointer_size, length)
6645      unsigned char * data;
6646      unsigned int    pointer_size;
6647      unsigned long   length;
6648 {
6649   unsigned        op;
6650   int             bytes_read;
6651   unsigned long   uvalue;
6652   unsigned char * end = data + length;
6653
6654   while (data < end)
6655     {
6656       op = * data ++;
6657
6658       switch (op)
6659         {
6660         case DW_OP_addr:
6661           printf ("DW_OP_addr: %lx",
6662                   (unsigned long) byte_get (data, pointer_size));
6663           data += pointer_size;
6664           break;
6665         case DW_OP_deref:
6666           printf ("DW_OP_deref");
6667           break;
6668         case DW_OP_const1u:
6669           printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data++, 1));
6670           break;
6671         case DW_OP_const1s:
6672           printf ("DW_OP_const1s: %ld", (long) byte_get (data++, 1));
6673           break;
6674         case DW_OP_const2u:
6675           printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data, 2));
6676           data += 2;
6677           break;
6678         case DW_OP_const2s:
6679           printf ("DW_OP_const2s: %ld", (long) byte_get (data, 2));
6680           data += 2;
6681           break;
6682         case DW_OP_const4u:
6683           printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data, 4));
6684           data += 4;
6685           break;
6686         case DW_OP_const4s:
6687           printf ("DW_OP_const4s: %ld", (long) byte_get (data, 4));
6688           data += 4;
6689           break;
6690         case DW_OP_const8u:
6691           printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data, 4),
6692                   (unsigned long) byte_get (data + 4, 4));
6693           data += 8;
6694           break;
6695         case DW_OP_const8s:
6696           printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data, 4),
6697                   (long) byte_get (data + 4, 4));
6698           data += 8;
6699           break;
6700         case DW_OP_constu:
6701           printf ("DW_OP_constu: %lu", read_leb128 (data, &bytes_read, 0));
6702           data += bytes_read;
6703           break;
6704         case DW_OP_consts:
6705           printf ("DW_OP_consts: %ld", read_leb128 (data, &bytes_read, 1));
6706           data += bytes_read;
6707           break;
6708         case DW_OP_dup:
6709           printf ("DW_OP_dup");
6710           break;
6711         case DW_OP_drop:
6712           printf ("DW_OP_drop");
6713           break;
6714         case DW_OP_over:
6715           printf ("DW_OP_over");
6716           break;
6717         case DW_OP_pick:
6718           printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data++, 1));
6719           break;
6720         case DW_OP_swap:
6721           printf ("DW_OP_swap");
6722           break;
6723         case DW_OP_rot:
6724           printf ("DW_OP_rot");
6725           break;
6726         case DW_OP_xderef:
6727           printf ("DW_OP_xderef");
6728           break;
6729         case DW_OP_abs:
6730           printf ("DW_OP_abs");
6731           break;
6732         case DW_OP_and:
6733           printf ("DW_OP_and");
6734           break;
6735         case DW_OP_div:
6736           printf ("DW_OP_div");
6737           break;
6738         case DW_OP_minus:
6739           printf ("DW_OP_minus");
6740           break;
6741         case DW_OP_mod:
6742           printf ("DW_OP_mod");
6743           break;
6744         case DW_OP_mul:
6745           printf ("DW_OP_mul");
6746           break;
6747         case DW_OP_neg:
6748           printf ("DW_OP_neg");
6749           break;
6750         case DW_OP_not:
6751           printf ("DW_OP_not");
6752           break;
6753         case DW_OP_or:
6754           printf ("DW_OP_or");
6755           break;
6756         case DW_OP_plus:
6757           printf ("DW_OP_plus");
6758           break;
6759         case DW_OP_plus_uconst:
6760           printf ("DW_OP_plus_uconst: %lu",
6761                   read_leb128 (data, &bytes_read, 0));
6762           data += bytes_read;
6763           break;
6764         case DW_OP_shl:
6765           printf ("DW_OP_shl");
6766           break;
6767         case DW_OP_shr:
6768           printf ("DW_OP_shr");
6769           break;
6770         case DW_OP_shra:
6771           printf ("DW_OP_shra");
6772           break;
6773         case DW_OP_xor:
6774           printf ("DW_OP_xor");
6775           break;
6776         case DW_OP_bra:
6777           printf ("DW_OP_bra: %ld", (long) byte_get (data, 2));
6778           data += 2;
6779           break;
6780         case DW_OP_eq:
6781           printf ("DW_OP_eq");
6782           break;
6783         case DW_OP_ge:
6784           printf ("DW_OP_ge");
6785           break;
6786         case DW_OP_gt:
6787           printf ("DW_OP_gt");
6788           break;
6789         case DW_OP_le:
6790           printf ("DW_OP_le");
6791           break;
6792         case DW_OP_lt:
6793           printf ("DW_OP_lt");
6794           break;
6795         case DW_OP_ne:
6796           printf ("DW_OP_ne");
6797           break;
6798         case DW_OP_skip:
6799           printf ("DW_OP_skip: %ld", (long) byte_get (data, 2));
6800           data += 2;
6801           break;
6802
6803         case DW_OP_lit0:
6804         case DW_OP_lit1:
6805         case DW_OP_lit2:
6806         case DW_OP_lit3:
6807         case DW_OP_lit4:
6808         case DW_OP_lit5:
6809         case DW_OP_lit6:
6810         case DW_OP_lit7:
6811         case DW_OP_lit8:
6812         case DW_OP_lit9:
6813         case DW_OP_lit10:
6814         case DW_OP_lit11:
6815         case DW_OP_lit12:
6816         case DW_OP_lit13:
6817         case DW_OP_lit14:
6818         case DW_OP_lit15:
6819         case DW_OP_lit16:
6820         case DW_OP_lit17:
6821         case DW_OP_lit18:
6822         case DW_OP_lit19:
6823         case DW_OP_lit20:
6824         case DW_OP_lit21:
6825         case DW_OP_lit22:
6826         case DW_OP_lit23:
6827         case DW_OP_lit24:
6828         case DW_OP_lit25:
6829         case DW_OP_lit26:
6830         case DW_OP_lit27:
6831         case DW_OP_lit28:
6832         case DW_OP_lit29:
6833         case DW_OP_lit30:
6834         case DW_OP_lit31:
6835           printf ("DW_OP_lit%d", op - DW_OP_lit0);
6836           break;
6837
6838         case DW_OP_reg0:
6839         case DW_OP_reg1:
6840         case DW_OP_reg2:
6841         case DW_OP_reg3:
6842         case DW_OP_reg4:
6843         case DW_OP_reg5:
6844         case DW_OP_reg6:
6845         case DW_OP_reg7:
6846         case DW_OP_reg8:
6847         case DW_OP_reg9:
6848         case DW_OP_reg10:
6849         case DW_OP_reg11:
6850         case DW_OP_reg12:
6851         case DW_OP_reg13:
6852         case DW_OP_reg14:
6853         case DW_OP_reg15:
6854         case DW_OP_reg16:
6855         case DW_OP_reg17:
6856         case DW_OP_reg18:
6857         case DW_OP_reg19:
6858         case DW_OP_reg20:
6859         case DW_OP_reg21:
6860         case DW_OP_reg22:
6861         case DW_OP_reg23:
6862         case DW_OP_reg24:
6863         case DW_OP_reg25:
6864         case DW_OP_reg26:
6865         case DW_OP_reg27:
6866         case DW_OP_reg28:
6867         case DW_OP_reg29:
6868         case DW_OP_reg30:
6869         case DW_OP_reg31:
6870           printf ("DW_OP_reg%d", op - DW_OP_reg0);
6871           break;
6872
6873         case DW_OP_breg0:
6874         case DW_OP_breg1:
6875         case DW_OP_breg2:
6876         case DW_OP_breg3:
6877         case DW_OP_breg4:
6878         case DW_OP_breg5:
6879         case DW_OP_breg6:
6880         case DW_OP_breg7:
6881         case DW_OP_breg8:
6882         case DW_OP_breg9:
6883         case DW_OP_breg10:
6884         case DW_OP_breg11:
6885         case DW_OP_breg12:
6886         case DW_OP_breg13:
6887         case DW_OP_breg14:
6888         case DW_OP_breg15:
6889         case DW_OP_breg16:
6890         case DW_OP_breg17:
6891         case DW_OP_breg18:
6892         case DW_OP_breg19:
6893         case DW_OP_breg20:
6894         case DW_OP_breg21:
6895         case DW_OP_breg22:
6896         case DW_OP_breg23:
6897         case DW_OP_breg24:
6898         case DW_OP_breg25:
6899         case DW_OP_breg26:
6900         case DW_OP_breg27:
6901         case DW_OP_breg28:
6902         case DW_OP_breg29:
6903         case DW_OP_breg30:
6904         case DW_OP_breg31:
6905           printf ("DW_OP_breg%d: %ld", op - DW_OP_breg0,
6906                   read_leb128 (data, &bytes_read, 1));
6907           data += bytes_read;
6908           break;
6909
6910         case DW_OP_regx:
6911           printf ("DW_OP_regx: %lu", read_leb128 (data, &bytes_read, 0));
6912           data += bytes_read;
6913           break;
6914         case DW_OP_fbreg:
6915           printf ("DW_OP_fbreg: %ld", read_leb128 (data, &bytes_read, 1));
6916           data += bytes_read;
6917           break;
6918         case DW_OP_bregx:
6919           uvalue = read_leb128 (data, &bytes_read, 0);
6920           data += bytes_read;
6921           printf ("DW_OP_bregx: %lu %ld", uvalue,
6922                   read_leb128 (data, &bytes_read, 1));
6923           data += bytes_read;
6924           break;
6925         case DW_OP_piece:
6926           printf ("DW_OP_piece: %lu", read_leb128 (data, &bytes_read, 0));
6927           data += bytes_read;
6928           break;
6929         case DW_OP_deref_size:
6930           printf ("DW_OP_deref_size: %ld", (long) byte_get (data++, 1));
6931           break;
6932         case DW_OP_xderef_size:
6933           printf ("DW_OP_xderef_size: %ld", (long) byte_get (data++, 1));
6934           break;
6935         case DW_OP_nop:
6936           printf ("DW_OP_nop");
6937           break;
6938
6939           /* DWARF 2.1 extensions.  */
6940         case DW_OP_push_object_address:
6941           printf ("DW_OP_push_object_address");
6942           break;
6943         case DW_OP_call2:
6944           printf ("DW_OP_call2: <%lx>", (long) byte_get (data, 2));
6945           data += 2;
6946           break;
6947         case DW_OP_call4:
6948           printf ("DW_OP_call4: <%lx>", (long) byte_get (data, 4));
6949           data += 4;
6950           break;
6951         case DW_OP_calli:
6952           printf ("DW_OP_calli");
6953           break;
6954
6955         default:
6956           if (op >= DW_OP_lo_user
6957               && op <= DW_OP_hi_user)
6958             printf (_("(User defined location op)"));
6959           else
6960             printf (_("(Unknown location op)"));
6961           /* No way to tell where the next op is, so just bail.  */
6962           return;
6963         }
6964
6965       /* Separate the ops.  */
6966       printf ("; ");
6967     }
6968 }
6969
6970
6971 static const char * debug_str_contents;
6972 static bfd_vma      debug_str_size;
6973
6974 static void
6975 load_debug_str (file)
6976      FILE * file;
6977 {
6978   Elf32_Internal_Shdr * sec;
6979   int                   i;
6980
6981   /* If it is already loaded, do nothing.  */
6982   if (debug_str_contents != NULL)
6983     return;
6984
6985   /* Locate the .debug_str section.  */
6986   for (i = 0, sec = section_headers;
6987        i < elf_header.e_shnum;
6988        i ++, sec ++)
6989     if (strcmp (SECTION_NAME (sec), ".debug_str") == 0)
6990       break;
6991
6992   if (i == elf_header.e_shnum || sec->sh_size == 0)
6993     return;
6994
6995   debug_str_size = sec->sh_size;
6996
6997   debug_str_contents = ((char *)
6998                         get_data (NULL, file, sec->sh_offset, sec->sh_size,
6999                                   _("debug_str section data")));
7000 }
7001
7002 static void
7003 free_debug_str ()
7004 {
7005   if (debug_str_contents == NULL)
7006     return;
7007
7008   free ((char *) debug_str_contents);
7009   debug_str_contents = NULL;
7010   debug_str_size = 0;
7011 }
7012
7013 static const char *
7014 fetch_indirect_string (offset)
7015      unsigned long offset;
7016 {
7017   if (debug_str_contents == NULL)
7018     return _("<no .debug_str section>");
7019
7020   if (offset > debug_str_size)
7021     return _("<offset is too big>");
7022
7023   return debug_str_contents + offset;
7024 }
7025
7026
7027 static int
7028 display_debug_str (section, start, file)
7029      Elf32_Internal_Shdr * section;
7030      unsigned char *       start;
7031      FILE *                file ATTRIBUTE_UNUSED;
7032 {
7033   unsigned long   bytes;
7034   bfd_vma         addr;
7035
7036   addr  = section->sh_addr;
7037   bytes = section->sh_size;
7038
7039   if (bytes == 0)
7040     {
7041       printf (_("\nThe .debug_str section is empty.\n"));
7042       return 0;
7043     }
7044
7045   printf (_("Contents of the .debug_str section:\n\n"));
7046
7047   while (bytes)
7048     {
7049       int j;
7050       int k;
7051       int lbytes;
7052
7053       lbytes = (bytes > 16 ? 16 : bytes);
7054
7055       printf ("  0x%8.8lx ", (unsigned long) addr);
7056
7057       for (j = 0; j < 16; j++)
7058         {
7059           if (j < lbytes)
7060             printf ("%2.2x", start [j]);
7061           else
7062             printf ("  ");
7063
7064           if ((j & 3) == 3)
7065             printf (" ");
7066         }
7067
7068       for (j = 0; j < lbytes; j++)
7069         {
7070           k = start [j];
7071           if (k >= ' ' && k < 0x80)
7072             printf ("%c", k);
7073           else
7074             printf (".");
7075         }
7076
7077       putchar ('\n');
7078
7079       start += lbytes;
7080       addr  += lbytes;
7081       bytes -= lbytes;
7082     }
7083
7084   return 1;
7085 }
7086
7087
7088 static unsigned char *
7089 read_and_display_attr_value (attribute, form, data, cu_offset, pointer_size)
7090      unsigned long   attribute;
7091      unsigned long   form;
7092      unsigned char * data;
7093      unsigned long   cu_offset;
7094      unsigned long   pointer_size;
7095 {
7096   unsigned long   uvalue = 0;
7097   unsigned char * block_start = NULL;
7098   int             bytes_read;
7099
7100   switch (form)
7101     {
7102     default:
7103       break;
7104
7105     case DW_FORM_ref_addr:
7106     case DW_FORM_addr:
7107       uvalue = byte_get (data, pointer_size);
7108       data += pointer_size;
7109       break;
7110
7111     case DW_FORM_strp:
7112       uvalue = byte_get (data, /* offset_size */ 4);
7113       data += /* offset_size */ 4;
7114       break;
7115
7116     case DW_FORM_ref1:
7117     case DW_FORM_flag:
7118     case DW_FORM_data1:
7119       uvalue = byte_get (data ++, 1);
7120       break;
7121
7122     case DW_FORM_ref2:
7123     case DW_FORM_data2:
7124       uvalue = byte_get (data, 2);
7125       data += 2;
7126       break;
7127
7128     case DW_FORM_ref4:
7129     case DW_FORM_data4:
7130       uvalue = byte_get (data, 4);
7131       data += 4;
7132       break;
7133
7134     case DW_FORM_sdata:
7135       uvalue = read_leb128 (data, & bytes_read, 1);
7136       data += bytes_read;
7137       break;
7138
7139     case DW_FORM_ref_udata:
7140     case DW_FORM_udata:
7141       uvalue = read_leb128 (data, & bytes_read, 0);
7142       data += bytes_read;
7143       break;
7144
7145     case DW_FORM_indirect:
7146       form = read_leb128 (data, & bytes_read, 0);
7147       data += bytes_read;
7148       printf (" %s", get_FORM_name (form));
7149       return read_and_display_attr_value (attribute, form, data, cu_offset,
7150                                           pointer_size);
7151     }
7152
7153   switch (form)
7154     {
7155     case DW_FORM_ref_addr:
7156       printf (" <#%lx>", uvalue);
7157       break;
7158
7159     case DW_FORM_ref1:
7160     case DW_FORM_ref2:
7161     case DW_FORM_ref4:
7162     case DW_FORM_ref_udata:
7163       printf (" <%lx>", uvalue + cu_offset);
7164       break;
7165
7166     case DW_FORM_addr:
7167       printf (" %#lx", uvalue);
7168
7169     case DW_FORM_flag:
7170     case DW_FORM_data1:
7171     case DW_FORM_data2:
7172     case DW_FORM_data4:
7173     case DW_FORM_sdata:
7174     case DW_FORM_udata:
7175       printf (" %ld", uvalue);
7176       break;
7177
7178     case DW_FORM_ref8:
7179     case DW_FORM_data8:
7180       uvalue = byte_get (data, 4);
7181       printf (" %lx", uvalue);
7182       printf (" %lx", (unsigned long) byte_get (data + 4, 4));
7183       data += 8;
7184       break;
7185
7186     case DW_FORM_string:
7187       printf (" %s", data);
7188       data += strlen ((char *) data) + 1;
7189       break;
7190
7191     case DW_FORM_block:
7192       uvalue = read_leb128 (data, & bytes_read, 0);
7193       block_start = data + bytes_read;
7194       data = display_block (block_start, uvalue);
7195       break;
7196
7197     case DW_FORM_block1:
7198       uvalue = byte_get (data, 1);
7199       block_start = data + 1;
7200       data = display_block (block_start, uvalue);
7201       break;
7202
7203     case DW_FORM_block2:
7204       uvalue = byte_get (data, 2);
7205       block_start = data + 2;
7206       data = display_block (block_start, uvalue);
7207       break;
7208
7209     case DW_FORM_block4:
7210       uvalue = byte_get (data, 4);
7211       block_start = data + 4;
7212       data = display_block (block_start, uvalue);
7213       break;
7214
7215     case DW_FORM_strp:
7216       printf (_(" (indirect string, offset: 0x%lx): "), uvalue);
7217       printf (fetch_indirect_string (uvalue));
7218       break;
7219
7220     case DW_FORM_indirect:
7221       /* Handled above.  */
7222       break;
7223
7224     default:
7225       warn (_("Unrecognised form: %d\n"), form);
7226       break;
7227     }
7228
7229   /* For some attributes we can display futher information.  */
7230
7231   printf ("\t");
7232
7233   switch (attribute)
7234     {
7235     case DW_AT_inline:
7236       switch (uvalue)
7237         {
7238         case DW_INL_not_inlined:          printf (_("(not inlined)")); break;
7239         case DW_INL_inlined:              printf (_("(inlined)")); break;
7240         case DW_INL_declared_not_inlined: printf (_("(declared as inline but ignored)")); break;
7241         case DW_INL_declared_inlined:     printf (_("(declared as inline and inlined)")); break;
7242         default: printf (_("  (Unknown inline attribute value: %lx)"), uvalue); break;
7243         }
7244       break;
7245
7246     case DW_AT_language:
7247       switch (uvalue)
7248         {
7249         case DW_LANG_C:              printf ("(non-ANSI C)"); break;
7250         case DW_LANG_C89:            printf ("(ANSI C)"); break;
7251         case DW_LANG_C_plus_plus:    printf ("(C++)"); break;
7252         case DW_LANG_Fortran77:      printf ("(FORTRAN 77)"); break;
7253         case DW_LANG_Fortran90:      printf ("(Fortran 90)"); break;
7254         case DW_LANG_Modula2:        printf ("(Modula 2)"); break;
7255         case DW_LANG_Pascal83:       printf ("(ANSI Pascal)"); break;
7256         case DW_LANG_Ada83:          printf ("(Ada)"); break;
7257         case DW_LANG_Cobol74:        printf ("(Cobol 74)"); break;
7258         case DW_LANG_Cobol85:        printf ("(Cobol 85)"); break;
7259           /* DWARF 2.1 values.  */
7260         case DW_LANG_C99:            printf ("(ANSI C99)"); break;
7261         case DW_LANG_Ada95:          printf ("(ADA 95)"); break;
7262         case DW_LANG_Fortran95:      printf ("(Fortran 95)"); break;
7263           /* MIPS extension.  */
7264         case DW_LANG_Mips_Assembler: printf ("(MIPS assembler)"); break;
7265         default:                     printf ("(Unknown: %lx)", uvalue); break;
7266         }
7267       break;
7268
7269     case DW_AT_encoding:
7270       switch (uvalue)
7271         {
7272         case DW_ATE_void:            printf ("(void)"); break;
7273         case DW_ATE_address:         printf ("(machine address)"); break;
7274         case DW_ATE_boolean:         printf ("(boolean)"); break;
7275         case DW_ATE_complex_float:   printf ("(complex float)"); break;
7276         case DW_ATE_float:           printf ("(float)"); break;
7277         case DW_ATE_signed:          printf ("(signed)"); break;
7278         case DW_ATE_signed_char:     printf ("(signed char)"); break;
7279         case DW_ATE_unsigned:        printf ("(unsigned)"); break;
7280         case DW_ATE_unsigned_char:   printf ("(unsigned char)"); break;
7281           /* DWARF 2.1 value.  */
7282         case DW_ATE_imaginary_float: printf ("(imaginary float)"); break;
7283         default:
7284           if (uvalue >= DW_ATE_lo_user
7285               && uvalue <= DW_ATE_hi_user)
7286             printf ("(user defined type)");
7287           else
7288             printf ("(unknown type)");
7289           break;
7290         }
7291       break;
7292
7293     case DW_AT_accessibility:
7294       switch (uvalue)
7295         {
7296         case DW_ACCESS_public:          printf ("(public)"); break;
7297         case DW_ACCESS_protected:       printf ("(protected)"); break;
7298         case DW_ACCESS_private:         printf ("(private)"); break;
7299         default:                        printf ("(unknown accessibility)"); break;
7300         }
7301       break;
7302
7303     case DW_AT_visibility:
7304       switch (uvalue)
7305         {
7306         case DW_VIS_local:      printf ("(local)"); break;
7307         case DW_VIS_exported:   printf ("(exported)"); break;
7308         case DW_VIS_qualified:  printf ("(qualified)"); break;
7309         default:                printf ("(unknown visibility)"); break;
7310         }
7311       break;
7312
7313     case DW_AT_virtuality:
7314       switch (uvalue)
7315         {
7316         case DW_VIRTUALITY_none:        printf ("(none)"); break;
7317         case DW_VIRTUALITY_virtual:     printf ("(virtual)"); break;
7318         case DW_VIRTUALITY_pure_virtual:printf ("(pure_virtual)"); break;
7319         default:                        printf ("(unknown virtuality)"); break;
7320         }
7321       break;
7322
7323     case DW_AT_identifier_case:
7324       switch (uvalue)
7325         {
7326         case DW_ID_case_sensitive:      printf ("(case_sensitive)"); break;
7327         case DW_ID_up_case:             printf ("(up_case)"); break;
7328         case DW_ID_down_case:           printf ("(down_case)"); break;
7329         case DW_ID_case_insensitive:    printf ("(case_insensitive)"); break;
7330         default:                        printf ("(unknown case)"); break;
7331         }
7332       break;
7333
7334     case DW_AT_calling_convention:
7335       switch (uvalue)
7336         {
7337         case DW_CC_normal:      printf ("(normal)"); break;
7338         case DW_CC_program:     printf ("(program)"); break;
7339         case DW_CC_nocall:      printf ("(nocall)"); break;
7340         default:
7341           if (uvalue >= DW_CC_lo_user
7342               && uvalue <= DW_CC_hi_user)
7343             printf ("(user defined)");
7344           else
7345             printf ("(unknown convention)");
7346         }
7347       break;
7348
7349     case DW_AT_ordering:
7350       switch (uvalue)
7351         {
7352         case -1: printf ("(undefined)"); break;
7353         case 0:  printf ("(row major)"); break;
7354         case 1:  printf ("(column major)"); break;
7355         }
7356       break;
7357
7358     case DW_AT_frame_base:
7359     case DW_AT_location:
7360     case DW_AT_data_member_location:
7361     case DW_AT_vtable_elem_location:
7362     case DW_AT_allocated:
7363     case DW_AT_associated:
7364     case DW_AT_data_location:
7365     case DW_AT_stride:
7366     case DW_AT_upper_bound:
7367     case DW_AT_lower_bound:
7368       if (block_start)
7369         {
7370           printf ("(");
7371           decode_location_expression (block_start, pointer_size, uvalue);
7372           printf (")");
7373         }
7374       break;
7375
7376     default:
7377       break;
7378     }
7379
7380   return data;
7381 }
7382
7383 static unsigned char *
7384 read_and_display_attr (attribute, form, data, cu_offset, pointer_size)
7385      unsigned long   attribute;
7386      unsigned long   form;
7387      unsigned char * data;
7388      unsigned long   cu_offset;
7389      unsigned long   pointer_size;
7390 {
7391   printf ("     %-18s:", get_AT_name (attribute));
7392   data = read_and_display_attr_value (attribute, form, data, cu_offset,
7393                                       pointer_size);
7394   printf ("\n");
7395   return data;
7396 }
7397
7398 static int
7399 display_debug_info (section, start, file)
7400      Elf32_Internal_Shdr * section;
7401      unsigned char *       start;
7402      FILE *                file;
7403 {
7404   unsigned char * end = start + section->sh_size;
7405   unsigned char * section_begin = start;
7406
7407   printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
7408
7409   load_debug_str (file);
7410
7411   while (start < end)
7412     {
7413       DWARF2_External_CompUnit * external;
7414       DWARF2_Internal_CompUnit   compunit;
7415       Elf32_Internal_Shdr *      relsec;
7416       unsigned char *            tags;
7417       int                        i;
7418       int                        level;
7419       unsigned long              cu_offset;
7420
7421       external = (DWARF2_External_CompUnit *) start;
7422
7423       compunit.cu_length        = BYTE_GET (external->cu_length);
7424       compunit.cu_version       = BYTE_GET (external->cu_version);
7425       compunit.cu_abbrev_offset = BYTE_GET (external->cu_abbrev_offset);
7426       compunit.cu_pointer_size  = BYTE_GET (external->cu_pointer_size);
7427
7428       if (compunit.cu_length == 0xffffffff)
7429         {
7430           warn (_("64-bit DWARF debug info is not supported yet.\n"));
7431           break;
7432         }
7433
7434       /* Check for RELA relocations in the abbrev_offset address, and
7435          apply them.  */
7436       for (relsec = section_headers;
7437            relsec < section_headers + elf_header.e_shnum;
7438            ++relsec)
7439         {
7440           unsigned long nrelas, nsyms;
7441           Elf_Internal_Rela *rela, *rp;
7442           Elf32_Internal_Shdr *symsec;
7443           Elf_Internal_Sym *symtab;
7444           Elf_Internal_Sym *sym;
7445
7446           if (relsec->sh_type != SHT_RELA
7447               || section_headers + relsec->sh_info != section)
7448             continue;
7449
7450           if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7451                                   & rela, & nrelas))
7452             return 0;
7453
7454           symsec = section_headers + relsec->sh_link;
7455           nsyms = symsec->sh_size / symsec->sh_entsize;
7456           symtab = GET_ELF_SYMBOLS (file, symsec->sh_offset, nsyms);
7457
7458           for (rp = rela; rp < rela + nrelas; ++rp)
7459             {
7460               if (rp->r_offset
7461                   != (bfd_vma) ((unsigned char *) &external->cu_abbrev_offset
7462                                 - section_begin))
7463                 continue;
7464
7465               if (is_32bit_elf)
7466                 {
7467                   sym = symtab + ELF32_R_SYM (rp->r_info);
7468
7469                   if (ELF32_ST_TYPE (sym->st_info) != STT_SECTION)
7470                     {
7471                       warn (_("Skipping unexpected symbol type %u\n"),
7472                             ELF32_ST_TYPE (sym->st_info));
7473                       continue;
7474                     }
7475                 }
7476               else
7477                 {
7478                   sym = symtab + ELF64_R_SYM (rp->r_info);
7479
7480                   if (ELF64_ST_TYPE (sym->st_info) != STT_SECTION)
7481                     {
7482                       warn (_("Skipping unexpected symbol type %u\n"),
7483                             ELF64_ST_TYPE (sym->st_info));
7484                       continue;
7485                     }
7486                 }
7487
7488               compunit.cu_abbrev_offset += rp->r_addend;
7489               break;
7490             }
7491
7492           free (rela);
7493           break;
7494         }
7495
7496       tags = start + sizeof (* external);
7497       cu_offset = start - section_begin;
7498       start += compunit.cu_length + sizeof (external->cu_length);
7499
7500       printf (_("  Compilation Unit @ %lx:\n"), cu_offset);
7501       printf (_("   Length:        %ld\n"), compunit.cu_length);
7502       printf (_("   Version:       %d\n"), compunit.cu_version);
7503       printf (_("   Abbrev Offset: %ld\n"), compunit.cu_abbrev_offset);
7504       printf (_("   Pointer Size:  %d\n"), compunit.cu_pointer_size);
7505
7506       if (compunit.cu_version != 2)
7507         {
7508           warn (_("Only version 2 DWARF debug information is currently supported.\n"));
7509           continue;
7510         }
7511
7512       free_abbrevs ();
7513
7514       /* Read in the abbrevs used by this compilation unit.  */
7515
7516       {
7517         Elf32_Internal_Shdr * sec;
7518         unsigned char *       begin;
7519
7520         /* Locate the .debug_abbrev section and process it.  */
7521         for (i = 0, sec = section_headers;
7522              i < elf_header.e_shnum;
7523              i ++, sec ++)
7524           if (strcmp (SECTION_NAME (sec), ".debug_abbrev") == 0)
7525             break;
7526
7527         if (i == elf_header.e_shnum || sec->sh_size == 0)
7528           {
7529             warn (_("Unable to locate .debug_abbrev section!\n"));
7530             return 0;
7531           }
7532
7533         begin = ((unsigned char *)
7534                  get_data (NULL, file, sec->sh_offset, sec->sh_size,
7535                            _("debug_abbrev section data")));
7536         if (!begin)
7537           return 0;
7538
7539         process_abbrev_section (begin + compunit.cu_abbrev_offset,
7540                                 begin + sec->sh_size);
7541
7542         free (begin);
7543       }
7544
7545       level = 0;
7546       while (tags < start)
7547         {
7548           int            bytes_read;
7549           unsigned long  abbrev_number;
7550           abbrev_entry * entry;
7551           abbrev_attr  * attr;
7552
7553           abbrev_number = read_leb128 (tags, & bytes_read, 0);
7554           tags += bytes_read;
7555
7556           /* A null DIE marks the end of a list of children.  */
7557           if (abbrev_number == 0)
7558             {
7559               --level;
7560               continue;
7561             }
7562
7563           /* Scan through the abbreviation list until we reach the
7564              correct entry.  */
7565           for (entry = first_abbrev;
7566                entry && entry->entry != abbrev_number;
7567                entry = entry->next)
7568             continue;
7569
7570           if (entry == NULL)
7571             {
7572               warn (_("Unable to locate entry %lu in the abbreviation table\n"),
7573                     abbrev_number);
7574               return 0;
7575             }
7576
7577           printf (_(" <%d><%lx>: Abbrev Number: %lu (%s)\n"),
7578                   level,
7579                   (unsigned long) (tags - section_begin - bytes_read),
7580                   abbrev_number,
7581                   get_TAG_name (entry->tag));
7582
7583           for (attr = entry->first_attr; attr; attr = attr->next)
7584             tags = read_and_display_attr (attr->attribute,
7585                                           attr->form,
7586                                           tags, cu_offset,
7587                                           compunit.cu_pointer_size);
7588
7589           if (entry->children)
7590             ++level;
7591         }
7592     }
7593
7594   free_debug_str ();
7595
7596   printf ("\n");
7597
7598   return 1;
7599 }
7600
7601 static int
7602 display_debug_aranges (section, start, file)
7603      Elf32_Internal_Shdr * section;
7604      unsigned char *       start;
7605      FILE *                file ATTRIBUTE_UNUSED;
7606 {
7607   unsigned char * end = start + section->sh_size;
7608
7609   printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
7610
7611   while (start < end)
7612     {
7613       DWARF2_External_ARange * external;
7614       DWARF2_Internal_ARange   arange;
7615       unsigned char *          ranges;
7616       unsigned long            length;
7617       unsigned long            address;
7618       int                      excess;
7619
7620       external = (DWARF2_External_ARange *) start;
7621
7622       arange.ar_length       = BYTE_GET (external->ar_length);
7623       arange.ar_version      = BYTE_GET (external->ar_version);
7624       arange.ar_info_offset  = BYTE_GET (external->ar_info_offset);
7625       arange.ar_pointer_size = BYTE_GET (external->ar_pointer_size);
7626       arange.ar_segment_size = BYTE_GET (external->ar_segment_size);
7627
7628       if (arange.ar_length == 0xffffffff)
7629         {
7630           warn (_("64-bit DWARF aranges are not supported yet.\n"));
7631           break;
7632         }
7633
7634       if (arange.ar_version != 2)
7635         {
7636           warn (_("Only DWARF 2 aranges are currently supported.\n"));
7637           break;
7638         }
7639
7640       printf (_("  Length:                   %ld\n"), arange.ar_length);
7641       printf (_("  Version:                  %d\n"), arange.ar_version);
7642       printf (_("  Offset into .debug_info:  %lx\n"), arange.ar_info_offset);
7643       printf (_("  Pointer Size:             %d\n"), arange.ar_pointer_size);
7644       printf (_("  Segment Size:             %d\n"), arange.ar_segment_size);
7645
7646       printf (_("\n    Address  Length\n"));
7647
7648       ranges = start + sizeof (* external);
7649
7650       /* Must pad to an alignment boundary that is twice the pointer size.  */
7651       excess = sizeof (* external) % (2 * arange.ar_pointer_size);
7652       if (excess)
7653         ranges += (2 * arange.ar_pointer_size) - excess;
7654
7655       for (;;)
7656         {
7657           address = byte_get (ranges, arange.ar_pointer_size);
7658
7659           ranges += arange.ar_pointer_size;
7660
7661           length  = byte_get (ranges, arange.ar_pointer_size);
7662
7663           ranges += arange.ar_pointer_size;
7664
7665           /* A pair of zeros marks the end of the list.  */
7666           if (address == 0 && length == 0)
7667             break;
7668
7669           printf ("    %8.8lx %lu\n", address, length);
7670         }
7671
7672       start += arange.ar_length + sizeof (external->ar_length);
7673     }
7674
7675   printf ("\n");
7676
7677   return 1;
7678 }
7679
7680 typedef struct Frame_Chunk
7681 {
7682   struct Frame_Chunk * next;
7683   unsigned char *      chunk_start;
7684   int                  ncols;
7685   /* DW_CFA_{undefined,same_value,offset,register,unreferenced}  */
7686   short int *          col_type;
7687   int *                col_offset;
7688   char *               augmentation;
7689   unsigned int         code_factor;
7690   int                  data_factor;
7691   unsigned long        pc_begin;
7692   unsigned long        pc_range;
7693   int                  cfa_reg;
7694   int                  cfa_offset;
7695   int                  ra;
7696   unsigned char        fde_encoding;
7697 }
7698 Frame_Chunk;
7699
7700 /* A marker for a col_type that means this column was never referenced
7701    in the frame info.  */
7702 #define DW_CFA_unreferenced (-1)
7703
7704 static void frame_need_space PARAMS ((Frame_Chunk *, int));
7705 static void frame_display_row PARAMS ((Frame_Chunk *, int *, int *));
7706 static int size_of_encoded_value PARAMS ((int));
7707
7708 static void
7709 frame_need_space (fc, reg)
7710      Frame_Chunk * fc;
7711      int reg;
7712 {
7713   int prev = fc->ncols;
7714
7715   if (reg < fc->ncols)
7716     return;
7717
7718   fc->ncols = reg + 1;
7719   fc->col_type = (short int *) xrealloc (fc->col_type,
7720                                          fc->ncols * sizeof (short int));
7721   fc->col_offset = (int *) xrealloc (fc->col_offset,
7722                                      fc->ncols * sizeof (int));
7723
7724   while (prev < fc->ncols)
7725     {
7726       fc->col_type[prev] = DW_CFA_unreferenced;
7727       fc->col_offset[prev] = 0;
7728       prev++;
7729     }
7730 }
7731
7732 static void
7733 frame_display_row (fc, need_col_headers, max_regs)
7734      Frame_Chunk * fc;
7735      int *         need_col_headers;
7736      int *         max_regs;
7737 {
7738   int r;
7739   char tmp[100];
7740
7741   if (* max_regs < fc->ncols)
7742     * max_regs = fc->ncols;
7743
7744   if (* need_col_headers)
7745     {
7746       * need_col_headers = 0;
7747
7748       printf ("   LOC   CFA      ");
7749
7750       for (r = 0; r < * max_regs; r++)
7751         if (fc->col_type[r] != DW_CFA_unreferenced)
7752           {
7753             if (r == fc->ra)
7754               printf ("ra   ");
7755             else
7756               printf ("r%-4d", r);
7757           }
7758
7759       printf ("\n");
7760     }
7761
7762   printf ("%08lx ", fc->pc_begin);
7763   sprintf (tmp, "r%d%+d", fc->cfa_reg, fc->cfa_offset);
7764   printf ("%-8s ", tmp);
7765
7766   for (r = 0; r < fc->ncols; r++)
7767     {
7768       if (fc->col_type[r] != DW_CFA_unreferenced)
7769         {
7770           switch (fc->col_type[r])
7771             {
7772             case DW_CFA_undefined:
7773               strcpy (tmp, "u");
7774               break;
7775             case DW_CFA_same_value:
7776               strcpy (tmp, "s");
7777               break;
7778             case DW_CFA_offset:
7779               sprintf (tmp, "c%+d", fc->col_offset[r]);
7780               break;
7781             case DW_CFA_register:
7782               sprintf (tmp, "r%d", fc->col_offset[r]);
7783               break;
7784             default:
7785               strcpy (tmp, "n/a");
7786               break;
7787             }
7788           printf ("%-5s", tmp);
7789         }
7790     }
7791   printf ("\n");
7792 }
7793
7794 static int
7795 size_of_encoded_value (encoding)
7796      int encoding;
7797 {
7798   switch (encoding & 0x7)
7799     {
7800     default:    /* ??? */
7801     case 0:     return is_32bit_elf ? 4 : 8;
7802     case 2:     return 2;
7803     case 3:     return 4;
7804     case 4:     return 8;
7805     }
7806 }
7807
7808 #define GET(N)  byte_get (start, N); start += N
7809 #define LEB()   read_leb128 (start, & length_return, 0); start += length_return
7810 #define SLEB()  read_leb128 (start, & length_return, 1); start += length_return
7811
7812 static int
7813 display_debug_frames (section, start, file)
7814      Elf32_Internal_Shdr * section;
7815      unsigned char *       start;
7816      FILE *                file ATTRIBUTE_UNUSED;
7817 {
7818   unsigned char * end = start + section->sh_size;
7819   unsigned char * section_start = start;
7820   Frame_Chunk *   chunks = 0;
7821   Frame_Chunk *   remembered_state = 0;
7822   Frame_Chunk *   rs;
7823   int             is_eh = (strcmp (SECTION_NAME (section), ".eh_frame") == 0);
7824   int             length_return;
7825   int             max_regs = 0;
7826   int             addr_size = is_32bit_elf ? 4 : 8;
7827
7828   printf (_("The section %s contains:\n"), SECTION_NAME (section));
7829
7830   while (start < end)
7831     {
7832       unsigned char * saved_start;
7833       unsigned char * block_end;
7834       unsigned long   length;
7835       unsigned long   cie_id;
7836       Frame_Chunk *   fc;
7837       Frame_Chunk *   cie;
7838       int             need_col_headers = 1;
7839       unsigned char * augmentation_data = NULL;
7840       unsigned long   augmentation_data_len = 0;
7841       int             encoded_ptr_size = addr_size;
7842
7843       saved_start = start;
7844       length = byte_get (start, 4); start += 4;
7845
7846       if (length == 0)
7847         return 1;
7848
7849       if (length == 0xffffffff)
7850         {
7851           warn (_("64-bit DWARF format frames are not supported yet.\n"));
7852           break;
7853         }
7854
7855       block_end = saved_start + length + 4;
7856       cie_id = byte_get (start, 4); start += 4;
7857
7858       if (is_eh ? (cie_id == 0) : (cie_id == DW_CIE_ID))
7859         {
7860           int version;
7861
7862           fc = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
7863           memset (fc, 0, sizeof (Frame_Chunk));
7864
7865           fc->next = chunks;
7866           chunks = fc;
7867           fc->chunk_start = saved_start;
7868           fc->ncols = 0;
7869           fc->col_type = (short int *) xmalloc (sizeof (short int));
7870           fc->col_offset = (int *) xmalloc (sizeof (int));
7871           frame_need_space (fc, max_regs-1);
7872
7873           version = *start++;
7874
7875           fc->augmentation = start;
7876           start = strchr (start, '\0') + 1;
7877
7878           if (fc->augmentation[0] == 'z')
7879             {
7880               fc->code_factor = LEB ();
7881               fc->data_factor = SLEB ();
7882               fc->ra = byte_get (start, 1); start += 1;
7883               augmentation_data_len = LEB ();
7884               augmentation_data = start;
7885               start += augmentation_data_len;
7886             }
7887           else if (strcmp (fc->augmentation, "eh") == 0)
7888             {
7889               start += addr_size;
7890               fc->code_factor = LEB ();
7891               fc->data_factor = SLEB ();
7892               fc->ra = byte_get (start, 1); start += 1;
7893             }
7894           else
7895             {
7896               fc->code_factor = LEB ();
7897               fc->data_factor = SLEB ();
7898               fc->ra = byte_get (start, 1); start += 1;
7899             }
7900           cie = fc;
7901
7902           if (do_debug_frames_interp)
7903             printf ("\n%08lx %08lx %08lx CIE \"%s\" cf=%d df=%d ra=%d\n",
7904                     (unsigned long)(saved_start - section_start), length, cie_id,
7905                     fc->augmentation, fc->code_factor, fc->data_factor,
7906                     fc->ra);
7907           else
7908             {
7909               printf ("\n%08lx %08lx %08lx CIE\n",
7910                       (unsigned long)(saved_start - section_start), length, cie_id);
7911               printf ("  Version:               %d\n", version);
7912               printf ("  Augmentation:          \"%s\"\n", fc->augmentation);
7913               printf ("  Code alignment factor: %u\n", fc->code_factor);
7914               printf ("  Data alignment factor: %d\n", fc->data_factor);
7915               printf ("  Return address column: %d\n", fc->ra);
7916
7917               if (augmentation_data_len)
7918                 {
7919                   unsigned long i;
7920                   printf ("  Augmentation data:    ");
7921                   for (i = 0; i < augmentation_data_len; ++i)
7922                     printf (" %02x", augmentation_data[i]);
7923                   putchar ('\n');
7924                 }
7925               putchar ('\n');
7926             }
7927
7928           if (augmentation_data_len)
7929             {
7930               unsigned char *p, *q;
7931               p = fc->augmentation + 1;
7932               q = augmentation_data;
7933
7934               while (1)
7935                 {
7936                   if (*p == 'L')
7937                     q++;
7938                   else if (*p == 'P')
7939                     q += 1 + size_of_encoded_value (*q);
7940                   else if (*p == 'R')
7941                     fc->fde_encoding = *q++;
7942                   else
7943                     break;
7944                   p++;
7945                 }
7946
7947               if (fc->fde_encoding)
7948                 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
7949             }
7950
7951           frame_need_space (fc, fc->ra);
7952         }
7953       else
7954         {
7955           unsigned char *    look_for;
7956           static Frame_Chunk fde_fc;
7957
7958           fc = & fde_fc;
7959           memset (fc, 0, sizeof (Frame_Chunk));
7960
7961           look_for = is_eh ? start - 4 - cie_id : section_start + cie_id;
7962
7963           for (cie = chunks; cie ; cie = cie->next)
7964             if (cie->chunk_start == look_for)
7965               break;
7966
7967           if (!cie)
7968             {
7969               warn ("Invalid CIE pointer %08lx in FDE at %08lx\n",
7970                     cie_id, saved_start);
7971               start = block_end;
7972               fc->ncols = 0;
7973               fc->col_type = (short int *) xmalloc (sizeof (short int));
7974               fc->col_offset = (int *) xmalloc (sizeof (int));
7975               frame_need_space (fc, max_regs - 1);
7976               cie = fc;
7977               fc->augmentation = "";
7978               fc->fde_encoding = 0;
7979             }
7980           else
7981             {
7982               fc->ncols = cie->ncols;
7983               fc->col_type = (short int *) xmalloc (fc->ncols * sizeof (short int));
7984               fc->col_offset = (int *) xmalloc (fc->ncols * sizeof (int));
7985               memcpy (fc->col_type, cie->col_type, fc->ncols * sizeof (short int));
7986               memcpy (fc->col_offset, cie->col_offset, fc->ncols * sizeof (int));
7987               fc->augmentation = cie->augmentation;
7988               fc->code_factor = cie->code_factor;
7989               fc->data_factor = cie->data_factor;
7990               fc->cfa_reg = cie->cfa_reg;
7991               fc->cfa_offset = cie->cfa_offset;
7992               fc->ra = cie->ra;
7993               frame_need_space (fc, max_regs-1);
7994               fc->fde_encoding = cie->fde_encoding;
7995             }
7996
7997           if (fc->fde_encoding)
7998             encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
7999
8000           fc->pc_begin = byte_get (start, encoded_ptr_size);
8001           start += encoded_ptr_size;
8002           fc->pc_range = byte_get (start, encoded_ptr_size);
8003           start += encoded_ptr_size;
8004
8005           if (cie->augmentation[0] == 'z')
8006             {
8007               augmentation_data_len = LEB ();
8008               augmentation_data = start;
8009               start += augmentation_data_len;
8010             }
8011
8012           printf ("\n%08lx %08lx %08lx FDE cie=%08lx pc=%08lx..%08lx\n",
8013                   (unsigned long)(saved_start - section_start), length, cie_id,
8014                   (unsigned long)(cie->chunk_start - section_start),
8015                   fc->pc_begin, fc->pc_begin + fc->pc_range);
8016           if (! do_debug_frames_interp && augmentation_data_len)
8017             {
8018               unsigned long i;
8019               printf ("  Augmentation data:    ");
8020               for (i = 0; i < augmentation_data_len; ++i)
8021                 printf (" %02x", augmentation_data[i]);
8022               putchar ('\n');
8023               putchar ('\n');
8024             }
8025         }
8026
8027       /* At this point, fc is the current chunk, cie (if any) is set, and we're
8028          about to interpret instructions for the chunk.  */
8029
8030       if (do_debug_frames_interp)
8031       {
8032         /* Start by making a pass over the chunk, allocating storage
8033            and taking note of what registers are used.  */
8034         unsigned char * tmp = start;
8035
8036         while (start < block_end)
8037           {
8038             unsigned op, opa;
8039             unsigned long reg;
8040
8041             op = * start ++;
8042             opa = op & 0x3f;
8043             if (op & 0xc0)
8044               op &= 0xc0;
8045
8046             /* Warning: if you add any more cases to this switch, be
8047                sure to add them to the corresponding switch below.  */
8048             switch (op)
8049               {
8050               case DW_CFA_advance_loc:
8051                 break;
8052               case DW_CFA_offset:
8053                 LEB ();
8054                 frame_need_space (fc, opa);
8055                 fc->col_type[opa] = DW_CFA_undefined;
8056                 break;
8057               case DW_CFA_restore:
8058                 frame_need_space (fc, opa);
8059                 fc->col_type[opa] = DW_CFA_undefined;
8060                 break;
8061               case DW_CFA_set_loc:
8062                 start += encoded_ptr_size;
8063                 break;
8064               case DW_CFA_advance_loc1:
8065                 start += 1;
8066                 break;
8067               case DW_CFA_advance_loc2:
8068                 start += 2;
8069                 break;
8070               case DW_CFA_advance_loc4:
8071                 start += 4;
8072                 break;
8073               case DW_CFA_offset_extended:
8074                 reg = LEB (); LEB ();
8075                 frame_need_space (fc, reg);
8076                 fc->col_type[reg] = DW_CFA_undefined;
8077                 break;
8078               case DW_CFA_restore_extended:
8079                 reg = LEB ();
8080                 frame_need_space (fc, reg);
8081                 fc->col_type[reg] = DW_CFA_undefined;
8082                 break;
8083               case DW_CFA_undefined:
8084                 reg = LEB ();
8085                 frame_need_space (fc, reg);
8086                 fc->col_type[reg] = DW_CFA_undefined;
8087                 break;
8088               case DW_CFA_same_value:
8089                 reg = LEB ();
8090                 frame_need_space (fc, reg);
8091                 fc->col_type[reg] = DW_CFA_undefined;
8092                 break;
8093               case DW_CFA_register:
8094                 reg = LEB (); LEB ();
8095                 frame_need_space (fc, reg);
8096                 fc->col_type[reg] = DW_CFA_undefined;
8097                 break;
8098               case DW_CFA_def_cfa:
8099                 LEB (); LEB ();
8100                 break;
8101               case DW_CFA_def_cfa_register:
8102                 LEB ();
8103                 break;
8104               case DW_CFA_def_cfa_offset:
8105                 LEB ();
8106                 break;
8107 #ifndef DW_CFA_GNU_args_size
8108 #define DW_CFA_GNU_args_size 0x2e
8109 #endif
8110               case DW_CFA_GNU_args_size:
8111                 LEB ();
8112                 break;
8113 #ifndef DW_CFA_GNU_negative_offset_extended
8114 #define DW_CFA_GNU_negative_offset_extended 0x2f
8115 #endif
8116               case DW_CFA_GNU_negative_offset_extended:
8117                 reg = LEB (); LEB ();
8118                 frame_need_space (fc, reg);
8119                 fc->col_type[reg] = DW_CFA_undefined;
8120
8121               default:
8122                 break;
8123               }
8124           }
8125         start = tmp;
8126       }
8127
8128       /* Now we know what registers are used, make a second pass over
8129          the chunk, this time actually printing out the info.  */
8130
8131       while (start < block_end)
8132         {
8133           unsigned op, opa;
8134           unsigned long ul, reg, roffs;
8135           long l, ofs;
8136           bfd_vma vma;
8137
8138           op = * start ++;
8139           opa = op & 0x3f;
8140           if (op & 0xc0)
8141             op &= 0xc0;
8142
8143             /* Warning: if you add any more cases to this switch, be
8144                sure to add them to the corresponding switch above.  */
8145           switch (op)
8146             {
8147             case DW_CFA_advance_loc:
8148               if (do_debug_frames_interp)
8149                 frame_display_row (fc, &need_col_headers, &max_regs);
8150               else
8151                 printf ("  DW_CFA_advance_loc: %d to %08lx\n",
8152                         opa * fc->code_factor,
8153                         fc->pc_begin + opa * fc->code_factor);
8154               fc->pc_begin += opa * fc->code_factor;
8155               break;
8156
8157             case DW_CFA_offset:
8158               roffs = LEB ();
8159               if (! do_debug_frames_interp)
8160                 printf ("  DW_CFA_offset: r%d at cfa%+ld\n",
8161                         opa, roffs * fc->data_factor);
8162               fc->col_type[opa] = DW_CFA_offset;
8163               fc->col_offset[opa] = roffs * fc->data_factor;
8164               break;
8165
8166             case DW_CFA_restore:
8167               if (! do_debug_frames_interp)
8168                 printf ("  DW_CFA_restore: r%d\n", opa);
8169               fc->col_type[opa] = cie->col_type[opa];
8170               fc->col_offset[opa] = cie->col_offset[opa];
8171               break;
8172
8173             case DW_CFA_set_loc:
8174               vma = byte_get (start, encoded_ptr_size);
8175               start += encoded_ptr_size;
8176               if (do_debug_frames_interp)
8177                 frame_display_row (fc, &need_col_headers, &max_regs);
8178               else
8179                 printf ("  DW_CFA_set_loc: %08lx\n", (unsigned long)vma);
8180               fc->pc_begin = vma;
8181               break;
8182
8183             case DW_CFA_advance_loc1:
8184               ofs = byte_get (start, 1); start += 1;
8185               if (do_debug_frames_interp)
8186                 frame_display_row (fc, &need_col_headers, &max_regs);
8187               else
8188                 printf ("  DW_CFA_advance_loc1: %ld to %08lx\n",
8189                         ofs * fc->code_factor,
8190                         fc->pc_begin + ofs * fc->code_factor);
8191               fc->pc_begin += ofs * fc->code_factor;
8192               break;
8193
8194             case DW_CFA_advance_loc2:
8195               ofs = byte_get (start, 2); start += 2;
8196               if (do_debug_frames_interp)
8197                 frame_display_row (fc, &need_col_headers, &max_regs);
8198               else
8199                 printf ("  DW_CFA_advance_loc2: %ld to %08lx\n",
8200                         ofs * fc->code_factor,
8201                         fc->pc_begin + ofs * fc->code_factor);
8202               fc->pc_begin += ofs * fc->code_factor;
8203               break;
8204
8205             case DW_CFA_advance_loc4:
8206               ofs = byte_get (start, 4); start += 4;
8207               if (do_debug_frames_interp)
8208                 frame_display_row (fc, &need_col_headers, &max_regs);
8209               else
8210                 printf ("  DW_CFA_advance_loc4: %ld to %08lx\n",
8211                         ofs * fc->code_factor,
8212                         fc->pc_begin + ofs * fc->code_factor);
8213               fc->pc_begin += ofs * fc->code_factor;
8214               break;
8215
8216             case DW_CFA_offset_extended:
8217               reg = LEB ();
8218               roffs = LEB ();
8219               if (! do_debug_frames_interp)
8220                 printf ("  DW_CFA_offset_extended: r%ld at cfa%+ld\n",
8221                         reg, roffs * fc->data_factor);
8222               fc->col_type[reg] = DW_CFA_offset;
8223               fc->col_offset[reg] = roffs * fc->data_factor;
8224               break;
8225
8226             case DW_CFA_restore_extended:
8227               reg = LEB ();
8228               if (! do_debug_frames_interp)
8229                 printf ("  DW_CFA_restore_extended: r%ld\n", reg);
8230               fc->col_type[reg] = cie->col_type[reg];
8231               fc->col_offset[reg] = cie->col_offset[reg];
8232               break;
8233
8234             case DW_CFA_undefined:
8235               reg = LEB ();
8236               if (! do_debug_frames_interp)
8237                 printf ("  DW_CFA_undefined: r%ld\n", reg);
8238               fc->col_type[reg] = DW_CFA_undefined;
8239               fc->col_offset[reg] = 0;
8240               break;
8241
8242             case DW_CFA_same_value:
8243               reg = LEB ();
8244               if (! do_debug_frames_interp)
8245                 printf ("  DW_CFA_same_value: r%ld\n", reg);
8246               fc->col_type[reg] = DW_CFA_same_value;
8247               fc->col_offset[reg] = 0;
8248               break;
8249
8250             case DW_CFA_register:
8251               reg = LEB ();
8252               roffs = LEB ();
8253               if (! do_debug_frames_interp)
8254                 printf ("  DW_CFA_register: r%ld\n", reg);
8255               fc->col_type[reg] = DW_CFA_register;
8256               fc->col_offset[reg] = roffs;
8257               break;
8258
8259             case DW_CFA_remember_state:
8260               if (! do_debug_frames_interp)
8261                 printf ("  DW_CFA_remember_state\n");
8262               rs = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
8263               rs->ncols = fc->ncols;
8264               rs->col_type = (short int *) xmalloc (rs->ncols * sizeof (short int));
8265               rs->col_offset = (int *) xmalloc (rs->ncols * sizeof (int));
8266               memcpy (rs->col_type, fc->col_type, rs->ncols);
8267               memcpy (rs->col_offset, fc->col_offset, rs->ncols * sizeof (int));
8268               rs->next = remembered_state;
8269               remembered_state = rs;
8270               break;
8271
8272             case DW_CFA_restore_state:
8273               if (! do_debug_frames_interp)
8274                 printf ("  DW_CFA_restore_state\n");
8275               rs = remembered_state;
8276               remembered_state = rs->next;
8277               frame_need_space (fc, rs->ncols-1);
8278               memcpy (fc->col_type, rs->col_type, rs->ncols);
8279               memcpy (fc->col_offset, rs->col_offset, rs->ncols * sizeof (int));
8280               free (rs->col_type);
8281               free (rs->col_offset);
8282               free (rs);
8283               break;
8284
8285             case DW_CFA_def_cfa:
8286               fc->cfa_reg = LEB ();
8287               fc->cfa_offset = LEB ();
8288               if (! do_debug_frames_interp)
8289                 printf ("  DW_CFA_def_cfa: r%d ofs %d\n",
8290                         fc->cfa_reg, fc->cfa_offset);
8291               break;
8292
8293             case DW_CFA_def_cfa_register:
8294               fc->cfa_reg = LEB ();
8295               if (! do_debug_frames_interp)
8296                 printf ("  DW_CFA_def_cfa_reg: r%d\n", fc->cfa_reg);
8297               break;
8298
8299             case DW_CFA_def_cfa_offset:
8300               fc->cfa_offset = LEB ();
8301               if (! do_debug_frames_interp)
8302                 printf ("  DW_CFA_def_cfa_offset: %d\n", fc->cfa_offset);
8303               break;
8304
8305             case DW_CFA_nop:
8306               if (! do_debug_frames_interp)
8307                 printf ("  DW_CFA_nop\n");
8308               break;
8309
8310 #ifndef DW_CFA_GNU_window_save
8311 #define DW_CFA_GNU_window_save 0x2d
8312 #endif
8313             case DW_CFA_GNU_window_save:
8314               if (! do_debug_frames_interp)
8315                 printf ("  DW_CFA_GNU_window_save\n");
8316               break;
8317
8318             case DW_CFA_GNU_args_size:
8319               ul = LEB ();
8320               if (! do_debug_frames_interp)
8321                 printf ("  DW_CFA_GNU_args_size: %ld\n", ul);
8322               break;
8323
8324             case DW_CFA_GNU_negative_offset_extended:
8325               reg = LEB ();
8326               l = - LEB ();
8327               frame_need_space (fc, reg);
8328               if (! do_debug_frames_interp)
8329                 printf ("  DW_CFA_GNU_negative_offset_extended: r%ld at cfa%+ld\n",
8330                         reg, l * fc->data_factor);
8331               fc->col_type[reg] = DW_CFA_offset;
8332               fc->col_offset[reg] = l * fc->data_factor;
8333               break;
8334
8335             default:
8336               fprintf (stderr, "unsupported or unknown DW_CFA_%d\n", op);
8337               start = block_end;
8338             }
8339         }
8340
8341       if (do_debug_frames_interp)
8342         frame_display_row (fc, &need_col_headers, &max_regs);
8343
8344       start = block_end;
8345     }
8346
8347   printf ("\n");
8348
8349   return 1;
8350 }
8351
8352 #undef GET
8353 #undef LEB
8354 #undef SLEB
8355
8356 static int
8357 display_debug_not_supported (section, start, file)
8358      Elf32_Internal_Shdr * section;
8359      unsigned char *       start ATTRIBUTE_UNUSED;
8360      FILE *                file ATTRIBUTE_UNUSED;
8361 {
8362   printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
8363             SECTION_NAME (section));
8364
8365   return 1;
8366 }
8367
8368 /* Pre-scan the .debug_info section to record the size of address.
8369    When dumping the .debug_line, we use that size information, assuming
8370    that all compilation units have the same address size.  */
8371 static int
8372 prescan_debug_info (section, start, file)
8373      Elf32_Internal_Shdr * section ATTRIBUTE_UNUSED;
8374      unsigned char *       start;
8375      FILE *                file ATTRIBUTE_UNUSED;
8376 {
8377   DWARF2_External_CompUnit * external;
8378
8379   external = (DWARF2_External_CompUnit *) start;
8380
8381   debug_line_pointer_size = BYTE_GET (external->cu_pointer_size);
8382   return 0;
8383 }
8384
8385   /* A structure containing the name of a debug section and a pointer
8386      to a function that can decode it.  The third field is a prescan
8387      function to be run over the section before displaying any of the
8388      sections.  */
8389 struct
8390 {
8391   const char * const name;
8392   int (* display) PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
8393   int (* prescan) PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
8394 }
8395 debug_displays[] =
8396 {
8397   { ".debug_abbrev",      display_debug_abbrev, NULL },
8398   { ".debug_aranges",     display_debug_aranges, NULL },
8399   { ".debug_frame",       display_debug_frames, NULL },
8400   { ".debug_info",        display_debug_info, prescan_debug_info },
8401   { ".debug_line",        display_debug_lines, NULL },
8402   { ".debug_pubnames",    display_debug_pubnames, NULL },
8403   { ".eh_frame",          display_debug_frames, NULL },
8404   { ".debug_macinfo",     display_debug_macinfo, NULL },
8405   { ".debug_str",         display_debug_str, NULL },
8406   
8407   { ".debug_pubtypes",    display_debug_not_supported, NULL },
8408   { ".debug_ranges",      display_debug_not_supported, NULL },
8409   { ".debug_static_func", display_debug_not_supported, NULL },
8410   { ".debug_static_vars", display_debug_not_supported, NULL },
8411   { ".debug_types",       display_debug_not_supported, NULL },
8412   { ".debug_weaknames",   display_debug_not_supported, NULL }
8413 };
8414
8415 static int
8416 display_debug_section (section, file)
8417      Elf32_Internal_Shdr * section;
8418      FILE * file;
8419 {
8420   char *          name = SECTION_NAME (section);
8421   bfd_size_type   length;
8422   unsigned char * start;
8423   int             i;
8424
8425   length = section->sh_size;
8426   if (length == 0)
8427     {
8428       printf (_("\nSection '%s' has no debugging data.\n"), name);
8429       return 0;
8430     }
8431
8432   start = (unsigned char *) get_data (NULL, file, section->sh_offset, length,
8433                                       _("debug section data"));
8434   if (!start)
8435     return 0;
8436
8437   /* See if we know how to display the contents of this section.  */
8438   if (strncmp (name, ".gnu.linkonce.wi.", 17) == 0)
8439     name = ".debug_info";
8440
8441   for (i = NUM_ELEM (debug_displays); i--;)
8442     if (strcmp (debug_displays[i].name, name) == 0)
8443       {
8444         debug_displays[i].display (section, start, file);
8445         break;
8446       }
8447
8448   if (i == -1)
8449     printf (_("Unrecognised debug section: %s\n"), name);
8450
8451   free (start);
8452
8453   /* If we loaded in the abbrev section at some point,
8454      we must release it here.  */
8455   free_abbrevs ();
8456
8457   return 1;
8458 }
8459
8460 static int
8461 process_section_contents (file)
8462      FILE * file;
8463 {
8464   Elf32_Internal_Shdr * section;
8465   unsigned int  i;
8466
8467   if (! do_dump)
8468     return 1;
8469
8470   /* Pre-scan the debug sections to find some debug information not
8471      present in some of them.  For the .debug_line, we must find out the
8472      size of address (specified in .debug_info and .debug_aranges).  */
8473   for (i = 0, section = section_headers;
8474        i < elf_header.e_shnum && i < num_dump_sects;
8475        i ++, section ++)
8476     {
8477       char *    name = SECTION_NAME (section);
8478       int       j;
8479
8480       if (section->sh_size == 0)
8481         continue;
8482
8483       /* See if there is some pre-scan operation for this section.  */
8484       for (j = NUM_ELEM (debug_displays); j--;)
8485         if (strcmp (debug_displays[j].name, name) == 0)
8486           {
8487             if (debug_displays[j].prescan != NULL)
8488               {
8489                 bfd_size_type   length;
8490                 unsigned char * start;
8491
8492                 length = section->sh_size;
8493                 start = ((unsigned char *)
8494                          get_data (NULL, file, section->sh_offset, length,
8495                                    _("debug section data")));
8496                 if (!start)
8497                   return 0;
8498
8499                 debug_displays[j].prescan (section, start, file);
8500                 free (start);
8501               }
8502
8503             break;
8504           }
8505     }
8506
8507   for (i = 0, section = section_headers;
8508        i < elf_header.e_shnum && i < num_dump_sects;
8509        i ++, section ++)
8510     {
8511 #ifdef SUPPORT_DISASSEMBLY
8512       if (dump_sects[i] & DISASS_DUMP)
8513         disassemble_section (section, file);
8514 #endif
8515       if (dump_sects[i] & HEX_DUMP)
8516         dump_section (section, file);
8517
8518       if (dump_sects[i] & DEBUG_DUMP)
8519         display_debug_section (section, file);
8520     }
8521
8522   if (i < num_dump_sects)
8523     warn (_("Some sections were not dumped because they do not exist!\n"));
8524
8525   return 1;
8526 }
8527
8528 static void
8529 process_mips_fpe_exception (mask)
8530      int mask;
8531 {
8532   if (mask)
8533     {
8534       int first = 1;
8535       if (mask & OEX_FPU_INEX)
8536         fputs ("INEX", stdout), first = 0;
8537       if (mask & OEX_FPU_UFLO)
8538         printf ("%sUFLO", first ? "" : "|"), first = 0;
8539       if (mask & OEX_FPU_OFLO)
8540         printf ("%sOFLO", first ? "" : "|"), first = 0;
8541       if (mask & OEX_FPU_DIV0)
8542         printf ("%sDIV0", first ? "" : "|"), first = 0;
8543       if (mask & OEX_FPU_INVAL)
8544         printf ("%sINVAL", first ? "" : "|");
8545     }
8546   else
8547     fputs ("0", stdout);
8548 }
8549
8550 static int
8551 process_mips_specific (file)
8552      FILE * file;
8553 {
8554   Elf_Internal_Dyn * entry;
8555   size_t liblist_offset = 0;
8556   size_t liblistno = 0;
8557   size_t conflictsno = 0;
8558   size_t options_offset = 0;
8559   size_t conflicts_offset = 0;
8560
8561   /* We have a lot of special sections.  Thanks SGI!  */
8562   if (dynamic_segment == NULL)
8563     /* No information available.  */
8564     return 0;
8565
8566   for (entry = dynamic_segment; entry->d_tag != DT_NULL; ++entry)
8567     switch (entry->d_tag)
8568       {
8569       case DT_MIPS_LIBLIST:
8570         liblist_offset = entry->d_un.d_val - loadaddr;
8571         break;
8572       case DT_MIPS_LIBLISTNO:
8573         liblistno = entry->d_un.d_val;
8574         break;
8575       case DT_MIPS_OPTIONS:
8576         options_offset = entry->d_un.d_val - loadaddr;
8577         break;
8578       case DT_MIPS_CONFLICT:
8579         conflicts_offset = entry->d_un.d_val - loadaddr;
8580         break;
8581       case DT_MIPS_CONFLICTNO:
8582         conflictsno = entry->d_un.d_val;
8583         break;
8584       default:
8585         break;
8586       }
8587
8588   if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
8589     {
8590       Elf32_External_Lib * elib;
8591       size_t cnt;
8592
8593       elib = ((Elf32_External_Lib *)
8594               get_data (NULL, file, liblist_offset,
8595                         liblistno * sizeof (Elf32_External_Lib),
8596                         _("liblist")));
8597       if (elib)
8598         {
8599           printf ("\nSection '.liblist' contains %lu entries:\n",
8600                   (unsigned long) liblistno);
8601           fputs ("     Library              Time Stamp          Checksum   Version Flags\n",
8602                  stdout);
8603
8604           for (cnt = 0; cnt < liblistno; ++cnt)
8605             {
8606               Elf32_Lib liblist;
8607               time_t time;
8608               char timebuf[20];
8609               struct tm * tmp;
8610
8611               liblist.l_name = BYTE_GET (elib[cnt].l_name);
8612               time = BYTE_GET (elib[cnt].l_time_stamp);
8613               liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
8614               liblist.l_version = BYTE_GET (elib[cnt].l_version);
8615               liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
8616
8617               tmp = gmtime (&time);
8618               sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
8619                        tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
8620                        tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
8621
8622               printf ("%3lu: %-20s %s %#10lx %-7ld", (unsigned long) cnt,
8623                       dynamic_strings + liblist.l_name, timebuf,
8624                       liblist.l_checksum, liblist.l_version);
8625
8626               if (liblist.l_flags == 0)
8627                 puts (" NONE");
8628               else
8629                 {
8630                   static const struct
8631                   {
8632                     const char * name;
8633                     int bit;
8634                   }
8635                   l_flags_vals[] =
8636                   {
8637                     { " EXACT_MATCH", LL_EXACT_MATCH },
8638                     { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
8639                     { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
8640                     { " EXPORTS", LL_EXPORTS },
8641                     { " DELAY_LOAD", LL_DELAY_LOAD },
8642                     { " DELTA", LL_DELTA }
8643                   };
8644                   int flags = liblist.l_flags;
8645                   size_t fcnt;
8646
8647                   for (fcnt = 0;
8648                        fcnt < sizeof (l_flags_vals) / sizeof (l_flags_vals[0]);
8649                        ++fcnt)
8650                     if ((flags & l_flags_vals[fcnt].bit) != 0)
8651                       {
8652                         fputs (l_flags_vals[fcnt].name, stdout);
8653                         flags ^= l_flags_vals[fcnt].bit;
8654                       }
8655                   if (flags != 0)
8656                     printf (" %#x", (unsigned int) flags);
8657
8658                   puts ("");
8659                 }
8660             }
8661
8662           free (elib);
8663         }
8664     }
8665
8666   if (options_offset != 0)
8667     {
8668       Elf_External_Options * eopt;
8669       Elf_Internal_Shdr *    sect = section_headers;
8670       Elf_Internal_Options * iopt;
8671       Elf_Internal_Options * option;
8672       size_t offset;
8673       int cnt;
8674
8675       /* Find the section header so that we get the size.  */
8676       while (sect->sh_type != SHT_MIPS_OPTIONS)
8677         ++ sect;
8678
8679       eopt = (Elf_External_Options *) get_data (NULL, file, options_offset,
8680                                                 sect->sh_size, _("options"));
8681       if (eopt)
8682         {
8683           iopt = ((Elf_Internal_Options *)
8684                   malloc ((sect->sh_size / sizeof (eopt)) * sizeof (* iopt)));
8685           if (iopt == NULL)
8686             {
8687               error (_("Out of memory"));
8688               return 0;
8689             }
8690
8691           offset = cnt = 0;
8692           option = iopt;
8693
8694           while (offset < sect->sh_size)
8695             {
8696               Elf_External_Options * eoption;
8697
8698               eoption = (Elf_External_Options *) ((char *) eopt + offset);
8699
8700               option->kind = BYTE_GET (eoption->kind);
8701               option->size = BYTE_GET (eoption->size);
8702               option->section = BYTE_GET (eoption->section);
8703               option->info = BYTE_GET (eoption->info);
8704
8705               offset += option->size;
8706
8707               ++option;
8708               ++cnt;
8709             }
8710
8711           printf (_("\nSection '%s' contains %d entries:\n"),
8712                   SECTION_NAME (sect), cnt);
8713
8714           option = iopt;
8715
8716           while (cnt-- > 0)
8717             {
8718               size_t len;
8719
8720               switch (option->kind)
8721                 {
8722                 case ODK_NULL:
8723                   /* This shouldn't happen.  */
8724                   printf (" NULL       %d %lx", option->section, option->info);
8725                   break;
8726                 case ODK_REGINFO:
8727                   printf (" REGINFO    ");
8728                   if (elf_header.e_machine == EM_MIPS)
8729                     {
8730                       /* 32bit form.  */
8731                       Elf32_External_RegInfo * ereg;
8732                       Elf32_RegInfo            reginfo;
8733
8734                       ereg = (Elf32_External_RegInfo *) (option + 1);
8735                       reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
8736                       reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
8737                       reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
8738                       reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
8739                       reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
8740                       reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
8741
8742                       printf ("GPR %08lx  GP 0x%lx\n",
8743                               reginfo.ri_gprmask,
8744                               (unsigned long) reginfo.ri_gp_value);
8745                       printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
8746                               reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
8747                               reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
8748                     }
8749                   else
8750                     {
8751                       /* 64 bit form.  */
8752                       Elf64_External_RegInfo * ereg;
8753                       Elf64_Internal_RegInfo reginfo;
8754
8755                       ereg = (Elf64_External_RegInfo *) (option + 1);
8756                       reginfo.ri_gprmask    = BYTE_GET (ereg->ri_gprmask);
8757                       reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
8758                       reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
8759                       reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
8760                       reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
8761                       reginfo.ri_gp_value   = BYTE_GET8 (ereg->ri_gp_value);
8762
8763                       printf ("GPR %08lx  GP 0x",
8764                               reginfo.ri_gprmask);
8765                       printf_vma (reginfo.ri_gp_value);
8766                       printf ("\n");
8767
8768                       printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
8769                               reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
8770                               reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
8771                     }
8772                   ++option;
8773                   continue;
8774                 case ODK_EXCEPTIONS:
8775                   fputs (" EXCEPTIONS fpe_min(", stdout);
8776                   process_mips_fpe_exception (option->info & OEX_FPU_MIN);
8777                   fputs (") fpe_max(", stdout);
8778                   process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
8779                   fputs (")", stdout);
8780
8781                   if (option->info & OEX_PAGE0)
8782                     fputs (" PAGE0", stdout);
8783                   if (option->info & OEX_SMM)
8784                     fputs (" SMM", stdout);
8785                   if (option->info & OEX_FPDBUG)
8786                     fputs (" FPDBUG", stdout);
8787                   if (option->info & OEX_DISMISS)
8788                     fputs (" DISMISS", stdout);
8789                   break;
8790                 case ODK_PAD:
8791                   fputs (" PAD       ", stdout);
8792                   if (option->info & OPAD_PREFIX)
8793                     fputs (" PREFIX", stdout);
8794                   if (option->info & OPAD_POSTFIX)
8795                     fputs (" POSTFIX", stdout);
8796                   if (option->info & OPAD_SYMBOL)
8797                     fputs (" SYMBOL", stdout);
8798                   break;
8799                 case ODK_HWPATCH:
8800                   fputs (" HWPATCH   ", stdout);
8801                   if (option->info & OHW_R4KEOP)
8802                     fputs (" R4KEOP", stdout);
8803                   if (option->info & OHW_R8KPFETCH)
8804                     fputs (" R8KPFETCH", stdout);
8805                   if (option->info & OHW_R5KEOP)
8806                     fputs (" R5KEOP", stdout);
8807                   if (option->info & OHW_R5KCVTL)
8808                     fputs (" R5KCVTL", stdout);
8809                   break;
8810                 case ODK_FILL:
8811                   fputs (" FILL       ", stdout);
8812                   /* XXX Print content of info word?  */
8813                   break;
8814                 case ODK_TAGS:
8815                   fputs (" TAGS       ", stdout);
8816                   /* XXX Print content of info word?  */
8817                   break;
8818                 case ODK_HWAND:
8819                   fputs (" HWAND     ", stdout);
8820                   if (option->info & OHWA0_R4KEOP_CHECKED)
8821                     fputs (" R4KEOP_CHECKED", stdout);
8822                   if (option->info & OHWA0_R4KEOP_CLEAN)
8823                     fputs (" R4KEOP_CLEAN", stdout);
8824                   break;
8825                 case ODK_HWOR:
8826                   fputs (" HWOR      ", stdout);
8827                   if (option->info & OHWA0_R4KEOP_CHECKED)
8828                     fputs (" R4KEOP_CHECKED", stdout);
8829                   if (option->info & OHWA0_R4KEOP_CLEAN)
8830                     fputs (" R4KEOP_CLEAN", stdout);
8831                   break;
8832                 case ODK_GP_GROUP:
8833                   printf (" GP_GROUP  %#06lx  self-contained %#06lx",
8834                           option->info & OGP_GROUP,
8835                           (option->info & OGP_SELF) >> 16);
8836                   break;
8837                 case ODK_IDENT:
8838                   printf (" IDENT     %#06lx  self-contained %#06lx",
8839                           option->info & OGP_GROUP,
8840                           (option->info & OGP_SELF) >> 16);
8841                   break;
8842                 default:
8843                   /* This shouldn't happen.  */
8844                   printf (" %3d ???     %d %lx",
8845                           option->kind, option->section, option->info);
8846                   break;
8847                 }
8848
8849               len = sizeof (* eopt);
8850               while (len < option->size)
8851                 if (((char *) option)[len] >= ' '
8852                     && ((char *) option)[len] < 0x7f)
8853                   printf ("%c", ((char *) option)[len++]);
8854                 else
8855                   printf ("\\%03o", ((char *) option)[len++]);
8856
8857               fputs ("\n", stdout);
8858               ++option;
8859             }
8860
8861           free (eopt);
8862         }
8863     }
8864
8865   if (conflicts_offset != 0 && conflictsno != 0)
8866     {
8867       Elf32_Conflict * iconf;
8868       size_t cnt;
8869
8870       if (dynamic_symbols == NULL)
8871         {
8872           error (_("conflict list with without table"));
8873           return 0;
8874         }
8875
8876       iconf = (Elf32_Conflict *) malloc (conflictsno * sizeof (* iconf));
8877       if (iconf == NULL)
8878         {
8879           error (_("Out of memory"));
8880           return 0;
8881         }
8882
8883       if (is_32bit_elf)
8884         {
8885           Elf32_External_Conflict * econf32;
8886
8887           econf32 = ((Elf32_External_Conflict *)
8888                      get_data (NULL, file, conflicts_offset,
8889                                conflictsno * sizeof (* econf32),
8890                                _("conflict")));
8891           if (!econf32)
8892             return 0;
8893
8894           for (cnt = 0; cnt < conflictsno; ++cnt)
8895             iconf[cnt] = BYTE_GET (econf32[cnt]);
8896
8897           free (econf32);
8898         }
8899       else
8900         {
8901           Elf64_External_Conflict * econf64;
8902
8903           econf64 = ((Elf64_External_Conflict *)
8904                      get_data (NULL, file, conflicts_offset,
8905                                conflictsno * sizeof (* econf64),
8906                                _("conflict")));
8907           if (!econf64)
8908             return 0;
8909
8910           for (cnt = 0; cnt < conflictsno; ++cnt)
8911             iconf[cnt] = BYTE_GET (econf64[cnt]);
8912
8913           free (econf64);
8914         }
8915
8916       printf (_("\nSection '.conflict' contains %ld entries:\n"),
8917               (long) conflictsno);
8918       puts (_("  Num:    Index       Value  Name"));
8919
8920       for (cnt = 0; cnt < conflictsno; ++cnt)
8921         {
8922           Elf_Internal_Sym * psym = &dynamic_symbols[iconf[cnt]];
8923
8924           printf ("%5lu: %8lu  ", (unsigned long) cnt, iconf[cnt]);
8925           print_vma (psym->st_value, FULL_HEX);
8926           printf ("  %s\n", dynamic_strings + psym->st_name);
8927         }
8928
8929       free (iconf);
8930     }
8931
8932   return 1;
8933 }
8934
8935 static char *
8936 get_note_type (e_type)
8937      unsigned e_type;
8938 {
8939   static char buff[64];
8940
8941   switch (e_type)
8942     {
8943     case NT_PRSTATUS:   return _("NT_PRSTATUS (prstatus structure)");
8944     case NT_FPREGSET:   return _("NT_FPREGSET (floating point registers)");
8945     case NT_PRPSINFO:   return _("NT_PRPSINFO (prpsinfo structure)");
8946     case NT_TASKSTRUCT: return _("NT_TASKSTRUCT (task structure)");
8947     case NT_PRXFPREG:   return _("NT_PRXFPREG (user_xfpregs structure)");
8948     case NT_PSTATUS:    return _("NT_PSTATUS (pstatus structure)");
8949     case NT_FPREGS:     return _("NT_FPREGS (floating point registers)");
8950     case NT_PSINFO:     return _("NT_PSINFO (psinfo structure)");
8951     case NT_LWPSTATUS:  return _("NT_LWPSTATUS (lwpstatus_t structure)");
8952     case NT_LWPSINFO:   return _("NT_LWPSINFO (lwpsinfo_t structure)");
8953     case NT_WIN32PSTATUS: return _("NT_WIN32PSTATUS (win32_pstatus strcuture)");
8954     default:
8955       sprintf (buff, _("Unknown note type: (0x%08x)"), e_type);
8956       return buff;
8957     }
8958 }
8959
8960 /* Note that by the ELF standard, the name field is already null byte
8961    terminated, and namesz includes the terminating null byte.
8962    I.E. the value of namesz for the name "FSF" is 4.
8963
8964    If the value of namesz is zero, there is no name present.  */
8965 static int
8966 process_note (pnote)
8967   Elf32_Internal_Note * pnote;
8968 {
8969   printf ("  %s\t\t0x%08lx\t%s\n",
8970           pnote->namesz ? pnote->namedata : "(NONE)",
8971           pnote->descsz, get_note_type (pnote->type));
8972   return 1;
8973 }
8974
8975
8976 static int
8977 process_corefile_note_segment (file, offset, length)
8978      FILE * file;
8979      bfd_vma offset;
8980      bfd_vma length;
8981 {
8982   Elf_External_Note *  pnotes;
8983   Elf_External_Note *  external;
8984   int                  res = 1;
8985
8986   if (length <= 0)
8987     return 0;
8988
8989   pnotes = (Elf_External_Note *) get_data (NULL, file, offset, length,
8990                                            _("notes"));
8991   if (!pnotes)
8992     return 0;
8993
8994   external = pnotes;
8995
8996   printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
8997           (unsigned long) offset, (unsigned long) length);
8998   printf (_("  Owner\t\tData size\tDescription\n"));
8999
9000   while (external < (Elf_External_Note *)((char *) pnotes + length))
9001     {
9002       Elf32_Internal_Note inote;
9003       char * temp = NULL;
9004
9005       inote.type     = BYTE_GET (external->type);
9006       inote.namesz   = BYTE_GET (external->namesz);
9007       inote.namedata = external->name;
9008       inote.descsz   = BYTE_GET (external->descsz);
9009       inote.descdata = inote.namedata + align_power (inote.namesz, 2);
9010       inote.descpos  = offset + (inote.descdata - (char *) pnotes);
9011
9012       external = (Elf_External_Note *)(inote.descdata + align_power (inote.descsz, 2));
9013
9014       /* Verify that name is null terminated.  It appears that at least
9015          one version of Linux (RedHat 6.0) generates corefiles that don't
9016          comply with the ELF spec by failing to include the null byte in
9017          namesz.  */
9018       if (inote.namedata[inote.namesz] != '\0')
9019         {
9020           temp = malloc (inote.namesz + 1);
9021
9022           if (temp == NULL)
9023             {
9024               error (_("Out of memory\n"));
9025               res = 0;
9026               break;
9027             }
9028
9029           strncpy (temp, inote.namedata, inote.namesz);
9030           temp[inote.namesz] = 0;
9031
9032           /* warn (_("'%s' NOTE name not properly null terminated\n"), temp);  */
9033           inote.namedata = temp;
9034         }
9035
9036       res &= process_note (& inote);
9037
9038       if (temp != NULL)
9039         {
9040           free (temp);
9041           temp = NULL;
9042         }
9043     }
9044
9045   free (pnotes);
9046
9047   return res;
9048 }
9049
9050 static int
9051 process_corefile_note_segments (file)
9052      FILE * file;
9053 {
9054   Elf_Internal_Phdr * program_headers;
9055   Elf_Internal_Phdr * segment;
9056   unsigned int        i;
9057   int                 res = 1;
9058
9059   program_headers = (Elf_Internal_Phdr *) malloc
9060     (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
9061
9062   if (program_headers == NULL)
9063     {
9064       error (_("Out of memory\n"));
9065       return 0;
9066     }
9067
9068   if (is_32bit_elf)
9069     i = get_32bit_program_headers (file, program_headers);
9070   else
9071     i = get_64bit_program_headers (file, program_headers);
9072
9073   if (i == 0)
9074     {
9075       free (program_headers);
9076       return 0;
9077     }
9078
9079   for (i = 0, segment = program_headers;
9080        i < elf_header.e_phnum;
9081        i ++, segment ++)
9082     {
9083       if (segment->p_type == PT_NOTE)
9084         res &= process_corefile_note_segment (file,
9085                                               (bfd_vma) segment->p_offset,
9086                                               (bfd_vma) segment->p_filesz);
9087     }
9088
9089   free (program_headers);
9090
9091   return res;
9092 }
9093
9094 static int
9095 process_corefile_contents (file)
9096      FILE * file;
9097 {
9098   /* If we have not been asked to display the notes then do nothing.  */
9099   if (! do_notes)
9100     return 1;
9101
9102   /* If file is not a core file then exit.  */
9103   if (elf_header.e_type != ET_CORE)
9104     return 1;
9105
9106   /* No program headers means no NOTE segment.  */
9107   if (elf_header.e_phnum == 0)
9108     {
9109       printf (_("No note segments present in the core file.\n"));
9110       return 1;
9111    }
9112
9113   return process_corefile_note_segments (file);
9114 }
9115
9116 static int
9117 process_arch_specific (file)
9118      FILE * file;
9119 {
9120   if (! do_arch)
9121     return 1;
9122
9123   switch (elf_header.e_machine)
9124     {
9125     case EM_MIPS:
9126     case EM_MIPS_RS3_LE:
9127       return process_mips_specific (file);
9128       break;
9129     default:
9130       break;
9131     }
9132   return 1;
9133 }
9134
9135 static int
9136 get_file_header (file)
9137      FILE * file;
9138 {
9139   /* Read in the identity array.  */
9140   if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
9141     return 0;
9142
9143   /* Determine how to read the rest of the header.  */
9144   switch (elf_header.e_ident [EI_DATA])
9145     {
9146     default: /* fall through */
9147     case ELFDATANONE: /* fall through */
9148     case ELFDATA2LSB: byte_get = byte_get_little_endian; break;
9149     case ELFDATA2MSB: byte_get = byte_get_big_endian; break;
9150     }
9151
9152   /* For now we only support 32 bit and 64 bit ELF files.  */
9153   is_32bit_elf = (elf_header.e_ident [EI_CLASS] != ELFCLASS64);
9154
9155   /* Read in the rest of the header.  */
9156   if (is_32bit_elf)
9157     {
9158       Elf32_External_Ehdr ehdr32;
9159
9160       if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
9161         return 0;
9162
9163       elf_header.e_type      = BYTE_GET (ehdr32.e_type);
9164       elf_header.e_machine   = BYTE_GET (ehdr32.e_machine);
9165       elf_header.e_version   = BYTE_GET (ehdr32.e_version);
9166       elf_header.e_entry     = BYTE_GET (ehdr32.e_entry);
9167       elf_header.e_phoff     = BYTE_GET (ehdr32.e_phoff);
9168       elf_header.e_shoff     = BYTE_GET (ehdr32.e_shoff);
9169       elf_header.e_flags     = BYTE_GET (ehdr32.e_flags);
9170       elf_header.e_ehsize    = BYTE_GET (ehdr32.e_ehsize);
9171       elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
9172       elf_header.e_phnum     = BYTE_GET (ehdr32.e_phnum);
9173       elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
9174       elf_header.e_shnum     = BYTE_GET (ehdr32.e_shnum);
9175       elf_header.e_shstrndx  = BYTE_GET (ehdr32.e_shstrndx);
9176     }
9177   else
9178     {
9179       Elf64_External_Ehdr ehdr64;
9180
9181       /* If we have been compiled with sizeof (bfd_vma) == 4, then
9182          we will not be able to cope with the 64bit data found in
9183          64 ELF files.  Detect this now and abort before we start
9184          overwritting things.  */
9185       if (sizeof (bfd_vma) < 8)
9186         {
9187           error (_("This instance of readelf has been built without support for a\n\
9188 64 bit data type and so it cannot read 64 bit ELF files.\n"));
9189           return 0;
9190         }
9191
9192       if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
9193         return 0;
9194
9195       elf_header.e_type      = BYTE_GET (ehdr64.e_type);
9196       elf_header.e_machine   = BYTE_GET (ehdr64.e_machine);
9197       elf_header.e_version   = BYTE_GET (ehdr64.e_version);
9198       elf_header.e_entry     = BYTE_GET8 (ehdr64.e_entry);
9199       elf_header.e_phoff     = BYTE_GET8 (ehdr64.e_phoff);
9200       elf_header.e_shoff     = BYTE_GET8 (ehdr64.e_shoff);
9201       elf_header.e_flags     = BYTE_GET (ehdr64.e_flags);
9202       elf_header.e_ehsize    = BYTE_GET (ehdr64.e_ehsize);
9203       elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
9204       elf_header.e_phnum     = BYTE_GET (ehdr64.e_phnum);
9205       elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
9206       elf_header.e_shnum     = BYTE_GET (ehdr64.e_shnum);
9207       elf_header.e_shstrndx  = BYTE_GET (ehdr64.e_shstrndx);
9208     }
9209
9210   /* There may be some extensions in the first section header.  Don't
9211      bomb if we can't read it.  */
9212   if (is_32bit_elf)
9213     get_32bit_section_headers (file, 1);
9214   else
9215     get_64bit_section_headers (file, 1);
9216
9217   return 1;
9218 }
9219
9220 static int
9221 process_file (file_name)
9222      char * file_name;
9223 {
9224   FILE *       file;
9225   struct stat  statbuf;
9226   unsigned int i;
9227
9228   if (stat (file_name, & statbuf) < 0)
9229     {
9230       error (_("Cannot stat input file %s.\n"), file_name);
9231       return 1;
9232     }
9233
9234   file = fopen (file_name, "rb");
9235   if (file == NULL)
9236     {
9237       error (_("Input file %s not found.\n"), file_name);
9238       return 1;
9239     }
9240
9241   if (! get_file_header (file))
9242     {
9243       error (_("%s: Failed to read file header\n"), file_name);
9244       fclose (file);
9245       return 1;
9246     }
9247
9248   /* Initialise per file variables.  */
9249   for (i = NUM_ELEM (version_info); i--;)
9250     version_info[i] = 0;
9251
9252   for (i = NUM_ELEM (dynamic_info); i--;)
9253     dynamic_info[i] = 0;
9254
9255   /* Process the file.  */
9256   if (show_name)
9257     printf (_("\nFile: %s\n"), file_name);
9258
9259   if (! process_file_header ())
9260     {
9261       fclose (file);
9262       return 1;
9263     }
9264
9265   process_section_headers (file);
9266
9267   process_program_headers (file);
9268
9269   process_dynamic_segment (file);
9270
9271   process_relocs (file);
9272
9273   process_unwind (file);
9274
9275   process_symbol_table (file);
9276
9277   process_syminfo (file);
9278
9279   process_version_sections (file);
9280
9281   process_section_contents (file);
9282
9283   process_corefile_contents (file);
9284
9285   process_arch_specific (file);
9286
9287   fclose (file);
9288
9289   if (section_headers)
9290     {
9291       free (section_headers);
9292       section_headers = NULL;
9293     }
9294
9295   if (string_table)
9296     {
9297       free (string_table);
9298       string_table = NULL;
9299       string_table_length = 0;
9300     }
9301
9302   if (dynamic_strings)
9303     {
9304       free (dynamic_strings);
9305       dynamic_strings = NULL;
9306     }
9307
9308   if (dynamic_symbols)
9309     {
9310       free (dynamic_symbols);
9311       dynamic_symbols = NULL;
9312       num_dynamic_syms = 0;
9313     }
9314
9315   if (dynamic_syminfo)
9316     {
9317       free (dynamic_syminfo);
9318       dynamic_syminfo = NULL;
9319     }
9320
9321   return 0;
9322 }
9323
9324 #ifdef SUPPORT_DISASSEMBLY
9325 /* Needed by the i386 disassembler.  For extra credit, someone could
9326    fix this so that we insert symbolic addresses here, esp for GOT/PLT
9327    symbols.  */
9328
9329 void
9330 print_address (unsigned int addr, FILE * outfile)
9331 {
9332   fprintf (outfile,"0x%8.8x", addr);
9333 }
9334
9335 /* Needed by the i386 disassembler.  */
9336 void
9337 db_task_printsym (unsigned int addr)
9338 {
9339   print_address (addr, stderr);
9340 }
9341 #endif
9342
9343 int main PARAMS ((int, char **));
9344
9345 int
9346 main (argc, argv)
9347      int     argc;
9348      char ** argv;
9349 {
9350   int err;
9351
9352 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
9353   setlocale (LC_MESSAGES, "");
9354 #endif
9355 #if defined (HAVE_SETLOCALE)
9356   setlocale (LC_CTYPE, "");
9357 #endif
9358   bindtextdomain (PACKAGE, LOCALEDIR);
9359   textdomain (PACKAGE);
9360
9361   parse_args (argc, argv);
9362
9363   if (optind < (argc - 1))
9364     show_name = 1;
9365
9366   err = 0;
9367   while (optind < argc)
9368     err |= process_file (argv [optind ++]);
9369
9370   if (dump_sects != NULL)
9371     free (dump_sects);
9372
9373   return err;
9374 }