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