bfd/
[binutils.git] / binutils / readelf.c
blob236816d72974d678d2718262f24133f1ccbf1ba8
1 /* readelf.c -- display contents of an ELF format file
2 Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
3 2008 Free Software Foundation, Inc.
5 Originally developed by Eric Youngdale <eric@andante.jic.com>
6 Modifications by Nick Clifton <nickc@redhat.com>
8 This file is part of GNU Binutils.
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 3 of the License, or
13 (at your option) any later version.
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
23 02110-1301, USA. */
25 /* The difference between readelf and objdump:
27 Both programs are capable of displaying the contents of ELF format files,
28 so why does the binutils project have two file dumpers ?
30 The reason is that objdump sees an ELF file through a BFD filter of the
31 world; if BFD has a bug where, say, it disagrees about a machine constant
32 in e_flags, then the odds are good that it will remain internally
33 consistent. The linker sees it the BFD way, objdump sees it the BFD way,
34 GAS sees it the BFD way. There was need for a tool to go find out what
35 the file actually says.
37 This is why the readelf program does not link against the BFD library - it
38 exists as an independent program to help verify the correct working of BFD.
40 There is also the case that readelf can provide more information about an
41 ELF file than is provided by objdump. In particular it can display DWARF
42 debugging information which (at the moment) objdump cannot. */
44 #include "config.h"
45 #include "sysdep.h"
46 #include <assert.h>
47 #include <sys/stat.h>
48 #include <time.h>
49 #ifdef HAVE_ZLIB_H
50 #include <zlib.h>
51 #endif
53 /* for PATH_MAX */
54 #ifdef HAVE_LIMITS_H
55 #include <limits.h>
56 #endif
58 #ifndef PATH_MAX
59 /* for MAXPATHLEN */
60 # ifdef HAVE_SYS_PARAM_H
61 # include <sys/param.h>
62 # endif
63 # ifndef PATH_MAX
64 # ifdef MAXPATHLEN
65 # define PATH_MAX MAXPATHLEN
66 # else
67 # define PATH_MAX 1024
68 # endif
69 # endif
70 #endif
72 #if __GNUC__ >= 2
73 /* Define BFD64 here, even if our default architecture is 32 bit ELF
74 as this will allow us to read in and parse 64bit and 32bit ELF files.
75 Only do this if we believe that the compiler can support a 64 bit
76 data type. For now we only rely on GCC being able to do this. */
77 #define BFD64
78 #endif
80 #include "bfd.h"
81 #include "bucomm.h"
82 #include "dwarf.h"
84 #include "elf/common.h"
85 #include "elf/external.h"
86 #include "elf/internal.h"
89 /* Included here, before RELOC_MACROS_GEN_FUNC is defined, so that
90 we can obtain the H8 reloc numbers. We need these for the
91 get_reloc_size() function. We include h8.h again after defining
92 RELOC_MACROS_GEN_FUNC so that we get the naming function as well. */
94 #include "elf/h8.h"
95 #undef _ELF_H8_H
97 /* Undo the effects of #including reloc-macros.h. */
99 #undef START_RELOC_NUMBERS
100 #undef RELOC_NUMBER
101 #undef FAKE_RELOC
102 #undef EMPTY_RELOC
103 #undef END_RELOC_NUMBERS
104 #undef _RELOC_MACROS_H
106 /* The following headers use the elf/reloc-macros.h file to
107 automatically generate relocation recognition functions
108 such as elf_mips_reloc_type() */
110 #define RELOC_MACROS_GEN_FUNC
112 #include "elf/alpha.h"
113 #include "elf/arc.h"
114 #include "elf/arm.h"
115 #include "elf/avr.h"
116 #include "elf/bfin.h"
117 #include "elf/cr16.h"
118 #include "elf/cris.h"
119 #include "elf/crx.h"
120 #include "elf/d10v.h"
121 #include "elf/d30v.h"
122 #include "elf/dlx.h"
123 #include "elf/fr30.h"
124 #include "elf/frv.h"
125 #include "elf/h8.h"
126 #include "elf/hppa.h"
127 #include "elf/i386.h"
128 #include "elf/i370.h"
129 #include "elf/i860.h"
130 #include "elf/i960.h"
131 #include "elf/ia64.h"
132 #include "elf/ip2k.h"
133 #include "elf/iq2000.h"
134 #include "elf/m32c.h"
135 #include "elf/m32r.h"
136 #include "elf/m68k.h"
137 #include "elf/m68hc11.h"
138 #include "elf/mcore.h"
139 #include "elf/mep.h"
140 #include "elf/mips.h"
141 #include "elf/mmix.h"
142 #include "elf/mn10200.h"
143 #include "elf/mn10300.h"
144 #include "elf/mt.h"
145 #include "elf/msp430.h"
146 #include "elf/or32.h"
147 #include "elf/pj.h"
148 #include "elf/ppc.h"
149 #include "elf/ppc64.h"
150 #include "elf/s390.h"
151 #include "elf/score.h"
152 #include "elf/sh.h"
153 #include "elf/sparc.h"
154 #include "elf/spu.h"
155 #include "elf/v850.h"
156 #include "elf/vax.h"
157 #include "elf/x86-64.h"
158 #include "elf/xstormy16.h"
159 #include "elf/xtensa.h"
161 #include "aout/ar.h"
163 #include "getopt.h"
164 #include "libiberty.h"
165 #include "safe-ctype.h"
167 char *program_name = "readelf";
168 int do_wide;
169 static long archive_file_offset;
170 static unsigned long archive_file_size;
171 static unsigned long dynamic_addr;
172 static bfd_size_type dynamic_size;
173 static unsigned int dynamic_nent;
174 static char *dynamic_strings;
175 static unsigned long dynamic_strings_length;
176 static char *string_table;
177 static unsigned long string_table_length;
178 static unsigned long num_dynamic_syms;
179 static Elf_Internal_Sym *dynamic_symbols;
180 static Elf_Internal_Syminfo *dynamic_syminfo;
181 static unsigned long dynamic_syminfo_offset;
182 static unsigned int dynamic_syminfo_nent;
183 static char program_interpreter[PATH_MAX];
184 static bfd_vma dynamic_info[DT_JMPREL + 1];
185 static bfd_vma dynamic_info_DT_GNU_HASH;
186 static bfd_vma version_info[16];
187 static Elf_Internal_Ehdr elf_header;
188 static Elf_Internal_Shdr *section_headers;
189 static Elf_Internal_Phdr *program_headers;
190 static Elf_Internal_Dyn *dynamic_section;
191 static Elf_Internal_Shdr *symtab_shndx_hdr;
192 static int show_name;
193 static int do_dynamic;
194 static int do_syms;
195 static int do_reloc;
196 static int do_sections;
197 static int do_section_groups;
198 static int do_section_details;
199 static int do_segments;
200 static int do_unwind;
201 static int do_using_dynamic;
202 static int do_header;
203 static int do_dump;
204 static int do_version;
205 static int do_histogram;
206 static int do_debugging;
207 static int do_arch;
208 static int do_notes;
209 static int do_archive_index;
210 static int is_32bit_elf;
212 struct group_list
214 struct group_list *next;
215 unsigned int section_index;
218 struct group
220 struct group_list *root;
221 unsigned int group_index;
224 static size_t group_count;
225 static struct group *section_groups;
226 static struct group **section_headers_groups;
229 /* Flag bits indicating particular types of dump. */
230 #define HEX_DUMP (1 << 0) /* The -x command line switch. */
231 #define DISASS_DUMP (1 << 1) /* The -i command line switch. */
232 #define DEBUG_DUMP (1 << 2) /* The -w command line switch. */
233 #define STRING_DUMP (1 << 3) /* The -p command line switch. */
235 typedef unsigned char dump_type;
237 /* A linked list of the section names for which dumps were requested. */
238 struct dump_list_entry
240 char *name;
241 dump_type type;
242 struct dump_list_entry *next;
244 static struct dump_list_entry *dump_sects_byname;
246 /* A dynamic array of flags indicating for which sections a dump
247 has been requested via command line switches. */
248 static dump_type * cmdline_dump_sects = NULL;
249 static unsigned int num_cmdline_dump_sects = 0;
251 /* A dynamic array of flags indicating for which sections a dump of
252 some kind has been requested. It is reset on a per-object file
253 basis and then initialised from the cmdline_dump_sects array,
254 the results of interpreting the -w switch, and the
255 dump_sects_byname list. */
256 static dump_type * dump_sects = NULL;
257 static unsigned int num_dump_sects = 0;
260 /* How to print a vma value. */
261 typedef enum print_mode
263 HEX,
264 DEC,
265 DEC_5,
266 UNSIGNED,
267 PREFIX_HEX,
268 FULL_HEX,
269 LONG_HEX
271 print_mode;
273 static void (*byte_put) (unsigned char *, bfd_vma, int);
275 #define UNKNOWN -1
277 #define SECTION_NAME(X) \
278 ((X) == NULL ? "<none>" \
279 : string_table == NULL ? "<no-name>" \
280 : ((X)->sh_name >= string_table_length ? "<corrupt>" \
281 : string_table + (X)->sh_name))
283 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
285 #define BYTE_GET(field) byte_get (field, sizeof (field))
287 #define GET_ELF_SYMBOLS(file, section) \
288 (is_32bit_elf ? get_32bit_elf_symbols (file, section) \
289 : get_64bit_elf_symbols (file, section))
291 #define VALID_DYNAMIC_NAME(offset) ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
292 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
293 already been called and verified that the string exists. */
294 #define GET_DYNAMIC_NAME(offset) (dynamic_strings + offset)
296 /* This is just a bit of syntatic sugar. */
297 #define streq(a,b) (strcmp ((a), (b)) == 0)
298 #define strneq(a,b,n) (strncmp ((a), (b), (n)) == 0)
299 #define const_strneq(a,b) (strncmp ((a), (b), sizeof (b) - 1) == 0)
301 static void *
302 get_data (void *var, FILE *file, long offset, size_t size, size_t nmemb,
303 const char *reason)
305 void *mvar;
307 if (size == 0 || nmemb == 0)
308 return NULL;
310 if (fseek (file, archive_file_offset + offset, SEEK_SET))
312 error (_("Unable to seek to 0x%lx for %s\n"),
313 archive_file_offset + offset, reason);
314 return NULL;
317 mvar = var;
318 if (mvar == NULL)
320 /* Check for overflow. */
321 if (nmemb < (~(size_t) 0 - 1) / size)
322 /* + 1 so that we can '\0' terminate invalid string table sections. */
323 mvar = malloc (size * nmemb + 1);
325 if (mvar == NULL)
327 error (_("Out of memory allocating 0x%lx bytes for %s\n"),
328 (unsigned long)(size * nmemb), reason);
329 return NULL;
332 ((char *) mvar)[size * nmemb] = '\0';
335 if (fread (mvar, size, nmemb, file) != nmemb)
337 error (_("Unable to read in 0x%lx bytes of %s\n"),
338 (unsigned long)(size * nmemb), reason);
339 if (mvar != var)
340 free (mvar);
341 return NULL;
344 return mvar;
347 static void
348 byte_put_little_endian (unsigned char *field, bfd_vma value, int size)
350 switch (size)
352 case 8:
353 field[7] = (((value >> 24) >> 24) >> 8) & 0xff;
354 field[6] = ((value >> 24) >> 24) & 0xff;
355 field[5] = ((value >> 24) >> 16) & 0xff;
356 field[4] = ((value >> 24) >> 8) & 0xff;
357 /* Fall through. */
358 case 4:
359 field[3] = (value >> 24) & 0xff;
360 field[2] = (value >> 16) & 0xff;
361 /* Fall through. */
362 case 2:
363 field[1] = (value >> 8) & 0xff;
364 /* Fall through. */
365 case 1:
366 field[0] = value & 0xff;
367 break;
369 default:
370 error (_("Unhandled data length: %d\n"), size);
371 abort ();
375 /* Print a VMA value. */
376 static int
377 print_vma (bfd_vma vma, print_mode mode)
379 int nc = 0;
381 switch (mode)
383 case FULL_HEX:
384 nc = printf ("0x");
385 /* Drop through. */
387 case LONG_HEX:
388 #ifdef BFD64
389 if (is_32bit_elf)
390 return nc + printf ("%08.8" BFD_VMA_FMT "x", vma);
391 #endif
392 printf_vma (vma);
393 return nc + 16;
395 case DEC_5:
396 if (vma <= 99999)
397 return printf ("%5" BFD_VMA_FMT "d", vma);
398 /* Drop through. */
400 case PREFIX_HEX:
401 nc = printf ("0x");
402 /* Drop through. */
404 case HEX:
405 return nc + printf ("%" BFD_VMA_FMT "x", vma);
407 case DEC:
408 return printf ("%" BFD_VMA_FMT "d", vma);
410 case UNSIGNED:
411 return printf ("%" BFD_VMA_FMT "u", vma);
413 return 0;
416 /* Display a symbol on stdout. Handles the display of
417 non-printing characters.
418 If DO_WIDE is not true then format the symbol to be
419 at most WIDTH characters, truncating as necessary.
420 If WIDTH is negative then format the string to be
421 exactly - WIDTH characters, truncating or padding
422 as necessary. */
424 static void
425 print_symbol (int width, const char *symbol)
427 const char * format_string;
428 const char * c;
430 if (do_wide)
432 format_string = "%.*s";
433 /* Set the width to a very large value. This simplifies the code below. */
434 width = INT_MAX;
436 else if (width < 0)
438 format_string = "%-*.*2s";
439 /* Keep the width positive. This also helps. */
440 width = - width;
442 else
444 format_string = "%-.*s";
447 while (width)
449 int len;
451 c = symbol;
453 /* Look for non-printing symbols inside the symbol's name.
454 This test is triggered in particular by the names generated
455 by the assembler for local labels. */
456 while (ISPRINT (* c))
457 c++;
459 len = c - symbol;
461 if (len)
463 if (len > width)
464 len = width;
466 printf (format_string, len, symbol);
468 width -= len;
471 if (* c == 0 || width == 0)
472 break;
474 /* Now display the non-printing character, if
475 there is room left in which to dipslay it. */
476 if (*c < 32)
478 if (width < 2)
479 break;
481 printf ("^%c", *c + 0x40);
483 width -= 2;
485 else
487 if (width < 6)
488 break;
490 printf ("<0x%.2x>", *c);
492 width -= 6;
495 symbol = c + 1;
499 static void
500 byte_put_big_endian (unsigned char *field, bfd_vma value, int size)
502 switch (size)
504 case 8:
505 field[7] = value & 0xff;
506 field[6] = (value >> 8) & 0xff;
507 field[5] = (value >> 16) & 0xff;
508 field[4] = (value >> 24) & 0xff;
509 value >>= 16;
510 value >>= 16;
511 /* Fall through. */
512 case 4:
513 field[3] = value & 0xff;
514 field[2] = (value >> 8) & 0xff;
515 value >>= 16;
516 /* Fall through. */
517 case 2:
518 field[1] = value & 0xff;
519 value >>= 8;
520 /* Fall through. */
521 case 1:
522 field[0] = value & 0xff;
523 break;
525 default:
526 error (_("Unhandled data length: %d\n"), size);
527 abort ();
531 /* Return a pointer to section NAME, or NULL if no such section exists. */
533 static Elf_Internal_Shdr *
534 find_section (const char *name)
536 unsigned int i;
538 for (i = 0; i < elf_header.e_shnum; i++)
539 if (streq (SECTION_NAME (section_headers + i), name))
540 return section_headers + i;
542 return NULL;
545 /* Guess the relocation size commonly used by the specific machines. */
547 static int
548 guess_is_rela (unsigned int e_machine)
550 switch (e_machine)
552 /* Targets that use REL relocations. */
553 case EM_386:
554 case EM_486:
555 case EM_960:
556 case EM_ARM:
557 case EM_D10V:
558 case EM_CYGNUS_D10V:
559 case EM_DLX:
560 case EM_MIPS:
561 case EM_MIPS_RS3_LE:
562 case EM_CYGNUS_M32R:
563 case EM_OPENRISC:
564 case EM_OR32:
565 case EM_SCORE:
566 return FALSE;
568 /* Targets that use RELA relocations. */
569 case EM_68K:
570 case EM_860:
571 case EM_ALPHA:
572 case EM_ALTERA_NIOS2:
573 case EM_AVR:
574 case EM_AVR_OLD:
575 case EM_BLACKFIN:
576 case EM_CR16:
577 case EM_CR16_OLD:
578 case EM_CRIS:
579 case EM_CRX:
580 case EM_D30V:
581 case EM_CYGNUS_D30V:
582 case EM_FR30:
583 case EM_CYGNUS_FR30:
584 case EM_CYGNUS_FRV:
585 case EM_H8S:
586 case EM_H8_300:
587 case EM_H8_300H:
588 case EM_IA_64:
589 case EM_IP2K:
590 case EM_IP2K_OLD:
591 case EM_IQ2000:
592 case EM_M32C_OLD:
593 case EM_M32C:
594 case EM_M32R:
595 case EM_MCORE:
596 case EM_CYGNUS_MEP:
597 case EM_MMIX:
598 case EM_MN10200:
599 case EM_CYGNUS_MN10200:
600 case EM_MN10300:
601 case EM_CYGNUS_MN10300:
602 case EM_MSP430:
603 case EM_MSP430_OLD:
604 case EM_MT:
605 case EM_NIOS32:
606 case EM_PPC64:
607 case EM_PPC:
608 case EM_S390:
609 case EM_S390_OLD:
610 case EM_SH:
611 case EM_SPARC:
612 case EM_SPARC32PLUS:
613 case EM_SPARCV9:
614 case EM_SPU:
615 case EM_V850:
616 case EM_CYGNUS_V850:
617 case EM_VAX:
618 case EM_X86_64:
619 case EM_XSTORMY16:
620 case EM_XTENSA:
621 case EM_XTENSA_OLD:
622 return TRUE;
624 case EM_68HC05:
625 case EM_68HC08:
626 case EM_68HC11:
627 case EM_68HC16:
628 case EM_FX66:
629 case EM_ME16:
630 case EM_MMA:
631 case EM_NCPU:
632 case EM_NDR1:
633 case EM_PCP:
634 case EM_ST100:
635 case EM_ST19:
636 case EM_ST7:
637 case EM_ST9PLUS:
638 case EM_STARCORE:
639 case EM_SVX:
640 case EM_TINYJ:
641 default:
642 warn (_("Don't know about relocations on this machine architecture\n"));
643 return FALSE;
647 static int
648 slurp_rela_relocs (FILE *file,
649 unsigned long rel_offset,
650 unsigned long rel_size,
651 Elf_Internal_Rela **relasp,
652 unsigned long *nrelasp)
654 Elf_Internal_Rela *relas;
655 unsigned long nrelas;
656 unsigned int i;
658 if (is_32bit_elf)
660 Elf32_External_Rela *erelas;
662 erelas = get_data (NULL, file, rel_offset, 1, rel_size, _("relocs"));
663 if (!erelas)
664 return 0;
666 nrelas = rel_size / sizeof (Elf32_External_Rela);
668 relas = cmalloc (nrelas, sizeof (Elf_Internal_Rela));
670 if (relas == NULL)
672 free (erelas);
673 error (_("out of memory parsing relocs\n"));
674 return 0;
677 for (i = 0; i < nrelas; i++)
679 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
680 relas[i].r_info = BYTE_GET (erelas[i].r_info);
681 relas[i].r_addend = BYTE_GET (erelas[i].r_addend);
684 free (erelas);
686 else
688 Elf64_External_Rela *erelas;
690 erelas = get_data (NULL, file, rel_offset, 1, rel_size, _("relocs"));
691 if (!erelas)
692 return 0;
694 nrelas = rel_size / sizeof (Elf64_External_Rela);
696 relas = cmalloc (nrelas, sizeof (Elf_Internal_Rela));
698 if (relas == NULL)
700 free (erelas);
701 error (_("out of memory parsing relocs\n"));
702 return 0;
705 for (i = 0; i < nrelas; i++)
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);
712 free (erelas);
714 *relasp = relas;
715 *nrelasp = nrelas;
716 return 1;
719 static int
720 slurp_rel_relocs (FILE *file,
721 unsigned long rel_offset,
722 unsigned long rel_size,
723 Elf_Internal_Rela **relsp,
724 unsigned long *nrelsp)
726 Elf_Internal_Rela *rels;
727 unsigned long nrels;
728 unsigned int i;
730 if (is_32bit_elf)
732 Elf32_External_Rel *erels;
734 erels = get_data (NULL, file, rel_offset, 1, rel_size, _("relocs"));
735 if (!erels)
736 return 0;
738 nrels = rel_size / sizeof (Elf32_External_Rel);
740 rels = cmalloc (nrels, sizeof (Elf_Internal_Rela));
742 if (rels == NULL)
744 free (erels);
745 error (_("out of memory parsing relocs\n"));
746 return 0;
749 for (i = 0; i < nrels; i++)
751 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
752 rels[i].r_info = BYTE_GET (erels[i].r_info);
753 rels[i].r_addend = 0;
756 free (erels);
758 else
760 Elf64_External_Rel *erels;
762 erels = get_data (NULL, file, rel_offset, 1, rel_size, _("relocs"));
763 if (!erels)
764 return 0;
766 nrels = rel_size / sizeof (Elf64_External_Rel);
768 rels = cmalloc (nrels, sizeof (Elf_Internal_Rela));
770 if (rels == NULL)
772 free (erels);
773 error (_("out of memory parsing relocs\n"));
774 return 0;
777 for (i = 0; i < nrels; i++)
779 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
780 rels[i].r_info = BYTE_GET (erels[i].r_info);
781 rels[i].r_addend = 0;
784 free (erels);
786 *relsp = rels;
787 *nrelsp = nrels;
788 return 1;
791 /* Returns the reloc type extracted from the reloc info field. */
793 static unsigned int
794 get_reloc_type (bfd_vma reloc_info)
796 if (is_32bit_elf)
797 return ELF32_R_TYPE (reloc_info);
799 switch (elf_header.e_machine)
801 case EM_MIPS:
802 /* Note: We assume that reloc_info has already been adjusted for us. */
803 return ELF64_MIPS_R_TYPE (reloc_info);
805 case EM_SPARCV9:
806 return ELF64_R_TYPE_ID (reloc_info);
808 default:
809 return ELF64_R_TYPE (reloc_info);
813 /* Return the symbol index extracted from the reloc info field. */
815 static bfd_vma
816 get_reloc_symindex (bfd_vma reloc_info)
818 return is_32bit_elf ? ELF32_R_SYM (reloc_info) : ELF64_R_SYM (reloc_info);
821 /* Display the contents of the relocation data found at the specified
822 offset. */
824 static void
825 dump_relocations (FILE *file,
826 unsigned long rel_offset,
827 unsigned long rel_size,
828 Elf_Internal_Sym *symtab,
829 unsigned long nsyms,
830 char *strtab,
831 unsigned long strtablen,
832 int is_rela)
834 unsigned int i;
835 Elf_Internal_Rela *rels;
838 if (is_rela == UNKNOWN)
839 is_rela = guess_is_rela (elf_header.e_machine);
841 if (is_rela)
843 if (!slurp_rela_relocs (file, rel_offset, rel_size, &rels, &rel_size))
844 return;
846 else
848 if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
849 return;
852 if (is_32bit_elf)
854 if (is_rela)
856 if (do_wide)
857 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
858 else
859 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
861 else
863 if (do_wide)
864 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
865 else
866 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
869 else
871 if (is_rela)
873 if (do_wide)
874 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
875 else
876 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
878 else
880 if (do_wide)
881 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
882 else
883 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
887 for (i = 0; i < rel_size; i++)
889 const char *rtype;
890 bfd_vma offset;
891 bfd_vma info;
892 bfd_vma symtab_index;
893 bfd_vma type;
895 offset = rels[i].r_offset;
896 info = rels[i].r_info;
898 /* The #ifdef BFD64 below is to prevent a compile time warning.
899 We know that if we do not have a 64 bit data type that we
900 will never execute this code anyway. */
901 #ifdef BFD64
902 if (!is_32bit_elf
903 && elf_header.e_machine == EM_MIPS
904 && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
906 /* In little-endian objects, r_info isn't really a 64-bit
907 little-endian value: it has a 32-bit little-endian
908 symbol index followed by four individual byte fields.
909 Reorder INFO accordingly. */
910 info = (((info & 0xffffffff) << 32)
911 | ((info >> 56) & 0xff)
912 | ((info >> 40) & 0xff00)
913 | ((info >> 24) & 0xff0000)
914 | ((info >> 8) & 0xff000000));
916 #endif /* BFD64 */
918 type = get_reloc_type (info);
919 symtab_index = get_reloc_symindex (info);
921 if (is_32bit_elf)
923 printf ("%8.8lx %8.8lx ",
924 (unsigned long) offset & 0xffffffff,
925 (unsigned long) info & 0xffffffff);
927 else
929 #if BFD_HOST_64BIT_LONG
930 printf (do_wide
931 ? "%16.16lx %16.16lx "
932 : "%12.12lx %12.12lx ",
933 offset, info);
934 #elif BFD_HOST_64BIT_LONG_LONG
935 #ifndef __MSVCRT__
936 printf (do_wide
937 ? "%16.16llx %16.16llx "
938 : "%12.12llx %12.12llx ",
939 offset, info);
940 #else
941 printf (do_wide
942 ? "%16.16I64x %16.16I64x "
943 : "%12.12I64x %12.12I64x ",
944 offset, info);
945 #endif
946 #else
947 printf (do_wide
948 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
949 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
950 _bfd_int64_high (offset),
951 _bfd_int64_low (offset),
952 _bfd_int64_high (info),
953 _bfd_int64_low (info));
954 #endif
957 switch (elf_header.e_machine)
959 default:
960 rtype = NULL;
961 break;
963 case EM_M32R:
964 case EM_CYGNUS_M32R:
965 rtype = elf_m32r_reloc_type (type);
966 break;
968 case EM_386:
969 case EM_486:
970 rtype = elf_i386_reloc_type (type);
971 break;
973 case EM_68HC11:
974 case EM_68HC12:
975 rtype = elf_m68hc11_reloc_type (type);
976 break;
978 case EM_68K:
979 rtype = elf_m68k_reloc_type (type);
980 break;
982 case EM_960:
983 rtype = elf_i960_reloc_type (type);
984 break;
986 case EM_AVR:
987 case EM_AVR_OLD:
988 rtype = elf_avr_reloc_type (type);
989 break;
991 case EM_OLD_SPARCV9:
992 case EM_SPARC32PLUS:
993 case EM_SPARCV9:
994 case EM_SPARC:
995 rtype = elf_sparc_reloc_type (type);
996 break;
998 case EM_SPU:
999 rtype = elf_spu_reloc_type (type);
1000 break;
1002 case EM_V850:
1003 case EM_CYGNUS_V850:
1004 rtype = v850_reloc_type (type);
1005 break;
1007 case EM_D10V:
1008 case EM_CYGNUS_D10V:
1009 rtype = elf_d10v_reloc_type (type);
1010 break;
1012 case EM_D30V:
1013 case EM_CYGNUS_D30V:
1014 rtype = elf_d30v_reloc_type (type);
1015 break;
1017 case EM_DLX:
1018 rtype = elf_dlx_reloc_type (type);
1019 break;
1021 case EM_SH:
1022 rtype = elf_sh_reloc_type (type);
1023 break;
1025 case EM_MN10300:
1026 case EM_CYGNUS_MN10300:
1027 rtype = elf_mn10300_reloc_type (type);
1028 break;
1030 case EM_MN10200:
1031 case EM_CYGNUS_MN10200:
1032 rtype = elf_mn10200_reloc_type (type);
1033 break;
1035 case EM_FR30:
1036 case EM_CYGNUS_FR30:
1037 rtype = elf_fr30_reloc_type (type);
1038 break;
1040 case EM_CYGNUS_FRV:
1041 rtype = elf_frv_reloc_type (type);
1042 break;
1044 case EM_MCORE:
1045 rtype = elf_mcore_reloc_type (type);
1046 break;
1048 case EM_MMIX:
1049 rtype = elf_mmix_reloc_type (type);
1050 break;
1052 case EM_MSP430:
1053 case EM_MSP430_OLD:
1054 rtype = elf_msp430_reloc_type (type);
1055 break;
1057 case EM_PPC:
1058 rtype = elf_ppc_reloc_type (type);
1059 break;
1061 case EM_PPC64:
1062 rtype = elf_ppc64_reloc_type (type);
1063 break;
1065 case EM_MIPS:
1066 case EM_MIPS_RS3_LE:
1067 rtype = elf_mips_reloc_type (type);
1068 break;
1070 case EM_ALPHA:
1071 rtype = elf_alpha_reloc_type (type);
1072 break;
1074 case EM_ARM:
1075 rtype = elf_arm_reloc_type (type);
1076 break;
1078 case EM_ARC:
1079 rtype = elf_arc_reloc_type (type);
1080 break;
1082 case EM_PARISC:
1083 rtype = elf_hppa_reloc_type (type);
1084 break;
1086 case EM_H8_300:
1087 case EM_H8_300H:
1088 case EM_H8S:
1089 rtype = elf_h8_reloc_type (type);
1090 break;
1092 case EM_OPENRISC:
1093 case EM_OR32:
1094 rtype = elf_or32_reloc_type (type);
1095 break;
1097 case EM_PJ:
1098 case EM_PJ_OLD:
1099 rtype = elf_pj_reloc_type (type);
1100 break;
1101 case EM_IA_64:
1102 rtype = elf_ia64_reloc_type (type);
1103 break;
1105 case EM_CRIS:
1106 rtype = elf_cris_reloc_type (type);
1107 break;
1109 case EM_860:
1110 rtype = elf_i860_reloc_type (type);
1111 break;
1113 case EM_X86_64:
1114 rtype = elf_x86_64_reloc_type (type);
1115 break;
1117 case EM_S370:
1118 rtype = i370_reloc_type (type);
1119 break;
1121 case EM_S390_OLD:
1122 case EM_S390:
1123 rtype = elf_s390_reloc_type (type);
1124 break;
1126 case EM_SCORE:
1127 rtype = elf_score_reloc_type (type);
1128 break;
1130 case EM_XSTORMY16:
1131 rtype = elf_xstormy16_reloc_type (type);
1132 break;
1134 case EM_CRX:
1135 rtype = elf_crx_reloc_type (type);
1136 break;
1138 case EM_VAX:
1139 rtype = elf_vax_reloc_type (type);
1140 break;
1142 case EM_IP2K:
1143 case EM_IP2K_OLD:
1144 rtype = elf_ip2k_reloc_type (type);
1145 break;
1147 case EM_IQ2000:
1148 rtype = elf_iq2000_reloc_type (type);
1149 break;
1151 case EM_XTENSA_OLD:
1152 case EM_XTENSA:
1153 rtype = elf_xtensa_reloc_type (type);
1154 break;
1156 case EM_M32C_OLD:
1157 case EM_M32C:
1158 rtype = elf_m32c_reloc_type (type);
1159 break;
1161 case EM_MT:
1162 rtype = elf_mt_reloc_type (type);
1163 break;
1165 case EM_BLACKFIN:
1166 rtype = elf_bfin_reloc_type (type);
1167 break;
1169 case EM_CYGNUS_MEP:
1170 rtype = elf_mep_reloc_type (type);
1171 break;
1173 case EM_CR16:
1174 case EM_CR16_OLD:
1175 rtype = elf_cr16_reloc_type (type);
1176 break;
1179 if (rtype == NULL)
1180 printf (_("unrecognized: %-7lx"), (unsigned long) type & 0xffffffff);
1181 else
1182 printf (do_wide ? "%-22.22s" : "%-17.17s", rtype);
1184 if (elf_header.e_machine == EM_ALPHA
1185 && rtype != NULL
1186 && streq (rtype, "R_ALPHA_LITUSE")
1187 && is_rela)
1189 switch (rels[i].r_addend)
1191 case LITUSE_ALPHA_ADDR: rtype = "ADDR"; break;
1192 case LITUSE_ALPHA_BASE: rtype = "BASE"; break;
1193 case LITUSE_ALPHA_BYTOFF: rtype = "BYTOFF"; break;
1194 case LITUSE_ALPHA_JSR: rtype = "JSR"; break;
1195 case LITUSE_ALPHA_TLSGD: rtype = "TLSGD"; break;
1196 case LITUSE_ALPHA_TLSLDM: rtype = "TLSLDM"; break;
1197 case LITUSE_ALPHA_JSRDIRECT: rtype = "JSRDIRECT"; break;
1198 default: rtype = NULL;
1200 if (rtype)
1201 printf (" (%s)", rtype);
1202 else
1204 putchar (' ');
1205 printf (_("<unknown addend: %lx>"),
1206 (unsigned long) rels[i].r_addend);
1209 else if (symtab_index)
1211 if (symtab == NULL || symtab_index >= nsyms)
1212 printf (" bad symbol index: %08lx", (unsigned long) symtab_index);
1213 else
1215 Elf_Internal_Sym *psym;
1217 psym = symtab + symtab_index;
1219 printf (" ");
1220 print_vma (psym->st_value, LONG_HEX);
1221 printf (is_32bit_elf ? " " : " ");
1223 if (psym->st_name == 0)
1225 const char *sec_name = "<null>";
1226 char name_buf[40];
1228 if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1230 if (psym->st_shndx < elf_header.e_shnum)
1231 sec_name
1232 = SECTION_NAME (section_headers + psym->st_shndx);
1233 else if (psym->st_shndx == SHN_ABS)
1234 sec_name = "ABS";
1235 else if (psym->st_shndx == SHN_COMMON)
1236 sec_name = "COMMON";
1237 else if (elf_header.e_machine == EM_MIPS
1238 && psym->st_shndx == SHN_MIPS_SCOMMON)
1239 sec_name = "SCOMMON";
1240 else if (elf_header.e_machine == EM_MIPS
1241 && psym->st_shndx == SHN_MIPS_SUNDEFINED)
1242 sec_name = "SUNDEF";
1243 else if (elf_header.e_machine == EM_X86_64
1244 && psym->st_shndx == SHN_X86_64_LCOMMON)
1245 sec_name = "LARGE_COMMON";
1246 else if (elf_header.e_machine == EM_IA_64
1247 && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
1248 && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1249 sec_name = "ANSI_COM";
1250 else if (elf_header.e_machine == EM_IA_64
1251 && (elf_header.e_ident[EI_OSABI]
1252 == ELFOSABI_OPENVMS)
1253 && psym->st_shndx == SHN_IA_64_VMS_SYMVEC)
1254 sec_name = "VMS_SYMVEC";
1255 else
1257 sprintf (name_buf, "<section 0x%x>",
1258 (unsigned int) psym->st_shndx);
1259 sec_name = name_buf;
1262 print_symbol (22, sec_name);
1264 else if (strtab == NULL)
1265 printf (_("<string table index: %3ld>"), psym->st_name);
1266 else if (psym->st_name >= strtablen)
1267 printf (_("<corrupt string table index: %3ld>"), psym->st_name);
1268 else
1269 print_symbol (22, strtab + psym->st_name);
1271 if (is_rela)
1272 printf (" + %lx", (unsigned long) rels[i].r_addend);
1275 else if (is_rela)
1277 printf ("%*c", is_32bit_elf ?
1278 (do_wide ? 34 : 28) : (do_wide ? 26 : 20), ' ');
1279 print_vma (rels[i].r_addend, LONG_HEX);
1282 if (elf_header.e_machine == EM_SPARCV9
1283 && rtype != NULL
1284 && streq (rtype, "R_SPARC_OLO10"))
1285 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info));
1287 putchar ('\n');
1289 #ifdef BFD64
1290 if (! is_32bit_elf && elf_header.e_machine == EM_MIPS)
1292 bfd_vma type2 = ELF64_MIPS_R_TYPE2 (info);
1293 bfd_vma type3 = ELF64_MIPS_R_TYPE3 (info);
1294 const char *rtype2 = elf_mips_reloc_type (type2);
1295 const char *rtype3 = elf_mips_reloc_type (type3);
1297 printf (" Type2: ");
1299 if (rtype2 == NULL)
1300 printf (_("unrecognized: %-7lx"),
1301 (unsigned long) type2 & 0xffffffff);
1302 else
1303 printf ("%-17.17s", rtype2);
1305 printf ("\n Type3: ");
1307 if (rtype3 == NULL)
1308 printf (_("unrecognized: %-7lx"),
1309 (unsigned long) type3 & 0xffffffff);
1310 else
1311 printf ("%-17.17s", rtype3);
1313 putchar ('\n');
1315 #endif /* BFD64 */
1318 free (rels);
1321 static const char *
1322 get_mips_dynamic_type (unsigned long type)
1324 switch (type)
1326 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1327 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1328 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1329 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1330 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1331 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1332 case DT_MIPS_MSYM: return "MIPS_MSYM";
1333 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1334 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1335 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1336 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1337 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1338 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1339 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1340 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1341 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1342 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1343 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1344 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1345 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1346 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1347 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1348 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1349 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1350 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1351 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1352 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1353 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1354 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1355 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1356 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1357 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1358 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1359 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1360 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1361 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1362 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1363 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1364 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1365 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1366 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1367 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1368 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1369 default:
1370 return NULL;
1374 static const char *
1375 get_sparc64_dynamic_type (unsigned long type)
1377 switch (type)
1379 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1380 default:
1381 return NULL;
1385 static const char *
1386 get_ppc_dynamic_type (unsigned long type)
1388 switch (type)
1390 case DT_PPC_GOT: return "PPC_GOT";
1391 default:
1392 return NULL;
1396 static const char *
1397 get_ppc64_dynamic_type (unsigned long type)
1399 switch (type)
1401 case DT_PPC64_GLINK: return "PPC64_GLINK";
1402 case DT_PPC64_OPD: return "PPC64_OPD";
1403 case DT_PPC64_OPDSZ: return "PPC64_OPDSZ";
1404 default:
1405 return NULL;
1409 static const char *
1410 get_parisc_dynamic_type (unsigned long type)
1412 switch (type)
1414 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1415 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1416 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1417 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1418 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1419 case DT_HP_PREINIT: return "HP_PREINIT";
1420 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1421 case DT_HP_NEEDED: return "HP_NEEDED";
1422 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1423 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1424 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1425 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1426 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
1427 case DT_HP_EPLTREL: return "HP_GST_EPLTREL";
1428 case DT_HP_EPLTRELSZ: return "HP_GST_EPLTRELSZ";
1429 case DT_HP_FILTERED: return "HP_FILTERED";
1430 case DT_HP_FILTER_TLS: return "HP_FILTER_TLS";
1431 case DT_HP_COMPAT_FILTERED: return "HP_COMPAT_FILTERED";
1432 case DT_HP_LAZYLOAD: return "HP_LAZYLOAD";
1433 case DT_HP_BIND_NOW_COUNT: return "HP_BIND_NOW_COUNT";
1434 case DT_PLT: return "PLT";
1435 case DT_PLT_SIZE: return "PLT_SIZE";
1436 case DT_DLT: return "DLT";
1437 case DT_DLT_SIZE: return "DLT_SIZE";
1438 default:
1439 return NULL;
1443 static const char *
1444 get_ia64_dynamic_type (unsigned long type)
1446 switch (type)
1448 case DT_IA_64_PLT_RESERVE: return "IA_64_PLT_RESERVE";
1449 case DT_IA_64_VMS_SUBTYPE: return "VMS_SUBTYPE";
1450 case DT_IA_64_VMS_IMGIOCNT: return "VMS_IMGIOCNT";
1451 case DT_IA_64_VMS_LNKFLAGS: return "VMS_LNKFLAGS";
1452 case DT_IA_64_VMS_VIR_MEM_BLK_SIZ: return "VMS_VIR_MEM_BLK_SIZ";
1453 case DT_IA_64_VMS_IDENT: return "VMS_IDENT";
1454 case DT_IA_64_VMS_NEEDED_IDENT: return "VMS_NEEDED_IDENT";
1455 case DT_IA_64_VMS_IMG_RELA_CNT: return "VMS_IMG_RELA_CNT";
1456 case DT_IA_64_VMS_SEG_RELA_CNT: return "VMS_SEG_RELA_CNT";
1457 case DT_IA_64_VMS_FIXUP_RELA_CNT: return "VMS_FIXUP_RELA_CNT";
1458 case DT_IA_64_VMS_FIXUP_NEEDED: return "VMS_FIXUP_NEEDED";
1459 case DT_IA_64_VMS_SYMVEC_CNT: return "VMS_SYMVEC_CNT";
1460 case DT_IA_64_VMS_XLATED: return "VMS_XLATED";
1461 case DT_IA_64_VMS_STACKSIZE: return "VMS_STACKSIZE";
1462 case DT_IA_64_VMS_UNWINDSZ: return "VMS_UNWINDSZ";
1463 case DT_IA_64_VMS_UNWIND_CODSEG: return "VMS_UNWIND_CODSEG";
1464 case DT_IA_64_VMS_UNWIND_INFOSEG: return "VMS_UNWIND_INFOSEG";
1465 case DT_IA_64_VMS_LINKTIME: return "VMS_LINKTIME";
1466 case DT_IA_64_VMS_SEG_NO: return "VMS_SEG_NO";
1467 case DT_IA_64_VMS_SYMVEC_OFFSET: return "VMS_SYMVEC_OFFSET";
1468 case DT_IA_64_VMS_SYMVEC_SEG: return "VMS_SYMVEC_SEG";
1469 case DT_IA_64_VMS_UNWIND_OFFSET: return "VMS_UNWIND_OFFSET";
1470 case DT_IA_64_VMS_UNWIND_SEG: return "VMS_UNWIND_SEG";
1471 case DT_IA_64_VMS_STRTAB_OFFSET: return "VMS_STRTAB_OFFSET";
1472 case DT_IA_64_VMS_SYSVER_OFFSET: return "VMS_SYSVER_OFFSET";
1473 case DT_IA_64_VMS_IMG_RELA_OFF: return "VMS_IMG_RELA_OFF";
1474 case DT_IA_64_VMS_SEG_RELA_OFF: return "VMS_SEG_RELA_OFF";
1475 case DT_IA_64_VMS_FIXUP_RELA_OFF: return "VMS_FIXUP_RELA_OFF";
1476 case DT_IA_64_VMS_PLTGOT_OFFSET: return "VMS_PLTGOT_OFFSET";
1477 case DT_IA_64_VMS_PLTGOT_SEG: return "VMS_PLTGOT_SEG";
1478 case DT_IA_64_VMS_FPMODE: return "VMS_FPMODE";
1479 default:
1480 return NULL;
1484 static const char *
1485 get_alpha_dynamic_type (unsigned long type)
1487 switch (type)
1489 case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
1490 default:
1491 return NULL;
1495 static const char *
1496 get_score_dynamic_type (unsigned long type)
1498 switch (type)
1500 case DT_SCORE_BASE_ADDRESS: return "SCORE_BASE_ADDRESS";
1501 case DT_SCORE_LOCAL_GOTNO: return "SCORE_LOCAL_GOTNO";
1502 case DT_SCORE_SYMTABNO: return "SCORE_SYMTABNO";
1503 case DT_SCORE_GOTSYM: return "SCORE_GOTSYM";
1504 case DT_SCORE_UNREFEXTNO: return "SCORE_UNREFEXTNO";
1505 case DT_SCORE_HIPAGENO: return "SCORE_HIPAGENO";
1506 default:
1507 return NULL;
1512 static const char *
1513 get_dynamic_type (unsigned long type)
1515 static char buff[64];
1517 switch (type)
1519 case DT_NULL: return "NULL";
1520 case DT_NEEDED: return "NEEDED";
1521 case DT_PLTRELSZ: return "PLTRELSZ";
1522 case DT_PLTGOT: return "PLTGOT";
1523 case DT_HASH: return "HASH";
1524 case DT_STRTAB: return "STRTAB";
1525 case DT_SYMTAB: return "SYMTAB";
1526 case DT_RELA: return "RELA";
1527 case DT_RELASZ: return "RELASZ";
1528 case DT_RELAENT: return "RELAENT";
1529 case DT_STRSZ: return "STRSZ";
1530 case DT_SYMENT: return "SYMENT";
1531 case DT_INIT: return "INIT";
1532 case DT_FINI: return "FINI";
1533 case DT_SONAME: return "SONAME";
1534 case DT_RPATH: return "RPATH";
1535 case DT_SYMBOLIC: return "SYMBOLIC";
1536 case DT_REL: return "REL";
1537 case DT_RELSZ: return "RELSZ";
1538 case DT_RELENT: return "RELENT";
1539 case DT_PLTREL: return "PLTREL";
1540 case DT_DEBUG: return "DEBUG";
1541 case DT_TEXTREL: return "TEXTREL";
1542 case DT_JMPREL: return "JMPREL";
1543 case DT_BIND_NOW: return "BIND_NOW";
1544 case DT_INIT_ARRAY: return "INIT_ARRAY";
1545 case DT_FINI_ARRAY: return "FINI_ARRAY";
1546 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
1547 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
1548 case DT_RUNPATH: return "RUNPATH";
1549 case DT_FLAGS: return "FLAGS";
1551 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1552 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
1554 case DT_CHECKSUM: return "CHECKSUM";
1555 case DT_PLTPADSZ: return "PLTPADSZ";
1556 case DT_MOVEENT: return "MOVEENT";
1557 case DT_MOVESZ: return "MOVESZ";
1558 case DT_FEATURE: return "FEATURE";
1559 case DT_POSFLAG_1: return "POSFLAG_1";
1560 case DT_SYMINSZ: return "SYMINSZ";
1561 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
1563 case DT_ADDRRNGLO: return "ADDRRNGLO";
1564 case DT_CONFIG: return "CONFIG";
1565 case DT_DEPAUDIT: return "DEPAUDIT";
1566 case DT_AUDIT: return "AUDIT";
1567 case DT_PLTPAD: return "PLTPAD";
1568 case DT_MOVETAB: return "MOVETAB";
1569 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
1571 case DT_VERSYM: return "VERSYM";
1573 case DT_TLSDESC_GOT: return "TLSDESC_GOT";
1574 case DT_TLSDESC_PLT: return "TLSDESC_PLT";
1575 case DT_RELACOUNT: return "RELACOUNT";
1576 case DT_RELCOUNT: return "RELCOUNT";
1577 case DT_FLAGS_1: return "FLAGS_1";
1578 case DT_VERDEF: return "VERDEF";
1579 case DT_VERDEFNUM: return "VERDEFNUM";
1580 case DT_VERNEED: return "VERNEED";
1581 case DT_VERNEEDNUM: return "VERNEEDNUM";
1583 case DT_AUXILIARY: return "AUXILIARY";
1584 case DT_USED: return "USED";
1585 case DT_FILTER: return "FILTER";
1587 case DT_GNU_PRELINKED: return "GNU_PRELINKED";
1588 case DT_GNU_CONFLICT: return "GNU_CONFLICT";
1589 case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
1590 case DT_GNU_LIBLIST: return "GNU_LIBLIST";
1591 case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
1592 case DT_GNU_HASH: return "GNU_HASH";
1594 default:
1595 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
1597 const char *result;
1599 switch (elf_header.e_machine)
1601 case EM_MIPS:
1602 case EM_MIPS_RS3_LE:
1603 result = get_mips_dynamic_type (type);
1604 break;
1605 case EM_SPARCV9:
1606 result = get_sparc64_dynamic_type (type);
1607 break;
1608 case EM_PPC:
1609 result = get_ppc_dynamic_type (type);
1610 break;
1611 case EM_PPC64:
1612 result = get_ppc64_dynamic_type (type);
1613 break;
1614 case EM_IA_64:
1615 result = get_ia64_dynamic_type (type);
1616 break;
1617 case EM_ALPHA:
1618 result = get_alpha_dynamic_type (type);
1619 break;
1620 case EM_SCORE:
1621 result = get_score_dynamic_type (type);
1622 break;
1623 default:
1624 result = NULL;
1625 break;
1628 if (result != NULL)
1629 return result;
1631 snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
1633 else if (((type >= DT_LOOS) && (type <= DT_HIOS))
1634 || (elf_header.e_machine == EM_PARISC
1635 && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
1637 const char *result;
1639 switch (elf_header.e_machine)
1641 case EM_PARISC:
1642 result = get_parisc_dynamic_type (type);
1643 break;
1644 case EM_IA_64:
1645 result = get_ia64_dynamic_type (type);
1646 break;
1647 default:
1648 result = NULL;
1649 break;
1652 if (result != NULL)
1653 return result;
1655 snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
1656 type);
1658 else
1659 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
1661 return buff;
1665 static char *
1666 get_file_type (unsigned e_type)
1668 static char buff[32];
1670 switch (e_type)
1672 case ET_NONE: return _("NONE (None)");
1673 case ET_REL: return _("REL (Relocatable file)");
1674 case ET_EXEC: return _("EXEC (Executable file)");
1675 case ET_DYN: return _("DYN (Shared object file)");
1676 case ET_CORE: return _("CORE (Core file)");
1678 default:
1679 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
1680 snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
1681 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
1682 snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
1683 else
1684 snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
1685 return buff;
1689 static char *
1690 get_machine_name (unsigned e_machine)
1692 static char buff[64]; /* XXX */
1694 switch (e_machine)
1696 case EM_NONE: return _("None");
1697 case EM_M32: return "WE32100";
1698 case EM_SPARC: return "Sparc";
1699 case EM_SPU: return "SPU";
1700 case EM_386: return "Intel 80386";
1701 case EM_68K: return "MC68000";
1702 case EM_88K: return "MC88000";
1703 case EM_486: return "Intel 80486";
1704 case EM_860: return "Intel 80860";
1705 case EM_MIPS: return "MIPS R3000";
1706 case EM_S370: return "IBM System/370";
1707 case EM_MIPS_RS3_LE: return "MIPS R4000 big-endian";
1708 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
1709 case EM_PARISC: return "HPPA";
1710 case EM_PPC_OLD: return "Power PC (old)";
1711 case EM_SPARC32PLUS: return "Sparc v8+" ;
1712 case EM_960: return "Intel 90860";
1713 case EM_PPC: return "PowerPC";
1714 case EM_PPC64: return "PowerPC64";
1715 case EM_V800: return "NEC V800";
1716 case EM_FR20: return "Fujitsu FR20";
1717 case EM_RH32: return "TRW RH32";
1718 case EM_MCORE: return "MCORE";
1719 case EM_ARM: return "ARM";
1720 case EM_OLD_ALPHA: return "Digital Alpha (old)";
1721 case EM_SH: return "Renesas / SuperH SH";
1722 case EM_SPARCV9: return "Sparc v9";
1723 case EM_TRICORE: return "Siemens Tricore";
1724 case EM_ARC: return "ARC";
1725 case EM_H8_300: return "Renesas H8/300";
1726 case EM_H8_300H: return "Renesas H8/300H";
1727 case EM_H8S: return "Renesas H8S";
1728 case EM_H8_500: return "Renesas H8/500";
1729 case EM_IA_64: return "Intel IA-64";
1730 case EM_MIPS_X: return "Stanford MIPS-X";
1731 case EM_COLDFIRE: return "Motorola Coldfire";
1732 case EM_68HC12: return "Motorola M68HC12";
1733 case EM_ALPHA: return "Alpha";
1734 case EM_CYGNUS_D10V:
1735 case EM_D10V: return "d10v";
1736 case EM_CYGNUS_D30V:
1737 case EM_D30V: return "d30v";
1738 case EM_CYGNUS_M32R:
1739 case EM_M32R: return "Renesas M32R (formerly Mitsubishi M32r)";
1740 case EM_CYGNUS_V850:
1741 case EM_V850: return "NEC v850";
1742 case EM_CYGNUS_MN10300:
1743 case EM_MN10300: return "mn10300";
1744 case EM_CYGNUS_MN10200:
1745 case EM_MN10200: return "mn10200";
1746 case EM_CYGNUS_FR30:
1747 case EM_FR30: return "Fujitsu FR30";
1748 case EM_CYGNUS_FRV: return "Fujitsu FR-V";
1749 case EM_PJ_OLD:
1750 case EM_PJ: return "picoJava";
1751 case EM_MMA: return "Fujitsu Multimedia Accelerator";
1752 case EM_PCP: return "Siemens PCP";
1753 case EM_NCPU: return "Sony nCPU embedded RISC processor";
1754 case EM_NDR1: return "Denso NDR1 microprocesspr";
1755 case EM_STARCORE: return "Motorola Star*Core processor";
1756 case EM_ME16: return "Toyota ME16 processor";
1757 case EM_ST100: return "STMicroelectronics ST100 processor";
1758 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
1759 case EM_FX66: return "Siemens FX66 microcontroller";
1760 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1761 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
1762 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
1763 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
1764 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
1765 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
1766 case EM_SVX: return "Silicon Graphics SVx";
1767 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
1768 case EM_VAX: return "Digital VAX";
1769 case EM_AVR_OLD:
1770 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
1771 case EM_CRIS: return "Axis Communications 32-bit embedded processor";
1772 case EM_JAVELIN: return "Infineon Technologies 32-bit embedded cpu";
1773 case EM_FIREPATH: return "Element 14 64-bit DSP processor";
1774 case EM_ZSP: return "LSI Logic's 16-bit DSP processor";
1775 case EM_MMIX: return "Donald Knuth's educational 64-bit processor";
1776 case EM_HUANY: return "Harvard Universitys's machine-independent object format";
1777 case EM_PRISM: return "Vitesse Prism";
1778 case EM_X86_64: return "Advanced Micro Devices X86-64";
1779 case EM_S390_OLD:
1780 case EM_S390: return "IBM S/390";
1781 case EM_SCORE: return "SUNPLUS S+Core";
1782 case EM_XSTORMY16: return "Sanyo Xstormy16 CPU core";
1783 case EM_OPENRISC:
1784 case EM_OR32: return "OpenRISC";
1785 case EM_CRX: return "National Semiconductor CRX microprocessor";
1786 case EM_DLX: return "OpenDLX";
1787 case EM_IP2K_OLD:
1788 case EM_IP2K: return "Ubicom IP2xxx 8-bit microcontrollers";
1789 case EM_IQ2000: return "Vitesse IQ2000";
1790 case EM_XTENSA_OLD:
1791 case EM_XTENSA: return "Tensilica Xtensa Processor";
1792 case EM_M32C_OLD:
1793 case EM_M32C: return "Renesas M32c";
1794 case EM_MT: return "Morpho Techologies MT processor";
1795 case EM_BLACKFIN: return "Analog Devices Blackfin";
1796 case EM_NIOS32: return "Altera Nios";
1797 case EM_ALTERA_NIOS2: return "Altera Nios II";
1798 case EM_XC16X: return "Infineon Technologies xc16x";
1799 case EM_CYGNUS_MEP: return "Toshiba MeP Media Engine";
1800 case EM_CR16:
1801 case EM_CR16_OLD: return "National Semiconductor's CR16";
1802 default:
1803 snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
1804 return buff;
1808 static void
1809 decode_ARM_machine_flags (unsigned e_flags, char buf[])
1811 unsigned eabi;
1812 int unknown = 0;
1814 eabi = EF_ARM_EABI_VERSION (e_flags);
1815 e_flags &= ~ EF_ARM_EABIMASK;
1817 /* Handle "generic" ARM flags. */
1818 if (e_flags & EF_ARM_RELEXEC)
1820 strcat (buf, ", relocatable executable");
1821 e_flags &= ~ EF_ARM_RELEXEC;
1824 if (e_flags & EF_ARM_HASENTRY)
1826 strcat (buf, ", has entry point");
1827 e_flags &= ~ EF_ARM_HASENTRY;
1830 /* Now handle EABI specific flags. */
1831 switch (eabi)
1833 default:
1834 strcat (buf, ", <unrecognized EABI>");
1835 if (e_flags)
1836 unknown = 1;
1837 break;
1839 case EF_ARM_EABI_VER1:
1840 strcat (buf, ", Version1 EABI");
1841 while (e_flags)
1843 unsigned flag;
1845 /* Process flags one bit at a time. */
1846 flag = e_flags & - e_flags;
1847 e_flags &= ~ flag;
1849 switch (flag)
1851 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
1852 strcat (buf, ", sorted symbol tables");
1853 break;
1855 default:
1856 unknown = 1;
1857 break;
1860 break;
1862 case EF_ARM_EABI_VER2:
1863 strcat (buf, ", Version2 EABI");
1864 while (e_flags)
1866 unsigned flag;
1868 /* Process flags one bit at a time. */
1869 flag = e_flags & - e_flags;
1870 e_flags &= ~ flag;
1872 switch (flag)
1874 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
1875 strcat (buf, ", sorted symbol tables");
1876 break;
1878 case EF_ARM_DYNSYMSUSESEGIDX:
1879 strcat (buf, ", dynamic symbols use segment index");
1880 break;
1882 case EF_ARM_MAPSYMSFIRST:
1883 strcat (buf, ", mapping symbols precede others");
1884 break;
1886 default:
1887 unknown = 1;
1888 break;
1891 break;
1893 case EF_ARM_EABI_VER3:
1894 strcat (buf, ", Version3 EABI");
1895 break;
1897 case EF_ARM_EABI_VER4:
1898 strcat (buf, ", Version4 EABI");
1899 goto eabi;
1901 case EF_ARM_EABI_VER5:
1902 strcat (buf, ", Version5 EABI");
1903 eabi:
1904 while (e_flags)
1906 unsigned flag;
1908 /* Process flags one bit at a time. */
1909 flag = e_flags & - e_flags;
1910 e_flags &= ~ flag;
1912 switch (flag)
1914 case EF_ARM_BE8:
1915 strcat (buf, ", BE8");
1916 break;
1918 case EF_ARM_LE8:
1919 strcat (buf, ", LE8");
1920 break;
1922 default:
1923 unknown = 1;
1924 break;
1927 break;
1929 case EF_ARM_EABI_UNKNOWN:
1930 strcat (buf, ", GNU EABI");
1931 while (e_flags)
1933 unsigned flag;
1935 /* Process flags one bit at a time. */
1936 flag = e_flags & - e_flags;
1937 e_flags &= ~ flag;
1939 switch (flag)
1941 case EF_ARM_INTERWORK:
1942 strcat (buf, ", interworking enabled");
1943 break;
1945 case EF_ARM_APCS_26:
1946 strcat (buf, ", uses APCS/26");
1947 break;
1949 case EF_ARM_APCS_FLOAT:
1950 strcat (buf, ", uses APCS/float");
1951 break;
1953 case EF_ARM_PIC:
1954 strcat (buf, ", position independent");
1955 break;
1957 case EF_ARM_ALIGN8:
1958 strcat (buf, ", 8 bit structure alignment");
1959 break;
1961 case EF_ARM_NEW_ABI:
1962 strcat (buf, ", uses new ABI");
1963 break;
1965 case EF_ARM_OLD_ABI:
1966 strcat (buf, ", uses old ABI");
1967 break;
1969 case EF_ARM_SOFT_FLOAT:
1970 strcat (buf, ", software FP");
1971 break;
1973 case EF_ARM_VFP_FLOAT:
1974 strcat (buf, ", VFP");
1975 break;
1977 case EF_ARM_MAVERICK_FLOAT:
1978 strcat (buf, ", Maverick FP");
1979 break;
1981 default:
1982 unknown = 1;
1983 break;
1988 if (unknown)
1989 strcat (buf,", <unknown>");
1992 static char *
1993 get_machine_flags (unsigned e_flags, unsigned e_machine)
1995 static char buf[1024];
1997 buf[0] = '\0';
1999 if (e_flags)
2001 switch (e_machine)
2003 default:
2004 break;
2006 case EM_ARM:
2007 decode_ARM_machine_flags (e_flags, buf);
2008 break;
2010 case EM_CYGNUS_FRV:
2011 switch (e_flags & EF_FRV_CPU_MASK)
2013 case EF_FRV_CPU_GENERIC:
2014 break;
2016 default:
2017 strcat (buf, ", fr???");
2018 break;
2020 case EF_FRV_CPU_FR300:
2021 strcat (buf, ", fr300");
2022 break;
2024 case EF_FRV_CPU_FR400:
2025 strcat (buf, ", fr400");
2026 break;
2027 case EF_FRV_CPU_FR405:
2028 strcat (buf, ", fr405");
2029 break;
2031 case EF_FRV_CPU_FR450:
2032 strcat (buf, ", fr450");
2033 break;
2035 case EF_FRV_CPU_FR500:
2036 strcat (buf, ", fr500");
2037 break;
2038 case EF_FRV_CPU_FR550:
2039 strcat (buf, ", fr550");
2040 break;
2042 case EF_FRV_CPU_SIMPLE:
2043 strcat (buf, ", simple");
2044 break;
2045 case EF_FRV_CPU_TOMCAT:
2046 strcat (buf, ", tomcat");
2047 break;
2049 break;
2051 case EM_68K:
2052 if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
2053 strcat (buf, ", m68000");
2054 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
2055 strcat (buf, ", cpu32");
2056 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
2057 strcat (buf, ", fido_a");
2058 else
2060 char const *isa = _("unknown");
2061 char const *mac = _("unknown mac");
2062 char const *additional = NULL;
2064 switch (e_flags & EF_M68K_CF_ISA_MASK)
2066 case EF_M68K_CF_ISA_A_NODIV:
2067 isa = "A";
2068 additional = ", nodiv";
2069 break;
2070 case EF_M68K_CF_ISA_A:
2071 isa = "A";
2072 break;
2073 case EF_M68K_CF_ISA_A_PLUS:
2074 isa = "A+";
2075 break;
2076 case EF_M68K_CF_ISA_B_NOUSP:
2077 isa = "B";
2078 additional = ", nousp";
2079 break;
2080 case EF_M68K_CF_ISA_B:
2081 isa = "B";
2082 break;
2084 strcat (buf, ", cf, isa ");
2085 strcat (buf, isa);
2086 if (additional)
2087 strcat (buf, additional);
2088 if (e_flags & EF_M68K_CF_FLOAT)
2089 strcat (buf, ", float");
2090 switch (e_flags & EF_M68K_CF_MAC_MASK)
2092 case 0:
2093 mac = NULL;
2094 break;
2095 case EF_M68K_CF_MAC:
2096 mac = "mac";
2097 break;
2098 case EF_M68K_CF_EMAC:
2099 mac = "emac";
2100 break;
2102 if (mac)
2104 strcat (buf, ", ");
2105 strcat (buf, mac);
2108 break;
2110 case EM_PPC:
2111 if (e_flags & EF_PPC_EMB)
2112 strcat (buf, ", emb");
2114 if (e_flags & EF_PPC_RELOCATABLE)
2115 strcat (buf, ", relocatable");
2117 if (e_flags & EF_PPC_RELOCATABLE_LIB)
2118 strcat (buf, ", relocatable-lib");
2119 break;
2121 case EM_V850:
2122 case EM_CYGNUS_V850:
2123 switch (e_flags & EF_V850_ARCH)
2125 case E_V850E1_ARCH:
2126 strcat (buf, ", v850e1");
2127 break;
2128 case E_V850E_ARCH:
2129 strcat (buf, ", v850e");
2130 break;
2131 case E_V850_ARCH:
2132 strcat (buf, ", v850");
2133 break;
2134 default:
2135 strcat (buf, ", unknown v850 architecture variant");
2136 break;
2138 break;
2140 case EM_M32R:
2141 case EM_CYGNUS_M32R:
2142 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
2143 strcat (buf, ", m32r");
2144 break;
2146 case EM_MIPS:
2147 case EM_MIPS_RS3_LE:
2148 if (e_flags & EF_MIPS_NOREORDER)
2149 strcat (buf, ", noreorder");
2151 if (e_flags & EF_MIPS_PIC)
2152 strcat (buf, ", pic");
2154 if (e_flags & EF_MIPS_CPIC)
2155 strcat (buf, ", cpic");
2157 if (e_flags & EF_MIPS_UCODE)
2158 strcat (buf, ", ugen_reserved");
2160 if (e_flags & EF_MIPS_ABI2)
2161 strcat (buf, ", abi2");
2163 if (e_flags & EF_MIPS_OPTIONS_FIRST)
2164 strcat (buf, ", odk first");
2166 if (e_flags & EF_MIPS_32BITMODE)
2167 strcat (buf, ", 32bitmode");
2169 switch ((e_flags & EF_MIPS_MACH))
2171 case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
2172 case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
2173 case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
2174 case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
2175 case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
2176 case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
2177 case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
2178 case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
2179 case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break;
2180 case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
2181 case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break;
2182 case E_MIPS_MACH_LS2F: strcat (buf, ", loongson-2f"); break;
2183 case E_MIPS_MACH_OCTEON: strcat (buf, ", octeon"); break;
2184 case 0:
2185 /* We simply ignore the field in this case to avoid confusion:
2186 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
2187 extension. */
2188 break;
2189 default: strcat (buf, ", unknown CPU"); break;
2192 switch ((e_flags & EF_MIPS_ABI))
2194 case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
2195 case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
2196 case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
2197 case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
2198 case 0:
2199 /* We simply ignore the field in this case to avoid confusion:
2200 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
2201 This means it is likely to be an o32 file, but not for
2202 sure. */
2203 break;
2204 default: strcat (buf, ", unknown ABI"); break;
2207 if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
2208 strcat (buf, ", mdmx");
2210 if (e_flags & EF_MIPS_ARCH_ASE_M16)
2211 strcat (buf, ", mips16");
2213 switch ((e_flags & EF_MIPS_ARCH))
2215 case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
2216 case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
2217 case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
2218 case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
2219 case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
2220 case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
2221 case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
2222 case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
2223 case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
2224 default: strcat (buf, ", unknown ISA"); break;
2227 break;
2229 case EM_SH:
2230 switch ((e_flags & EF_SH_MACH_MASK))
2232 case EF_SH1: strcat (buf, ", sh1"); break;
2233 case EF_SH2: strcat (buf, ", sh2"); break;
2234 case EF_SH3: strcat (buf, ", sh3"); break;
2235 case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
2236 case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
2237 case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
2238 case EF_SH3E: strcat (buf, ", sh3e"); break;
2239 case EF_SH4: strcat (buf, ", sh4"); break;
2240 case EF_SH5: strcat (buf, ", sh5"); break;
2241 case EF_SH2E: strcat (buf, ", sh2e"); break;
2242 case EF_SH4A: strcat (buf, ", sh4a"); break;
2243 case EF_SH2A: strcat (buf, ", sh2a"); break;
2244 case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
2245 case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
2246 case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
2247 case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
2248 case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
2249 case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
2250 case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
2251 case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
2252 case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
2253 default: strcat (buf, ", unknown ISA"); break;
2256 break;
2258 case EM_SPARCV9:
2259 if (e_flags & EF_SPARC_32PLUS)
2260 strcat (buf, ", v8+");
2262 if (e_flags & EF_SPARC_SUN_US1)
2263 strcat (buf, ", ultrasparcI");
2265 if (e_flags & EF_SPARC_SUN_US3)
2266 strcat (buf, ", ultrasparcIII");
2268 if (e_flags & EF_SPARC_HAL_R1)
2269 strcat (buf, ", halr1");
2271 if (e_flags & EF_SPARC_LEDATA)
2272 strcat (buf, ", ledata");
2274 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
2275 strcat (buf, ", tso");
2277 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
2278 strcat (buf, ", pso");
2280 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
2281 strcat (buf, ", rmo");
2282 break;
2284 case EM_PARISC:
2285 switch (e_flags & EF_PARISC_ARCH)
2287 case EFA_PARISC_1_0:
2288 strcpy (buf, ", PA-RISC 1.0");
2289 break;
2290 case EFA_PARISC_1_1:
2291 strcpy (buf, ", PA-RISC 1.1");
2292 break;
2293 case EFA_PARISC_2_0:
2294 strcpy (buf, ", PA-RISC 2.0");
2295 break;
2296 default:
2297 break;
2299 if (e_flags & EF_PARISC_TRAPNIL)
2300 strcat (buf, ", trapnil");
2301 if (e_flags & EF_PARISC_EXT)
2302 strcat (buf, ", ext");
2303 if (e_flags & EF_PARISC_LSB)
2304 strcat (buf, ", lsb");
2305 if (e_flags & EF_PARISC_WIDE)
2306 strcat (buf, ", wide");
2307 if (e_flags & EF_PARISC_NO_KABP)
2308 strcat (buf, ", no kabp");
2309 if (e_flags & EF_PARISC_LAZYSWAP)
2310 strcat (buf, ", lazyswap");
2311 break;
2313 case EM_PJ:
2314 case EM_PJ_OLD:
2315 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
2316 strcat (buf, ", new calling convention");
2318 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
2319 strcat (buf, ", gnu calling convention");
2320 break;
2322 case EM_IA_64:
2323 if ((e_flags & EF_IA_64_ABI64))
2324 strcat (buf, ", 64-bit");
2325 else
2326 strcat (buf, ", 32-bit");
2327 if ((e_flags & EF_IA_64_REDUCEDFP))
2328 strcat (buf, ", reduced fp model");
2329 if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
2330 strcat (buf, ", no function descriptors, constant gp");
2331 else if ((e_flags & EF_IA_64_CONS_GP))
2332 strcat (buf, ", constant gp");
2333 if ((e_flags & EF_IA_64_ABSOLUTE))
2334 strcat (buf, ", absolute");
2335 break;
2337 case EM_VAX:
2338 if ((e_flags & EF_VAX_NONPIC))
2339 strcat (buf, ", non-PIC");
2340 if ((e_flags & EF_VAX_DFLOAT))
2341 strcat (buf, ", D-Float");
2342 if ((e_flags & EF_VAX_GFLOAT))
2343 strcat (buf, ", G-Float");
2344 break;
2348 return buf;
2351 static const char *
2352 get_osabi_name (unsigned int osabi)
2354 static char buff[32];
2356 switch (osabi)
2358 case ELFOSABI_NONE: return "UNIX - System V";
2359 case ELFOSABI_HPUX: return "UNIX - HP-UX";
2360 case ELFOSABI_NETBSD: return "UNIX - NetBSD";
2361 case ELFOSABI_LINUX: return "UNIX - Linux";
2362 case ELFOSABI_HURD: return "GNU/Hurd";
2363 case ELFOSABI_SOLARIS: return "UNIX - Solaris";
2364 case ELFOSABI_AIX: return "UNIX - AIX";
2365 case ELFOSABI_IRIX: return "UNIX - IRIX";
2366 case ELFOSABI_FREEBSD: return "UNIX - FreeBSD";
2367 case ELFOSABI_TRU64: return "UNIX - TRU64";
2368 case ELFOSABI_MODESTO: return "Novell - Modesto";
2369 case ELFOSABI_OPENBSD: return "UNIX - OpenBSD";
2370 case ELFOSABI_OPENVMS: return "VMS - OpenVMS";
2371 case ELFOSABI_NSK: return "HP - Non-Stop Kernel";
2372 case ELFOSABI_AROS: return "Amiga Research OS";
2373 case ELFOSABI_STANDALONE: return _("Standalone App");
2374 case ELFOSABI_ARM: return "ARM";
2375 default:
2376 snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
2377 return buff;
2381 static const char *
2382 get_arm_segment_type (unsigned long type)
2384 switch (type)
2386 case PT_ARM_EXIDX:
2387 return "EXIDX";
2388 default:
2389 break;
2392 return NULL;
2395 static const char *
2396 get_mips_segment_type (unsigned long type)
2398 switch (type)
2400 case PT_MIPS_REGINFO:
2401 return "REGINFO";
2402 case PT_MIPS_RTPROC:
2403 return "RTPROC";
2404 case PT_MIPS_OPTIONS:
2405 return "OPTIONS";
2406 default:
2407 break;
2410 return NULL;
2413 static const char *
2414 get_parisc_segment_type (unsigned long type)
2416 switch (type)
2418 case PT_HP_TLS: return "HP_TLS";
2419 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
2420 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
2421 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
2422 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
2423 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
2424 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
2425 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
2426 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
2427 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
2428 case PT_HP_PARALLEL: return "HP_PARALLEL";
2429 case PT_HP_FASTBIND: return "HP_FASTBIND";
2430 case PT_HP_OPT_ANNOT: return "HP_OPT_ANNOT";
2431 case PT_HP_HSL_ANNOT: return "HP_HSL_ANNOT";
2432 case PT_HP_STACK: return "HP_STACK";
2433 case PT_HP_CORE_UTSNAME: return "HP_CORE_UTSNAME";
2434 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
2435 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
2436 case PT_PARISC_WEAKORDER: return "PARISC_WEAKORDER";
2437 default:
2438 break;
2441 return NULL;
2444 static const char *
2445 get_ia64_segment_type (unsigned long type)
2447 switch (type)
2449 case PT_IA_64_ARCHEXT: return "IA_64_ARCHEXT";
2450 case PT_IA_64_UNWIND: return "IA_64_UNWIND";
2451 case PT_HP_TLS: return "HP_TLS";
2452 case PT_IA_64_HP_OPT_ANOT: return "HP_OPT_ANNOT";
2453 case PT_IA_64_HP_HSL_ANOT: return "HP_HSL_ANNOT";
2454 case PT_IA_64_HP_STACK: return "HP_STACK";
2455 default:
2456 break;
2459 return NULL;
2462 static const char *
2463 get_segment_type (unsigned long p_type)
2465 static char buff[32];
2467 switch (p_type)
2469 case PT_NULL: return "NULL";
2470 case PT_LOAD: return "LOAD";
2471 case PT_DYNAMIC: return "DYNAMIC";
2472 case PT_INTERP: return "INTERP";
2473 case PT_NOTE: return "NOTE";
2474 case PT_SHLIB: return "SHLIB";
2475 case PT_PHDR: return "PHDR";
2476 case PT_TLS: return "TLS";
2478 case PT_GNU_EH_FRAME:
2479 return "GNU_EH_FRAME";
2480 case PT_GNU_STACK: return "GNU_STACK";
2481 case PT_GNU_RELRO: return "GNU_RELRO";
2483 default:
2484 if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
2486 const char *result;
2488 switch (elf_header.e_machine)
2490 case EM_ARM:
2491 result = get_arm_segment_type (p_type);
2492 break;
2493 case EM_MIPS:
2494 case EM_MIPS_RS3_LE:
2495 result = get_mips_segment_type (p_type);
2496 break;
2497 case EM_PARISC:
2498 result = get_parisc_segment_type (p_type);
2499 break;
2500 case EM_IA_64:
2501 result = get_ia64_segment_type (p_type);
2502 break;
2503 default:
2504 result = NULL;
2505 break;
2508 if (result != NULL)
2509 return result;
2511 sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
2513 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
2515 const char *result;
2517 switch (elf_header.e_machine)
2519 case EM_PARISC:
2520 result = get_parisc_segment_type (p_type);
2521 break;
2522 case EM_IA_64:
2523 result = get_ia64_segment_type (p_type);
2524 break;
2525 default:
2526 result = NULL;
2527 break;
2530 if (result != NULL)
2531 return result;
2533 sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
2535 else
2536 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
2538 return buff;
2542 static const char *
2543 get_mips_section_type_name (unsigned int sh_type)
2545 switch (sh_type)
2547 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
2548 case SHT_MIPS_MSYM: return "MIPS_MSYM";
2549 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
2550 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
2551 case SHT_MIPS_UCODE: return "MIPS_UCODE";
2552 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
2553 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
2554 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
2555 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
2556 case SHT_MIPS_RELD: return "MIPS_RELD";
2557 case SHT_MIPS_IFACE: return "MIPS_IFACE";
2558 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
2559 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
2560 case SHT_MIPS_SHDR: return "MIPS_SHDR";
2561 case SHT_MIPS_FDESC: return "MIPS_FDESC";
2562 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
2563 case SHT_MIPS_DENSE: return "MIPS_DENSE";
2564 case SHT_MIPS_PDESC: return "MIPS_PDESC";
2565 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
2566 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
2567 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
2568 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
2569 case SHT_MIPS_LINE: return "MIPS_LINE";
2570 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
2571 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
2572 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
2573 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
2574 case SHT_MIPS_DWARF: return "MIPS_DWARF";
2575 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
2576 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
2577 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
2578 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
2579 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
2580 case SHT_MIPS_XLATE: return "MIPS_XLATE";
2581 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
2582 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
2583 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
2584 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
2585 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
2586 default:
2587 break;
2589 return NULL;
2592 static const char *
2593 get_parisc_section_type_name (unsigned int sh_type)
2595 switch (sh_type)
2597 case SHT_PARISC_EXT: return "PARISC_EXT";
2598 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
2599 case SHT_PARISC_DOC: return "PARISC_DOC";
2600 case SHT_PARISC_ANNOT: return "PARISC_ANNOT";
2601 case SHT_PARISC_SYMEXTN: return "PARISC_SYMEXTN";
2602 case SHT_PARISC_STUBS: return "PARISC_STUBS";
2603 case SHT_PARISC_DLKM: return "PARISC_DLKM";
2604 default:
2605 break;
2607 return NULL;
2610 static const char *
2611 get_ia64_section_type_name (unsigned int sh_type)
2613 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
2614 if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
2615 return get_osabi_name ((sh_type & 0x00FF0000) >> 16);
2617 switch (sh_type)
2619 case SHT_IA_64_EXT: return "IA_64_EXT";
2620 case SHT_IA_64_UNWIND: return "IA_64_UNWIND";
2621 case SHT_IA_64_PRIORITY_INIT: return "IA_64_PRIORITY_INIT";
2622 case SHT_IA_64_VMS_TRACE: return "VMS_TRACE";
2623 case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
2624 case SHT_IA_64_VMS_DEBUG: return "VMS_DEBUG";
2625 case SHT_IA_64_VMS_DEBUG_STR: return "VMS_DEBUG_STR";
2626 case SHT_IA_64_VMS_LINKAGES: return "VMS_LINKAGES";
2627 case SHT_IA_64_VMS_SYMBOL_VECTOR: return "VMS_SYMBOL_VECTOR";
2628 case SHT_IA_64_VMS_FIXUP: return "VMS_FIXUP";
2629 default:
2630 break;
2632 return NULL;
2635 static const char *
2636 get_x86_64_section_type_name (unsigned int sh_type)
2638 switch (sh_type)
2640 case SHT_X86_64_UNWIND: return "X86_64_UNWIND";
2641 default:
2642 break;
2644 return NULL;
2647 static const char *
2648 get_arm_section_type_name (unsigned int sh_type)
2650 switch (sh_type)
2652 case SHT_ARM_EXIDX:
2653 return "ARM_EXIDX";
2654 case SHT_ARM_PREEMPTMAP:
2655 return "ARM_PREEMPTMAP";
2656 case SHT_ARM_ATTRIBUTES:
2657 return "ARM_ATTRIBUTES";
2658 default:
2659 break;
2661 return NULL;
2664 static const char *
2665 get_section_type_name (unsigned int sh_type)
2667 static char buff[32];
2669 switch (sh_type)
2671 case SHT_NULL: return "NULL";
2672 case SHT_PROGBITS: return "PROGBITS";
2673 case SHT_SYMTAB: return "SYMTAB";
2674 case SHT_STRTAB: return "STRTAB";
2675 case SHT_RELA: return "RELA";
2676 case SHT_HASH: return "HASH";
2677 case SHT_DYNAMIC: return "DYNAMIC";
2678 case SHT_NOTE: return "NOTE";
2679 case SHT_NOBITS: return "NOBITS";
2680 case SHT_REL: return "REL";
2681 case SHT_SHLIB: return "SHLIB";
2682 case SHT_DYNSYM: return "DYNSYM";
2683 case SHT_INIT_ARRAY: return "INIT_ARRAY";
2684 case SHT_FINI_ARRAY: return "FINI_ARRAY";
2685 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
2686 case SHT_GNU_HASH: return "GNU_HASH";
2687 case SHT_GROUP: return "GROUP";
2688 case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICIES";
2689 case SHT_GNU_verdef: return "VERDEF";
2690 case SHT_GNU_verneed: return "VERNEED";
2691 case SHT_GNU_versym: return "VERSYM";
2692 case 0x6ffffff0: return "VERSYM";
2693 case 0x6ffffffc: return "VERDEF";
2694 case 0x7ffffffd: return "AUXILIARY";
2695 case 0x7fffffff: return "FILTER";
2696 case SHT_GNU_LIBLIST: return "GNU_LIBLIST";
2698 default:
2699 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
2701 const char *result;
2703 switch (elf_header.e_machine)
2705 case EM_MIPS:
2706 case EM_MIPS_RS3_LE:
2707 result = get_mips_section_type_name (sh_type);
2708 break;
2709 case EM_PARISC:
2710 result = get_parisc_section_type_name (sh_type);
2711 break;
2712 case EM_IA_64:
2713 result = get_ia64_section_type_name (sh_type);
2714 break;
2715 case EM_X86_64:
2716 result = get_x86_64_section_type_name (sh_type);
2717 break;
2718 case EM_ARM:
2719 result = get_arm_section_type_name (sh_type);
2720 break;
2721 default:
2722 result = NULL;
2723 break;
2726 if (result != NULL)
2727 return result;
2729 sprintf (buff, "LOPROC+%x", sh_type - SHT_LOPROC);
2731 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
2733 const char *result;
2735 switch (elf_header.e_machine)
2737 case EM_IA_64:
2738 result = get_ia64_section_type_name (sh_type);
2739 break;
2740 default:
2741 result = NULL;
2742 break;
2745 if (result != NULL)
2746 return result;
2748 sprintf (buff, "LOOS+%x", sh_type - SHT_LOOS);
2750 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
2751 sprintf (buff, "LOUSER+%x", sh_type - SHT_LOUSER);
2752 else
2753 snprintf (buff, sizeof (buff), _("<unknown>: %x"), sh_type);
2755 return buff;
2759 #define OPTION_DEBUG_DUMP 512
2761 static struct option options[] =
2763 {"all", no_argument, 0, 'a'},
2764 {"file-header", no_argument, 0, 'h'},
2765 {"program-headers", no_argument, 0, 'l'},
2766 {"headers", no_argument, 0, 'e'},
2767 {"histogram", no_argument, 0, 'I'},
2768 {"segments", no_argument, 0, 'l'},
2769 {"sections", no_argument, 0, 'S'},
2770 {"section-headers", no_argument, 0, 'S'},
2771 {"section-groups", no_argument, 0, 'g'},
2772 {"section-details", no_argument, 0, 't'},
2773 {"full-section-name",no_argument, 0, 'N'},
2774 {"symbols", no_argument, 0, 's'},
2775 {"syms", no_argument, 0, 's'},
2776 {"relocs", no_argument, 0, 'r'},
2777 {"notes", no_argument, 0, 'n'},
2778 {"dynamic", no_argument, 0, 'd'},
2779 {"arch-specific", no_argument, 0, 'A'},
2780 {"version-info", no_argument, 0, 'V'},
2781 {"use-dynamic", no_argument, 0, 'D'},
2782 {"unwind", no_argument, 0, 'u'},
2783 {"archive-index", no_argument, 0, 'c'},
2784 {"hex-dump", required_argument, 0, 'x'},
2785 {"debug-dump", optional_argument, 0, OPTION_DEBUG_DUMP},
2786 {"string-dump", required_argument, 0, 'p'},
2787 #ifdef SUPPORT_DISASSEMBLY
2788 {"instruction-dump", required_argument, 0, 'i'},
2789 #endif
2791 {"version", no_argument, 0, 'v'},
2792 {"wide", no_argument, 0, 'W'},
2793 {"help", no_argument, 0, 'H'},
2794 {0, no_argument, 0, 0}
2797 static void
2798 usage (FILE *stream)
2800 fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
2801 fprintf (stream, _(" Display information about the contents of ELF format files\n"));
2802 fprintf (stream, _(" Options are:\n\
2803 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
2804 -h --file-header Display the ELF file header\n\
2805 -l --program-headers Display the program headers\n\
2806 --segments An alias for --program-headers\n\
2807 -S --section-headers Display the sections' header\n\
2808 --sections An alias for --section-headers\n\
2809 -g --section-groups Display the section groups\n\
2810 -t --section-details Display the section details\n\
2811 -e --headers Equivalent to: -h -l -S\n\
2812 -s --syms Display the symbol table\n\
2813 --symbols An alias for --syms\n\
2814 -n --notes Display the core notes (if present)\n\
2815 -r --relocs Display the relocations (if present)\n\
2816 -u --unwind Display the unwind info (if present)\n\
2817 -d --dynamic Display the dynamic section (if present)\n\
2818 -V --version-info Display the version sections (if present)\n\
2819 -A --arch-specific Display architecture specific information (if any).\n\
2820 -c --archive-index Display the symbol/file index in an archive\n\
2821 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
2822 -x --hex-dump=<number|name>\n\
2823 Dump the contents of section <number|name> as bytes\n\
2824 -p --string-dump=<number|name>\n\
2825 Dump the contents of section <number|name> as strings\n\
2826 -w[lLiaprmfFsoR] or\n\
2827 --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=str,=loc,=Ranges]\n\
2828 Display the contents of DWARF2 debug sections\n"));
2829 #ifdef SUPPORT_DISASSEMBLY
2830 fprintf (stream, _("\
2831 -i --instruction-dump=<number|name>\n\
2832 Disassemble the contents of section <number|name>\n"));
2833 #endif
2834 fprintf (stream, _("\
2835 -I --histogram Display histogram of bucket list lengths\n\
2836 -W --wide Allow output width to exceed 80 characters\n\
2837 @<file> Read options from <file>\n\
2838 -H --help Display this information\n\
2839 -v --version Display the version number of readelf\n"));
2841 if (REPORT_BUGS_TO[0] && stream == stdout)
2842 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
2844 exit (stream == stdout ? 0 : 1);
2847 /* Record the fact that the user wants the contents of section number
2848 SECTION to be displayed using the method(s) encoded as flags bits
2849 in TYPE. Note, TYPE can be zero if we are creating the array for
2850 the first time. */
2852 static void
2853 request_dump_bynumber (unsigned int section, dump_type type)
2855 if (section >= num_dump_sects)
2857 dump_type *new_dump_sects;
2859 new_dump_sects = calloc (section + 1, sizeof (* dump_sects));
2861 if (new_dump_sects == NULL)
2862 error (_("Out of memory allocating dump request table.\n"));
2863 else
2865 /* Copy current flag settings. */
2866 memcpy (new_dump_sects, dump_sects, num_dump_sects * sizeof (* dump_sects));
2868 free (dump_sects);
2870 dump_sects = new_dump_sects;
2871 num_dump_sects = section + 1;
2875 if (dump_sects)
2876 dump_sects[section] |= type;
2878 return;
2881 /* Request a dump by section name. */
2883 static void
2884 request_dump_byname (const char *section, dump_type type)
2886 struct dump_list_entry *new_request;
2888 new_request = malloc (sizeof (struct dump_list_entry));
2889 if (!new_request)
2890 error (_("Out of memory allocating dump request table.\n"));
2892 new_request->name = strdup (section);
2893 if (!new_request->name)
2894 error (_("Out of memory allocating dump request table.\n"));
2896 new_request->type = type;
2898 new_request->next = dump_sects_byname;
2899 dump_sects_byname = new_request;
2902 static void
2903 parse_args (int argc, char **argv)
2905 int c;
2907 if (argc < 2)
2908 usage (stderr);
2910 while ((c = getopt_long
2911 (argc, argv, "ADHINSVWacdeghi:lnp:rstuvw::x:", options, NULL)) != EOF)
2913 char *cp;
2914 int section;
2916 switch (c)
2918 case 0:
2919 /* Long options. */
2920 break;
2921 case 'H':
2922 usage (stdout);
2923 break;
2925 case 'a':
2926 do_syms++;
2927 do_reloc++;
2928 do_unwind++;
2929 do_dynamic++;
2930 do_header++;
2931 do_sections++;
2932 do_section_groups++;
2933 do_segments++;
2934 do_version++;
2935 do_histogram++;
2936 do_arch++;
2937 do_notes++;
2938 break;
2939 case 'g':
2940 do_section_groups++;
2941 break;
2942 case 't':
2943 case 'N':
2944 do_sections++;
2945 do_section_details++;
2946 break;
2947 case 'e':
2948 do_header++;
2949 do_sections++;
2950 do_segments++;
2951 break;
2952 case 'A':
2953 do_arch++;
2954 break;
2955 case 'D':
2956 do_using_dynamic++;
2957 break;
2958 case 'r':
2959 do_reloc++;
2960 break;
2961 case 'u':
2962 do_unwind++;
2963 break;
2964 case 'h':
2965 do_header++;
2966 break;
2967 case 'l':
2968 do_segments++;
2969 break;
2970 case 's':
2971 do_syms++;
2972 break;
2973 case 'S':
2974 do_sections++;
2975 break;
2976 case 'd':
2977 do_dynamic++;
2978 break;
2979 case 'I':
2980 do_histogram++;
2981 break;
2982 case 'n':
2983 do_notes++;
2984 break;
2985 case 'c':
2986 do_archive_index++;
2987 break;
2988 case 'x':
2989 do_dump++;
2990 section = strtoul (optarg, & cp, 0);
2991 if (! *cp && section >= 0)
2992 request_dump_bynumber (section, HEX_DUMP);
2993 else
2994 request_dump_byname (optarg, HEX_DUMP);
2995 break;
2996 case 'p':
2997 do_dump++;
2998 section = strtoul (optarg, & cp, 0);
2999 if (! *cp && section >= 0)
3000 request_dump_bynumber (section, STRING_DUMP);
3001 else
3002 request_dump_byname (optarg, STRING_DUMP);
3003 break;
3004 case 'w':
3005 do_dump++;
3006 if (optarg == 0)
3007 do_debugging = 1;
3008 else
3010 unsigned int index = 0;
3012 do_debugging = 0;
3014 while (optarg[index])
3015 switch (optarg[index++])
3017 case 'i':
3018 do_debug_info = 1;
3019 break;
3021 case 'a':
3022 do_debug_abbrevs = 1;
3023 break;
3025 case 'l':
3026 do_debug_lines = 1;
3027 break;
3029 case 'L':
3030 do_debug_lines_decoded = 1;
3031 break;
3033 case 'p':
3034 do_debug_pubnames = 1;
3035 break;
3037 case 'r':
3038 do_debug_aranges = 1;
3039 break;
3041 case 'R':
3042 do_debug_ranges = 1;
3043 break;
3045 case 'F':
3046 do_debug_frames_interp = 1;
3047 case 'f':
3048 do_debug_frames = 1;
3049 break;
3051 case 'm':
3052 do_debug_macinfo = 1;
3053 break;
3055 case 's':
3056 do_debug_str = 1;
3057 break;
3059 case 'o':
3060 do_debug_loc = 1;
3061 break;
3063 default:
3064 warn (_("Unrecognized debug option '%s'\n"), optarg);
3065 break;
3068 break;
3069 case OPTION_DEBUG_DUMP:
3070 do_dump++;
3071 if (optarg == 0)
3072 do_debugging = 1;
3073 else
3075 typedef struct
3077 const char * option;
3078 int * variable;
3080 debug_dump_long_opts;
3082 debug_dump_long_opts opts_table [] =
3084 /* Please keep this table alpha- sorted. */
3085 { "Ranges", & do_debug_ranges },
3086 { "abbrev", & do_debug_abbrevs },
3087 { "aranges", & do_debug_aranges },
3088 { "frames", & do_debug_frames },
3089 { "frames-interp", & do_debug_frames_interp },
3090 { "info", & do_debug_info },
3091 { "line", & do_debug_lines }, /* For backwards compatibility. */
3092 { "rawline", & do_debug_lines },
3093 { "decodedline", & do_debug_lines_decoded },
3094 { "loc", & do_debug_loc },
3095 { "macro", & do_debug_macinfo },
3096 { "pubnames", & do_debug_pubnames },
3097 /* This entry is for compatability
3098 with earlier versions of readelf. */
3099 { "ranges", & do_debug_aranges },
3100 { "str", & do_debug_str },
3101 { NULL, NULL }
3104 const char *p;
3106 do_debugging = 0;
3108 p = optarg;
3109 while (*p)
3111 debug_dump_long_opts * entry;
3113 for (entry = opts_table; entry->option; entry++)
3115 size_t len = strlen (entry->option);
3117 if (strneq (p, entry->option, len)
3118 && (p[len] == ',' || p[len] == '\0'))
3120 * entry->variable = 1;
3122 /* The --debug-dump=frames-interp option also
3123 enables the --debug-dump=frames option. */
3124 if (do_debug_frames_interp)
3125 do_debug_frames = 1;
3127 p += len;
3128 break;
3132 if (entry->option == NULL)
3134 warn (_("Unrecognized debug option '%s'\n"), p);
3135 p = strchr (p, ',');
3136 if (p == NULL)
3137 break;
3140 if (*p == ',')
3141 p++;
3144 break;
3145 #ifdef SUPPORT_DISASSEMBLY
3146 case 'i':
3147 do_dump++;
3148 section = strtoul (optarg, & cp, 0);
3149 if (! *cp && section >= 0)
3150 request_dump_bynumber (section, DISASS_DUMP);
3151 else
3152 request_dump_byname (optarg, DISASS_DUMP);
3153 #endif
3154 case 'v':
3155 print_version (program_name);
3156 break;
3157 case 'V':
3158 do_version++;
3159 break;
3160 case 'W':
3161 do_wide++;
3162 break;
3163 default:
3164 /* xgettext:c-format */
3165 error (_("Invalid option '-%c'\n"), c);
3166 /* Drop through. */
3167 case '?':
3168 usage (stderr);
3172 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
3173 && !do_segments && !do_header && !do_dump && !do_version
3174 && !do_histogram && !do_debugging && !do_arch && !do_notes
3175 && !do_section_groups && !do_archive_index)
3176 usage (stderr);
3177 else if (argc < 3)
3179 warn (_("Nothing to do.\n"));
3180 usage (stderr);
3184 static const char *
3185 get_elf_class (unsigned int elf_class)
3187 static char buff[32];
3189 switch (elf_class)
3191 case ELFCLASSNONE: return _("none");
3192 case ELFCLASS32: return "ELF32";
3193 case ELFCLASS64: return "ELF64";
3194 default:
3195 snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
3196 return buff;
3200 static const char *
3201 get_data_encoding (unsigned int encoding)
3203 static char buff[32];
3205 switch (encoding)
3207 case ELFDATANONE: return _("none");
3208 case ELFDATA2LSB: return _("2's complement, little endian");
3209 case ELFDATA2MSB: return _("2's complement, big endian");
3210 default:
3211 snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
3212 return buff;
3216 /* Decode the data held in 'elf_header'. */
3218 static int
3219 process_file_header (void)
3221 if ( elf_header.e_ident[EI_MAG0] != ELFMAG0
3222 || elf_header.e_ident[EI_MAG1] != ELFMAG1
3223 || elf_header.e_ident[EI_MAG2] != ELFMAG2
3224 || elf_header.e_ident[EI_MAG3] != ELFMAG3)
3226 error
3227 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
3228 return 0;
3231 init_dwarf_regnames (elf_header.e_machine);
3233 if (do_header)
3235 int i;
3237 printf (_("ELF Header:\n"));
3238 printf (_(" Magic: "));
3239 for (i = 0; i < EI_NIDENT; i++)
3240 printf ("%2.2x ", elf_header.e_ident[i]);
3241 printf ("\n");
3242 printf (_(" Class: %s\n"),
3243 get_elf_class (elf_header.e_ident[EI_CLASS]));
3244 printf (_(" Data: %s\n"),
3245 get_data_encoding (elf_header.e_ident[EI_DATA]));
3246 printf (_(" Version: %d %s\n"),
3247 elf_header.e_ident[EI_VERSION],
3248 (elf_header.e_ident[EI_VERSION] == EV_CURRENT
3249 ? "(current)"
3250 : (elf_header.e_ident[EI_VERSION] != EV_NONE
3251 ? "<unknown: %lx>"
3252 : "")));
3253 printf (_(" OS/ABI: %s\n"),
3254 get_osabi_name (elf_header.e_ident[EI_OSABI]));
3255 printf (_(" ABI Version: %d\n"),
3256 elf_header.e_ident[EI_ABIVERSION]);
3257 printf (_(" Type: %s\n"),
3258 get_file_type (elf_header.e_type));
3259 printf (_(" Machine: %s\n"),
3260 get_machine_name (elf_header.e_machine));
3261 printf (_(" Version: 0x%lx\n"),
3262 (unsigned long) elf_header.e_version);
3264 printf (_(" Entry point address: "));
3265 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
3266 printf (_("\n Start of program headers: "));
3267 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
3268 printf (_(" (bytes into file)\n Start of section headers: "));
3269 print_vma ((bfd_vma) elf_header.e_shoff, DEC);
3270 printf (_(" (bytes into file)\n"));
3272 printf (_(" Flags: 0x%lx%s\n"),
3273 (unsigned long) elf_header.e_flags,
3274 get_machine_flags (elf_header.e_flags, elf_header.e_machine));
3275 printf (_(" Size of this header: %ld (bytes)\n"),
3276 (long) elf_header.e_ehsize);
3277 printf (_(" Size of program headers: %ld (bytes)\n"),
3278 (long) elf_header.e_phentsize);
3279 printf (_(" Number of program headers: %ld\n"),
3280 (long) elf_header.e_phnum);
3281 printf (_(" Size of section headers: %ld (bytes)\n"),
3282 (long) elf_header.e_shentsize);
3283 printf (_(" Number of section headers: %ld"),
3284 (long) elf_header.e_shnum);
3285 if (section_headers != NULL && elf_header.e_shnum == SHN_UNDEF)
3286 printf (" (%ld)", (long) section_headers[0].sh_size);
3287 putc ('\n', stdout);
3288 printf (_(" Section header string table index: %ld"),
3289 (long) elf_header.e_shstrndx);
3290 if (section_headers != NULL
3291 && elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
3292 printf (" (%u)", section_headers[0].sh_link);
3293 else if (elf_header.e_shstrndx >= elf_header.e_shnum)
3294 printf (" <corrupt: out of range>");
3295 putc ('\n', stdout);
3298 if (section_headers != NULL)
3300 if (elf_header.e_shnum == SHN_UNDEF)
3301 elf_header.e_shnum = section_headers[0].sh_size;
3302 if (elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
3303 elf_header.e_shstrndx = section_headers[0].sh_link;
3304 else if (elf_header.e_shstrndx >= elf_header.e_shnum)
3305 elf_header.e_shstrndx = SHN_UNDEF;
3306 free (section_headers);
3307 section_headers = NULL;
3310 return 1;
3314 static int
3315 get_32bit_program_headers (FILE *file, Elf_Internal_Phdr *program_headers)
3317 Elf32_External_Phdr *phdrs;
3318 Elf32_External_Phdr *external;
3319 Elf_Internal_Phdr *internal;
3320 unsigned int i;
3322 phdrs = get_data (NULL, file, elf_header.e_phoff,
3323 elf_header.e_phentsize, elf_header.e_phnum,
3324 _("program headers"));
3325 if (!phdrs)
3326 return 0;
3328 for (i = 0, internal = program_headers, external = phdrs;
3329 i < elf_header.e_phnum;
3330 i++, internal++, external++)
3332 internal->p_type = BYTE_GET (external->p_type);
3333 internal->p_offset = BYTE_GET (external->p_offset);
3334 internal->p_vaddr = BYTE_GET (external->p_vaddr);
3335 internal->p_paddr = BYTE_GET (external->p_paddr);
3336 internal->p_filesz = BYTE_GET (external->p_filesz);
3337 internal->p_memsz = BYTE_GET (external->p_memsz);
3338 internal->p_flags = BYTE_GET (external->p_flags);
3339 internal->p_align = BYTE_GET (external->p_align);
3342 free (phdrs);
3344 return 1;
3347 static int
3348 get_64bit_program_headers (FILE *file, Elf_Internal_Phdr *program_headers)
3350 Elf64_External_Phdr *phdrs;
3351 Elf64_External_Phdr *external;
3352 Elf_Internal_Phdr *internal;
3353 unsigned int i;
3355 phdrs = get_data (NULL, file, elf_header.e_phoff,
3356 elf_header.e_phentsize, elf_header.e_phnum,
3357 _("program headers"));
3358 if (!phdrs)
3359 return 0;
3361 for (i = 0, internal = program_headers, external = phdrs;
3362 i < elf_header.e_phnum;
3363 i++, internal++, external++)
3365 internal->p_type = BYTE_GET (external->p_type);
3366 internal->p_flags = BYTE_GET (external->p_flags);
3367 internal->p_offset = BYTE_GET (external->p_offset);
3368 internal->p_vaddr = BYTE_GET (external->p_vaddr);
3369 internal->p_paddr = BYTE_GET (external->p_paddr);
3370 internal->p_filesz = BYTE_GET (external->p_filesz);
3371 internal->p_memsz = BYTE_GET (external->p_memsz);
3372 internal->p_align = BYTE_GET (external->p_align);
3375 free (phdrs);
3377 return 1;
3380 /* Returns 1 if the program headers were read into `program_headers'. */
3382 static int
3383 get_program_headers (FILE *file)
3385 Elf_Internal_Phdr *phdrs;
3387 /* Check cache of prior read. */
3388 if (program_headers != NULL)
3389 return 1;
3391 phdrs = cmalloc (elf_header.e_phnum, sizeof (Elf_Internal_Phdr));
3393 if (phdrs == NULL)
3395 error (_("Out of memory\n"));
3396 return 0;
3399 if (is_32bit_elf
3400 ? get_32bit_program_headers (file, phdrs)
3401 : get_64bit_program_headers (file, phdrs))
3403 program_headers = phdrs;
3404 return 1;
3407 free (phdrs);
3408 return 0;
3411 /* Returns 1 if the program headers were loaded. */
3413 static int
3414 process_program_headers (FILE *file)
3416 Elf_Internal_Phdr *segment;
3417 unsigned int i;
3419 if (elf_header.e_phnum == 0)
3421 if (do_segments)
3422 printf (_("\nThere are no program headers in this file.\n"));
3423 return 0;
3426 if (do_segments && !do_header)
3428 printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
3429 printf (_("Entry point "));
3430 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
3431 printf (_("\nThere are %d program headers, starting at offset "),
3432 elf_header.e_phnum);
3433 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
3434 printf ("\n");
3437 if (! get_program_headers (file))
3438 return 0;
3440 if (do_segments)
3442 if (elf_header.e_phnum > 1)
3443 printf (_("\nProgram Headers:\n"));
3444 else
3445 printf (_("\nProgram Headers:\n"));
3447 if (is_32bit_elf)
3448 printf
3449 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3450 else if (do_wide)
3451 printf
3452 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3453 else
3455 printf
3456 (_(" Type Offset VirtAddr PhysAddr\n"));
3457 printf
3458 (_(" FileSiz MemSiz Flags Align\n"));
3462 dynamic_addr = 0;
3463 dynamic_size = 0;
3465 for (i = 0, segment = program_headers;
3466 i < elf_header.e_phnum;
3467 i++, segment++)
3469 if (do_segments)
3471 printf (" %-14.14s ", get_segment_type (segment->p_type));
3473 if (is_32bit_elf)
3475 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
3476 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
3477 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
3478 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
3479 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
3480 printf ("%c%c%c ",
3481 (segment->p_flags & PF_R ? 'R' : ' '),
3482 (segment->p_flags & PF_W ? 'W' : ' '),
3483 (segment->p_flags & PF_X ? 'E' : ' '));
3484 printf ("%#lx", (unsigned long) segment->p_align);
3486 else if (do_wide)
3488 if ((unsigned long) segment->p_offset == segment->p_offset)
3489 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
3490 else
3492 print_vma (segment->p_offset, FULL_HEX);
3493 putchar (' ');
3496 print_vma (segment->p_vaddr, FULL_HEX);
3497 putchar (' ');
3498 print_vma (segment->p_paddr, FULL_HEX);
3499 putchar (' ');
3501 if ((unsigned long) segment->p_filesz == segment->p_filesz)
3502 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
3503 else
3505 print_vma (segment->p_filesz, FULL_HEX);
3506 putchar (' ');
3509 if ((unsigned long) segment->p_memsz == segment->p_memsz)
3510 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
3511 else
3513 print_vma (segment->p_offset, FULL_HEX);
3516 printf (" %c%c%c ",
3517 (segment->p_flags & PF_R ? 'R' : ' '),
3518 (segment->p_flags & PF_W ? 'W' : ' '),
3519 (segment->p_flags & PF_X ? 'E' : ' '));
3521 if ((unsigned long) segment->p_align == segment->p_align)
3522 printf ("%#lx", (unsigned long) segment->p_align);
3523 else
3525 print_vma (segment->p_align, PREFIX_HEX);
3528 else
3530 print_vma (segment->p_offset, FULL_HEX);
3531 putchar (' ');
3532 print_vma (segment->p_vaddr, FULL_HEX);
3533 putchar (' ');
3534 print_vma (segment->p_paddr, FULL_HEX);
3535 printf ("\n ");
3536 print_vma (segment->p_filesz, FULL_HEX);
3537 putchar (' ');
3538 print_vma (segment->p_memsz, FULL_HEX);
3539 printf (" %c%c%c ",
3540 (segment->p_flags & PF_R ? 'R' : ' '),
3541 (segment->p_flags & PF_W ? 'W' : ' '),
3542 (segment->p_flags & PF_X ? 'E' : ' '));
3543 print_vma (segment->p_align, HEX);
3547 switch (segment->p_type)
3549 case PT_DYNAMIC:
3550 if (dynamic_addr)
3551 error (_("more than one dynamic segment\n"));
3553 /* By default, assume that the .dynamic section is the first
3554 section in the DYNAMIC segment. */
3555 dynamic_addr = segment->p_offset;
3556 dynamic_size = segment->p_filesz;
3558 /* Try to locate the .dynamic section. If there is
3559 a section header table, we can easily locate it. */
3560 if (section_headers != NULL)
3562 Elf_Internal_Shdr *sec;
3564 sec = find_section (".dynamic");
3565 if (sec == NULL || sec->sh_size == 0)
3567 error (_("no .dynamic section in the dynamic segment\n"));
3568 break;
3571 if (sec->sh_type == SHT_NOBITS)
3573 dynamic_size = 0;
3574 break;
3577 dynamic_addr = sec->sh_offset;
3578 dynamic_size = sec->sh_size;
3580 if (dynamic_addr < segment->p_offset
3581 || dynamic_addr > segment->p_offset + segment->p_filesz)
3582 warn (_("the .dynamic section is not contained"
3583 " within the dynamic segment\n"));
3584 else if (dynamic_addr > segment->p_offset)
3585 warn (_("the .dynamic section is not the first section"
3586 " in the dynamic segment.\n"));
3588 break;
3590 case PT_INTERP:
3591 if (fseek (file, archive_file_offset + (long) segment->p_offset,
3592 SEEK_SET))
3593 error (_("Unable to find program interpreter name\n"));
3594 else
3596 char fmt [32];
3597 int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX);
3599 if (ret >= (int) sizeof (fmt) || ret < 0)
3600 error (_("Internal error: failed to create format string to display program interpreter\n"));
3602 program_interpreter[0] = 0;
3603 if (fscanf (file, fmt, program_interpreter) <= 0)
3604 error (_("Unable to read program interpreter name\n"));
3606 if (do_segments)
3607 printf (_("\n [Requesting program interpreter: %s]"),
3608 program_interpreter);
3610 break;
3613 if (do_segments)
3614 putc ('\n', stdout);
3617 if (do_segments && section_headers != NULL && string_table != NULL)
3619 printf (_("\n Section to Segment mapping:\n"));
3620 printf (_(" Segment Sections...\n"));
3622 for (i = 0; i < elf_header.e_phnum; i++)
3624 unsigned int j;
3625 Elf_Internal_Shdr *section;
3627 segment = program_headers + i;
3628 section = section_headers + 1;
3630 printf (" %2.2d ", i);
3632 for (j = 1; j < elf_header.e_shnum; j++, section++)
3634 if (ELF_IS_SECTION_IN_SEGMENT_MEMORY(section, segment))
3635 printf ("%s ", SECTION_NAME (section));
3638 putc ('\n',stdout);
3642 return 1;
3646 /* Find the file offset corresponding to VMA by using the program headers. */
3648 static long
3649 offset_from_vma (FILE *file, bfd_vma vma, bfd_size_type size)
3651 Elf_Internal_Phdr *seg;
3653 if (! get_program_headers (file))
3655 warn (_("Cannot interpret virtual addresses without program headers.\n"));
3656 return (long) vma;
3659 for (seg = program_headers;
3660 seg < program_headers + elf_header.e_phnum;
3661 ++seg)
3663 if (seg->p_type != PT_LOAD)
3664 continue;
3666 if (vma >= (seg->p_vaddr & -seg->p_align)
3667 && vma + size <= seg->p_vaddr + seg->p_filesz)
3668 return vma - seg->p_vaddr + seg->p_offset;
3671 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
3672 (long) vma);
3673 return (long) vma;
3677 static int
3678 get_32bit_section_headers (FILE *file, unsigned int num)
3680 Elf32_External_Shdr *shdrs;
3681 Elf_Internal_Shdr *internal;
3682 unsigned int i;
3684 shdrs = get_data (NULL, file, elf_header.e_shoff,
3685 elf_header.e_shentsize, num, _("section headers"));
3686 if (!shdrs)
3687 return 0;
3689 section_headers = cmalloc (num, sizeof (Elf_Internal_Shdr));
3691 if (section_headers == NULL)
3693 error (_("Out of memory\n"));
3694 return 0;
3697 for (i = 0, internal = section_headers;
3698 i < num;
3699 i++, internal++)
3701 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
3702 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
3703 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
3704 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
3705 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
3706 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
3707 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
3708 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
3709 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
3710 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
3713 free (shdrs);
3715 return 1;
3718 static int
3719 get_64bit_section_headers (FILE *file, unsigned int num)
3721 Elf64_External_Shdr *shdrs;
3722 Elf_Internal_Shdr *internal;
3723 unsigned int i;
3725 shdrs = get_data (NULL, file, elf_header.e_shoff,
3726 elf_header.e_shentsize, num, _("section headers"));
3727 if (!shdrs)
3728 return 0;
3730 section_headers = cmalloc (num, sizeof (Elf_Internal_Shdr));
3732 if (section_headers == NULL)
3734 error (_("Out of memory\n"));
3735 return 0;
3738 for (i = 0, internal = section_headers;
3739 i < num;
3740 i++, internal++)
3742 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
3743 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
3744 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
3745 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
3746 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
3747 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
3748 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
3749 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
3750 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
3751 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
3754 free (shdrs);
3756 return 1;
3759 static Elf_Internal_Sym *
3760 get_32bit_elf_symbols (FILE *file, Elf_Internal_Shdr *section)
3762 unsigned long number;
3763 Elf32_External_Sym *esyms;
3764 Elf_External_Sym_Shndx *shndx;
3765 Elf_Internal_Sym *isyms;
3766 Elf_Internal_Sym *psym;
3767 unsigned int j;
3769 esyms = get_data (NULL, file, section->sh_offset, 1, section->sh_size,
3770 _("symbols"));
3771 if (!esyms)
3772 return NULL;
3774 shndx = NULL;
3775 if (symtab_shndx_hdr != NULL
3776 && (symtab_shndx_hdr->sh_link
3777 == (unsigned long) (section - section_headers)))
3779 shndx = get_data (NULL, file, symtab_shndx_hdr->sh_offset,
3780 1, symtab_shndx_hdr->sh_size, _("symtab shndx"));
3781 if (!shndx)
3783 free (esyms);
3784 return NULL;
3788 number = section->sh_size / section->sh_entsize;
3789 isyms = cmalloc (number, sizeof (Elf_Internal_Sym));
3791 if (isyms == NULL)
3793 error (_("Out of memory\n"));
3794 if (shndx)
3795 free (shndx);
3796 free (esyms);
3797 return NULL;
3800 for (j = 0, psym = isyms;
3801 j < number;
3802 j++, psym++)
3804 psym->st_name = BYTE_GET (esyms[j].st_name);
3805 psym->st_value = BYTE_GET (esyms[j].st_value);
3806 psym->st_size = BYTE_GET (esyms[j].st_size);
3807 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
3808 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
3809 psym->st_shndx
3810 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
3811 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
3812 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
3813 psym->st_info = BYTE_GET (esyms[j].st_info);
3814 psym->st_other = BYTE_GET (esyms[j].st_other);
3817 if (shndx)
3818 free (shndx);
3819 free (esyms);
3821 return isyms;
3824 static Elf_Internal_Sym *
3825 get_64bit_elf_symbols (FILE *file, Elf_Internal_Shdr *section)
3827 unsigned long number;
3828 Elf64_External_Sym *esyms;
3829 Elf_External_Sym_Shndx *shndx;
3830 Elf_Internal_Sym *isyms;
3831 Elf_Internal_Sym *psym;
3832 unsigned int j;
3834 esyms = get_data (NULL, file, section->sh_offset, 1, section->sh_size,
3835 _("symbols"));
3836 if (!esyms)
3837 return NULL;
3839 shndx = NULL;
3840 if (symtab_shndx_hdr != NULL
3841 && (symtab_shndx_hdr->sh_link
3842 == (unsigned long) (section - section_headers)))
3844 shndx = get_data (NULL, file, symtab_shndx_hdr->sh_offset,
3845 1, symtab_shndx_hdr->sh_size, _("symtab shndx"));
3846 if (!shndx)
3848 free (esyms);
3849 return NULL;
3853 number = section->sh_size / section->sh_entsize;
3854 isyms = cmalloc (number, sizeof (Elf_Internal_Sym));
3856 if (isyms == NULL)
3858 error (_("Out of memory\n"));
3859 if (shndx)
3860 free (shndx);
3861 free (esyms);
3862 return NULL;
3865 for (j = 0, psym = isyms;
3866 j < number;
3867 j++, psym++)
3869 psym->st_name = BYTE_GET (esyms[j].st_name);
3870 psym->st_info = BYTE_GET (esyms[j].st_info);
3871 psym->st_other = BYTE_GET (esyms[j].st_other);
3872 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
3873 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
3874 psym->st_shndx
3875 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
3876 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
3877 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
3878 psym->st_value = BYTE_GET (esyms[j].st_value);
3879 psym->st_size = BYTE_GET (esyms[j].st_size);
3882 if (shndx)
3883 free (shndx);
3884 free (esyms);
3886 return isyms;
3889 static const char *
3890 get_elf_section_flags (bfd_vma sh_flags)
3892 static char buff[1024];
3893 char *p = buff;
3894 int field_size = is_32bit_elf ? 8 : 16;
3895 int index, size = sizeof (buff) - (field_size + 4 + 1);
3896 bfd_vma os_flags = 0;
3897 bfd_vma proc_flags = 0;
3898 bfd_vma unknown_flags = 0;
3899 static const struct
3901 const char *str;
3902 int len;
3904 flags [] =
3906 { "WRITE", 5 },
3907 { "ALLOC", 5 },
3908 { "EXEC", 4 },
3909 { "MERGE", 5 },
3910 { "STRINGS", 7 },
3911 { "INFO LINK", 9 },
3912 { "LINK ORDER", 10 },
3913 { "OS NONCONF", 10 },
3914 { "GROUP", 5 },
3915 { "TLS", 3 },
3916 /* IA-64 specific. */
3917 { "SHORT", 5 },
3918 { "NORECOV", 7 },
3919 /* IA-64 OpenVMS specific. */
3920 { "VMS_GLOBAL", 10 },
3921 { "VMS_OVERLAID", 12 },
3922 { "VMS_SHARED", 10 },
3923 { "VMS_VECTOR", 10 },
3924 { "VMS_ALLOC_64BIT", 15 },
3925 { "VMS_PROTECTED", 13}
3928 if (do_section_details)
3930 sprintf (buff, "[%*.*lx]: ",
3931 field_size, field_size, (unsigned long) sh_flags);
3932 p += field_size + 4;
3935 while (sh_flags)
3937 bfd_vma flag;
3939 flag = sh_flags & - sh_flags;
3940 sh_flags &= ~ flag;
3942 if (do_section_details)
3944 switch (flag)
3946 case SHF_WRITE: index = 0; break;
3947 case SHF_ALLOC: index = 1; break;
3948 case SHF_EXECINSTR: index = 2; break;
3949 case SHF_MERGE: index = 3; break;
3950 case SHF_STRINGS: index = 4; break;
3951 case SHF_INFO_LINK: index = 5; break;
3952 case SHF_LINK_ORDER: index = 6; break;
3953 case SHF_OS_NONCONFORMING: index = 7; break;
3954 case SHF_GROUP: index = 8; break;
3955 case SHF_TLS: index = 9; break;
3957 default:
3958 index = -1;
3959 if (elf_header.e_machine == EM_IA_64)
3961 if (flag == SHF_IA_64_SHORT)
3962 index = 10;
3963 else if (flag == SHF_IA_64_NORECOV)
3964 index = 11;
3965 #ifdef BFD64
3966 else if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
3967 switch (flag)
3969 case SHF_IA_64_VMS_GLOBAL: index = 12; break;
3970 case SHF_IA_64_VMS_OVERLAID: index = 13; break;
3971 case SHF_IA_64_VMS_SHARED: index = 14; break;
3972 case SHF_IA_64_VMS_VECTOR: index = 15; break;
3973 case SHF_IA_64_VMS_ALLOC_64BIT: index = 16; break;
3974 case SHF_IA_64_VMS_PROTECTED: index = 17; break;
3975 default: break;
3977 #endif
3979 break;
3982 if (index != -1)
3984 if (p != buff + field_size + 4)
3986 if (size < (10 + 2))
3987 abort ();
3988 size -= 2;
3989 *p++ = ',';
3990 *p++ = ' ';
3993 size -= flags [index].len;
3994 p = stpcpy (p, flags [index].str);
3996 else if (flag & SHF_MASKOS)
3997 os_flags |= flag;
3998 else if (flag & SHF_MASKPROC)
3999 proc_flags |= flag;
4000 else
4001 unknown_flags |= flag;
4003 else
4005 switch (flag)
4007 case SHF_WRITE: *p = 'W'; break;
4008 case SHF_ALLOC: *p = 'A'; break;
4009 case SHF_EXECINSTR: *p = 'X'; break;
4010 case SHF_MERGE: *p = 'M'; break;
4011 case SHF_STRINGS: *p = 'S'; break;
4012 case SHF_INFO_LINK: *p = 'I'; break;
4013 case SHF_LINK_ORDER: *p = 'L'; break;
4014 case SHF_OS_NONCONFORMING: *p = 'O'; break;
4015 case SHF_GROUP: *p = 'G'; break;
4016 case SHF_TLS: *p = 'T'; break;
4018 default:
4019 if (elf_header.e_machine == EM_X86_64
4020 && flag == SHF_X86_64_LARGE)
4021 *p = 'l';
4022 else if (flag & SHF_MASKOS)
4024 *p = 'o';
4025 sh_flags &= ~ SHF_MASKOS;
4027 else if (flag & SHF_MASKPROC)
4029 *p = 'p';
4030 sh_flags &= ~ SHF_MASKPROC;
4032 else
4033 *p = 'x';
4034 break;
4036 p++;
4040 if (do_section_details)
4042 if (os_flags)
4044 size -= 5 + field_size;
4045 if (p != buff + field_size + 4)
4047 if (size < (2 + 1))
4048 abort ();
4049 size -= 2;
4050 *p++ = ',';
4051 *p++ = ' ';
4053 sprintf (p, "OS (%*.*lx)", field_size, field_size,
4054 (unsigned long) os_flags);
4055 p += 5 + field_size;
4057 if (proc_flags)
4059 size -= 7 + field_size;
4060 if (p != buff + field_size + 4)
4062 if (size < (2 + 1))
4063 abort ();
4064 size -= 2;
4065 *p++ = ',';
4066 *p++ = ' ';
4068 sprintf (p, "PROC (%*.*lx)", field_size, field_size,
4069 (unsigned long) proc_flags);
4070 p += 7 + field_size;
4072 if (unknown_flags)
4074 size -= 10 + field_size;
4075 if (p != buff + field_size + 4)
4077 if (size < (2 + 1))
4078 abort ();
4079 size -= 2;
4080 *p++ = ',';
4081 *p++ = ' ';
4083 sprintf (p, "UNKNOWN (%*.*lx)", field_size, field_size,
4084 (unsigned long) unknown_flags);
4085 p += 10 + field_size;
4089 *p = '\0';
4090 return buff;
4093 static int
4094 process_section_headers (FILE *file)
4096 Elf_Internal_Shdr *section;
4097 unsigned int i;
4099 section_headers = NULL;
4101 if (elf_header.e_shnum == 0)
4103 if (do_sections)
4104 printf (_("\nThere are no sections in this file.\n"));
4106 return 1;
4109 if (do_sections && !do_header)
4110 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
4111 elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
4113 if (is_32bit_elf)
4115 if (! get_32bit_section_headers (file, elf_header.e_shnum))
4116 return 0;
4118 else if (! get_64bit_section_headers (file, elf_header.e_shnum))
4119 return 0;
4121 /* Read in the string table, so that we have names to display. */
4122 if (elf_header.e_shstrndx != SHN_UNDEF
4123 && elf_header.e_shstrndx < elf_header.e_shnum)
4125 section = section_headers + elf_header.e_shstrndx;
4127 if (section->sh_size != 0)
4129 string_table = get_data (NULL, file, section->sh_offset,
4130 1, section->sh_size, _("string table"));
4132 string_table_length = string_table != NULL ? section->sh_size : 0;
4136 /* Scan the sections for the dynamic symbol table
4137 and dynamic string table and debug sections. */
4138 dynamic_symbols = NULL;
4139 dynamic_strings = NULL;
4140 dynamic_syminfo = NULL;
4141 symtab_shndx_hdr = NULL;
4143 eh_addr_size = is_32bit_elf ? 4 : 8;
4144 switch (elf_header.e_machine)
4146 case EM_MIPS:
4147 case EM_MIPS_RS3_LE:
4148 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
4149 FDE addresses. However, the ABI also has a semi-official ILP32
4150 variant for which the normal FDE address size rules apply.
4152 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
4153 section, where XX is the size of longs in bits. Unfortunately,
4154 earlier compilers provided no way of distinguishing ILP32 objects
4155 from LP64 objects, so if there's any doubt, we should assume that
4156 the official LP64 form is being used. */
4157 if ((elf_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
4158 && find_section (".gcc_compiled_long32") == NULL)
4159 eh_addr_size = 8;
4160 break;
4162 case EM_H8_300:
4163 case EM_H8_300H:
4164 switch (elf_header.e_flags & EF_H8_MACH)
4166 case E_H8_MACH_H8300:
4167 case E_H8_MACH_H8300HN:
4168 case E_H8_MACH_H8300SN:
4169 case E_H8_MACH_H8300SXN:
4170 eh_addr_size = 2;
4171 break;
4172 case E_H8_MACH_H8300H:
4173 case E_H8_MACH_H8300S:
4174 case E_H8_MACH_H8300SX:
4175 eh_addr_size = 4;
4176 break;
4178 break;
4180 case EM_M32C_OLD:
4181 case EM_M32C:
4182 switch (elf_header.e_flags & EF_M32C_CPU_MASK)
4184 case EF_M32C_CPU_M16C:
4185 eh_addr_size = 2;
4186 break;
4188 break;
4191 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
4192 do \
4194 size_t expected_entsize \
4195 = is_32bit_elf ? size32 : size64; \
4196 if (section->sh_entsize != expected_entsize) \
4197 error (_("Section %d has invalid sh_entsize %lx (expected %lx)\n"), \
4198 i, (unsigned long int) section->sh_entsize, \
4199 (unsigned long int) expected_entsize); \
4200 section->sh_entsize = expected_entsize; \
4202 while (0)
4203 #define CHECK_ENTSIZE(section, i, type) \
4204 CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
4205 sizeof (Elf64_External_##type))
4207 for (i = 0, section = section_headers;
4208 i < elf_header.e_shnum;
4209 i++, section++)
4211 char *name = SECTION_NAME (section);
4213 if (section->sh_type == SHT_DYNSYM)
4215 if (dynamic_symbols != NULL)
4217 error (_("File contains multiple dynamic symbol tables\n"));
4218 continue;
4221 CHECK_ENTSIZE (section, i, Sym);
4222 num_dynamic_syms = section->sh_size / section->sh_entsize;
4223 dynamic_symbols = GET_ELF_SYMBOLS (file, section);
4225 else if (section->sh_type == SHT_STRTAB
4226 && streq (name, ".dynstr"))
4228 if (dynamic_strings != NULL)
4230 error (_("File contains multiple dynamic string tables\n"));
4231 continue;
4234 dynamic_strings = get_data (NULL, file, section->sh_offset,
4235 1, section->sh_size, _("dynamic strings"));
4236 dynamic_strings_length = section->sh_size;
4238 else if (section->sh_type == SHT_SYMTAB_SHNDX)
4240 if (symtab_shndx_hdr != NULL)
4242 error (_("File contains multiple symtab shndx tables\n"));
4243 continue;
4245 symtab_shndx_hdr = section;
4247 else if (section->sh_type == SHT_SYMTAB)
4248 CHECK_ENTSIZE (section, i, Sym);
4249 else if (section->sh_type == SHT_GROUP)
4250 CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
4251 else if (section->sh_type == SHT_REL)
4252 CHECK_ENTSIZE (section, i, Rel);
4253 else if (section->sh_type == SHT_RELA)
4254 CHECK_ENTSIZE (section, i, Rela);
4255 else if ((do_debugging || do_debug_info || do_debug_abbrevs
4256 || do_debug_lines || do_debug_lines_decoded || do_debug_pubnames
4257 || do_debug_aranges || do_debug_frames || do_debug_macinfo
4258 || do_debug_str || do_debug_loc || do_debug_ranges)
4259 && (const_strneq (name, ".debug_")
4260 || const_strneq (name, ".zdebug_")))
4262 if (name[1] == 'z')
4263 name += sizeof (".zdebug_") - 1;
4264 else
4265 name += sizeof (".debug_") - 1;
4267 if (do_debugging
4268 || (do_debug_info && streq (name, "info"))
4269 || (do_debug_abbrevs && streq (name, "abbrev"))
4270 || ((do_debug_lines || do_debug_lines_decoded)
4271 && streq (name, "line"))
4272 || (do_debug_pubnames && streq (name, "pubnames"))
4273 || (do_debug_aranges && streq (name, "aranges"))
4274 || (do_debug_ranges && streq (name, "ranges"))
4275 || (do_debug_frames && streq (name, "frame"))
4276 || (do_debug_macinfo && streq (name, "macinfo"))
4277 || (do_debug_str && streq (name, "str"))
4278 || (do_debug_loc && streq (name, "loc"))
4280 request_dump_bynumber (i, DEBUG_DUMP);
4282 /* Linkonce section to be combined with .debug_info at link time. */
4283 else if ((do_debugging || do_debug_info)
4284 && const_strneq (name, ".gnu.linkonce.wi."))
4285 request_dump_bynumber (i, DEBUG_DUMP);
4286 else if (do_debug_frames && streq (name, ".eh_frame"))
4287 request_dump_bynumber (i, DEBUG_DUMP);
4290 if (! do_sections)
4291 return 1;
4293 if (elf_header.e_shnum > 1)
4294 printf (_("\nSection Headers:\n"));
4295 else
4296 printf (_("\nSection Header:\n"));
4298 if (is_32bit_elf)
4300 if (do_section_details)
4302 printf (_(" [Nr] Name\n"));
4303 printf (_(" Type Addr Off Size ES Lk Inf Al\n"));
4305 else
4306 printf
4307 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
4309 else if (do_wide)
4311 if (do_section_details)
4313 printf (_(" [Nr] Name\n"));
4314 printf (_(" Type Address Off Size ES Lk Inf Al\n"));
4316 else
4317 printf
4318 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
4320 else
4322 if (do_section_details)
4324 printf (_(" [Nr] Name\n"));
4325 printf (_(" Type Address Offset Link\n"));
4326 printf (_(" Size EntSize Info Align\n"));
4328 else
4330 printf (_(" [Nr] Name Type Address Offset\n"));
4331 printf (_(" Size EntSize Flags Link Info Align\n"));
4335 if (do_section_details)
4336 printf (_(" Flags\n"));
4338 for (i = 0, section = section_headers;
4339 i < elf_header.e_shnum;
4340 i++, section++)
4342 if (do_section_details)
4344 printf (" [%2u] %s\n",
4346 SECTION_NAME (section));
4347 if (is_32bit_elf || do_wide)
4348 printf (" %-15.15s ",
4349 get_section_type_name (section->sh_type));
4351 else
4352 printf (" [%2u] %-17.17s %-15.15s ",
4354 SECTION_NAME (section),
4355 get_section_type_name (section->sh_type));
4357 if (is_32bit_elf)
4359 print_vma (section->sh_addr, LONG_HEX);
4361 printf ( " %6.6lx %6.6lx %2.2lx",
4362 (unsigned long) section->sh_offset,
4363 (unsigned long) section->sh_size,
4364 (unsigned long) section->sh_entsize);
4366 if (do_section_details)
4367 fputs (" ", stdout);
4368 else
4369 printf (" %3s ", get_elf_section_flags (section->sh_flags));
4371 printf ("%2u %3u %2lu\n",
4372 section->sh_link,
4373 section->sh_info,
4374 (unsigned long) section->sh_addralign);
4376 else if (do_wide)
4378 print_vma (section->sh_addr, LONG_HEX);
4380 if ((long) section->sh_offset == section->sh_offset)
4381 printf (" %6.6lx", (unsigned long) section->sh_offset);
4382 else
4384 putchar (' ');
4385 print_vma (section->sh_offset, LONG_HEX);
4388 if ((unsigned long) section->sh_size == section->sh_size)
4389 printf (" %6.6lx", (unsigned long) section->sh_size);
4390 else
4392 putchar (' ');
4393 print_vma (section->sh_size, LONG_HEX);
4396 if ((unsigned long) section->sh_entsize == section->sh_entsize)
4397 printf (" %2.2lx", (unsigned long) section->sh_entsize);
4398 else
4400 putchar (' ');
4401 print_vma (section->sh_entsize, LONG_HEX);
4404 if (do_section_details)
4405 fputs (" ", stdout);
4406 else
4407 printf (" %3s ", get_elf_section_flags (section->sh_flags));
4409 printf ("%2u %3u ", section->sh_link, section->sh_info);
4411 if ((unsigned long) section->sh_addralign == section->sh_addralign)
4412 printf ("%2lu\n", (unsigned long) section->sh_addralign);
4413 else
4415 print_vma (section->sh_addralign, DEC);
4416 putchar ('\n');
4419 else if (do_section_details)
4421 printf (" %-15.15s ",
4422 get_section_type_name (section->sh_type));
4423 print_vma (section->sh_addr, LONG_HEX);
4424 if ((long) section->sh_offset == section->sh_offset)
4425 printf (" %16.16lx", (unsigned long) section->sh_offset);
4426 else
4428 printf (" ");
4429 print_vma (section->sh_offset, LONG_HEX);
4431 printf (" %u\n ", section->sh_link);
4432 print_vma (section->sh_size, LONG_HEX);
4433 putchar (' ');
4434 print_vma (section->sh_entsize, LONG_HEX);
4436 printf (" %-16u %lu\n",
4437 section->sh_info,
4438 (unsigned long) section->sh_addralign);
4440 else
4442 putchar (' ');
4443 print_vma (section->sh_addr, LONG_HEX);
4444 if ((long) section->sh_offset == section->sh_offset)
4445 printf (" %8.8lx", (unsigned long) section->sh_offset);
4446 else
4448 printf (" ");
4449 print_vma (section->sh_offset, LONG_HEX);
4451 printf ("\n ");
4452 print_vma (section->sh_size, LONG_HEX);
4453 printf (" ");
4454 print_vma (section->sh_entsize, LONG_HEX);
4456 printf (" %3s ", get_elf_section_flags (section->sh_flags));
4458 printf (" %2u %3u %lu\n",
4459 section->sh_link,
4460 section->sh_info,
4461 (unsigned long) section->sh_addralign);
4464 if (do_section_details)
4465 printf (" %s\n", get_elf_section_flags (section->sh_flags));
4468 if (!do_section_details)
4469 printf (_("Key to Flags:\n\
4470 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
4471 I (info), L (link order), G (group), x (unknown)\n\
4472 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
4474 return 1;
4477 static const char *
4478 get_group_flags (unsigned int flags)
4480 static char buff[32];
4481 switch (flags)
4483 case GRP_COMDAT:
4484 return "COMDAT";
4486 default:
4487 snprintf (buff, sizeof (buff), _("[<unknown>: 0x%x]"), flags);
4488 break;
4490 return buff;
4493 static int
4494 process_section_groups (FILE *file)
4496 Elf_Internal_Shdr *section;
4497 unsigned int i;
4498 struct group *group;
4499 Elf_Internal_Shdr *symtab_sec, *strtab_sec;
4500 Elf_Internal_Sym *symtab;
4501 char *strtab;
4502 size_t strtab_size;
4504 /* Don't process section groups unless needed. */
4505 if (!do_unwind && !do_section_groups)
4506 return 1;
4508 if (elf_header.e_shnum == 0)
4510 if (do_section_groups)
4511 printf (_("\nThere are no sections in this file.\n"));
4513 return 1;
4516 if (section_headers == NULL)
4518 error (_("Section headers are not available!\n"));
4519 abort ();
4522 section_headers_groups = calloc (elf_header.e_shnum,
4523 sizeof (struct group *));
4525 if (section_headers_groups == NULL)
4527 error (_("Out of memory\n"));
4528 return 0;
4531 /* Scan the sections for the group section. */
4532 group_count = 0;
4533 for (i = 0, section = section_headers;
4534 i < elf_header.e_shnum;
4535 i++, section++)
4536 if (section->sh_type == SHT_GROUP)
4537 group_count++;
4539 if (group_count == 0)
4541 if (do_section_groups)
4542 printf (_("\nThere are no section groups in this file.\n"));
4544 return 1;
4547 section_groups = calloc (group_count, sizeof (struct group));
4549 if (section_groups == NULL)
4551 error (_("Out of memory\n"));
4552 return 0;
4555 symtab_sec = NULL;
4556 strtab_sec = NULL;
4557 symtab = NULL;
4558 strtab = NULL;
4559 strtab_size = 0;
4560 for (i = 0, section = section_headers, group = section_groups;
4561 i < elf_header.e_shnum;
4562 i++, section++)
4564 if (section->sh_type == SHT_GROUP)
4566 char *name = SECTION_NAME (section);
4567 char *group_name;
4568 unsigned char *start, *indices;
4569 unsigned int entry, j, size;
4570 Elf_Internal_Shdr *sec;
4571 Elf_Internal_Sym *sym;
4573 /* Get the symbol table. */
4574 if (section->sh_link >= elf_header.e_shnum
4575 || ((sec = section_headers + section->sh_link)->sh_type
4576 != SHT_SYMTAB))
4578 error (_("Bad sh_link in group section `%s'\n"), name);
4579 continue;
4582 if (symtab_sec != sec)
4584 symtab_sec = sec;
4585 if (symtab)
4586 free (symtab);
4587 symtab = GET_ELF_SYMBOLS (file, symtab_sec);
4590 sym = symtab + section->sh_info;
4592 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
4594 if (sym->st_shndx == 0
4595 || sym->st_shndx >= elf_header.e_shnum)
4597 error (_("Bad sh_info in group section `%s'\n"), name);
4598 continue;
4601 group_name = SECTION_NAME (section_headers + sym->st_shndx);
4602 strtab_sec = NULL;
4603 if (strtab)
4604 free (strtab);
4605 strtab = NULL;
4606 strtab_size = 0;
4608 else
4610 /* Get the string table. */
4611 if (symtab_sec->sh_link >= elf_header.e_shnum)
4613 strtab_sec = NULL;
4614 if (strtab)
4615 free (strtab);
4616 strtab = NULL;
4617 strtab_size = 0;
4619 else if (strtab_sec
4620 != (sec = section_headers + symtab_sec->sh_link))
4622 strtab_sec = sec;
4623 if (strtab)
4624 free (strtab);
4625 strtab = get_data (NULL, file, strtab_sec->sh_offset,
4626 1, strtab_sec->sh_size,
4627 _("string table"));
4628 strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
4630 group_name = sym->st_name < strtab_size
4631 ? strtab + sym->st_name : "<corrupt>";
4634 start = get_data (NULL, file, section->sh_offset,
4635 1, section->sh_size, _("section data"));
4637 indices = start;
4638 size = (section->sh_size / section->sh_entsize) - 1;
4639 entry = byte_get (indices, 4);
4640 indices += 4;
4642 if (do_section_groups)
4644 printf ("\n%s group section [%5u] `%s' [%s] contains %u sections:\n",
4645 get_group_flags (entry), i, name, group_name, size);
4647 printf (_(" [Index] Name\n"));
4650 group->group_index = i;
4652 for (j = 0; j < size; j++)
4654 struct group_list *g;
4656 entry = byte_get (indices, 4);
4657 indices += 4;
4659 if (entry >= elf_header.e_shnum)
4661 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
4662 entry, i, elf_header.e_shnum - 1);
4663 continue;
4666 if (section_headers_groups [entry] != NULL)
4668 if (entry)
4670 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
4671 entry, i,
4672 section_headers_groups [entry]->group_index);
4673 continue;
4675 else
4677 /* Intel C/C++ compiler may put section 0 in a
4678 section group. We just warn it the first time
4679 and ignore it afterwards. */
4680 static int warned = 0;
4681 if (!warned)
4683 error (_("section 0 in group section [%5u]\n"),
4684 section_headers_groups [entry]->group_index);
4685 warned++;
4690 section_headers_groups [entry] = group;
4692 if (do_section_groups)
4694 sec = section_headers + entry;
4695 printf (" [%5u] %s\n", entry, SECTION_NAME (sec));
4698 g = xmalloc (sizeof (struct group_list));
4699 g->section_index = entry;
4700 g->next = group->root;
4701 group->root = g;
4704 if (start)
4705 free (start);
4707 group++;
4711 if (symtab)
4712 free (symtab);
4713 if (strtab)
4714 free (strtab);
4715 return 1;
4718 static struct
4720 const char *name;
4721 int reloc;
4722 int size;
4723 int rela;
4724 } dynamic_relocations [] =
4726 { "REL", DT_REL, DT_RELSZ, FALSE },
4727 { "RELA", DT_RELA, DT_RELASZ, TRUE },
4728 { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
4731 /* Process the reloc section. */
4733 static int
4734 process_relocs (FILE *file)
4736 unsigned long rel_size;
4737 unsigned long rel_offset;
4740 if (!do_reloc)
4741 return 1;
4743 if (do_using_dynamic)
4745 int is_rela;
4746 const char *name;
4747 int has_dynamic_reloc;
4748 unsigned int i;
4750 has_dynamic_reloc = 0;
4752 for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
4754 is_rela = dynamic_relocations [i].rela;
4755 name = dynamic_relocations [i].name;
4756 rel_size = dynamic_info [dynamic_relocations [i].size];
4757 rel_offset = dynamic_info [dynamic_relocations [i].reloc];
4759 has_dynamic_reloc |= rel_size;
4761 if (is_rela == UNKNOWN)
4763 if (dynamic_relocations [i].reloc == DT_JMPREL)
4764 switch (dynamic_info[DT_PLTREL])
4766 case DT_REL:
4767 is_rela = FALSE;
4768 break;
4769 case DT_RELA:
4770 is_rela = TRUE;
4771 break;
4775 if (rel_size)
4777 printf
4778 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
4779 name, rel_offset, rel_size);
4781 dump_relocations (file,
4782 offset_from_vma (file, rel_offset, rel_size),
4783 rel_size,
4784 dynamic_symbols, num_dynamic_syms,
4785 dynamic_strings, dynamic_strings_length, is_rela);
4789 if (! has_dynamic_reloc)
4790 printf (_("\nThere are no dynamic relocations in this file.\n"));
4792 else
4794 Elf_Internal_Shdr *section;
4795 unsigned long i;
4796 int found = 0;
4798 for (i = 0, section = section_headers;
4799 i < elf_header.e_shnum;
4800 i++, section++)
4802 if ( section->sh_type != SHT_RELA
4803 && section->sh_type != SHT_REL)
4804 continue;
4806 rel_offset = section->sh_offset;
4807 rel_size = section->sh_size;
4809 if (rel_size)
4811 Elf_Internal_Shdr *strsec;
4812 int is_rela;
4814 printf (_("\nRelocation section "));
4816 if (string_table == NULL)
4817 printf ("%d", section->sh_name);
4818 else
4819 printf (_("'%s'"), SECTION_NAME (section));
4821 printf (_(" at offset 0x%lx contains %lu entries:\n"),
4822 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
4824 is_rela = section->sh_type == SHT_RELA;
4826 if (section->sh_link != 0
4827 && section->sh_link < elf_header.e_shnum)
4829 Elf_Internal_Shdr *symsec;
4830 Elf_Internal_Sym *symtab;
4831 unsigned long nsyms;
4832 unsigned long strtablen = 0;
4833 char *strtab = NULL;
4835 symsec = section_headers + section->sh_link;
4836 if (symsec->sh_type != SHT_SYMTAB
4837 && symsec->sh_type != SHT_DYNSYM)
4838 continue;
4840 nsyms = symsec->sh_size / symsec->sh_entsize;
4841 symtab = GET_ELF_SYMBOLS (file, symsec);
4843 if (symtab == NULL)
4844 continue;
4846 if (symsec->sh_link != 0
4847 && symsec->sh_link < elf_header.e_shnum)
4849 strsec = section_headers + symsec->sh_link;
4851 strtab = get_data (NULL, file, strsec->sh_offset,
4852 1, strsec->sh_size,
4853 _("string table"));
4854 strtablen = strtab == NULL ? 0 : strsec->sh_size;
4857 dump_relocations (file, rel_offset, rel_size,
4858 symtab, nsyms, strtab, strtablen, is_rela);
4859 if (strtab)
4860 free (strtab);
4861 free (symtab);
4863 else
4864 dump_relocations (file, rel_offset, rel_size,
4865 NULL, 0, NULL, 0, is_rela);
4867 found = 1;
4871 if (! found)
4872 printf (_("\nThere are no relocations in this file.\n"));
4875 return 1;
4878 /* Process the unwind section. */
4880 #include "unwind-ia64.h"
4882 /* An absolute address consists of a section and an offset. If the
4883 section is NULL, the offset itself is the address, otherwise, the
4884 address equals to LOAD_ADDRESS(section) + offset. */
4886 struct absaddr
4888 unsigned short section;
4889 bfd_vma offset;
4892 #define ABSADDR(a) \
4893 ((a).section \
4894 ? section_headers [(a).section].sh_addr + (a).offset \
4895 : (a).offset)
4897 struct ia64_unw_aux_info
4899 struct ia64_unw_table_entry
4901 struct absaddr start;
4902 struct absaddr end;
4903 struct absaddr info;
4905 *table; /* Unwind table. */
4906 unsigned long table_len; /* Length of unwind table. */
4907 unsigned char *info; /* Unwind info. */
4908 unsigned long info_size; /* Size of unwind info. */
4909 bfd_vma info_addr; /* starting address of unwind info. */
4910 bfd_vma seg_base; /* Starting address of segment. */
4911 Elf_Internal_Sym *symtab; /* The symbol table. */
4912 unsigned long nsyms; /* Number of symbols. */
4913 char *strtab; /* The string table. */
4914 unsigned long strtab_size; /* Size of string table. */
4917 static void
4918 find_symbol_for_address (Elf_Internal_Sym *symtab,
4919 unsigned long nsyms,
4920 const char *strtab,
4921 unsigned long strtab_size,
4922 struct absaddr addr,
4923 const char **symname,
4924 bfd_vma *offset)
4926 bfd_vma dist = 0x100000;
4927 Elf_Internal_Sym *sym, *best = NULL;
4928 unsigned long i;
4930 for (i = 0, sym = symtab; i < nsyms; ++i, ++sym)
4932 if (ELF_ST_TYPE (sym->st_info) == STT_FUNC
4933 && sym->st_name != 0
4934 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
4935 && addr.offset >= sym->st_value
4936 && addr.offset - sym->st_value < dist)
4938 best = sym;
4939 dist = addr.offset - sym->st_value;
4940 if (!dist)
4941 break;
4944 if (best)
4946 *symname = (best->st_name >= strtab_size
4947 ? "<corrupt>" : strtab + best->st_name);
4948 *offset = dist;
4949 return;
4951 *symname = NULL;
4952 *offset = addr.offset;
4955 static void
4956 dump_ia64_unwind (struct ia64_unw_aux_info *aux)
4958 struct ia64_unw_table_entry *tp;
4959 int in_body;
4961 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
4963 bfd_vma stamp;
4964 bfd_vma offset;
4965 const unsigned char *dp;
4966 const unsigned char *head;
4967 const char *procname;
4969 find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
4970 aux->strtab_size, tp->start, &procname, &offset);
4972 fputs ("\n<", stdout);
4974 if (procname)
4976 fputs (procname, stdout);
4978 if (offset)
4979 printf ("+%lx", (unsigned long) offset);
4982 fputs (">: [", stdout);
4983 print_vma (tp->start.offset, PREFIX_HEX);
4984 fputc ('-', stdout);
4985 print_vma (tp->end.offset, PREFIX_HEX);
4986 printf ("], info at +0x%lx\n",
4987 (unsigned long) (tp->info.offset - aux->seg_base));
4989 head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
4990 stamp = byte_get ((unsigned char *) head, sizeof (stamp));
4992 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
4993 (unsigned) UNW_VER (stamp),
4994 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
4995 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
4996 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
4997 (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
4999 if (UNW_VER (stamp) != 1)
5001 printf ("\tUnknown version.\n");
5002 continue;
5005 in_body = 0;
5006 for (dp = head + 8; dp < head + 8 + eh_addr_size * UNW_LENGTH (stamp);)
5007 dp = unw_decode (dp, in_body, & in_body);
5011 static int
5012 slurp_ia64_unwind_table (FILE *file,
5013 struct ia64_unw_aux_info *aux,
5014 Elf_Internal_Shdr *sec)
5016 unsigned long size, nrelas, i;
5017 Elf_Internal_Phdr *seg;
5018 struct ia64_unw_table_entry *tep;
5019 Elf_Internal_Shdr *relsec;
5020 Elf_Internal_Rela *rela, *rp;
5021 unsigned char *table, *tp;
5022 Elf_Internal_Sym *sym;
5023 const char *relname;
5025 /* First, find the starting address of the segment that includes
5026 this section: */
5028 if (elf_header.e_phnum)
5030 if (! get_program_headers (file))
5031 return 0;
5033 for (seg = program_headers;
5034 seg < program_headers + elf_header.e_phnum;
5035 ++seg)
5037 if (seg->p_type != PT_LOAD)
5038 continue;
5040 if (sec->sh_addr >= seg->p_vaddr
5041 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
5043 aux->seg_base = seg->p_vaddr;
5044 break;
5049 /* Second, build the unwind table from the contents of the unwind section: */
5050 size = sec->sh_size;
5051 table = get_data (NULL, file, sec->sh_offset, 1, size, _("unwind table"));
5052 if (!table)
5053 return 0;
5055 aux->table = xcmalloc (size / (3 * eh_addr_size), sizeof (aux->table[0]));
5056 tep = aux->table;
5057 for (tp = table; tp < table + size; tp += 3 * eh_addr_size, ++tep)
5059 tep->start.section = SHN_UNDEF;
5060 tep->end.section = SHN_UNDEF;
5061 tep->info.section = SHN_UNDEF;
5062 if (is_32bit_elf)
5064 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
5065 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
5066 tep->info.offset = byte_get ((unsigned char *) tp + 8, 4);
5068 else
5070 tep->start.offset = BYTE_GET ((unsigned char *) tp + 0);
5071 tep->end.offset = BYTE_GET ((unsigned char *) tp + 8);
5072 tep->info.offset = BYTE_GET ((unsigned char *) tp + 16);
5074 tep->start.offset += aux->seg_base;
5075 tep->end.offset += aux->seg_base;
5076 tep->info.offset += aux->seg_base;
5078 free (table);
5080 /* Third, apply any relocations to the unwind table: */
5081 for (relsec = section_headers;
5082 relsec < section_headers + elf_header.e_shnum;
5083 ++relsec)
5085 if (relsec->sh_type != SHT_RELA
5086 || relsec->sh_info >= elf_header.e_shnum
5087 || section_headers + relsec->sh_info != sec)
5088 continue;
5090 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
5091 & rela, & nrelas))
5092 return 0;
5094 for (rp = rela; rp < rela + nrelas; ++rp)
5096 relname = elf_ia64_reloc_type (get_reloc_type (rp->r_info));
5097 sym = aux->symtab + get_reloc_symindex (rp->r_info);
5099 if (! const_strneq (relname, "R_IA64_SEGREL"))
5101 warn (_("Skipping unexpected relocation type %s\n"), relname);
5102 continue;
5105 i = rp->r_offset / (3 * eh_addr_size);
5107 switch (rp->r_offset/eh_addr_size % 3)
5109 case 0:
5110 aux->table[i].start.section = sym->st_shndx;
5111 aux->table[i].start.offset += rp->r_addend + sym->st_value;
5112 break;
5113 case 1:
5114 aux->table[i].end.section = sym->st_shndx;
5115 aux->table[i].end.offset += rp->r_addend + sym->st_value;
5116 break;
5117 case 2:
5118 aux->table[i].info.section = sym->st_shndx;
5119 aux->table[i].info.offset += rp->r_addend + sym->st_value;
5120 break;
5121 default:
5122 break;
5126 free (rela);
5129 aux->table_len = size / (3 * eh_addr_size);
5130 return 1;
5133 static int
5134 ia64_process_unwind (FILE *file)
5136 Elf_Internal_Shdr *sec, *unwsec = NULL, *strsec;
5137 unsigned long i, unwcount = 0, unwstart = 0;
5138 struct ia64_unw_aux_info aux;
5140 memset (& aux, 0, sizeof (aux));
5142 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
5144 if (sec->sh_type == SHT_SYMTAB
5145 && sec->sh_link < elf_header.e_shnum)
5147 aux.nsyms = sec->sh_size / sec->sh_entsize;
5148 aux.symtab = GET_ELF_SYMBOLS (file, sec);
5150 strsec = section_headers + sec->sh_link;
5151 aux.strtab = get_data (NULL, file, strsec->sh_offset,
5152 1, strsec->sh_size, _("string table"));
5153 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
5155 else if (sec->sh_type == SHT_IA_64_UNWIND)
5156 unwcount++;
5159 if (!unwcount)
5160 printf (_("\nThere are no unwind sections in this file.\n"));
5162 while (unwcount-- > 0)
5164 char *suffix;
5165 size_t len, len2;
5167 for (i = unwstart, sec = section_headers + unwstart;
5168 i < elf_header.e_shnum; ++i, ++sec)
5169 if (sec->sh_type == SHT_IA_64_UNWIND)
5171 unwsec = sec;
5172 break;
5175 unwstart = i + 1;
5176 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
5178 if ((unwsec->sh_flags & SHF_GROUP) != 0)
5180 /* We need to find which section group it is in. */
5181 struct group_list *g = section_headers_groups [i]->root;
5183 for (; g != NULL; g = g->next)
5185 sec = section_headers + g->section_index;
5187 if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
5188 break;
5191 if (g == NULL)
5192 i = elf_header.e_shnum;
5194 else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
5196 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
5197 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
5198 suffix = SECTION_NAME (unwsec) + len;
5199 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
5200 ++i, ++sec)
5201 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
5202 && streq (SECTION_NAME (sec) + len2, suffix))
5203 break;
5205 else
5207 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
5208 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
5209 len = sizeof (ELF_STRING_ia64_unwind) - 1;
5210 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
5211 suffix = "";
5212 if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
5213 suffix = SECTION_NAME (unwsec) + len;
5214 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
5215 ++i, ++sec)
5216 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
5217 && streq (SECTION_NAME (sec) + len2, suffix))
5218 break;
5221 if (i == elf_header.e_shnum)
5223 printf (_("\nCould not find unwind info section for "));
5225 if (string_table == NULL)
5226 printf ("%d", unwsec->sh_name);
5227 else
5228 printf (_("'%s'"), SECTION_NAME (unwsec));
5230 else
5232 aux.info_size = sec->sh_size;
5233 aux.info_addr = sec->sh_addr;
5234 aux.info = get_data (NULL, file, sec->sh_offset, 1, aux.info_size,
5235 _("unwind info"));
5237 printf (_("\nUnwind section "));
5239 if (string_table == NULL)
5240 printf ("%d", unwsec->sh_name);
5241 else
5242 printf (_("'%s'"), SECTION_NAME (unwsec));
5244 printf (_(" at offset 0x%lx contains %lu entries:\n"),
5245 (unsigned long) unwsec->sh_offset,
5246 (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
5248 (void) slurp_ia64_unwind_table (file, & aux, unwsec);
5250 if (aux.table_len > 0)
5251 dump_ia64_unwind (& aux);
5253 if (aux.table)
5254 free ((char *) aux.table);
5255 if (aux.info)
5256 free ((char *) aux.info);
5257 aux.table = NULL;
5258 aux.info = NULL;
5262 if (aux.symtab)
5263 free (aux.symtab);
5264 if (aux.strtab)
5265 free ((char *) aux.strtab);
5267 return 1;
5270 struct hppa_unw_aux_info
5272 struct hppa_unw_table_entry
5274 struct absaddr start;
5275 struct absaddr end;
5276 unsigned int Cannot_unwind:1; /* 0 */
5277 unsigned int Millicode:1; /* 1 */
5278 unsigned int Millicode_save_sr0:1; /* 2 */
5279 unsigned int Region_description:2; /* 3..4 */
5280 unsigned int reserved1:1; /* 5 */
5281 unsigned int Entry_SR:1; /* 6 */
5282 unsigned int Entry_FR:4; /* number saved */ /* 7..10 */
5283 unsigned int Entry_GR:5; /* number saved */ /* 11..15 */
5284 unsigned int Args_stored:1; /* 16 */
5285 unsigned int Variable_Frame:1; /* 17 */
5286 unsigned int Separate_Package_Body:1; /* 18 */
5287 unsigned int Frame_Extension_Millicode:1; /* 19 */
5288 unsigned int Stack_Overflow_Check:1; /* 20 */
5289 unsigned int Two_Instruction_SP_Increment:1; /* 21 */
5290 unsigned int Ada_Region:1; /* 22 */
5291 unsigned int cxx_info:1; /* 23 */
5292 unsigned int cxx_try_catch:1; /* 24 */
5293 unsigned int sched_entry_seq:1; /* 25 */
5294 unsigned int reserved2:1; /* 26 */
5295 unsigned int Save_SP:1; /* 27 */
5296 unsigned int Save_RP:1; /* 28 */
5297 unsigned int Save_MRP_in_frame:1; /* 29 */
5298 unsigned int extn_ptr_defined:1; /* 30 */
5299 unsigned int Cleanup_defined:1; /* 31 */
5301 unsigned int MPE_XL_interrupt_marker:1; /* 0 */
5302 unsigned int HP_UX_interrupt_marker:1; /* 1 */
5303 unsigned int Large_frame:1; /* 2 */
5304 unsigned int Pseudo_SP_Set:1; /* 3 */
5305 unsigned int reserved4:1; /* 4 */
5306 unsigned int Total_frame_size:27; /* 5..31 */
5308 *table; /* Unwind table. */
5309 unsigned long table_len; /* Length of unwind table. */
5310 bfd_vma seg_base; /* Starting address of segment. */
5311 Elf_Internal_Sym *symtab; /* The symbol table. */
5312 unsigned long nsyms; /* Number of symbols. */
5313 char *strtab; /* The string table. */
5314 unsigned long strtab_size; /* Size of string table. */
5317 static void
5318 dump_hppa_unwind (struct hppa_unw_aux_info *aux)
5320 struct hppa_unw_table_entry *tp;
5322 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
5324 bfd_vma offset;
5325 const char *procname;
5327 find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
5328 aux->strtab_size, tp->start, &procname,
5329 &offset);
5331 fputs ("\n<", stdout);
5333 if (procname)
5335 fputs (procname, stdout);
5337 if (offset)
5338 printf ("+%lx", (unsigned long) offset);
5341 fputs (">: [", stdout);
5342 print_vma (tp->start.offset, PREFIX_HEX);
5343 fputc ('-', stdout);
5344 print_vma (tp->end.offset, PREFIX_HEX);
5345 printf ("]\n\t");
5347 #define PF(_m) if (tp->_m) printf (#_m " ");
5348 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
5349 PF(Cannot_unwind);
5350 PF(Millicode);
5351 PF(Millicode_save_sr0);
5352 /* PV(Region_description); */
5353 PF(Entry_SR);
5354 PV(Entry_FR);
5355 PV(Entry_GR);
5356 PF(Args_stored);
5357 PF(Variable_Frame);
5358 PF(Separate_Package_Body);
5359 PF(Frame_Extension_Millicode);
5360 PF(Stack_Overflow_Check);
5361 PF(Two_Instruction_SP_Increment);
5362 PF(Ada_Region);
5363 PF(cxx_info);
5364 PF(cxx_try_catch);
5365 PF(sched_entry_seq);
5366 PF(Save_SP);
5367 PF(Save_RP);
5368 PF(Save_MRP_in_frame);
5369 PF(extn_ptr_defined);
5370 PF(Cleanup_defined);
5371 PF(MPE_XL_interrupt_marker);
5372 PF(HP_UX_interrupt_marker);
5373 PF(Large_frame);
5374 PF(Pseudo_SP_Set);
5375 PV(Total_frame_size);
5376 #undef PF
5377 #undef PV
5380 printf ("\n");
5383 static int
5384 slurp_hppa_unwind_table (FILE *file,
5385 struct hppa_unw_aux_info *aux,
5386 Elf_Internal_Shdr *sec)
5388 unsigned long size, unw_ent_size, nentries, nrelas, i;
5389 Elf_Internal_Phdr *seg;
5390 struct hppa_unw_table_entry *tep;
5391 Elf_Internal_Shdr *relsec;
5392 Elf_Internal_Rela *rela, *rp;
5393 unsigned char *table, *tp;
5394 Elf_Internal_Sym *sym;
5395 const char *relname;
5397 /* First, find the starting address of the segment that includes
5398 this section. */
5400 if (elf_header.e_phnum)
5402 if (! get_program_headers (file))
5403 return 0;
5405 for (seg = program_headers;
5406 seg < program_headers + elf_header.e_phnum;
5407 ++seg)
5409 if (seg->p_type != PT_LOAD)
5410 continue;
5412 if (sec->sh_addr >= seg->p_vaddr
5413 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
5415 aux->seg_base = seg->p_vaddr;
5416 break;
5421 /* Second, build the unwind table from the contents of the unwind
5422 section. */
5423 size = sec->sh_size;
5424 table = get_data (NULL, file, sec->sh_offset, 1, size, _("unwind table"));
5425 if (!table)
5426 return 0;
5428 unw_ent_size = 16;
5429 nentries = size / unw_ent_size;
5430 size = unw_ent_size * nentries;
5432 tep = aux->table = xcmalloc (nentries, sizeof (aux->table[0]));
5434 for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
5436 unsigned int tmp1, tmp2;
5438 tep->start.section = SHN_UNDEF;
5439 tep->end.section = SHN_UNDEF;
5441 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
5442 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
5443 tmp1 = byte_get ((unsigned char *) tp + 8, 4);
5444 tmp2 = byte_get ((unsigned char *) tp + 12, 4);
5446 tep->start.offset += aux->seg_base;
5447 tep->end.offset += aux->seg_base;
5449 tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
5450 tep->Millicode = (tmp1 >> 30) & 0x1;
5451 tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
5452 tep->Region_description = (tmp1 >> 27) & 0x3;
5453 tep->reserved1 = (tmp1 >> 26) & 0x1;
5454 tep->Entry_SR = (tmp1 >> 25) & 0x1;
5455 tep->Entry_FR = (tmp1 >> 21) & 0xf;
5456 tep->Entry_GR = (tmp1 >> 16) & 0x1f;
5457 tep->Args_stored = (tmp1 >> 15) & 0x1;
5458 tep->Variable_Frame = (tmp1 >> 14) & 0x1;
5459 tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
5460 tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
5461 tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
5462 tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
5463 tep->Ada_Region = (tmp1 >> 9) & 0x1;
5464 tep->cxx_info = (tmp1 >> 8) & 0x1;
5465 tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
5466 tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
5467 tep->reserved2 = (tmp1 >> 5) & 0x1;
5468 tep->Save_SP = (tmp1 >> 4) & 0x1;
5469 tep->Save_RP = (tmp1 >> 3) & 0x1;
5470 tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
5471 tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
5472 tep->Cleanup_defined = tmp1 & 0x1;
5474 tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
5475 tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
5476 tep->Large_frame = (tmp2 >> 29) & 0x1;
5477 tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
5478 tep->reserved4 = (tmp2 >> 27) & 0x1;
5479 tep->Total_frame_size = tmp2 & 0x7ffffff;
5481 free (table);
5483 /* Third, apply any relocations to the unwind table. */
5484 for (relsec = section_headers;
5485 relsec < section_headers + elf_header.e_shnum;
5486 ++relsec)
5488 if (relsec->sh_type != SHT_RELA
5489 || relsec->sh_info >= elf_header.e_shnum
5490 || section_headers + relsec->sh_info != sec)
5491 continue;
5493 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
5494 & rela, & nrelas))
5495 return 0;
5497 for (rp = rela; rp < rela + nrelas; ++rp)
5499 relname = elf_hppa_reloc_type (get_reloc_type (rp->r_info));
5500 sym = aux->symtab + get_reloc_symindex (rp->r_info);
5502 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
5503 if (! const_strneq (relname, "R_PARISC_SEGREL"))
5505 warn (_("Skipping unexpected relocation type %s\n"), relname);
5506 continue;
5509 i = rp->r_offset / unw_ent_size;
5511 switch ((rp->r_offset % unw_ent_size) / eh_addr_size)
5513 case 0:
5514 aux->table[i].start.section = sym->st_shndx;
5515 aux->table[i].start.offset += sym->st_value + rp->r_addend;
5516 break;
5517 case 1:
5518 aux->table[i].end.section = sym->st_shndx;
5519 aux->table[i].end.offset += sym->st_value + rp->r_addend;
5520 break;
5521 default:
5522 break;
5526 free (rela);
5529 aux->table_len = nentries;
5531 return 1;
5534 static int
5535 hppa_process_unwind (FILE *file)
5537 struct hppa_unw_aux_info aux;
5538 Elf_Internal_Shdr *unwsec = NULL;
5539 Elf_Internal_Shdr *strsec;
5540 Elf_Internal_Shdr *sec;
5541 unsigned long i;
5543 memset (& aux, 0, sizeof (aux));
5545 if (string_table == NULL)
5546 return 1;
5548 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
5550 if (sec->sh_type == SHT_SYMTAB
5551 && sec->sh_link < elf_header.e_shnum)
5553 aux.nsyms = sec->sh_size / sec->sh_entsize;
5554 aux.symtab = GET_ELF_SYMBOLS (file, sec);
5556 strsec = section_headers + sec->sh_link;
5557 aux.strtab = get_data (NULL, file, strsec->sh_offset,
5558 1, strsec->sh_size, _("string table"));
5559 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
5561 else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
5562 unwsec = sec;
5565 if (!unwsec)
5566 printf (_("\nThere are no unwind sections in this file.\n"));
5568 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
5570 if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
5572 printf (_("\nUnwind section "));
5573 printf (_("'%s'"), SECTION_NAME (sec));
5575 printf (_(" at offset 0x%lx contains %lu entries:\n"),
5576 (unsigned long) sec->sh_offset,
5577 (unsigned long) (sec->sh_size / (2 * eh_addr_size + 8)));
5579 slurp_hppa_unwind_table (file, &aux, sec);
5580 if (aux.table_len > 0)
5581 dump_hppa_unwind (&aux);
5583 if (aux.table)
5584 free ((char *) aux.table);
5585 aux.table = NULL;
5589 if (aux.symtab)
5590 free (aux.symtab);
5591 if (aux.strtab)
5592 free ((char *) aux.strtab);
5594 return 1;
5597 static int
5598 process_unwind (FILE *file)
5600 struct unwind_handler {
5601 int machtype;
5602 int (*handler)(FILE *file);
5603 } handlers[] = {
5604 { EM_IA_64, ia64_process_unwind },
5605 { EM_PARISC, hppa_process_unwind },
5606 { 0, 0 }
5608 int i;
5610 if (!do_unwind)
5611 return 1;
5613 for (i = 0; handlers[i].handler != NULL; i++)
5614 if (elf_header.e_machine == handlers[i].machtype)
5615 return handlers[i].handler (file);
5617 printf (_("\nThere are no unwind sections in this file.\n"));
5618 return 1;
5621 static void
5622 dynamic_section_mips_val (Elf_Internal_Dyn *entry)
5624 switch (entry->d_tag)
5626 case DT_MIPS_FLAGS:
5627 if (entry->d_un.d_val == 0)
5628 printf ("NONE\n");
5629 else
5631 static const char * opts[] =
5633 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
5634 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
5635 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
5636 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
5637 "RLD_ORDER_SAFE"
5639 unsigned int cnt;
5640 int first = 1;
5641 for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
5642 if (entry->d_un.d_val & (1 << cnt))
5644 printf ("%s%s", first ? "" : " ", opts[cnt]);
5645 first = 0;
5647 puts ("");
5649 break;
5651 case DT_MIPS_IVERSION:
5652 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
5653 printf ("Interface Version: %s\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
5654 else
5655 printf ("<corrupt: %ld>\n", (long) entry->d_un.d_ptr);
5656 break;
5658 case DT_MIPS_TIME_STAMP:
5660 char timebuf[20];
5661 struct tm *tmp;
5663 time_t time = entry->d_un.d_val;
5664 tmp = gmtime (&time);
5665 snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
5666 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
5667 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
5668 printf ("Time Stamp: %s\n", timebuf);
5670 break;
5672 case DT_MIPS_RLD_VERSION:
5673 case DT_MIPS_LOCAL_GOTNO:
5674 case DT_MIPS_CONFLICTNO:
5675 case DT_MIPS_LIBLISTNO:
5676 case DT_MIPS_SYMTABNO:
5677 case DT_MIPS_UNREFEXTNO:
5678 case DT_MIPS_HIPAGENO:
5679 case DT_MIPS_DELTA_CLASS_NO:
5680 case DT_MIPS_DELTA_INSTANCE_NO:
5681 case DT_MIPS_DELTA_RELOC_NO:
5682 case DT_MIPS_DELTA_SYM_NO:
5683 case DT_MIPS_DELTA_CLASSSYM_NO:
5684 case DT_MIPS_COMPACT_SIZE:
5685 printf ("%ld\n", (long) entry->d_un.d_ptr);
5686 break;
5688 default:
5689 printf ("%#lx\n", (long) entry->d_un.d_ptr);
5694 static void
5695 dynamic_section_parisc_val (Elf_Internal_Dyn *entry)
5697 switch (entry->d_tag)
5699 case DT_HP_DLD_FLAGS:
5701 static struct
5703 long int bit;
5704 const char *str;
5706 flags[] =
5708 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
5709 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
5710 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
5711 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
5712 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
5713 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
5714 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
5715 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
5716 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
5717 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
5718 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
5719 { DT_HP_GST, "HP_GST" },
5720 { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
5721 { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
5722 { DT_HP_NODELETE, "HP_NODELETE" },
5723 { DT_HP_GROUP, "HP_GROUP" },
5724 { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
5726 int first = 1;
5727 size_t cnt;
5728 bfd_vma val = entry->d_un.d_val;
5730 for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
5731 if (val & flags[cnt].bit)
5733 if (! first)
5734 putchar (' ');
5735 fputs (flags[cnt].str, stdout);
5736 first = 0;
5737 val ^= flags[cnt].bit;
5740 if (val != 0 || first)
5742 if (! first)
5743 putchar (' ');
5744 print_vma (val, HEX);
5747 break;
5749 default:
5750 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
5751 break;
5753 putchar ('\n');
5756 static void
5757 dynamic_section_ia64_val (Elf_Internal_Dyn *entry)
5759 switch (entry->d_tag)
5761 case DT_IA_64_PLT_RESERVE:
5762 /* First 3 slots reserved. */
5763 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
5764 printf (" -- ");
5765 print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
5766 break;
5768 default:
5769 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
5770 break;
5772 putchar ('\n');
5775 static int
5776 get_32bit_dynamic_section (FILE *file)
5778 Elf32_External_Dyn *edyn, *ext;
5779 Elf_Internal_Dyn *entry;
5781 edyn = get_data (NULL, file, dynamic_addr, 1, dynamic_size,
5782 _("dynamic section"));
5783 if (!edyn)
5784 return 0;
5786 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
5787 might not have the luxury of section headers. Look for the DT_NULL
5788 terminator to determine the number of entries. */
5789 for (ext = edyn, dynamic_nent = 0;
5790 (char *) ext < (char *) edyn + dynamic_size;
5791 ext++)
5793 dynamic_nent++;
5794 if (BYTE_GET (ext->d_tag) == DT_NULL)
5795 break;
5798 dynamic_section = cmalloc (dynamic_nent, sizeof (*entry));
5799 if (dynamic_section == NULL)
5801 error (_("Out of memory\n"));
5802 free (edyn);
5803 return 0;
5806 for (ext = edyn, entry = dynamic_section;
5807 entry < dynamic_section + dynamic_nent;
5808 ext++, entry++)
5810 entry->d_tag = BYTE_GET (ext->d_tag);
5811 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
5814 free (edyn);
5816 return 1;
5819 static int
5820 get_64bit_dynamic_section (FILE *file)
5822 Elf64_External_Dyn *edyn, *ext;
5823 Elf_Internal_Dyn *entry;
5825 edyn = get_data (NULL, file, dynamic_addr, 1, dynamic_size,
5826 _("dynamic section"));
5827 if (!edyn)
5828 return 0;
5830 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
5831 might not have the luxury of section headers. Look for the DT_NULL
5832 terminator to determine the number of entries. */
5833 for (ext = edyn, dynamic_nent = 0;
5834 (char *) ext < (char *) edyn + dynamic_size;
5835 ext++)
5837 dynamic_nent++;
5838 if (BYTE_GET (ext->d_tag) == DT_NULL)
5839 break;
5842 dynamic_section = cmalloc (dynamic_nent, sizeof (*entry));
5843 if (dynamic_section == NULL)
5845 error (_("Out of memory\n"));
5846 free (edyn);
5847 return 0;
5850 for (ext = edyn, entry = dynamic_section;
5851 entry < dynamic_section + dynamic_nent;
5852 ext++, entry++)
5854 entry->d_tag = BYTE_GET (ext->d_tag);
5855 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
5858 free (edyn);
5860 return 1;
5863 static void
5864 print_dynamic_flags (bfd_vma flags)
5866 int first = 1;
5868 while (flags)
5870 bfd_vma flag;
5872 flag = flags & - flags;
5873 flags &= ~ flag;
5875 if (first)
5876 first = 0;
5877 else
5878 putc (' ', stdout);
5880 switch (flag)
5882 case DF_ORIGIN: fputs ("ORIGIN", stdout); break;
5883 case DF_SYMBOLIC: fputs ("SYMBOLIC", stdout); break;
5884 case DF_TEXTREL: fputs ("TEXTREL", stdout); break;
5885 case DF_BIND_NOW: fputs ("BIND_NOW", stdout); break;
5886 case DF_STATIC_TLS: fputs ("STATIC_TLS", stdout); break;
5887 default: fputs ("unknown", stdout); break;
5890 puts ("");
5893 /* Parse and display the contents of the dynamic section. */
5895 static int
5896 process_dynamic_section (FILE *file)
5898 Elf_Internal_Dyn *entry;
5900 if (dynamic_size == 0)
5902 if (do_dynamic)
5903 printf (_("\nThere is no dynamic section in this file.\n"));
5905 return 1;
5908 if (is_32bit_elf)
5910 if (! get_32bit_dynamic_section (file))
5911 return 0;
5913 else if (! get_64bit_dynamic_section (file))
5914 return 0;
5916 /* Find the appropriate symbol table. */
5917 if (dynamic_symbols == NULL)
5919 for (entry = dynamic_section;
5920 entry < dynamic_section + dynamic_nent;
5921 ++entry)
5923 Elf_Internal_Shdr section;
5925 if (entry->d_tag != DT_SYMTAB)
5926 continue;
5928 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
5930 /* Since we do not know how big the symbol table is,
5931 we default to reading in the entire file (!) and
5932 processing that. This is overkill, I know, but it
5933 should work. */
5934 section.sh_offset = offset_from_vma (file, entry->d_un.d_val, 0);
5936 if (archive_file_offset != 0)
5937 section.sh_size = archive_file_size - section.sh_offset;
5938 else
5940 if (fseek (file, 0, SEEK_END))
5941 error (_("Unable to seek to end of file!\n"));
5943 section.sh_size = ftell (file) - section.sh_offset;
5946 if (is_32bit_elf)
5947 section.sh_entsize = sizeof (Elf32_External_Sym);
5948 else
5949 section.sh_entsize = sizeof (Elf64_External_Sym);
5951 num_dynamic_syms = section.sh_size / section.sh_entsize;
5952 if (num_dynamic_syms < 1)
5954 error (_("Unable to determine the number of symbols to load\n"));
5955 continue;
5958 dynamic_symbols = GET_ELF_SYMBOLS (file, &section);
5962 /* Similarly find a string table. */
5963 if (dynamic_strings == NULL)
5965 for (entry = dynamic_section;
5966 entry < dynamic_section + dynamic_nent;
5967 ++entry)
5969 unsigned long offset;
5970 long str_tab_len;
5972 if (entry->d_tag != DT_STRTAB)
5973 continue;
5975 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
5977 /* Since we do not know how big the string table is,
5978 we default to reading in the entire file (!) and
5979 processing that. This is overkill, I know, but it
5980 should work. */
5982 offset = offset_from_vma (file, entry->d_un.d_val, 0);
5984 if (archive_file_offset != 0)
5985 str_tab_len = archive_file_size - offset;
5986 else
5988 if (fseek (file, 0, SEEK_END))
5989 error (_("Unable to seek to end of file\n"));
5990 str_tab_len = ftell (file) - offset;
5993 if (str_tab_len < 1)
5995 error
5996 (_("Unable to determine the length of the dynamic string table\n"));
5997 continue;
6000 dynamic_strings = get_data (NULL, file, offset, 1, str_tab_len,
6001 _("dynamic string table"));
6002 dynamic_strings_length = str_tab_len;
6003 break;
6007 /* And find the syminfo section if available. */
6008 if (dynamic_syminfo == NULL)
6010 unsigned long syminsz = 0;
6012 for (entry = dynamic_section;
6013 entry < dynamic_section + dynamic_nent;
6014 ++entry)
6016 if (entry->d_tag == DT_SYMINENT)
6018 /* Note: these braces are necessary to avoid a syntax
6019 error from the SunOS4 C compiler. */
6020 assert (sizeof (Elf_External_Syminfo) == entry->d_un.d_val);
6022 else if (entry->d_tag == DT_SYMINSZ)
6023 syminsz = entry->d_un.d_val;
6024 else if (entry->d_tag == DT_SYMINFO)
6025 dynamic_syminfo_offset = offset_from_vma (file, entry->d_un.d_val,
6026 syminsz);
6029 if (dynamic_syminfo_offset != 0 && syminsz != 0)
6031 Elf_External_Syminfo *extsyminfo, *extsym;
6032 Elf_Internal_Syminfo *syminfo;
6034 /* There is a syminfo section. Read the data. */
6035 extsyminfo = get_data (NULL, file, dynamic_syminfo_offset, 1,
6036 syminsz, _("symbol information"));
6037 if (!extsyminfo)
6038 return 0;
6040 dynamic_syminfo = malloc (syminsz);
6041 if (dynamic_syminfo == NULL)
6043 error (_("Out of memory\n"));
6044 return 0;
6047 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
6048 for (syminfo = dynamic_syminfo, extsym = extsyminfo;
6049 syminfo < dynamic_syminfo + dynamic_syminfo_nent;
6050 ++syminfo, ++extsym)
6052 syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
6053 syminfo->si_flags = BYTE_GET (extsym->si_flags);
6056 free (extsyminfo);
6060 if (do_dynamic && dynamic_addr)
6061 printf (_("\nDynamic section at offset 0x%lx contains %u entries:\n"),
6062 dynamic_addr, dynamic_nent);
6063 if (do_dynamic)
6064 printf (_(" Tag Type Name/Value\n"));
6066 for (entry = dynamic_section;
6067 entry < dynamic_section + dynamic_nent;
6068 entry++)
6070 if (do_dynamic)
6072 const char *dtype;
6074 putchar (' ');
6075 print_vma (entry->d_tag, FULL_HEX);
6076 dtype = get_dynamic_type (entry->d_tag);
6077 printf (" (%s)%*s", dtype,
6078 ((is_32bit_elf ? 27 : 19)
6079 - (int) strlen (dtype)),
6080 " ");
6083 switch (entry->d_tag)
6085 case DT_FLAGS:
6086 if (do_dynamic)
6087 print_dynamic_flags (entry->d_un.d_val);
6088 break;
6090 case DT_AUXILIARY:
6091 case DT_FILTER:
6092 case DT_CONFIG:
6093 case DT_DEPAUDIT:
6094 case DT_AUDIT:
6095 if (do_dynamic)
6097 switch (entry->d_tag)
6099 case DT_AUXILIARY:
6100 printf (_("Auxiliary library"));
6101 break;
6103 case DT_FILTER:
6104 printf (_("Filter library"));
6105 break;
6107 case DT_CONFIG:
6108 printf (_("Configuration file"));
6109 break;
6111 case DT_DEPAUDIT:
6112 printf (_("Dependency audit library"));
6113 break;
6115 case DT_AUDIT:
6116 printf (_("Audit library"));
6117 break;
6120 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
6121 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
6122 else
6124 printf (": ");
6125 print_vma (entry->d_un.d_val, PREFIX_HEX);
6126 putchar ('\n');
6129 break;
6131 case DT_FEATURE:
6132 if (do_dynamic)
6134 printf (_("Flags:"));
6136 if (entry->d_un.d_val == 0)
6137 printf (_(" None\n"));
6138 else
6140 unsigned long int val = entry->d_un.d_val;
6142 if (val & DTF_1_PARINIT)
6144 printf (" PARINIT");
6145 val ^= DTF_1_PARINIT;
6147 if (val & DTF_1_CONFEXP)
6149 printf (" CONFEXP");
6150 val ^= DTF_1_CONFEXP;
6152 if (val != 0)
6153 printf (" %lx", val);
6154 puts ("");
6157 break;
6159 case DT_POSFLAG_1:
6160 if (do_dynamic)
6162 printf (_("Flags:"));
6164 if (entry->d_un.d_val == 0)
6165 printf (_(" None\n"));
6166 else
6168 unsigned long int val = entry->d_un.d_val;
6170 if (val & DF_P1_LAZYLOAD)
6172 printf (" LAZYLOAD");
6173 val ^= DF_P1_LAZYLOAD;
6175 if (val & DF_P1_GROUPPERM)
6177 printf (" GROUPPERM");
6178 val ^= DF_P1_GROUPPERM;
6180 if (val != 0)
6181 printf (" %lx", val);
6182 puts ("");
6185 break;
6187 case DT_FLAGS_1:
6188 if (do_dynamic)
6190 printf (_("Flags:"));
6191 if (entry->d_un.d_val == 0)
6192 printf (_(" None\n"));
6193 else
6195 unsigned long int val = entry->d_un.d_val;
6197 if (val & DF_1_NOW)
6199 printf (" NOW");
6200 val ^= DF_1_NOW;
6202 if (val & DF_1_GLOBAL)
6204 printf (" GLOBAL");
6205 val ^= DF_1_GLOBAL;
6207 if (val & DF_1_GROUP)
6209 printf (" GROUP");
6210 val ^= DF_1_GROUP;
6212 if (val & DF_1_NODELETE)
6214 printf (" NODELETE");
6215 val ^= DF_1_NODELETE;
6217 if (val & DF_1_LOADFLTR)
6219 printf (" LOADFLTR");
6220 val ^= DF_1_LOADFLTR;
6222 if (val & DF_1_INITFIRST)
6224 printf (" INITFIRST");
6225 val ^= DF_1_INITFIRST;
6227 if (val & DF_1_NOOPEN)
6229 printf (" NOOPEN");
6230 val ^= DF_1_NOOPEN;
6232 if (val & DF_1_ORIGIN)
6234 printf (" ORIGIN");
6235 val ^= DF_1_ORIGIN;
6237 if (val & DF_1_DIRECT)
6239 printf (" DIRECT");
6240 val ^= DF_1_DIRECT;
6242 if (val & DF_1_TRANS)
6244 printf (" TRANS");
6245 val ^= DF_1_TRANS;
6247 if (val & DF_1_INTERPOSE)
6249 printf (" INTERPOSE");
6250 val ^= DF_1_INTERPOSE;
6252 if (val & DF_1_NODEFLIB)
6254 printf (" NODEFLIB");
6255 val ^= DF_1_NODEFLIB;
6257 if (val & DF_1_NODUMP)
6259 printf (" NODUMP");
6260 val ^= DF_1_NODUMP;
6262 if (val & DF_1_CONLFAT)
6264 printf (" CONLFAT");
6265 val ^= DF_1_CONLFAT;
6267 if (val != 0)
6268 printf (" %lx", val);
6269 puts ("");
6272 break;
6274 case DT_PLTREL:
6275 dynamic_info[entry->d_tag] = entry->d_un.d_val;
6276 if (do_dynamic)
6277 puts (get_dynamic_type (entry->d_un.d_val));
6278 break;
6280 case DT_NULL :
6281 case DT_NEEDED :
6282 case DT_PLTGOT :
6283 case DT_HASH :
6284 case DT_STRTAB :
6285 case DT_SYMTAB :
6286 case DT_RELA :
6287 case DT_INIT :
6288 case DT_FINI :
6289 case DT_SONAME :
6290 case DT_RPATH :
6291 case DT_SYMBOLIC:
6292 case DT_REL :
6293 case DT_DEBUG :
6294 case DT_TEXTREL :
6295 case DT_JMPREL :
6296 case DT_RUNPATH :
6297 dynamic_info[entry->d_tag] = entry->d_un.d_val;
6299 if (do_dynamic)
6301 char *name;
6303 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
6304 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
6305 else
6306 name = NULL;
6308 if (name)
6310 switch (entry->d_tag)
6312 case DT_NEEDED:
6313 printf (_("Shared library: [%s]"), name);
6315 if (streq (name, program_interpreter))
6316 printf (_(" program interpreter"));
6317 break;
6319 case DT_SONAME:
6320 printf (_("Library soname: [%s]"), name);
6321 break;
6323 case DT_RPATH:
6324 printf (_("Library rpath: [%s]"), name);
6325 break;
6327 case DT_RUNPATH:
6328 printf (_("Library runpath: [%s]"), name);
6329 break;
6331 default:
6332 print_vma (entry->d_un.d_val, PREFIX_HEX);
6333 break;
6336 else
6337 print_vma (entry->d_un.d_val, PREFIX_HEX);
6339 putchar ('\n');
6341 break;
6343 case DT_PLTRELSZ:
6344 case DT_RELASZ :
6345 case DT_STRSZ :
6346 case DT_RELSZ :
6347 case DT_RELAENT :
6348 case DT_SYMENT :
6349 case DT_RELENT :
6350 dynamic_info[entry->d_tag] = entry->d_un.d_val;
6351 case DT_PLTPADSZ:
6352 case DT_MOVEENT :
6353 case DT_MOVESZ :
6354 case DT_INIT_ARRAYSZ:
6355 case DT_FINI_ARRAYSZ:
6356 case DT_GNU_CONFLICTSZ:
6357 case DT_GNU_LIBLISTSZ:
6358 if (do_dynamic)
6360 print_vma (entry->d_un.d_val, UNSIGNED);
6361 printf (" (bytes)\n");
6363 break;
6365 case DT_VERDEFNUM:
6366 case DT_VERNEEDNUM:
6367 case DT_RELACOUNT:
6368 case DT_RELCOUNT:
6369 if (do_dynamic)
6371 print_vma (entry->d_un.d_val, UNSIGNED);
6372 putchar ('\n');
6374 break;
6376 case DT_SYMINSZ:
6377 case DT_SYMINENT:
6378 case DT_SYMINFO:
6379 case DT_USED:
6380 case DT_INIT_ARRAY:
6381 case DT_FINI_ARRAY:
6382 if (do_dynamic)
6384 if (entry->d_tag == DT_USED
6385 && VALID_DYNAMIC_NAME (entry->d_un.d_val))
6387 char *name = GET_DYNAMIC_NAME (entry->d_un.d_val);
6389 if (*name)
6391 printf (_("Not needed object: [%s]\n"), name);
6392 break;
6396 print_vma (entry->d_un.d_val, PREFIX_HEX);
6397 putchar ('\n');
6399 break;
6401 case DT_BIND_NOW:
6402 /* The value of this entry is ignored. */
6403 if (do_dynamic)
6404 putchar ('\n');
6405 break;
6407 case DT_GNU_PRELINKED:
6408 if (do_dynamic)
6410 struct tm *tmp;
6411 time_t time = entry->d_un.d_val;
6413 tmp = gmtime (&time);
6414 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
6415 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
6416 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
6419 break;
6421 case DT_GNU_HASH:
6422 dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
6423 if (do_dynamic)
6425 print_vma (entry->d_un.d_val, PREFIX_HEX);
6426 putchar ('\n');
6428 break;
6430 default:
6431 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
6432 version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
6433 entry->d_un.d_val;
6435 if (do_dynamic)
6437 switch (elf_header.e_machine)
6439 case EM_MIPS:
6440 case EM_MIPS_RS3_LE:
6441 dynamic_section_mips_val (entry);
6442 break;
6443 case EM_PARISC:
6444 dynamic_section_parisc_val (entry);
6445 break;
6446 case EM_IA_64:
6447 dynamic_section_ia64_val (entry);
6448 break;
6449 default:
6450 print_vma (entry->d_un.d_val, PREFIX_HEX);
6451 putchar ('\n');
6454 break;
6458 return 1;
6461 static char *
6462 get_ver_flags (unsigned int flags)
6464 static char buff[32];
6466 buff[0] = 0;
6468 if (flags == 0)
6469 return _("none");
6471 if (flags & VER_FLG_BASE)
6472 strcat (buff, "BASE ");
6474 if (flags & VER_FLG_WEAK)
6476 if (flags & VER_FLG_BASE)
6477 strcat (buff, "| ");
6479 strcat (buff, "WEAK ");
6482 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK))
6483 strcat (buff, "| <unknown>");
6485 return buff;
6488 /* Display the contents of the version sections. */
6489 static int
6490 process_version_sections (FILE *file)
6492 Elf_Internal_Shdr *section;
6493 unsigned i;
6494 int found = 0;
6496 if (! do_version)
6497 return 1;
6499 for (i = 0, section = section_headers;
6500 i < elf_header.e_shnum;
6501 i++, section++)
6503 switch (section->sh_type)
6505 case SHT_GNU_verdef:
6507 Elf_External_Verdef *edefs;
6508 unsigned int idx;
6509 unsigned int cnt;
6510 char *endbuf;
6512 found = 1;
6514 printf
6515 (_("\nVersion definition section '%s' contains %u entries:\n"),
6516 SECTION_NAME (section), section->sh_info);
6518 printf (_(" Addr: 0x"));
6519 printf_vma (section->sh_addr);
6520 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
6521 (unsigned long) section->sh_offset, section->sh_link,
6522 section->sh_link < elf_header.e_shnum
6523 ? SECTION_NAME (section_headers + section->sh_link)
6524 : "<corrupt>");
6526 edefs = get_data (NULL, file, section->sh_offset, 1,
6527 section->sh_size,
6528 _("version definition section"));
6529 endbuf = (char *) edefs + section->sh_size;
6530 if (!edefs)
6531 break;
6533 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
6535 char *vstart;
6536 Elf_External_Verdef *edef;
6537 Elf_Internal_Verdef ent;
6538 Elf_External_Verdaux *eaux;
6539 Elf_Internal_Verdaux aux;
6540 int j;
6541 int isum;
6543 vstart = ((char *) edefs) + idx;
6544 if (vstart + sizeof (*edef) > endbuf)
6545 break;
6547 edef = (Elf_External_Verdef *) vstart;
6549 ent.vd_version = BYTE_GET (edef->vd_version);
6550 ent.vd_flags = BYTE_GET (edef->vd_flags);
6551 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
6552 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
6553 ent.vd_hash = BYTE_GET (edef->vd_hash);
6554 ent.vd_aux = BYTE_GET (edef->vd_aux);
6555 ent.vd_next = BYTE_GET (edef->vd_next);
6557 printf (_(" %#06x: Rev: %d Flags: %s"),
6558 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
6560 printf (_(" Index: %d Cnt: %d "),
6561 ent.vd_ndx, ent.vd_cnt);
6563 vstart += ent.vd_aux;
6565 eaux = (Elf_External_Verdaux *) vstart;
6567 aux.vda_name = BYTE_GET (eaux->vda_name);
6568 aux.vda_next = BYTE_GET (eaux->vda_next);
6570 if (VALID_DYNAMIC_NAME (aux.vda_name))
6571 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
6572 else
6573 printf (_("Name index: %ld\n"), aux.vda_name);
6575 isum = idx + ent.vd_aux;
6577 for (j = 1; j < ent.vd_cnt; j++)
6579 isum += aux.vda_next;
6580 vstart += aux.vda_next;
6582 eaux = (Elf_External_Verdaux *) vstart;
6583 if (vstart + sizeof (*eaux) > endbuf)
6584 break;
6586 aux.vda_name = BYTE_GET (eaux->vda_name);
6587 aux.vda_next = BYTE_GET (eaux->vda_next);
6589 if (VALID_DYNAMIC_NAME (aux.vda_name))
6590 printf (_(" %#06x: Parent %d: %s\n"),
6591 isum, j, GET_DYNAMIC_NAME (aux.vda_name));
6592 else
6593 printf (_(" %#06x: Parent %d, name index: %ld\n"),
6594 isum, j, aux.vda_name);
6596 if (j < ent.vd_cnt)
6597 printf (_(" Version def aux past end of section\n"));
6599 idx += ent.vd_next;
6601 if (cnt < section->sh_info)
6602 printf (_(" Version definition past end of section\n"));
6604 free (edefs);
6606 break;
6608 case SHT_GNU_verneed:
6610 Elf_External_Verneed *eneed;
6611 unsigned int idx;
6612 unsigned int cnt;
6613 char *endbuf;
6615 found = 1;
6617 printf (_("\nVersion needs section '%s' contains %u entries:\n"),
6618 SECTION_NAME (section), section->sh_info);
6620 printf (_(" Addr: 0x"));
6621 printf_vma (section->sh_addr);
6622 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
6623 (unsigned long) section->sh_offset, section->sh_link,
6624 section->sh_link < elf_header.e_shnum
6625 ? SECTION_NAME (section_headers + section->sh_link)
6626 : "<corrupt>");
6628 eneed = get_data (NULL, file, section->sh_offset, 1,
6629 section->sh_size,
6630 _("version need section"));
6631 endbuf = (char *) eneed + section->sh_size;
6632 if (!eneed)
6633 break;
6635 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
6637 Elf_External_Verneed *entry;
6638 Elf_Internal_Verneed ent;
6639 int j;
6640 int isum;
6641 char *vstart;
6643 vstart = ((char *) eneed) + idx;
6644 if (vstart + sizeof (*entry) > endbuf)
6645 break;
6647 entry = (Elf_External_Verneed *) vstart;
6649 ent.vn_version = BYTE_GET (entry->vn_version);
6650 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
6651 ent.vn_file = BYTE_GET (entry->vn_file);
6652 ent.vn_aux = BYTE_GET (entry->vn_aux);
6653 ent.vn_next = BYTE_GET (entry->vn_next);
6655 printf (_(" %#06x: Version: %d"), idx, ent.vn_version);
6657 if (VALID_DYNAMIC_NAME (ent.vn_file))
6658 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
6659 else
6660 printf (_(" File: %lx"), ent.vn_file);
6662 printf (_(" Cnt: %d\n"), ent.vn_cnt);
6664 vstart += ent.vn_aux;
6666 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
6668 Elf_External_Vernaux *eaux;
6669 Elf_Internal_Vernaux aux;
6671 if (vstart + sizeof (*eaux) > endbuf)
6672 break;
6673 eaux = (Elf_External_Vernaux *) vstart;
6675 aux.vna_hash = BYTE_GET (eaux->vna_hash);
6676 aux.vna_flags = BYTE_GET (eaux->vna_flags);
6677 aux.vna_other = BYTE_GET (eaux->vna_other);
6678 aux.vna_name = BYTE_GET (eaux->vna_name);
6679 aux.vna_next = BYTE_GET (eaux->vna_next);
6681 if (VALID_DYNAMIC_NAME (aux.vna_name))
6682 printf (_(" %#06x: Name: %s"),
6683 isum, GET_DYNAMIC_NAME (aux.vna_name));
6684 else
6685 printf (_(" %#06x: Name index: %lx"),
6686 isum, aux.vna_name);
6688 printf (_(" Flags: %s Version: %d\n"),
6689 get_ver_flags (aux.vna_flags), aux.vna_other);
6691 isum += aux.vna_next;
6692 vstart += aux.vna_next;
6694 if (j < ent.vn_cnt)
6695 printf (_(" Version need aux past end of section\n"));
6697 idx += ent.vn_next;
6699 if (cnt < section->sh_info)
6700 printf (_(" Version need past end of section\n"));
6702 free (eneed);
6704 break;
6706 case SHT_GNU_versym:
6708 Elf_Internal_Shdr *link_section;
6709 int total;
6710 int cnt;
6711 unsigned char *edata;
6712 unsigned short *data;
6713 char *strtab;
6714 Elf_Internal_Sym *symbols;
6715 Elf_Internal_Shdr *string_sec;
6716 long off;
6718 if (section->sh_link >= elf_header.e_shnum)
6719 break;
6721 link_section = section_headers + section->sh_link;
6722 total = section->sh_size / sizeof (Elf_External_Versym);
6724 if (link_section->sh_link >= elf_header.e_shnum)
6725 break;
6727 found = 1;
6729 symbols = GET_ELF_SYMBOLS (file, link_section);
6731 string_sec = section_headers + link_section->sh_link;
6733 strtab = get_data (NULL, file, string_sec->sh_offset, 1,
6734 string_sec->sh_size, _("version string table"));
6735 if (!strtab)
6736 break;
6738 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
6739 SECTION_NAME (section), total);
6741 printf (_(" Addr: "));
6742 printf_vma (section->sh_addr);
6743 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
6744 (unsigned long) section->sh_offset, section->sh_link,
6745 SECTION_NAME (link_section));
6747 off = offset_from_vma (file,
6748 version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
6749 total * sizeof (short));
6750 edata = get_data (NULL, file, off, total, sizeof (short),
6751 _("version symbol data"));
6752 if (!edata)
6754 free (strtab);
6755 break;
6758 data = cmalloc (total, sizeof (short));
6760 for (cnt = total; cnt --;)
6761 data[cnt] = byte_get (edata + cnt * sizeof (short),
6762 sizeof (short));
6764 free (edata);
6766 for (cnt = 0; cnt < total; cnt += 4)
6768 int j, nn;
6769 int check_def, check_need;
6770 char *name;
6772 printf (" %03x:", cnt);
6774 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
6775 switch (data[cnt + j])
6777 case 0:
6778 fputs (_(" 0 (*local*) "), stdout);
6779 break;
6781 case 1:
6782 fputs (_(" 1 (*global*) "), stdout);
6783 break;
6785 default:
6786 nn = printf ("%4x%c", data[cnt + j] & 0x7fff,
6787 data[cnt + j] & 0x8000 ? 'h' : ' ');
6789 check_def = 1;
6790 check_need = 1;
6791 if (symbols[cnt + j].st_shndx >= elf_header.e_shnum
6792 || section_headers[symbols[cnt + j].st_shndx].sh_type
6793 != SHT_NOBITS)
6795 if (symbols[cnt + j].st_shndx == SHN_UNDEF)
6796 check_def = 0;
6797 else
6798 check_need = 0;
6801 if (check_need
6802 && version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
6804 Elf_Internal_Verneed ivn;
6805 unsigned long offset;
6807 offset = offset_from_vma
6808 (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
6809 sizeof (Elf_External_Verneed));
6813 Elf_Internal_Vernaux ivna;
6814 Elf_External_Verneed evn;
6815 Elf_External_Vernaux evna;
6816 unsigned long a_off;
6818 get_data (&evn, file, offset, sizeof (evn), 1,
6819 _("version need"));
6821 ivn.vn_aux = BYTE_GET (evn.vn_aux);
6822 ivn.vn_next = BYTE_GET (evn.vn_next);
6824 a_off = offset + ivn.vn_aux;
6828 get_data (&evna, file, a_off, sizeof (evna),
6829 1, _("version need aux (2)"));
6831 ivna.vna_next = BYTE_GET (evna.vna_next);
6832 ivna.vna_other = BYTE_GET (evna.vna_other);
6834 a_off += ivna.vna_next;
6836 while (ivna.vna_other != data[cnt + j]
6837 && ivna.vna_next != 0);
6839 if (ivna.vna_other == data[cnt + j])
6841 ivna.vna_name = BYTE_GET (evna.vna_name);
6843 if (ivna.vna_name >= string_sec->sh_size)
6844 name = _("*invalid*");
6845 else
6846 name = strtab + ivna.vna_name;
6847 nn += printf ("(%s%-*s",
6848 name,
6849 12 - (int) strlen (name),
6850 ")");
6851 check_def = 0;
6852 break;
6855 offset += ivn.vn_next;
6857 while (ivn.vn_next);
6860 if (check_def && data[cnt + j] != 0x8001
6861 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
6863 Elf_Internal_Verdef ivd;
6864 Elf_External_Verdef evd;
6865 unsigned long offset;
6867 offset = offset_from_vma
6868 (file, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
6869 sizeof evd);
6873 get_data (&evd, file, offset, sizeof (evd), 1,
6874 _("version def"));
6876 ivd.vd_next = BYTE_GET (evd.vd_next);
6877 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
6879 offset += ivd.vd_next;
6881 while (ivd.vd_ndx != (data[cnt + j] & 0x7fff)
6882 && ivd.vd_next != 0);
6884 if (ivd.vd_ndx == (data[cnt + j] & 0x7fff))
6886 Elf_External_Verdaux evda;
6887 Elf_Internal_Verdaux ivda;
6889 ivd.vd_aux = BYTE_GET (evd.vd_aux);
6891 get_data (&evda, file,
6892 offset - ivd.vd_next + ivd.vd_aux,
6893 sizeof (evda), 1,
6894 _("version def aux"));
6896 ivda.vda_name = BYTE_GET (evda.vda_name);
6898 if (ivda.vda_name >= string_sec->sh_size)
6899 name = _("*invalid*");
6900 else
6901 name = strtab + ivda.vda_name;
6902 nn += printf ("(%s%-*s",
6903 name,
6904 12 - (int) strlen (name),
6905 ")");
6909 if (nn < 18)
6910 printf ("%*c", 18 - nn, ' ');
6913 putchar ('\n');
6916 free (data);
6917 free (strtab);
6918 free (symbols);
6920 break;
6922 default:
6923 break;
6927 if (! found)
6928 printf (_("\nNo version information found in this file.\n"));
6930 return 1;
6933 static const char *
6934 get_symbol_binding (unsigned int binding)
6936 static char buff[32];
6938 switch (binding)
6940 case STB_LOCAL: return "LOCAL";
6941 case STB_GLOBAL: return "GLOBAL";
6942 case STB_WEAK: return "WEAK";
6943 default:
6944 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
6945 snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
6946 binding);
6947 else if (binding >= STB_LOOS && binding <= STB_HIOS)
6948 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
6949 else
6950 snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
6951 return buff;
6955 static const char *
6956 get_symbol_type (unsigned int type)
6958 static char buff[32];
6960 switch (type)
6962 case STT_NOTYPE: return "NOTYPE";
6963 case STT_OBJECT: return "OBJECT";
6964 case STT_FUNC: return "FUNC";
6965 case STT_SECTION: return "SECTION";
6966 case STT_FILE: return "FILE";
6967 case STT_COMMON: return "COMMON";
6968 case STT_TLS: return "TLS";
6969 case STT_RELC: return "RELC";
6970 case STT_SRELC: return "SRELC";
6971 default:
6972 if (type >= STT_LOPROC && type <= STT_HIPROC)
6974 if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
6975 return "THUMB_FUNC";
6977 if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
6978 return "REGISTER";
6980 if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
6981 return "PARISC_MILLI";
6983 snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
6985 else if (type >= STT_LOOS && type <= STT_HIOS)
6987 if (elf_header.e_machine == EM_PARISC)
6989 if (type == STT_HP_OPAQUE)
6990 return "HP_OPAQUE";
6991 if (type == STT_HP_STUB)
6992 return "HP_STUB";
6995 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
6997 else
6998 snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
6999 return buff;
7003 static const char *
7004 get_symbol_visibility (unsigned int visibility)
7006 switch (visibility)
7008 case STV_DEFAULT: return "DEFAULT";
7009 case STV_INTERNAL: return "INTERNAL";
7010 case STV_HIDDEN: return "HIDDEN";
7011 case STV_PROTECTED: return "PROTECTED";
7012 default: abort ();
7016 static const char *
7017 get_mips_symbol_other (unsigned int other)
7019 switch (other)
7021 case STO_OPTIONAL: return "OPTIONAL";
7022 case STO_MIPS16: return "MIPS16";
7023 default: return NULL;
7027 static const char *
7028 get_symbol_other (unsigned int other)
7030 const char * result = NULL;
7031 static char buff [32];
7033 if (other == 0)
7034 return "";
7036 switch (elf_header.e_machine)
7038 case EM_MIPS:
7039 result = get_mips_symbol_other (other);
7040 default:
7041 break;
7044 if (result)
7045 return result;
7047 snprintf (buff, sizeof buff, _("<other>: %x"), other);
7048 return buff;
7051 static const char *
7052 get_symbol_index_type (unsigned int type)
7054 static char buff[32];
7056 switch (type)
7058 case SHN_UNDEF: return "UND";
7059 case SHN_ABS: return "ABS";
7060 case SHN_COMMON: return "COM";
7061 default:
7062 if (type == SHN_IA_64_ANSI_COMMON
7063 && elf_header.e_machine == EM_IA_64
7064 && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
7065 return "ANSI_COM";
7066 else if (elf_header.e_machine == EM_X86_64
7067 && type == SHN_X86_64_LCOMMON)
7068 return "LARGE_COM";
7069 else if (type == SHN_MIPS_SCOMMON
7070 && elf_header.e_machine == EM_MIPS)
7071 return "SCOM";
7072 else if (type == SHN_MIPS_SUNDEFINED
7073 && elf_header.e_machine == EM_MIPS)
7074 return "SUND";
7075 else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
7076 sprintf (buff, "PRC[0x%04x]", type & 0xffff);
7077 else if (type >= SHN_LOOS && type <= SHN_HIOS)
7078 sprintf (buff, "OS [0x%04x]", type & 0xffff);
7079 else if (type >= SHN_LORESERVE)
7080 sprintf (buff, "RSV[0x%04x]", type & 0xffff);
7081 else
7082 sprintf (buff, "%3d", type);
7083 break;
7086 return buff;
7089 static bfd_vma *
7090 get_dynamic_data (FILE *file, unsigned int number, unsigned int ent_size)
7092 unsigned char *e_data;
7093 bfd_vma *i_data;
7095 e_data = cmalloc (number, ent_size);
7097 if (e_data == NULL)
7099 error (_("Out of memory\n"));
7100 return NULL;
7103 if (fread (e_data, ent_size, number, file) != number)
7105 error (_("Unable to read in dynamic data\n"));
7106 return NULL;
7109 i_data = cmalloc (number, sizeof (*i_data));
7111 if (i_data == NULL)
7113 error (_("Out of memory\n"));
7114 free (e_data);
7115 return NULL;
7118 while (number--)
7119 i_data[number] = byte_get (e_data + number * ent_size, ent_size);
7121 free (e_data);
7123 return i_data;
7126 static void
7127 print_dynamic_symbol (bfd_vma si, unsigned long hn)
7129 Elf_Internal_Sym *psym;
7130 int n;
7132 psym = dynamic_symbols + si;
7134 n = print_vma (si, DEC_5);
7135 if (n < 5)
7136 fputs (" " + n, stdout);
7137 printf (" %3lu: ", hn);
7138 print_vma (psym->st_value, LONG_HEX);
7139 putchar (' ');
7140 print_vma (psym->st_size, DEC_5);
7142 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
7143 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
7144 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
7145 /* Check to see if any other bits in the st_other field are set.
7146 Note - displaying this information disrupts the layout of the
7147 table being generated, but for the moment this case is very
7148 rare. */
7149 if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
7150 printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
7151 printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
7152 if (VALID_DYNAMIC_NAME (psym->st_name))
7153 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
7154 else
7155 printf (" <corrupt: %14ld>", psym->st_name);
7156 putchar ('\n');
7159 /* Dump the symbol table. */
7160 static int
7161 process_symbol_table (FILE *file)
7163 Elf_Internal_Shdr *section;
7164 bfd_vma nbuckets = 0;
7165 bfd_vma nchains = 0;
7166 bfd_vma *buckets = NULL;
7167 bfd_vma *chains = NULL;
7168 bfd_vma ngnubuckets = 0;
7169 bfd_vma *gnubuckets = NULL;
7170 bfd_vma *gnuchains = NULL;
7171 bfd_vma gnusymidx = 0;
7173 if (! do_syms && !do_histogram)
7174 return 1;
7176 if (dynamic_info[DT_HASH]
7177 && (do_histogram
7178 || (do_using_dynamic && dynamic_strings != NULL)))
7180 unsigned char nb[8];
7181 unsigned char nc[8];
7182 int hash_ent_size = 4;
7184 if ((elf_header.e_machine == EM_ALPHA
7185 || elf_header.e_machine == EM_S390
7186 || elf_header.e_machine == EM_S390_OLD)
7187 && elf_header.e_ident[EI_CLASS] == ELFCLASS64)
7188 hash_ent_size = 8;
7190 if (fseek (file,
7191 (archive_file_offset
7192 + offset_from_vma (file, dynamic_info[DT_HASH],
7193 sizeof nb + sizeof nc)),
7194 SEEK_SET))
7196 error (_("Unable to seek to start of dynamic information\n"));
7197 return 0;
7200 if (fread (nb, hash_ent_size, 1, file) != 1)
7202 error (_("Failed to read in number of buckets\n"));
7203 return 0;
7206 if (fread (nc, hash_ent_size, 1, file) != 1)
7208 error (_("Failed to read in number of chains\n"));
7209 return 0;
7212 nbuckets = byte_get (nb, hash_ent_size);
7213 nchains = byte_get (nc, hash_ent_size);
7215 buckets = get_dynamic_data (file, nbuckets, hash_ent_size);
7216 chains = get_dynamic_data (file, nchains, hash_ent_size);
7218 if (buckets == NULL || chains == NULL)
7219 return 0;
7222 if (dynamic_info_DT_GNU_HASH
7223 && (do_histogram
7224 || (do_using_dynamic && dynamic_strings != NULL)))
7226 unsigned char nb[16];
7227 bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
7228 bfd_vma buckets_vma;
7230 if (fseek (file,
7231 (archive_file_offset
7232 + offset_from_vma (file, dynamic_info_DT_GNU_HASH,
7233 sizeof nb)),
7234 SEEK_SET))
7236 error (_("Unable to seek to start of dynamic information\n"));
7237 return 0;
7240 if (fread (nb, 16, 1, file) != 1)
7242 error (_("Failed to read in number of buckets\n"));
7243 return 0;
7246 ngnubuckets = byte_get (nb, 4);
7247 gnusymidx = byte_get (nb + 4, 4);
7248 bitmaskwords = byte_get (nb + 8, 4);
7249 buckets_vma = dynamic_info_DT_GNU_HASH + 16;
7250 if (is_32bit_elf)
7251 buckets_vma += bitmaskwords * 4;
7252 else
7253 buckets_vma += bitmaskwords * 8;
7255 if (fseek (file,
7256 (archive_file_offset
7257 + offset_from_vma (file, buckets_vma, 4)),
7258 SEEK_SET))
7260 error (_("Unable to seek to start of dynamic information\n"));
7261 return 0;
7264 gnubuckets = get_dynamic_data (file, ngnubuckets, 4);
7266 if (gnubuckets == NULL)
7267 return 0;
7269 for (i = 0; i < ngnubuckets; i++)
7270 if (gnubuckets[i] != 0)
7272 if (gnubuckets[i] < gnusymidx)
7273 return 0;
7275 if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
7276 maxchain = gnubuckets[i];
7279 if (maxchain == 0xffffffff)
7280 return 0;
7282 maxchain -= gnusymidx;
7284 if (fseek (file,
7285 (archive_file_offset
7286 + offset_from_vma (file, buckets_vma
7287 + 4 * (ngnubuckets + maxchain), 4)),
7288 SEEK_SET))
7290 error (_("Unable to seek to start of dynamic information\n"));
7291 return 0;
7296 if (fread (nb, 4, 1, file) != 1)
7298 error (_("Failed to determine last chain length\n"));
7299 return 0;
7302 if (maxchain + 1 == 0)
7303 return 0;
7305 ++maxchain;
7307 while ((byte_get (nb, 4) & 1) == 0);
7309 if (fseek (file,
7310 (archive_file_offset
7311 + offset_from_vma (file, buckets_vma + 4 * ngnubuckets, 4)),
7312 SEEK_SET))
7314 error (_("Unable to seek to start of dynamic information\n"));
7315 return 0;
7318 gnuchains = get_dynamic_data (file, maxchain, 4);
7320 if (gnuchains == NULL)
7321 return 0;
7324 if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
7325 && do_syms
7326 && do_using_dynamic
7327 && dynamic_strings != NULL)
7329 unsigned long hn;
7331 if (dynamic_info[DT_HASH])
7333 bfd_vma si;
7335 printf (_("\nSymbol table for image:\n"));
7336 if (is_32bit_elf)
7337 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
7338 else
7339 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
7341 for (hn = 0; hn < nbuckets; hn++)
7343 if (! buckets[hn])
7344 continue;
7346 for (si = buckets[hn]; si < nchains && si > 0; si = chains[si])
7347 print_dynamic_symbol (si, hn);
7351 if (dynamic_info_DT_GNU_HASH)
7353 printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
7354 if (is_32bit_elf)
7355 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
7356 else
7357 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
7359 for (hn = 0; hn < ngnubuckets; ++hn)
7360 if (gnubuckets[hn] != 0)
7362 bfd_vma si = gnubuckets[hn];
7363 bfd_vma off = si - gnusymidx;
7367 print_dynamic_symbol (si, hn);
7368 si++;
7370 while ((gnuchains[off++] & 1) == 0);
7374 else if (do_syms && !do_using_dynamic)
7376 unsigned int i;
7378 for (i = 0, section = section_headers;
7379 i < elf_header.e_shnum;
7380 i++, section++)
7382 unsigned int si;
7383 char *strtab = NULL;
7384 unsigned long int strtab_size = 0;
7385 Elf_Internal_Sym *symtab;
7386 Elf_Internal_Sym *psym;
7389 if ( section->sh_type != SHT_SYMTAB
7390 && section->sh_type != SHT_DYNSYM)
7391 continue;
7393 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
7394 SECTION_NAME (section),
7395 (unsigned long) (section->sh_size / section->sh_entsize));
7396 if (is_32bit_elf)
7397 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
7398 else
7399 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
7401 symtab = GET_ELF_SYMBOLS (file, section);
7402 if (symtab == NULL)
7403 continue;
7405 if (section->sh_link == elf_header.e_shstrndx)
7407 strtab = string_table;
7408 strtab_size = string_table_length;
7410 else if (section->sh_link < elf_header.e_shnum)
7412 Elf_Internal_Shdr *string_sec;
7414 string_sec = section_headers + section->sh_link;
7416 strtab = get_data (NULL, file, string_sec->sh_offset,
7417 1, string_sec->sh_size, _("string table"));
7418 strtab_size = strtab != NULL ? string_sec->sh_size : 0;
7421 for (si = 0, psym = symtab;
7422 si < section->sh_size / section->sh_entsize;
7423 si++, psym++)
7425 printf ("%6d: ", si);
7426 print_vma (psym->st_value, LONG_HEX);
7427 putchar (' ');
7428 print_vma (psym->st_size, DEC_5);
7429 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
7430 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
7431 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
7432 /* Check to see if any other bits in the st_other field are set.
7433 Note - displaying this information disrupts the layout of the
7434 table being generated, but for the moment this case is very rare. */
7435 if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
7436 printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
7437 printf (" %4s ", get_symbol_index_type (psym->st_shndx));
7438 print_symbol (25, psym->st_name < strtab_size
7439 ? strtab + psym->st_name : "<corrupt>");
7441 if (section->sh_type == SHT_DYNSYM &&
7442 version_info[DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
7444 unsigned char data[2];
7445 unsigned short vers_data;
7446 unsigned long offset;
7447 int is_nobits;
7448 int check_def;
7450 offset = offset_from_vma
7451 (file, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
7452 sizeof data + si * sizeof (vers_data));
7454 get_data (&data, file, offset + si * sizeof (vers_data),
7455 sizeof (data), 1, _("version data"));
7457 vers_data = byte_get (data, 2);
7459 is_nobits = (psym->st_shndx < elf_header.e_shnum
7460 && section_headers[psym->st_shndx].sh_type
7461 == SHT_NOBITS);
7463 check_def = (psym->st_shndx != SHN_UNDEF);
7465 if ((vers_data & 0x8000) || vers_data > 1)
7467 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)]
7468 && (is_nobits || ! check_def))
7470 Elf_External_Verneed evn;
7471 Elf_Internal_Verneed ivn;
7472 Elf_Internal_Vernaux ivna;
7474 /* We must test both. */
7475 offset = offset_from_vma
7476 (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
7477 sizeof evn);
7481 unsigned long vna_off;
7483 get_data (&evn, file, offset, sizeof (evn), 1,
7484 _("version need"));
7486 ivn.vn_aux = BYTE_GET (evn.vn_aux);
7487 ivn.vn_next = BYTE_GET (evn.vn_next);
7489 vna_off = offset + ivn.vn_aux;
7493 Elf_External_Vernaux evna;
7495 get_data (&evna, file, vna_off,
7496 sizeof (evna), 1,
7497 _("version need aux (3)"));
7499 ivna.vna_other = BYTE_GET (evna.vna_other);
7500 ivna.vna_next = BYTE_GET (evna.vna_next);
7501 ivna.vna_name = BYTE_GET (evna.vna_name);
7503 vna_off += ivna.vna_next;
7505 while (ivna.vna_other != vers_data
7506 && ivna.vna_next != 0);
7508 if (ivna.vna_other == vers_data)
7509 break;
7511 offset += ivn.vn_next;
7513 while (ivn.vn_next != 0);
7515 if (ivna.vna_other == vers_data)
7517 printf ("@%s (%d)",
7518 ivna.vna_name < strtab_size
7519 ? strtab + ivna.vna_name : "<corrupt>",
7520 ivna.vna_other);
7521 check_def = 0;
7523 else if (! is_nobits)
7524 error (_("bad dynamic symbol\n"));
7525 else
7526 check_def = 1;
7529 if (check_def)
7531 if (vers_data != 0x8001
7532 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
7534 Elf_Internal_Verdef ivd;
7535 Elf_Internal_Verdaux ivda;
7536 Elf_External_Verdaux evda;
7537 unsigned long offset;
7539 offset = offset_from_vma
7540 (file,
7541 version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
7542 sizeof (Elf_External_Verdef));
7546 Elf_External_Verdef evd;
7548 get_data (&evd, file, offset, sizeof (evd),
7549 1, _("version def"));
7551 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
7552 ivd.vd_aux = BYTE_GET (evd.vd_aux);
7553 ivd.vd_next = BYTE_GET (evd.vd_next);
7555 offset += ivd.vd_next;
7557 while (ivd.vd_ndx != (vers_data & 0x7fff)
7558 && ivd.vd_next != 0);
7560 offset -= ivd.vd_next;
7561 offset += ivd.vd_aux;
7563 get_data (&evda, file, offset, sizeof (evda),
7564 1, _("version def aux"));
7566 ivda.vda_name = BYTE_GET (evda.vda_name);
7568 if (psym->st_name != ivda.vda_name)
7569 printf ((vers_data & 0x8000)
7570 ? "@%s" : "@@%s",
7571 ivda.vda_name < strtab_size
7572 ? strtab + ivda.vda_name : "<corrupt>");
7578 putchar ('\n');
7581 free (symtab);
7582 if (strtab != string_table)
7583 free (strtab);
7586 else if (do_syms)
7587 printf
7588 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
7590 if (do_histogram && buckets != NULL)
7592 unsigned long *lengths;
7593 unsigned long *counts;
7594 unsigned long hn;
7595 bfd_vma si;
7596 unsigned long maxlength = 0;
7597 unsigned long nzero_counts = 0;
7598 unsigned long nsyms = 0;
7600 printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
7601 (unsigned long) nbuckets);
7602 printf (_(" Length Number %% of total Coverage\n"));
7604 lengths = calloc (nbuckets, sizeof (*lengths));
7605 if (lengths == NULL)
7607 error (_("Out of memory\n"));
7608 return 0;
7610 for (hn = 0; hn < nbuckets; ++hn)
7612 for (si = buckets[hn]; si > 0 && si < nchains; si = chains[si])
7614 ++nsyms;
7615 if (maxlength < ++lengths[hn])
7616 ++maxlength;
7620 counts = calloc (maxlength + 1, sizeof (*counts));
7621 if (counts == NULL)
7623 error (_("Out of memory\n"));
7624 return 0;
7627 for (hn = 0; hn < nbuckets; ++hn)
7628 ++counts[lengths[hn]];
7630 if (nbuckets > 0)
7632 unsigned long i;
7633 printf (" 0 %-10lu (%5.1f%%)\n",
7634 counts[0], (counts[0] * 100.0) / nbuckets);
7635 for (i = 1; i <= maxlength; ++i)
7637 nzero_counts += counts[i] * i;
7638 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
7639 i, counts[i], (counts[i] * 100.0) / nbuckets,
7640 (nzero_counts * 100.0) / nsyms);
7644 free (counts);
7645 free (lengths);
7648 if (buckets != NULL)
7650 free (buckets);
7651 free (chains);
7654 if (do_histogram && dynamic_info_DT_GNU_HASH)
7656 unsigned long *lengths;
7657 unsigned long *counts;
7658 unsigned long hn;
7659 unsigned long maxlength = 0;
7660 unsigned long nzero_counts = 0;
7661 unsigned long nsyms = 0;
7663 lengths = calloc (ngnubuckets, sizeof (*lengths));
7664 if (lengths == NULL)
7666 error (_("Out of memory\n"));
7667 return 0;
7670 printf (_("\nHistogram for `.gnu.hash' bucket list length (total of %lu buckets):\n"),
7671 (unsigned long) ngnubuckets);
7672 printf (_(" Length Number %% of total Coverage\n"));
7674 for (hn = 0; hn < ngnubuckets; ++hn)
7675 if (gnubuckets[hn] != 0)
7677 bfd_vma off, length = 1;
7679 for (off = gnubuckets[hn] - gnusymidx;
7680 (gnuchains[off] & 1) == 0; ++off)
7681 ++length;
7682 lengths[hn] = length;
7683 if (length > maxlength)
7684 maxlength = length;
7685 nsyms += length;
7688 counts = calloc (maxlength + 1, sizeof (*counts));
7689 if (counts == NULL)
7691 error (_("Out of memory\n"));
7692 return 0;
7695 for (hn = 0; hn < ngnubuckets; ++hn)
7696 ++counts[lengths[hn]];
7698 if (ngnubuckets > 0)
7700 unsigned long j;
7701 printf (" 0 %-10lu (%5.1f%%)\n",
7702 counts[0], (counts[0] * 100.0) / ngnubuckets);
7703 for (j = 1; j <= maxlength; ++j)
7705 nzero_counts += counts[j] * j;
7706 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
7707 j, counts[j], (counts[j] * 100.0) / ngnubuckets,
7708 (nzero_counts * 100.0) / nsyms);
7712 free (counts);
7713 free (lengths);
7714 free (gnubuckets);
7715 free (gnuchains);
7718 return 1;
7721 static int
7722 process_syminfo (FILE *file ATTRIBUTE_UNUSED)
7724 unsigned int i;
7726 if (dynamic_syminfo == NULL
7727 || !do_dynamic)
7728 /* No syminfo, this is ok. */
7729 return 1;
7731 /* There better should be a dynamic symbol section. */
7732 if (dynamic_symbols == NULL || dynamic_strings == NULL)
7733 return 0;
7735 if (dynamic_addr)
7736 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
7737 dynamic_syminfo_offset, dynamic_syminfo_nent);
7739 printf (_(" Num: Name BoundTo Flags\n"));
7740 for (i = 0; i < dynamic_syminfo_nent; ++i)
7742 unsigned short int flags = dynamic_syminfo[i].si_flags;
7744 printf ("%4d: ", i);
7745 if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
7746 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
7747 else
7748 printf ("<corrupt: %19ld>", dynamic_symbols[i].st_name);
7749 putchar (' ');
7751 switch (dynamic_syminfo[i].si_boundto)
7753 case SYMINFO_BT_SELF:
7754 fputs ("SELF ", stdout);
7755 break;
7756 case SYMINFO_BT_PARENT:
7757 fputs ("PARENT ", stdout);
7758 break;
7759 default:
7760 if (dynamic_syminfo[i].si_boundto > 0
7761 && dynamic_syminfo[i].si_boundto < dynamic_nent
7762 && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
7764 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
7765 putchar (' ' );
7767 else
7768 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
7769 break;
7772 if (flags & SYMINFO_FLG_DIRECT)
7773 printf (" DIRECT");
7774 if (flags & SYMINFO_FLG_PASSTHRU)
7775 printf (" PASSTHRU");
7776 if (flags & SYMINFO_FLG_COPY)
7777 printf (" COPY");
7778 if (flags & SYMINFO_FLG_LAZYLOAD)
7779 printf (" LAZYLOAD");
7781 puts ("");
7784 return 1;
7787 #ifdef SUPPORT_DISASSEMBLY
7788 static int
7789 disassemble_section (Elf_Internal_Shdr *section, FILE *file)
7791 printf (_("\nAssembly dump of section %s\n"),
7792 SECTION_NAME (section));
7794 /* XXX -- to be done --- XXX */
7796 return 1;
7798 #endif
7800 static int
7801 dump_section_as_strings (Elf_Internal_Shdr *section, FILE *file)
7803 Elf_Internal_Shdr *relsec;
7804 bfd_size_type num_bytes;
7805 bfd_vma addr;
7806 char *data;
7807 char *end;
7808 char *start;
7809 char *name = SECTION_NAME (section);
7810 bfd_boolean some_strings_shown;
7812 num_bytes = section->sh_size;
7814 if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
7816 printf (_("\nSection '%s' has no data to dump.\n"), name);
7817 return 0;
7820 addr = section->sh_addr;
7822 start = get_data (NULL, file, section->sh_offset, 1, num_bytes,
7823 _("section data"));
7824 if (!start)
7825 return 0;
7827 printf (_("\nString dump of section '%s':\n"), name);
7829 /* If the section being dumped has relocations against it the user might
7830 be expecting these relocations to have been applied. Check for this
7831 case and issue a warning message in order to avoid confusion.
7832 FIXME: Maybe we ought to have an option that dumps a section with
7833 relocs applied ? */
7834 for (relsec = section_headers;
7835 relsec < section_headers + elf_header.e_shnum;
7836 ++relsec)
7838 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
7839 || relsec->sh_info >= elf_header.e_shnum
7840 || section_headers + relsec->sh_info != section
7841 || relsec->sh_size == 0
7842 || relsec->sh_link >= elf_header.e_shnum)
7843 continue;
7845 printf (_(" Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
7846 break;
7849 data = start;
7850 end = start + num_bytes;
7851 some_strings_shown = FALSE;
7853 while (data < end)
7855 while (!ISPRINT (* data))
7856 if (++ data >= end)
7857 break;
7859 if (data < end)
7861 #ifndef __MSVCRT__
7862 printf (" [%6tx] %s\n", data - start, data);
7863 #else
7864 printf (" [%6Ix] %s\n", (size_t) (data - start), data);
7865 #endif
7866 data += strlen (data);
7867 some_strings_shown = TRUE;
7871 if (! some_strings_shown)
7872 printf (_(" No strings found in this section."));
7874 free (start);
7876 putchar ('\n');
7877 return 1;
7881 static int
7882 dump_section_as_bytes (Elf_Internal_Shdr *section, FILE *file)
7884 Elf_Internal_Shdr *relsec;
7885 bfd_size_type bytes;
7886 bfd_vma addr;
7887 unsigned char *data;
7888 unsigned char *start;
7890 bytes = section->sh_size;
7892 if (bytes == 0 || section->sh_type == SHT_NOBITS)
7894 printf (_("\nSection '%s' has no data to dump.\n"),
7895 SECTION_NAME (section));
7896 return 0;
7898 else
7899 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section));
7901 addr = section->sh_addr;
7903 start = get_data (NULL, file, section->sh_offset, 1, bytes,
7904 _("section data"));
7905 if (!start)
7906 return 0;
7908 /* If the section being dumped has relocations against it the user might
7909 be expecting these relocations to have been applied. Check for this
7910 case and issue a warning message in order to avoid confusion.
7911 FIXME: Maybe we ought to have an option that dumps a section with
7912 relocs applied ? */
7913 for (relsec = section_headers;
7914 relsec < section_headers + elf_header.e_shnum;
7915 ++relsec)
7917 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
7918 || relsec->sh_info >= elf_header.e_shnum
7919 || section_headers + relsec->sh_info != section
7920 || relsec->sh_size == 0
7921 || relsec->sh_link >= elf_header.e_shnum)
7922 continue;
7924 printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
7925 break;
7928 data = start;
7930 while (bytes)
7932 int j;
7933 int k;
7934 int lbytes;
7936 lbytes = (bytes > 16 ? 16 : bytes);
7938 printf (" 0x%8.8lx ", (unsigned long) addr);
7940 for (j = 0; j < 16; j++)
7942 if (j < lbytes)
7943 printf ("%2.2x", data[j]);
7944 else
7945 printf (" ");
7947 if ((j & 3) == 3)
7948 printf (" ");
7951 for (j = 0; j < lbytes; j++)
7953 k = data[j];
7954 if (k >= ' ' && k < 0x7f)
7955 printf ("%c", k);
7956 else
7957 printf (".");
7960 putchar ('\n');
7962 data += lbytes;
7963 addr += lbytes;
7964 bytes -= lbytes;
7967 free (start);
7969 putchar ('\n');
7970 return 1;
7973 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
7974 DWARF debug sections. This is a target specific test. Note - we do not
7975 go through the whole including-target-headers-multiple-times route, (as
7976 we have already done with <elf/h8.h>) because this would become very
7977 messy and even then this function would have to contain target specific
7978 information (the names of the relocs instead of their numeric values).
7979 FIXME: This is not the correct way to solve this problem. The proper way
7980 is to have target specific reloc sizing and typing functions created by
7981 the reloc-macros.h header, in the same way that it already creates the
7982 reloc naming functions. */
7984 static bfd_boolean
7985 is_32bit_abs_reloc (unsigned int reloc_type)
7987 switch (elf_header.e_machine)
7989 case EM_386:
7990 case EM_486:
7991 return reloc_type == 1; /* R_386_32. */
7992 case EM_68K:
7993 return reloc_type == 1; /* R_68K_32. */
7994 case EM_860:
7995 return reloc_type == 1; /* R_860_32. */
7996 case EM_ALPHA:
7997 return reloc_type == 1; /* XXX Is this right ? */
7998 case EM_ARC:
7999 return reloc_type == 1; /* R_ARC_32. */
8000 case EM_ARM:
8001 return reloc_type == 2; /* R_ARM_ABS32 */
8002 case EM_AVR_OLD:
8003 case EM_AVR:
8004 return reloc_type == 1;
8005 case EM_BLACKFIN:
8006 return reloc_type == 0x12; /* R_byte4_data. */
8007 case EM_CRIS:
8008 return reloc_type == 3; /* R_CRIS_32. */
8009 case EM_CR16:
8010 case EM_CR16_OLD:
8011 return reloc_type == 3; /* R_CR16_NUM32. */
8012 case EM_CRX:
8013 return reloc_type == 15; /* R_CRX_NUM32. */
8014 case EM_CYGNUS_FRV:
8015 return reloc_type == 1;
8016 case EM_CYGNUS_D10V:
8017 case EM_D10V:
8018 return reloc_type == 6; /* R_D10V_32. */
8019 case EM_CYGNUS_D30V:
8020 case EM_D30V:
8021 return reloc_type == 12; /* R_D30V_32_NORMAL. */
8022 case EM_DLX:
8023 return reloc_type == 3; /* R_DLX_RELOC_32. */
8024 case EM_CYGNUS_FR30:
8025 case EM_FR30:
8026 return reloc_type == 3; /* R_FR30_32. */
8027 case EM_H8S:
8028 case EM_H8_300:
8029 case EM_H8_300H:
8030 return reloc_type == 1; /* R_H8_DIR32. */
8031 case EM_IA_64:
8032 return reloc_type == 0x65; /* R_IA64_SECREL32LSB. */
8033 case EM_IP2K_OLD:
8034 case EM_IP2K:
8035 return reloc_type == 2; /* R_IP2K_32. */
8036 case EM_IQ2000:
8037 return reloc_type == 2; /* R_IQ2000_32. */
8038 case EM_M32C_OLD:
8039 case EM_M32C:
8040 return reloc_type == 3; /* R_M32C_32. */
8041 case EM_M32R:
8042 return reloc_type == 34; /* R_M32R_32_RELA. */
8043 case EM_MCORE:
8044 return reloc_type == 1; /* R_MCORE_ADDR32. */
8045 case EM_CYGNUS_MEP:
8046 return reloc_type == 4; /* R_MEP_32. */
8047 case EM_MIPS:
8048 return reloc_type == 2; /* R_MIPS_32. */
8049 case EM_MMIX:
8050 return reloc_type == 4; /* R_MMIX_32. */
8051 case EM_CYGNUS_MN10200:
8052 case EM_MN10200:
8053 return reloc_type == 1; /* R_MN10200_32. */
8054 case EM_CYGNUS_MN10300:
8055 case EM_MN10300:
8056 return reloc_type == 1; /* R_MN10300_32. */
8057 case EM_MSP430_OLD:
8058 case EM_MSP430:
8059 return reloc_type == 1; /* R_MSP43_32. */
8060 case EM_MT:
8061 return reloc_type == 2; /* R_MT_32. */
8062 case EM_ALTERA_NIOS2:
8063 case EM_NIOS32:
8064 return reloc_type == 1; /* R_NIOS_32. */
8065 case EM_OPENRISC:
8066 case EM_OR32:
8067 return reloc_type == 1; /* R_OR32_32. */
8068 case EM_PARISC:
8069 return reloc_type == 1; /* R_PARISC_DIR32. */
8070 case EM_PJ:
8071 case EM_PJ_OLD:
8072 return reloc_type == 1; /* R_PJ_DATA_DIR32. */
8073 case EM_PPC64:
8074 return reloc_type == 1; /* R_PPC64_ADDR32. */
8075 case EM_PPC:
8076 return reloc_type == 1; /* R_PPC_ADDR32. */
8077 case EM_S370:
8078 return reloc_type == 1; /* R_I370_ADDR31. */
8079 case EM_S390_OLD:
8080 case EM_S390:
8081 return reloc_type == 4; /* R_S390_32. */
8082 case EM_SCORE:
8083 return reloc_type == 8; /* R_SCORE_ABS32. */
8084 case EM_SH:
8085 return reloc_type == 1; /* R_SH_DIR32. */
8086 case EM_SPARC32PLUS:
8087 case EM_SPARCV9:
8088 case EM_SPARC:
8089 return reloc_type == 3 /* R_SPARC_32. */
8090 || reloc_type == 23; /* R_SPARC_UA32. */
8091 case EM_SPU:
8092 return reloc_type == 6; /* R_SPU_ADDR32 */
8093 case EM_CYGNUS_V850:
8094 case EM_V850:
8095 return reloc_type == 6; /* R_V850_ABS32. */
8096 case EM_VAX:
8097 return reloc_type == 1; /* R_VAX_32. */
8098 case EM_X86_64:
8099 return reloc_type == 10; /* R_X86_64_32. */
8100 case EM_XSTORMY16:
8101 return reloc_type == 1; /* R_XSTROMY16_32. */
8102 case EM_XTENSA_OLD:
8103 case EM_XTENSA:
8104 return reloc_type == 1; /* R_XTENSA_32. */
8106 default:
8107 error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
8108 elf_header.e_machine);
8109 abort ();
8113 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
8114 a 32-bit pc-relative RELA relocation used in DWARF debug sections. */
8116 static bfd_boolean
8117 is_32bit_pcrel_reloc (unsigned int reloc_type)
8119 switch (elf_header.e_machine)
8121 case EM_386:
8122 case EM_486:
8123 return reloc_type == 2; /* R_386_PC32. */
8124 case EM_68K:
8125 return reloc_type == 4; /* R_68K_PC32. */
8126 case EM_ALPHA:
8127 return reloc_type == 10; /* R_ALPHA_SREL32. */
8128 case EM_ARM:
8129 return reloc_type == 3; /* R_ARM_REL32 */
8130 case EM_PARISC:
8131 return reloc_type == 0; /* R_PARISC_NONE. *//* FIXME: This reloc is generated, but it may be a bug. */
8132 case EM_PPC:
8133 return reloc_type == 26; /* R_PPC_REL32. */
8134 case EM_PPC64:
8135 return reloc_type == 26; /* R_PPC64_REL32. */
8136 case EM_S390_OLD:
8137 case EM_S390:
8138 return reloc_type == 5; /* R_390_PC32. */
8139 case EM_SH:
8140 return reloc_type == 2; /* R_SH_REL32. */
8141 case EM_SPARC32PLUS:
8142 case EM_SPARCV9:
8143 case EM_SPARC:
8144 return reloc_type == 6; /* R_SPARC_DISP32. */
8145 case EM_SPU:
8146 return reloc_type == 13; /* R_SPU_REL32. */
8147 case EM_X86_64:
8148 return reloc_type == 2; /* R_X86_64_PC32. */
8149 case EM_XTENSA_OLD:
8150 case EM_XTENSA:
8151 return reloc_type == 14; /* R_XTENSA_32_PCREL. */
8152 default:
8153 /* Do not abort or issue an error message here. Not all targets use
8154 pc-relative 32-bit relocs in their DWARF debug information and we
8155 have already tested for target coverage in is_32bit_abs_reloc. A
8156 more helpful warning message will be generated by
8157 debug_apply_relocations anyway, so just return. */
8158 return FALSE;
8162 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
8163 a 64-bit absolute RELA relocation used in DWARF debug sections. */
8165 static bfd_boolean
8166 is_64bit_abs_reloc (unsigned int reloc_type)
8168 switch (elf_header.e_machine)
8170 case EM_ALPHA:
8171 return reloc_type == 2; /* R_ALPHA_REFQUAD. */
8172 case EM_IA_64:
8173 return reloc_type == 0x27; /* R_IA64_DIR64LSB. */
8174 case EM_PARISC:
8175 return reloc_type == 80; /* R_PARISC_DIR64. */
8176 case EM_PPC64:
8177 return reloc_type == 38; /* R_PPC64_ADDR64. */
8178 case EM_SPARC32PLUS:
8179 case EM_SPARCV9:
8180 case EM_SPARC:
8181 return reloc_type == 54; /* R_SPARC_UA64. */
8182 case EM_X86_64:
8183 return reloc_type == 1; /* R_X86_64_64. */
8184 case EM_S390_OLD:
8185 case EM_S390:
8186 return reloc_type == 22; /* R_S390_64 */
8187 default:
8188 return FALSE;
8192 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
8193 a 16-bit absolute RELA relocation used in DWARF debug sections. */
8195 static bfd_boolean
8196 is_16bit_abs_reloc (unsigned int reloc_type)
8198 switch (elf_header.e_machine)
8200 case EM_AVR_OLD:
8201 case EM_AVR:
8202 return reloc_type == 4; /* R_AVR_16. */
8203 case EM_CYGNUS_D10V:
8204 case EM_D10V:
8205 return reloc_type == 3; /* R_D10V_16. */
8206 case EM_H8S:
8207 case EM_H8_300:
8208 case EM_H8_300H:
8209 return reloc_type == R_H8_DIR16;
8210 case EM_IP2K_OLD:
8211 case EM_IP2K:
8212 return reloc_type == 1; /* R_IP2K_16. */
8213 case EM_M32C_OLD:
8214 case EM_M32C:
8215 return reloc_type == 1; /* R_M32C_16 */
8216 case EM_MSP430_OLD:
8217 case EM_MSP430:
8218 return reloc_type == 5; /* R_MSP430_16_BYTE. */
8219 case EM_ALTERA_NIOS2:
8220 case EM_NIOS32:
8221 return reloc_type == 9; /* R_NIOS_16. */
8222 default:
8223 return FALSE;
8227 /* Uncompresses a section that was compressed using zlib, in place.
8228 * This is a copy of bfd_uncompress_section_contents, in bfd/compress.c */
8230 static int
8231 uncompress_section_contents (unsigned char **buffer, dwarf_size_type *size)
8233 #ifndef HAVE_ZLIB_H
8234 /* These are just to quiet gcc. */
8235 buffer = 0;
8236 size = 0;
8237 return FALSE;
8238 #else
8239 dwarf_size_type compressed_size = *size;
8240 unsigned char* compressed_buffer = *buffer;
8241 dwarf_size_type uncompressed_size;
8242 unsigned char* uncompressed_buffer;
8243 z_stream strm;
8244 int rc;
8245 dwarf_size_type header_size = 12;
8247 /* Read the zlib header. In this case, it should be "ZLIB" followed
8248 by the uncompressed section size, 8 bytes in big-endian order. */
8249 if (compressed_size < header_size
8250 || ! streq ((char*) compressed_buffer, "ZLIB"))
8251 return 0;
8252 uncompressed_size = compressed_buffer[4]; uncompressed_size <<= 8;
8253 uncompressed_size += compressed_buffer[5]; uncompressed_size <<= 8;
8254 uncompressed_size += compressed_buffer[6]; uncompressed_size <<= 8;
8255 uncompressed_size += compressed_buffer[7]; uncompressed_size <<= 8;
8256 uncompressed_size += compressed_buffer[8]; uncompressed_size <<= 8;
8257 uncompressed_size += compressed_buffer[9]; uncompressed_size <<= 8;
8258 uncompressed_size += compressed_buffer[10]; uncompressed_size <<= 8;
8259 uncompressed_size += compressed_buffer[11];
8261 /* It is possible the section consists of several compressed
8262 buffers concatenated together, so we uncompress in a loop. */
8263 strm.zalloc = NULL;
8264 strm.zfree = NULL;
8265 strm.opaque = NULL;
8266 strm.avail_in = compressed_size - header_size;
8267 strm.next_in = (Bytef*) compressed_buffer + header_size;
8268 strm.avail_out = uncompressed_size;
8269 uncompressed_buffer = xmalloc (uncompressed_size);
8271 rc = inflateInit (&strm);
8272 while (strm.avail_in > 0)
8274 if (rc != Z_OK)
8275 goto fail;
8276 strm.next_out = ((Bytef*) uncompressed_buffer
8277 + (uncompressed_size - strm.avail_out));
8278 rc = inflate (&strm, Z_FINISH);
8279 if (rc != Z_STREAM_END)
8280 goto fail;
8281 rc = inflateReset (&strm);
8283 rc = inflateEnd (&strm);
8284 if (rc != Z_OK
8285 || strm.avail_out != 0)
8286 goto fail;
8288 free (compressed_buffer);
8289 *buffer = uncompressed_buffer;
8290 *size = uncompressed_size;
8291 return 1;
8293 fail:
8294 free (uncompressed_buffer);
8295 return 0;
8296 #endif /* HAVE_ZLIB_H */
8299 /* Apply relocations to a debug section. */
8301 static void
8302 debug_apply_relocations (void *file,
8303 Elf_Internal_Shdr *section,
8304 unsigned char *start)
8306 Elf_Internal_Shdr *relsec;
8307 unsigned char *end = start + section->sh_size;
8309 if (elf_header.e_type != ET_REL)
8310 return;
8312 /* Find the reloc section associated with the debug section. */
8313 for (relsec = section_headers;
8314 relsec < section_headers + elf_header.e_shnum;
8315 ++relsec)
8317 bfd_boolean is_rela;
8318 unsigned long num_relocs;
8319 Elf_Internal_Rela *relocs, *rp;
8320 Elf_Internal_Shdr *symsec;
8321 Elf_Internal_Sym *symtab;
8322 Elf_Internal_Sym *sym;
8324 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
8325 || relsec->sh_info >= elf_header.e_shnum
8326 || section_headers + relsec->sh_info != section
8327 || relsec->sh_size == 0
8328 || relsec->sh_link >= elf_header.e_shnum)
8329 continue;
8331 is_rela = relsec->sh_type == SHT_RELA;
8333 if (is_rela)
8335 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
8336 & relocs, & num_relocs))
8337 return;
8339 else
8341 if (!slurp_rel_relocs (file, relsec->sh_offset, relsec->sh_size,
8342 & relocs, & num_relocs))
8343 return;
8346 /* SH uses RELA but uses in place value instead of the addend field. */
8347 if (elf_header.e_machine == EM_SH)
8348 is_rela = FALSE;
8350 symsec = section_headers + relsec->sh_link;
8351 symtab = GET_ELF_SYMBOLS (file, symsec);
8353 for (rp = relocs; rp < relocs + num_relocs; ++rp)
8355 bfd_vma addend;
8356 unsigned int reloc_type;
8357 unsigned int reloc_size;
8358 unsigned char * loc;
8360 /* In MIPS little-endian objects, r_info isn't really a
8361 64-bit little-endian value: it has a 32-bit little-endian
8362 symbol index followed by four individual byte fields.
8363 Reorder INFO accordingly. */
8364 if (!is_32bit_elf
8365 && elf_header.e_machine == EM_MIPS
8366 && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
8367 rp->r_info = (((rp->r_info & 0xffffffff) << 32)
8368 | ((rp->r_info >> 56) & 0xff)
8369 | ((rp->r_info >> 40) & 0xff00)
8370 | ((rp->r_info >> 24) & 0xff0000)
8371 | ((rp->r_info >> 8) & 0xff000000));
8373 reloc_type = get_reloc_type (rp->r_info);
8375 if (is_32bit_abs_reloc (reloc_type)
8376 || is_32bit_pcrel_reloc (reloc_type))
8377 reloc_size = 4;
8378 else if (is_64bit_abs_reloc (reloc_type))
8379 reloc_size = 8;
8380 else if (is_16bit_abs_reloc (reloc_type))
8381 reloc_size = 2;
8382 else
8384 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
8385 reloc_type, SECTION_NAME (section));
8386 continue;
8389 loc = start + rp->r_offset;
8390 if ((loc + reloc_size) > end)
8392 warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
8393 (unsigned long) rp->r_offset,
8394 SECTION_NAME (section));
8395 continue;
8398 sym = symtab + get_reloc_symindex (rp->r_info);
8400 /* If the reloc has a symbol associated with it,
8401 make sure that it is of an appropriate type. */
8402 if (sym != symtab
8403 && ELF_ST_TYPE (sym->st_info) != STT_SECTION
8404 /* Relocations against symbols without type can happen.
8405 Gcc -feliminate-dwarf2-dups may generate symbols
8406 without type for debug info. */
8407 && ELF_ST_TYPE (sym->st_info) != STT_NOTYPE
8408 /* Relocations against object symbols can happen,
8409 eg when referencing a global array. For an
8410 example of this see the _clz.o binary in libgcc.a. */
8411 && ELF_ST_TYPE (sym->st_info) != STT_OBJECT)
8413 warn (_("skipping unexpected symbol type %s in %ld'th relocation in section %s\n"),
8414 get_symbol_type (ELF_ST_TYPE (sym->st_info)),
8415 (long int)(rp - relocs),
8416 SECTION_NAME (relsec));
8417 continue;
8420 addend = is_rela ? rp->r_addend : byte_get (loc, reloc_size);
8422 if (is_32bit_pcrel_reloc (reloc_type))
8423 byte_put (loc, (addend + sym->st_value) - rp->r_offset,
8424 reloc_size);
8425 else
8426 byte_put (loc, addend + sym->st_value, reloc_size);
8429 free (symtab);
8430 free (relocs);
8431 break;
8436 load_debug_section (enum dwarf_section_display_enum debug, void *file)
8438 struct dwarf_section *section = &debug_displays [debug].section;
8439 Elf_Internal_Shdr *sec;
8440 char buf [64];
8441 int section_is_compressed;
8443 /* If it is already loaded, do nothing. */
8444 if (section->start != NULL)
8445 return 1;
8447 /* Locate the debug section. */
8448 sec = find_section (section->uncompressed_name);
8449 if (sec != NULL)
8450 section->name = section->uncompressed_name;
8451 else
8453 sec = find_section (section->compressed_name);
8454 if (sec != NULL)
8455 section->name = section->compressed_name;
8457 if (sec == NULL)
8458 return 0;
8459 section_is_compressed = section->name == section->compressed_name;
8461 snprintf (buf, sizeof (buf), _("%s section data"), section->name);
8462 section->address = sec->sh_addr;
8463 section->size = sec->sh_size;
8464 section->start = get_data (NULL, file, sec->sh_offset, 1,
8465 sec->sh_size, buf);
8466 if (section->start == NULL)
8467 return 0;
8469 if (section_is_compressed)
8470 if (! uncompress_section_contents (&section->start, &section->size))
8471 return 0;
8473 if (debug_displays [debug].relocate)
8474 debug_apply_relocations (file, sec, section->start);
8476 return 1;
8479 void
8480 free_debug_section (enum dwarf_section_display_enum debug)
8482 struct dwarf_section *section = &debug_displays [debug].section;
8484 if (section->start == NULL)
8485 return;
8487 free ((char *) section->start);
8488 section->start = NULL;
8489 section->address = 0;
8490 section->size = 0;
8493 static int
8494 display_debug_section (Elf_Internal_Shdr *section, FILE *file)
8496 char *name = SECTION_NAME (section);
8497 bfd_size_type length;
8498 int result = 1;
8499 enum dwarf_section_display_enum i;
8501 length = section->sh_size;
8502 if (length == 0)
8504 printf (_("\nSection '%s' has no debugging data.\n"), name);
8505 return 0;
8508 if (const_strneq (name, ".gnu.linkonce.wi."))
8509 name = ".debug_info";
8511 /* See if we know how to display the contents of this section. */
8512 for (i = 0; i < max; i++)
8513 if (streq (debug_displays[i].section.uncompressed_name, name)
8514 || streq (debug_displays[i].section.compressed_name, name))
8516 struct dwarf_section *sec = &debug_displays [i].section;
8518 if (load_debug_section (i, file))
8520 result &= debug_displays[i].display (sec, file);
8522 if (i != info && i != abbrev)
8523 free_debug_section (i);
8526 break;
8529 if (i == max)
8531 printf (_("Unrecognized debug section: %s\n"), name);
8532 result = 0;
8535 return result;
8538 /* Set DUMP_SECTS for all sections where dumps were requested
8539 based on section name. */
8541 static void
8542 initialise_dumps_byname (void)
8544 struct dump_list_entry *cur;
8546 for (cur = dump_sects_byname; cur; cur = cur->next)
8548 unsigned int i;
8549 int any;
8551 for (i = 0, any = 0; i < elf_header.e_shnum; i++)
8552 if (streq (SECTION_NAME (section_headers + i), cur->name))
8554 request_dump_bynumber (i, cur->type);
8555 any = 1;
8558 if (!any)
8559 warn (_("Section '%s' was not dumped because it does not exist!\n"),
8560 cur->name);
8564 static void
8565 process_section_contents (FILE *file)
8567 Elf_Internal_Shdr *section;
8568 unsigned int i;
8570 if (! do_dump)
8571 return;
8573 initialise_dumps_byname ();
8575 for (i = 0, section = section_headers;
8576 i < elf_header.e_shnum && i < num_dump_sects;
8577 i++, section++)
8579 #ifdef SUPPORT_DISASSEMBLY
8580 if (dump_sects[i] & DISASS_DUMP)
8581 disassemble_section (section, file);
8582 #endif
8583 if (dump_sects[i] & HEX_DUMP)
8584 dump_section_as_bytes (section, file);
8586 if (dump_sects[i] & DEBUG_DUMP)
8587 display_debug_section (section, file);
8589 if (dump_sects[i] & STRING_DUMP)
8590 dump_section_as_strings (section, file);
8593 /* Check to see if the user requested a
8594 dump of a section that does not exist. */
8595 while (i++ < num_dump_sects)
8596 if (dump_sects[i])
8597 warn (_("Section %d was not dumped because it does not exist!\n"), i);
8600 static void
8601 process_mips_fpe_exception (int mask)
8603 if (mask)
8605 int first = 1;
8606 if (mask & OEX_FPU_INEX)
8607 fputs ("INEX", stdout), first = 0;
8608 if (mask & OEX_FPU_UFLO)
8609 printf ("%sUFLO", first ? "" : "|"), first = 0;
8610 if (mask & OEX_FPU_OFLO)
8611 printf ("%sOFLO", first ? "" : "|"), first = 0;
8612 if (mask & OEX_FPU_DIV0)
8613 printf ("%sDIV0", first ? "" : "|"), first = 0;
8614 if (mask & OEX_FPU_INVAL)
8615 printf ("%sINVAL", first ? "" : "|");
8617 else
8618 fputs ("0", stdout);
8621 /* ARM EABI attributes section. */
8622 typedef struct
8624 int tag;
8625 const char *name;
8626 /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup. */
8627 int type;
8628 const char **table;
8629 } arm_attr_public_tag;
8631 static const char *arm_attr_tag_CPU_arch[] =
8632 {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
8633 "v6K", "v7"};
8634 static const char *arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
8635 static const char *arm_attr_tag_THUMB_ISA_use[] =
8636 {"No", "Thumb-1", "Thumb-2"};
8637 static const char *arm_attr_tag_VFP_arch[] =
8638 {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16"};
8639 static const char *arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1"};
8640 static const char *arm_attr_tag_NEON_arch[] = {"No", "NEONv1"};
8641 static const char *arm_attr_tag_ABI_PCS_config[] =
8642 {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
8643 "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
8644 static const char *arm_attr_tag_ABI_PCS_R9_use[] =
8645 {"V6", "SB", "TLS", "Unused"};
8646 static const char *arm_attr_tag_ABI_PCS_RW_data[] =
8647 {"Absolute", "PC-relative", "SB-relative", "None"};
8648 static const char *arm_attr_tag_ABI_PCS_RO_DATA[] =
8649 {"Absolute", "PC-relative", "None"};
8650 static const char *arm_attr_tag_ABI_PCS_GOT_use[] =
8651 {"None", "direct", "GOT-indirect"};
8652 static const char *arm_attr_tag_ABI_PCS_wchar_t[] =
8653 {"None", "??? 1", "2", "??? 3", "4"};
8654 static const char *arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
8655 static const char *arm_attr_tag_ABI_FP_denormal[] = {"Unused", "Needed"};
8656 static const char *arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
8657 static const char *arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
8658 static const char *arm_attr_tag_ABI_FP_number_model[] =
8659 {"Unused", "Finite", "RTABI", "IEEE 754"};
8660 static const char *arm_attr_tag_ABI_align8_needed[] = {"No", "Yes", "4-byte"};
8661 static const char *arm_attr_tag_ABI_align8_preserved[] =
8662 {"No", "Yes, except leaf SP", "Yes"};
8663 static const char *arm_attr_tag_ABI_enum_size[] =
8664 {"Unused", "small", "int", "forced to int"};
8665 static const char *arm_attr_tag_ABI_HardFP_use[] =
8666 {"As Tag_VFP_arch", "SP only", "DP only", "SP and DP"};
8667 static const char *arm_attr_tag_ABI_VFP_args[] =
8668 {"AAPCS", "VFP registers", "custom"};
8669 static const char *arm_attr_tag_ABI_WMMX_args[] =
8670 {"AAPCS", "WMMX registers", "custom"};
8671 static const char *arm_attr_tag_ABI_optimization_goals[] =
8672 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
8673 "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
8674 static const char *arm_attr_tag_ABI_FP_optimization_goals[] =
8675 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
8676 "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
8678 #define LOOKUP(id, name) \
8679 {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
8680 static arm_attr_public_tag arm_attr_public_tags[] =
8682 {4, "CPU_raw_name", 1, NULL},
8683 {5, "CPU_name", 1, NULL},
8684 LOOKUP(6, CPU_arch),
8685 {7, "CPU_arch_profile", 0, NULL},
8686 LOOKUP(8, ARM_ISA_use),
8687 LOOKUP(9, THUMB_ISA_use),
8688 LOOKUP(10, VFP_arch),
8689 LOOKUP(11, WMMX_arch),
8690 LOOKUP(12, NEON_arch),
8691 LOOKUP(13, ABI_PCS_config),
8692 LOOKUP(14, ABI_PCS_R9_use),
8693 LOOKUP(15, ABI_PCS_RW_data),
8694 LOOKUP(16, ABI_PCS_RO_DATA),
8695 LOOKUP(17, ABI_PCS_GOT_use),
8696 LOOKUP(18, ABI_PCS_wchar_t),
8697 LOOKUP(19, ABI_FP_rounding),
8698 LOOKUP(20, ABI_FP_denormal),
8699 LOOKUP(21, ABI_FP_exceptions),
8700 LOOKUP(22, ABI_FP_user_exceptions),
8701 LOOKUP(23, ABI_FP_number_model),
8702 LOOKUP(24, ABI_align8_needed),
8703 LOOKUP(25, ABI_align8_preserved),
8704 LOOKUP(26, ABI_enum_size),
8705 LOOKUP(27, ABI_HardFP_use),
8706 LOOKUP(28, ABI_VFP_args),
8707 LOOKUP(29, ABI_WMMX_args),
8708 LOOKUP(30, ABI_optimization_goals),
8709 LOOKUP(31, ABI_FP_optimization_goals),
8710 {32, "compatibility", 0, NULL}
8712 #undef LOOKUP
8714 /* Read an unsigned LEB128 encoded value from p. Set *PLEN to the number of
8715 bytes read. */
8716 static unsigned int
8717 read_uleb128 (unsigned char *p, unsigned int *plen)
8719 unsigned char c;
8720 unsigned int val;
8721 int shift;
8722 int len;
8724 val = 0;
8725 shift = 0;
8726 len = 0;
8729 c = *(p++);
8730 len++;
8731 val |= ((unsigned int)c & 0x7f) << shift;
8732 shift += 7;
8734 while (c & 0x80);
8736 *plen = len;
8737 return val;
8740 static unsigned char *
8741 display_arm_attribute (unsigned char *p)
8743 int tag;
8744 unsigned int len;
8745 int val;
8746 arm_attr_public_tag *attr;
8747 unsigned i;
8748 int type;
8750 tag = read_uleb128 (p, &len);
8751 p += len;
8752 attr = NULL;
8753 for (i = 0; i < ARRAY_SIZE(arm_attr_public_tags); i++)
8755 if (arm_attr_public_tags[i].tag == tag)
8757 attr = &arm_attr_public_tags[i];
8758 break;
8762 if (attr)
8764 printf (" Tag_%s: ", attr->name);
8765 switch (attr->type)
8767 case 0:
8768 switch (tag)
8770 case 7: /* Tag_CPU_arch_profile. */
8771 val = read_uleb128 (p, &len);
8772 p += len;
8773 switch (val)
8775 case 0: printf ("None\n"); break;
8776 case 'A': printf ("Application\n"); break;
8777 case 'R': printf ("Realtime\n"); break;
8778 case 'M': printf ("Microcontroller\n"); break;
8779 default: printf ("??? (%d)\n", val); break;
8781 break;
8783 case 32: /* Tag_compatibility. */
8784 val = read_uleb128 (p, &len);
8785 p += len;
8786 printf ("flag = %d, vendor = %s\n", val, p);
8787 p += strlen((char *)p) + 1;
8788 break;
8790 default:
8791 abort();
8793 return p;
8795 case 1:
8796 case 2:
8797 type = attr->type;
8798 break;
8800 default:
8801 assert (attr->type & 0x80);
8802 val = read_uleb128 (p, &len);
8803 p += len;
8804 type = attr->type & 0x7f;
8805 if (val >= type)
8806 printf ("??? (%d)\n", val);
8807 else
8808 printf ("%s\n", attr->table[val]);
8809 return p;
8812 else
8814 if (tag & 1)
8815 type = 1; /* String. */
8816 else
8817 type = 2; /* uleb128. */
8818 printf (" Tag_unknown_%d: ", tag);
8821 if (type == 1)
8823 printf ("\"%s\"\n", p);
8824 p += strlen((char *)p) + 1;
8826 else
8828 val = read_uleb128 (p, &len);
8829 p += len;
8830 printf ("%d (0x%x)\n", val, val);
8833 return p;
8836 static unsigned char *
8837 display_gnu_attribute (unsigned char * p,
8838 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int))
8840 int tag;
8841 unsigned int len;
8842 int val;
8843 int type;
8845 tag = read_uleb128 (p, &len);
8846 p += len;
8848 /* Tag_compatibility is the only generic GNU attribute defined at
8849 present. */
8850 if (tag == 32)
8852 val = read_uleb128 (p, &len);
8853 p += len;
8854 printf ("flag = %d, vendor = %s\n", val, p);
8855 p += strlen ((char *) p) + 1;
8856 return p;
8859 if ((tag & 2) == 0 && display_proc_gnu_attribute)
8860 return display_proc_gnu_attribute (p, tag);
8862 if (tag & 1)
8863 type = 1; /* String. */
8864 else
8865 type = 2; /* uleb128. */
8866 printf (" Tag_unknown_%d: ", tag);
8868 if (type == 1)
8870 printf ("\"%s\"\n", p);
8871 p += strlen ((char *) p) + 1;
8873 else
8875 val = read_uleb128 (p, &len);
8876 p += len;
8877 printf ("%d (0x%x)\n", val, val);
8880 return p;
8883 static unsigned char *
8884 display_power_gnu_attribute (unsigned char *p, int tag)
8886 int type;
8887 unsigned int len;
8888 int val;
8890 if (tag == Tag_GNU_Power_ABI_FP)
8892 val = read_uleb128 (p, &len);
8893 p += len;
8894 printf (" Tag_GNU_Power_ABI_FP: ");
8896 switch (val)
8898 case 0:
8899 printf ("Hard or soft float\n");
8900 break;
8901 case 1:
8902 printf ("Hard float\n");
8903 break;
8904 case 2:
8905 printf ("Soft float\n");
8906 break;
8907 case 3:
8908 printf ("Single-precision hard float\n");
8909 break;
8910 default:
8911 printf ("??? (%d)\n", val);
8912 break;
8914 return p;
8917 if (tag == Tag_GNU_Power_ABI_Vector)
8919 val = read_uleb128 (p, &len);
8920 p += len;
8921 printf (" Tag_GNU_Power_ABI_Vector: ");
8922 switch (val)
8924 case 0:
8925 printf ("Any\n");
8926 break;
8927 case 1:
8928 printf ("Generic\n");
8929 break;
8930 case 2:
8931 printf ("AltiVec\n");
8932 break;
8933 case 3:
8934 printf ("SPE\n");
8935 break;
8936 default:
8937 printf ("??? (%d)\n", val);
8938 break;
8940 return p;
8943 if (tag & 1)
8944 type = 1; /* String. */
8945 else
8946 type = 2; /* uleb128. */
8947 printf (" Tag_unknown_%d: ", tag);
8949 if (type == 1)
8951 printf ("\"%s\"\n", p);
8952 p += strlen ((char *) p) + 1;
8954 else
8956 val = read_uleb128 (p, &len);
8957 p += len;
8958 printf ("%d (0x%x)\n", val, val);
8961 return p;
8964 static unsigned char *
8965 display_mips_gnu_attribute (unsigned char *p, int tag)
8967 int type;
8968 unsigned int len;
8969 int val;
8971 if (tag == Tag_GNU_MIPS_ABI_FP)
8973 val = read_uleb128 (p, &len);
8974 p += len;
8975 printf (" Tag_GNU_MIPS_ABI_FP: ");
8977 switch (val)
8979 case 0:
8980 printf ("Hard or soft float\n");
8981 break;
8982 case 1:
8983 printf ("Hard float (-mdouble-float)\n");
8984 break;
8985 case 2:
8986 printf ("Hard float (-msingle-float)\n");
8987 break;
8988 case 3:
8989 printf ("Soft float\n");
8990 break;
8991 case 4:
8992 printf ("64-bit float (-mips32r2 -mfp64)\n");
8993 break;
8994 default:
8995 printf ("??? (%d)\n", val);
8996 break;
8998 return p;
9001 if (tag & 1)
9002 type = 1; /* String. */
9003 else
9004 type = 2; /* uleb128. */
9005 printf (" Tag_unknown_%d: ", tag);
9007 if (type == 1)
9009 printf ("\"%s\"\n", p);
9010 p += strlen ((char *) p) + 1;
9012 else
9014 val = read_uleb128 (p, &len);
9015 p += len;
9016 printf ("%d (0x%x)\n", val, val);
9019 return p;
9022 static int
9023 process_attributes (FILE * file,
9024 const char * public_name,
9025 unsigned int proc_type,
9026 unsigned char * (* display_pub_attribute) (unsigned char *),
9027 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int))
9029 Elf_Internal_Shdr *sect;
9030 unsigned char *contents;
9031 unsigned char *p;
9032 unsigned char *end;
9033 bfd_vma section_len;
9034 bfd_vma len;
9035 unsigned i;
9037 /* Find the section header so that we get the size. */
9038 for (i = 0, sect = section_headers;
9039 i < elf_header.e_shnum;
9040 i++, sect++)
9042 if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
9043 continue;
9045 contents = get_data (NULL, file, sect->sh_offset, 1, sect->sh_size,
9046 _("attributes"));
9047 if (contents == NULL)
9048 continue;
9050 p = contents;
9051 if (*p == 'A')
9053 len = sect->sh_size - 1;
9054 p++;
9056 while (len > 0)
9058 int namelen;
9059 bfd_boolean public_section;
9060 bfd_boolean gnu_section;
9062 section_len = byte_get (p, 4);
9063 p += 4;
9065 if (section_len > len)
9067 printf (_("ERROR: Bad section length (%d > %d)\n"),
9068 (int) section_len, (int) len);
9069 section_len = len;
9072 len -= section_len;
9073 printf ("Attribute Section: %s\n", p);
9075 if (public_name && streq ((char *) p, public_name))
9076 public_section = TRUE;
9077 else
9078 public_section = FALSE;
9080 if (streq ((char *) p, "gnu"))
9081 gnu_section = TRUE;
9082 else
9083 gnu_section = FALSE;
9085 namelen = strlen ((char *) p) + 1;
9086 p += namelen;
9087 section_len -= namelen + 4;
9089 while (section_len > 0)
9091 int tag = *(p++);
9092 int val;
9093 bfd_vma size;
9095 size = byte_get (p, 4);
9096 if (size > section_len)
9098 printf (_("ERROR: Bad subsection length (%d > %d)\n"),
9099 (int) size, (int) section_len);
9100 size = section_len;
9103 section_len -= size;
9104 end = p + size - 1;
9105 p += 4;
9107 switch (tag)
9109 case 1:
9110 printf ("File Attributes\n");
9111 break;
9112 case 2:
9113 printf ("Section Attributes:");
9114 goto do_numlist;
9115 case 3:
9116 printf ("Symbol Attributes:");
9117 do_numlist:
9118 for (;;)
9120 unsigned int i;
9122 val = read_uleb128 (p, &i);
9123 p += i;
9124 if (val == 0)
9125 break;
9126 printf (" %d", val);
9128 printf ("\n");
9129 break;
9130 default:
9131 printf ("Unknown tag: %d\n", tag);
9132 public_section = FALSE;
9133 break;
9136 if (public_section)
9138 while (p < end)
9139 p = display_pub_attribute (p);
9141 else if (gnu_section)
9143 while (p < end)
9144 p = display_gnu_attribute (p,
9145 display_proc_gnu_attribute);
9147 else
9149 /* ??? Do something sensible, like dump hex. */
9150 printf (" Unknown section contexts\n");
9151 p = end;
9156 else
9157 printf (_("Unknown format '%c'\n"), *p);
9159 free (contents);
9161 return 1;
9164 static int
9165 process_arm_specific (FILE *file)
9167 return process_attributes (file, "aeabi", SHT_ARM_ATTRIBUTES,
9168 display_arm_attribute, NULL);
9171 static int
9172 process_power_specific (FILE *file)
9174 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
9175 display_power_gnu_attribute);
9178 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
9179 Print the Address, Access and Initial fields of an entry at VMA ADDR
9180 and return the VMA of the next entry. */
9182 static bfd_vma
9183 print_mips_got_entry (unsigned char *data, bfd_vma pltgot, bfd_vma addr)
9185 printf (" ");
9186 print_vma (addr, LONG_HEX);
9187 printf (" ");
9188 if (addr < pltgot + 0xfff0)
9189 printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
9190 else
9191 printf ("%10s", "");
9192 printf (" ");
9193 if (data == NULL)
9194 printf ("%*s", is_32bit_elf ? 8 : 16, "<unknown>");
9195 else
9197 bfd_vma entry;
9199 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
9200 print_vma (entry, LONG_HEX);
9202 return addr + (is_32bit_elf ? 4 : 8);
9205 static int
9206 process_mips_specific (FILE *file)
9208 Elf_Internal_Dyn *entry;
9209 size_t liblist_offset = 0;
9210 size_t liblistno = 0;
9211 size_t conflictsno = 0;
9212 size_t options_offset = 0;
9213 size_t conflicts_offset = 0;
9214 bfd_vma pltgot = 0;
9215 bfd_vma local_gotno = 0;
9216 bfd_vma gotsym = 0;
9217 bfd_vma symtabno = 0;
9219 process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
9220 display_mips_gnu_attribute);
9222 /* We have a lot of special sections. Thanks SGI! */
9223 if (dynamic_section == NULL)
9224 /* No information available. */
9225 return 0;
9227 for (entry = dynamic_section; entry->d_tag != DT_NULL; ++entry)
9228 switch (entry->d_tag)
9230 case DT_MIPS_LIBLIST:
9231 liblist_offset
9232 = offset_from_vma (file, entry->d_un.d_val,
9233 liblistno * sizeof (Elf32_External_Lib));
9234 break;
9235 case DT_MIPS_LIBLISTNO:
9236 liblistno = entry->d_un.d_val;
9237 break;
9238 case DT_MIPS_OPTIONS:
9239 options_offset = offset_from_vma (file, entry->d_un.d_val, 0);
9240 break;
9241 case DT_MIPS_CONFLICT:
9242 conflicts_offset
9243 = offset_from_vma (file, entry->d_un.d_val,
9244 conflictsno * sizeof (Elf32_External_Conflict));
9245 break;
9246 case DT_MIPS_CONFLICTNO:
9247 conflictsno = entry->d_un.d_val;
9248 break;
9249 case DT_PLTGOT:
9250 pltgot = entry->d_un.d_val;
9251 case DT_MIPS_LOCAL_GOTNO:
9252 local_gotno = entry->d_un.d_val;
9253 break;
9254 case DT_MIPS_GOTSYM:
9255 gotsym = entry->d_un.d_val;
9256 break;
9257 case DT_MIPS_SYMTABNO:
9258 symtabno = entry->d_un.d_val;
9259 break;
9260 default:
9261 break;
9264 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
9266 Elf32_External_Lib *elib;
9267 size_t cnt;
9269 elib = get_data (NULL, file, liblist_offset,
9270 liblistno, sizeof (Elf32_External_Lib),
9271 _("liblist"));
9272 if (elib)
9274 printf ("\nSection '.liblist' contains %lu entries:\n",
9275 (unsigned long) liblistno);
9276 fputs (" Library Time Stamp Checksum Version Flags\n",
9277 stdout);
9279 for (cnt = 0; cnt < liblistno; ++cnt)
9281 Elf32_Lib liblist;
9282 time_t time;
9283 char timebuf[20];
9284 struct tm *tmp;
9286 liblist.l_name = BYTE_GET (elib[cnt].l_name);
9287 time = BYTE_GET (elib[cnt].l_time_stamp);
9288 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
9289 liblist.l_version = BYTE_GET (elib[cnt].l_version);
9290 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
9292 tmp = gmtime (&time);
9293 snprintf (timebuf, sizeof (timebuf),
9294 "%04u-%02u-%02uT%02u:%02u:%02u",
9295 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9296 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
9298 printf ("%3lu: ", (unsigned long) cnt);
9299 if (VALID_DYNAMIC_NAME (liblist.l_name))
9300 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
9301 else
9302 printf ("<corrupt: %9ld>", liblist.l_name);
9303 printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
9304 liblist.l_version);
9306 if (liblist.l_flags == 0)
9307 puts (" NONE");
9308 else
9310 static const struct
9312 const char *name;
9313 int bit;
9315 l_flags_vals[] =
9317 { " EXACT_MATCH", LL_EXACT_MATCH },
9318 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
9319 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
9320 { " EXPORTS", LL_EXPORTS },
9321 { " DELAY_LOAD", LL_DELAY_LOAD },
9322 { " DELTA", LL_DELTA }
9324 int flags = liblist.l_flags;
9325 size_t fcnt;
9327 for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
9328 if ((flags & l_flags_vals[fcnt].bit) != 0)
9330 fputs (l_flags_vals[fcnt].name, stdout);
9331 flags ^= l_flags_vals[fcnt].bit;
9333 if (flags != 0)
9334 printf (" %#x", (unsigned int) flags);
9336 puts ("");
9340 free (elib);
9344 if (options_offset != 0)
9346 Elf_External_Options *eopt;
9347 Elf_Internal_Shdr *sect = section_headers;
9348 Elf_Internal_Options *iopt;
9349 Elf_Internal_Options *option;
9350 size_t offset;
9351 int cnt;
9353 /* Find the section header so that we get the size. */
9354 while (sect->sh_type != SHT_MIPS_OPTIONS)
9355 ++sect;
9357 eopt = get_data (NULL, file, options_offset, 1, sect->sh_size,
9358 _("options"));
9359 if (eopt)
9361 iopt = cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (*iopt));
9362 if (iopt == NULL)
9364 error (_("Out of memory\n"));
9365 return 0;
9368 offset = cnt = 0;
9369 option = iopt;
9371 while (offset < sect->sh_size)
9373 Elf_External_Options *eoption;
9375 eoption = (Elf_External_Options *) ((char *) eopt + offset);
9377 option->kind = BYTE_GET (eoption->kind);
9378 option->size = BYTE_GET (eoption->size);
9379 option->section = BYTE_GET (eoption->section);
9380 option->info = BYTE_GET (eoption->info);
9382 offset += option->size;
9384 ++option;
9385 ++cnt;
9388 printf (_("\nSection '%s' contains %d entries:\n"),
9389 SECTION_NAME (sect), cnt);
9391 option = iopt;
9393 while (cnt-- > 0)
9395 size_t len;
9397 switch (option->kind)
9399 case ODK_NULL:
9400 /* This shouldn't happen. */
9401 printf (" NULL %d %lx", option->section, option->info);
9402 break;
9403 case ODK_REGINFO:
9404 printf (" REGINFO ");
9405 if (elf_header.e_machine == EM_MIPS)
9407 /* 32bit form. */
9408 Elf32_External_RegInfo *ereg;
9409 Elf32_RegInfo reginfo;
9411 ereg = (Elf32_External_RegInfo *) (option + 1);
9412 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
9413 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
9414 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
9415 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
9416 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
9417 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
9419 printf ("GPR %08lx GP 0x%lx\n",
9420 reginfo.ri_gprmask,
9421 (unsigned long) reginfo.ri_gp_value);
9422 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
9423 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
9424 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
9426 else
9428 /* 64 bit form. */
9429 Elf64_External_RegInfo *ereg;
9430 Elf64_Internal_RegInfo reginfo;
9432 ereg = (Elf64_External_RegInfo *) (option + 1);
9433 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
9434 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
9435 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
9436 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
9437 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
9438 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
9440 printf ("GPR %08lx GP 0x",
9441 reginfo.ri_gprmask);
9442 printf_vma (reginfo.ri_gp_value);
9443 printf ("\n");
9445 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
9446 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
9447 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
9449 ++option;
9450 continue;
9451 case ODK_EXCEPTIONS:
9452 fputs (" EXCEPTIONS fpe_min(", stdout);
9453 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
9454 fputs (") fpe_max(", stdout);
9455 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
9456 fputs (")", stdout);
9458 if (option->info & OEX_PAGE0)
9459 fputs (" PAGE0", stdout);
9460 if (option->info & OEX_SMM)
9461 fputs (" SMM", stdout);
9462 if (option->info & OEX_FPDBUG)
9463 fputs (" FPDBUG", stdout);
9464 if (option->info & OEX_DISMISS)
9465 fputs (" DISMISS", stdout);
9466 break;
9467 case ODK_PAD:
9468 fputs (" PAD ", stdout);
9469 if (option->info & OPAD_PREFIX)
9470 fputs (" PREFIX", stdout);
9471 if (option->info & OPAD_POSTFIX)
9472 fputs (" POSTFIX", stdout);
9473 if (option->info & OPAD_SYMBOL)
9474 fputs (" SYMBOL", stdout);
9475 break;
9476 case ODK_HWPATCH:
9477 fputs (" HWPATCH ", stdout);
9478 if (option->info & OHW_R4KEOP)
9479 fputs (" R4KEOP", stdout);
9480 if (option->info & OHW_R8KPFETCH)
9481 fputs (" R8KPFETCH", stdout);
9482 if (option->info & OHW_R5KEOP)
9483 fputs (" R5KEOP", stdout);
9484 if (option->info & OHW_R5KCVTL)
9485 fputs (" R5KCVTL", stdout);
9486 break;
9487 case ODK_FILL:
9488 fputs (" FILL ", stdout);
9489 /* XXX Print content of info word? */
9490 break;
9491 case ODK_TAGS:
9492 fputs (" TAGS ", stdout);
9493 /* XXX Print content of info word? */
9494 break;
9495 case ODK_HWAND:
9496 fputs (" HWAND ", stdout);
9497 if (option->info & OHWA0_R4KEOP_CHECKED)
9498 fputs (" R4KEOP_CHECKED", stdout);
9499 if (option->info & OHWA0_R4KEOP_CLEAN)
9500 fputs (" R4KEOP_CLEAN", stdout);
9501 break;
9502 case ODK_HWOR:
9503 fputs (" HWOR ", stdout);
9504 if (option->info & OHWA0_R4KEOP_CHECKED)
9505 fputs (" R4KEOP_CHECKED", stdout);
9506 if (option->info & OHWA0_R4KEOP_CLEAN)
9507 fputs (" R4KEOP_CLEAN", stdout);
9508 break;
9509 case ODK_GP_GROUP:
9510 printf (" GP_GROUP %#06lx self-contained %#06lx",
9511 option->info & OGP_GROUP,
9512 (option->info & OGP_SELF) >> 16);
9513 break;
9514 case ODK_IDENT:
9515 printf (" IDENT %#06lx self-contained %#06lx",
9516 option->info & OGP_GROUP,
9517 (option->info & OGP_SELF) >> 16);
9518 break;
9519 default:
9520 /* This shouldn't happen. */
9521 printf (" %3d ??? %d %lx",
9522 option->kind, option->section, option->info);
9523 break;
9526 len = sizeof (*eopt);
9527 while (len < option->size)
9528 if (((char *) option)[len] >= ' '
9529 && ((char *) option)[len] < 0x7f)
9530 printf ("%c", ((char *) option)[len++]);
9531 else
9532 printf ("\\%03o", ((char *) option)[len++]);
9534 fputs ("\n", stdout);
9535 ++option;
9538 free (eopt);
9542 if (conflicts_offset != 0 && conflictsno != 0)
9544 Elf32_Conflict *iconf;
9545 size_t cnt;
9547 if (dynamic_symbols == NULL)
9549 error (_("conflict list found without a dynamic symbol table\n"));
9550 return 0;
9553 iconf = cmalloc (conflictsno, sizeof (*iconf));
9554 if (iconf == NULL)
9556 error (_("Out of memory\n"));
9557 return 0;
9560 if (is_32bit_elf)
9562 Elf32_External_Conflict *econf32;
9564 econf32 = get_data (NULL, file, conflicts_offset,
9565 conflictsno, sizeof (*econf32), _("conflict"));
9566 if (!econf32)
9567 return 0;
9569 for (cnt = 0; cnt < conflictsno; ++cnt)
9570 iconf[cnt] = BYTE_GET (econf32[cnt]);
9572 free (econf32);
9574 else
9576 Elf64_External_Conflict *econf64;
9578 econf64 = get_data (NULL, file, conflicts_offset,
9579 conflictsno, sizeof (*econf64), _("conflict"));
9580 if (!econf64)
9581 return 0;
9583 for (cnt = 0; cnt < conflictsno; ++cnt)
9584 iconf[cnt] = BYTE_GET (econf64[cnt]);
9586 free (econf64);
9589 printf (_("\nSection '.conflict' contains %lu entries:\n"),
9590 (unsigned long) conflictsno);
9591 puts (_(" Num: Index Value Name"));
9593 for (cnt = 0; cnt < conflictsno; ++cnt)
9595 Elf_Internal_Sym *psym = & dynamic_symbols[iconf[cnt]];
9597 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
9598 print_vma (psym->st_value, FULL_HEX);
9599 putchar (' ');
9600 if (VALID_DYNAMIC_NAME (psym->st_name))
9601 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
9602 else
9603 printf ("<corrupt: %14ld>", psym->st_name);
9604 putchar ('\n');
9607 free (iconf);
9610 if (pltgot != 0 && local_gotno != 0)
9612 bfd_vma entry, local_end, global_end;
9613 size_t i, offset;
9614 unsigned char *data;
9615 int addr_size;
9617 entry = pltgot;
9618 addr_size = (is_32bit_elf ? 4 : 8);
9619 local_end = pltgot + local_gotno * addr_size;
9620 global_end = local_end + (symtabno - gotsym) * addr_size;
9622 offset = offset_from_vma (file, pltgot, global_end - pltgot);
9623 data = get_data (NULL, file, offset, global_end - pltgot, 1, _("GOT"));
9624 printf (_("\nPrimary GOT:\n"));
9625 printf (_(" Canonical gp value: "));
9626 print_vma (pltgot + 0x7ff0, LONG_HEX);
9627 printf ("\n\n");
9629 printf (_(" Reserved entries:\n"));
9630 printf (_(" %*s %10s %*s Purpose\n"),
9631 addr_size * 2, "Address", "Access",
9632 addr_size * 2, "Initial");
9633 entry = print_mips_got_entry (data, pltgot, entry);
9634 printf (" Lazy resolver\n");
9635 if (data
9636 && (byte_get (data + entry - pltgot, addr_size)
9637 >> (addr_size * 8 - 1)) != 0)
9639 entry = print_mips_got_entry (data, pltgot, entry);
9640 printf (" Module pointer (GNU extension)\n");
9642 printf ("\n");
9644 if (entry < local_end)
9646 printf (_(" Local entries:\n"));
9647 printf (_(" %*s %10s %*s\n"),
9648 addr_size * 2, "Address", "Access",
9649 addr_size * 2, "Initial");
9650 while (entry < local_end)
9652 entry = print_mips_got_entry (data, pltgot, entry);
9653 printf ("\n");
9655 printf ("\n");
9658 if (gotsym < symtabno)
9660 int sym_width;
9662 printf (_(" Global entries:\n"));
9663 printf (_(" %*s %10s %*s %*s %-7s %3s %s\n"),
9664 addr_size * 2, "Address", "Access",
9665 addr_size * 2, "Initial",
9666 addr_size * 2, "Sym.Val.", "Type", "Ndx", "Name");
9667 sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
9668 for (i = gotsym; i < symtabno; i++)
9670 Elf_Internal_Sym *psym;
9672 psym = dynamic_symbols + i;
9673 entry = print_mips_got_entry (data, pltgot, entry);
9674 printf (" ");
9675 print_vma (psym->st_value, LONG_HEX);
9676 printf (" %-7s %3s ",
9677 get_symbol_type (ELF_ST_TYPE (psym->st_info)),
9678 get_symbol_index_type (psym->st_shndx));
9679 if (VALID_DYNAMIC_NAME (psym->st_name))
9680 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
9681 else
9682 printf ("<corrupt: %14ld>", psym->st_name);
9683 printf ("\n");
9685 printf ("\n");
9688 if (data)
9689 free (data);
9692 return 1;
9695 static int
9696 process_gnu_liblist (FILE *file)
9698 Elf_Internal_Shdr *section, *string_sec;
9699 Elf32_External_Lib *elib;
9700 char *strtab;
9701 size_t strtab_size;
9702 size_t cnt;
9703 unsigned i;
9705 if (! do_arch)
9706 return 0;
9708 for (i = 0, section = section_headers;
9709 i < elf_header.e_shnum;
9710 i++, section++)
9712 switch (section->sh_type)
9714 case SHT_GNU_LIBLIST:
9715 if (section->sh_link >= elf_header.e_shnum)
9716 break;
9718 elib = get_data (NULL, file, section->sh_offset, 1, section->sh_size,
9719 _("liblist"));
9721 if (elib == NULL)
9722 break;
9723 string_sec = section_headers + section->sh_link;
9725 strtab = get_data (NULL, file, string_sec->sh_offset, 1,
9726 string_sec->sh_size, _("liblist string table"));
9727 strtab_size = string_sec->sh_size;
9729 if (strtab == NULL
9730 || section->sh_entsize != sizeof (Elf32_External_Lib))
9732 free (elib);
9733 break;
9736 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
9737 SECTION_NAME (section),
9738 (long) (section->sh_size / sizeof (Elf32_External_Lib)));
9740 puts (" Library Time Stamp Checksum Version Flags");
9742 for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
9743 ++cnt)
9745 Elf32_Lib liblist;
9746 time_t time;
9747 char timebuf[20];
9748 struct tm *tmp;
9750 liblist.l_name = BYTE_GET (elib[cnt].l_name);
9751 time = BYTE_GET (elib[cnt].l_time_stamp);
9752 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
9753 liblist.l_version = BYTE_GET (elib[cnt].l_version);
9754 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
9756 tmp = gmtime (&time);
9757 snprintf (timebuf, sizeof (timebuf),
9758 "%04u-%02u-%02uT%02u:%02u:%02u",
9759 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9760 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
9762 printf ("%3lu: ", (unsigned long) cnt);
9763 if (do_wide)
9764 printf ("%-20s", liblist.l_name < strtab_size
9765 ? strtab + liblist.l_name : "<corrupt>");
9766 else
9767 printf ("%-20.20s", liblist.l_name < strtab_size
9768 ? strtab + liblist.l_name : "<corrupt>");
9769 printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
9770 liblist.l_version, liblist.l_flags);
9773 free (elib);
9777 return 1;
9780 static const char *
9781 get_note_type (unsigned e_type)
9783 static char buff[64];
9785 if (elf_header.e_type == ET_CORE)
9786 switch (e_type)
9788 case NT_AUXV:
9789 return _("NT_AUXV (auxiliary vector)");
9790 case NT_PRSTATUS:
9791 return _("NT_PRSTATUS (prstatus structure)");
9792 case NT_FPREGSET:
9793 return _("NT_FPREGSET (floating point registers)");
9794 case NT_PRPSINFO:
9795 return _("NT_PRPSINFO (prpsinfo structure)");
9796 case NT_TASKSTRUCT:
9797 return _("NT_TASKSTRUCT (task structure)");
9798 case NT_PRXFPREG:
9799 return _("NT_PRXFPREG (user_xfpregs structure)");
9800 case NT_PPC_VMX:
9801 return _("NT_PPC_VMX (ppc Altivec registers)");
9802 case NT_PPC_VSX:
9803 return _("NT_PPC_VSX (ppc VSX registers)");
9804 case NT_PSTATUS:
9805 return _("NT_PSTATUS (pstatus structure)");
9806 case NT_FPREGS:
9807 return _("NT_FPREGS (floating point registers)");
9808 case NT_PSINFO:
9809 return _("NT_PSINFO (psinfo structure)");
9810 case NT_LWPSTATUS:
9811 return _("NT_LWPSTATUS (lwpstatus_t structure)");
9812 case NT_LWPSINFO:
9813 return _("NT_LWPSINFO (lwpsinfo_t structure)");
9814 case NT_WIN32PSTATUS:
9815 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
9816 default:
9817 break;
9819 else
9820 switch (e_type)
9822 case NT_VERSION:
9823 return _("NT_VERSION (version)");
9824 case NT_ARCH:
9825 return _("NT_ARCH (architecture)");
9826 default:
9827 break;
9830 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
9831 return buff;
9834 static const char *
9835 get_gnu_elf_note_type (unsigned e_type)
9837 static char buff[64];
9839 switch (e_type)
9841 case NT_GNU_ABI_TAG:
9842 return _("NT_GNU_ABI_TAG (ABI version tag)");
9843 case NT_GNU_HWCAP:
9844 return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
9845 case NT_GNU_BUILD_ID:
9846 return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
9847 case NT_GNU_GOLD_VERSION:
9848 return _("NT_GNU_GOLD_VERSION (gold version)");
9849 default:
9850 break;
9853 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
9854 return buff;
9857 static const char *
9858 get_netbsd_elfcore_note_type (unsigned e_type)
9860 static char buff[64];
9862 if (e_type == NT_NETBSDCORE_PROCINFO)
9864 /* NetBSD core "procinfo" structure. */
9865 return _("NetBSD procinfo structure");
9868 /* As of Jan 2002 there are no other machine-independent notes
9869 defined for NetBSD core files. If the note type is less
9870 than the start of the machine-dependent note types, we don't
9871 understand it. */
9873 if (e_type < NT_NETBSDCORE_FIRSTMACH)
9875 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
9876 return buff;
9879 switch (elf_header.e_machine)
9881 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
9882 and PT_GETFPREGS == mach+2. */
9884 case EM_OLD_ALPHA:
9885 case EM_ALPHA:
9886 case EM_SPARC:
9887 case EM_SPARC32PLUS:
9888 case EM_SPARCV9:
9889 switch (e_type)
9891 case NT_NETBSDCORE_FIRSTMACH+0:
9892 return _("PT_GETREGS (reg structure)");
9893 case NT_NETBSDCORE_FIRSTMACH+2:
9894 return _("PT_GETFPREGS (fpreg structure)");
9895 default:
9896 break;
9898 break;
9900 /* On all other arch's, PT_GETREGS == mach+1 and
9901 PT_GETFPREGS == mach+3. */
9902 default:
9903 switch (e_type)
9905 case NT_NETBSDCORE_FIRSTMACH+1:
9906 return _("PT_GETREGS (reg structure)");
9907 case NT_NETBSDCORE_FIRSTMACH+3:
9908 return _("PT_GETFPREGS (fpreg structure)");
9909 default:
9910 break;
9914 snprintf (buff, sizeof (buff), _("PT_FIRSTMACH+%d"),
9915 e_type - NT_NETBSDCORE_FIRSTMACH);
9916 return buff;
9919 /* Note that by the ELF standard, the name field is already null byte
9920 terminated, and namesz includes the terminating null byte.
9921 I.E. the value of namesz for the name "FSF" is 4.
9923 If the value of namesz is zero, there is no name present. */
9924 static int
9925 process_note (Elf_Internal_Note *pnote)
9927 const char *name = pnote->namesz ? pnote->namedata : "(NONE)";
9928 const char *nt;
9930 if (pnote->namesz == 0)
9931 /* If there is no note name, then use the default set of
9932 note type strings. */
9933 nt = get_note_type (pnote->type);
9935 else if (const_strneq (pnote->namedata, "GNU"))
9936 /* GNU-specific object file notes. */
9937 nt = get_gnu_elf_note_type (pnote->type);
9939 else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
9940 /* NetBSD-specific core file notes. */
9941 nt = get_netbsd_elfcore_note_type (pnote->type);
9943 else if (strneq (pnote->namedata, "SPU/", 4))
9945 /* SPU-specific core file notes. */
9946 nt = pnote->namedata + 4;
9947 name = "SPU";
9950 else
9951 /* Don't recognize this note name; just use the default set of
9952 note type strings. */
9953 nt = get_note_type (pnote->type);
9955 printf (" %s\t\t0x%08lx\t%s\n", name, pnote->descsz, nt);
9956 return 1;
9960 static int
9961 process_corefile_note_segment (FILE *file, bfd_vma offset, bfd_vma length)
9963 Elf_External_Note *pnotes;
9964 Elf_External_Note *external;
9965 int res = 1;
9967 if (length <= 0)
9968 return 0;
9970 pnotes = get_data (NULL, file, offset, 1, length, _("notes"));
9971 if (!pnotes)
9972 return 0;
9974 external = pnotes;
9976 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
9977 (unsigned long) offset, (unsigned long) length);
9978 printf (_(" Owner\t\tData size\tDescription\n"));
9980 while (external < (Elf_External_Note *)((char *) pnotes + length))
9982 Elf_External_Note *next;
9983 Elf_Internal_Note inote;
9984 char *temp = NULL;
9986 inote.type = BYTE_GET (external->type);
9987 inote.namesz = BYTE_GET (external->namesz);
9988 inote.namedata = external->name;
9989 inote.descsz = BYTE_GET (external->descsz);
9990 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
9991 inote.descpos = offset + (inote.descdata - (char *) pnotes);
9993 next = (Elf_External_Note *)(inote.descdata + align_power (inote.descsz, 2));
9995 if (((char *) next) > (((char *) pnotes) + length))
9997 warn (_("corrupt note found at offset %lx into core notes\n"),
9998 (long)((char *)external - (char *)pnotes));
9999 warn (_(" type: %lx, namesize: %08lx, descsize: %08lx\n"),
10000 inote.type, inote.namesz, inote.descsz);
10001 break;
10004 external = next;
10006 /* Verify that name is null terminated. It appears that at least
10007 one version of Linux (RedHat 6.0) generates corefiles that don't
10008 comply with the ELF spec by failing to include the null byte in
10009 namesz. */
10010 if (inote.namedata[inote.namesz] != '\0')
10012 temp = malloc (inote.namesz + 1);
10014 if (temp == NULL)
10016 error (_("Out of memory\n"));
10017 res = 0;
10018 break;
10021 strncpy (temp, inote.namedata, inote.namesz);
10022 temp[inote.namesz] = 0;
10024 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
10025 inote.namedata = temp;
10028 res &= process_note (& inote);
10030 if (temp != NULL)
10032 free (temp);
10033 temp = NULL;
10037 free (pnotes);
10039 return res;
10042 static int
10043 process_corefile_note_segments (FILE *file)
10045 Elf_Internal_Phdr *segment;
10046 unsigned int i;
10047 int res = 1;
10049 if (! get_program_headers (file))
10050 return 0;
10052 for (i = 0, segment = program_headers;
10053 i < elf_header.e_phnum;
10054 i++, segment++)
10056 if (segment->p_type == PT_NOTE)
10057 res &= process_corefile_note_segment (file,
10058 (bfd_vma) segment->p_offset,
10059 (bfd_vma) segment->p_filesz);
10062 return res;
10065 static int
10066 process_note_sections (FILE *file)
10068 Elf_Internal_Shdr *section;
10069 unsigned long i;
10070 int res = 1;
10072 for (i = 0, section = section_headers;
10073 i < elf_header.e_shnum;
10074 i++, section++)
10075 if (section->sh_type == SHT_NOTE)
10076 res &= process_corefile_note_segment (file,
10077 (bfd_vma) section->sh_offset,
10078 (bfd_vma) section->sh_size);
10080 return res;
10083 static int
10084 process_notes (FILE *file)
10086 /* If we have not been asked to display the notes then do nothing. */
10087 if (! do_notes)
10088 return 1;
10090 if (elf_header.e_type != ET_CORE)
10091 return process_note_sections (file);
10093 /* No program headers means no NOTE segment. */
10094 if (elf_header.e_phnum > 0)
10095 return process_corefile_note_segments (file);
10097 printf (_("No note segments present in the core file.\n"));
10098 return 1;
10101 static int
10102 process_arch_specific (FILE *file)
10104 if (! do_arch)
10105 return 1;
10107 switch (elf_header.e_machine)
10109 case EM_ARM:
10110 return process_arm_specific (file);
10111 case EM_MIPS:
10112 case EM_MIPS_RS3_LE:
10113 return process_mips_specific (file);
10114 break;
10115 case EM_PPC:
10116 return process_power_specific (file);
10117 break;
10118 default:
10119 break;
10121 return 1;
10124 static int
10125 get_file_header (FILE *file)
10127 /* Read in the identity array. */
10128 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
10129 return 0;
10131 /* Determine how to read the rest of the header. */
10132 switch (elf_header.e_ident[EI_DATA])
10134 default: /* fall through */
10135 case ELFDATANONE: /* fall through */
10136 case ELFDATA2LSB:
10137 byte_get = byte_get_little_endian;
10138 byte_put = byte_put_little_endian;
10139 break;
10140 case ELFDATA2MSB:
10141 byte_get = byte_get_big_endian;
10142 byte_put = byte_put_big_endian;
10143 break;
10146 /* For now we only support 32 bit and 64 bit ELF files. */
10147 is_32bit_elf = (elf_header.e_ident[EI_CLASS] != ELFCLASS64);
10149 /* Read in the rest of the header. */
10150 if (is_32bit_elf)
10152 Elf32_External_Ehdr ehdr32;
10154 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
10155 return 0;
10157 elf_header.e_type = BYTE_GET (ehdr32.e_type);
10158 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
10159 elf_header.e_version = BYTE_GET (ehdr32.e_version);
10160 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
10161 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
10162 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
10163 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
10164 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
10165 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
10166 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
10167 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
10168 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
10169 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
10171 else
10173 Elf64_External_Ehdr ehdr64;
10175 /* If we have been compiled with sizeof (bfd_vma) == 4, then
10176 we will not be able to cope with the 64bit data found in
10177 64 ELF files. Detect this now and abort before we start
10178 overwriting things. */
10179 if (sizeof (bfd_vma) < 8)
10181 error (_("This instance of readelf has been built without support for a\n\
10182 64 bit data type and so it cannot read 64 bit ELF files.\n"));
10183 return 0;
10186 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
10187 return 0;
10189 elf_header.e_type = BYTE_GET (ehdr64.e_type);
10190 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
10191 elf_header.e_version = BYTE_GET (ehdr64.e_version);
10192 elf_header.e_entry = BYTE_GET (ehdr64.e_entry);
10193 elf_header.e_phoff = BYTE_GET (ehdr64.e_phoff);
10194 elf_header.e_shoff = BYTE_GET (ehdr64.e_shoff);
10195 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
10196 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
10197 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
10198 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
10199 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
10200 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
10201 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
10204 if (elf_header.e_shoff)
10206 /* There may be some extensions in the first section header. Don't
10207 bomb if we can't read it. */
10208 if (is_32bit_elf)
10209 get_32bit_section_headers (file, 1);
10210 else
10211 get_64bit_section_headers (file, 1);
10214 return 1;
10217 /* Process one ELF object file according to the command line options.
10218 This file may actually be stored in an archive. The file is
10219 positioned at the start of the ELF object. */
10221 static int
10222 process_object (char *file_name, FILE *file)
10224 unsigned int i;
10226 if (! get_file_header (file))
10228 error (_("%s: Failed to read file header\n"), file_name);
10229 return 1;
10232 /* Initialise per file variables. */
10233 for (i = ARRAY_SIZE (version_info); i--;)
10234 version_info[i] = 0;
10236 for (i = ARRAY_SIZE (dynamic_info); i--;)
10237 dynamic_info[i] = 0;
10239 /* Process the file. */
10240 if (show_name)
10241 printf (_("\nFile: %s\n"), file_name);
10243 /* Initialise the dump_sects array from the cmdline_dump_sects array.
10244 Note we do this even if cmdline_dump_sects is empty because we
10245 must make sure that the dump_sets array is zeroed out before each
10246 object file is processed. */
10247 if (num_dump_sects > num_cmdline_dump_sects)
10248 memset (dump_sects, 0, num_dump_sects * sizeof (* dump_sects));
10250 if (num_cmdline_dump_sects > 0)
10252 if (num_dump_sects == 0)
10253 /* A sneaky way of allocating the dump_sects array. */
10254 request_dump_bynumber (num_cmdline_dump_sects, 0);
10256 assert (num_dump_sects >= num_cmdline_dump_sects);
10257 memcpy (dump_sects, cmdline_dump_sects,
10258 num_cmdline_dump_sects * sizeof (* dump_sects));
10261 if (! process_file_header ())
10262 return 1;
10264 if (! process_section_headers (file))
10266 /* Without loaded section headers we cannot process lots of
10267 things. */
10268 do_unwind = do_version = do_dump = do_arch = 0;
10270 if (! do_using_dynamic)
10271 do_syms = do_reloc = 0;
10274 if (! process_section_groups (file))
10276 /* Without loaded section groups we cannot process unwind. */
10277 do_unwind = 0;
10280 if (process_program_headers (file))
10281 process_dynamic_section (file);
10283 process_relocs (file);
10285 process_unwind (file);
10287 process_symbol_table (file);
10289 process_syminfo (file);
10291 process_version_sections (file);
10293 process_section_contents (file);
10295 process_notes (file);
10297 process_gnu_liblist (file);
10299 process_arch_specific (file);
10301 if (program_headers)
10303 free (program_headers);
10304 program_headers = NULL;
10307 if (section_headers)
10309 free (section_headers);
10310 section_headers = NULL;
10313 if (string_table)
10315 free (string_table);
10316 string_table = NULL;
10317 string_table_length = 0;
10320 if (dynamic_strings)
10322 free (dynamic_strings);
10323 dynamic_strings = NULL;
10324 dynamic_strings_length = 0;
10327 if (dynamic_symbols)
10329 free (dynamic_symbols);
10330 dynamic_symbols = NULL;
10331 num_dynamic_syms = 0;
10334 if (dynamic_syminfo)
10336 free (dynamic_syminfo);
10337 dynamic_syminfo = NULL;
10340 if (section_headers_groups)
10342 free (section_headers_groups);
10343 section_headers_groups = NULL;
10346 if (section_groups)
10348 struct group_list *g, *next;
10350 for (i = 0; i < group_count; i++)
10352 for (g = section_groups [i].root; g != NULL; g = next)
10354 next = g->next;
10355 free (g);
10359 free (section_groups);
10360 section_groups = NULL;
10363 free_debug_memory ();
10365 return 0;
10368 /* Process an ELF archive.
10369 On entry the file is positioned just after the ARMAG string. */
10371 static int
10372 process_archive (char *file_name, FILE *file)
10374 struct ar_hdr arhdr;
10375 size_t got;
10376 unsigned long size;
10377 unsigned long index_num = 0;
10378 unsigned long *index_array = NULL;
10379 char *sym_table = NULL;
10380 unsigned long sym_size = 0;
10381 char *longnames = NULL;
10382 unsigned long longnames_size = 0;
10383 size_t file_name_size;
10384 int ret;
10386 show_name = 1;
10388 got = fread (&arhdr, 1, sizeof arhdr, file);
10389 if (got != sizeof arhdr)
10391 if (got == 0)
10392 return 0;
10394 error (_("%s: failed to read archive header\n"), file_name);
10395 return 1;
10398 /* See if this is the archive symbol table. */
10399 if (const_strneq (arhdr.ar_name, "/ ")
10400 || const_strneq (arhdr.ar_name, "/SYM64/ "))
10402 size = strtoul (arhdr.ar_size, NULL, 10);
10403 size = size + (size & 1);
10405 if (do_archive_index)
10407 unsigned long i;
10408 /* A buffer used to hold numbers read in from an archive index.
10409 These are always 4 bytes long and stored in big-endian format. */
10410 #define SIZEOF_AR_INDEX_NUMBERS 4
10411 unsigned char integer_buffer[SIZEOF_AR_INDEX_NUMBERS];
10412 unsigned char * index_buffer;
10414 /* Check the size of the archive index. */
10415 if (size < SIZEOF_AR_INDEX_NUMBERS)
10417 error (_("%s: the archive index is empty\n"), file_name);
10418 return 1;
10421 /* Read the numer of entries in the archive index. */
10422 got = fread (integer_buffer, 1, sizeof integer_buffer, file);
10423 if (got != sizeof (integer_buffer))
10425 error (_("%s: failed to read archive index\n"), file_name);
10426 return 1;
10428 index_num = byte_get_big_endian (integer_buffer, sizeof integer_buffer);
10429 size -= SIZEOF_AR_INDEX_NUMBERS;
10431 /* Read in the archive index. */
10432 if (size < index_num * SIZEOF_AR_INDEX_NUMBERS)
10434 error (_("%s: the archive index is supposed to have %ld entries, but the size in the header is too small\n"),
10435 file_name, index_num);
10436 return 1;
10438 index_buffer = malloc (index_num * SIZEOF_AR_INDEX_NUMBERS);
10439 if (index_buffer == NULL)
10441 error (_("Out of memory whilst trying to read archive symbol index\n"));
10442 return 1;
10444 got = fread (index_buffer, SIZEOF_AR_INDEX_NUMBERS, index_num, file);
10445 if (got != index_num)
10447 free (index_buffer);
10448 error (_("%s: failed to read archive index\n"), file_name);
10449 ret = 1;
10450 goto out;
10452 size -= index_num * SIZEOF_AR_INDEX_NUMBERS;
10454 /* Convert the index numbers into the host's numeric format. */
10455 index_array = malloc (index_num * sizeof (* index_array));
10456 if (index_array == NULL)
10458 free (index_buffer);
10459 error (_("Out of memory whilst trying to convert the archive symbol index\n"));
10460 return 1;
10463 for (i = 0; i < index_num; i++)
10464 index_array[i] = byte_get_big_endian ((unsigned char *)(index_buffer + (i * SIZEOF_AR_INDEX_NUMBERS)),
10465 SIZEOF_AR_INDEX_NUMBERS);
10466 free (index_buffer);
10468 /* The remaining space in the header is taken up by the symbol table. */
10469 if (size < 1)
10471 error (_("%s: the archive has an index but no symbols\n"), file_name);
10472 ret = 1;
10473 goto out;
10475 sym_table = malloc (size);
10476 sym_size = size;
10477 if (sym_table == NULL)
10479 error (_("Out of memory whilst trying to read archive index symbol table\n"));
10480 ret = 1;
10481 goto out;
10483 got = fread (sym_table, 1, size, file);
10484 if (got != size)
10486 error (_("%s: failed to read archive index symbol table\n"), file_name);
10487 ret = 1;
10488 goto out;
10491 else
10493 if (fseek (file, size, SEEK_CUR) != 0)
10495 error (_("%s: failed to skip archive symbol table\n"), file_name);
10496 return 1;
10500 got = fread (& arhdr, 1, sizeof arhdr, file);
10501 if (got != sizeof arhdr)
10503 if (got == 0)
10505 ret = 0;
10506 goto out;
10509 error (_("%s: failed to read archive header following archive index\n"), file_name);
10510 ret = 1;
10511 goto out;
10514 else if (do_archive_index)
10515 printf (_("%s has no archive index\n"), file_name);
10517 if (const_strneq (arhdr.ar_name, "// "))
10519 /* This is the archive string table holding long member
10520 names. */
10522 longnames_size = strtoul (arhdr.ar_size, NULL, 10);
10523 longnames = malloc (longnames_size);
10524 if (longnames == NULL)
10526 error (_("Out of memory reading long symbol names in archive\n"));
10527 ret = 1;
10528 goto out;
10531 if (fread (longnames, longnames_size, 1, file) != 1)
10533 free (longnames);
10534 error (_("%s: failed to read long symbol name string table\n"), file_name);
10535 ret = 1;
10536 goto out;
10539 if ((longnames_size & 1) != 0)
10540 getc (file);
10542 got = fread (& arhdr, 1, sizeof arhdr, file);
10543 if (got != sizeof arhdr)
10545 if (got == 0)
10546 ret = 0;
10547 else
10549 error (_("%s: failed to read archive header following long symbol names\n"), file_name);
10550 ret = 1;
10552 goto out;
10556 if (do_archive_index)
10558 if (sym_table == NULL)
10559 error (_("%s: unable to dump the index as none was found\n"), file_name);
10560 else
10562 unsigned int i, j, k, l;
10563 char elf_name[16];
10564 unsigned long current_pos;
10566 printf (_("Index of archive %s: (%ld entries, 0x%lx bytes in the symbol table)\n"),
10567 file_name, index_num, sym_size);
10568 current_pos = ftell (file);
10570 for (i = l = 0; i < index_num; i++)
10572 if ((i == 0) || ((i > 0) && (index_array[i] != index_array[i - 1])))
10574 if (fseek (file, index_array[i], SEEK_SET) != 0)
10576 error (_("%s: failed to seek to next file name\n"), file_name);
10577 ret = 1;
10578 goto out;
10580 got = fread (elf_name, 1, 16, file);
10581 if (got != 16)
10583 error (_("%s: failed to read file name\n"), file_name);
10584 ret = 1;
10585 goto out;
10588 if (elf_name[0] == '/')
10590 /* We have a long name. */
10591 k = j = strtoul (elf_name + 1, NULL, 10);
10592 while ((j < longnames_size) && (longnames[j] != '/'))
10593 j++;
10594 longnames[j] = '\0';
10595 printf (_("Binary %s contains:\n"), longnames + k);
10596 longnames[j] = '/';
10598 else
10600 j = 0;
10601 while ((elf_name[j] != '/') && (j < 16))
10602 j++;
10603 elf_name[j] = '\0';
10604 printf(_("Binary %s contains:\n"), elf_name);
10607 if (l >= sym_size)
10609 error (_("%s: end of the symbol table reached before the end of the index\n"),
10610 file_name);
10611 break;
10613 printf ("\t%s\n", sym_table + l);
10614 l += strlen (sym_table + l) + 1;
10617 if (l < sym_size)
10618 error (_("%s: symbols remain in the index symbol table, but without corresponding entries in the index table\n"),
10619 file_name);
10621 free (index_array);
10622 index_array = NULL;
10623 free (sym_table);
10624 sym_table = NULL;
10625 if (fseek (file, current_pos, SEEK_SET) != 0)
10627 error (_("%s: failed to seek back to start of object files in the archive\n"), file_name);
10628 return 1;
10632 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
10633 && !do_segments && !do_header && !do_dump && !do_version
10634 && !do_histogram && !do_debugging && !do_arch && !do_notes
10635 && !do_section_groups)
10636 return 0; /* Archive index only. */
10639 file_name_size = strlen (file_name);
10640 ret = 0;
10642 while (1)
10644 char *name;
10645 char *nameend;
10646 char *namealc;
10648 if (arhdr.ar_name[0] == '/')
10650 unsigned long off;
10652 off = strtoul (arhdr.ar_name + 1, NULL, 10);
10653 if (off >= longnames_size)
10655 error (_("%s: invalid archive string table offset %lu\n"), file_name, off);
10656 ret = 1;
10657 break;
10660 name = longnames + off;
10661 nameend = memchr (name, '/', longnames_size - off);
10663 else
10665 name = arhdr.ar_name;
10666 nameend = memchr (name, '/', 16);
10669 if (nameend == NULL)
10671 error (_("%s: bad archive file name\n"), file_name);
10672 ret = 1;
10673 break;
10676 namealc = malloc (file_name_size + (nameend - name) + 3);
10677 if (namealc == NULL)
10679 error (_("Out of memory\n"));
10680 ret = 1;
10681 break;
10684 memcpy (namealc, file_name, file_name_size);
10685 namealc[file_name_size] = '(';
10686 memcpy (namealc + file_name_size + 1, name, nameend - name);
10687 namealc[file_name_size + 1 + (nameend - name)] = ')';
10688 namealc[file_name_size + 2 + (nameend - name)] = '\0';
10690 archive_file_offset = ftell (file);
10691 archive_file_size = strtoul (arhdr.ar_size, NULL, 10);
10693 ret |= process_object (namealc, file);
10695 free (namealc);
10697 if (fseek (file,
10698 (archive_file_offset
10699 + archive_file_size
10700 + (archive_file_size & 1)),
10701 SEEK_SET) != 0)
10703 error (_("%s: failed to seek to next archive header\n"), file_name);
10704 ret = 1;
10705 break;
10708 got = fread (&arhdr, 1, sizeof arhdr, file);
10709 if (got != sizeof arhdr)
10711 if (got == 0)
10712 break;
10714 error (_("%s: failed to read archive header\n"), file_name);
10715 ret = 1;
10716 break;
10720 out:
10721 if (index_array != NULL)
10722 free (index_array);
10723 if (sym_table != NULL)
10724 free (sym_table);
10725 if (longnames != NULL)
10726 free (longnames);
10728 return ret;
10731 static int
10732 process_file (char *file_name)
10734 FILE *file;
10735 struct stat statbuf;
10736 char armag[SARMAG];
10737 int ret;
10739 if (stat (file_name, &statbuf) < 0)
10741 if (errno == ENOENT)
10742 error (_("'%s': No such file\n"), file_name);
10743 else
10744 error (_("Could not locate '%s'. System error message: %s\n"),
10745 file_name, strerror (errno));
10746 return 1;
10749 if (! S_ISREG (statbuf.st_mode))
10751 error (_("'%s' is not an ordinary file\n"), file_name);
10752 return 1;
10755 file = fopen (file_name, "rb");
10756 if (file == NULL)
10758 error (_("Input file '%s' is not readable.\n"), file_name);
10759 return 1;
10762 if (fread (armag, SARMAG, 1, file) != 1)
10764 error (_("%s: Failed to read file's magic number\n"), file_name);
10765 fclose (file);
10766 return 1;
10769 if (memcmp (armag, ARMAG, SARMAG) == 0)
10770 ret = process_archive (file_name, file);
10771 else
10773 if (do_archive_index)
10774 error (_("File %s is not an archive so its index cannot be displayed.\n"),
10775 file_name);
10777 rewind (file);
10778 archive_file_size = archive_file_offset = 0;
10779 ret = process_object (file_name, file);
10782 fclose (file);
10784 return ret;
10787 #ifdef SUPPORT_DISASSEMBLY
10788 /* Needed by the i386 disassembler. For extra credit, someone could
10789 fix this so that we insert symbolic addresses here, esp for GOT/PLT
10790 symbols. */
10792 void
10793 print_address (unsigned int addr, FILE *outfile)
10795 fprintf (outfile,"0x%8.8x", addr);
10798 /* Needed by the i386 disassembler. */
10799 void
10800 db_task_printsym (unsigned int addr)
10802 print_address (addr, stderr);
10804 #endif
10807 main (int argc, char **argv)
10809 int err;
10811 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
10812 setlocale (LC_MESSAGES, "");
10813 #endif
10814 #if defined (HAVE_SETLOCALE)
10815 setlocale (LC_CTYPE, "");
10816 #endif
10817 bindtextdomain (PACKAGE, LOCALEDIR);
10818 textdomain (PACKAGE);
10820 expandargv (&argc, &argv);
10822 parse_args (argc, argv);
10824 if (num_dump_sects > 0)
10826 /* Make a copy of the dump_sects array. */
10827 cmdline_dump_sects = malloc (num_dump_sects * sizeof (* dump_sects));
10828 if (cmdline_dump_sects == NULL)
10829 error (_("Out of memory allocating dump request table.\n"));
10830 else
10832 memcpy (cmdline_dump_sects, dump_sects,
10833 num_dump_sects * sizeof (* dump_sects));
10834 num_cmdline_dump_sects = num_dump_sects;
10838 if (optind < (argc - 1))
10839 show_name = 1;
10841 err = 0;
10842 while (optind < argc)
10843 err |= process_file (argv[optind++]);
10845 if (dump_sects != NULL)
10846 free (dump_sects);
10847 if (cmdline_dump_sects != NULL)
10848 free (cmdline_dump_sects);
10850 return err;