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