]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - binutils/readelf.c
Index: bfd/ChangeLog
[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 *));
201 static int get_64bit_section_headers PARAMS ((FILE *));
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\n"),
2446 (long) elf_header.e_shnum);
2447 printf (_(" Section header string table index: %ld\n"),
2448 (long) elf_header.e_shstrndx);
2449 }
2450
2451 return 1;
2452 }
2453
2454
2455 static int
2456 get_32bit_program_headers (file, program_headers)
2457 FILE * file;
2458 Elf_Internal_Phdr * program_headers;
2459 {
2460 Elf32_External_Phdr * phdrs;
2461 Elf32_External_Phdr * external;
2462 Elf32_Internal_Phdr * internal;
2463 unsigned int i;
2464
2465 phdrs = ((Elf32_External_Phdr *)
2466 get_data (NULL, file, elf_header.e_phoff,
2467 elf_header.e_phentsize * elf_header.e_phnum,
2468 _("program headers")));
2469 if (!phdrs)
2470 return 0;
2471
2472 for (i = 0, internal = program_headers, external = phdrs;
2473 i < elf_header.e_phnum;
2474 i ++, internal ++, external ++)
2475 {
2476 internal->p_type = BYTE_GET (external->p_type);
2477 internal->p_offset = BYTE_GET (external->p_offset);
2478 internal->p_vaddr = BYTE_GET (external->p_vaddr);
2479 internal->p_paddr = BYTE_GET (external->p_paddr);
2480 internal->p_filesz = BYTE_GET (external->p_filesz);
2481 internal->p_memsz = BYTE_GET (external->p_memsz);
2482 internal->p_flags = BYTE_GET (external->p_flags);
2483 internal->p_align = BYTE_GET (external->p_align);
2484 }
2485
2486 free (phdrs);
2487
2488 return 1;
2489 }
2490
2491 static int
2492 get_64bit_program_headers (file, program_headers)
2493 FILE * file;
2494 Elf_Internal_Phdr * program_headers;
2495 {
2496 Elf64_External_Phdr * phdrs;
2497 Elf64_External_Phdr * external;
2498 Elf64_Internal_Phdr * internal;
2499 unsigned int i;
2500
2501 phdrs = ((Elf64_External_Phdr *)
2502 get_data (NULL, file, elf_header.e_phoff,
2503 elf_header.e_phentsize * elf_header.e_phnum,
2504 _("program headers")));
2505 if (!phdrs)
2506 return 0;
2507
2508 for (i = 0, internal = program_headers, external = phdrs;
2509 i < elf_header.e_phnum;
2510 i ++, internal ++, external ++)
2511 {
2512 internal->p_type = BYTE_GET (external->p_type);
2513 internal->p_flags = BYTE_GET (external->p_flags);
2514 internal->p_offset = BYTE_GET8 (external->p_offset);
2515 internal->p_vaddr = BYTE_GET8 (external->p_vaddr);
2516 internal->p_paddr = BYTE_GET8 (external->p_paddr);
2517 internal->p_filesz = BYTE_GET8 (external->p_filesz);
2518 internal->p_memsz = BYTE_GET8 (external->p_memsz);
2519 internal->p_align = BYTE_GET8 (external->p_align);
2520 }
2521
2522 free (phdrs);
2523
2524 return 1;
2525 }
2526
2527 static int
2528 process_program_headers (file)
2529 FILE * file;
2530 {
2531 Elf_Internal_Phdr * program_headers;
2532 Elf_Internal_Phdr * segment;
2533 unsigned int i;
2534
2535 if (elf_header.e_phnum == 0)
2536 {
2537 if (do_segments)
2538 printf (_("\nThere are no program headers in this file.\n"));
2539 return 1;
2540 }
2541
2542 if (do_segments && !do_header)
2543 {
2544 printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
2545 printf (_("Entry point "));
2546 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
2547 printf (_("\nThere are %d program headers, starting at offset "),
2548 elf_header.e_phnum);
2549 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
2550 printf ("\n");
2551 }
2552
2553 program_headers = (Elf_Internal_Phdr *) malloc
2554 (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
2555
2556 if (program_headers == NULL)
2557 {
2558 error (_("Out of memory\n"));
2559 return 0;
2560 }
2561
2562 if (is_32bit_elf)
2563 i = get_32bit_program_headers (file, program_headers);
2564 else
2565 i = get_64bit_program_headers (file, program_headers);
2566
2567 if (i == 0)
2568 {
2569 free (program_headers);
2570 return 0;
2571 }
2572
2573 if (do_segments)
2574 {
2575 printf
2576 (_("\nProgram Header%s:\n"), elf_header.e_phnum > 1 ? "s" : "");
2577
2578 if (is_32bit_elf)
2579 printf
2580 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
2581 else if (do_wide)
2582 printf
2583 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
2584 else
2585 {
2586 printf
2587 (_(" Type Offset VirtAddr PhysAddr\n"));
2588 printf
2589 (_(" FileSiz MemSiz Flags Align\n"));
2590 }
2591 }
2592
2593 loadaddr = -1;
2594 dynamic_addr = 0;
2595 dynamic_size = 0;
2596
2597 for (i = 0, segment = program_headers;
2598 i < elf_header.e_phnum;
2599 i ++, segment ++)
2600 {
2601 if (do_segments)
2602 {
2603 printf (" %-14.14s ", get_segment_type (segment->p_type));
2604
2605 if (is_32bit_elf)
2606 {
2607 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
2608 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
2609 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
2610 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
2611 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
2612 printf ("%c%c%c ",
2613 (segment->p_flags & PF_R ? 'R' : ' '),
2614 (segment->p_flags & PF_W ? 'W' : ' '),
2615 (segment->p_flags & PF_X ? 'E' : ' '));
2616 printf ("%#lx", (unsigned long) segment->p_align);
2617 }
2618 else if (do_wide)
2619 {
2620 if ((unsigned long) segment->p_offset == segment->p_offset)
2621 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
2622 else
2623 {
2624 print_vma (segment->p_offset, FULL_HEX);
2625 putchar (' ');
2626 }
2627
2628 print_vma (segment->p_vaddr, FULL_HEX);
2629 putchar (' ');
2630 print_vma (segment->p_paddr, FULL_HEX);
2631 putchar (' ');
2632
2633 if ((unsigned long) segment->p_filesz == segment->p_filesz)
2634 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
2635 else
2636 {
2637 print_vma (segment->p_filesz, FULL_HEX);
2638 putchar (' ');
2639 }
2640
2641 if ((unsigned long) segment->p_memsz == segment->p_memsz)
2642 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
2643 else
2644 {
2645 print_vma (segment->p_offset, FULL_HEX);
2646 }
2647
2648 printf (" %c%c%c ",
2649 (segment->p_flags & PF_R ? 'R' : ' '),
2650 (segment->p_flags & PF_W ? 'W' : ' '),
2651 (segment->p_flags & PF_X ? 'E' : ' '));
2652
2653 if ((unsigned long) segment->p_align == segment->p_align)
2654 printf ("%#lx", (unsigned long) segment->p_align);
2655 else
2656 {
2657 print_vma (segment->p_align, PREFIX_HEX);
2658 }
2659 }
2660 else
2661 {
2662 print_vma (segment->p_offset, FULL_HEX);
2663 putchar (' ');
2664 print_vma (segment->p_vaddr, FULL_HEX);
2665 putchar (' ');
2666 print_vma (segment->p_paddr, FULL_HEX);
2667 printf ("\n ");
2668 print_vma (segment->p_filesz, FULL_HEX);
2669 putchar (' ');
2670 print_vma (segment->p_memsz, FULL_HEX);
2671 printf (" %c%c%c ",
2672 (segment->p_flags & PF_R ? 'R' : ' '),
2673 (segment->p_flags & PF_W ? 'W' : ' '),
2674 (segment->p_flags & PF_X ? 'E' : ' '));
2675 print_vma (segment->p_align, HEX);
2676 }
2677 }
2678
2679 switch (segment->p_type)
2680 {
2681 case PT_LOAD:
2682 if (loadaddr == -1)
2683 loadaddr = (segment->p_vaddr & 0xfffff000)
2684 - (segment->p_offset & 0xfffff000);
2685 break;
2686
2687 case PT_DYNAMIC:
2688 if (dynamic_addr)
2689 error (_("more than one dynamic segment\n"));
2690
2691 dynamic_addr = segment->p_offset;
2692 dynamic_size = segment->p_filesz;
2693 break;
2694
2695 case PT_INTERP:
2696 if (fseek (file, (long) segment->p_offset, SEEK_SET))
2697 error (_("Unable to find program interpreter name\n"));
2698 else
2699 {
2700 program_interpreter[0] = 0;
2701 fscanf (file, "%63s", program_interpreter);
2702
2703 if (do_segments)
2704 printf (_("\n [Requesting program interpreter: %s]"),
2705 program_interpreter);
2706 }
2707 break;
2708 }
2709
2710 if (do_segments)
2711 putc ('\n', stdout);
2712 }
2713
2714 if (loadaddr == -1)
2715 {
2716 /* Very strange. */
2717 loadaddr = 0;
2718 }
2719
2720 if (do_segments && section_headers != NULL)
2721 {
2722 printf (_("\n Section to Segment mapping:\n"));
2723 printf (_(" Segment Sections...\n"));
2724
2725 assert (string_table != NULL);
2726
2727 for (i = 0; i < elf_header.e_phnum; i++)
2728 {
2729 int j;
2730 Elf_Internal_Shdr * section;
2731
2732 segment = program_headers + i;
2733 section = section_headers;
2734
2735 printf (" %2.2d ", i);
2736
2737 for (j = 0; j < elf_header.e_shnum; j++, section ++)
2738 {
2739 if (section->sh_size > 0
2740 /* Compare allocated sections by VMA, unallocated
2741 sections by file offset. */
2742 && (section->sh_flags & SHF_ALLOC
2743 ? (section->sh_addr >= segment->p_vaddr
2744 && section->sh_addr + section->sh_size
2745 <= segment->p_vaddr + segment->p_memsz)
2746 : ((bfd_vma) section->sh_offset >= segment->p_offset
2747 && (section->sh_offset + section->sh_size
2748 <= segment->p_offset + segment->p_filesz))))
2749 printf ("%s ", SECTION_NAME (section));
2750 }
2751
2752 putc ('\n',stdout);
2753 }
2754 }
2755
2756 free (program_headers);
2757
2758 return 1;
2759 }
2760
2761
2762 static int
2763 get_32bit_section_headers (file)
2764 FILE * file;
2765 {
2766 Elf32_External_Shdr * shdrs;
2767 Elf32_Internal_Shdr * internal;
2768 unsigned int i;
2769
2770 shdrs = ((Elf32_External_Shdr *)
2771 get_data (NULL, file, elf_header.e_shoff,
2772 elf_header.e_shentsize * elf_header.e_shnum,
2773 _("section headers")));
2774 if (!shdrs)
2775 return 0;
2776
2777 section_headers = (Elf_Internal_Shdr *) malloc
2778 (elf_header.e_shnum * sizeof (Elf_Internal_Shdr));
2779
2780 if (section_headers == NULL)
2781 {
2782 error (_("Out of memory\n"));
2783 return 0;
2784 }
2785
2786 for (i = 0, internal = section_headers;
2787 i < elf_header.e_shnum;
2788 i ++, internal ++)
2789 {
2790 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
2791 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
2792 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
2793 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
2794 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
2795 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
2796 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
2797 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
2798 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
2799 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
2800 }
2801
2802 free (shdrs);
2803
2804 return 1;
2805 }
2806
2807 static int
2808 get_64bit_section_headers (file)
2809 FILE * file;
2810 {
2811 Elf64_External_Shdr * shdrs;
2812 Elf64_Internal_Shdr * internal;
2813 unsigned int i;
2814
2815 shdrs = ((Elf64_External_Shdr *)
2816 get_data (NULL, file, elf_header.e_shoff,
2817 elf_header.e_shentsize * elf_header.e_shnum,
2818 _("section headers")));
2819 if (!shdrs)
2820 return 0;
2821
2822 section_headers = (Elf_Internal_Shdr *) malloc
2823 (elf_header.e_shnum * sizeof (Elf_Internal_Shdr));
2824
2825 if (section_headers == NULL)
2826 {
2827 error (_("Out of memory\n"));
2828 return 0;
2829 }
2830
2831 for (i = 0, internal = section_headers;
2832 i < elf_header.e_shnum;
2833 i ++, internal ++)
2834 {
2835 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
2836 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
2837 internal->sh_flags = BYTE_GET8 (shdrs[i].sh_flags);
2838 internal->sh_addr = BYTE_GET8 (shdrs[i].sh_addr);
2839 internal->sh_size = BYTE_GET8 (shdrs[i].sh_size);
2840 internal->sh_entsize = BYTE_GET8 (shdrs[i].sh_entsize);
2841 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
2842 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
2843 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
2844 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
2845 }
2846
2847 free (shdrs);
2848
2849 return 1;
2850 }
2851
2852 static Elf_Internal_Sym *
2853 get_32bit_elf_symbols (file, offset, number)
2854 FILE * file;
2855 unsigned long offset;
2856 unsigned long number;
2857 {
2858 Elf32_External_Sym * esyms;
2859 Elf_Internal_Sym * isyms;
2860 Elf_Internal_Sym * psym;
2861 unsigned int j;
2862
2863 esyms = ((Elf32_External_Sym *)
2864 get_data (NULL, file, offset,
2865 number * sizeof (Elf32_External_Sym), _("symbols")));
2866 if (!esyms)
2867 return NULL;
2868
2869 isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym));
2870
2871 if (isyms == NULL)
2872 {
2873 error (_("Out of memory\n"));
2874 free (esyms);
2875
2876 return NULL;
2877 }
2878
2879 for (j = 0, psym = isyms;
2880 j < number;
2881 j ++, psym ++)
2882 {
2883 psym->st_name = BYTE_GET (esyms[j].st_name);
2884 psym->st_value = BYTE_GET (esyms[j].st_value);
2885 psym->st_size = BYTE_GET (esyms[j].st_size);
2886 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
2887 psym->st_info = BYTE_GET (esyms[j].st_info);
2888 psym->st_other = BYTE_GET (esyms[j].st_other);
2889 }
2890
2891 free (esyms);
2892
2893 return isyms;
2894 }
2895
2896 static Elf_Internal_Sym *
2897 get_64bit_elf_symbols (file, offset, number)
2898 FILE * file;
2899 unsigned long offset;
2900 unsigned long number;
2901 {
2902 Elf64_External_Sym * esyms;
2903 Elf_Internal_Sym * isyms;
2904 Elf_Internal_Sym * psym;
2905 unsigned int j;
2906
2907 esyms = ((Elf64_External_Sym *)
2908 get_data (NULL, file, offset,
2909 number * sizeof (Elf64_External_Sym), _("symbols")));
2910 if (!esyms)
2911 return NULL;
2912
2913 isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym));
2914
2915 if (isyms == NULL)
2916 {
2917 error (_("Out of memory\n"));
2918 free (esyms);
2919
2920 return NULL;
2921 }
2922
2923 for (j = 0, psym = isyms;
2924 j < number;
2925 j ++, psym ++)
2926 {
2927 psym->st_name = BYTE_GET (esyms[j].st_name);
2928 psym->st_info = BYTE_GET (esyms[j].st_info);
2929 psym->st_other = BYTE_GET (esyms[j].st_other);
2930 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
2931 psym->st_value = BYTE_GET8 (esyms[j].st_value);
2932 psym->st_size = BYTE_GET8 (esyms[j].st_size);
2933 }
2934
2935 free (esyms);
2936
2937 return isyms;
2938 }
2939
2940 static const char *
2941 get_elf_section_flags (sh_flags)
2942 bfd_vma sh_flags;
2943 {
2944 static char buff [32];
2945
2946 * buff = 0;
2947
2948 while (sh_flags)
2949 {
2950 bfd_vma flag;
2951
2952 flag = sh_flags & - sh_flags;
2953 sh_flags &= ~ flag;
2954
2955 switch (flag)
2956 {
2957 case SHF_WRITE: strcat (buff, "W"); break;
2958 case SHF_ALLOC: strcat (buff, "A"); break;
2959 case SHF_EXECINSTR: strcat (buff, "X"); break;
2960 case SHF_MERGE: strcat (buff, "M"); break;
2961 case SHF_STRINGS: strcat (buff, "S"); break;
2962 case SHF_INFO_LINK: strcat (buff, "I"); break;
2963 case SHF_LINK_ORDER: strcat (buff, "L"); break;
2964 case SHF_OS_NONCONFORMING: strcat (buff, "O"); break;
2965 case SHF_GROUP: strcat (buff, "G"); break;
2966
2967 default:
2968 if (flag & SHF_MASKOS)
2969 {
2970 strcat (buff, "o");
2971 sh_flags &= ~ SHF_MASKOS;
2972 }
2973 else if (flag & SHF_MASKPROC)
2974 {
2975 strcat (buff, "p");
2976 sh_flags &= ~ SHF_MASKPROC;
2977 }
2978 else
2979 strcat (buff, "x");
2980 break;
2981 }
2982 }
2983
2984 return buff;
2985 }
2986
2987 static int
2988 process_section_headers (file)
2989 FILE * file;
2990 {
2991 Elf_Internal_Shdr * section;
2992 int i;
2993
2994 section_headers = NULL;
2995
2996 if (elf_header.e_shnum == 0)
2997 {
2998 if (do_sections)
2999 printf (_("\nThere are no sections in this file.\n"));
3000
3001 return 1;
3002 }
3003
3004 if (do_sections && !do_header)
3005 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
3006 elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
3007
3008 if (is_32bit_elf)
3009 {
3010 if (! get_32bit_section_headers (file))
3011 return 0;
3012 }
3013 else if (! get_64bit_section_headers (file))
3014 return 0;
3015
3016 /* Read in the string table, so that we have names to display. */
3017 section = section_headers + elf_header.e_shstrndx;
3018
3019 if (section->sh_size != 0)
3020 {
3021 string_table = (char *) get_data (NULL, file, section->sh_offset,
3022 section->sh_size, _("string table"));
3023
3024 string_table_length = section->sh_size;
3025 }
3026
3027 /* Scan the sections for the dynamic symbol table
3028 and dynamic string table and debug sections. */
3029 dynamic_symbols = NULL;
3030 dynamic_strings = NULL;
3031 dynamic_syminfo = NULL;
3032
3033 for (i = 0, section = section_headers;
3034 i < elf_header.e_shnum;
3035 i ++, section ++)
3036 {
3037 char * name = SECTION_NAME (section);
3038
3039 if (section->sh_type == SHT_DYNSYM)
3040 {
3041 if (dynamic_symbols != NULL)
3042 {
3043 error (_("File contains multiple dynamic symbol tables\n"));
3044 continue;
3045 }
3046
3047 num_dynamic_syms = section->sh_size / section->sh_entsize;
3048 dynamic_symbols =
3049 GET_ELF_SYMBOLS (file, section->sh_offset, num_dynamic_syms);
3050 }
3051 else if (section->sh_type == SHT_STRTAB
3052 && strcmp (name, ".dynstr") == 0)
3053 {
3054 if (dynamic_strings != NULL)
3055 {
3056 error (_("File contains multiple dynamic string tables\n"));
3057 continue;
3058 }
3059
3060 dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
3061 section->sh_size,
3062 _("dynamic strings"));
3063 }
3064 else if ((do_debugging || do_debug_info || do_debug_abbrevs
3065 || do_debug_lines || do_debug_pubnames || do_debug_aranges
3066 || do_debug_frames || do_debug_macinfo || do_debug_str)
3067 && strncmp (name, ".debug_", 7) == 0)
3068 {
3069 name += 7;
3070
3071 if (do_debugging
3072 || (do_debug_info && (strcmp (name, "info") == 0))
3073 || (do_debug_abbrevs && (strcmp (name, "abbrev") == 0))
3074 || (do_debug_lines && (strcmp (name, "line") == 0))
3075 || (do_debug_pubnames && (strcmp (name, "pubnames") == 0))
3076 || (do_debug_aranges && (strcmp (name, "aranges") == 0))
3077 || (do_debug_frames && (strcmp (name, "frame") == 0))
3078 || (do_debug_macinfo && (strcmp (name, "macinfo") == 0))
3079 || (do_debug_str && (strcmp (name, "str") == 0))
3080 )
3081 request_dump (i, DEBUG_DUMP);
3082 }
3083 /* linkonce section to be combined with .debug_info at link time. */
3084 else if ((do_debugging || do_debug_info)
3085 && strncmp (name, ".gnu.linkonce.wi.", 17) == 0)
3086 request_dump (i, DEBUG_DUMP);
3087 else if (do_debug_frames && strcmp (name, ".eh_frame") == 0)
3088 request_dump (i, DEBUG_DUMP);
3089 }
3090
3091 if (! do_sections)
3092 return 1;
3093
3094 printf (_("\nSection Header%s:\n"), elf_header.e_shnum > 1 ? "s" : "");
3095
3096 if (is_32bit_elf)
3097 printf
3098 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
3099 else if (do_wide)
3100 printf
3101 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
3102 else
3103 {
3104 printf (_(" [Nr] Name Type Address Offset\n"));
3105 printf (_(" Size EntSize Flags Link Info Align\n"));
3106 }
3107
3108 for (i = 0, section = section_headers;
3109 i < elf_header.e_shnum;
3110 i ++, section ++)
3111 {
3112 printf (" [%2d] %-17.17s %-15.15s ",
3113 i,
3114 SECTION_NAME (section),
3115 get_section_type_name (section->sh_type));
3116
3117 if (is_32bit_elf)
3118 {
3119 print_vma (section->sh_addr, LONG_HEX);
3120
3121 printf ( " %6.6lx %6.6lx %2.2lx",
3122 (unsigned long) section->sh_offset,
3123 (unsigned long) section->sh_size,
3124 (unsigned long) section->sh_entsize);
3125
3126 printf (" %3s ", get_elf_section_flags (section->sh_flags));
3127
3128 printf ("%2ld %3lx %2ld\n",
3129 (unsigned long) section->sh_link,
3130 (unsigned long) section->sh_info,
3131 (unsigned long) section->sh_addralign);
3132 }
3133 else if (do_wide)
3134 {
3135 print_vma (section->sh_addr, LONG_HEX);
3136
3137 if ((long) section->sh_offset == section->sh_offset)
3138 printf (" %6.6lx", (unsigned long) section->sh_offset);
3139 else
3140 {
3141 putchar (' ');
3142 print_vma (section->sh_offset, LONG_HEX);
3143 }
3144
3145 if ((unsigned long) section->sh_size == section->sh_size)
3146 printf (" %6.6lx", (unsigned long) section->sh_size);
3147 else
3148 {
3149 putchar (' ');
3150 print_vma (section->sh_size, LONG_HEX);
3151 }
3152
3153 if ((unsigned long) section->sh_entsize == section->sh_entsize)
3154 printf (" %2.2lx", (unsigned long) section->sh_entsize);
3155 else
3156 {
3157 putchar (' ');
3158 print_vma (section->sh_entsize, LONG_HEX);
3159 }
3160
3161 printf (" %3s ", get_elf_section_flags (section->sh_flags));
3162
3163 printf ("%2ld %3lx ",
3164 (unsigned long) section->sh_link,
3165 (unsigned long) section->sh_info);
3166
3167 if ((unsigned long) section->sh_addralign == section->sh_addralign)
3168 printf ("%2ld\n", (unsigned long) section->sh_addralign);
3169 else
3170 {
3171 print_vma (section->sh_addralign, DEC);
3172 putchar ('\n');
3173 }
3174 }
3175 else
3176 {
3177 putchar (' ');
3178 print_vma (section->sh_addr, LONG_HEX);
3179 if ((long) section->sh_offset == section->sh_offset)
3180 printf (" %8.8lx", (unsigned long) section->sh_offset);
3181 else
3182 {
3183 printf (" ");
3184 print_vma (section->sh_offset, LONG_HEX);
3185 }
3186 printf ("\n ");
3187 print_vma (section->sh_size, LONG_HEX);
3188 printf (" ");
3189 print_vma (section->sh_entsize, LONG_HEX);
3190
3191 printf (" %3s ", get_elf_section_flags (section->sh_flags));
3192
3193 printf (" %2ld %3lx %ld\n",
3194 (unsigned long) section->sh_link,
3195 (unsigned long) section->sh_info,
3196 (unsigned long) section->sh_addralign);
3197 }
3198 }
3199
3200 printf (_("Key to Flags:\n\
3201 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
3202 I (info), L (link order), G (group), x (unknown)\n\
3203 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
3204
3205 return 1;
3206 }
3207
3208 /* Process the reloc section. */
3209 static int
3210 process_relocs (file)
3211 FILE * file;
3212 {
3213 unsigned long rel_size;
3214 unsigned long rel_offset;
3215
3216
3217 if (!do_reloc)
3218 return 1;
3219
3220 if (do_using_dynamic)
3221 {
3222 int is_rela = FALSE;
3223
3224 rel_size = 0;
3225 rel_offset = 0;
3226
3227 if (dynamic_info[DT_REL])
3228 {
3229 rel_offset = dynamic_info[DT_REL];
3230 rel_size = dynamic_info[DT_RELSZ];
3231 is_rela = FALSE;
3232 }
3233 else if (dynamic_info [DT_RELA])
3234 {
3235 rel_offset = dynamic_info[DT_RELA];
3236 rel_size = dynamic_info[DT_RELASZ];
3237 is_rela = TRUE;
3238 }
3239 else if (dynamic_info[DT_JMPREL])
3240 {
3241 rel_offset = dynamic_info[DT_JMPREL];
3242 rel_size = dynamic_info[DT_PLTRELSZ];
3243
3244 switch (dynamic_info[DT_PLTREL])
3245 {
3246 case DT_REL:
3247 is_rela = FALSE;
3248 break;
3249 case DT_RELA:
3250 is_rela = TRUE;
3251 break;
3252 default:
3253 is_rela = UNKNOWN;
3254 break;
3255 }
3256 }
3257
3258 if (rel_size)
3259 {
3260 printf
3261 (_("\nRelocation section at offset 0x%lx contains %ld bytes:\n"),
3262 rel_offset, rel_size);
3263
3264 dump_relocations (file, rel_offset - loadaddr, rel_size,
3265 dynamic_symbols, num_dynamic_syms, dynamic_strings, is_rela);
3266 }
3267 else
3268 printf (_("\nThere are no dynamic relocations in this file.\n"));
3269 }
3270 else
3271 {
3272 Elf32_Internal_Shdr * section;
3273 unsigned long i;
3274 int found = 0;
3275
3276 for (i = 0, section = section_headers;
3277 i < elf_header.e_shnum;
3278 i++, section ++)
3279 {
3280 if ( section->sh_type != SHT_RELA
3281 && section->sh_type != SHT_REL)
3282 continue;
3283
3284 rel_offset = section->sh_offset;
3285 rel_size = section->sh_size;
3286
3287 if (rel_size)
3288 {
3289 Elf32_Internal_Shdr * strsec;
3290 Elf_Internal_Sym * symtab;
3291 char * strtab;
3292 int is_rela;
3293 unsigned long nsyms;
3294
3295 printf (_("\nRelocation section "));
3296
3297 if (string_table == NULL)
3298 printf ("%d", section->sh_name);
3299 else
3300 printf ("'%s'", SECTION_NAME (section));
3301
3302 printf (_(" at offset 0x%lx contains %lu entries:\n"),
3303 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
3304
3305 symtab = NULL;
3306 strtab = NULL;
3307 nsyms = 0;
3308 if (section->sh_link)
3309 {
3310 Elf32_Internal_Shdr * symsec;
3311
3312 symsec = section_headers + section->sh_link;
3313 nsyms = symsec->sh_size / symsec->sh_entsize;
3314 symtab = GET_ELF_SYMBOLS (file, symsec->sh_offset, nsyms);
3315
3316 if (symtab == NULL)
3317 continue;
3318
3319 strsec = section_headers + symsec->sh_link;
3320
3321 strtab = (char *) get_data (NULL, file, strsec->sh_offset,
3322 strsec->sh_size,
3323 _("string table"));
3324 }
3325 is_rela = section->sh_type == SHT_RELA;
3326
3327 dump_relocations (file, rel_offset, rel_size,
3328 symtab, nsyms, strtab, is_rela);
3329
3330 if (strtab)
3331 free (strtab);
3332 if (symtab)
3333 free (symtab);
3334
3335 found = 1;
3336 }
3337 }
3338
3339 if (! found)
3340 printf (_("\nThere are no relocations in this file.\n"));
3341 }
3342
3343 return 1;
3344 }
3345
3346 #include "unwind-ia64.h"
3347
3348 /* An absolute address consists of a section and an offset. If the
3349 section is NULL, the offset itself is the address, otherwise, the
3350 address equals to LOAD_ADDRESS(section) + offset. */
3351
3352 struct absaddr
3353 {
3354 unsigned short section;
3355 bfd_vma offset;
3356 };
3357
3358 struct unw_aux_info
3359 {
3360 struct unw_table_entry
3361 {
3362 struct absaddr start;
3363 struct absaddr end;
3364 struct absaddr info;
3365 }
3366 *table; /* Unwind table. */
3367 unsigned long table_len; /* Length of unwind table. */
3368 unsigned char * info; /* Unwind info. */
3369 unsigned long info_size; /* Size of unwind info. */
3370 bfd_vma info_addr; /* starting address of unwind info. */
3371 bfd_vma seg_base; /* Starting address of segment. */
3372 Elf_Internal_Sym * symtab; /* The symbol table. */
3373 unsigned long nsyms; /* Number of symbols. */
3374 char * strtab; /* The string table. */
3375 unsigned long strtab_size; /* Size of string table. */
3376 };
3377
3378 static void find_symbol_for_address PARAMS ((struct unw_aux_info *,
3379 struct absaddr, const char **,
3380 bfd_vma *));
3381 static void dump_ia64_unwind PARAMS ((struct unw_aux_info *));
3382 static int slurp_ia64_unwind_table PARAMS ((FILE *, struct unw_aux_info *,
3383 Elf32_Internal_Shdr *));
3384
3385 static void
3386 find_symbol_for_address (aux, addr, symname, offset)
3387 struct unw_aux_info *aux;
3388 struct absaddr addr;
3389 const char **symname;
3390 bfd_vma *offset;
3391 {
3392 bfd_vma dist = (bfd_vma) 0x100000;
3393 Elf_Internal_Sym *sym, *best = NULL;
3394 unsigned long i;
3395
3396 for (i = 0, sym = aux->symtab; i < aux->nsyms; ++i, ++sym)
3397 {
3398 if (ELF_ST_TYPE (sym->st_info) == STT_FUNC
3399 && sym->st_name != 0
3400 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
3401 && addr.offset >= sym->st_value
3402 && addr.offset - sym->st_value < dist)
3403 {
3404 best = sym;
3405 dist = addr.offset - sym->st_value;
3406 if (!dist)
3407 break;
3408 }
3409 }
3410 if (best)
3411 {
3412 *symname = (best->st_name >= aux->strtab_size
3413 ? "<corrupt>" : aux->strtab + best->st_name);
3414 *offset = dist;
3415 return;
3416 }
3417 *symname = NULL;
3418 *offset = addr.offset;
3419 }
3420
3421 static void
3422 dump_ia64_unwind (aux)
3423 struct unw_aux_info *aux;
3424 {
3425 bfd_vma addr_size;
3426 struct unw_table_entry * tp;
3427 int in_body;
3428
3429 addr_size = is_32bit_elf ? 4 : 8;
3430
3431 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
3432 {
3433 bfd_vma stamp;
3434 bfd_vma offset;
3435 const unsigned char * dp;
3436 const unsigned char * head;
3437 const char * procname;
3438
3439 find_symbol_for_address (aux, tp->start, &procname, &offset);
3440
3441 fputs ("\n<", stdout);
3442
3443 if (procname)
3444 {
3445 fputs (procname, stdout);
3446
3447 if (offset)
3448 printf ("+%lx", (unsigned long) offset);
3449 }
3450
3451 fputs (">: [", stdout);
3452 print_vma (tp->start.offset, PREFIX_HEX);
3453 fputc ('-', stdout);
3454 print_vma (tp->end.offset, PREFIX_HEX);
3455 printf ("), info at +0x%lx\n",
3456 (unsigned long) (tp->info.offset - aux->seg_base));
3457
3458 head = aux->info + (tp->info.offset - aux->info_addr);
3459 stamp = BYTE_GET8 ((unsigned char *) head);
3460
3461 printf (" v%u, flags=0x%lx (%s%s ), len=%lu bytes\n",
3462 (unsigned) UNW_VER (stamp),
3463 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
3464 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
3465 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
3466 (unsigned long) (addr_size * UNW_LENGTH (stamp)));
3467
3468 if (UNW_VER (stamp) != 1)
3469 {
3470 printf ("\tUnknown version.\n");
3471 continue;
3472 }
3473
3474 in_body = 0;
3475 for (dp = head + 8; dp < head + 8 + addr_size * UNW_LENGTH (stamp);)
3476 dp = unw_decode (dp, in_body, & in_body);
3477 }
3478 }
3479
3480 static int
3481 slurp_ia64_unwind_table (file, aux, sec)
3482 FILE *file;
3483 struct unw_aux_info *aux;
3484 Elf32_Internal_Shdr *sec;
3485 {
3486 unsigned long size, addr_size, nrelas, i;
3487 Elf_Internal_Phdr *prog_hdrs, *seg;
3488 struct unw_table_entry *tep;
3489 Elf32_Internal_Shdr *relsec;
3490 Elf_Internal_Rela *rela, *rp;
3491 unsigned char *table, *tp;
3492 Elf_Internal_Sym *sym;
3493 const char *relname;
3494 int result;
3495
3496 addr_size = is_32bit_elf ? 4 : 8;
3497
3498 /* First, find the starting address of the segment that includes
3499 this section: */
3500
3501 if (elf_header.e_phnum)
3502 {
3503 prog_hdrs = (Elf_Internal_Phdr *)
3504 xmalloc (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
3505
3506 if (is_32bit_elf)
3507 result = get_32bit_program_headers (file, prog_hdrs);
3508 else
3509 result = get_64bit_program_headers (file, prog_hdrs);
3510
3511 if (!result)
3512 {
3513 free (prog_hdrs);
3514 return 0;
3515 }
3516
3517 for (seg = prog_hdrs; seg < prog_hdrs + elf_header.e_phnum; ++seg)
3518 {
3519 if (seg->p_type != PT_LOAD)
3520 continue;
3521
3522 if (sec->sh_addr >= seg->p_vaddr
3523 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
3524 {
3525 aux->seg_base = seg->p_vaddr;
3526 break;
3527 }
3528 }
3529
3530 free (prog_hdrs);
3531 }
3532
3533 /* Second, build the unwind table from the contents of the unwind section: */
3534 size = sec->sh_size;
3535 table = (char *) get_data (NULL, file, sec->sh_offset,
3536 size, _("unwind table"));
3537 if (!table)
3538 return 0;
3539
3540 tep = aux->table = xmalloc (size / (3 * addr_size) * sizeof (aux->table[0]));
3541 for (tp = table; tp < table + size; tp += 3 * addr_size, ++ tep)
3542 {
3543 tep->start.section = SHN_UNDEF;
3544 tep->end.section = SHN_UNDEF;
3545 tep->info.section = SHN_UNDEF;
3546 if (is_32bit_elf)
3547 {
3548 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
3549 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
3550 tep->info.offset = byte_get ((unsigned char *) tp + 8, 4);
3551 }
3552 else
3553 {
3554 tep->start.offset = BYTE_GET8 ((unsigned char *) tp + 0);
3555 tep->end.offset = BYTE_GET8 ((unsigned char *) tp + 8);
3556 tep->info.offset = BYTE_GET8 ((unsigned char *) tp + 16);
3557 }
3558 tep->start.offset += aux->seg_base;
3559 tep->end.offset += aux->seg_base;
3560 tep->info.offset += aux->seg_base;
3561 }
3562 free (table);
3563
3564 /* Third, apply any relocations to the unwind table: */
3565
3566 for (relsec = section_headers;
3567 relsec < section_headers + elf_header.e_shnum;
3568 ++relsec)
3569 {
3570 if (relsec->sh_type != SHT_RELA
3571 || section_headers + relsec->sh_info != sec)
3572 continue;
3573
3574 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
3575 & rela, & nrelas))
3576 return 0;
3577
3578 for (rp = rela; rp < rela + nrelas; ++rp)
3579 {
3580 if (is_32bit_elf)
3581 {
3582 relname = elf_ia64_reloc_type (ELF32_R_TYPE (rp->r_info));
3583 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
3584
3585 if (ELF32_ST_TYPE (sym->st_info) != STT_SECTION)
3586 {
3587 warn (_("Skipping unexpected symbol type %u\n"),
3588 ELF32_ST_TYPE (sym->st_info));
3589 continue;
3590 }
3591 }
3592 else
3593 {
3594 relname = elf_ia64_reloc_type (ELF64_R_TYPE (rp->r_info));
3595 sym = aux->symtab + ELF64_R_SYM (rp->r_info);
3596
3597 if (ELF64_ST_TYPE (sym->st_info) != STT_SECTION)
3598 {
3599 warn (_("Skipping unexpected symbol type %u\n"),
3600 ELF64_ST_TYPE (sym->st_info));
3601 continue;
3602 }
3603 }
3604
3605 if (strncmp (relname, "R_IA64_SEGREL", 13) != 0)
3606 {
3607 warn (_("Skipping unexpected relocation type %s\n"), relname);
3608 continue;
3609 }
3610
3611 i = rp->r_offset / (3 * addr_size);
3612
3613 switch (rp->r_offset/addr_size % 3)
3614 {
3615 case 0:
3616 aux->table[i].start.section = sym->st_shndx;
3617 aux->table[i].start.offset += rp->r_addend;
3618 break;
3619 case 1:
3620 aux->table[i].end.section = sym->st_shndx;
3621 aux->table[i].end.offset += rp->r_addend;
3622 break;
3623 case 2:
3624 aux->table[i].info.section = sym->st_shndx;
3625 aux->table[i].info.offset += rp->r_addend;
3626 break;
3627 default:
3628 break;
3629 }
3630 }
3631
3632 free (rela);
3633 }
3634
3635 aux->table_len = size / (3 * addr_size);
3636 return 1;
3637 }
3638
3639 static int
3640 process_unwind (file)
3641 FILE * file;
3642 {
3643 Elf32_Internal_Shdr *sec, *unwsec = NULL, *strsec;
3644 unsigned long i, addr_size, unwcount = 0, unwstart = 0;
3645 struct unw_aux_info aux;
3646
3647 if (!do_unwind)
3648 return 1;
3649
3650 if (elf_header.e_machine != EM_IA_64)
3651 {
3652 printf (_("\nThere are no unwind sections in this file.\n"));
3653 return 1;
3654 }
3655
3656 memset (& aux, 0, sizeof (aux));
3657
3658 addr_size = is_32bit_elf ? 4 : 8;
3659
3660 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
3661 {
3662 if (sec->sh_type == SHT_SYMTAB)
3663 {
3664 aux.nsyms = sec->sh_size / sec->sh_entsize;
3665 aux.symtab = GET_ELF_SYMBOLS (file, sec->sh_offset, aux.nsyms);
3666
3667 strsec = section_headers + sec->sh_link;
3668 aux.strtab_size = strsec->sh_size;
3669 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
3670 aux.strtab_size, _("string table"));
3671 }
3672 else if (sec->sh_type == SHT_IA_64_UNWIND)
3673 unwcount++;
3674 }
3675
3676 if (!unwcount)
3677 printf (_("\nThere are no unwind sections in this file.\n"));
3678
3679 while (unwcount-- > 0)
3680 {
3681 char *suffix;
3682 size_t len, len2;
3683
3684 for (i = unwstart, sec = section_headers + unwstart;
3685 i < elf_header.e_shnum; ++i, ++sec)
3686 if (sec->sh_type == SHT_IA_64_UNWIND)
3687 {
3688 unwsec = sec;
3689 break;
3690 }
3691
3692 unwstart = i + 1;
3693 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
3694
3695 if (strncmp (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once,
3696 len) == 0)
3697 {
3698 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO */
3699 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
3700 suffix = SECTION_NAME (unwsec) + len;
3701 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
3702 ++i, ++sec)
3703 if (strncmp (SECTION_NAME (sec),
3704 ELF_STRING_ia64_unwind_info_once, len2) == 0
3705 && strcmp (SECTION_NAME (sec) + len2, suffix) == 0)
3706 break;
3707 }
3708 else
3709 {
3710 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
3711 .IA_64.unwind or BAR -> .IA_64.unwind_info */
3712 len = sizeof (ELF_STRING_ia64_unwind) - 1;
3713 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
3714 suffix = "";
3715 if (strncmp (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind,
3716 len) == 0)
3717 suffix = SECTION_NAME (unwsec) + len;
3718 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
3719 ++i, ++sec)
3720 if (strncmp (SECTION_NAME (sec),
3721 ELF_STRING_ia64_unwind_info, len2) == 0
3722 && strcmp (SECTION_NAME (sec) + len2, suffix) == 0)
3723 break;
3724 }
3725
3726 if (i == elf_header.e_shnum)
3727 {
3728 printf (_("\nCould not find unwind info section for "));
3729
3730 if (string_table == NULL)
3731 printf ("%d", unwsec->sh_name);
3732 else
3733 printf ("'%s'", SECTION_NAME (unwsec));
3734 }
3735 else
3736 {
3737 aux.info_size = sec->sh_size;
3738 aux.info_addr = sec->sh_addr;
3739 aux.info = (char *) get_data (NULL, file, sec->sh_offset,
3740 aux.info_size, _("unwind info"));
3741
3742 printf (_("\nUnwind section "));
3743
3744 if (string_table == NULL)
3745 printf ("%d", unwsec->sh_name);
3746 else
3747 printf ("'%s'", SECTION_NAME (unwsec));
3748
3749 printf (_(" at offset 0x%lx contains %lu entries:\n"),
3750 (unsigned long) unwsec->sh_offset,
3751 (unsigned long) (unwsec->sh_size / (3 * addr_size)));
3752
3753 (void) slurp_ia64_unwind_table (file, & aux, unwsec);
3754
3755 if (aux.table_len > 0)
3756 dump_ia64_unwind (& aux);
3757
3758 if (aux.table)
3759 free ((char *) aux.table);
3760 if (aux.info)
3761 free ((char *) aux.info);
3762 aux.table = NULL;
3763 aux.info = NULL;
3764 }
3765 }
3766
3767 if (aux.symtab)
3768 free (aux.symtab);
3769 if (aux.strtab)
3770 free ((char *) aux.strtab);
3771
3772 return 1;
3773 }
3774
3775 static void
3776 dynamic_segment_mips_val (entry)
3777 Elf_Internal_Dyn * entry;
3778 {
3779 switch (entry->d_tag)
3780 {
3781 case DT_MIPS_FLAGS:
3782 if (entry->d_un.d_val == 0)
3783 printf ("NONE\n");
3784 else
3785 {
3786 static const char * opts[] =
3787 {
3788 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
3789 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
3790 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
3791 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
3792 "RLD_ORDER_SAFE"
3793 };
3794 unsigned int cnt;
3795 int first = 1;
3796 for (cnt = 0; cnt < NUM_ELEM (opts); ++ cnt)
3797 if (entry->d_un.d_val & (1 << cnt))
3798 {
3799 printf ("%s%s", first ? "" : " ", opts[cnt]);
3800 first = 0;
3801 }
3802 puts ("");
3803 }
3804 break;
3805
3806 case DT_MIPS_IVERSION:
3807 if (dynamic_strings != NULL)
3808 printf ("Interface Version: %s\n",
3809 dynamic_strings + entry->d_un.d_val);
3810 else
3811 printf ("%ld\n", (long) entry->d_un.d_ptr);
3812 break;
3813
3814 case DT_MIPS_TIME_STAMP:
3815 {
3816 char timebuf[20];
3817 struct tm * tmp;
3818
3819 time_t time = entry->d_un.d_val;
3820 tmp = gmtime (&time);
3821 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
3822 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
3823 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
3824 printf ("Time Stamp: %s\n", timebuf);
3825 }
3826 break;
3827
3828 case DT_MIPS_RLD_VERSION:
3829 case DT_MIPS_LOCAL_GOTNO:
3830 case DT_MIPS_CONFLICTNO:
3831 case DT_MIPS_LIBLISTNO:
3832 case DT_MIPS_SYMTABNO:
3833 case DT_MIPS_UNREFEXTNO:
3834 case DT_MIPS_HIPAGENO:
3835 case DT_MIPS_DELTA_CLASS_NO:
3836 case DT_MIPS_DELTA_INSTANCE_NO:
3837 case DT_MIPS_DELTA_RELOC_NO:
3838 case DT_MIPS_DELTA_SYM_NO:
3839 case DT_MIPS_DELTA_CLASSSYM_NO:
3840 case DT_MIPS_COMPACT_SIZE:
3841 printf ("%ld\n", (long) entry->d_un.d_ptr);
3842 break;
3843
3844 default:
3845 printf ("%#lx\n", (long) entry->d_un.d_ptr);
3846 }
3847 }
3848
3849
3850 static void
3851 dynamic_segment_parisc_val (entry)
3852 Elf_Internal_Dyn * entry;
3853 {
3854 switch (entry->d_tag)
3855 {
3856 case DT_HP_DLD_FLAGS:
3857 {
3858 static struct
3859 {
3860 long int bit;
3861 const char * str;
3862 }
3863 flags[] =
3864 {
3865 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
3866 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
3867 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
3868 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
3869 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
3870 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
3871 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
3872 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
3873 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
3874 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
3875 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" }
3876 };
3877 int first = 1;
3878 size_t cnt;
3879 bfd_vma val = entry->d_un.d_val;
3880
3881 for (cnt = 0; cnt < sizeof (flags) / sizeof (flags[0]); ++cnt)
3882 if (val & flags[cnt].bit)
3883 {
3884 if (! first)
3885 putchar (' ');
3886 fputs (flags[cnt].str, stdout);
3887 first = 0;
3888 val ^= flags[cnt].bit;
3889 }
3890
3891 if (val != 0 || first)
3892 {
3893 if (! first)
3894 putchar (' ');
3895 print_vma (val, HEX);
3896 }
3897 }
3898 break;
3899
3900 default:
3901 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
3902 break;
3903 }
3904 }
3905
3906 static int
3907 get_32bit_dynamic_segment (file)
3908 FILE * file;
3909 {
3910 Elf32_External_Dyn * edyn;
3911 Elf_Internal_Dyn * entry;
3912 bfd_size_type i;
3913
3914 edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr,
3915 dynamic_size, _("dynamic segment"));
3916 if (!edyn)
3917 return 0;
3918
3919 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
3920 how large this .dynamic is now. We can do this even before the byte
3921 swapping since the DT_NULL tag is recognizable. */
3922 dynamic_size = 0;
3923 while (*(Elf32_Word *) edyn [dynamic_size++].d_tag != DT_NULL)
3924 ;
3925
3926 dynamic_segment = (Elf_Internal_Dyn *)
3927 malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
3928
3929 if (dynamic_segment == NULL)
3930 {
3931 error (_("Out of memory\n"));
3932 free (edyn);
3933 return 0;
3934 }
3935
3936 for (i = 0, entry = dynamic_segment;
3937 i < dynamic_size;
3938 i ++, entry ++)
3939 {
3940 entry->d_tag = BYTE_GET (edyn [i].d_tag);
3941 entry->d_un.d_val = BYTE_GET (edyn [i].d_un.d_val);
3942 }
3943
3944 free (edyn);
3945
3946 return 1;
3947 }
3948
3949 static int
3950 get_64bit_dynamic_segment (file)
3951 FILE * file;
3952 {
3953 Elf64_External_Dyn * edyn;
3954 Elf_Internal_Dyn * entry;
3955 bfd_size_type i;
3956
3957 edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr,
3958 dynamic_size, _("dynamic segment"));
3959 if (!edyn)
3960 return 0;
3961
3962 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
3963 how large this .dynamic is now. We can do this even before the byte
3964 swapping since the DT_NULL tag is recognizable. */
3965 dynamic_size = 0;
3966 while (*(bfd_vma *) edyn [dynamic_size ++].d_tag != DT_NULL)
3967 ;
3968
3969 dynamic_segment = (Elf_Internal_Dyn *)
3970 malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
3971
3972 if (dynamic_segment == NULL)
3973 {
3974 error (_("Out of memory\n"));
3975 free (edyn);
3976 return 0;
3977 }
3978
3979 for (i = 0, entry = dynamic_segment;
3980 i < dynamic_size;
3981 i ++, entry ++)
3982 {
3983 entry->d_tag = BYTE_GET8 (edyn [i].d_tag);
3984 entry->d_un.d_val = BYTE_GET8 (edyn [i].d_un.d_val);
3985 }
3986
3987 free (edyn);
3988
3989 return 1;
3990 }
3991
3992 static const char *
3993 get_dynamic_flags (flags)
3994 bfd_vma flags;
3995 {
3996 static char buff [64];
3997 while (flags)
3998 {
3999 bfd_vma flag;
4000
4001 flag = flags & - flags;
4002 flags &= ~ flag;
4003
4004 switch (flag)
4005 {
4006 case DF_ORIGIN: strcat (buff, "ORIGIN "); break;
4007 case DF_SYMBOLIC: strcat (buff, "SYMBOLIC "); break;
4008 case DF_TEXTREL: strcat (buff, "TEXTREL "); break;
4009 case DF_BIND_NOW: strcat (buff, "BIND_NOW "); break;
4010 default: strcat (buff, "unknown "); break;
4011 }
4012 }
4013 return buff;
4014 }
4015
4016 /* Parse and display the contents of the dynamic segment. */
4017 static int
4018 process_dynamic_segment (file)
4019 FILE * file;
4020 {
4021 Elf_Internal_Dyn * entry;
4022 bfd_size_type i;
4023
4024 if (dynamic_size == 0)
4025 {
4026 if (do_dynamic)
4027 printf (_("\nThere is no dynamic segment in this file.\n"));
4028
4029 return 1;
4030 }
4031
4032 if (is_32bit_elf)
4033 {
4034 if (! get_32bit_dynamic_segment (file))
4035 return 0;
4036 }
4037 else if (! get_64bit_dynamic_segment (file))
4038 return 0;
4039
4040 /* Find the appropriate symbol table. */
4041 if (dynamic_symbols == NULL)
4042 {
4043 for (i = 0, entry = dynamic_segment;
4044 i < dynamic_size;
4045 ++i, ++ entry)
4046 {
4047 unsigned long offset;
4048
4049 if (entry->d_tag != DT_SYMTAB)
4050 continue;
4051
4052 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
4053
4054 /* Since we do not know how big the symbol table is,
4055 we default to reading in the entire file (!) and
4056 processing that. This is overkill, I know, but it
4057 should work. */
4058 offset = entry->d_un.d_val - loadaddr;
4059
4060 if (fseek (file, 0, SEEK_END))
4061 error (_("Unable to seek to end of file!"));
4062
4063 if (is_32bit_elf)
4064 num_dynamic_syms = (ftell (file) - offset) / sizeof (Elf32_External_Sym);
4065 else
4066 num_dynamic_syms = (ftell (file) - offset) / sizeof (Elf64_External_Sym);
4067
4068 if (num_dynamic_syms < 1)
4069 {
4070 error (_("Unable to determine the number of symbols to load\n"));
4071 continue;
4072 }
4073
4074 dynamic_symbols = GET_ELF_SYMBOLS (file, offset, num_dynamic_syms);
4075 }
4076 }
4077
4078 /* Similarly find a string table. */
4079 if (dynamic_strings == NULL)
4080 {
4081 for (i = 0, entry = dynamic_segment;
4082 i < dynamic_size;
4083 ++i, ++ entry)
4084 {
4085 unsigned long offset;
4086 long str_tab_len;
4087
4088 if (entry->d_tag != DT_STRTAB)
4089 continue;
4090
4091 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
4092
4093 /* Since we do not know how big the string table is,
4094 we default to reading in the entire file (!) and
4095 processing that. This is overkill, I know, but it
4096 should work. */
4097
4098 offset = entry->d_un.d_val - loadaddr;
4099 if (fseek (file, 0, SEEK_END))
4100 error (_("Unable to seek to end of file\n"));
4101 str_tab_len = ftell (file) - offset;
4102
4103 if (str_tab_len < 1)
4104 {
4105 error
4106 (_("Unable to determine the length of the dynamic string table\n"));
4107 continue;
4108 }
4109
4110 dynamic_strings = (char *) get_data (NULL, file, offset, str_tab_len,
4111 _("dynamic string table"));
4112 break;
4113 }
4114 }
4115
4116 /* And find the syminfo section if available. */
4117 if (dynamic_syminfo == NULL)
4118 {
4119 unsigned int syminsz = 0;
4120
4121 for (i = 0, entry = dynamic_segment;
4122 i < dynamic_size;
4123 ++i, ++ entry)
4124 {
4125 if (entry->d_tag == DT_SYMINENT)
4126 {
4127 /* Note: these braces are necessary to avoid a syntax
4128 error from the SunOS4 C compiler. */
4129 assert (sizeof (Elf_External_Syminfo) == entry->d_un.d_val);
4130 }
4131 else if (entry->d_tag == DT_SYMINSZ)
4132 syminsz = entry->d_un.d_val;
4133 else if (entry->d_tag == DT_SYMINFO)
4134 dynamic_syminfo_offset = entry->d_un.d_val - loadaddr;
4135 }
4136
4137 if (dynamic_syminfo_offset != 0 && syminsz != 0)
4138 {
4139 Elf_External_Syminfo * extsyminfo;
4140 Elf_Internal_Syminfo * syminfo;
4141
4142 /* There is a syminfo section. Read the data. */
4143 extsyminfo = ((Elf_External_Syminfo *)
4144 get_data (NULL, file, dynamic_syminfo_offset,
4145 syminsz, _("symbol information")));
4146 if (!extsyminfo)
4147 return 0;
4148
4149 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
4150 if (dynamic_syminfo == NULL)
4151 {
4152 error (_("Out of memory\n"));
4153 return 0;
4154 }
4155
4156 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
4157 for (i = 0, syminfo = dynamic_syminfo; i < dynamic_syminfo_nent;
4158 ++i, ++syminfo)
4159 {
4160 syminfo->si_boundto = BYTE_GET (extsyminfo[i].si_boundto);
4161 syminfo->si_flags = BYTE_GET (extsyminfo[i].si_flags);
4162 }
4163
4164 free (extsyminfo);
4165 }
4166 }
4167
4168 if (do_dynamic && dynamic_addr)
4169 printf (_("\nDynamic segment at offset 0x%x contains %ld entries:\n"),
4170 dynamic_addr, (long) dynamic_size);
4171 if (do_dynamic)
4172 printf (_(" Tag Type Name/Value\n"));
4173
4174 for (i = 0, entry = dynamic_segment;
4175 i < dynamic_size;
4176 i++, entry ++)
4177 {
4178 if (do_dynamic)
4179 {
4180 const char * dtype;
4181
4182 putchar (' ');
4183 print_vma (entry->d_tag, FULL_HEX);
4184 dtype = get_dynamic_type (entry->d_tag);
4185 printf (" (%s)%*s", dtype,
4186 ((is_32bit_elf ? 27 : 19)
4187 - (int) strlen (dtype)),
4188 " ");
4189 }
4190
4191 switch (entry->d_tag)
4192 {
4193 case DT_FLAGS:
4194 if (do_dynamic)
4195 printf ("%s", get_dynamic_flags (entry->d_un.d_val));
4196 break;
4197
4198 case DT_AUXILIARY:
4199 case DT_FILTER:
4200 case DT_CONFIG:
4201 case DT_DEPAUDIT:
4202 case DT_AUDIT:
4203 if (do_dynamic)
4204 {
4205 switch (entry->d_tag)
4206 {
4207 case DT_AUXILIARY:
4208 printf (_("Auxiliary library"));
4209 break;
4210
4211 case DT_FILTER:
4212 printf (_("Filter library"));
4213 break;
4214
4215 case DT_CONFIG:
4216 printf (_("Configuration file"));
4217 break;
4218
4219 case DT_DEPAUDIT:
4220 printf (_("Dependency audit library"));
4221 break;
4222
4223 case DT_AUDIT:
4224 printf (_("Audit library"));
4225 break;
4226 }
4227
4228 if (dynamic_strings)
4229 printf (": [%s]\n", dynamic_strings + entry->d_un.d_val);
4230 else
4231 {
4232 printf (": ");
4233 print_vma (entry->d_un.d_val, PREFIX_HEX);
4234 putchar ('\n');
4235 }
4236 }
4237 break;
4238
4239 case DT_FEATURE:
4240 if (do_dynamic)
4241 {
4242 printf (_("Flags:"));
4243 if (entry->d_un.d_val == 0)
4244 printf (_(" None\n"));
4245 else
4246 {
4247 unsigned long int val = entry->d_un.d_val;
4248 if (val & DTF_1_PARINIT)
4249 {
4250 printf (" PARINIT");
4251 val ^= DTF_1_PARINIT;
4252 }
4253 if (val & DTF_1_CONFEXP)
4254 {
4255 printf (" CONFEXP");
4256 val ^= DTF_1_CONFEXP;
4257 }
4258 if (val != 0)
4259 printf (" %lx", val);
4260 puts ("");
4261 }
4262 }
4263 break;
4264
4265 case DT_POSFLAG_1:
4266 if (do_dynamic)
4267 {
4268 printf (_("Flags:"));
4269 if (entry->d_un.d_val == 0)
4270 printf (_(" None\n"));
4271 else
4272 {
4273 unsigned long int val = entry->d_un.d_val;
4274 if (val & DF_P1_LAZYLOAD)
4275 {
4276 printf (" LAZYLOAD");
4277 val ^= DF_P1_LAZYLOAD;
4278 }
4279 if (val & DF_P1_GROUPPERM)
4280 {
4281 printf (" GROUPPERM");
4282 val ^= DF_P1_GROUPPERM;
4283 }
4284 if (val != 0)
4285 printf (" %lx", val);
4286 puts ("");
4287 }
4288 }
4289 break;
4290
4291 case DT_FLAGS_1:
4292 if (do_dynamic)
4293 {
4294 printf (_("Flags:"));
4295 if (entry->d_un.d_val == 0)
4296 printf (_(" None\n"));
4297 else
4298 {
4299 unsigned long int val = entry->d_un.d_val;
4300 if (val & DF_1_NOW)
4301 {
4302 printf (" NOW");
4303 val ^= DF_1_NOW;
4304 }
4305 if (val & DF_1_GLOBAL)
4306 {
4307 printf (" GLOBAL");
4308 val ^= DF_1_GLOBAL;
4309 }
4310 if (val & DF_1_GROUP)
4311 {
4312 printf (" GROUP");
4313 val ^= DF_1_GROUP;
4314 }
4315 if (val & DF_1_NODELETE)
4316 {
4317 printf (" NODELETE");
4318 val ^= DF_1_NODELETE;
4319 }
4320 if (val & DF_1_LOADFLTR)
4321 {
4322 printf (" LOADFLTR");
4323 val ^= DF_1_LOADFLTR;
4324 }
4325 if (val & DF_1_INITFIRST)
4326 {
4327 printf (" INITFIRST");
4328 val ^= DF_1_INITFIRST;
4329 }
4330 if (val & DF_1_NOOPEN)
4331 {
4332 printf (" NOOPEN");
4333 val ^= DF_1_NOOPEN;
4334 }
4335 if (val & DF_1_ORIGIN)
4336 {
4337 printf (" ORIGIN");
4338 val ^= DF_1_ORIGIN;
4339 }
4340 if (val & DF_1_DIRECT)
4341 {
4342 printf (" DIRECT");
4343 val ^= DF_1_DIRECT;
4344 }
4345 if (val & DF_1_TRANS)
4346 {
4347 printf (" TRANS");
4348 val ^= DF_1_TRANS;
4349 }
4350 if (val & DF_1_INTERPOSE)
4351 {
4352 printf (" INTERPOSE");
4353 val ^= DF_1_INTERPOSE;
4354 }
4355 if (val & DF_1_NODEFLIB)
4356 {
4357 printf (" NODEFLIB");
4358 val ^= DF_1_NODEFLIB;
4359 }
4360 if (val & DF_1_NODUMP)
4361 {
4362 printf (" NODUMP");
4363 val ^= DF_1_NODUMP;
4364 }
4365 if (val & DF_1_CONLFAT)
4366 {
4367 printf (" CONLFAT");
4368 val ^= DF_1_CONLFAT;
4369 }
4370 if (val != 0)
4371 printf (" %lx", val);
4372 puts ("");
4373 }
4374 }
4375 break;
4376
4377 case DT_PLTREL:
4378 if (do_dynamic)
4379 puts (get_dynamic_type (entry->d_un.d_val));
4380 break;
4381
4382 case DT_NULL :
4383 case DT_NEEDED :
4384 case DT_PLTGOT :
4385 case DT_HASH :
4386 case DT_STRTAB :
4387 case DT_SYMTAB :
4388 case DT_RELA :
4389 case DT_INIT :
4390 case DT_FINI :
4391 case DT_SONAME :
4392 case DT_RPATH :
4393 case DT_SYMBOLIC:
4394 case DT_REL :
4395 case DT_DEBUG :
4396 case DT_TEXTREL :
4397 case DT_JMPREL :
4398 case DT_RUNPATH :
4399 dynamic_info[entry->d_tag] = entry->d_un.d_val;
4400
4401 if (do_dynamic)
4402 {
4403 char * name;
4404
4405 if (dynamic_strings == NULL)
4406 name = NULL;
4407 else
4408 name = dynamic_strings + entry->d_un.d_val;
4409
4410 if (name)
4411 {
4412 switch (entry->d_tag)
4413 {
4414 case DT_NEEDED:
4415 printf (_("Shared library: [%s]"), name);
4416
4417 if (strcmp (name, program_interpreter) == 0)
4418 printf (_(" program interpreter"));
4419 break;
4420
4421 case DT_SONAME:
4422 printf (_("Library soname: [%s]"), name);
4423 break;
4424
4425 case DT_RPATH:
4426 printf (_("Library rpath: [%s]"), name);
4427 break;
4428
4429 case DT_RUNPATH:
4430 printf (_("Library runpath: [%s]"), name);
4431 break;
4432
4433 default:
4434 print_vma (entry->d_un.d_val, PREFIX_HEX);
4435 break;
4436 }
4437 }
4438 else
4439 print_vma (entry->d_un.d_val, PREFIX_HEX);
4440
4441 putchar ('\n');
4442 }
4443 break;
4444
4445 case DT_PLTRELSZ:
4446 case DT_RELASZ :
4447 case DT_STRSZ :
4448 case DT_RELSZ :
4449 case DT_RELAENT :
4450 case DT_SYMENT :
4451 case DT_RELENT :
4452 case DT_PLTPADSZ:
4453 case DT_MOVEENT :
4454 case DT_MOVESZ :
4455 case DT_INIT_ARRAYSZ:
4456 case DT_FINI_ARRAYSZ:
4457 if (do_dynamic)
4458 {
4459 print_vma (entry->d_un.d_val, UNSIGNED);
4460 printf (" (bytes)\n");
4461 }
4462 break;
4463
4464 case DT_VERDEFNUM:
4465 case DT_VERNEEDNUM:
4466 case DT_RELACOUNT:
4467 case DT_RELCOUNT:
4468 if (do_dynamic)
4469 {
4470 print_vma (entry->d_un.d_val, UNSIGNED);
4471 putchar ('\n');
4472 }
4473 break;
4474
4475 case DT_SYMINSZ:
4476 case DT_SYMINENT:
4477 case DT_SYMINFO:
4478 case DT_USED:
4479 case DT_INIT_ARRAY:
4480 case DT_FINI_ARRAY:
4481 if (do_dynamic)
4482 {
4483 if (dynamic_strings != NULL && entry->d_tag == DT_USED)
4484 {
4485 char * name;
4486
4487 name = dynamic_strings + entry->d_un.d_val;
4488
4489 if (* name)
4490 {
4491 printf (_("Not needed object: [%s]\n"), name);
4492 break;
4493 }
4494 }
4495
4496 print_vma (entry->d_un.d_val, PREFIX_HEX);
4497 putchar ('\n');
4498 }
4499 break;
4500
4501 case DT_BIND_NOW:
4502 /* The value of this entry is ignored. */
4503 break;
4504
4505 default:
4506 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
4507 version_info [DT_VERSIONTAGIDX (entry->d_tag)] =
4508 entry->d_un.d_val;
4509
4510 if (do_dynamic)
4511 {
4512 switch (elf_header.e_machine)
4513 {
4514 case EM_MIPS:
4515 case EM_MIPS_RS3_LE:
4516 dynamic_segment_mips_val (entry);
4517 break;
4518 case EM_PARISC:
4519 dynamic_segment_parisc_val (entry);
4520 break;
4521 default:
4522 print_vma (entry->d_un.d_val, PREFIX_HEX);
4523 putchar ('\n');
4524 }
4525 }
4526 break;
4527 }
4528 }
4529
4530 return 1;
4531 }
4532
4533 static char *
4534 get_ver_flags (flags)
4535 unsigned int flags;
4536 {
4537 static char buff [32];
4538
4539 buff[0] = 0;
4540
4541 if (flags == 0)
4542 return _("none");
4543
4544 if (flags & VER_FLG_BASE)
4545 strcat (buff, "BASE ");
4546
4547 if (flags & VER_FLG_WEAK)
4548 {
4549 if (flags & VER_FLG_BASE)
4550 strcat (buff, "| ");
4551
4552 strcat (buff, "WEAK ");
4553 }
4554
4555 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK))
4556 strcat (buff, "| <unknown>");
4557
4558 return buff;
4559 }
4560
4561 /* Display the contents of the version sections. */
4562 static int
4563 process_version_sections (file)
4564 FILE * file;
4565 {
4566 Elf32_Internal_Shdr * section;
4567 unsigned i;
4568 int found = 0;
4569
4570 if (! do_version)
4571 return 1;
4572
4573 for (i = 0, section = section_headers;
4574 i < elf_header.e_shnum;
4575 i++, section ++)
4576 {
4577 switch (section->sh_type)
4578 {
4579 case SHT_GNU_verdef:
4580 {
4581 Elf_External_Verdef * edefs;
4582 unsigned int idx;
4583 unsigned int cnt;
4584
4585 found = 1;
4586
4587 printf
4588 (_("\nVersion definition section '%s' contains %ld entries:\n"),
4589 SECTION_NAME (section), section->sh_info);
4590
4591 printf (_(" Addr: 0x"));
4592 printf_vma (section->sh_addr);
4593 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
4594 (unsigned long) section->sh_offset, section->sh_link,
4595 SECTION_NAME (section_headers + section->sh_link));
4596
4597 edefs = ((Elf_External_Verdef *)
4598 get_data (NULL, file, section->sh_offset,
4599 section->sh_size,
4600 _("version definition section")));
4601 if (!edefs)
4602 break;
4603
4604 for (idx = cnt = 0; cnt < section->sh_info; ++ cnt)
4605 {
4606 char * vstart;
4607 Elf_External_Verdef * edef;
4608 Elf_Internal_Verdef ent;
4609 Elf_External_Verdaux * eaux;
4610 Elf_Internal_Verdaux aux;
4611 int j;
4612 int isum;
4613
4614 vstart = ((char *) edefs) + idx;
4615
4616 edef = (Elf_External_Verdef *) vstart;
4617
4618 ent.vd_version = BYTE_GET (edef->vd_version);
4619 ent.vd_flags = BYTE_GET (edef->vd_flags);
4620 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
4621 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
4622 ent.vd_hash = BYTE_GET (edef->vd_hash);
4623 ent.vd_aux = BYTE_GET (edef->vd_aux);
4624 ent.vd_next = BYTE_GET (edef->vd_next);
4625
4626 printf (_(" %#06x: Rev: %d Flags: %s"),
4627 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
4628
4629 printf (_(" Index: %d Cnt: %d "),
4630 ent.vd_ndx, ent.vd_cnt);
4631
4632 vstart += ent.vd_aux;
4633
4634 eaux = (Elf_External_Verdaux *) vstart;
4635
4636 aux.vda_name = BYTE_GET (eaux->vda_name);
4637 aux.vda_next = BYTE_GET (eaux->vda_next);
4638
4639 if (dynamic_strings)
4640 printf (_("Name: %s\n"), dynamic_strings + aux.vda_name);
4641 else
4642 printf (_("Name index: %ld\n"), aux.vda_name);
4643
4644 isum = idx + ent.vd_aux;
4645
4646 for (j = 1; j < ent.vd_cnt; j ++)
4647 {
4648 isum += aux.vda_next;
4649 vstart += aux.vda_next;
4650
4651 eaux = (Elf_External_Verdaux *) vstart;
4652
4653 aux.vda_name = BYTE_GET (eaux->vda_name);
4654 aux.vda_next = BYTE_GET (eaux->vda_next);
4655
4656 if (dynamic_strings)
4657 printf (_(" %#06x: Parent %d: %s\n"),
4658 isum, j, dynamic_strings + aux.vda_name);
4659 else
4660 printf (_(" %#06x: Parent %d, name index: %ld\n"),
4661 isum, j, aux.vda_name);
4662 }
4663
4664 idx += ent.vd_next;
4665 }
4666
4667 free (edefs);
4668 }
4669 break;
4670
4671 case SHT_GNU_verneed:
4672 {
4673 Elf_External_Verneed * eneed;
4674 unsigned int idx;
4675 unsigned int cnt;
4676
4677 found = 1;
4678
4679 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
4680 SECTION_NAME (section), section->sh_info);
4681
4682 printf (_(" Addr: 0x"));
4683 printf_vma (section->sh_addr);
4684 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
4685 (unsigned long) section->sh_offset, section->sh_link,
4686 SECTION_NAME (section_headers + section->sh_link));
4687
4688 eneed = ((Elf_External_Verneed *)
4689 get_data (NULL, file, section->sh_offset,
4690 section->sh_size, _("version need section")));
4691 if (!eneed)
4692 break;
4693
4694 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
4695 {
4696 Elf_External_Verneed * entry;
4697 Elf_Internal_Verneed ent;
4698 int j;
4699 int isum;
4700 char * vstart;
4701
4702 vstart = ((char *) eneed) + idx;
4703
4704 entry = (Elf_External_Verneed *) vstart;
4705
4706 ent.vn_version = BYTE_GET (entry->vn_version);
4707 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
4708 ent.vn_file = BYTE_GET (entry->vn_file);
4709 ent.vn_aux = BYTE_GET (entry->vn_aux);
4710 ent.vn_next = BYTE_GET (entry->vn_next);
4711
4712 printf (_(" %#06x: Version: %d"), idx, ent.vn_version);
4713
4714 if (dynamic_strings)
4715 printf (_(" File: %s"), dynamic_strings + ent.vn_file);
4716 else
4717 printf (_(" File: %lx"), ent.vn_file);
4718
4719 printf (_(" Cnt: %d\n"), ent.vn_cnt);
4720
4721 vstart += ent.vn_aux;
4722
4723 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
4724 {
4725 Elf_External_Vernaux * eaux;
4726 Elf_Internal_Vernaux aux;
4727
4728 eaux = (Elf_External_Vernaux *) vstart;
4729
4730 aux.vna_hash = BYTE_GET (eaux->vna_hash);
4731 aux.vna_flags = BYTE_GET (eaux->vna_flags);
4732 aux.vna_other = BYTE_GET (eaux->vna_other);
4733 aux.vna_name = BYTE_GET (eaux->vna_name);
4734 aux.vna_next = BYTE_GET (eaux->vna_next);
4735
4736 if (dynamic_strings)
4737 printf (_(" %#06x: Name: %s"),
4738 isum, dynamic_strings + aux.vna_name);
4739 else
4740 printf (_(" %#06x: Name index: %lx"),
4741 isum, aux.vna_name);
4742
4743 printf (_(" Flags: %s Version: %d\n"),
4744 get_ver_flags (aux.vna_flags), aux.vna_other);
4745
4746 isum += aux.vna_next;
4747 vstart += aux.vna_next;
4748 }
4749
4750 idx += ent.vn_next;
4751 }
4752
4753 free (eneed);
4754 }
4755 break;
4756
4757 case SHT_GNU_versym:
4758 {
4759 Elf32_Internal_Shdr * link_section;
4760 int total;
4761 int cnt;
4762 unsigned char * edata;
4763 unsigned short * data;
4764 char * strtab;
4765 Elf_Internal_Sym * symbols;
4766 Elf32_Internal_Shdr * string_sec;
4767
4768 link_section = section_headers + section->sh_link;
4769 total = section->sh_size / section->sh_entsize;
4770
4771 found = 1;
4772
4773 symbols = GET_ELF_SYMBOLS (file, link_section->sh_offset,
4774 link_section->sh_size / link_section->sh_entsize);
4775
4776 string_sec = section_headers + link_section->sh_link;
4777
4778 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
4779 string_sec->sh_size,
4780 _("version string table"));
4781 if (!strtab)
4782 break;
4783
4784 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
4785 SECTION_NAME (section), total);
4786
4787 printf (_(" Addr: "));
4788 printf_vma (section->sh_addr);
4789 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
4790 (unsigned long) section->sh_offset, section->sh_link,
4791 SECTION_NAME (link_section));
4792
4793 edata =
4794 ((unsigned char *)
4795 get_data (NULL, file,
4796 version_info[DT_VERSIONTAGIDX (DT_VERSYM)] - loadaddr,
4797 total * sizeof (short), _("version symbol data")));
4798 if (!edata)
4799 {
4800 free (strtab);
4801 break;
4802 }
4803
4804 data = (unsigned short *) malloc (total * sizeof (short));
4805
4806 for (cnt = total; cnt --;)
4807 data [cnt] = byte_get (edata + cnt * sizeof (short),
4808 sizeof (short));
4809
4810 free (edata);
4811
4812 for (cnt = 0; cnt < total; cnt += 4)
4813 {
4814 int j, nn;
4815 int check_def, check_need;
4816 char * name;
4817
4818 printf (" %03x:", cnt);
4819
4820 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
4821 switch (data [cnt + j])
4822 {
4823 case 0:
4824 fputs (_(" 0 (*local*) "), stdout);
4825 break;
4826
4827 case 1:
4828 fputs (_(" 1 (*global*) "), stdout);
4829 break;
4830
4831 default:
4832 nn = printf ("%4x%c", data [cnt + j] & 0x7fff,
4833 data [cnt + j] & 0x8000 ? 'h' : ' ');
4834
4835 check_def = 1;
4836 check_need = 1;
4837 if (symbols [cnt + j].st_shndx >= SHN_LORESERVE
4838 || section_headers[symbols [cnt + j].st_shndx].sh_type
4839 != SHT_NOBITS)
4840 {
4841 if (symbols [cnt + j].st_shndx == SHN_UNDEF)
4842 check_def = 0;
4843 else
4844 check_need = 0;
4845 }
4846
4847 if (check_need
4848 && version_info [DT_VERSIONTAGIDX (DT_VERNEED)])
4849 {
4850 Elf_Internal_Verneed ivn;
4851 unsigned long offset;
4852
4853 offset = version_info [DT_VERSIONTAGIDX (DT_VERNEED)]
4854 - loadaddr;
4855
4856 do
4857 {
4858 Elf_Internal_Vernaux ivna;
4859 Elf_External_Verneed evn;
4860 Elf_External_Vernaux evna;
4861 unsigned long a_off;
4862
4863 get_data (&evn, file, offset, sizeof (evn),
4864 _("version need"));
4865
4866 ivn.vn_aux = BYTE_GET (evn.vn_aux);
4867 ivn.vn_next = BYTE_GET (evn.vn_next);
4868
4869 a_off = offset + ivn.vn_aux;
4870
4871 do
4872 {
4873 get_data (&evna, file, a_off, sizeof (evna),
4874 _("version need aux (2)"));
4875
4876 ivna.vna_next = BYTE_GET (evna.vna_next);
4877 ivna.vna_other = BYTE_GET (evna.vna_other);
4878
4879 a_off += ivna.vna_next;
4880 }
4881 while (ivna.vna_other != data [cnt + j]
4882 && ivna.vna_next != 0);
4883
4884 if (ivna.vna_other == data [cnt + j])
4885 {
4886 ivna.vna_name = BYTE_GET (evna.vna_name);
4887
4888 name = strtab + ivna.vna_name;
4889 nn += printf ("(%s%-*s",
4890 name,
4891 12 - (int) strlen (name),
4892 ")");
4893 check_def = 0;
4894 break;
4895 }
4896
4897 offset += ivn.vn_next;
4898 }
4899 while (ivn.vn_next);
4900 }
4901
4902 if (check_def && data [cnt + j] != 0x8001
4903 && version_info [DT_VERSIONTAGIDX (DT_VERDEF)])
4904 {
4905 Elf_Internal_Verdef ivd;
4906 Elf_External_Verdef evd;
4907 unsigned long offset;
4908
4909 offset = version_info
4910 [DT_VERSIONTAGIDX (DT_VERDEF)] - loadaddr;
4911
4912 do
4913 {
4914 get_data (&evd, file, offset, sizeof (evd),
4915 _("version def"));
4916
4917 ivd.vd_next = BYTE_GET (evd.vd_next);
4918 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
4919
4920 offset += ivd.vd_next;
4921 }
4922 while (ivd.vd_ndx != (data [cnt + j] & 0x7fff)
4923 && ivd.vd_next != 0);
4924
4925 if (ivd.vd_ndx == (data [cnt + j] & 0x7fff))
4926 {
4927 Elf_External_Verdaux evda;
4928 Elf_Internal_Verdaux ivda;
4929
4930 ivd.vd_aux = BYTE_GET (evd.vd_aux);
4931
4932 get_data (&evda, file,
4933 offset - ivd.vd_next + ivd.vd_aux,
4934 sizeof (evda), _("version def aux"));
4935
4936 ivda.vda_name = BYTE_GET (evda.vda_name);
4937
4938 name = strtab + ivda.vda_name;
4939 nn += printf ("(%s%-*s",
4940 name,
4941 12 - (int) strlen (name),
4942 ")");
4943 }
4944 }
4945
4946 if (nn < 18)
4947 printf ("%*c", 18 - nn, ' ');
4948 }
4949
4950 putchar ('\n');
4951 }
4952
4953 free (data);
4954 free (strtab);
4955 free (symbols);
4956 }
4957 break;
4958
4959 default:
4960 break;
4961 }
4962 }
4963
4964 if (! found)
4965 printf (_("\nNo version information found in this file.\n"));
4966
4967 return 1;
4968 }
4969
4970 static const char *
4971 get_symbol_binding (binding)
4972 unsigned int binding;
4973 {
4974 static char buff [32];
4975
4976 switch (binding)
4977 {
4978 case STB_LOCAL: return "LOCAL";
4979 case STB_GLOBAL: return "GLOBAL";
4980 case STB_WEAK: return "WEAK";
4981 default:
4982 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
4983 sprintf (buff, _("<processor specific>: %d"), binding);
4984 else if (binding >= STB_LOOS && binding <= STB_HIOS)
4985 sprintf (buff, _("<OS specific>: %d"), binding);
4986 else
4987 sprintf (buff, _("<unknown>: %d"), binding);
4988 return buff;
4989 }
4990 }
4991
4992 static const char *
4993 get_symbol_type (type)
4994 unsigned int type;
4995 {
4996 static char buff [32];
4997
4998 switch (type)
4999 {
5000 case STT_NOTYPE: return "NOTYPE";
5001 case STT_OBJECT: return "OBJECT";
5002 case STT_FUNC: return "FUNC";
5003 case STT_SECTION: return "SECTION";
5004 case STT_FILE: return "FILE";
5005 case STT_COMMON: return "COMMON";
5006 default:
5007 if (type >= STT_LOPROC && type <= STT_HIPROC)
5008 {
5009 if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
5010 return "THUMB_FUNC";
5011
5012 if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
5013 return "REGISTER";
5014
5015 if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
5016 return "PARISC_MILLI";
5017
5018 sprintf (buff, _("<processor specific>: %d"), type);
5019 }
5020 else if (type >= STT_LOOS && type <= STT_HIOS)
5021 {
5022 if (elf_header.e_machine == EM_PARISC)
5023 {
5024 if (type == STT_HP_OPAQUE)
5025 return "HP_OPAQUE";
5026 if (type == STT_HP_STUB)
5027 return "HP_STUB";
5028 }
5029
5030 sprintf (buff, _("<OS specific>: %d"), type);
5031 }
5032 else
5033 sprintf (buff, _("<unknown>: %d"), type);
5034 return buff;
5035 }
5036 }
5037
5038 static const char *
5039 get_symbol_visibility (visibility)
5040 unsigned int visibility;
5041 {
5042 switch (visibility)
5043 {
5044 case STV_DEFAULT: return "DEFAULT";
5045 case STV_INTERNAL: return "INTERNAL";
5046 case STV_HIDDEN: return "HIDDEN";
5047 case STV_PROTECTED: return "PROTECTED";
5048 default: abort ();
5049 }
5050 }
5051
5052 static const char *
5053 get_symbol_index_type (type)
5054 unsigned int type;
5055 {
5056 switch (type)
5057 {
5058 case SHN_UNDEF: return "UND";
5059 case SHN_ABS: return "ABS";
5060 case SHN_COMMON: return "COM";
5061 default:
5062 if (type >= SHN_LOPROC && type <= SHN_HIPROC)
5063 return "PRC";
5064 else if (type >= SHN_LORESERVE && type <= SHN_HIRESERVE)
5065 return "RSV";
5066 else if (type >= SHN_LOOS && type <= SHN_HIOS)
5067 return "OS ";
5068 else
5069 {
5070 static char buff [32];
5071
5072 sprintf (buff, "%3d", type);
5073 return buff;
5074 }
5075 }
5076 }
5077
5078 static int *
5079 get_dynamic_data (file, number)
5080 FILE * file;
5081 unsigned int number;
5082 {
5083 unsigned char * e_data;
5084 int * i_data;
5085
5086 e_data = (unsigned char *) malloc (number * 4);
5087
5088 if (e_data == NULL)
5089 {
5090 error (_("Out of memory\n"));
5091 return NULL;
5092 }
5093
5094 if (fread (e_data, 4, number, file) != number)
5095 {
5096 error (_("Unable to read in dynamic data\n"));
5097 return NULL;
5098 }
5099
5100 i_data = (int *) malloc (number * sizeof (* i_data));
5101
5102 if (i_data == NULL)
5103 {
5104 error (_("Out of memory\n"));
5105 free (e_data);
5106 return NULL;
5107 }
5108
5109 while (number--)
5110 i_data [number] = byte_get (e_data + number * 4, 4);
5111
5112 free (e_data);
5113
5114 return i_data;
5115 }
5116
5117 /* Dump the symbol table. */
5118 static int
5119 process_symbol_table (file)
5120 FILE * file;
5121 {
5122 Elf32_Internal_Shdr * section;
5123 unsigned char nb [4];
5124 unsigned char nc [4];
5125 int nbuckets = 0;
5126 int nchains = 0;
5127 int * buckets = NULL;
5128 int * chains = NULL;
5129
5130 if (! do_syms && !do_histogram)
5131 return 1;
5132
5133 if (dynamic_info[DT_HASH] && ((do_using_dynamic && dynamic_strings != NULL)
5134 || do_histogram))
5135 {
5136 if (fseek (file, dynamic_info[DT_HASH] - loadaddr, SEEK_SET))
5137 {
5138 error (_("Unable to seek to start of dynamic information"));
5139 return 0;
5140 }
5141
5142 if (fread (nb, sizeof (nb), 1, file) != 1)
5143 {
5144 error (_("Failed to read in number of buckets\n"));
5145 return 0;
5146 }
5147
5148 if (fread (nc, sizeof (nc), 1, file) != 1)
5149 {
5150 error (_("Failed to read in number of chains\n"));
5151 return 0;
5152 }
5153
5154 nbuckets = byte_get (nb, 4);
5155 nchains = byte_get (nc, 4);
5156
5157 buckets = get_dynamic_data (file, nbuckets);
5158 chains = get_dynamic_data (file, nchains);
5159
5160 if (buckets == NULL || chains == NULL)
5161 return 0;
5162 }
5163
5164 if (do_syms
5165 && dynamic_info[DT_HASH] && do_using_dynamic && dynamic_strings != NULL)
5166 {
5167 int hn;
5168 int si;
5169
5170 printf (_("\nSymbol table for image:\n"));
5171 if (is_32bit_elf)
5172 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5173 else
5174 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5175
5176 for (hn = 0; hn < nbuckets; hn++)
5177 {
5178 if (! buckets [hn])
5179 continue;
5180
5181 for (si = buckets [hn]; si < nchains && si > 0; si = chains [si])
5182 {
5183 Elf_Internal_Sym * psym;
5184
5185 psym = dynamic_symbols + si;
5186
5187 printf (" %3d %3d: ", si, hn);
5188 print_vma (psym->st_value, LONG_HEX);
5189 putchar (' ' );
5190 print_vma (psym->st_size, DEC_5);
5191
5192 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
5193 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
5194 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
5195 printf (" %3.3s", get_symbol_index_type (psym->st_shndx));
5196 printf (" %s\n", dynamic_strings + psym->st_name);
5197 }
5198 }
5199 }
5200 else if (do_syms && !do_using_dynamic)
5201 {
5202 unsigned int i;
5203
5204 for (i = 0, section = section_headers;
5205 i < elf_header.e_shnum;
5206 i++, section++)
5207 {
5208 unsigned int si;
5209 char * strtab;
5210 Elf_Internal_Sym * symtab;
5211 Elf_Internal_Sym * psym;
5212
5213
5214 if ( section->sh_type != SHT_SYMTAB
5215 && section->sh_type != SHT_DYNSYM)
5216 continue;
5217
5218 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
5219 SECTION_NAME (section),
5220 (unsigned long) (section->sh_size / section->sh_entsize));
5221 if (is_32bit_elf)
5222 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5223 else
5224 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5225
5226 symtab = GET_ELF_SYMBOLS (file, section->sh_offset,
5227 section->sh_size / section->sh_entsize);
5228 if (symtab == NULL)
5229 continue;
5230
5231 if (section->sh_link == elf_header.e_shstrndx)
5232 strtab = string_table;
5233 else
5234 {
5235 Elf32_Internal_Shdr * string_sec;
5236
5237 string_sec = section_headers + section->sh_link;
5238
5239 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
5240 string_sec->sh_size,
5241 _("string table"));
5242 }
5243
5244 for (si = 0, psym = symtab;
5245 si < section->sh_size / section->sh_entsize;
5246 si ++, psym ++)
5247 {
5248 printf ("%6d: ", si);
5249 print_vma (psym->st_value, LONG_HEX);
5250 putchar (' ');
5251 print_vma (psym->st_size, DEC_5);
5252 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
5253 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
5254 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
5255 printf (" %4s", get_symbol_index_type (psym->st_shndx));
5256 printf (" %s", strtab + psym->st_name);
5257
5258 if (section->sh_type == SHT_DYNSYM &&
5259 version_info [DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
5260 {
5261 unsigned char data[2];
5262 unsigned short vers_data;
5263 unsigned long offset;
5264 int is_nobits;
5265 int check_def;
5266
5267 offset = version_info [DT_VERSIONTAGIDX (DT_VERSYM)]
5268 - loadaddr;
5269
5270 get_data (&data, file, offset + si * sizeof (vers_data),
5271 sizeof (data), _("version data"));
5272
5273 vers_data = byte_get (data, 2);
5274
5275 is_nobits = psym->st_shndx < SHN_LORESERVE ?
5276 (section_headers [psym->st_shndx].sh_type == SHT_NOBITS)
5277 : 0;
5278
5279 check_def = (psym->st_shndx != SHN_UNDEF);
5280
5281 if ((vers_data & 0x8000) || vers_data > 1)
5282 {
5283 if (version_info [DT_VERSIONTAGIDX (DT_VERNEED)]
5284 && (is_nobits || ! check_def))
5285 {
5286 Elf_External_Verneed evn;
5287 Elf_Internal_Verneed ivn;
5288 Elf_Internal_Vernaux ivna;
5289
5290 /* We must test both. */
5291 offset = version_info
5292 [DT_VERSIONTAGIDX (DT_VERNEED)] - loadaddr;
5293
5294 do
5295 {
5296 unsigned long vna_off;
5297
5298 get_data (&evn, file, offset, sizeof (evn),
5299 _("version need"));
5300
5301 ivn.vn_aux = BYTE_GET (evn.vn_aux);
5302 ivn.vn_next = BYTE_GET (evn.vn_next);
5303
5304 vna_off = offset + ivn.vn_aux;
5305
5306 do
5307 {
5308 Elf_External_Vernaux evna;
5309
5310 get_data (&evna, file, vna_off,
5311 sizeof (evna),
5312 _("version need aux (3)"));
5313
5314 ivna.vna_other = BYTE_GET (evna.vna_other);
5315 ivna.vna_next = BYTE_GET (evna.vna_next);
5316 ivna.vna_name = BYTE_GET (evna.vna_name);
5317
5318 vna_off += ivna.vna_next;
5319 }
5320 while (ivna.vna_other != vers_data
5321 && ivna.vna_next != 0);
5322
5323 if (ivna.vna_other == vers_data)
5324 break;
5325
5326 offset += ivn.vn_next;
5327 }
5328 while (ivn.vn_next != 0);
5329
5330 if (ivna.vna_other == vers_data)
5331 {
5332 printf ("@%s (%d)",
5333 strtab + ivna.vna_name, ivna.vna_other);
5334 check_def = 0;
5335 }
5336 else if (! is_nobits)
5337 error (_("bad dynamic symbol"));
5338 else
5339 check_def = 1;
5340 }
5341
5342 if (check_def)
5343 {
5344 if (vers_data != 0x8001
5345 && version_info [DT_VERSIONTAGIDX (DT_VERDEF)])
5346 {
5347 Elf_Internal_Verdef ivd;
5348 Elf_Internal_Verdaux ivda;
5349 Elf_External_Verdaux evda;
5350 unsigned long offset;
5351
5352 offset =
5353 version_info [DT_VERSIONTAGIDX (DT_VERDEF)]
5354 - loadaddr;
5355
5356 do
5357 {
5358 Elf_External_Verdef evd;
5359
5360 get_data (&evd, file, offset, sizeof (evd),
5361 _("version def"));
5362
5363 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
5364 ivd.vd_aux = BYTE_GET (evd.vd_aux);
5365 ivd.vd_next = BYTE_GET (evd.vd_next);
5366
5367 offset += ivd.vd_next;
5368 }
5369 while (ivd.vd_ndx != (vers_data & 0x7fff)
5370 && ivd.vd_next != 0);
5371
5372 offset -= ivd.vd_next;
5373 offset += ivd.vd_aux;
5374
5375 get_data (&evda, file, offset, sizeof (evda),
5376 _("version def aux"));
5377
5378 ivda.vda_name = BYTE_GET (evda.vda_name);
5379
5380 if (psym->st_name != ivda.vda_name)
5381 printf ((vers_data & 0x8000)
5382 ? "@%s" : "@@%s",
5383 strtab + ivda.vda_name);
5384 }
5385 }
5386 }
5387 }
5388
5389 putchar ('\n');
5390 }
5391
5392 free (symtab);
5393 if (strtab != string_table)
5394 free (strtab);
5395 }
5396 }
5397 else if (do_syms)
5398 printf
5399 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
5400
5401 if (do_histogram && buckets != NULL)
5402 {
5403 int * lengths;
5404 int * counts;
5405 int hn;
5406 int si;
5407 int maxlength = 0;
5408 int nzero_counts = 0;
5409 int nsyms = 0;
5410
5411 printf (_("\nHistogram for bucket list length (total of %d buckets):\n"),
5412 nbuckets);
5413 printf (_(" Length Number %% of total Coverage\n"));
5414
5415 lengths = (int *) calloc (nbuckets, sizeof (int));
5416 if (lengths == NULL)
5417 {
5418 error (_("Out of memory"));
5419 return 0;
5420 }
5421 for (hn = 0; hn < nbuckets; ++hn)
5422 {
5423 if (! buckets [hn])
5424 continue;
5425
5426 for (si = buckets[hn]; si > 0 && si < nchains; si = chains[si])
5427 {
5428 ++ nsyms;
5429 if (maxlength < ++lengths[hn])
5430 ++ maxlength;
5431 }
5432 }
5433
5434 counts = (int *) calloc (maxlength + 1, sizeof (int));
5435 if (counts == NULL)
5436 {
5437 error (_("Out of memory"));
5438 return 0;
5439 }
5440
5441 for (hn = 0; hn < nbuckets; ++hn)
5442 ++ counts [lengths [hn]];
5443
5444 if (nbuckets > 0)
5445 {
5446 printf (" 0 %-10d (%5.1f%%)\n",
5447 counts[0], (counts[0] * 100.0) / nbuckets);
5448 for (si = 1; si <= maxlength; ++si)
5449 {
5450 nzero_counts += counts[si] * si;
5451 printf ("%7d %-10d (%5.1f%%) %5.1f%%\n",
5452 si, counts[si], (counts[si] * 100.0) / nbuckets,
5453 (nzero_counts * 100.0) / nsyms);
5454 }
5455 }
5456
5457 free (counts);
5458 free (lengths);
5459 }
5460
5461 if (buckets != NULL)
5462 {
5463 free (buckets);
5464 free (chains);
5465 }
5466
5467 return 1;
5468 }
5469
5470 static int
5471 process_syminfo (file)
5472 FILE * file ATTRIBUTE_UNUSED;
5473 {
5474 unsigned int i;
5475
5476 if (dynamic_syminfo == NULL
5477 || !do_dynamic)
5478 /* No syminfo, this is ok. */
5479 return 1;
5480
5481 /* There better should be a dynamic symbol section. */
5482 if (dynamic_symbols == NULL || dynamic_strings == NULL)
5483 return 0;
5484
5485 if (dynamic_addr)
5486 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
5487 dynamic_syminfo_offset, dynamic_syminfo_nent);
5488
5489 printf (_(" Num: Name BoundTo Flags\n"));
5490 for (i = 0; i < dynamic_syminfo_nent; ++i)
5491 {
5492 unsigned short int flags = dynamic_syminfo[i].si_flags;
5493
5494 printf ("%4d: %-30s ", i,
5495 dynamic_strings + dynamic_symbols[i].st_name);
5496
5497 switch (dynamic_syminfo[i].si_boundto)
5498 {
5499 case SYMINFO_BT_SELF:
5500 fputs ("SELF ", stdout);
5501 break;
5502 case SYMINFO_BT_PARENT:
5503 fputs ("PARENT ", stdout);
5504 break;
5505 default:
5506 if (dynamic_syminfo[i].si_boundto > 0
5507 && dynamic_syminfo[i].si_boundto < dynamic_size)
5508 printf ("%-10s ",
5509 dynamic_strings
5510 + dynamic_segment[dynamic_syminfo[i].si_boundto].d_un.d_val);
5511 else
5512 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
5513 break;
5514 }
5515
5516 if (flags & SYMINFO_FLG_DIRECT)
5517 printf (" DIRECT");
5518 if (flags & SYMINFO_FLG_PASSTHRU)
5519 printf (" PASSTHRU");
5520 if (flags & SYMINFO_FLG_COPY)
5521 printf (" COPY");
5522 if (flags & SYMINFO_FLG_LAZYLOAD)
5523 printf (" LAZYLOAD");
5524
5525 puts ("");
5526 }
5527
5528 return 1;
5529 }
5530
5531 #ifdef SUPPORT_DISASSEMBLY
5532 static void
5533 disassemble_section (section, file)
5534 Elf32_Internal_Shdr * section;
5535 FILE * file;
5536 {
5537 printf (_("\nAssembly dump of section %s\n"),
5538 SECTION_NAME (section));
5539
5540 /* XXX -- to be done --- XXX */
5541
5542 return 1;
5543 }
5544 #endif
5545
5546 static int
5547 dump_section (section, file)
5548 Elf32_Internal_Shdr * section;
5549 FILE * file;
5550 {
5551 bfd_size_type bytes;
5552 bfd_vma addr;
5553 unsigned char * data;
5554 unsigned char * start;
5555
5556 bytes = section->sh_size;
5557
5558 if (bytes == 0)
5559 {
5560 printf (_("\nSection '%s' has no data to dump.\n"),
5561 SECTION_NAME (section));
5562 return 0;
5563 }
5564 else
5565 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section));
5566
5567 addr = section->sh_addr;
5568
5569 start = (unsigned char *) get_data (NULL, file, section->sh_offset, bytes,
5570 _("section data"));
5571 if (!start)
5572 return 0;
5573
5574 data = start;
5575
5576 while (bytes)
5577 {
5578 int j;
5579 int k;
5580 int lbytes;
5581
5582 lbytes = (bytes > 16 ? 16 : bytes);
5583
5584 printf (" 0x%8.8lx ", (unsigned long) addr);
5585
5586 switch (elf_header.e_ident [EI_DATA])
5587 {
5588 default:
5589 case ELFDATA2LSB:
5590 for (j = 15; j >= 0; j --)
5591 {
5592 if (j < lbytes)
5593 printf ("%2.2x", data [j]);
5594 else
5595 printf (" ");
5596
5597 if (!(j & 0x3))
5598 printf (" ");
5599 }
5600 break;
5601
5602 case ELFDATA2MSB:
5603 for (j = 0; j < 16; j++)
5604 {
5605 if (j < lbytes)
5606 printf ("%2.2x", data [j]);
5607 else
5608 printf (" ");
5609
5610 if ((j & 3) == 3)
5611 printf (" ");
5612 }
5613 break;
5614 }
5615
5616 for (j = 0; j < lbytes; j++)
5617 {
5618 k = data [j];
5619 if (k >= ' ' && k < 0x80)
5620 printf ("%c", k);
5621 else
5622 printf (".");
5623 }
5624
5625 putchar ('\n');
5626
5627 data += lbytes;
5628 addr += lbytes;
5629 bytes -= lbytes;
5630 }
5631
5632 free (start);
5633
5634 return 1;
5635 }
5636
5637
5638 static unsigned long int
5639 read_leb128 (data, length_return, sign)
5640 unsigned char * data;
5641 int * length_return;
5642 int sign;
5643 {
5644 unsigned long int result = 0;
5645 unsigned int num_read = 0;
5646 int shift = 0;
5647 unsigned char byte;
5648
5649 do
5650 {
5651 byte = * data ++;
5652 num_read ++;
5653
5654 result |= (byte & 0x7f) << shift;
5655
5656 shift += 7;
5657
5658 }
5659 while (byte & 0x80);
5660
5661 if (length_return != NULL)
5662 * length_return = num_read;
5663
5664 if (sign && (shift < 32) && (byte & 0x40))
5665 result |= -1 << shift;
5666
5667 return result;
5668 }
5669
5670 typedef struct State_Machine_Registers
5671 {
5672 unsigned long address;
5673 unsigned int file;
5674 unsigned int line;
5675 unsigned int column;
5676 int is_stmt;
5677 int basic_block;
5678 int end_sequence;
5679 /* This variable hold the number of the last entry seen
5680 in the File Table. */
5681 unsigned int last_file_entry;
5682 } SMR;
5683
5684 static SMR state_machine_regs;
5685
5686 static void
5687 reset_state_machine (is_stmt)
5688 int is_stmt;
5689 {
5690 state_machine_regs.address = 0;
5691 state_machine_regs.file = 1;
5692 state_machine_regs.line = 1;
5693 state_machine_regs.column = 0;
5694 state_machine_regs.is_stmt = is_stmt;
5695 state_machine_regs.basic_block = 0;
5696 state_machine_regs.end_sequence = 0;
5697 state_machine_regs.last_file_entry = 0;
5698 }
5699
5700 /* Handled an extend line op. Returns true if this is the end
5701 of sequence. */
5702 static int
5703 process_extended_line_op (data, is_stmt, pointer_size)
5704 unsigned char * data;
5705 int is_stmt;
5706 int pointer_size;
5707 {
5708 unsigned char op_code;
5709 int bytes_read;
5710 unsigned int len;
5711 unsigned char * name;
5712 unsigned long adr;
5713
5714 len = read_leb128 (data, & bytes_read, 0);
5715 data += bytes_read;
5716
5717 if (len == 0)
5718 {
5719 warn (_("badly formed extended line op encountered!\n"));
5720 return bytes_read;
5721 }
5722
5723 len += bytes_read;
5724 op_code = * data ++;
5725
5726 printf (_(" Extended opcode %d: "), op_code);
5727
5728 switch (op_code)
5729 {
5730 case DW_LNE_end_sequence:
5731 printf (_("End of Sequence\n\n"));
5732 reset_state_machine (is_stmt);
5733 break;
5734
5735 case DW_LNE_set_address:
5736 adr = byte_get (data, pointer_size);
5737 printf (_("set Address to 0x%lx\n"), adr);
5738 state_machine_regs.address = adr;
5739 break;
5740
5741 case DW_LNE_define_file:
5742 printf (_(" define new File Table entry\n"));
5743 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
5744
5745 printf (_(" %d\t"), ++ state_machine_regs.last_file_entry);
5746 name = data;
5747 data += strlen ((char *) data) + 1;
5748 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5749 data += bytes_read;
5750 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5751 data += bytes_read;
5752 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5753 printf (_("%s\n\n"), name);
5754 break;
5755
5756 default:
5757 printf (_("UNKNOWN: length %d\n"), len - bytes_read);
5758 break;
5759 }
5760
5761 return len;
5762 }
5763
5764 /* Size of pointers in the .debug_line section. This information is not
5765 really present in that section. It's obtained before dumping the debug
5766 sections by doing some pre-scan of the .debug_info section. */
5767 static int debug_line_pointer_size = 4;
5768
5769 static int
5770 display_debug_lines (section, start, file)
5771 Elf32_Internal_Shdr * section;
5772 unsigned char * start;
5773 FILE * file ATTRIBUTE_UNUSED;
5774 {
5775 DWARF2_External_LineInfo * external;
5776 DWARF2_Internal_LineInfo info;
5777 unsigned char * standard_opcodes;
5778 unsigned char * data = start;
5779 unsigned char * end = start + section->sh_size;
5780 unsigned char * end_of_sequence;
5781 int i;
5782
5783 printf (_("\nDump of debug contents of section %s:\n\n"),
5784 SECTION_NAME (section));
5785
5786 while (data < end)
5787 {
5788 external = (DWARF2_External_LineInfo *) data;
5789
5790 /* Check the length of the block. */
5791 info.li_length = BYTE_GET (external->li_length);
5792
5793 if (info.li_length == 0xffffffff)
5794 {
5795 warn (_("64-bit DWARF line info is not supported yet.\n"));
5796 break;
5797 }
5798
5799 if (info.li_length + sizeof (external->li_length) > section->sh_size)
5800 {
5801 warn
5802 (_("The line info appears to be corrupt - the section is too small\n"));
5803 return 0;
5804 }
5805
5806 /* Check its version number. */
5807 info.li_version = BYTE_GET (external->li_version);
5808 if (info.li_version != 2)
5809 {
5810 warn (_("Only DWARF version 2 line info is currently supported.\n"));
5811 return 0;
5812 }
5813
5814 info.li_prologue_length = BYTE_GET (external->li_prologue_length);
5815 info.li_min_insn_length = BYTE_GET (external->li_min_insn_length);
5816 info.li_default_is_stmt = BYTE_GET (external->li_default_is_stmt);
5817 info.li_line_base = BYTE_GET (external->li_line_base);
5818 info.li_line_range = BYTE_GET (external->li_line_range);
5819 info.li_opcode_base = BYTE_GET (external->li_opcode_base);
5820
5821 /* Sign extend the line base field. */
5822 info.li_line_base <<= 24;
5823 info.li_line_base >>= 24;
5824
5825 printf (_(" Length: %ld\n"), info.li_length);
5826 printf (_(" DWARF Version: %d\n"), info.li_version);
5827 printf (_(" Prologue Length: %d\n"), info.li_prologue_length);
5828 printf (_(" Minimum Instruction Length: %d\n"), info.li_min_insn_length);
5829 printf (_(" Initial value of 'is_stmt': %d\n"), info.li_default_is_stmt);
5830 printf (_(" Line Base: %d\n"), info.li_line_base);
5831 printf (_(" Line Range: %d\n"), info.li_line_range);
5832 printf (_(" Opcode Base: %d\n"), info.li_opcode_base);
5833
5834 end_of_sequence = data + info.li_length + sizeof (external->li_length);
5835
5836 reset_state_machine (info.li_default_is_stmt);
5837
5838 /* Display the contents of the Opcodes table. */
5839 standard_opcodes = data + sizeof (* external);
5840
5841 printf (_("\n Opcodes:\n"));
5842
5843 for (i = 1; i < info.li_opcode_base; i++)
5844 printf (_(" Opcode %d has %d args\n"), i, standard_opcodes[i - 1]);
5845
5846 /* Display the contents of the Directory table. */
5847 data = standard_opcodes + info.li_opcode_base - 1;
5848
5849 if (* data == 0)
5850 printf (_("\n The Directory Table is empty.\n"));
5851 else
5852 {
5853 printf (_("\n The Directory Table:\n"));
5854
5855 while (* data != 0)
5856 {
5857 printf (_(" %s\n"), data);
5858
5859 data += strlen ((char *) data) + 1;
5860 }
5861 }
5862
5863 /* Skip the NUL at the end of the table. */
5864 data ++;
5865
5866 /* Display the contents of the File Name table. */
5867 if (* data == 0)
5868 printf (_("\n The File Name Table is empty.\n"));
5869 else
5870 {
5871 printf (_("\n The File Name Table:\n"));
5872 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
5873
5874 while (* data != 0)
5875 {
5876 unsigned char * name;
5877 int bytes_read;
5878
5879 printf (_(" %d\t"), ++ state_machine_regs.last_file_entry);
5880 name = data;
5881
5882 data += strlen ((char *) data) + 1;
5883
5884 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5885 data += bytes_read;
5886 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5887 data += bytes_read;
5888 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
5889 data += bytes_read;
5890 printf (_("%s\n"), name);
5891 }
5892 }
5893
5894 /* Skip the NUL at the end of the table. */
5895 data ++;
5896
5897 /* Now display the statements. */
5898 printf (_("\n Line Number Statements:\n"));
5899
5900
5901 while (data < end_of_sequence)
5902 {
5903 unsigned char op_code;
5904 int adv;
5905 int bytes_read;
5906
5907 op_code = * data ++;
5908
5909 if (op_code >= info.li_opcode_base)
5910 {
5911 op_code -= info.li_opcode_base;
5912 adv = (op_code / info.li_line_range) * info.li_min_insn_length;
5913 state_machine_regs.address += adv;
5914 printf (_(" Special opcode %d: advance Address by %d to 0x%lx"),
5915 op_code, adv, state_machine_regs.address);
5916 adv = (op_code % info.li_line_range) + info.li_line_base;
5917 state_machine_regs.line += adv;
5918 printf (_(" and Line by %d to %d\n"),
5919 adv, state_machine_regs.line);
5920 }
5921 else switch (op_code)
5922 {
5923 case DW_LNS_extended_op:
5924 data += process_extended_line_op (data, info.li_default_is_stmt,
5925 debug_line_pointer_size);
5926 break;
5927
5928 case DW_LNS_copy:
5929 printf (_(" Copy\n"));
5930 break;
5931
5932 case DW_LNS_advance_pc:
5933 adv = info.li_min_insn_length * read_leb128 (data, & bytes_read, 0);
5934 data += bytes_read;
5935 state_machine_regs.address += adv;
5936 printf (_(" Advance PC by %d to %lx\n"), adv,
5937 state_machine_regs.address);
5938 break;
5939
5940 case DW_LNS_advance_line:
5941 adv = read_leb128 (data, & bytes_read, 1);
5942 data += bytes_read;
5943 state_machine_regs.line += adv;
5944 printf (_(" Advance Line by %d to %d\n"), adv,
5945 state_machine_regs.line);
5946 break;
5947
5948 case DW_LNS_set_file:
5949 adv = read_leb128 (data, & bytes_read, 0);
5950 data += bytes_read;
5951 printf (_(" Set File Name to entry %d in the File Name Table\n"),
5952 adv);
5953 state_machine_regs.file = adv;
5954 break;
5955
5956 case DW_LNS_set_column:
5957 adv = read_leb128 (data, & bytes_read, 0);
5958 data += bytes_read;
5959 printf (_(" Set column to %d\n"), adv);
5960 state_machine_regs.column = adv;
5961 break;
5962
5963 case DW_LNS_negate_stmt:
5964 adv = state_machine_regs.is_stmt;
5965 adv = ! adv;
5966 printf (_(" Set is_stmt to %d\n"), adv);
5967 state_machine_regs.is_stmt = adv;
5968 break;
5969
5970 case DW_LNS_set_basic_block:
5971 printf (_(" Set basic block\n"));
5972 state_machine_regs.basic_block = 1;
5973 break;
5974
5975 case DW_LNS_const_add_pc:
5976 adv = (((255 - info.li_opcode_base) / info.li_line_range)
5977 * info.li_min_insn_length);
5978 state_machine_regs.address += adv;
5979 printf (_(" Advance PC by constant %d to 0x%lx\n"), adv,
5980 state_machine_regs.address);
5981 break;
5982
5983 case DW_LNS_fixed_advance_pc:
5984 adv = byte_get (data, 2);
5985 data += 2;
5986 state_machine_regs.address += adv;
5987 printf (_(" Advance PC by fixed size amount %d to 0x%lx\n"),
5988 adv, state_machine_regs.address);
5989 break;
5990
5991 case DW_LNS_set_prologue_end:
5992 printf (_(" Set prologue_end to true\n"));
5993 break;
5994
5995 case DW_LNS_set_epilogue_begin:
5996 printf (_(" Set epilogue_begin to true\n"));
5997 break;
5998
5999 case DW_LNS_set_isa:
6000 adv = read_leb128 (data, & bytes_read, 0);
6001 data += bytes_read;
6002 printf (_(" Set ISA to %d\n"), adv);
6003 break;
6004
6005 default:
6006 printf (_(" Unknown opcode %d with operands: "), op_code);
6007 {
6008 int i;
6009 for (i = standard_opcodes[op_code - 1]; i > 0 ; --i)
6010 {
6011 printf ("0x%lx%s", read_leb128 (data, &bytes_read, 0),
6012 i == 1 ? "" : ", ");
6013 data += bytes_read;
6014 }
6015 putchar ('\n');
6016 }
6017 break;
6018 }
6019 }
6020 putchar ('\n');
6021 }
6022
6023 return 1;
6024 }
6025
6026 static int
6027 display_debug_pubnames (section, start, file)
6028 Elf32_Internal_Shdr * section;
6029 unsigned char * start;
6030 FILE * file ATTRIBUTE_UNUSED;
6031 {
6032 DWARF2_External_PubNames * external;
6033 DWARF2_Internal_PubNames pubnames;
6034 unsigned char * end;
6035
6036 end = start + section->sh_size;
6037
6038 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
6039
6040 while (start < end)
6041 {
6042 unsigned char * data;
6043 unsigned long offset;
6044
6045 external = (DWARF2_External_PubNames *) start;
6046
6047 pubnames.pn_length = BYTE_GET (external->pn_length);
6048 pubnames.pn_version = BYTE_GET (external->pn_version);
6049 pubnames.pn_offset = BYTE_GET (external->pn_offset);
6050 pubnames.pn_size = BYTE_GET (external->pn_size);
6051
6052 data = start + sizeof (* external);
6053 start += pubnames.pn_length + sizeof (external->pn_length);
6054
6055 if (pubnames.pn_length == 0xffffffff)
6056 {
6057 warn (_("64-bit DWARF pubnames are not supported yet.\n"));
6058 break;
6059 }
6060
6061 if (pubnames.pn_version != 2)
6062 {
6063 static int warned = 0;
6064
6065 if (! warned)
6066 {
6067 warn (_("Only DWARF 2 pubnames are currently supported\n"));
6068 warned = 1;
6069 }
6070
6071 continue;
6072 }
6073
6074 printf (_(" Length: %ld\n"),
6075 pubnames.pn_length);
6076 printf (_(" Version: %d\n"),
6077 pubnames.pn_version);
6078 printf (_(" Offset into .debug_info section: %ld\n"),
6079 pubnames.pn_offset);
6080 printf (_(" Size of area in .debug_info section: %ld\n"),
6081 pubnames.pn_size);
6082
6083 printf (_("\n Offset\tName\n"));
6084
6085 do
6086 {
6087 offset = byte_get (data, 4);
6088
6089 if (offset != 0)
6090 {
6091 data += 4;
6092 printf (" %ld\t\t%s\n", offset, data);
6093 data += strlen ((char *) data) + 1;
6094 }
6095 }
6096 while (offset != 0);
6097 }
6098
6099 printf ("\n");
6100 return 1;
6101 }
6102
6103 static char *
6104 get_TAG_name (tag)
6105 unsigned long tag;
6106 {
6107 switch (tag)
6108 {
6109 case DW_TAG_padding: return "DW_TAG_padding";
6110 case DW_TAG_array_type: return "DW_TAG_array_type";
6111 case DW_TAG_class_type: return "DW_TAG_class_type";
6112 case DW_TAG_entry_point: return "DW_TAG_entry_point";
6113 case DW_TAG_enumeration_type: return "DW_TAG_enumeration_type";
6114 case DW_TAG_formal_parameter: return "DW_TAG_formal_parameter";
6115 case DW_TAG_imported_declaration: return "DW_TAG_imported_declaration";
6116 case DW_TAG_label: return "DW_TAG_label";
6117 case DW_TAG_lexical_block: return "DW_TAG_lexical_block";
6118 case DW_TAG_member: return "DW_TAG_member";
6119 case DW_TAG_pointer_type: return "DW_TAG_pointer_type";
6120 case DW_TAG_reference_type: return "DW_TAG_reference_type";
6121 case DW_TAG_compile_unit: return "DW_TAG_compile_unit";
6122 case DW_TAG_string_type: return "DW_TAG_string_type";
6123 case DW_TAG_structure_type: return "DW_TAG_structure_type";
6124 case DW_TAG_subroutine_type: return "DW_TAG_subroutine_type";
6125 case DW_TAG_typedef: return "DW_TAG_typedef";
6126 case DW_TAG_union_type: return "DW_TAG_union_type";
6127 case DW_TAG_unspecified_parameters: return "DW_TAG_unspecified_parameters";
6128 case DW_TAG_variant: return "DW_TAG_variant";
6129 case DW_TAG_common_block: return "DW_TAG_common_block";
6130 case DW_TAG_common_inclusion: return "DW_TAG_common_inclusion";
6131 case DW_TAG_inheritance: return "DW_TAG_inheritance";
6132 case DW_TAG_inlined_subroutine: return "DW_TAG_inlined_subroutine";
6133 case DW_TAG_module: return "DW_TAG_module";
6134 case DW_TAG_ptr_to_member_type: return "DW_TAG_ptr_to_member_type";
6135 case DW_TAG_set_type: return "DW_TAG_set_type";
6136 case DW_TAG_subrange_type: return "DW_TAG_subrange_type";
6137 case DW_TAG_with_stmt: return "DW_TAG_with_stmt";
6138 case DW_TAG_access_declaration: return "DW_TAG_access_declaration";
6139 case DW_TAG_base_type: return "DW_TAG_base_type";
6140 case DW_TAG_catch_block: return "DW_TAG_catch_block";
6141 case DW_TAG_const_type: return "DW_TAG_const_type";
6142 case DW_TAG_constant: return "DW_TAG_constant";
6143 case DW_TAG_enumerator: return "DW_TAG_enumerator";
6144 case DW_TAG_file_type: return "DW_TAG_file_type";
6145 case DW_TAG_friend: return "DW_TAG_friend";
6146 case DW_TAG_namelist: return "DW_TAG_namelist";
6147 case DW_TAG_namelist_item: return "DW_TAG_namelist_item";
6148 case DW_TAG_packed_type: return "DW_TAG_packed_type";
6149 case DW_TAG_subprogram: return "DW_TAG_subprogram";
6150 case DW_TAG_template_type_param: return "DW_TAG_template_type_param";
6151 case DW_TAG_template_value_param: return "DW_TAG_template_value_param";
6152 case DW_TAG_thrown_type: return "DW_TAG_thrown_type";
6153 case DW_TAG_try_block: return "DW_TAG_try_block";
6154 case DW_TAG_variant_part: return "DW_TAG_variant_part";
6155 case DW_TAG_variable: return "DW_TAG_variable";
6156 case DW_TAG_volatile_type: return "DW_TAG_volatile_type";
6157 case DW_TAG_MIPS_loop: return "DW_TAG_MIPS_loop";
6158 case DW_TAG_format_label: return "DW_TAG_format_label";
6159 case DW_TAG_function_template: return "DW_TAG_function_template";
6160 case DW_TAG_class_template: return "DW_TAG_class_template";
6161 /* DWARF 2.1 values. */
6162 case DW_TAG_dwarf_procedure: return "DW_TAG_dwarf_procedure";
6163 case DW_TAG_restrict_type: return "DW_TAG_restrict_type";
6164 case DW_TAG_interface_type: return "DW_TAG_interface_type";
6165 case DW_TAG_namespace: return "DW_TAG_namespace";
6166 case DW_TAG_imported_module: return "DW_TAG_imported_module";
6167 case DW_TAG_unspecified_type: return "DW_TAG_unspecified_type";
6168 case DW_TAG_partial_unit: return "DW_TAG_partial_unit";
6169 case DW_TAG_imported_unit: return "DW_TAG_imported_unit";
6170 default:
6171 {
6172 static char buffer [100];
6173
6174 sprintf (buffer, _("Unknown TAG value: %lx"), tag);
6175 return buffer;
6176 }
6177 }
6178 }
6179
6180 static char *
6181 get_AT_name (attribute)
6182 unsigned long attribute;
6183 {
6184 switch (attribute)
6185 {
6186 case DW_AT_sibling: return "DW_AT_sibling";
6187 case DW_AT_location: return "DW_AT_location";
6188 case DW_AT_name: return "DW_AT_name";
6189 case DW_AT_ordering: return "DW_AT_ordering";
6190 case DW_AT_subscr_data: return "DW_AT_subscr_data";
6191 case DW_AT_byte_size: return "DW_AT_byte_size";
6192 case DW_AT_bit_offset: return "DW_AT_bit_offset";
6193 case DW_AT_bit_size: return "DW_AT_bit_size";
6194 case DW_AT_element_list: return "DW_AT_element_list";
6195 case DW_AT_stmt_list: return "DW_AT_stmt_list";
6196 case DW_AT_low_pc: return "DW_AT_low_pc";
6197 case DW_AT_high_pc: return "DW_AT_high_pc";
6198 case DW_AT_language: return "DW_AT_language";
6199 case DW_AT_member: return "DW_AT_member";
6200 case DW_AT_discr: return "DW_AT_discr";
6201 case DW_AT_discr_value: return "DW_AT_discr_value";
6202 case DW_AT_visibility: return "DW_AT_visibility";
6203 case DW_AT_import: return "DW_AT_import";
6204 case DW_AT_string_length: return "DW_AT_string_length";
6205 case DW_AT_common_reference: return "DW_AT_common_reference";
6206 case DW_AT_comp_dir: return "DW_AT_comp_dir";
6207 case DW_AT_const_value: return "DW_AT_const_value";
6208 case DW_AT_containing_type: return "DW_AT_containing_type";
6209 case DW_AT_default_value: return "DW_AT_default_value";
6210 case DW_AT_inline: return "DW_AT_inline";
6211 case DW_AT_is_optional: return "DW_AT_is_optional";
6212 case DW_AT_lower_bound: return "DW_AT_lower_bound";
6213 case DW_AT_producer: return "DW_AT_producer";
6214 case DW_AT_prototyped: return "DW_AT_prototyped";
6215 case DW_AT_return_addr: return "DW_AT_return_addr";
6216 case DW_AT_start_scope: return "DW_AT_start_scope";
6217 case DW_AT_stride_size: return "DW_AT_stride_size";
6218 case DW_AT_upper_bound: return "DW_AT_upper_bound";
6219 case DW_AT_abstract_origin: return "DW_AT_abstract_origin";
6220 case DW_AT_accessibility: return "DW_AT_accessibility";
6221 case DW_AT_address_class: return "DW_AT_address_class";
6222 case DW_AT_artificial: return "DW_AT_artificial";
6223 case DW_AT_base_types: return "DW_AT_base_types";
6224 case DW_AT_calling_convention: return "DW_AT_calling_convention";
6225 case DW_AT_count: return "DW_AT_count";
6226 case DW_AT_data_member_location: return "DW_AT_data_member_location";
6227 case DW_AT_decl_column: return "DW_AT_decl_column";
6228 case DW_AT_decl_file: return "DW_AT_decl_file";
6229 case DW_AT_decl_line: return "DW_AT_decl_line";
6230 case DW_AT_declaration: return "DW_AT_declaration";
6231 case DW_AT_discr_list: return "DW_AT_discr_list";
6232 case DW_AT_encoding: return "DW_AT_encoding";
6233 case DW_AT_external: return "DW_AT_external";
6234 case DW_AT_frame_base: return "DW_AT_frame_base";
6235 case DW_AT_friend: return "DW_AT_friend";
6236 case DW_AT_identifier_case: return "DW_AT_identifier_case";
6237 case DW_AT_macro_info: return "DW_AT_macro_info";
6238 case DW_AT_namelist_items: return "DW_AT_namelist_items";
6239 case DW_AT_priority: return "DW_AT_priority";
6240 case DW_AT_segment: return "DW_AT_segment";
6241 case DW_AT_specification: return "DW_AT_specification";
6242 case DW_AT_static_link: return "DW_AT_static_link";
6243 case DW_AT_type: return "DW_AT_type";
6244 case DW_AT_use_location: return "DW_AT_use_location";
6245 case DW_AT_variable_parameter: return "DW_AT_variable_parameter";
6246 case DW_AT_virtuality: return "DW_AT_virtuality";
6247 case DW_AT_vtable_elem_location: return "DW_AT_vtable_elem_location";
6248 /* DWARF 2.1 values. */
6249 case DW_AT_allocated: return "DW_AT_allocated";
6250 case DW_AT_associated: return "DW_AT_associated";
6251 case DW_AT_data_location: return "DW_AT_data_location";
6252 case DW_AT_stride: return "DW_AT_stride";
6253 case DW_AT_entry_pc: return "DW_AT_entry_pc";
6254 case DW_AT_use_UTF8: return "DW_AT_use_UTF8";
6255 case DW_AT_extension: return "DW_AT_extension";
6256 case DW_AT_ranges: return "DW_AT_ranges";
6257 case DW_AT_trampoline: return "DW_AT_trampoline";
6258 case DW_AT_call_column: return "DW_AT_call_column";
6259 case DW_AT_call_file: return "DW_AT_call_file";
6260 case DW_AT_call_line: return "DW_AT_call_line";
6261 /* SGI/MIPS extensions. */
6262 case DW_AT_MIPS_fde: return "DW_AT_MIPS_fde";
6263 case DW_AT_MIPS_loop_begin: return "DW_AT_MIPS_loop_begin";
6264 case DW_AT_MIPS_tail_loop_begin: return "DW_AT_MIPS_tail_loop_begin";
6265 case DW_AT_MIPS_epilog_begin: return "DW_AT_MIPS_epilog_begin";
6266 case DW_AT_MIPS_loop_unroll_factor: return "DW_AT_MIPS_loop_unroll_factor";
6267 case DW_AT_MIPS_software_pipeline_depth: return "DW_AT_MIPS_software_pipeline_depth";
6268 case DW_AT_MIPS_linkage_name: return "DW_AT_MIPS_linkage_name";
6269 case DW_AT_MIPS_stride: return "DW_AT_MIPS_stride";
6270 case DW_AT_MIPS_abstract_name: return "DW_AT_MIPS_abstract_name";
6271 case DW_AT_MIPS_clone_origin: return "DW_AT_MIPS_clone_origin";
6272 case DW_AT_MIPS_has_inlines: return "DW_AT_MIPS_has_inlines";
6273 /* GNU extensions. */
6274 case DW_AT_sf_names: return "DW_AT_sf_names";
6275 case DW_AT_src_info: return "DW_AT_src_info";
6276 case DW_AT_mac_info: return "DW_AT_mac_info";
6277 case DW_AT_src_coords: return "DW_AT_src_coords";
6278 case DW_AT_body_begin: return "DW_AT_body_begin";
6279 case DW_AT_body_end: return "DW_AT_body_end";
6280 default:
6281 {
6282 static char buffer [100];
6283
6284 sprintf (buffer, _("Unknown AT value: %lx"), attribute);
6285 return buffer;
6286 }
6287 }
6288 }
6289
6290 static char *
6291 get_FORM_name (form)
6292 unsigned long form;
6293 {
6294 switch (form)
6295 {
6296 case DW_FORM_addr: return "DW_FORM_addr";
6297 case DW_FORM_block2: return "DW_FORM_block2";
6298 case DW_FORM_block4: return "DW_FORM_block4";
6299 case DW_FORM_data2: return "DW_FORM_data2";
6300 case DW_FORM_data4: return "DW_FORM_data4";
6301 case DW_FORM_data8: return "DW_FORM_data8";
6302 case DW_FORM_string: return "DW_FORM_string";
6303 case DW_FORM_block: return "DW_FORM_block";
6304 case DW_FORM_block1: return "DW_FORM_block1";
6305 case DW_FORM_data1: return "DW_FORM_data1";
6306 case DW_FORM_flag: return "DW_FORM_flag";
6307 case DW_FORM_sdata: return "DW_FORM_sdata";
6308 case DW_FORM_strp: return "DW_FORM_strp";
6309 case DW_FORM_udata: return "DW_FORM_udata";
6310 case DW_FORM_ref_addr: return "DW_FORM_ref_addr";
6311 case DW_FORM_ref1: return "DW_FORM_ref1";
6312 case DW_FORM_ref2: return "DW_FORM_ref2";
6313 case DW_FORM_ref4: return "DW_FORM_ref4";
6314 case DW_FORM_ref8: return "DW_FORM_ref8";
6315 case DW_FORM_ref_udata: return "DW_FORM_ref_udata";
6316 case DW_FORM_indirect: return "DW_FORM_indirect";
6317 default:
6318 {
6319 static char buffer [100];
6320
6321 sprintf (buffer, _("Unknown FORM value: %lx"), form);
6322 return buffer;
6323 }
6324 }
6325 }
6326
6327 /* FIXME: There are better and more effiecint ways to handle
6328 these structures. For now though, I just want something that
6329 is simple to implement. */
6330 typedef struct abbrev_attr
6331 {
6332 unsigned long attribute;
6333 unsigned long form;
6334 struct abbrev_attr * next;
6335 }
6336 abbrev_attr;
6337
6338 typedef struct abbrev_entry
6339 {
6340 unsigned long entry;
6341 unsigned long tag;
6342 int children;
6343 struct abbrev_attr * first_attr;
6344 struct abbrev_attr * last_attr;
6345 struct abbrev_entry * next;
6346 }
6347 abbrev_entry;
6348
6349 static abbrev_entry * first_abbrev = NULL;
6350 static abbrev_entry * last_abbrev = NULL;
6351
6352 static void
6353 free_abbrevs PARAMS ((void))
6354 {
6355 abbrev_entry * abbrev;
6356
6357 for (abbrev = first_abbrev; abbrev;)
6358 {
6359 abbrev_entry * next = abbrev->next;
6360 abbrev_attr * attr;
6361
6362 for (attr = abbrev->first_attr; attr;)
6363 {
6364 abbrev_attr * next = attr->next;
6365
6366 free (attr);
6367 attr = next;
6368 }
6369
6370 free (abbrev);
6371 abbrev = next;
6372 }
6373
6374 last_abbrev = first_abbrev = NULL;
6375 }
6376
6377 static void
6378 add_abbrev (number, tag, children)
6379 unsigned long number;
6380 unsigned long tag;
6381 int children;
6382 {
6383 abbrev_entry * entry;
6384
6385 entry = (abbrev_entry *) malloc (sizeof (* entry));
6386
6387 if (entry == NULL)
6388 /* ugg */
6389 return;
6390
6391 entry->entry = number;
6392 entry->tag = tag;
6393 entry->children = children;
6394 entry->first_attr = NULL;
6395 entry->last_attr = NULL;
6396 entry->next = NULL;
6397
6398 if (first_abbrev == NULL)
6399 first_abbrev = entry;
6400 else
6401 last_abbrev->next = entry;
6402
6403 last_abbrev = entry;
6404 }
6405
6406 static void
6407 add_abbrev_attr (attribute, form)
6408 unsigned long attribute;
6409 unsigned long form;
6410 {
6411 abbrev_attr * attr;
6412
6413 attr = (abbrev_attr *) malloc (sizeof (* attr));
6414
6415 if (attr == NULL)
6416 /* ugg */
6417 return;
6418
6419 attr->attribute = attribute;
6420 attr->form = form;
6421 attr->next = NULL;
6422
6423 if (last_abbrev->first_attr == NULL)
6424 last_abbrev->first_attr = attr;
6425 else
6426 last_abbrev->last_attr->next = attr;
6427
6428 last_abbrev->last_attr = attr;
6429 }
6430
6431 /* Processes the (partial) contents of a .debug_abbrev section.
6432 Returns NULL if the end of the section was encountered.
6433 Returns the address after the last byte read if the end of
6434 an abbreviation set was found. */
6435
6436 static unsigned char *
6437 process_abbrev_section (start, end)
6438 unsigned char * start;
6439 unsigned char * end;
6440 {
6441 if (first_abbrev != NULL)
6442 return NULL;
6443
6444 while (start < end)
6445 {
6446 int bytes_read;
6447 unsigned long entry;
6448 unsigned long tag;
6449 unsigned long attribute;
6450 int children;
6451
6452 entry = read_leb128 (start, & bytes_read, 0);
6453 start += bytes_read;
6454
6455 /* A single zero is supposed to end the section according
6456 to the standard. If there's more, then signal that to
6457 the caller. */
6458 if (entry == 0)
6459 return start == end ? NULL : start;
6460
6461 tag = read_leb128 (start, & bytes_read, 0);
6462 start += bytes_read;
6463
6464 children = * start ++;
6465
6466 add_abbrev (entry, tag, children);
6467
6468 do
6469 {
6470 unsigned long form;
6471
6472 attribute = read_leb128 (start, & bytes_read, 0);
6473 start += bytes_read;
6474
6475 form = read_leb128 (start, & bytes_read, 0);
6476 start += bytes_read;
6477
6478 if (attribute != 0)
6479 add_abbrev_attr (attribute, form);
6480 }
6481 while (attribute != 0);
6482 }
6483
6484 return NULL;
6485 }
6486
6487
6488 static int
6489 display_debug_macinfo (section, start, file)
6490 Elf32_Internal_Shdr * section;
6491 unsigned char * start;
6492 FILE * file ATTRIBUTE_UNUSED;
6493 {
6494 unsigned char * end = start + section->sh_size;
6495 unsigned char * curr = start;
6496 unsigned int bytes_read;
6497 enum dwarf_macinfo_record_type op;
6498
6499 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
6500
6501 while (curr < end)
6502 {
6503 unsigned int lineno;
6504 const char * string;
6505
6506 op = * curr;
6507 curr ++;
6508
6509 switch (op)
6510 {
6511 case DW_MACINFO_start_file:
6512 {
6513 unsigned int filenum;
6514
6515 lineno = read_leb128 (curr, & bytes_read, 0);
6516 curr += bytes_read;
6517 filenum = read_leb128 (curr, & bytes_read, 0);
6518 curr += bytes_read;
6519
6520 printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"), lineno, filenum);
6521 }
6522 break;
6523
6524 case DW_MACINFO_end_file:
6525 printf (_(" DW_MACINFO_end_file\n"));
6526 break;
6527
6528 case DW_MACINFO_define:
6529 lineno = read_leb128 (curr, & bytes_read, 0);
6530 curr += bytes_read;
6531 string = curr;
6532 curr += strlen (string) + 1;
6533 printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"), lineno, string);
6534 break;
6535
6536 case DW_MACINFO_undef:
6537 lineno = read_leb128 (curr, & bytes_read, 0);
6538 curr += bytes_read;
6539 string = curr;
6540 curr += strlen (string) + 1;
6541 printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"), lineno, string);
6542 break;
6543
6544 case DW_MACINFO_vendor_ext:
6545 {
6546 unsigned int constant;
6547
6548 constant = read_leb128 (curr, & bytes_read, 0);
6549 curr += bytes_read;
6550 string = curr;
6551 curr += strlen (string) + 1;
6552 printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"), constant, string);
6553 }
6554 break;
6555 }
6556 }
6557
6558 return 1;
6559 }
6560
6561
6562 static int
6563 display_debug_abbrev (section, start, file)
6564 Elf32_Internal_Shdr * section;
6565 unsigned char * start;
6566 FILE * file ATTRIBUTE_UNUSED;
6567 {
6568 abbrev_entry * entry;
6569 unsigned char * end = start + section->sh_size;
6570
6571 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
6572
6573 do
6574 {
6575 start = process_abbrev_section (start, end);
6576
6577 if (first_abbrev == NULL)
6578 continue;
6579
6580 printf (_(" Number TAG\n"));
6581
6582 for (entry = first_abbrev; entry; entry = entry->next)
6583 {
6584 abbrev_attr * attr;
6585
6586 printf (_(" %ld %s [%s]\n"),
6587 entry->entry,
6588 get_TAG_name (entry->tag),
6589 entry->children ? _("has children") : _("no children"));
6590
6591 for (attr = entry->first_attr; attr; attr = attr->next)
6592 {
6593 printf (_(" %-18s %s\n"),
6594 get_AT_name (attr->attribute),
6595 get_FORM_name (attr->form));
6596 }
6597 }
6598
6599 free_abbrevs ();
6600 }
6601 while (start);
6602
6603 printf ("\n");
6604
6605 return 1;
6606 }
6607
6608
6609 static unsigned char *
6610 display_block (data, length)
6611 unsigned char * data;
6612 unsigned long length;
6613 {
6614 printf (_(" %lu byte block: "), length);
6615
6616 while (length --)
6617 printf ("%lx ", (unsigned long) byte_get (data ++, 1));
6618
6619 return data;
6620 }
6621
6622 static void
6623 decode_location_expression (data, pointer_size, length)
6624 unsigned char * data;
6625 unsigned int pointer_size;
6626 unsigned long length;
6627 {
6628 unsigned op;
6629 int bytes_read;
6630 unsigned long uvalue;
6631 unsigned char * end = data + length;
6632
6633 while (data < end)
6634 {
6635 op = * data ++;
6636
6637 switch (op)
6638 {
6639 case DW_OP_addr:
6640 printf ("DW_OP_addr: %lx",
6641 (unsigned long) byte_get (data, pointer_size));
6642 data += pointer_size;
6643 break;
6644 case DW_OP_deref:
6645 printf ("DW_OP_deref");
6646 break;
6647 case DW_OP_const1u:
6648 printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data++, 1));
6649 break;
6650 case DW_OP_const1s:
6651 printf ("DW_OP_const1s: %ld", (long) byte_get (data++, 1));
6652 break;
6653 case DW_OP_const2u:
6654 printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data, 2));
6655 data += 2;
6656 break;
6657 case DW_OP_const2s:
6658 printf ("DW_OP_const2s: %ld", (long) byte_get (data, 2));
6659 data += 2;
6660 break;
6661 case DW_OP_const4u:
6662 printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data, 4));
6663 data += 4;
6664 break;
6665 case DW_OP_const4s:
6666 printf ("DW_OP_const4s: %ld", (long) byte_get (data, 4));
6667 data += 4;
6668 break;
6669 case DW_OP_const8u:
6670 printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data, 4),
6671 (unsigned long) byte_get (data + 4, 4));
6672 data += 8;
6673 break;
6674 case DW_OP_const8s:
6675 printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data, 4),
6676 (long) byte_get (data + 4, 4));
6677 data += 8;
6678 break;
6679 case DW_OP_constu:
6680 printf ("DW_OP_constu: %lu", read_leb128 (data, &bytes_read, 0));
6681 data += bytes_read;
6682 break;
6683 case DW_OP_consts:
6684 printf ("DW_OP_consts: %ld", read_leb128 (data, &bytes_read, 1));
6685 data += bytes_read;
6686 break;
6687 case DW_OP_dup:
6688 printf ("DW_OP_dup");
6689 break;
6690 case DW_OP_drop:
6691 printf ("DW_OP_drop");
6692 break;
6693 case DW_OP_over:
6694 printf ("DW_OP_over");
6695 break;
6696 case DW_OP_pick:
6697 printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data++, 1));
6698 break;
6699 case DW_OP_swap:
6700 printf ("DW_OP_swap");
6701 break;
6702 case DW_OP_rot:
6703 printf ("DW_OP_rot");
6704 break;
6705 case DW_OP_xderef:
6706 printf ("DW_OP_xderef");
6707 break;
6708 case DW_OP_abs:
6709 printf ("DW_OP_abs");
6710 break;
6711 case DW_OP_and:
6712 printf ("DW_OP_and");
6713 break;
6714 case DW_OP_div:
6715 printf ("DW_OP_div");
6716 break;
6717 case DW_OP_minus:
6718 printf ("DW_OP_minus");
6719 break;
6720 case DW_OP_mod:
6721 printf ("DW_OP_mod");
6722 break;
6723 case DW_OP_mul:
6724 printf ("DW_OP_mul");
6725 break;
6726 case DW_OP_neg:
6727 printf ("DW_OP_neg");
6728 break;
6729 case DW_OP_not:
6730 printf ("DW_OP_not");
6731 break;
6732 case DW_OP_or:
6733 printf ("DW_OP_or");
6734 break;
6735 case DW_OP_plus:
6736 printf ("DW_OP_plus");
6737 break;
6738 case DW_OP_plus_uconst:
6739 printf ("DW_OP_plus_uconst: %lu",
6740 read_leb128 (data, &bytes_read, 0));
6741 data += bytes_read;
6742 break;
6743 case DW_OP_shl:
6744 printf ("DW_OP_shl");
6745 break;
6746 case DW_OP_shr:
6747 printf ("DW_OP_shr");
6748 break;
6749 case DW_OP_shra:
6750 printf ("DW_OP_shra");
6751 break;
6752 case DW_OP_xor:
6753 printf ("DW_OP_xor");
6754 break;
6755 case DW_OP_bra:
6756 printf ("DW_OP_bra: %ld", (long) byte_get (data, 2));
6757 data += 2;
6758 break;
6759 case DW_OP_eq:
6760 printf ("DW_OP_eq");
6761 break;
6762 case DW_OP_ge:
6763 printf ("DW_OP_ge");
6764 break;
6765 case DW_OP_gt:
6766 printf ("DW_OP_gt");
6767 break;
6768 case DW_OP_le:
6769 printf ("DW_OP_le");
6770 break;
6771 case DW_OP_lt:
6772 printf ("DW_OP_lt");
6773 break;
6774 case DW_OP_ne:
6775 printf ("DW_OP_ne");
6776 break;
6777 case DW_OP_skip:
6778 printf ("DW_OP_skip: %ld", (long) byte_get (data, 2));
6779 data += 2;
6780 break;
6781
6782 case DW_OP_lit0:
6783 case DW_OP_lit1:
6784 case DW_OP_lit2:
6785 case DW_OP_lit3:
6786 case DW_OP_lit4:
6787 case DW_OP_lit5:
6788 case DW_OP_lit6:
6789 case DW_OP_lit7:
6790 case DW_OP_lit8:
6791 case DW_OP_lit9:
6792 case DW_OP_lit10:
6793 case DW_OP_lit11:
6794 case DW_OP_lit12:
6795 case DW_OP_lit13:
6796 case DW_OP_lit14:
6797 case DW_OP_lit15:
6798 case DW_OP_lit16:
6799 case DW_OP_lit17:
6800 case DW_OP_lit18:
6801 case DW_OP_lit19:
6802 case DW_OP_lit20:
6803 case DW_OP_lit21:
6804 case DW_OP_lit22:
6805 case DW_OP_lit23:
6806 case DW_OP_lit24:
6807 case DW_OP_lit25:
6808 case DW_OP_lit26:
6809 case DW_OP_lit27:
6810 case DW_OP_lit28:
6811 case DW_OP_lit29:
6812 case DW_OP_lit30:
6813 case DW_OP_lit31:
6814 printf ("DW_OP_lit%d", op - DW_OP_lit0);
6815 break;
6816
6817 case DW_OP_reg0:
6818 case DW_OP_reg1:
6819 case DW_OP_reg2:
6820 case DW_OP_reg3:
6821 case DW_OP_reg4:
6822 case DW_OP_reg5:
6823 case DW_OP_reg6:
6824 case DW_OP_reg7:
6825 case DW_OP_reg8:
6826 case DW_OP_reg9:
6827 case DW_OP_reg10:
6828 case DW_OP_reg11:
6829 case DW_OP_reg12:
6830 case DW_OP_reg13:
6831 case DW_OP_reg14:
6832 case DW_OP_reg15:
6833 case DW_OP_reg16:
6834 case DW_OP_reg17:
6835 case DW_OP_reg18:
6836 case DW_OP_reg19:
6837 case DW_OP_reg20:
6838 case DW_OP_reg21:
6839 case DW_OP_reg22:
6840 case DW_OP_reg23:
6841 case DW_OP_reg24:
6842 case DW_OP_reg25:
6843 case DW_OP_reg26:
6844 case DW_OP_reg27:
6845 case DW_OP_reg28:
6846 case DW_OP_reg29:
6847 case DW_OP_reg30:
6848 case DW_OP_reg31:
6849 printf ("DW_OP_reg%d", op - DW_OP_reg0);
6850 break;
6851
6852 case DW_OP_breg0:
6853 case DW_OP_breg1:
6854 case DW_OP_breg2:
6855 case DW_OP_breg3:
6856 case DW_OP_breg4:
6857 case DW_OP_breg5:
6858 case DW_OP_breg6:
6859 case DW_OP_breg7:
6860 case DW_OP_breg8:
6861 case DW_OP_breg9:
6862 case DW_OP_breg10:
6863 case DW_OP_breg11:
6864 case DW_OP_breg12:
6865 case DW_OP_breg13:
6866 case DW_OP_breg14:
6867 case DW_OP_breg15:
6868 case DW_OP_breg16:
6869 case DW_OP_breg17:
6870 case DW_OP_breg18:
6871 case DW_OP_breg19:
6872 case DW_OP_breg20:
6873 case DW_OP_breg21:
6874 case DW_OP_breg22:
6875 case DW_OP_breg23:
6876 case DW_OP_breg24:
6877 case DW_OP_breg25:
6878 case DW_OP_breg26:
6879 case DW_OP_breg27:
6880 case DW_OP_breg28:
6881 case DW_OP_breg29:
6882 case DW_OP_breg30:
6883 case DW_OP_breg31:
6884 printf ("DW_OP_breg%d: %ld", op - DW_OP_breg0,
6885 read_leb128 (data, &bytes_read, 1));
6886 data += bytes_read;
6887 break;
6888
6889 case DW_OP_regx:
6890 printf ("DW_OP_regx: %lu", read_leb128 (data, &bytes_read, 0));
6891 data += bytes_read;
6892 break;
6893 case DW_OP_fbreg:
6894 printf ("DW_OP_fbreg: %ld", read_leb128 (data, &bytes_read, 1));
6895 data += bytes_read;
6896 break;
6897 case DW_OP_bregx:
6898 uvalue = read_leb128 (data, &bytes_read, 0);
6899 data += bytes_read;
6900 printf ("DW_OP_bregx: %lu %ld", uvalue,
6901 read_leb128 (data, &bytes_read, 1));
6902 data += bytes_read;
6903 break;
6904 case DW_OP_piece:
6905 printf ("DW_OP_piece: %lu", read_leb128 (data, &bytes_read, 0));
6906 data += bytes_read;
6907 break;
6908 case DW_OP_deref_size:
6909 printf ("DW_OP_deref_size: %ld", (long) byte_get (data++, 1));
6910 break;
6911 case DW_OP_xderef_size:
6912 printf ("DW_OP_xderef_size: %ld", (long) byte_get (data++, 1));
6913 break;
6914 case DW_OP_nop:
6915 printf ("DW_OP_nop");
6916 break;
6917
6918 /* DWARF 2.1 extensions. */
6919 case DW_OP_push_object_address:
6920 printf ("DW_OP_push_object_address");
6921 break;
6922 case DW_OP_call2:
6923 printf ("DW_OP_call2: <%lx>", (long) byte_get (data, 2));
6924 data += 2;
6925 break;
6926 case DW_OP_call4:
6927 printf ("DW_OP_call4: <%lx>", (long) byte_get (data, 4));
6928 data += 4;
6929 break;
6930 case DW_OP_calli:
6931 printf ("DW_OP_calli");
6932 break;
6933
6934 default:
6935 if (op >= DW_OP_lo_user
6936 && op <= DW_OP_hi_user)
6937 printf (_("(User defined location op)"));
6938 else
6939 printf (_("(Unknown location op)"));
6940 /* No way to tell where the next op is, so just bail. */
6941 return;
6942 }
6943
6944 /* Separate the ops. */
6945 printf ("; ");
6946 }
6947 }
6948
6949
6950 static const char * debug_str_contents;
6951 static bfd_vma debug_str_size;
6952
6953 static void
6954 load_debug_str (file)
6955 FILE * file;
6956 {
6957 Elf32_Internal_Shdr * sec;
6958 int i;
6959
6960 /* If it is already loaded, do nothing. */
6961 if (debug_str_contents != NULL)
6962 return;
6963
6964 /* Locate the .debug_str section. */
6965 for (i = 0, sec = section_headers;
6966 i < elf_header.e_shnum;
6967 i ++, sec ++)
6968 if (strcmp (SECTION_NAME (sec), ".debug_str") == 0)
6969 break;
6970
6971 if (i == elf_header.e_shnum || sec->sh_size == 0)
6972 return;
6973
6974 debug_str_size = sec->sh_size;
6975
6976 debug_str_contents = ((char *)
6977 get_data (NULL, file, sec->sh_offset, sec->sh_size,
6978 _("debug_str section data")));
6979 }
6980
6981 static void
6982 free_debug_str ()
6983 {
6984 if (debug_str_contents == NULL)
6985 return;
6986
6987 free ((char *) debug_str_contents);
6988 debug_str_contents = NULL;
6989 debug_str_size = 0;
6990 }
6991
6992 static const char *
6993 fetch_indirect_string (offset)
6994 unsigned long offset;
6995 {
6996 if (debug_str_contents == NULL)
6997 return _("<no .debug_str section>");
6998
6999 if (offset > debug_str_size)
7000 return _("<offset is too big>");
7001
7002 return debug_str_contents + offset;
7003 }
7004
7005
7006 static int
7007 display_debug_str (section, start, file)
7008 Elf32_Internal_Shdr * section;
7009 unsigned char * start;
7010 FILE * file ATTRIBUTE_UNUSED;
7011 {
7012 unsigned long bytes;
7013 bfd_vma addr;
7014
7015 addr = section->sh_addr;
7016 bytes = section->sh_size;
7017
7018 if (bytes == 0)
7019 {
7020 printf (_("\nThe .debug_str section is empty.\n"));
7021 return 0;
7022 }
7023
7024 printf (_("Contents of the .debug_str section:\n\n"));
7025
7026 while (bytes)
7027 {
7028 int j;
7029 int k;
7030 int lbytes;
7031
7032 lbytes = (bytes > 16 ? 16 : bytes);
7033
7034 printf (" 0x%8.8lx ", (unsigned long) addr);
7035
7036 for (j = 0; j < 16; j++)
7037 {
7038 if (j < lbytes)
7039 printf ("%2.2x", start [j]);
7040 else
7041 printf (" ");
7042
7043 if ((j & 3) == 3)
7044 printf (" ");
7045 }
7046
7047 for (j = 0; j < lbytes; j++)
7048 {
7049 k = start [j];
7050 if (k >= ' ' && k < 0x80)
7051 printf ("%c", k);
7052 else
7053 printf (".");
7054 }
7055
7056 putchar ('\n');
7057
7058 start += lbytes;
7059 addr += lbytes;
7060 bytes -= lbytes;
7061 }
7062
7063 return 1;
7064 }
7065
7066
7067 static unsigned char *
7068 read_and_display_attr_value (attribute, form, data, cu_offset, pointer_size)
7069 unsigned long attribute;
7070 unsigned long form;
7071 unsigned char * data;
7072 unsigned long cu_offset;
7073 unsigned long pointer_size;
7074 {
7075 unsigned long uvalue = 0;
7076 unsigned char * block_start = NULL;
7077 int bytes_read;
7078
7079 switch (form)
7080 {
7081 default:
7082 break;
7083
7084 case DW_FORM_ref_addr:
7085 case DW_FORM_addr:
7086 uvalue = byte_get (data, pointer_size);
7087 data += pointer_size;
7088 break;
7089
7090 case DW_FORM_strp:
7091 uvalue = byte_get (data, /* offset_size */ 4);
7092 data += /* offset_size */ 4;
7093 break;
7094
7095 case DW_FORM_ref1:
7096 case DW_FORM_flag:
7097 case DW_FORM_data1:
7098 uvalue = byte_get (data ++, 1);
7099 break;
7100
7101 case DW_FORM_ref2:
7102 case DW_FORM_data2:
7103 uvalue = byte_get (data, 2);
7104 data += 2;
7105 break;
7106
7107 case DW_FORM_ref4:
7108 case DW_FORM_data4:
7109 uvalue = byte_get (data, 4);
7110 data += 4;
7111 break;
7112
7113 case DW_FORM_sdata:
7114 uvalue = read_leb128 (data, & bytes_read, 1);
7115 data += bytes_read;
7116 break;
7117
7118 case DW_FORM_ref_udata:
7119 case DW_FORM_udata:
7120 uvalue = read_leb128 (data, & bytes_read, 0);
7121 data += bytes_read;
7122 break;
7123
7124 case DW_FORM_indirect:
7125 form = read_leb128 (data, & bytes_read, 0);
7126 data += bytes_read;
7127 printf (" %s", get_FORM_name (form));
7128 return read_and_display_attr_value (attribute, form, data, cu_offset,
7129 pointer_size);
7130 }
7131
7132 switch (form)
7133 {
7134 case DW_FORM_ref_addr:
7135 printf (" <#%lx>", uvalue);
7136 break;
7137
7138 case DW_FORM_ref1:
7139 case DW_FORM_ref2:
7140 case DW_FORM_ref4:
7141 case DW_FORM_ref_udata:
7142 printf (" <%lx>", uvalue + cu_offset);
7143 break;
7144
7145 case DW_FORM_addr:
7146 printf (" %#lx", uvalue);
7147
7148 case DW_FORM_flag:
7149 case DW_FORM_data1:
7150 case DW_FORM_data2:
7151 case DW_FORM_data4:
7152 case DW_FORM_sdata:
7153 case DW_FORM_udata:
7154 printf (" %ld", uvalue);
7155 break;
7156
7157 case DW_FORM_ref8:
7158 case DW_FORM_data8:
7159 uvalue = byte_get (data, 4);
7160 printf (" %lx", uvalue);
7161 printf (" %lx", (unsigned long) byte_get (data + 4, 4));
7162 data += 8;
7163 break;
7164
7165 case DW_FORM_string:
7166 printf (" %s", data);
7167 data += strlen ((char *) data) + 1;
7168 break;
7169
7170 case DW_FORM_block:
7171 uvalue = read_leb128 (data, & bytes_read, 0);
7172 block_start = data + bytes_read;
7173 data = display_block (block_start, uvalue);
7174 break;
7175
7176 case DW_FORM_block1:
7177 uvalue = byte_get (data, 1);
7178 block_start = data + 1;
7179 data = display_block (block_start, uvalue);
7180 break;
7181
7182 case DW_FORM_block2:
7183 uvalue = byte_get (data, 2);
7184 block_start = data + 2;
7185 data = display_block (block_start, uvalue);
7186 break;
7187
7188 case DW_FORM_block4:
7189 uvalue = byte_get (data, 4);
7190 block_start = data + 4;
7191 data = display_block (block_start, uvalue);
7192 break;
7193
7194 case DW_FORM_strp:
7195 printf (_(" (indirect string, offset: 0x%lx): "), uvalue);
7196 printf (fetch_indirect_string (uvalue));
7197 break;
7198
7199 case DW_FORM_indirect:
7200 /* Handled above. */
7201 break;
7202
7203 default:
7204 warn (_("Unrecognised form: %d\n"), form);
7205 break;
7206 }
7207
7208 /* For some attributes we can display futher information. */
7209
7210 printf ("\t");
7211
7212 switch (attribute)
7213 {
7214 case DW_AT_inline:
7215 switch (uvalue)
7216 {
7217 case DW_INL_not_inlined: printf (_("(not inlined)")); break;
7218 case DW_INL_inlined: printf (_("(inlined)")); break;
7219 case DW_INL_declared_not_inlined: printf (_("(declared as inline but ignored)")); break;
7220 case DW_INL_declared_inlined: printf (_("(declared as inline and inlined)")); break;
7221 default: printf (_(" (Unknown inline attribute value: %lx)"), uvalue); break;
7222 }
7223 break;
7224
7225 case DW_AT_language:
7226 switch (uvalue)
7227 {
7228 case DW_LANG_C: printf ("(non-ANSI C)"); break;
7229 case DW_LANG_C89: printf ("(ANSI C)"); break;
7230 case DW_LANG_C_plus_plus: printf ("(C++)"); break;
7231 case DW_LANG_Fortran77: printf ("(FORTRAN 77)"); break;
7232 case DW_LANG_Fortran90: printf ("(Fortran 90)"); break;
7233 case DW_LANG_Modula2: printf ("(Modula 2)"); break;
7234 case DW_LANG_Pascal83: printf ("(ANSI Pascal)"); break;
7235 case DW_LANG_Ada83: printf ("(Ada)"); break;
7236 case DW_LANG_Cobol74: printf ("(Cobol 74)"); break;
7237 case DW_LANG_Cobol85: printf ("(Cobol 85)"); break;
7238 /* DWARF 2.1 values. */
7239 case DW_LANG_C99: printf ("(ANSI C99)"); break;
7240 case DW_LANG_Ada95: printf ("(ADA 95)"); break;
7241 case DW_LANG_Fortran95: printf ("(Fortran 95)"); break;
7242 /* MIPS extension. */
7243 case DW_LANG_Mips_Assembler: printf ("(MIPS assembler)"); break;
7244 default: printf ("(Unknown: %lx)", uvalue); break;
7245 }
7246 break;
7247
7248 case DW_AT_encoding:
7249 switch (uvalue)
7250 {
7251 case DW_ATE_void: printf ("(void)"); break;
7252 case DW_ATE_address: printf ("(machine address)"); break;
7253 case DW_ATE_boolean: printf ("(boolean)"); break;
7254 case DW_ATE_complex_float: printf ("(complex float)"); break;
7255 case DW_ATE_float: printf ("(float)"); break;
7256 case DW_ATE_signed: printf ("(signed)"); break;
7257 case DW_ATE_signed_char: printf ("(signed char)"); break;
7258 case DW_ATE_unsigned: printf ("(unsigned)"); break;
7259 case DW_ATE_unsigned_char: printf ("(unsigned char)"); break;
7260 /* DWARF 2.1 value. */
7261 case DW_ATE_imaginary_float: printf ("(imaginary float)"); break;
7262 default:
7263 if (uvalue >= DW_ATE_lo_user
7264 && uvalue <= DW_ATE_hi_user)
7265 printf ("(user defined type)");
7266 else
7267 printf ("(unknown type)");
7268 break;
7269 }
7270 break;
7271
7272 case DW_AT_accessibility:
7273 switch (uvalue)
7274 {
7275 case DW_ACCESS_public: printf ("(public)"); break;
7276 case DW_ACCESS_protected: printf ("(protected)"); break;
7277 case DW_ACCESS_private: printf ("(private)"); break;
7278 default: printf ("(unknown accessibility)"); break;
7279 }
7280 break;
7281
7282 case DW_AT_visibility:
7283 switch (uvalue)
7284 {
7285 case DW_VIS_local: printf ("(local)"); break;
7286 case DW_VIS_exported: printf ("(exported)"); break;
7287 case DW_VIS_qualified: printf ("(qualified)"); break;
7288 default: printf ("(unknown visibility)"); break;
7289 }
7290 break;
7291
7292 case DW_AT_virtuality:
7293 switch (uvalue)
7294 {
7295 case DW_VIRTUALITY_none: printf ("(none)"); break;
7296 case DW_VIRTUALITY_virtual: printf ("(virtual)"); break;
7297 case DW_VIRTUALITY_pure_virtual:printf ("(pure_virtual)"); break;
7298 default: printf ("(unknown virtuality)"); break;
7299 }
7300 break;
7301
7302 case DW_AT_identifier_case:
7303 switch (uvalue)
7304 {
7305 case DW_ID_case_sensitive: printf ("(case_sensitive)"); break;
7306 case DW_ID_up_case: printf ("(up_case)"); break;
7307 case DW_ID_down_case: printf ("(down_case)"); break;
7308 case DW_ID_case_insensitive: printf ("(case_insensitive)"); break;
7309 default: printf ("(unknown case)"); break;
7310 }
7311 break;
7312
7313 case DW_AT_calling_convention:
7314 switch (uvalue)
7315 {
7316 case DW_CC_normal: printf ("(normal)"); break;
7317 case DW_CC_program: printf ("(program)"); break;
7318 case DW_CC_nocall: printf ("(nocall)"); break;
7319 default:
7320 if (uvalue >= DW_CC_lo_user
7321 && uvalue <= DW_CC_hi_user)
7322 printf ("(user defined)");
7323 else
7324 printf ("(unknown convention)");
7325 }
7326 break;
7327
7328 case DW_AT_ordering:
7329 switch (uvalue)
7330 {
7331 case -1: printf ("(undefined)"); break;
7332 case 0: printf ("(row major)"); break;
7333 case 1: printf ("(column major)"); break;
7334 }
7335 break;
7336
7337 case DW_AT_frame_base:
7338 case DW_AT_location:
7339 case DW_AT_data_member_location:
7340 case DW_AT_vtable_elem_location:
7341 case DW_AT_allocated:
7342 case DW_AT_associated:
7343 case DW_AT_data_location:
7344 case DW_AT_stride:
7345 case DW_AT_upper_bound:
7346 case DW_AT_lower_bound:
7347 if (block_start)
7348 {
7349 printf ("(");
7350 decode_location_expression (block_start, pointer_size, uvalue);
7351 printf (")");
7352 }
7353 break;
7354
7355 default:
7356 break;
7357 }
7358
7359 return data;
7360 }
7361
7362 static unsigned char *
7363 read_and_display_attr (attribute, form, data, cu_offset, pointer_size)
7364 unsigned long attribute;
7365 unsigned long form;
7366 unsigned char * data;
7367 unsigned long cu_offset;
7368 unsigned long pointer_size;
7369 {
7370 printf (" %-18s:", get_AT_name (attribute));
7371 data = read_and_display_attr_value (attribute, form, data, cu_offset,
7372 pointer_size);
7373 printf ("\n");
7374 return data;
7375 }
7376
7377 static int
7378 display_debug_info (section, start, file)
7379 Elf32_Internal_Shdr * section;
7380 unsigned char * start;
7381 FILE * file;
7382 {
7383 unsigned char * end = start + section->sh_size;
7384 unsigned char * section_begin = start;
7385
7386 printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
7387
7388 load_debug_str (file);
7389
7390 while (start < end)
7391 {
7392 DWARF2_External_CompUnit * external;
7393 DWARF2_Internal_CompUnit compunit;
7394 Elf32_Internal_Shdr * relsec;
7395 unsigned char * tags;
7396 int i;
7397 int level;
7398 unsigned long cu_offset;
7399
7400 external = (DWARF2_External_CompUnit *) start;
7401
7402 compunit.cu_length = BYTE_GET (external->cu_length);
7403 compunit.cu_version = BYTE_GET (external->cu_version);
7404 compunit.cu_abbrev_offset = BYTE_GET (external->cu_abbrev_offset);
7405 compunit.cu_pointer_size = BYTE_GET (external->cu_pointer_size);
7406
7407 if (compunit.cu_length == 0xffffffff)
7408 {
7409 warn (_("64-bit DWARF debug info is not supported yet.\n"));
7410 break;
7411 }
7412
7413 /* Check for RELA relocations in the abbrev_offset address, and
7414 apply them. */
7415 for (relsec = section_headers;
7416 relsec < section_headers + elf_header.e_shnum;
7417 ++relsec)
7418 {
7419 unsigned long nrelas, nsyms;
7420 Elf_Internal_Rela *rela, *rp;
7421 Elf32_Internal_Shdr *symsec;
7422 Elf_Internal_Sym *symtab;
7423 Elf_Internal_Sym *sym;
7424
7425 if (relsec->sh_type != SHT_RELA
7426 || section_headers + relsec->sh_info != section)
7427 continue;
7428
7429 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7430 & rela, & nrelas))
7431 return 0;
7432
7433 symsec = section_headers + relsec->sh_link;
7434 nsyms = symsec->sh_size / symsec->sh_entsize;
7435 symtab = GET_ELF_SYMBOLS (file, symsec->sh_offset, nsyms);
7436
7437 for (rp = rela; rp < rela + nrelas; ++rp)
7438 {
7439 if (rp->r_offset
7440 != (bfd_vma) ((unsigned char *) &external->cu_abbrev_offset
7441 - section_begin))
7442 continue;
7443
7444 if (is_32bit_elf)
7445 {
7446 sym = symtab + ELF32_R_SYM (rp->r_info);
7447
7448 if (ELF32_ST_TYPE (sym->st_info) != STT_SECTION)
7449 {
7450 warn (_("Skipping unexpected symbol type %u\n"),
7451 ELF32_ST_TYPE (sym->st_info));
7452 continue;
7453 }
7454 }
7455 else
7456 {
7457 sym = symtab + ELF64_R_SYM (rp->r_info);
7458
7459 if (ELF64_ST_TYPE (sym->st_info) != STT_SECTION)
7460 {
7461 warn (_("Skipping unexpected symbol type %u\n"),
7462 ELF64_ST_TYPE (sym->st_info));
7463 continue;
7464 }
7465 }
7466
7467 compunit.cu_abbrev_offset += rp->r_addend;
7468 break;
7469 }
7470
7471 free (rela);
7472 break;
7473 }
7474
7475 tags = start + sizeof (* external);
7476 cu_offset = start - section_begin;
7477 start += compunit.cu_length + sizeof (external->cu_length);
7478
7479 printf (_(" Compilation Unit @ %lx:\n"), cu_offset);
7480 printf (_(" Length: %ld\n"), compunit.cu_length);
7481 printf (_(" Version: %d\n"), compunit.cu_version);
7482 printf (_(" Abbrev Offset: %ld\n"), compunit.cu_abbrev_offset);
7483 printf (_(" Pointer Size: %d\n"), compunit.cu_pointer_size);
7484
7485 if (compunit.cu_version != 2)
7486 {
7487 warn (_("Only version 2 DWARF debug information is currently supported.\n"));
7488 continue;
7489 }
7490
7491 free_abbrevs ();
7492
7493 /* Read in the abbrevs used by this compilation unit. */
7494
7495 {
7496 Elf32_Internal_Shdr * sec;
7497 unsigned char * begin;
7498
7499 /* Locate the .debug_abbrev section and process it. */
7500 for (i = 0, sec = section_headers;
7501 i < elf_header.e_shnum;
7502 i ++, sec ++)
7503 if (strcmp (SECTION_NAME (sec), ".debug_abbrev") == 0)
7504 break;
7505
7506 if (i == elf_header.e_shnum || sec->sh_size == 0)
7507 {
7508 warn (_("Unable to locate .debug_abbrev section!\n"));
7509 return 0;
7510 }
7511
7512 begin = ((unsigned char *)
7513 get_data (NULL, file, sec->sh_offset, sec->sh_size,
7514 _("debug_abbrev section data")));
7515 if (!begin)
7516 return 0;
7517
7518 process_abbrev_section (begin + compunit.cu_abbrev_offset,
7519 begin + sec->sh_size);
7520
7521 free (begin);
7522 }
7523
7524 level = 0;
7525 while (tags < start)
7526 {
7527 int bytes_read;
7528 unsigned long abbrev_number;
7529 abbrev_entry * entry;
7530 abbrev_attr * attr;
7531
7532 abbrev_number = read_leb128 (tags, & bytes_read, 0);
7533 tags += bytes_read;
7534
7535 /* A null DIE marks the end of a list of children. */
7536 if (abbrev_number == 0)
7537 {
7538 --level;
7539 continue;
7540 }
7541
7542 /* Scan through the abbreviation list until we reach the
7543 correct entry. */
7544 for (entry = first_abbrev;
7545 entry && entry->entry != abbrev_number;
7546 entry = entry->next)
7547 continue;
7548
7549 if (entry == NULL)
7550 {
7551 warn (_("Unable to locate entry %lu in the abbreviation table\n"),
7552 abbrev_number);
7553 return 0;
7554 }
7555
7556 printf (_(" <%d><%lx>: Abbrev Number: %lu (%s)\n"),
7557 level,
7558 (unsigned long) (tags - section_begin - bytes_read),
7559 abbrev_number,
7560 get_TAG_name (entry->tag));
7561
7562 for (attr = entry->first_attr; attr; attr = attr->next)
7563 tags = read_and_display_attr (attr->attribute,
7564 attr->form,
7565 tags, cu_offset,
7566 compunit.cu_pointer_size);
7567
7568 if (entry->children)
7569 ++level;
7570 }
7571 }
7572
7573 free_debug_str ();
7574
7575 printf ("\n");
7576
7577 return 1;
7578 }
7579
7580 static int
7581 display_debug_aranges (section, start, file)
7582 Elf32_Internal_Shdr * section;
7583 unsigned char * start;
7584 FILE * file ATTRIBUTE_UNUSED;
7585 {
7586 unsigned char * end = start + section->sh_size;
7587
7588 printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
7589
7590 while (start < end)
7591 {
7592 DWARF2_External_ARange * external;
7593 DWARF2_Internal_ARange arange;
7594 unsigned char * ranges;
7595 unsigned long length;
7596 unsigned long address;
7597 int excess;
7598
7599 external = (DWARF2_External_ARange *) start;
7600
7601 arange.ar_length = BYTE_GET (external->ar_length);
7602 arange.ar_version = BYTE_GET (external->ar_version);
7603 arange.ar_info_offset = BYTE_GET (external->ar_info_offset);
7604 arange.ar_pointer_size = BYTE_GET (external->ar_pointer_size);
7605 arange.ar_segment_size = BYTE_GET (external->ar_segment_size);
7606
7607 if (arange.ar_length == 0xffffffff)
7608 {
7609 warn (_("64-bit DWARF aranges are not supported yet.\n"));
7610 break;
7611 }
7612
7613 if (arange.ar_version != 2)
7614 {
7615 warn (_("Only DWARF 2 aranges are currently supported.\n"));
7616 break;
7617 }
7618
7619 printf (_(" Length: %ld\n"), arange.ar_length);
7620 printf (_(" Version: %d\n"), arange.ar_version);
7621 printf (_(" Offset into .debug_info: %lx\n"), arange.ar_info_offset);
7622 printf (_(" Pointer Size: %d\n"), arange.ar_pointer_size);
7623 printf (_(" Segment Size: %d\n"), arange.ar_segment_size);
7624
7625 printf (_("\n Address Length\n"));
7626
7627 ranges = start + sizeof (* external);
7628
7629 /* Must pad to an alignment boundary that is twice the pointer size. */
7630 excess = sizeof (* external) % (2 * arange.ar_pointer_size);
7631 if (excess)
7632 ranges += (2 * arange.ar_pointer_size) - excess;
7633
7634 for (;;)
7635 {
7636 address = byte_get (ranges, arange.ar_pointer_size);
7637
7638 ranges += arange.ar_pointer_size;
7639
7640 length = byte_get (ranges, arange.ar_pointer_size);
7641
7642 ranges += arange.ar_pointer_size;
7643
7644 /* A pair of zeros marks the end of the list. */
7645 if (address == 0 && length == 0)
7646 break;
7647
7648 printf (" %8.8lx %lu\n", address, length);
7649 }
7650
7651 start += arange.ar_length + sizeof (external->ar_length);
7652 }
7653
7654 printf ("\n");
7655
7656 return 1;
7657 }
7658
7659 typedef struct Frame_Chunk
7660 {
7661 struct Frame_Chunk * next;
7662 unsigned char * chunk_start;
7663 int ncols;
7664 /* DW_CFA_{undefined,same_value,offset,register,unreferenced} */
7665 short int * col_type;
7666 int * col_offset;
7667 char * augmentation;
7668 unsigned int code_factor;
7669 int data_factor;
7670 unsigned long pc_begin;
7671 unsigned long pc_range;
7672 int cfa_reg;
7673 int cfa_offset;
7674 int ra;
7675 unsigned char fde_encoding;
7676 }
7677 Frame_Chunk;
7678
7679 /* A marker for a col_type that means this column was never referenced
7680 in the frame info. */
7681 #define DW_CFA_unreferenced (-1)
7682
7683 static void frame_need_space PARAMS ((Frame_Chunk *, int));
7684 static void frame_display_row PARAMS ((Frame_Chunk *, int *, int *));
7685 static int size_of_encoded_value PARAMS ((int));
7686
7687 static void
7688 frame_need_space (fc, reg)
7689 Frame_Chunk * fc;
7690 int reg;
7691 {
7692 int prev = fc->ncols;
7693
7694 if (reg < fc->ncols)
7695 return;
7696
7697 fc->ncols = reg + 1;
7698 fc->col_type = (short int *) xrealloc (fc->col_type,
7699 fc->ncols * sizeof (short int));
7700 fc->col_offset = (int *) xrealloc (fc->col_offset,
7701 fc->ncols * sizeof (int));
7702
7703 while (prev < fc->ncols)
7704 {
7705 fc->col_type[prev] = DW_CFA_unreferenced;
7706 fc->col_offset[prev] = 0;
7707 prev++;
7708 }
7709 }
7710
7711 static void
7712 frame_display_row (fc, need_col_headers, max_regs)
7713 Frame_Chunk * fc;
7714 int * need_col_headers;
7715 int * max_regs;
7716 {
7717 int r;
7718 char tmp[100];
7719
7720 if (* max_regs < fc->ncols)
7721 * max_regs = fc->ncols;
7722
7723 if (* need_col_headers)
7724 {
7725 * need_col_headers = 0;
7726
7727 printf (" LOC CFA ");
7728
7729 for (r = 0; r < * max_regs; r++)
7730 if (fc->col_type[r] != DW_CFA_unreferenced)
7731 {
7732 if (r == fc->ra)
7733 printf ("ra ");
7734 else
7735 printf ("r%-4d", r);
7736 }
7737
7738 printf ("\n");
7739 }
7740
7741 printf ("%08lx ", fc->pc_begin);
7742 sprintf (tmp, "r%d%+d", fc->cfa_reg, fc->cfa_offset);
7743 printf ("%-8s ", tmp);
7744
7745 for (r = 0; r < fc->ncols; r++)
7746 {
7747 if (fc->col_type[r] != DW_CFA_unreferenced)
7748 {
7749 switch (fc->col_type[r])
7750 {
7751 case DW_CFA_undefined:
7752 strcpy (tmp, "u");
7753 break;
7754 case DW_CFA_same_value:
7755 strcpy (tmp, "s");
7756 break;
7757 case DW_CFA_offset:
7758 sprintf (tmp, "c%+d", fc->col_offset[r]);
7759 break;
7760 case DW_CFA_register:
7761 sprintf (tmp, "r%d", fc->col_offset[r]);
7762 break;
7763 default:
7764 strcpy (tmp, "n/a");
7765 break;
7766 }
7767 printf ("%-5s", tmp);
7768 }
7769 }
7770 printf ("\n");
7771 }
7772
7773 static int
7774 size_of_encoded_value (encoding)
7775 int encoding;
7776 {
7777 switch (encoding & 0x7)
7778 {
7779 default: /* ??? */
7780 case 0: return is_32bit_elf ? 4 : 8;
7781 case 2: return 2;
7782 case 3: return 4;
7783 case 4: return 8;
7784 }
7785 }
7786
7787 #define GET(N) byte_get (start, N); start += N
7788 #define LEB() read_leb128 (start, & length_return, 0); start += length_return
7789 #define SLEB() read_leb128 (start, & length_return, 1); start += length_return
7790
7791 static int
7792 display_debug_frames (section, start, file)
7793 Elf32_Internal_Shdr * section;
7794 unsigned char * start;
7795 FILE * file ATTRIBUTE_UNUSED;
7796 {
7797 unsigned char * end = start + section->sh_size;
7798 unsigned char * section_start = start;
7799 Frame_Chunk * chunks = 0;
7800 Frame_Chunk * remembered_state = 0;
7801 Frame_Chunk * rs;
7802 int is_eh = (strcmp (SECTION_NAME (section), ".eh_frame") == 0);
7803 int length_return;
7804 int max_regs = 0;
7805 int addr_size = is_32bit_elf ? 4 : 8;
7806
7807 printf (_("The section %s contains:\n"), SECTION_NAME (section));
7808
7809 while (start < end)
7810 {
7811 unsigned char * saved_start;
7812 unsigned char * block_end;
7813 unsigned long length;
7814 unsigned long cie_id;
7815 Frame_Chunk * fc;
7816 Frame_Chunk * cie;
7817 int need_col_headers = 1;
7818 unsigned char * augmentation_data = NULL;
7819 unsigned long augmentation_data_len = 0;
7820 int encoded_ptr_size = addr_size;
7821
7822 saved_start = start;
7823 length = byte_get (start, 4); start += 4;
7824
7825 if (length == 0)
7826 return 1;
7827
7828 if (length == 0xffffffff)
7829 {
7830 warn (_("64-bit DWARF format frames are not supported yet.\n"));
7831 break;
7832 }
7833
7834 block_end = saved_start + length + 4;
7835 cie_id = byte_get (start, 4); start += 4;
7836
7837 if (is_eh ? (cie_id == 0) : (cie_id == DW_CIE_ID))
7838 {
7839 int version;
7840
7841 fc = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
7842 memset (fc, 0, sizeof (Frame_Chunk));
7843
7844 fc->next = chunks;
7845 chunks = fc;
7846 fc->chunk_start = saved_start;
7847 fc->ncols = 0;
7848 fc->col_type = (short int *) xmalloc (sizeof (short int));
7849 fc->col_offset = (int *) xmalloc (sizeof (int));
7850 frame_need_space (fc, max_regs-1);
7851
7852 version = *start++;
7853
7854 fc->augmentation = start;
7855 start = strchr (start, '\0') + 1;
7856
7857 if (fc->augmentation[0] == 'z')
7858 {
7859 fc->code_factor = LEB ();
7860 fc->data_factor = SLEB ();
7861 fc->ra = byte_get (start, 1); start += 1;
7862 augmentation_data_len = LEB ();
7863 augmentation_data = start;
7864 start += augmentation_data_len;
7865 }
7866 else if (strcmp (fc->augmentation, "eh") == 0)
7867 {
7868 start += addr_size;
7869 fc->code_factor = LEB ();
7870 fc->data_factor = SLEB ();
7871 fc->ra = byte_get (start, 1); start += 1;
7872 }
7873 else
7874 {
7875 fc->code_factor = LEB ();
7876 fc->data_factor = SLEB ();
7877 fc->ra = byte_get (start, 1); start += 1;
7878 }
7879 cie = fc;
7880
7881 if (do_debug_frames_interp)
7882 printf ("\n%08lx %08lx %08lx CIE \"%s\" cf=%d df=%d ra=%d\n",
7883 (unsigned long)(saved_start - section_start), length, cie_id,
7884 fc->augmentation, fc->code_factor, fc->data_factor,
7885 fc->ra);
7886 else
7887 {
7888 printf ("\n%08lx %08lx %08lx CIE\n",
7889 (unsigned long)(saved_start - section_start), length, cie_id);
7890 printf (" Version: %d\n", version);
7891 printf (" Augmentation: \"%s\"\n", fc->augmentation);
7892 printf (" Code alignment factor: %u\n", fc->code_factor);
7893 printf (" Data alignment factor: %d\n", fc->data_factor);
7894 printf (" Return address column: %d\n", fc->ra);
7895
7896 if (augmentation_data_len)
7897 {
7898 unsigned long i;
7899 printf (" Augmentation data: ");
7900 for (i = 0; i < augmentation_data_len; ++i)
7901 printf (" %02x", augmentation_data[i]);
7902 putchar ('\n');
7903 }
7904 putchar ('\n');
7905 }
7906
7907 if (augmentation_data_len)
7908 {
7909 unsigned char *p, *q;
7910 p = fc->augmentation + 1;
7911 q = augmentation_data;
7912
7913 while (1)
7914 {
7915 if (*p == 'L')
7916 q++;
7917 else if (*p == 'P')
7918 q += 1 + size_of_encoded_value (*q);
7919 else if (*p == 'R')
7920 fc->fde_encoding = *q++;
7921 else
7922 break;
7923 p++;
7924 }
7925
7926 if (fc->fde_encoding)
7927 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
7928 }
7929
7930 frame_need_space (fc, fc->ra);
7931 }
7932 else
7933 {
7934 unsigned char * look_for;
7935 static Frame_Chunk fde_fc;
7936
7937 fc = & fde_fc;
7938 memset (fc, 0, sizeof (Frame_Chunk));
7939
7940 look_for = is_eh ? start - 4 - cie_id : section_start + cie_id;
7941
7942 for (cie = chunks; cie ; cie = cie->next)
7943 if (cie->chunk_start == look_for)
7944 break;
7945
7946 if (!cie)
7947 {
7948 warn ("Invalid CIE pointer %08lx in FDE at %08lx\n",
7949 cie_id, saved_start);
7950 start = block_end;
7951 fc->ncols = 0;
7952 fc->col_type = (short int *) xmalloc (sizeof (short int));
7953 fc->col_offset = (int *) xmalloc (sizeof (int));
7954 frame_need_space (fc, max_regs - 1);
7955 cie = fc;
7956 fc->augmentation = "";
7957 fc->fde_encoding = 0;
7958 }
7959 else
7960 {
7961 fc->ncols = cie->ncols;
7962 fc->col_type = (short int *) xmalloc (fc->ncols * sizeof (short int));
7963 fc->col_offset = (int *) xmalloc (fc->ncols * sizeof (int));
7964 memcpy (fc->col_type, cie->col_type, fc->ncols * sizeof (short int));
7965 memcpy (fc->col_offset, cie->col_offset, fc->ncols * sizeof (int));
7966 fc->augmentation = cie->augmentation;
7967 fc->code_factor = cie->code_factor;
7968 fc->data_factor = cie->data_factor;
7969 fc->cfa_reg = cie->cfa_reg;
7970 fc->cfa_offset = cie->cfa_offset;
7971 fc->ra = cie->ra;
7972 frame_need_space (fc, max_regs-1);
7973 fc->fde_encoding = cie->fde_encoding;
7974 }
7975
7976 if (fc->fde_encoding)
7977 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
7978
7979 fc->pc_begin = byte_get (start, encoded_ptr_size);
7980 start += encoded_ptr_size;
7981 fc->pc_range = byte_get (start, encoded_ptr_size);
7982 start += encoded_ptr_size;
7983
7984 if (cie->augmentation[0] == 'z')
7985 {
7986 augmentation_data_len = LEB ();
7987 augmentation_data = start;
7988 start += augmentation_data_len;
7989 }
7990
7991 printf ("\n%08lx %08lx %08lx FDE cie=%08lx pc=%08lx..%08lx\n",
7992 (unsigned long)(saved_start - section_start), length, cie_id,
7993 (unsigned long)(cie->chunk_start - section_start),
7994 fc->pc_begin, fc->pc_begin + fc->pc_range);
7995 if (! do_debug_frames_interp && augmentation_data_len)
7996 {
7997 unsigned long i;
7998 printf (" Augmentation data: ");
7999 for (i = 0; i < augmentation_data_len; ++i)
8000 printf (" %02x", augmentation_data[i]);
8001 putchar ('\n');
8002 putchar ('\n');
8003 }
8004 }
8005
8006 /* At this point, fc is the current chunk, cie (if any) is set, and we're
8007 about to interpret instructions for the chunk. */
8008
8009 if (do_debug_frames_interp)
8010 {
8011 /* Start by making a pass over the chunk, allocating storage
8012 and taking note of what registers are used. */
8013 unsigned char * tmp = start;
8014
8015 while (start < block_end)
8016 {
8017 unsigned op, opa;
8018 unsigned long reg;
8019
8020 op = * start ++;
8021 opa = op & 0x3f;
8022 if (op & 0xc0)
8023 op &= 0xc0;
8024
8025 /* Warning: if you add any more cases to this switch, be
8026 sure to add them to the corresponding switch below. */
8027 switch (op)
8028 {
8029 case DW_CFA_advance_loc:
8030 break;
8031 case DW_CFA_offset:
8032 LEB ();
8033 frame_need_space (fc, opa);
8034 fc->col_type[opa] = DW_CFA_undefined;
8035 break;
8036 case DW_CFA_restore:
8037 frame_need_space (fc, opa);
8038 fc->col_type[opa] = DW_CFA_undefined;
8039 break;
8040 case DW_CFA_set_loc:
8041 start += encoded_ptr_size;
8042 break;
8043 case DW_CFA_advance_loc1:
8044 start += 1;
8045 break;
8046 case DW_CFA_advance_loc2:
8047 start += 2;
8048 break;
8049 case DW_CFA_advance_loc4:
8050 start += 4;
8051 break;
8052 case DW_CFA_offset_extended:
8053 reg = LEB (); LEB ();
8054 frame_need_space (fc, reg);
8055 fc->col_type[reg] = DW_CFA_undefined;
8056 break;
8057 case DW_CFA_restore_extended:
8058 reg = LEB ();
8059 frame_need_space (fc, reg);
8060 fc->col_type[reg] = DW_CFA_undefined;
8061 break;
8062 case DW_CFA_undefined:
8063 reg = LEB ();
8064 frame_need_space (fc, reg);
8065 fc->col_type[reg] = DW_CFA_undefined;
8066 break;
8067 case DW_CFA_same_value:
8068 reg = LEB ();
8069 frame_need_space (fc, reg);
8070 fc->col_type[reg] = DW_CFA_undefined;
8071 break;
8072 case DW_CFA_register:
8073 reg = LEB (); LEB ();
8074 frame_need_space (fc, reg);
8075 fc->col_type[reg] = DW_CFA_undefined;
8076 break;
8077 case DW_CFA_def_cfa:
8078 LEB (); LEB ();
8079 break;
8080 case DW_CFA_def_cfa_register:
8081 LEB ();
8082 break;
8083 case DW_CFA_def_cfa_offset:
8084 LEB ();
8085 break;
8086 #ifndef DW_CFA_GNU_args_size
8087 #define DW_CFA_GNU_args_size 0x2e
8088 #endif
8089 case DW_CFA_GNU_args_size:
8090 LEB ();
8091 break;
8092 #ifndef DW_CFA_GNU_negative_offset_extended
8093 #define DW_CFA_GNU_negative_offset_extended 0x2f
8094 #endif
8095 case DW_CFA_GNU_negative_offset_extended:
8096 reg = LEB (); LEB ();
8097 frame_need_space (fc, reg);
8098 fc->col_type[reg] = DW_CFA_undefined;
8099
8100 default:
8101 break;
8102 }
8103 }
8104 start = tmp;
8105 }
8106
8107 /* Now we know what registers are used, make a second pass over
8108 the chunk, this time actually printing out the info. */
8109
8110 while (start < block_end)
8111 {
8112 unsigned op, opa;
8113 unsigned long ul, reg, roffs;
8114 long l, ofs;
8115 bfd_vma vma;
8116
8117 op = * start ++;
8118 opa = op & 0x3f;
8119 if (op & 0xc0)
8120 op &= 0xc0;
8121
8122 /* Warning: if you add any more cases to this switch, be
8123 sure to add them to the corresponding switch above. */
8124 switch (op)
8125 {
8126 case DW_CFA_advance_loc:
8127 if (do_debug_frames_interp)
8128 frame_display_row (fc, &need_col_headers, &max_regs);
8129 else
8130 printf (" DW_CFA_advance_loc: %d to %08lx\n",
8131 opa * fc->code_factor,
8132 fc->pc_begin + opa * fc->code_factor);
8133 fc->pc_begin += opa * fc->code_factor;
8134 break;
8135
8136 case DW_CFA_offset:
8137 roffs = LEB ();
8138 if (! do_debug_frames_interp)
8139 printf (" DW_CFA_offset: r%d at cfa%+ld\n",
8140 opa, roffs * fc->data_factor);
8141 fc->col_type[opa] = DW_CFA_offset;
8142 fc->col_offset[opa] = roffs * fc->data_factor;
8143 break;
8144
8145 case DW_CFA_restore:
8146 if (! do_debug_frames_interp)
8147 printf (" DW_CFA_restore: r%d\n", opa);
8148 fc->col_type[opa] = cie->col_type[opa];
8149 fc->col_offset[opa] = cie->col_offset[opa];
8150 break;
8151
8152 case DW_CFA_set_loc:
8153 vma = byte_get (start, encoded_ptr_size);
8154 start += encoded_ptr_size;
8155 if (do_debug_frames_interp)
8156 frame_display_row (fc, &need_col_headers, &max_regs);
8157 else
8158 printf (" DW_CFA_set_loc: %08lx\n", (unsigned long)vma);
8159 fc->pc_begin = vma;
8160 break;
8161
8162 case DW_CFA_advance_loc1:
8163 ofs = byte_get (start, 1); start += 1;
8164 if (do_debug_frames_interp)
8165 frame_display_row (fc, &need_col_headers, &max_regs);
8166 else
8167 printf (" DW_CFA_advance_loc1: %ld to %08lx\n",
8168 ofs * fc->code_factor,
8169 fc->pc_begin + ofs * fc->code_factor);
8170 fc->pc_begin += ofs * fc->code_factor;
8171 break;
8172
8173 case DW_CFA_advance_loc2:
8174 ofs = byte_get (start, 2); start += 2;
8175 if (do_debug_frames_interp)
8176 frame_display_row (fc, &need_col_headers, &max_regs);
8177 else
8178 printf (" DW_CFA_advance_loc2: %ld to %08lx\n",
8179 ofs * fc->code_factor,
8180 fc->pc_begin + ofs * fc->code_factor);
8181 fc->pc_begin += ofs * fc->code_factor;
8182 break;
8183
8184 case DW_CFA_advance_loc4:
8185 ofs = byte_get (start, 4); start += 4;
8186 if (do_debug_frames_interp)
8187 frame_display_row (fc, &need_col_headers, &max_regs);
8188 else
8189 printf (" DW_CFA_advance_loc4: %ld to %08lx\n",
8190 ofs * fc->code_factor,
8191 fc->pc_begin + ofs * fc->code_factor);
8192 fc->pc_begin += ofs * fc->code_factor;
8193 break;
8194
8195 case DW_CFA_offset_extended:
8196 reg = LEB ();
8197 roffs = LEB ();
8198 if (! do_debug_frames_interp)
8199 printf (" DW_CFA_offset_extended: r%ld at cfa%+ld\n",
8200 reg, roffs * fc->data_factor);
8201 fc->col_type[reg] = DW_CFA_offset;
8202 fc->col_offset[reg] = roffs * fc->data_factor;
8203 break;
8204
8205 case DW_CFA_restore_extended:
8206 reg = LEB ();
8207 if (! do_debug_frames_interp)
8208 printf (" DW_CFA_restore_extended: r%ld\n", reg);
8209 fc->col_type[reg] = cie->col_type[reg];
8210 fc->col_offset[reg] = cie->col_offset[reg];
8211 break;
8212
8213 case DW_CFA_undefined:
8214 reg = LEB ();
8215 if (! do_debug_frames_interp)
8216 printf (" DW_CFA_undefined: r%ld\n", reg);
8217 fc->col_type[reg] = DW_CFA_undefined;
8218 fc->col_offset[reg] = 0;
8219 break;
8220
8221 case DW_CFA_same_value:
8222 reg = LEB ();
8223 if (! do_debug_frames_interp)
8224 printf (" DW_CFA_same_value: r%ld\n", reg);
8225 fc->col_type[reg] = DW_CFA_same_value;
8226 fc->col_offset[reg] = 0;
8227 break;
8228
8229 case DW_CFA_register:
8230 reg = LEB ();
8231 roffs = LEB ();
8232 if (! do_debug_frames_interp)
8233 printf (" DW_CFA_register: r%ld\n", reg);
8234 fc->col_type[reg] = DW_CFA_register;
8235 fc->col_offset[reg] = roffs;
8236 break;
8237
8238 case DW_CFA_remember_state:
8239 if (! do_debug_frames_interp)
8240 printf (" DW_CFA_remember_state\n");
8241 rs = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
8242 rs->ncols = fc->ncols;
8243 rs->col_type = (short int *) xmalloc (rs->ncols * sizeof (short int));
8244 rs->col_offset = (int *) xmalloc (rs->ncols * sizeof (int));
8245 memcpy (rs->col_type, fc->col_type, rs->ncols);
8246 memcpy (rs->col_offset, fc->col_offset, rs->ncols * sizeof (int));
8247 rs->next = remembered_state;
8248 remembered_state = rs;
8249 break;
8250
8251 case DW_CFA_restore_state:
8252 if (! do_debug_frames_interp)
8253 printf (" DW_CFA_restore_state\n");
8254 rs = remembered_state;
8255 remembered_state = rs->next;
8256 frame_need_space (fc, rs->ncols-1);
8257 memcpy (fc->col_type, rs->col_type, rs->ncols);
8258 memcpy (fc->col_offset, rs->col_offset, rs->ncols * sizeof (int));
8259 free (rs->col_type);
8260 free (rs->col_offset);
8261 free (rs);
8262 break;
8263
8264 case DW_CFA_def_cfa:
8265 fc->cfa_reg = LEB ();
8266 fc->cfa_offset = LEB ();
8267 if (! do_debug_frames_interp)
8268 printf (" DW_CFA_def_cfa: r%d ofs %d\n",
8269 fc->cfa_reg, fc->cfa_offset);
8270 break;
8271
8272 case DW_CFA_def_cfa_register:
8273 fc->cfa_reg = LEB ();
8274 if (! do_debug_frames_interp)
8275 printf (" DW_CFA_def_cfa_reg: r%d\n", fc->cfa_reg);
8276 break;
8277
8278 case DW_CFA_def_cfa_offset:
8279 fc->cfa_offset = LEB ();
8280 if (! do_debug_frames_interp)
8281 printf (" DW_CFA_def_cfa_offset: %d\n", fc->cfa_offset);
8282 break;
8283
8284 case DW_CFA_nop:
8285 if (! do_debug_frames_interp)
8286 printf (" DW_CFA_nop\n");
8287 break;
8288
8289 #ifndef DW_CFA_GNU_window_save
8290 #define DW_CFA_GNU_window_save 0x2d
8291 #endif
8292 case DW_CFA_GNU_window_save:
8293 if (! do_debug_frames_interp)
8294 printf (" DW_CFA_GNU_window_save\n");
8295 break;
8296
8297 case DW_CFA_GNU_args_size:
8298 ul = LEB ();
8299 if (! do_debug_frames_interp)
8300 printf (" DW_CFA_GNU_args_size: %ld\n", ul);
8301 break;
8302
8303 case DW_CFA_GNU_negative_offset_extended:
8304 reg = LEB ();
8305 l = - LEB ();
8306 frame_need_space (fc, reg);
8307 if (! do_debug_frames_interp)
8308 printf (" DW_CFA_GNU_negative_offset_extended: r%ld at cfa%+ld\n",
8309 reg, l * fc->data_factor);
8310 fc->col_type[reg] = DW_CFA_offset;
8311 fc->col_offset[reg] = l * fc->data_factor;
8312 break;
8313
8314 default:
8315 fprintf (stderr, "unsupported or unknown DW_CFA_%d\n", op);
8316 start = block_end;
8317 }
8318 }
8319
8320 if (do_debug_frames_interp)
8321 frame_display_row (fc, &need_col_headers, &max_regs);
8322
8323 start = block_end;
8324 }
8325
8326 printf ("\n");
8327
8328 return 1;
8329 }
8330
8331 #undef GET
8332 #undef LEB
8333 #undef SLEB
8334
8335 static int
8336 display_debug_not_supported (section, start, file)
8337 Elf32_Internal_Shdr * section;
8338 unsigned char * start ATTRIBUTE_UNUSED;
8339 FILE * file ATTRIBUTE_UNUSED;
8340 {
8341 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
8342 SECTION_NAME (section));
8343
8344 return 1;
8345 }
8346
8347 /* Pre-scan the .debug_info section to record the size of address.
8348 When dumping the .debug_line, we use that size information, assuming
8349 that all compilation units have the same address size. */
8350 static int
8351 prescan_debug_info (section, start, file)
8352 Elf32_Internal_Shdr * section ATTRIBUTE_UNUSED;
8353 unsigned char * start;
8354 FILE * file ATTRIBUTE_UNUSED;
8355 {
8356 DWARF2_External_CompUnit * external;
8357
8358 external = (DWARF2_External_CompUnit *) start;
8359
8360 debug_line_pointer_size = BYTE_GET (external->cu_pointer_size);
8361 return 0;
8362 }
8363
8364 /* A structure containing the name of a debug section and a pointer
8365 to a function that can decode it. The third field is a prescan
8366 function to be run over the section before displaying any of the
8367 sections. */
8368 struct
8369 {
8370 const char * const name;
8371 int (* display) PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
8372 int (* prescan) PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
8373 }
8374 debug_displays[] =
8375 {
8376 { ".debug_abbrev", display_debug_abbrev, NULL },
8377 { ".debug_aranges", display_debug_aranges, NULL },
8378 { ".debug_frame", display_debug_frames, NULL },
8379 { ".debug_info", display_debug_info, prescan_debug_info },
8380 { ".debug_line", display_debug_lines, NULL },
8381 { ".debug_pubnames", display_debug_pubnames, NULL },
8382 { ".eh_frame", display_debug_frames, NULL },
8383 { ".debug_macinfo", display_debug_macinfo, NULL },
8384 { ".debug_str", display_debug_str, NULL },
8385
8386 { ".debug_pubtypes", display_debug_not_supported, NULL },
8387 { ".debug_ranges", display_debug_not_supported, NULL },
8388 { ".debug_static_func", display_debug_not_supported, NULL },
8389 { ".debug_static_vars", display_debug_not_supported, NULL },
8390 { ".debug_types", display_debug_not_supported, NULL },
8391 { ".debug_weaknames", display_debug_not_supported, NULL }
8392 };
8393
8394 static int
8395 display_debug_section (section, file)
8396 Elf32_Internal_Shdr * section;
8397 FILE * file;
8398 {
8399 char * name = SECTION_NAME (section);
8400 bfd_size_type length;
8401 unsigned char * start;
8402 int i;
8403
8404 length = section->sh_size;
8405 if (length == 0)
8406 {
8407 printf (_("\nSection '%s' has no debugging data.\n"), name);
8408 return 0;
8409 }
8410
8411 start = (unsigned char *) get_data (NULL, file, section->sh_offset, length,
8412 _("debug section data"));
8413 if (!start)
8414 return 0;
8415
8416 /* See if we know how to display the contents of this section. */
8417 if (strncmp (name, ".gnu.linkonce.wi.", 17) == 0)
8418 name = ".debug_info";
8419
8420 for (i = NUM_ELEM (debug_displays); i--;)
8421 if (strcmp (debug_displays[i].name, name) == 0)
8422 {
8423 debug_displays[i].display (section, start, file);
8424 break;
8425 }
8426
8427 if (i == -1)
8428 printf (_("Unrecognised debug section: %s\n"), name);
8429
8430 free (start);
8431
8432 /* If we loaded in the abbrev section at some point,
8433 we must release it here. */
8434 free_abbrevs ();
8435
8436 return 1;
8437 }
8438
8439 static int
8440 process_section_contents (file)
8441 FILE * file;
8442 {
8443 Elf32_Internal_Shdr * section;
8444 unsigned int i;
8445
8446 if (! do_dump)
8447 return 1;
8448
8449 /* Pre-scan the debug sections to find some debug information not
8450 present in some of them. For the .debug_line, we must find out the
8451 size of address (specified in .debug_info and .debug_aranges). */
8452 for (i = 0, section = section_headers;
8453 i < elf_header.e_shnum && i < num_dump_sects;
8454 i ++, section ++)
8455 {
8456 char * name = SECTION_NAME (section);
8457 int j;
8458
8459 if (section->sh_size == 0)
8460 continue;
8461
8462 /* See if there is some pre-scan operation for this section. */
8463 for (j = NUM_ELEM (debug_displays); j--;)
8464 if (strcmp (debug_displays[j].name, name) == 0)
8465 {
8466 if (debug_displays[j].prescan != NULL)
8467 {
8468 bfd_size_type length;
8469 unsigned char * start;
8470
8471 length = section->sh_size;
8472 start = ((unsigned char *)
8473 get_data (NULL, file, section->sh_offset, length,
8474 _("debug section data")));
8475 if (!start)
8476 return 0;
8477
8478 debug_displays[j].prescan (section, start, file);
8479 free (start);
8480 }
8481
8482 break;
8483 }
8484 }
8485
8486 for (i = 0, section = section_headers;
8487 i < elf_header.e_shnum && i < num_dump_sects;
8488 i ++, section ++)
8489 {
8490 #ifdef SUPPORT_DISASSEMBLY
8491 if (dump_sects[i] & DISASS_DUMP)
8492 disassemble_section (section, file);
8493 #endif
8494 if (dump_sects[i] & HEX_DUMP)
8495 dump_section (section, file);
8496
8497 if (dump_sects[i] & DEBUG_DUMP)
8498 display_debug_section (section, file);
8499 }
8500
8501 if (i < num_dump_sects)
8502 warn (_("Some sections were not dumped because they do not exist!\n"));
8503
8504 return 1;
8505 }
8506
8507 static void
8508 process_mips_fpe_exception (mask)
8509 int mask;
8510 {
8511 if (mask)
8512 {
8513 int first = 1;
8514 if (mask & OEX_FPU_INEX)
8515 fputs ("INEX", stdout), first = 0;
8516 if (mask & OEX_FPU_UFLO)
8517 printf ("%sUFLO", first ? "" : "|"), first = 0;
8518 if (mask & OEX_FPU_OFLO)
8519 printf ("%sOFLO", first ? "" : "|"), first = 0;
8520 if (mask & OEX_FPU_DIV0)
8521 printf ("%sDIV0", first ? "" : "|"), first = 0;
8522 if (mask & OEX_FPU_INVAL)
8523 printf ("%sINVAL", first ? "" : "|");
8524 }
8525 else
8526 fputs ("0", stdout);
8527 }
8528
8529 static int
8530 process_mips_specific (file)
8531 FILE * file;
8532 {
8533 Elf_Internal_Dyn * entry;
8534 size_t liblist_offset = 0;
8535 size_t liblistno = 0;
8536 size_t conflictsno = 0;
8537 size_t options_offset = 0;
8538 size_t conflicts_offset = 0;
8539
8540 /* We have a lot of special sections. Thanks SGI! */
8541 if (dynamic_segment == NULL)
8542 /* No information available. */
8543 return 0;
8544
8545 for (entry = dynamic_segment; entry->d_tag != DT_NULL; ++entry)
8546 switch (entry->d_tag)
8547 {
8548 case DT_MIPS_LIBLIST:
8549 liblist_offset = entry->d_un.d_val - loadaddr;
8550 break;
8551 case DT_MIPS_LIBLISTNO:
8552 liblistno = entry->d_un.d_val;
8553 break;
8554 case DT_MIPS_OPTIONS:
8555 options_offset = entry->d_un.d_val - loadaddr;
8556 break;
8557 case DT_MIPS_CONFLICT:
8558 conflicts_offset = entry->d_un.d_val - loadaddr;
8559 break;
8560 case DT_MIPS_CONFLICTNO:
8561 conflictsno = entry->d_un.d_val;
8562 break;
8563 default:
8564 break;
8565 }
8566
8567 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
8568 {
8569 Elf32_External_Lib * elib;
8570 size_t cnt;
8571
8572 elib = ((Elf32_External_Lib *)
8573 get_data (NULL, file, liblist_offset,
8574 liblistno * sizeof (Elf32_External_Lib),
8575 _("liblist")));
8576 if (elib)
8577 {
8578 printf ("\nSection '.liblist' contains %lu entries:\n",
8579 (unsigned long) liblistno);
8580 fputs (" Library Time Stamp Checksum Version Flags\n",
8581 stdout);
8582
8583 for (cnt = 0; cnt < liblistno; ++cnt)
8584 {
8585 Elf32_Lib liblist;
8586 time_t time;
8587 char timebuf[20];
8588 struct tm * tmp;
8589
8590 liblist.l_name = BYTE_GET (elib[cnt].l_name);
8591 time = BYTE_GET (elib[cnt].l_time_stamp);
8592 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
8593 liblist.l_version = BYTE_GET (elib[cnt].l_version);
8594 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
8595
8596 tmp = gmtime (&time);
8597 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
8598 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
8599 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
8600
8601 printf ("%3lu: %-20s %s %#10lx %-7ld", (unsigned long) cnt,
8602 dynamic_strings + liblist.l_name, timebuf,
8603 liblist.l_checksum, liblist.l_version);
8604
8605 if (liblist.l_flags == 0)
8606 puts (" NONE");
8607 else
8608 {
8609 static const struct
8610 {
8611 const char * name;
8612 int bit;
8613 }
8614 l_flags_vals[] =
8615 {
8616 { " EXACT_MATCH", LL_EXACT_MATCH },
8617 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
8618 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
8619 { " EXPORTS", LL_EXPORTS },
8620 { " DELAY_LOAD", LL_DELAY_LOAD },
8621 { " DELTA", LL_DELTA }
8622 };
8623 int flags = liblist.l_flags;
8624 size_t fcnt;
8625
8626 for (fcnt = 0;
8627 fcnt < sizeof (l_flags_vals) / sizeof (l_flags_vals[0]);
8628 ++fcnt)
8629 if ((flags & l_flags_vals[fcnt].bit) != 0)
8630 {
8631 fputs (l_flags_vals[fcnt].name, stdout);
8632 flags ^= l_flags_vals[fcnt].bit;
8633 }
8634 if (flags != 0)
8635 printf (" %#x", (unsigned int) flags);
8636
8637 puts ("");
8638 }
8639 }
8640
8641 free (elib);
8642 }
8643 }
8644
8645 if (options_offset != 0)
8646 {
8647 Elf_External_Options * eopt;
8648 Elf_Internal_Shdr * sect = section_headers;
8649 Elf_Internal_Options * iopt;
8650 Elf_Internal_Options * option;
8651 size_t offset;
8652 int cnt;
8653
8654 /* Find the section header so that we get the size. */
8655 while (sect->sh_type != SHT_MIPS_OPTIONS)
8656 ++ sect;
8657
8658 eopt = (Elf_External_Options *) get_data (NULL, file, options_offset,
8659 sect->sh_size, _("options"));
8660 if (eopt)
8661 {
8662 iopt = ((Elf_Internal_Options *)
8663 malloc ((sect->sh_size / sizeof (eopt)) * sizeof (* iopt)));
8664 if (iopt == NULL)
8665 {
8666 error (_("Out of memory"));
8667 return 0;
8668 }
8669
8670 offset = cnt = 0;
8671 option = iopt;
8672
8673 while (offset < sect->sh_size)
8674 {
8675 Elf_External_Options * eoption;
8676
8677 eoption = (Elf_External_Options *) ((char *) eopt + offset);
8678
8679 option->kind = BYTE_GET (eoption->kind);
8680 option->size = BYTE_GET (eoption->size);
8681 option->section = BYTE_GET (eoption->section);
8682 option->info = BYTE_GET (eoption->info);
8683
8684 offset += option->size;
8685
8686 ++option;
8687 ++cnt;
8688 }
8689
8690 printf (_("\nSection '%s' contains %d entries:\n"),
8691 SECTION_NAME (sect), cnt);
8692
8693 option = iopt;
8694
8695 while (cnt-- > 0)
8696 {
8697 size_t len;
8698
8699 switch (option->kind)
8700 {
8701 case ODK_NULL:
8702 /* This shouldn't happen. */
8703 printf (" NULL %d %lx", option->section, option->info);
8704 break;
8705 case ODK_REGINFO:
8706 printf (" REGINFO ");
8707 if (elf_header.e_machine == EM_MIPS)
8708 {
8709 /* 32bit form. */
8710 Elf32_External_RegInfo * ereg;
8711 Elf32_RegInfo reginfo;
8712
8713 ereg = (Elf32_External_RegInfo *) (option + 1);
8714 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
8715 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
8716 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
8717 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
8718 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
8719 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
8720
8721 printf ("GPR %08lx GP 0x%lx\n",
8722 reginfo.ri_gprmask,
8723 (unsigned long) reginfo.ri_gp_value);
8724 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
8725 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
8726 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
8727 }
8728 else
8729 {
8730 /* 64 bit form. */
8731 Elf64_External_RegInfo * ereg;
8732 Elf64_Internal_RegInfo reginfo;
8733
8734 ereg = (Elf64_External_RegInfo *) (option + 1);
8735 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
8736 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
8737 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
8738 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
8739 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
8740 reginfo.ri_gp_value = BYTE_GET8 (ereg->ri_gp_value);
8741
8742 printf ("GPR %08lx GP 0x",
8743 reginfo.ri_gprmask);
8744 printf_vma (reginfo.ri_gp_value);
8745 printf ("\n");
8746
8747 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
8748 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
8749 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
8750 }
8751 ++option;
8752 continue;
8753 case ODK_EXCEPTIONS:
8754 fputs (" EXCEPTIONS fpe_min(", stdout);
8755 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
8756 fputs (") fpe_max(", stdout);
8757 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
8758 fputs (")", stdout);
8759
8760 if (option->info & OEX_PAGE0)
8761 fputs (" PAGE0", stdout);
8762 if (option->info & OEX_SMM)
8763 fputs (" SMM", stdout);
8764 if (option->info & OEX_FPDBUG)
8765 fputs (" FPDBUG", stdout);
8766 if (option->info & OEX_DISMISS)
8767 fputs (" DISMISS", stdout);
8768 break;
8769 case ODK_PAD:
8770 fputs (" PAD ", stdout);
8771 if (option->info & OPAD_PREFIX)
8772 fputs (" PREFIX", stdout);
8773 if (option->info & OPAD_POSTFIX)
8774 fputs (" POSTFIX", stdout);
8775 if (option->info & OPAD_SYMBOL)
8776 fputs (" SYMBOL", stdout);
8777 break;
8778 case ODK_HWPATCH:
8779 fputs (" HWPATCH ", stdout);
8780 if (option->info & OHW_R4KEOP)
8781 fputs (" R4KEOP", stdout);
8782 if (option->info & OHW_R8KPFETCH)
8783 fputs (" R8KPFETCH", stdout);
8784 if (option->info & OHW_R5KEOP)
8785 fputs (" R5KEOP", stdout);
8786 if (option->info & OHW_R5KCVTL)
8787 fputs (" R5KCVTL", stdout);
8788 break;
8789 case ODK_FILL:
8790 fputs (" FILL ", stdout);
8791 /* XXX Print content of info word? */
8792 break;
8793 case ODK_TAGS:
8794 fputs (" TAGS ", stdout);
8795 /* XXX Print content of info word? */
8796 break;
8797 case ODK_HWAND:
8798 fputs (" HWAND ", stdout);
8799 if (option->info & OHWA0_R4KEOP_CHECKED)
8800 fputs (" R4KEOP_CHECKED", stdout);
8801 if (option->info & OHWA0_R4KEOP_CLEAN)
8802 fputs (" R4KEOP_CLEAN", stdout);
8803 break;
8804 case ODK_HWOR:
8805 fputs (" HWOR ", stdout);
8806 if (option->info & OHWA0_R4KEOP_CHECKED)
8807 fputs (" R4KEOP_CHECKED", stdout);
8808 if (option->info & OHWA0_R4KEOP_CLEAN)
8809 fputs (" R4KEOP_CLEAN", stdout);
8810 break;
8811 case ODK_GP_GROUP:
8812 printf (" GP_GROUP %#06lx self-contained %#06lx",
8813 option->info & OGP_GROUP,
8814 (option->info & OGP_SELF) >> 16);
8815 break;
8816 case ODK_IDENT:
8817 printf (" IDENT %#06lx self-contained %#06lx",
8818 option->info & OGP_GROUP,
8819 (option->info & OGP_SELF) >> 16);
8820 break;
8821 default:
8822 /* This shouldn't happen. */
8823 printf (" %3d ??? %d %lx",
8824 option->kind, option->section, option->info);
8825 break;
8826 }
8827
8828 len = sizeof (* eopt);
8829 while (len < option->size)
8830 if (((char *) option)[len] >= ' '
8831 && ((char *) option)[len] < 0x7f)
8832 printf ("%c", ((char *) option)[len++]);
8833 else
8834 printf ("\\%03o", ((char *) option)[len++]);
8835
8836 fputs ("\n", stdout);
8837 ++option;
8838 }
8839
8840 free (eopt);
8841 }
8842 }
8843
8844 if (conflicts_offset != 0 && conflictsno != 0)
8845 {
8846 Elf32_Conflict * iconf;
8847 size_t cnt;
8848
8849 if (dynamic_symbols == NULL)
8850 {
8851 error (_("conflict list with without table"));
8852 return 0;
8853 }
8854
8855 iconf = (Elf32_Conflict *) malloc (conflictsno * sizeof (* iconf));
8856 if (iconf == NULL)
8857 {
8858 error (_("Out of memory"));
8859 return 0;
8860 }
8861
8862 if (is_32bit_elf)
8863 {
8864 Elf32_External_Conflict * econf32;
8865
8866 econf32 = ((Elf32_External_Conflict *)
8867 get_data (NULL, file, conflicts_offset,
8868 conflictsno * sizeof (* econf32),
8869 _("conflict")));
8870 if (!econf32)
8871 return 0;
8872
8873 for (cnt = 0; cnt < conflictsno; ++cnt)
8874 iconf[cnt] = BYTE_GET (econf32[cnt]);
8875
8876 free (econf32);
8877 }
8878 else
8879 {
8880 Elf64_External_Conflict * econf64;
8881
8882 econf64 = ((Elf64_External_Conflict *)
8883 get_data (NULL, file, conflicts_offset,
8884 conflictsno * sizeof (* econf64),
8885 _("conflict")));
8886 if (!econf64)
8887 return 0;
8888
8889 for (cnt = 0; cnt < conflictsno; ++cnt)
8890 iconf[cnt] = BYTE_GET (econf64[cnt]);
8891
8892 free (econf64);
8893 }
8894
8895 printf (_("\nSection '.conflict' contains %ld entries:\n"),
8896 (long) conflictsno);
8897 puts (_(" Num: Index Value Name"));
8898
8899 for (cnt = 0; cnt < conflictsno; ++cnt)
8900 {
8901 Elf_Internal_Sym * psym = &dynamic_symbols[iconf[cnt]];
8902
8903 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
8904 print_vma (psym->st_value, FULL_HEX);
8905 printf (" %s\n", dynamic_strings + psym->st_name);
8906 }
8907
8908 free (iconf);
8909 }
8910
8911 return 1;
8912 }
8913
8914 static char *
8915 get_note_type (e_type)
8916 unsigned e_type;
8917 {
8918 static char buff[64];
8919
8920 switch (e_type)
8921 {
8922 case NT_PRSTATUS: return _("NT_PRSTATUS (prstatus structure)");
8923 case NT_FPREGSET: return _("NT_FPREGSET (floating point registers)");
8924 case NT_PRPSINFO: return _("NT_PRPSINFO (prpsinfo structure)");
8925 case NT_TASKSTRUCT: return _("NT_TASKSTRUCT (task structure)");
8926 case NT_PRXFPREG: return _("NT_PRXFPREG (user_xfpregs structure)");
8927 case NT_PSTATUS: return _("NT_PSTATUS (pstatus structure)");
8928 case NT_FPREGS: return _("NT_FPREGS (floating point registers)");
8929 case NT_PSINFO: return _("NT_PSINFO (psinfo structure)");
8930 case NT_LWPSTATUS: return _("NT_LWPSTATUS (lwpstatus_t structure)");
8931 case NT_LWPSINFO: return _("NT_LWPSINFO (lwpsinfo_t structure)");
8932 case NT_WIN32PSTATUS: return _("NT_WIN32PSTATUS (win32_pstatus strcuture)");
8933 default:
8934 sprintf (buff, _("Unknown note type: (0x%08x)"), e_type);
8935 return buff;
8936 }
8937 }
8938
8939 /* Note that by the ELF standard, the name field is already null byte
8940 terminated, and namesz includes the terminating null byte.
8941 I.E. the value of namesz for the name "FSF" is 4.
8942
8943 If the value of namesz is zero, there is no name present. */
8944 static int
8945 process_note (pnote)
8946 Elf32_Internal_Note * pnote;
8947 {
8948 printf (" %s\t\t0x%08lx\t%s\n",
8949 pnote->namesz ? pnote->namedata : "(NONE)",
8950 pnote->descsz, get_note_type (pnote->type));
8951 return 1;
8952 }
8953
8954
8955 static int
8956 process_corefile_note_segment (file, offset, length)
8957 FILE * file;
8958 bfd_vma offset;
8959 bfd_vma length;
8960 {
8961 Elf_External_Note * pnotes;
8962 Elf_External_Note * external;
8963 int res = 1;
8964
8965 if (length <= 0)
8966 return 0;
8967
8968 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, length,
8969 _("notes"));
8970 if (!pnotes)
8971 return 0;
8972
8973 external = pnotes;
8974
8975 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
8976 (unsigned long) offset, (unsigned long) length);
8977 printf (_(" Owner\t\tData size\tDescription\n"));
8978
8979 while (external < (Elf_External_Note *)((char *) pnotes + length))
8980 {
8981 Elf32_Internal_Note inote;
8982 char * temp = NULL;
8983
8984 inote.type = BYTE_GET (external->type);
8985 inote.namesz = BYTE_GET (external->namesz);
8986 inote.namedata = external->name;
8987 inote.descsz = BYTE_GET (external->descsz);
8988 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
8989 inote.descpos = offset + (inote.descdata - (char *) pnotes);
8990
8991 external = (Elf_External_Note *)(inote.descdata + align_power (inote.descsz, 2));
8992
8993 /* Verify that name is null terminated. It appears that at least
8994 one version of Linux (RedHat 6.0) generates corefiles that don't
8995 comply with the ELF spec by failing to include the null byte in
8996 namesz. */
8997 if (inote.namedata[inote.namesz] != '\0')
8998 {
8999 temp = malloc (inote.namesz + 1);
9000
9001 if (temp == NULL)
9002 {
9003 error (_("Out of memory\n"));
9004 res = 0;
9005 break;
9006 }
9007
9008 strncpy (temp, inote.namedata, inote.namesz);
9009 temp[inote.namesz] = 0;
9010
9011 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
9012 inote.namedata = temp;
9013 }
9014
9015 res &= process_note (& inote);
9016
9017 if (temp != NULL)
9018 {
9019 free (temp);
9020 temp = NULL;
9021 }
9022 }
9023
9024 free (pnotes);
9025
9026 return res;
9027 }
9028
9029 static int
9030 process_corefile_note_segments (file)
9031 FILE * file;
9032 {
9033 Elf_Internal_Phdr * program_headers;
9034 Elf_Internal_Phdr * segment;
9035 unsigned int i;
9036 int res = 1;
9037
9038 program_headers = (Elf_Internal_Phdr *) malloc
9039 (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
9040
9041 if (program_headers == NULL)
9042 {
9043 error (_("Out of memory\n"));
9044 return 0;
9045 }
9046
9047 if (is_32bit_elf)
9048 i = get_32bit_program_headers (file, program_headers);
9049 else
9050 i = get_64bit_program_headers (file, program_headers);
9051
9052 if (i == 0)
9053 {
9054 free (program_headers);
9055 return 0;
9056 }
9057
9058 for (i = 0, segment = program_headers;
9059 i < elf_header.e_phnum;
9060 i ++, segment ++)
9061 {
9062 if (segment->p_type == PT_NOTE)
9063 res &= process_corefile_note_segment (file,
9064 (bfd_vma) segment->p_offset,
9065 (bfd_vma) segment->p_filesz);
9066 }
9067
9068 free (program_headers);
9069
9070 return res;
9071 }
9072
9073 static int
9074 process_corefile_contents (file)
9075 FILE * file;
9076 {
9077 /* If we have not been asked to display the notes then do nothing. */
9078 if (! do_notes)
9079 return 1;
9080
9081 /* If file is not a core file then exit. */
9082 if (elf_header.e_type != ET_CORE)
9083 return 1;
9084
9085 /* No program headers means no NOTE segment. */
9086 if (elf_header.e_phnum == 0)
9087 {
9088 printf (_("No note segments present in the core file.\n"));
9089 return 1;
9090 }
9091
9092 return process_corefile_note_segments (file);
9093 }
9094
9095 static int
9096 process_arch_specific (file)
9097 FILE * file;
9098 {
9099 if (! do_arch)
9100 return 1;
9101
9102 switch (elf_header.e_machine)
9103 {
9104 case EM_MIPS:
9105 case EM_MIPS_RS3_LE:
9106 return process_mips_specific (file);
9107 break;
9108 default:
9109 break;
9110 }
9111 return 1;
9112 }
9113
9114 static int
9115 get_file_header (file)
9116 FILE * file;
9117 {
9118 /* Read in the identity array. */
9119 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
9120 return 0;
9121
9122 /* Determine how to read the rest of the header. */
9123 switch (elf_header.e_ident [EI_DATA])
9124 {
9125 default: /* fall through */
9126 case ELFDATANONE: /* fall through */
9127 case ELFDATA2LSB: byte_get = byte_get_little_endian; break;
9128 case ELFDATA2MSB: byte_get = byte_get_big_endian; break;
9129 }
9130
9131 /* For now we only support 32 bit and 64 bit ELF files. */
9132 is_32bit_elf = (elf_header.e_ident [EI_CLASS] != ELFCLASS64);
9133
9134 /* Read in the rest of the header. */
9135 if (is_32bit_elf)
9136 {
9137 Elf32_External_Ehdr ehdr32;
9138
9139 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
9140 return 0;
9141
9142 elf_header.e_type = BYTE_GET (ehdr32.e_type);
9143 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
9144 elf_header.e_version = BYTE_GET (ehdr32.e_version);
9145 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
9146 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
9147 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
9148 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
9149 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
9150 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
9151 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
9152 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
9153 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
9154 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
9155 }
9156 else
9157 {
9158 Elf64_External_Ehdr ehdr64;
9159
9160 /* If we have been compiled with sizeof (bfd_vma) == 4, then
9161 we will not be able to cope with the 64bit data found in
9162 64 ELF files. Detect this now and abort before we start
9163 overwritting things. */
9164 if (sizeof (bfd_vma) < 8)
9165 {
9166 error (_("This instance of readelf has been built without support for a\n\
9167 64 bit data type and so it cannot read 64 bit ELF files.\n"));
9168 return 0;
9169 }
9170
9171 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
9172 return 0;
9173
9174 elf_header.e_type = BYTE_GET (ehdr64.e_type);
9175 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
9176 elf_header.e_version = BYTE_GET (ehdr64.e_version);
9177 elf_header.e_entry = BYTE_GET8 (ehdr64.e_entry);
9178 elf_header.e_phoff = BYTE_GET8 (ehdr64.e_phoff);
9179 elf_header.e_shoff = BYTE_GET8 (ehdr64.e_shoff);
9180 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
9181 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
9182 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
9183 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
9184 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
9185 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
9186 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
9187 }
9188
9189 return 1;
9190 }
9191
9192 static int
9193 process_file (file_name)
9194 char * file_name;
9195 {
9196 FILE * file;
9197 struct stat statbuf;
9198 unsigned int i;
9199
9200 if (stat (file_name, & statbuf) < 0)
9201 {
9202 error (_("Cannot stat input file %s.\n"), file_name);
9203 return 1;
9204 }
9205
9206 file = fopen (file_name, "rb");
9207 if (file == NULL)
9208 {
9209 error (_("Input file %s not found.\n"), file_name);
9210 return 1;
9211 }
9212
9213 if (! get_file_header (file))
9214 {
9215 error (_("%s: Failed to read file header\n"), file_name);
9216 fclose (file);
9217 return 1;
9218 }
9219
9220 /* Initialise per file variables. */
9221 for (i = NUM_ELEM (version_info); i--;)
9222 version_info[i] = 0;
9223
9224 for (i = NUM_ELEM (dynamic_info); i--;)
9225 dynamic_info[i] = 0;
9226
9227 /* Process the file. */
9228 if (show_name)
9229 printf (_("\nFile: %s\n"), file_name);
9230
9231 if (! process_file_header ())
9232 {
9233 fclose (file);
9234 return 1;
9235 }
9236
9237 process_section_headers (file);
9238
9239 process_program_headers (file);
9240
9241 process_dynamic_segment (file);
9242
9243 process_relocs (file);
9244
9245 process_unwind (file);
9246
9247 process_symbol_table (file);
9248
9249 process_syminfo (file);
9250
9251 process_version_sections (file);
9252
9253 process_section_contents (file);
9254
9255 process_corefile_contents (file);
9256
9257 process_arch_specific (file);
9258
9259 fclose (file);
9260
9261 if (section_headers)
9262 {
9263 free (section_headers);
9264 section_headers = NULL;
9265 }
9266
9267 if (string_table)
9268 {
9269 free (string_table);
9270 string_table = NULL;
9271 string_table_length = 0;
9272 }
9273
9274 if (dynamic_strings)
9275 {
9276 free (dynamic_strings);
9277 dynamic_strings = NULL;
9278 }
9279
9280 if (dynamic_symbols)
9281 {
9282 free (dynamic_symbols);
9283 dynamic_symbols = NULL;
9284 num_dynamic_syms = 0;
9285 }
9286
9287 if (dynamic_syminfo)
9288 {
9289 free (dynamic_syminfo);
9290 dynamic_syminfo = NULL;
9291 }
9292
9293 return 0;
9294 }
9295
9296 #ifdef SUPPORT_DISASSEMBLY
9297 /* Needed by the i386 disassembler. For extra credit, someone could
9298 fix this so that we insert symbolic addresses here, esp for GOT/PLT
9299 symbols. */
9300
9301 void
9302 print_address (unsigned int addr, FILE * outfile)
9303 {
9304 fprintf (outfile,"0x%8.8x", addr);
9305 }
9306
9307 /* Needed by the i386 disassembler. */
9308 void
9309 db_task_printsym (unsigned int addr)
9310 {
9311 print_address (addr, stderr);
9312 }
9313 #endif
9314
9315 int main PARAMS ((int, char **));
9316
9317 int
9318 main (argc, argv)
9319 int argc;
9320 char ** argv;
9321 {
9322 int err;
9323
9324 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
9325 setlocale (LC_MESSAGES, "");
9326 #endif
9327 #if defined (HAVE_SETLOCALE)
9328 setlocale (LC_CTYPE, "");
9329 #endif
9330 bindtextdomain (PACKAGE, LOCALEDIR);
9331 textdomain (PACKAGE);
9332
9333 parse_args (argc, argv);
9334
9335 if (optind < (argc - 1))
9336 show_name = 1;
9337
9338 err = 0;
9339 while (optind < argc)
9340 err |= process_file (argv [optind ++]);
9341
9342 if (dump_sects != NULL)
9343 free (dump_sects);
9344
9345 return err;
9346 }