Fix displaying 64bit ELF files.
[platform/upstream/binutils.git] / binutils / readelf.c
1 /* readelf.c -- display contents of an ELF format file
2    Copyright (C) 1998, 1999 Free Software Foundation, Inc.
3
4    Originally developed by Eric Youngdale <eric@andante.jic.com>
5    Modifications by Nick Clifton <nickc@cygnus.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/stat.h>
27 #include <stdio.h>
28 #include <time.h>
29
30 #if __GNUC__ >= 2
31 /* Define BFD64 here, even if our default architecture is 32 bit ELF
32    as this will allow us to read in and parse 64bit and 32bit ELF files.
33    Only do this if we belive that the compiler can support a 64 bit
34    data type.  For now we only rely on GCC being able to do this.  */
35 #define BFD64
36 #endif
37
38 #include "bfd.h"
39
40 #include "elf/common.h"
41 #include "elf/external.h"
42 #include "elf/internal.h"
43 #include "elf/dwarf2.h"
44
45 /* The following headers use the elf/reloc-macros.h file to
46    automatically generate relocation recognition functions
47    such as elf_mips_reloc_type()  */
48
49 #define RELOC_MACROS_GEN_FUNC
50
51 #include "elf/i386.h"
52 #include "elf/v850.h"
53 #include "elf/ppc.h"
54 #include "elf/mips.h"
55 #include "elf/alpha.h"
56 #include "elf/arm.h"
57 #include "elf/m68k.h"
58 #include "elf/sparc.h"
59 #include "elf/m32r.h"
60 #include "elf/d10v.h"
61 #include "elf/d30v.h"
62 #include "elf/sh.h"
63 #include "elf/mn10200.h"
64 #include "elf/mn10300.h"
65 #include "elf/hppa.h"
66 #include "elf/arc.h"
67 #include "elf/fr30.h"
68 #include "elf/mcore.h"
69 #include "elf/i960.h"
70 #include "elf/pj.h"
71
72 #include "bucomm.h"
73 #include "getopt.h"
74
75 #ifdef ANSI_PROTOTYPES
76 #include <stdarg.h>
77 #else
78 #include <varargs.h>
79 #endif
80
81 char *                  program_name = "readelf";
82 unsigned int            dynamic_addr;
83 bfd_size_type           dynamic_size;
84 unsigned int            rela_addr;
85 unsigned int            rela_size;
86 char *                  dynamic_strings;
87 char *                  string_table;
88 unsigned long           num_dynamic_syms;
89 Elf_Internal_Sym *      dynamic_symbols;
90 Elf_Internal_Syminfo *  dynamic_syminfo;
91 unsigned long           dynamic_syminfo_offset;
92 unsigned int            dynamic_syminfo_nent;
93 char                    program_interpreter [64];
94 int                     dynamic_info[DT_JMPREL + 1];
95 int                     version_info[16];
96 int                     loadaddr = 0;
97 Elf_Internal_Ehdr       elf_header;
98 Elf_Internal_Shdr *     section_headers;
99 Elf_Internal_Dyn *      dynamic_segment;
100 int                     show_name;
101 int                     do_dynamic;
102 int                     do_syms;
103 int                     do_reloc;
104 int                     do_sections;
105 int                     do_segments;
106 int                     do_using_dynamic;
107 int                     do_header;
108 int                     do_dump;
109 int                     do_version;
110 int                     do_histogram;
111 int                     do_debugging;
112 int                     do_debug_info;
113 int                     do_debug_abbrevs;
114 int                     do_debug_lines;
115 int                     do_debug_pubnames;
116 int                     do_debug_aranges;
117 int                     do_arch;
118 int                     do_notes;
119 int                     is_32bit_elf;
120
121 /* A dynamic array of flags indicating which sections require dumping.  */
122 char *                  dump_sects = NULL;
123 unsigned int            num_dump_sects = 0;
124
125 #define HEX_DUMP        (1 << 0)
126 #define DISASS_DUMP     (1 << 1)
127 #define DEBUG_DUMP      (1 << 2)
128
129 /* Forward declarations for dumb compilers.  */
130 static bfd_vma (*         byte_get)                   PARAMS ((unsigned char *, int));
131 static bfd_vma            byte_get_little_endian      PARAMS ((unsigned char *, int));
132 static bfd_vma            byte_get_big_endian         PARAMS ((unsigned char *, int));
133 static const char *       get_mips_dynamic_type       PARAMS ((unsigned long));
134 static const char *       get_sparc64_dynamic_type    PARAMS ((unsigned long));
135 static const char *       get_parisc_dynamic_type     PARAMS ((unsigned long));
136 static const char *       get_dynamic_type            PARAMS ((unsigned long));
137 static int                dump_relocations            PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Sym *, unsigned long, char *, int));
138 static char *             get_file_type               PARAMS ((unsigned));
139 static char *             get_machine_name            PARAMS ((unsigned));
140 static char *             get_machine_flags           PARAMS ((unsigned, unsigned));
141 static const char *       get_mips_segment_type       PARAMS ((unsigned long));
142 static const char *       get_parisc_segment_type     PARAMS ((unsigned long));
143 static const char *       get_segment_type            PARAMS ((unsigned long));
144 static const char *       get_mips_section_type_name  PARAMS ((unsigned int));
145 static const char *       get_parisc_section_type_name PARAMS ((unsigned int));
146 static const char *       get_section_type_name       PARAMS ((unsigned int));
147 static char *             get_symbol_binding          PARAMS ((unsigned int));
148 static char *             get_symbol_type             PARAMS ((unsigned int));
149 static void               usage                       PARAMS ((void));
150 static void               parse_args                  PARAMS ((int, char **));
151 static int                process_file_header         PARAMS ((void));
152 static int                process_program_headers     PARAMS ((FILE *));
153 static int                process_section_headers     PARAMS ((FILE *));
154 static void               dynamic_segment_mips_val    PARAMS ((Elf_Internal_Dyn *));
155 static void               dynamic_segment_parisc_val  PARAMS ((Elf_Internal_Dyn *));
156 static int                process_dynamic_segment     PARAMS ((FILE *));
157 static int                process_symbol_table        PARAMS ((FILE *));
158 static int                process_section_contents    PARAMS ((FILE *));
159 static void               process_file                PARAMS ((char *));
160 static int                process_relocs              PARAMS ((FILE *));
161 static int                process_version_sections    PARAMS ((FILE *));
162 static char *             get_ver_flags               PARAMS ((unsigned int));
163 static char *             get_symbol_index_type       PARAMS ((unsigned int));
164 static int                get_32bit_section_headers   PARAMS ((FILE *));
165 static int                get_64bit_section_headers   PARAMS ((FILE *));
166 static int                get_32bit_program_headers   PARAMS ((FILE *, Elf_Internal_Phdr *));
167 static int                get_64bit_program_headers   PARAMS ((FILE *, Elf_Internal_Phdr *));
168 static int                get_file_header             PARAMS ((FILE *));
169 static Elf_Internal_Sym * get_32bit_elf_symbols       PARAMS ((FILE *, unsigned long, unsigned long));
170 static Elf_Internal_Sym * get_64bit_elf_symbols       PARAMS ((FILE *, unsigned long, unsigned long));
171 static int *              get_dynamic_data            PARAMS ((FILE *, unsigned int));
172 static int                get_32bit_dynamic_segment   PARAMS ((FILE *));
173 static int                get_64bit_dynamic_segment   PARAMS ((FILE *));
174 #ifdef SUPPORT_DISASSEMBLY
175 static int                disassemble_section         PARAMS ((Elf32_Internal_Shdr *, FILE *));
176 #endif
177 static int                dump_section                PARAMS ((Elf32_Internal_Shdr *, FILE *));
178 static int                display_debug_section       PARAMS ((Elf32_Internal_Shdr *, FILE *));
179 static int                display_debug_info          PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
180 static int                display_debug_not_supported PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
181 static int                display_debug_lines         PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
182 static int                display_debug_abbrev        PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
183 static int                display_debug_aranges       PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
184 static unsigned char *    process_abbrev_section      PARAMS ((unsigned char *, unsigned char *));
185 static unsigned long      read_leb128                 PARAMS ((unsigned char *, int *, int));
186 static int                process_extended_line_op    PARAMS ((unsigned char *, int, int));
187 static void               reset_state_machine         PARAMS ((int));
188 static char *             get_TAG_name                PARAMS ((unsigned long));
189 static char *             get_AT_name                 PARAMS ((unsigned long));
190 static char *             get_FORM_name               PARAMS ((unsigned long));
191 static void               free_abbrevs                PARAMS ((void));
192 static void               add_abbrev                  PARAMS ((unsigned long, unsigned long, int));
193 static void               add_abbrev_attr             PARAMS ((unsigned long, unsigned long));
194 static unsigned char *    read_and_display_attr       PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long));
195 static unsigned char *    display_block               PARAMS ((unsigned char *, unsigned long));
196 static void               decode_location_expression  PARAMS ((unsigned char *, unsigned int));
197 static void               request_dump                PARAMS ((unsigned int, char));
198 static const char *       get_elf_class               PARAMS ((unsigned char));
199 static const char *       get_data_encoding           PARAMS ((unsigned char));
200 static const char *       get_osabi_name              PARAMS ((unsigned char));
201 static int                guess_is_rela               PARAMS ((unsigned long));
202 static char *             get_note_type                  PARAMS ((unsigned int));
203 static int                process_note                   PARAMS ((Elf32_Internal_Note *));
204 static int                process_corefile_note_segment  PARAMS ((FILE *, bfd_vma, bfd_vma));
205 static int                process_corefile_note_segments PARAMS ((FILE *));
206 static int                process_corefile_contents      PARAMS ((FILE *));
207
208 typedef int Elf32_Word;
209
210 #ifndef TRUE
211 #define TRUE     1
212 #define FALSE    0
213 #endif
214 #define UNKNOWN -1
215
216 #define SECTION_NAME(X)         (string_table + (X)->sh_name)
217
218 #define DT_VERSIONTAGIDX(tag)   (DT_VERNEEDNUM - (tag)) /* Reverse order! */
219
220 #define BYTE_GET(field)         byte_get (field, sizeof (field))
221
222 /* If we can support a 64 bit data type then BFD64 should be defined
223    and sizeof (bfd_vma) == 8.  In this case when translating from an
224    external 8 byte field to an internal field, we can assume that the
225    internal field is also 8 bytes wide and so we can extact all the data.
226    If, however, BFD64 is not defined, then we must assume that the
227    internal data structure only has 4 byte wide fields that are the
228    equivalent of the 8 byte wide external counterparts, and so we must
229    truncate the data.  */
230 #ifdef  BFD64
231 #define BYTE_GET8(field)        byte_get (field, -8)
232 #else
233 #define BYTE_GET8(field)        byte_get (field, 8)
234 #endif
235
236 #define NUM_ELEM(array)         (sizeof (array) / sizeof ((array)[0]))
237
238 #define GET_DATA_ALLOC(offset, size, var, type, reason)                 \
239   if (fseek (file, offset, SEEK_SET))                                   \
240     {                                                                   \
241       error (_("Unable to seek to start of %s at %x\n"), reason, offset); \
242       return 0;                                                         \
243     }                                                                   \
244                                                                         \
245   var = (type) malloc (size);                                           \
246                                                                         \
247   if (var == NULL)                                                      \
248     {                                                                   \
249       error (_("Out of memory allocating %d bytes for %s\n"), size, reason); \
250       return 0;                                                         \
251     }                                                                   \
252                                                                         \
253   if (fread (var, size, 1, file) != 1)                                  \
254     {                                                                   \
255       error (_("Unable to read in %d bytes of %s\n"), size, reason);    \
256       free (var);                                                       \
257       var = NULL;                                                       \
258       return 0;                                                         \
259     }
260
261
262 #define GET_DATA(offset, var, reason)                                   \
263   if (fseek (file, offset, SEEK_SET))                                   \
264     {                                                                   \
265       error (_("Unable to seek to %x for %s\n"), offset, reason);       \
266       return 0;                                                         \
267     }                                                                   \
268   else if (fread (& var, sizeof (var), 1, file) != 1)                   \
269     {                                                                   \
270       error (_("Unable to read data at %x for %s\n"), offset, reason);  \
271       return 0;                                                         \
272     }
273
274 #define GET_ELF_SYMBOLS(file, offset, size)                     \
275   (is_32bit_elf ? get_32bit_elf_symbols (file, offset, size)    \
276    : get_64bit_elf_symbols (file, offset, size))
277
278
279 #ifdef ANSI_PROTOTYPES
280 static void
281 error (const char * message, ...)
282 {
283   va_list args;
284
285   fprintf (stderr, _("%s: Error: "), program_name);
286   va_start (args, message);
287   vfprintf (stderr, message, args);
288   va_end (args);
289   return;
290 }
291
292 static void
293 warn (const char * message, ...)
294 {
295   va_list args;
296
297   fprintf (stderr, _("%s: Warning: "), program_name);
298   va_start (args, message);
299   vfprintf (stderr, message, args);
300   va_end (args);
301   return;
302 }
303 #else
304 static void
305 error (va_alist)
306      va_dcl
307 {
308   char * message;
309   va_list args;
310
311   fprintf (stderr, _("%s: Error: "), program_name);
312   va_start (args);
313   message = va_arg (args, char *);
314   vfprintf (stderr, message, args);
315   va_end (args);
316   return;
317 }
318
319 static void
320 warn (va_alist)
321      va_dcl
322 {
323   char * message;
324   va_list args;
325
326   fprintf (stderr, _("%s: Warning: "), program_name);
327   va_start (args);
328   message = va_arg (args, char *);
329   vfprintf (stderr, message, args);
330   va_end (args);
331   return;
332 }
333 #endif
334
335 static bfd_vma
336 byte_get_little_endian (field, size)
337      unsigned char * field;
338      int             size;
339 {
340   switch (size)
341     {
342     case 1:
343       return * field;
344
345     case 2:
346       return  ((unsigned int) (field [0]))
347         |    (((unsigned int) (field [1])) << 8);
348
349     case 8:
350       /* We want to extract data from an 8 byte wide field and
351          place it into a 4 byte wide field.  Since this is a little
352          endian source we can juts use the 4 byte extraction code.  */
353       /* Fall through.  */
354     case 4:
355       return  ((unsigned long) (field [0]))
356         |    (((unsigned long) (field [1])) << 8)
357         |    (((unsigned long) (field [2])) << 16)
358         |    (((unsigned long) (field [3])) << 24);
359
360 #ifdef BFD64
361     case -8:
362       /* This is a special case, generated by the BYTE_GET8 macro.
363          It means that we are loading an 8 byte value from a field
364          in an external structure into an 8 byte value in a field
365          in an internal strcuture.  */
366       return  ((bfd_vma) (field [0]))
367         |    (((bfd_vma) (field [1])) << 8)
368         |    (((bfd_vma) (field [2])) << 16)
369         |    (((bfd_vma) (field [3])) << 24)
370         |    (((bfd_vma) (field [4])) << 32)
371         |    (((bfd_vma) (field [5])) << 40)
372         |    (((bfd_vma) (field [6])) << 48)
373         |    (((bfd_vma) (field [7])) << 56);
374 #endif
375     default:
376       error (_("Unhandled data length: %d\n"), size);
377       abort ();
378     }
379 }
380
381 /* Print a VMA value.  */
382 typedef enum print_mode
383 {
384   HEX,
385   DEC,
386   DEC_5,
387   UNSIGNED,
388   PREFIX_HEX,
389   FULL_HEX,
390   LONG_HEX
391 }
392 print_mode;
393
394 static void print_vma PARAMS ((bfd_vma, print_mode));
395
396 static void
397 print_vma (vma, mode)
398      bfd_vma vma;
399      print_mode mode;
400 {
401 #ifdef BFD64
402   if (is_32bit_elf)
403 #endif
404     {
405       switch (mode)
406         {
407         case FULL_HEX: printf ("0x"); /* drop through */
408         case LONG_HEX: printf ("%08.8lx", vma); break;
409         case PREFIX_HEX: printf ("0x"); /* drop through */
410         case HEX: printf ("%lx", vma); break;
411         case DEC: printf ("%ld", vma); break;
412         case DEC_5: printf ("%5ld", vma); break;
413         case UNSIGNED: printf ("%lu", vma); break;
414         }
415     }
416 #ifdef BFD64
417   else
418     {
419       switch (mode)
420         {
421         case FULL_HEX:
422           printf ("0x");
423           /* drop through */
424           
425         case LONG_HEX:
426           printf_vma (vma);
427           break;
428           
429         case PREFIX_HEX:
430           printf ("0x");
431           /* drop through */
432           
433         case HEX:
434 #if BFD_HOST_64BIT_LONG
435           printf ("%lx", vma);
436 #else
437           if (_bfd_int64_high (vma))
438             printf ("%lx%lx", _bfd_int64_high (vma), _bfd_int64_low (vma));
439           else
440             printf ("%lx", _bfd_int64_low (vma));
441 #endif
442           break;
443
444         case DEC:
445           if (_bfd_int64_high (vma))
446             /* ugg */
447             printf ("++%ld", _bfd_int64_low (vma));
448           else
449             printf ("%ld", _bfd_int64_low (vma));
450           break;
451
452         case DEC_5:
453           if (_bfd_int64_high (vma))
454             /* ugg */
455             printf ("++%ld", _bfd_int64_low (vma));
456           else
457             printf ("%5ld", _bfd_int64_low (vma));
458           break;
459           
460         case UNSIGNED:
461           if (_bfd_int64_high (vma))
462             /* ugg */
463             printf ("++%lu", _bfd_int64_low (vma));
464           else
465             printf ("%lu", _bfd_int64_low (vma));
466           break;
467         }
468     }
469 #endif
470 }
471
472 static bfd_vma
473 byte_get_big_endian (field, size)
474      unsigned char * field;
475      int             size;
476 {
477   switch (size)
478     {
479     case 1:
480       return * field;
481
482     case 2:
483       return ((unsigned int) (field [1])) | (((int) (field [0])) << 8);
484
485     case 4:
486       return ((unsigned long) (field [3]))
487         |   (((unsigned long) (field [2])) << 8)
488         |   (((unsigned long) (field [1])) << 16)
489         |   (((unsigned long) (field [0])) << 24);
490
491     case 8:
492       /* Although we are extracing data from an 8 byte wide field, we
493          are returning only 4 bytes of data.  */
494       return ((unsigned long) (field [7]))
495         |   (((unsigned long) (field [6])) << 8)
496         |   (((unsigned long) (field [5])) << 16)
497         |   (((unsigned long) (field [4])) << 24);
498
499 #ifdef BFD64
500     case -8:
501       /* This is a special case, generated by the BYTE_GET8 macro.
502          It means that we are loading an 8 byte value from a field
503          in an external structure into an 8 byte value in a field
504          in an internal strcuture.  */
505       return ((bfd_vma) (field [7]))
506         |   (((bfd_vma) (field [6])) << 8)
507         |   (((bfd_vma) (field [5])) << 16)
508         |   (((bfd_vma) (field [4])) << 24)
509         |   (((bfd_vma) (field [3])) << 32)
510         |   (((bfd_vma) (field [2])) << 40)
511         |   (((bfd_vma) (field [1])) << 48)
512         |   (((bfd_vma) (field [0])) << 56);
513 #endif
514
515     default:
516       error (_("Unhandled data length: %d\n"), size);
517       abort ();
518     }
519 }
520
521
522 /* Guess the relocation sized based on the sized commonly used by the specific machine.  */
523 static int
524 guess_is_rela (e_machine)
525      unsigned long e_machine;
526 {
527   switch (e_machine)
528     {
529       /* Targets that use REL relocations.  */
530     case EM_ARM:
531     case EM_386:
532     case EM_486:
533     case EM_960:
534     case EM_CYGNUS_M32R:
535     case EM_CYGNUS_D10V:
536     case EM_MIPS:
537     case EM_MIPS_RS4_BE:
538       return FALSE;
539
540       /* Targets that use RELA relocations.  */
541     case EM_68K:
542     case EM_SPARC32PLUS:
543     case EM_SPARCV9:
544     case EM_SPARC:
545     case EM_PPC:
546     case EM_CYGNUS_V850:
547     case EM_CYGNUS_D30V:
548     case EM_CYGNUS_MN10200:
549     case EM_CYGNUS_MN10300:
550     case EM_CYGNUS_FR30:
551     case EM_SH:
552     case EM_ALPHA:
553     case EM_MCORE:
554       return TRUE;
555
556     default:
557       warn (_("Don't know about relocations on this machine architecture\n"));
558       return FALSE;
559     }
560 }
561
562 /* Display the contents of the relocation data found at the specified offset.  */
563 static int
564 dump_relocations (file, rel_offset, rel_size, symtab, nsyms, strtab, is_rela)
565      FILE *             file;
566      unsigned long      rel_offset;
567      unsigned long      rel_size;
568      Elf_Internal_Sym * symtab;
569      unsigned long      nsyms;
570      char *             strtab;
571      int                is_rela;
572 {
573   unsigned int        i;
574   Elf_Internal_Rel *  rels;
575   Elf_Internal_Rela * relas;
576
577
578   if (is_rela == UNKNOWN)
579     is_rela = guess_is_rela (elf_header.e_machine);
580
581   if (is_rela)
582     {
583       if (is_32bit_elf)
584         {
585           Elf32_External_Rela * erelas;
586
587           GET_DATA_ALLOC (rel_offset, rel_size, erelas,
588                           Elf32_External_Rela *, "relocs");
589
590           rel_size = rel_size / sizeof (Elf32_External_Rela);
591
592           relas = (Elf_Internal_Rela *)
593             malloc (rel_size * sizeof (Elf_Internal_Rela));
594
595           if (relas == NULL)
596             {
597               error(_("out of memory parsing relocs"));
598               return 0;
599             }
600
601           for (i = 0; i < rel_size; i++)
602             {
603               relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
604               relas[i].r_info   = BYTE_GET (erelas[i].r_info);
605               relas[i].r_addend = BYTE_GET (erelas[i].r_addend);
606             }
607
608           free (erelas);
609
610           rels = (Elf_Internal_Rel *) relas;
611         }
612       else
613         {
614           Elf64_External_Rela * erelas;
615
616           GET_DATA_ALLOC (rel_offset, rel_size, erelas,
617                           Elf64_External_Rela *, "relocs");
618
619           rel_size = rel_size / sizeof (Elf64_External_Rela);
620
621           relas = (Elf_Internal_Rela *)
622             malloc (rel_size * sizeof (Elf_Internal_Rela));
623
624           if (relas == NULL)
625             {
626               error(_("out of memory parsing relocs"));
627               return 0;
628             }
629
630           for (i = 0; i < rel_size; i++)
631             {
632               relas[i].r_offset = BYTE_GET8 (erelas[i].r_offset);
633               relas[i].r_info   = BYTE_GET8 (erelas[i].r_info);
634               relas[i].r_addend = BYTE_GET8 (erelas[i].r_addend);
635             }
636
637           free (erelas);
638
639           rels = (Elf_Internal_Rel *) relas;
640         }
641     }
642   else
643     {
644       if (is_32bit_elf)
645         {
646           Elf32_External_Rel * erels;
647
648           GET_DATA_ALLOC (rel_offset, rel_size, erels,
649                           Elf32_External_Rel *, "relocs");
650
651           rel_size = rel_size / sizeof (Elf32_External_Rel);
652
653           rels = (Elf_Internal_Rel *)
654             malloc (rel_size * sizeof (Elf_Internal_Rel));
655
656           if (rels == NULL)
657             {
658               error(_("out of memory parsing relocs"));
659               return 0;
660             }
661
662           for (i = 0; i < rel_size; i++)
663             {
664               rels[i].r_offset = BYTE_GET (erels[i].r_offset);
665               rels[i].r_info   = BYTE_GET (erels[i].r_info);
666             }
667
668           free (erels);
669
670           relas = (Elf_Internal_Rela *) rels;
671         }
672       else
673         {
674           Elf64_External_Rel * erels;
675
676           GET_DATA_ALLOC (rel_offset, rel_size, erels,
677                           Elf64_External_Rel *, "relocs");
678
679           rel_size = rel_size / sizeof (Elf64_External_Rel);
680
681           rels = (Elf_Internal_Rel *)
682             malloc (rel_size * sizeof (Elf_Internal_Rel));
683
684           if (rels == NULL)
685             {
686               error(_("out of memory parsing relocs"));
687               return 0;
688             }
689
690           for (i = 0; i < rel_size; i++)
691             {
692               rels[i].r_offset = BYTE_GET8 (erels[i].r_offset);
693               rels[i].r_info   = BYTE_GET8 (erels[i].r_info);
694             }
695
696           free (erels);
697
698           relas = (Elf_Internal_Rela *) rels;
699         }
700     }
701
702   if (is_rela)
703     printf
704       (_("  Offset    Info  Type            Symbol's Value  Symbol's Name          Addend\n"));
705   else
706     printf
707       (_("  Offset    Info  Type            Symbol's Value  Symbol's Name\n"));
708
709   for (i = 0; i < rel_size; i++)
710     {
711       const char * rtype;
712       bfd_vma      offset;
713       bfd_vma      info;
714       bfd_vma      symtab_index;
715       bfd_vma      type;
716
717       if (is_rela)
718         {
719           offset = relas [i].r_offset;
720           info   = relas [i].r_info;
721         }
722       else
723         {
724           offset = rels [i].r_offset;
725           info   = rels [i].r_info;
726         }
727
728       if (is_32bit_elf)
729         {
730           type         = ELF32_R_TYPE (info);
731           symtab_index = ELF32_R_SYM  (info);
732         }
733       else
734         {
735           if (elf_header.e_machine == EM_SPARCV9)
736             type       = ELF64_R_TYPE_ID (info);
737           else
738             type       = ELF64_R_TYPE (info);
739           /* The #ifdef BFD64 below is to prevent a compile time warning.
740              We know that if we do not have a 64 bit data type that we
741              will never execute this code anyway.  */
742 #ifdef BFD64
743           symtab_index = ELF64_R_SYM  (info);
744 #endif
745         }
746
747 #ifdef _bfd_int64_low
748       printf ("  %8.8lx  %5.5lx ", _bfd_int64_low (offset), _bfd_int64_low (info));
749 #else
750       printf ("  %8.8lx  %5.5lx ", offset, info);
751 #endif
752
753       switch (elf_header.e_machine)
754         {
755         default:
756           rtype = NULL;
757           break;
758
759         case EM_CYGNUS_M32R:
760           rtype = elf_m32r_reloc_type (type);
761           break;
762
763         case EM_386:
764         case EM_486:
765           rtype = elf_i386_reloc_type (type);
766           break;
767
768         case EM_68K:
769           rtype = elf_m68k_reloc_type (type);
770           break;
771
772         case EM_960:
773           rtype = elf_i960_reloc_type (type);
774           break;
775
776         case EM_OLD_SPARCV9:
777         case EM_SPARC32PLUS:
778         case EM_SPARCV9:
779         case EM_SPARC:
780           rtype = elf_sparc_reloc_type (type);
781           break;
782
783         case EM_CYGNUS_V850:
784           rtype = v850_reloc_type (type);
785           break;
786
787         case EM_CYGNUS_D10V:
788           rtype = elf_d10v_reloc_type (type);
789           break;
790
791         case EM_CYGNUS_D30V:
792           rtype = elf_d30v_reloc_type (type);
793           break;
794
795         case EM_SH:
796           rtype = elf_sh_reloc_type (type);
797           break;
798
799         case EM_CYGNUS_MN10300:
800           rtype = elf_mn10300_reloc_type (type);
801           break;
802
803         case EM_CYGNUS_MN10200:
804           rtype = elf_mn10200_reloc_type (type);
805           break;
806
807         case EM_CYGNUS_FR30:
808           rtype = elf_fr30_reloc_type (type);
809           break;
810
811         case EM_MCORE:
812           rtype = elf_mcore_reloc_type (type);
813           break;
814
815         case EM_PPC:
816           rtype = elf_ppc_reloc_type (type);
817           break;
818
819         case EM_MIPS:
820         case EM_MIPS_RS4_BE:
821           rtype = elf_mips_reloc_type (type);
822           break;
823
824         case EM_ALPHA:
825           rtype = elf_alpha_reloc_type (type);
826           break;
827
828         case EM_ARM:
829           rtype = elf_arm_reloc_type (type);
830           break;
831
832         case EM_CYGNUS_ARC:
833           rtype = elf_arc_reloc_type (type);
834           break;
835
836         case EM_PARISC:
837           rtype = elf_hppa_reloc_type (type);
838           break;
839
840         case EM_PJ:
841           rtype = elf_pj_reloc_type (type);
842           break;
843         }
844
845       if (rtype == NULL)
846 #ifdef _bfd_int64_low
847         printf (_("unrecognised: %-7lx"), _bfd_int64_low (type));
848 #else
849         printf (_("unrecognised: %-7lx"), type);
850 #endif
851       else
852         printf ("%-21.21s", rtype);
853
854       if (symtab_index)
855         {
856           if (symtab != NULL)
857             {
858               if (symtab_index >= nsyms)
859                 printf (" bad symbol index: %08lx", (unsigned long) symtab_index);
860               else
861                 {
862                   Elf_Internal_Sym * psym;
863
864                   psym = symtab + symtab_index;
865
866                   printf (" ");
867                   print_vma (psym->st_value, LONG_HEX);
868                   printf ("  ");
869
870                   if (psym->st_name == 0)
871                     printf ("%-25.25s",
872                             SECTION_NAME (section_headers + psym->st_shndx));
873                   else if (strtab == NULL)
874                     printf (_("<string table index %3ld>"), psym->st_name);
875                   else
876                     printf ("%-25.25s", strtab + psym->st_name);
877
878                   if (is_rela)
879                     printf (" + %lx", (unsigned long) relas [i].r_addend);
880                 }
881             }
882         }
883       else if (is_rela)
884         {
885           printf ("%*c", is_32bit_elf ? 34 : 26, ' ');
886           print_vma (relas[i].r_addend, LONG_HEX);
887         }
888
889       if (elf_header.e_machine == EM_SPARCV9
890           && !strcmp (rtype, "R_SPARC_OLO10"))
891         printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info));
892
893       putchar ('\n');
894     }
895
896   free (relas);
897
898   return 1;
899 }
900
901 static const char *
902 get_mips_dynamic_type (type)
903      unsigned long type;
904 {
905   switch (type)
906     {
907     case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
908     case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
909     case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
910     case DT_MIPS_IVERSION: return "MIPS_IVERSION";
911     case DT_MIPS_FLAGS: return "MIPS_FLAGS";
912     case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
913     case DT_MIPS_MSYM: return "MIPS_MSYM";
914     case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
915     case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
916     case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
917     case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
918     case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
919     case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
920     case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
921     case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
922     case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
923     case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
924     case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
925     case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
926     case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
927     case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
928     case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
929     case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
930     case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
931     case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
932     case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
933     case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
934     case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
935     case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
936     case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
937     case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
938     case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
939     case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
940     case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
941     case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
942     case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
943     case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
944     case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
945     case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
946     case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
947     case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
948     case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
949     case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
950     default:
951       return NULL;
952     }
953 }
954
955 static const char *
956 get_sparc64_dynamic_type (type)
957      unsigned long type;
958 {
959   switch (type)
960     {
961     case DT_SPARC_REGISTER: return "SPARC_REGISTER";
962     default:
963       return NULL;
964     }
965 }
966
967 static const char *
968 get_parisc_dynamic_type (type)
969      unsigned long type;
970 {
971   switch (type)
972     {
973     case DT_HP_LOAD_MAP:        return "HP_LOAD_MAP";
974     case DT_HP_DLD_FLAGS:       return "HP_DLD_FLAGS";
975     case DT_HP_DLD_HOOK:        return "HP_DLD_HOOK";
976     case DT_HP_UX10_INIT:       return "HP_UX10_INIT";
977     case DT_HP_UX10_INITSZ:     return "HP_UX10_INITSZ";
978     case DT_HP_PREINIT:         return "HP_PREINIT";
979     case DT_HP_PREINITSZ:       return "HP_PREINITSZ";
980     case DT_HP_NEEDED:          return "HP_NEEDED";
981     case DT_HP_TIME_STAMP:      return "HP_TIME_STAMP";
982     case DT_HP_CHECKSUM:        return "HP_CHECKSUM";
983     case DT_HP_GST_SIZE:        return "HP_GST_SIZE";
984     case DT_HP_GST_VERSION:     return "HP_GST_VERSION";
985     case DT_HP_GST_HASHVAL:     return "HP_GST_HASHVAL";
986     default:
987       return NULL;
988     }
989 }
990
991 static const char *
992 get_dynamic_type (type)
993      unsigned long type;
994 {
995   static char buff [32];
996
997   switch (type)
998     {
999     case DT_NULL:       return "NULL";
1000     case DT_NEEDED:     return "NEEDED";
1001     case DT_PLTRELSZ:   return "PLTRELSZ";
1002     case DT_PLTGOT:     return "PLTGOT";
1003     case DT_HASH:       return "HASH";
1004     case DT_STRTAB:     return "STRTAB";
1005     case DT_SYMTAB:     return "SYMTAB";
1006     case DT_RELA:       return "RELA";
1007     case DT_RELASZ:     return "RELASZ";
1008     case DT_RELAENT:    return "RELAENT";
1009     case DT_STRSZ:      return "STRSZ";
1010     case DT_SYMENT:     return "SYMENT";
1011     case DT_INIT:       return "INIT";
1012     case DT_FINI:       return "FINI";
1013     case DT_SONAME:     return "SONAME";
1014     case DT_RPATH:      return "RPATH";
1015     case DT_SYMBOLIC:   return "SYMBOLIC";
1016     case DT_REL:        return "REL";
1017     case DT_RELSZ:      return "RELSZ";
1018     case DT_RELENT:     return "RELENT";
1019     case DT_PLTREL:     return "PLTREL";
1020     case DT_DEBUG:      return "DEBUG";
1021     case DT_TEXTREL:    return "TEXTREL";
1022     case DT_JMPREL:     return "JMPREL";
1023     case DT_BIND_NOW:   return "BIND_NOW";
1024     case DT_INIT_ARRAY: return "INIT_ARRAY";
1025     case DT_FINI_ARRAY: return "FINI_ARRAY";
1026     case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
1027     case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
1028
1029     case DT_PLTPADSZ:   return "PLTPADSZ";
1030     case DT_MOVEENT:    return "MOVEENT";
1031     case DT_MOVESZ:     return "MOVESZ";
1032     case DT_FEATURE_1:  return "FEATURE_1";
1033     case DT_POSFLAG_1:  return "POSFLAG_1";
1034     case DT_SYMINSZ:    return "SYMINSZ";
1035     case DT_SYMINENT:   return "SYMINENT"; /* aka VALRNGHI */
1036
1037     case DT_ADDRRNGLO:  return "ADDRRNGLO";
1038     case DT_SYMINFO:    return "SYMINFO"; /* aka ADDRRNGHI */
1039
1040     case DT_VERSYM:     return "VERSYM";
1041
1042     case DT_RELACOUNT:  return "RELACOUNT";
1043     case DT_RELCOUNT:   return "RELCOUNT";
1044     case DT_FLAGS_1:    return "FLAGS_1";
1045     case DT_VERDEF:     return "VERDEF";
1046     case DT_VERDEFNUM:  return "VERDEFNUM";
1047     case DT_VERNEED:    return "VERNEED";
1048     case DT_VERNEEDNUM: return "VERNEEDNUM";
1049
1050     case DT_AUXILIARY:  return "AUXILARY";
1051     case DT_USED:       return "USED";
1052     case DT_FILTER:     return "FILTER";
1053
1054     default:
1055       if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
1056         {
1057           const char * result;
1058
1059           switch (elf_header.e_machine)
1060             {
1061             case EM_MIPS:
1062             case EM_MIPS_RS4_BE:
1063               result = get_mips_dynamic_type (type);
1064               break;
1065             case EM_SPARCV9:
1066               result = get_sparc64_dynamic_type (type);
1067               break;
1068             default:
1069               result = NULL;
1070               break;
1071             }
1072
1073           if (result != NULL)
1074             return result;
1075
1076           sprintf (buff, _("Processor Specific: %lx"), type);
1077         }
1078       else if ((type >= DT_LOOS) && (type <= DT_HIOS))
1079         {
1080           const char * result;
1081
1082           switch (elf_header.e_machine)
1083             {
1084             case EM_PARISC:
1085               result = get_parisc_dynamic_type (type);
1086               break;
1087             default:
1088               result = NULL;
1089               break;
1090             }
1091
1092           if (result != NULL)
1093             return result;
1094
1095           sprintf (buff, _("Operating System specific: %lx"), type);
1096         }
1097       else
1098         sprintf (buff, _("<unknown>: %lx"), type);
1099
1100       return buff;
1101     }
1102 }
1103
1104 static char *
1105 get_file_type (e_type)
1106      unsigned e_type;
1107 {
1108   static char buff [32];
1109
1110   switch (e_type)
1111     {
1112     case ET_NONE:       return _("NONE (None)");
1113     case ET_REL:        return _("REL (Relocatable file)");
1114     case ET_EXEC:       return _("EXEC (Executable file)");
1115     case ET_DYN:        return _("DYN (Shared object file)");
1116     case ET_CORE:       return _("CORE (Core file)");
1117
1118     default:
1119       if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
1120         sprintf (buff, _("Processor Specific: (%x)"), e_type);
1121       else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
1122         sprintf (buff, _("OS Specific: (%x)"), e_type);
1123       else
1124         sprintf (buff, _("<unknown>: %x"), e_type);
1125       return buff;
1126     }
1127 }
1128
1129 static char *
1130 get_machine_name (e_machine)
1131      unsigned e_machine;
1132 {
1133   static char buff [32];
1134
1135   switch (e_machine)
1136     {
1137     case EM_NONE:               return _("None");
1138     case EM_M32:                return "WE32100";
1139     case EM_SPARC:              return "Sparc";
1140     case EM_386:                return "Intel 80386";
1141     case EM_68K:                return "MC68000";
1142     case EM_88K:                return "MC88000";
1143     case EM_486:                return "Intel 80486";
1144     case EM_860:                return "Intel 80860";
1145     case EM_MIPS:               return "MIPS R3000 big-endian";
1146     case EM_S370:               return "Amdahl";
1147     case EM_MIPS_RS4_BE:        return "MIPS R4000 big-endian";
1148     case EM_OLD_SPARCV9:        return "Sparc v9 (old)";
1149     case EM_PARISC:             return "HPPA";
1150     case EM_PPC_OLD:            return "Power PC (old)";
1151     case EM_SPARC32PLUS:        return "Sparc v8+" ;
1152     case EM_960:                return "Intel 90860";
1153     case EM_PPC:                return "PowerPC";
1154     case EM_V800:               return "NEC V800";
1155     case EM_FR20:               return "Fujitsu FR20";
1156     case EM_RH32:               return "TRW RH32";
1157     case EM_MCORE:              return "MCORE";
1158     case EM_ARM:                return "ARM";
1159     case EM_OLD_ALPHA:          return "Digital Alpha (old)";
1160     case EM_SH:                 return "Hitachi SH";
1161     case EM_SPARCV9:            return "Sparc v9";
1162     case EM_TRICORE:            return "Siemens Tricore";
1163     case EM_ARC:                return "Argonaut RISC Core";
1164     case EM_H8_300:             return "Hitachi H8/300";
1165     case EM_H8_300H:            return "Hitachi H8/300H";
1166     case EM_H8S:                return "Hitachi H8S";
1167     case EM_H8_500:             return "Hitachi H8/500";
1168     case EM_IA_64:              return "Intel Merced";
1169     case EM_MIPS_X:             return "Stanford MIPS-X";
1170     case EM_COLDFIRE:           return "Motorola Coldfire";
1171     case EM_68HC12:             return "Motorola M68HC12";
1172     case EM_ALPHA:              return "Alpha";
1173     case EM_CYGNUS_D10V:        return "d10v";
1174     case EM_CYGNUS_D30V:        return "d30v";
1175     case EM_CYGNUS_ARC:         return "Arc";
1176     case EM_CYGNUS_M32R:        return "Mitsubishi M32r";
1177     case EM_CYGNUS_V850:        return "NEC v850";
1178     case EM_CYGNUS_MN10300:     return "mn10300";
1179     case EM_CYGNUS_MN10200:     return "mn10200";
1180     case EM_CYGNUS_FR30:        return "Fujitsu FR30";
1181     case EM_PJ:                 return "picoJava";
1182     default:
1183       sprintf (buff, _("<unknown>: %x"), e_machine);
1184       return buff;
1185     }
1186 }
1187
1188 static char *
1189 get_machine_flags (e_flags, e_machine)
1190      unsigned e_flags;
1191      unsigned e_machine;
1192 {
1193   static char buf [1024];
1194
1195   buf[0] = '\0';
1196   if (e_flags)
1197     {
1198       switch (e_machine)
1199         {
1200         default:
1201           break;
1202
1203         case EM_68K:
1204           if (e_flags & EF_CPU32)
1205             strcat (buf, ", cpu32");
1206           break;
1207
1208         case EM_PPC:
1209           if (e_flags & EF_PPC_EMB)
1210             strcat (buf, ", emb");
1211
1212           if (e_flags & EF_PPC_RELOCATABLE)
1213             strcat (buf, ", relocatable");
1214
1215           if (e_flags & EF_PPC_RELOCATABLE_LIB)
1216             strcat (buf, ", relocatable-lib");
1217           break;
1218
1219         case EM_CYGNUS_V850:
1220           switch (e_flags & EF_V850_ARCH)
1221             {
1222             case E_V850E_ARCH:
1223               strcat (buf, ", v850e");
1224               break;
1225             case E_V850EA_ARCH:
1226               strcat (buf, ", v850ea");
1227               break;
1228             case E_V850_ARCH:
1229               strcat (buf, ", v850");
1230               break;
1231             default:
1232               strcat (buf, ", unknown v850 architecture variant");
1233               break;
1234             }
1235           break;
1236
1237         case EM_CYGNUS_M32R:
1238           if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
1239             strcat (buf, ", m32r");
1240
1241           break;
1242
1243         case EM_MIPS:
1244         case EM_MIPS_RS4_BE:
1245           if (e_flags & EF_MIPS_NOREORDER)
1246             strcat (buf, ", noreorder");
1247
1248           if (e_flags & EF_MIPS_PIC)
1249             strcat (buf, ", pic");
1250
1251           if (e_flags & EF_MIPS_CPIC)
1252             strcat (buf, ", cpic");
1253
1254           if (e_flags & EF_MIPS_ABI2)
1255             strcat (buf, ", abi2");
1256
1257           if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_1)
1258             strcat (buf, ", mips1");
1259
1260           if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_2)
1261             strcat (buf, ", mips2");
1262
1263           if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_3)
1264             strcat (buf, ", mips3");
1265
1266           if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_4)
1267             strcat (buf, ", mips4");
1268           break;
1269
1270         case EM_SPARCV9:
1271           if (e_flags & EF_SPARC_32PLUS)
1272             strcat (buf, ", v8+");
1273
1274           if (e_flags & EF_SPARC_SUN_US1)
1275             strcat (buf, ", ultrasparcI");
1276
1277           if (e_flags & EF_SPARC_SUN_US3)
1278             strcat (buf, ", ultrasparcIII");
1279
1280           if (e_flags & EF_SPARC_HAL_R1)
1281             strcat (buf, ", halr1");
1282
1283           if (e_flags & EF_SPARC_LEDATA)
1284             strcat (buf, ", ledata");
1285
1286           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
1287             strcat (buf, ", tso");
1288
1289           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
1290             strcat (buf, ", pso");
1291
1292           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
1293             strcat (buf, ", rmo");
1294           break;
1295
1296         case EM_PARISC:
1297           switch (e_flags & EF_PARISC_ARCH)
1298             {
1299             case EFA_PARISC_1_0:
1300               strcpy (buf, ", PA-RISC 1.0");
1301               break;
1302             case EFA_PARISC_1_1:
1303               strcpy (buf, ", PA-RISC 1.1");
1304               break;
1305             case EFA_PARISC_2_0:
1306               strcpy (buf, ", PA-RISC 2.0");
1307               break;
1308             default:
1309               break;
1310             }
1311           if (e_flags & EF_PARISC_TRAPNIL)
1312             strcat (buf, ", trapnil");
1313           if (e_flags & EF_PARISC_EXT)
1314             strcat (buf, ", ext");
1315           if (e_flags & EF_PARISC_LSB)
1316             strcat (buf, ", lsb");
1317           if (e_flags & EF_PARISC_WIDE)
1318             strcat (buf, ", wide");
1319           if (e_flags & EF_PARISC_NO_KABP)
1320             strcat (buf, ", no kabp");
1321           if (e_flags & EF_PARISC_LAZYSWAP)
1322             strcat (buf, ", lazyswap");
1323
1324         case EM_PJ:
1325           if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
1326             strcat (buf, ", new calling convention");
1327
1328           if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
1329             strcat (buf, ", gnu calling convention");
1330           break;
1331         }
1332     }
1333
1334   return buf;
1335 }
1336
1337 static const char *
1338 get_mips_segment_type (type)
1339      unsigned long type;
1340 {
1341   switch (type)
1342     {
1343     case PT_MIPS_REGINFO:
1344       return "REGINFO";
1345     case PT_MIPS_RTPROC:
1346       return "RTPROC";
1347     case PT_MIPS_OPTIONS:
1348       return "OPTIONS";
1349     default:
1350       break;
1351     }
1352
1353   return NULL;
1354 }
1355
1356 static const char *
1357 get_parisc_segment_type (type)
1358      unsigned long type;
1359 {
1360   switch (type)
1361     {
1362     case PT_HP_TLS:             return "HP_TLS";
1363     case PT_HP_CORE_NONE:       return "HP_CORE_NONE";
1364     case PT_HP_CORE_VERSION:    return "HP_CORE_VERSION";
1365     case PT_HP_CORE_KERNEL:     return "HP_CORE_KERNEL";
1366     case PT_HP_CORE_COMM:       return "HP_CORE_COMM";
1367     case PT_HP_CORE_PROC:       return "HP_CORE_PROC";
1368     case PT_HP_CORE_LOADABLE:   return "HP_CORE_LOADABLE";
1369     case PT_HP_CORE_STACK:      return "HP_CORE_STACK";
1370     case PT_HP_CORE_SHM:        return "HP_CORE_SHM";
1371     case PT_HP_CORE_MMF:        return "HP_CORE_MMF";
1372     case PT_HP_PARALLEL:        return "HP_PARALLEL";
1373     case PT_HP_FASTBIND:        return "HP_FASTBIND";
1374     case PT_PARISC_ARCHEXT:     return "PARISC_ARCHEXT";
1375     case PT_PARISC_UNWIND:      return "PARISC_UNWIND";
1376     default:
1377       break;
1378     }
1379
1380   return NULL;
1381 }
1382
1383 static const char *
1384 get_segment_type (p_type)
1385      unsigned long p_type;
1386 {
1387   static char buff [32];
1388
1389   switch (p_type)
1390     {
1391     case PT_NULL:       return "NULL";
1392     case PT_LOAD:       return "LOAD";
1393     case PT_DYNAMIC:    return "DYNAMIC";
1394     case PT_INTERP:     return "INTERP";
1395     case PT_NOTE:       return "NOTE";
1396     case PT_SHLIB:      return "SHLIB";
1397     case PT_PHDR:       return "PHDR";
1398
1399     default:
1400       if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
1401         {
1402           const char * result;
1403
1404           switch (elf_header.e_machine)
1405             {
1406             case EM_MIPS:
1407             case EM_MIPS_RS4_BE:
1408               result = get_mips_segment_type (p_type);
1409               break;
1410             case EM_PARISC:
1411               result = get_parisc_segment_type (p_type);
1412               break;
1413             default:
1414               result = NULL;
1415               break;
1416             }
1417
1418           if (result != NULL)
1419             return result;
1420
1421           sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
1422         }
1423       else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
1424         {
1425           const char * result;
1426
1427           switch (elf_header.e_machine)
1428             {
1429             case EM_PARISC:
1430               result = get_parisc_segment_type (p_type);
1431               break;
1432             default:
1433               result = NULL;
1434               break;
1435             }
1436
1437           if (result != NULL)
1438             return result;
1439
1440           sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
1441         }
1442       else
1443         sprintf (buff, _("<unknown>: %lx"), p_type);
1444
1445       return buff;
1446     }
1447 }
1448
1449 static const char *
1450 get_mips_section_type_name (sh_type)
1451      unsigned int sh_type;
1452 {
1453   switch (sh_type)
1454     {
1455     case SHT_MIPS_LIBLIST:       return "MIPS_LIBLIST";
1456     case SHT_MIPS_MSYM:          return "MIPS_MSYM";
1457     case SHT_MIPS_CONFLICT:      return "MIPS_CONFLICT";
1458     case SHT_MIPS_GPTAB:         return "MIPS_GPTAB";
1459     case SHT_MIPS_UCODE:         return "MIPS_UCODE";
1460     case SHT_MIPS_DEBUG:         return "MIPS_DEBUG";
1461     case SHT_MIPS_REGINFO:       return "MIPS_REGINFO";
1462     case SHT_MIPS_PACKAGE:       return "MIPS_PACKAGE";
1463     case SHT_MIPS_PACKSYM:       return "MIPS_PACKSYM";
1464     case SHT_MIPS_RELD:          return "MIPS_RELD";
1465     case SHT_MIPS_IFACE:         return "MIPS_IFACE";
1466     case SHT_MIPS_CONTENT:       return "MIPS_CONTENT";
1467     case SHT_MIPS_OPTIONS:       return "MIPS_OPTIONS";
1468     case SHT_MIPS_SHDR:          return "MIPS_SHDR";
1469     case SHT_MIPS_FDESC:         return "MIPS_FDESC";
1470     case SHT_MIPS_EXTSYM:        return "MIPS_EXTSYM";
1471     case SHT_MIPS_DENSE:         return "MIPS_DENSE";
1472     case SHT_MIPS_PDESC:         return "MIPS_PDESC";
1473     case SHT_MIPS_LOCSYM:        return "MIPS_LOCSYM";
1474     case SHT_MIPS_AUXSYM:        return "MIPS_AUXSYM";
1475     case SHT_MIPS_OPTSYM:        return "MIPS_OPTSYM";
1476     case SHT_MIPS_LOCSTR:        return "MIPS_LOCSTR";
1477     case SHT_MIPS_LINE:          return "MIPS_LINE";
1478     case SHT_MIPS_RFDESC:        return "MIPS_RFDESC";
1479     case SHT_MIPS_DELTASYM:      return "MIPS_DELTASYM";
1480     case SHT_MIPS_DELTAINST:     return "MIPS_DELTAINST";
1481     case SHT_MIPS_DELTACLASS:    return "MIPS_DELTACLASS";
1482     case SHT_MIPS_DWARF:         return "MIPS_DWARF";
1483     case SHT_MIPS_DELTADECL:     return "MIPS_DELTADECL";
1484     case SHT_MIPS_SYMBOL_LIB:    return "MIPS_SYMBOL_LIB";
1485     case SHT_MIPS_EVENTS:        return "MIPS_EVENTS";
1486     case SHT_MIPS_TRANSLATE:     return "MIPS_TRANSLATE";
1487     case SHT_MIPS_PIXIE:         return "MIPS_PIXIE";
1488     case SHT_MIPS_XLATE:         return "MIPS_XLATE";
1489     case SHT_MIPS_XLATE_DEBUG:   return "MIPS_XLATE_DEBUG";
1490     case SHT_MIPS_WHIRL:         return "MIPS_WHIRL";
1491     case SHT_MIPS_EH_REGION:     return "MIPS_EH_REGION";
1492     case SHT_MIPS_XLATE_OLD:     return "MIPS_XLATE_OLD";
1493     case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
1494     default:
1495       break;
1496     }
1497   return NULL;
1498 }
1499
1500 static const char *
1501 get_parisc_section_type_name (sh_type)
1502      unsigned int sh_type;
1503 {
1504   switch (sh_type)
1505     {
1506     case SHT_PARISC_EXT:        return "PARISC_EXT";
1507     case SHT_PARISC_UNWIND:     return "PARISC_UNWIND";
1508     case SHT_PARISC_DOC:        return "PARISC_DOC";
1509     default:
1510       break;
1511     }
1512   return NULL;
1513 }
1514
1515 static const char *
1516 get_section_type_name (sh_type)
1517      unsigned int sh_type;
1518 {
1519   static char buff [32];
1520
1521   switch (sh_type)
1522     {
1523     case SHT_NULL:              return "NULL";
1524     case SHT_PROGBITS:          return "PROGBITS";
1525     case SHT_SYMTAB:            return "SYMTAB";
1526     case SHT_STRTAB:            return "STRTAB";
1527     case SHT_RELA:              return "RELA";
1528     case SHT_HASH:              return "HASH";
1529     case SHT_DYNAMIC:           return "DYNAMIC";
1530     case SHT_NOTE:              return "NOTE";
1531     case SHT_NOBITS:            return "NOBITS";
1532     case SHT_REL:               return "REL";
1533     case SHT_SHLIB:             return "SHLIB";
1534     case SHT_DYNSYM:            return "DYNSYM";
1535     case SHT_GNU_verdef:        return "VERDEF";
1536     case SHT_GNU_verneed:       return "VERNEED";
1537     case SHT_GNU_versym:        return "VERSYM";
1538     case 0x6ffffff0:            return "VERSYM";
1539     case 0x6ffffffc:            return "VERDEF";
1540     case 0x7ffffffd:            return "AUXILIARY";
1541     case 0x7fffffff:            return "FILTER";
1542
1543     default:
1544       if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
1545         {
1546           const char * result;
1547
1548           switch (elf_header.e_machine)
1549             {
1550             case EM_MIPS:
1551             case EM_MIPS_RS4_BE:
1552               result = get_mips_section_type_name (sh_type);
1553               break;
1554             case EM_PARISC:
1555               result = get_parisc_section_type_name (sh_type);
1556               break;
1557             default:
1558               result = NULL;
1559               break;
1560             }
1561
1562           if (result != NULL)
1563             return result;
1564
1565           sprintf (buff, "SHT_LOPROC+%x", sh_type - SHT_LOPROC);
1566         }
1567       else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
1568         sprintf (buff, "SHT_LOOS+%x", sh_type - SHT_LOOS);
1569       else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
1570         sprintf (buff, "SHT_LOUSER+%x", sh_type - SHT_LOUSER);
1571       else
1572         sprintf (buff, _("<unknown>: %x"), sh_type);
1573
1574       return buff;
1575     }
1576 }
1577
1578 struct option options [] =
1579 {
1580   {"all",              no_argument, 0, 'a'},
1581   {"file-header",      no_argument, 0, 'h'},
1582   {"program-headers",  no_argument, 0, 'l'},
1583   {"headers",          no_argument, 0, 'e'},
1584   {"histogram",        no_argument, 0, 'I'},
1585   {"segments",         no_argument, 0, 'l'},
1586   {"sections",         no_argument, 0, 'S'},
1587   {"section-headers",  no_argument, 0, 'S'},
1588   {"symbols",          no_argument, 0, 's'},
1589   {"syms",             no_argument, 0, 's'},
1590   {"relocs",           no_argument, 0, 'r'},
1591   {"notes",            no_argument, 0, 'n'},
1592   {"dynamic",          no_argument, 0, 'd'},
1593   {"arch-specific",    no_argument, 0, 'A'},
1594   {"version-info",     no_argument, 0, 'V'},
1595   {"use-dynamic",      no_argument, 0, 'D'},
1596   {"hex-dump",         required_argument, 0, 'x'},
1597   {"debug-dump",       optional_argument, 0, 'w'},
1598 #ifdef SUPPORT_DISASSEMBLY
1599   {"instruction-dump", required_argument, 0, 'i'},
1600 #endif
1601
1602   {"version",          no_argument, 0, 'v'},
1603   {"help",             no_argument, 0, 'H'},
1604   {0,                  no_argument, 0, 0}
1605 };
1606
1607 static void
1608 usage ()
1609 {
1610   fprintf (stdout, _("Usage: readelf {options} elf-file(s)\n"));
1611   fprintf (stdout, _("  Options are:\n"));
1612   fprintf (stdout, _("  -a or --all               Equivalent to: -h -l -S -s -r -d -V -A -I\n"));
1613   fprintf (stdout, _("  -h or --file-header       Display the ELF file header\n"));
1614   fprintf (stdout, _("  -l or --program-headers or --segments\n"));
1615   fprintf (stdout, _("                            Display the program headers\n"));
1616   fprintf (stdout, _("  -S or --section-headers or --sections\n"));
1617   fprintf (stdout, _("                            Display the sections' header\n"));
1618   fprintf (stdout, _("  -e or --headers           Equivalent to: -h -l -S\n"));
1619   fprintf (stdout, _("  -s or --syms or --symbols Display the symbol table\n"));
1620   fprintf (stdout, _("  -n or --notes             Display the core notes (if present)\n"));
1621   fprintf (stdout, _("  -r or --relocs            Display the relocations (if present)\n"));
1622   fprintf (stdout, _("  -d or --dynamic           Display the dynamic segment (if present)\n"));
1623   fprintf (stdout, _("  -V or --version-info      Display the version sections (if present)\n"));
1624   fprintf (stdout, _("  -A or --arch-specific     Display architecture specific information (if any).\n"));
1625   fprintf (stdout, _("  -D or --use-dynamic       Use the dynamic section info when displaying symbols\n"));
1626   fprintf (stdout, _("  -x <number> or --hex-dump=<number>\n"));
1627   fprintf (stdout, _("                            Dump the contents of section <number>\n"));
1628   fprintf (stdout, _("  -w[liapr] or --debug-dump[=line,=info,=abbrev,=pubnames,=ranges]\n"));
1629   fprintf (stdout, _("                            Display the contents of DWARF2 debug sections\n"));
1630 #ifdef SUPPORT_DISASSEMBLY
1631   fprintf (stdout, _("  -i <number> or --instruction-dump=<number>\n"));
1632   fprintf (stdout, _("                            Disassemble the contents of section <number>\n"));
1633 #endif
1634   fprintf (stdout, _("  -I or --histogram         Display histogram of bucket list lengths\n"));
1635   fprintf (stdout, _("  -v or --version           Display the version number of readelf\n"));
1636   fprintf (stdout, _("  -H or --help              Display this information\n"));
1637   fprintf (stdout, _("Report bugs to bug-gnu-utils@gnu.org\n"));
1638
1639   exit (0);
1640 }
1641
1642 static void
1643 request_dump (section, type)
1644      unsigned int section;
1645      char         type;
1646 {
1647   if (section >= num_dump_sects)
1648     {
1649       char * new_dump_sects;
1650
1651       new_dump_sects = (char *) calloc (section + 1, 1);
1652
1653       if (new_dump_sects == NULL)
1654         error (_("Out of memory allocating dump request table."));
1655       else
1656         {
1657           /* Copy current flag settings.  */
1658           memcpy (new_dump_sects, dump_sects, num_dump_sects);
1659
1660           free (dump_sects);
1661
1662           dump_sects = new_dump_sects;
1663           num_dump_sects = section + 1;
1664         }
1665     }
1666
1667   if (dump_sects)
1668     dump_sects [section] |= type;
1669
1670   return;
1671 }
1672
1673 static void
1674 parse_args (argc, argv)
1675      int argc;
1676      char ** argv;
1677 {
1678   int c;
1679
1680   if (argc < 2)
1681     usage ();
1682
1683   while ((c = getopt_long
1684           (argc, argv, "ersahnldSDAIw::x:i:vV", options, NULL)) != EOF)
1685     {
1686       char *    cp;
1687       int       section;
1688
1689       switch (c)
1690         {
1691         case 0:
1692           /* Long options.  */
1693           break;
1694         case 'H':
1695           usage ();
1696           break;
1697
1698         case 'a':
1699           do_syms ++;
1700           do_reloc ++;
1701           do_dynamic ++;
1702           do_header ++;
1703           do_sections ++;
1704           do_segments ++;
1705           do_version ++;
1706           do_histogram ++;
1707           do_arch ++;
1708           do_notes ++;
1709           break;
1710         case 'e':
1711           do_header ++;
1712           do_sections ++;
1713           do_segments ++;
1714           break;
1715         case 'A':
1716           do_arch ++;
1717           break;
1718         case 'D':
1719           do_using_dynamic ++;
1720           break;
1721         case 'r':
1722           do_reloc ++;
1723           break;
1724         case 'h':
1725           do_header ++;
1726           break;
1727         case 'l':
1728           do_segments ++;
1729           break;
1730         case 's':
1731           do_syms ++;
1732           break;
1733         case 'S':
1734           do_sections ++;
1735           break;
1736         case 'd':
1737           do_dynamic ++;
1738           break;
1739         case 'I':
1740           do_histogram ++;
1741           break;
1742         case 'n':
1743           do_notes ++;
1744           break;
1745         case 'x':
1746           do_dump ++;
1747           section = strtoul (optarg, & cp, 0);
1748           if (! * cp && section >= 0)
1749             {
1750               request_dump (section, HEX_DUMP);
1751               break;
1752             }
1753           goto oops;
1754         case 'w':
1755           do_dump ++;
1756           if (optarg == 0)
1757             do_debugging = 1;
1758           else
1759             {
1760               do_debugging = 0;
1761               switch (optarg[0])
1762                 {
1763                 case 'i':
1764                 case 'I':
1765                   do_debug_info = 1;
1766                   break;
1767
1768                 case 'a':
1769                 case 'A':
1770                   do_debug_abbrevs = 1;
1771                   break;
1772
1773                 case 'l':
1774                 case 'L':
1775                   do_debug_lines = 1;
1776                   break;
1777
1778                 case 'p':
1779                 case 'P':
1780                   do_debug_pubnames = 1;
1781                   break;
1782
1783                 case 'r':
1784                 case 'R':
1785                   do_debug_aranges = 1;
1786                   break;
1787
1788                 default:
1789                   warn (_("Unrecognised debug option '%s'\n"), optarg);
1790                   break;
1791                 }
1792             }
1793           break;
1794 #ifdef SUPPORT_DISASSEMBLY
1795         case 'i':
1796           do_dump ++;
1797           section = strtoul (optarg, & cp, 0);
1798           if (! * cp && section >= 0)
1799             {
1800               request_dump (section, DISASS_DUMP);
1801               break;
1802             }
1803           goto oops;
1804 #endif
1805         case 'v':
1806           print_version (program_name);
1807           break;
1808         case 'V':
1809           do_version ++;
1810           break;
1811         default:
1812         oops:
1813           /* xgettext:c-format */
1814           error (_("Invalid option '-%c'\n"), c);
1815           /* Drop through.  */
1816         case '?':
1817           usage ();
1818         }
1819     }
1820
1821   if (!do_dynamic && !do_syms && !do_reloc && !do_sections
1822       && !do_segments && !do_header && !do_dump && !do_version
1823       && !do_histogram && !do_debugging && !do_arch && !do_notes)
1824     usage ();
1825   else if (argc < 3)
1826     {
1827       warn (_("Nothing to do.\n"));
1828       usage();
1829     }
1830 }
1831
1832 static const char *
1833 get_elf_class (elf_class)
1834      unsigned char elf_class;
1835 {
1836   static char buff [32];
1837
1838   switch (elf_class)
1839     {
1840     case ELFCLASSNONE: return _("none");
1841     case ELFCLASS32:   return _("ELF32");
1842     case ELFCLASS64:   return _("ELF64");
1843     default:
1844       sprintf (buff, _("<unknown: %x>"), elf_class);
1845       return buff;
1846     }
1847 }
1848
1849 static const char *
1850 get_data_encoding (encoding)
1851      unsigned char encoding;
1852 {
1853   static char buff [32];
1854
1855   switch (encoding)
1856     {
1857     case ELFDATANONE: return _("none");
1858     case ELFDATA2LSB: return _("2's complement, little endian");
1859     case ELFDATA2MSB: return _("2's complement, big endian");
1860     default:
1861       sprintf (buff, _("<unknown: %x>"), encoding);
1862       return buff;
1863     }
1864 }
1865
1866 static const char *
1867 get_osabi_name (osabi)
1868      unsigned char osabi;
1869 {
1870   static char buff [32];
1871
1872   switch (osabi)
1873     {
1874     case ELFOSABI_SYSV:       return _("UNIX - System V");
1875     case ELFOSABI_HPUX:       return _("UNIX - HP-UX");
1876     case ELFOSABI_STANDALONE: return _("Standalone App");
1877     default:
1878       sprintf (buff, _("<unknown: %x>"), osabi);
1879       return buff;
1880     }
1881 }
1882
1883 /* Decode the data held in 'elf_header'.  */
1884 static int
1885 process_file_header ()
1886 {
1887   if (   elf_header.e_ident [EI_MAG0] != ELFMAG0
1888       || elf_header.e_ident [EI_MAG1] != ELFMAG1
1889       || elf_header.e_ident [EI_MAG2] != ELFMAG2
1890       || elf_header.e_ident [EI_MAG3] != ELFMAG3)
1891     {
1892       error
1893         (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
1894       return 0;
1895     }
1896
1897   if (do_header)
1898     {
1899       int i;
1900
1901       printf (_("ELF Header:\n"));
1902       printf (_("  Magic:   "));
1903       for (i = 0; i < EI_NIDENT; i ++)
1904         printf ("%2.2x ", elf_header.e_ident [i]);
1905       printf ("\n");
1906       printf (_("  Class:                             %s\n"),
1907               get_elf_class (elf_header.e_ident [EI_CLASS]));
1908       printf (_("  Data:                              %s\n"),
1909               get_data_encoding (elf_header.e_ident [EI_DATA]));
1910       printf (_("  Version:                           %d %s\n"),
1911               elf_header.e_ident [EI_VERSION],
1912               (elf_header.e_ident [EI_VERSION] == EV_CURRENT
1913                ? "(current)"
1914                : (elf_header.e_ident [EI_VERSION] != EV_NONE
1915                   ? "<unknown: %lx>"
1916                   : "")));
1917       printf (_("  OS/ABI:                            %s\n"),
1918               get_osabi_name (elf_header.e_ident [EI_OSABI]));
1919       printf (_("  ABI Version:                       %d\n"),
1920               elf_header.e_ident [EI_ABIVERSION]);
1921       printf (_("  Type:                              %s\n"),
1922               get_file_type (elf_header.e_type));
1923       printf (_("  Machine:                           %s\n"),
1924               get_machine_name (elf_header.e_machine));
1925       printf (_("  Version:                           0x%lx\n"),
1926               (unsigned long) elf_header.e_version);
1927       
1928       printf (_("  Entry point address:               "));
1929       print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
1930       printf (_("\n  Start of program headers:          "));
1931       print_vma ((bfd_vma) elf_header.e_phoff, DEC);
1932       printf (_(" (bytes into file)\n  Start of section headers:          "));
1933       print_vma ((bfd_vma) elf_header.e_shoff, DEC);
1934       printf (_(" (bytes into file)\n"));
1935         
1936       printf (_("  Flags:                             0x%lx%s\n"),
1937               (unsigned long) elf_header.e_flags,
1938               get_machine_flags (elf_header.e_flags, elf_header.e_machine));
1939       printf (_("  Size of this header:               %ld (bytes)\n"),
1940               (long) elf_header.e_ehsize);
1941       printf (_("  Size of program headers:           %ld (bytes)\n"),
1942               (long) elf_header.e_phentsize);
1943       printf (_("  Number of program headers:         %ld\n"),
1944               (long) elf_header.e_phnum);
1945       printf (_("  Size of section headers:           %ld (bytes)\n"),
1946               (long) elf_header.e_shentsize);
1947       printf (_("  Number of section headers:         %ld\n"),
1948               (long) elf_header.e_shnum);
1949       printf (_("  Section header string table index: %ld\n"),
1950               (long) elf_header.e_shstrndx);
1951     }
1952
1953   return 1;
1954 }
1955
1956
1957 static int
1958 get_32bit_program_headers (file, program_headers)
1959      FILE * file;
1960      Elf_Internal_Phdr * program_headers;
1961 {
1962   Elf32_External_Phdr * phdrs;
1963   Elf32_External_Phdr * external;
1964   Elf32_Internal_Phdr * internal;
1965   unsigned int          i;
1966
1967   GET_DATA_ALLOC (elf_header.e_phoff,
1968                   elf_header.e_phentsize * elf_header.e_phnum,
1969                   phdrs, Elf32_External_Phdr *, "program headers");
1970
1971   for (i = 0, internal = program_headers, external = phdrs;
1972        i < elf_header.e_phnum;
1973        i ++, internal ++, external ++)
1974     {
1975       internal->p_type   = BYTE_GET (external->p_type);
1976       internal->p_offset = BYTE_GET (external->p_offset);
1977       internal->p_vaddr  = BYTE_GET (external->p_vaddr);
1978       internal->p_paddr  = BYTE_GET (external->p_paddr);
1979       internal->p_filesz = BYTE_GET (external->p_filesz);
1980       internal->p_memsz  = BYTE_GET (external->p_memsz);
1981       internal->p_flags  = BYTE_GET (external->p_flags);
1982       internal->p_align  = BYTE_GET (external->p_align);
1983     }
1984
1985   free (phdrs);
1986
1987   return 1;
1988 }
1989
1990 static int
1991 get_64bit_program_headers (file, program_headers)
1992      FILE * file;
1993      Elf_Internal_Phdr * program_headers;
1994 {
1995   Elf64_External_Phdr * phdrs;
1996   Elf64_External_Phdr * external;
1997   Elf64_Internal_Phdr * internal;
1998   unsigned int          i;
1999
2000   GET_DATA_ALLOC (elf_header.e_phoff,
2001                   elf_header.e_phentsize * elf_header.e_phnum,
2002                   phdrs, Elf64_External_Phdr *, "program headers");
2003
2004   for (i = 0, internal = program_headers, external = phdrs;
2005        i < elf_header.e_phnum;
2006        i ++, internal ++, external ++)
2007     {
2008       internal->p_type   = BYTE_GET (external->p_type);
2009       internal->p_flags  = BYTE_GET (external->p_flags);
2010       internal->p_offset = BYTE_GET8 (external->p_offset);
2011       internal->p_vaddr  = BYTE_GET8 (external->p_vaddr);
2012       internal->p_paddr  = BYTE_GET8 (external->p_paddr);
2013       internal->p_filesz = BYTE_GET8 (external->p_filesz);
2014       internal->p_memsz  = BYTE_GET8 (external->p_memsz);
2015       internal->p_align  = BYTE_GET8 (external->p_align);
2016     }
2017
2018   free (phdrs);
2019
2020   return 1;
2021 }
2022
2023 static int
2024 process_program_headers (file)
2025      FILE * file;
2026 {
2027   Elf_Internal_Phdr * program_headers;
2028   Elf_Internal_Phdr * segment;
2029   unsigned int        i;
2030
2031   if (elf_header.e_phnum == 0)
2032     {
2033       if (do_segments)
2034         printf (_("\nThere are no program headers in this file.\n"));
2035       return 1;
2036     }
2037
2038   if (do_segments && !do_header)
2039     {
2040       printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
2041       printf (_("Entry point "));
2042       print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
2043       printf (_("\nThere are %d program headers, starting at offset "),
2044               elf_header.e_phnum);
2045       print_vma ((bfd_vma) elf_header.e_phoff, DEC);
2046       printf ("\n");
2047     }
2048
2049   program_headers = (Elf_Internal_Phdr *) malloc
2050     (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
2051
2052   if (program_headers == NULL)
2053     {
2054       error (_("Out of memory\n"));
2055       return 0;
2056     }
2057
2058   if (is_32bit_elf)
2059     i = get_32bit_program_headers (file, program_headers);
2060   else
2061     i = get_64bit_program_headers (file, program_headers);
2062
2063   if (i == 0)
2064     {
2065       free (program_headers);
2066       return 0;
2067     }
2068
2069   if (do_segments)
2070     {
2071       printf
2072         (_("\nProgram Header%s:\n"), elf_header.e_phnum > 1 ? "s" : "");
2073       
2074       if (is_32bit_elf)
2075         printf
2076           (_("  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align\n"));
2077       else
2078         {
2079           printf
2080             (_("  Type           Offset             VirtAddr           PhysAddr\n"));
2081           printf
2082             (_("                 FileSiz            MemSiz              Flags  Align\n"));
2083         }
2084     }
2085
2086   loadaddr = -1;
2087   dynamic_addr = 0;
2088   dynamic_size = 0;
2089
2090   for (i = 0, segment = program_headers;
2091        i < elf_header.e_phnum;
2092        i ++, segment ++)
2093     {
2094       if (do_segments)
2095         {
2096           printf ("  %-14.14s ", get_segment_type (segment->p_type));
2097
2098           if (is_32bit_elf)
2099             {
2100               printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
2101               printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
2102               printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
2103               printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
2104               printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
2105               printf ("%c%c%c ",
2106                       (segment->p_flags & PF_R ? 'R' : ' '),
2107                       (segment->p_flags & PF_W ? 'W' : ' '),
2108                       (segment->p_flags & PF_X ? 'E' : ' '));
2109               printf ("%#lx", (unsigned long) segment->p_align);
2110             }
2111           else
2112             {
2113               print_vma (segment->p_offset, FULL_HEX);
2114               putchar (' ');
2115               print_vma (segment->p_vaddr, FULL_HEX);
2116               putchar (' ');
2117               print_vma (segment->p_paddr, FULL_HEX);
2118               printf ("\n                 ");
2119               print_vma (segment->p_filesz, FULL_HEX);
2120               putchar (' ');
2121               print_vma (segment->p_memsz, FULL_HEX);
2122               printf ("  %c%c%c    ",
2123                       (segment->p_flags & PF_R ? 'R' : ' '),
2124                       (segment->p_flags & PF_W ? 'W' : ' '),
2125                       (segment->p_flags & PF_X ? 'E' : ' '));
2126               print_vma (segment->p_align, HEX);
2127             }
2128         }
2129
2130       switch (segment->p_type)
2131         {
2132         case PT_LOAD:
2133           if (loadaddr == -1)
2134             loadaddr = (segment->p_vaddr & 0xfffff000)
2135               - (segment->p_offset & 0xfffff000);
2136           break;
2137
2138         case PT_DYNAMIC:
2139           if (dynamic_addr)
2140             error (_("more than one dynamic segment\n"));
2141
2142           dynamic_addr = segment->p_offset;
2143           dynamic_size = segment->p_filesz;
2144           break;
2145
2146         case PT_INTERP:
2147           if (fseek (file, (long) segment->p_offset, SEEK_SET))
2148             error (_("Unable to find program interpreter name\n"));
2149           else
2150             {
2151               program_interpreter[0] = 0;
2152               fscanf (file, "%63s", program_interpreter);
2153
2154               if (do_segments)
2155                 printf (_("\n      [Requesting program interpreter: %s]"),
2156                     program_interpreter);
2157             }
2158           break;
2159         }
2160
2161       if (do_segments)
2162         putc ('\n', stdout);
2163     }
2164
2165   if (loadaddr == -1)
2166     {
2167       /* Very strange. */
2168       loadaddr = 0;
2169     }
2170
2171   if (do_segments && section_headers != NULL)
2172     {
2173       printf (_("\n Section to Segment mapping:\n"));
2174       printf (_("  Segment Sections...\n"));
2175
2176       assert (string_table != NULL);
2177
2178       for (i = 0; i < elf_header.e_phnum; i++)
2179         {
2180           int                 j;
2181           Elf_Internal_Shdr * section;
2182
2183           segment = program_headers + i;
2184           section = section_headers;
2185
2186           printf ("   %2.2d     ", i);
2187
2188           for (j = 0; j < elf_header.e_shnum; j++, section ++)
2189             {
2190               if (section->sh_size > 0
2191                   /* Compare allocated sections by VMA, unallocated
2192                      sections by file offset.  */
2193                   && (section->sh_flags & SHF_ALLOC
2194                       ? (section->sh_addr >= segment->p_vaddr
2195                          && section->sh_addr + section->sh_size
2196                          <= segment->p_vaddr + segment->p_memsz)
2197                       : ((bfd_vma) section->sh_offset >= segment->p_offset
2198                          && (section->sh_offset + section->sh_size
2199                              <= segment->p_offset + segment->p_filesz))))
2200                 printf ("%s ", SECTION_NAME (section));
2201             }
2202
2203           putc ('\n',stdout);
2204         }
2205     }
2206
2207   free (program_headers);
2208
2209   return 1;
2210 }
2211
2212
2213 static int
2214 get_32bit_section_headers (file)
2215      FILE * file;
2216 {
2217   Elf32_External_Shdr * shdrs;
2218   Elf32_Internal_Shdr * internal;
2219   unsigned int          i;
2220
2221   GET_DATA_ALLOC (elf_header.e_shoff,
2222                   elf_header.e_shentsize * elf_header.e_shnum,
2223                   shdrs, Elf32_External_Shdr *, "section headers");
2224
2225   section_headers = (Elf_Internal_Shdr *) malloc
2226     (elf_header.e_shnum * sizeof (Elf_Internal_Shdr));
2227
2228   if (section_headers == NULL)
2229     {
2230       error (_("Out of memory\n"));
2231       return 0;
2232     }
2233
2234   for (i = 0, internal = section_headers;
2235        i < elf_header.e_shnum;
2236        i ++, internal ++)
2237     {
2238       internal->sh_name      = BYTE_GET (shdrs[i].sh_name);
2239       internal->sh_type      = BYTE_GET (shdrs[i].sh_type);
2240       internal->sh_flags     = BYTE_GET (shdrs[i].sh_flags);
2241       internal->sh_addr      = BYTE_GET (shdrs[i].sh_addr);
2242       internal->sh_offset    = BYTE_GET (shdrs[i].sh_offset);
2243       internal->sh_size      = BYTE_GET (shdrs[i].sh_size);
2244       internal->sh_link      = BYTE_GET (shdrs[i].sh_link);
2245       internal->sh_info      = BYTE_GET (shdrs[i].sh_info);
2246       internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
2247       internal->sh_entsize   = BYTE_GET (shdrs[i].sh_entsize);
2248     }
2249
2250   free (shdrs);
2251
2252   return 1;
2253 }
2254
2255 static int
2256 get_64bit_section_headers (file)
2257      FILE * file;
2258 {
2259   Elf64_External_Shdr * shdrs;
2260   Elf64_Internal_Shdr * internal;
2261   unsigned int          i;
2262
2263   GET_DATA_ALLOC (elf_header.e_shoff,
2264                   elf_header.e_shentsize * elf_header.e_shnum,
2265                   shdrs, Elf64_External_Shdr *, "section headers");
2266
2267   section_headers = (Elf_Internal_Shdr *) malloc
2268     (elf_header.e_shnum * sizeof (Elf_Internal_Shdr));
2269
2270   if (section_headers == NULL)
2271     {
2272       error (_("Out of memory\n"));
2273       return 0;
2274     }
2275
2276   for (i = 0, internal = section_headers;
2277        i < elf_header.e_shnum;
2278        i ++, internal ++)
2279     {
2280       internal->sh_name      = BYTE_GET (shdrs[i].sh_name);
2281       internal->sh_type      = BYTE_GET (shdrs[i].sh_type);
2282       internal->sh_flags     = BYTE_GET8 (shdrs[i].sh_flags);
2283       internal->sh_addr      = BYTE_GET8 (shdrs[i].sh_addr);
2284       internal->sh_size      = BYTE_GET8 (shdrs[i].sh_size);
2285       internal->sh_entsize   = BYTE_GET8 (shdrs[i].sh_entsize);
2286       internal->sh_link      = BYTE_GET (shdrs[i].sh_link);
2287       internal->sh_info      = BYTE_GET (shdrs[i].sh_info);
2288       internal->sh_offset    = BYTE_GET (shdrs[i].sh_offset);
2289       internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
2290     }
2291
2292   free (shdrs);
2293
2294   return 1;
2295 }
2296
2297 static Elf_Internal_Sym *
2298 get_32bit_elf_symbols (file, offset, number)
2299      FILE * file;
2300      unsigned long offset;
2301      unsigned long number;
2302 {
2303   Elf32_External_Sym * esyms;
2304   Elf_Internal_Sym *   isyms;
2305   Elf_Internal_Sym *   psym;
2306   unsigned int         j;
2307
2308   GET_DATA_ALLOC (offset, number * sizeof (Elf32_External_Sym),
2309                   esyms, Elf32_External_Sym *, "symbols");
2310
2311   isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym));
2312
2313   if (isyms == NULL)
2314     {
2315       error (_("Out of memory\n"));
2316       free (esyms);
2317
2318       return NULL;
2319     }
2320
2321   for (j = 0, psym = isyms;
2322        j < number;
2323        j ++, psym ++)
2324     {
2325       psym->st_name  = BYTE_GET (esyms[j].st_name);
2326       psym->st_value = BYTE_GET (esyms[j].st_value);
2327       psym->st_size  = BYTE_GET (esyms[j].st_size);
2328       psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
2329       psym->st_info  = BYTE_GET (esyms[j].st_info);
2330       psym->st_other = BYTE_GET (esyms[j].st_other);
2331     }
2332
2333   free (esyms);
2334
2335   return isyms;
2336 }
2337
2338 static Elf_Internal_Sym *
2339 get_64bit_elf_symbols (file, offset, number)
2340      FILE * file;
2341      unsigned long offset;
2342      unsigned long number;
2343 {
2344   Elf64_External_Sym * esyms;
2345   Elf_Internal_Sym *   isyms;
2346   Elf_Internal_Sym *   psym;
2347   unsigned int         j;
2348
2349   GET_DATA_ALLOC (offset, number * sizeof (Elf64_External_Sym),
2350                   esyms, Elf64_External_Sym *, "symbols");
2351
2352   isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym));
2353
2354   if (isyms == NULL)
2355     {
2356       error (_("Out of memory\n"));
2357       free (esyms);
2358
2359       return NULL;
2360     }
2361
2362   for (j = 0, psym = isyms;
2363        j < number;
2364        j ++, psym ++)
2365     {
2366       psym->st_name  = BYTE_GET (esyms[j].st_name);
2367       psym->st_info  = BYTE_GET (esyms[j].st_info);
2368       psym->st_other = BYTE_GET (esyms[j].st_other);
2369       psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
2370       psym->st_value = BYTE_GET8 (esyms[j].st_value);
2371       psym->st_size  = BYTE_GET8 (esyms[j].st_size);
2372     }
2373
2374   free (esyms);
2375
2376   return isyms;
2377 }
2378
2379 static int
2380 process_section_headers (file)
2381      FILE * file;
2382 {
2383   Elf_Internal_Shdr * section;
2384   int                 i;
2385
2386   section_headers = NULL;
2387
2388   if (elf_header.e_shnum == 0)
2389     {
2390       if (do_sections)
2391         printf (_("\nThere are no sections in this file.\n"));
2392
2393       return 1;
2394     }
2395
2396   if (do_sections && !do_header)
2397     printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
2398             elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
2399
2400   if (is_32bit_elf)
2401     {
2402       if (! get_32bit_section_headers (file))
2403         return 0;
2404     }
2405   else if (! get_64bit_section_headers (file))
2406     return 0;
2407
2408   /* Read in the string table, so that we have names to display.  */
2409   section = section_headers + elf_header.e_shstrndx;
2410
2411   if (section->sh_size != 0)
2412     {
2413       unsigned long string_table_offset;
2414
2415       string_table_offset = section->sh_offset;
2416
2417       GET_DATA_ALLOC (section->sh_offset, section->sh_size,
2418                       string_table, char *, "string table");
2419     }
2420
2421   /* Scan the sections for the dynamic symbol table
2422      and dynamic string table and debug sections. */
2423   dynamic_symbols = NULL;
2424   dynamic_strings = NULL;
2425   dynamic_syminfo = NULL;
2426
2427   for (i = 0, section = section_headers;
2428        i < elf_header.e_shnum;
2429        i ++, section ++)
2430     {
2431       char * name = SECTION_NAME (section);
2432
2433       if (section->sh_type == SHT_DYNSYM)
2434         {
2435           if (dynamic_symbols != NULL)
2436             {
2437               error (_("File contains multiple dynamic symbol tables\n"));
2438               continue;
2439             }
2440
2441           num_dynamic_syms = section->sh_size / section->sh_entsize;
2442           dynamic_symbols =
2443             GET_ELF_SYMBOLS (file, section->sh_offset, num_dynamic_syms);
2444         }
2445       else if (section->sh_type == SHT_STRTAB
2446                && strcmp (name, ".dynstr") == 0)
2447         {
2448           if (dynamic_strings != NULL)
2449             {
2450               error (_("File contains multiple dynamic string tables\n"));
2451               continue;
2452             }
2453
2454           GET_DATA_ALLOC (section->sh_offset, section->sh_size,
2455                           dynamic_strings, char *, "dynamic strings");
2456         }
2457       else if ((do_debugging || do_debug_info || do_debug_abbrevs
2458                 || do_debug_lines || do_debug_pubnames || do_debug_aranges)
2459                && strncmp (name, ".debug_", 7) == 0)
2460         {
2461           name += 7;
2462
2463           if (do_debugging
2464               || (do_debug_info     && (strcmp (name, "info") == 0))
2465               || (do_debug_abbrevs  && (strcmp (name, "abbrev") == 0))
2466               || (do_debug_lines    && (strcmp (name, "line") == 0))
2467               || (do_debug_pubnames && (strcmp (name, "pubnames") == 0))
2468               || (do_debug_aranges  && (strcmp (name, "aranges") == 0))
2469               )
2470             request_dump (i, DEBUG_DUMP);
2471         }
2472     }
2473
2474   if (! do_sections)
2475     return 1;
2476
2477   printf (_("\nSection Header%s:\n"), elf_header.e_shnum > 1 ? "s" : "");
2478   if (is_32bit_elf)
2479     printf
2480       (_("  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al\n"));
2481   else
2482     {
2483       printf (_("  [Nr] Name              Type             Address           Offset\n"));
2484       printf (_("       Size              EntSize          Flags  Link  Info  Align\n"));
2485     }
2486
2487   for (i = 0, section = section_headers;
2488        i < elf_header.e_shnum;
2489        i ++, section ++)
2490     {
2491       printf ("  [%2d] %-17.17s %-15.15s ",
2492               i,
2493               SECTION_NAME (section),
2494               get_section_type_name (section->sh_type));
2495
2496       if (is_32bit_elf)
2497         {
2498           print_vma (section->sh_addr, LONG_HEX);
2499       
2500           printf ( " %6.6lx %6.6lx %2.2lx",
2501                    (unsigned long) section->sh_offset,
2502                    (unsigned long) section->sh_size,
2503                    (unsigned long) section->sh_entsize);
2504           
2505           printf (" %c%c%c %2ld %3lx %ld\n",
2506                   (section->sh_flags & SHF_WRITE ? 'W' : ' '),
2507                   (section->sh_flags & SHF_ALLOC ? 'A' : ' '),
2508                   (section->sh_flags & SHF_EXECINSTR ? 'X' : ' '),
2509                   (unsigned long) section->sh_link,
2510                   (unsigned long) section->sh_info,
2511                   (unsigned long) section->sh_addralign);
2512         }
2513       else
2514         {
2515           putchar (' ');
2516           print_vma (section->sh_addr, LONG_HEX);
2517           printf ("  %08.8lx", section->sh_offset);
2518           printf ("\n       ");
2519           print_vma (section->sh_size, LONG_HEX);
2520           printf ("  ");
2521           print_vma (section->sh_entsize, LONG_HEX);
2522           
2523           printf (" %c%c%c",
2524                   (section->sh_flags & SHF_WRITE ? 'W' : ' '),
2525                   (section->sh_flags & SHF_ALLOC ? 'A' : ' '),
2526                   (section->sh_flags & SHF_EXECINSTR ? 'X' : ' '));
2527           
2528           printf ("     %2ld   %3lx     %ld\n",
2529                   (unsigned long) section->sh_link,
2530                   (unsigned long) section->sh_info,
2531                   (unsigned long) section->sh_addralign);
2532         }
2533     }
2534
2535   return 1;
2536 }
2537
2538 /* Process the reloc section.  */
2539 static int
2540 process_relocs (file)
2541      FILE * file;
2542 {
2543   unsigned long    rel_size;
2544   unsigned long    rel_offset;
2545
2546
2547   if (!do_reloc)
2548     return 1;
2549
2550   if (do_using_dynamic)
2551     {
2552       int is_rela = FALSE;
2553
2554       rel_size   = 0;
2555       rel_offset = 0;
2556
2557       if (dynamic_info[DT_REL])
2558         {
2559           rel_offset = dynamic_info[DT_REL];
2560           rel_size   = dynamic_info[DT_RELSZ];
2561           is_rela    = FALSE;
2562         }
2563       else if (dynamic_info [DT_RELA])
2564         {
2565           rel_offset = dynamic_info[DT_RELA];
2566           rel_size   = dynamic_info[DT_RELASZ];
2567           is_rela    = TRUE;
2568         }
2569       else if (dynamic_info[DT_JMPREL])
2570         {
2571           rel_offset = dynamic_info[DT_JMPREL];
2572           rel_size   = dynamic_info[DT_PLTRELSZ];
2573
2574           switch (dynamic_info[DT_PLTREL])
2575             {
2576             case DT_REL:
2577               is_rela = FALSE;
2578               break;
2579             case DT_RELA:
2580               is_rela = TRUE;
2581               break;
2582             default:
2583               is_rela = UNKNOWN;
2584               break;
2585             }
2586         }
2587
2588       if (rel_size)
2589         {
2590           printf
2591             (_("\nRelocation section at offset 0x%lx contains %ld bytes:\n"),
2592              rel_offset, rel_size);
2593
2594           dump_relocations (file, rel_offset - loadaddr, rel_size,
2595                             dynamic_symbols, num_dynamic_syms, dynamic_strings, is_rela);
2596         }
2597       else
2598         printf (_("\nThere are no dynamic relocations in this file.\n"));
2599     }
2600   else
2601     {
2602       Elf32_Internal_Shdr *     section;
2603       unsigned long             i;
2604       int                       found = 0;
2605
2606       for (i = 0, section = section_headers;
2607            i < elf_header.e_shnum;
2608            i++, section ++)
2609         {
2610           if (   section->sh_type != SHT_RELA
2611               && section->sh_type != SHT_REL)
2612             continue;
2613
2614           rel_offset = section->sh_offset;
2615           rel_size   = section->sh_size;
2616
2617           if (rel_size)
2618             {
2619               Elf32_Internal_Shdr * strsec;
2620               Elf32_Internal_Shdr * symsec;
2621               Elf_Internal_Sym *    symtab;
2622               char *                strtab;
2623               int                   is_rela;
2624               unsigned long         nsyms;
2625
2626               printf (_("\nRelocation section "));
2627
2628               if (string_table == NULL)
2629                 printf ("%d", section->sh_name);
2630               else
2631                 printf ("'%s'", SECTION_NAME (section));
2632
2633               printf (_(" at offset 0x%lx contains %lu entries:\n"),
2634                  rel_offset, (unsigned long) (rel_size / section->sh_entsize));
2635
2636               symsec = section_headers + section->sh_link;
2637
2638               nsyms = symsec->sh_size / symsec->sh_entsize;
2639               symtab = GET_ELF_SYMBOLS (file, symsec->sh_offset, nsyms);
2640
2641               if (symtab == NULL)
2642                 continue;
2643
2644               strsec = section_headers + symsec->sh_link;
2645
2646               GET_DATA_ALLOC (strsec->sh_offset, strsec->sh_size, strtab,
2647                               char *, "string table");
2648
2649               is_rela = section->sh_type == SHT_RELA;
2650
2651               dump_relocations (file, rel_offset, rel_size, symtab, nsyms, strtab, is_rela);
2652
2653               free (strtab);
2654               free (symtab);
2655
2656               found = 1;
2657             }
2658         }
2659
2660       if (! found)
2661         printf (_("\nThere are no relocations in this file.\n"));
2662     }
2663
2664   return 1;
2665 }
2666
2667
2668 static void
2669 dynamic_segment_mips_val (entry)
2670      Elf_Internal_Dyn * entry;
2671 {
2672   switch (entry->d_tag)
2673     {
2674     case DT_MIPS_FLAGS:
2675       if (entry->d_un.d_val == 0)
2676         printf ("NONE\n");
2677       else
2678         {
2679           static const char * opts[] =
2680           {
2681             "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
2682             "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
2683             "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
2684             "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
2685             "RLD_ORDER_SAFE"
2686           };
2687           unsigned int cnt;
2688           int first = 1;
2689           for (cnt = 0; cnt < NUM_ELEM (opts); ++ cnt)
2690             if (entry->d_un.d_val & (1 << cnt))
2691               {
2692                 printf ("%s%s", first ? "" : " ", opts[cnt]);
2693                 first = 0;
2694               }
2695           puts ("");
2696         }
2697       break;
2698
2699     case DT_MIPS_IVERSION:
2700       if (dynamic_strings != NULL)
2701         printf ("Interface Version: %s\n",
2702                 dynamic_strings + entry->d_un.d_val);
2703       else
2704         printf ("%ld\n", (long) entry->d_un.d_ptr);
2705       break;
2706
2707     case DT_MIPS_TIME_STAMP:
2708       {
2709         char timebuf[20];
2710         time_t time = entry->d_un.d_val;
2711         strftime (timebuf, 20, "%Y-%m-%dT%H:%M:%S", gmtime (&time));
2712         printf ("Time Stamp: %s\n", timebuf);
2713       }
2714       break;
2715
2716     case DT_MIPS_RLD_VERSION:
2717     case DT_MIPS_LOCAL_GOTNO:
2718     case DT_MIPS_CONFLICTNO:
2719     case DT_MIPS_LIBLISTNO:
2720     case DT_MIPS_SYMTABNO:
2721     case DT_MIPS_UNREFEXTNO:
2722     case DT_MIPS_HIPAGENO:
2723     case DT_MIPS_DELTA_CLASS_NO:
2724     case DT_MIPS_DELTA_INSTANCE_NO:
2725     case DT_MIPS_DELTA_RELOC_NO:
2726     case DT_MIPS_DELTA_SYM_NO:
2727     case DT_MIPS_DELTA_CLASSSYM_NO:
2728     case DT_MIPS_COMPACT_SIZE:
2729       printf ("%ld\n", (long) entry->d_un.d_ptr);
2730       break;
2731
2732     default:
2733       printf ("%#lx\n", (long) entry->d_un.d_ptr);
2734     }
2735 }
2736
2737
2738 static void
2739 dynamic_segment_parisc_val (entry)
2740      Elf_Internal_Dyn * entry;
2741 {
2742   switch (entry->d_tag)
2743     {
2744     case DT_HP_DLD_FLAGS:
2745       {
2746         static struct
2747         {
2748           long int bit;
2749           const char *str;
2750         } flags[] =
2751           {
2752             { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
2753             { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
2754             { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
2755             { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
2756             { DT_HP_BIND_NOW, "HP_BIND_NOW" },
2757             { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
2758             { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
2759             { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
2760             { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
2761             { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
2762             { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" }
2763           };
2764         int first = 1;
2765         int cnt;
2766         bfd_vma val = entry->d_un.d_val;
2767
2768         for (cnt = 0; cnt < sizeof (flags) / sizeof (flags[0]); ++cnt)
2769           if (val & flags[cnt].bit)
2770            {
2771              if (! first)
2772                putchar (' ');
2773              fputs (flags[cnt].str, stdout);
2774              first = 0;
2775              val ^= flags[cnt].bit;
2776            }
2777         if (val != 0 || first)
2778           {
2779             if (! first)
2780               putchar (' ');
2781             print_vma (val, HEX);
2782           }
2783       }
2784       break;
2785
2786     default:
2787       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
2788       break;
2789     }
2790 }
2791
2792 static int
2793 get_32bit_dynamic_segment (file)
2794      FILE * file;
2795 {
2796   Elf32_External_Dyn * edyn;
2797   Elf_Internal_Dyn *   entry;
2798   bfd_size_type        i;
2799
2800   GET_DATA_ALLOC (dynamic_addr, dynamic_size,
2801                   edyn, Elf32_External_Dyn *, "dynamic segment");
2802
2803   /* SGI's ELF has more than one section in the DYNAMIC segment.  Determine
2804      how large this .dynamic is now.  We can do this even before the byte
2805      swapping since the DT_NULL tag is recognizable.  */
2806   dynamic_size = 0;
2807   while (*(Elf32_Word *) edyn [dynamic_size++].d_tag != DT_NULL)
2808     ;
2809
2810   dynamic_segment = (Elf_Internal_Dyn *)
2811     malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
2812
2813   if (dynamic_segment == NULL)
2814     {
2815       error (_("Out of memory\n"));
2816       free (edyn);
2817       return 0;
2818     }
2819
2820   for (i = 0, entry = dynamic_segment;
2821        i < dynamic_size;
2822        i ++, entry ++)
2823     {
2824       entry->d_tag      = BYTE_GET (edyn [i].d_tag);
2825       entry->d_un.d_val = BYTE_GET (edyn [i].d_un.d_val);
2826     }
2827
2828   free (edyn);
2829
2830   return 1;
2831 }
2832
2833 static int
2834 get_64bit_dynamic_segment (file)
2835      FILE * file;
2836 {
2837   Elf64_External_Dyn * edyn;
2838   Elf_Internal_Dyn *   entry;
2839   bfd_size_type        i;
2840
2841   GET_DATA_ALLOC (dynamic_addr, dynamic_size,
2842                   edyn, Elf64_External_Dyn *, "dynamic segment");
2843
2844   /* SGI's ELF has more than one section in the DYNAMIC segment.  Determine
2845      how large this .dynamic is now.  We can do this even before the byte
2846      swapping since the DT_NULL tag is recognizable.  */
2847   dynamic_size = 0;
2848   while (*(bfd_vma *) edyn [dynamic_size ++].d_tag != DT_NULL)
2849     ;
2850
2851   dynamic_segment = (Elf_Internal_Dyn *)
2852     malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
2853
2854   if (dynamic_segment == NULL)
2855     {
2856       error (_("Out of memory\n"));
2857       free (edyn);
2858       return 0;
2859     }
2860
2861   for (i = 0, entry = dynamic_segment;
2862        i < dynamic_size;
2863        i ++, entry ++)
2864     {
2865       entry->d_tag      = BYTE_GET8 (edyn [i].d_tag);
2866       entry->d_un.d_val = BYTE_GET8 (edyn [i].d_un.d_val);
2867     }
2868
2869   free (edyn);
2870
2871   return 1;
2872 }
2873
2874 /* Parse and display the contents of the dynamic segment.  */
2875 static int
2876 process_dynamic_segment (file)
2877      FILE * file;
2878 {
2879   Elf_Internal_Dyn * entry;
2880   bfd_size_type      i;
2881
2882   if (dynamic_size == 0)
2883     {
2884       if (do_dynamic)
2885         printf (_("\nThere is no dynamic segment in this file.\n"));
2886
2887       return 1;
2888     }
2889
2890   if (is_32bit_elf)
2891     {
2892       if (! get_32bit_dynamic_segment (file))
2893         return 0;
2894     }
2895   else if (! get_64bit_dynamic_segment (file))
2896     return 0;
2897
2898   /* Find the appropriate symbol table.  */
2899   if (dynamic_symbols == NULL)
2900     {
2901       for (i = 0, entry = dynamic_segment;
2902            i < dynamic_size;
2903            ++i, ++ entry)
2904         {
2905           unsigned long        offset;
2906
2907           if (entry->d_tag != DT_SYMTAB)
2908             continue;
2909
2910           dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
2911
2912           /* Since we do not know how big the symbol table is,
2913              we default to reading in the entire file (!) and
2914              processing that.  This is overkill, I know, but it
2915              should work. */
2916           offset = entry->d_un.d_val - loadaddr;
2917
2918           if (fseek (file, 0, SEEK_END))
2919             error (_("Unable to seek to end of file!"));
2920
2921           if (is_32bit_elf)
2922             num_dynamic_syms = (ftell (file) - offset) / sizeof (Elf32_External_Sym);
2923           else
2924             num_dynamic_syms = (ftell (file) - offset) / sizeof (Elf64_External_Sym);
2925
2926           if (num_dynamic_syms < 1)
2927             {
2928               error (_("Unable to determine the number of symbols to load\n"));
2929               continue;
2930             }
2931
2932           dynamic_symbols = GET_ELF_SYMBOLS (file, offset, num_dynamic_syms);
2933         }
2934     }
2935
2936   /* Similarly find a string table.  */
2937   if (dynamic_strings == NULL)
2938     {
2939       for (i = 0, entry = dynamic_segment;
2940            i < dynamic_size;
2941            ++i, ++ entry)
2942         {
2943           unsigned long offset;
2944           long          str_tab_len;
2945
2946           if (entry->d_tag != DT_STRTAB)
2947             continue;
2948
2949           dynamic_info[DT_STRTAB] = entry->d_un.d_val;
2950
2951           /* Since we do not know how big the string table is,
2952              we default to reading in the entire file (!) and
2953              processing that.  This is overkill, I know, but it
2954              should work. */
2955
2956           offset = entry->d_un.d_val - loadaddr;
2957           if (fseek (file, 0, SEEK_END))
2958             error (_("Unable to seek to end of file\n"));
2959           str_tab_len = ftell (file) - offset;
2960
2961           if (str_tab_len < 1)
2962             {
2963               error
2964                 (_("Unable to determine the length of the dynamic string table\n"));
2965               continue;
2966             }
2967
2968           GET_DATA_ALLOC (offset, str_tab_len, dynamic_strings, char *,
2969                           "dynamic string table");
2970
2971           break;
2972         }
2973     }
2974
2975   /* And find the syminfo section if available.  */
2976   if (dynamic_syminfo == NULL)
2977     {
2978       unsigned int syminsz = 0;
2979
2980       for (i = 0, entry = dynamic_segment;
2981            i < dynamic_size;
2982            ++i, ++ entry)
2983         {
2984           if (entry->d_tag == DT_SYMINENT)
2985             {
2986               /* Note: these braces are necessary to avoid a syntax
2987                  error from the SunOS4 C compiler.  */
2988               assert (sizeof (Elf_External_Syminfo) == entry->d_un.d_val);
2989             }
2990           else if (entry->d_tag == DT_SYMINSZ)
2991             syminsz = entry->d_un.d_val;
2992           else if (entry->d_tag == DT_SYMINFO)
2993             dynamic_syminfo_offset = entry->d_un.d_val - loadaddr;
2994         }
2995
2996       if (dynamic_syminfo_offset != 0 && syminsz != 0)
2997         {
2998           Elf_External_Syminfo * extsyminfo;
2999           Elf_Internal_Syminfo * syminfo;
3000
3001           /* There is a syminfo section.  Read the data.  */
3002           GET_DATA_ALLOC (dynamic_syminfo_offset, syminsz, extsyminfo,
3003                           Elf_External_Syminfo *, "symbol information");
3004
3005           dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
3006           if (dynamic_syminfo == NULL)
3007             {
3008               error (_("Out of memory\n"));
3009               return 0;
3010             }
3011
3012           dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
3013           for (i = 0, syminfo = dynamic_syminfo; i < dynamic_syminfo_nent;
3014                ++i, ++syminfo)
3015             {
3016               syminfo->si_boundto = BYTE_GET (extsyminfo[i].si_boundto);
3017               syminfo->si_flags = BYTE_GET (extsyminfo[i].si_flags);
3018             }
3019
3020           free (extsyminfo);
3021         }
3022     }
3023
3024   if (do_dynamic && dynamic_addr)
3025     printf (_("\nDynamic segment at offset 0x%x contains %ld entries:\n"),
3026             dynamic_addr, (long) dynamic_size);
3027   if (do_dynamic)
3028     printf (_("  Tag        Type                         Name/Value\n"));
3029
3030   for (i = 0, entry = dynamic_segment;
3031        i < dynamic_size;
3032        i++, entry ++)
3033     {
3034       if (do_dynamic)
3035         {
3036           putchar (' ');
3037           print_vma (entry->d_tag, FULL_HEX);
3038           printf (" (%s)%*s",
3039                   get_dynamic_type (entry->d_tag),
3040                   (is_32bit_elf ? 27 : 19) - strlen (get_dynamic_type (entry->d_tag)),
3041                   " ");
3042         }
3043
3044       switch (entry->d_tag)
3045         {
3046         case DT_AUXILIARY:
3047         case DT_FILTER:
3048           if (do_dynamic)
3049             {
3050               if (entry->d_tag == DT_AUXILIARY)
3051                 printf (_("Auxiliary library"));
3052               else
3053                 printf (_("Filter library"));
3054
3055               if (dynamic_strings)
3056                 printf (": [%s]\n", dynamic_strings + entry->d_un.d_val);
3057               else
3058                 {
3059                   printf (": ");
3060                   print_vma (entry->d_un.d_val, PREFIX_HEX);
3061                   putchar ('\n');
3062                 }
3063             }
3064           break;
3065
3066         case DT_FEATURE_1:
3067           if (do_dynamic)
3068             {
3069               printf (_("Flags:"));
3070               if (entry->d_un.d_val == 0)
3071                 printf (_(" None\n"));
3072               else
3073                 {
3074                   unsigned long int val = entry->d_un.d_val;
3075                   if (val & DTF_1_PARINIT)
3076                     {
3077                       printf (" PARINIT");
3078                       val ^= DTF_1_PARINIT;
3079                     }
3080                   if (val != 0)
3081                     printf (" %lx", val);
3082                   puts ("");
3083                 }
3084             }
3085           break;
3086
3087         case DT_POSFLAG_1:
3088           if (do_dynamic)
3089             {
3090               printf (_("Flags:"));
3091               if (entry->d_un.d_val == 0)
3092                 printf (_(" None\n"));
3093               else
3094                 {
3095                   unsigned long int val = entry->d_un.d_val;
3096                   if (val & DF_P1_LAZYLOAD)
3097                     {
3098                       printf (" LAZYLOAD");
3099                       val ^= DF_P1_LAZYLOAD;
3100                     }
3101                   if (val & DF_P1_GROUPPERM)
3102                     {
3103                       printf (" GROUPPERM");
3104                       val ^= DF_P1_GROUPPERM;
3105                     }
3106                   if (val != 0)
3107                     printf (" %lx", val);
3108                   puts ("");
3109                 }
3110             }
3111           break;
3112
3113         case DT_FLAGS_1:
3114           if (do_dynamic)
3115             {
3116               printf (_("Flags:"));
3117               if (entry->d_un.d_val == 0)
3118                 printf (_(" None\n"));
3119               else
3120                 {
3121                   unsigned long int val = entry->d_un.d_val;
3122                   if (val & DF_1_NOW)
3123                     {
3124                       printf (" NOW");
3125                       val ^= DF_1_NOW;
3126                     }
3127                   if (val & DF_1_GLOBAL)
3128                     {
3129                       printf (" GLOBAL");
3130                       val ^= DF_1_GLOBAL;
3131                     }
3132                   if (val & DF_1_GROUP)
3133                     {
3134                       printf (" GROUP");
3135                       val ^= DF_1_GROUP;
3136                     }
3137                   if (val & DF_1_NODELETE)
3138                     {
3139                       printf (" NODELETE");
3140                       val ^= DF_1_NODELETE;
3141                     }
3142                   if (val & DF_1_LOADFLTR)
3143                     {
3144                       printf (" LOADFLTR");
3145                       val ^= DF_1_LOADFLTR;
3146                     }
3147                   if (val & DF_1_INITFIRST)
3148                     {
3149                       printf (" INITFIRST");
3150                       val ^= DF_1_INITFIRST;
3151                     }
3152                   if (val & DF_1_NOOPEN)
3153                     {
3154                       printf (" NOOPEN");
3155                       val ^= DF_1_NOOPEN;
3156                     }
3157                   if (val & DF_1_ORIGIN)
3158                     {
3159                       printf (" ORIGIN");
3160                       val ^= DF_1_ORIGIN;
3161                     }
3162                   if (val & DF_1_DIRECT)
3163                     {
3164                       printf (" DIRECT");
3165                       val ^= DF_1_DIRECT;
3166                     }
3167                   if (val & DF_1_TRANS)
3168                     {
3169                       printf (" TRANS");
3170                       val ^= DF_1_TRANS;
3171                     }
3172                   if (val & DF_1_INTERPOSE)
3173                     {
3174                       printf (" INTERPOSE");
3175                       val ^= DF_1_INTERPOSE;
3176                     }
3177                   if (val != 0)
3178                     printf (" %lx", val);
3179                   puts ("");
3180                 }
3181             }
3182           break;
3183
3184         case DT_PLTREL:
3185           if (do_dynamic)
3186             puts (get_dynamic_type (entry->d_un.d_val));
3187           break;
3188
3189         case DT_NULL    :
3190         case DT_NEEDED  :
3191         case DT_PLTGOT  :
3192         case DT_HASH    :
3193         case DT_STRTAB  :
3194         case DT_SYMTAB  :
3195         case DT_RELA    :
3196         case DT_INIT    :
3197         case DT_FINI    :
3198         case DT_SONAME  :
3199         case DT_RPATH   :
3200         case DT_SYMBOLIC:
3201         case DT_REL     :
3202         case DT_DEBUG   :
3203         case DT_TEXTREL :
3204         case DT_JMPREL  :
3205           dynamic_info[entry->d_tag] = entry->d_un.d_val;
3206
3207           if (do_dynamic)
3208             {
3209               char * name;
3210
3211               if (dynamic_strings == NULL)
3212                 name = NULL;
3213               else
3214                 name = dynamic_strings + entry->d_un.d_val;
3215
3216               if (name)
3217                 {
3218                   switch (entry->d_tag)
3219                     {
3220                     case DT_NEEDED:
3221                       printf (_("Shared library: [%s]"), name);
3222
3223                       if (strcmp (name, program_interpreter) == 0)
3224                         printf (_(" program interpreter"));
3225                       break;
3226
3227                     case DT_SONAME:
3228                       printf (_("Library soname: [%s]"), name);
3229                       break;
3230
3231                     case DT_RPATH:
3232                       printf (_("Library rpath: [%s]"), name);
3233                       break;
3234
3235                     default:
3236                       print_vma (entry->d_un.d_val, PREFIX_HEX);
3237                       break;
3238                     }
3239                 }
3240               else
3241                 print_vma (entry->d_un.d_val, PREFIX_HEX);
3242
3243               putchar ('\n');
3244             }
3245           break;
3246
3247         case DT_PLTRELSZ:
3248         case DT_RELASZ  :
3249         case DT_STRSZ   :
3250         case DT_RELSZ   :
3251         case DT_RELAENT :
3252         case DT_SYMENT  :
3253         case DT_RELENT  :
3254         case DT_PLTPADSZ:
3255         case DT_MOVEENT :
3256         case DT_MOVESZ  :
3257         case DT_INIT_ARRAYSZ:
3258         case DT_FINI_ARRAYSZ:
3259           if (do_dynamic)
3260             {
3261               print_vma (entry->d_un.d_val, UNSIGNED);
3262               printf (" (bytes)\n");
3263             }
3264           break;
3265
3266         case DT_VERDEFNUM:
3267         case DT_VERNEEDNUM:
3268         case DT_RELACOUNT:
3269         case DT_RELCOUNT:
3270           if (do_dynamic)
3271             {
3272               print_vma (entry->d_un.d_val, UNSIGNED);
3273               putchar ('\n');
3274             }
3275           break;
3276
3277         case DT_SYMINSZ:
3278         case DT_SYMINENT:
3279         case DT_SYMINFO:
3280         case DT_USED:
3281         case DT_INIT_ARRAY:
3282         case DT_FINI_ARRAY:
3283           if (do_dynamic)
3284             {
3285               if (dynamic_strings != NULL && entry->d_tag == DT_USED)
3286                 {
3287                   char * name;
3288
3289                   name = dynamic_strings + entry->d_un.d_val;
3290
3291                   if (* name)
3292                     {
3293                       printf (_("Not needed object: [%s]\n"), name);
3294                       break;
3295                     }
3296                 }
3297
3298               print_vma (entry->d_un.d_val, PREFIX_HEX);
3299               putchar ('\n');
3300             }
3301           break;
3302
3303         case DT_BIND_NOW:
3304           /* The value of this entry is ignored.  */
3305           break;
3306
3307         default:
3308           if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
3309             version_info [DT_VERSIONTAGIDX (entry->d_tag)] =
3310               entry->d_un.d_val;
3311
3312           if (do_dynamic)
3313             {
3314               switch (elf_header.e_machine)
3315                 {
3316                 case EM_MIPS:
3317                 case EM_MIPS_RS4_BE:
3318                   dynamic_segment_mips_val (entry);
3319                   break;
3320                 case EM_PARISC:
3321                   dynamic_segment_parisc_val (entry);
3322                   break;
3323                 default:
3324                   print_vma (entry->d_un.d_val, PREFIX_HEX);
3325                   putchar ('\n');
3326                 }
3327             }
3328           break;
3329         }
3330     }
3331
3332   return 1;
3333 }
3334
3335 static char *
3336 get_ver_flags (flags)
3337      unsigned int flags;
3338 {
3339   static char buff [32];
3340
3341   buff[0] = 0;
3342
3343   if (flags == 0)
3344     return _("none");
3345
3346   if (flags & VER_FLG_BASE)
3347     strcat (buff, "BASE ");
3348
3349   if (flags & VER_FLG_WEAK)
3350     {
3351       if (flags & VER_FLG_BASE)
3352         strcat (buff, "| ");
3353
3354       strcat (buff, "WEAK ");
3355     }
3356
3357   if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK))
3358     strcat (buff, "| <unknown>");
3359
3360   return buff;
3361 }
3362
3363 /* Display the contents of the version sections.  */
3364 static int
3365 process_version_sections (file)
3366      FILE * file;
3367 {
3368   Elf32_Internal_Shdr * section;
3369   unsigned   i;
3370   int        found = 0;
3371
3372   if (! do_version)
3373     return 1;
3374
3375   for (i = 0, section = section_headers;
3376        i < elf_header.e_shnum;
3377        i++, section ++)
3378     {
3379       switch (section->sh_type)
3380         {
3381         case SHT_GNU_verdef:
3382           {
3383             Elf_External_Verdef * edefs;
3384             unsigned int          idx;
3385             unsigned int          cnt;
3386
3387             found = 1;
3388
3389             printf
3390               (_("\nVersion definition section '%s' contains %ld entries:\n"),
3391                SECTION_NAME (section), section->sh_info);
3392
3393             printf (_("  Addr: 0x"));
3394             printf_vma (section->sh_addr);
3395             printf (_("  Offset: %#08lx  Link: %lx (%s)\n"),
3396                     (unsigned long) section->sh_offset, section->sh_link,
3397                     SECTION_NAME (section_headers + section->sh_link));
3398
3399             GET_DATA_ALLOC (section->sh_offset, section->sh_size,
3400                             edefs, Elf_External_Verdef *,
3401                             "version definition section");
3402
3403             for (idx = cnt = 0; cnt < section->sh_info; ++ cnt)
3404               {
3405                 char *                 vstart;
3406                 Elf_External_Verdef *  edef;
3407                 Elf_Internal_Verdef    ent;
3408                 Elf_External_Verdaux * eaux;
3409                 Elf_Internal_Verdaux   aux;
3410                 int                    j;
3411                 int                    isum;
3412
3413                 vstart = ((char *) edefs) + idx;
3414
3415                 edef = (Elf_External_Verdef *) vstart;
3416
3417                 ent.vd_version = BYTE_GET (edef->vd_version);
3418                 ent.vd_flags   = BYTE_GET (edef->vd_flags);
3419                 ent.vd_ndx     = BYTE_GET (edef->vd_ndx);
3420                 ent.vd_cnt     = BYTE_GET (edef->vd_cnt);
3421                 ent.vd_hash    = BYTE_GET (edef->vd_hash);
3422                 ent.vd_aux     = BYTE_GET (edef->vd_aux);
3423                 ent.vd_next    = BYTE_GET (edef->vd_next);
3424
3425                 printf (_("  %#06x: Rev: %d  Flags: %s"),
3426                         idx, ent.vd_version, get_ver_flags (ent.vd_flags));
3427
3428                 printf (_("  Index: %d  Cnt: %d  "),
3429                         ent.vd_ndx, ent.vd_cnt);
3430
3431                 vstart += ent.vd_aux;
3432
3433                 eaux = (Elf_External_Verdaux *) vstart;
3434
3435                 aux.vda_name = BYTE_GET (eaux->vda_name);
3436                 aux.vda_next = BYTE_GET (eaux->vda_next);
3437
3438                 if (dynamic_strings)
3439                   printf (_("Name: %s\n"), dynamic_strings + aux.vda_name);
3440                 else
3441                   printf (_("Name index: %ld\n"), aux.vda_name);
3442
3443                 isum = idx + ent.vd_aux;
3444
3445                 for (j = 1; j < ent.vd_cnt; j ++)
3446                   {
3447                     isum   += aux.vda_next;
3448                     vstart += aux.vda_next;
3449
3450                     eaux = (Elf_External_Verdaux *) vstart;
3451
3452                     aux.vda_name = BYTE_GET (eaux->vda_name);
3453                     aux.vda_next = BYTE_GET (eaux->vda_next);
3454
3455                     if (dynamic_strings)
3456                       printf (_("  %#06x: Parent %d: %s\n"),
3457                               isum, j, dynamic_strings + aux.vda_name);
3458                     else
3459                       printf (_("  %#06x: Parent %d, name index: %ld\n"),
3460                               isum, j, aux.vda_name);
3461                   }
3462
3463                 idx += ent.vd_next;
3464               }
3465
3466             free (edefs);
3467           }
3468           break;
3469
3470         case SHT_GNU_verneed:
3471           {
3472             Elf_External_Verneed *  eneed;
3473             unsigned int            idx;
3474             unsigned int            cnt;
3475
3476             found = 1;
3477
3478             printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
3479                     SECTION_NAME (section), section->sh_info);
3480
3481             printf (_(" Addr: 0x"));
3482             printf_vma (section->sh_addr);
3483             printf (_("  Offset: %#08lx  Link to section: %ld (%s)\n"),
3484                     (unsigned long) section->sh_offset, section->sh_link,
3485                     SECTION_NAME (section_headers + section->sh_link));
3486
3487             GET_DATA_ALLOC (section->sh_offset, section->sh_size,
3488                             eneed, Elf_External_Verneed *,
3489                             "version need section");
3490
3491             for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
3492               {
3493                 Elf_External_Verneed * entry;
3494                 Elf_Internal_Verneed     ent;
3495                 int                      j;
3496                 int                      isum;
3497                 char *                   vstart;
3498
3499                 vstart = ((char *) eneed) + idx;
3500
3501                 entry = (Elf_External_Verneed *) vstart;
3502
3503                 ent.vn_version = BYTE_GET (entry->vn_version);
3504                 ent.vn_cnt     = BYTE_GET (entry->vn_cnt);
3505                 ent.vn_file    = BYTE_GET (entry->vn_file);
3506                 ent.vn_aux     = BYTE_GET (entry->vn_aux);
3507                 ent.vn_next    = BYTE_GET (entry->vn_next);
3508
3509                 printf (_("  %#06x: Version: %d"), idx, ent.vn_version);
3510
3511                 if (dynamic_strings)
3512                   printf (_("  File: %s"), dynamic_strings + ent.vn_file);
3513                 else
3514                   printf (_("  File: %lx"), ent.vn_file);
3515
3516                 printf (_("  Cnt: %d\n"), ent.vn_cnt);
3517
3518                 vstart += ent.vn_aux;
3519
3520                 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
3521                   {
3522                     Elf_External_Vernaux * eaux;
3523                     Elf_Internal_Vernaux   aux;
3524
3525                     eaux = (Elf_External_Vernaux *) vstart;
3526
3527                     aux.vna_hash  = BYTE_GET (eaux->vna_hash);
3528                     aux.vna_flags = BYTE_GET (eaux->vna_flags);
3529                     aux.vna_other = BYTE_GET (eaux->vna_other);
3530                     aux.vna_name  = BYTE_GET (eaux->vna_name);
3531                     aux.vna_next  = BYTE_GET (eaux->vna_next);
3532
3533                     if (dynamic_strings)
3534                       printf (_("  %#06x: Name: %s"),
3535                               isum, dynamic_strings + aux.vna_name);
3536                     else
3537                       printf (_("  %#06x: Name index: %lx"),
3538                               isum, aux.vna_name);
3539
3540                     printf (_("  Flags: %s  Version: %d\n"),
3541                             get_ver_flags (aux.vna_flags), aux.vna_other);
3542
3543                     isum   += aux.vna_next;
3544                     vstart += aux.vna_next;
3545                   }
3546
3547                 idx += ent.vn_next;
3548               }
3549
3550             free (eneed);
3551           }
3552           break;
3553
3554         case SHT_GNU_versym:
3555           {
3556             Elf32_Internal_Shdr *       link_section;
3557             int                         total;
3558             int                         cnt;
3559             unsigned char *             edata;
3560             unsigned short *            data;
3561             char *                      strtab;
3562             Elf_Internal_Sym *          symbols;
3563             Elf32_Internal_Shdr *       string_sec;
3564
3565             link_section = section_headers + section->sh_link;
3566             total = section->sh_size / section->sh_entsize;
3567
3568             found = 1;
3569
3570             symbols = GET_ELF_SYMBOLS (file, link_section->sh_offset,
3571                                        link_section->sh_size / link_section->sh_entsize);
3572
3573             string_sec = section_headers + link_section->sh_link;
3574
3575             GET_DATA_ALLOC (string_sec->sh_offset, string_sec->sh_size,
3576                             strtab, char *, "version string table");
3577
3578             printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
3579                     SECTION_NAME (section), total);
3580
3581             printf (_(" Addr: "));
3582             printf_vma (section->sh_addr);
3583             printf (_("  Offset: %#08lx  Link: %lx (%s)\n"),
3584                     (unsigned long) section->sh_offset, section->sh_link,
3585                     SECTION_NAME (link_section));
3586
3587             GET_DATA_ALLOC (version_info [DT_VERSIONTAGIDX (DT_VERSYM)]
3588                             - loadaddr,
3589                             total * sizeof (short), edata,
3590                             unsigned char *, "version symbol data");
3591
3592             data = (unsigned short *) malloc (total * sizeof (short));
3593
3594             for (cnt = total; cnt --;)
3595               data [cnt] = byte_get (edata + cnt * sizeof (short),
3596                                      sizeof (short));
3597
3598             free (edata);
3599
3600             for (cnt = 0; cnt < total; cnt += 4)
3601               {
3602                 int j, nn;
3603
3604                 printf ("  %03x:", cnt);
3605
3606                 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
3607                   switch (data [cnt + j])
3608                     {
3609                     case 0:
3610                       fputs (_("   0 (*local*)    "), stdout);
3611                       break;
3612
3613                     case 1:
3614                       fputs (_("   1 (*global*)   "), stdout);
3615                       break;
3616
3617                     default:
3618                       nn = printf ("%4x%c", data [cnt + j] & 0x7fff,
3619                                    data [cnt + j] & 0x8000 ? 'h' : ' ');
3620
3621                       if (symbols [cnt + j].st_shndx < SHN_LORESERVE
3622                           && section_headers[symbols [cnt + j].st_shndx].sh_type
3623                           == SHT_NOBITS)
3624                         {
3625                           /* We must test both.  */
3626                           Elf_Internal_Verneed     ivn;
3627                           unsigned long            offset;
3628
3629                           offset = version_info [DT_VERSIONTAGIDX (DT_VERNEED)]
3630                             - loadaddr;
3631
3632                           do
3633                             {
3634                               Elf_External_Verneed   evn;
3635                               Elf_External_Vernaux   evna;
3636                               Elf_Internal_Vernaux     ivna;
3637                               unsigned long            vna_off;
3638
3639                               GET_DATA (offset, evn, "version need");
3640
3641                               ivn.vn_aux  = BYTE_GET (evn.vn_aux);
3642                               ivn.vn_next = BYTE_GET (evn.vn_next);
3643
3644                               vna_off = offset + ivn.vn_aux;
3645
3646                               do
3647                                 {
3648                                   GET_DATA (vna_off, evna,
3649                                             "version need aux (1)");
3650
3651                                   ivna.vna_next  = BYTE_GET (evna.vna_next);
3652                                   ivna.vna_other = BYTE_GET (evna.vna_other);
3653
3654                                   vna_off += ivna.vna_next;
3655                                 }
3656                               while (ivna.vna_other != data [cnt + j]
3657                                      && ivna.vna_next != 0);
3658
3659                               if (ivna.vna_other == data [cnt + j])
3660                                 {
3661                                   ivna.vna_name = BYTE_GET (evna.vna_name);
3662
3663                                   nn += printf ("(%s%-*s",
3664                                                 strtab + ivna.vna_name,
3665                                                 12 - strlen (strtab
3666                                                              + ivna.vna_name),
3667                                                 ")");
3668                                   break;
3669                                 }
3670                               else if (ivn.vn_next == 0)
3671                                 {
3672                                   if (data [cnt + j] != 0x8001)
3673                                     {
3674                                       Elf_Internal_Verdef  ivd;
3675                                       Elf_External_Verdef  evd;
3676
3677                                       offset = version_info
3678                                         [DT_VERSIONTAGIDX (DT_VERDEF)]
3679                                         - loadaddr;
3680
3681                                       do
3682                                         {
3683                                           GET_DATA (offset, evd,
3684                                                     "version definition");
3685
3686                                           ivd.vd_next = BYTE_GET (evd.vd_next);
3687                                           ivd.vd_ndx  = BYTE_GET (evd.vd_ndx);
3688
3689                                           offset += ivd.vd_next;
3690                                         }
3691                                       while (ivd.vd_ndx
3692                                              != (data [cnt + j] & 0x7fff)
3693                                              && ivd.vd_next != 0);
3694
3695                                       if (ivd.vd_ndx
3696                                           == (data [cnt + j] & 0x7fff))
3697                                         {
3698                                           Elf_External_Verdaux  evda;
3699                                           Elf_Internal_Verdaux  ivda;
3700
3701                                           ivd.vd_aux = BYTE_GET (evd.vd_aux);
3702
3703                                           GET_DATA (offset + ivd.vd_aux, evda,
3704                                                     "version definition aux");
3705
3706                                           ivda.vda_name =
3707                                             BYTE_GET (evda.vda_name);
3708
3709                                           nn +=
3710                                             printf ("(%s%-*s",
3711                                                     strtab + ivda.vda_name,
3712                                                     12
3713                                                     - strlen (strtab
3714                                                               + ivda.vda_name),
3715                                                     ")");
3716                                         }
3717                                     }
3718
3719                                   break;
3720                                 }
3721                               else
3722                                 offset += ivn.vn_next;
3723                             }
3724                           while (ivn.vn_next);
3725                         }
3726                       else if (symbols [cnt + j].st_shndx == SHN_UNDEF)
3727                         {
3728                           Elf_Internal_Verneed     ivn;
3729                           unsigned long            offset;
3730
3731                           offset = version_info [DT_VERSIONTAGIDX (DT_VERNEED)]
3732                             - loadaddr;
3733
3734                           do
3735                             {
3736                               Elf_Internal_Vernaux     ivna;
3737                               Elf_External_Verneed   evn;
3738                               Elf_External_Vernaux   evna;
3739                               unsigned long            a_off;
3740
3741                               GET_DATA (offset, evn, "version need");
3742
3743                               ivn.vn_aux  = BYTE_GET (evn.vn_aux);
3744                               ivn.vn_next = BYTE_GET (evn.vn_next);
3745
3746                               a_off = offset + ivn.vn_aux;
3747
3748                               do
3749                                 {
3750                                   GET_DATA (a_off, evna,
3751                                             "version need aux (2)");
3752
3753                                   ivna.vna_next  = BYTE_GET (evna.vna_next);
3754                                   ivna.vna_other = BYTE_GET (evna.vna_other);
3755
3756                                   a_off += ivna.vna_next;
3757                                 }
3758                               while (ivna.vna_other != data [cnt + j]
3759                                      && ivna.vna_next != 0);
3760
3761                               if (ivna.vna_other == data [cnt + j])
3762                                 {
3763                                   ivna.vna_name = BYTE_GET (evna.vna_name);
3764
3765                                   nn += printf ("(%s%-*s",
3766                                                 strtab + ivna.vna_name,
3767                                                 12 - strlen (strtab
3768                                                              + ivna.vna_name),
3769                                                 ")");
3770                                   break;
3771                                 }
3772
3773                               offset += ivn.vn_next;
3774                             }
3775                           while (ivn.vn_next);
3776                         }
3777                       else if (data [cnt + j] != 0x8001)
3778                         {
3779                           Elf_Internal_Verdef  ivd;
3780                           Elf_External_Verdef  evd;
3781                           unsigned long        offset;
3782
3783                           offset = version_info
3784                             [DT_VERSIONTAGIDX (DT_VERDEF)] - loadaddr;
3785
3786                           do
3787                             {
3788                               GET_DATA (offset, evd, "version def");
3789
3790                               ivd.vd_next = BYTE_GET (evd.vd_next);
3791                               ivd.vd_ndx  = BYTE_GET (evd.vd_ndx);
3792
3793                               offset += ivd.vd_next;
3794                             }
3795                           while (ivd.vd_ndx != (data [cnt + j] & 0x7fff)
3796                                  && ivd.vd_next != 0);
3797
3798                           if (ivd.vd_ndx == (data [cnt + j] & 0x7fff))
3799                             {
3800                               Elf_External_Verdaux  evda;
3801                               Elf_Internal_Verdaux  ivda;
3802
3803                               ivd.vd_aux = BYTE_GET (evd.vd_aux);
3804
3805                               GET_DATA (offset - ivd.vd_next + ivd.vd_aux,
3806                                         evda, "version def aux");
3807
3808                               ivda.vda_name = BYTE_GET (evda.vda_name);
3809
3810                               nn += printf ("(%s%-*s",
3811                                             strtab + ivda.vda_name,
3812                                             12 - strlen (strtab
3813                                                          + ivda.vda_name),
3814                                             ")");
3815                             }
3816                         }
3817
3818                       if (nn < 18)
3819                         printf ("%*c", 18 - nn, ' ');
3820                     }
3821
3822                 putchar ('\n');
3823               }
3824
3825             free (data);
3826             free (strtab);
3827             free (symbols);
3828           }
3829           break;
3830
3831         default:
3832           break;
3833         }
3834     }
3835
3836   if (! found)
3837     printf (_("\nNo version information found in this file.\n"));
3838
3839   return 1;
3840 }
3841
3842 static char *
3843 get_symbol_binding (binding)
3844      unsigned int binding;
3845 {
3846   static char buff [32];
3847
3848   switch (binding)
3849     {
3850     case STB_LOCAL:  return "LOCAL";
3851     case STB_GLOBAL: return "GLOBAL";
3852     case STB_WEAK:   return "WEAK";
3853     default:
3854       if (binding >= STB_LOPROC && binding <= STB_HIPROC)
3855         sprintf (buff, _("<processor specific>: %d"), binding);
3856       else if (binding >= STB_LOOS && binding <= STB_HIOS)
3857         sprintf (buff, _("<OS specific>: %d"), binding);
3858       else
3859         sprintf (buff, _("<unknown>: %d"), binding);
3860       return buff;
3861     }
3862 }
3863
3864 static char *
3865 get_symbol_type (type)
3866      unsigned int type;
3867 {
3868   static char buff [32];
3869
3870   switch (type)
3871     {
3872     case STT_NOTYPE:   return "NOTYPE";
3873     case STT_OBJECT:   return "OBJECT";
3874     case STT_FUNC:     return "FUNC";
3875     case STT_SECTION:  return "SECTION";
3876     case STT_FILE:     return "FILE";
3877     default:
3878       if (type >= STT_LOPROC && type <= STT_HIPROC)
3879         {
3880           if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
3881             return "THUMB_FUNC";
3882
3883           if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
3884             return "REGISTER";
3885
3886           if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
3887             return "PARISC_MILLI";
3888
3889           sprintf (buff, _("<processor specific>: %d"), type);
3890         }
3891       else if (type >= STT_LOOS && type <= STT_HIOS)
3892         {
3893           if (elf_header.e_machine == EM_PARISC)
3894             {
3895               if (type == STT_HP_OPAQUE)
3896                 return "HP_OPAQUE";
3897               if (type == STT_HP_STUB)
3898                 return "HP_STUB";
3899             }
3900
3901           sprintf (buff, _("<OS specific>: %d"), type);
3902         }
3903       else
3904         sprintf (buff, _("<unknown>: %d"), type);
3905       return buff;
3906     }
3907 }
3908
3909 static char *
3910 get_symbol_index_type (type)
3911      unsigned int type;
3912 {
3913   switch (type)
3914     {
3915     case SHN_UNDEF:  return "UND";
3916     case SHN_ABS:    return "ABS";
3917     case SHN_COMMON: return "COM";
3918     default:
3919       if (type >= SHN_LOPROC && type <= SHN_HIPROC)
3920         return "PRC";
3921       else if (type >= SHN_LORESERVE && type <= SHN_HIRESERVE)
3922         return "RSV";
3923       else if (type >= SHN_LOOS && type <= SHN_HIOS)
3924         return "OS ";
3925       else
3926         {
3927           static char buff [32];
3928
3929           sprintf (buff, "%3d", type);
3930           return buff;
3931         }
3932     }
3933 }
3934
3935
3936 static int *
3937 get_dynamic_data (file, number)
3938      FILE *       file;
3939      unsigned int number;
3940 {
3941   char * e_data;
3942   int *  i_data;
3943
3944   e_data = (char *) malloc (number * 4);
3945
3946   if (e_data == NULL)
3947     {
3948       error (_("Out of memory\n"));
3949       return NULL;
3950     }
3951
3952   if (fread (e_data, 4, number, file) != number)
3953     {
3954       error (_("Unable to read in dynamic data\n"));
3955       return NULL;
3956     }
3957
3958   i_data = (int *) malloc (number * sizeof (* i_data));
3959
3960   if (i_data == NULL)
3961     {
3962       error (_("Out of memory\n"));
3963       free (e_data);
3964       return NULL;
3965     }
3966
3967   while (number--)
3968     i_data [number] = byte_get (e_data + number * 4, 4);
3969
3970   free (e_data);
3971
3972   return i_data;
3973 }
3974
3975 /* Dump the symbol table */
3976 static int
3977 process_symbol_table (file)
3978      FILE * file;
3979 {
3980   Elf32_Internal_Shdr *   section;
3981   char   nb [4];
3982   char   nc [4];
3983   int    nbuckets = 0;
3984   int    nchains;
3985   int *  buckets = NULL;
3986   int *  chains = NULL;
3987
3988   if (! do_syms && !do_histogram)
3989     return 1;
3990
3991   if (dynamic_info[DT_HASH] && ((do_using_dynamic && dynamic_strings != NULL)
3992                                 || do_histogram))
3993     {
3994       if (fseek (file, dynamic_info[DT_HASH] - loadaddr, SEEK_SET))
3995         {
3996           error (_("Unable to seek to start of dynamic information"));
3997           return 0;
3998         }
3999
4000       if (fread (nb, sizeof (nb), 1, file) != 1)
4001         {
4002           error (_("Failed to read in number of buckets\n"));
4003           return 0;
4004         }
4005
4006       if (fread (nc, sizeof (nc), 1, file) != 1)
4007         {
4008           error (_("Failed to read in number of chains\n"));
4009           return 0;
4010         }
4011
4012       nbuckets = byte_get (nb, 4);
4013       nchains  = byte_get (nc, 4);
4014
4015       buckets = get_dynamic_data (file, nbuckets);
4016       chains  = get_dynamic_data (file, nchains);
4017
4018       if (buckets == NULL || chains == NULL)
4019         return 0;
4020     }
4021
4022   if (do_syms
4023       && dynamic_info[DT_HASH] && do_using_dynamic && dynamic_strings != NULL)
4024     {
4025       int    hn;
4026       int    si;
4027
4028       printf (_("\nSymbol table for image:\n"));
4029       if (is_32bit_elf)
4030         printf (_("  Num Buc:    Value  Size   Type   Bind Ot Ndx Name\n"));
4031       else
4032         printf (_("  Num Buc:    Value          Size   Type   Bind Ot Ndx Name\n"));
4033
4034       for (hn = 0; hn < nbuckets; hn++)
4035         {
4036           if (! buckets [hn])
4037             continue;
4038
4039           for (si = buckets [hn]; si < nchains && si > 0; si = chains [si])
4040             {
4041               Elf_Internal_Sym * psym;
4042
4043               psym = dynamic_symbols + si;
4044
4045               printf ("  %3d %3d: ", si, hn);
4046               print_vma (psym->st_value, LONG_HEX);
4047               putchar (' ' );
4048               print_vma (psym->st_size,  DEC_5);
4049                       
4050               printf ("  %6s %6s %2d ",
4051                       get_symbol_type (ELF_ST_TYPE (psym->st_info)),
4052                       get_symbol_binding (ELF_ST_BIND (psym->st_info)),
4053                       psym->st_other);
4054
4055               printf ("%3.3s", get_symbol_index_type (psym->st_shndx));
4056
4057               printf (" %s\n", dynamic_strings + psym->st_name);
4058             }
4059         }
4060     }
4061   else if (do_syms && !do_using_dynamic)
4062     {
4063       unsigned int     i;
4064
4065       for (i = 0, section = section_headers;
4066            i < elf_header.e_shnum;
4067            i++, section++)
4068         {
4069           unsigned int          si;
4070           char *                strtab;
4071           Elf_Internal_Sym *    symtab;
4072           Elf_Internal_Sym *    psym;
4073
4074
4075           if (   section->sh_type != SHT_SYMTAB
4076               && section->sh_type != SHT_DYNSYM)
4077             continue;
4078
4079           printf (_("\nSymbol table '%s' contains %lu entries:\n"),
4080                   SECTION_NAME (section),
4081                   (unsigned long) (section->sh_size / section->sh_entsize));
4082           if (is_32bit_elf)
4083             printf (_("  Num:    Value  Size Type    Bind   Ot  Ndx Name\n"));
4084           else
4085             printf (_("  Num:    Value          Size Type    Bind   Ot  Ndx Name\n"));
4086
4087           symtab = GET_ELF_SYMBOLS (file, section->sh_offset,
4088                                     section->sh_size / section->sh_entsize);
4089           if (symtab == NULL)
4090             continue;
4091
4092           if (section->sh_link == elf_header.e_shstrndx)
4093             strtab = string_table;
4094           else
4095             {
4096               Elf32_Internal_Shdr * string_sec;
4097
4098               string_sec = section_headers + section->sh_link;
4099
4100               GET_DATA_ALLOC (string_sec->sh_offset, string_sec->sh_size,
4101                               strtab, char *, "string table");
4102             }
4103
4104           for (si = 0, psym = symtab;
4105                si < section->sh_size / section->sh_entsize;
4106                si ++, psym ++)
4107             {
4108               printf ("  %3d: ", si);
4109               print_vma (psym->st_value, LONG_HEX);
4110               putchar (' ');
4111               print_vma (psym->st_size, DEC_5);
4112               printf (" %-7s %-6s %2d ",
4113                       get_symbol_type (ELF_ST_TYPE (psym->st_info)),
4114                       get_symbol_binding (ELF_ST_BIND (psym->st_info)),
4115                       psym->st_other);
4116
4117               printf ("%4s", get_symbol_index_type (psym->st_shndx));
4118
4119               printf (" %s", strtab + psym->st_name);
4120
4121               if (section->sh_type == SHT_DYNSYM &&
4122                   version_info [DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
4123                 {
4124                   unsigned char   data[2];
4125                   unsigned short  vers_data;
4126                   unsigned long   offset;
4127                   int             is_nobits;
4128                   int             check_def;
4129
4130                   offset = version_info [DT_VERSIONTAGIDX (DT_VERSYM)]
4131                     - loadaddr;
4132
4133                   GET_DATA (offset + si * sizeof (vers_data), data,
4134                             "version data");
4135
4136                   vers_data = byte_get (data, 2);
4137
4138                   is_nobits = psym->st_shndx < SHN_LORESERVE ?
4139                     (section_headers [psym->st_shndx].sh_type == SHT_NOBITS)
4140                     : 0;
4141
4142                   check_def = (psym->st_shndx != SHN_UNDEF);
4143
4144                   if ((vers_data & 0x8000) || vers_data > 1)
4145                     {
4146                       if (is_nobits || ! check_def)
4147                         {
4148                           Elf_External_Verneed  evn;
4149                           Elf_Internal_Verneed  ivn;
4150                           Elf_Internal_Vernaux  ivna;
4151
4152                           /* We must test both.  */
4153                           offset = version_info
4154                             [DT_VERSIONTAGIDX (DT_VERNEED)] - loadaddr;
4155
4156                           GET_DATA (offset, evn, "version need");
4157
4158                           ivn.vn_aux  = BYTE_GET (evn.vn_aux);
4159                           ivn.vn_next = BYTE_GET (evn.vn_next);
4160
4161                           do
4162                             {
4163                               unsigned long  vna_off;
4164
4165                               vna_off = offset + ivn.vn_aux;
4166
4167                               do
4168                                 {
4169                                   Elf_External_Vernaux  evna;
4170
4171                                   GET_DATA (vna_off, evna,
4172                                             "version need aux (3)");
4173
4174                                   ivna.vna_other = BYTE_GET (evna.vna_other);
4175                                   ivna.vna_next  = BYTE_GET (evna.vna_next);
4176                                   ivna.vna_name  = BYTE_GET (evna.vna_name);
4177
4178                                   vna_off += ivna.vna_next;
4179                                 }
4180                               while (ivna.vna_other != vers_data
4181                                      && ivna.vna_next != 0);
4182
4183                               if (ivna.vna_other == vers_data)
4184                                 break;
4185
4186                               offset += ivn.vn_next;
4187                             }
4188                           while (ivn.vn_next != 0);
4189
4190                           if (ivna.vna_other == vers_data)
4191                             {
4192                               printf ("@%s (%d)",
4193                                       strtab + ivna.vna_name, ivna.vna_other);
4194                               check_def = 0;
4195                             }
4196                           else if (! is_nobits)
4197                             error (_("bad dynamic symbol"));
4198                           else
4199                             check_def = 1;
4200                         }
4201
4202                       if (check_def)
4203                         {
4204                           if (vers_data != 0x8001)
4205                             {
4206                               Elf_Internal_Verdef     ivd;
4207                               Elf_Internal_Verdaux    ivda;
4208                               Elf_External_Verdaux  evda;
4209                               unsigned long           offset;
4210
4211                               offset =
4212                                 version_info [DT_VERSIONTAGIDX (DT_VERDEF)]
4213                                 - loadaddr;
4214
4215                               do
4216                                 {
4217                                   Elf_External_Verdef   evd;
4218
4219                                   GET_DATA (offset, evd, "version def");
4220
4221                                   ivd.vd_ndx  = BYTE_GET (evd.vd_ndx);
4222                                   ivd.vd_aux  = BYTE_GET (evd.vd_aux);
4223                                   ivd.vd_next = BYTE_GET (evd.vd_next);
4224
4225                                   offset += ivd.vd_next;
4226                                 }
4227                               while (ivd.vd_ndx != (vers_data & 0x7fff)
4228                                      && ivd.vd_next != 0);
4229
4230                               offset -= ivd.vd_next;
4231                               offset += ivd.vd_aux;
4232
4233                               GET_DATA (offset, evda, "version def aux");
4234
4235                               ivda.vda_name = BYTE_GET (evda.vda_name);
4236
4237                               if (psym->st_name != ivda.vda_name)
4238                                 printf ((vers_data & 0x8000)
4239                                         ? "@%s" : "@@%s",
4240                                         strtab + ivda.vda_name);
4241                             }
4242                         }
4243                     }
4244                 }
4245
4246               putchar ('\n');
4247             }
4248
4249           free (symtab);
4250           if (strtab != string_table)
4251             free (strtab);
4252         }
4253     }
4254   else if (do_syms)
4255     printf
4256       (_("\nDynamic symbol information is not available for displaying symbols.\n"));
4257
4258   if (do_histogram && buckets != NULL)
4259     {
4260       int *lengths;
4261       int *counts;
4262       int hn;
4263       int si;
4264       int maxlength = 0;
4265       int nzero_counts = 0;
4266       int nsyms = 0;
4267
4268       printf (_("\nHistogram for bucket list length (total of %d buckets):\n"),
4269               nbuckets);
4270       printf (_(" Length  Number     %% of total  Coverage\n"));
4271
4272       lengths = (int *) calloc (nbuckets, sizeof (int));
4273       if (lengths == NULL)
4274         {
4275           error (_("Out of memory"));
4276           return 0;
4277         }
4278       for (hn = 0; hn < nbuckets; ++hn)
4279         {
4280           if (! buckets [hn])
4281             continue;
4282
4283           for (si = buckets[hn]; si > 0 && si < nchains; si = chains[si])
4284             {
4285               ++ nsyms;
4286               if (maxlength < ++lengths[hn])
4287                 ++ maxlength;
4288             }
4289         }
4290
4291       counts = (int *) calloc (maxlength + 1, sizeof (int));
4292       if (counts == NULL)
4293         {
4294           error (_("Out of memory"));
4295           return 0;
4296         }
4297
4298       for (hn = 0; hn < nbuckets; ++hn)
4299         ++counts[lengths [hn]];
4300
4301       if (nbuckets > 0)
4302         {
4303           printf ("      0  %-10d (%5.1f%%)\n",
4304                   counts[0], (counts[0] * 100.0) / nbuckets);
4305           for (si = 1; si <= maxlength; ++si)
4306             {
4307               nzero_counts += counts[si] * si;
4308               printf ("%7d  %-10d (%5.1f%%)    %5.1f%%\n",
4309                       si, counts[si], (counts[si] * 100.0) / nbuckets,
4310                       (nzero_counts * 100.0) / nsyms);
4311             }
4312         }
4313
4314       free (counts);
4315       free (lengths);
4316     }
4317
4318   if (buckets != NULL)
4319     {
4320       free (buckets);
4321       free (chains);
4322     }
4323
4324   return 1;
4325 }
4326
4327 static int
4328 process_syminfo (file)
4329      FILE * file ATTRIBUTE_UNUSED;
4330 {
4331   unsigned int i;
4332
4333   if (dynamic_syminfo == NULL
4334       || !do_dynamic)
4335     /* No syminfo, this is ok.  */
4336     return 1;
4337
4338   /* There better should be a dynamic symbol section.  */
4339   if (dynamic_symbols == NULL || dynamic_strings == NULL)
4340     return 0;
4341
4342   if (dynamic_addr)
4343     printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
4344             dynamic_syminfo_offset, dynamic_syminfo_nent);
4345
4346   printf (_(" Num: Name                           BoundTo     Flags\n"));
4347   for (i = 0; i < dynamic_syminfo_nent; ++i)
4348     {
4349       unsigned short int flags = dynamic_syminfo[i].si_flags;
4350
4351       printf ("%4d: %-30s ", i,
4352               dynamic_strings + dynamic_symbols[i].st_name);
4353
4354       switch (dynamic_syminfo[i].si_boundto)
4355         {
4356         case SYMINFO_BT_SELF:
4357           fputs ("SELF       ", stdout);
4358           break;
4359         case SYMINFO_BT_PARENT:
4360           fputs ("PARENT     ", stdout);
4361           break;
4362         default:
4363           if (dynamic_syminfo[i].si_boundto > 0
4364               && dynamic_syminfo[i].si_boundto < dynamic_size)
4365             printf ("%-10s ",
4366                     dynamic_strings
4367                     + dynamic_segment[dynamic_syminfo[i].si_boundto].d_un.d_val);
4368           else
4369             printf ("%-10d ", dynamic_syminfo[i].si_boundto);
4370           break;
4371         }
4372
4373       if (flags & SYMINFO_FLG_DIRECT)
4374         printf (" DIRECT");
4375       if (flags & SYMINFO_FLG_PASSTHRU)
4376         printf (" PASSTHRU");
4377       if (flags & SYMINFO_FLG_COPY)
4378         printf (" COPY");
4379       if (flags & SYMINFO_FLG_LAZYLOAD)
4380         printf (" LAZYLOAD");
4381
4382       puts ("");
4383     }
4384
4385   return 1;
4386 }
4387
4388 #ifdef SUPPORT_DISASSEMBLY
4389 static void
4390 disassemble_section (section, file)
4391      Elf32_Internal_Shdr * section;
4392      FILE * file;
4393 {
4394   printf (_("\nAssembly dump of section %s\n"),
4395           SECTION_NAME (section));
4396
4397   /* XXX -- to be done --- XXX */
4398
4399   return 1;
4400 }
4401 #endif
4402
4403 static int
4404 dump_section (section, file)
4405      Elf32_Internal_Shdr * section;
4406      FILE * file;
4407 {
4408   bfd_size_type   bytes;
4409   bfd_vma         addr;
4410   unsigned char * data;
4411   unsigned char * start;
4412
4413   bytes = section->sh_size;
4414
4415   if (bytes == 0)
4416     {
4417       printf (_("\nSection '%s' has no data to dump.\n"),
4418               SECTION_NAME (section));
4419       return 0;
4420     }
4421   else
4422     printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section));
4423
4424   addr = section->sh_addr;
4425
4426   GET_DATA_ALLOC (section->sh_offset, bytes, start, unsigned char *,
4427                   "section data");
4428
4429   data = start;
4430
4431   while (bytes)
4432     {
4433       int j;
4434       int k;
4435       int lbytes;
4436
4437       lbytes = (bytes > 16 ? 16 : bytes);
4438
4439       printf ("  0x%8.8lx ", (unsigned long) addr);
4440
4441       switch (elf_header.e_ident [EI_DATA])
4442         {
4443         default:
4444         case ELFDATA2LSB:
4445           for (j = 15; j >= 0; j --)
4446             {
4447               if (j < lbytes)
4448                 printf ("%2.2x", data [j]);
4449               else
4450                 printf ("  ");
4451
4452               if (!(j & 0x3))
4453                 printf (" ");
4454             }
4455           break;
4456
4457         case ELFDATA2MSB:
4458           for (j = 0; j < 16; j++)
4459             {
4460               if (j < lbytes)
4461                 printf ("%2.2x", data [j]);
4462               else
4463                 printf ("  ");
4464
4465               if ((j & 3) == 3)
4466                 printf (" ");
4467             }
4468           break;
4469         }
4470
4471       for (j = 0; j < lbytes; j++)
4472         {
4473           k = data [j];
4474           if (k >= ' ' && k < 0x80)
4475             printf ("%c", k);
4476           else
4477             printf (".");
4478         }
4479
4480       putchar ('\n');
4481
4482       data  += lbytes;
4483       addr  += lbytes;
4484       bytes -= lbytes;
4485     }
4486
4487   free (start);
4488
4489   return 1;
4490 }
4491
4492
4493 static unsigned long int
4494 read_leb128 (data, length_return, sign)
4495      unsigned char * data;
4496      int *           length_return;
4497      int             sign;
4498 {
4499   unsigned long int result = 0;
4500   unsigned int      num_read = 0;
4501   int               shift = 0;
4502   unsigned char     byte;
4503
4504   do
4505     {
4506       byte = * data ++;
4507       num_read ++;
4508
4509       result |= (byte & 0x7f) << shift;
4510
4511       shift += 7;
4512
4513     }
4514   while (byte & 0x80);
4515
4516   if (length_return != NULL)
4517     * length_return = num_read;
4518
4519   if (sign && (shift < 32) && (byte & 0x40))
4520     result |= -1 << shift;
4521
4522   return result;
4523 }
4524
4525 typedef struct State_Machine_Registers
4526 {
4527   unsigned long address;
4528   unsigned int  file;
4529   unsigned int  line;
4530   unsigned int  column;
4531   int           is_stmt;
4532   int           basic_block;
4533   int           end_sequence;
4534 /* This variable hold the number of the last entry seen
4535    in the File Table.  */
4536   unsigned int  last_file_entry;
4537 } SMR;
4538
4539 static SMR state_machine_regs;
4540
4541 static void
4542 reset_state_machine (is_stmt)
4543      int is_stmt;
4544 {
4545   state_machine_regs.address = 0;
4546   state_machine_regs.file = 1;
4547   state_machine_regs.line = 1;
4548   state_machine_regs.column = 0;
4549   state_machine_regs.is_stmt = is_stmt;
4550   state_machine_regs.basic_block = 0;
4551   state_machine_regs.end_sequence = 0;
4552   state_machine_regs.last_file_entry = 0;
4553 }
4554
4555 /* Handled an extend line op.  Returns true if this is the end
4556    of sequence.  */
4557 static int
4558 process_extended_line_op (data, is_stmt, pointer_size)
4559      unsigned char * data;
4560      int is_stmt;
4561      int pointer_size;
4562 {
4563   unsigned char   op_code;
4564   int             bytes_read;
4565   unsigned int    len;
4566   unsigned char * name;
4567   unsigned long   adr;
4568
4569   len = read_leb128 (data, & bytes_read, 0);
4570   data += bytes_read;
4571
4572   if (len == 0)
4573     {
4574       warn (_("badly formed extended line op encountered!"));
4575       return bytes_read;
4576     }
4577
4578   len += bytes_read;
4579   op_code = * data ++;
4580
4581   printf (_("  Extended opcode %d: "), op_code);
4582
4583   switch (op_code)
4584     {
4585     case DW_LNE_end_sequence:
4586       printf (_("End of Sequence\n\n"));
4587       reset_state_machine (is_stmt);
4588       break;
4589
4590     case DW_LNE_set_address:
4591       adr = byte_get (data, pointer_size);
4592       printf (_("set Address to 0x%lx\n"), adr);
4593       state_machine_regs.address = adr;
4594       break;
4595
4596     case DW_LNE_define_file:
4597       printf (_("  define new File Table entry\n"));
4598       printf (_("  Entry\tDir\tTime\tSize\tName\n"));
4599
4600       printf (_("   %d\t"), ++ state_machine_regs.last_file_entry);
4601       name = data;
4602       data += strlen (data) + 1;
4603       printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
4604       data += bytes_read;
4605       printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
4606       data += bytes_read;
4607       printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
4608       printf (_("%s\n\n"), name);
4609       break;
4610
4611     default:
4612       printf (_("UNKNOWN: length %d\n"), len - bytes_read);
4613       break;
4614     }
4615
4616   return len;
4617 }
4618
4619 /* Size of pointers in the .debug_line section.  This information is not
4620    really present in that section.  It's obtained before dumping the debug
4621    sections by doing some pre-scan of the .debug_info section.  */
4622 static int debug_line_pointer_size = 4;
4623
4624 static int
4625 display_debug_lines (section, start, file)
4626      Elf32_Internal_Shdr * section;
4627      unsigned char *       start;
4628      FILE *                file ATTRIBUTE_UNUSED;
4629 {
4630   DWARF2_External_LineInfo * external;
4631   DWARF2_Internal_LineInfo   info;
4632   unsigned char *            standard_opcodes;
4633   unsigned char *            data = start;
4634   unsigned char *            end  = start + section->sh_size;
4635   unsigned char *            end_of_sequence;
4636   int                        i;
4637
4638   printf (_("\nDump of debug contents of section %s:\n\n"),
4639           SECTION_NAME (section));
4640
4641   while (data < end)
4642     {
4643       external = (DWARF2_External_LineInfo *) data;
4644
4645       /* Check the length of the block.  */
4646       info.li_length = BYTE_GET (external->li_length);
4647       if (info.li_length > section->sh_size)
4648         {
4649           warn
4650             (_("The line info appears to be corrupt - the section is too small\n"));
4651           return 0;
4652         }
4653
4654       /* Check its version number.  */
4655       info.li_version = BYTE_GET (external->li_version);
4656       if (info.li_version != 2)
4657         {
4658           warn (_("Only DWARF version 2 line info is currently supported.\n"));
4659           return 0;
4660         }
4661
4662       info.li_prologue_length = BYTE_GET (external->li_prologue_length);
4663       info.li_min_insn_length = BYTE_GET (external->li_min_insn_length);
4664       info.li_default_is_stmt = BYTE_GET (external->li_default_is_stmt);
4665       info.li_line_base       = BYTE_GET (external->li_line_base);
4666       info.li_line_range      = BYTE_GET (external->li_line_range);
4667       info.li_opcode_base     = BYTE_GET (external->li_opcode_base);
4668
4669       /* Sign extend the line base field.  */
4670       info.li_line_base <<= 24;
4671       info.li_line_base >>= 24;
4672
4673       printf (_("  Length:                      %ld\n"), info.li_length);
4674       printf (_("  DWARF Version:               %d\n"), info.li_version);
4675       printf (_("  Prolgue Length:              %d\n"), info.li_prologue_length);
4676       printf (_("  Minimum Instruction Length:  %d\n"), info.li_min_insn_length);
4677       printf (_("  Initial value of 'is_stmt':  %d\n"), info.li_default_is_stmt);
4678       printf (_("  Line Base:                   %d\n"), info.li_line_base);
4679       printf (_("  Line Range:                  %d\n"), info.li_line_range);
4680       printf (_("  Opcode Base:                 %d\n"), info.li_opcode_base);
4681
4682       end_of_sequence = data + info.li_length + sizeof (info.li_length);
4683
4684       reset_state_machine (info.li_default_is_stmt);
4685
4686       /* Display the contents of the Opcodes table.  */
4687       standard_opcodes = data + sizeof (* external);
4688
4689       printf (_("\n Opcodes:\n"));
4690
4691       for (i = 1; i < info.li_opcode_base; i++)
4692         printf (_("  Opcode %d has %d args\n"), i, standard_opcodes[i - 1]);
4693
4694       /* Display the contents of the Directory table.  */
4695       data = standard_opcodes + info.li_opcode_base - 1;
4696
4697       if (* data == 0)
4698         printf (_("\n The Directory Table is empty.\n"));
4699       else
4700         {
4701           printf (_("\n The Directory Table:\n"));
4702
4703           while (* data != 0)
4704             {
4705               printf (_("  %s\n"), data);
4706
4707               data += strlen (data) + 1;
4708             }
4709         }
4710
4711       /* Skip the NUL at the end of the table.  */
4712       data ++;
4713
4714       /* Display the contents of the File Name table.  */
4715       if (* data == 0)
4716         printf (_("\n The File Name Table is empty.\n"));
4717       else
4718         {
4719           printf (_("\n The File Name Table:\n"));
4720           printf (_("  Entry\tDir\tTime\tSize\tName\n"));
4721
4722           while (* data != 0)
4723             {
4724               char * name;
4725               int bytes_read;
4726
4727               printf (_("  %d\t"), ++ state_machine_regs.last_file_entry);
4728               name = data;
4729
4730               data += strlen (data) + 1;
4731
4732               printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
4733               data += bytes_read;
4734               printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
4735               data += bytes_read;
4736               printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
4737               data += bytes_read;
4738               printf (_("%s\n"), name);
4739             }
4740         }
4741
4742       /* Skip the NUL at the end of the table.  */
4743       data ++;
4744
4745       /* Now display the statements.  */
4746       printf (_("\n Line Number Statements:\n"));
4747
4748
4749       while (data < end_of_sequence)
4750         {
4751           unsigned char op_code;
4752           int           adv;
4753           int           bytes_read;
4754
4755           op_code = * data ++;
4756
4757           switch (op_code)
4758             {
4759             case DW_LNS_extended_op:
4760               data += process_extended_line_op (data, info.li_default_is_stmt,
4761                                                 debug_line_pointer_size);
4762               break;
4763
4764             case DW_LNS_copy:
4765               printf (_("  Copy\n"));
4766               break;
4767
4768             case DW_LNS_advance_pc:
4769               adv = info.li_min_insn_length * read_leb128 (data, & bytes_read, 0);
4770               data += bytes_read;
4771               state_machine_regs.address += adv;
4772               printf (_("  Advance PC by %d to %lx\n"), adv,
4773                       state_machine_regs.address);
4774               break;
4775
4776             case DW_LNS_advance_line:
4777               adv = read_leb128 (data, & bytes_read, 1);
4778               data += bytes_read;
4779               state_machine_regs.line += adv;
4780               printf (_("  Advance Line by %d to %d\n"), adv,
4781                       state_machine_regs.line);
4782               break;
4783
4784             case DW_LNS_set_file:
4785               adv = read_leb128 (data, & bytes_read, 0);
4786               data += bytes_read;
4787               printf (_("  Set File Name to entry %d in the File Name Table\n"),
4788                       adv);
4789               state_machine_regs.file = adv;
4790               break;
4791
4792             case DW_LNS_set_column:
4793               adv = read_leb128 (data, & bytes_read, 0);
4794               data += bytes_read;
4795               printf (_("  Set column to %d\n"), adv);
4796               state_machine_regs.column = adv;
4797               break;
4798
4799             case DW_LNS_negate_stmt:
4800               adv = state_machine_regs.is_stmt;
4801               adv = ! adv;
4802               printf (_("  Set is_stmt to %d\n"), adv);
4803               state_machine_regs.is_stmt = adv;
4804               break;
4805
4806             case DW_LNS_set_basic_block:
4807               printf (_("  Set basic block\n"));
4808               state_machine_regs.basic_block = 1;
4809               break;
4810
4811             case DW_LNS_const_add_pc:
4812               adv = (((255 - info.li_opcode_base) / info.li_line_range)
4813                      * info.li_min_insn_length);
4814               state_machine_regs.address += adv;
4815               printf (_("  Advance PC by constant %d to 0x%lx\n"), adv,
4816                       state_machine_regs.address);
4817               break;
4818
4819             case DW_LNS_fixed_advance_pc:
4820               adv = byte_get (data, 2);
4821               data += 2;
4822               state_machine_regs.address += adv;
4823               printf (_("  Advance PC by fixed size amount %d to 0x%lx\n"),
4824                       adv, state_machine_regs.address);
4825               break;
4826
4827             default:
4828               op_code -= info.li_opcode_base;
4829               adv      = (op_code / info.li_line_range) * info.li_min_insn_length;
4830               state_machine_regs.address += adv;
4831               printf (_("  Special opcode %d: advance Address by %d to 0x%lx"),
4832                       op_code, adv, state_machine_regs.address);
4833               adv = (op_code % info.li_line_range) + info.li_line_base;
4834               state_machine_regs.line += adv;
4835               printf (_(" and Line by %d to %d\n"),
4836                       adv, state_machine_regs.line);
4837               break;
4838             }
4839         }
4840       printf ("\n");
4841     }
4842
4843   return 1;
4844 }
4845
4846 static int
4847 display_debug_pubnames (section, start, file)
4848      Elf32_Internal_Shdr * section;
4849      unsigned char *       start;
4850      FILE *                file ATTRIBUTE_UNUSED;
4851 {
4852   DWARF2_External_PubNames * external;
4853   DWARF2_Internal_PubNames   pubnames;
4854   unsigned char *            end;
4855
4856   end = start + section->sh_size;
4857
4858   printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
4859
4860   while (start < end)
4861     {
4862       unsigned char * data;
4863       unsigned long   offset;
4864
4865       external = (DWARF2_External_PubNames *) start;
4866
4867       pubnames.pn_length  = BYTE_GET (external->pn_length);
4868       pubnames.pn_version = BYTE_GET (external->pn_version);
4869       pubnames.pn_offset  = BYTE_GET (external->pn_offset);
4870       pubnames.pn_size    = BYTE_GET (external->pn_size);
4871
4872       data   = start + sizeof (* external);
4873       start += pubnames.pn_length + sizeof (external->pn_length);
4874
4875       if (pubnames.pn_version != 2)
4876         {
4877           warn (_("Only DWARF 2 pubnames are currently supported"));
4878           continue;
4879         }
4880
4881       printf (_("  Length:                              %ld\n"),
4882               pubnames.pn_length);
4883       printf (_("  Version:                             %d\n"),
4884               pubnames.pn_version);
4885       printf (_("  Offset into .debug_info section:     %ld\n"),
4886               pubnames.pn_offset);
4887       printf (_("  Size of area in .debug_info section: %ld\n"),
4888               pubnames.pn_size);
4889
4890       printf (_("\n    Offset\tName\n"));
4891
4892       do
4893         {
4894           offset = byte_get (data, 4);
4895
4896           if (offset != 0)
4897             {
4898               data += 4;
4899               printf ("    %ld\t\t%s\n", offset, data);
4900               data += strlen (data) + 1;
4901             }
4902         }
4903       while (offset != 0);
4904     }
4905
4906   printf ("\n");
4907   return 1;
4908 }
4909
4910 static char *
4911 get_TAG_name (tag)
4912      unsigned long tag;
4913 {
4914   switch (tag)
4915     {
4916     case DW_TAG_padding: return "DW_TAG_padding";
4917     case DW_TAG_array_type: return "DW_TAG_array_type";
4918     case DW_TAG_class_type: return "DW_TAG_class_type";
4919     case DW_TAG_entry_point: return "DW_TAG_entry_point";
4920     case DW_TAG_enumeration_type: return "DW_TAG_enumeration_type";
4921     case DW_TAG_formal_parameter: return "DW_TAG_formal_parameter";
4922     case DW_TAG_imported_declaration: return "DW_TAG_imported_declaration";
4923     case DW_TAG_label: return "DW_TAG_label";
4924     case DW_TAG_lexical_block: return "DW_TAG_lexical_block";
4925     case DW_TAG_member: return "DW_TAG_member";
4926     case DW_TAG_pointer_type: return "DW_TAG_pointer_type";
4927     case DW_TAG_reference_type: return "DW_TAG_reference_type";
4928     case DW_TAG_compile_unit: return "DW_TAG_compile_unit";
4929     case DW_TAG_string_type: return "DW_TAG_string_type";
4930     case DW_TAG_structure_type: return "DW_TAG_structure_type";
4931     case DW_TAG_subroutine_type: return "DW_TAG_subroutine_type";
4932     case DW_TAG_typedef: return "DW_TAG_typedef";
4933     case DW_TAG_union_type: return "DW_TAG_union_type";
4934     case DW_TAG_unspecified_parameters: return "DW_TAG_unspecified_parameters";
4935     case DW_TAG_variant: return "DW_TAG_variant";
4936     case DW_TAG_common_block: return "DW_TAG_common_block";
4937     case DW_TAG_common_inclusion: return "DW_TAG_common_inclusion";
4938     case DW_TAG_inheritance: return "DW_TAG_inheritance";
4939     case DW_TAG_inlined_subroutine: return "DW_TAG_inlined_subroutine";
4940     case DW_TAG_module: return "DW_TAG_module";
4941     case DW_TAG_ptr_to_member_type: return "DW_TAG_ptr_to_member_type";
4942     case DW_TAG_set_type: return "DW_TAG_set_type";
4943     case DW_TAG_subrange_type: return "DW_TAG_subrange_type";
4944     case DW_TAG_with_stmt: return "DW_TAG_with_stmt";
4945     case DW_TAG_access_declaration: return "DW_TAG_access_declaration";
4946     case DW_TAG_base_type: return "DW_TAG_base_type";
4947     case DW_TAG_catch_block: return "DW_TAG_catch_block";
4948     case DW_TAG_const_type: return "DW_TAG_const_type";
4949     case DW_TAG_constant: return "DW_TAG_constant";
4950     case DW_TAG_enumerator: return "DW_TAG_enumerator";
4951     case DW_TAG_file_type: return "DW_TAG_file_type";
4952     case DW_TAG_friend: return "DW_TAG_friend";
4953     case DW_TAG_namelist: return "DW_TAG_namelist";
4954     case DW_TAG_namelist_item: return "DW_TAG_namelist_item";
4955     case DW_TAG_packed_type: return "DW_TAG_packed_type";
4956     case DW_TAG_subprogram: return "DW_TAG_subprogram";
4957     case DW_TAG_template_type_param: return "DW_TAG_template_type_param";
4958     case DW_TAG_template_value_param: return "DW_TAG_template_value_param";
4959     case DW_TAG_thrown_type: return "DW_TAG_thrown_type";
4960     case DW_TAG_try_block: return "DW_TAG_try_block";
4961     case DW_TAG_variant_part: return "DW_TAG_variant_part";
4962     case DW_TAG_variable: return "DW_TAG_variable";
4963     case DW_TAG_volatile_type: return "DW_TAG_volatile_type";
4964     case DW_TAG_MIPS_loop: return "DW_TAG_MIPS_loop";
4965     case DW_TAG_format_label: return "DW_TAG_format_label";
4966     case DW_TAG_function_template: return "DW_TAG_function_template";
4967     case DW_TAG_class_template: return "DW_TAG_class_template";
4968     default:
4969       {
4970         static char buffer [100];
4971
4972         sprintf (buffer, _("Unknown TAG value: %lx"), tag);
4973         return buffer;
4974       }
4975     }
4976 }
4977
4978 static char *
4979 get_AT_name (attribute)
4980      unsigned long attribute;
4981 {
4982   switch (attribute)
4983     {
4984     case DW_AT_sibling: return "DW_AT_sibling";
4985     case DW_AT_location: return "DW_AT_location";
4986     case DW_AT_name: return "DW_AT_name";
4987     case DW_AT_ordering: return "DW_AT_ordering";
4988     case DW_AT_subscr_data: return "DW_AT_subscr_data";
4989     case DW_AT_byte_size: return "DW_AT_byte_size";
4990     case DW_AT_bit_offset: return "DW_AT_bit_offset";
4991     case DW_AT_bit_size: return "DW_AT_bit_size";
4992     case DW_AT_element_list: return "DW_AT_element_list";
4993     case DW_AT_stmt_list: return "DW_AT_stmt_list";
4994     case DW_AT_low_pc: return "DW_AT_low_pc";
4995     case DW_AT_high_pc: return "DW_AT_high_pc";
4996     case DW_AT_language: return "DW_AT_language";
4997     case DW_AT_member: return "DW_AT_member";
4998     case DW_AT_discr: return "DW_AT_discr";
4999     case DW_AT_discr_value: return "DW_AT_discr_value";
5000     case DW_AT_visibility: return "DW_AT_visibility";
5001     case DW_AT_import: return "DW_AT_import";
5002     case DW_AT_string_length: return "DW_AT_string_length";
5003     case DW_AT_common_reference: return "DW_AT_common_reference";
5004     case DW_AT_comp_dir: return "DW_AT_comp_dir";
5005     case DW_AT_const_value: return "DW_AT_const_value";
5006     case DW_AT_containing_type: return "DW_AT_containing_type";
5007     case DW_AT_default_value: return "DW_AT_default_value";
5008     case DW_AT_inline: return "DW_AT_inline";
5009     case DW_AT_is_optional: return "DW_AT_is_optional";
5010     case DW_AT_lower_bound: return "DW_AT_lower_bound";
5011     case DW_AT_producer: return "DW_AT_producer";
5012     case DW_AT_prototyped: return "DW_AT_prototyped";
5013     case DW_AT_return_addr: return "DW_AT_return_addr";
5014     case DW_AT_start_scope: return "DW_AT_start_scope";
5015     case DW_AT_stride_size: return "DW_AT_stride_size";
5016     case DW_AT_upper_bound: return "DW_AT_upper_bound";
5017     case DW_AT_abstract_origin: return "DW_AT_abstract_origin";
5018     case DW_AT_accessibility: return "DW_AT_accessibility";
5019     case DW_AT_address_class: return "DW_AT_address_class";
5020     case DW_AT_artificial: return "DW_AT_artificial";
5021     case DW_AT_base_types: return "DW_AT_base_types";
5022     case DW_AT_calling_convention: return "DW_AT_calling_convention";
5023     case DW_AT_count: return "DW_AT_count";
5024     case DW_AT_data_member_location: return "DW_AT_data_member_location";
5025     case DW_AT_decl_column: return "DW_AT_decl_column";
5026     case DW_AT_decl_file: return "DW_AT_decl_file";
5027     case DW_AT_decl_line: return "DW_AT_decl_line";
5028     case DW_AT_declaration: return "DW_AT_declaration";
5029     case DW_AT_discr_list: return "DW_AT_discr_list";
5030     case DW_AT_encoding: return "DW_AT_encoding";
5031     case DW_AT_external: return "DW_AT_external";
5032     case DW_AT_frame_base: return "DW_AT_frame_base";
5033     case DW_AT_friend: return "DW_AT_friend";
5034     case DW_AT_identifier_case: return "DW_AT_identifier_case";
5035     case DW_AT_macro_info: return "DW_AT_macro_info";
5036     case DW_AT_namelist_items: return "DW_AT_namelist_items";
5037     case DW_AT_priority: return "DW_AT_priority";
5038     case DW_AT_segment: return "DW_AT_segment";
5039     case DW_AT_specification: return "DW_AT_specification";
5040     case DW_AT_static_link: return "DW_AT_static_link";
5041     case DW_AT_type: return "DW_AT_type";
5042     case DW_AT_use_location: return "DW_AT_use_location";
5043     case DW_AT_variable_parameter: return "DW_AT_variable_parameter";
5044     case DW_AT_virtuality: return "DW_AT_virtuality";
5045     case DW_AT_vtable_elem_location: return "DW_AT_vtable_elem_location";
5046     case DW_AT_MIPS_fde: return "DW_AT_MIPS_fde";
5047     case DW_AT_MIPS_loop_begin: return "DW_AT_MIPS_loop_begin";
5048     case DW_AT_MIPS_tail_loop_begin: return "DW_AT_MIPS_tail_loop_begin";
5049     case DW_AT_MIPS_epilog_begin: return "DW_AT_MIPS_epilog_begin";
5050     case DW_AT_MIPS_loop_unroll_factor: return "DW_AT_MIPS_loop_unroll_factor";
5051     case DW_AT_MIPS_software_pipeline_depth: return "DW_AT_MIPS_software_pipeline_depth";
5052     case DW_AT_MIPS_linkage_name: return "DW_AT_MIPS_linkage_name";
5053     case DW_AT_MIPS_stride: return "DW_AT_MIPS_stride";
5054     case DW_AT_MIPS_abstract_name: return "DW_AT_MIPS_abstract_name";
5055     case DW_AT_MIPS_clone_origin: return "DW_AT_MIPS_clone_origin";
5056     case DW_AT_MIPS_has_inlines: return "DW_AT_MIPS_has_inlines";
5057     case DW_AT_sf_names: return "DW_AT_sf_names";
5058     case DW_AT_src_info: return "DW_AT_src_info";
5059     case DW_AT_mac_info: return "DW_AT_mac_info";
5060     case DW_AT_src_coords: return "DW_AT_src_coords";
5061     case DW_AT_body_begin: return "DW_AT_body_begin";
5062     case DW_AT_body_end: return "DW_AT_body_end";
5063     default:
5064       {
5065         static char buffer [100];
5066
5067         sprintf (buffer, _("Unknown AT value: %lx"), attribute);
5068         return buffer;
5069       }
5070     }
5071 }
5072
5073 static char *
5074 get_FORM_name (form)
5075      unsigned long form;
5076 {
5077   switch (form)
5078     {
5079     case DW_FORM_addr: return "DW_FORM_addr";
5080     case DW_FORM_block2: return "DW_FORM_block2";
5081     case DW_FORM_block4: return "DW_FORM_block4";
5082     case DW_FORM_data2: return "DW_FORM_data2";
5083     case DW_FORM_data4: return "DW_FORM_data4";
5084     case DW_FORM_data8: return "DW_FORM_data8";
5085     case DW_FORM_string: return "DW_FORM_string";
5086     case DW_FORM_block: return "DW_FORM_block";
5087     case DW_FORM_block1: return "DW_FORM_block1";
5088     case DW_FORM_data1: return "DW_FORM_data1";
5089     case DW_FORM_flag: return "DW_FORM_flag";
5090     case DW_FORM_sdata: return "DW_FORM_sdata";
5091     case DW_FORM_strp: return "DW_FORM_strp";
5092     case DW_FORM_udata: return "DW_FORM_udata";
5093     case DW_FORM_ref_addr: return "DW_FORM_ref_addr";
5094     case DW_FORM_ref1: return "DW_FORM_ref1";
5095     case DW_FORM_ref2: return "DW_FORM_ref2";
5096     case DW_FORM_ref4: return "DW_FORM_ref4";
5097     case DW_FORM_ref8: return "DW_FORM_ref8";
5098     case DW_FORM_ref_udata: return "DW_FORM_ref_udata";
5099     case DW_FORM_indirect: return "DW_FORM_indirect";
5100     default:
5101       {
5102         static char buffer [100];
5103
5104         sprintf (buffer, _("Unknown FORM value: %lx"), form);
5105         return buffer;
5106       }
5107     }
5108 }
5109
5110 /* FIXME:  There are better and more effiecint ways to handle
5111    these structures.  For now though, I just want something that
5112    is simple to implement.  */
5113 typedef struct abbrev_attr
5114 {
5115   unsigned long        attribute;
5116   unsigned long        form;
5117   struct abbrev_attr * next;
5118 }
5119 abbrev_attr;
5120
5121 typedef struct abbrev_entry
5122 {
5123   unsigned long          entry;
5124   unsigned long          tag;
5125   int                    children;
5126   struct abbrev_attr *   first_attr;
5127   struct abbrev_attr *   last_attr;
5128   struct abbrev_entry *  next;
5129 }
5130 abbrev_entry;
5131
5132 static abbrev_entry * first_abbrev = NULL;
5133 static abbrev_entry * last_abbrev = NULL;
5134
5135 static void
5136 free_abbrevs PARAMS ((void))
5137 {
5138   abbrev_entry * abbrev;
5139
5140   for (abbrev = first_abbrev; abbrev;)
5141     {
5142       abbrev_entry * next = abbrev->next;
5143       abbrev_attr  * attr;
5144
5145       for (attr = abbrev->first_attr; attr;)
5146         {
5147           abbrev_attr * next = attr->next;
5148
5149           free (attr);
5150           attr = next;
5151         }
5152
5153       free (abbrev);
5154       abbrev = next;
5155     }
5156
5157   last_abbrev = first_abbrev = NULL;
5158 }
5159
5160 static void
5161 add_abbrev (number, tag, children)
5162      unsigned long number;
5163      unsigned long tag;
5164      int           children;
5165 {
5166   abbrev_entry * entry;
5167
5168   entry = (abbrev_entry *) malloc (sizeof (* entry));
5169
5170   if (entry == NULL)
5171     /* ugg */
5172     return;
5173
5174   entry->entry      = number;
5175   entry->tag        = tag;
5176   entry->children   = children;
5177   entry->first_attr = NULL;
5178   entry->last_attr  = NULL;
5179   entry->next       = NULL;
5180
5181   if (first_abbrev == NULL)
5182     first_abbrev = entry;
5183   else
5184     last_abbrev->next = entry;
5185
5186   last_abbrev = entry;
5187 }
5188
5189 static void
5190 add_abbrev_attr (attribute, form)
5191      unsigned long attribute;
5192      unsigned long form;
5193 {
5194   abbrev_attr * attr;
5195
5196   attr = (abbrev_attr *) malloc (sizeof (* attr));
5197
5198   if (attr == NULL)
5199     /* ugg */
5200     return;
5201
5202   attr->attribute = attribute;
5203   attr->form      = form;
5204   attr->next      = NULL;
5205
5206   if (last_abbrev->first_attr == NULL)
5207     last_abbrev->first_attr = attr;
5208   else
5209     last_abbrev->last_attr->next = attr;
5210
5211   last_abbrev->last_attr = attr;
5212 }
5213
5214 /* Processes the (partial) contents of a .debug_abbrev section.
5215    Returns NULL if the end of the section was encountered.
5216    Returns the address after the last byte read if the end of
5217    an abbreviation set was found.  */
5218
5219 static unsigned char *
5220 process_abbrev_section (start, end)
5221      unsigned char * start;
5222      unsigned char * end;
5223 {
5224   if (first_abbrev != NULL)
5225     return NULL;
5226
5227   while (start < end)
5228     {
5229       int           bytes_read;
5230       unsigned long entry;
5231       unsigned long tag;
5232       unsigned long attribute;
5233       int           children;
5234
5235       entry = read_leb128 (start, & bytes_read, 0);
5236       start += bytes_read;
5237
5238       /* A single zero is supposed to end the section according
5239          to the standard.  If there's more, then signal that to
5240          the caller.  */
5241       if (entry == 0)
5242         return start == end ? NULL : start;
5243
5244       tag = read_leb128 (start, & bytes_read, 0);
5245       start += bytes_read;
5246
5247       children = * start ++;
5248
5249       add_abbrev (entry, tag, children);
5250
5251       do
5252         {
5253           unsigned long form;
5254
5255           attribute = read_leb128 (start, & bytes_read, 0);
5256           start += bytes_read;
5257
5258           form = read_leb128 (start, & bytes_read, 0);
5259           start += bytes_read;
5260
5261           if (attribute != 0)
5262             add_abbrev_attr (attribute, form);
5263         }
5264       while (attribute != 0);
5265     }
5266
5267   return NULL;
5268 }
5269
5270
5271 static int
5272 display_debug_abbrev (section, start, file)
5273      Elf32_Internal_Shdr * section;
5274      unsigned char *       start;
5275      FILE *                file ATTRIBUTE_UNUSED;
5276 {
5277   abbrev_entry * entry;
5278   unsigned char * end = start + section->sh_size;
5279
5280   printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
5281
5282   do
5283     {
5284       start = process_abbrev_section (start, end);
5285
5286       printf (_("  Number TAG\n"));
5287
5288       for (entry = first_abbrev; entry; entry = entry->next)
5289         {
5290           abbrev_attr * attr;
5291
5292           printf (_("   %ld      %s    [%s]\n"),
5293                   entry->entry,
5294                   get_TAG_name (entry->tag),
5295                   entry->children ? _("has children") : _("no children"));
5296
5297           for (attr = entry->first_attr; attr; attr = attr->next)
5298             {
5299               printf (_("    %-18s %s\n"),
5300                       get_AT_name (attr->attribute),
5301                       get_FORM_name (attr->form));
5302             }
5303         }
5304     }
5305   while (start);
5306
5307   printf ("\n");
5308
5309   return 1;
5310 }
5311
5312
5313 static unsigned char *
5314 display_block (data, length)
5315      unsigned char * data;
5316      unsigned long   length;
5317 {
5318   printf (_(" %lu byte block: "), length);
5319
5320   while (length --)
5321     printf ("%lx ", (unsigned long) byte_get (data ++, 1));
5322
5323   return data;
5324 }
5325
5326 static void
5327 decode_location_expression (data, pointer_size)
5328      unsigned char * data;
5329      unsigned int    pointer_size;
5330 {
5331   unsigned char op;
5332   int           bytes_read;
5333   unsigned long uvalue;
5334
5335   op = * data ++;
5336
5337   switch (op)
5338     {
5339     case DW_OP_addr:
5340       printf ("DW_OP_addr: %lx", (unsigned long) byte_get (data, pointer_size));
5341       break;
5342     case DW_OP_deref:
5343       printf ("DW_OP_deref");
5344       break;
5345     case DW_OP_const1u:
5346       printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data, 1));
5347       break;
5348     case DW_OP_const1s:
5349       printf ("DW_OP_const1s: %ld", (long) byte_get (data, 1));
5350       break;
5351     case DW_OP_const2u:
5352       printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data, 2));
5353       break;
5354     case DW_OP_const2s:
5355       printf ("DW_OP_const2s: %ld", (long) byte_get (data, 2));
5356       break;
5357     case DW_OP_const4u:
5358       printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data, 4));
5359       break;
5360     case DW_OP_const4s:
5361       printf ("DW_OP_const4s: %ld", (long) byte_get (data, 4));
5362       break;
5363     case DW_OP_const8u:
5364       printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data, 4),
5365               (unsigned long) byte_get (data + 4, 4));
5366       break;
5367     case DW_OP_const8s:
5368       printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data, 4),
5369               (long) byte_get (data + 4, 4));
5370       break;
5371     case DW_OP_constu:
5372       printf ("DW_OP_constu: %lu", read_leb128 (data, NULL, 0));
5373       break;
5374     case DW_OP_consts:
5375       printf ("DW_OP_consts: %ld", read_leb128 (data, NULL, 1));
5376       break;
5377     case DW_OP_dup:
5378       printf ("DW_OP_dup");
5379       break;
5380     case DW_OP_drop:
5381       printf ("DW_OP_drop");
5382       break;
5383     case DW_OP_over:
5384       printf ("DW_OP_over");
5385       break;
5386     case DW_OP_pick:
5387       printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data, 1));
5388       break;
5389     case DW_OP_swap:
5390       printf ("DW_OP_swap");
5391       break;
5392     case DW_OP_rot:
5393       printf ("DW_OP_rot");
5394       break;
5395     case DW_OP_xderef:
5396       printf ("DW_OP_xderef");
5397       break;
5398     case DW_OP_abs:
5399       printf ("DW_OP_abs");
5400       break;
5401     case DW_OP_and:
5402       printf ("DW_OP_and");
5403       break;
5404     case DW_OP_div:
5405       printf ("DW_OP_div");
5406       break;
5407     case DW_OP_minus:
5408       printf ("DW_OP_minus");
5409       break;
5410     case DW_OP_mod:
5411       printf ("DW_OP_mod");
5412       break;
5413     case DW_OP_mul:
5414       printf ("DW_OP_mul");
5415       break;
5416     case DW_OP_neg:
5417       printf ("DW_OP_neg");
5418       break;
5419     case DW_OP_not:
5420       printf ("DW_OP_not");
5421       break;
5422     case DW_OP_or:
5423       printf ("DW_OP_or");
5424       break;
5425     case DW_OP_plus:
5426       printf ("DW_OP_plus");
5427       break;
5428     case DW_OP_plus_uconst:
5429       printf ("DW_OP_plus_uconst: %lu", read_leb128 (data, NULL, 0));
5430       break;
5431     case DW_OP_shl:
5432       printf ("DW_OP_shl");
5433       break;
5434     case DW_OP_shr:
5435       printf ("DW_OP_shr");
5436       break;
5437     case DW_OP_shra:
5438       printf ("DW_OP_shra");
5439       break;
5440     case DW_OP_xor:
5441       printf ("DW_OP_xor");
5442       break;
5443     case DW_OP_bra:
5444       printf ("DW_OP_bra: %ld", (long) byte_get (data, 2));
5445       break;
5446     case DW_OP_eq:
5447       printf ("DW_OP_eq");
5448       break;
5449     case DW_OP_ge:
5450       printf ("DW_OP_ge");
5451       break;
5452     case DW_OP_gt:
5453       printf ("DW_OP_gt");
5454       break;
5455     case DW_OP_le:
5456       printf ("DW_OP_le");
5457       break;
5458     case DW_OP_lt:
5459       printf ("DW_OP_lt");
5460       break;
5461     case DW_OP_ne:
5462       printf ("DW_OP_ne");
5463       break;
5464     case DW_OP_skip:
5465       printf ("DW_OP_skip: %ld", (long) byte_get (data, 2));
5466       break;
5467     case DW_OP_lit0:
5468       printf ("DW_OP_lit0");
5469       break;
5470     case DW_OP_lit1:
5471       printf ("DW_OP_lit1");
5472       break;
5473     case DW_OP_lit2:
5474       printf ("DW_OP_lit2");
5475       break;
5476     case DW_OP_lit3:
5477       printf ("DW_OP_lit3");
5478       break;
5479     case DW_OP_lit4:
5480       printf ("DW_OP_lit4");
5481       break;
5482     case DW_OP_lit5:
5483       printf ("DW_OP_lit5");
5484       break;
5485     case DW_OP_lit6:
5486       printf ("DW_OP_lit6");
5487       break;
5488     case DW_OP_lit7:
5489       printf ("DW_OP_lit7");
5490       break;
5491     case DW_OP_lit8:
5492       printf ("DW_OP_lit8");
5493       break;
5494     case DW_OP_lit9:
5495       printf ("DW_OP_lit9");
5496       break;
5497     case DW_OP_lit10:
5498       printf ("DW_OP_lit10");
5499       break;
5500     case DW_OP_lit11:
5501       printf ("DW_OP_lit11");
5502       break;
5503     case DW_OP_lit12:
5504       printf ("DW_OP_lit12");
5505       break;
5506     case DW_OP_lit13:
5507       printf ("DW_OP_lit13");
5508       break;
5509     case DW_OP_lit14:
5510       printf ("DW_OP_lit14");
5511       break;
5512     case DW_OP_lit15:
5513       printf ("DW_OP_lit15");
5514       break;
5515     case DW_OP_lit16:
5516       printf ("DW_OP_lit16");
5517       break;
5518     case DW_OP_lit17:
5519       printf ("DW_OP_lit17");
5520       break;
5521     case DW_OP_lit18:
5522       printf ("DW_OP_lit18");
5523       break;
5524     case DW_OP_lit19:
5525       printf ("DW_OP_lit19");
5526       break;
5527     case DW_OP_lit20:
5528       printf ("DW_OP_lit20");
5529       break;
5530     case DW_OP_lit21:
5531       printf ("DW_OP_lit21");
5532       break;
5533     case DW_OP_lit22:
5534       printf ("DW_OP_lit22");
5535       break;
5536     case DW_OP_lit23:
5537       printf ("DW_OP_lit23");
5538       break;
5539     case DW_OP_lit24:
5540       printf ("DW_OP_lit24");
5541       break;
5542     case DW_OP_lit25:
5543       printf ("DW_OP_lit25");
5544       break;
5545     case DW_OP_lit26:
5546       printf ("DW_OP_lit26");
5547       break;
5548     case DW_OP_lit27:
5549       printf ("DW_OP_lit27");
5550       break;
5551     case DW_OP_lit28:
5552       printf ("DW_OP_lit28");
5553       break;
5554     case DW_OP_lit29:
5555       printf ("DW_OP_lit29");
5556       break;
5557     case DW_OP_lit30:
5558       printf ("DW_OP_lit30");
5559       break;
5560     case DW_OP_lit31:
5561       printf ("DW_OP_lit31");
5562       break;
5563     case DW_OP_reg0:
5564       printf ("DW_OP_reg0");
5565       break;
5566     case DW_OP_reg1:
5567       printf ("DW_OP_reg1");
5568       break;
5569     case DW_OP_reg2:
5570       printf ("DW_OP_reg2");
5571       break;
5572     case DW_OP_reg3:
5573       printf ("DW_OP_reg3");
5574       break;
5575     case DW_OP_reg4:
5576       printf ("DW_OP_reg4");
5577       break;
5578     case DW_OP_reg5:
5579       printf ("DW_OP_reg5");
5580       break;
5581     case DW_OP_reg6:
5582       printf ("DW_OP_reg6");
5583       break;
5584     case DW_OP_reg7:
5585       printf ("DW_OP_reg7");
5586       break;
5587     case DW_OP_reg8:
5588       printf ("DW_OP_reg8");
5589       break;
5590     case DW_OP_reg9:
5591       printf ("DW_OP_reg9");
5592       break;
5593     case DW_OP_reg10:
5594       printf ("DW_OP_reg10");
5595       break;
5596     case DW_OP_reg11:
5597       printf ("DW_OP_reg11");
5598       break;
5599     case DW_OP_reg12:
5600       printf ("DW_OP_reg12");
5601       break;
5602     case DW_OP_reg13:
5603       printf ("DW_OP_reg13");
5604       break;
5605     case DW_OP_reg14:
5606       printf ("DW_OP_reg14");
5607       break;
5608     case DW_OP_reg15:
5609       printf ("DW_OP_reg15");
5610       break;
5611     case DW_OP_reg16:
5612       printf ("DW_OP_reg16");
5613       break;
5614     case DW_OP_reg17:
5615       printf ("DW_OP_reg17");
5616       break;
5617     case DW_OP_reg18:
5618       printf ("DW_OP_reg18");
5619       break;
5620     case DW_OP_reg19:
5621       printf ("DW_OP_reg19");
5622       break;
5623     case DW_OP_reg20:
5624       printf ("DW_OP_reg20");
5625       break;
5626     case DW_OP_reg21:
5627       printf ("DW_OP_reg21");
5628       break;
5629     case DW_OP_reg22:
5630       printf ("DW_OP_reg22");
5631       break;
5632     case DW_OP_reg23:
5633       printf ("DW_OP_reg23");
5634       break;
5635     case DW_OP_reg24:
5636       printf ("DW_OP_reg24");
5637       break;
5638     case DW_OP_reg25:
5639       printf ("DW_OP_reg25");
5640       break;
5641     case DW_OP_reg26:
5642       printf ("DW_OP_reg26");
5643       break;
5644     case DW_OP_reg27:
5645       printf ("DW_OP_reg27");
5646       break;
5647     case DW_OP_reg28:
5648       printf ("DW_OP_reg28");
5649       break;
5650     case DW_OP_reg29:
5651       printf ("DW_OP_reg29");
5652       break;
5653     case DW_OP_reg30:
5654       printf ("DW_OP_reg30");
5655       break;
5656     case DW_OP_reg31:
5657       printf ("DW_OP_reg31");
5658       break;
5659     case DW_OP_breg0:
5660       printf ("DW_OP_breg0: %ld", read_leb128 (data, NULL, 1));
5661       break;
5662     case DW_OP_breg1:
5663       printf ("DW_OP_breg1: %ld", read_leb128 (data, NULL, 1));
5664       break;
5665     case DW_OP_breg2:
5666       printf ("DW_OP_breg2: %ld", read_leb128 (data, NULL, 1));
5667       break;
5668     case DW_OP_breg3:
5669       printf ("DW_OP_breg3: %ld", read_leb128 (data, NULL, 1));
5670       break;
5671     case DW_OP_breg4:
5672       printf ("DW_OP_breg4: %ld", read_leb128 (data, NULL, 1));
5673       break;
5674     case DW_OP_breg5:
5675       printf ("DW_OP_breg5: %ld", read_leb128 (data, NULL, 1));
5676       break;
5677     case DW_OP_breg6:
5678       printf ("DW_OP_breg6: %ld", read_leb128 (data, NULL, 1));
5679       break;
5680     case DW_OP_breg7:
5681       printf ("DW_OP_breg7: %ld", read_leb128 (data, NULL, 1));
5682       break;
5683     case DW_OP_breg8:
5684       printf ("DW_OP_breg8: %ld", read_leb128 (data, NULL, 1));
5685       break;
5686     case DW_OP_breg9:
5687       printf ("DW_OP_breg9: %ld", read_leb128 (data, NULL, 1));
5688       break;
5689     case DW_OP_breg10:
5690       printf ("DW_OP_breg10: %ld", read_leb128 (data, NULL, 1));
5691       break;
5692     case DW_OP_breg11:
5693       printf ("DW_OP_breg11: %ld", read_leb128 (data, NULL, 1));
5694       break;
5695     case DW_OP_breg12:
5696       printf ("DW_OP_breg12: %ld", read_leb128 (data, NULL, 1));
5697       break;
5698     case DW_OP_breg13:
5699       printf ("DW_OP_breg13: %ld", read_leb128 (data, NULL, 1));
5700       break;
5701     case DW_OP_breg14:
5702       printf ("DW_OP_breg14: %ld", read_leb128 (data, NULL, 1));
5703       break;
5704     case DW_OP_breg15:
5705       printf ("DW_OP_breg15: %ld", read_leb128 (data, NULL, 1));
5706       break;
5707     case DW_OP_breg16:
5708       printf ("DW_OP_breg16: %ld", read_leb128 (data, NULL, 1));
5709       break;
5710     case DW_OP_breg17:
5711       printf ("DW_OP_breg17: %ld", read_leb128 (data, NULL, 1));
5712       break;
5713     case DW_OP_breg18:
5714       printf ("DW_OP_breg18: %ld", read_leb128 (data, NULL, 1));
5715       break;
5716     case DW_OP_breg19:
5717       printf ("DW_OP_breg19: %ld", read_leb128 (data, NULL, 1));
5718       break;
5719     case DW_OP_breg20:
5720       printf ("DW_OP_breg20: %ld", read_leb128 (data, NULL, 1));
5721       break;
5722     case DW_OP_breg21:
5723       printf ("DW_OP_breg21: %ld", read_leb128 (data, NULL, 1));
5724       break;
5725     case DW_OP_breg22:
5726       printf ("DW_OP_breg22: %ld", read_leb128 (data, NULL, 1));
5727       break;
5728     case DW_OP_breg23:
5729       printf ("DW_OP_breg23: %ld", read_leb128 (data, NULL, 1));
5730       break;
5731     case DW_OP_breg24:
5732       printf ("DW_OP_breg24: %ld", read_leb128 (data, NULL, 1));
5733       break;
5734     case DW_OP_breg25:
5735       printf ("DW_OP_breg25: %ld", read_leb128 (data, NULL, 1));
5736       break;
5737     case DW_OP_breg26:
5738       printf ("DW_OP_breg26: %ld", read_leb128 (data, NULL, 1));
5739       break;
5740     case DW_OP_breg27:
5741       printf ("DW_OP_breg27: %ld", read_leb128 (data, NULL, 1));
5742       break;
5743     case DW_OP_breg28:
5744       printf ("DW_OP_breg28: %ld", read_leb128 (data, NULL, 1));
5745       break;
5746     case DW_OP_breg29:
5747       printf ("DW_OP_breg29: %ld", read_leb128 (data, NULL, 1));
5748       break;
5749     case DW_OP_breg30:
5750       printf ("DW_OP_breg30: %ld", read_leb128 (data, NULL, 1));
5751       break;
5752     case DW_OP_breg31:
5753       printf ("DW_OP_breg31: %ld", read_leb128 (data, NULL, 1));
5754       break;
5755     case DW_OP_regx:
5756       printf ("DW_OP_regx: %lu", read_leb128 (data, NULL, 0));
5757       break;
5758     case DW_OP_fbreg:
5759       printf ("DW_OP_fbreg: %ld", read_leb128 (data, NULL, 1));
5760       break;
5761     case DW_OP_bregx:
5762       uvalue = read_leb128 (data, &bytes_read, 0);
5763       printf ("DW_OP_bregx: %lu %ld", uvalue,
5764               read_leb128 (data + bytes_read, NULL, 1));
5765       break;
5766     case DW_OP_piece:
5767       printf ("DW_OP_piece: %lu", read_leb128 (data, NULL, 0));
5768       break;
5769     case DW_OP_deref_size:
5770       printf ("DW_OP_deref_size: %ld", (long) byte_get (data, 1));
5771       break;
5772     case DW_OP_xderef_size:
5773       printf ("DW_OP_xderef_size: %ld", (long) byte_get (data, 1));
5774       break;
5775     case DW_OP_nop:
5776       printf ("DW_OP_nop");
5777       break;
5778
5779     default:
5780       if (op >= DW_OP_lo_user
5781           && op <= DW_OP_hi_user)
5782         printf (_("(User defined location op)"));
5783       else
5784         printf (_("(Unknown location op)"));
5785       break;
5786     }
5787 }
5788
5789
5790 static unsigned char *
5791 read_and_display_attr (attribute, form, data, pointer_size)
5792      unsigned long   attribute;
5793      unsigned long   form;
5794      unsigned char * data;
5795      unsigned long   pointer_size;
5796 {
5797   unsigned long   uvalue = 0;
5798   unsigned char * block_start = NULL;
5799   int             bytes_read;
5800   int             is_ref = 0;
5801
5802   printf ("     %-18s:", get_AT_name (attribute));
5803
5804   switch (form)
5805     {
5806     case DW_FORM_ref_addr:
5807     case DW_FORM_ref1:
5808     case DW_FORM_ref2:
5809     case DW_FORM_ref4:
5810     case DW_FORM_ref8:
5811     case DW_FORM_ref_udata:
5812       is_ref = 1;
5813     }
5814
5815   switch (form)
5816     {
5817     case DW_FORM_ref_addr:
5818     case DW_FORM_addr:
5819       uvalue = byte_get (data, pointer_size);
5820       printf (is_ref ? " <%x>" : " %#x", uvalue);
5821       data += pointer_size;
5822       break;
5823
5824     case DW_FORM_ref1:
5825     case DW_FORM_flag:
5826     case DW_FORM_data1:
5827       uvalue = byte_get (data ++, 1);
5828       printf (is_ref ? " <%x>" : " %d", uvalue);
5829       break;
5830
5831     case DW_FORM_ref2:
5832     case DW_FORM_data2:
5833       uvalue = byte_get (data, 2);
5834       data += 2;
5835       printf (is_ref ? " <%x>" : " %d", uvalue);
5836       break;
5837
5838     case DW_FORM_ref4:
5839     case DW_FORM_data4:
5840       uvalue = byte_get (data, 4);
5841       data += 4;
5842       printf (is_ref ? " <%x>" : " %d", uvalue);
5843       break;
5844
5845     case DW_FORM_ref8:
5846     case DW_FORM_data8:
5847       uvalue = byte_get (data, 4);
5848       printf (" %lx", uvalue);
5849       printf (" %lx", (unsigned long) byte_get (data + 4, 4));
5850       data += 8;
5851       break;
5852
5853     case DW_FORM_string:
5854       printf (" %s", data);
5855       data += strlen (data) + 1;
5856       break;
5857
5858     case DW_FORM_sdata:
5859       uvalue = read_leb128 (data, & bytes_read, 1);
5860       data += bytes_read;
5861       printf (" %ld", (long) uvalue);
5862       break;
5863
5864     case DW_FORM_ref_udata:
5865     case DW_FORM_udata:
5866       uvalue = read_leb128 (data, & bytes_read, 0);
5867       data += bytes_read;
5868       printf (is_ref ? " <%lx>" : " %ld", uvalue);
5869       break;
5870
5871     case DW_FORM_block:
5872       uvalue = read_leb128 (data, & bytes_read, 0);
5873       block_start = data + bytes_read;
5874       data = display_block (block_start, uvalue);
5875       uvalue = * block_start;
5876       break;
5877
5878     case DW_FORM_block1:
5879       uvalue = byte_get (data, 1);
5880       block_start = data + 1;
5881       data = display_block (block_start, uvalue);
5882       uvalue = * block_start;
5883       break;
5884
5885     case DW_FORM_block2:
5886       uvalue = byte_get (data, 2);
5887       block_start = data + 2;
5888       data = display_block (block_start, uvalue);
5889       uvalue = * block_start;
5890       break;
5891
5892     case DW_FORM_block4:
5893       uvalue = byte_get (data, 4);
5894       block_start = data + 4;
5895       data = display_block (block_start, uvalue);
5896       uvalue = * block_start;
5897       break;
5898
5899     case DW_FORM_strp:
5900     case DW_FORM_indirect:
5901       warn (_("Unable to handle FORM: %d"), form);
5902       break;
5903
5904     default:
5905       warn (_("Unrecognised form: %d"), form);
5906       break;
5907     }
5908
5909   /* For some attributes we can display futher information.  */
5910
5911   printf ("\t");
5912
5913   switch (attribute)
5914     {
5915     case DW_AT_inline:
5916       switch (uvalue)
5917         {
5918         case DW_INL_not_inlined:          printf (_("(not inlined)")); break;
5919         case DW_INL_inlined:              printf (_("(inlined)")); break;
5920         case DW_INL_declared_not_inlined: printf (_("(declared as inline but ignored)")); break;
5921         case DW_INL_declared_inlined:     printf (_("(declared as inline and inlined)")); break;
5922         default: printf (_("  (Unknown inline attribute value: %lx)"), uvalue); break;
5923         }
5924       break;
5925
5926     case DW_AT_frame_base:
5927       if (uvalue >= DW_OP_reg0 && uvalue <= DW_OP_reg31)
5928         printf ("(reg %ld)", uvalue - DW_OP_reg0);
5929       break;
5930
5931     case DW_AT_language:
5932       switch (uvalue)
5933         {
5934         case DW_LANG_C:              printf ("(non-ANSI C)"); break;
5935         case DW_LANG_C89:            printf ("(ANSI C)"); break;
5936         case DW_LANG_C_plus_plus:    printf ("(C++)"); break;
5937         case DW_LANG_Fortran77:      printf ("(FORTRAN 77)"); break;
5938         case DW_LANG_Fortran90:      printf ("(Fortran 90)"); break;
5939         case DW_LANG_Modula2:        printf ("(Modula 2)"); break;
5940         case DW_LANG_Pascal83:       printf ("(ANSI Pascal)"); break;
5941         case DW_LANG_Ada83:          printf ("(Ada)"); break;
5942         case DW_LANG_Cobol74:        printf ("(Cobol 74)"); break;
5943         case DW_LANG_Cobol85:        printf ("(Cobol 85)"); break;
5944         case DW_LANG_Mips_Assembler: printf ("(MIPS assembler)"); break;
5945         default:                     printf ("(Unknown: %lx)", uvalue); break;
5946         }
5947       break;
5948
5949     case DW_AT_encoding:
5950       switch (uvalue)
5951         {
5952         case DW_ATE_void:            printf ("(void)"); break;
5953         case DW_ATE_address:         printf ("(machine address)"); break;
5954         case DW_ATE_boolean:         printf ("(boolean)"); break;
5955         case DW_ATE_complex_float:   printf ("(complex float)"); break;
5956         case DW_ATE_float:           printf ("(float)"); break;
5957         case DW_ATE_signed:          printf ("(signed)"); break;
5958         case DW_ATE_signed_char:     printf ("(signed char)"); break;
5959         case DW_ATE_unsigned:        printf ("(unsigned)"); break;
5960         case DW_ATE_unsigned_char:   printf ("(unsigned char)"); break;
5961         default:
5962           if (uvalue >= DW_ATE_lo_user
5963               && uvalue <= DW_ATE_hi_user)
5964             printf ("(user defined type)");
5965           else
5966             printf ("(unknown type)");
5967           break;
5968         }
5969       break;
5970
5971     case DW_AT_accessibility:
5972       switch (uvalue)
5973         {
5974         case DW_ACCESS_public:          printf ("(public)"); break;
5975         case DW_ACCESS_protected:       printf ("(protected)"); break;
5976         case DW_ACCESS_private:         printf ("(private)"); break;
5977         default:                        printf ("(unknown accessibility)"); break;
5978         }
5979       break;
5980
5981     case DW_AT_visibility:
5982       switch (uvalue)
5983         {
5984         case DW_VIS_local:      printf ("(local)"); break;
5985         case DW_VIS_exported:   printf ("(exported)"); break;
5986         case DW_VIS_qualified:  printf ("(qualified)"); break;
5987         default:                printf ("(unknown visibility)"); break;
5988         }
5989       break;
5990
5991     case DW_AT_virtuality:
5992       switch (uvalue)
5993         {
5994         case DW_VIRTUALITY_none:        printf ("(none)"); break;
5995         case DW_VIRTUALITY_virtual:     printf ("(virtual)"); break;
5996         case DW_VIRTUALITY_pure_virtual:printf ("(pure_virtual)"); break;
5997         default:                        printf ("(unknown virtuality)"); break;
5998         }
5999       break;
6000
6001     case DW_AT_identifier_case:
6002       switch (uvalue)
6003         {
6004         case DW_ID_case_sensitive:      printf ("(case_sensitive)"); break;
6005         case DW_ID_up_case:             printf ("(up_case)"); break;
6006         case DW_ID_down_case:           printf ("(down_case)"); break;
6007         case DW_ID_case_insensitive:    printf ("(case_insensitive)"); break;
6008         default:                        printf ("(unknown case)"); break;
6009         }
6010       break;
6011
6012     case DW_AT_calling_convention:
6013       switch (uvalue)
6014         {
6015         case DW_CC_normal:      printf ("(normal)"); break;
6016         case DW_CC_program:     printf ("(program)"); break;
6017         case DW_CC_nocall:      printf ("(nocall)"); break;
6018         default:
6019           if (uvalue >= DW_CC_lo_user
6020               && uvalue <= DW_CC_hi_user)
6021             printf ("(user defined)");
6022           else
6023             printf ("(unknown convention)");
6024         }
6025       break;
6026
6027     case DW_AT_location:
6028     case DW_AT_data_member_location:
6029     case DW_AT_vtable_elem_location:
6030       printf ("(");
6031       decode_location_expression (block_start, pointer_size);
6032       printf (")");
6033       break;
6034
6035     default:
6036       break;
6037     }
6038
6039   printf ("\n");
6040   return data;
6041 }
6042
6043 static int
6044 display_debug_info (section, start, file)
6045      Elf32_Internal_Shdr * section;
6046      unsigned char *       start;
6047      FILE *                file;
6048 {
6049   unsigned char * end = start + section->sh_size;
6050   unsigned char * section_begin = start;
6051
6052   printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
6053
6054   while (start < end)
6055     {
6056       DWARF2_External_CompUnit * external;
6057       DWARF2_Internal_CompUnit   compunit;
6058       unsigned char *            tags;
6059       int                        i;
6060       int                        level;
6061
6062       external = (DWARF2_External_CompUnit *) start;
6063
6064       compunit.cu_length        = BYTE_GET (external->cu_length);
6065       compunit.cu_version       = BYTE_GET (external->cu_version);
6066       compunit.cu_abbrev_offset = BYTE_GET (external->cu_abbrev_offset);
6067       compunit.cu_pointer_size  = BYTE_GET (external->cu_pointer_size);
6068
6069       tags = start + sizeof (* external);
6070       start += compunit.cu_length + sizeof (external->cu_length);
6071
6072       if (compunit.cu_version != 2)
6073         {
6074           warn (_("Only version 2 DWARF debug information is currently supported.\n"));
6075           continue;
6076         }
6077
6078       printf (_("  Compilation Unit:\n"));
6079       printf (_("   Length:        %ld\n"), compunit.cu_length);
6080       printf (_("   Version:       %d\n"), compunit.cu_version);
6081       printf (_("   Abbrev Offset: %ld\n"), compunit.cu_abbrev_offset);
6082       printf (_("   Pointer Size:  %d\n"), compunit.cu_pointer_size);
6083
6084       if (first_abbrev != NULL)
6085         free_abbrevs ();
6086
6087       /* Read in the abbrevs used by this compilation unit.  */
6088
6089       {
6090         Elf32_Internal_Shdr * sec;
6091         unsigned char *       begin;
6092
6093         /* Locate the .debug_abbrev section and process it.  */
6094         for (i = 0, sec = section_headers;
6095              i < elf_header.e_shnum;
6096              i ++, sec ++)
6097           if (strcmp (SECTION_NAME (sec), ".debug_abbrev") == 0)
6098             break;
6099
6100         if (i == -1 || sec->sh_size == 0)
6101           {
6102             warn (_("Unable to locate .debug_abbrev section!\n"));
6103             return 0;
6104           }
6105
6106         GET_DATA_ALLOC (sec->sh_offset, sec->sh_size, begin, unsigned char *,
6107                         "debug_abbrev section data");
6108
6109         process_abbrev_section (begin + compunit.cu_abbrev_offset,
6110                                 begin + sec->sh_size);
6111
6112         free (begin);
6113       }
6114
6115       level = 0;
6116       while (tags < start)
6117         {
6118           int            bytes_read;
6119           unsigned long  abbrev_number;
6120           abbrev_entry * entry;
6121           abbrev_attr  * attr;
6122
6123           abbrev_number = read_leb128 (tags, & bytes_read, 0);
6124           tags += bytes_read;
6125
6126           /* A null DIE marks the end of a list of children.  */
6127           if (abbrev_number == 0)
6128             {
6129               --level;
6130               continue;
6131             }
6132
6133           /* Scan through the abbreviation list until we reach the
6134              correct entry.  */
6135           for (entry = first_abbrev;
6136                entry && entry->entry != abbrev_number;
6137                entry = entry->next)
6138             continue;
6139
6140           if (entry == NULL)
6141             {
6142               warn (_("Unable to locate entry %lu in the abbreviation table\n"),
6143                     abbrev_number);
6144               return 0;
6145             }
6146
6147           printf (_(" <%d><%x>: Abbrev Number: %lu (%s)\n"),
6148                   level, tags - section_begin - bytes_read,
6149                   abbrev_number,
6150                   get_TAG_name (entry->tag));
6151
6152           for (attr = entry->first_attr; attr; attr = attr->next)
6153             tags = read_and_display_attr (attr->attribute,
6154                                           attr->form,
6155                                           tags,
6156                                           compunit.cu_pointer_size);
6157
6158           if (entry->children)
6159             ++level;
6160         }
6161     }
6162
6163   printf ("\n");
6164
6165   return 1;
6166 }
6167
6168 static int
6169 display_debug_aranges (section, start, file)
6170      Elf32_Internal_Shdr * section;
6171      unsigned char *       start;
6172      FILE *                file ATTRIBUTE_UNUSED;
6173 {
6174   unsigned char * end = start + section->sh_size;
6175
6176   printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
6177
6178   while (start < end)
6179     {
6180       DWARF2_External_ARange * external;
6181       DWARF2_Internal_ARange   arange;
6182       unsigned char *          ranges;
6183       unsigned long            length;
6184       unsigned long            address;
6185       int                      excess;
6186
6187       external = (DWARF2_External_ARange *) start;
6188
6189       arange.ar_length       = BYTE_GET (external->ar_length);
6190       arange.ar_version      = BYTE_GET (external->ar_version);
6191       arange.ar_info_offset  = BYTE_GET (external->ar_info_offset);
6192       arange.ar_pointer_size = BYTE_GET (external->ar_pointer_size);
6193       arange.ar_segment_size = BYTE_GET (external->ar_segment_size);
6194
6195       printf (_("  Length:                   %ld\n"), arange.ar_length);
6196       printf (_("  Version:                  %d\n"), arange.ar_version);
6197       printf (_("  Offset into .debug_info:  %lx\n"), arange.ar_info_offset);
6198       printf (_("  Pointer Size:             %d\n"), arange.ar_pointer_size);
6199       printf (_("  Segment Size:             %d\n"), arange.ar_segment_size);
6200
6201       printf (_("\n    Address  Length\n"));
6202
6203       ranges = start + sizeof (* external);
6204
6205       /* Must pad to an alignment boundary that is twice the pointer size.  */
6206       excess = sizeof (*external) % (2 * arange.ar_pointer_size);
6207       if (excess)
6208         ranges += (2 * arange.ar_pointer_size) - excess;
6209
6210       for (;;)
6211         {
6212           address = byte_get (ranges, arange.ar_pointer_size);
6213
6214           ranges += arange.ar_pointer_size;
6215
6216           length  = byte_get (ranges, arange.ar_pointer_size);
6217
6218           ranges += arange.ar_pointer_size;
6219
6220           /* A pair of zeros marks the end of the list.  */
6221           if (address == 0 && length == 0)
6222             break;
6223
6224           printf ("    %8.8lx %lu\n", address, length);
6225         }
6226
6227       start += arange.ar_length + sizeof (external->ar_length);
6228     }
6229
6230   printf ("\n");
6231
6232   return 1;
6233 }
6234
6235
6236 static int
6237 display_debug_not_supported (section, start, file)
6238      Elf32_Internal_Shdr * section;
6239      unsigned char *       start ATTRIBUTE_UNUSED;
6240      FILE *                file ATTRIBUTE_UNUSED;
6241 {
6242   printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
6243             SECTION_NAME (section));
6244
6245   return 1;
6246 }
6247
6248 /* Pre-scan the .debug_info section to record the size of address.
6249    When dumping the .debug_line, we use that size information, assuming
6250    that all compilation units have the same address size.  */
6251 static int
6252 prescan_debug_info (section, start, file)
6253      Elf32_Internal_Shdr * section ATTRIBUTE_UNUSED;
6254      unsigned char *       start;
6255      FILE *                file ATTRIBUTE_UNUSED;
6256 {
6257   DWARF2_External_CompUnit * external;
6258
6259   external = (DWARF2_External_CompUnit *) start;
6260
6261   debug_line_pointer_size = BYTE_GET (external->cu_pointer_size);
6262   return 0;
6263 }
6264
6265   /* A structure containing the name of a debug section and a pointer
6266      to a function that can decode it.  The third field is a prescan
6267      function to be run over the section before displaying any of the
6268      sections.  */
6269 struct
6270 {
6271   char * name;
6272   int (* display) PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
6273   int (* prescan) PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
6274 }
6275 debug_displays[] =
6276 {
6277   { ".debug_info",        display_debug_info, prescan_debug_info },
6278   { ".debug_abbrev",      display_debug_abbrev, NULL },
6279   { ".debug_line",        display_debug_lines, NULL },
6280   { ".debug_aranges",     display_debug_aranges, NULL },
6281   { ".debug_pubnames",    display_debug_pubnames, NULL },
6282   { ".debug_macinfo",     display_debug_not_supported, NULL },
6283   { ".debug_frame",       display_debug_not_supported, NULL },
6284   { ".debug_str",         display_debug_not_supported, NULL },
6285   { ".debug_static_func", display_debug_not_supported, NULL },
6286   { ".debug_static_vars", display_debug_not_supported, NULL },
6287   { ".debug_types",       display_debug_not_supported, NULL },
6288   { ".debug_weaknames",   display_debug_not_supported, NULL }
6289 };
6290
6291 static int
6292 display_debug_section (section, file)
6293      Elf32_Internal_Shdr * section;
6294      FILE * file;
6295 {
6296   char *          name = SECTION_NAME (section);
6297   bfd_size_type   length;
6298   unsigned char * start;
6299   int             i;
6300
6301   length = section->sh_size;
6302   if (length == 0)
6303     {
6304       printf (_("\nSection '%s' has no debugging data.\n"), name);
6305       return 0;
6306     }
6307
6308   GET_DATA_ALLOC (section->sh_offset, length, start, unsigned char *,
6309                   "debug section data");
6310
6311   /* See if we know how to display the contents of this section.  */
6312   for (i = NUM_ELEM (debug_displays); i--;)
6313     if (strcmp (debug_displays[i].name, name) == 0)
6314       {
6315         debug_displays[i].display (section, start, file);
6316         break;
6317       }
6318
6319   if (i == -1)
6320     printf (_("Unrecognised debug section: %s\n"), name);
6321
6322   free (start);
6323
6324   /* If we loaded in the abbrev section at some point,
6325      we must release it here.  */
6326   if (first_abbrev != NULL)
6327     free_abbrevs ();
6328
6329   return 1;
6330 }
6331
6332 static int
6333 process_section_contents (file)
6334      FILE * file;
6335 {
6336   Elf32_Internal_Shdr * section;
6337   unsigned int          i;
6338
6339   if (! do_dump)
6340     return 1;
6341
6342   /* Pre-scan the debug sections to find some debug information not
6343      present in some of them.  For the .debug_line, we must find out the
6344      size of address (specified in .debug_info and .debug_aranges).  */
6345   for (i = 0, section = section_headers;
6346        i < elf_header.e_shnum && i < num_dump_sects;
6347        i ++, section ++)
6348     {
6349       char *    name = SECTION_NAME (section);
6350       int       j;
6351
6352       if (section->sh_size == 0)
6353         continue;
6354
6355       /* See if there is some pre-scan operation for this section.  */
6356       for (j = NUM_ELEM (debug_displays); j--;)
6357         if (strcmp (debug_displays[j].name, name) == 0)
6358           {
6359             if (debug_displays[j].prescan != NULL)
6360               {
6361                 bfd_size_type   length;
6362                 unsigned char * start;
6363
6364                 length = section->sh_size;
6365                 GET_DATA_ALLOC (section->sh_offset, length, start, unsigned char *,
6366                                 "debug section data");
6367
6368                 debug_displays[j].prescan (section, start, file);
6369                 free (start);
6370               }
6371
6372             break;
6373           }
6374     }
6375
6376   for (i = 0, section = section_headers;
6377        i < elf_header.e_shnum && i < num_dump_sects;
6378        i ++, section ++)
6379     {
6380 #ifdef SUPPORT_DISASSEMBLY
6381       if (dump_sects[i] & DISASS_DUMP)
6382         disassemble_section (section, file);
6383 #endif
6384       if (dump_sects[i] & HEX_DUMP)
6385         dump_section (section, file);
6386
6387       if (dump_sects[i] & DEBUG_DUMP)
6388         display_debug_section (section, file);
6389     }
6390
6391   if (i < num_dump_sects)
6392     warn (_("Some sections were not dumped because they do not exist!\n"));
6393
6394   return 1;
6395 }
6396
6397 static void
6398 process_mips_fpe_exception (mask)
6399      int mask;
6400 {
6401   if (mask)
6402     {
6403       int first = 1;
6404       if (mask & OEX_FPU_INEX)
6405         fputs ("INEX", stdout), first = 0;
6406       if (mask & OEX_FPU_UFLO)
6407         printf ("%sUFLO", first ? "" : "|"), first = 0;
6408       if (mask & OEX_FPU_OFLO)
6409         printf ("%sOFLO", first ? "" : "|"), first = 0;
6410       if (mask & OEX_FPU_DIV0)
6411         printf ("%sDIV0", first ? "" : "|"), first = 0;
6412       if (mask & OEX_FPU_INVAL)
6413         printf ("%sINVAL", first ? "" : "|");
6414     }
6415   else
6416     fputs ("0", stdout);
6417 }
6418
6419 static int
6420 process_mips_specific (file)
6421      FILE * file;
6422 {
6423   Elf_Internal_Dyn * entry;
6424   size_t liblist_offset = 0;
6425   size_t liblistno = 0;
6426   size_t conflictsno = 0;
6427   size_t options_offset = 0;
6428   size_t conflicts_offset = 0;
6429
6430   /* We have a lot of special sections.  Thanks SGI!  */
6431   if (dynamic_segment == NULL)
6432     /* No information available.  */
6433     return 0;
6434
6435   for (entry = dynamic_segment; entry->d_tag != DT_NULL; ++entry)
6436     switch (entry->d_tag)
6437       {
6438       case DT_MIPS_LIBLIST:
6439         liblist_offset = entry->d_un.d_val - loadaddr;
6440         break;
6441       case DT_MIPS_LIBLISTNO:
6442         liblistno = entry->d_un.d_val;
6443         break;
6444       case DT_MIPS_OPTIONS:
6445         options_offset = entry->d_un.d_val - loadaddr;
6446         break;
6447       case DT_MIPS_CONFLICT:
6448         conflicts_offset = entry->d_un.d_val - loadaddr;
6449         break;
6450       case DT_MIPS_CONFLICTNO:
6451         conflictsno = entry->d_un.d_val;
6452         break;
6453       default:
6454         break;
6455       }
6456
6457   if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
6458     {
6459       Elf32_External_Lib * elib;
6460       size_t cnt;
6461
6462       GET_DATA_ALLOC (liblist_offset, liblistno * sizeof (Elf32_External_Lib),
6463                       elib, Elf32_External_Lib *, "liblist");
6464
6465       printf ("\nSection '.liblist' contains %d entries:\n", liblistno);
6466       fputs ("     Library              Time Stamp          Checksum   Version Flags\n",
6467              stdout);
6468
6469       for (cnt = 0; cnt < liblistno; ++cnt)
6470         {
6471           Elf32_Lib liblist;
6472           time_t time;
6473           char timebuf[20];
6474
6475           liblist.l_name = BYTE_GET (elib[cnt].l_name);
6476           time = BYTE_GET (elib[cnt].l_time_stamp);
6477           liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
6478           liblist.l_version = BYTE_GET (elib[cnt].l_version);
6479           liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
6480
6481           strftime (timebuf, 20, "%Y-%m-%dT%H:%M:%S", gmtime (&time));
6482
6483           printf ("%3d: %-20s %s %#10lx %-7ld", cnt,
6484                   dynamic_strings + liblist.l_name, timebuf,
6485                   liblist.l_checksum, liblist.l_version);
6486
6487           if (liblist.l_flags == 0)
6488             puts (" NONE");
6489           else
6490             {
6491               static const struct
6492               {
6493                 const char *name;
6494                 int bit;
6495               } l_flags_vals[] =
6496                 {
6497                   { " EXACT_MATCH", LL_EXACT_MATCH },
6498                   { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
6499                   { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
6500                   { " EXPORTS", LL_EXPORTS },
6501                   { " DELAY_LOAD", LL_DELAY_LOAD },
6502                   { " DELTA", LL_DELTA }
6503                 };
6504               int flags = liblist.l_flags;
6505               size_t fcnt;
6506
6507               for (fcnt = 0;
6508                    fcnt < sizeof (l_flags_vals) / sizeof (l_flags_vals[0]);
6509                    ++fcnt)
6510                 if ((flags & l_flags_vals[fcnt].bit) != 0)
6511                   {
6512                     fputs (l_flags_vals[fcnt].name, stdout);
6513                     flags ^= l_flags_vals[fcnt].bit;
6514                   }
6515               if (flags != 0)
6516                 printf (" %#x", (unsigned int) flags);
6517
6518               puts ("");
6519             }
6520         }
6521
6522       free (elib);
6523     }
6524
6525   if (options_offset != 0)
6526     {
6527       Elf_External_Options * eopt;
6528       Elf_Internal_Shdr * sect = section_headers;
6529       Elf_Internal_Options * iopt;
6530       Elf_Internal_Options * option;
6531       size_t offset;
6532       int cnt;
6533
6534       /* Find the section header so that we get the size.  */
6535       while (sect->sh_type != SHT_MIPS_OPTIONS)
6536         ++sect;
6537
6538       GET_DATA_ALLOC (options_offset, sect->sh_size, eopt,
6539                       Elf_External_Options *, "options");
6540
6541       iopt = (Elf_Internal_Options *) malloc ((sect->sh_size / sizeof (eopt))
6542                                               * sizeof (*iopt));
6543       if (iopt == NULL)
6544         {
6545           error (_("Out of memory"));
6546           return 0;
6547         }
6548
6549       offset = cnt = 0;
6550       option = iopt;
6551       while (offset < sect->sh_size)
6552         {
6553           Elf_External_Options * eoption;
6554
6555           eoption = (Elf_External_Options *) ((char *) eopt + offset);
6556
6557           option->kind = BYTE_GET (eoption->kind);
6558           option->size = BYTE_GET (eoption->size);
6559           option->section = BYTE_GET (eoption->section);
6560           option->info = BYTE_GET (eoption->info);
6561
6562           offset += option->size;
6563           ++option;
6564           ++cnt;
6565         }
6566
6567       printf (_("\nSection '%s' contains %d entries:\n"),
6568               string_table + sect->sh_name, cnt);
6569
6570       option = iopt;
6571       while (cnt-- > 0)
6572         {
6573           size_t len;
6574
6575           switch (option->kind)
6576             {
6577             case ODK_NULL:
6578               /* This shouldn't happen.  */
6579               printf (" NULL       %d %lx", option->section, option->info);
6580               break;
6581             case ODK_REGINFO:
6582               printf (" REGINFO    ");
6583               if (elf_header.e_machine == EM_MIPS)
6584                 {
6585                   /* 32bit form.  */
6586                   Elf32_External_RegInfo *ereg;
6587                   Elf32_RegInfo reginfo;
6588
6589                   ereg = (Elf32_External_RegInfo *) (option + 1);
6590                   reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
6591                   reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
6592                   reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
6593                   reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
6594                   reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
6595                   reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
6596
6597                   printf ("GPR %08lx  GP 0x%lx\n",
6598                           reginfo.ri_gprmask,
6599                           (unsigned long) reginfo.ri_gp_value);
6600                   printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
6601                           reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
6602                           reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
6603                 }
6604               else
6605                 {
6606                   /* 64 bit form.  */
6607                   Elf64_External_RegInfo * ereg;
6608                   Elf64_Internal_RegInfo reginfo;
6609
6610                   ereg = (Elf64_External_RegInfo *) (option + 1);
6611                   reginfo.ri_gprmask    = BYTE_GET (ereg->ri_gprmask);
6612                   reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
6613                   reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
6614                   reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
6615                   reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
6616                   reginfo.ri_gp_value   = BYTE_GET8 (ereg->ri_gp_value);
6617
6618                   printf ("GPR %08lx  GP 0x",
6619                           reginfo.ri_gprmask);
6620                   printf_vma (reginfo.ri_gp_value);
6621                   printf ("\n");
6622
6623                   printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
6624                           reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
6625                           reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
6626                 }
6627               ++option;
6628               continue;
6629             case ODK_EXCEPTIONS:
6630               fputs (" EXCEPTIONS fpe_min(", stdout);
6631               process_mips_fpe_exception (option->info & OEX_FPU_MIN);
6632               fputs (") fpe_max(", stdout);
6633               process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
6634               fputs (")", stdout);
6635
6636               if (option->info & OEX_PAGE0)
6637                 fputs (" PAGE0", stdout);
6638               if (option->info & OEX_SMM)
6639                 fputs (" SMM", stdout);
6640               if (option->info & OEX_FPDBUG)
6641                 fputs (" FPDBUG", stdout);
6642               if (option->info & OEX_DISMISS)
6643                 fputs (" DISMISS", stdout);
6644               break;
6645             case ODK_PAD:
6646               fputs (" PAD       ", stdout);
6647               if (option->info & OPAD_PREFIX)
6648                 fputs (" PREFIX", stdout);
6649               if (option->info & OPAD_POSTFIX)
6650                 fputs (" POSTFIX", stdout);
6651               if (option->info & OPAD_SYMBOL)
6652                 fputs (" SYMBOL", stdout);
6653               break;
6654             case ODK_HWPATCH:
6655               fputs (" HWPATCH   ", stdout);
6656               if (option->info & OHW_R4KEOP)
6657                 fputs (" R4KEOP", stdout);
6658               if (option->info & OHW_R8KPFETCH)
6659                 fputs (" R8KPFETCH", stdout);
6660               if (option->info & OHW_R5KEOP)
6661                 fputs (" R5KEOP", stdout);
6662               if (option->info & OHW_R5KCVTL)
6663                 fputs (" R5KCVTL", stdout);
6664               break;
6665             case ODK_FILL:
6666               fputs (" FILL       ", stdout);
6667               /* XXX Print content of info word?  */
6668               break;
6669             case ODK_TAGS:
6670               fputs (" TAGS       ", stdout);
6671               /* XXX Print content of info word?  */
6672               break;
6673             case ODK_HWAND:
6674               fputs (" HWAND     ", stdout);
6675               if (option->info & OHWA0_R4KEOP_CHECKED)
6676                 fputs (" R4KEOP_CHECKED", stdout);
6677               if (option->info & OHWA0_R4KEOP_CLEAN)
6678                 fputs (" R4KEOP_CLEAN", stdout);
6679               break;
6680             case ODK_HWOR:
6681               fputs (" HWOR      ", stdout);
6682               if (option->info & OHWA0_R4KEOP_CHECKED)
6683                 fputs (" R4KEOP_CHECKED", stdout);
6684               if (option->info & OHWA0_R4KEOP_CLEAN)
6685                 fputs (" R4KEOP_CLEAN", stdout);
6686               break;
6687             case ODK_GP_GROUP:
6688               printf (" GP_GROUP  %#06lx  self-contained %#06lx",
6689                       option->info & OGP_GROUP,
6690                       (option->info & OGP_SELF) >> 16);
6691               break;
6692             case ODK_IDENT:
6693               printf (" IDENT     %#06lx  self-contained %#06lx",
6694                       option->info & OGP_GROUP,
6695                       (option->info & OGP_SELF) >> 16);
6696               break;
6697             default:
6698               /* This shouldn't happen.  */
6699               printf (" %3d ???     %d %lx",
6700                       option->kind, option->section, option->info);
6701               break;
6702             }
6703
6704           len = sizeof (*eopt);
6705           while (len < option->size)
6706             if (((char *) option)[len] >= ' '
6707                 && ((char *) option)[len] < 0x7f)
6708               printf ("%c", ((char *) option)[len++]);
6709             else
6710               printf ("\\%03o", ((char *) option)[len++]);
6711
6712           fputs ("\n", stdout);
6713           ++option;
6714         }
6715
6716       free (eopt);
6717     }
6718
6719   if (conflicts_offset != 0 && conflictsno != 0)
6720     {
6721       Elf32_External_Conflict * econf32;
6722       Elf64_External_Conflict * econf64;
6723       Elf32_Conflict * iconf;
6724       size_t cnt;
6725
6726       if (dynamic_symbols == NULL)
6727         {
6728           error (_("conflict list with without table"));
6729           return 0;
6730         }
6731
6732       iconf = (Elf32_Conflict *) malloc (conflictsno * sizeof (*iconf));
6733       if (iconf == NULL)
6734         {
6735           error (_("Out of memory"));
6736           return 0;
6737         }
6738
6739       if (is_32bit_elf)
6740         {
6741           GET_DATA_ALLOC (conflicts_offset, conflictsno * sizeof (*econf32),
6742                           econf32, Elf32_External_Conflict *, "conflict");
6743
6744           for (cnt = 0; cnt < conflictsno; ++cnt)
6745             iconf[cnt] = BYTE_GET (econf32[cnt]);
6746         }
6747       else
6748         {
6749           GET_DATA_ALLOC (conflicts_offset, conflictsno * sizeof (*econf64),
6750                           econf64, Elf64_External_Conflict *, "conflict");
6751
6752           for (cnt = 0; cnt < conflictsno; ++cnt)
6753             iconf[cnt] = BYTE_GET (econf64[cnt]);
6754         }
6755
6756       printf (_("\nSection '.conflict' contains %d entries:\n"), conflictsno);
6757       puts (_("  Num:    Index       Value  Name"));
6758
6759       for (cnt = 0; cnt < conflictsno; ++cnt)
6760         {
6761           Elf_Internal_Sym * psym = &dynamic_symbols[iconf[cnt]];
6762
6763           printf ("%5u: %8lu  ", cnt, iconf[cnt]);
6764           print_vma (psym->st_value, FULL_HEX);
6765           printf ("  %s\n", dynamic_strings + psym->st_name);
6766         }
6767
6768       free (iconf);
6769     }
6770
6771   return 1;
6772 }
6773
6774 static char *
6775 get_note_type (e_type)
6776      unsigned e_type;
6777 {
6778   static char buff[64];
6779
6780   switch (e_type)
6781     {
6782     case NT_PRSTATUS:   return _("NT_PRSTATUS (prstatus structure)");
6783     case NT_FPREGSET:   return _("NT_FPREGSET (floating point registers)");
6784     case NT_PRPSINFO:   return _("NT_PRPSINFO (prpsinfo structure)");
6785     case NT_TASKSTRUCT: return _("NT_TASKSTRUCT (task structure)");
6786     case NT_PSTATUS:    return _("NT_PSTATUS (pstatus structure)");
6787     case NT_FPREGS:     return _("NT_FPREGS (floating point registers)");
6788     case NT_PSINFO:     return _("NT_PSINFO (psinfo structure)");
6789     case NT_LWPSTATUS:  return _("NT_LWPSTATUS (lwpstatus_t structure)");
6790     case NT_LWPSINFO:   return _("NT_LWPSINFO (lwpsinfo_t structure)");
6791     default:
6792       sprintf (buff, _("Unknown note type: (0x%08x)"), e_type);
6793       return buff;
6794     }
6795 }
6796
6797 /* Note that by the ELF standard, the name field is already null byte
6798    terminated, and namesz includes the terminating null byte.
6799    I.E. the value of namesz for the name "FSF" is 4.
6800
6801    If the value of namesz is zero, there is no name present. */
6802 static int
6803 process_note (pnote)
6804   Elf32_Internal_Note * pnote;
6805 {
6806   printf ("  %s\t\t0x%08lx\t%s\n",
6807           pnote->namesz ? pnote->namedata : "(NONE)",
6808           pnote->descsz, get_note_type (pnote->type));
6809   return 1;
6810 }
6811
6812
6813 static int
6814 process_corefile_note_segment (file, offset, length)
6815      FILE * file;
6816      bfd_vma offset;
6817      bfd_vma length;
6818 {
6819   Elf_External_Note *  pnotes;
6820   Elf_External_Note *  external;
6821   int                  res = 1;
6822
6823   if (length <= 0)
6824     return 0;
6825
6826   GET_DATA_ALLOC (offset, length, pnotes, Elf_External_Note *, "notes");
6827
6828   external = pnotes;
6829
6830   printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"), offset, length);
6831   printf (_("  Owner\t\tData size\tDescription\n"));
6832
6833   while (external < (Elf_External_Note *)((char *) pnotes + length))
6834     {
6835       Elf32_Internal_Note inote;
6836       char * temp = NULL;
6837
6838       inote.type     = BYTE_GET (external->type);
6839       inote.namesz   = BYTE_GET (external->namesz);
6840       inote.namedata = external->name;
6841       inote.descsz   = BYTE_GET (external->descsz);
6842       inote.descdata = inote.namedata + align_power (inote.namesz, 2);
6843       inote.descpos  = offset + (inote.descdata - (char *) pnotes);
6844       
6845       external = (Elf_External_Note *)(inote.descdata + align_power (inote.descsz, 2));
6846
6847       /* Verify that name is null terminated.  It appears that at least
6848          one version of Linux (RedHat 6.0) generates corefiles that don't
6849          comply with the ELF spec by failing to include the null byte in
6850          namesz.  */
6851       if (inote.namedata[inote.namesz] != '\0')
6852         {
6853           temp = malloc (inote.namesz + 1);
6854           
6855           if (temp == NULL)
6856             {
6857               error (_("Out of memory\n"));
6858               res = 0;
6859               break;
6860             }
6861           
6862           strncpy (temp, inote.namedata, inote.namesz);
6863           temp[inote.namesz] = 0;
6864           
6865           /* warn (_("'%s' NOTE name not properly null terminated\n"), temp);  */
6866           inote.namedata = temp;
6867         }
6868
6869       res &= process_note (& inote);
6870
6871       if (temp != NULL)
6872         {
6873           free (temp);
6874           temp = NULL;
6875         }
6876     }
6877
6878   free (pnotes);
6879
6880   return res;
6881 }
6882
6883 static int
6884 process_corefile_note_segments (file)
6885      FILE * file;
6886 {
6887   Elf_Internal_Phdr * program_headers;
6888   Elf_Internal_Phdr * segment;
6889   unsigned int        i;
6890   int                 res = 1;
6891
6892   program_headers = (Elf_Internal_Phdr *) malloc
6893     (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
6894
6895   if (program_headers == NULL)
6896     {
6897       error (_("Out of memory\n"));
6898       return 0;
6899     }
6900
6901   if (is_32bit_elf)
6902     i = get_32bit_program_headers (file, program_headers);
6903   else
6904     i = get_64bit_program_headers (file, program_headers);
6905
6906   if (i == 0)
6907     {
6908       free (program_headers);
6909       return 0;
6910     }
6911
6912   for (i = 0, segment = program_headers;
6913        i < elf_header.e_phnum;
6914        i ++, segment ++)
6915     {
6916       if (segment->p_type == PT_NOTE)
6917         res &= process_corefile_note_segment (file,
6918                                               (bfd_vma)segment->p_offset,
6919                                               (bfd_vma)segment->p_filesz);
6920     }
6921
6922   free (program_headers);
6923
6924   return res;
6925 }
6926
6927 static int
6928 process_corefile_contents (file)
6929      FILE * file;
6930 {
6931   /* If we have not been asked to display the notes then do nothing.  */
6932   if (! do_notes)
6933     return 1;
6934
6935   /* If file is not a core file then exit.  */
6936   if (elf_header.e_type != ET_CORE)
6937     return 1;
6938
6939   /* No program headers means no NOTE segment.  */
6940   if (elf_header.e_phnum == 0)
6941     {
6942       printf (_("No note segments present in the core file.\n"));
6943       return 1;
6944    }
6945
6946   return process_corefile_note_segments (file);
6947 }
6948
6949 static int
6950 process_arch_specific (file)
6951      FILE * file;
6952 {
6953   if (! do_arch)
6954     return 1;
6955
6956   switch (elf_header.e_machine)
6957     {
6958     case EM_MIPS:
6959     case EM_MIPS_RS4_BE:
6960       return process_mips_specific (file);
6961       break;
6962     default:
6963       break;
6964     }
6965   return 1;
6966 }
6967
6968 static int
6969 get_file_header (file)
6970      FILE * file;
6971 {
6972   /* Read in the identity array.  */
6973   if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
6974     return 0;
6975
6976   /* Determine how to read the rest of the header.  */
6977   switch (elf_header.e_ident [EI_DATA])
6978     {
6979     default: /* fall through */
6980     case ELFDATANONE: /* fall through */
6981     case ELFDATA2LSB: byte_get = byte_get_little_endian; break;
6982     case ELFDATA2MSB: byte_get = byte_get_big_endian; break;
6983     }
6984
6985   /* For now we only support 32 bit and 64 bit ELF files.  */
6986   is_32bit_elf = (elf_header.e_ident [EI_CLASS] != ELFCLASS64);
6987
6988   /* Read in the rest of the header.  */
6989   if (is_32bit_elf)
6990     {
6991       Elf32_External_Ehdr ehdr32;
6992
6993       if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
6994         return 0;
6995
6996       elf_header.e_type      = BYTE_GET (ehdr32.e_type);
6997       elf_header.e_machine   = BYTE_GET (ehdr32.e_machine);
6998       elf_header.e_version   = BYTE_GET (ehdr32.e_version);
6999       elf_header.e_entry     = BYTE_GET (ehdr32.e_entry);
7000       elf_header.e_phoff     = BYTE_GET (ehdr32.e_phoff);
7001       elf_header.e_shoff     = BYTE_GET (ehdr32.e_shoff);
7002       elf_header.e_flags     = BYTE_GET (ehdr32.e_flags);
7003       elf_header.e_ehsize    = BYTE_GET (ehdr32.e_ehsize);
7004       elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
7005       elf_header.e_phnum     = BYTE_GET (ehdr32.e_phnum);
7006       elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
7007       elf_header.e_shnum     = BYTE_GET (ehdr32.e_shnum);
7008       elf_header.e_shstrndx  = BYTE_GET (ehdr32.e_shstrndx);
7009     }
7010   else
7011     {
7012       Elf64_External_Ehdr ehdr64;
7013
7014       /* If we have been compiled with sizeof (bfd_vma) == 4, then
7015          we will not be able to cope with the 64bit data found in
7016          64 ELF files.  Detect this now and abort before we start
7017          overwritting things.  */
7018       if (sizeof (bfd_vma) < 8)
7019         {
7020           error (_("This instance of readelf has been built without support for a\n"));
7021           error (_("64 bit data type and so it cannot read 64 bit ELF files.\n"));
7022           return 0;
7023         }
7024
7025       if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
7026         return 0;
7027
7028       elf_header.e_type      = BYTE_GET (ehdr64.e_type);
7029       elf_header.e_machine   = BYTE_GET (ehdr64.e_machine);
7030       elf_header.e_version   = BYTE_GET (ehdr64.e_version);
7031       elf_header.e_entry     = BYTE_GET8 (ehdr64.e_entry);
7032       elf_header.e_phoff     = BYTE_GET8 (ehdr64.e_phoff);
7033       elf_header.e_shoff     = BYTE_GET8 (ehdr64.e_shoff);
7034       elf_header.e_flags     = BYTE_GET (ehdr64.e_flags);
7035       elf_header.e_ehsize    = BYTE_GET (ehdr64.e_ehsize);
7036       elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
7037       elf_header.e_phnum     = BYTE_GET (ehdr64.e_phnum);
7038       elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
7039       elf_header.e_shnum     = BYTE_GET (ehdr64.e_shnum);
7040       elf_header.e_shstrndx  = BYTE_GET (ehdr64.e_shstrndx);
7041     }
7042
7043   return 1;
7044 }
7045
7046 static void
7047 process_file (file_name)
7048      char * file_name;
7049 {
7050   FILE *       file;
7051   struct stat  statbuf;
7052   unsigned int i;
7053
7054   if (stat (file_name, & statbuf) < 0)
7055     {
7056       error (_("Cannot stat input file %s.\n"), file_name);
7057       return;
7058     }
7059
7060   file = fopen (file_name, "rb");
7061   if (file == NULL)
7062     {
7063       error (_("Input file %s not found.\n"), file_name);
7064       return;
7065     }
7066
7067   if (! get_file_header (file))
7068     {
7069       error (_("%s: Failed to read file header\n"), file_name);
7070       fclose (file);
7071       return;
7072     }
7073
7074   /* Initialise per file variables.  */
7075   for (i = NUM_ELEM (version_info); i--;)
7076     version_info[i] = 0;
7077
7078   for (i = NUM_ELEM (dynamic_info); i--;)
7079     dynamic_info[i] = 0;
7080
7081   /* Process the file.  */
7082   if (show_name)
7083     printf (_("\nFile: %s\n"), file_name);
7084
7085   if (! process_file_header ())
7086     {
7087       fclose (file);
7088       return;
7089     }
7090
7091   process_section_headers (file);
7092
7093   process_program_headers (file);
7094
7095   process_dynamic_segment (file);
7096
7097   process_relocs (file);
7098
7099   process_symbol_table (file);
7100
7101   process_syminfo (file);
7102
7103   process_version_sections (file);
7104
7105   process_section_contents (file);
7106
7107   process_corefile_contents (file);
7108
7109   process_arch_specific (file);
7110
7111   fclose (file);
7112
7113   if (section_headers)
7114     {
7115       free (section_headers);
7116       section_headers = NULL;
7117     }
7118
7119   if (string_table)
7120     {
7121       free (string_table);
7122       string_table = NULL;
7123     }
7124
7125   if (dynamic_strings)
7126     {
7127       free (dynamic_strings);
7128       dynamic_strings = NULL;
7129     }
7130
7131   if (dynamic_symbols)
7132     {
7133       free (dynamic_symbols);
7134       dynamic_symbols = NULL;
7135       num_dynamic_syms = 0;
7136     }
7137
7138   if (dynamic_syminfo)
7139     {
7140       free (dynamic_syminfo);
7141       dynamic_syminfo = NULL;
7142     }
7143 }
7144
7145 #ifdef SUPPORT_DISASSEMBLY
7146 /* Needed by the i386 disassembler.  For extra credit, someone could
7147    fix this so that we insert symbolic addresses here, esp for GOT/PLT
7148    symbols */
7149
7150 void
7151 print_address (unsigned int addr, FILE * outfile)
7152 {
7153   fprintf (outfile,"0x%8.8x", addr);
7154 }
7155
7156 /* Needed by the i386 disassembler. */
7157 void
7158 db_task_printsym (unsigned int addr)
7159 {
7160   print_address (addr, stderr);
7161 }
7162 #endif
7163
7164 int
7165 main (argc, argv)
7166      int     argc;
7167      char ** argv;
7168 {
7169 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
7170   setlocale (LC_MESSAGES, "");
7171 #endif
7172   bindtextdomain (PACKAGE, LOCALEDIR);
7173   textdomain (PACKAGE);
7174
7175   parse_args (argc, argv);
7176
7177   if (optind < (argc - 1))
7178     show_name = 1;
7179
7180   while (optind < argc)
7181     process_file (argv [optind ++]);
7182
7183   if (dump_sects != NULL)
7184     free (dump_sects);
7185
7186   return 0;
7187 }