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