* config/tc-cr16.c (getprocreg_image): Fix typo MAX_PREG ->
[binutils.git] / binutils / readelf.c
blob0ed5c7c1ed4880b0b161e8f5d12029fd11236205
1 /* readelf.c -- display contents of an ELF format file
2 Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
3 2008, 2009, 2010
4 Free Software Foundation, Inc.
6 Originally developed by Eric Youngdale <eric@andante.jic.com>
7 Modifications by Nick Clifton <nickc@redhat.com>
9 This file is part of GNU Binutils.
11 This program is free software; you can redistribute it and/or modify
12 it under the terms of the GNU General Public License as published by
13 the Free Software Foundation; either version 3 of the License, or
14 (at your option) any later version.
16 This program is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU General Public License for more details.
21 You should have received a copy of the GNU General Public License
22 along with this program; if not, write to the Free Software
23 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
24 02110-1301, USA. */
26 /* The difference between readelf and objdump:
28 Both programs are capable of displaying the contents of ELF format files,
29 so why does the binutils project have two file dumpers ?
31 The reason is that objdump sees an ELF file through a BFD filter of the
32 world; if BFD has a bug where, say, it disagrees about a machine constant
33 in e_flags, then the odds are good that it will remain internally
34 consistent. The linker sees it the BFD way, objdump sees it the BFD way,
35 GAS sees it the BFD way. There was need for a tool to go find out what
36 the file actually says.
38 This is why the readelf program does not link against the BFD library - it
39 exists as an independent program to help verify the correct working of BFD.
41 There is also the case that readelf can provide more information about an
42 ELF file than is provided by objdump. In particular it can display DWARF
43 debugging information which (at the moment) objdump cannot. */
45 #include "config.h"
46 #include "sysdep.h"
47 #include <assert.h>
48 #include <sys/stat.h>
49 #include <time.h>
50 #ifdef HAVE_ZLIB_H
51 #include <zlib.h>
52 #endif
54 #if __GNUC__ >= 2
55 /* Define BFD64 here, even if our default architecture is 32 bit ELF
56 as this will allow us to read in and parse 64bit and 32bit ELF files.
57 Only do this if we believe that the compiler can support a 64 bit
58 data type. For now we only rely on GCC being able to do this. */
59 #define BFD64
60 #endif
62 #include "bfd.h"
63 #include "bucomm.h"
64 #include "dwarf.h"
66 #include "elf/common.h"
67 #include "elf/external.h"
68 #include "elf/internal.h"
71 /* Included here, before RELOC_MACROS_GEN_FUNC is defined, so that
72 we can obtain the H8 reloc numbers. We need these for the
73 get_reloc_size() function. We include h8.h again after defining
74 RELOC_MACROS_GEN_FUNC so that we get the naming function as well. */
76 #include "elf/h8.h"
77 #undef _ELF_H8_H
79 /* Undo the effects of #including reloc-macros.h. */
81 #undef START_RELOC_NUMBERS
82 #undef RELOC_NUMBER
83 #undef FAKE_RELOC
84 #undef EMPTY_RELOC
85 #undef END_RELOC_NUMBERS
86 #undef _RELOC_MACROS_H
88 /* The following headers use the elf/reloc-macros.h file to
89 automatically generate relocation recognition functions
90 such as elf_mips_reloc_type() */
92 #define RELOC_MACROS_GEN_FUNC
94 #include "elf/alpha.h"
95 #include "elf/arc.h"
96 #include "elf/arm.h"
97 #include "elf/avr.h"
98 #include "elf/bfin.h"
99 #include "elf/cr16.h"
100 #include "elf/cris.h"
101 #include "elf/crx.h"
102 #include "elf/d10v.h"
103 #include "elf/d30v.h"
104 #include "elf/dlx.h"
105 #include "elf/fr30.h"
106 #include "elf/frv.h"
107 #include "elf/h8.h"
108 #include "elf/hppa.h"
109 #include "elf/i386.h"
110 #include "elf/i370.h"
111 #include "elf/i860.h"
112 #include "elf/i960.h"
113 #include "elf/ia64.h"
114 #include "elf/ip2k.h"
115 #include "elf/lm32.h"
116 #include "elf/iq2000.h"
117 #include "elf/m32c.h"
118 #include "elf/m32r.h"
119 #include "elf/m68k.h"
120 #include "elf/m68hc11.h"
121 #include "elf/mcore.h"
122 #include "elf/mep.h"
123 #include "elf/microblaze.h"
124 #include "elf/mips.h"
125 #include "elf/mmix.h"
126 #include "elf/mn10200.h"
127 #include "elf/mn10300.h"
128 #include "elf/moxie.h"
129 #include "elf/mt.h"
130 #include "elf/msp430.h"
131 #include "elf/or32.h"
132 #include "elf/pj.h"
133 #include "elf/ppc.h"
134 #include "elf/ppc64.h"
135 #include "elf/rx.h"
136 #include "elf/s390.h"
137 #include "elf/score.h"
138 #include "elf/sh.h"
139 #include "elf/sparc.h"
140 #include "elf/spu.h"
141 #include "elf/tic6x.h"
142 #include "elf/v850.h"
143 #include "elf/vax.h"
144 #include "elf/x86-64.h"
145 #include "elf/xc16x.h"
146 #include "elf/xstormy16.h"
147 #include "elf/xtensa.h"
149 #include "aout/ar.h"
151 #include "getopt.h"
152 #include "libiberty.h"
153 #include "safe-ctype.h"
154 #include "filenames.h"
156 char * program_name = "readelf";
157 static long archive_file_offset;
158 static unsigned long archive_file_size;
159 static unsigned long dynamic_addr;
160 static bfd_size_type dynamic_size;
161 static unsigned int dynamic_nent;
162 static char * dynamic_strings;
163 static unsigned long dynamic_strings_length;
164 static char * string_table;
165 static unsigned long string_table_length;
166 static unsigned long num_dynamic_syms;
167 static Elf_Internal_Sym * dynamic_symbols;
168 static Elf_Internal_Syminfo * dynamic_syminfo;
169 static unsigned long dynamic_syminfo_offset;
170 static unsigned int dynamic_syminfo_nent;
171 static char program_interpreter[PATH_MAX];
172 static bfd_vma dynamic_info[DT_ENCODING];
173 static bfd_vma dynamic_info_DT_GNU_HASH;
174 static bfd_vma version_info[16];
175 static Elf_Internal_Ehdr elf_header;
176 static Elf_Internal_Shdr * section_headers;
177 static Elf_Internal_Phdr * program_headers;
178 static Elf_Internal_Dyn * dynamic_section;
179 static Elf_Internal_Shdr * symtab_shndx_hdr;
180 static int show_name;
181 static int do_dynamic;
182 static int do_syms;
183 static int do_dyn_syms;
184 static int do_reloc;
185 static int do_sections;
186 static int do_section_groups;
187 static int do_section_details;
188 static int do_segments;
189 static int do_unwind;
190 static int do_using_dynamic;
191 static int do_header;
192 static int do_dump;
193 static int do_version;
194 static int do_histogram;
195 static int do_debugging;
196 static int do_arch;
197 static int do_notes;
198 static int do_archive_index;
199 static int is_32bit_elf;
201 struct group_list
203 struct group_list * next;
204 unsigned int section_index;
207 struct group
209 struct group_list * root;
210 unsigned int group_index;
213 static size_t group_count;
214 static struct group * section_groups;
215 static struct group ** section_headers_groups;
218 /* Flag bits indicating particular types of dump. */
219 #define HEX_DUMP (1 << 0) /* The -x command line switch. */
220 #define DISASS_DUMP (1 << 1) /* The -i command line switch. */
221 #define DEBUG_DUMP (1 << 2) /* The -w command line switch. */
222 #define STRING_DUMP (1 << 3) /* The -p command line switch. */
223 #define RELOC_DUMP (1 << 4) /* The -R command line switch. */
225 typedef unsigned char dump_type;
227 /* A linked list of the section names for which dumps were requested. */
228 struct dump_list_entry
230 char * name;
231 dump_type type;
232 struct dump_list_entry * next;
234 static struct dump_list_entry * dump_sects_byname;
236 /* A dynamic array of flags indicating for which sections a dump
237 has been requested via command line switches. */
238 static dump_type * cmdline_dump_sects = NULL;
239 static unsigned int num_cmdline_dump_sects = 0;
241 /* A dynamic array of flags indicating for which sections a dump of
242 some kind has been requested. It is reset on a per-object file
243 basis and then initialised from the cmdline_dump_sects array,
244 the results of interpreting the -w switch, and the
245 dump_sects_byname list. */
246 static dump_type * dump_sects = NULL;
247 static unsigned int num_dump_sects = 0;
250 /* How to print a vma value. */
251 typedef enum print_mode
253 HEX,
254 DEC,
255 DEC_5,
256 UNSIGNED,
257 PREFIX_HEX,
258 FULL_HEX,
259 LONG_HEX
261 print_mode;
263 static void (* byte_put) (unsigned char *, bfd_vma, int);
265 #define UNKNOWN -1
267 #define SECTION_NAME(X) \
268 ((X) == NULL ? _("<none>") \
269 : string_table == NULL ? _("<no-name>") \
270 : ((X)->sh_name >= string_table_length ? _("<corrupt>") \
271 : string_table + (X)->sh_name))
273 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
275 #define BYTE_GET(field) byte_get (field, sizeof (field))
276 #define BYTE_GET_SIGNED(field) byte_get_signed (field, sizeof (field))
278 #define GET_ELF_SYMBOLS(file, section) \
279 (is_32bit_elf ? get_32bit_elf_symbols (file, section) \
280 : get_64bit_elf_symbols (file, section))
282 #define VALID_DYNAMIC_NAME(offset) ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
283 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
284 already been called and verified that the string exists. */
285 #define GET_DYNAMIC_NAME(offset) (dynamic_strings + offset)
287 /* This is just a bit of syntatic sugar. */
288 #define streq(a,b) (strcmp ((a), (b)) == 0)
289 #define strneq(a,b,n) (strncmp ((a), (b), (n)) == 0)
290 #define const_strneq(a,b) (strncmp ((a), (b), sizeof (b) - 1) == 0)
292 #define REMOVE_ARCH_BITS(ADDR) do { \
293 if (elf_header.e_machine == EM_ARM) \
294 (ADDR) &= ~1; \
295 } while (0)
297 static void *
298 get_data (void * var, FILE * file, long offset, size_t size, size_t nmemb,
299 const char * reason)
301 void * mvar;
303 if (size == 0 || nmemb == 0)
304 return NULL;
306 if (fseek (file, archive_file_offset + offset, SEEK_SET))
308 error (_("Unable to seek to 0x%lx for %s\n"),
309 (unsigned long) archive_file_offset + offset, reason);
310 return NULL;
313 mvar = var;
314 if (mvar == NULL)
316 /* Check for overflow. */
317 if (nmemb < (~(size_t) 0 - 1) / size)
318 /* + 1 so that we can '\0' terminate invalid string table sections. */
319 mvar = malloc (size * nmemb + 1);
321 if (mvar == NULL)
323 error (_("Out of memory allocating 0x%lx bytes for %s\n"),
324 (unsigned long)(size * nmemb), reason);
325 return NULL;
328 ((char *) mvar)[size * nmemb] = '\0';
331 if (fread (mvar, size, nmemb, file) != nmemb)
333 error (_("Unable to read in 0x%lx bytes of %s\n"),
334 (unsigned long)(size * nmemb), reason);
335 if (mvar != var)
336 free (mvar);
337 return NULL;
340 return mvar;
343 static void
344 byte_put_little_endian (unsigned char * field, bfd_vma value, int size)
346 switch (size)
348 case 8:
349 field[7] = (((value >> 24) >> 24) >> 8) & 0xff;
350 field[6] = ((value >> 24) >> 24) & 0xff;
351 field[5] = ((value >> 24) >> 16) & 0xff;
352 field[4] = ((value >> 24) >> 8) & 0xff;
353 /* Fall through. */
354 case 4:
355 field[3] = (value >> 24) & 0xff;
356 /* Fall through. */
357 case 3:
358 field[2] = (value >> 16) & 0xff;
359 /* Fall through. */
360 case 2:
361 field[1] = (value >> 8) & 0xff;
362 /* Fall through. */
363 case 1:
364 field[0] = value & 0xff;
365 break;
367 default:
368 error (_("Unhandled data length: %d\n"), size);
369 abort ();
373 /* Print a VMA value. */
375 static int
376 print_vma (bfd_vma vma, print_mode mode)
378 int nc = 0;
380 switch (mode)
382 case FULL_HEX:
383 nc = printf ("0x");
384 /* Drop through. */
386 case LONG_HEX:
387 #ifdef BFD64
388 if (is_32bit_elf)
389 return nc + printf ("%8.8" BFD_VMA_FMT "x", vma);
390 #endif
391 printf_vma (vma);
392 return nc + 16;
394 case DEC_5:
395 if (vma <= 99999)
396 return printf ("%5" BFD_VMA_FMT "d", vma);
397 /* Drop through. */
399 case PREFIX_HEX:
400 nc = printf ("0x");
401 /* Drop through. */
403 case HEX:
404 return nc + printf ("%" BFD_VMA_FMT "x", vma);
406 case DEC:
407 return printf ("%" BFD_VMA_FMT "d", vma);
409 case UNSIGNED:
410 return printf ("%" BFD_VMA_FMT "u", vma);
412 return 0;
415 /* Display a symbol on stdout. Handles the display of non-printing characters.
417 If DO_WIDE is not true then format the symbol to be at most WIDTH characters,
418 truncating as necessary. If WIDTH is negative then format the string to be
419 exactly - WIDTH characters, truncating or padding as necessary.
421 Returns the number of emitted characters. */
423 static unsigned int
424 print_symbol (int width, const char * symbol)
426 const char * c;
427 bfd_boolean extra_padding = FALSE;
428 unsigned int num_printed = 0;
430 if (do_wide)
432 /* Set the width to a very large value. This simplifies the code below. */
433 width = INT_MAX;
435 else if (width < 0)
437 /* Keep the width positive. This also helps. */
438 width = - width;
439 extra_padding = TRUE;
442 while (width)
444 int len;
446 c = symbol;
448 /* Look for non-printing symbols inside the symbol's name.
449 This test is triggered in particular by the names generated
450 by the assembler for local labels. */
451 while (ISPRINT (* c))
452 c++;
454 len = c - symbol;
456 if (len)
458 if (len > width)
459 len = width;
461 printf ("%.*s", len, symbol);
463 width -= len;
464 num_printed += len;
467 if (* c == 0 || width == 0)
468 break;
470 /* Now display the non-printing character, if
471 there is room left in which to dipslay it. */
472 if (*c < 32)
474 if (width < 2)
475 break;
477 printf ("^%c", *c + 0x40);
479 width -= 2;
480 num_printed += 2;
482 else
484 if (width < 6)
485 break;
487 printf ("<0x%.2x>", *c);
489 width -= 6;
490 num_printed += 6;
493 symbol = c + 1;
496 if (extra_padding && width > 0)
498 /* Fill in the remaining spaces. */
499 printf ("%-*s", width, " ");
500 num_printed += 2;
503 return num_printed;
506 static void
507 byte_put_big_endian (unsigned char * field, bfd_vma value, int size)
509 switch (size)
511 case 8:
512 field[7] = value & 0xff;
513 field[6] = (value >> 8) & 0xff;
514 field[5] = (value >> 16) & 0xff;
515 field[4] = (value >> 24) & 0xff;
516 value >>= 16;
517 value >>= 16;
518 /* Fall through. */
519 case 4:
520 field[3] = value & 0xff;
521 value >>= 8;
522 /* Fall through. */
523 case 3:
524 field[2] = value & 0xff;
525 value >>= 8;
526 /* Fall through. */
527 case 2:
528 field[1] = value & 0xff;
529 value >>= 8;
530 /* Fall through. */
531 case 1:
532 field[0] = value & 0xff;
533 break;
535 default:
536 error (_("Unhandled data length: %d\n"), size);
537 abort ();
541 /* Return a pointer to section NAME, or NULL if no such section exists. */
543 static Elf_Internal_Shdr *
544 find_section (const char * name)
546 unsigned int i;
548 for (i = 0; i < elf_header.e_shnum; i++)
549 if (streq (SECTION_NAME (section_headers + i), name))
550 return section_headers + i;
552 return NULL;
555 /* Return a pointer to a section containing ADDR, or NULL if no such
556 section exists. */
558 static Elf_Internal_Shdr *
559 find_section_by_address (bfd_vma addr)
561 unsigned int i;
563 for (i = 0; i < elf_header.e_shnum; i++)
565 Elf_Internal_Shdr *sec = section_headers + i;
566 if (addr >= sec->sh_addr && addr < sec->sh_addr + sec->sh_size)
567 return sec;
570 return NULL;
573 /* Read an unsigned LEB128 encoded value from p. Set *PLEN to the number of
574 bytes read. */
576 static unsigned long
577 read_uleb128 (unsigned char *data, unsigned int *length_return)
579 return read_leb128 (data, length_return, 0);
582 /* Return true if the current file is for IA-64 machine and OpenVMS ABI.
583 This OS has so many departures from the ELF standard that we test it at
584 many places. */
586 static inline int
587 is_ia64_vms (void)
589 return elf_header.e_machine == EM_IA_64
590 && elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS;
593 /* Guess the relocation size commonly used by the specific machines. */
595 static int
596 guess_is_rela (unsigned int e_machine)
598 switch (e_machine)
600 /* Targets that use REL relocations. */
601 case EM_386:
602 case EM_486:
603 case EM_960:
604 case EM_ARM:
605 case EM_D10V:
606 case EM_CYGNUS_D10V:
607 case EM_DLX:
608 case EM_MIPS:
609 case EM_MIPS_RS3_LE:
610 case EM_CYGNUS_M32R:
611 case EM_OPENRISC:
612 case EM_OR32:
613 case EM_SCORE:
614 return FALSE;
616 /* Targets that use RELA relocations. */
617 case EM_68K:
618 case EM_860:
619 case EM_ALPHA:
620 case EM_ALTERA_NIOS2:
621 case EM_AVR:
622 case EM_AVR_OLD:
623 case EM_BLACKFIN:
624 case EM_CR16:
625 case EM_CR16_OLD:
626 case EM_CRIS:
627 case EM_CRX:
628 case EM_D30V:
629 case EM_CYGNUS_D30V:
630 case EM_FR30:
631 case EM_CYGNUS_FR30:
632 case EM_CYGNUS_FRV:
633 case EM_H8S:
634 case EM_H8_300:
635 case EM_H8_300H:
636 case EM_IA_64:
637 case EM_IP2K:
638 case EM_IP2K_OLD:
639 case EM_IQ2000:
640 case EM_LATTICEMICO32:
641 case EM_M32C_OLD:
642 case EM_M32C:
643 case EM_M32R:
644 case EM_MCORE:
645 case EM_CYGNUS_MEP:
646 case EM_MMIX:
647 case EM_MN10200:
648 case EM_CYGNUS_MN10200:
649 case EM_MN10300:
650 case EM_CYGNUS_MN10300:
651 case EM_MOXIE:
652 case EM_MSP430:
653 case EM_MSP430_OLD:
654 case EM_MT:
655 case EM_NIOS32:
656 case EM_PPC64:
657 case EM_PPC:
658 case EM_RX:
659 case EM_S390:
660 case EM_S390_OLD:
661 case EM_SH:
662 case EM_SPARC:
663 case EM_SPARC32PLUS:
664 case EM_SPARCV9:
665 case EM_SPU:
666 case EM_TI_C6000:
667 case EM_V850:
668 case EM_CYGNUS_V850:
669 case EM_VAX:
670 case EM_X86_64:
671 case EM_L1OM:
672 case EM_XSTORMY16:
673 case EM_XTENSA:
674 case EM_XTENSA_OLD:
675 case EM_MICROBLAZE:
676 case EM_MICROBLAZE_OLD:
677 return TRUE;
679 case EM_68HC05:
680 case EM_68HC08:
681 case EM_68HC11:
682 case EM_68HC16:
683 case EM_FX66:
684 case EM_ME16:
685 case EM_MMA:
686 case EM_NCPU:
687 case EM_NDR1:
688 case EM_PCP:
689 case EM_ST100:
690 case EM_ST19:
691 case EM_ST7:
692 case EM_ST9PLUS:
693 case EM_STARCORE:
694 case EM_SVX:
695 case EM_TINYJ:
696 default:
697 warn (_("Don't know about relocations on this machine architecture\n"));
698 return FALSE;
702 static int
703 slurp_rela_relocs (FILE * file,
704 unsigned long rel_offset,
705 unsigned long rel_size,
706 Elf_Internal_Rela ** relasp,
707 unsigned long * nrelasp)
709 Elf_Internal_Rela * relas;
710 unsigned long nrelas;
711 unsigned int i;
713 if (is_32bit_elf)
715 Elf32_External_Rela * erelas;
717 erelas = (Elf32_External_Rela *) get_data (NULL, file, rel_offset, 1,
718 rel_size, _("relocs"));
719 if (!erelas)
720 return 0;
722 nrelas = rel_size / sizeof (Elf32_External_Rela);
724 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
725 sizeof (Elf_Internal_Rela));
727 if (relas == NULL)
729 free (erelas);
730 error (_("out of memory parsing relocs\n"));
731 return 0;
734 for (i = 0; i < nrelas; i++)
736 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
737 relas[i].r_info = BYTE_GET (erelas[i].r_info);
738 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
741 free (erelas);
743 else
745 Elf64_External_Rela * erelas;
747 erelas = (Elf64_External_Rela *) get_data (NULL, file, rel_offset, 1,
748 rel_size, _("relocs"));
749 if (!erelas)
750 return 0;
752 nrelas = rel_size / sizeof (Elf64_External_Rela);
754 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
755 sizeof (Elf_Internal_Rela));
757 if (relas == NULL)
759 free (erelas);
760 error (_("out of memory parsing relocs\n"));
761 return 0;
764 for (i = 0; i < nrelas; i++)
766 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
767 relas[i].r_info = BYTE_GET (erelas[i].r_info);
768 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
770 /* The #ifdef BFD64 below is to prevent a compile time
771 warning. We know that if we do not have a 64 bit data
772 type that we will never execute this code anyway. */
773 #ifdef BFD64
774 if (elf_header.e_machine == EM_MIPS
775 && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
777 /* In little-endian objects, r_info isn't really a
778 64-bit little-endian value: it has a 32-bit
779 little-endian symbol index followed by four
780 individual byte fields. Reorder INFO
781 accordingly. */
782 bfd_vma inf = relas[i].r_info;
783 inf = (((inf & 0xffffffff) << 32)
784 | ((inf >> 56) & 0xff)
785 | ((inf >> 40) & 0xff00)
786 | ((inf >> 24) & 0xff0000)
787 | ((inf >> 8) & 0xff000000));
788 relas[i].r_info = inf;
790 #endif /* BFD64 */
793 free (erelas);
795 *relasp = relas;
796 *nrelasp = nrelas;
797 return 1;
800 static int
801 slurp_rel_relocs (FILE * file,
802 unsigned long rel_offset,
803 unsigned long rel_size,
804 Elf_Internal_Rela ** relsp,
805 unsigned long * nrelsp)
807 Elf_Internal_Rela * rels;
808 unsigned long nrels;
809 unsigned int i;
811 if (is_32bit_elf)
813 Elf32_External_Rel * erels;
815 erels = (Elf32_External_Rel *) get_data (NULL, file, rel_offset, 1,
816 rel_size, _("relocs"));
817 if (!erels)
818 return 0;
820 nrels = rel_size / sizeof (Elf32_External_Rel);
822 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
824 if (rels == NULL)
826 free (erels);
827 error (_("out of memory parsing relocs\n"));
828 return 0;
831 for (i = 0; i < nrels; i++)
833 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
834 rels[i].r_info = BYTE_GET (erels[i].r_info);
835 rels[i].r_addend = 0;
838 free (erels);
840 else
842 Elf64_External_Rel * erels;
844 erels = (Elf64_External_Rel *) get_data (NULL, file, rel_offset, 1,
845 rel_size, _("relocs"));
846 if (!erels)
847 return 0;
849 nrels = rel_size / sizeof (Elf64_External_Rel);
851 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
853 if (rels == NULL)
855 free (erels);
856 error (_("out of memory parsing relocs\n"));
857 return 0;
860 for (i = 0; i < nrels; i++)
862 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
863 rels[i].r_info = BYTE_GET (erels[i].r_info);
864 rels[i].r_addend = 0;
866 /* The #ifdef BFD64 below is to prevent a compile time
867 warning. We know that if we do not have a 64 bit data
868 type that we will never execute this code anyway. */
869 #ifdef BFD64
870 if (elf_header.e_machine == EM_MIPS
871 && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
873 /* In little-endian objects, r_info isn't really a
874 64-bit little-endian value: it has a 32-bit
875 little-endian symbol index followed by four
876 individual byte fields. Reorder INFO
877 accordingly. */
878 bfd_vma inf = rels[i].r_info;
879 inf = (((inf & 0xffffffff) << 32)
880 | ((inf >> 56) & 0xff)
881 | ((inf >> 40) & 0xff00)
882 | ((inf >> 24) & 0xff0000)
883 | ((inf >> 8) & 0xff000000));
884 rels[i].r_info = inf;
886 #endif /* BFD64 */
889 free (erels);
891 *relsp = rels;
892 *nrelsp = nrels;
893 return 1;
896 /* Returns the reloc type extracted from the reloc info field. */
898 static unsigned int
899 get_reloc_type (bfd_vma reloc_info)
901 if (is_32bit_elf)
902 return ELF32_R_TYPE (reloc_info);
904 switch (elf_header.e_machine)
906 case EM_MIPS:
907 /* Note: We assume that reloc_info has already been adjusted for us. */
908 return ELF64_MIPS_R_TYPE (reloc_info);
910 case EM_SPARCV9:
911 return ELF64_R_TYPE_ID (reloc_info);
913 default:
914 return ELF64_R_TYPE (reloc_info);
918 /* Return the symbol index extracted from the reloc info field. */
920 static bfd_vma
921 get_reloc_symindex (bfd_vma reloc_info)
923 return is_32bit_elf ? ELF32_R_SYM (reloc_info) : ELF64_R_SYM (reloc_info);
926 /* Display the contents of the relocation data found at the specified
927 offset. */
929 static void
930 dump_relocations (FILE * file,
931 unsigned long rel_offset,
932 unsigned long rel_size,
933 Elf_Internal_Sym * symtab,
934 unsigned long nsyms,
935 char * strtab,
936 unsigned long strtablen,
937 int is_rela)
939 unsigned int i;
940 Elf_Internal_Rela * rels;
942 if (is_rela == UNKNOWN)
943 is_rela = guess_is_rela (elf_header.e_machine);
945 if (is_rela)
947 if (!slurp_rela_relocs (file, rel_offset, rel_size, &rels, &rel_size))
948 return;
950 else
952 if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
953 return;
956 if (is_32bit_elf)
958 if (is_rela)
960 if (do_wide)
961 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
962 else
963 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
965 else
967 if (do_wide)
968 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
969 else
970 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
973 else
975 if (is_rela)
977 if (do_wide)
978 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
979 else
980 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
982 else
984 if (do_wide)
985 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
986 else
987 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
991 for (i = 0; i < rel_size; i++)
993 const char * rtype;
994 bfd_vma offset;
995 bfd_vma inf;
996 bfd_vma symtab_index;
997 bfd_vma type;
999 offset = rels[i].r_offset;
1000 inf = rels[i].r_info;
1002 type = get_reloc_type (inf);
1003 symtab_index = get_reloc_symindex (inf);
1005 if (is_32bit_elf)
1007 printf ("%8.8lx %8.8lx ",
1008 (unsigned long) offset & 0xffffffff,
1009 (unsigned long) inf & 0xffffffff);
1011 else
1013 #if BFD_HOST_64BIT_LONG
1014 printf (do_wide
1015 ? "%16.16lx %16.16lx "
1016 : "%12.12lx %12.12lx ",
1017 offset, inf);
1018 #elif BFD_HOST_64BIT_LONG_LONG
1019 #ifndef __MSVCRT__
1020 printf (do_wide
1021 ? "%16.16llx %16.16llx "
1022 : "%12.12llx %12.12llx ",
1023 offset, inf);
1024 #else
1025 printf (do_wide
1026 ? "%16.16I64x %16.16I64x "
1027 : "%12.12I64x %12.12I64x ",
1028 offset, inf);
1029 #endif
1030 #else
1031 printf (do_wide
1032 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
1033 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
1034 _bfd_int64_high (offset),
1035 _bfd_int64_low (offset),
1036 _bfd_int64_high (inf),
1037 _bfd_int64_low (inf));
1038 #endif
1041 switch (elf_header.e_machine)
1043 default:
1044 rtype = NULL;
1045 break;
1047 case EM_M32R:
1048 case EM_CYGNUS_M32R:
1049 rtype = elf_m32r_reloc_type (type);
1050 break;
1052 case EM_386:
1053 case EM_486:
1054 rtype = elf_i386_reloc_type (type);
1055 break;
1057 case EM_68HC11:
1058 case EM_68HC12:
1059 rtype = elf_m68hc11_reloc_type (type);
1060 break;
1062 case EM_68K:
1063 rtype = elf_m68k_reloc_type (type);
1064 break;
1066 case EM_960:
1067 rtype = elf_i960_reloc_type (type);
1068 break;
1070 case EM_AVR:
1071 case EM_AVR_OLD:
1072 rtype = elf_avr_reloc_type (type);
1073 break;
1075 case EM_OLD_SPARCV9:
1076 case EM_SPARC32PLUS:
1077 case EM_SPARCV9:
1078 case EM_SPARC:
1079 rtype = elf_sparc_reloc_type (type);
1080 break;
1082 case EM_SPU:
1083 rtype = elf_spu_reloc_type (type);
1084 break;
1086 case EM_V850:
1087 case EM_CYGNUS_V850:
1088 rtype = v850_reloc_type (type);
1089 break;
1091 case EM_D10V:
1092 case EM_CYGNUS_D10V:
1093 rtype = elf_d10v_reloc_type (type);
1094 break;
1096 case EM_D30V:
1097 case EM_CYGNUS_D30V:
1098 rtype = elf_d30v_reloc_type (type);
1099 break;
1101 case EM_DLX:
1102 rtype = elf_dlx_reloc_type (type);
1103 break;
1105 case EM_SH:
1106 rtype = elf_sh_reloc_type (type);
1107 break;
1109 case EM_MN10300:
1110 case EM_CYGNUS_MN10300:
1111 rtype = elf_mn10300_reloc_type (type);
1112 break;
1114 case EM_MN10200:
1115 case EM_CYGNUS_MN10200:
1116 rtype = elf_mn10200_reloc_type (type);
1117 break;
1119 case EM_FR30:
1120 case EM_CYGNUS_FR30:
1121 rtype = elf_fr30_reloc_type (type);
1122 break;
1124 case EM_CYGNUS_FRV:
1125 rtype = elf_frv_reloc_type (type);
1126 break;
1128 case EM_MCORE:
1129 rtype = elf_mcore_reloc_type (type);
1130 break;
1132 case EM_MMIX:
1133 rtype = elf_mmix_reloc_type (type);
1134 break;
1136 case EM_MOXIE:
1137 rtype = elf_moxie_reloc_type (type);
1138 break;
1140 case EM_MSP430:
1141 case EM_MSP430_OLD:
1142 rtype = elf_msp430_reloc_type (type);
1143 break;
1145 case EM_PPC:
1146 rtype = elf_ppc_reloc_type (type);
1147 break;
1149 case EM_PPC64:
1150 rtype = elf_ppc64_reloc_type (type);
1151 break;
1153 case EM_MIPS:
1154 case EM_MIPS_RS3_LE:
1155 rtype = elf_mips_reloc_type (type);
1156 break;
1158 case EM_ALPHA:
1159 rtype = elf_alpha_reloc_type (type);
1160 break;
1162 case EM_ARM:
1163 rtype = elf_arm_reloc_type (type);
1164 break;
1166 case EM_ARC:
1167 rtype = elf_arc_reloc_type (type);
1168 break;
1170 case EM_PARISC:
1171 rtype = elf_hppa_reloc_type (type);
1172 break;
1174 case EM_H8_300:
1175 case EM_H8_300H:
1176 case EM_H8S:
1177 rtype = elf_h8_reloc_type (type);
1178 break;
1180 case EM_OPENRISC:
1181 case EM_OR32:
1182 rtype = elf_or32_reloc_type (type);
1183 break;
1185 case EM_PJ:
1186 case EM_PJ_OLD:
1187 rtype = elf_pj_reloc_type (type);
1188 break;
1189 case EM_IA_64:
1190 rtype = elf_ia64_reloc_type (type);
1191 break;
1193 case EM_CRIS:
1194 rtype = elf_cris_reloc_type (type);
1195 break;
1197 case EM_860:
1198 rtype = elf_i860_reloc_type (type);
1199 break;
1201 case EM_X86_64:
1202 case EM_L1OM:
1203 rtype = elf_x86_64_reloc_type (type);
1204 break;
1206 case EM_S370:
1207 rtype = i370_reloc_type (type);
1208 break;
1210 case EM_S390_OLD:
1211 case EM_S390:
1212 rtype = elf_s390_reloc_type (type);
1213 break;
1215 case EM_SCORE:
1216 rtype = elf_score_reloc_type (type);
1217 break;
1219 case EM_XSTORMY16:
1220 rtype = elf_xstormy16_reloc_type (type);
1221 break;
1223 case EM_CRX:
1224 rtype = elf_crx_reloc_type (type);
1225 break;
1227 case EM_VAX:
1228 rtype = elf_vax_reloc_type (type);
1229 break;
1231 case EM_IP2K:
1232 case EM_IP2K_OLD:
1233 rtype = elf_ip2k_reloc_type (type);
1234 break;
1236 case EM_IQ2000:
1237 rtype = elf_iq2000_reloc_type (type);
1238 break;
1240 case EM_XTENSA_OLD:
1241 case EM_XTENSA:
1242 rtype = elf_xtensa_reloc_type (type);
1243 break;
1245 case EM_LATTICEMICO32:
1246 rtype = elf_lm32_reloc_type (type);
1247 break;
1249 case EM_M32C_OLD:
1250 case EM_M32C:
1251 rtype = elf_m32c_reloc_type (type);
1252 break;
1254 case EM_MT:
1255 rtype = elf_mt_reloc_type (type);
1256 break;
1258 case EM_BLACKFIN:
1259 rtype = elf_bfin_reloc_type (type);
1260 break;
1262 case EM_CYGNUS_MEP:
1263 rtype = elf_mep_reloc_type (type);
1264 break;
1266 case EM_CR16:
1267 case EM_CR16_OLD:
1268 rtype = elf_cr16_reloc_type (type);
1269 break;
1271 case EM_MICROBLAZE:
1272 case EM_MICROBLAZE_OLD:
1273 rtype = elf_microblaze_reloc_type (type);
1274 break;
1276 case EM_RX:
1277 rtype = elf_rx_reloc_type (type);
1278 break;
1280 case EM_XC16X:
1281 case EM_C166:
1282 rtype = elf_xc16x_reloc_type (type);
1283 break;
1285 case EM_TI_C6000:
1286 rtype = elf_tic6x_reloc_type (type);
1287 break;
1290 if (rtype == NULL)
1291 printf (_("unrecognized: %-7lx"), (unsigned long) type & 0xffffffff);
1292 else
1293 printf (do_wide ? "%-22.22s" : "%-17.17s", rtype);
1295 if (elf_header.e_machine == EM_ALPHA
1296 && rtype != NULL
1297 && streq (rtype, "R_ALPHA_LITUSE")
1298 && is_rela)
1300 switch (rels[i].r_addend)
1302 case LITUSE_ALPHA_ADDR: rtype = "ADDR"; break;
1303 case LITUSE_ALPHA_BASE: rtype = "BASE"; break;
1304 case LITUSE_ALPHA_BYTOFF: rtype = "BYTOFF"; break;
1305 case LITUSE_ALPHA_JSR: rtype = "JSR"; break;
1306 case LITUSE_ALPHA_TLSGD: rtype = "TLSGD"; break;
1307 case LITUSE_ALPHA_TLSLDM: rtype = "TLSLDM"; break;
1308 case LITUSE_ALPHA_JSRDIRECT: rtype = "JSRDIRECT"; break;
1309 default: rtype = NULL;
1311 if (rtype)
1312 printf (" (%s)", rtype);
1313 else
1315 putchar (' ');
1316 printf (_("<unknown addend: %lx>"),
1317 (unsigned long) rels[i].r_addend);
1320 else if (symtab_index)
1322 if (symtab == NULL || symtab_index >= nsyms)
1323 printf (_(" bad symbol index: %08lx"), (unsigned long) symtab_index);
1324 else
1326 Elf_Internal_Sym * psym;
1328 psym = symtab + symtab_index;
1330 printf (" ");
1332 if (ELF_ST_TYPE (psym->st_info) == STT_GNU_IFUNC)
1334 const char * name;
1335 unsigned int len;
1336 unsigned int width = is_32bit_elf ? 8 : 14;
1338 /* Relocations against GNU_IFUNC symbols do not use the value
1339 of the symbol as the address to relocate against. Instead
1340 they invoke the function named by the symbol and use its
1341 result as the address for relocation.
1343 To indicate this to the user, do not display the value of
1344 the symbol in the "Symbols's Value" field. Instead show
1345 its name followed by () as a hint that the symbol is
1346 invoked. */
1348 if (strtab == NULL
1349 || psym->st_name == 0
1350 || psym->st_name >= strtablen)
1351 name = "??";
1352 else
1353 name = strtab + psym->st_name;
1355 len = print_symbol (width, name);
1356 printf ("()%-*s", len <= width ? (width + 1) - len : 1, " ");
1358 else
1360 print_vma (psym->st_value, LONG_HEX);
1362 printf (is_32bit_elf ? " " : " ");
1365 if (psym->st_name == 0)
1367 const char * sec_name = "<null>";
1368 char name_buf[40];
1370 if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1372 if (psym->st_shndx < elf_header.e_shnum)
1373 sec_name
1374 = SECTION_NAME (section_headers + psym->st_shndx);
1375 else if (psym->st_shndx == SHN_ABS)
1376 sec_name = "ABS";
1377 else if (psym->st_shndx == SHN_COMMON)
1378 sec_name = "COMMON";
1379 else if (elf_header.e_machine == EM_MIPS
1380 && psym->st_shndx == SHN_MIPS_SCOMMON)
1381 sec_name = "SCOMMON";
1382 else if (elf_header.e_machine == EM_MIPS
1383 && psym->st_shndx == SHN_MIPS_SUNDEFINED)
1384 sec_name = "SUNDEF";
1385 else if ((elf_header.e_machine == EM_X86_64
1386 || elf_header.e_machine == EM_L1OM)
1387 && psym->st_shndx == SHN_X86_64_LCOMMON)
1388 sec_name = "LARGE_COMMON";
1389 else if (elf_header.e_machine == EM_IA_64
1390 && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
1391 && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1392 sec_name = "ANSI_COM";
1393 else if (is_ia64_vms ()
1394 && psym->st_shndx == SHN_IA_64_VMS_SYMVEC)
1395 sec_name = "VMS_SYMVEC";
1396 else
1398 sprintf (name_buf, "<section 0x%x>",
1399 (unsigned int) psym->st_shndx);
1400 sec_name = name_buf;
1403 print_symbol (22, sec_name);
1405 else if (strtab == NULL)
1406 printf (_("<string table index: %3ld>"), psym->st_name);
1407 else if (psym->st_name >= strtablen)
1408 printf (_("<corrupt string table index: %3ld>"), psym->st_name);
1409 else
1410 print_symbol (22, strtab + psym->st_name);
1412 if (is_rela)
1414 bfd_signed_vma off = rels[i].r_addend;
1416 if (off < 0)
1417 printf (" - %" BFD_VMA_FMT "x", - off);
1418 else
1419 printf (" + %" BFD_VMA_FMT "x", off);
1423 else if (is_rela)
1425 printf ("%*c", is_32bit_elf ?
1426 (do_wide ? 34 : 28) : (do_wide ? 26 : 20), ' ');
1427 print_vma (rels[i].r_addend, LONG_HEX);
1430 if (elf_header.e_machine == EM_SPARCV9
1431 && rtype != NULL
1432 && streq (rtype, "R_SPARC_OLO10"))
1433 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf));
1435 putchar ('\n');
1437 #ifdef BFD64
1438 if (! is_32bit_elf && elf_header.e_machine == EM_MIPS)
1440 bfd_vma type2 = ELF64_MIPS_R_TYPE2 (inf);
1441 bfd_vma type3 = ELF64_MIPS_R_TYPE3 (inf);
1442 const char * rtype2 = elf_mips_reloc_type (type2);
1443 const char * rtype3 = elf_mips_reloc_type (type3);
1445 printf (" Type2: ");
1447 if (rtype2 == NULL)
1448 printf (_("unrecognized: %-7lx"),
1449 (unsigned long) type2 & 0xffffffff);
1450 else
1451 printf ("%-17.17s", rtype2);
1453 printf ("\n Type3: ");
1455 if (rtype3 == NULL)
1456 printf (_("unrecognized: %-7lx"),
1457 (unsigned long) type3 & 0xffffffff);
1458 else
1459 printf ("%-17.17s", rtype3);
1461 putchar ('\n');
1463 #endif /* BFD64 */
1466 free (rels);
1469 static const char *
1470 get_mips_dynamic_type (unsigned long type)
1472 switch (type)
1474 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1475 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1476 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1477 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1478 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1479 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1480 case DT_MIPS_MSYM: return "MIPS_MSYM";
1481 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1482 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1483 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1484 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1485 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1486 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1487 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1488 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1489 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1490 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1491 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1492 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1493 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1494 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1495 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1496 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1497 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1498 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1499 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1500 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1501 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1502 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1503 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1504 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1505 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1506 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1507 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1508 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1509 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1510 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1511 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1512 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1513 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1514 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1515 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1516 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1517 case DT_MIPS_PLTGOT: return "MIPS_PLTGOT";
1518 case DT_MIPS_RWPLT: return "MIPS_RWPLT";
1519 default:
1520 return NULL;
1524 static const char *
1525 get_sparc64_dynamic_type (unsigned long type)
1527 switch (type)
1529 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1530 default:
1531 return NULL;
1535 static const char *
1536 get_ppc_dynamic_type (unsigned long type)
1538 switch (type)
1540 case DT_PPC_GOT: return "PPC_GOT";
1541 case DT_PPC_TLSOPT: return "PPC_TLSOPT";
1542 default:
1543 return NULL;
1547 static const char *
1548 get_ppc64_dynamic_type (unsigned long type)
1550 switch (type)
1552 case DT_PPC64_GLINK: return "PPC64_GLINK";
1553 case DT_PPC64_OPD: return "PPC64_OPD";
1554 case DT_PPC64_OPDSZ: return "PPC64_OPDSZ";
1555 case DT_PPC64_TLSOPT: return "PPC64_TLSOPT";
1556 default:
1557 return NULL;
1561 static const char *
1562 get_parisc_dynamic_type (unsigned long type)
1564 switch (type)
1566 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1567 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1568 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1569 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1570 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1571 case DT_HP_PREINIT: return "HP_PREINIT";
1572 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1573 case DT_HP_NEEDED: return "HP_NEEDED";
1574 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1575 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1576 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1577 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1578 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
1579 case DT_HP_EPLTREL: return "HP_GST_EPLTREL";
1580 case DT_HP_EPLTRELSZ: return "HP_GST_EPLTRELSZ";
1581 case DT_HP_FILTERED: return "HP_FILTERED";
1582 case DT_HP_FILTER_TLS: return "HP_FILTER_TLS";
1583 case DT_HP_COMPAT_FILTERED: return "HP_COMPAT_FILTERED";
1584 case DT_HP_LAZYLOAD: return "HP_LAZYLOAD";
1585 case DT_HP_BIND_NOW_COUNT: return "HP_BIND_NOW_COUNT";
1586 case DT_PLT: return "PLT";
1587 case DT_PLT_SIZE: return "PLT_SIZE";
1588 case DT_DLT: return "DLT";
1589 case DT_DLT_SIZE: return "DLT_SIZE";
1590 default:
1591 return NULL;
1595 static const char *
1596 get_ia64_dynamic_type (unsigned long type)
1598 switch (type)
1600 case DT_IA_64_PLT_RESERVE: return "IA_64_PLT_RESERVE";
1601 case DT_IA_64_VMS_SUBTYPE: return "VMS_SUBTYPE";
1602 case DT_IA_64_VMS_IMGIOCNT: return "VMS_IMGIOCNT";
1603 case DT_IA_64_VMS_LNKFLAGS: return "VMS_LNKFLAGS";
1604 case DT_IA_64_VMS_VIR_MEM_BLK_SIZ: return "VMS_VIR_MEM_BLK_SIZ";
1605 case DT_IA_64_VMS_IDENT: return "VMS_IDENT";
1606 case DT_IA_64_VMS_NEEDED_IDENT: return "VMS_NEEDED_IDENT";
1607 case DT_IA_64_VMS_IMG_RELA_CNT: return "VMS_IMG_RELA_CNT";
1608 case DT_IA_64_VMS_SEG_RELA_CNT: return "VMS_SEG_RELA_CNT";
1609 case DT_IA_64_VMS_FIXUP_RELA_CNT: return "VMS_FIXUP_RELA_CNT";
1610 case DT_IA_64_VMS_FIXUP_NEEDED: return "VMS_FIXUP_NEEDED";
1611 case DT_IA_64_VMS_SYMVEC_CNT: return "VMS_SYMVEC_CNT";
1612 case DT_IA_64_VMS_XLATED: return "VMS_XLATED";
1613 case DT_IA_64_VMS_STACKSIZE: return "VMS_STACKSIZE";
1614 case DT_IA_64_VMS_UNWINDSZ: return "VMS_UNWINDSZ";
1615 case DT_IA_64_VMS_UNWIND_CODSEG: return "VMS_UNWIND_CODSEG";
1616 case DT_IA_64_VMS_UNWIND_INFOSEG: return "VMS_UNWIND_INFOSEG";
1617 case DT_IA_64_VMS_LINKTIME: return "VMS_LINKTIME";
1618 case DT_IA_64_VMS_SEG_NO: return "VMS_SEG_NO";
1619 case DT_IA_64_VMS_SYMVEC_OFFSET: return "VMS_SYMVEC_OFFSET";
1620 case DT_IA_64_VMS_SYMVEC_SEG: return "VMS_SYMVEC_SEG";
1621 case DT_IA_64_VMS_UNWIND_OFFSET: return "VMS_UNWIND_OFFSET";
1622 case DT_IA_64_VMS_UNWIND_SEG: return "VMS_UNWIND_SEG";
1623 case DT_IA_64_VMS_STRTAB_OFFSET: return "VMS_STRTAB_OFFSET";
1624 case DT_IA_64_VMS_SYSVER_OFFSET: return "VMS_SYSVER_OFFSET";
1625 case DT_IA_64_VMS_IMG_RELA_OFF: return "VMS_IMG_RELA_OFF";
1626 case DT_IA_64_VMS_SEG_RELA_OFF: return "VMS_SEG_RELA_OFF";
1627 case DT_IA_64_VMS_FIXUP_RELA_OFF: return "VMS_FIXUP_RELA_OFF";
1628 case DT_IA_64_VMS_PLTGOT_OFFSET: return "VMS_PLTGOT_OFFSET";
1629 case DT_IA_64_VMS_PLTGOT_SEG: return "VMS_PLTGOT_SEG";
1630 case DT_IA_64_VMS_FPMODE: return "VMS_FPMODE";
1631 default:
1632 return NULL;
1636 static const char *
1637 get_alpha_dynamic_type (unsigned long type)
1639 switch (type)
1641 case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
1642 default:
1643 return NULL;
1647 static const char *
1648 get_score_dynamic_type (unsigned long type)
1650 switch (type)
1652 case DT_SCORE_BASE_ADDRESS: return "SCORE_BASE_ADDRESS";
1653 case DT_SCORE_LOCAL_GOTNO: return "SCORE_LOCAL_GOTNO";
1654 case DT_SCORE_SYMTABNO: return "SCORE_SYMTABNO";
1655 case DT_SCORE_GOTSYM: return "SCORE_GOTSYM";
1656 case DT_SCORE_UNREFEXTNO: return "SCORE_UNREFEXTNO";
1657 case DT_SCORE_HIPAGENO: return "SCORE_HIPAGENO";
1658 default:
1659 return NULL;
1663 static const char *
1664 get_tic6x_dynamic_type (unsigned long type)
1666 switch (type)
1668 case DT_C6000_GSYM_OFFSET: return "C6000_GSYM_OFFSET";
1669 case DT_C6000_GSTR_OFFSET: return "C6000_GSTR_OFFSET";
1670 case DT_C6000_DSBT_BASE: return "C6000_DSBT_BASE";
1671 case DT_C6000_DSBT_SIZE: return "C6000_DSBT_SIZE";
1672 case DT_C6000_PREEMPTMAP: return "C6000_PREEMPTMAP";
1673 case DT_C6000_DSBT_INDEX: return "C6000_DSBT_INDEX";
1674 default:
1675 return NULL;
1679 static const char *
1680 get_dynamic_type (unsigned long type)
1682 static char buff[64];
1684 switch (type)
1686 case DT_NULL: return "NULL";
1687 case DT_NEEDED: return "NEEDED";
1688 case DT_PLTRELSZ: return "PLTRELSZ";
1689 case DT_PLTGOT: return "PLTGOT";
1690 case DT_HASH: return "HASH";
1691 case DT_STRTAB: return "STRTAB";
1692 case DT_SYMTAB: return "SYMTAB";
1693 case DT_RELA: return "RELA";
1694 case DT_RELASZ: return "RELASZ";
1695 case DT_RELAENT: return "RELAENT";
1696 case DT_STRSZ: return "STRSZ";
1697 case DT_SYMENT: return "SYMENT";
1698 case DT_INIT: return "INIT";
1699 case DT_FINI: return "FINI";
1700 case DT_SONAME: return "SONAME";
1701 case DT_RPATH: return "RPATH";
1702 case DT_SYMBOLIC: return "SYMBOLIC";
1703 case DT_REL: return "REL";
1704 case DT_RELSZ: return "RELSZ";
1705 case DT_RELENT: return "RELENT";
1706 case DT_PLTREL: return "PLTREL";
1707 case DT_DEBUG: return "DEBUG";
1708 case DT_TEXTREL: return "TEXTREL";
1709 case DT_JMPREL: return "JMPREL";
1710 case DT_BIND_NOW: return "BIND_NOW";
1711 case DT_INIT_ARRAY: return "INIT_ARRAY";
1712 case DT_FINI_ARRAY: return "FINI_ARRAY";
1713 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
1714 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
1715 case DT_RUNPATH: return "RUNPATH";
1716 case DT_FLAGS: return "FLAGS";
1718 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1719 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
1721 case DT_CHECKSUM: return "CHECKSUM";
1722 case DT_PLTPADSZ: return "PLTPADSZ";
1723 case DT_MOVEENT: return "MOVEENT";
1724 case DT_MOVESZ: return "MOVESZ";
1725 case DT_FEATURE: return "FEATURE";
1726 case DT_POSFLAG_1: return "POSFLAG_1";
1727 case DT_SYMINSZ: return "SYMINSZ";
1728 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
1730 case DT_ADDRRNGLO: return "ADDRRNGLO";
1731 case DT_CONFIG: return "CONFIG";
1732 case DT_DEPAUDIT: return "DEPAUDIT";
1733 case DT_AUDIT: return "AUDIT";
1734 case DT_PLTPAD: return "PLTPAD";
1735 case DT_MOVETAB: return "MOVETAB";
1736 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
1738 case DT_VERSYM: return "VERSYM";
1740 case DT_TLSDESC_GOT: return "TLSDESC_GOT";
1741 case DT_TLSDESC_PLT: return "TLSDESC_PLT";
1742 case DT_RELACOUNT: return "RELACOUNT";
1743 case DT_RELCOUNT: return "RELCOUNT";
1744 case DT_FLAGS_1: return "FLAGS_1";
1745 case DT_VERDEF: return "VERDEF";
1746 case DT_VERDEFNUM: return "VERDEFNUM";
1747 case DT_VERNEED: return "VERNEED";
1748 case DT_VERNEEDNUM: return "VERNEEDNUM";
1750 case DT_AUXILIARY: return "AUXILIARY";
1751 case DT_USED: return "USED";
1752 case DT_FILTER: return "FILTER";
1754 case DT_GNU_PRELINKED: return "GNU_PRELINKED";
1755 case DT_GNU_CONFLICT: return "GNU_CONFLICT";
1756 case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
1757 case DT_GNU_LIBLIST: return "GNU_LIBLIST";
1758 case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
1759 case DT_GNU_HASH: return "GNU_HASH";
1761 default:
1762 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
1764 const char * result;
1766 switch (elf_header.e_machine)
1768 case EM_MIPS:
1769 case EM_MIPS_RS3_LE:
1770 result = get_mips_dynamic_type (type);
1771 break;
1772 case EM_SPARCV9:
1773 result = get_sparc64_dynamic_type (type);
1774 break;
1775 case EM_PPC:
1776 result = get_ppc_dynamic_type (type);
1777 break;
1778 case EM_PPC64:
1779 result = get_ppc64_dynamic_type (type);
1780 break;
1781 case EM_IA_64:
1782 result = get_ia64_dynamic_type (type);
1783 break;
1784 case EM_ALPHA:
1785 result = get_alpha_dynamic_type (type);
1786 break;
1787 case EM_SCORE:
1788 result = get_score_dynamic_type (type);
1789 break;
1790 case EM_TI_C6000:
1791 result = get_tic6x_dynamic_type (type);
1792 break;
1793 default:
1794 result = NULL;
1795 break;
1798 if (result != NULL)
1799 return result;
1801 snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
1803 else if (((type >= DT_LOOS) && (type <= DT_HIOS))
1804 || (elf_header.e_machine == EM_PARISC
1805 && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
1807 const char * result;
1809 switch (elf_header.e_machine)
1811 case EM_PARISC:
1812 result = get_parisc_dynamic_type (type);
1813 break;
1814 case EM_IA_64:
1815 result = get_ia64_dynamic_type (type);
1816 break;
1817 default:
1818 result = NULL;
1819 break;
1822 if (result != NULL)
1823 return result;
1825 snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
1826 type);
1828 else
1829 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
1831 return buff;
1835 static char *
1836 get_file_type (unsigned e_type)
1838 static char buff[32];
1840 switch (e_type)
1842 case ET_NONE: return _("NONE (None)");
1843 case ET_REL: return _("REL (Relocatable file)");
1844 case ET_EXEC: return _("EXEC (Executable file)");
1845 case ET_DYN: return _("DYN (Shared object file)");
1846 case ET_CORE: return _("CORE (Core file)");
1848 default:
1849 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
1850 snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
1851 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
1852 snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
1853 else
1854 snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
1855 return buff;
1859 static char *
1860 get_machine_name (unsigned e_machine)
1862 static char buff[64]; /* XXX */
1864 switch (e_machine)
1866 case EM_NONE: return _("None");
1867 case EM_M32: return "WE32100";
1868 case EM_SPARC: return "Sparc";
1869 case EM_SPU: return "SPU";
1870 case EM_386: return "Intel 80386";
1871 case EM_68K: return "MC68000";
1872 case EM_88K: return "MC88000";
1873 case EM_486: return "Intel 80486";
1874 case EM_860: return "Intel 80860";
1875 case EM_MIPS: return "MIPS R3000";
1876 case EM_S370: return "IBM System/370";
1877 case EM_MIPS_RS3_LE: return "MIPS R4000 big-endian";
1878 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
1879 case EM_PARISC: return "HPPA";
1880 case EM_PPC_OLD: return "Power PC (old)";
1881 case EM_SPARC32PLUS: return "Sparc v8+" ;
1882 case EM_960: return "Intel 90860";
1883 case EM_PPC: return "PowerPC";
1884 case EM_PPC64: return "PowerPC64";
1885 case EM_V800: return "NEC V800";
1886 case EM_FR20: return "Fujitsu FR20";
1887 case EM_RH32: return "TRW RH32";
1888 case EM_MCORE: return "MCORE";
1889 case EM_ARM: return "ARM";
1890 case EM_OLD_ALPHA: return "Digital Alpha (old)";
1891 case EM_SH: return "Renesas / SuperH SH";
1892 case EM_SPARCV9: return "Sparc v9";
1893 case EM_TRICORE: return "Siemens Tricore";
1894 case EM_ARC: return "ARC";
1895 case EM_H8_300: return "Renesas H8/300";
1896 case EM_H8_300H: return "Renesas H8/300H";
1897 case EM_H8S: return "Renesas H8S";
1898 case EM_H8_500: return "Renesas H8/500";
1899 case EM_IA_64: return "Intel IA-64";
1900 case EM_MIPS_X: return "Stanford MIPS-X";
1901 case EM_COLDFIRE: return "Motorola Coldfire";
1902 case EM_68HC12: return "Motorola M68HC12";
1903 case EM_ALPHA: return "Alpha";
1904 case EM_CYGNUS_D10V:
1905 case EM_D10V: return "d10v";
1906 case EM_CYGNUS_D30V:
1907 case EM_D30V: return "d30v";
1908 case EM_CYGNUS_M32R:
1909 case EM_M32R: return "Renesas M32R (formerly Mitsubishi M32r)";
1910 case EM_CYGNUS_V850:
1911 case EM_V850: return "NEC v850";
1912 case EM_CYGNUS_MN10300:
1913 case EM_MN10300: return "mn10300";
1914 case EM_CYGNUS_MN10200:
1915 case EM_MN10200: return "mn10200";
1916 case EM_MOXIE: return "Moxie";
1917 case EM_CYGNUS_FR30:
1918 case EM_FR30: return "Fujitsu FR30";
1919 case EM_CYGNUS_FRV: return "Fujitsu FR-V";
1920 case EM_PJ_OLD:
1921 case EM_PJ: return "picoJava";
1922 case EM_MMA: return "Fujitsu Multimedia Accelerator";
1923 case EM_PCP: return "Siemens PCP";
1924 case EM_NCPU: return "Sony nCPU embedded RISC processor";
1925 case EM_NDR1: return "Denso NDR1 microprocesspr";
1926 case EM_STARCORE: return "Motorola Star*Core processor";
1927 case EM_ME16: return "Toyota ME16 processor";
1928 case EM_ST100: return "STMicroelectronics ST100 processor";
1929 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
1930 case EM_PDSP: return "Sony DSP processor";
1931 case EM_PDP10: return "Digital Equipment Corp. PDP-10";
1932 case EM_PDP11: return "Digital Equipment Corp. PDP-11";
1933 case EM_FX66: return "Siemens FX66 microcontroller";
1934 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1935 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
1936 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
1937 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
1938 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
1939 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
1940 case EM_SVX: return "Silicon Graphics SVx";
1941 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
1942 case EM_VAX: return "Digital VAX";
1943 case EM_AVR_OLD:
1944 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
1945 case EM_CRIS: return "Axis Communications 32-bit embedded processor";
1946 case EM_JAVELIN: return "Infineon Technologies 32-bit embedded cpu";
1947 case EM_FIREPATH: return "Element 14 64-bit DSP processor";
1948 case EM_ZSP: return "LSI Logic's 16-bit DSP processor";
1949 case EM_MMIX: return "Donald Knuth's educational 64-bit processor";
1950 case EM_HUANY: return "Harvard Universitys's machine-independent object format";
1951 case EM_PRISM: return "Vitesse Prism";
1952 case EM_X86_64: return "Advanced Micro Devices X86-64";
1953 case EM_L1OM: return "Intel L1OM";
1954 case EM_S390_OLD:
1955 case EM_S390: return "IBM S/390";
1956 case EM_SCORE: return "SUNPLUS S+Core";
1957 case EM_XSTORMY16: return "Sanyo Xstormy16 CPU core";
1958 case EM_OPENRISC:
1959 case EM_OR32: return "OpenRISC";
1960 case EM_ARC_A5: return "ARC International ARCompact processor";
1961 case EM_CRX: return "National Semiconductor CRX microprocessor";
1962 case EM_DLX: return "OpenDLX";
1963 case EM_IP2K_OLD:
1964 case EM_IP2K: return "Ubicom IP2xxx 8-bit microcontrollers";
1965 case EM_IQ2000: return "Vitesse IQ2000";
1966 case EM_XTENSA_OLD:
1967 case EM_XTENSA: return "Tensilica Xtensa Processor";
1968 case EM_VIDEOCORE: return "Alphamosaic VideoCore processor";
1969 case EM_TMM_GPP: return "Thompson Multimedia General Purpose Processor";
1970 case EM_NS32K: return "National Semiconductor 32000 series";
1971 case EM_TPC: return "Tenor Network TPC processor";
1972 case EM_ST200: return "STMicroelectronics ST200 microcontroller";
1973 case EM_MAX: return "MAX Processor";
1974 case EM_CR: return "National Semiconductor CompactRISC";
1975 case EM_F2MC16: return "Fujitsu F2MC16";
1976 case EM_MSP430: return "Texas Instruments msp430 microcontroller";
1977 case EM_LATTICEMICO32: return "Lattice Mico32";
1978 case EM_M32C_OLD:
1979 case EM_M32C: return "Renesas M32c";
1980 case EM_MT: return "Morpho Techologies MT processor";
1981 case EM_BLACKFIN: return "Analog Devices Blackfin";
1982 case EM_SE_C33: return "S1C33 Family of Seiko Epson processors";
1983 case EM_SEP: return "Sharp embedded microprocessor";
1984 case EM_ARCA: return "Arca RISC microprocessor";
1985 case EM_UNICORE: return "Unicore";
1986 case EM_EXCESS: return "eXcess 16/32/64-bit configurable embedded CPU";
1987 case EM_DXP: return "Icera Semiconductor Inc. Deep Execution Processor";
1988 case EM_NIOS32: return "Altera Nios";
1989 case EM_ALTERA_NIOS2: return "Altera Nios II";
1990 case EM_C166:
1991 case EM_XC16X: return "Infineon Technologies xc16x";
1992 case EM_M16C: return "Renesas M16C series microprocessors";
1993 case EM_DSPIC30F: return "Microchip Technology dsPIC30F Digital Signal Controller";
1994 case EM_CE: return "Freescale Communication Engine RISC core";
1995 case EM_TSK3000: return "Altium TSK3000 core";
1996 case EM_RS08: return "Freescale RS08 embedded processor";
1997 case EM_ECOG2: return "Cyan Technology eCOG2 microprocessor";
1998 case EM_DSP24: return "New Japan Radio (NJR) 24-bit DSP Processor";
1999 case EM_VIDEOCORE3: return "Broadcom VideoCore III processor";
2000 case EM_SE_C17: return "Seiko Epson C17 family";
2001 case EM_TI_C6000: return "Texas Instruments TMS320C6000 DSP family";
2002 case EM_TI_C2000: return "Texas Instruments TMS320C2000 DSP family";
2003 case EM_TI_C5500: return "Texas Instruments TMS320C55x DSP family";
2004 case EM_MMDSP_PLUS: return "STMicroelectronics 64bit VLIW Data Signal Processor";
2005 case EM_CYPRESS_M8C: return "Cypress M8C microprocessor";
2006 case EM_R32C: return "Renesas R32C series microprocessors";
2007 case EM_TRIMEDIA: return "NXP Semiconductors TriMedia architecture family";
2008 case EM_QDSP6: return "QUALCOMM DSP6 Processor";
2009 case EM_8051: return "Intel 8051 and variants";
2010 case EM_STXP7X: return "STMicroelectronics STxP7x family";
2011 case EM_NDS32: return "Andes Technology compact code size embedded RISC processor family";
2012 case EM_ECOG1X: return "Cyan Technology eCOG1X family";
2013 case EM_MAXQ30: return "Dallas Semiconductor MAXQ30 Core microcontrollers";
2014 case EM_XIMO16: return "New Japan Radio (NJR) 16-bit DSP Processor";
2015 case EM_MANIK: return "M2000 Reconfigurable RISC Microprocessor";
2016 case EM_CRAYNV2: return "Cray Inc. NV2 vector architecture";
2017 case EM_CYGNUS_MEP: return "Toshiba MeP Media Engine";
2018 case EM_CR16:
2019 case EM_CR16_OLD: return "National Semiconductor's CR16";
2020 case EM_MICROBLAZE: return "Xilinx MicroBlaze";
2021 case EM_MICROBLAZE_OLD: return "Xilinx MicroBlaze";
2022 case EM_RX: return "Renesas RX";
2023 case EM_METAG: return "Imagination Technologies META processor architecture";
2024 case EM_MCST_ELBRUS: return "MCST Elbrus general purpose hardware architecture";
2025 case EM_ECOG16: return "Cyan Technology eCOG16 family";
2026 case EM_ETPU: return "Freescale Extended Time Processing Unit";
2027 case EM_SLE9X: return "Infineon Technologies SLE9X core";
2028 case EM_AVR32: return "Atmel Corporation 32-bit microprocessor family";
2029 case EM_STM8: return "STMicroeletronics STM8 8-bit microcontroller";
2030 case EM_TILE64: return "Tilera TILE64 multicore architecture family";
2031 case EM_TILEPRO: return "Tilera TILEPro multicore architecture family";
2032 case EM_CUDA: return "NVIDIA CUDA architecture";
2033 default:
2034 snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
2035 return buff;
2039 static void
2040 decode_ARM_machine_flags (unsigned e_flags, char buf[])
2042 unsigned eabi;
2043 int unknown = 0;
2045 eabi = EF_ARM_EABI_VERSION (e_flags);
2046 e_flags &= ~ EF_ARM_EABIMASK;
2048 /* Handle "generic" ARM flags. */
2049 if (e_flags & EF_ARM_RELEXEC)
2051 strcat (buf, ", relocatable executable");
2052 e_flags &= ~ EF_ARM_RELEXEC;
2055 if (e_flags & EF_ARM_HASENTRY)
2057 strcat (buf, ", has entry point");
2058 e_flags &= ~ EF_ARM_HASENTRY;
2061 /* Now handle EABI specific flags. */
2062 switch (eabi)
2064 default:
2065 strcat (buf, ", <unrecognized EABI>");
2066 if (e_flags)
2067 unknown = 1;
2068 break;
2070 case EF_ARM_EABI_VER1:
2071 strcat (buf, ", Version1 EABI");
2072 while (e_flags)
2074 unsigned flag;
2076 /* Process flags one bit at a time. */
2077 flag = e_flags & - e_flags;
2078 e_flags &= ~ flag;
2080 switch (flag)
2082 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
2083 strcat (buf, ", sorted symbol tables");
2084 break;
2086 default:
2087 unknown = 1;
2088 break;
2091 break;
2093 case EF_ARM_EABI_VER2:
2094 strcat (buf, ", Version2 EABI");
2095 while (e_flags)
2097 unsigned flag;
2099 /* Process flags one bit at a time. */
2100 flag = e_flags & - e_flags;
2101 e_flags &= ~ flag;
2103 switch (flag)
2105 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
2106 strcat (buf, ", sorted symbol tables");
2107 break;
2109 case EF_ARM_DYNSYMSUSESEGIDX:
2110 strcat (buf, ", dynamic symbols use segment index");
2111 break;
2113 case EF_ARM_MAPSYMSFIRST:
2114 strcat (buf, ", mapping symbols precede others");
2115 break;
2117 default:
2118 unknown = 1;
2119 break;
2122 break;
2124 case EF_ARM_EABI_VER3:
2125 strcat (buf, ", Version3 EABI");
2126 break;
2128 case EF_ARM_EABI_VER4:
2129 strcat (buf, ", Version4 EABI");
2130 goto eabi;
2132 case EF_ARM_EABI_VER5:
2133 strcat (buf, ", Version5 EABI");
2134 eabi:
2135 while (e_flags)
2137 unsigned flag;
2139 /* Process flags one bit at a time. */
2140 flag = e_flags & - e_flags;
2141 e_flags &= ~ flag;
2143 switch (flag)
2145 case EF_ARM_BE8:
2146 strcat (buf, ", BE8");
2147 break;
2149 case EF_ARM_LE8:
2150 strcat (buf, ", LE8");
2151 break;
2153 default:
2154 unknown = 1;
2155 break;
2158 break;
2160 case EF_ARM_EABI_UNKNOWN:
2161 strcat (buf, ", GNU EABI");
2162 while (e_flags)
2164 unsigned flag;
2166 /* Process flags one bit at a time. */
2167 flag = e_flags & - e_flags;
2168 e_flags &= ~ flag;
2170 switch (flag)
2172 case EF_ARM_INTERWORK:
2173 strcat (buf, ", interworking enabled");
2174 break;
2176 case EF_ARM_APCS_26:
2177 strcat (buf, ", uses APCS/26");
2178 break;
2180 case EF_ARM_APCS_FLOAT:
2181 strcat (buf, ", uses APCS/float");
2182 break;
2184 case EF_ARM_PIC:
2185 strcat (buf, ", position independent");
2186 break;
2188 case EF_ARM_ALIGN8:
2189 strcat (buf, ", 8 bit structure alignment");
2190 break;
2192 case EF_ARM_NEW_ABI:
2193 strcat (buf, ", uses new ABI");
2194 break;
2196 case EF_ARM_OLD_ABI:
2197 strcat (buf, ", uses old ABI");
2198 break;
2200 case EF_ARM_SOFT_FLOAT:
2201 strcat (buf, ", software FP");
2202 break;
2204 case EF_ARM_VFP_FLOAT:
2205 strcat (buf, ", VFP");
2206 break;
2208 case EF_ARM_MAVERICK_FLOAT:
2209 strcat (buf, ", Maverick FP");
2210 break;
2212 default:
2213 unknown = 1;
2214 break;
2219 if (unknown)
2220 strcat (buf,_(", <unknown>"));
2223 static char *
2224 get_machine_flags (unsigned e_flags, unsigned e_machine)
2226 static char buf[1024];
2228 buf[0] = '\0';
2230 if (e_flags)
2232 switch (e_machine)
2234 default:
2235 break;
2237 case EM_ARM:
2238 decode_ARM_machine_flags (e_flags, buf);
2239 break;
2241 case EM_CYGNUS_FRV:
2242 switch (e_flags & EF_FRV_CPU_MASK)
2244 case EF_FRV_CPU_GENERIC:
2245 break;
2247 default:
2248 strcat (buf, ", fr???");
2249 break;
2251 case EF_FRV_CPU_FR300:
2252 strcat (buf, ", fr300");
2253 break;
2255 case EF_FRV_CPU_FR400:
2256 strcat (buf, ", fr400");
2257 break;
2258 case EF_FRV_CPU_FR405:
2259 strcat (buf, ", fr405");
2260 break;
2262 case EF_FRV_CPU_FR450:
2263 strcat (buf, ", fr450");
2264 break;
2266 case EF_FRV_CPU_FR500:
2267 strcat (buf, ", fr500");
2268 break;
2269 case EF_FRV_CPU_FR550:
2270 strcat (buf, ", fr550");
2271 break;
2273 case EF_FRV_CPU_SIMPLE:
2274 strcat (buf, ", simple");
2275 break;
2276 case EF_FRV_CPU_TOMCAT:
2277 strcat (buf, ", tomcat");
2278 break;
2280 break;
2282 case EM_68K:
2283 if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
2284 strcat (buf, ", m68000");
2285 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
2286 strcat (buf, ", cpu32");
2287 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
2288 strcat (buf, ", fido_a");
2289 else
2291 char const * isa = _("unknown");
2292 char const * mac = _("unknown mac");
2293 char const * additional = NULL;
2295 switch (e_flags & EF_M68K_CF_ISA_MASK)
2297 case EF_M68K_CF_ISA_A_NODIV:
2298 isa = "A";
2299 additional = ", nodiv";
2300 break;
2301 case EF_M68K_CF_ISA_A:
2302 isa = "A";
2303 break;
2304 case EF_M68K_CF_ISA_A_PLUS:
2305 isa = "A+";
2306 break;
2307 case EF_M68K_CF_ISA_B_NOUSP:
2308 isa = "B";
2309 additional = ", nousp";
2310 break;
2311 case EF_M68K_CF_ISA_B:
2312 isa = "B";
2313 break;
2314 case EF_M68K_CF_ISA_C:
2315 isa = "C";
2316 break;
2317 case EF_M68K_CF_ISA_C_NODIV:
2318 isa = "C";
2319 additional = ", nodiv";
2320 break;
2322 strcat (buf, ", cf, isa ");
2323 strcat (buf, isa);
2324 if (additional)
2325 strcat (buf, additional);
2326 if (e_flags & EF_M68K_CF_FLOAT)
2327 strcat (buf, ", float");
2328 switch (e_flags & EF_M68K_CF_MAC_MASK)
2330 case 0:
2331 mac = NULL;
2332 break;
2333 case EF_M68K_CF_MAC:
2334 mac = "mac";
2335 break;
2336 case EF_M68K_CF_EMAC:
2337 mac = "emac";
2338 break;
2339 case EF_M68K_CF_EMAC_B:
2340 mac = "emac_b";
2341 break;
2343 if (mac)
2345 strcat (buf, ", ");
2346 strcat (buf, mac);
2349 break;
2351 case EM_PPC:
2352 if (e_flags & EF_PPC_EMB)
2353 strcat (buf, ", emb");
2355 if (e_flags & EF_PPC_RELOCATABLE)
2356 strcat (buf, _(", relocatable"));
2358 if (e_flags & EF_PPC_RELOCATABLE_LIB)
2359 strcat (buf, _(", relocatable-lib"));
2360 break;
2362 case EM_V850:
2363 case EM_CYGNUS_V850:
2364 switch (e_flags & EF_V850_ARCH)
2366 case E_V850E2V3_ARCH:
2367 strcat (buf, ", v850e2v3");
2368 break;
2369 case E_V850E2_ARCH:
2370 strcat (buf, ", v850e2");
2371 break;
2372 case E_V850E1_ARCH:
2373 strcat (buf, ", v850e1");
2374 break;
2375 case E_V850E_ARCH:
2376 strcat (buf, ", v850e");
2377 break;
2378 case E_V850_ARCH:
2379 strcat (buf, ", v850");
2380 break;
2381 default:
2382 strcat (buf, _(", unknown v850 architecture variant"));
2383 break;
2385 break;
2387 case EM_M32R:
2388 case EM_CYGNUS_M32R:
2389 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
2390 strcat (buf, ", m32r");
2391 break;
2393 case EM_MIPS:
2394 case EM_MIPS_RS3_LE:
2395 if (e_flags & EF_MIPS_NOREORDER)
2396 strcat (buf, ", noreorder");
2398 if (e_flags & EF_MIPS_PIC)
2399 strcat (buf, ", pic");
2401 if (e_flags & EF_MIPS_CPIC)
2402 strcat (buf, ", cpic");
2404 if (e_flags & EF_MIPS_UCODE)
2405 strcat (buf, ", ugen_reserved");
2407 if (e_flags & EF_MIPS_ABI2)
2408 strcat (buf, ", abi2");
2410 if (e_flags & EF_MIPS_OPTIONS_FIRST)
2411 strcat (buf, ", odk first");
2413 if (e_flags & EF_MIPS_32BITMODE)
2414 strcat (buf, ", 32bitmode");
2416 switch ((e_flags & EF_MIPS_MACH))
2418 case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
2419 case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
2420 case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
2421 case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
2422 case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
2423 case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
2424 case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
2425 case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
2426 case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break;
2427 case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
2428 case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break;
2429 case E_MIPS_MACH_LS2F: strcat (buf, ", loongson-2f"); break;
2430 case E_MIPS_MACH_OCTEON: strcat (buf, ", octeon"); break;
2431 case E_MIPS_MACH_OCTEON2: strcat (buf, ", octeon2"); break;
2432 case E_MIPS_MACH_XLR: strcat (buf, ", xlr"); break;
2433 case 0:
2434 /* We simply ignore the field in this case to avoid confusion:
2435 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
2436 extension. */
2437 break;
2438 default: strcat (buf, _(", unknown CPU")); break;
2441 switch ((e_flags & EF_MIPS_ABI))
2443 case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
2444 case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
2445 case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
2446 case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
2447 case 0:
2448 /* We simply ignore the field in this case to avoid confusion:
2449 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
2450 This means it is likely to be an o32 file, but not for
2451 sure. */
2452 break;
2453 default: strcat (buf, _(", unknown ABI")); break;
2456 if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
2457 strcat (buf, ", mdmx");
2459 if (e_flags & EF_MIPS_ARCH_ASE_M16)
2460 strcat (buf, ", mips16");
2462 switch ((e_flags & EF_MIPS_ARCH))
2464 case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
2465 case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
2466 case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
2467 case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
2468 case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
2469 case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
2470 case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
2471 case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
2472 case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
2473 default: strcat (buf, _(", unknown ISA")); break;
2476 if (e_flags & EF_SH_PIC)
2477 strcat (buf, ", pic");
2479 if (e_flags & EF_SH_FDPIC)
2480 strcat (buf, ", fdpic");
2481 break;
2483 case EM_SH:
2484 switch ((e_flags & EF_SH_MACH_MASK))
2486 case EF_SH1: strcat (buf, ", sh1"); break;
2487 case EF_SH2: strcat (buf, ", sh2"); break;
2488 case EF_SH3: strcat (buf, ", sh3"); break;
2489 case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
2490 case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
2491 case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
2492 case EF_SH3E: strcat (buf, ", sh3e"); break;
2493 case EF_SH4: strcat (buf, ", sh4"); break;
2494 case EF_SH5: strcat (buf, ", sh5"); break;
2495 case EF_SH2E: strcat (buf, ", sh2e"); break;
2496 case EF_SH4A: strcat (buf, ", sh4a"); break;
2497 case EF_SH2A: strcat (buf, ", sh2a"); break;
2498 case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
2499 case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
2500 case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
2501 case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
2502 case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
2503 case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
2504 case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
2505 case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
2506 case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
2507 default: strcat (buf, _(", unknown ISA")); break;
2510 break;
2512 case EM_SPARCV9:
2513 if (e_flags & EF_SPARC_32PLUS)
2514 strcat (buf, ", v8+");
2516 if (e_flags & EF_SPARC_SUN_US1)
2517 strcat (buf, ", ultrasparcI");
2519 if (e_flags & EF_SPARC_SUN_US3)
2520 strcat (buf, ", ultrasparcIII");
2522 if (e_flags & EF_SPARC_HAL_R1)
2523 strcat (buf, ", halr1");
2525 if (e_flags & EF_SPARC_LEDATA)
2526 strcat (buf, ", ledata");
2528 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
2529 strcat (buf, ", tso");
2531 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
2532 strcat (buf, ", pso");
2534 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
2535 strcat (buf, ", rmo");
2536 break;
2538 case EM_PARISC:
2539 switch (e_flags & EF_PARISC_ARCH)
2541 case EFA_PARISC_1_0:
2542 strcpy (buf, ", PA-RISC 1.0");
2543 break;
2544 case EFA_PARISC_1_1:
2545 strcpy (buf, ", PA-RISC 1.1");
2546 break;
2547 case EFA_PARISC_2_0:
2548 strcpy (buf, ", PA-RISC 2.0");
2549 break;
2550 default:
2551 break;
2553 if (e_flags & EF_PARISC_TRAPNIL)
2554 strcat (buf, ", trapnil");
2555 if (e_flags & EF_PARISC_EXT)
2556 strcat (buf, ", ext");
2557 if (e_flags & EF_PARISC_LSB)
2558 strcat (buf, ", lsb");
2559 if (e_flags & EF_PARISC_WIDE)
2560 strcat (buf, ", wide");
2561 if (e_flags & EF_PARISC_NO_KABP)
2562 strcat (buf, ", no kabp");
2563 if (e_flags & EF_PARISC_LAZYSWAP)
2564 strcat (buf, ", lazyswap");
2565 break;
2567 case EM_PJ:
2568 case EM_PJ_OLD:
2569 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
2570 strcat (buf, ", new calling convention");
2572 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
2573 strcat (buf, ", gnu calling convention");
2574 break;
2576 case EM_IA_64:
2577 if ((e_flags & EF_IA_64_ABI64))
2578 strcat (buf, ", 64-bit");
2579 else
2580 strcat (buf, ", 32-bit");
2581 if ((e_flags & EF_IA_64_REDUCEDFP))
2582 strcat (buf, ", reduced fp model");
2583 if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
2584 strcat (buf, ", no function descriptors, constant gp");
2585 else if ((e_flags & EF_IA_64_CONS_GP))
2586 strcat (buf, ", constant gp");
2587 if ((e_flags & EF_IA_64_ABSOLUTE))
2588 strcat (buf, ", absolute");
2589 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
2591 if ((e_flags & EF_IA_64_VMS_LINKAGES))
2592 strcat (buf, ", vms_linkages");
2593 switch ((e_flags & EF_IA_64_VMS_COMCOD))
2595 case EF_IA_64_VMS_COMCOD_SUCCESS:
2596 break;
2597 case EF_IA_64_VMS_COMCOD_WARNING:
2598 strcat (buf, ", warning");
2599 break;
2600 case EF_IA_64_VMS_COMCOD_ERROR:
2601 strcat (buf, ", error");
2602 break;
2603 case EF_IA_64_VMS_COMCOD_ABORT:
2604 strcat (buf, ", abort");
2605 break;
2606 default:
2607 abort ();
2610 break;
2612 case EM_VAX:
2613 if ((e_flags & EF_VAX_NONPIC))
2614 strcat (buf, ", non-PIC");
2615 if ((e_flags & EF_VAX_DFLOAT))
2616 strcat (buf, ", D-Float");
2617 if ((e_flags & EF_VAX_GFLOAT))
2618 strcat (buf, ", G-Float");
2619 break;
2621 case EM_RX:
2622 if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
2623 strcat (buf, ", 64-bit doubles");
2624 if (e_flags & E_FLAG_RX_DSP)
2625 strcat (buf, ", dsp");
2627 case EM_S390:
2628 if (e_flags & EF_S390_HIGH_GPRS)
2629 strcat (buf, ", highgprs");
2631 case EM_TI_C6000:
2632 if ((e_flags & EF_C6000_REL))
2633 strcat (buf, ", relocatable module");
2637 return buf;
2640 static const char *
2641 get_osabi_name (unsigned int osabi)
2643 static char buff[32];
2645 switch (osabi)
2647 case ELFOSABI_NONE: return "UNIX - System V";
2648 case ELFOSABI_HPUX: return "UNIX - HP-UX";
2649 case ELFOSABI_NETBSD: return "UNIX - NetBSD";
2650 case ELFOSABI_LINUX: return "UNIX - Linux";
2651 case ELFOSABI_HURD: return "GNU/Hurd";
2652 case ELFOSABI_SOLARIS: return "UNIX - Solaris";
2653 case ELFOSABI_AIX: return "UNIX - AIX";
2654 case ELFOSABI_IRIX: return "UNIX - IRIX";
2655 case ELFOSABI_FREEBSD: return "UNIX - FreeBSD";
2656 case ELFOSABI_TRU64: return "UNIX - TRU64";
2657 case ELFOSABI_MODESTO: return "Novell - Modesto";
2658 case ELFOSABI_OPENBSD: return "UNIX - OpenBSD";
2659 case ELFOSABI_OPENVMS: return "VMS - OpenVMS";
2660 case ELFOSABI_NSK: return "HP - Non-Stop Kernel";
2661 case ELFOSABI_AROS: return "AROS";
2662 case ELFOSABI_FENIXOS: return "FenixOS";
2663 default:
2664 if (osabi >= 64)
2665 switch (elf_header.e_machine)
2667 case EM_ARM:
2668 switch (osabi)
2670 case ELFOSABI_ARM: return "ARM";
2671 default:
2672 break;
2674 break;
2676 case EM_MSP430:
2677 case EM_MSP430_OLD:
2678 switch (osabi)
2680 case ELFOSABI_STANDALONE: return _("Standalone App");
2681 default:
2682 break;
2684 break;
2686 case EM_TI_C6000:
2687 switch (osabi)
2689 case ELFOSABI_C6000_ELFABI: return _("Bare-metal C6000");
2690 case ELFOSABI_C6000_LINUX: return "Linux C6000";
2691 default:
2692 break;
2694 break;
2696 default:
2697 break;
2699 snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
2700 return buff;
2704 static const char *
2705 get_arm_segment_type (unsigned long type)
2707 switch (type)
2709 case PT_ARM_EXIDX:
2710 return "EXIDX";
2711 default:
2712 break;
2715 return NULL;
2718 static const char *
2719 get_mips_segment_type (unsigned long type)
2721 switch (type)
2723 case PT_MIPS_REGINFO:
2724 return "REGINFO";
2725 case PT_MIPS_RTPROC:
2726 return "RTPROC";
2727 case PT_MIPS_OPTIONS:
2728 return "OPTIONS";
2729 default:
2730 break;
2733 return NULL;
2736 static const char *
2737 get_parisc_segment_type (unsigned long type)
2739 switch (type)
2741 case PT_HP_TLS: return "HP_TLS";
2742 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
2743 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
2744 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
2745 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
2746 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
2747 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
2748 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
2749 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
2750 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
2751 case PT_HP_PARALLEL: return "HP_PARALLEL";
2752 case PT_HP_FASTBIND: return "HP_FASTBIND";
2753 case PT_HP_OPT_ANNOT: return "HP_OPT_ANNOT";
2754 case PT_HP_HSL_ANNOT: return "HP_HSL_ANNOT";
2755 case PT_HP_STACK: return "HP_STACK";
2756 case PT_HP_CORE_UTSNAME: return "HP_CORE_UTSNAME";
2757 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
2758 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
2759 case PT_PARISC_WEAKORDER: return "PARISC_WEAKORDER";
2760 default:
2761 break;
2764 return NULL;
2767 static const char *
2768 get_ia64_segment_type (unsigned long type)
2770 switch (type)
2772 case PT_IA_64_ARCHEXT: return "IA_64_ARCHEXT";
2773 case PT_IA_64_UNWIND: return "IA_64_UNWIND";
2774 case PT_HP_TLS: return "HP_TLS";
2775 case PT_IA_64_HP_OPT_ANOT: return "HP_OPT_ANNOT";
2776 case PT_IA_64_HP_HSL_ANOT: return "HP_HSL_ANNOT";
2777 case PT_IA_64_HP_STACK: return "HP_STACK";
2778 default:
2779 break;
2782 return NULL;
2785 static const char *
2786 get_tic6x_segment_type (unsigned long type)
2788 switch (type)
2790 case PT_C6000_PHATTR: return "C6000_PHATTR";
2791 default:
2792 break;
2795 return NULL;
2798 static const char *
2799 get_segment_type (unsigned long p_type)
2801 static char buff[32];
2803 switch (p_type)
2805 case PT_NULL: return "NULL";
2806 case PT_LOAD: return "LOAD";
2807 case PT_DYNAMIC: return "DYNAMIC";
2808 case PT_INTERP: return "INTERP";
2809 case PT_NOTE: return "NOTE";
2810 case PT_SHLIB: return "SHLIB";
2811 case PT_PHDR: return "PHDR";
2812 case PT_TLS: return "TLS";
2814 case PT_GNU_EH_FRAME:
2815 return "GNU_EH_FRAME";
2816 case PT_GNU_STACK: return "GNU_STACK";
2817 case PT_GNU_RELRO: return "GNU_RELRO";
2819 default:
2820 if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
2822 const char * result;
2824 switch (elf_header.e_machine)
2826 case EM_ARM:
2827 result = get_arm_segment_type (p_type);
2828 break;
2829 case EM_MIPS:
2830 case EM_MIPS_RS3_LE:
2831 result = get_mips_segment_type (p_type);
2832 break;
2833 case EM_PARISC:
2834 result = get_parisc_segment_type (p_type);
2835 break;
2836 case EM_IA_64:
2837 result = get_ia64_segment_type (p_type);
2838 break;
2839 case EM_TI_C6000:
2840 result = get_tic6x_segment_type (p_type);
2841 break;
2842 default:
2843 result = NULL;
2844 break;
2847 if (result != NULL)
2848 return result;
2850 sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
2852 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
2854 const char * result;
2856 switch (elf_header.e_machine)
2858 case EM_PARISC:
2859 result = get_parisc_segment_type (p_type);
2860 break;
2861 case EM_IA_64:
2862 result = get_ia64_segment_type (p_type);
2863 break;
2864 default:
2865 result = NULL;
2866 break;
2869 if (result != NULL)
2870 return result;
2872 sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
2874 else
2875 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
2877 return buff;
2881 static const char *
2882 get_mips_section_type_name (unsigned int sh_type)
2884 switch (sh_type)
2886 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
2887 case SHT_MIPS_MSYM: return "MIPS_MSYM";
2888 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
2889 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
2890 case SHT_MIPS_UCODE: return "MIPS_UCODE";
2891 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
2892 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
2893 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
2894 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
2895 case SHT_MIPS_RELD: return "MIPS_RELD";
2896 case SHT_MIPS_IFACE: return "MIPS_IFACE";
2897 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
2898 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
2899 case SHT_MIPS_SHDR: return "MIPS_SHDR";
2900 case SHT_MIPS_FDESC: return "MIPS_FDESC";
2901 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
2902 case SHT_MIPS_DENSE: return "MIPS_DENSE";
2903 case SHT_MIPS_PDESC: return "MIPS_PDESC";
2904 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
2905 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
2906 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
2907 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
2908 case SHT_MIPS_LINE: return "MIPS_LINE";
2909 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
2910 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
2911 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
2912 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
2913 case SHT_MIPS_DWARF: return "MIPS_DWARF";
2914 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
2915 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
2916 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
2917 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
2918 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
2919 case SHT_MIPS_XLATE: return "MIPS_XLATE";
2920 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
2921 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
2922 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
2923 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
2924 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
2925 default:
2926 break;
2928 return NULL;
2931 static const char *
2932 get_parisc_section_type_name (unsigned int sh_type)
2934 switch (sh_type)
2936 case SHT_PARISC_EXT: return "PARISC_EXT";
2937 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
2938 case SHT_PARISC_DOC: return "PARISC_DOC";
2939 case SHT_PARISC_ANNOT: return "PARISC_ANNOT";
2940 case SHT_PARISC_SYMEXTN: return "PARISC_SYMEXTN";
2941 case SHT_PARISC_STUBS: return "PARISC_STUBS";
2942 case SHT_PARISC_DLKM: return "PARISC_DLKM";
2943 default:
2944 break;
2946 return NULL;
2949 static const char *
2950 get_ia64_section_type_name (unsigned int sh_type)
2952 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
2953 if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
2954 return get_osabi_name ((sh_type & 0x00FF0000) >> 16);
2956 switch (sh_type)
2958 case SHT_IA_64_EXT: return "IA_64_EXT";
2959 case SHT_IA_64_UNWIND: return "IA_64_UNWIND";
2960 case SHT_IA_64_PRIORITY_INIT: return "IA_64_PRIORITY_INIT";
2961 case SHT_IA_64_VMS_TRACE: return "VMS_TRACE";
2962 case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
2963 case SHT_IA_64_VMS_DEBUG: return "VMS_DEBUG";
2964 case SHT_IA_64_VMS_DEBUG_STR: return "VMS_DEBUG_STR";
2965 case SHT_IA_64_VMS_LINKAGES: return "VMS_LINKAGES";
2966 case SHT_IA_64_VMS_SYMBOL_VECTOR: return "VMS_SYMBOL_VECTOR";
2967 case SHT_IA_64_VMS_FIXUP: return "VMS_FIXUP";
2968 default:
2969 break;
2971 return NULL;
2974 static const char *
2975 get_x86_64_section_type_name (unsigned int sh_type)
2977 switch (sh_type)
2979 case SHT_X86_64_UNWIND: return "X86_64_UNWIND";
2980 default:
2981 break;
2983 return NULL;
2986 static const char *
2987 get_arm_section_type_name (unsigned int sh_type)
2989 switch (sh_type)
2991 case SHT_ARM_EXIDX: return "ARM_EXIDX";
2992 case SHT_ARM_PREEMPTMAP: return "ARM_PREEMPTMAP";
2993 case SHT_ARM_ATTRIBUTES: return "ARM_ATTRIBUTES";
2994 case SHT_ARM_DEBUGOVERLAY: return "ARM_DEBUGOVERLAY";
2995 case SHT_ARM_OVERLAYSECTION: return "ARM_OVERLAYSECTION";
2996 default:
2997 break;
2999 return NULL;
3002 static const char *
3003 get_tic6x_section_type_name (unsigned int sh_type)
3005 switch (sh_type)
3007 case SHT_C6000_UNWIND:
3008 return "C6000_UNWIND";
3009 case SHT_C6000_PREEMPTMAP:
3010 return "C6000_PREEMPTMAP";
3011 case SHT_C6000_ATTRIBUTES:
3012 return "C6000_ATTRIBUTES";
3013 case SHT_TI_ICODE:
3014 return "TI_ICODE";
3015 case SHT_TI_XREF:
3016 return "TI_XREF";
3017 case SHT_TI_HANDLER:
3018 return "TI_HANDLER";
3019 case SHT_TI_INITINFO:
3020 return "TI_INITINFO";
3021 case SHT_TI_PHATTRS:
3022 return "TI_PHATTRS";
3023 default:
3024 break;
3026 return NULL;
3029 static const char *
3030 get_section_type_name (unsigned int sh_type)
3032 static char buff[32];
3034 switch (sh_type)
3036 case SHT_NULL: return "NULL";
3037 case SHT_PROGBITS: return "PROGBITS";
3038 case SHT_SYMTAB: return "SYMTAB";
3039 case SHT_STRTAB: return "STRTAB";
3040 case SHT_RELA: return "RELA";
3041 case SHT_HASH: return "HASH";
3042 case SHT_DYNAMIC: return "DYNAMIC";
3043 case SHT_NOTE: return "NOTE";
3044 case SHT_NOBITS: return "NOBITS";
3045 case SHT_REL: return "REL";
3046 case SHT_SHLIB: return "SHLIB";
3047 case SHT_DYNSYM: return "DYNSYM";
3048 case SHT_INIT_ARRAY: return "INIT_ARRAY";
3049 case SHT_FINI_ARRAY: return "FINI_ARRAY";
3050 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
3051 case SHT_GNU_HASH: return "GNU_HASH";
3052 case SHT_GROUP: return "GROUP";
3053 case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICIES";
3054 case SHT_GNU_verdef: return "VERDEF";
3055 case SHT_GNU_verneed: return "VERNEED";
3056 case SHT_GNU_versym: return "VERSYM";
3057 case 0x6ffffff0: return "VERSYM";
3058 case 0x6ffffffc: return "VERDEF";
3059 case 0x7ffffffd: return "AUXILIARY";
3060 case 0x7fffffff: return "FILTER";
3061 case SHT_GNU_LIBLIST: return "GNU_LIBLIST";
3063 default:
3064 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
3066 const char * result;
3068 switch (elf_header.e_machine)
3070 case EM_MIPS:
3071 case EM_MIPS_RS3_LE:
3072 result = get_mips_section_type_name (sh_type);
3073 break;
3074 case EM_PARISC:
3075 result = get_parisc_section_type_name (sh_type);
3076 break;
3077 case EM_IA_64:
3078 result = get_ia64_section_type_name (sh_type);
3079 break;
3080 case EM_X86_64:
3081 case EM_L1OM:
3082 result = get_x86_64_section_type_name (sh_type);
3083 break;
3084 case EM_ARM:
3085 result = get_arm_section_type_name (sh_type);
3086 break;
3087 case EM_TI_C6000:
3088 result = get_tic6x_section_type_name (sh_type);
3089 break;
3090 default:
3091 result = NULL;
3092 break;
3095 if (result != NULL)
3096 return result;
3098 sprintf (buff, "LOPROC+%x", sh_type - SHT_LOPROC);
3100 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
3102 const char * result;
3104 switch (elf_header.e_machine)
3106 case EM_IA_64:
3107 result = get_ia64_section_type_name (sh_type);
3108 break;
3109 default:
3110 result = NULL;
3111 break;
3114 if (result != NULL)
3115 return result;
3117 sprintf (buff, "LOOS+%x", sh_type - SHT_LOOS);
3119 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
3120 sprintf (buff, "LOUSER+%x", sh_type - SHT_LOUSER);
3121 else
3122 snprintf (buff, sizeof (buff), _("<unknown>: %x"), sh_type);
3124 return buff;
3128 #define OPTION_DEBUG_DUMP 512
3129 #define OPTION_DYN_SYMS 513
3131 static struct option options[] =
3133 {"all", no_argument, 0, 'a'},
3134 {"file-header", no_argument, 0, 'h'},
3135 {"program-headers", no_argument, 0, 'l'},
3136 {"headers", no_argument, 0, 'e'},
3137 {"histogram", no_argument, 0, 'I'},
3138 {"segments", no_argument, 0, 'l'},
3139 {"sections", no_argument, 0, 'S'},
3140 {"section-headers", no_argument, 0, 'S'},
3141 {"section-groups", no_argument, 0, 'g'},
3142 {"section-details", no_argument, 0, 't'},
3143 {"full-section-name",no_argument, 0, 'N'},
3144 {"symbols", no_argument, 0, 's'},
3145 {"syms", no_argument, 0, 's'},
3146 {"dyn-syms", no_argument, 0, OPTION_DYN_SYMS},
3147 {"relocs", no_argument, 0, 'r'},
3148 {"notes", no_argument, 0, 'n'},
3149 {"dynamic", no_argument, 0, 'd'},
3150 {"arch-specific", no_argument, 0, 'A'},
3151 {"version-info", no_argument, 0, 'V'},
3152 {"use-dynamic", no_argument, 0, 'D'},
3153 {"unwind", no_argument, 0, 'u'},
3154 {"archive-index", no_argument, 0, 'c'},
3155 {"hex-dump", required_argument, 0, 'x'},
3156 {"relocated-dump", required_argument, 0, 'R'},
3157 {"string-dump", required_argument, 0, 'p'},
3158 #ifdef SUPPORT_DISASSEMBLY
3159 {"instruction-dump", required_argument, 0, 'i'},
3160 #endif
3161 {"debug-dump", optional_argument, 0, OPTION_DEBUG_DUMP},
3163 {"version", no_argument, 0, 'v'},
3164 {"wide", no_argument, 0, 'W'},
3165 {"help", no_argument, 0, 'H'},
3166 {0, no_argument, 0, 0}
3169 static void
3170 usage (FILE * stream)
3172 fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
3173 fprintf (stream, _(" Display information about the contents of ELF format files\n"));
3174 fprintf (stream, _(" Options are:\n\
3175 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
3176 -h --file-header Display the ELF file header\n\
3177 -l --program-headers Display the program headers\n\
3178 --segments An alias for --program-headers\n\
3179 -S --section-headers Display the sections' header\n\
3180 --sections An alias for --section-headers\n\
3181 -g --section-groups Display the section groups\n\
3182 -t --section-details Display the section details\n\
3183 -e --headers Equivalent to: -h -l -S\n\
3184 -s --syms Display the symbol table\n\
3185 --symbols An alias for --syms\n\
3186 --dyn-syms Display the dynamic symbol table\n\
3187 -n --notes Display the core notes (if present)\n\
3188 -r --relocs Display the relocations (if present)\n\
3189 -u --unwind Display the unwind info (if present)\n\
3190 -d --dynamic Display the dynamic section (if present)\n\
3191 -V --version-info Display the version sections (if present)\n\
3192 -A --arch-specific Display architecture specific information (if any).\n\
3193 -c --archive-index Display the symbol/file index in an archive\n\
3194 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
3195 -x --hex-dump=<number|name>\n\
3196 Dump the contents of section <number|name> as bytes\n\
3197 -p --string-dump=<number|name>\n\
3198 Dump the contents of section <number|name> as strings\n\
3199 -R --relocated-dump=<number|name>\n\
3200 Dump the contents of section <number|name> as relocated bytes\n\
3201 -w[lLiaprmfFsoRt] or\n\
3202 --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
3203 =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
3204 =trace_info,=trace_abbrev,=trace_aranges]\n\
3205 Display the contents of DWARF2 debug sections\n"));
3206 #ifdef SUPPORT_DISASSEMBLY
3207 fprintf (stream, _("\
3208 -i --instruction-dump=<number|name>\n\
3209 Disassemble the contents of section <number|name>\n"));
3210 #endif
3211 fprintf (stream, _("\
3212 -I --histogram Display histogram of bucket list lengths\n\
3213 -W --wide Allow output width to exceed 80 characters\n\
3214 @<file> Read options from <file>\n\
3215 -H --help Display this information\n\
3216 -v --version Display the version number of readelf\n"));
3218 if (REPORT_BUGS_TO[0] && stream == stdout)
3219 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
3221 exit (stream == stdout ? 0 : 1);
3224 /* Record the fact that the user wants the contents of section number
3225 SECTION to be displayed using the method(s) encoded as flags bits
3226 in TYPE. Note, TYPE can be zero if we are creating the array for
3227 the first time. */
3229 static void
3230 request_dump_bynumber (unsigned int section, dump_type type)
3232 if (section >= num_dump_sects)
3234 dump_type * new_dump_sects;
3236 new_dump_sects = (dump_type *) calloc (section + 1,
3237 sizeof (* dump_sects));
3239 if (new_dump_sects == NULL)
3240 error (_("Out of memory allocating dump request table.\n"));
3241 else
3243 /* Copy current flag settings. */
3244 memcpy (new_dump_sects, dump_sects, num_dump_sects * sizeof (* dump_sects));
3246 free (dump_sects);
3248 dump_sects = new_dump_sects;
3249 num_dump_sects = section + 1;
3253 if (dump_sects)
3254 dump_sects[section] |= type;
3256 return;
3259 /* Request a dump by section name. */
3261 static void
3262 request_dump_byname (const char * section, dump_type type)
3264 struct dump_list_entry * new_request;
3266 new_request = (struct dump_list_entry *)
3267 malloc (sizeof (struct dump_list_entry));
3268 if (!new_request)
3269 error (_("Out of memory allocating dump request table.\n"));
3271 new_request->name = strdup (section);
3272 if (!new_request->name)
3273 error (_("Out of memory allocating dump request table.\n"));
3275 new_request->type = type;
3277 new_request->next = dump_sects_byname;
3278 dump_sects_byname = new_request;
3281 static inline void
3282 request_dump (dump_type type)
3284 int section;
3285 char * cp;
3287 do_dump++;
3288 section = strtoul (optarg, & cp, 0);
3290 if (! *cp && section >= 0)
3291 request_dump_bynumber (section, type);
3292 else
3293 request_dump_byname (optarg, type);
3297 static void
3298 parse_args (int argc, char ** argv)
3300 int c;
3302 if (argc < 2)
3303 usage (stderr);
3305 while ((c = getopt_long
3306 (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:", options, NULL)) != EOF)
3308 switch (c)
3310 case 0:
3311 /* Long options. */
3312 break;
3313 case 'H':
3314 usage (stdout);
3315 break;
3317 case 'a':
3318 do_syms++;
3319 do_reloc++;
3320 do_unwind++;
3321 do_dynamic++;
3322 do_header++;
3323 do_sections++;
3324 do_section_groups++;
3325 do_segments++;
3326 do_version++;
3327 do_histogram++;
3328 do_arch++;
3329 do_notes++;
3330 break;
3331 case 'g':
3332 do_section_groups++;
3333 break;
3334 case 't':
3335 case 'N':
3336 do_sections++;
3337 do_section_details++;
3338 break;
3339 case 'e':
3340 do_header++;
3341 do_sections++;
3342 do_segments++;
3343 break;
3344 case 'A':
3345 do_arch++;
3346 break;
3347 case 'D':
3348 do_using_dynamic++;
3349 break;
3350 case 'r':
3351 do_reloc++;
3352 break;
3353 case 'u':
3354 do_unwind++;
3355 break;
3356 case 'h':
3357 do_header++;
3358 break;
3359 case 'l':
3360 do_segments++;
3361 break;
3362 case 's':
3363 do_syms++;
3364 break;
3365 case 'S':
3366 do_sections++;
3367 break;
3368 case 'd':
3369 do_dynamic++;
3370 break;
3371 case 'I':
3372 do_histogram++;
3373 break;
3374 case 'n':
3375 do_notes++;
3376 break;
3377 case 'c':
3378 do_archive_index++;
3379 break;
3380 case 'x':
3381 request_dump (HEX_DUMP);
3382 break;
3383 case 'p':
3384 request_dump (STRING_DUMP);
3385 break;
3386 case 'R':
3387 request_dump (RELOC_DUMP);
3388 break;
3389 case 'w':
3390 do_dump++;
3391 if (optarg == 0)
3393 do_debugging = 1;
3394 dwarf_select_sections_all ();
3396 else
3398 do_debugging = 0;
3399 dwarf_select_sections_by_letters (optarg);
3401 break;
3402 case OPTION_DEBUG_DUMP:
3403 do_dump++;
3404 if (optarg == 0)
3405 do_debugging = 1;
3406 else
3408 do_debugging = 0;
3409 dwarf_select_sections_by_names (optarg);
3411 break;
3412 case OPTION_DYN_SYMS:
3413 do_dyn_syms++;
3414 break;
3415 #ifdef SUPPORT_DISASSEMBLY
3416 case 'i':
3417 request_dump (DISASS_DUMP);
3418 break;
3419 #endif
3420 case 'v':
3421 print_version (program_name);
3422 break;
3423 case 'V':
3424 do_version++;
3425 break;
3426 case 'W':
3427 do_wide++;
3428 break;
3429 default:
3430 /* xgettext:c-format */
3431 error (_("Invalid option '-%c'\n"), c);
3432 /* Drop through. */
3433 case '?':
3434 usage (stderr);
3438 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
3439 && !do_segments && !do_header && !do_dump && !do_version
3440 && !do_histogram && !do_debugging && !do_arch && !do_notes
3441 && !do_section_groups && !do_archive_index
3442 && !do_dyn_syms)
3443 usage (stderr);
3444 else if (argc < 3)
3446 warn (_("Nothing to do.\n"));
3447 usage (stderr);
3451 static const char *
3452 get_elf_class (unsigned int elf_class)
3454 static char buff[32];
3456 switch (elf_class)
3458 case ELFCLASSNONE: return _("none");
3459 case ELFCLASS32: return "ELF32";
3460 case ELFCLASS64: return "ELF64";
3461 default:
3462 snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
3463 return buff;
3467 static const char *
3468 get_data_encoding (unsigned int encoding)
3470 static char buff[32];
3472 switch (encoding)
3474 case ELFDATANONE: return _("none");
3475 case ELFDATA2LSB: return _("2's complement, little endian");
3476 case ELFDATA2MSB: return _("2's complement, big endian");
3477 default:
3478 snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
3479 return buff;
3483 /* Decode the data held in 'elf_header'. */
3485 static int
3486 process_file_header (void)
3488 if ( elf_header.e_ident[EI_MAG0] != ELFMAG0
3489 || elf_header.e_ident[EI_MAG1] != ELFMAG1
3490 || elf_header.e_ident[EI_MAG2] != ELFMAG2
3491 || elf_header.e_ident[EI_MAG3] != ELFMAG3)
3493 error
3494 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
3495 return 0;
3498 init_dwarf_regnames (elf_header.e_machine);
3500 if (do_header)
3502 int i;
3504 printf (_("ELF Header:\n"));
3505 printf (_(" Magic: "));
3506 for (i = 0; i < EI_NIDENT; i++)
3507 printf ("%2.2x ", elf_header.e_ident[i]);
3508 printf ("\n");
3509 printf (_(" Class: %s\n"),
3510 get_elf_class (elf_header.e_ident[EI_CLASS]));
3511 printf (_(" Data: %s\n"),
3512 get_data_encoding (elf_header.e_ident[EI_DATA]));
3513 printf (_(" Version: %d %s\n"),
3514 elf_header.e_ident[EI_VERSION],
3515 (elf_header.e_ident[EI_VERSION] == EV_CURRENT
3516 ? "(current)"
3517 : (elf_header.e_ident[EI_VERSION] != EV_NONE
3518 ? _("<unknown: %lx>")
3519 : "")));
3520 printf (_(" OS/ABI: %s\n"),
3521 get_osabi_name (elf_header.e_ident[EI_OSABI]));
3522 printf (_(" ABI Version: %d\n"),
3523 elf_header.e_ident[EI_ABIVERSION]);
3524 printf (_(" Type: %s\n"),
3525 get_file_type (elf_header.e_type));
3526 printf (_(" Machine: %s\n"),
3527 get_machine_name (elf_header.e_machine));
3528 printf (_(" Version: 0x%lx\n"),
3529 (unsigned long) elf_header.e_version);
3531 printf (_(" Entry point address: "));
3532 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
3533 printf (_("\n Start of program headers: "));
3534 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
3535 printf (_(" (bytes into file)\n Start of section headers: "));
3536 print_vma ((bfd_vma) elf_header.e_shoff, DEC);
3537 printf (_(" (bytes into file)\n"));
3539 printf (_(" Flags: 0x%lx%s\n"),
3540 (unsigned long) elf_header.e_flags,
3541 get_machine_flags (elf_header.e_flags, elf_header.e_machine));
3542 printf (_(" Size of this header: %ld (bytes)\n"),
3543 (long) elf_header.e_ehsize);
3544 printf (_(" Size of program headers: %ld (bytes)\n"),
3545 (long) elf_header.e_phentsize);
3546 printf (_(" Number of program headers: %ld"),
3547 (long) elf_header.e_phnum);
3548 if (section_headers != NULL
3549 && elf_header.e_phnum == PN_XNUM
3550 && section_headers[0].sh_info != 0)
3551 printf (_(" (%ld)"), (long) section_headers[0].sh_info);
3552 putc ('\n', stdout);
3553 printf (_(" Size of section headers: %ld (bytes)\n"),
3554 (long) elf_header.e_shentsize);
3555 printf (_(" Number of section headers: %ld"),
3556 (long) elf_header.e_shnum);
3557 if (section_headers != NULL && elf_header.e_shnum == SHN_UNDEF)
3558 printf (" (%ld)", (long) section_headers[0].sh_size);
3559 putc ('\n', stdout);
3560 printf (_(" Section header string table index: %ld"),
3561 (long) elf_header.e_shstrndx);
3562 if (section_headers != NULL
3563 && elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
3564 printf (" (%u)", section_headers[0].sh_link);
3565 else if (elf_header.e_shstrndx != SHN_UNDEF
3566 && elf_header.e_shstrndx >= elf_header.e_shnum)
3567 printf (_(" <corrupt: out of range>"));
3568 putc ('\n', stdout);
3571 if (section_headers != NULL)
3573 if (elf_header.e_phnum == PN_XNUM
3574 && section_headers[0].sh_info != 0)
3575 elf_header.e_phnum = section_headers[0].sh_info;
3576 if (elf_header.e_shnum == SHN_UNDEF)
3577 elf_header.e_shnum = section_headers[0].sh_size;
3578 if (elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
3579 elf_header.e_shstrndx = section_headers[0].sh_link;
3580 else if (elf_header.e_shstrndx >= elf_header.e_shnum)
3581 elf_header.e_shstrndx = SHN_UNDEF;
3582 free (section_headers);
3583 section_headers = NULL;
3586 return 1;
3590 static int
3591 get_32bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
3593 Elf32_External_Phdr * phdrs;
3594 Elf32_External_Phdr * external;
3595 Elf_Internal_Phdr * internal;
3596 unsigned int i;
3598 phdrs = (Elf32_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
3599 elf_header.e_phentsize,
3600 elf_header.e_phnum,
3601 _("program headers"));
3602 if (!phdrs)
3603 return 0;
3605 for (i = 0, internal = pheaders, external = phdrs;
3606 i < elf_header.e_phnum;
3607 i++, internal++, external++)
3609 internal->p_type = BYTE_GET (external->p_type);
3610 internal->p_offset = BYTE_GET (external->p_offset);
3611 internal->p_vaddr = BYTE_GET (external->p_vaddr);
3612 internal->p_paddr = BYTE_GET (external->p_paddr);
3613 internal->p_filesz = BYTE_GET (external->p_filesz);
3614 internal->p_memsz = BYTE_GET (external->p_memsz);
3615 internal->p_flags = BYTE_GET (external->p_flags);
3616 internal->p_align = BYTE_GET (external->p_align);
3619 free (phdrs);
3621 return 1;
3624 static int
3625 get_64bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
3627 Elf64_External_Phdr * phdrs;
3628 Elf64_External_Phdr * external;
3629 Elf_Internal_Phdr * internal;
3630 unsigned int i;
3632 phdrs = (Elf64_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
3633 elf_header.e_phentsize,
3634 elf_header.e_phnum,
3635 _("program headers"));
3636 if (!phdrs)
3637 return 0;
3639 for (i = 0, internal = pheaders, external = phdrs;
3640 i < elf_header.e_phnum;
3641 i++, internal++, external++)
3643 internal->p_type = BYTE_GET (external->p_type);
3644 internal->p_flags = BYTE_GET (external->p_flags);
3645 internal->p_offset = BYTE_GET (external->p_offset);
3646 internal->p_vaddr = BYTE_GET (external->p_vaddr);
3647 internal->p_paddr = BYTE_GET (external->p_paddr);
3648 internal->p_filesz = BYTE_GET (external->p_filesz);
3649 internal->p_memsz = BYTE_GET (external->p_memsz);
3650 internal->p_align = BYTE_GET (external->p_align);
3653 free (phdrs);
3655 return 1;
3658 /* Returns 1 if the program headers were read into `program_headers'. */
3660 static int
3661 get_program_headers (FILE * file)
3663 Elf_Internal_Phdr * phdrs;
3665 /* Check cache of prior read. */
3666 if (program_headers != NULL)
3667 return 1;
3669 phdrs = (Elf_Internal_Phdr *) cmalloc (elf_header.e_phnum,
3670 sizeof (Elf_Internal_Phdr));
3672 if (phdrs == NULL)
3674 error (_("Out of memory\n"));
3675 return 0;
3678 if (is_32bit_elf
3679 ? get_32bit_program_headers (file, phdrs)
3680 : get_64bit_program_headers (file, phdrs))
3682 program_headers = phdrs;
3683 return 1;
3686 free (phdrs);
3687 return 0;
3690 /* Returns 1 if the program headers were loaded. */
3692 static int
3693 process_program_headers (FILE * file)
3695 Elf_Internal_Phdr * segment;
3696 unsigned int i;
3698 if (elf_header.e_phnum == 0)
3700 if (do_segments)
3701 printf (_("\nThere are no program headers in this file.\n"));
3702 return 0;
3705 if (do_segments && !do_header)
3707 printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
3708 printf (_("Entry point "));
3709 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
3710 printf (_("\nThere are %d program headers, starting at offset "),
3711 elf_header.e_phnum);
3712 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
3713 printf ("\n");
3716 if (! get_program_headers (file))
3717 return 0;
3719 if (do_segments)
3721 if (elf_header.e_phnum > 1)
3722 printf (_("\nProgram Headers:\n"));
3723 else
3724 printf (_("\nProgram Headers:\n"));
3726 if (is_32bit_elf)
3727 printf
3728 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3729 else if (do_wide)
3730 printf
3731 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3732 else
3734 printf
3735 (_(" Type Offset VirtAddr PhysAddr\n"));
3736 printf
3737 (_(" FileSiz MemSiz Flags Align\n"));
3741 dynamic_addr = 0;
3742 dynamic_size = 0;
3744 for (i = 0, segment = program_headers;
3745 i < elf_header.e_phnum;
3746 i++, segment++)
3748 if (do_segments)
3750 printf (" %-14.14s ", get_segment_type (segment->p_type));
3752 if (is_32bit_elf)
3754 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
3755 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
3756 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
3757 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
3758 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
3759 printf ("%c%c%c ",
3760 (segment->p_flags & PF_R ? 'R' : ' '),
3761 (segment->p_flags & PF_W ? 'W' : ' '),
3762 (segment->p_flags & PF_X ? 'E' : ' '));
3763 printf ("%#lx", (unsigned long) segment->p_align);
3765 else if (do_wide)
3767 if ((unsigned long) segment->p_offset == segment->p_offset)
3768 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
3769 else
3771 print_vma (segment->p_offset, FULL_HEX);
3772 putchar (' ');
3775 print_vma (segment->p_vaddr, FULL_HEX);
3776 putchar (' ');
3777 print_vma (segment->p_paddr, FULL_HEX);
3778 putchar (' ');
3780 if ((unsigned long) segment->p_filesz == segment->p_filesz)
3781 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
3782 else
3784 print_vma (segment->p_filesz, FULL_HEX);
3785 putchar (' ');
3788 if ((unsigned long) segment->p_memsz == segment->p_memsz)
3789 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
3790 else
3792 print_vma (segment->p_offset, FULL_HEX);
3795 printf (" %c%c%c ",
3796 (segment->p_flags & PF_R ? 'R' : ' '),
3797 (segment->p_flags & PF_W ? 'W' : ' '),
3798 (segment->p_flags & PF_X ? 'E' : ' '));
3800 if ((unsigned long) segment->p_align == segment->p_align)
3801 printf ("%#lx", (unsigned long) segment->p_align);
3802 else
3804 print_vma (segment->p_align, PREFIX_HEX);
3807 else
3809 print_vma (segment->p_offset, FULL_HEX);
3810 putchar (' ');
3811 print_vma (segment->p_vaddr, FULL_HEX);
3812 putchar (' ');
3813 print_vma (segment->p_paddr, FULL_HEX);
3814 printf ("\n ");
3815 print_vma (segment->p_filesz, FULL_HEX);
3816 putchar (' ');
3817 print_vma (segment->p_memsz, FULL_HEX);
3818 printf (" %c%c%c ",
3819 (segment->p_flags & PF_R ? 'R' : ' '),
3820 (segment->p_flags & PF_W ? 'W' : ' '),
3821 (segment->p_flags & PF_X ? 'E' : ' '));
3822 print_vma (segment->p_align, HEX);
3826 switch (segment->p_type)
3828 case PT_DYNAMIC:
3829 if (dynamic_addr)
3830 error (_("more than one dynamic segment\n"));
3832 /* By default, assume that the .dynamic section is the first
3833 section in the DYNAMIC segment. */
3834 dynamic_addr = segment->p_offset;
3835 dynamic_size = segment->p_filesz;
3837 /* Try to locate the .dynamic section. If there is
3838 a section header table, we can easily locate it. */
3839 if (section_headers != NULL)
3841 Elf_Internal_Shdr * sec;
3843 sec = find_section (".dynamic");
3844 if (sec == NULL || sec->sh_size == 0)
3846 /* A corresponding .dynamic section is expected, but on
3847 IA-64/OpenVMS it is OK for it to be missing. */
3848 if (!is_ia64_vms ())
3849 error (_("no .dynamic section in the dynamic segment\n"));
3850 break;
3853 if (sec->sh_type == SHT_NOBITS)
3855 dynamic_size = 0;
3856 break;
3859 dynamic_addr = sec->sh_offset;
3860 dynamic_size = sec->sh_size;
3862 if (dynamic_addr < segment->p_offset
3863 || dynamic_addr > segment->p_offset + segment->p_filesz)
3864 warn (_("the .dynamic section is not contained"
3865 " within the dynamic segment\n"));
3866 else if (dynamic_addr > segment->p_offset)
3867 warn (_("the .dynamic section is not the first section"
3868 " in the dynamic segment.\n"));
3870 break;
3872 case PT_INTERP:
3873 if (fseek (file, archive_file_offset + (long) segment->p_offset,
3874 SEEK_SET))
3875 error (_("Unable to find program interpreter name\n"));
3876 else
3878 char fmt [32];
3879 int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX);
3881 if (ret >= (int) sizeof (fmt) || ret < 0)
3882 error (_("Internal error: failed to create format string to display program interpreter\n"));
3884 program_interpreter[0] = 0;
3885 if (fscanf (file, fmt, program_interpreter) <= 0)
3886 error (_("Unable to read program interpreter name\n"));
3888 if (do_segments)
3889 printf (_("\n [Requesting program interpreter: %s]"),
3890 program_interpreter);
3892 break;
3895 if (do_segments)
3896 putc ('\n', stdout);
3899 if (do_segments && section_headers != NULL && string_table != NULL)
3901 printf (_("\n Section to Segment mapping:\n"));
3902 printf (_(" Segment Sections...\n"));
3904 for (i = 0; i < elf_header.e_phnum; i++)
3906 unsigned int j;
3907 Elf_Internal_Shdr * section;
3909 segment = program_headers + i;
3910 section = section_headers + 1;
3912 printf (" %2.2d ", i);
3914 for (j = 1; j < elf_header.e_shnum; j++, section++)
3916 if (!ELF_TBSS_SPECIAL (section, segment)
3917 && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
3918 printf ("%s ", SECTION_NAME (section));
3921 putc ('\n',stdout);
3925 return 1;
3929 /* Find the file offset corresponding to VMA by using the program headers. */
3931 static long
3932 offset_from_vma (FILE * file, bfd_vma vma, bfd_size_type size)
3934 Elf_Internal_Phdr * seg;
3936 if (! get_program_headers (file))
3938 warn (_("Cannot interpret virtual addresses without program headers.\n"));
3939 return (long) vma;
3942 for (seg = program_headers;
3943 seg < program_headers + elf_header.e_phnum;
3944 ++seg)
3946 if (seg->p_type != PT_LOAD)
3947 continue;
3949 if (vma >= (seg->p_vaddr & -seg->p_align)
3950 && vma + size <= seg->p_vaddr + seg->p_filesz)
3951 return vma - seg->p_vaddr + seg->p_offset;
3954 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
3955 (unsigned long) vma);
3956 return (long) vma;
3960 static int
3961 get_32bit_section_headers (FILE * file, unsigned int num)
3963 Elf32_External_Shdr * shdrs;
3964 Elf_Internal_Shdr * internal;
3965 unsigned int i;
3967 shdrs = (Elf32_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
3968 elf_header.e_shentsize, num,
3969 _("section headers"));
3970 if (!shdrs)
3971 return 0;
3973 section_headers = (Elf_Internal_Shdr *) cmalloc (num,
3974 sizeof (Elf_Internal_Shdr));
3976 if (section_headers == NULL)
3978 error (_("Out of memory\n"));
3979 return 0;
3982 for (i = 0, internal = section_headers;
3983 i < num;
3984 i++, internal++)
3986 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
3987 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
3988 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
3989 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
3990 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
3991 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
3992 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
3993 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
3994 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
3995 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
3998 free (shdrs);
4000 return 1;
4003 static int
4004 get_64bit_section_headers (FILE * file, unsigned int num)
4006 Elf64_External_Shdr * shdrs;
4007 Elf_Internal_Shdr * internal;
4008 unsigned int i;
4010 shdrs = (Elf64_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
4011 elf_header.e_shentsize, num,
4012 _("section headers"));
4013 if (!shdrs)
4014 return 0;
4016 section_headers = (Elf_Internal_Shdr *) cmalloc (num,
4017 sizeof (Elf_Internal_Shdr));
4019 if (section_headers == NULL)
4021 error (_("Out of memory\n"));
4022 return 0;
4025 for (i = 0, internal = section_headers;
4026 i < num;
4027 i++, internal++)
4029 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
4030 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
4031 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
4032 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
4033 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
4034 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
4035 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
4036 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
4037 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
4038 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
4041 free (shdrs);
4043 return 1;
4046 static Elf_Internal_Sym *
4047 get_32bit_elf_symbols (FILE * file, Elf_Internal_Shdr * section)
4049 unsigned long number;
4050 Elf32_External_Sym * esyms = NULL;
4051 Elf_External_Sym_Shndx * shndx;
4052 Elf_Internal_Sym * isyms = NULL;
4053 Elf_Internal_Sym * psym;
4054 unsigned int j;
4056 /* Run some sanity checks first. */
4057 if (section->sh_entsize == 0)
4059 error (_("sh_entsize is zero\n"));
4060 return NULL;
4063 number = section->sh_size / section->sh_entsize;
4065 if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
4067 error (_("Invalid sh_entsize\n"));
4068 return NULL;
4071 esyms = (Elf32_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
4072 section->sh_size, _("symbols"));
4073 if (esyms == NULL)
4074 return NULL;
4076 shndx = NULL;
4077 if (symtab_shndx_hdr != NULL
4078 && (symtab_shndx_hdr->sh_link
4079 == (unsigned long) (section - section_headers)))
4081 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
4082 symtab_shndx_hdr->sh_offset,
4083 1, symtab_shndx_hdr->sh_size,
4084 _("symtab shndx"));
4085 if (shndx == NULL)
4086 goto exit_point;
4089 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
4091 if (isyms == NULL)
4093 error (_("Out of memory\n"));
4094 goto exit_point;
4097 for (j = 0, psym = isyms; j < number; j++, psym++)
4099 psym->st_name = BYTE_GET (esyms[j].st_name);
4100 psym->st_value = BYTE_GET (esyms[j].st_value);
4101 psym->st_size = BYTE_GET (esyms[j].st_size);
4102 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
4103 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
4104 psym->st_shndx
4105 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
4106 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
4107 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
4108 psym->st_info = BYTE_GET (esyms[j].st_info);
4109 psym->st_other = BYTE_GET (esyms[j].st_other);
4112 exit_point:
4113 if (shndx)
4114 free (shndx);
4115 if (esyms)
4116 free (esyms);
4118 return isyms;
4121 static Elf_Internal_Sym *
4122 get_64bit_elf_symbols (FILE * file, Elf_Internal_Shdr * section)
4124 unsigned long number;
4125 Elf64_External_Sym * esyms;
4126 Elf_External_Sym_Shndx * shndx;
4127 Elf_Internal_Sym * isyms;
4128 Elf_Internal_Sym * psym;
4129 unsigned int j;
4131 /* Run some sanity checks first. */
4132 if (section->sh_entsize == 0)
4134 error (_("sh_entsize is zero\n"));
4135 return NULL;
4138 number = section->sh_size / section->sh_entsize;
4140 if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
4142 error (_("Invalid sh_entsize\n"));
4143 return NULL;
4146 esyms = (Elf64_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
4147 section->sh_size, _("symbols"));
4148 if (!esyms)
4149 return NULL;
4151 shndx = NULL;
4152 if (symtab_shndx_hdr != NULL
4153 && (symtab_shndx_hdr->sh_link
4154 == (unsigned long) (section - section_headers)))
4156 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
4157 symtab_shndx_hdr->sh_offset,
4158 1, symtab_shndx_hdr->sh_size,
4159 _("symtab shndx"));
4160 if (!shndx)
4162 free (esyms);
4163 return NULL;
4167 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
4169 if (isyms == NULL)
4171 error (_("Out of memory\n"));
4172 if (shndx)
4173 free (shndx);
4174 free (esyms);
4175 return NULL;
4178 for (j = 0, psym = isyms;
4179 j < number;
4180 j++, psym++)
4182 psym->st_name = BYTE_GET (esyms[j].st_name);
4183 psym->st_info = BYTE_GET (esyms[j].st_info);
4184 psym->st_other = BYTE_GET (esyms[j].st_other);
4185 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
4186 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
4187 psym->st_shndx
4188 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
4189 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
4190 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
4191 psym->st_value = BYTE_GET (esyms[j].st_value);
4192 psym->st_size = BYTE_GET (esyms[j].st_size);
4195 if (shndx)
4196 free (shndx);
4197 free (esyms);
4199 return isyms;
4202 static const char *
4203 get_elf_section_flags (bfd_vma sh_flags)
4205 static char buff[1024];
4206 char * p = buff;
4207 int field_size = is_32bit_elf ? 8 : 16;
4208 int sindex;
4209 int size = sizeof (buff) - (field_size + 4 + 1);
4210 bfd_vma os_flags = 0;
4211 bfd_vma proc_flags = 0;
4212 bfd_vma unknown_flags = 0;
4213 static const struct
4215 const char * str;
4216 int len;
4218 flags [] =
4220 /* 0 */ { STRING_COMMA_LEN ("WRITE") },
4221 /* 1 */ { STRING_COMMA_LEN ("ALLOC") },
4222 /* 2 */ { STRING_COMMA_LEN ("EXEC") },
4223 /* 3 */ { STRING_COMMA_LEN ("MERGE") },
4224 /* 4 */ { STRING_COMMA_LEN ("STRINGS") },
4225 /* 5 */ { STRING_COMMA_LEN ("INFO LINK") },
4226 /* 6 */ { STRING_COMMA_LEN ("LINK ORDER") },
4227 /* 7 */ { STRING_COMMA_LEN ("OS NONCONF") },
4228 /* 8 */ { STRING_COMMA_LEN ("GROUP") },
4229 /* 9 */ { STRING_COMMA_LEN ("TLS") },
4230 /* IA-64 specific. */
4231 /* 10 */ { STRING_COMMA_LEN ("SHORT") },
4232 /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
4233 /* IA-64 OpenVMS specific. */
4234 /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
4235 /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
4236 /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
4237 /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
4238 /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
4239 /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
4240 /* Generic. */
4241 /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
4242 /* SPARC specific. */
4243 /* 19 */ { STRING_COMMA_LEN ("ORDERED") }
4246 if (do_section_details)
4248 sprintf (buff, "[%*.*lx]: ",
4249 field_size, field_size, (unsigned long) sh_flags);
4250 p += field_size + 4;
4253 while (sh_flags)
4255 bfd_vma flag;
4257 flag = sh_flags & - sh_flags;
4258 sh_flags &= ~ flag;
4260 if (do_section_details)
4262 switch (flag)
4264 case SHF_WRITE: sindex = 0; break;
4265 case SHF_ALLOC: sindex = 1; break;
4266 case SHF_EXECINSTR: sindex = 2; break;
4267 case SHF_MERGE: sindex = 3; break;
4268 case SHF_STRINGS: sindex = 4; break;
4269 case SHF_INFO_LINK: sindex = 5; break;
4270 case SHF_LINK_ORDER: sindex = 6; break;
4271 case SHF_OS_NONCONFORMING: sindex = 7; break;
4272 case SHF_GROUP: sindex = 8; break;
4273 case SHF_TLS: sindex = 9; break;
4274 case SHF_EXCLUDE: sindex = 18; break;
4276 default:
4277 sindex = -1;
4278 switch (elf_header.e_machine)
4280 case EM_IA_64:
4281 if (flag == SHF_IA_64_SHORT)
4282 sindex = 10;
4283 else if (flag == SHF_IA_64_NORECOV)
4284 sindex = 11;
4285 #ifdef BFD64
4286 else if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
4287 switch (flag)
4289 case SHF_IA_64_VMS_GLOBAL: sindex = 12; break;
4290 case SHF_IA_64_VMS_OVERLAID: sindex = 13; break;
4291 case SHF_IA_64_VMS_SHARED: sindex = 14; break;
4292 case SHF_IA_64_VMS_VECTOR: sindex = 15; break;
4293 case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
4294 case SHF_IA_64_VMS_PROTECTED: sindex = 17; break;
4295 default: break;
4297 #endif
4298 break;
4300 case EM_386:
4301 case EM_486:
4302 case EM_X86_64:
4303 case EM_L1OM:
4304 case EM_OLD_SPARCV9:
4305 case EM_SPARC32PLUS:
4306 case EM_SPARCV9:
4307 case EM_SPARC:
4308 if (flag == SHF_ORDERED)
4309 sindex = 19;
4310 break;
4311 default:
4312 break;
4316 if (sindex != -1)
4318 if (p != buff + field_size + 4)
4320 if (size < (10 + 2))
4321 abort ();
4322 size -= 2;
4323 *p++ = ',';
4324 *p++ = ' ';
4327 size -= flags [sindex].len;
4328 p = stpcpy (p, flags [sindex].str);
4330 else if (flag & SHF_MASKOS)
4331 os_flags |= flag;
4332 else if (flag & SHF_MASKPROC)
4333 proc_flags |= flag;
4334 else
4335 unknown_flags |= flag;
4337 else
4339 switch (flag)
4341 case SHF_WRITE: *p = 'W'; break;
4342 case SHF_ALLOC: *p = 'A'; break;
4343 case SHF_EXECINSTR: *p = 'X'; break;
4344 case SHF_MERGE: *p = 'M'; break;
4345 case SHF_STRINGS: *p = 'S'; break;
4346 case SHF_INFO_LINK: *p = 'I'; break;
4347 case SHF_LINK_ORDER: *p = 'L'; break;
4348 case SHF_OS_NONCONFORMING: *p = 'O'; break;
4349 case SHF_GROUP: *p = 'G'; break;
4350 case SHF_TLS: *p = 'T'; break;
4351 case SHF_EXCLUDE: *p = 'E'; break;
4353 default:
4354 if ((elf_header.e_machine == EM_X86_64
4355 || elf_header.e_machine == EM_L1OM)
4356 && flag == SHF_X86_64_LARGE)
4357 *p = 'l';
4358 else if (flag & SHF_MASKOS)
4360 *p = 'o';
4361 sh_flags &= ~ SHF_MASKOS;
4363 else if (flag & SHF_MASKPROC)
4365 *p = 'p';
4366 sh_flags &= ~ SHF_MASKPROC;
4368 else
4369 *p = 'x';
4370 break;
4372 p++;
4376 if (do_section_details)
4378 if (os_flags)
4380 size -= 5 + field_size;
4381 if (p != buff + field_size + 4)
4383 if (size < (2 + 1))
4384 abort ();
4385 size -= 2;
4386 *p++ = ',';
4387 *p++ = ' ';
4389 sprintf (p, "OS (%*.*lx)", field_size, field_size,
4390 (unsigned long) os_flags);
4391 p += 5 + field_size;
4393 if (proc_flags)
4395 size -= 7 + field_size;
4396 if (p != buff + field_size + 4)
4398 if (size < (2 + 1))
4399 abort ();
4400 size -= 2;
4401 *p++ = ',';
4402 *p++ = ' ';
4404 sprintf (p, "PROC (%*.*lx)", field_size, field_size,
4405 (unsigned long) proc_flags);
4406 p += 7 + field_size;
4408 if (unknown_flags)
4410 size -= 10 + field_size;
4411 if (p != buff + field_size + 4)
4413 if (size < (2 + 1))
4414 abort ();
4415 size -= 2;
4416 *p++ = ',';
4417 *p++ = ' ';
4419 sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
4420 (unsigned long) unknown_flags);
4421 p += 10 + field_size;
4425 *p = '\0';
4426 return buff;
4429 static int
4430 process_section_headers (FILE * file)
4432 Elf_Internal_Shdr * section;
4433 unsigned int i;
4435 section_headers = NULL;
4437 if (elf_header.e_shnum == 0)
4439 if (do_sections)
4440 printf (_("\nThere are no sections in this file.\n"));
4442 return 1;
4445 if (do_sections && !do_header)
4446 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
4447 elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
4449 if (is_32bit_elf)
4451 if (! get_32bit_section_headers (file, elf_header.e_shnum))
4452 return 0;
4454 else if (! get_64bit_section_headers (file, elf_header.e_shnum))
4455 return 0;
4457 /* Read in the string table, so that we have names to display. */
4458 if (elf_header.e_shstrndx != SHN_UNDEF
4459 && elf_header.e_shstrndx < elf_header.e_shnum)
4461 section = section_headers + elf_header.e_shstrndx;
4463 if (section->sh_size != 0)
4465 string_table = (char *) get_data (NULL, file, section->sh_offset,
4466 1, section->sh_size,
4467 _("string table"));
4469 string_table_length = string_table != NULL ? section->sh_size : 0;
4473 /* Scan the sections for the dynamic symbol table
4474 and dynamic string table and debug sections. */
4475 dynamic_symbols = NULL;
4476 dynamic_strings = NULL;
4477 dynamic_syminfo = NULL;
4478 symtab_shndx_hdr = NULL;
4480 eh_addr_size = is_32bit_elf ? 4 : 8;
4481 switch (elf_header.e_machine)
4483 case EM_MIPS:
4484 case EM_MIPS_RS3_LE:
4485 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
4486 FDE addresses. However, the ABI also has a semi-official ILP32
4487 variant for which the normal FDE address size rules apply.
4489 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
4490 section, where XX is the size of longs in bits. Unfortunately,
4491 earlier compilers provided no way of distinguishing ILP32 objects
4492 from LP64 objects, so if there's any doubt, we should assume that
4493 the official LP64 form is being used. */
4494 if ((elf_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
4495 && find_section (".gcc_compiled_long32") == NULL)
4496 eh_addr_size = 8;
4497 break;
4499 case EM_H8_300:
4500 case EM_H8_300H:
4501 switch (elf_header.e_flags & EF_H8_MACH)
4503 case E_H8_MACH_H8300:
4504 case E_H8_MACH_H8300HN:
4505 case E_H8_MACH_H8300SN:
4506 case E_H8_MACH_H8300SXN:
4507 eh_addr_size = 2;
4508 break;
4509 case E_H8_MACH_H8300H:
4510 case E_H8_MACH_H8300S:
4511 case E_H8_MACH_H8300SX:
4512 eh_addr_size = 4;
4513 break;
4515 break;
4517 case EM_M32C_OLD:
4518 case EM_M32C:
4519 switch (elf_header.e_flags & EF_M32C_CPU_MASK)
4521 case EF_M32C_CPU_M16C:
4522 eh_addr_size = 2;
4523 break;
4525 break;
4528 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
4529 do \
4531 size_t expected_entsize \
4532 = is_32bit_elf ? size32 : size64; \
4533 if (section->sh_entsize != expected_entsize) \
4534 error (_("Section %d has invalid sh_entsize %lx (expected %lx)\n"), \
4535 i, (unsigned long int) section->sh_entsize, \
4536 (unsigned long int) expected_entsize); \
4537 section->sh_entsize = expected_entsize; \
4539 while (0)
4540 #define CHECK_ENTSIZE(section, i, type) \
4541 CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
4542 sizeof (Elf64_External_##type))
4544 for (i = 0, section = section_headers;
4545 i < elf_header.e_shnum;
4546 i++, section++)
4548 char * name = SECTION_NAME (section);
4550 if (section->sh_type == SHT_DYNSYM)
4552 if (dynamic_symbols != NULL)
4554 error (_("File contains multiple dynamic symbol tables\n"));
4555 continue;
4558 CHECK_ENTSIZE (section, i, Sym);
4559 num_dynamic_syms = section->sh_size / section->sh_entsize;
4560 dynamic_symbols = GET_ELF_SYMBOLS (file, section);
4562 else if (section->sh_type == SHT_STRTAB
4563 && streq (name, ".dynstr"))
4565 if (dynamic_strings != NULL)
4567 error (_("File contains multiple dynamic string tables\n"));
4568 continue;
4571 dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
4572 1, section->sh_size,
4573 _("dynamic strings"));
4574 dynamic_strings_length = section->sh_size;
4576 else if (section->sh_type == SHT_SYMTAB_SHNDX)
4578 if (symtab_shndx_hdr != NULL)
4580 error (_("File contains multiple symtab shndx tables\n"));
4581 continue;
4583 symtab_shndx_hdr = section;
4585 else if (section->sh_type == SHT_SYMTAB)
4586 CHECK_ENTSIZE (section, i, Sym);
4587 else if (section->sh_type == SHT_GROUP)
4588 CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
4589 else if (section->sh_type == SHT_REL)
4590 CHECK_ENTSIZE (section, i, Rel);
4591 else if (section->sh_type == SHT_RELA)
4592 CHECK_ENTSIZE (section, i, Rela);
4593 else if ((do_debugging || do_debug_info || do_debug_abbrevs
4594 || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
4595 || do_debug_aranges || do_debug_frames || do_debug_macinfo
4596 || do_debug_str || do_debug_loc || do_debug_ranges)
4597 && (const_strneq (name, ".debug_")
4598 || const_strneq (name, ".zdebug_")))
4600 if (name[1] == 'z')
4601 name += sizeof (".zdebug_") - 1;
4602 else
4603 name += sizeof (".debug_") - 1;
4605 if (do_debugging
4606 || (do_debug_info && streq (name, "info"))
4607 || (do_debug_info && streq (name, "types"))
4608 || (do_debug_abbrevs && streq (name, "abbrev"))
4609 || (do_debug_lines && streq (name, "line"))
4610 || (do_debug_pubnames && streq (name, "pubnames"))
4611 || (do_debug_pubtypes && streq (name, "pubtypes"))
4612 || (do_debug_aranges && streq (name, "aranges"))
4613 || (do_debug_ranges && streq (name, "ranges"))
4614 || (do_debug_frames && streq (name, "frame"))
4615 || (do_debug_macinfo && streq (name, "macinfo"))
4616 || (do_debug_str && streq (name, "str"))
4617 || (do_debug_loc && streq (name, "loc"))
4619 request_dump_bynumber (i, DEBUG_DUMP);
4621 /* Linkonce section to be combined with .debug_info at link time. */
4622 else if ((do_debugging || do_debug_info)
4623 && const_strneq (name, ".gnu.linkonce.wi."))
4624 request_dump_bynumber (i, DEBUG_DUMP);
4625 else if (do_debug_frames && streq (name, ".eh_frame"))
4626 request_dump_bynumber (i, DEBUG_DUMP);
4627 /* Trace sections for Itanium VMS. */
4628 else if ((do_debugging || do_trace_info || do_trace_abbrevs
4629 || do_trace_aranges)
4630 && const_strneq (name, ".trace_"))
4632 name += sizeof (".trace_") - 1;
4634 if (do_debugging
4635 || (do_trace_info && streq (name, "info"))
4636 || (do_trace_abbrevs && streq (name, "abbrev"))
4637 || (do_trace_aranges && streq (name, "aranges"))
4639 request_dump_bynumber (i, DEBUG_DUMP);
4644 if (! do_sections)
4645 return 1;
4647 if (elf_header.e_shnum > 1)
4648 printf (_("\nSection Headers:\n"));
4649 else
4650 printf (_("\nSection Header:\n"));
4652 if (is_32bit_elf)
4654 if (do_section_details)
4656 printf (_(" [Nr] Name\n"));
4657 printf (_(" Type Addr Off Size ES Lk Inf Al\n"));
4659 else
4660 printf
4661 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
4663 else if (do_wide)
4665 if (do_section_details)
4667 printf (_(" [Nr] Name\n"));
4668 printf (_(" Type Address Off Size ES Lk Inf Al\n"));
4670 else
4671 printf
4672 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
4674 else
4676 if (do_section_details)
4678 printf (_(" [Nr] Name\n"));
4679 printf (_(" Type Address Offset Link\n"));
4680 printf (_(" Size EntSize Info Align\n"));
4682 else
4684 printf (_(" [Nr] Name Type Address Offset\n"));
4685 printf (_(" Size EntSize Flags Link Info Align\n"));
4689 if (do_section_details)
4690 printf (_(" Flags\n"));
4692 for (i = 0, section = section_headers;
4693 i < elf_header.e_shnum;
4694 i++, section++)
4696 if (do_section_details)
4698 printf (" [%2u] %s\n",
4700 SECTION_NAME (section));
4701 if (is_32bit_elf || do_wide)
4702 printf (" %-15.15s ",
4703 get_section_type_name (section->sh_type));
4705 else
4706 printf ((do_wide ? " [%2u] %-17s %-15s "
4707 : " [%2u] %-17.17s %-15.15s "),
4709 SECTION_NAME (section),
4710 get_section_type_name (section->sh_type));
4712 if (is_32bit_elf)
4714 const char * link_too_big = NULL;
4716 print_vma (section->sh_addr, LONG_HEX);
4718 printf ( " %6.6lx %6.6lx %2.2lx",
4719 (unsigned long) section->sh_offset,
4720 (unsigned long) section->sh_size,
4721 (unsigned long) section->sh_entsize);
4723 if (do_section_details)
4724 fputs (" ", stdout);
4725 else
4726 printf (" %3s ", get_elf_section_flags (section->sh_flags));
4728 if (section->sh_link >= elf_header.e_shnum)
4730 link_too_big = "";
4731 /* The sh_link value is out of range. Normally this indicates
4732 an error but it can have special values in Solaris binaries. */
4733 switch (elf_header.e_machine)
4735 case EM_386:
4736 case EM_486:
4737 case EM_X86_64:
4738 case EM_L1OM:
4739 case EM_OLD_SPARCV9:
4740 case EM_SPARC32PLUS:
4741 case EM_SPARCV9:
4742 case EM_SPARC:
4743 if (section->sh_link == (SHN_BEFORE & 0xffff))
4744 link_too_big = "BEFORE";
4745 else if (section->sh_link == (SHN_AFTER & 0xffff))
4746 link_too_big = "AFTER";
4747 break;
4748 default:
4749 break;
4753 if (do_section_details)
4755 if (link_too_big != NULL && * link_too_big)
4756 printf ("<%s> ", link_too_big);
4757 else
4758 printf ("%2u ", section->sh_link);
4759 printf ("%3u %2lu\n", section->sh_info,
4760 (unsigned long) section->sh_addralign);
4762 else
4763 printf ("%2u %3u %2lu\n",
4764 section->sh_link,
4765 section->sh_info,
4766 (unsigned long) section->sh_addralign);
4768 if (link_too_big && ! * link_too_big)
4769 warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
4770 i, section->sh_link);
4772 else if (do_wide)
4774 print_vma (section->sh_addr, LONG_HEX);
4776 if ((long) section->sh_offset == section->sh_offset)
4777 printf (" %6.6lx", (unsigned long) section->sh_offset);
4778 else
4780 putchar (' ');
4781 print_vma (section->sh_offset, LONG_HEX);
4784 if ((unsigned long) section->sh_size == section->sh_size)
4785 printf (" %6.6lx", (unsigned long) section->sh_size);
4786 else
4788 putchar (' ');
4789 print_vma (section->sh_size, LONG_HEX);
4792 if ((unsigned long) section->sh_entsize == section->sh_entsize)
4793 printf (" %2.2lx", (unsigned long) section->sh_entsize);
4794 else
4796 putchar (' ');
4797 print_vma (section->sh_entsize, LONG_HEX);
4800 if (do_section_details)
4801 fputs (" ", stdout);
4802 else
4803 printf (" %3s ", get_elf_section_flags (section->sh_flags));
4805 printf ("%2u %3u ", section->sh_link, section->sh_info);
4807 if ((unsigned long) section->sh_addralign == section->sh_addralign)
4808 printf ("%2lu\n", (unsigned long) section->sh_addralign);
4809 else
4811 print_vma (section->sh_addralign, DEC);
4812 putchar ('\n');
4815 else if (do_section_details)
4817 printf (" %-15.15s ",
4818 get_section_type_name (section->sh_type));
4819 print_vma (section->sh_addr, LONG_HEX);
4820 if ((long) section->sh_offset == section->sh_offset)
4821 printf (" %16.16lx", (unsigned long) section->sh_offset);
4822 else
4824 printf (" ");
4825 print_vma (section->sh_offset, LONG_HEX);
4827 printf (" %u\n ", section->sh_link);
4828 print_vma (section->sh_size, LONG_HEX);
4829 putchar (' ');
4830 print_vma (section->sh_entsize, LONG_HEX);
4832 printf (" %-16u %lu\n",
4833 section->sh_info,
4834 (unsigned long) section->sh_addralign);
4836 else
4838 putchar (' ');
4839 print_vma (section->sh_addr, LONG_HEX);
4840 if ((long) section->sh_offset == section->sh_offset)
4841 printf (" %8.8lx", (unsigned long) section->sh_offset);
4842 else
4844 printf (" ");
4845 print_vma (section->sh_offset, LONG_HEX);
4847 printf ("\n ");
4848 print_vma (section->sh_size, LONG_HEX);
4849 printf (" ");
4850 print_vma (section->sh_entsize, LONG_HEX);
4852 printf (" %3s ", get_elf_section_flags (section->sh_flags));
4854 printf (" %2u %3u %lu\n",
4855 section->sh_link,
4856 section->sh_info,
4857 (unsigned long) section->sh_addralign);
4860 if (do_section_details)
4861 printf (" %s\n", get_elf_section_flags (section->sh_flags));
4864 if (!do_section_details)
4866 if (elf_header.e_machine == EM_X86_64
4867 || elf_header.e_machine == EM_L1OM)
4868 printf (_("Key to Flags:\n\
4869 W (write), A (alloc), X (execute), M (merge), S (strings), l (large)\n\
4870 I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)\n\
4871 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
4872 else
4873 printf (_("Key to Flags:\n\
4874 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
4875 I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)\n\
4876 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
4879 return 1;
4882 static const char *
4883 get_group_flags (unsigned int flags)
4885 static char buff[32];
4886 switch (flags)
4888 case 0:
4889 return "";
4891 case GRP_COMDAT:
4892 return "COMDAT ";
4894 default:
4895 snprintf (buff, sizeof (buff), _("[<unknown>: 0x%x] "), flags);
4896 break;
4898 return buff;
4901 static int
4902 process_section_groups (FILE * file)
4904 Elf_Internal_Shdr * section;
4905 unsigned int i;
4906 struct group * group;
4907 Elf_Internal_Shdr * symtab_sec;
4908 Elf_Internal_Shdr * strtab_sec;
4909 Elf_Internal_Sym * symtab;
4910 char * strtab;
4911 size_t strtab_size;
4913 /* Don't process section groups unless needed. */
4914 if (!do_unwind && !do_section_groups)
4915 return 1;
4917 if (elf_header.e_shnum == 0)
4919 if (do_section_groups)
4920 printf (_("\nThere are no sections in this file.\n"));
4922 return 1;
4925 if (section_headers == NULL)
4927 error (_("Section headers are not available!\n"));
4928 abort ();
4931 section_headers_groups = (struct group **) calloc (elf_header.e_shnum,
4932 sizeof (struct group *));
4934 if (section_headers_groups == NULL)
4936 error (_("Out of memory\n"));
4937 return 0;
4940 /* Scan the sections for the group section. */
4941 group_count = 0;
4942 for (i = 0, section = section_headers;
4943 i < elf_header.e_shnum;
4944 i++, section++)
4945 if (section->sh_type == SHT_GROUP)
4946 group_count++;
4948 if (group_count == 0)
4950 if (do_section_groups)
4951 printf (_("\nThere are no section groups in this file.\n"));
4953 return 1;
4956 section_groups = (struct group *) calloc (group_count, sizeof (struct group));
4958 if (section_groups == NULL)
4960 error (_("Out of memory\n"));
4961 return 0;
4964 symtab_sec = NULL;
4965 strtab_sec = NULL;
4966 symtab = NULL;
4967 strtab = NULL;
4968 strtab_size = 0;
4969 for (i = 0, section = section_headers, group = section_groups;
4970 i < elf_header.e_shnum;
4971 i++, section++)
4973 if (section->sh_type == SHT_GROUP)
4975 char * name = SECTION_NAME (section);
4976 char * group_name;
4977 unsigned char * start;
4978 unsigned char * indices;
4979 unsigned int entry, j, size;
4980 Elf_Internal_Shdr * sec;
4981 Elf_Internal_Sym * sym;
4983 /* Get the symbol table. */
4984 if (section->sh_link >= elf_header.e_shnum
4985 || ((sec = section_headers + section->sh_link)->sh_type
4986 != SHT_SYMTAB))
4988 error (_("Bad sh_link in group section `%s'\n"), name);
4989 continue;
4992 if (symtab_sec != sec)
4994 symtab_sec = sec;
4995 if (symtab)
4996 free (symtab);
4997 symtab = GET_ELF_SYMBOLS (file, symtab_sec);
5000 if (symtab == NULL)
5002 error (_("Corrupt header in group section `%s'\n"), name);
5003 continue;
5006 sym = symtab + section->sh_info;
5008 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
5010 if (sym->st_shndx == 0
5011 || sym->st_shndx >= elf_header.e_shnum)
5013 error (_("Bad sh_info in group section `%s'\n"), name);
5014 continue;
5017 group_name = SECTION_NAME (section_headers + sym->st_shndx);
5018 strtab_sec = NULL;
5019 if (strtab)
5020 free (strtab);
5021 strtab = NULL;
5022 strtab_size = 0;
5024 else
5026 /* Get the string table. */
5027 if (symtab_sec->sh_link >= elf_header.e_shnum)
5029 strtab_sec = NULL;
5030 if (strtab)
5031 free (strtab);
5032 strtab = NULL;
5033 strtab_size = 0;
5035 else if (strtab_sec
5036 != (sec = section_headers + symtab_sec->sh_link))
5038 strtab_sec = sec;
5039 if (strtab)
5040 free (strtab);
5041 strtab = (char *) get_data (NULL, file, strtab_sec->sh_offset,
5042 1, strtab_sec->sh_size,
5043 _("string table"));
5044 strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
5046 group_name = sym->st_name < strtab_size
5047 ? strtab + sym->st_name : _("<corrupt>");
5050 start = (unsigned char *) get_data (NULL, file, section->sh_offset,
5051 1, section->sh_size,
5052 _("section data"));
5054 indices = start;
5055 size = (section->sh_size / section->sh_entsize) - 1;
5056 entry = byte_get (indices, 4);
5057 indices += 4;
5059 if (do_section_groups)
5061 printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
5062 get_group_flags (entry), i, name, group_name, size);
5064 printf (_(" [Index] Name\n"));
5067 group->group_index = i;
5069 for (j = 0; j < size; j++)
5071 struct group_list * g;
5073 entry = byte_get (indices, 4);
5074 indices += 4;
5076 if (entry >= elf_header.e_shnum)
5078 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
5079 entry, i, elf_header.e_shnum - 1);
5080 continue;
5083 if (section_headers_groups [entry] != NULL)
5085 if (entry)
5087 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
5088 entry, i,
5089 section_headers_groups [entry]->group_index);
5090 continue;
5092 else
5094 /* Intel C/C++ compiler may put section 0 in a
5095 section group. We just warn it the first time
5096 and ignore it afterwards. */
5097 static int warned = 0;
5098 if (!warned)
5100 error (_("section 0 in group section [%5u]\n"),
5101 section_headers_groups [entry]->group_index);
5102 warned++;
5107 section_headers_groups [entry] = group;
5109 if (do_section_groups)
5111 sec = section_headers + entry;
5112 printf (" [%5u] %s\n", entry, SECTION_NAME (sec));
5115 g = (struct group_list *) xmalloc (sizeof (struct group_list));
5116 g->section_index = entry;
5117 g->next = group->root;
5118 group->root = g;
5121 if (start)
5122 free (start);
5124 group++;
5128 if (symtab)
5129 free (symtab);
5130 if (strtab)
5131 free (strtab);
5132 return 1;
5135 /* Data used to display dynamic fixups. */
5137 struct ia64_vms_dynfixup
5139 bfd_vma needed_ident; /* Library ident number. */
5140 bfd_vma needed; /* Index in the dstrtab of the library name. */
5141 bfd_vma fixup_needed; /* Index of the library. */
5142 bfd_vma fixup_rela_cnt; /* Number of fixups. */
5143 bfd_vma fixup_rela_off; /* Fixups offset in the dynamic segment. */
5146 /* Data used to display dynamic relocations. */
5148 struct ia64_vms_dynimgrela
5150 bfd_vma img_rela_cnt; /* Number of relocations. */
5151 bfd_vma img_rela_off; /* Reloc offset in the dynamic segment. */
5154 /* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
5155 library). */
5157 static void
5158 dump_ia64_vms_dynamic_fixups (FILE *file, struct ia64_vms_dynfixup *fixup,
5159 const char *strtab, unsigned int strtab_sz)
5161 Elf64_External_VMS_IMAGE_FIXUP *imfs;
5162 long i;
5163 const char *lib_name;
5165 imfs = get_data (NULL, file, dynamic_addr + fixup->fixup_rela_off,
5166 1, fixup->fixup_rela_cnt * sizeof (*imfs),
5167 _("dynamic section image fixups"));
5168 if (!imfs)
5169 return;
5171 if (fixup->needed < strtab_sz)
5172 lib_name = strtab + fixup->needed;
5173 else
5175 warn ("corrupt library name index of 0x%lx found in dynamic entry",
5176 (unsigned long) fixup->needed);
5177 lib_name = "???";
5179 printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
5180 (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
5181 printf
5182 (_("Seg Offset Type SymVec DataType\n"));
5184 for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
5186 unsigned int type;
5187 const char *rtype;
5189 printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
5190 printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
5191 type = BYTE_GET (imfs [i].type);
5192 rtype = elf_ia64_reloc_type (type);
5193 if (rtype == NULL)
5194 printf (" 0x%08x ", type);
5195 else
5196 printf (" %-32s ", rtype);
5197 printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
5198 printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
5201 free (imfs);
5204 /* Display IA-64 OpenVMS dynamic relocations (used to relocate an image). */
5206 static void
5207 dump_ia64_vms_dynamic_relocs (FILE *file, struct ia64_vms_dynimgrela *imgrela)
5209 Elf64_External_VMS_IMAGE_RELA *imrs;
5210 long i;
5212 imrs = get_data (NULL, file, dynamic_addr + imgrela->img_rela_off,
5213 1, imgrela->img_rela_cnt * sizeof (*imrs),
5214 _("dynamic section image relas"));
5215 if (!imrs)
5216 return;
5218 printf (_("\nImage relocs\n"));
5219 printf
5220 (_("Seg Offset Type Addend Seg Sym Off\n"));
5222 for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
5224 unsigned int type;
5225 const char *rtype;
5227 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
5228 printf ("%08" BFD_VMA_FMT "x ",
5229 (bfd_vma) BYTE_GET (imrs [i].rela_offset));
5230 type = BYTE_GET (imrs [i].type);
5231 rtype = elf_ia64_reloc_type (type);
5232 if (rtype == NULL)
5233 printf ("0x%08x ", type);
5234 else
5235 printf ("%-31s ", rtype);
5236 print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
5237 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
5238 printf ("%08" BFD_VMA_FMT "x\n",
5239 (bfd_vma) BYTE_GET (imrs [i].sym_offset));
5242 free (imrs);
5245 /* Display IA-64 OpenVMS dynamic relocations and fixups. */
5247 static int
5248 process_ia64_vms_dynamic_relocs (FILE *file)
5250 struct ia64_vms_dynfixup fixup;
5251 struct ia64_vms_dynimgrela imgrela;
5252 Elf_Internal_Dyn *entry;
5253 int res = 0;
5254 bfd_vma strtab_off = 0;
5255 bfd_vma strtab_sz = 0;
5256 char *strtab = NULL;
5258 memset (&fixup, 0, sizeof (fixup));
5259 memset (&imgrela, 0, sizeof (imgrela));
5261 /* Note: the order of the entries is specified by the OpenVMS specs. */
5262 for (entry = dynamic_section;
5263 entry < dynamic_section + dynamic_nent;
5264 entry++)
5266 switch (entry->d_tag)
5268 case DT_IA_64_VMS_STRTAB_OFFSET:
5269 strtab_off = entry->d_un.d_val;
5270 break;
5271 case DT_STRSZ:
5272 strtab_sz = entry->d_un.d_val;
5273 if (strtab == NULL)
5274 strtab = get_data (NULL, file, dynamic_addr + strtab_off,
5275 1, strtab_sz, _("dynamic string section"));
5276 break;
5278 case DT_IA_64_VMS_NEEDED_IDENT:
5279 fixup.needed_ident = entry->d_un.d_val;
5280 break;
5281 case DT_NEEDED:
5282 fixup.needed = entry->d_un.d_val;
5283 break;
5284 case DT_IA_64_VMS_FIXUP_NEEDED:
5285 fixup.fixup_needed = entry->d_un.d_val;
5286 break;
5287 case DT_IA_64_VMS_FIXUP_RELA_CNT:
5288 fixup.fixup_rela_cnt = entry->d_un.d_val;
5289 break;
5290 case DT_IA_64_VMS_FIXUP_RELA_OFF:
5291 fixup.fixup_rela_off = entry->d_un.d_val;
5292 res++;
5293 dump_ia64_vms_dynamic_fixups (file, &fixup, strtab, strtab_sz);
5294 break;
5296 case DT_IA_64_VMS_IMG_RELA_CNT:
5297 imgrela.img_rela_cnt = entry->d_un.d_val;
5298 break;
5299 case DT_IA_64_VMS_IMG_RELA_OFF:
5300 imgrela.img_rela_off = entry->d_un.d_val;
5301 res++;
5302 dump_ia64_vms_dynamic_relocs (file, &imgrela);
5303 break;
5305 default:
5306 break;
5310 if (strtab != NULL)
5311 free (strtab);
5313 return res;
5316 static struct
5318 const char * name;
5319 int reloc;
5320 int size;
5321 int rela;
5322 } dynamic_relocations [] =
5324 { "REL", DT_REL, DT_RELSZ, FALSE },
5325 { "RELA", DT_RELA, DT_RELASZ, TRUE },
5326 { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
5329 /* Process the reloc section. */
5331 static int
5332 process_relocs (FILE * file)
5334 unsigned long rel_size;
5335 unsigned long rel_offset;
5338 if (!do_reloc)
5339 return 1;
5341 if (do_using_dynamic)
5343 int is_rela;
5344 const char * name;
5345 int has_dynamic_reloc;
5346 unsigned int i;
5348 has_dynamic_reloc = 0;
5350 for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
5352 is_rela = dynamic_relocations [i].rela;
5353 name = dynamic_relocations [i].name;
5354 rel_size = dynamic_info [dynamic_relocations [i].size];
5355 rel_offset = dynamic_info [dynamic_relocations [i].reloc];
5357 has_dynamic_reloc |= rel_size;
5359 if (is_rela == UNKNOWN)
5361 if (dynamic_relocations [i].reloc == DT_JMPREL)
5362 switch (dynamic_info[DT_PLTREL])
5364 case DT_REL:
5365 is_rela = FALSE;
5366 break;
5367 case DT_RELA:
5368 is_rela = TRUE;
5369 break;
5373 if (rel_size)
5375 printf
5376 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
5377 name, rel_offset, rel_size);
5379 dump_relocations (file,
5380 offset_from_vma (file, rel_offset, rel_size),
5381 rel_size,
5382 dynamic_symbols, num_dynamic_syms,
5383 dynamic_strings, dynamic_strings_length, is_rela);
5387 if (is_ia64_vms ())
5388 has_dynamic_reloc |= process_ia64_vms_dynamic_relocs (file);
5390 if (! has_dynamic_reloc)
5391 printf (_("\nThere are no dynamic relocations in this file.\n"));
5393 else
5395 Elf_Internal_Shdr * section;
5396 unsigned long i;
5397 int found = 0;
5399 for (i = 0, section = section_headers;
5400 i < elf_header.e_shnum;
5401 i++, section++)
5403 if ( section->sh_type != SHT_RELA
5404 && section->sh_type != SHT_REL)
5405 continue;
5407 rel_offset = section->sh_offset;
5408 rel_size = section->sh_size;
5410 if (rel_size)
5412 Elf_Internal_Shdr * strsec;
5413 int is_rela;
5415 printf (_("\nRelocation section "));
5417 if (string_table == NULL)
5418 printf ("%d", section->sh_name);
5419 else
5420 printf (_("'%s'"), SECTION_NAME (section));
5422 printf (_(" at offset 0x%lx contains %lu entries:\n"),
5423 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
5425 is_rela = section->sh_type == SHT_RELA;
5427 if (section->sh_link != 0
5428 && section->sh_link < elf_header.e_shnum)
5430 Elf_Internal_Shdr * symsec;
5431 Elf_Internal_Sym * symtab;
5432 unsigned long nsyms;
5433 unsigned long strtablen = 0;
5434 char * strtab = NULL;
5436 symsec = section_headers + section->sh_link;
5437 if (symsec->sh_type != SHT_SYMTAB
5438 && symsec->sh_type != SHT_DYNSYM)
5439 continue;
5441 nsyms = symsec->sh_size / symsec->sh_entsize;
5442 symtab = GET_ELF_SYMBOLS (file, symsec);
5444 if (symtab == NULL)
5445 continue;
5447 if (symsec->sh_link != 0
5448 && symsec->sh_link < elf_header.e_shnum)
5450 strsec = section_headers + symsec->sh_link;
5452 strtab = (char *) get_data (NULL, file, strsec->sh_offset,
5453 1, strsec->sh_size,
5454 _("string table"));
5455 strtablen = strtab == NULL ? 0 : strsec->sh_size;
5458 dump_relocations (file, rel_offset, rel_size,
5459 symtab, nsyms, strtab, strtablen, is_rela);
5460 if (strtab)
5461 free (strtab);
5462 free (symtab);
5464 else
5465 dump_relocations (file, rel_offset, rel_size,
5466 NULL, 0, NULL, 0, is_rela);
5468 found = 1;
5472 if (! found)
5473 printf (_("\nThere are no relocations in this file.\n"));
5476 return 1;
5479 /* Process the unwind section. */
5481 #include "unwind-ia64.h"
5483 /* An absolute address consists of a section and an offset. If the
5484 section is NULL, the offset itself is the address, otherwise, the
5485 address equals to LOAD_ADDRESS(section) + offset. */
5487 struct absaddr
5489 unsigned short section;
5490 bfd_vma offset;
5493 #define ABSADDR(a) \
5494 ((a).section \
5495 ? section_headers [(a).section].sh_addr + (a).offset \
5496 : (a).offset)
5498 struct ia64_unw_table_entry
5500 struct absaddr start;
5501 struct absaddr end;
5502 struct absaddr info;
5505 struct ia64_unw_aux_info
5508 struct ia64_unw_table_entry *table; /* Unwind table. */
5509 unsigned long table_len; /* Length of unwind table. */
5510 unsigned char * info; /* Unwind info. */
5511 unsigned long info_size; /* Size of unwind info. */
5512 bfd_vma info_addr; /* starting address of unwind info. */
5513 bfd_vma seg_base; /* Starting address of segment. */
5514 Elf_Internal_Sym * symtab; /* The symbol table. */
5515 unsigned long nsyms; /* Number of symbols. */
5516 char * strtab; /* The string table. */
5517 unsigned long strtab_size; /* Size of string table. */
5520 static void
5521 find_symbol_for_address (Elf_Internal_Sym * symtab,
5522 unsigned long nsyms,
5523 const char * strtab,
5524 unsigned long strtab_size,
5525 struct absaddr addr,
5526 const char ** symname,
5527 bfd_vma * offset)
5529 bfd_vma dist = 0x100000;
5530 Elf_Internal_Sym * sym;
5531 Elf_Internal_Sym * best = NULL;
5532 unsigned long i;
5534 REMOVE_ARCH_BITS (addr.offset);
5536 for (i = 0, sym = symtab; i < nsyms; ++i, ++sym)
5538 bfd_vma value = sym->st_value;
5540 REMOVE_ARCH_BITS (value);
5542 if (ELF_ST_TYPE (sym->st_info) == STT_FUNC
5543 && sym->st_name != 0
5544 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
5545 && addr.offset >= value
5546 && addr.offset - value < dist)
5548 best = sym;
5549 dist = addr.offset - value;
5550 if (!dist)
5551 break;
5554 if (best)
5556 *symname = (best->st_name >= strtab_size
5557 ? _("<corrupt>") : strtab + best->st_name);
5558 *offset = dist;
5559 return;
5561 *symname = NULL;
5562 *offset = addr.offset;
5565 static void
5566 dump_ia64_unwind (struct ia64_unw_aux_info * aux)
5568 struct ia64_unw_table_entry * tp;
5569 int in_body;
5571 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
5573 bfd_vma stamp;
5574 bfd_vma offset;
5575 const unsigned char * dp;
5576 const unsigned char * head;
5577 const char * procname;
5579 find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
5580 aux->strtab_size, tp->start, &procname, &offset);
5582 fputs ("\n<", stdout);
5584 if (procname)
5586 fputs (procname, stdout);
5588 if (offset)
5589 printf ("+%lx", (unsigned long) offset);
5592 fputs (">: [", stdout);
5593 print_vma (tp->start.offset, PREFIX_HEX);
5594 fputc ('-', stdout);
5595 print_vma (tp->end.offset, PREFIX_HEX);
5596 printf ("], info at +0x%lx\n",
5597 (unsigned long) (tp->info.offset - aux->seg_base));
5599 head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
5600 stamp = byte_get ((unsigned char *) head, sizeof (stamp));
5602 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
5603 (unsigned) UNW_VER (stamp),
5604 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
5605 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
5606 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
5607 (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
5609 if (UNW_VER (stamp) != 1)
5611 printf (_("\tUnknown version.\n"));
5612 continue;
5615 in_body = 0;
5616 for (dp = head + 8; dp < head + 8 + eh_addr_size * UNW_LENGTH (stamp);)
5617 dp = unw_decode (dp, in_body, & in_body);
5621 static int
5622 slurp_ia64_unwind_table (FILE * file,
5623 struct ia64_unw_aux_info * aux,
5624 Elf_Internal_Shdr * sec)
5626 unsigned long size, nrelas, i;
5627 Elf_Internal_Phdr * seg;
5628 struct ia64_unw_table_entry * tep;
5629 Elf_Internal_Shdr * relsec;
5630 Elf_Internal_Rela * rela;
5631 Elf_Internal_Rela * rp;
5632 unsigned char * table;
5633 unsigned char * tp;
5634 Elf_Internal_Sym * sym;
5635 const char * relname;
5637 /* First, find the starting address of the segment that includes
5638 this section: */
5640 if (elf_header.e_phnum)
5642 if (! get_program_headers (file))
5643 return 0;
5645 for (seg = program_headers;
5646 seg < program_headers + elf_header.e_phnum;
5647 ++seg)
5649 if (seg->p_type != PT_LOAD)
5650 continue;
5652 if (sec->sh_addr >= seg->p_vaddr
5653 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
5655 aux->seg_base = seg->p_vaddr;
5656 break;
5661 /* Second, build the unwind table from the contents of the unwind section: */
5662 size = sec->sh_size;
5663 table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
5664 _("unwind table"));
5665 if (!table)
5666 return 0;
5668 aux->table = (struct ia64_unw_table_entry *)
5669 xcmalloc (size / (3 * eh_addr_size), sizeof (aux->table[0]));
5670 tep = aux->table;
5671 for (tp = table; tp < table + size; ++tep)
5673 tep->start.section = SHN_UNDEF;
5674 tep->end.section = SHN_UNDEF;
5675 tep->info.section = SHN_UNDEF;
5676 tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
5677 tep->end.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
5678 tep->info.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
5679 tep->start.offset += aux->seg_base;
5680 tep->end.offset += aux->seg_base;
5681 tep->info.offset += aux->seg_base;
5683 free (table);
5685 /* Third, apply any relocations to the unwind table: */
5686 for (relsec = section_headers;
5687 relsec < section_headers + elf_header.e_shnum;
5688 ++relsec)
5690 if (relsec->sh_type != SHT_RELA
5691 || relsec->sh_info >= elf_header.e_shnum
5692 || section_headers + relsec->sh_info != sec)
5693 continue;
5695 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
5696 & rela, & nrelas))
5697 return 0;
5699 for (rp = rela; rp < rela + nrelas; ++rp)
5701 relname = elf_ia64_reloc_type (get_reloc_type (rp->r_info));
5702 sym = aux->symtab + get_reloc_symindex (rp->r_info);
5704 if (! const_strneq (relname, "R_IA64_SEGREL"))
5706 warn (_("Skipping unexpected relocation type %s\n"), relname);
5707 continue;
5710 i = rp->r_offset / (3 * eh_addr_size);
5712 switch (rp->r_offset/eh_addr_size % 3)
5714 case 0:
5715 aux->table[i].start.section = sym->st_shndx;
5716 aux->table[i].start.offset = rp->r_addend + sym->st_value;
5717 break;
5718 case 1:
5719 aux->table[i].end.section = sym->st_shndx;
5720 aux->table[i].end.offset = rp->r_addend + sym->st_value;
5721 break;
5722 case 2:
5723 aux->table[i].info.section = sym->st_shndx;
5724 aux->table[i].info.offset = rp->r_addend + sym->st_value;
5725 break;
5726 default:
5727 break;
5731 free (rela);
5734 aux->table_len = size / (3 * eh_addr_size);
5735 return 1;
5738 static int
5739 ia64_process_unwind (FILE * file)
5741 Elf_Internal_Shdr * sec;
5742 Elf_Internal_Shdr * unwsec = NULL;
5743 Elf_Internal_Shdr * strsec;
5744 unsigned long i, unwcount = 0, unwstart = 0;
5745 struct ia64_unw_aux_info aux;
5747 memset (& aux, 0, sizeof (aux));
5749 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
5751 if (sec->sh_type == SHT_SYMTAB
5752 && sec->sh_link < elf_header.e_shnum)
5754 aux.nsyms = sec->sh_size / sec->sh_entsize;
5755 aux.symtab = GET_ELF_SYMBOLS (file, sec);
5757 strsec = section_headers + sec->sh_link;
5758 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
5759 1, strsec->sh_size,
5760 _("string table"));
5761 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
5763 else if (sec->sh_type == SHT_IA_64_UNWIND)
5764 unwcount++;
5767 if (!unwcount)
5768 printf (_("\nThere are no unwind sections in this file.\n"));
5770 while (unwcount-- > 0)
5772 char * suffix;
5773 size_t len, len2;
5775 for (i = unwstart, sec = section_headers + unwstart;
5776 i < elf_header.e_shnum; ++i, ++sec)
5777 if (sec->sh_type == SHT_IA_64_UNWIND)
5779 unwsec = sec;
5780 break;
5783 unwstart = i + 1;
5784 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
5786 if ((unwsec->sh_flags & SHF_GROUP) != 0)
5788 /* We need to find which section group it is in. */
5789 struct group_list * g = section_headers_groups [i]->root;
5791 for (; g != NULL; g = g->next)
5793 sec = section_headers + g->section_index;
5795 if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
5796 break;
5799 if (g == NULL)
5800 i = elf_header.e_shnum;
5802 else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
5804 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
5805 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
5806 suffix = SECTION_NAME (unwsec) + len;
5807 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
5808 ++i, ++sec)
5809 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
5810 && streq (SECTION_NAME (sec) + len2, suffix))
5811 break;
5813 else
5815 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
5816 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
5817 len = sizeof (ELF_STRING_ia64_unwind) - 1;
5818 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
5819 suffix = "";
5820 if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
5821 suffix = SECTION_NAME (unwsec) + len;
5822 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
5823 ++i, ++sec)
5824 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
5825 && streq (SECTION_NAME (sec) + len2, suffix))
5826 break;
5829 if (i == elf_header.e_shnum)
5831 printf (_("\nCould not find unwind info section for "));
5833 if (string_table == NULL)
5834 printf ("%d", unwsec->sh_name);
5835 else
5836 printf (_("'%s'"), SECTION_NAME (unwsec));
5838 else
5840 aux.info_size = sec->sh_size;
5841 aux.info_addr = sec->sh_addr;
5842 aux.info = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1,
5843 aux.info_size,
5844 _("unwind info"));
5846 printf (_("\nUnwind section "));
5848 if (string_table == NULL)
5849 printf ("%d", unwsec->sh_name);
5850 else
5851 printf (_("'%s'"), SECTION_NAME (unwsec));
5853 printf (_(" at offset 0x%lx contains %lu entries:\n"),
5854 (unsigned long) unwsec->sh_offset,
5855 (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
5857 (void) slurp_ia64_unwind_table (file, & aux, unwsec);
5859 if (aux.table_len > 0)
5860 dump_ia64_unwind (& aux);
5862 if (aux.table)
5863 free ((char *) aux.table);
5864 if (aux.info)
5865 free ((char *) aux.info);
5866 aux.table = NULL;
5867 aux.info = NULL;
5871 if (aux.symtab)
5872 free (aux.symtab);
5873 if (aux.strtab)
5874 free ((char *) aux.strtab);
5876 return 1;
5879 struct hppa_unw_table_entry
5881 struct absaddr start;
5882 struct absaddr end;
5883 unsigned int Cannot_unwind:1; /* 0 */
5884 unsigned int Millicode:1; /* 1 */
5885 unsigned int Millicode_save_sr0:1; /* 2 */
5886 unsigned int Region_description:2; /* 3..4 */
5887 unsigned int reserved1:1; /* 5 */
5888 unsigned int Entry_SR:1; /* 6 */
5889 unsigned int Entry_FR:4; /* number saved */ /* 7..10 */
5890 unsigned int Entry_GR:5; /* number saved */ /* 11..15 */
5891 unsigned int Args_stored:1; /* 16 */
5892 unsigned int Variable_Frame:1; /* 17 */
5893 unsigned int Separate_Package_Body:1; /* 18 */
5894 unsigned int Frame_Extension_Millicode:1; /* 19 */
5895 unsigned int Stack_Overflow_Check:1; /* 20 */
5896 unsigned int Two_Instruction_SP_Increment:1; /* 21 */
5897 unsigned int Ada_Region:1; /* 22 */
5898 unsigned int cxx_info:1; /* 23 */
5899 unsigned int cxx_try_catch:1; /* 24 */
5900 unsigned int sched_entry_seq:1; /* 25 */
5901 unsigned int reserved2:1; /* 26 */
5902 unsigned int Save_SP:1; /* 27 */
5903 unsigned int Save_RP:1; /* 28 */
5904 unsigned int Save_MRP_in_frame:1; /* 29 */
5905 unsigned int extn_ptr_defined:1; /* 30 */
5906 unsigned int Cleanup_defined:1; /* 31 */
5908 unsigned int MPE_XL_interrupt_marker:1; /* 0 */
5909 unsigned int HP_UX_interrupt_marker:1; /* 1 */
5910 unsigned int Large_frame:1; /* 2 */
5911 unsigned int Pseudo_SP_Set:1; /* 3 */
5912 unsigned int reserved4:1; /* 4 */
5913 unsigned int Total_frame_size:27; /* 5..31 */
5916 struct hppa_unw_aux_info
5918 struct hppa_unw_table_entry *table; /* Unwind table. */
5919 unsigned long table_len; /* Length of unwind table. */
5920 bfd_vma seg_base; /* Starting address of segment. */
5921 Elf_Internal_Sym * symtab; /* The symbol table. */
5922 unsigned long nsyms; /* Number of symbols. */
5923 char * strtab; /* The string table. */
5924 unsigned long strtab_size; /* Size of string table. */
5927 static void
5928 dump_hppa_unwind (struct hppa_unw_aux_info * aux)
5930 struct hppa_unw_table_entry * tp;
5932 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
5934 bfd_vma offset;
5935 const char * procname;
5937 find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
5938 aux->strtab_size, tp->start, &procname,
5939 &offset);
5941 fputs ("\n<", stdout);
5943 if (procname)
5945 fputs (procname, stdout);
5947 if (offset)
5948 printf ("+%lx", (unsigned long) offset);
5951 fputs (">: [", stdout);
5952 print_vma (tp->start.offset, PREFIX_HEX);
5953 fputc ('-', stdout);
5954 print_vma (tp->end.offset, PREFIX_HEX);
5955 printf ("]\n\t");
5957 #define PF(_m) if (tp->_m) printf (#_m " ");
5958 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
5959 PF(Cannot_unwind);
5960 PF(Millicode);
5961 PF(Millicode_save_sr0);
5962 /* PV(Region_description); */
5963 PF(Entry_SR);
5964 PV(Entry_FR);
5965 PV(Entry_GR);
5966 PF(Args_stored);
5967 PF(Variable_Frame);
5968 PF(Separate_Package_Body);
5969 PF(Frame_Extension_Millicode);
5970 PF(Stack_Overflow_Check);
5971 PF(Two_Instruction_SP_Increment);
5972 PF(Ada_Region);
5973 PF(cxx_info);
5974 PF(cxx_try_catch);
5975 PF(sched_entry_seq);
5976 PF(Save_SP);
5977 PF(Save_RP);
5978 PF(Save_MRP_in_frame);
5979 PF(extn_ptr_defined);
5980 PF(Cleanup_defined);
5981 PF(MPE_XL_interrupt_marker);
5982 PF(HP_UX_interrupt_marker);
5983 PF(Large_frame);
5984 PF(Pseudo_SP_Set);
5985 PV(Total_frame_size);
5986 #undef PF
5987 #undef PV
5990 printf ("\n");
5993 static int
5994 slurp_hppa_unwind_table (FILE * file,
5995 struct hppa_unw_aux_info * aux,
5996 Elf_Internal_Shdr * sec)
5998 unsigned long size, unw_ent_size, nentries, nrelas, i;
5999 Elf_Internal_Phdr * seg;
6000 struct hppa_unw_table_entry * tep;
6001 Elf_Internal_Shdr * relsec;
6002 Elf_Internal_Rela * rela;
6003 Elf_Internal_Rela * rp;
6004 unsigned char * table;
6005 unsigned char * tp;
6006 Elf_Internal_Sym * sym;
6007 const char * relname;
6009 /* First, find the starting address of the segment that includes
6010 this section. */
6012 if (elf_header.e_phnum)
6014 if (! get_program_headers (file))
6015 return 0;
6017 for (seg = program_headers;
6018 seg < program_headers + elf_header.e_phnum;
6019 ++seg)
6021 if (seg->p_type != PT_LOAD)
6022 continue;
6024 if (sec->sh_addr >= seg->p_vaddr
6025 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
6027 aux->seg_base = seg->p_vaddr;
6028 break;
6033 /* Second, build the unwind table from the contents of the unwind
6034 section. */
6035 size = sec->sh_size;
6036 table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
6037 _("unwind table"));
6038 if (!table)
6039 return 0;
6041 unw_ent_size = 16;
6042 nentries = size / unw_ent_size;
6043 size = unw_ent_size * nentries;
6045 tep = aux->table = (struct hppa_unw_table_entry *)
6046 xcmalloc (nentries, sizeof (aux->table[0]));
6048 for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
6050 unsigned int tmp1, tmp2;
6052 tep->start.section = SHN_UNDEF;
6053 tep->end.section = SHN_UNDEF;
6055 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
6056 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
6057 tmp1 = byte_get ((unsigned char *) tp + 8, 4);
6058 tmp2 = byte_get ((unsigned char *) tp + 12, 4);
6060 tep->start.offset += aux->seg_base;
6061 tep->end.offset += aux->seg_base;
6063 tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
6064 tep->Millicode = (tmp1 >> 30) & 0x1;
6065 tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
6066 tep->Region_description = (tmp1 >> 27) & 0x3;
6067 tep->reserved1 = (tmp1 >> 26) & 0x1;
6068 tep->Entry_SR = (tmp1 >> 25) & 0x1;
6069 tep->Entry_FR = (tmp1 >> 21) & 0xf;
6070 tep->Entry_GR = (tmp1 >> 16) & 0x1f;
6071 tep->Args_stored = (tmp1 >> 15) & 0x1;
6072 tep->Variable_Frame = (tmp1 >> 14) & 0x1;
6073 tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
6074 tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
6075 tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
6076 tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
6077 tep->Ada_Region = (tmp1 >> 9) & 0x1;
6078 tep->cxx_info = (tmp1 >> 8) & 0x1;
6079 tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
6080 tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
6081 tep->reserved2 = (tmp1 >> 5) & 0x1;
6082 tep->Save_SP = (tmp1 >> 4) & 0x1;
6083 tep->Save_RP = (tmp1 >> 3) & 0x1;
6084 tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
6085 tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
6086 tep->Cleanup_defined = tmp1 & 0x1;
6088 tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
6089 tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
6090 tep->Large_frame = (tmp2 >> 29) & 0x1;
6091 tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
6092 tep->reserved4 = (tmp2 >> 27) & 0x1;
6093 tep->Total_frame_size = tmp2 & 0x7ffffff;
6095 free (table);
6097 /* Third, apply any relocations to the unwind table. */
6098 for (relsec = section_headers;
6099 relsec < section_headers + elf_header.e_shnum;
6100 ++relsec)
6102 if (relsec->sh_type != SHT_RELA
6103 || relsec->sh_info >= elf_header.e_shnum
6104 || section_headers + relsec->sh_info != sec)
6105 continue;
6107 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
6108 & rela, & nrelas))
6109 return 0;
6111 for (rp = rela; rp < rela + nrelas; ++rp)
6113 relname = elf_hppa_reloc_type (get_reloc_type (rp->r_info));
6114 sym = aux->symtab + get_reloc_symindex (rp->r_info);
6116 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
6117 if (! const_strneq (relname, "R_PARISC_SEGREL"))
6119 warn (_("Skipping unexpected relocation type %s\n"), relname);
6120 continue;
6123 i = rp->r_offset / unw_ent_size;
6125 switch ((rp->r_offset % unw_ent_size) / eh_addr_size)
6127 case 0:
6128 aux->table[i].start.section = sym->st_shndx;
6129 aux->table[i].start.offset = sym->st_value + rp->r_addend;
6130 break;
6131 case 1:
6132 aux->table[i].end.section = sym->st_shndx;
6133 aux->table[i].end.offset = sym->st_value + rp->r_addend;
6134 break;
6135 default:
6136 break;
6140 free (rela);
6143 aux->table_len = nentries;
6145 return 1;
6148 static int
6149 hppa_process_unwind (FILE * file)
6151 struct hppa_unw_aux_info aux;
6152 Elf_Internal_Shdr * unwsec = NULL;
6153 Elf_Internal_Shdr * strsec;
6154 Elf_Internal_Shdr * sec;
6155 unsigned long i;
6157 memset (& aux, 0, sizeof (aux));
6159 if (string_table == NULL)
6160 return 1;
6162 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
6164 if (sec->sh_type == SHT_SYMTAB
6165 && sec->sh_link < elf_header.e_shnum)
6167 aux.nsyms = sec->sh_size / sec->sh_entsize;
6168 aux.symtab = GET_ELF_SYMBOLS (file, sec);
6170 strsec = section_headers + sec->sh_link;
6171 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
6172 1, strsec->sh_size,
6173 _("string table"));
6174 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
6176 else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
6177 unwsec = sec;
6180 if (!unwsec)
6181 printf (_("\nThere are no unwind sections in this file.\n"));
6183 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
6185 if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
6187 printf (_("\nUnwind section "));
6188 printf (_("'%s'"), SECTION_NAME (sec));
6190 printf (_(" at offset 0x%lx contains %lu entries:\n"),
6191 (unsigned long) sec->sh_offset,
6192 (unsigned long) (sec->sh_size / (2 * eh_addr_size + 8)));
6194 slurp_hppa_unwind_table (file, &aux, sec);
6195 if (aux.table_len > 0)
6196 dump_hppa_unwind (&aux);
6198 if (aux.table)
6199 free ((char *) aux.table);
6200 aux.table = NULL;
6204 if (aux.symtab)
6205 free (aux.symtab);
6206 if (aux.strtab)
6207 free ((char *) aux.strtab);
6209 return 1;
6212 struct arm_section
6214 unsigned char *data;
6216 Elf_Internal_Shdr *sec;
6217 Elf_Internal_Rela *rela;
6218 unsigned long nrelas;
6219 unsigned int rel_type;
6221 Elf_Internal_Rela *next_rela;
6224 struct arm_unw_aux_info
6226 FILE *file;
6228 Elf_Internal_Sym *symtab; /* The symbol table. */
6229 unsigned long nsyms; /* Number of symbols. */
6230 char *strtab; /* The string table. */
6231 unsigned long strtab_size; /* Size of string table. */
6234 static const char *
6235 arm_print_vma_and_name (struct arm_unw_aux_info *aux,
6236 bfd_vma fn, struct absaddr addr)
6238 const char *procname;
6239 bfd_vma sym_offset;
6241 if (addr.section == SHN_UNDEF)
6242 addr.offset = fn;
6244 find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
6245 aux->strtab_size, addr, &procname,
6246 &sym_offset);
6248 print_vma (fn, PREFIX_HEX);
6250 if (procname)
6252 fputs (" <", stdout);
6253 fputs (procname, stdout);
6255 if (sym_offset)
6256 printf ("+0x%lx", (unsigned long) sym_offset);
6257 fputc ('>', stdout);
6260 return procname;
6263 static void
6264 arm_free_section (struct arm_section *arm_sec)
6266 if (arm_sec->data != NULL)
6267 free (arm_sec->data);
6269 if (arm_sec->rela != NULL)
6270 free (arm_sec->rela);
6273 static int
6274 arm_section_get_word (struct arm_unw_aux_info *aux,
6275 struct arm_section *arm_sec,
6276 Elf_Internal_Shdr *sec, bfd_vma word_offset,
6277 unsigned int *wordp, struct absaddr *addr)
6279 Elf_Internal_Rela *rp;
6280 Elf_Internal_Sym *sym;
6281 const char * relname;
6282 unsigned int word;
6283 bfd_boolean wrapped;
6285 addr->section = SHN_UNDEF;
6286 addr->offset = 0;
6288 if (sec != arm_sec->sec)
6290 Elf_Internal_Shdr *relsec;
6292 arm_free_section (arm_sec);
6294 arm_sec->sec = sec;
6295 arm_sec->data = get_data (NULL, aux->file, sec->sh_offset, 1,
6296 sec->sh_size, _("unwind data"));
6298 arm_sec->rela = NULL;
6299 arm_sec->nrelas = 0;
6301 for (relsec = section_headers;
6302 relsec < section_headers + elf_header.e_shnum;
6303 ++relsec)
6305 if (relsec->sh_info >= elf_header.e_shnum
6306 || section_headers + relsec->sh_info != sec)
6307 continue;
6309 if (relsec->sh_type == SHT_REL)
6311 if (!slurp_rel_relocs (aux->file, relsec->sh_offset,
6312 relsec->sh_size,
6313 & arm_sec->rela, & arm_sec->nrelas))
6314 return 0;
6315 break;
6317 else if (relsec->sh_type == SHT_RELA)
6319 if (!slurp_rela_relocs (aux->file, relsec->sh_offset,
6320 relsec->sh_size,
6321 & arm_sec->rela, & arm_sec->nrelas))
6322 return 0;
6323 break;
6327 arm_sec->next_rela = arm_sec->rela;
6330 if (arm_sec->data == NULL)
6331 return 0;
6333 word = byte_get (arm_sec->data + word_offset, 4);
6335 wrapped = FALSE;
6336 for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
6338 bfd_vma prelval, offset;
6340 if (rp->r_offset > word_offset && !wrapped)
6342 rp = arm_sec->rela;
6343 wrapped = TRUE;
6345 if (rp->r_offset > word_offset)
6346 break;
6348 if (rp->r_offset & 3)
6350 warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
6351 (unsigned long) rp->r_offset);
6352 continue;
6355 if (rp->r_offset < word_offset)
6356 continue;
6358 relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
6360 if (streq (relname, "R_ARM_NONE"))
6361 continue;
6363 if (! streq (relname, "R_ARM_PREL31"))
6365 warn (_("Skipping unexpected relocation type %s\n"), relname);
6366 continue;
6369 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
6371 if (arm_sec->rel_type == SHT_REL)
6373 offset = word & 0x7fffffff;
6374 if (offset & 0x40000000)
6375 offset |= ~ (bfd_vma) 0x7fffffff;
6377 else
6378 offset = rp->r_addend;
6380 offset += sym->st_value;
6381 prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
6383 word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
6384 addr->section = sym->st_shndx;
6385 addr->offset = offset;
6386 break;
6389 *wordp = word;
6390 arm_sec->next_rela = rp;
6392 return 1;
6395 static void
6396 decode_arm_unwind (struct arm_unw_aux_info *aux,
6397 unsigned int word, unsigned int remaining,
6398 bfd_vma data_offset, Elf_Internal_Shdr *data_sec,
6399 struct arm_section *data_arm_sec)
6401 int per_index;
6402 unsigned int more_words;
6403 struct absaddr addr;
6405 #define ADVANCE \
6406 if (remaining == 0 && more_words) \
6408 data_offset += 4; \
6409 if (!arm_section_get_word (aux, data_arm_sec, data_sec, \
6410 data_offset, &word, &addr)) \
6411 return; \
6412 remaining = 4; \
6413 more_words--; \
6416 #define GET_OP(OP) \
6417 ADVANCE; \
6418 if (remaining) \
6420 remaining--; \
6421 (OP) = word >> 24; \
6422 word <<= 8; \
6424 else \
6426 printf (_("[Truncated opcode]\n")); \
6427 return; \
6429 printf (_("0x%02x "), OP)
6431 if (remaining == 0)
6433 /* Fetch the first word. */
6434 if (!arm_section_get_word (aux, data_arm_sec, data_sec, data_offset,
6435 &word, &addr))
6436 return;
6437 remaining = 4;
6440 if ((word & 0x80000000) == 0)
6442 /* Expand prel31 for personality routine. */
6443 bfd_vma fn;
6444 const char *procname;
6446 fn = word;
6447 if (fn & 0x40000000)
6448 fn |= ~ (bfd_vma) 0x7fffffff;
6449 fn = fn + data_sec->sh_addr + data_offset;
6451 printf (_(" Personality routine: "));
6452 procname = arm_print_vma_and_name (aux, fn, addr);
6453 fputc ('\n', stdout);
6455 /* The GCC personality routines use the standard compact
6456 encoding, starting with one byte giving the number of
6457 words. */
6458 if (procname != NULL
6459 && (const_strneq (procname, "__gcc_personality_v0")
6460 || const_strneq (procname, "__gxx_personality_v0")
6461 || const_strneq (procname, "__gcj_personality_v0")
6462 || const_strneq (procname, "__gnu_objc_personality_v0")))
6464 remaining = 0;
6465 more_words = 1;
6466 ADVANCE;
6467 if (!remaining)
6469 printf (_(" [Truncated data]\n"));
6470 return;
6472 more_words = word >> 24;
6473 word <<= 8;
6474 remaining--;
6476 else
6477 return;
6479 else
6481 per_index = (word >> 24) & 0x7f;
6482 if (per_index != 0 && per_index != 1 && per_index != 2)
6484 printf (_(" [reserved compact index %d]\n"), per_index);
6485 return;
6488 printf (_(" Compact model %d\n"), per_index);
6489 if (per_index == 0)
6491 more_words = 0;
6492 word <<= 8;
6493 remaining--;
6495 else
6497 more_words = (word >> 16) & 0xff;
6498 word <<= 16;
6499 remaining -= 2;
6503 /* Decode the unwinding instructions. */
6504 while (1)
6506 unsigned int op, op2;
6508 ADVANCE;
6509 if (remaining == 0)
6510 break;
6511 remaining--;
6512 op = word >> 24;
6513 word <<= 8;
6515 printf (_(" 0x%02x "), op);
6517 if ((op & 0xc0) == 0x00)
6519 int offset = ((op & 0x3f) << 2) + 4;
6520 printf (_(" vsp = vsp + %d"), offset);
6522 else if ((op & 0xc0) == 0x40)
6524 int offset = ((op & 0x3f) << 2) + 4;
6525 printf (_(" vsp = vsp - %d"), offset);
6527 else if ((op & 0xf0) == 0x80)
6529 GET_OP (op2);
6530 if (op == 0x80 && op2 == 0)
6531 printf (_("Refuse to unwind"));
6532 else
6534 unsigned int mask = ((op & 0x0f) << 8) | op2;
6535 int first = 1;
6536 int i;
6538 printf ("pop {");
6539 for (i = 0; i < 12; i++)
6540 if (mask & (1 << i))
6542 if (first)
6543 first = 0;
6544 else
6545 printf (", ");
6546 printf ("r%d", 4 + i);
6548 printf ("}");
6551 else if ((op & 0xf0) == 0x90)
6553 if (op == 0x9d || op == 0x9f)
6554 printf (_(" [Reserved]"));
6555 else
6556 printf (_(" vsp = r%d"), op & 0x0f);
6558 else if ((op & 0xf0) == 0xa0)
6560 int end = 4 + (op & 0x07);
6561 int first = 1;
6562 int i;
6563 printf (" pop {");
6564 for (i = 4; i <= end; i++)
6566 if (first)
6567 first = 0;
6568 else
6569 printf (", ");
6570 printf ("r%d", i);
6572 if (op & 0x08)
6574 if (first)
6575 printf (", ");
6576 printf ("r14");
6578 printf ("}");
6580 else if (op == 0xb0)
6581 printf (_(" finish"));
6582 else if (op == 0xb1)
6584 GET_OP (op2);
6585 if (op2 == 0 || (op2 & 0xf0) != 0)
6586 printf (_("[Spare]"));
6587 else
6589 unsigned int mask = op2 & 0x0f;
6590 int first = 1;
6591 int i;
6592 printf ("pop {");
6593 for (i = 0; i < 12; i++)
6594 if (mask & (1 << i))
6596 if (first)
6597 first = 0;
6598 else
6599 printf (", ");
6600 printf ("r%d", i);
6602 printf ("}");
6605 else if (op == 0xb2)
6607 unsigned char buf[9];
6608 unsigned int i, len;
6609 unsigned long offset;
6610 for (i = 0; i < sizeof (buf); i++)
6612 GET_OP (buf[i]);
6613 if ((buf[i] & 0x80) == 0)
6614 break;
6616 assert (i < sizeof (buf));
6617 offset = read_uleb128 (buf, &len);
6618 assert (len == i + 1);
6619 offset = offset * 4 + 0x204;
6620 printf (_("vsp = vsp + %ld"), offset);
6622 else
6624 if (op == 0xb3 || op == 0xc6 || op == 0xc7 || op == 0xc8 || op == 0xc9)
6626 GET_OP (op2);
6627 printf (_("[unsupported two-byte opcode]"));
6629 else
6631 printf (_(" [unsupported opcode]"));
6634 printf ("\n");
6637 /* Decode the descriptors. Not implemented. */
6640 static void
6641 dump_arm_unwind (struct arm_unw_aux_info *aux, Elf_Internal_Shdr *exidx_sec)
6643 struct arm_section exidx_arm_sec, extab_arm_sec;
6644 unsigned int i, exidx_len;
6646 memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
6647 memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
6648 exidx_len = exidx_sec->sh_size / 8;
6650 for (i = 0; i < exidx_len; i++)
6652 unsigned int exidx_fn, exidx_entry;
6653 struct absaddr fn_addr, entry_addr;
6654 bfd_vma fn;
6656 fputc ('\n', stdout);
6658 if (!arm_section_get_word (aux, &exidx_arm_sec, exidx_sec,
6659 8 * i, &exidx_fn, &fn_addr)
6660 || !arm_section_get_word (aux, &exidx_arm_sec, exidx_sec,
6661 8 * i + 4, &exidx_entry, &entry_addr))
6663 arm_free_section (&exidx_arm_sec);
6664 arm_free_section (&extab_arm_sec);
6665 return;
6668 fn = exidx_fn & 0x7fffffff;
6669 if (fn & 0x40000000)
6670 fn |= ~ (bfd_vma) 0x7fffffff;
6671 fn = fn + exidx_sec->sh_addr + 8 * i;
6673 arm_print_vma_and_name (aux, fn, entry_addr);
6674 fputs (": ", stdout);
6676 if (exidx_entry == 1)
6678 print_vma (exidx_entry, PREFIX_HEX);
6679 fputs (" [cantunwind]\n", stdout);
6681 else if (exidx_entry & 0x80000000)
6683 print_vma (exidx_entry, PREFIX_HEX);
6684 fputc ('\n', stdout);
6685 decode_arm_unwind (aux, exidx_entry, 4, 0, NULL, NULL);
6687 else
6689 bfd_vma table, table_offset = 0;
6690 Elf_Internal_Shdr *table_sec;
6692 fputs ("@", stdout);
6693 table = exidx_entry;
6694 if (table & 0x40000000)
6695 table |= ~ (bfd_vma) 0x7fffffff;
6696 table = table + exidx_sec->sh_addr + 8 * i + 4;
6697 print_vma (table, PREFIX_HEX);
6698 printf ("\n");
6700 /* Locate the matching .ARM.extab. */
6701 if (entry_addr.section != SHN_UNDEF
6702 && entry_addr.section < elf_header.e_shnum)
6704 table_sec = section_headers + entry_addr.section;
6705 table_offset = entry_addr.offset;
6707 else
6709 table_sec = find_section_by_address (table);
6710 if (table_sec != NULL)
6711 table_offset = table - table_sec->sh_addr;
6713 if (table_sec == NULL)
6715 warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
6716 (unsigned long) table);
6717 continue;
6719 decode_arm_unwind (aux, 0, 0, table_offset, table_sec,
6720 &extab_arm_sec);
6724 printf ("\n");
6726 arm_free_section (&exidx_arm_sec);
6727 arm_free_section (&extab_arm_sec);
6730 static int
6731 arm_process_unwind (FILE *file)
6733 struct arm_unw_aux_info aux;
6734 Elf_Internal_Shdr *unwsec = NULL;
6735 Elf_Internal_Shdr *strsec;
6736 Elf_Internal_Shdr *sec;
6737 unsigned long i;
6739 memset (& aux, 0, sizeof (aux));
6740 aux.file = file;
6742 if (string_table == NULL)
6743 return 1;
6745 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
6747 if (sec->sh_type == SHT_SYMTAB && sec->sh_link < elf_header.e_shnum)
6749 aux.nsyms = sec->sh_size / sec->sh_entsize;
6750 aux.symtab = GET_ELF_SYMBOLS (file, sec);
6752 strsec = section_headers + sec->sh_link;
6753 aux.strtab = get_data (NULL, file, strsec->sh_offset,
6754 1, strsec->sh_size, _("string table"));
6755 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
6757 else if (sec->sh_type == SHT_ARM_EXIDX)
6758 unwsec = sec;
6761 if (!unwsec)
6762 printf (_("\nThere are no unwind sections in this file.\n"));
6764 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
6766 if (sec->sh_type == SHT_ARM_EXIDX)
6768 printf (_("\nUnwind table index '%s' at offset 0x%lx contains %lu entries:\n"),
6769 SECTION_NAME (sec),
6770 (unsigned long) sec->sh_offset,
6771 (unsigned long) (sec->sh_size / (2 * eh_addr_size)));
6773 dump_arm_unwind (&aux, sec);
6777 if (aux.symtab)
6778 free (aux.symtab);
6779 if (aux.strtab)
6780 free ((char *) aux.strtab);
6782 return 1;
6785 static int
6786 process_unwind (FILE * file)
6788 struct unwind_handler
6790 int machtype;
6791 int (* handler)(FILE *);
6792 } handlers[] =
6794 { EM_ARM, arm_process_unwind },
6795 { EM_IA_64, ia64_process_unwind },
6796 { EM_PARISC, hppa_process_unwind },
6797 { 0, 0 }
6799 int i;
6801 if (!do_unwind)
6802 return 1;
6804 for (i = 0; handlers[i].handler != NULL; i++)
6805 if (elf_header.e_machine == handlers[i].machtype)
6806 return handlers[i].handler (file);
6808 printf (_("\nThere are no unwind sections in this file.\n"));
6809 return 1;
6812 static void
6813 dynamic_section_mips_val (Elf_Internal_Dyn * entry)
6815 switch (entry->d_tag)
6817 case DT_MIPS_FLAGS:
6818 if (entry->d_un.d_val == 0)
6819 printf (_("NONE\n"));
6820 else
6822 static const char * opts[] =
6824 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
6825 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
6826 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
6827 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
6828 "RLD_ORDER_SAFE"
6830 unsigned int cnt;
6831 int first = 1;
6833 for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
6834 if (entry->d_un.d_val & (1 << cnt))
6836 printf ("%s%s", first ? "" : " ", opts[cnt]);
6837 first = 0;
6839 puts ("");
6841 break;
6843 case DT_MIPS_IVERSION:
6844 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
6845 printf (_("Interface Version: %s\n"), GET_DYNAMIC_NAME (entry->d_un.d_val));
6846 else
6847 printf (_("<corrupt: %ld>\n"), (long) entry->d_un.d_ptr);
6848 break;
6850 case DT_MIPS_TIME_STAMP:
6852 char timebuf[20];
6853 struct tm * tmp;
6855 time_t atime = entry->d_un.d_val;
6856 tmp = gmtime (&atime);
6857 snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
6858 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
6859 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
6860 printf (_("Time Stamp: %s\n"), timebuf);
6862 break;
6864 case DT_MIPS_RLD_VERSION:
6865 case DT_MIPS_LOCAL_GOTNO:
6866 case DT_MIPS_CONFLICTNO:
6867 case DT_MIPS_LIBLISTNO:
6868 case DT_MIPS_SYMTABNO:
6869 case DT_MIPS_UNREFEXTNO:
6870 case DT_MIPS_HIPAGENO:
6871 case DT_MIPS_DELTA_CLASS_NO:
6872 case DT_MIPS_DELTA_INSTANCE_NO:
6873 case DT_MIPS_DELTA_RELOC_NO:
6874 case DT_MIPS_DELTA_SYM_NO:
6875 case DT_MIPS_DELTA_CLASSSYM_NO:
6876 case DT_MIPS_COMPACT_SIZE:
6877 printf ("%ld\n", (long) entry->d_un.d_ptr);
6878 break;
6880 default:
6881 printf ("%#lx\n", (unsigned long) entry->d_un.d_ptr);
6885 static void
6886 dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
6888 switch (entry->d_tag)
6890 case DT_HP_DLD_FLAGS:
6892 static struct
6894 long int bit;
6895 const char * str;
6897 flags[] =
6899 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
6900 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
6901 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
6902 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
6903 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
6904 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
6905 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
6906 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
6907 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
6908 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
6909 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
6910 { DT_HP_GST, "HP_GST" },
6911 { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
6912 { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
6913 { DT_HP_NODELETE, "HP_NODELETE" },
6914 { DT_HP_GROUP, "HP_GROUP" },
6915 { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
6917 int first = 1;
6918 size_t cnt;
6919 bfd_vma val = entry->d_un.d_val;
6921 for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
6922 if (val & flags[cnt].bit)
6924 if (! first)
6925 putchar (' ');
6926 fputs (flags[cnt].str, stdout);
6927 first = 0;
6928 val ^= flags[cnt].bit;
6931 if (val != 0 || first)
6933 if (! first)
6934 putchar (' ');
6935 print_vma (val, HEX);
6938 break;
6940 default:
6941 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
6942 break;
6944 putchar ('\n');
6947 #ifdef BFD64
6949 /* VMS vs Unix time offset and factor. */
6951 #define VMS_EPOCH_OFFSET 35067168000000000LL
6952 #define VMS_GRANULARITY_FACTOR 10000000
6954 /* Display a VMS time in a human readable format. */
6956 static void
6957 print_vms_time (bfd_int64_t vmstime)
6959 struct tm *tm;
6960 time_t unxtime;
6962 unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
6963 tm = gmtime (&unxtime);
6964 printf ("%04u-%02u-%02uT%02u:%02u:%02u",
6965 tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
6966 tm->tm_hour, tm->tm_min, tm->tm_sec);
6968 #endif /* BFD64 */
6970 static void
6971 dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
6973 switch (entry->d_tag)
6975 case DT_IA_64_PLT_RESERVE:
6976 /* First 3 slots reserved. */
6977 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
6978 printf (" -- ");
6979 print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
6980 break;
6982 case DT_IA_64_VMS_LINKTIME:
6983 #ifdef BFD64
6984 print_vms_time (entry->d_un.d_val);
6985 #endif
6986 break;
6988 case DT_IA_64_VMS_LNKFLAGS:
6989 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
6990 if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
6991 printf (" CALL_DEBUG");
6992 if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
6993 printf (" NOP0BUFS");
6994 if (entry->d_un.d_val & VMS_LF_P0IMAGE)
6995 printf (" P0IMAGE");
6996 if (entry->d_un.d_val & VMS_LF_MKTHREADS)
6997 printf (" MKTHREADS");
6998 if (entry->d_un.d_val & VMS_LF_UPCALLS)
6999 printf (" UPCALLS");
7000 if (entry->d_un.d_val & VMS_LF_IMGSTA)
7001 printf (" IMGSTA");
7002 if (entry->d_un.d_val & VMS_LF_INITIALIZE)
7003 printf (" INITIALIZE");
7004 if (entry->d_un.d_val & VMS_LF_MAIN)
7005 printf (" MAIN");
7006 if (entry->d_un.d_val & VMS_LF_EXE_INIT)
7007 printf (" EXE_INIT");
7008 if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
7009 printf (" TBK_IN_IMG");
7010 if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
7011 printf (" DBG_IN_IMG");
7012 if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
7013 printf (" TBK_IN_DSF");
7014 if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
7015 printf (" DBG_IN_DSF");
7016 if (entry->d_un.d_val & VMS_LF_SIGNATURES)
7017 printf (" SIGNATURES");
7018 if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
7019 printf (" REL_SEG_OFF");
7020 break;
7022 default:
7023 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
7024 break;
7026 putchar ('\n');
7029 static int
7030 get_32bit_dynamic_section (FILE * file)
7032 Elf32_External_Dyn * edyn;
7033 Elf32_External_Dyn * ext;
7034 Elf_Internal_Dyn * entry;
7036 edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
7037 dynamic_size, _("dynamic section"));
7038 if (!edyn)
7039 return 0;
7041 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
7042 might not have the luxury of section headers. Look for the DT_NULL
7043 terminator to determine the number of entries. */
7044 for (ext = edyn, dynamic_nent = 0;
7045 (char *) ext < (char *) edyn + dynamic_size;
7046 ext++)
7048 dynamic_nent++;
7049 if (BYTE_GET (ext->d_tag) == DT_NULL)
7050 break;
7053 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
7054 sizeof (* entry));
7055 if (dynamic_section == NULL)
7057 error (_("Out of memory\n"));
7058 free (edyn);
7059 return 0;
7062 for (ext = edyn, entry = dynamic_section;
7063 entry < dynamic_section + dynamic_nent;
7064 ext++, entry++)
7066 entry->d_tag = BYTE_GET (ext->d_tag);
7067 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
7070 free (edyn);
7072 return 1;
7075 static int
7076 get_64bit_dynamic_section (FILE * file)
7078 Elf64_External_Dyn * edyn;
7079 Elf64_External_Dyn * ext;
7080 Elf_Internal_Dyn * entry;
7082 edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
7083 dynamic_size, _("dynamic section"));
7084 if (!edyn)
7085 return 0;
7087 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
7088 might not have the luxury of section headers. Look for the DT_NULL
7089 terminator to determine the number of entries. */
7090 for (ext = edyn, dynamic_nent = 0;
7091 (char *) ext < (char *) edyn + dynamic_size;
7092 ext++)
7094 dynamic_nent++;
7095 if (BYTE_GET (ext->d_tag) == DT_NULL)
7096 break;
7099 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
7100 sizeof (* entry));
7101 if (dynamic_section == NULL)
7103 error (_("Out of memory\n"));
7104 free (edyn);
7105 return 0;
7108 for (ext = edyn, entry = dynamic_section;
7109 entry < dynamic_section + dynamic_nent;
7110 ext++, entry++)
7112 entry->d_tag = BYTE_GET (ext->d_tag);
7113 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
7116 free (edyn);
7118 return 1;
7121 static void
7122 print_dynamic_flags (bfd_vma flags)
7124 int first = 1;
7126 while (flags)
7128 bfd_vma flag;
7130 flag = flags & - flags;
7131 flags &= ~ flag;
7133 if (first)
7134 first = 0;
7135 else
7136 putc (' ', stdout);
7138 switch (flag)
7140 case DF_ORIGIN: fputs ("ORIGIN", stdout); break;
7141 case DF_SYMBOLIC: fputs ("SYMBOLIC", stdout); break;
7142 case DF_TEXTREL: fputs ("TEXTREL", stdout); break;
7143 case DF_BIND_NOW: fputs ("BIND_NOW", stdout); break;
7144 case DF_STATIC_TLS: fputs ("STATIC_TLS", stdout); break;
7145 default: fputs (_("unknown"), stdout); break;
7148 puts ("");
7151 /* Parse and display the contents of the dynamic section. */
7153 static int
7154 process_dynamic_section (FILE * file)
7156 Elf_Internal_Dyn * entry;
7158 if (dynamic_size == 0)
7160 if (do_dynamic)
7161 printf (_("\nThere is no dynamic section in this file.\n"));
7163 return 1;
7166 if (is_32bit_elf)
7168 if (! get_32bit_dynamic_section (file))
7169 return 0;
7171 else if (! get_64bit_dynamic_section (file))
7172 return 0;
7174 /* Find the appropriate symbol table. */
7175 if (dynamic_symbols == NULL)
7177 for (entry = dynamic_section;
7178 entry < dynamic_section + dynamic_nent;
7179 ++entry)
7181 Elf_Internal_Shdr section;
7183 if (entry->d_tag != DT_SYMTAB)
7184 continue;
7186 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
7188 /* Since we do not know how big the symbol table is,
7189 we default to reading in the entire file (!) and
7190 processing that. This is overkill, I know, but it
7191 should work. */
7192 section.sh_offset = offset_from_vma (file, entry->d_un.d_val, 0);
7194 if (archive_file_offset != 0)
7195 section.sh_size = archive_file_size - section.sh_offset;
7196 else
7198 if (fseek (file, 0, SEEK_END))
7199 error (_("Unable to seek to end of file!\n"));
7201 section.sh_size = ftell (file) - section.sh_offset;
7204 if (is_32bit_elf)
7205 section.sh_entsize = sizeof (Elf32_External_Sym);
7206 else
7207 section.sh_entsize = sizeof (Elf64_External_Sym);
7209 num_dynamic_syms = section.sh_size / section.sh_entsize;
7210 if (num_dynamic_syms < 1)
7212 error (_("Unable to determine the number of symbols to load\n"));
7213 continue;
7216 dynamic_symbols = GET_ELF_SYMBOLS (file, &section);
7220 /* Similarly find a string table. */
7221 if (dynamic_strings == NULL)
7223 for (entry = dynamic_section;
7224 entry < dynamic_section + dynamic_nent;
7225 ++entry)
7227 unsigned long offset;
7228 long str_tab_len;
7230 if (entry->d_tag != DT_STRTAB)
7231 continue;
7233 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
7235 /* Since we do not know how big the string table is,
7236 we default to reading in the entire file (!) and
7237 processing that. This is overkill, I know, but it
7238 should work. */
7240 offset = offset_from_vma (file, entry->d_un.d_val, 0);
7242 if (archive_file_offset != 0)
7243 str_tab_len = archive_file_size - offset;
7244 else
7246 if (fseek (file, 0, SEEK_END))
7247 error (_("Unable to seek to end of file\n"));
7248 str_tab_len = ftell (file) - offset;
7251 if (str_tab_len < 1)
7253 error
7254 (_("Unable to determine the length of the dynamic string table\n"));
7255 continue;
7258 dynamic_strings = (char *) get_data (NULL, file, offset, 1,
7259 str_tab_len,
7260 _("dynamic string table"));
7261 dynamic_strings_length = str_tab_len;
7262 break;
7266 /* And find the syminfo section if available. */
7267 if (dynamic_syminfo == NULL)
7269 unsigned long syminsz = 0;
7271 for (entry = dynamic_section;
7272 entry < dynamic_section + dynamic_nent;
7273 ++entry)
7275 if (entry->d_tag == DT_SYMINENT)
7277 /* Note: these braces are necessary to avoid a syntax
7278 error from the SunOS4 C compiler. */
7279 assert (sizeof (Elf_External_Syminfo) == entry->d_un.d_val);
7281 else if (entry->d_tag == DT_SYMINSZ)
7282 syminsz = entry->d_un.d_val;
7283 else if (entry->d_tag == DT_SYMINFO)
7284 dynamic_syminfo_offset = offset_from_vma (file, entry->d_un.d_val,
7285 syminsz);
7288 if (dynamic_syminfo_offset != 0 && syminsz != 0)
7290 Elf_External_Syminfo * extsyminfo;
7291 Elf_External_Syminfo * extsym;
7292 Elf_Internal_Syminfo * syminfo;
7294 /* There is a syminfo section. Read the data. */
7295 extsyminfo = (Elf_External_Syminfo *)
7296 get_data (NULL, file, dynamic_syminfo_offset, 1, syminsz,
7297 _("symbol information"));
7298 if (!extsyminfo)
7299 return 0;
7301 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
7302 if (dynamic_syminfo == NULL)
7304 error (_("Out of memory\n"));
7305 return 0;
7308 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
7309 for (syminfo = dynamic_syminfo, extsym = extsyminfo;
7310 syminfo < dynamic_syminfo + dynamic_syminfo_nent;
7311 ++syminfo, ++extsym)
7313 syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
7314 syminfo->si_flags = BYTE_GET (extsym->si_flags);
7317 free (extsyminfo);
7321 if (do_dynamic && dynamic_addr)
7322 printf (_("\nDynamic section at offset 0x%lx contains %u entries:\n"),
7323 dynamic_addr, dynamic_nent);
7324 if (do_dynamic)
7325 printf (_(" Tag Type Name/Value\n"));
7327 for (entry = dynamic_section;
7328 entry < dynamic_section + dynamic_nent;
7329 entry++)
7331 if (do_dynamic)
7333 const char * dtype;
7335 putchar (' ');
7336 print_vma (entry->d_tag, FULL_HEX);
7337 dtype = get_dynamic_type (entry->d_tag);
7338 printf (" (%s)%*s", dtype,
7339 ((is_32bit_elf ? 27 : 19)
7340 - (int) strlen (dtype)),
7341 " ");
7344 switch (entry->d_tag)
7346 case DT_FLAGS:
7347 if (do_dynamic)
7348 print_dynamic_flags (entry->d_un.d_val);
7349 break;
7351 case DT_AUXILIARY:
7352 case DT_FILTER:
7353 case DT_CONFIG:
7354 case DT_DEPAUDIT:
7355 case DT_AUDIT:
7356 if (do_dynamic)
7358 switch (entry->d_tag)
7360 case DT_AUXILIARY:
7361 printf (_("Auxiliary library"));
7362 break;
7364 case DT_FILTER:
7365 printf (_("Filter library"));
7366 break;
7368 case DT_CONFIG:
7369 printf (_("Configuration file"));
7370 break;
7372 case DT_DEPAUDIT:
7373 printf (_("Dependency audit library"));
7374 break;
7376 case DT_AUDIT:
7377 printf (_("Audit library"));
7378 break;
7381 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
7382 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
7383 else
7385 printf (": ");
7386 print_vma (entry->d_un.d_val, PREFIX_HEX);
7387 putchar ('\n');
7390 break;
7392 case DT_FEATURE:
7393 if (do_dynamic)
7395 printf (_("Flags:"));
7397 if (entry->d_un.d_val == 0)
7398 printf (_(" None\n"));
7399 else
7401 unsigned long int val = entry->d_un.d_val;
7403 if (val & DTF_1_PARINIT)
7405 printf (" PARINIT");
7406 val ^= DTF_1_PARINIT;
7408 if (val & DTF_1_CONFEXP)
7410 printf (" CONFEXP");
7411 val ^= DTF_1_CONFEXP;
7413 if (val != 0)
7414 printf (" %lx", val);
7415 puts ("");
7418 break;
7420 case DT_POSFLAG_1:
7421 if (do_dynamic)
7423 printf (_("Flags:"));
7425 if (entry->d_un.d_val == 0)
7426 printf (_(" None\n"));
7427 else
7429 unsigned long int val = entry->d_un.d_val;
7431 if (val & DF_P1_LAZYLOAD)
7433 printf (" LAZYLOAD");
7434 val ^= DF_P1_LAZYLOAD;
7436 if (val & DF_P1_GROUPPERM)
7438 printf (" GROUPPERM");
7439 val ^= DF_P1_GROUPPERM;
7441 if (val != 0)
7442 printf (" %lx", val);
7443 puts ("");
7446 break;
7448 case DT_FLAGS_1:
7449 if (do_dynamic)
7451 printf (_("Flags:"));
7452 if (entry->d_un.d_val == 0)
7453 printf (_(" None\n"));
7454 else
7456 unsigned long int val = entry->d_un.d_val;
7458 if (val & DF_1_NOW)
7460 printf (" NOW");
7461 val ^= DF_1_NOW;
7463 if (val & DF_1_GLOBAL)
7465 printf (" GLOBAL");
7466 val ^= DF_1_GLOBAL;
7468 if (val & DF_1_GROUP)
7470 printf (" GROUP");
7471 val ^= DF_1_GROUP;
7473 if (val & DF_1_NODELETE)
7475 printf (" NODELETE");
7476 val ^= DF_1_NODELETE;
7478 if (val & DF_1_LOADFLTR)
7480 printf (" LOADFLTR");
7481 val ^= DF_1_LOADFLTR;
7483 if (val & DF_1_INITFIRST)
7485 printf (" INITFIRST");
7486 val ^= DF_1_INITFIRST;
7488 if (val & DF_1_NOOPEN)
7490 printf (" NOOPEN");
7491 val ^= DF_1_NOOPEN;
7493 if (val & DF_1_ORIGIN)
7495 printf (" ORIGIN");
7496 val ^= DF_1_ORIGIN;
7498 if (val & DF_1_DIRECT)
7500 printf (" DIRECT");
7501 val ^= DF_1_DIRECT;
7503 if (val & DF_1_TRANS)
7505 printf (" TRANS");
7506 val ^= DF_1_TRANS;
7508 if (val & DF_1_INTERPOSE)
7510 printf (" INTERPOSE");
7511 val ^= DF_1_INTERPOSE;
7513 if (val & DF_1_NODEFLIB)
7515 printf (" NODEFLIB");
7516 val ^= DF_1_NODEFLIB;
7518 if (val & DF_1_NODUMP)
7520 printf (" NODUMP");
7521 val ^= DF_1_NODUMP;
7523 if (val & DF_1_CONLFAT)
7525 printf (" CONLFAT");
7526 val ^= DF_1_CONLFAT;
7528 if (val != 0)
7529 printf (" %lx", val);
7530 puts ("");
7533 break;
7535 case DT_PLTREL:
7536 dynamic_info[entry->d_tag] = entry->d_un.d_val;
7537 if (do_dynamic)
7538 puts (get_dynamic_type (entry->d_un.d_val));
7539 break;
7541 case DT_NULL :
7542 case DT_NEEDED :
7543 case DT_PLTGOT :
7544 case DT_HASH :
7545 case DT_STRTAB :
7546 case DT_SYMTAB :
7547 case DT_RELA :
7548 case DT_INIT :
7549 case DT_FINI :
7550 case DT_SONAME :
7551 case DT_RPATH :
7552 case DT_SYMBOLIC:
7553 case DT_REL :
7554 case DT_DEBUG :
7555 case DT_TEXTREL :
7556 case DT_JMPREL :
7557 case DT_RUNPATH :
7558 dynamic_info[entry->d_tag] = entry->d_un.d_val;
7560 if (do_dynamic)
7562 char * name;
7564 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
7565 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
7566 else
7567 name = NULL;
7569 if (name)
7571 switch (entry->d_tag)
7573 case DT_NEEDED:
7574 printf (_("Shared library: [%s]"), name);
7576 if (streq (name, program_interpreter))
7577 printf (_(" program interpreter"));
7578 break;
7580 case DT_SONAME:
7581 printf (_("Library soname: [%s]"), name);
7582 break;
7584 case DT_RPATH:
7585 printf (_("Library rpath: [%s]"), name);
7586 break;
7588 case DT_RUNPATH:
7589 printf (_("Library runpath: [%s]"), name);
7590 break;
7592 default:
7593 print_vma (entry->d_un.d_val, PREFIX_HEX);
7594 break;
7597 else
7598 print_vma (entry->d_un.d_val, PREFIX_HEX);
7600 putchar ('\n');
7602 break;
7604 case DT_PLTRELSZ:
7605 case DT_RELASZ :
7606 case DT_STRSZ :
7607 case DT_RELSZ :
7608 case DT_RELAENT :
7609 case DT_SYMENT :
7610 case DT_RELENT :
7611 dynamic_info[entry->d_tag] = entry->d_un.d_val;
7612 case DT_PLTPADSZ:
7613 case DT_MOVEENT :
7614 case DT_MOVESZ :
7615 case DT_INIT_ARRAYSZ:
7616 case DT_FINI_ARRAYSZ:
7617 case DT_GNU_CONFLICTSZ:
7618 case DT_GNU_LIBLISTSZ:
7619 if (do_dynamic)
7621 print_vma (entry->d_un.d_val, UNSIGNED);
7622 printf (_(" (bytes)\n"));
7624 break;
7626 case DT_VERDEFNUM:
7627 case DT_VERNEEDNUM:
7628 case DT_RELACOUNT:
7629 case DT_RELCOUNT:
7630 if (do_dynamic)
7632 print_vma (entry->d_un.d_val, UNSIGNED);
7633 putchar ('\n');
7635 break;
7637 case DT_SYMINSZ:
7638 case DT_SYMINENT:
7639 case DT_SYMINFO:
7640 case DT_USED:
7641 case DT_INIT_ARRAY:
7642 case DT_FINI_ARRAY:
7643 if (do_dynamic)
7645 if (entry->d_tag == DT_USED
7646 && VALID_DYNAMIC_NAME (entry->d_un.d_val))
7648 char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
7650 if (*name)
7652 printf (_("Not needed object: [%s]\n"), name);
7653 break;
7657 print_vma (entry->d_un.d_val, PREFIX_HEX);
7658 putchar ('\n');
7660 break;
7662 case DT_BIND_NOW:
7663 /* The value of this entry is ignored. */
7664 if (do_dynamic)
7665 putchar ('\n');
7666 break;
7668 case DT_GNU_PRELINKED:
7669 if (do_dynamic)
7671 struct tm * tmp;
7672 time_t atime = entry->d_un.d_val;
7674 tmp = gmtime (&atime);
7675 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
7676 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
7677 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
7680 break;
7682 case DT_GNU_HASH:
7683 dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
7684 if (do_dynamic)
7686 print_vma (entry->d_un.d_val, PREFIX_HEX);
7687 putchar ('\n');
7689 break;
7691 default:
7692 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
7693 version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
7694 entry->d_un.d_val;
7696 if (do_dynamic)
7698 switch (elf_header.e_machine)
7700 case EM_MIPS:
7701 case EM_MIPS_RS3_LE:
7702 dynamic_section_mips_val (entry);
7703 break;
7704 case EM_PARISC:
7705 dynamic_section_parisc_val (entry);
7706 break;
7707 case EM_IA_64:
7708 dynamic_section_ia64_val (entry);
7709 break;
7710 default:
7711 print_vma (entry->d_un.d_val, PREFIX_HEX);
7712 putchar ('\n');
7715 break;
7719 return 1;
7722 static char *
7723 get_ver_flags (unsigned int flags)
7725 static char buff[32];
7727 buff[0] = 0;
7729 if (flags == 0)
7730 return _("none");
7732 if (flags & VER_FLG_BASE)
7733 strcat (buff, "BASE ");
7735 if (flags & VER_FLG_WEAK)
7737 if (flags & VER_FLG_BASE)
7738 strcat (buff, "| ");
7740 strcat (buff, "WEAK ");
7743 if (flags & VER_FLG_INFO)
7745 if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
7746 strcat (buff, "| ");
7748 strcat (buff, "INFO ");
7751 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
7752 strcat (buff, _("| <unknown>"));
7754 return buff;
7757 /* Display the contents of the version sections. */
7759 static int
7760 process_version_sections (FILE * file)
7762 Elf_Internal_Shdr * section;
7763 unsigned i;
7764 int found = 0;
7766 if (! do_version)
7767 return 1;
7769 for (i = 0, section = section_headers;
7770 i < elf_header.e_shnum;
7771 i++, section++)
7773 switch (section->sh_type)
7775 case SHT_GNU_verdef:
7777 Elf_External_Verdef * edefs;
7778 unsigned int idx;
7779 unsigned int cnt;
7780 char * endbuf;
7782 found = 1;
7784 printf
7785 (_("\nVersion definition section '%s' contains %u entries:\n"),
7786 SECTION_NAME (section), section->sh_info);
7788 printf (_(" Addr: 0x"));
7789 printf_vma (section->sh_addr);
7790 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
7791 (unsigned long) section->sh_offset, section->sh_link,
7792 section->sh_link < elf_header.e_shnum
7793 ? SECTION_NAME (section_headers + section->sh_link)
7794 : _("<corrupt>"));
7796 edefs = (Elf_External_Verdef *)
7797 get_data (NULL, file, section->sh_offset, 1,section->sh_size,
7798 _("version definition section"));
7799 endbuf = (char *) edefs + section->sh_size;
7800 if (!edefs)
7801 break;
7803 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
7805 char * vstart;
7806 Elf_External_Verdef * edef;
7807 Elf_Internal_Verdef ent;
7808 Elf_External_Verdaux * eaux;
7809 Elf_Internal_Verdaux aux;
7810 int j;
7811 int isum;
7813 /* Check for negative or very large indicies. */
7814 if ((unsigned char *) edefs + idx < (unsigned char *) edefs)
7815 break;
7817 vstart = ((char *) edefs) + idx;
7818 if (vstart + sizeof (*edef) > endbuf)
7819 break;
7821 edef = (Elf_External_Verdef *) vstart;
7823 ent.vd_version = BYTE_GET (edef->vd_version);
7824 ent.vd_flags = BYTE_GET (edef->vd_flags);
7825 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
7826 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
7827 ent.vd_hash = BYTE_GET (edef->vd_hash);
7828 ent.vd_aux = BYTE_GET (edef->vd_aux);
7829 ent.vd_next = BYTE_GET (edef->vd_next);
7831 printf (_(" %#06x: Rev: %d Flags: %s"),
7832 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
7834 printf (_(" Index: %d Cnt: %d "),
7835 ent.vd_ndx, ent.vd_cnt);
7837 /* Check for overflow. */
7838 if ((unsigned char *)(vstart + ent.vd_aux) < (unsigned char *) vstart
7839 || (unsigned char *)(vstart + ent.vd_aux) > (unsigned char *) endbuf)
7840 break;
7842 vstart += ent.vd_aux;
7844 eaux = (Elf_External_Verdaux *) vstart;
7846 aux.vda_name = BYTE_GET (eaux->vda_name);
7847 aux.vda_next = BYTE_GET (eaux->vda_next);
7849 if (VALID_DYNAMIC_NAME (aux.vda_name))
7850 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
7851 else
7852 printf (_("Name index: %ld\n"), aux.vda_name);
7854 isum = idx + ent.vd_aux;
7856 for (j = 1; j < ent.vd_cnt; j++)
7858 /* Check for overflow. */
7859 if ((unsigned char *)(vstart + aux.vda_next) < (unsigned char *) vstart
7860 || (unsigned char *)(vstart + aux.vda_next) > (unsigned char *) endbuf)
7861 break;
7863 isum += aux.vda_next;
7864 vstart += aux.vda_next;
7866 eaux = (Elf_External_Verdaux *) vstart;
7867 if (vstart + sizeof (*eaux) > endbuf)
7868 break;
7870 aux.vda_name = BYTE_GET (eaux->vda_name);
7871 aux.vda_next = BYTE_GET (eaux->vda_next);
7873 if (VALID_DYNAMIC_NAME (aux.vda_name))
7874 printf (_(" %#06x: Parent %d: %s\n"),
7875 isum, j, GET_DYNAMIC_NAME (aux.vda_name));
7876 else
7877 printf (_(" %#06x: Parent %d, name index: %ld\n"),
7878 isum, j, aux.vda_name);
7881 if (j < ent.vd_cnt)
7882 printf (_(" Version def aux past end of section\n"));
7884 idx += ent.vd_next;
7887 if (cnt < section->sh_info)
7888 printf (_(" Version definition past end of section\n"));
7890 free (edefs);
7892 break;
7894 case SHT_GNU_verneed:
7896 Elf_External_Verneed * eneed;
7897 unsigned int idx;
7898 unsigned int cnt;
7899 char * endbuf;
7901 found = 1;
7903 printf (_("\nVersion needs section '%s' contains %u entries:\n"),
7904 SECTION_NAME (section), section->sh_info);
7906 printf (_(" Addr: 0x"));
7907 printf_vma (section->sh_addr);
7908 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
7909 (unsigned long) section->sh_offset, section->sh_link,
7910 section->sh_link < elf_header.e_shnum
7911 ? SECTION_NAME (section_headers + section->sh_link)
7912 : _("<corrupt>"));
7914 eneed = (Elf_External_Verneed *) get_data (NULL, file,
7915 section->sh_offset, 1,
7916 section->sh_size,
7917 _("version need section"));
7918 endbuf = (char *) eneed + section->sh_size;
7919 if (!eneed)
7920 break;
7922 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
7924 Elf_External_Verneed * entry;
7925 Elf_Internal_Verneed ent;
7926 int j;
7927 int isum;
7928 char * vstart;
7930 if ((unsigned char *) eneed + idx < (unsigned char *) eneed)
7931 break;
7933 vstart = ((char *) eneed) + idx;
7934 if (vstart + sizeof (*entry) > endbuf)
7935 break;
7937 entry = (Elf_External_Verneed *) vstart;
7939 ent.vn_version = BYTE_GET (entry->vn_version);
7940 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
7941 ent.vn_file = BYTE_GET (entry->vn_file);
7942 ent.vn_aux = BYTE_GET (entry->vn_aux);
7943 ent.vn_next = BYTE_GET (entry->vn_next);
7945 printf (_(" %#06x: Version: %d"), idx, ent.vn_version);
7947 if (VALID_DYNAMIC_NAME (ent.vn_file))
7948 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
7949 else
7950 printf (_(" File: %lx"), ent.vn_file);
7952 printf (_(" Cnt: %d\n"), ent.vn_cnt);
7954 /* Check for overflow. */
7955 if ((unsigned char *)(vstart + ent.vn_aux) < (unsigned char *) vstart
7956 || (unsigned char *)(vstart + ent.vn_aux) > (unsigned char *) endbuf)
7957 break;
7959 vstart += ent.vn_aux;
7961 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
7963 Elf_External_Vernaux * eaux;
7964 Elf_Internal_Vernaux aux;
7966 if (vstart + sizeof (*eaux) > endbuf)
7967 break;
7968 eaux = (Elf_External_Vernaux *) vstart;
7970 aux.vna_hash = BYTE_GET (eaux->vna_hash);
7971 aux.vna_flags = BYTE_GET (eaux->vna_flags);
7972 aux.vna_other = BYTE_GET (eaux->vna_other);
7973 aux.vna_name = BYTE_GET (eaux->vna_name);
7974 aux.vna_next = BYTE_GET (eaux->vna_next);
7976 if (VALID_DYNAMIC_NAME (aux.vna_name))
7977 printf (_(" %#06x: Name: %s"),
7978 isum, GET_DYNAMIC_NAME (aux.vna_name));
7979 else
7980 printf (_(" %#06x: Name index: %lx"),
7981 isum, aux.vna_name);
7983 printf (_(" Flags: %s Version: %d\n"),
7984 get_ver_flags (aux.vna_flags), aux.vna_other);
7986 /* Check for overflow. */
7987 if ((unsigned char *)(vstart + aux.vna_next) < (unsigned char *) vstart
7988 || (unsigned char *)(vstart + aux.vna_next) > (unsigned char *) endbuf)
7989 break;
7991 isum += aux.vna_next;
7992 vstart += aux.vna_next;
7994 if (j < ent.vn_cnt)
7995 printf (_(" Version need aux past end of section\n"));
7997 idx += ent.vn_next;
7999 if (cnt < section->sh_info)
8000 printf (_(" Version need past end of section\n"));
8002 free (eneed);
8004 break;
8006 case SHT_GNU_versym:
8008 Elf_Internal_Shdr * link_section;
8009 int total;
8010 int cnt;
8011 unsigned char * edata;
8012 unsigned short * data;
8013 char * strtab;
8014 Elf_Internal_Sym * symbols;
8015 Elf_Internal_Shdr * string_sec;
8016 long off;
8018 if (section->sh_link >= elf_header.e_shnum)
8019 break;
8021 link_section = section_headers + section->sh_link;
8022 total = section->sh_size / sizeof (Elf_External_Versym);
8024 if (link_section->sh_link >= elf_header.e_shnum)
8025 break;
8027 found = 1;
8029 symbols = GET_ELF_SYMBOLS (file, link_section);
8030 if (symbols == NULL)
8031 break;
8033 string_sec = section_headers + link_section->sh_link;
8035 strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
8036 string_sec->sh_size,
8037 _("version string table"));
8038 if (!strtab)
8039 break;
8041 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
8042 SECTION_NAME (section), total);
8044 printf (_(" Addr: "));
8045 printf_vma (section->sh_addr);
8046 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
8047 (unsigned long) section->sh_offset, section->sh_link,
8048 SECTION_NAME (link_section));
8050 off = offset_from_vma (file,
8051 version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
8052 total * sizeof (short));
8053 edata = (unsigned char *) get_data (NULL, file, off, total,
8054 sizeof (short),
8055 _("version symbol data"));
8056 if (!edata)
8058 free (strtab);
8059 break;
8062 data = (short unsigned int *) cmalloc (total, sizeof (short));
8064 for (cnt = total; cnt --;)
8065 data[cnt] = byte_get (edata + cnt * sizeof (short),
8066 sizeof (short));
8068 free (edata);
8070 for (cnt = 0; cnt < total; cnt += 4)
8072 int j, nn;
8073 int check_def, check_need;
8074 char * name;
8076 printf (" %03x:", cnt);
8078 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
8079 switch (data[cnt + j])
8081 case 0:
8082 fputs (_(" 0 (*local*) "), stdout);
8083 break;
8085 case 1:
8086 fputs (_(" 1 (*global*) "), stdout);
8087 break;
8089 default:
8090 nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
8091 data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
8093 /* If this index value is greater than the size of the symbols
8094 array, break to avoid an out-of-bounds read, */
8095 if ((unsigned long)(cnt + j) >=
8096 ((unsigned long)link_section->sh_size /
8097 (unsigned long)link_section->sh_entsize))
8099 warn (_("invalid index into symbol array\n"));
8100 break;
8103 check_def = 1;
8104 check_need = 1;
8105 if (symbols[cnt + j].st_shndx >= elf_header.e_shnum
8106 || section_headers[symbols[cnt + j].st_shndx].sh_type
8107 != SHT_NOBITS)
8109 if (symbols[cnt + j].st_shndx == SHN_UNDEF)
8110 check_def = 0;
8111 else
8112 check_need = 0;
8115 if (check_need
8116 && version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
8118 Elf_Internal_Verneed ivn;
8119 unsigned long offset;
8121 offset = offset_from_vma
8122 (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
8123 sizeof (Elf_External_Verneed));
8127 Elf_Internal_Vernaux ivna;
8128 Elf_External_Verneed evn;
8129 Elf_External_Vernaux evna;
8130 unsigned long a_off;
8132 get_data (&evn, file, offset, sizeof (evn), 1,
8133 _("version need"));
8135 ivn.vn_aux = BYTE_GET (evn.vn_aux);
8136 ivn.vn_next = BYTE_GET (evn.vn_next);
8138 a_off = offset + ivn.vn_aux;
8142 get_data (&evna, file, a_off, sizeof (evna),
8143 1, _("version need aux (2)"));
8145 ivna.vna_next = BYTE_GET (evna.vna_next);
8146 ivna.vna_other = BYTE_GET (evna.vna_other);
8148 a_off += ivna.vna_next;
8150 while (ivna.vna_other != data[cnt + j]
8151 && ivna.vna_next != 0);
8153 if (ivna.vna_other == data[cnt + j])
8155 ivna.vna_name = BYTE_GET (evna.vna_name);
8157 if (ivna.vna_name >= string_sec->sh_size)
8158 name = _("*invalid*");
8159 else
8160 name = strtab + ivna.vna_name;
8161 nn += printf ("(%s%-*s",
8162 name,
8163 12 - (int) strlen (name),
8164 ")");
8165 check_def = 0;
8166 break;
8169 offset += ivn.vn_next;
8171 while (ivn.vn_next);
8174 if (check_def && data[cnt + j] != 0x8001
8175 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
8177 Elf_Internal_Verdef ivd;
8178 Elf_External_Verdef evd;
8179 unsigned long offset;
8181 offset = offset_from_vma
8182 (file, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
8183 sizeof evd);
8187 get_data (&evd, file, offset, sizeof (evd), 1,
8188 _("version def"));
8190 ivd.vd_next = BYTE_GET (evd.vd_next);
8191 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
8193 offset += ivd.vd_next;
8195 while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
8196 && ivd.vd_next != 0);
8198 if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
8200 Elf_External_Verdaux evda;
8201 Elf_Internal_Verdaux ivda;
8203 ivd.vd_aux = BYTE_GET (evd.vd_aux);
8205 get_data (&evda, file,
8206 offset - ivd.vd_next + ivd.vd_aux,
8207 sizeof (evda), 1,
8208 _("version def aux"));
8210 ivda.vda_name = BYTE_GET (evda.vda_name);
8212 if (ivda.vda_name >= string_sec->sh_size)
8213 name = _("*invalid*");
8214 else
8215 name = strtab + ivda.vda_name;
8216 nn += printf ("(%s%-*s",
8217 name,
8218 12 - (int) strlen (name),
8219 ")");
8223 if (nn < 18)
8224 printf ("%*c", 18 - nn, ' ');
8227 putchar ('\n');
8230 free (data);
8231 free (strtab);
8232 free (symbols);
8234 break;
8236 default:
8237 break;
8241 if (! found)
8242 printf (_("\nNo version information found in this file.\n"));
8244 return 1;
8247 static const char *
8248 get_symbol_binding (unsigned int binding)
8250 static char buff[32];
8252 switch (binding)
8254 case STB_LOCAL: return "LOCAL";
8255 case STB_GLOBAL: return "GLOBAL";
8256 case STB_WEAK: return "WEAK";
8257 default:
8258 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
8259 snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
8260 binding);
8261 else if (binding >= STB_LOOS && binding <= STB_HIOS)
8263 if (binding == STB_GNU_UNIQUE
8264 && (elf_header.e_ident[EI_OSABI] == ELFOSABI_LINUX
8265 /* GNU/Linux is still using the default value 0. */
8266 || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
8267 return "UNIQUE";
8268 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
8270 else
8271 snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
8272 return buff;
8276 static const char *
8277 get_symbol_type (unsigned int type)
8279 static char buff[32];
8281 switch (type)
8283 case STT_NOTYPE: return "NOTYPE";
8284 case STT_OBJECT: return "OBJECT";
8285 case STT_FUNC: return "FUNC";
8286 case STT_SECTION: return "SECTION";
8287 case STT_FILE: return "FILE";
8288 case STT_COMMON: return "COMMON";
8289 case STT_TLS: return "TLS";
8290 case STT_RELC: return "RELC";
8291 case STT_SRELC: return "SRELC";
8292 default:
8293 if (type >= STT_LOPROC && type <= STT_HIPROC)
8295 if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
8296 return "THUMB_FUNC";
8298 if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
8299 return "REGISTER";
8301 if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
8302 return "PARISC_MILLI";
8304 snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
8306 else if (type >= STT_LOOS && type <= STT_HIOS)
8308 if (elf_header.e_machine == EM_PARISC)
8310 if (type == STT_HP_OPAQUE)
8311 return "HP_OPAQUE";
8312 if (type == STT_HP_STUB)
8313 return "HP_STUB";
8316 if (type == STT_GNU_IFUNC
8317 && (elf_header.e_ident[EI_OSABI] == ELFOSABI_LINUX
8318 /* GNU/Linux is still using the default value 0. */
8319 || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
8320 return "IFUNC";
8322 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
8324 else
8325 snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
8326 return buff;
8330 static const char *
8331 get_symbol_visibility (unsigned int visibility)
8333 switch (visibility)
8335 case STV_DEFAULT: return "DEFAULT";
8336 case STV_INTERNAL: return "INTERNAL";
8337 case STV_HIDDEN: return "HIDDEN";
8338 case STV_PROTECTED: return "PROTECTED";
8339 default: abort ();
8343 static const char *
8344 get_mips_symbol_other (unsigned int other)
8346 switch (other)
8348 case STO_OPTIONAL: return "OPTIONAL";
8349 case STO_MIPS16: return "MIPS16";
8350 case STO_MIPS_PLT: return "MIPS PLT";
8351 case STO_MIPS_PIC: return "MIPS PIC";
8352 default: return NULL;
8356 static const char *
8357 get_ia64_symbol_other (unsigned int other)
8359 if (is_ia64_vms ())
8361 static char res[32];
8363 res[0] = 0;
8365 /* Function types is for images and .STB files only. */
8366 switch (elf_header.e_type)
8368 case ET_DYN:
8369 case ET_EXEC:
8370 switch (VMS_ST_FUNC_TYPE (other))
8372 case VMS_SFT_CODE_ADDR:
8373 strcat (res, " CA");
8374 break;
8375 case VMS_SFT_SYMV_IDX:
8376 strcat (res, " VEC");
8377 break;
8378 case VMS_SFT_FD:
8379 strcat (res, " FD");
8380 break;
8381 case VMS_SFT_RESERVE:
8382 strcat (res, " RSV");
8383 break;
8384 default:
8385 abort ();
8387 break;
8388 default:
8389 break;
8391 switch (VMS_ST_LINKAGE (other))
8393 case VMS_STL_IGNORE:
8394 strcat (res, " IGN");
8395 break;
8396 case VMS_STL_RESERVE:
8397 strcat (res, " RSV");
8398 break;
8399 case VMS_STL_STD:
8400 strcat (res, " STD");
8401 break;
8402 case VMS_STL_LNK:
8403 strcat (res, " LNK");
8404 break;
8405 default:
8406 abort ();
8409 if (res[0] != 0)
8410 return res + 1;
8411 else
8412 return res;
8414 return NULL;
8417 static const char *
8418 get_symbol_other (unsigned int other)
8420 const char * result = NULL;
8421 static char buff [32];
8423 if (other == 0)
8424 return "";
8426 switch (elf_header.e_machine)
8428 case EM_MIPS:
8429 result = get_mips_symbol_other (other);
8430 break;
8431 case EM_IA_64:
8432 result = get_ia64_symbol_other (other);
8433 break;
8434 default:
8435 break;
8438 if (result)
8439 return result;
8441 snprintf (buff, sizeof buff, _("<other>: %x"), other);
8442 return buff;
8445 static const char *
8446 get_symbol_index_type (unsigned int type)
8448 static char buff[32];
8450 switch (type)
8452 case SHN_UNDEF: return "UND";
8453 case SHN_ABS: return "ABS";
8454 case SHN_COMMON: return "COM";
8455 default:
8456 if (type == SHN_IA_64_ANSI_COMMON
8457 && elf_header.e_machine == EM_IA_64
8458 && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
8459 return "ANSI_COM";
8460 else if ((elf_header.e_machine == EM_X86_64
8461 || elf_header.e_machine == EM_L1OM)
8462 && type == SHN_X86_64_LCOMMON)
8463 return "LARGE_COM";
8464 else if (type == SHN_MIPS_SCOMMON
8465 && elf_header.e_machine == EM_MIPS)
8466 return "SCOM";
8467 else if (type == SHN_MIPS_SUNDEFINED
8468 && elf_header.e_machine == EM_MIPS)
8469 return "SUND";
8470 else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
8471 sprintf (buff, "PRC[0x%04x]", type & 0xffff);
8472 else if (type >= SHN_LOOS && type <= SHN_HIOS)
8473 sprintf (buff, "OS [0x%04x]", type & 0xffff);
8474 else if (type >= SHN_LORESERVE)
8475 sprintf (buff, "RSV[0x%04x]", type & 0xffff);
8476 else
8477 sprintf (buff, "%3d", type);
8478 break;
8481 return buff;
8484 static bfd_vma *
8485 get_dynamic_data (FILE * file, unsigned int number, unsigned int ent_size)
8487 unsigned char * e_data;
8488 bfd_vma * i_data;
8490 e_data = (unsigned char *) cmalloc (number, ent_size);
8492 if (e_data == NULL)
8494 error (_("Out of memory\n"));
8495 return NULL;
8498 if (fread (e_data, ent_size, number, file) != number)
8500 error (_("Unable to read in dynamic data\n"));
8501 return NULL;
8504 i_data = (bfd_vma *) cmalloc (number, sizeof (*i_data));
8506 if (i_data == NULL)
8508 error (_("Out of memory\n"));
8509 free (e_data);
8510 return NULL;
8513 while (number--)
8514 i_data[number] = byte_get (e_data + number * ent_size, ent_size);
8516 free (e_data);
8518 return i_data;
8521 static void
8522 print_dynamic_symbol (bfd_vma si, unsigned long hn)
8524 Elf_Internal_Sym * psym;
8525 int n;
8527 psym = dynamic_symbols + si;
8529 n = print_vma (si, DEC_5);
8530 if (n < 5)
8531 fputs (" " + n, stdout);
8532 printf (" %3lu: ", hn);
8533 print_vma (psym->st_value, LONG_HEX);
8534 putchar (' ');
8535 print_vma (psym->st_size, DEC_5);
8537 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
8538 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
8539 printf (" %-7s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
8540 /* Check to see if any other bits in the st_other field are set.
8541 Note - displaying this information disrupts the layout of the
8542 table being generated, but for the moment this case is very
8543 rare. */
8544 if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
8545 printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
8546 printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
8547 if (VALID_DYNAMIC_NAME (psym->st_name))
8548 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
8549 else
8550 printf (_(" <corrupt: %14ld>"), psym->st_name);
8551 putchar ('\n');
8554 /* Dump the symbol table. */
8555 static int
8556 process_symbol_table (FILE * file)
8558 Elf_Internal_Shdr * section;
8559 bfd_vma nbuckets = 0;
8560 bfd_vma nchains = 0;
8561 bfd_vma * buckets = NULL;
8562 bfd_vma * chains = NULL;
8563 bfd_vma ngnubuckets = 0;
8564 bfd_vma * gnubuckets = NULL;
8565 bfd_vma * gnuchains = NULL;
8566 bfd_vma gnusymidx = 0;
8568 if (!do_syms && !do_dyn_syms && !do_histogram)
8569 return 1;
8571 if (dynamic_info[DT_HASH]
8572 && (do_histogram
8573 || (do_using_dynamic
8574 && !do_dyn_syms
8575 && dynamic_strings != NULL)))
8577 unsigned char nb[8];
8578 unsigned char nc[8];
8579 int hash_ent_size = 4;
8581 if ((elf_header.e_machine == EM_ALPHA
8582 || elf_header.e_machine == EM_S390
8583 || elf_header.e_machine == EM_S390_OLD)
8584 && elf_header.e_ident[EI_CLASS] == ELFCLASS64)
8585 hash_ent_size = 8;
8587 if (fseek (file,
8588 (archive_file_offset
8589 + offset_from_vma (file, dynamic_info[DT_HASH],
8590 sizeof nb + sizeof nc)),
8591 SEEK_SET))
8593 error (_("Unable to seek to start of dynamic information\n"));
8594 goto no_hash;
8597 if (fread (nb, hash_ent_size, 1, file) != 1)
8599 error (_("Failed to read in number of buckets\n"));
8600 goto no_hash;
8603 if (fread (nc, hash_ent_size, 1, file) != 1)
8605 error (_("Failed to read in number of chains\n"));
8606 goto no_hash;
8609 nbuckets = byte_get (nb, hash_ent_size);
8610 nchains = byte_get (nc, hash_ent_size);
8612 buckets = get_dynamic_data (file, nbuckets, hash_ent_size);
8613 chains = get_dynamic_data (file, nchains, hash_ent_size);
8615 no_hash:
8616 if (buckets == NULL || chains == NULL)
8618 if (do_using_dynamic)
8619 return 0;
8620 free (buckets);
8621 free (chains);
8622 buckets = NULL;
8623 chains = NULL;
8624 nbuckets = 0;
8625 nchains = 0;
8629 if (dynamic_info_DT_GNU_HASH
8630 && (do_histogram
8631 || (do_using_dynamic
8632 && !do_dyn_syms
8633 && dynamic_strings != NULL)))
8635 unsigned char nb[16];
8636 bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
8637 bfd_vma buckets_vma;
8639 if (fseek (file,
8640 (archive_file_offset
8641 + offset_from_vma (file, dynamic_info_DT_GNU_HASH,
8642 sizeof nb)),
8643 SEEK_SET))
8645 error (_("Unable to seek to start of dynamic information\n"));
8646 goto no_gnu_hash;
8649 if (fread (nb, 16, 1, file) != 1)
8651 error (_("Failed to read in number of buckets\n"));
8652 goto no_gnu_hash;
8655 ngnubuckets = byte_get (nb, 4);
8656 gnusymidx = byte_get (nb + 4, 4);
8657 bitmaskwords = byte_get (nb + 8, 4);
8658 buckets_vma = dynamic_info_DT_GNU_HASH + 16;
8659 if (is_32bit_elf)
8660 buckets_vma += bitmaskwords * 4;
8661 else
8662 buckets_vma += bitmaskwords * 8;
8664 if (fseek (file,
8665 (archive_file_offset
8666 + offset_from_vma (file, buckets_vma, 4)),
8667 SEEK_SET))
8669 error (_("Unable to seek to start of dynamic information\n"));
8670 goto no_gnu_hash;
8673 gnubuckets = get_dynamic_data (file, ngnubuckets, 4);
8675 if (gnubuckets == NULL)
8676 goto no_gnu_hash;
8678 for (i = 0; i < ngnubuckets; i++)
8679 if (gnubuckets[i] != 0)
8681 if (gnubuckets[i] < gnusymidx)
8682 return 0;
8684 if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
8685 maxchain = gnubuckets[i];
8688 if (maxchain == 0xffffffff)
8689 goto no_gnu_hash;
8691 maxchain -= gnusymidx;
8693 if (fseek (file,
8694 (archive_file_offset
8695 + offset_from_vma (file, buckets_vma
8696 + 4 * (ngnubuckets + maxchain), 4)),
8697 SEEK_SET))
8699 error (_("Unable to seek to start of dynamic information\n"));
8700 goto no_gnu_hash;
8705 if (fread (nb, 4, 1, file) != 1)
8707 error (_("Failed to determine last chain length\n"));
8708 goto no_gnu_hash;
8711 if (maxchain + 1 == 0)
8712 goto no_gnu_hash;
8714 ++maxchain;
8716 while ((byte_get (nb, 4) & 1) == 0);
8718 if (fseek (file,
8719 (archive_file_offset
8720 + offset_from_vma (file, buckets_vma + 4 * ngnubuckets, 4)),
8721 SEEK_SET))
8723 error (_("Unable to seek to start of dynamic information\n"));
8724 goto no_gnu_hash;
8727 gnuchains = get_dynamic_data (file, maxchain, 4);
8729 no_gnu_hash:
8730 if (gnuchains == NULL)
8732 free (gnubuckets);
8733 gnubuckets = NULL;
8734 ngnubuckets = 0;
8735 if (do_using_dynamic)
8736 return 0;
8740 if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
8741 && do_syms
8742 && do_using_dynamic
8743 && dynamic_strings != NULL)
8745 unsigned long hn;
8747 if (dynamic_info[DT_HASH])
8749 bfd_vma si;
8751 printf (_("\nSymbol table for image:\n"));
8752 if (is_32bit_elf)
8753 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
8754 else
8755 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
8757 for (hn = 0; hn < nbuckets; hn++)
8759 if (! buckets[hn])
8760 continue;
8762 for (si = buckets[hn]; si < nchains && si > 0; si = chains[si])
8763 print_dynamic_symbol (si, hn);
8767 if (dynamic_info_DT_GNU_HASH)
8769 printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
8770 if (is_32bit_elf)
8771 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
8772 else
8773 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
8775 for (hn = 0; hn < ngnubuckets; ++hn)
8776 if (gnubuckets[hn] != 0)
8778 bfd_vma si = gnubuckets[hn];
8779 bfd_vma off = si - gnusymidx;
8783 print_dynamic_symbol (si, hn);
8784 si++;
8786 while ((gnuchains[off++] & 1) == 0);
8790 else if (do_dyn_syms || (do_syms && !do_using_dynamic))
8792 unsigned int i;
8794 for (i = 0, section = section_headers;
8795 i < elf_header.e_shnum;
8796 i++, section++)
8798 unsigned int si;
8799 char * strtab = NULL;
8800 unsigned long int strtab_size = 0;
8801 Elf_Internal_Sym * symtab;
8802 Elf_Internal_Sym * psym;
8804 if ((section->sh_type != SHT_SYMTAB
8805 && section->sh_type != SHT_DYNSYM)
8806 || (!do_syms
8807 && section->sh_type == SHT_SYMTAB))
8808 continue;
8810 if (section->sh_entsize == 0)
8812 printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
8813 SECTION_NAME (section));
8814 continue;
8817 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
8818 SECTION_NAME (section),
8819 (unsigned long) (section->sh_size / section->sh_entsize));
8821 if (is_32bit_elf)
8822 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
8823 else
8824 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
8826 symtab = GET_ELF_SYMBOLS (file, section);
8827 if (symtab == NULL)
8828 continue;
8830 if (section->sh_link == elf_header.e_shstrndx)
8832 strtab = string_table;
8833 strtab_size = string_table_length;
8835 else if (section->sh_link < elf_header.e_shnum)
8837 Elf_Internal_Shdr * string_sec;
8839 string_sec = section_headers + section->sh_link;
8841 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
8842 1, string_sec->sh_size,
8843 _("string table"));
8844 strtab_size = strtab != NULL ? string_sec->sh_size : 0;
8847 for (si = 0, psym = symtab;
8848 si < section->sh_size / section->sh_entsize;
8849 si++, psym++)
8851 printf ("%6d: ", si);
8852 print_vma (psym->st_value, LONG_HEX);
8853 putchar (' ');
8854 print_vma (psym->st_size, DEC_5);
8855 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
8856 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
8857 printf (" %-7s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
8858 /* Check to see if any other bits in the st_other field are set.
8859 Note - displaying this information disrupts the layout of the
8860 table being generated, but for the moment this case is very rare. */
8861 if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
8862 printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
8863 printf (" %4s ", get_symbol_index_type (psym->st_shndx));
8864 print_symbol (25, psym->st_name < strtab_size
8865 ? strtab + psym->st_name : _("<corrupt>"));
8867 if (section->sh_type == SHT_DYNSYM &&
8868 version_info[DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
8870 unsigned char data[2];
8871 unsigned short vers_data;
8872 unsigned long offset;
8873 int is_nobits;
8874 int check_def;
8876 offset = offset_from_vma
8877 (file, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
8878 sizeof data + si * sizeof (vers_data));
8880 get_data (&data, file, offset + si * sizeof (vers_data),
8881 sizeof (data), 1, _("version data"));
8883 vers_data = byte_get (data, 2);
8885 is_nobits = (psym->st_shndx < elf_header.e_shnum
8886 && section_headers[psym->st_shndx].sh_type
8887 == SHT_NOBITS);
8889 check_def = (psym->st_shndx != SHN_UNDEF);
8891 if ((vers_data & VERSYM_HIDDEN) || vers_data > 1)
8893 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)]
8894 && (is_nobits || ! check_def))
8896 Elf_External_Verneed evn;
8897 Elf_Internal_Verneed ivn;
8898 Elf_Internal_Vernaux ivna;
8900 /* We must test both. */
8901 offset = offset_from_vma
8902 (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
8903 sizeof evn);
8907 unsigned long vna_off;
8909 get_data (&evn, file, offset, sizeof (evn), 1,
8910 _("version need"));
8912 ivn.vn_aux = BYTE_GET (evn.vn_aux);
8913 ivn.vn_next = BYTE_GET (evn.vn_next);
8915 vna_off = offset + ivn.vn_aux;
8919 Elf_External_Vernaux evna;
8921 get_data (&evna, file, vna_off,
8922 sizeof (evna), 1,
8923 _("version need aux (3)"));
8925 ivna.vna_other = BYTE_GET (evna.vna_other);
8926 ivna.vna_next = BYTE_GET (evna.vna_next);
8927 ivna.vna_name = BYTE_GET (evna.vna_name);
8929 vna_off += ivna.vna_next;
8931 while (ivna.vna_other != vers_data
8932 && ivna.vna_next != 0);
8934 if (ivna.vna_other == vers_data)
8935 break;
8937 offset += ivn.vn_next;
8939 while (ivn.vn_next != 0);
8941 if (ivna.vna_other == vers_data)
8943 printf ("@%s (%d)",
8944 ivna.vna_name < strtab_size
8945 ? strtab + ivna.vna_name : _("<corrupt>"),
8946 ivna.vna_other);
8947 check_def = 0;
8949 else if (! is_nobits)
8950 error (_("bad dynamic symbol\n"));
8951 else
8952 check_def = 1;
8955 if (check_def)
8957 if (vers_data != 0x8001
8958 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
8960 Elf_Internal_Verdef ivd;
8961 Elf_Internal_Verdaux ivda;
8962 Elf_External_Verdaux evda;
8963 unsigned long off;
8965 off = offset_from_vma
8966 (file,
8967 version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
8968 sizeof (Elf_External_Verdef));
8972 Elf_External_Verdef evd;
8974 get_data (&evd, file, off, sizeof (evd),
8975 1, _("version def"));
8977 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
8978 ivd.vd_aux = BYTE_GET (evd.vd_aux);
8979 ivd.vd_next = BYTE_GET (evd.vd_next);
8981 off += ivd.vd_next;
8983 while (ivd.vd_ndx != (vers_data & VERSYM_VERSION)
8984 && ivd.vd_next != 0);
8986 off -= ivd.vd_next;
8987 off += ivd.vd_aux;
8989 get_data (&evda, file, off, sizeof (evda),
8990 1, _("version def aux"));
8992 ivda.vda_name = BYTE_GET (evda.vda_name);
8994 if (psym->st_name != ivda.vda_name)
8995 printf ((vers_data & VERSYM_HIDDEN)
8996 ? "@%s" : "@@%s",
8997 ivda.vda_name < strtab_size
8998 ? strtab + ivda.vda_name : _("<corrupt>"));
9004 putchar ('\n');
9007 free (symtab);
9008 if (strtab != string_table)
9009 free (strtab);
9012 else if (do_syms)
9013 printf
9014 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
9016 if (do_histogram && buckets != NULL)
9018 unsigned long * lengths;
9019 unsigned long * counts;
9020 unsigned long hn;
9021 bfd_vma si;
9022 unsigned long maxlength = 0;
9023 unsigned long nzero_counts = 0;
9024 unsigned long nsyms = 0;
9026 printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
9027 (unsigned long) nbuckets);
9028 printf (_(" Length Number %% of total Coverage\n"));
9030 lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
9031 if (lengths == NULL)
9033 error (_("Out of memory\n"));
9034 return 0;
9036 for (hn = 0; hn < nbuckets; ++hn)
9038 for (si = buckets[hn]; si > 0 && si < nchains; si = chains[si])
9040 ++nsyms;
9041 if (maxlength < ++lengths[hn])
9042 ++maxlength;
9046 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
9047 if (counts == NULL)
9049 error (_("Out of memory\n"));
9050 return 0;
9053 for (hn = 0; hn < nbuckets; ++hn)
9054 ++counts[lengths[hn]];
9056 if (nbuckets > 0)
9058 unsigned long i;
9059 printf (" 0 %-10lu (%5.1f%%)\n",
9060 counts[0], (counts[0] * 100.0) / nbuckets);
9061 for (i = 1; i <= maxlength; ++i)
9063 nzero_counts += counts[i] * i;
9064 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
9065 i, counts[i], (counts[i] * 100.0) / nbuckets,
9066 (nzero_counts * 100.0) / nsyms);
9070 free (counts);
9071 free (lengths);
9074 if (buckets != NULL)
9076 free (buckets);
9077 free (chains);
9080 if (do_histogram && gnubuckets != NULL)
9082 unsigned long * lengths;
9083 unsigned long * counts;
9084 unsigned long hn;
9085 unsigned long maxlength = 0;
9086 unsigned long nzero_counts = 0;
9087 unsigned long nsyms = 0;
9089 lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
9090 if (lengths == NULL)
9092 error (_("Out of memory\n"));
9093 return 0;
9096 printf (_("\nHistogram for `.gnu.hash' bucket list length (total of %lu buckets):\n"),
9097 (unsigned long) ngnubuckets);
9098 printf (_(" Length Number %% of total Coverage\n"));
9100 for (hn = 0; hn < ngnubuckets; ++hn)
9101 if (gnubuckets[hn] != 0)
9103 bfd_vma off, length = 1;
9105 for (off = gnubuckets[hn] - gnusymidx;
9106 (gnuchains[off] & 1) == 0; ++off)
9107 ++length;
9108 lengths[hn] = length;
9109 if (length > maxlength)
9110 maxlength = length;
9111 nsyms += length;
9114 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
9115 if (counts == NULL)
9117 error (_("Out of memory\n"));
9118 return 0;
9121 for (hn = 0; hn < ngnubuckets; ++hn)
9122 ++counts[lengths[hn]];
9124 if (ngnubuckets > 0)
9126 unsigned long j;
9127 printf (" 0 %-10lu (%5.1f%%)\n",
9128 counts[0], (counts[0] * 100.0) / ngnubuckets);
9129 for (j = 1; j <= maxlength; ++j)
9131 nzero_counts += counts[j] * j;
9132 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
9133 j, counts[j], (counts[j] * 100.0) / ngnubuckets,
9134 (nzero_counts * 100.0) / nsyms);
9138 free (counts);
9139 free (lengths);
9140 free (gnubuckets);
9141 free (gnuchains);
9144 return 1;
9147 static int
9148 process_syminfo (FILE * file ATTRIBUTE_UNUSED)
9150 unsigned int i;
9152 if (dynamic_syminfo == NULL
9153 || !do_dynamic)
9154 /* No syminfo, this is ok. */
9155 return 1;
9157 /* There better should be a dynamic symbol section. */
9158 if (dynamic_symbols == NULL || dynamic_strings == NULL)
9159 return 0;
9161 if (dynamic_addr)
9162 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
9163 dynamic_syminfo_offset, dynamic_syminfo_nent);
9165 printf (_(" Num: Name BoundTo Flags\n"));
9166 for (i = 0; i < dynamic_syminfo_nent; ++i)
9168 unsigned short int flags = dynamic_syminfo[i].si_flags;
9170 printf ("%4d: ", i);
9171 if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
9172 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
9173 else
9174 printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
9175 putchar (' ');
9177 switch (dynamic_syminfo[i].si_boundto)
9179 case SYMINFO_BT_SELF:
9180 fputs ("SELF ", stdout);
9181 break;
9182 case SYMINFO_BT_PARENT:
9183 fputs ("PARENT ", stdout);
9184 break;
9185 default:
9186 if (dynamic_syminfo[i].si_boundto > 0
9187 && dynamic_syminfo[i].si_boundto < dynamic_nent
9188 && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
9190 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
9191 putchar (' ' );
9193 else
9194 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
9195 break;
9198 if (flags & SYMINFO_FLG_DIRECT)
9199 printf (" DIRECT");
9200 if (flags & SYMINFO_FLG_PASSTHRU)
9201 printf (" PASSTHRU");
9202 if (flags & SYMINFO_FLG_COPY)
9203 printf (" COPY");
9204 if (flags & SYMINFO_FLG_LAZYLOAD)
9205 printf (" LAZYLOAD");
9207 puts ("");
9210 return 1;
9213 /* Check to see if the given reloc needs to be handled in a target specific
9214 manner. If so then process the reloc and return TRUE otherwise return
9215 FALSE. */
9217 static bfd_boolean
9218 target_specific_reloc_handling (Elf_Internal_Rela * reloc,
9219 unsigned char * start,
9220 Elf_Internal_Sym * symtab)
9222 unsigned int reloc_type = get_reloc_type (reloc->r_info);
9224 switch (elf_header.e_machine)
9226 case EM_MN10300:
9227 case EM_CYGNUS_MN10300:
9229 static Elf_Internal_Sym * saved_sym = NULL;
9231 switch (reloc_type)
9233 case 34: /* R_MN10300_ALIGN */
9234 return TRUE;
9235 case 33: /* R_MN10300_SYM_DIFF */
9236 saved_sym = symtab + get_reloc_symindex (reloc->r_info);
9237 return TRUE;
9238 case 1: /* R_MN10300_32 */
9239 case 2: /* R_MN10300_16 */
9240 if (saved_sym != NULL)
9242 bfd_vma value;
9244 value = reloc->r_addend
9245 + (symtab[get_reloc_symindex (reloc->r_info)].st_value
9246 - saved_sym->st_value);
9248 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
9250 saved_sym = NULL;
9251 return TRUE;
9253 break;
9254 default:
9255 if (saved_sym != NULL)
9256 error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc"));
9257 break;
9259 break;
9263 return FALSE;
9266 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
9267 DWARF debug sections. This is a target specific test. Note - we do not
9268 go through the whole including-target-headers-multiple-times route, (as
9269 we have already done with <elf/h8.h>) because this would become very
9270 messy and even then this function would have to contain target specific
9271 information (the names of the relocs instead of their numeric values).
9272 FIXME: This is not the correct way to solve this problem. The proper way
9273 is to have target specific reloc sizing and typing functions created by
9274 the reloc-macros.h header, in the same way that it already creates the
9275 reloc naming functions. */
9277 static bfd_boolean
9278 is_32bit_abs_reloc (unsigned int reloc_type)
9280 switch (elf_header.e_machine)
9282 case EM_386:
9283 case EM_486:
9284 return reloc_type == 1; /* R_386_32. */
9285 case EM_68K:
9286 return reloc_type == 1; /* R_68K_32. */
9287 case EM_860:
9288 return reloc_type == 1; /* R_860_32. */
9289 case EM_960:
9290 return reloc_type == 2; /* R_960_32. */
9291 case EM_ALPHA:
9292 return reloc_type == 1; /* R_ALPHA_REFLONG. */
9293 case EM_ARC:
9294 return reloc_type == 1; /* R_ARC_32. */
9295 case EM_ARM:
9296 return reloc_type == 2; /* R_ARM_ABS32 */
9297 case EM_AVR_OLD:
9298 case EM_AVR:
9299 return reloc_type == 1;
9300 case EM_BLACKFIN:
9301 return reloc_type == 0x12; /* R_byte4_data. */
9302 case EM_CRIS:
9303 return reloc_type == 3; /* R_CRIS_32. */
9304 case EM_CR16:
9305 case EM_CR16_OLD:
9306 return reloc_type == 3; /* R_CR16_NUM32. */
9307 case EM_CRX:
9308 return reloc_type == 15; /* R_CRX_NUM32. */
9309 case EM_CYGNUS_FRV:
9310 return reloc_type == 1;
9311 case EM_CYGNUS_D10V:
9312 case EM_D10V:
9313 return reloc_type == 6; /* R_D10V_32. */
9314 case EM_CYGNUS_D30V:
9315 case EM_D30V:
9316 return reloc_type == 12; /* R_D30V_32_NORMAL. */
9317 case EM_DLX:
9318 return reloc_type == 3; /* R_DLX_RELOC_32. */
9319 case EM_CYGNUS_FR30:
9320 case EM_FR30:
9321 return reloc_type == 3; /* R_FR30_32. */
9322 case EM_H8S:
9323 case EM_H8_300:
9324 case EM_H8_300H:
9325 return reloc_type == 1; /* R_H8_DIR32. */
9326 case EM_IA_64:
9327 return reloc_type == 0x65; /* R_IA64_SECREL32LSB. */
9328 case EM_IP2K_OLD:
9329 case EM_IP2K:
9330 return reloc_type == 2; /* R_IP2K_32. */
9331 case EM_IQ2000:
9332 return reloc_type == 2; /* R_IQ2000_32. */
9333 case EM_LATTICEMICO32:
9334 return reloc_type == 3; /* R_LM32_32. */
9335 case EM_M32C_OLD:
9336 case EM_M32C:
9337 return reloc_type == 3; /* R_M32C_32. */
9338 case EM_M32R:
9339 return reloc_type == 34; /* R_M32R_32_RELA. */
9340 case EM_MCORE:
9341 return reloc_type == 1; /* R_MCORE_ADDR32. */
9342 case EM_CYGNUS_MEP:
9343 return reloc_type == 4; /* R_MEP_32. */
9344 case EM_MICROBLAZE:
9345 return reloc_type == 1; /* R_MICROBLAZE_32. */
9346 case EM_MIPS:
9347 return reloc_type == 2; /* R_MIPS_32. */
9348 case EM_MMIX:
9349 return reloc_type == 4; /* R_MMIX_32. */
9350 case EM_CYGNUS_MN10200:
9351 case EM_MN10200:
9352 return reloc_type == 1; /* R_MN10200_32. */
9353 case EM_CYGNUS_MN10300:
9354 case EM_MN10300:
9355 return reloc_type == 1; /* R_MN10300_32. */
9356 case EM_MOXIE:
9357 return reloc_type == 1; /* R_MOXIE_32. */
9358 case EM_MSP430_OLD:
9359 case EM_MSP430:
9360 return reloc_type == 1; /* R_MSP43_32. */
9361 case EM_MT:
9362 return reloc_type == 2; /* R_MT_32. */
9363 case EM_ALTERA_NIOS2:
9364 case EM_NIOS32:
9365 return reloc_type == 1; /* R_NIOS_32. */
9366 case EM_OPENRISC:
9367 case EM_OR32:
9368 return reloc_type == 1; /* R_OR32_32. */
9369 case EM_PARISC:
9370 return (reloc_type == 1 /* R_PARISC_DIR32. */
9371 || reloc_type == 41); /* R_PARISC_SECREL32. */
9372 case EM_PJ:
9373 case EM_PJ_OLD:
9374 return reloc_type == 1; /* R_PJ_DATA_DIR32. */
9375 case EM_PPC64:
9376 return reloc_type == 1; /* R_PPC64_ADDR32. */
9377 case EM_PPC:
9378 return reloc_type == 1; /* R_PPC_ADDR32. */
9379 case EM_RX:
9380 return reloc_type == 1; /* R_RX_DIR32. */
9381 case EM_S370:
9382 return reloc_type == 1; /* R_I370_ADDR31. */
9383 case EM_S390_OLD:
9384 case EM_S390:
9385 return reloc_type == 4; /* R_S390_32. */
9386 case EM_SCORE:
9387 return reloc_type == 8; /* R_SCORE_ABS32. */
9388 case EM_SH:
9389 return reloc_type == 1; /* R_SH_DIR32. */
9390 case EM_SPARC32PLUS:
9391 case EM_SPARCV9:
9392 case EM_SPARC:
9393 return reloc_type == 3 /* R_SPARC_32. */
9394 || reloc_type == 23; /* R_SPARC_UA32. */
9395 case EM_SPU:
9396 return reloc_type == 6; /* R_SPU_ADDR32 */
9397 case EM_TI_C6000:
9398 return reloc_type == 1; /* R_C6000_ABS32. */
9399 case EM_CYGNUS_V850:
9400 case EM_V850:
9401 return reloc_type == 6; /* R_V850_ABS32. */
9402 case EM_VAX:
9403 return reloc_type == 1; /* R_VAX_32. */
9404 case EM_X86_64:
9405 case EM_L1OM:
9406 return reloc_type == 10; /* R_X86_64_32. */
9407 case EM_XC16X:
9408 case EM_C166:
9409 return reloc_type == 3; /* R_XC16C_ABS_32. */
9410 case EM_XSTORMY16:
9411 return reloc_type == 1; /* R_XSTROMY16_32. */
9412 case EM_XTENSA_OLD:
9413 case EM_XTENSA:
9414 return reloc_type == 1; /* R_XTENSA_32. */
9415 default:
9416 error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
9417 elf_header.e_machine);
9418 abort ();
9422 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
9423 a 32-bit pc-relative RELA relocation used in DWARF debug sections. */
9425 static bfd_boolean
9426 is_32bit_pcrel_reloc (unsigned int reloc_type)
9428 switch (elf_header.e_machine)
9430 case EM_386:
9431 case EM_486:
9432 return reloc_type == 2; /* R_386_PC32. */
9433 case EM_68K:
9434 return reloc_type == 4; /* R_68K_PC32. */
9435 case EM_ALPHA:
9436 return reloc_type == 10; /* R_ALPHA_SREL32. */
9437 case EM_ARM:
9438 return reloc_type == 3; /* R_ARM_REL32 */
9439 case EM_MICROBLAZE:
9440 return reloc_type == 2; /* R_MICROBLAZE_32_PCREL. */
9441 case EM_PARISC:
9442 return reloc_type == 9; /* R_PARISC_PCREL32. */
9443 case EM_PPC:
9444 return reloc_type == 26; /* R_PPC_REL32. */
9445 case EM_PPC64:
9446 return reloc_type == 26; /* R_PPC64_REL32. */
9447 case EM_S390_OLD:
9448 case EM_S390:
9449 return reloc_type == 5; /* R_390_PC32. */
9450 case EM_SH:
9451 return reloc_type == 2; /* R_SH_REL32. */
9452 case EM_SPARC32PLUS:
9453 case EM_SPARCV9:
9454 case EM_SPARC:
9455 return reloc_type == 6; /* R_SPARC_DISP32. */
9456 case EM_SPU:
9457 return reloc_type == 13; /* R_SPU_REL32. */
9458 case EM_X86_64:
9459 case EM_L1OM:
9460 return reloc_type == 2; /* R_X86_64_PC32. */
9461 case EM_XTENSA_OLD:
9462 case EM_XTENSA:
9463 return reloc_type == 14; /* R_XTENSA_32_PCREL. */
9464 default:
9465 /* Do not abort or issue an error message here. Not all targets use
9466 pc-relative 32-bit relocs in their DWARF debug information and we
9467 have already tested for target coverage in is_32bit_abs_reloc. A
9468 more helpful warning message will be generated by apply_relocations
9469 anyway, so just return. */
9470 return FALSE;
9474 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
9475 a 64-bit absolute RELA relocation used in DWARF debug sections. */
9477 static bfd_boolean
9478 is_64bit_abs_reloc (unsigned int reloc_type)
9480 switch (elf_header.e_machine)
9482 case EM_ALPHA:
9483 return reloc_type == 2; /* R_ALPHA_REFQUAD. */
9484 case EM_IA_64:
9485 return reloc_type == 0x27; /* R_IA64_DIR64LSB. */
9486 case EM_PARISC:
9487 return reloc_type == 80; /* R_PARISC_DIR64. */
9488 case EM_PPC64:
9489 return reloc_type == 38; /* R_PPC64_ADDR64. */
9490 case EM_SPARC32PLUS:
9491 case EM_SPARCV9:
9492 case EM_SPARC:
9493 return reloc_type == 54; /* R_SPARC_UA64. */
9494 case EM_X86_64:
9495 case EM_L1OM:
9496 return reloc_type == 1; /* R_X86_64_64. */
9497 case EM_S390_OLD:
9498 case EM_S390:
9499 return reloc_type == 22; /* R_S390_64 */
9500 case EM_MIPS:
9501 return reloc_type == 18; /* R_MIPS_64 */
9502 default:
9503 return FALSE;
9507 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
9508 a 64-bit pc-relative RELA relocation used in DWARF debug sections. */
9510 static bfd_boolean
9511 is_64bit_pcrel_reloc (unsigned int reloc_type)
9513 switch (elf_header.e_machine)
9515 case EM_ALPHA:
9516 return reloc_type == 11; /* R_ALPHA_SREL64 */
9517 case EM_IA_64:
9518 return reloc_type == 0x4f; /* R_IA64_PCREL64LSB */
9519 case EM_PARISC:
9520 return reloc_type == 72; /* R_PARISC_PCREL64 */
9521 case EM_PPC64:
9522 return reloc_type == 44; /* R_PPC64_REL64 */
9523 case EM_SPARC32PLUS:
9524 case EM_SPARCV9:
9525 case EM_SPARC:
9526 return reloc_type == 46; /* R_SPARC_DISP64 */
9527 case EM_X86_64:
9528 case EM_L1OM:
9529 return reloc_type == 24; /* R_X86_64_PC64 */
9530 case EM_S390_OLD:
9531 case EM_S390:
9532 return reloc_type == 23; /* R_S390_PC64 */
9533 default:
9534 return FALSE;
9538 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
9539 a 24-bit absolute RELA relocation used in DWARF debug sections. */
9541 static bfd_boolean
9542 is_24bit_abs_reloc (unsigned int reloc_type)
9544 switch (elf_header.e_machine)
9546 case EM_CYGNUS_MN10200:
9547 case EM_MN10200:
9548 return reloc_type == 4; /* R_MN10200_24. */
9549 default:
9550 return FALSE;
9554 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
9555 a 16-bit absolute RELA relocation used in DWARF debug sections. */
9557 static bfd_boolean
9558 is_16bit_abs_reloc (unsigned int reloc_type)
9560 switch (elf_header.e_machine)
9562 case EM_AVR_OLD:
9563 case EM_AVR:
9564 return reloc_type == 4; /* R_AVR_16. */
9565 case EM_CYGNUS_D10V:
9566 case EM_D10V:
9567 return reloc_type == 3; /* R_D10V_16. */
9568 case EM_H8S:
9569 case EM_H8_300:
9570 case EM_H8_300H:
9571 return reloc_type == R_H8_DIR16;
9572 case EM_IP2K_OLD:
9573 case EM_IP2K:
9574 return reloc_type == 1; /* R_IP2K_16. */
9575 case EM_M32C_OLD:
9576 case EM_M32C:
9577 return reloc_type == 1; /* R_M32C_16 */
9578 case EM_MSP430_OLD:
9579 case EM_MSP430:
9580 return reloc_type == 5; /* R_MSP430_16_BYTE. */
9581 case EM_ALTERA_NIOS2:
9582 case EM_NIOS32:
9583 return reloc_type == 9; /* R_NIOS_16. */
9584 case EM_TI_C6000:
9585 return reloc_type == 2; /* R_C6000_ABS16. */
9586 case EM_XC16X:
9587 case EM_C166:
9588 return reloc_type == 2; /* R_XC16C_ABS_16. */
9589 default:
9590 return FALSE;
9594 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
9595 relocation entries (possibly formerly used for SHT_GROUP sections). */
9597 static bfd_boolean
9598 is_none_reloc (unsigned int reloc_type)
9600 switch (elf_header.e_machine)
9602 case EM_68K: /* R_68K_NONE. */
9603 case EM_386: /* R_386_NONE. */
9604 case EM_SPARC32PLUS:
9605 case EM_SPARCV9:
9606 case EM_SPARC: /* R_SPARC_NONE. */
9607 case EM_MIPS: /* R_MIPS_NONE. */
9608 case EM_PARISC: /* R_PARISC_NONE. */
9609 case EM_ALPHA: /* R_ALPHA_NONE. */
9610 case EM_PPC: /* R_PPC_NONE. */
9611 case EM_PPC64: /* R_PPC64_NONE. */
9612 case EM_ARM: /* R_ARM_NONE. */
9613 case EM_IA_64: /* R_IA64_NONE. */
9614 case EM_SH: /* R_SH_NONE. */
9615 case EM_S390_OLD:
9616 case EM_S390: /* R_390_NONE. */
9617 case EM_CRIS: /* R_CRIS_NONE. */
9618 case EM_X86_64: /* R_X86_64_NONE. */
9619 case EM_L1OM: /* R_X86_64_NONE. */
9620 case EM_MN10300: /* R_MN10300_NONE. */
9621 case EM_MOXIE: /* R_MOXIE_NONE. */
9622 case EM_M32R: /* R_M32R_NONE. */
9623 case EM_TI_C6000:/* R_C6000_NONE. */
9624 case EM_XC16X:
9625 case EM_C166: /* R_XC16X_NONE. */
9626 return reloc_type == 0;
9627 case EM_XTENSA_OLD:
9628 case EM_XTENSA:
9629 return (reloc_type == 0 /* R_XTENSA_NONE. */
9630 || reloc_type == 17 /* R_XTENSA_DIFF8. */
9631 || reloc_type == 18 /* R_XTENSA_DIFF16. */
9632 || reloc_type == 19 /* R_XTENSA_DIFF32. */);
9634 return FALSE;
9637 /* Apply relocations to a section.
9638 Note: So far support has been added only for those relocations
9639 which can be found in debug sections.
9640 FIXME: Add support for more relocations ? */
9642 static void
9643 apply_relocations (void * file,
9644 Elf_Internal_Shdr * section,
9645 unsigned char * start)
9647 Elf_Internal_Shdr * relsec;
9648 unsigned char * end = start + section->sh_size;
9650 if (elf_header.e_type != ET_REL)
9651 return;
9653 /* Find the reloc section associated with the section. */
9654 for (relsec = section_headers;
9655 relsec < section_headers + elf_header.e_shnum;
9656 ++relsec)
9658 bfd_boolean is_rela;
9659 unsigned long num_relocs;
9660 Elf_Internal_Rela * relocs;
9661 Elf_Internal_Rela * rp;
9662 Elf_Internal_Shdr * symsec;
9663 Elf_Internal_Sym * symtab;
9664 Elf_Internal_Sym * sym;
9666 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
9667 || relsec->sh_info >= elf_header.e_shnum
9668 || section_headers + relsec->sh_info != section
9669 || relsec->sh_size == 0
9670 || relsec->sh_link >= elf_header.e_shnum)
9671 continue;
9673 is_rela = relsec->sh_type == SHT_RELA;
9675 if (is_rela)
9677 if (!slurp_rela_relocs ((FILE *) file, relsec->sh_offset,
9678 relsec->sh_size, & relocs, & num_relocs))
9679 return;
9681 else
9683 if (!slurp_rel_relocs ((FILE *) file, relsec->sh_offset,
9684 relsec->sh_size, & relocs, & num_relocs))
9685 return;
9688 /* SH uses RELA but uses in place value instead of the addend field. */
9689 if (elf_header.e_machine == EM_SH)
9690 is_rela = FALSE;
9692 symsec = section_headers + relsec->sh_link;
9693 symtab = GET_ELF_SYMBOLS ((FILE *) file, symsec);
9695 for (rp = relocs; rp < relocs + num_relocs; ++rp)
9697 bfd_vma addend;
9698 unsigned int reloc_type;
9699 unsigned int reloc_size;
9700 unsigned char * rloc;
9702 reloc_type = get_reloc_type (rp->r_info);
9704 if (target_specific_reloc_handling (rp, start, symtab))
9705 continue;
9706 else if (is_none_reloc (reloc_type))
9707 continue;
9708 else if (is_32bit_abs_reloc (reloc_type)
9709 || is_32bit_pcrel_reloc (reloc_type))
9710 reloc_size = 4;
9711 else if (is_64bit_abs_reloc (reloc_type)
9712 || is_64bit_pcrel_reloc (reloc_type))
9713 reloc_size = 8;
9714 else if (is_24bit_abs_reloc (reloc_type))
9715 reloc_size = 3;
9716 else if (is_16bit_abs_reloc (reloc_type))
9717 reloc_size = 2;
9718 else
9720 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
9721 reloc_type, SECTION_NAME (section));
9722 continue;
9725 rloc = start + rp->r_offset;
9726 if ((rloc + reloc_size) > end)
9728 warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
9729 (unsigned long) rp->r_offset,
9730 SECTION_NAME (section));
9731 continue;
9734 sym = symtab + get_reloc_symindex (rp->r_info);
9736 /* If the reloc has a symbol associated with it,
9737 make sure that it is of an appropriate type.
9739 Relocations against symbols without type can happen.
9740 Gcc -feliminate-dwarf2-dups may generate symbols
9741 without type for debug info.
9743 Icc generates relocations against function symbols
9744 instead of local labels.
9746 Relocations against object symbols can happen, eg when
9747 referencing a global array. For an example of this see
9748 the _clz.o binary in libgcc.a. */
9749 if (sym != symtab
9750 && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
9752 warn (_("skipping unexpected symbol type %s in %ld'th relocation in section %s\n"),
9753 get_symbol_type (ELF_ST_TYPE (sym->st_info)),
9754 (long int)(rp - relocs),
9755 SECTION_NAME (relsec));
9756 continue;
9759 addend = 0;
9760 if (is_rela)
9761 addend += rp->r_addend;
9762 /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
9763 partial_inplace. */
9764 if (!is_rela
9765 || (elf_header.e_machine == EM_XTENSA
9766 && reloc_type == 1)
9767 || ((elf_header.e_machine == EM_PJ
9768 || elf_header.e_machine == EM_PJ_OLD)
9769 && reloc_type == 1)
9770 || ((elf_header.e_machine == EM_D30V
9771 || elf_header.e_machine == EM_CYGNUS_D30V)
9772 && reloc_type == 12))
9773 addend += byte_get (rloc, reloc_size);
9775 if (is_32bit_pcrel_reloc (reloc_type)
9776 || is_64bit_pcrel_reloc (reloc_type))
9778 /* On HPPA, all pc-relative relocations are biased by 8. */
9779 if (elf_header.e_machine == EM_PARISC)
9780 addend -= 8;
9781 byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
9782 reloc_size);
9784 else
9785 byte_put (rloc, addend + sym->st_value, reloc_size);
9788 free (symtab);
9789 free (relocs);
9790 break;
9794 #ifdef SUPPORT_DISASSEMBLY
9795 static int
9796 disassemble_section (Elf_Internal_Shdr * section, FILE * file)
9798 printf (_("\nAssembly dump of section %s\n"),
9799 SECTION_NAME (section));
9801 /* XXX -- to be done --- XXX */
9803 return 1;
9805 #endif
9807 /* Reads in the contents of SECTION from FILE, returning a pointer
9808 to a malloc'ed buffer or NULL if something went wrong. */
9810 static char *
9811 get_section_contents (Elf_Internal_Shdr * section, FILE * file)
9813 bfd_size_type num_bytes;
9815 num_bytes = section->sh_size;
9817 if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
9819 printf (_("\nSection '%s' has no data to dump.\n"),
9820 SECTION_NAME (section));
9821 return NULL;
9824 return (char *) get_data (NULL, file, section->sh_offset, 1, num_bytes,
9825 _("section contents"));
9829 static void
9830 dump_section_as_strings (Elf_Internal_Shdr * section, FILE * file)
9832 Elf_Internal_Shdr * relsec;
9833 bfd_size_type num_bytes;
9834 char * data;
9835 char * end;
9836 char * start;
9837 char * name = SECTION_NAME (section);
9838 bfd_boolean some_strings_shown;
9840 start = get_section_contents (section, file);
9841 if (start == NULL)
9842 return;
9844 printf (_("\nString dump of section '%s':\n"), name);
9846 /* If the section being dumped has relocations against it the user might
9847 be expecting these relocations to have been applied. Check for this
9848 case and issue a warning message in order to avoid confusion.
9849 FIXME: Maybe we ought to have an option that dumps a section with
9850 relocs applied ? */
9851 for (relsec = section_headers;
9852 relsec < section_headers + elf_header.e_shnum;
9853 ++relsec)
9855 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
9856 || relsec->sh_info >= elf_header.e_shnum
9857 || section_headers + relsec->sh_info != section
9858 || relsec->sh_size == 0
9859 || relsec->sh_link >= elf_header.e_shnum)
9860 continue;
9862 printf (_(" Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
9863 break;
9866 num_bytes = section->sh_size;
9867 data = start;
9868 end = start + num_bytes;
9869 some_strings_shown = FALSE;
9871 while (data < end)
9873 while (!ISPRINT (* data))
9874 if (++ data >= end)
9875 break;
9877 if (data < end)
9879 #ifndef __MSVCRT__
9880 /* PR 11128: Use two separate invocations in order to work
9881 around bugs in the Solaris 8 implementation of printf. */
9882 printf (" [%6tx] ", data - start);
9883 printf ("%s\n", data);
9884 #else
9885 printf (" [%6Ix] %s\n", (size_t) (data - start), data);
9886 #endif
9887 data += strlen (data);
9888 some_strings_shown = TRUE;
9892 if (! some_strings_shown)
9893 printf (_(" No strings found in this section."));
9895 free (start);
9897 putchar ('\n');
9900 static void
9901 dump_section_as_bytes (Elf_Internal_Shdr * section,
9902 FILE * file,
9903 bfd_boolean relocate)
9905 Elf_Internal_Shdr * relsec;
9906 bfd_size_type bytes;
9907 bfd_vma addr;
9908 unsigned char * data;
9909 unsigned char * start;
9911 start = (unsigned char *) get_section_contents (section, file);
9912 if (start == NULL)
9913 return;
9915 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section));
9917 if (relocate)
9919 apply_relocations (file, section, start);
9921 else
9923 /* If the section being dumped has relocations against it the user might
9924 be expecting these relocations to have been applied. Check for this
9925 case and issue a warning message in order to avoid confusion.
9926 FIXME: Maybe we ought to have an option that dumps a section with
9927 relocs applied ? */
9928 for (relsec = section_headers;
9929 relsec < section_headers + elf_header.e_shnum;
9930 ++relsec)
9932 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
9933 || relsec->sh_info >= elf_header.e_shnum
9934 || section_headers + relsec->sh_info != section
9935 || relsec->sh_size == 0
9936 || relsec->sh_link >= elf_header.e_shnum)
9937 continue;
9939 printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
9940 break;
9944 addr = section->sh_addr;
9945 bytes = section->sh_size;
9946 data = start;
9948 while (bytes)
9950 int j;
9951 int k;
9952 int lbytes;
9954 lbytes = (bytes > 16 ? 16 : bytes);
9956 printf (" 0x%8.8lx ", (unsigned long) addr);
9958 for (j = 0; j < 16; j++)
9960 if (j < lbytes)
9961 printf ("%2.2x", data[j]);
9962 else
9963 printf (" ");
9965 if ((j & 3) == 3)
9966 printf (" ");
9969 for (j = 0; j < lbytes; j++)
9971 k = data[j];
9972 if (k >= ' ' && k < 0x7f)
9973 printf ("%c", k);
9974 else
9975 printf (".");
9978 putchar ('\n');
9980 data += lbytes;
9981 addr += lbytes;
9982 bytes -= lbytes;
9985 free (start);
9987 putchar ('\n');
9990 /* Uncompresses a section that was compressed using zlib, in place. */
9992 static int
9993 uncompress_section_contents (unsigned char **buffer ATTRIBUTE_UNUSED,
9994 dwarf_size_type *size ATTRIBUTE_UNUSED)
9996 #ifndef HAVE_ZLIB_H
9997 return FALSE;
9998 #else
9999 dwarf_size_type compressed_size = *size;
10000 unsigned char * compressed_buffer = *buffer;
10001 dwarf_size_type uncompressed_size;
10002 unsigned char * uncompressed_buffer;
10003 z_stream strm;
10004 int rc;
10005 dwarf_size_type header_size = 12;
10007 /* Read the zlib header. In this case, it should be "ZLIB" followed
10008 by the uncompressed section size, 8 bytes in big-endian order. */
10009 if (compressed_size < header_size
10010 || ! streq ((char *) compressed_buffer, "ZLIB"))
10011 return 0;
10013 uncompressed_size = compressed_buffer[4]; uncompressed_size <<= 8;
10014 uncompressed_size += compressed_buffer[5]; uncompressed_size <<= 8;
10015 uncompressed_size += compressed_buffer[6]; uncompressed_size <<= 8;
10016 uncompressed_size += compressed_buffer[7]; uncompressed_size <<= 8;
10017 uncompressed_size += compressed_buffer[8]; uncompressed_size <<= 8;
10018 uncompressed_size += compressed_buffer[9]; uncompressed_size <<= 8;
10019 uncompressed_size += compressed_buffer[10]; uncompressed_size <<= 8;
10020 uncompressed_size += compressed_buffer[11];
10022 /* It is possible the section consists of several compressed
10023 buffers concatenated together, so we uncompress in a loop. */
10024 strm.zalloc = NULL;
10025 strm.zfree = NULL;
10026 strm.opaque = NULL;
10027 strm.avail_in = compressed_size - header_size;
10028 strm.next_in = (Bytef *) compressed_buffer + header_size;
10029 strm.avail_out = uncompressed_size;
10030 uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
10032 rc = inflateInit (& strm);
10033 while (strm.avail_in > 0)
10035 if (rc != Z_OK)
10036 goto fail;
10037 strm.next_out = ((Bytef *) uncompressed_buffer
10038 + (uncompressed_size - strm.avail_out));
10039 rc = inflate (&strm, Z_FINISH);
10040 if (rc != Z_STREAM_END)
10041 goto fail;
10042 rc = inflateReset (& strm);
10044 rc = inflateEnd (& strm);
10045 if (rc != Z_OK
10046 || strm.avail_out != 0)
10047 goto fail;
10049 free (compressed_buffer);
10050 *buffer = uncompressed_buffer;
10051 *size = uncompressed_size;
10052 return 1;
10054 fail:
10055 free (uncompressed_buffer);
10056 /* Indicate decompression failure. */
10057 *buffer = NULL;
10058 return 0;
10059 #endif /* HAVE_ZLIB_H */
10062 static int
10063 load_specific_debug_section (enum dwarf_section_display_enum debug,
10064 Elf_Internal_Shdr * sec, void * file)
10066 struct dwarf_section * section = &debug_displays [debug].section;
10067 char buf [64];
10069 /* If it is already loaded, do nothing. */
10070 if (section->start != NULL)
10071 return 1;
10073 snprintf (buf, sizeof (buf), _("%s section data"), section->name);
10074 section->address = sec->sh_addr;
10075 section->size = sec->sh_size;
10076 section->start = (unsigned char *) get_data (NULL, (FILE *) file,
10077 sec->sh_offset, 1,
10078 sec->sh_size, buf);
10079 if (uncompress_section_contents (&section->start, &section->size))
10080 sec->sh_size = section->size;
10082 if (section->start == NULL)
10083 return 0;
10085 if (debug_displays [debug].relocate)
10086 apply_relocations ((FILE *) file, sec, section->start);
10088 return 1;
10092 load_debug_section (enum dwarf_section_display_enum debug, void * file)
10094 struct dwarf_section * section = &debug_displays [debug].section;
10095 Elf_Internal_Shdr * sec;
10097 /* Locate the debug section. */
10098 sec = find_section (section->uncompressed_name);
10099 if (sec != NULL)
10100 section->name = section->uncompressed_name;
10101 else
10103 sec = find_section (section->compressed_name);
10104 if (sec != NULL)
10105 section->name = section->compressed_name;
10107 if (sec == NULL)
10108 return 0;
10110 return load_specific_debug_section (debug, sec, (FILE *) file);
10113 void
10114 free_debug_section (enum dwarf_section_display_enum debug)
10116 struct dwarf_section * section = &debug_displays [debug].section;
10118 if (section->start == NULL)
10119 return;
10121 free ((char *) section->start);
10122 section->start = NULL;
10123 section->address = 0;
10124 section->size = 0;
10127 static int
10128 display_debug_section (Elf_Internal_Shdr * section, FILE * file)
10130 char * name = SECTION_NAME (section);
10131 bfd_size_type length;
10132 int result = 1;
10133 int i;
10135 length = section->sh_size;
10136 if (length == 0)
10138 printf (_("\nSection '%s' has no debugging data.\n"), name);
10139 return 0;
10141 if (section->sh_type == SHT_NOBITS)
10143 /* There is no point in dumping the contents of a debugging section
10144 which has the NOBITS type - the bits in the file will be random.
10145 This can happen when a file containing a .eh_frame section is
10146 stripped with the --only-keep-debug command line option. */
10147 printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"), name);
10148 return 0;
10151 if (const_strneq (name, ".gnu.linkonce.wi."))
10152 name = ".debug_info";
10154 /* See if we know how to display the contents of this section. */
10155 for (i = 0; i < max; i++)
10156 if (streq (debug_displays[i].section.uncompressed_name, name)
10157 || streq (debug_displays[i].section.compressed_name, name))
10159 struct dwarf_section * sec = &debug_displays [i].section;
10160 int secondary = (section != find_section (name));
10162 if (secondary)
10163 free_debug_section ((enum dwarf_section_display_enum) i);
10165 if (streq (sec->uncompressed_name, name))
10166 sec->name = sec->uncompressed_name;
10167 else
10168 sec->name = sec->compressed_name;
10169 if (load_specific_debug_section ((enum dwarf_section_display_enum) i,
10170 section, file))
10172 result &= debug_displays[i].display (sec, file);
10174 if (secondary || (i != info && i != abbrev))
10175 free_debug_section ((enum dwarf_section_display_enum) i);
10178 break;
10181 if (i == max)
10183 printf (_("Unrecognized debug section: %s\n"), name);
10184 result = 0;
10187 return result;
10190 /* Set DUMP_SECTS for all sections where dumps were requested
10191 based on section name. */
10193 static void
10194 initialise_dumps_byname (void)
10196 struct dump_list_entry * cur;
10198 for (cur = dump_sects_byname; cur; cur = cur->next)
10200 unsigned int i;
10201 int any;
10203 for (i = 0, any = 0; i < elf_header.e_shnum; i++)
10204 if (streq (SECTION_NAME (section_headers + i), cur->name))
10206 request_dump_bynumber (i, cur->type);
10207 any = 1;
10210 if (!any)
10211 warn (_("Section '%s' was not dumped because it does not exist!\n"),
10212 cur->name);
10216 static void
10217 process_section_contents (FILE * file)
10219 Elf_Internal_Shdr * section;
10220 unsigned int i;
10222 if (! do_dump)
10223 return;
10225 initialise_dumps_byname ();
10227 for (i = 0, section = section_headers;
10228 i < elf_header.e_shnum && i < num_dump_sects;
10229 i++, section++)
10231 #ifdef SUPPORT_DISASSEMBLY
10232 if (dump_sects[i] & DISASS_DUMP)
10233 disassemble_section (section, file);
10234 #endif
10235 if (dump_sects[i] & HEX_DUMP)
10236 dump_section_as_bytes (section, file, FALSE);
10238 if (dump_sects[i] & RELOC_DUMP)
10239 dump_section_as_bytes (section, file, TRUE);
10241 if (dump_sects[i] & STRING_DUMP)
10242 dump_section_as_strings (section, file);
10244 if (dump_sects[i] & DEBUG_DUMP)
10245 display_debug_section (section, file);
10248 /* Check to see if the user requested a
10249 dump of a section that does not exist. */
10250 while (i++ < num_dump_sects)
10251 if (dump_sects[i])
10252 warn (_("Section %d was not dumped because it does not exist!\n"), i);
10255 static void
10256 process_mips_fpe_exception (int mask)
10258 if (mask)
10260 int first = 1;
10261 if (mask & OEX_FPU_INEX)
10262 fputs ("INEX", stdout), first = 0;
10263 if (mask & OEX_FPU_UFLO)
10264 printf ("%sUFLO", first ? "" : "|"), first = 0;
10265 if (mask & OEX_FPU_OFLO)
10266 printf ("%sOFLO", first ? "" : "|"), first = 0;
10267 if (mask & OEX_FPU_DIV0)
10268 printf ("%sDIV0", first ? "" : "|"), first = 0;
10269 if (mask & OEX_FPU_INVAL)
10270 printf ("%sINVAL", first ? "" : "|");
10272 else
10273 fputs ("0", stdout);
10276 /* ARM EABI attributes section. */
10277 typedef struct
10279 int tag;
10280 const char * name;
10281 /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup. */
10282 int type;
10283 const char ** table;
10284 } arm_attr_public_tag;
10286 static const char * arm_attr_tag_CPU_arch[] =
10287 {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
10288 "v6K", "v7", "v6-M", "v6S-M", "v7E-M"};
10289 static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
10290 static const char * arm_attr_tag_THUMB_ISA_use[] =
10291 {"No", "Thumb-1", "Thumb-2"};
10292 static const char * arm_attr_tag_FP_arch[] =
10293 {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16"};
10294 static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
10295 static const char * arm_attr_tag_Advanced_SIMD_arch[] =
10296 {"No", "NEONv1", "NEONv1 with Fused-MAC"};
10297 static const char * arm_attr_tag_PCS_config[] =
10298 {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
10299 "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
10300 static const char * arm_attr_tag_ABI_PCS_R9_use[] =
10301 {"V6", "SB", "TLS", "Unused"};
10302 static const char * arm_attr_tag_ABI_PCS_RW_data[] =
10303 {"Absolute", "PC-relative", "SB-relative", "None"};
10304 static const char * arm_attr_tag_ABI_PCS_RO_data[] =
10305 {"Absolute", "PC-relative", "None"};
10306 static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
10307 {"None", "direct", "GOT-indirect"};
10308 static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
10309 {"None", "??? 1", "2", "??? 3", "4"};
10310 static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
10311 static const char * arm_attr_tag_ABI_FP_denormal[] =
10312 {"Unused", "Needed", "Sign only"};
10313 static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
10314 static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
10315 static const char * arm_attr_tag_ABI_FP_number_model[] =
10316 {"Unused", "Finite", "RTABI", "IEEE 754"};
10317 static const char * arm_attr_tag_ABI_enum_size[] =
10318 {"Unused", "small", "int", "forced to int"};
10319 static const char * arm_attr_tag_ABI_HardFP_use[] =
10320 {"As Tag_FP_arch", "SP only", "DP only", "SP and DP"};
10321 static const char * arm_attr_tag_ABI_VFP_args[] =
10322 {"AAPCS", "VFP registers", "custom"};
10323 static const char * arm_attr_tag_ABI_WMMX_args[] =
10324 {"AAPCS", "WMMX registers", "custom"};
10325 static const char * arm_attr_tag_ABI_optimization_goals[] =
10326 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
10327 "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
10328 static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
10329 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
10330 "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
10331 static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
10332 static const char * arm_attr_tag_FP_HP_extension[] =
10333 {"Not Allowed", "Allowed"};
10334 static const char * arm_attr_tag_ABI_FP_16bit_format[] =
10335 {"None", "IEEE 754", "Alternative Format"};
10336 static const char * arm_attr_tag_MPextension_use[] =
10337 {"Not Allowed", "Allowed"};
10338 static const char * arm_attr_tag_DIV_use[] =
10339 {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
10340 "Allowed in v7-A with integer division extension"};
10341 static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
10342 static const char * arm_attr_tag_Virtualization_use[] =
10343 {"Not Allowed", "TrustZone", "Virtualization Extensions",
10344 "TrustZone and Virtualization Extensions"};
10345 static const char * arm_attr_tag_MPextension_use_legacy[] =
10346 {"Not Allowed", "Allowed"};
10348 #define LOOKUP(id, name) \
10349 {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
10350 static arm_attr_public_tag arm_attr_public_tags[] =
10352 {4, "CPU_raw_name", 1, NULL},
10353 {5, "CPU_name", 1, NULL},
10354 LOOKUP(6, CPU_arch),
10355 {7, "CPU_arch_profile", 0, NULL},
10356 LOOKUP(8, ARM_ISA_use),
10357 LOOKUP(9, THUMB_ISA_use),
10358 LOOKUP(10, FP_arch),
10359 LOOKUP(11, WMMX_arch),
10360 LOOKUP(12, Advanced_SIMD_arch),
10361 LOOKUP(13, PCS_config),
10362 LOOKUP(14, ABI_PCS_R9_use),
10363 LOOKUP(15, ABI_PCS_RW_data),
10364 LOOKUP(16, ABI_PCS_RO_data),
10365 LOOKUP(17, ABI_PCS_GOT_use),
10366 LOOKUP(18, ABI_PCS_wchar_t),
10367 LOOKUP(19, ABI_FP_rounding),
10368 LOOKUP(20, ABI_FP_denormal),
10369 LOOKUP(21, ABI_FP_exceptions),
10370 LOOKUP(22, ABI_FP_user_exceptions),
10371 LOOKUP(23, ABI_FP_number_model),
10372 {24, "ABI_align_needed", 0, NULL},
10373 {25, "ABI_align_preserved", 0, NULL},
10374 LOOKUP(26, ABI_enum_size),
10375 LOOKUP(27, ABI_HardFP_use),
10376 LOOKUP(28, ABI_VFP_args),
10377 LOOKUP(29, ABI_WMMX_args),
10378 LOOKUP(30, ABI_optimization_goals),
10379 LOOKUP(31, ABI_FP_optimization_goals),
10380 {32, "compatibility", 0, NULL},
10381 LOOKUP(34, CPU_unaligned_access),
10382 LOOKUP(36, FP_HP_extension),
10383 LOOKUP(38, ABI_FP_16bit_format),
10384 LOOKUP(42, MPextension_use),
10385 LOOKUP(44, DIV_use),
10386 {64, "nodefaults", 0, NULL},
10387 {65, "also_compatible_with", 0, NULL},
10388 LOOKUP(66, T2EE_use),
10389 {67, "conformance", 1, NULL},
10390 LOOKUP(68, Virtualization_use),
10391 LOOKUP(70, MPextension_use_legacy)
10393 #undef LOOKUP
10395 static unsigned char *
10396 display_arm_attribute (unsigned char * p)
10398 int tag;
10399 unsigned int len;
10400 int val;
10401 arm_attr_public_tag * attr;
10402 unsigned i;
10403 int type;
10405 tag = read_uleb128 (p, &len);
10406 p += len;
10407 attr = NULL;
10408 for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
10410 if (arm_attr_public_tags[i].tag == tag)
10412 attr = &arm_attr_public_tags[i];
10413 break;
10417 if (attr)
10419 printf (" Tag_%s: ", attr->name);
10420 switch (attr->type)
10422 case 0:
10423 switch (tag)
10425 case 7: /* Tag_CPU_arch_profile. */
10426 val = read_uleb128 (p, &len);
10427 p += len;
10428 switch (val)
10430 case 0: printf (_("None\n")); break;
10431 case 'A': printf (_("Application\n")); break;
10432 case 'R': printf (_("Realtime\n")); break;
10433 case 'M': printf (_("Microcontroller\n")); break;
10434 case 'S': printf (_("Application or Realtime\n")); break;
10435 default: printf ("??? (%d)\n", val); break;
10437 break;
10439 case 24: /* Tag_align_needed. */
10440 val = read_uleb128 (p, &len);
10441 p += len;
10442 switch (val)
10444 case 0: printf (_("None\n")); break;
10445 case 1: printf (_("8-byte\n")); break;
10446 case 2: printf (_("4-byte\n")); break;
10447 case 3: printf ("??? 3\n"); break;
10448 default:
10449 if (val <= 12)
10450 printf (_("8-byte and up to %d-byte extended\n"),
10451 1 << val);
10452 else
10453 printf ("??? (%d)\n", val);
10454 break;
10456 break;
10458 case 25: /* Tag_align_preserved. */
10459 val = read_uleb128 (p, &len);
10460 p += len;
10461 switch (val)
10463 case 0: printf (_("None\n")); break;
10464 case 1: printf (_("8-byte, except leaf SP\n")); break;
10465 case 2: printf (_("8-byte\n")); break;
10466 case 3: printf ("??? 3\n"); break;
10467 default:
10468 if (val <= 12)
10469 printf (_("8-byte and up to %d-byte extended\n"),
10470 1 << val);
10471 else
10472 printf ("??? (%d)\n", val);
10473 break;
10475 break;
10477 case 32: /* Tag_compatibility. */
10478 val = read_uleb128 (p, &len);
10479 p += len;
10480 printf (_("flag = %d, vendor = %s\n"), val, p);
10481 p += strlen ((char *) p) + 1;
10482 break;
10484 case 64: /* Tag_nodefaults. */
10485 p++;
10486 printf (_("True\n"));
10487 break;
10489 case 65: /* Tag_also_compatible_with. */
10490 val = read_uleb128 (p, &len);
10491 p += len;
10492 if (val == 6 /* Tag_CPU_arch. */)
10494 val = read_uleb128 (p, &len);
10495 p += len;
10496 if ((unsigned int)val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
10497 printf ("??? (%d)\n", val);
10498 else
10499 printf ("%s\n", arm_attr_tag_CPU_arch[val]);
10501 else
10502 printf ("???\n");
10503 while (*(p++) != '\0' /* NUL terminator. */);
10504 break;
10506 default:
10507 abort ();
10509 return p;
10511 case 1:
10512 case 2:
10513 type = attr->type;
10514 break;
10516 default:
10517 assert (attr->type & 0x80);
10518 val = read_uleb128 (p, &len);
10519 p += len;
10520 type = attr->type & 0x7f;
10521 if (val >= type)
10522 printf ("??? (%d)\n", val);
10523 else
10524 printf ("%s\n", attr->table[val]);
10525 return p;
10528 else
10530 if (tag & 1)
10531 type = 1; /* String. */
10532 else
10533 type = 2; /* uleb128. */
10534 printf (" Tag_unknown_%d: ", tag);
10537 if (type == 1)
10539 printf ("\"%s\"\n", p);
10540 p += strlen ((char *) p) + 1;
10542 else
10544 val = read_uleb128 (p, &len);
10545 p += len;
10546 printf ("%d (0x%x)\n", val, val);
10549 return p;
10552 static unsigned char *
10553 display_gnu_attribute (unsigned char * p,
10554 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int))
10556 int tag;
10557 unsigned int len;
10558 int val;
10559 int type;
10561 tag = read_uleb128 (p, &len);
10562 p += len;
10564 /* Tag_compatibility is the only generic GNU attribute defined at
10565 present. */
10566 if (tag == 32)
10568 val = read_uleb128 (p, &len);
10569 p += len;
10570 printf (_("flag = %d, vendor = %s\n"), val, p);
10571 p += strlen ((char *) p) + 1;
10572 return p;
10575 if ((tag & 2) == 0 && display_proc_gnu_attribute)
10576 return display_proc_gnu_attribute (p, tag);
10578 if (tag & 1)
10579 type = 1; /* String. */
10580 else
10581 type = 2; /* uleb128. */
10582 printf (" Tag_unknown_%d: ", tag);
10584 if (type == 1)
10586 printf ("\"%s\"\n", p);
10587 p += strlen ((char *) p) + 1;
10589 else
10591 val = read_uleb128 (p, &len);
10592 p += len;
10593 printf ("%d (0x%x)\n", val, val);
10596 return p;
10599 static unsigned char *
10600 display_power_gnu_attribute (unsigned char * p, int tag)
10602 int type;
10603 unsigned int len;
10604 int val;
10606 if (tag == Tag_GNU_Power_ABI_FP)
10608 val = read_uleb128 (p, &len);
10609 p += len;
10610 printf (" Tag_GNU_Power_ABI_FP: ");
10612 switch (val)
10614 case 0:
10615 printf (_("Hard or soft float\n"));
10616 break;
10617 case 1:
10618 printf (_("Hard float\n"));
10619 break;
10620 case 2:
10621 printf (_("Soft float\n"));
10622 break;
10623 case 3:
10624 printf (_("Single-precision hard float\n"));
10625 break;
10626 default:
10627 printf ("??? (%d)\n", val);
10628 break;
10630 return p;
10633 if (tag == Tag_GNU_Power_ABI_Vector)
10635 val = read_uleb128 (p, &len);
10636 p += len;
10637 printf (" Tag_GNU_Power_ABI_Vector: ");
10638 switch (val)
10640 case 0:
10641 printf (_("Any\n"));
10642 break;
10643 case 1:
10644 printf (_("Generic\n"));
10645 break;
10646 case 2:
10647 printf ("AltiVec\n");
10648 break;
10649 case 3:
10650 printf ("SPE\n");
10651 break;
10652 default:
10653 printf ("??? (%d)\n", val);
10654 break;
10656 return p;
10659 if (tag == Tag_GNU_Power_ABI_Struct_Return)
10661 val = read_uleb128 (p, &len);
10662 p += len;
10663 printf (" Tag_GNU_Power_ABI_Struct_Return: ");
10664 switch (val)
10666 case 0:
10667 printf (_("Any\n"));
10668 break;
10669 case 1:
10670 printf ("r3/r4\n");
10671 break;
10672 case 2:
10673 printf (_("Memory\n"));
10674 break;
10675 default:
10676 printf ("??? (%d)\n", val);
10677 break;
10679 return p;
10682 if (tag & 1)
10683 type = 1; /* String. */
10684 else
10685 type = 2; /* uleb128. */
10686 printf (" Tag_unknown_%d: ", tag);
10688 if (type == 1)
10690 printf ("\"%s\"\n", p);
10691 p += strlen ((char *) p) + 1;
10693 else
10695 val = read_uleb128 (p, &len);
10696 p += len;
10697 printf ("%d (0x%x)\n", val, val);
10700 return p;
10703 static unsigned char *
10704 display_mips_gnu_attribute (unsigned char * p, int tag)
10706 int type;
10707 unsigned int len;
10708 int val;
10710 if (tag == Tag_GNU_MIPS_ABI_FP)
10712 val = read_uleb128 (p, &len);
10713 p += len;
10714 printf (" Tag_GNU_MIPS_ABI_FP: ");
10716 switch (val)
10718 case 0:
10719 printf (_("Hard or soft float\n"));
10720 break;
10721 case 1:
10722 printf (_("Hard float (double precision)\n"));
10723 break;
10724 case 2:
10725 printf (_("Hard float (single precision)\n"));
10726 break;
10727 case 3:
10728 printf (_("Soft float\n"));
10729 break;
10730 case 4:
10731 printf (_("Hard float (MIPS32r2 64-bit FPU)\n"));
10732 break;
10733 default:
10734 printf ("??? (%d)\n", val);
10735 break;
10737 return p;
10740 if (tag & 1)
10741 type = 1; /* String. */
10742 else
10743 type = 2; /* uleb128. */
10744 printf (" Tag_unknown_%d: ", tag);
10746 if (type == 1)
10748 printf ("\"%s\"\n", p);
10749 p += strlen ((char *) p) + 1;
10751 else
10753 val = read_uleb128 (p, &len);
10754 p += len;
10755 printf ("%d (0x%x)\n", val, val);
10758 return p;
10761 static unsigned char *
10762 display_tic6x_attribute (unsigned char * p)
10764 int tag;
10765 unsigned int len;
10766 int val;
10768 tag = read_uleb128 (p, &len);
10769 p += len;
10771 switch (tag)
10773 case Tag_ISA:
10774 val = read_uleb128 (p, &len);
10775 p += len;
10776 printf (" Tag_ISA: ");
10778 switch (val)
10780 case C6XABI_Tag_ISA_none:
10781 printf (_("None\n"));
10782 break;
10783 case C6XABI_Tag_ISA_C62X:
10784 printf ("C62x\n");
10785 break;
10786 case C6XABI_Tag_ISA_C67X:
10787 printf ("C67x\n");
10788 break;
10789 case C6XABI_Tag_ISA_C67XP:
10790 printf ("C67x+\n");
10791 break;
10792 case C6XABI_Tag_ISA_C64X:
10793 printf ("C64x\n");
10794 break;
10795 case C6XABI_Tag_ISA_C64XP:
10796 printf ("C64x+\n");
10797 break;
10798 case C6XABI_Tag_ISA_C674X:
10799 printf ("C674x\n");
10800 break;
10801 default:
10802 printf ("??? (%d)\n", val);
10803 break;
10805 return p;
10807 case Tag_ABI_wchar_t:
10808 val = read_uleb128 (p, &len);
10809 p += len;
10810 printf (" Tag_ABI_wchar_t: ");
10811 switch (val)
10813 case 0:
10814 printf (_("Not used\n"));
10815 break;
10816 case 1:
10817 printf (_("2 bytes\n"));
10818 break;
10819 case 2:
10820 printf (_("4 bytes\n"));
10821 break;
10822 default:
10823 printf ("??? (%d)\n", val);
10824 break;
10826 return p;
10828 case Tag_ABI_stack_align_needed:
10829 val = read_uleb128 (p, &len);
10830 p += len;
10831 printf (" Tag_ABI_stack_align_needed: ");
10832 switch (val)
10834 case 0:
10835 printf (_("8-byte\n"));
10836 break;
10837 case 1:
10838 printf (_("16-byte\n"));
10839 break;
10840 default:
10841 printf ("??? (%d)\n", val);
10842 break;
10844 return p;
10846 case Tag_ABI_stack_align_preserved:
10847 val = read_uleb128 (p, &len);
10848 p += len;
10849 printf (" Tag_ABI_stack_align_preserved: ");
10850 switch (val)
10852 case 0:
10853 printf (_("8-byte\n"));
10854 break;
10855 case 1:
10856 printf (_("16-byte\n"));
10857 break;
10858 default:
10859 printf ("??? (%d)\n", val);
10860 break;
10862 return p;
10864 case Tag_ABI_DSBT:
10865 val = read_uleb128 (p, &len);
10866 p += len;
10867 printf (" Tag_ABI_DSBT: ");
10868 switch (val)
10870 case 0:
10871 printf (_("DSBT addressing not used\n"));
10872 break;
10873 case 1:
10874 printf (_("DSBT addressing used\n"));
10875 break;
10876 default:
10877 printf ("??? (%d)\n", val);
10878 break;
10880 return p;
10882 case Tag_ABI_PID:
10883 val = read_uleb128 (p, &len);
10884 p += len;
10885 printf (" Tag_ABI_PID: ");
10886 switch (val)
10888 case 0:
10889 printf (_("Data addressing position-dependent\n"));
10890 break;
10891 case 1:
10892 printf (_("Data addressing position-independent, GOT near DP\n"));
10893 break;
10894 case 2:
10895 printf (_("Data addressing position-independent, GOT far from DP\n"));
10896 break;
10897 default:
10898 printf ("??? (%d)\n", val);
10899 break;
10901 return p;
10903 case Tag_ABI_PIC:
10904 val = read_uleb128 (p, &len);
10905 p += len;
10906 printf (" Tag_ABI_PIC: ");
10907 switch (val)
10909 case 0:
10910 printf (_("Code addressing position-dependent\n"));
10911 break;
10912 case 1:
10913 printf (_("Code addressing position-independent\n"));
10914 break;
10915 default:
10916 printf ("??? (%d)\n", val);
10917 break;
10919 return p;
10921 case Tag_ABI_array_object_alignment:
10922 val = read_uleb128 (p, &len);
10923 p += len;
10924 printf (" Tag_ABI_array_object_alignment: ");
10925 switch (val)
10927 case 0:
10928 printf (_("8-byte\n"));
10929 break;
10930 case 1:
10931 printf (_("4-byte\n"));
10932 break;
10933 case 2:
10934 printf (_("16-byte\n"));
10935 break;
10936 default:
10937 printf ("??? (%d)\n", val);
10938 break;
10940 return p;
10942 case Tag_ABI_array_object_align_expected:
10943 val = read_uleb128 (p, &len);
10944 p += len;
10945 printf (" Tag_ABI_array_object_align_expected: ");
10946 switch (val)
10948 case 0:
10949 printf (_("8-byte\n"));
10950 break;
10951 case 1:
10952 printf (_("4-byte\n"));
10953 break;
10954 case 2:
10955 printf (_("16-byte\n"));
10956 break;
10957 default:
10958 printf ("??? (%d)\n", val);
10959 break;
10961 return p;
10963 case Tag_ABI_compatibility:
10964 val = read_uleb128 (p, &len);
10965 p += len;
10966 printf (" Tag_ABI_compatibility: ");
10967 printf (_("flag = %d, vendor = %s\n"), val, p);
10968 p += strlen ((char *) p) + 1;
10969 return p;
10971 case Tag_ABI_conformance:
10972 printf (" Tag_ABI_conformance: ");
10973 printf ("\"%s\"\n", p);
10974 p += strlen ((char *) p) + 1;
10975 return p;
10978 printf (" Tag_unknown_%d: ", tag);
10980 if (tag & 1)
10982 printf ("\"%s\"\n", p);
10983 p += strlen ((char *) p) + 1;
10985 else
10987 val = read_uleb128 (p, &len);
10988 p += len;
10989 printf ("%d (0x%x)\n", val, val);
10992 return p;
10995 static int
10996 process_attributes (FILE * file,
10997 const char * public_name,
10998 unsigned int proc_type,
10999 unsigned char * (* display_pub_attribute) (unsigned char *),
11000 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int))
11002 Elf_Internal_Shdr * sect;
11003 unsigned char * contents;
11004 unsigned char * p;
11005 unsigned char * end;
11006 bfd_vma section_len;
11007 bfd_vma len;
11008 unsigned i;
11010 /* Find the section header so that we get the size. */
11011 for (i = 0, sect = section_headers;
11012 i < elf_header.e_shnum;
11013 i++, sect++)
11015 if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
11016 continue;
11018 contents = (unsigned char *) get_data (NULL, file, sect->sh_offset, 1,
11019 sect->sh_size, _("attributes"));
11020 if (contents == NULL)
11021 continue;
11023 p = contents;
11024 if (*p == 'A')
11026 len = sect->sh_size - 1;
11027 p++;
11029 while (len > 0)
11031 int namelen;
11032 bfd_boolean public_section;
11033 bfd_boolean gnu_section;
11035 section_len = byte_get (p, 4);
11036 p += 4;
11038 if (section_len > len)
11040 printf (_("ERROR: Bad section length (%d > %d)\n"),
11041 (int) section_len, (int) len);
11042 section_len = len;
11045 len -= section_len;
11046 printf (_("Attribute Section: %s\n"), p);
11048 if (public_name && streq ((char *) p, public_name))
11049 public_section = TRUE;
11050 else
11051 public_section = FALSE;
11053 if (streq ((char *) p, "gnu"))
11054 gnu_section = TRUE;
11055 else
11056 gnu_section = FALSE;
11058 namelen = strlen ((char *) p) + 1;
11059 p += namelen;
11060 section_len -= namelen + 4;
11062 while (section_len > 0)
11064 int tag = *(p++);
11065 int val;
11066 bfd_vma size;
11068 size = byte_get (p, 4);
11069 if (size > section_len)
11071 printf (_("ERROR: Bad subsection length (%d > %d)\n"),
11072 (int) size, (int) section_len);
11073 size = section_len;
11076 section_len -= size;
11077 end = p + size - 1;
11078 p += 4;
11080 switch (tag)
11082 case 1:
11083 printf (_("File Attributes\n"));
11084 break;
11085 case 2:
11086 printf (_("Section Attributes:"));
11087 goto do_numlist;
11088 case 3:
11089 printf (_("Symbol Attributes:"));
11090 do_numlist:
11091 for (;;)
11093 unsigned int j;
11095 val = read_uleb128 (p, &j);
11096 p += j;
11097 if (val == 0)
11098 break;
11099 printf (" %d", val);
11101 printf ("\n");
11102 break;
11103 default:
11104 printf (_("Unknown tag: %d\n"), tag);
11105 public_section = FALSE;
11106 break;
11109 if (public_section)
11111 while (p < end)
11112 p = display_pub_attribute (p);
11114 else if (gnu_section)
11116 while (p < end)
11117 p = display_gnu_attribute (p,
11118 display_proc_gnu_attribute);
11120 else
11122 /* ??? Do something sensible, like dump hex. */
11123 printf (_(" Unknown section contexts\n"));
11124 p = end;
11129 else
11130 printf (_("Unknown format '%c'\n"), *p);
11132 free (contents);
11134 return 1;
11137 static int
11138 process_arm_specific (FILE * file)
11140 return process_attributes (file, "aeabi", SHT_ARM_ATTRIBUTES,
11141 display_arm_attribute, NULL);
11144 static int
11145 process_power_specific (FILE * file)
11147 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
11148 display_power_gnu_attribute);
11151 static int
11152 process_tic6x_specific (FILE * file)
11154 return process_attributes (file, "c6xabi", SHT_C6000_ATTRIBUTES,
11155 display_tic6x_attribute, NULL);
11158 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
11159 Print the Address, Access and Initial fields of an entry at VMA ADDR
11160 and return the VMA of the next entry. */
11162 static bfd_vma
11163 print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
11165 printf (" ");
11166 print_vma (addr, LONG_HEX);
11167 printf (" ");
11168 if (addr < pltgot + 0xfff0)
11169 printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
11170 else
11171 printf ("%10s", "");
11172 printf (" ");
11173 if (data == NULL)
11174 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
11175 else
11177 bfd_vma entry;
11179 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
11180 print_vma (entry, LONG_HEX);
11182 return addr + (is_32bit_elf ? 4 : 8);
11185 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
11186 PLTGOT. Print the Address and Initial fields of an entry at VMA
11187 ADDR and return the VMA of the next entry. */
11189 static bfd_vma
11190 print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
11192 printf (" ");
11193 print_vma (addr, LONG_HEX);
11194 printf (" ");
11195 if (data == NULL)
11196 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
11197 else
11199 bfd_vma entry;
11201 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
11202 print_vma (entry, LONG_HEX);
11204 return addr + (is_32bit_elf ? 4 : 8);
11207 static int
11208 process_mips_specific (FILE * file)
11210 Elf_Internal_Dyn * entry;
11211 size_t liblist_offset = 0;
11212 size_t liblistno = 0;
11213 size_t conflictsno = 0;
11214 size_t options_offset = 0;
11215 size_t conflicts_offset = 0;
11216 size_t pltrelsz = 0;
11217 size_t pltrel = 0;
11218 bfd_vma pltgot = 0;
11219 bfd_vma mips_pltgot = 0;
11220 bfd_vma jmprel = 0;
11221 bfd_vma local_gotno = 0;
11222 bfd_vma gotsym = 0;
11223 bfd_vma symtabno = 0;
11225 process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
11226 display_mips_gnu_attribute);
11228 /* We have a lot of special sections. Thanks SGI! */
11229 if (dynamic_section == NULL)
11230 /* No information available. */
11231 return 0;
11233 for (entry = dynamic_section; entry->d_tag != DT_NULL; ++entry)
11234 switch (entry->d_tag)
11236 case DT_MIPS_LIBLIST:
11237 liblist_offset
11238 = offset_from_vma (file, entry->d_un.d_val,
11239 liblistno * sizeof (Elf32_External_Lib));
11240 break;
11241 case DT_MIPS_LIBLISTNO:
11242 liblistno = entry->d_un.d_val;
11243 break;
11244 case DT_MIPS_OPTIONS:
11245 options_offset = offset_from_vma (file, entry->d_un.d_val, 0);
11246 break;
11247 case DT_MIPS_CONFLICT:
11248 conflicts_offset
11249 = offset_from_vma (file, entry->d_un.d_val,
11250 conflictsno * sizeof (Elf32_External_Conflict));
11251 break;
11252 case DT_MIPS_CONFLICTNO:
11253 conflictsno = entry->d_un.d_val;
11254 break;
11255 case DT_PLTGOT:
11256 pltgot = entry->d_un.d_ptr;
11257 break;
11258 case DT_MIPS_LOCAL_GOTNO:
11259 local_gotno = entry->d_un.d_val;
11260 break;
11261 case DT_MIPS_GOTSYM:
11262 gotsym = entry->d_un.d_val;
11263 break;
11264 case DT_MIPS_SYMTABNO:
11265 symtabno = entry->d_un.d_val;
11266 break;
11267 case DT_MIPS_PLTGOT:
11268 mips_pltgot = entry->d_un.d_ptr;
11269 break;
11270 case DT_PLTREL:
11271 pltrel = entry->d_un.d_val;
11272 break;
11273 case DT_PLTRELSZ:
11274 pltrelsz = entry->d_un.d_val;
11275 break;
11276 case DT_JMPREL:
11277 jmprel = entry->d_un.d_ptr;
11278 break;
11279 default:
11280 break;
11283 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
11285 Elf32_External_Lib * elib;
11286 size_t cnt;
11288 elib = (Elf32_External_Lib *) get_data (NULL, file, liblist_offset,
11289 liblistno,
11290 sizeof (Elf32_External_Lib),
11291 _("liblist"));
11292 if (elib)
11294 printf (_("\nSection '.liblist' contains %lu entries:\n"),
11295 (unsigned long) liblistno);
11296 fputs (_(" Library Time Stamp Checksum Version Flags\n"),
11297 stdout);
11299 for (cnt = 0; cnt < liblistno; ++cnt)
11301 Elf32_Lib liblist;
11302 time_t atime;
11303 char timebuf[20];
11304 struct tm * tmp;
11306 liblist.l_name = BYTE_GET (elib[cnt].l_name);
11307 atime = BYTE_GET (elib[cnt].l_time_stamp);
11308 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
11309 liblist.l_version = BYTE_GET (elib[cnt].l_version);
11310 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
11312 tmp = gmtime (&atime);
11313 snprintf (timebuf, sizeof (timebuf),
11314 "%04u-%02u-%02uT%02u:%02u:%02u",
11315 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
11316 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
11318 printf ("%3lu: ", (unsigned long) cnt);
11319 if (VALID_DYNAMIC_NAME (liblist.l_name))
11320 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
11321 else
11322 printf (_("<corrupt: %9ld>"), liblist.l_name);
11323 printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
11324 liblist.l_version);
11326 if (liblist.l_flags == 0)
11327 puts (_(" NONE"));
11328 else
11330 static const struct
11332 const char * name;
11333 int bit;
11335 l_flags_vals[] =
11337 { " EXACT_MATCH", LL_EXACT_MATCH },
11338 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
11339 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
11340 { " EXPORTS", LL_EXPORTS },
11341 { " DELAY_LOAD", LL_DELAY_LOAD },
11342 { " DELTA", LL_DELTA }
11344 int flags = liblist.l_flags;
11345 size_t fcnt;
11347 for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
11348 if ((flags & l_flags_vals[fcnt].bit) != 0)
11350 fputs (l_flags_vals[fcnt].name, stdout);
11351 flags ^= l_flags_vals[fcnt].bit;
11353 if (flags != 0)
11354 printf (" %#x", (unsigned int) flags);
11356 puts ("");
11360 free (elib);
11364 if (options_offset != 0)
11366 Elf_External_Options * eopt;
11367 Elf_Internal_Shdr * sect = section_headers;
11368 Elf_Internal_Options * iopt;
11369 Elf_Internal_Options * option;
11370 size_t offset;
11371 int cnt;
11373 /* Find the section header so that we get the size. */
11374 while (sect->sh_type != SHT_MIPS_OPTIONS)
11375 ++sect;
11377 eopt = (Elf_External_Options *) get_data (NULL, file, options_offset, 1,
11378 sect->sh_size, _("options"));
11379 if (eopt)
11381 iopt = (Elf_Internal_Options *)
11382 cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
11383 if (iopt == NULL)
11385 error (_("Out of memory\n"));
11386 return 0;
11389 offset = cnt = 0;
11390 option = iopt;
11392 while (offset < sect->sh_size)
11394 Elf_External_Options * eoption;
11396 eoption = (Elf_External_Options *) ((char *) eopt + offset);
11398 option->kind = BYTE_GET (eoption->kind);
11399 option->size = BYTE_GET (eoption->size);
11400 option->section = BYTE_GET (eoption->section);
11401 option->info = BYTE_GET (eoption->info);
11403 offset += option->size;
11405 ++option;
11406 ++cnt;
11409 printf (_("\nSection '%s' contains %d entries:\n"),
11410 SECTION_NAME (sect), cnt);
11412 option = iopt;
11414 while (cnt-- > 0)
11416 size_t len;
11418 switch (option->kind)
11420 case ODK_NULL:
11421 /* This shouldn't happen. */
11422 printf (" NULL %d %lx", option->section, option->info);
11423 break;
11424 case ODK_REGINFO:
11425 printf (" REGINFO ");
11426 if (elf_header.e_machine == EM_MIPS)
11428 /* 32bit form. */
11429 Elf32_External_RegInfo * ereg;
11430 Elf32_RegInfo reginfo;
11432 ereg = (Elf32_External_RegInfo *) (option + 1);
11433 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
11434 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
11435 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
11436 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
11437 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
11438 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
11440 printf ("GPR %08lx GP 0x%lx\n",
11441 reginfo.ri_gprmask,
11442 (unsigned long) reginfo.ri_gp_value);
11443 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
11444 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
11445 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
11447 else
11449 /* 64 bit form. */
11450 Elf64_External_RegInfo * ereg;
11451 Elf64_Internal_RegInfo reginfo;
11453 ereg = (Elf64_External_RegInfo *) (option + 1);
11454 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
11455 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
11456 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
11457 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
11458 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
11459 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
11461 printf ("GPR %08lx GP 0x",
11462 reginfo.ri_gprmask);
11463 printf_vma (reginfo.ri_gp_value);
11464 printf ("\n");
11466 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
11467 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
11468 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
11470 ++option;
11471 continue;
11472 case ODK_EXCEPTIONS:
11473 fputs (" EXCEPTIONS fpe_min(", stdout);
11474 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
11475 fputs (") fpe_max(", stdout);
11476 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
11477 fputs (")", stdout);
11479 if (option->info & OEX_PAGE0)
11480 fputs (" PAGE0", stdout);
11481 if (option->info & OEX_SMM)
11482 fputs (" SMM", stdout);
11483 if (option->info & OEX_FPDBUG)
11484 fputs (" FPDBUG", stdout);
11485 if (option->info & OEX_DISMISS)
11486 fputs (" DISMISS", stdout);
11487 break;
11488 case ODK_PAD:
11489 fputs (" PAD ", stdout);
11490 if (option->info & OPAD_PREFIX)
11491 fputs (" PREFIX", stdout);
11492 if (option->info & OPAD_POSTFIX)
11493 fputs (" POSTFIX", stdout);
11494 if (option->info & OPAD_SYMBOL)
11495 fputs (" SYMBOL", stdout);
11496 break;
11497 case ODK_HWPATCH:
11498 fputs (" HWPATCH ", stdout);
11499 if (option->info & OHW_R4KEOP)
11500 fputs (" R4KEOP", stdout);
11501 if (option->info & OHW_R8KPFETCH)
11502 fputs (" R8KPFETCH", stdout);
11503 if (option->info & OHW_R5KEOP)
11504 fputs (" R5KEOP", stdout);
11505 if (option->info & OHW_R5KCVTL)
11506 fputs (" R5KCVTL", stdout);
11507 break;
11508 case ODK_FILL:
11509 fputs (" FILL ", stdout);
11510 /* XXX Print content of info word? */
11511 break;
11512 case ODK_TAGS:
11513 fputs (" TAGS ", stdout);
11514 /* XXX Print content of info word? */
11515 break;
11516 case ODK_HWAND:
11517 fputs (" HWAND ", stdout);
11518 if (option->info & OHWA0_R4KEOP_CHECKED)
11519 fputs (" R4KEOP_CHECKED", stdout);
11520 if (option->info & OHWA0_R4KEOP_CLEAN)
11521 fputs (" R4KEOP_CLEAN", stdout);
11522 break;
11523 case ODK_HWOR:
11524 fputs (" HWOR ", stdout);
11525 if (option->info & OHWA0_R4KEOP_CHECKED)
11526 fputs (" R4KEOP_CHECKED", stdout);
11527 if (option->info & OHWA0_R4KEOP_CLEAN)
11528 fputs (" R4KEOP_CLEAN", stdout);
11529 break;
11530 case ODK_GP_GROUP:
11531 printf (" GP_GROUP %#06lx self-contained %#06lx",
11532 option->info & OGP_GROUP,
11533 (option->info & OGP_SELF) >> 16);
11534 break;
11535 case ODK_IDENT:
11536 printf (" IDENT %#06lx self-contained %#06lx",
11537 option->info & OGP_GROUP,
11538 (option->info & OGP_SELF) >> 16);
11539 break;
11540 default:
11541 /* This shouldn't happen. */
11542 printf (" %3d ??? %d %lx",
11543 option->kind, option->section, option->info);
11544 break;
11547 len = sizeof (* eopt);
11548 while (len < option->size)
11549 if (((char *) option)[len] >= ' '
11550 && ((char *) option)[len] < 0x7f)
11551 printf ("%c", ((char *) option)[len++]);
11552 else
11553 printf ("\\%03o", ((char *) option)[len++]);
11555 fputs ("\n", stdout);
11556 ++option;
11559 free (eopt);
11563 if (conflicts_offset != 0 && conflictsno != 0)
11565 Elf32_Conflict * iconf;
11566 size_t cnt;
11568 if (dynamic_symbols == NULL)
11570 error (_("conflict list found without a dynamic symbol table\n"));
11571 return 0;
11574 iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
11575 if (iconf == NULL)
11577 error (_("Out of memory\n"));
11578 return 0;
11581 if (is_32bit_elf)
11583 Elf32_External_Conflict * econf32;
11585 econf32 = (Elf32_External_Conflict *)
11586 get_data (NULL, file, conflicts_offset, conflictsno,
11587 sizeof (* econf32), _("conflict"));
11588 if (!econf32)
11589 return 0;
11591 for (cnt = 0; cnt < conflictsno; ++cnt)
11592 iconf[cnt] = BYTE_GET (econf32[cnt]);
11594 free (econf32);
11596 else
11598 Elf64_External_Conflict * econf64;
11600 econf64 = (Elf64_External_Conflict *)
11601 get_data (NULL, file, conflicts_offset, conflictsno,
11602 sizeof (* econf64), _("conflict"));
11603 if (!econf64)
11604 return 0;
11606 for (cnt = 0; cnt < conflictsno; ++cnt)
11607 iconf[cnt] = BYTE_GET (econf64[cnt]);
11609 free (econf64);
11612 printf (_("\nSection '.conflict' contains %lu entries:\n"),
11613 (unsigned long) conflictsno);
11614 puts (_(" Num: Index Value Name"));
11616 for (cnt = 0; cnt < conflictsno; ++cnt)
11618 Elf_Internal_Sym * psym = & dynamic_symbols[iconf[cnt]];
11620 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
11621 print_vma (psym->st_value, FULL_HEX);
11622 putchar (' ');
11623 if (VALID_DYNAMIC_NAME (psym->st_name))
11624 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
11625 else
11626 printf (_("<corrupt: %14ld>"), psym->st_name);
11627 putchar ('\n');
11630 free (iconf);
11633 if (pltgot != 0 && local_gotno != 0)
11635 bfd_vma ent, local_end, global_end;
11636 size_t i, offset;
11637 unsigned char * data;
11638 int addr_size;
11640 ent = pltgot;
11641 addr_size = (is_32bit_elf ? 4 : 8);
11642 local_end = pltgot + local_gotno * addr_size;
11643 global_end = local_end + (symtabno - gotsym) * addr_size;
11645 offset = offset_from_vma (file, pltgot, global_end - pltgot);
11646 data = (unsigned char *) get_data (NULL, file, offset,
11647 global_end - pltgot, 1, _("GOT"));
11648 printf (_("\nPrimary GOT:\n"));
11649 printf (_(" Canonical gp value: "));
11650 print_vma (pltgot + 0x7ff0, LONG_HEX);
11651 printf ("\n\n");
11653 printf (_(" Reserved entries:\n"));
11654 printf (_(" %*s %10s %*s Purpose\n"),
11655 addr_size * 2, _("Address"), _("Access"),
11656 addr_size * 2, _("Initial"));
11657 ent = print_mips_got_entry (data, pltgot, ent);
11658 printf (_(" Lazy resolver\n"));
11659 if (data
11660 && (byte_get (data + ent - pltgot, addr_size)
11661 >> (addr_size * 8 - 1)) != 0)
11663 ent = print_mips_got_entry (data, pltgot, ent);
11664 printf (_(" Module pointer (GNU extension)\n"));
11666 printf ("\n");
11668 if (ent < local_end)
11670 printf (_(" Local entries:\n"));
11671 printf (_(" %*s %10s %*s\n"),
11672 addr_size * 2, _("Address"), _("Access"),
11673 addr_size * 2, _("Initial"));
11674 while (ent < local_end)
11676 ent = print_mips_got_entry (data, pltgot, ent);
11677 printf ("\n");
11679 printf ("\n");
11682 if (gotsym < symtabno)
11684 int sym_width;
11686 printf (_(" Global entries:\n"));
11687 printf (_(" %*s %10s %*s %*s %-7s %3s %s\n"),
11688 addr_size * 2, _("Address"), _("Access"),
11689 addr_size * 2, _("Initial"),
11690 addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
11691 sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
11692 for (i = gotsym; i < symtabno; i++)
11694 Elf_Internal_Sym * psym;
11696 psym = dynamic_symbols + i;
11697 ent = print_mips_got_entry (data, pltgot, ent);
11698 printf (" ");
11699 print_vma (psym->st_value, LONG_HEX);
11700 printf (" %-7s %3s ",
11701 get_symbol_type (ELF_ST_TYPE (psym->st_info)),
11702 get_symbol_index_type (psym->st_shndx));
11703 if (VALID_DYNAMIC_NAME (psym->st_name))
11704 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
11705 else
11706 printf (_("<corrupt: %14ld>"), psym->st_name);
11707 printf ("\n");
11709 printf ("\n");
11712 if (data)
11713 free (data);
11716 if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
11718 bfd_vma ent, end;
11719 size_t offset, rel_offset;
11720 unsigned long count, i;
11721 unsigned char * data;
11722 int addr_size, sym_width;
11723 Elf_Internal_Rela * rels;
11725 rel_offset = offset_from_vma (file, jmprel, pltrelsz);
11726 if (pltrel == DT_RELA)
11728 if (!slurp_rela_relocs (file, rel_offset, pltrelsz, &rels, &count))
11729 return 0;
11731 else
11733 if (!slurp_rel_relocs (file, rel_offset, pltrelsz, &rels, &count))
11734 return 0;
11737 ent = mips_pltgot;
11738 addr_size = (is_32bit_elf ? 4 : 8);
11739 end = mips_pltgot + (2 + count) * addr_size;
11741 offset = offset_from_vma (file, mips_pltgot, end - mips_pltgot);
11742 data = (unsigned char *) get_data (NULL, file, offset, end - mips_pltgot,
11743 1, _("PLT GOT"));
11744 printf (_("\nPLT GOT:\n\n"));
11745 printf (_(" Reserved entries:\n"));
11746 printf (_(" %*s %*s Purpose\n"),
11747 addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
11748 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
11749 printf (_(" PLT lazy resolver\n"));
11750 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
11751 printf (_(" Module pointer\n"));
11752 printf ("\n");
11754 printf (_(" Entries:\n"));
11755 printf (_(" %*s %*s %*s %-7s %3s %s\n"),
11756 addr_size * 2, _("Address"),
11757 addr_size * 2, _("Initial"),
11758 addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
11759 sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
11760 for (i = 0; i < count; i++)
11762 Elf_Internal_Sym * psym;
11764 psym = dynamic_symbols + get_reloc_symindex (rels[i].r_info);
11765 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
11766 printf (" ");
11767 print_vma (psym->st_value, LONG_HEX);
11768 printf (" %-7s %3s ",
11769 get_symbol_type (ELF_ST_TYPE (psym->st_info)),
11770 get_symbol_index_type (psym->st_shndx));
11771 if (VALID_DYNAMIC_NAME (psym->st_name))
11772 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
11773 else
11774 printf (_("<corrupt: %14ld>"), psym->st_name);
11775 printf ("\n");
11777 printf ("\n");
11779 if (data)
11780 free (data);
11781 free (rels);
11784 return 1;
11787 static int
11788 process_gnu_liblist (FILE * file)
11790 Elf_Internal_Shdr * section;
11791 Elf_Internal_Shdr * string_sec;
11792 Elf32_External_Lib * elib;
11793 char * strtab;
11794 size_t strtab_size;
11795 size_t cnt;
11796 unsigned i;
11798 if (! do_arch)
11799 return 0;
11801 for (i = 0, section = section_headers;
11802 i < elf_header.e_shnum;
11803 i++, section++)
11805 switch (section->sh_type)
11807 case SHT_GNU_LIBLIST:
11808 if (section->sh_link >= elf_header.e_shnum)
11809 break;
11811 elib = (Elf32_External_Lib *)
11812 get_data (NULL, file, section->sh_offset, 1, section->sh_size,
11813 _("liblist"));
11815 if (elib == NULL)
11816 break;
11817 string_sec = section_headers + section->sh_link;
11819 strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
11820 string_sec->sh_size,
11821 _("liblist string table"));
11822 strtab_size = string_sec->sh_size;
11824 if (strtab == NULL
11825 || section->sh_entsize != sizeof (Elf32_External_Lib))
11827 free (elib);
11828 break;
11831 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
11832 SECTION_NAME (section),
11833 (unsigned long) (section->sh_size / sizeof (Elf32_External_Lib)));
11835 puts (_(" Library Time Stamp Checksum Version Flags"));
11837 for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
11838 ++cnt)
11840 Elf32_Lib liblist;
11841 time_t atime;
11842 char timebuf[20];
11843 struct tm * tmp;
11845 liblist.l_name = BYTE_GET (elib[cnt].l_name);
11846 atime = BYTE_GET (elib[cnt].l_time_stamp);
11847 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
11848 liblist.l_version = BYTE_GET (elib[cnt].l_version);
11849 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
11851 tmp = gmtime (&atime);
11852 snprintf (timebuf, sizeof (timebuf),
11853 "%04u-%02u-%02uT%02u:%02u:%02u",
11854 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
11855 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
11857 printf ("%3lu: ", (unsigned long) cnt);
11858 if (do_wide)
11859 printf ("%-20s", liblist.l_name < strtab_size
11860 ? strtab + liblist.l_name : _("<corrupt>"));
11861 else
11862 printf ("%-20.20s", liblist.l_name < strtab_size
11863 ? strtab + liblist.l_name : _("<corrupt>"));
11864 printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
11865 liblist.l_version, liblist.l_flags);
11868 free (elib);
11872 return 1;
11875 static const char *
11876 get_note_type (unsigned e_type)
11878 static char buff[64];
11880 if (elf_header.e_type == ET_CORE)
11881 switch (e_type)
11883 case NT_AUXV:
11884 return _("NT_AUXV (auxiliary vector)");
11885 case NT_PRSTATUS:
11886 return _("NT_PRSTATUS (prstatus structure)");
11887 case NT_FPREGSET:
11888 return _("NT_FPREGSET (floating point registers)");
11889 case NT_PRPSINFO:
11890 return _("NT_PRPSINFO (prpsinfo structure)");
11891 case NT_TASKSTRUCT:
11892 return _("NT_TASKSTRUCT (task structure)");
11893 case NT_PRXFPREG:
11894 return _("NT_PRXFPREG (user_xfpregs structure)");
11895 case NT_PPC_VMX:
11896 return _("NT_PPC_VMX (ppc Altivec registers)");
11897 case NT_PPC_VSX:
11898 return _("NT_PPC_VSX (ppc VSX registers)");
11899 case NT_X86_XSTATE:
11900 return _("NT_X86_XSTATE (x86 XSAVE extended state)");
11901 case NT_S390_HIGH_GPRS:
11902 return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
11903 case NT_S390_TIMER:
11904 return _("NT_S390_TIMER (s390 timer register)");
11905 case NT_S390_TODCMP:
11906 return _("NT_S390_TODCMP (s390 TOD comparator register)");
11907 case NT_S390_TODPREG:
11908 return _("NT_S390_TODPREG (s390 TOD programmable register)");
11909 case NT_S390_CTRS:
11910 return _("NT_S390_CTRS (s390 control registers)");
11911 case NT_S390_PREFIX:
11912 return _("NT_S390_PREFIX (s390 prefix register)");
11913 case NT_PSTATUS:
11914 return _("NT_PSTATUS (pstatus structure)");
11915 case NT_FPREGS:
11916 return _("NT_FPREGS (floating point registers)");
11917 case NT_PSINFO:
11918 return _("NT_PSINFO (psinfo structure)");
11919 case NT_LWPSTATUS:
11920 return _("NT_LWPSTATUS (lwpstatus_t structure)");
11921 case NT_LWPSINFO:
11922 return _("NT_LWPSINFO (lwpsinfo_t structure)");
11923 case NT_WIN32PSTATUS:
11924 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
11925 default:
11926 break;
11928 else
11929 switch (e_type)
11931 case NT_VERSION:
11932 return _("NT_VERSION (version)");
11933 case NT_ARCH:
11934 return _("NT_ARCH (architecture)");
11935 default:
11936 break;
11939 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
11940 return buff;
11943 static const char *
11944 get_gnu_elf_note_type (unsigned e_type)
11946 static char buff[64];
11948 switch (e_type)
11950 case NT_GNU_ABI_TAG:
11951 return _("NT_GNU_ABI_TAG (ABI version tag)");
11952 case NT_GNU_HWCAP:
11953 return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
11954 case NT_GNU_BUILD_ID:
11955 return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
11956 case NT_GNU_GOLD_VERSION:
11957 return _("NT_GNU_GOLD_VERSION (gold version)");
11958 default:
11959 break;
11962 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
11963 return buff;
11966 static const char *
11967 get_netbsd_elfcore_note_type (unsigned e_type)
11969 static char buff[64];
11971 if (e_type == NT_NETBSDCORE_PROCINFO)
11973 /* NetBSD core "procinfo" structure. */
11974 return _("NetBSD procinfo structure");
11977 /* As of Jan 2002 there are no other machine-independent notes
11978 defined for NetBSD core files. If the note type is less
11979 than the start of the machine-dependent note types, we don't
11980 understand it. */
11982 if (e_type < NT_NETBSDCORE_FIRSTMACH)
11984 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
11985 return buff;
11988 switch (elf_header.e_machine)
11990 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
11991 and PT_GETFPREGS == mach+2. */
11993 case EM_OLD_ALPHA:
11994 case EM_ALPHA:
11995 case EM_SPARC:
11996 case EM_SPARC32PLUS:
11997 case EM_SPARCV9:
11998 switch (e_type)
12000 case NT_NETBSDCORE_FIRSTMACH + 0:
12001 return _("PT_GETREGS (reg structure)");
12002 case NT_NETBSDCORE_FIRSTMACH + 2:
12003 return _("PT_GETFPREGS (fpreg structure)");
12004 default:
12005 break;
12007 break;
12009 /* On all other arch's, PT_GETREGS == mach+1 and
12010 PT_GETFPREGS == mach+3. */
12011 default:
12012 switch (e_type)
12014 case NT_NETBSDCORE_FIRSTMACH + 1:
12015 return _("PT_GETREGS (reg structure)");
12016 case NT_NETBSDCORE_FIRSTMACH + 3:
12017 return _("PT_GETFPREGS (fpreg structure)");
12018 default:
12019 break;
12023 snprintf (buff, sizeof (buff), _("PT_FIRSTMACH+%d"),
12024 e_type - NT_NETBSDCORE_FIRSTMACH);
12025 return buff;
12028 /* Note that by the ELF standard, the name field is already null byte
12029 terminated, and namesz includes the terminating null byte.
12030 I.E. the value of namesz for the name "FSF" is 4.
12032 If the value of namesz is zero, there is no name present. */
12033 static int
12034 process_note (Elf_Internal_Note * pnote)
12036 const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
12037 const char * nt;
12039 if (pnote->namesz == 0)
12040 /* If there is no note name, then use the default set of
12041 note type strings. */
12042 nt = get_note_type (pnote->type);
12044 else if (const_strneq (pnote->namedata, "GNU"))
12045 /* GNU-specific object file notes. */
12046 nt = get_gnu_elf_note_type (pnote->type);
12048 else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
12049 /* NetBSD-specific core file notes. */
12050 nt = get_netbsd_elfcore_note_type (pnote->type);
12052 else if (strneq (pnote->namedata, "SPU/", 4))
12054 /* SPU-specific core file notes. */
12055 nt = pnote->namedata + 4;
12056 name = "SPU";
12059 else
12060 /* Don't recognize this note name; just use the default set of
12061 note type strings. */
12062 nt = get_note_type (pnote->type);
12064 printf (" %s\t\t0x%08lx\t%s\n", name, pnote->descsz, nt);
12065 return 1;
12069 static int
12070 process_corefile_note_segment (FILE * file, bfd_vma offset, bfd_vma length)
12072 Elf_External_Note * pnotes;
12073 Elf_External_Note * external;
12074 int res = 1;
12076 if (length <= 0)
12077 return 0;
12079 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
12080 _("notes"));
12081 if (pnotes == NULL)
12082 return 0;
12084 external = pnotes;
12086 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
12087 (unsigned long) offset, (unsigned long) length);
12088 printf (_(" Owner\t\tData size\tDescription\n"));
12090 while (external < (Elf_External_Note *) ((char *) pnotes + length))
12092 Elf_External_Note * next;
12093 Elf_Internal_Note inote;
12094 char * temp = NULL;
12096 inote.type = BYTE_GET (external->type);
12097 inote.namesz = BYTE_GET (external->namesz);
12098 inote.namedata = external->name;
12099 inote.descsz = BYTE_GET (external->descsz);
12100 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
12101 inote.descpos = offset + (inote.descdata - (char *) pnotes);
12103 next = (Elf_External_Note *) (inote.descdata + align_power (inote.descsz, 2));
12105 if ( ((char *) next > ((char *) pnotes) + length)
12106 || ((char *) next < (char *) pnotes))
12108 warn (_("corrupt note found at offset %lx into core notes\n"),
12109 (unsigned long) ((char *) external - (char *) pnotes));
12110 warn (_(" type: %lx, namesize: %08lx, descsize: %08lx\n"),
12111 inote.type, inote.namesz, inote.descsz);
12112 break;
12115 external = next;
12117 /* Prevent out-of-bounds indexing. */
12118 if (inote.namedata + inote.namesz >= (char *) pnotes + length
12119 || inote.namedata + inote.namesz < inote.namedata)
12121 warn (_("corrupt note found at offset %lx into core notes\n"),
12122 (unsigned long) ((char *) external - (char *) pnotes));
12123 warn (_(" type: %lx, namesize: %08lx, descsize: %08lx\n"),
12124 inote.type, inote.namesz, inote.descsz);
12125 break;
12128 /* Verify that name is null terminated. It appears that at least
12129 one version of Linux (RedHat 6.0) generates corefiles that don't
12130 comply with the ELF spec by failing to include the null byte in
12131 namesz. */
12132 if (inote.namedata[inote.namesz] != '\0')
12134 temp = (char *) malloc (inote.namesz + 1);
12136 if (temp == NULL)
12138 error (_("Out of memory\n"));
12139 res = 0;
12140 break;
12143 strncpy (temp, inote.namedata, inote.namesz);
12144 temp[inote.namesz] = 0;
12146 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
12147 inote.namedata = temp;
12150 res &= process_note (& inote);
12152 if (temp != NULL)
12154 free (temp);
12155 temp = NULL;
12159 free (pnotes);
12161 return res;
12164 static int
12165 process_corefile_note_segments (FILE * file)
12167 Elf_Internal_Phdr * segment;
12168 unsigned int i;
12169 int res = 1;
12171 if (! get_program_headers (file))
12172 return 0;
12174 for (i = 0, segment = program_headers;
12175 i < elf_header.e_phnum;
12176 i++, segment++)
12178 if (segment->p_type == PT_NOTE)
12179 res &= process_corefile_note_segment (file,
12180 (bfd_vma) segment->p_offset,
12181 (bfd_vma) segment->p_filesz);
12184 return res;
12187 static int
12188 process_note_sections (FILE * file)
12190 Elf_Internal_Shdr * section;
12191 unsigned long i;
12192 int res = 1;
12194 for (i = 0, section = section_headers;
12195 i < elf_header.e_shnum;
12196 i++, section++)
12197 if (section->sh_type == SHT_NOTE)
12198 res &= process_corefile_note_segment (file,
12199 (bfd_vma) section->sh_offset,
12200 (bfd_vma) section->sh_size);
12202 return res;
12205 static int
12206 process_notes (FILE * file)
12208 /* If we have not been asked to display the notes then do nothing. */
12209 if (! do_notes)
12210 return 1;
12212 if (elf_header.e_type != ET_CORE)
12213 return process_note_sections (file);
12215 /* No program headers means no NOTE segment. */
12216 if (elf_header.e_phnum > 0)
12217 return process_corefile_note_segments (file);
12219 printf (_("No note segments present in the core file.\n"));
12220 return 1;
12223 static int
12224 process_arch_specific (FILE * file)
12226 if (! do_arch)
12227 return 1;
12229 switch (elf_header.e_machine)
12231 case EM_ARM:
12232 return process_arm_specific (file);
12233 case EM_MIPS:
12234 case EM_MIPS_RS3_LE:
12235 return process_mips_specific (file);
12236 break;
12237 case EM_PPC:
12238 return process_power_specific (file);
12239 break;
12240 case EM_TI_C6000:
12241 return process_tic6x_specific (file);
12242 break;
12243 default:
12244 break;
12246 return 1;
12249 static int
12250 get_file_header (FILE * file)
12252 /* Read in the identity array. */
12253 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
12254 return 0;
12256 /* Determine how to read the rest of the header. */
12257 switch (elf_header.e_ident[EI_DATA])
12259 default: /* fall through */
12260 case ELFDATANONE: /* fall through */
12261 case ELFDATA2LSB:
12262 byte_get = byte_get_little_endian;
12263 byte_put = byte_put_little_endian;
12264 break;
12265 case ELFDATA2MSB:
12266 byte_get = byte_get_big_endian;
12267 byte_put = byte_put_big_endian;
12268 break;
12271 /* For now we only support 32 bit and 64 bit ELF files. */
12272 is_32bit_elf = (elf_header.e_ident[EI_CLASS] != ELFCLASS64);
12274 /* Read in the rest of the header. */
12275 if (is_32bit_elf)
12277 Elf32_External_Ehdr ehdr32;
12279 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
12280 return 0;
12282 elf_header.e_type = BYTE_GET (ehdr32.e_type);
12283 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
12284 elf_header.e_version = BYTE_GET (ehdr32.e_version);
12285 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
12286 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
12287 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
12288 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
12289 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
12290 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
12291 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
12292 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
12293 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
12294 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
12296 else
12298 Elf64_External_Ehdr ehdr64;
12300 /* If we have been compiled with sizeof (bfd_vma) == 4, then
12301 we will not be able to cope with the 64bit data found in
12302 64 ELF files. Detect this now and abort before we start
12303 overwriting things. */
12304 if (sizeof (bfd_vma) < 8)
12306 error (_("This instance of readelf has been built without support for a\n\
12307 64 bit data type and so it cannot read 64 bit ELF files.\n"));
12308 return 0;
12311 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
12312 return 0;
12314 elf_header.e_type = BYTE_GET (ehdr64.e_type);
12315 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
12316 elf_header.e_version = BYTE_GET (ehdr64.e_version);
12317 elf_header.e_entry = BYTE_GET (ehdr64.e_entry);
12318 elf_header.e_phoff = BYTE_GET (ehdr64.e_phoff);
12319 elf_header.e_shoff = BYTE_GET (ehdr64.e_shoff);
12320 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
12321 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
12322 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
12323 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
12324 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
12325 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
12326 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
12329 if (elf_header.e_shoff)
12331 /* There may be some extensions in the first section header. Don't
12332 bomb if we can't read it. */
12333 if (is_32bit_elf)
12334 get_32bit_section_headers (file, 1);
12335 else
12336 get_64bit_section_headers (file, 1);
12339 return 1;
12342 /* Process one ELF object file according to the command line options.
12343 This file may actually be stored in an archive. The file is
12344 positioned at the start of the ELF object. */
12346 static int
12347 process_object (char * file_name, FILE * file)
12349 unsigned int i;
12351 if (! get_file_header (file))
12353 error (_("%s: Failed to read file header\n"), file_name);
12354 return 1;
12357 /* Initialise per file variables. */
12358 for (i = ARRAY_SIZE (version_info); i--;)
12359 version_info[i] = 0;
12361 for (i = ARRAY_SIZE (dynamic_info); i--;)
12362 dynamic_info[i] = 0;
12364 /* Process the file. */
12365 if (show_name)
12366 printf (_("\nFile: %s\n"), file_name);
12368 /* Initialise the dump_sects array from the cmdline_dump_sects array.
12369 Note we do this even if cmdline_dump_sects is empty because we
12370 must make sure that the dump_sets array is zeroed out before each
12371 object file is processed. */
12372 if (num_dump_sects > num_cmdline_dump_sects)
12373 memset (dump_sects, 0, num_dump_sects * sizeof (* dump_sects));
12375 if (num_cmdline_dump_sects > 0)
12377 if (num_dump_sects == 0)
12378 /* A sneaky way of allocating the dump_sects array. */
12379 request_dump_bynumber (num_cmdline_dump_sects, 0);
12381 assert (num_dump_sects >= num_cmdline_dump_sects);
12382 memcpy (dump_sects, cmdline_dump_sects,
12383 num_cmdline_dump_sects * sizeof (* dump_sects));
12386 if (! process_file_header ())
12387 return 1;
12389 if (! process_section_headers (file))
12391 /* Without loaded section headers we cannot process lots of
12392 things. */
12393 do_unwind = do_version = do_dump = do_arch = 0;
12395 if (! do_using_dynamic)
12396 do_syms = do_dyn_syms = do_reloc = 0;
12399 if (! process_section_groups (file))
12401 /* Without loaded section groups we cannot process unwind. */
12402 do_unwind = 0;
12405 if (process_program_headers (file))
12406 process_dynamic_section (file);
12408 process_relocs (file);
12410 process_unwind (file);
12412 process_symbol_table (file);
12414 process_syminfo (file);
12416 process_version_sections (file);
12418 process_section_contents (file);
12420 process_notes (file);
12422 process_gnu_liblist (file);
12424 process_arch_specific (file);
12426 if (program_headers)
12428 free (program_headers);
12429 program_headers = NULL;
12432 if (section_headers)
12434 free (section_headers);
12435 section_headers = NULL;
12438 if (string_table)
12440 free (string_table);
12441 string_table = NULL;
12442 string_table_length = 0;
12445 if (dynamic_strings)
12447 free (dynamic_strings);
12448 dynamic_strings = NULL;
12449 dynamic_strings_length = 0;
12452 if (dynamic_symbols)
12454 free (dynamic_symbols);
12455 dynamic_symbols = NULL;
12456 num_dynamic_syms = 0;
12459 if (dynamic_syminfo)
12461 free (dynamic_syminfo);
12462 dynamic_syminfo = NULL;
12465 if (section_headers_groups)
12467 free (section_headers_groups);
12468 section_headers_groups = NULL;
12471 if (section_groups)
12473 struct group_list * g;
12474 struct group_list * next;
12476 for (i = 0; i < group_count; i++)
12478 for (g = section_groups [i].root; g != NULL; g = next)
12480 next = g->next;
12481 free (g);
12485 free (section_groups);
12486 section_groups = NULL;
12489 free_debug_memory ();
12491 return 0;
12494 /* Return the path name for a proxy entry in a thin archive, adjusted relative
12495 to the path name of the thin archive itself if necessary. Always returns
12496 a pointer to malloc'ed memory. */
12498 static char *
12499 adjust_relative_path (char * file_name, char * name, int name_len)
12501 char * member_file_name;
12502 const char * base_name = lbasename (file_name);
12504 /* This is a proxy entry for a thin archive member.
12505 If the extended name table contains an absolute path
12506 name, or if the archive is in the current directory,
12507 use the path name as given. Otherwise, we need to
12508 find the member relative to the directory where the
12509 archive is located. */
12510 if (IS_ABSOLUTE_PATH (name) || base_name == file_name)
12512 member_file_name = (char *) malloc (name_len + 1);
12513 if (member_file_name == NULL)
12515 error (_("Out of memory\n"));
12516 return NULL;
12518 memcpy (member_file_name, name, name_len);
12519 member_file_name[name_len] = '\0';
12521 else
12523 /* Concatenate the path components of the archive file name
12524 to the relative path name from the extended name table. */
12525 size_t prefix_len = base_name - file_name;
12526 member_file_name = (char *) malloc (prefix_len + name_len + 1);
12527 if (member_file_name == NULL)
12529 error (_("Out of memory\n"));
12530 return NULL;
12532 memcpy (member_file_name, file_name, prefix_len);
12533 memcpy (member_file_name + prefix_len, name, name_len);
12534 member_file_name[prefix_len + name_len] = '\0';
12536 return member_file_name;
12539 /* Structure to hold information about an archive file. */
12541 struct archive_info
12543 char * file_name; /* Archive file name. */
12544 FILE * file; /* Open file descriptor. */
12545 unsigned long index_num; /* Number of symbols in table. */
12546 unsigned long * index_array; /* The array of member offsets. */
12547 char * sym_table; /* The symbol table. */
12548 unsigned long sym_size; /* Size of the symbol table. */
12549 char * longnames; /* The long file names table. */
12550 unsigned long longnames_size; /* Size of the long file names table. */
12551 unsigned long nested_member_origin; /* Origin in the nested archive of the current member. */
12552 unsigned long next_arhdr_offset; /* Offset of the next archive header. */
12553 bfd_boolean is_thin_archive; /* TRUE if this is a thin archive. */
12554 struct ar_hdr arhdr; /* Current archive header. */
12557 /* Read the symbol table and long-name table from an archive. */
12559 static int
12560 setup_archive (struct archive_info * arch, char * file_name, FILE * file,
12561 bfd_boolean is_thin_archive, bfd_boolean read_symbols)
12563 size_t got;
12564 unsigned long size;
12566 arch->file_name = strdup (file_name);
12567 arch->file = file;
12568 arch->index_num = 0;
12569 arch->index_array = NULL;
12570 arch->sym_table = NULL;
12571 arch->sym_size = 0;
12572 arch->longnames = NULL;
12573 arch->longnames_size = 0;
12574 arch->nested_member_origin = 0;
12575 arch->is_thin_archive = is_thin_archive;
12576 arch->next_arhdr_offset = SARMAG;
12578 /* Read the first archive member header. */
12579 if (fseek (file, SARMAG, SEEK_SET) != 0)
12581 error (_("%s: failed to seek to first archive header\n"), file_name);
12582 return 1;
12584 got = fread (&arch->arhdr, 1, sizeof arch->arhdr, file);
12585 if (got != sizeof arch->arhdr)
12587 if (got == 0)
12588 return 0;
12590 error (_("%s: failed to read archive header\n"), file_name);
12591 return 1;
12594 /* See if this is the archive symbol table. */
12595 if (const_strneq (arch->arhdr.ar_name, "/ ")
12596 || const_strneq (arch->arhdr.ar_name, "/SYM64/ "))
12598 size = strtoul (arch->arhdr.ar_size, NULL, 10);
12599 size = size + (size & 1);
12601 arch->next_arhdr_offset += sizeof arch->arhdr + size;
12603 if (read_symbols)
12605 unsigned long i;
12606 /* A buffer used to hold numbers read in from an archive index.
12607 These are always 4 bytes long and stored in big-endian format. */
12608 #define SIZEOF_AR_INDEX_NUMBERS 4
12609 unsigned char integer_buffer[SIZEOF_AR_INDEX_NUMBERS];
12610 unsigned char * index_buffer;
12612 /* Check the size of the archive index. */
12613 if (size < SIZEOF_AR_INDEX_NUMBERS)
12615 error (_("%s: the archive index is empty\n"), file_name);
12616 return 1;
12619 /* Read the numer of entries in the archive index. */
12620 got = fread (integer_buffer, 1, sizeof integer_buffer, file);
12621 if (got != sizeof (integer_buffer))
12623 error (_("%s: failed to read archive index\n"), file_name);
12624 return 1;
12626 arch->index_num = byte_get_big_endian (integer_buffer, sizeof integer_buffer);
12627 size -= SIZEOF_AR_INDEX_NUMBERS;
12629 /* Read in the archive index. */
12630 if (size < arch->index_num * SIZEOF_AR_INDEX_NUMBERS)
12632 error (_("%s: the archive index is supposed to have %ld entries, but the size in the header is too small\n"),
12633 file_name, arch->index_num);
12634 return 1;
12636 index_buffer = (unsigned char *)
12637 malloc (arch->index_num * SIZEOF_AR_INDEX_NUMBERS);
12638 if (index_buffer == NULL)
12640 error (_("Out of memory whilst trying to read archive symbol index\n"));
12641 return 1;
12643 got = fread (index_buffer, SIZEOF_AR_INDEX_NUMBERS, arch->index_num, file);
12644 if (got != arch->index_num)
12646 free (index_buffer);
12647 error (_("%s: failed to read archive index\n"), file_name);
12648 return 1;
12650 size -= arch->index_num * SIZEOF_AR_INDEX_NUMBERS;
12652 /* Convert the index numbers into the host's numeric format. */
12653 arch->index_array = (long unsigned int *)
12654 malloc (arch->index_num * sizeof (* arch->index_array));
12655 if (arch->index_array == NULL)
12657 free (index_buffer);
12658 error (_("Out of memory whilst trying to convert the archive symbol index\n"));
12659 return 1;
12662 for (i = 0; i < arch->index_num; i++)
12663 arch->index_array[i] = byte_get_big_endian ((unsigned char *) (index_buffer + (i * SIZEOF_AR_INDEX_NUMBERS)),
12664 SIZEOF_AR_INDEX_NUMBERS);
12665 free (index_buffer);
12667 /* The remaining space in the header is taken up by the symbol table. */
12668 if (size < 1)
12670 error (_("%s: the archive has an index but no symbols\n"), file_name);
12671 return 1;
12673 arch->sym_table = (char *) malloc (size);
12674 arch->sym_size = size;
12675 if (arch->sym_table == NULL)
12677 error (_("Out of memory whilst trying to read archive index symbol table\n"));
12678 return 1;
12680 got = fread (arch->sym_table, 1, size, file);
12681 if (got != size)
12683 error (_("%s: failed to read archive index symbol table\n"), file_name);
12684 return 1;
12687 else
12689 if (fseek (file, size, SEEK_CUR) != 0)
12691 error (_("%s: failed to skip archive symbol table\n"), file_name);
12692 return 1;
12696 /* Read the next archive header. */
12697 got = fread (&arch->arhdr, 1, sizeof arch->arhdr, file);
12698 if (got != sizeof arch->arhdr)
12700 if (got == 0)
12701 return 0;
12702 error (_("%s: failed to read archive header following archive index\n"), file_name);
12703 return 1;
12706 else if (read_symbols)
12707 printf (_("%s has no archive index\n"), file_name);
12709 if (const_strneq (arch->arhdr.ar_name, "// "))
12711 /* This is the archive string table holding long member names. */
12712 arch->longnames_size = strtoul (arch->arhdr.ar_size, NULL, 10);
12713 arch->next_arhdr_offset += sizeof arch->arhdr + arch->longnames_size;
12715 arch->longnames = (char *) malloc (arch->longnames_size);
12716 if (arch->longnames == NULL)
12718 error (_("Out of memory reading long symbol names in archive\n"));
12719 return 1;
12722 if (fread (arch->longnames, arch->longnames_size, 1, file) != 1)
12724 free (arch->longnames);
12725 arch->longnames = NULL;
12726 error (_("%s: failed to read long symbol name string table\n"), file_name);
12727 return 1;
12730 if ((arch->longnames_size & 1) != 0)
12731 getc (file);
12734 return 0;
12737 /* Release the memory used for the archive information. */
12739 static void
12740 release_archive (struct archive_info * arch)
12742 if (arch->file_name != NULL)
12743 free (arch->file_name);
12744 if (arch->index_array != NULL)
12745 free (arch->index_array);
12746 if (arch->sym_table != NULL)
12747 free (arch->sym_table);
12748 if (arch->longnames != NULL)
12749 free (arch->longnames);
12752 /* Open and setup a nested archive, if not already open. */
12754 static int
12755 setup_nested_archive (struct archive_info * nested_arch, char * member_file_name)
12757 FILE * member_file;
12759 /* Have we already setup this archive? */
12760 if (nested_arch->file_name != NULL
12761 && streq (nested_arch->file_name, member_file_name))
12762 return 0;
12764 /* Close previous file and discard cached information. */
12765 if (nested_arch->file != NULL)
12766 fclose (nested_arch->file);
12767 release_archive (nested_arch);
12769 member_file = fopen (member_file_name, "rb");
12770 if (member_file == NULL)
12771 return 1;
12772 return setup_archive (nested_arch, member_file_name, member_file, FALSE, FALSE);
12775 static char *
12776 get_archive_member_name_at (struct archive_info * arch,
12777 unsigned long offset,
12778 struct archive_info * nested_arch);
12780 /* Get the name of an archive member from the current archive header.
12781 For simple names, this will modify the ar_name field of the current
12782 archive header. For long names, it will return a pointer to the
12783 longnames table. For nested archives, it will open the nested archive
12784 and get the name recursively. NESTED_ARCH is a single-entry cache so
12785 we don't keep rereading the same information from a nested archive. */
12787 static char *
12788 get_archive_member_name (struct archive_info * arch,
12789 struct archive_info * nested_arch)
12791 unsigned long j, k;
12793 if (arch->arhdr.ar_name[0] == '/')
12795 /* We have a long name. */
12796 char * endp;
12797 char * member_file_name;
12798 char * member_name;
12800 arch->nested_member_origin = 0;
12801 k = j = strtoul (arch->arhdr.ar_name + 1, &endp, 10);
12802 if (arch->is_thin_archive && endp != NULL && * endp == ':')
12803 arch->nested_member_origin = strtoul (endp + 1, NULL, 10);
12805 while ((j < arch->longnames_size)
12806 && (arch->longnames[j] != '\n')
12807 && (arch->longnames[j] != '\0'))
12808 j++;
12809 if (arch->longnames[j-1] == '/')
12810 j--;
12811 arch->longnames[j] = '\0';
12813 if (!arch->is_thin_archive || arch->nested_member_origin == 0)
12814 return arch->longnames + k;
12816 /* This is a proxy for a member of a nested archive.
12817 Find the name of the member in that archive. */
12818 member_file_name = adjust_relative_path (arch->file_name, arch->longnames + k, j - k);
12819 if (member_file_name != NULL
12820 && setup_nested_archive (nested_arch, member_file_name) == 0
12821 && (member_name = get_archive_member_name_at (nested_arch, arch->nested_member_origin, NULL)) != NULL)
12823 free (member_file_name);
12824 return member_name;
12826 free (member_file_name);
12828 /* Last resort: just return the name of the nested archive. */
12829 return arch->longnames + k;
12832 /* We have a normal (short) name. */
12833 j = 0;
12834 while ((arch->arhdr.ar_name[j] != '/')
12835 && (j < sizeof (arch->arhdr.ar_name) - 1))
12836 j++;
12837 arch->arhdr.ar_name[j] = '\0';
12838 return arch->arhdr.ar_name;
12841 /* Get the name of an archive member at a given OFFSET within an archive ARCH. */
12843 static char *
12844 get_archive_member_name_at (struct archive_info * arch,
12845 unsigned long offset,
12846 struct archive_info * nested_arch)
12848 size_t got;
12850 if (fseek (arch->file, offset, SEEK_SET) != 0)
12852 error (_("%s: failed to seek to next file name\n"), arch->file_name);
12853 return NULL;
12855 got = fread (&arch->arhdr, 1, sizeof arch->arhdr, arch->file);
12856 if (got != sizeof arch->arhdr)
12858 error (_("%s: failed to read archive header\n"), arch->file_name);
12859 return NULL;
12861 if (memcmp (arch->arhdr.ar_fmag, ARFMAG, 2) != 0)
12863 error (_("%s: did not find a valid archive header\n"), arch->file_name);
12864 return NULL;
12867 return get_archive_member_name (arch, nested_arch);
12870 /* Construct a string showing the name of the archive member, qualified
12871 with the name of the containing archive file. For thin archives, we
12872 use square brackets to denote the indirection. For nested archives,
12873 we show the qualified name of the external member inside the square
12874 brackets (e.g., "thin.a[normal.a(foo.o)]"). */
12876 static char *
12877 make_qualified_name (struct archive_info * arch,
12878 struct archive_info * nested_arch,
12879 char * member_name)
12881 size_t len;
12882 char * name;
12884 len = strlen (arch->file_name) + strlen (member_name) + 3;
12885 if (arch->is_thin_archive && arch->nested_member_origin != 0)
12886 len += strlen (nested_arch->file_name) + 2;
12888 name = (char *) malloc (len);
12889 if (name == NULL)
12891 error (_("Out of memory\n"));
12892 return NULL;
12895 if (arch->is_thin_archive && arch->nested_member_origin != 0)
12896 snprintf (name, len, "%s[%s(%s)]", arch->file_name, nested_arch->file_name, member_name);
12897 else if (arch->is_thin_archive)
12898 snprintf (name, len, "%s[%s]", arch->file_name, member_name);
12899 else
12900 snprintf (name, len, "%s(%s)", arch->file_name, member_name);
12902 return name;
12905 /* Process an ELF archive.
12906 On entry the file is positioned just after the ARMAG string. */
12908 static int
12909 process_archive (char * file_name, FILE * file, bfd_boolean is_thin_archive)
12911 struct archive_info arch;
12912 struct archive_info nested_arch;
12913 size_t got;
12914 int ret;
12916 show_name = 1;
12918 /* The ARCH structure is used to hold information about this archive. */
12919 arch.file_name = NULL;
12920 arch.file = NULL;
12921 arch.index_array = NULL;
12922 arch.sym_table = NULL;
12923 arch.longnames = NULL;
12925 /* The NESTED_ARCH structure is used as a single-item cache of information
12926 about a nested archive (when members of a thin archive reside within
12927 another regular archive file). */
12928 nested_arch.file_name = NULL;
12929 nested_arch.file = NULL;
12930 nested_arch.index_array = NULL;
12931 nested_arch.sym_table = NULL;
12932 nested_arch.longnames = NULL;
12934 if (setup_archive (&arch, file_name, file, is_thin_archive, do_archive_index) != 0)
12936 ret = 1;
12937 goto out;
12940 if (do_archive_index)
12942 if (arch.sym_table == NULL)
12943 error (_("%s: unable to dump the index as none was found\n"), file_name);
12944 else
12946 unsigned int i, l;
12947 unsigned long current_pos;
12949 printf (_("Index of archive %s: (%ld entries, 0x%lx bytes in the symbol table)\n"),
12950 file_name, arch.index_num, arch.sym_size);
12951 current_pos = ftell (file);
12953 for (i = l = 0; i < arch.index_num; i++)
12955 if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
12957 char * member_name;
12959 member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
12961 if (member_name != NULL)
12963 char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
12965 if (qualified_name != NULL)
12967 printf (_("Binary %s contains:\n"), qualified_name);
12968 free (qualified_name);
12973 if (l >= arch.sym_size)
12975 error (_("%s: end of the symbol table reached before the end of the index\n"),
12976 file_name);
12977 break;
12979 printf ("\t%s\n", arch.sym_table + l);
12980 l += strlen (arch.sym_table + l) + 1;
12983 if (l & 01)
12984 ++l;
12985 if (l < arch.sym_size)
12986 error (_("%s: symbols remain in the index symbol table, but without corresponding entries in the index table\n"),
12987 file_name);
12989 if (fseek (file, current_pos, SEEK_SET) != 0)
12991 error (_("%s: failed to seek back to start of object files in the archive\n"), file_name);
12992 ret = 1;
12993 goto out;
12997 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
12998 && !do_segments && !do_header && !do_dump && !do_version
12999 && !do_histogram && !do_debugging && !do_arch && !do_notes
13000 && !do_section_groups && !do_dyn_syms)
13002 ret = 0; /* Archive index only. */
13003 goto out;
13007 ret = 0;
13009 while (1)
13011 char * name;
13012 size_t namelen;
13013 char * qualified_name;
13015 /* Read the next archive header. */
13016 if (fseek (file, arch.next_arhdr_offset, SEEK_SET) != 0)
13018 error (_("%s: failed to seek to next archive header\n"), file_name);
13019 return 1;
13021 got = fread (&arch.arhdr, 1, sizeof arch.arhdr, file);
13022 if (got != sizeof arch.arhdr)
13024 if (got == 0)
13025 break;
13026 error (_("%s: failed to read archive header\n"), file_name);
13027 ret = 1;
13028 break;
13030 if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
13032 error (_("%s: did not find a valid archive header\n"), arch.file_name);
13033 ret = 1;
13034 break;
13037 arch.next_arhdr_offset += sizeof arch.arhdr;
13039 archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
13040 if (archive_file_size & 01)
13041 ++archive_file_size;
13043 name = get_archive_member_name (&arch, &nested_arch);
13044 if (name == NULL)
13046 error (_("%s: bad archive file name\n"), file_name);
13047 ret = 1;
13048 break;
13050 namelen = strlen (name);
13052 qualified_name = make_qualified_name (&arch, &nested_arch, name);
13053 if (qualified_name == NULL)
13055 error (_("%s: bad archive file name\n"), file_name);
13056 ret = 1;
13057 break;
13060 if (is_thin_archive && arch.nested_member_origin == 0)
13062 /* This is a proxy for an external member of a thin archive. */
13063 FILE * member_file;
13064 char * member_file_name = adjust_relative_path (file_name, name, namelen);
13065 if (member_file_name == NULL)
13067 ret = 1;
13068 break;
13071 member_file = fopen (member_file_name, "rb");
13072 if (member_file == NULL)
13074 error (_("Input file '%s' is not readable.\n"), member_file_name);
13075 free (member_file_name);
13076 ret = 1;
13077 break;
13080 archive_file_offset = arch.nested_member_origin;
13082 ret |= process_object (qualified_name, member_file);
13084 fclose (member_file);
13085 free (member_file_name);
13087 else if (is_thin_archive)
13089 /* This is a proxy for a member of a nested archive. */
13090 archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
13092 /* The nested archive file will have been opened and setup by
13093 get_archive_member_name. */
13094 if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
13096 error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
13097 ret = 1;
13098 break;
13101 ret |= process_object (qualified_name, nested_arch.file);
13103 else
13105 archive_file_offset = arch.next_arhdr_offset;
13106 arch.next_arhdr_offset += archive_file_size;
13108 ret |= process_object (qualified_name, file);
13111 free (qualified_name);
13114 out:
13115 if (nested_arch.file != NULL)
13116 fclose (nested_arch.file);
13117 release_archive (&nested_arch);
13118 release_archive (&arch);
13120 return ret;
13123 static int
13124 process_file (char * file_name)
13126 FILE * file;
13127 struct stat statbuf;
13128 char armag[SARMAG];
13129 int ret;
13131 if (stat (file_name, &statbuf) < 0)
13133 if (errno == ENOENT)
13134 error (_("'%s': No such file\n"), file_name);
13135 else
13136 error (_("Could not locate '%s'. System error message: %s\n"),
13137 file_name, strerror (errno));
13138 return 1;
13141 if (! S_ISREG (statbuf.st_mode))
13143 error (_("'%s' is not an ordinary file\n"), file_name);
13144 return 1;
13147 file = fopen (file_name, "rb");
13148 if (file == NULL)
13150 error (_("Input file '%s' is not readable.\n"), file_name);
13151 return 1;
13154 if (fread (armag, SARMAG, 1, file) != 1)
13156 error (_("%s: Failed to read file's magic number\n"), file_name);
13157 fclose (file);
13158 return 1;
13161 if (memcmp (armag, ARMAG, SARMAG) == 0)
13162 ret = process_archive (file_name, file, FALSE);
13163 else if (memcmp (armag, ARMAGT, SARMAG) == 0)
13164 ret = process_archive (file_name, file, TRUE);
13165 else
13167 if (do_archive_index)
13168 error (_("File %s is not an archive so its index cannot be displayed.\n"),
13169 file_name);
13171 rewind (file);
13172 archive_file_size = archive_file_offset = 0;
13173 ret = process_object (file_name, file);
13176 fclose (file);
13178 return ret;
13181 #ifdef SUPPORT_DISASSEMBLY
13182 /* Needed by the i386 disassembler. For extra credit, someone could
13183 fix this so that we insert symbolic addresses here, esp for GOT/PLT
13184 symbols. */
13186 void
13187 print_address (unsigned int addr, FILE * outfile)
13189 fprintf (outfile,"0x%8.8x", addr);
13192 /* Needed by the i386 disassembler. */
13193 void
13194 db_task_printsym (unsigned int addr)
13196 print_address (addr, stderr);
13198 #endif
13201 main (int argc, char ** argv)
13203 int err;
13205 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
13206 setlocale (LC_MESSAGES, "");
13207 #endif
13208 #if defined (HAVE_SETLOCALE)
13209 setlocale (LC_CTYPE, "");
13210 #endif
13211 bindtextdomain (PACKAGE, LOCALEDIR);
13212 textdomain (PACKAGE);
13214 expandargv (&argc, &argv);
13216 parse_args (argc, argv);
13218 if (num_dump_sects > 0)
13220 /* Make a copy of the dump_sects array. */
13221 cmdline_dump_sects = (dump_type *)
13222 malloc (num_dump_sects * sizeof (* dump_sects));
13223 if (cmdline_dump_sects == NULL)
13224 error (_("Out of memory allocating dump request table.\n"));
13225 else
13227 memcpy (cmdline_dump_sects, dump_sects,
13228 num_dump_sects * sizeof (* dump_sects));
13229 num_cmdline_dump_sects = num_dump_sects;
13233 if (optind < (argc - 1))
13234 show_name = 1;
13236 err = 0;
13237 while (optind < argc)
13238 err |= process_file (argv[optind++]);
13240 if (dump_sects != NULL)
13241 free (dump_sects);
13242 if (cmdline_dump_sects != NULL)
13243 free (cmdline_dump_sects);
13245 return err;