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